/ Hex Artifact Content
Login

Artifact 304851b32c5f918a7ce92e4e9f94fbde0b604b21:


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 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
0840: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0850: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
0860: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
0870: 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
0880: 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
0890: 6e 74 65 64 20 65 76 65 72 79 20 74 69 6d 65 20  nted every time 
08a0: 61 20 63 75 72 73 6f 72 0a 2a 2a 20 6d 6f 76 65  a cursor.** move
08b0: 73 2c 20 65 69 74 68 65 72 20 62 79 20 74 68 65  s, either by the
08c0: 20 4f 50 5f 53 65 65 6b 58 58 2c 20 4f 50 5f 4e   OP_SeekXX, OP_N
08d0: 65 78 74 2c 20 6f 72 20 4f 50 5f 50 72 65 76 20  ext, or OP_Prev 
08e0: 6f 70 63 6f 64 65 73 2e 20 20 54 68 65 20 74 65  opcodes.  The te
08f0: 73 74 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65 73  st.** procedures
0900: 20 75 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d   use this inform
0910: 61 74 69 6f 6e 20 74 6f 20 6d 61 6b 65 20 73 75  ation to make su
0920: 72 65 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  re that indices 
0930: 61 72 65 0a 2a 2a 20 77 6f 72 6b 69 6e 67 20 63  are.** working c
0940: 6f 72 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20  orrectly.  This 
0950: 76 61 72 69 61 62 6c 65 20 68 61 73 20 6e 6f 20  variable has no 
0960: 66 75 6e 63 74 69 6f 6e 20 6f 74 68 65 72 20 74  function other t
0970: 68 61 6e 20 74 6f 0a 2a 2a 20 68 65 6c 70 20 76  han to.** help v
0980: 65 72 69 66 79 20 74 68 65 20 63 6f 72 72 65 63  erify the correc
0990: 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  t operation of t
09a0: 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  he library..*/.#
09b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
09c0: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  T.int sqlite3_se
09d0: 61 72 63 68 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  arch_count = 0;.
09e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68  #endif../*.** Wh
09f0: 65 6e 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76  en this global v
0a00: 61 72 69 61 62 6c 65 20 69 73 20 70 6f 73 69 74  ariable is posit
0a10: 69 76 65 2c 20 69 74 20 67 65 74 73 20 64 65 63  ive, it gets dec
0a20: 72 65 6d 65 6e 74 65 64 20 6f 6e 63 65 20 62 65  remented once be
0a30: 66 6f 72 65 0a 2a 2a 20 65 61 63 68 20 69 6e 73  fore.** each ins
0a40: 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
0a50: 56 44 42 45 2e 20 20 57 68 65 6e 20 72 65 61 63  VDBE.  When reac
0a60: 68 65 73 20 7a 65 72 6f 2c 20 74 68 65 20 75 31  hes zero, the u1
0a70: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 0a 2a  .isInterrupted.*
0a80: 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73  * field of the s
0a90: 71 6c 69 74 65 33 20 73 74 72 75 63 74 75 72 65  qlite3 structure
0aa0: 20 69 73 20 73 65 74 20 69 6e 20 6f 72 64 65 72   is set in order
0ab0: 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 64   to simulate and
0ac0: 20 69 6e 74 65 72 72 75 70 74 2e 0a 2a 2a 0a 2a   interrupt..**.*
0ad0: 2a 20 54 68 69 73 20 66 61 63 69 6c 69 74 79 20  * This facility 
0ae0: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
0af0: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
0b00: 79 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  y.  It does not 
0b10: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61  function.** in a
0b20: 6e 20 6f 72 64 69 6e 61 72 79 20 62 75 69 6c 64  n ordinary build
0b30: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
0b40: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
0b50: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f  te3_interrupt_co
0b60: 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
0b70: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  ./*.** The next 
0b80: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
0b90: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 65  is incremented e
0ba0: 61 63 68 20 74 79 70 65 20 74 68 65 20 4f 50 5f  ach type the OP_
0bb0: 53 6f 72 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69  Sort opcode.** i
0bc0: 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65  s executed.  The
0bd0: 20 74 65 73 74 20 70 72 6f 63 65 64 75 72 65 73   test procedures
0be0: 20 75 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d   use this inform
0bf0: 61 74 69 6f 6e 20 74 6f 20 6d 61 6b 65 20 73 75  ation to make su
0c00: 72 65 20 74 68 61 74 0a 2a 2a 20 73 6f 72 74 69  re that.** sorti
0c10: 6e 67 20 69 73 20 6f 63 63 75 72 72 69 6e 67 20  ng is occurring 
0c20: 6f 72 20 6e 6f 74 20 6f 63 63 75 72 72 69 6e 67  or not occurring
0c30: 20 61 74 20 61 70 70 72 6f 70 72 69 61 74 65 20   at appropriate 
0c40: 74 69 6d 65 73 2e 20 20 20 54 68 69 73 20 76 61  times.   This va
0c50: 72 69 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f  riable.** has no
0c60: 20 66 75 6e 63 74 69 6f 6e 20 6f 74 68 65 72 20   function other 
0c70: 74 68 61 6e 20 74 6f 20 68 65 6c 70 20 76 65 72  than to help ver
0c80: 69 66 79 20 74 68 65 20 63 6f 72 72 65 63 74 20  ify the correct 
0c90: 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
0ca0: 0a 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  .** library..*/.
0cb0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
0cc0: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  ST.int sqlite3_s
0cd0: 6f 72 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ort_count = 0;.#
0ce0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
0cf0: 20 6e 65 78 74 20 67 6c 6f 62 61 6c 20 76 61 72   next global var
0d00: 69 61 62 6c 65 20 72 65 63 6f 72 64 73 20 74 68  iable records th
0d10: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6c 61  e size of the la
0d20: 72 67 65 73 74 20 4d 45 4d 5f 42 6c 6f 62 0a 2a  rgest MEM_Blob.*
0d30: 2a 20 6f 72 20 4d 45 4d 5f 53 74 72 20 74 68 61  * or MEM_Str tha
0d40: 74 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20  t has been used 
0d50: 62 79 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65  by a VDBE opcode
0d60: 2e 20 20 54 68 65 20 74 65 73 74 20 70 72 6f 63  .  The test proc
0d70: 65 64 75 72 65 73 0a 2a 2a 20 75 73 65 20 74 68  edures.** use th
0d80: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  is information t
0d90: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
0da0: 20 74 68 65 20 7a 65 72 6f 2d 62 6c 6f 62 20 66   the zero-blob f
0db0: 75 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 2a 2a 20  unctionality.** 
0dc0: 69 73 20 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65  is working corre
0dd0: 63 74 6c 79 2e 20 20 20 54 68 69 73 20 76 61 72  ctly.   This var
0de0: 69 61 62 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e  iable has no fun
0df0: 63 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ction other than
0e00: 20 74 6f 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69   to.** help veri
0e10: 66 79 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  fy the correct o
0e20: 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
0e30: 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64  library..*/.#ifd
0e40: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
0e50: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62  nt sqlite3_max_b
0e60: 6c 6f 62 73 69 7a 65 20 3d 20 30 3b 0a 73 74 61  lobsize = 0;.sta
0e70: 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 4d  tic void updateM
0e80: 61 78 42 6c 6f 62 73 69 7a 65 28 4d 65 6d 20 2a  axBlobsize(Mem *
0e90: 70 29 7b 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c  p){.  if( (p->fl
0ea0: 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d  ags & (MEM_Str|M
0eb0: 45 4d 5f 42 6c 6f 62 29 29 21 3d 30 20 26 26 20  EM_Blob))!=0 && 
0ec0: 70 2d 3e 6e 3e 73 71 6c 69 74 65 33 5f 6d 61 78  p->n>sqlite3_max
0ed0: 5f 62 6c 6f 62 73 69 7a 65 20 29 7b 0a 20 20 20  _blobsize ){.   
0ee0: 20 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f   sqlite3_max_blo
0ef0: 62 73 69 7a 65 20 3d 20 70 2d 3e 6e 3b 0a 20 20  bsize = p->n;.  
0f00: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
0f10: 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f 62 61  * The next globa
0f20: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
0f30: 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68 20 74  cremented each t
0f40: 79 70 65 20 74 68 65 20 4f 50 5f 46 6f 75 6e 64  ype the OP_Found
0f50: 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65 78   opcode.** is ex
0f60: 65 63 75 74 65 64 2e 20 54 68 69 73 20 69 73 20  ecuted. This is 
0f70: 75 73 65 64 20 74 6f 20 74 65 73 74 20 77 68 65  used to test whe
0f80: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
0f90: 66 6f 72 65 69 67 6e 20 6b 65 79 0a 2a 2a 20 6f  foreign key.** o
0fa0: 70 65 72 61 74 69 6f 6e 20 69 6d 70 6c 65 6d 65  peration impleme
0fb0: 6e 74 65 64 20 75 73 69 6e 67 20 4f 50 5f 46 6b  nted using OP_Fk
0fc0: 49 73 5a 65 72 6f 20 69 73 20 77 6f 72 6b 69 6e  IsZero is workin
0fd0: 67 2e 20 54 68 69 73 20 76 61 72 69 61 62 6c 65  g. This variable
0fe0: 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75 6e 63 74  .** has no funct
0ff0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
1000: 6f 20 68 65 6c 70 20 76 65 72 69 66 79 20 74 68  o help verify th
1010: 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  e correct operat
1020: 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 69  ion of the.** li
1030: 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66  brary..*/.#ifdef
1040: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
1050: 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63   sqlite3_found_c
1060: 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
1070: 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 61 20 72  ../*.** Test a r
1080: 65 67 69 73 74 65 72 20 74 6f 20 73 65 65 20 69  egister to see i
1090: 66 20 69 74 20 65 78 63 65 65 64 73 20 74 68 65  f it exceeds the
10a0: 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d   current maximum
10b0: 20 62 6c 6f 62 20 73 69 7a 65 2e 0a 2a 2a 20 49   blob size..** I
10c0: 66 20 69 74 20 64 6f 65 73 2c 20 72 65 63 6f 72  f it does, recor
10d0: 64 20 74 68 65 20 6e 65 77 20 6d 61 78 69 6d 75  d the new maximu
10e0: 6d 20 62 6c 6f 62 20 73 69 7a 65 2e 0a 2a 2f 0a  m blob size..*/.
10f0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1100: 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65 66  TE_TEST) && !def
1110: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1120: 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 29 0a 23  _BUILTIN_TEST).#
1130: 20 64 65 66 69 6e 65 20 55 50 44 41 54 45 5f 4d   define UPDATE_M
1140: 41 58 5f 42 4c 4f 42 53 49 5a 45 28 50 29 20 20  AX_BLOBSIZE(P)  
1150: 75 70 64 61 74 65 4d 61 78 42 6c 6f 62 73 69 7a  updateMaxBlobsiz
1160: 65 28 50 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  e(P).#else.# def
1170: 69 6e 65 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ine UPDATE_MAX_B
1180: 4c 4f 42 53 49 5a 45 28 50 29 0a 23 65 6e 64 69  LOBSIZE(P).#endi
1190: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
11a0: 20 74 68 65 20 67 69 76 65 6e 20 72 65 67 69 73   the given regis
11b0: 74 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e  ter into a strin
11c0: 67 20 69 66 20 69 74 20 69 73 6e 27 74 20 6f 6e  g if it isn't on
11d0: 65 0a 2a 2a 20 61 6c 72 65 61 64 79 2e 20 52 65  e.** already. Re
11e0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
11f0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
1200: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 74  s..*/.#define St
1210: 72 69 6e 67 69 66 79 28 50 2c 20 65 6e 63 29 20  ringify(P, enc) 
1220: 5c 0a 20 20 20 69 66 28 28 28 50 29 2d 3e 66 6c  \.   if(((P)->fl
1230: 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
1240: 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 73 71  _Blob))==0 && sq
1250: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69  lite3VdbeMemStri
1260: 6e 67 69 66 79 28 50 2c 65 6e 63 29 29 20 5c 0a  ngify(P,enc)) \.
1270: 20 20 20 20 20 7b 20 67 6f 74 6f 20 6e 6f 5f 6d       { goto no_m
1280: 65 6d 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  em; }../*.** An 
1290: 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69 6e 67  ephemeral string
12a0: 20 76 61 6c 75 65 20 28 73 69 67 6e 69 66 69 65   value (signifie
12b0: 64 20 62 79 20 74 68 65 20 4d 45 4d 5f 45 70 68  d by the MEM_Eph
12c0: 65 6d 20 66 6c 61 67 29 20 63 6f 6e 74 61 69 6e  em flag) contain
12d0: 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  s.** a pointer t
12e0: 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  o a dynamically 
12f0: 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69 6e 67  allocated string
1300: 20 77 68 65 72 65 20 73 6f 6d 65 20 6f 74 68 65   where some othe
1310: 72 20 65 6e 74 69 74 79 0a 2a 2a 20 69 73 20 72  r entity.** is r
1320: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 64  esponsible for d
1330: 65 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 61 74  eallocating that
1340: 20 73 74 72 69 6e 67 2e 20 20 42 65 63 61 75 73   string.  Becaus
1350: 65 20 74 68 65 20 72 65 67 69 73 74 65 72 0a 2a  e the register.*
1360: 2a 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  * does not contr
1370: 6f 6c 20 74 68 65 20 73 74 72 69 6e 67 2c 20 69  ol the string, i
1380: 74 20 6d 69 67 68 74 20 62 65 20 64 65 6c 65 74  t might be delet
1390: 65 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 72  ed without the r
13a0: 65 67 69 73 74 65 72 0a 2a 2a 20 6b 6e 6f 77 69  egister.** knowi
13b0: 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ng it..**.** Thi
13c0: 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76 65 72  s routine conver
13d0: 74 73 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ts an ephemeral 
13e0: 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20 64 79  string into a dy
13f0: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
1400: 74 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20 74 68  ted.** string th
1410: 61 74 20 74 68 65 20 72 65 67 69 73 74 65 72 20  at the register 
1420: 69 74 73 65 6c 66 20 63 6f 6e 74 72 6f 6c 73 2e  itself controls.
1430: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1440: 2c 20 69 74 0a 2a 2a 20 63 6f 6e 76 65 72 74 73  , it.** converts
1450: 20 61 6e 20 4d 45 4d 5f 45 70 68 65 6d 20 73 74   an MEM_Ephem st
1460: 72 69 6e 67 20 69 6e 74 6f 20 61 6e 20 4d 45 4d  ring into an MEM
1470: 5f 44 79 6e 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  _Dyn string..*/.
1480: 23 64 65 66 69 6e 65 20 44 65 65 70 68 65 6d 65  #define Deepheme
1490: 72 61 6c 69 7a 65 28 50 29 20 5c 0a 20 20 20 69  ralize(P) \.   i
14a0: 66 28 20 28 28 50 29 2d 3e 66 6c 61 67 73 26 4d  f( ((P)->flags&M
14b0: 45 4d 5f 45 70 68 65 6d 29 21 3d 30 20 5c 0a 20  EM_Ephem)!=0 \. 
14c0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
14d0: 56 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65  VdbeMemMakeWrite
14e0: 61 62 6c 65 28 50 29 20 29 7b 20 67 6f 74 6f 20  able(P) ){ goto 
14f0: 6e 6f 5f 6d 65 6d 3b 7d 0a 0a 2f 2a 0a 2a 2a 20  no_mem;}../*.** 
1500: 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  Call sqlite3Vdbe
1510: 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28 29 20  MemExpandBlob() 
1520: 6f 6e 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  on the supplied 
1530: 76 61 6c 75 65 20 28 74 79 70 65 20 4d 65 6d 2a  value (type Mem*
1540: 29 0a 2a 2a 20 50 20 69 66 20 72 65 71 75 69 72  ).** P if requir
1550: 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 45  ed..*/.#define E
1560: 78 70 61 6e 64 42 6c 6f 62 28 50 29 20 28 28 28  xpandBlob(P) (((
1570: 50 29 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 5a 65  P)->flags&MEM_Ze
1580: 72 6f 29 3f 73 71 6c 69 74 65 33 56 64 62 65 4d  ro)?sqlite3VdbeM
1590: 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28 50 29 3a  emExpandBlob(P):
15a0: 30 29 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  0)../*.** Argume
15b0: 6e 74 20 70 4d 65 6d 20 70 6f 69 6e 74 73 20 61  nt pMem points a
15c0: 74 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61  t a register tha
15d0: 74 20 77 69 6c 6c 20 62 65 20 70 61 73 73 65 64  t will be passed
15e0: 20 74 6f 20 61 0a 2a 2a 20 75 73 65 72 2d 64 65   to a.** user-de
15f0: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f  fined function o
1600: 72 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  r returned to th
1610: 65 20 75 73 65 72 20 61 73 20 74 68 65 20 72 65  e user as the re
1620: 73 75 6c 74 20 6f 66 20 61 20 71 75 65 72 79 2e  sult of a query.
1630: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1640: 20 73 65 74 73 20 74 68 65 20 70 4d 65 6d 2d 3e   sets the pMem->
1650: 74 79 70 65 20 76 61 72 69 61 62 6c 65 20 75 73  type variable us
1660: 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ed by the sqlite
1670: 33 5f 76 61 6c 75 65 5f 2a 28 29 20 0a 2a 2a 20  3_value_*() .** 
1680: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a 76 6f 69  routines..*/.voi
1690: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  d sqlite3VdbeMem
16a0: 53 74 6f 72 65 54 79 70 65 28 4d 65 6d 20 2a 70  StoreType(Mem *p
16b0: 4d 65 6d 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67  Mem){.  int flag
16c0: 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b  s = pMem->flags;
16d0: 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
16e0: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70  EM_Null ){.    p
16f0: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
1700: 54 45 5f 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 65  TE_NULL;.  }.  e
1710: 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
1720: 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 70  MEM_Int ){.    p
1730: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
1740: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 7d 0a  TE_INTEGER;.  }.
1750: 20 20 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73    else if( flags
1760: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
1770: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
1780: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3b 0a 20 20  SQLITE_FLOAT;.  
1790: 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 66 6c 61  }.  else if( fla
17a0: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
17b0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
17c0: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20   SQLITE_TEXT;.  
17d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4d 65 6d 2d  }else{.    pMem-
17e0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 42  >type = SQLITE_B
17f0: 4c 4f 42 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  LOB;.  }.}../*.*
1800: 2a 20 41 6c 6c 6f 63 61 74 65 20 56 64 62 65 43  * Allocate VdbeC
1810: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 43 75  ursor number iCu
1820: 72 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  r.  Return a poi
1830: 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 52 65 74  nter to it.  Ret
1840: 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 77  urn NULL.** if w
1850: 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  e run out of mem
1860: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 56  ory..*/.static V
1870: 64 62 65 43 75 72 73 6f 72 20 2a 61 6c 6c 6f 63  dbeCursor *alloc
1880: 61 74 65 43 75 72 73 6f 72 28 0a 20 20 56 64 62  ateCursor(.  Vdb
1890: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
18a0: 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
18b0: 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 69  l machine */.  i
18c0: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
18d0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
18e0: 20 74 68 65 20 6e 65 77 20 56 64 62 65 43 75 72   the new VdbeCur
18f0: 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69  sor */.  int nFi
1900: 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  eld,           /
1910: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  * Number of fiel
1920: 64 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ds in the table 
1930: 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  or index */.  in
1940: 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20 20  t iDb,          
1950: 20 20 20 20 2f 2a 20 57 68 65 6e 20 64 61 74 61      /* When data
1960: 62 61 73 65 20 74 68 65 20 63 75 72 73 6f 72 20  base the cursor 
1970: 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 6f 72 20 2d  belongs to, or -
1980: 31 20 2a 2f 0a 20 20 69 6e 74 20 69 73 42 74 72  1 */.  int isBtr
1990: 65 65 43 75 72 73 6f 72 20 20 20 20 20 2f 2a 20  eeCursor     /* 
19a0: 54 72 75 65 20 66 6f 72 20 42 2d 54 72 65 65 2e  True for B-Tree.
19b0: 20 20 46 61 6c 73 65 20 66 6f 72 20 70 73 65 75    False for pseu
19c0: 64 6f 2d 74 61 62 6c 65 20 6f 72 20 76 74 61 62  do-table or vtab
19d0: 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 46 69 6e 64   */.){.  /* Find
19e0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
19f0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
1a00: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
1a10: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 0a 20  blob of memory. 
1a20: 20 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72   ** required for
1a30: 20 74 68 69 73 20 56 64 62 65 43 75 72 73 6f 72   this VdbeCursor
1a40: 20 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69   structure. It i
1a50: 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20  s convenient to 
1a60: 75 73 65 20 61 20 0a 20 20 2a 2a 20 76 64 62 65  use a .  ** vdbe
1a70: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   memory cell to 
1a80: 6d 61 6e 61 67 65 20 74 68 65 20 6d 65 6d 6f 72  manage the memor
1a90: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 65 71  y allocation req
1aa0: 75 69 72 65 64 20 66 6f 72 20 61 0a 20 20 2a 2a  uired for a.  **
1ab0: 20 56 64 62 65 43 75 72 73 6f 72 20 73 74 72 75   VdbeCursor stru
1ac0: 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 66 6f  cture for the fo
1ad0: 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a  llowing reasons:
1ae0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 53  .  **.  **   * S
1af0: 6f 6d 65 74 69 6d 65 73 20 63 75 72 73 6f 72 20  ometimes cursor 
1b00: 6e 75 6d 62 65 72 73 20 61 72 65 20 75 73 65 64  numbers are used
1b10: 20 66 6f 72 20 61 20 63 6f 75 70 6c 65 20 6f 66   for a couple of
1b20: 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20   different.  ** 
1b30: 20 20 20 20 70 75 72 70 6f 73 65 73 20 69 6e 20      purposes in 
1b40: 61 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20  a vdbe program. 
1b50: 54 68 65 20 64 69 66 66 65 72 65 6e 74 20 75 73  The different us
1b60: 65 73 20 6d 69 67 68 74 20 72 65 71 75 69 72 65  es might require
1b70: 0a 20 20 2a 2a 20 20 20 20 20 64 69 66 66 65 72  .  **     differ
1b80: 65 6e 74 20 73 69 7a 65 64 20 61 6c 6c 6f 63 61  ent sized alloca
1b90: 74 69 6f 6e 73 2e 20 4d 65 6d 6f 72 79 20 63 65  tions. Memory ce
1ba0: 6c 6c 73 20 70 72 6f 76 69 64 65 20 67 72 6f 77  lls provide grow
1bb0: 61 62 6c 65 0a 20 20 2a 2a 20 20 20 20 20 61 6c  able.  **     al
1bc0: 6c 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a  locations..  **.
1bd0: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 75 73    **   * When us
1be0: 69 6e 67 20 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ing ENABLE_MEMOR
1bf0: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 2c 20 6d 65  Y_MANAGEMENT, me
1c00: 6d 6f 72 79 20 63 65 6c 6c 20 62 75 66 66 65 72  mory cell buffer
1c10: 73 20 63 61 6e 0a 20 20 2a 2a 20 20 20 20 20 62  s can.  **     b
1c20: 65 20 66 72 65 65 64 20 6c 61 7a 69 6c 79 20 76  e freed lazily v
1c30: 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 5f 72  ia the sqlite3_r
1c40: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20  elease_memory() 
1c50: 41 50 49 2e 20 54 68 69 73 0a 20 20 2a 2a 20 20  API. This.  **  
1c60: 20 20 20 6d 69 6e 69 6d 69 7a 65 73 20 74 68 65     minimizes the
1c70: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 6c 6c 6f   number of mallo
1c80: 63 20 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 20  c calls made by 
1c90: 74 68 65 20 73 79 73 74 65 6d 2e 0a 20 20 2a 2a  the system..  **
1ca0: 0a 20 20 2a 2a 20 4d 65 6d 6f 72 79 20 63 65 6c  .  ** Memory cel
1cb0: 6c 73 20 66 6f 72 20 63 75 72 73 6f 72 73 20 61  ls for cursors a
1cc0: 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  re allocated at 
1cd0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 61  the top of the a
1ce0: 64 64 72 65 73 73 0a 20 20 2a 2a 20 73 70 61 63  ddress.  ** spac
1cf0: 65 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28  e. Memory cell (
1d00: 70 2d 3e 6e 4d 65 6d 29 20 63 6f 72 72 65 73 70  p->nMem) corresp
1d10: 6f 6e 64 73 20 74 6f 20 63 75 72 73 6f 72 20 30  onds to cursor 0
1d20: 2e 20 53 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a  . Space for.  **
1d30: 20 63 75 72 73 6f 72 20 31 20 69 73 20 6d 61 6e   cursor 1 is man
1d40: 61 67 65 64 20 62 79 20 6d 65 6d 6f 72 79 20 63  aged by memory c
1d50: 65 6c 6c 20 28 70 2d 3e 6e 4d 65 6d 2d 31 29 2c  ell (p->nMem-1),
1d60: 20 65 74 63 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d   etc..  */.  Mem
1d70: 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65   *pMem = &p->aMe
1d80: 6d 5b 70 2d 3e 6e 4d 65 6d 2d 69 43 75 72 5d 3b  m[p->nMem-iCur];
1d90: 0a 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ..  int nByte;. 
1da0: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78   VdbeCursor *pCx
1db0: 20 3d 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20   = 0;.  nByte = 
1dc0: 0a 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69  .      ROUND8(si
1dd0: 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 29  zeof(VdbeCursor)
1de0: 29 20 2b 20 0a 20 20 20 20 20 20 28 69 73 42 74  ) + .      (isBt
1df0: 72 65 65 43 75 72 73 6f 72 3f 73 71 6c 69 74 65  reeCursor?sqlite
1e00: 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
1e10: 28 29 3a 30 29 20 2b 20 0a 20 20 20 20 20 20 32  ():0) + .      2
1e20: 2a 6e 46 69 65 6c 64 2a 73 69 7a 65 6f 66 28 75  *nField*sizeof(u
1e30: 33 32 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  32);..  assert( 
1e40: 69 43 75 72 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  iCur<p->nCursor 
1e50: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  );.  if( p->apCs
1e60: 72 5b 69 43 75 72 5d 20 29 7b 0a 20 20 20 20 73  r[iCur] ){.    s
1e70: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
1e80: 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43 73 72  rsor(p, p->apCsr
1e90: 5b 69 43 75 72 5d 29 3b 0a 20 20 20 20 70 2d 3e  [iCur]);.    p->
1ea0: 61 70 43 73 72 5b 69 43 75 72 5d 20 3d 20 30 3b  apCsr[iCur] = 0;
1eb0: 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
1ec0: 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62  E_OK==sqlite3Vdb
1ed0: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 6e  eMemGrow(pMem, n
1ee0: 42 79 74 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  Byte, 0) ){.    
1ef0: 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20 3d  p->apCsr[iCur] =
1f00: 20 70 43 78 20 3d 20 28 56 64 62 65 43 75 72 73   pCx = (VdbeCurs
1f10: 6f 72 2a 29 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20  or*)pMem->z;.   
1f20: 20 6d 65 6d 73 65 74 28 70 43 78 2c 20 30 2c 20   memset(pCx, 0, 
1f30: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
1f40: 72 29 29 3b 0a 20 20 20 20 70 43 78 2d 3e 69 44  r));.    pCx->iD
1f50: 62 20 3d 20 69 44 62 3b 0a 20 20 20 20 70 43 78  b = iDb;.    pCx
1f60: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
1f70: 64 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 65 6c  d;.    if( nFiel
1f80: 64 20 29 7b 0a 20 20 20 20 20 20 70 43 78 2d 3e  d ){.      pCx->
1f90: 61 54 79 70 65 20 3d 20 28 75 33 32 20 2a 29 26  aType = (u32 *)&
1fa0: 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38 28 73  pMem->z[ROUND8(s
1fb0: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
1fc0: 29 29 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ))];.    }.    i
1fd0: 66 28 20 69 73 42 74 72 65 65 43 75 72 73 6f 72  f( isBtreeCursor
1fe0: 20 29 7b 0a 20 20 20 20 20 20 70 43 78 2d 3e 70   ){.      pCx->p
1ff0: 43 75 72 73 6f 72 20 3d 20 28 42 74 43 75 72 73  Cursor = (BtCurs
2000: 6f 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20 26  or*).          &
2010: 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38 28 73  pMem->z[ROUND8(s
2020: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
2030: 29 29 2b 32 2a 6e 46 69 65 6c 64 2a 73 69 7a 65  ))+2*nField*size
2040: 6f 66 28 75 33 32 29 5d 3b 0a 20 20 20 20 20 20  of(u32)];.      
2050: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
2060: 6f 72 5a 65 72 6f 28 70 43 78 2d 3e 70 43 75 72  orZero(pCx->pCur
2070: 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  sor);.    }.  }.
2080: 20 20 72 65 74 75 72 6e 20 70 43 78 3b 0a 7d 0a    return pCx;.}.
2090: 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 63 6f  ./*.** Try to co
20a0: 6e 76 65 72 74 20 61 20 76 61 6c 75 65 20 69 6e  nvert a value in
20b0: 74 6f 20 61 20 6e 75 6d 65 72 69 63 20 72 65 70  to a numeric rep
20c0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 66 20 77  resentation if w
20d0: 65 20 63 61 6e 0a 2a 2a 20 64 6f 20 73 6f 20 77  e can.** do so w
20e0: 69 74 68 6f 75 74 20 6c 6f 73 73 20 6f 66 20 69  ithout loss of i
20f0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 6e 20  nformation.  In 
2100: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
2110: 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 6f  the string.** lo
2120: 6f 6b 73 20 6c 69 6b 65 20 61 20 6e 75 6d 62 65  oks like a numbe
2130: 72 2c 20 63 6f 6e 76 65 72 74 20 69 74 20 69 6e  r, convert it in
2140: 74 6f 20 61 20 6e 75 6d 62 65 72 2e 20 20 49 66  to a number.  If
2150: 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20   it does not.** 
2160: 6c 6f 6f 6b 20 6c 69 6b 65 20 61 20 6e 75 6d 62  look like a numb
2170: 65 72 2c 20 6c 65 61 76 65 20 69 74 20 61 6c 6f  er, leave it alo
2180: 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ne..*/.static vo
2190: 69 64 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41  id applyNumericA
21a0: 66 66 69 6e 69 74 79 28 4d 65 6d 20 2a 70 52 65  ffinity(Mem *pRe
21b0: 63 29 7b 0a 20 20 69 66 28 20 28 70 52 65 63 2d  c){.  if( (pRec-
21c0: 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65  >flags & (MEM_Re
21d0: 61 6c 7c 4d 45 4d 5f 49 6e 74 29 29 3d 3d 30 20  al|MEM_Int))==0 
21e0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 61 6c 6e  ){.    int realn
21f0: 75 6d 3b 0a 20 20 20 20 75 38 20 65 6e 63 20 3d  um;.    u8 enc =
2200: 20 70 52 65 63 2d 3e 65 6e 63 3b 0a 20 20 20 20   pRec->enc;.    
2210: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e 75  sqlite3VdbeMemNu
2220: 6c 54 65 72 6d 69 6e 61 74 65 28 70 52 65 63 29  lTerminate(pRec)
2230: 3b 0a 20 20 20 20 69 66 28 20 28 70 52 65 63 2d  ;.    if( (pRec-
2240: 3e 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 20  >flags&MEM_Str) 
2250: 26 26 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 62  && sqlite3IsNumb
2260: 65 72 28 70 52 65 63 2d 3e 7a 2c 20 26 72 65 61  er(pRec->z, &rea
2270: 6c 6e 75 6d 2c 20 65 6e 63 29 20 29 7b 0a 20 20  lnum, enc) ){.  
2280: 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20      i64 value;. 
2290: 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38       char *zUtf8
22a0: 20 3d 20 70 52 65 63 2d 3e 7a 3b 0a 23 69 66 6e   = pRec->z;.#ifn
22b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22c0: 55 54 46 31 36 0a 20 20 20 20 20 20 69 66 28 20  UTF16.      if( 
22d0: 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc!=SQLITE_UTF8
22e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
22f0: 72 74 28 20 70 52 65 63 2d 3e 64 62 20 29 3b 0a  rt( pRec->db );.
2300: 20 20 20 20 20 20 20 20 7a 55 74 66 38 20 3d 20          zUtf8 = 
2310: 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28  sqlite3Utf16to8(
2320: 70 52 65 63 2d 3e 64 62 2c 20 70 52 65 63 2d 3e  pRec->db, pRec->
2330: 7a 2c 20 70 52 65 63 2d 3e 6e 2c 20 65 6e 63 29  z, pRec->n, enc)
2340: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a  ;.        if( !z
2350: 55 74 66 38 20 29 20 72 65 74 75 72 6e 3b 0a 20  Utf8 ) return;. 
2360: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2370: 20 20 20 20 69 66 28 20 21 72 65 61 6c 6e 75 6d      if( !realnum
2380: 20 26 26 20 73 71 6c 69 74 65 33 41 74 6f 69 36   && sqlite3Atoi6
2390: 34 28 7a 55 74 66 38 2c 20 26 76 61 6c 75 65 29  4(zUtf8, &value)
23a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63   ){.        pRec
23b0: 2d 3e 75 2e 69 20 3d 20 76 61 6c 75 65 3b 0a 20  ->u.i = value;. 
23c0: 20 20 20 20 20 20 20 4d 65 6d 53 65 74 54 79 70         MemSetTyp
23d0: 65 46 6c 61 67 28 70 52 65 63 2c 20 4d 45 4d 5f  eFlag(pRec, MEM_
23e0: 49 6e 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Int);.      }els
23f0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
2400: 65 33 41 74 6f 46 28 7a 55 74 66 38 2c 20 26 70  e3AtoF(zUtf8, &p
2410: 52 65 63 2d 3e 72 29 3b 0a 20 20 20 20 20 20 20  Rec->r);.       
2420: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
2430: 70 52 65 63 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b  pRec, MEM_Real);
2440: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
2450: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
2460: 31 36 0a 20 20 20 20 20 20 69 66 28 20 65 6e 63  16.      if( enc
2470: 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b  !=SQLITE_UTF8 ){
2480: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2490: 44 62 46 72 65 65 28 70 52 65 63 2d 3e 64 62 2c  DbFree(pRec->db,
24a0: 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 7d   zUtf8);.      }
24b0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
24c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65  }.}../*.** Proce
24d0: 73 73 69 6e 67 20 69 73 20 64 65 74 65 72 6d 69  ssing is determi
24e0: 6e 65 20 62 79 20 74 68 65 20 61 66 66 69 6e 69  ne by the affini
24f0: 74 79 20 70 61 72 61 6d 65 74 65 72 3a 0a 2a 2a  ty parameter:.**
2500: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  .** SQLITE_AFF_I
2510: 4e 54 45 47 45 52 3a 0a 2a 2a 20 53 51 4c 49 54  NTEGER:.** SQLIT
2520: 45 5f 41 46 46 5f 52 45 41 4c 3a 0a 2a 2a 20 53  E_AFF_REAL:.** S
2530: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
2540: 43 3a 0a 2a 2a 20 20 20 20 54 72 79 20 74 6f 20  C:.**    Try to 
2550: 63 6f 6e 76 65 72 74 20 70 52 65 63 20 74 6f 20  convert pRec to 
2560: 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65  an integer repre
2570: 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 61 20 0a  sentation or a .
2580: 2a 2a 20 20 20 20 66 6c 6f 61 74 69 6e 67 2d 70  **    floating-p
2590: 6f 69 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  oint representat
25a0: 69 6f 6e 20 69 66 20 61 6e 20 69 6e 74 65 67 65  ion if an intege
25b0: 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  r representation
25c0: 0a 2a 2a 20 20 20 20 69 73 20 6e 6f 74 20 70 6f  .**    is not po
25d0: 73 73 69 62 6c 65 2e 20 20 4e 6f 74 65 20 74 68  ssible.  Note th
25e0: 61 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 72  at the integer r
25f0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73  epresentation is
2600: 0a 2a 2a 20 20 20 20 61 6c 77 61 79 73 20 70 72  .**    always pr
2610: 65 66 65 72 72 65 64 2c 20 65 76 65 6e 20 69 66  eferred, even if
2620: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 69 73   the affinity is
2630: 20 52 45 41 4c 2c 20 62 65 63 61 75 73 65 0a 2a   REAL, because.*
2640: 2a 20 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20  *    an integer 
2650: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
2660: 73 20 6d 6f 72 65 20 73 70 61 63 65 20 65 66 66  s more space eff
2670: 69 63 69 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 0a  icient on disk..
2680: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  **.** SQLITE_AFF
2690: 5f 54 45 58 54 3a 0a 2a 2a 20 20 20 20 43 6f 6e  _TEXT:.**    Con
26a0: 76 65 72 74 20 70 52 65 63 20 74 6f 20 61 20 74  vert pRec to a t
26b0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
26c0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  on..**.** SQLITE
26d0: 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 2a 2a 20 20 20  _AFF_NONE:.**   
26e0: 20 4e 6f 2d 6f 70 2e 20 20 70 52 65 63 20 69 73   No-op.  pRec is
26f0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73   unchanged..*/.s
2700: 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 6c 79  tatic void apply
2710: 41 66 66 69 6e 69 74 79 28 0a 20 20 4d 65 6d 20  Affinity(.  Mem 
2720: 2a 70 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  *pRec,          
2730: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 74 6f 20  /* The value to 
2740: 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 74  apply affinity t
2750: 6f 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69  o */.  char affi
2760: 6e 69 74 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  nity,      /* Th
2770: 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 62 65  e affinity to be
2780: 20 61 70 70 6c 69 65 64 20 2a 2f 0a 20 20 75 38   applied */.  u8
2790: 20 65 6e 63 20 20 20 20 20 20 20 20 20 20 20 20   enc            
27a0: 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 74 65    /* Use this te
27b0: 78 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 29  xt encoding */.)
27c0: 7b 0a 20 20 69 66 28 20 61 66 66 69 6e 69 74 79  {.  if( affinity
27d0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
27e0: 54 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79  T ){.    /* Only
27f0: 20 61 74 74 65 6d 70 74 20 74 68 65 20 63 6f 6e   attempt the con
2800: 76 65 72 73 69 6f 6e 20 74 6f 20 54 45 58 54 20  version to TEXT 
2810: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 69  if there is an i
2820: 6e 74 65 67 65 72 20 6f 72 20 72 65 61 6c 0a 20  nteger or real. 
2830: 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 61     ** representa
2840: 74 69 6f 6e 20 28 62 6c 6f 62 20 61 6e 64 20 4e  tion (blob and N
2850: 55 4c 4c 20 64 6f 20 6e 6f 74 20 67 65 74 20 63  ULL do not get c
2860: 6f 6e 76 65 72 74 65 64 29 20 62 75 74 20 6e 6f  onverted) but no
2870: 20 73 74 72 69 6e 67 0a 20 20 20 20 2a 2a 20 72   string.    ** r
2880: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 20  epresentation.. 
2890: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d     */.    if( 0=
28a0: 3d 28 70 52 65 63 2d 3e 66 6c 61 67 73 26 4d 45  =(pRec->flags&ME
28b0: 4d 5f 53 74 72 29 20 26 26 20 28 70 52 65 63 2d  M_Str) && (pRec-
28c0: 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 52 65 61 6c  >flags&(MEM_Real
28d0: 7c 4d 45 4d 5f 49 6e 74 29 29 20 29 7b 0a 20 20  |MEM_Int)) ){.  
28e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
28f0: 65 6d 53 74 72 69 6e 67 69 66 79 28 70 52 65 63  emStringify(pRec
2900: 2c 20 65 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , enc);.    }.  
2910: 20 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 3d    pRec->flags &=
2920: 20 7e 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f   ~(MEM_Real|MEM_
2930: 49 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Int);.  }else if
2940: 28 20 61 66 66 69 6e 69 74 79 21 3d 53 51 4c 49  ( affinity!=SQLI
2950: 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
2960: 20 20 20 61 73 73 65 72 74 28 20 61 66 66 69 6e     assert( affin
2970: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
2980: 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 69 6e  INTEGER || affin
2990: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
29a0: 52 45 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  REAL.           
29b0: 20 20 7c 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53    || affinity==S
29c0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
29d0: 43 20 29 3b 0a 20 20 20 20 61 70 70 6c 79 4e 75  C );.    applyNu
29e0: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 52  mericAffinity(pR
29f0: 65 63 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65  ec);.    if( pRe
2a00: 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  c->flags & MEM_R
2a10: 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  eal ){.      sql
2a20: 69 74 65 33 56 64 62 65 49 6e 74 65 67 65 72 41  ite3VdbeIntegerA
2a30: 66 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a 20  ffinity(pRec);. 
2a40: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2a50: 2a 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72 74  * Try to convert
2a60: 20 74 68 65 20 74 79 70 65 20 6f 66 20 61 20 66   the type of a f
2a70: 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
2a80: 20 6f 72 20 61 20 72 65 73 75 6c 74 20 63 6f 6c   or a result col
2a90: 75 6d 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 75  umn.** into a nu
2aa0: 6d 65 72 69 63 20 72 65 70 72 65 73 65 6e 74 61  meric representa
2ab0: 74 69 6f 6e 2e 20 20 55 73 65 20 65 69 74 68 65  tion.  Use eithe
2ac0: 72 20 49 4e 54 45 47 45 52 20 6f 72 20 52 45 41  r INTEGER or REA
2ad0: 4c 20 77 68 69 63 68 65 76 65 72 0a 2a 2a 20 69  L whichever.** i
2ae0: 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 20  s appropriate.  
2af0: 42 75 74 20 6f 6e 6c 79 20 64 6f 20 74 68 65 20  But only do the 
2b00: 63 6f 6e 76 65 72 73 69 6f 6e 20 69 66 20 69 74  conversion if it
2b10: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 77 69 74   is possible wit
2b20: 68 6f 75 74 0a 2a 2a 20 6c 6f 73 73 20 6f 66 20  hout.** loss of 
2b30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20  information and 
2b40: 72 65 74 75 72 6e 20 74 68 65 20 72 65 76 69 73  return the revis
2b50: 65 64 20 74 79 70 65 20 6f 66 20 74 68 65 20 61  ed type of the a
2b60: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
2b70: 68 69 73 20 69 73 20 61 6e 20 45 58 50 45 52 49  his is an EXPERI
2b80: 4d 45 4e 54 41 4c 20 61 70 69 20 61 6e 64 20 69  MENTAL api and i
2b90: 73 20 73 75 62 6a 65 63 74 20 74 6f 20 63 68 61  s subject to cha
2ba0: 6e 67 65 20 6f 72 20 72 65 6d 6f 76 61 6c 2e 0a  nge or removal..
2bb0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 76  */.int sqlite3_v
2bc0: 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70  alue_numeric_typ
2bd0: 65 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  e(sqlite3_value 
2be0: 2a 70 56 61 6c 29 7b 0a 20 20 4d 65 6d 20 2a 70  *pVal){.  Mem *p
2bf0: 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 70 56 61 6c  Mem = (Mem*)pVal
2c00: 3b 0a 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63  ;.  applyNumeric
2c10: 41 66 66 69 6e 69 74 79 28 70 4d 65 6d 29 3b 0a  Affinity(pMem);.
2c20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
2c30: 53 74 6f 72 65 54 79 70 65 28 70 4d 65 6d 29 3b  StoreType(pMem);
2c40: 0a 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e  .  return pMem->
2c50: 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  type;.}../*.** E
2c60: 78 70 6f 72 74 65 64 20 76 65 72 73 69 6f 6e 20  xported version 
2c70: 6f 66 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79  of applyAffinity
2c80: 28 29 2e 20 54 68 69 73 20 6f 6e 65 20 77 6f 72  (). This one wor
2c90: 6b 73 20 6f 6e 20 73 71 6c 69 74 65 33 5f 76 61  ks on sqlite3_va
2ca0: 6c 75 65 2a 2c 20 0a 2a 2a 20 6e 6f 74 20 74 68  lue*, .** not th
2cb0: 65 20 69 6e 74 65 72 6e 61 6c 20 4d 65 6d 2a 20  e internal Mem* 
2cc0: 74 79 70 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  type..*/.void sq
2cd0: 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41  lite3ValueApplyA
2ce0: 66 66 69 6e 69 74 79 28 0a 20 20 73 71 6c 69 74  ffinity(.  sqlit
2cf0: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20  e3_value *pVal, 
2d00: 0a 20 20 75 38 20 61 66 66 69 6e 69 74 79 2c 20  .  u8 affinity, 
2d10: 0a 20 20 75 38 20 65 6e 63 0a 29 7b 0a 20 20 61  .  u8 enc.){.  a
2d20: 70 70 6c 79 41 66 66 69 6e 69 74 79 28 28 4d 65  pplyAffinity((Me
2d30: 6d 20 2a 29 70 56 61 6c 2c 20 61 66 66 69 6e 69  m *)pVal, affini
2d40: 74 79 2c 20 65 6e 63 29 3b 0a 7d 0a 0a 23 69 66  ty, enc);.}..#if
2d50: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2d60: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 6e  ./*.** Write a n
2d70: 69 63 65 20 73 74 72 69 6e 67 20 72 65 70 72 65  ice string repre
2d80: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
2d90: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 63 65 6c   contents of cel
2da0: 6c 20 70 4d 65 6d 0a 2a 2a 20 69 6e 74 6f 20 62  l pMem.** into b
2db0: 75 66 66 65 72 20 7a 42 75 66 2c 20 6c 65 6e 67  uffer zBuf, leng
2dc0: 74 68 20 6e 42 75 66 2e 0a 2a 2f 0a 76 6f 69 64  th nBuf..*/.void
2dd0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 50   sqlite3VdbeMemP
2de0: 72 65 74 74 79 50 72 69 6e 74 28 4d 65 6d 20 2a  rettyPrint(Mem *
2df0: 70 4d 65 6d 2c 20 63 68 61 72 20 2a 7a 42 75 66  pMem, char *zBuf
2e00: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 73 72 20  ){.  char *zCsr 
2e10: 3d 20 7a 42 75 66 3b 0a 20 20 69 6e 74 20 66 20  = zBuf;.  int f 
2e20: 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a  = pMem->flags;..
2e30: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
2e40: 68 61 72 20 2a 63 6f 6e 73 74 20 65 6e 63 6e 61  har *const encna
2e50: 6d 65 73 5b 5d 20 3d 20 7b 22 28 58 29 22 2c 20  mes[] = {"(X)", 
2e60: 22 28 38 29 22 2c 20 22 28 31 36 4c 45 29 22 2c  "(8)", "(16LE)",
2e70: 20 22 28 31 36 42 45 29 22 7d 3b 0a 0a 20 20 69   "(16BE)"};..  i
2e80: 66 28 20 66 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b  f( f&MEM_Blob ){
2e90: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2ea0: 63 68 61 72 20 63 3b 0a 20 20 20 20 69 66 28 20  char c;.    if( 
2eb0: 66 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20  f & MEM_Dyn ){. 
2ec0: 20 20 20 20 20 63 20 3d 20 27 7a 27 3b 0a 20 20       c = 'z';.  
2ed0: 20 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26      assert( (f &
2ee0: 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d   (MEM_Static|MEM
2ef0: 5f 45 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20  _Ephem))==0 );. 
2f00: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26     }else if( f &
2f10: 20 4d 45 4d 5f 53 74 61 74 69 63 20 29 7b 0a 20   MEM_Static ){. 
2f20: 20 20 20 20 20 63 20 3d 20 27 74 27 3b 0a 20 20       c = 't';.  
2f30: 20 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26      assert( (f &
2f40: 20 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70   (MEM_Dyn|MEM_Ep
2f50: 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  hem))==0 );.    
2f60: 7d 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45  }else if( f & ME
2f70: 4d 5f 45 70 68 65 6d 20 29 7b 0a 20 20 20 20 20  M_Ephem ){.     
2f80: 20 63 20 3d 20 27 65 27 3b 0a 20 20 20 20 20 20   c = 'e';.      
2f90: 61 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45  assert( (f & (ME
2fa0: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 44 79 6e  M_Static|MEM_Dyn
2fb0: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c  ))==0 );.    }el
2fc0: 73 65 7b 0a 20 20 20 20 20 20 63 20 3d 20 27 73  se{.      c = 's
2fd0: 27 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  ';.    }..    sq
2fe0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
2ff0: 30 30 2c 20 7a 43 73 72 2c 20 22 25 63 22 2c 20  00, zCsr, "%c", 
3000: 63 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20  c);.    zCsr += 
3010: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3020: 7a 43 73 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  zCsr);.    sqlit
3030: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c  e3_snprintf(100,
3040: 20 7a 43 73 72 2c 20 22 25 64 5b 22 2c 20 70 4d   zCsr, "%d[", pM
3050: 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7a 43 73 72  em->n);.    zCsr
3060: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
3070: 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 66  n30(zCsr);.    f
3080: 6f 72 28 69 3d 30 3b 20 69 3c 31 36 20 26 26 20  or(i=0; i<16 && 
3090: 69 3c 70 4d 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b  i<pMem->n; i++){
30a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
30b0: 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73  nprintf(100, zCs
30c0: 72 2c 20 22 25 30 32 58 22 2c 20 28 28 69 6e 74  r, "%02X", ((int
30d0: 29 70 4d 65 6d 2d 3e 7a 5b 69 5d 20 26 20 30 78  )pMem->z[i] & 0x
30e0: 46 46 29 29 3b 0a 20 20 20 20 20 20 7a 43 73 72  FF));.      zCsr
30f0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
3100: 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 7d  n30(zCsr);.    }
3110: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3120: 31 36 20 26 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b  16 && i<pMem->n;
3130: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
3140: 72 20 7a 20 3d 20 70 4d 65 6d 2d 3e 7a 5b 69 5d  r z = pMem->z[i]
3150: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3c 33 32  ;.      if( z<32
3160: 20 7c 7c 20 7a 3e 31 32 36 20 29 20 2a 7a 43 73   || z>126 ) *zCs
3170: 72 2b 2b 20 3d 20 27 2e 27 3b 0a 20 20 20 20 20  r++ = '.';.     
3180: 20 65 6c 73 65 20 2a 7a 43 73 72 2b 2b 20 3d 20   else *zCsr++ = 
3190: 7a 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  z;.    }..    sq
31a0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
31b0: 30 30 2c 20 7a 43 73 72 2c 20 22 5d 25 73 22 2c  00, zCsr, "]%s",
31c0: 20 65 6e 63 6e 61 6d 65 73 5b 70 4d 65 6d 2d 3e   encnames[pMem->
31d0: 65 6e 63 5d 29 3b 0a 20 20 20 20 7a 43 73 72 20  enc]);.    zCsr 
31e0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
31f0: 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 69 66  30(zCsr);.    if
3200: 28 20 66 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ( f & MEM_Zero )
3210: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
3220: 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43  snprintf(100, zC
3230: 73 72 2c 22 2b 25 64 7a 22 2c 70 4d 65 6d 2d 3e  sr,"+%dz",pMem->
3240: 75 2e 6e 5a 65 72 6f 29 3b 0a 20 20 20 20 20 20  u.nZero);.      
3250: 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53  zCsr += sqlite3S
3260: 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20  trlen30(zCsr);. 
3270: 20 20 20 7d 0a 20 20 20 20 2a 7a 43 73 72 20 3d     }.    *zCsr =
3280: 20 27 5c 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69   '\0';.  }else i
3290: 66 28 20 66 20 26 20 4d 45 4d 5f 53 74 72 20 29  f( f & MEM_Str )
32a0: 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a  {.    int j, k;.
32b0: 20 20 20 20 7a 42 75 66 5b 30 5d 20 3d 20 27 20      zBuf[0] = ' 
32c0: 27 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d  ';.    if( f & M
32d0: 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20  EM_Dyn ){.      
32e0: 7a 42 75 66 5b 31 5d 20 3d 20 27 7a 27 3b 0a 20  zBuf[1] = 'z';. 
32f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 66 20       assert( (f 
3300: 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45  & (MEM_Static|ME
3310: 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a  M_Ephem))==0 );.
3320: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20      }else if( f 
3330: 26 20 4d 45 4d 5f 53 74 61 74 69 63 20 29 7b 0a  & MEM_Static ){.
3340: 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20        zBuf[1] = 
3350: 27 74 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72  't';.      asser
3360: 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 44 79 6e  t( (f & (MEM_Dyn
3370: 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20  |MEM_Ephem))==0 
3380: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
3390: 20 66 20 26 20 4d 45 4d 5f 45 70 68 65 6d 20 29   f & MEM_Ephem )
33a0: 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20  {.      zBuf[1] 
33b0: 3d 20 27 65 27 3b 0a 20 20 20 20 20 20 61 73 73  = 'e';.      ass
33c0: 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53  ert( (f & (MEM_S
33d0: 74 61 74 69 63 7c 4d 45 4d 5f 44 79 6e 29 29 3d  tatic|MEM_Dyn))=
33e0: 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  =0 );.    }else{
33f0: 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d  .      zBuf[1] =
3400: 20 27 73 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20   's';.    }.    
3410: 6b 20 3d 20 32 3b 0a 20 20 20 20 73 71 6c 69 74  k = 2;.    sqlit
3420: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c  e3_snprintf(100,
3430: 20 26 7a 42 75 66 5b 6b 5d 2c 20 22 25 64 22 2c   &zBuf[k], "%d",
3440: 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 6b   pMem->n);.    k
3450: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
3460: 6e 33 30 28 26 7a 42 75 66 5b 6b 5d 29 3b 0a 20  n30(&zBuf[k]);. 
3470: 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27     zBuf[k++] = '
3480: 5b 27 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  [';.    for(j=0;
3490: 20 6a 3c 31 35 20 26 26 20 6a 3c 70 4d 65 6d 2d   j<15 && j<pMem-
34a0: 3e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  >n; j++){.      
34b0: 75 38 20 63 20 3d 20 70 4d 65 6d 2d 3e 7a 5b 6a  u8 c = pMem->z[j
34c0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3e 3d  ];.      if( c>=
34d0: 30 78 32 30 20 26 26 20 63 3c 30 78 37 66 20 29  0x20 && c<0x7f )
34e0: 7b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6b  {.        zBuf[k
34f0: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
3500: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 42  else{.        zB
3510: 75 66 5b 6b 2b 2b 5d 20 3d 20 27 2e 27 3b 0a 20  uf[k++] = '.';. 
3520: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3530: 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27 5d 27   zBuf[k++] = ']'
3540: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
3550: 70 72 69 6e 74 66 28 31 30 30 2c 26 7a 42 75 66  printf(100,&zBuf
3560: 5b 6b 5d 2c 20 65 6e 63 6e 61 6d 65 73 5b 70 4d  [k], encnames[pM
3570: 65 6d 2d 3e 65 6e 63 5d 29 3b 0a 20 20 20 20 6b  em->enc]);.    k
3580: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
3590: 6e 33 30 28 26 7a 42 75 66 5b 6b 5d 29 3b 0a 20  n30(&zBuf[k]);. 
35a0: 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 30     zBuf[k++] = 0
35b0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
35c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
35d0: 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
35e0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 72  the value of a r
35f0: 65 67 69 73 74 65 72 20 66 6f 72 20 74 72 61 63  egister for trac
3600: 69 6e 67 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2f  ing purposes:.*/
3610: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d  .static void mem
3620: 54 72 61 63 65 50 72 69 6e 74 28 46 49 4c 45 20  TracePrint(FILE 
3630: 2a 6f 75 74 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20  *out, Mem *p){. 
3640: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
3650: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
3660: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 4e  fprintf(out, " N
3670: 55 4c 4c 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ULL");.  }else i
3680: 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 28  f( (p->flags & (
3690: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 53 74 72 29  MEM_Int|MEM_Str)
36a0: 29 3d 3d 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f  )==(MEM_Int|MEM_
36b0: 53 74 72 29 20 29 7b 0a 20 20 20 20 66 70 72 69  Str) ){.    fpri
36c0: 6e 74 66 28 6f 75 74 2c 20 22 20 73 69 3a 25 6c  ntf(out, " si:%l
36d0: 6c 64 22 2c 20 70 2d 3e 75 2e 69 29 3b 0a 20 20  ld", p->u.i);.  
36e0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61  }else if( p->fla
36f0: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
3700: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
3710: 20 22 20 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75   " i:%lld", p->u
3720: 2e 69 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  .i);.#ifndef SQL
3730: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
3740: 47 5f 50 4f 49 4e 54 0a 20 20 7d 65 6c 73 65 20  G_POINT.  }else 
3750: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  if( p->flags & M
3760: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 66  EM_Real ){.    f
3770: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 72 3a  printf(out, " r:
3780: 25 67 22 2c 20 70 2d 3e 72 29 3b 0a 23 65 6e 64  %g", p->r);.#end
3790: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  if.  }else if( p
37a0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
37b0: 77 53 65 74 20 29 7b 0a 20 20 20 20 66 70 72 69  wSet ){.    fpri
37c0: 6e 74 66 28 6f 75 74 2c 20 22 20 28 72 6f 77 73  ntf(out, " (rows
37d0: 65 74 29 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  et)");.  }else{.
37e0: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30      char zBuf[20
37f0: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0];.    sqlite3V
3800: 64 62 65 4d 65 6d 50 72 65 74 74 79 50 72 69 6e  dbeMemPrettyPrin
3810: 74 28 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20  t(p, zBuf);.    
3820: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 22  fprintf(out, " "
3830: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
3840: 75 74 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b  ut, "%s", zBuf);
3850: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
3860: 69 64 20 72 65 67 69 73 74 65 72 54 72 61 63 65  id registerTrace
3870: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e 74 20  (FILE *out, int 
3880: 69 52 65 67 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20  iReg, Mem *p){. 
3890: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 52   fprintf(out, "R
38a0: 45 47 5b 25 64 5d 20 3d 20 22 2c 20 69 52 65 67  EG[%d] = ", iReg
38b0: 29 3b 0a 20 20 6d 65 6d 54 72 61 63 65 50 72 69  );.  memTracePri
38c0: 6e 74 28 6f 75 74 2c 20 70 29 3b 0a 20 20 66 70  nt(out, p);.  fp
38d0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
38e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
38f0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
3900: 23 20 20 64 65 66 69 6e 65 20 52 45 47 49 53 54  #  define REGIST
3910: 45 52 5f 54 52 41 43 45 28 52 2c 4d 29 20 69 66  ER_TRACE(R,M) if
3920: 28 70 2d 3e 74 72 61 63 65 29 72 65 67 69 73 74  (p->trace)regist
3930: 65 72 54 72 61 63 65 28 70 2d 3e 74 72 61 63 65  erTrace(p->trace
3940: 2c 52 2c 4d 29 0a 23 65 6c 73 65 0a 23 20 20 64  ,R,M).#else.#  d
3950: 65 66 69 6e 65 20 52 45 47 49 53 54 45 52 5f 54  efine REGISTER_T
3960: 52 41 43 45 28 52 2c 4d 29 0a 23 65 6e 64 69 66  RACE(R,M).#endif
3970: 0a 0a 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  ...#ifdef VDBE_P
3980: 52 4f 46 49 4c 45 0a 0a 2f 2a 20 0a 2a 2a 20 68  ROFILE../* .** h
3990: 77 74 69 6d 65 2e 68 20 63 6f 6e 74 61 69 6e 73  wtime.h contains
39a0: 20 69 6e 6c 69 6e 65 20 61 73 73 65 6d 62 6c 65   inline assemble
39b0: 72 20 63 6f 64 65 20 66 6f 72 20 69 6d 70 6c 65  r code for imple
39c0: 6d 65 6e 74 69 6e 67 20 0a 2a 2a 20 68 69 67 68  menting .** high
39d0: 2d 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 69 6d  -performance tim
39e0: 69 6e 67 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f  ing routines..*/
39f0: 0a 23 69 6e 63 6c 75 64 65 20 22 68 77 74 69 6d  .#include "hwtim
3a00: 65 2e 68 22 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a  e.h"..#endif../*
3a10: 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 46 4f  .** The CHECK_FO
3a20: 52 5f 49 4e 54 45 52 52 55 50 54 20 6d 61 63 72  R_INTERRUPT macr
3a30: 6f 20 64 65 66 69 6e 65 64 20 68 65 72 65 20 6c  o defined here l
3a40: 6f 6f 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ooks to see if t
3a50: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e  he.** sqlite3_in
3a60: 74 65 72 72 75 70 74 28 29 20 72 6f 75 74 69 6e  terrupt() routin
3a70: 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  e has been calle
3a80: 64 2e 20 20 49 66 20 69 74 20 68 61 73 20 62 65  d.  If it has be
3a90: 65 6e 2c 20 74 68 65 6e 0a 2a 2a 20 70 72 6f 63  en, then.** proc
3aa0: 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 56 44  essing of the VD
3ab0: 42 45 20 70 72 6f 67 72 61 6d 20 69 73 20 69 6e  BE program is in
3ac0: 74 65 72 72 75 70 74 65 64 2e 0a 2a 2a 0a 2a 2a  terrupted..**.**
3ad0: 20 54 68 69 73 20 6d 61 63 72 6f 20 61 64 64 65   This macro adde
3ae0: 64 20 74 6f 20 65 76 65 72 79 20 69 6e 73 74 72  d to every instr
3af0: 75 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73  uction that does
3b00: 20 61 20 6a 75 6d 70 20 69 6e 20 6f 72 64 65 72   a jump in order
3b10: 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
3b20: 20 61 20 6c 6f 6f 70 2e 20 20 54 68 69 73 20 74   a loop.  This t
3b30: 65 73 74 20 75 73 65 64 20 74 6f 20 62 65 20 6f  est used to be o
3b40: 6e 20 65 76 65 72 79 20 73 69 6e 67 6c 65 20 69  n every single i
3b50: 6e 73 74 72 75 63 74 69 6f 6e 2c 0a 2a 2a 20 62  nstruction,.** b
3b60: 75 74 20 74 68 61 74 20 6d 65 61 6e 74 20 77 65  ut that meant we
3b70: 20 6d 6f 72 65 20 74 65 73 74 69 6e 67 20 74 68   more testing th
3b80: 61 74 20 77 65 20 6e 65 65 64 65 64 2e 20 20 42  at we needed.  B
3b90: 79 20 6f 6e 6c 79 20 74 65 73 74 69 6e 67 20 74  y only testing t
3ba0: 68 65 0a 2a 2a 20 66 6c 61 67 20 6f 6e 20 6a 75  he.** flag on ju
3bb0: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2c  mp instructions,
3bc0: 20 77 65 20 67 65 74 20 61 20 28 73 6d 61 6c 6c   we get a (small
3bd0: 29 20 73 70 65 65 64 20 69 6d 70 72 6f 76 65 6d  ) speed improvem
3be0: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
3bf0: 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52 52  CHECK_FOR_INTERR
3c00: 55 50 54 20 5c 0a 20 20 20 69 66 28 20 64 62 2d  UPT \.   if( db-
3c10: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
3c20: 64 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  d ) goto abort_d
3c30: 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70 74 3b  ue_to_interrupt;
3c40: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
3c50: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
3c60: 20 66 69 6c 65 45 78 69 73 74 73 28 73 71 6c 69   fileExists(sqli
3c70: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
3c80: 68 61 72 20 2a 7a 46 69 6c 65 29 7b 0a 20 20 69  har *zFile){.  i
3c90: 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 6e  nt res = 0;.  in
3ca0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
3cb0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
3cc0: 54 45 53 54 0a 20 20 2f 2a 20 49 66 20 77 65 20  TEST.  /* If we 
3cd0: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 74 65  are currently te
3ce0: 73 74 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 2c  sting IO errors,
3cf0: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 61 6c   then do not cal
3d00: 6c 20 4f 73 41 63 63 65 73 73 28 29 20 74 6f 0a  l OsAccess() to.
3d10: 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68    ** test for th
3d20: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 7a 46  e presence of zF
3d30: 69 6c 65 2e 20 54 68 69 73 20 69 73 20 62 65 63  ile. This is bec
3d40: 61 75 73 65 20 61 6e 79 20 49 4f 20 65 72 72 6f  ause any IO erro
3d50: 72 20 74 68 61 74 0a 20 20 2a 2a 20 6f 63 63 75  r that.  ** occu
3d60: 72 73 20 68 65 72 65 20 77 69 6c 6c 20 6e 6f 74  rs here will not
3d70: 20 62 65 20 72 65 70 6f 72 74 65 64 2c 20 63 61   be reported, ca
3d80: 75 73 69 6e 67 20 74 68 65 20 74 65 73 74 20 74  using the test t
3d90: 6f 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 65  o fail..  */.  e
3da0: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
3db0: 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
3dc0: 6e 67 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ng;.  if( sqlite
3dd0: 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
3de0: 6e 67 3c 3d 30 20 29 0a 23 65 6e 64 69 66 0a 20  ng<=0 ).#endif. 
3df0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
3e00: 73 41 63 63 65 73 73 28 64 62 2d 3e 70 56 66 73  sAccess(db->pVfs
3e10: 2c 20 7a 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f  , zFile, SQLITE_
3e20: 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
3e30: 72 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  res);.  return (
3e40: 72 65 73 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  res && rc==SQLIT
3e50: 45 5f 4f 4b 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  E_OK);.}.#endif.
3e60: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
3e70: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3e80: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ion is only call
3e90: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  ed from within a
3ea0: 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65  n assert() expre
3eb0: 73 73 69 6f 6e 2e 20 49 74 0a 2a 2a 20 63 68 65  ssion. It.** che
3ec0: 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  cks that the sql
3ed0: 69 74 65 33 2e 6e 54 72 61 6e 73 61 63 74 69 6f  ite3.nTransactio
3ee0: 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20 63 6f  n variable is co
3ef0: 72 72 65 63 74 6c 79 20 73 65 74 20 74 6f 0a 2a  rrectly set to.*
3f00: 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
3f10: 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  non-transaction 
3f20: 73 61 76 65 70 6f 69 6e 74 73 20 63 75 72 72 65  savepoints curre
3f30: 6e 74 6c 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20  ntly in the .** 
3f40: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
3f50: 74 69 6e 67 20 61 74 20 73 71 6c 69 74 65 33 2e  ting at sqlite3.
3f60: 70 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 0a  pSavepoint..** .
3f70: 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20  ** Usage:.**.** 
3f80: 20 20 20 20 61 73 73 65 72 74 28 20 63 68 65 63      assert( chec
3f90: 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28  kSavepointCount(
3fa0: 64 62 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63  db) );.*/.static
3fb0: 20 69 6e 74 20 63 68 65 63 6b 53 61 76 65 70 6f   int checkSavepo
3fc0: 69 6e 74 43 6f 75 6e 74 28 73 71 6c 69 74 65 33  intCount(sqlite3
3fd0: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6e 20 3d   *db){.  int n =
3fe0: 20 30 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20   0;.  Savepoint 
3ff0: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 64 62 2d 3e  *p;.  for(p=db->
4000: 70 53 61 76 65 70 6f 69 6e 74 3b 20 70 3b 20 70  pSavepoint; p; p
4010: 3d 70 2d 3e 70 4e 65 78 74 29 20 6e 2b 2b 3b 0a  =p->pNext) n++;.
4020: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 28 64 62    assert( n==(db
4030: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20 64  ->nSavepoint + d
4040: 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  b->isTransaction
4050: 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 20 20  Savepoint) );.  
4060: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
4070: 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  if../*.** Execut
4080: 65 20 61 73 20 6d 75 63 68 20 6f 66 20 61 20 56  e as much of a V
4090: 44 42 45 20 70 72 6f 67 72 61 6d 20 61 73 20 77  DBE program as w
40a0: 65 20 63 61 6e 20 74 68 65 6e 20 72 65 74 75 72  e can then retur
40b0: 6e 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  n..**.** sqlite3
40c0: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20  VdbeMakeReady() 
40d0: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
40e0: 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
40f0: 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a  ne in order to.*
4100: 2a 20 63 6c 6f 73 65 20 74 68 65 20 70 72 6f 67  * close the prog
4110: 72 61 6d 20 77 69 74 68 20 61 20 66 69 6e 61 6c  ram with a final
4120: 20 4f 50 5f 48 61 6c 74 20 61 6e 64 20 74 6f 20   OP_Halt and to 
4130: 73 65 74 20 75 70 20 74 68 65 20 63 61 6c 6c 62  set up the callb
4140: 61 63 6b 73 0a 2a 2a 20 61 6e 64 20 74 68 65 20  acks.** and the 
4150: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 70 6f  error message po
4160: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  inter..**.** Whe
4170: 6e 65 76 65 72 20 61 20 72 6f 77 20 6f 72 20 72  never a row or r
4180: 65 73 75 6c 74 20 64 61 74 61 20 69 73 20 61 76  esult data is av
4190: 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 72 6f  ailable, this ro
41a0: 75 74 69 6e 65 20 77 69 6c 6c 20 65 69 74 68 65  utine will eithe
41b0: 72 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  r.** invoke the 
41c0: 72 65 73 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20  result callback 
41d0: 28 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65  (if there is one
41e0: 29 20 6f 72 20 72 65 74 75 72 6e 20 77 69 74 68  ) or return with
41f0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 52 4f 57 2e 0a  .** SQLITE_ROW..
4200: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 61 74 74 65  **.** If an atte
4210: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
4220: 70 65 6e 20 61 20 6c 6f 63 6b 65 64 20 64 61 74  pen a locked dat
4230: 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 69 73  abase, then this
4240: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 69 6c 6c   routine.** will
4250: 20 65 69 74 68 65 72 20 69 6e 76 6f 6b 65 20 74   either invoke t
4260: 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
4270: 20 28 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e   (if there is on
4280: 65 29 20 6f 72 20 69 74 20 77 69 6c 6c 0a 2a 2a  e) or it will.**
4290: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
42a0: 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  USY..**.** If an
42b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
42c0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
42d0: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6d 65  is written to me
42e0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  mory obtained.**
42f0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
4300: 6c 6c 6f 63 28 29 20 61 6e 64 20 70 2d 3e 7a 45  lloc() and p->zE
4310: 72 72 4d 73 67 20 69 73 20 6d 61 64 65 20 74 6f  rrMsg is made to
4320: 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 6d   point to that m
4330: 65 6d 6f 72 79 2e 0a 2a 2a 20 54 68 65 20 65 72  emory..** The er
4340: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 74 6f 72  ror code is stor
4350: 65 64 20 69 6e 20 70 2d 3e 72 63 20 61 6e 64 20  ed in p->rc and 
4360: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
4370: 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 52 52 4f  urns SQLITE_ERRO
4380: 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  R..**.** If the 
4390: 63 61 6c 6c 62 61 63 6b 20 65 76 65 72 20 72 65  callback ever re
43a0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
43b0: 74 68 65 6e 20 74 68 65 20 70 72 6f 67 72 61 6d  then the program
43c0: 20 65 78 69 74 73 0a 2a 2a 20 69 6d 6d 65 64 69   exits.** immedi
43d0: 61 74 65 6c 79 2e 20 20 54 68 65 72 65 20 77 69  ately.  There wi
43e0: 6c 6c 20 62 65 20 6e 6f 20 65 72 72 6f 72 20 6d  ll be no error m
43f0: 65 73 73 61 67 65 20 62 75 74 20 74 68 65 20 70  essage but the p
4400: 2d 3e 72 63 20 66 69 65 6c 64 20 69 73 0a 2a 2a  ->rc field is.**
4410: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41   set to SQLITE_A
4420: 42 4f 52 54 20 61 6e 64 20 74 68 69 73 20 72 6f  BORT and this ro
4430: 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
4440: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
4450: 2a 2a 0a 2a 2a 20 41 20 6d 65 6d 6f 72 79 20 61  **.** A memory a
4460: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
4470: 63 61 75 73 65 73 20 70 2d 3e 72 63 20 74 6f 20  causes p->rc to 
4480: 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
4490: 5f 4e 4f 4d 45 4d 20 61 6e 64 20 74 68 69 73 0a  _NOMEM and this.
44a0: 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65  ** routine to re
44b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
44c0: 52 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 20 66  R..**.** Other f
44d0: 61 74 61 6c 20 65 72 72 6f 72 73 20 72 65 74 75  atal errors retu
44e0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
44f0: 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  .**.** After thi
4500: 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 66 69  s routine has fi
4510: 6e 69 73 68 65 64 2c 20 73 71 6c 69 74 65 33 56  nished, sqlite3V
4520: 64 62 65 46 69 6e 61 6c 69 7a 65 28 29 20 73 68  dbeFinalize() sh
4530: 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 73 65 64 20  ould be.** used 
4540: 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  to clean up the 
4550: 6d 65 73 73 20 74 68 61 74 20 77 61 73 20 6c 65  mess that was le
4560: 66 74 20 62 65 68 69 6e 64 2e 0a 2a 2f 0a 69 6e  ft behind..*/.in
4570: 74 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  t sqlite3VdbeExe
4580: 63 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  c(.  Vdbe *p    
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
45b0: 7b 0a 20 20 69 6e 74 20 70 63 3d 30 3b 20 20 20  {.  int pc=0;   
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
45d0: 2a 20 54 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  * The program co
45e0: 75 6e 74 65 72 20 2a 2f 0a 20 20 4f 70 20 2a 61  unter */.  Op *a
45f0: 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 20 20 20 20  Op = p->aOp;    
4600: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
4610: 20 70 2d 3e 61 4f 70 20 2a 2f 0a 20 20 4f 70 20   p->aOp */.  Op 
4620: 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20  *pOp;           
4630: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4640: 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  nt operation */.
4650: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4660: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 2f 2a 20  E_OK;        /* 
4670: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
4680: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
4690: 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20   = p->db;       
46a0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
46b0: 2a 2f 0a 20 20 75 38 20 72 65 73 65 74 53 63 68  */.  u8 resetSch
46c0: 65 6d 61 4f 6e 46 61 75 6c 74 20 3d 20 30 3b 20  emaOnFault = 0; 
46d0: 2f 2a 20 52 65 73 65 74 20 73 63 68 65 6d 61 20  /* Reset schema 
46e0: 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69  after an error i
46f0: 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 65  f true */.  u8 e
4700: 6e 63 6f 64 69 6e 67 20 3d 20 45 4e 43 28 64 62  ncoding = ENC(db
4710: 29 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  );     /* The da
4720: 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20  tabase encoding 
4730: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
4740: 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f  E_OMIT_PROGRESS_
4750: 43 41 4c 4c 42 41 43 4b 0a 20 20 69 6e 74 20 63  CALLBACK.  int c
4760: 68 65 63 6b 50 72 6f 67 72 65 73 73 3b 20 20 20  heckProgress;   
4770: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
4780: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
4790: 63 6b 73 20 61 72 65 20 65 6e 61 62 6c 65 64 20  cks are enabled 
47a0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 6f 67 72 65  */.  int nProgre
47b0: 73 73 4f 70 73 20 3d 20 30 3b 20 20 20 20 20 20  ssOps = 0;      
47c0: 2f 2a 20 4f 70 63 6f 64 65 73 20 65 78 65 63 75  /* Opcodes execu
47d0: 74 65 64 20 73 69 6e 63 65 20 70 72 6f 67 72 65  ted since progre
47e0: 73 73 20 63 61 6c 6c 62 61 63 6b 2e 20 2a 2f 0a  ss callback. */.
47f0: 23 65 6e 64 69 66 0a 20 20 4d 65 6d 20 2a 61 4d  #endif.  Mem *aM
4800: 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 20 20 20  em = p->aMem;   
4810: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70      /* Copy of p
4820: 2d 3e 61 4d 65 6d 20 2a 2f 0a 20 20 4d 65 6d 20  ->aMem */.  Mem 
4830: 2a 70 49 6e 31 20 3d 20 30 3b 20 20 20 20 20 20  *pIn1 = 0;      
4840: 20 20 20 20 20 20 20 2f 2a 20 31 73 74 20 69 6e         /* 1st in
4850: 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  put operand */. 
4860: 20 4d 65 6d 20 2a 70 49 6e 32 20 3d 20 30 3b 20   Mem *pIn2 = 0; 
4870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
4880: 6e 64 20 69 6e 70 75 74 20 6f 70 65 72 61 6e 64  nd input operand
4890: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 33 20   */.  Mem *pIn3 
48a0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
48b0: 20 2f 2a 20 33 72 64 20 69 6e 70 75 74 20 6f 70   /* 3rd input op
48c0: 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a  erand */.  Mem *
48d0: 70 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  pOut = 0;       
48e0: 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
48f0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
4900: 20 69 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 20   iCompare = 0;  
4910: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
4920: 74 20 6f 66 20 6c 61 73 74 20 4f 50 5f 43 6f 6d  t of last OP_Com
4930: 70 61 72 65 20 6f 70 65 72 61 74 69 6f 6e 20 2a  pare operation *
4940: 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74  /.  int *aPermut
4950: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  e = 0;         /
4960: 2a 20 50 65 72 6d 75 74 61 74 69 6f 6e 20 6f 66  * Permutation of
4970: 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 4f 50 5f   columns for OP_
4980: 43 6f 6d 70 61 72 65 20 2a 2f 0a 23 69 66 64 65  Compare */.#ifde
4990: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
49a0: 20 75 36 34 20 73 74 61 72 74 3b 20 20 20 20 20   u64 start;     
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
49c0: 50 55 20 63 6c 6f 63 6b 20 63 6f 75 6e 74 20 61  PU clock count a
49d0: 74 20 73 74 61 72 74 20 6f 66 20 6f 70 63 6f 64  t start of opcod
49e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 50  e */.  int origP
49f0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
4a00: 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75    /* Program cou
4a10: 6e 74 65 72 20 61 74 20 73 74 61 72 74 20 6f 66  nter at start of
4a20: 20 6f 70 63 6f 64 65 20 2a 2f 0a 23 65 6e 64 69   opcode */.#endi
4a30: 66 0a 20 20 2f 2a 2a 2a 20 49 4e 53 45 52 54 20  f.  /*** INSERT 
4a40: 53 54 41 43 4b 20 55 4e 49 4f 4e 20 48 45 52 45  STACK UNION HERE
4a50: 20 2a 2a 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28   ***/..  assert(
4a60: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
4a70: 4d 41 47 49 43 5f 52 55 4e 20 29 3b 20 20 2f 2a  MAGIC_RUN );  /*
4a80: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
4a90: 76 65 72 69 66 69 65 73 20 74 68 69 73 20 2a 2f  verifies this */
4aa0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75  .  sqlite3VdbeMu
4ab0: 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 70 29  texArrayEnter(p)
4ac0: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
4ad0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
4ae0: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
4af0: 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ns if a malloc()
4b00: 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74   inside a call t
4b10: 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  o sqlite3_column
4b20: 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a  _text() or.    *
4b30: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
4b40: 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64  _text16() failed
4b50: 2e 20 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 6e  .  */.    goto n
4b60: 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 61 73 73  o_mem;.  }.  ass
4b70: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
4b80: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
4b90: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20  SQLITE_BUSY );. 
4ba0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
4bb0: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  OK;.  assert( p-
4bc0: 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 29 3b 0a 20  >explain==0 );. 
4bd0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
4be0: 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61   0;.  db->busyHa
4bf0: 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b  ndler.nBusy = 0;
4c00: 0a 20 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54  .  CHECK_FOR_INT
4c10: 45 52 52 55 50 54 3b 0a 20 20 73 71 6c 69 74 65  ERRUPT;.  sqlite
4c20: 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28  3VdbeIOTraceSql(
4c30: 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p);.#ifndef SQLI
4c40: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
4c50: 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 63 68 65 63  _CALLBACK.  chec
4c60: 6b 50 72 6f 67 72 65 73 73 20 3d 20 64 62 2d 3e  kProgress = db->
4c70: 78 50 72 6f 67 72 65 73 73 21 3d 30 3b 0a 23 65  xProgress!=0;.#e
4c80: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
4c90: 54 45 5f 44 45 42 55 47 0a 20 20 73 71 6c 69 74  TE_DEBUG.  sqlit
4ca0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
4cb0: 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 70 2d 3e  loc();.  if( p->
4cc0: 70 63 3d 3d 30 20 0a 20 20 20 26 26 20 28 28 70  pc==0 .   && ((p
4cd0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
4ce0: 4c 49 54 45 5f 56 64 62 65 4c 69 73 74 69 6e 67  LITE_VdbeListing
4cf0: 29 20 7c 7c 20 66 69 6c 65 45 78 69 73 74 73 28  ) || fileExists(
4d00: 64 62 2c 20 22 76 64 62 65 5f 65 78 70 6c 61 69  db, "vdbe_explai
4d10: 6e 22 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  n")).  ){.    in
4d20: 74 20 69 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  t i;.    printf(
4d30: 22 56 44 42 45 20 50 72 6f 67 72 61 6d 20 4c 69  "VDBE Program Li
4d40: 73 74 69 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20 20  sting:\n");.    
4d50: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
4d60: 53 71 6c 28 70 29 3b 0a 20 20 20 20 66 6f 72 28  Sql(p);.    for(
4d70: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
4d80: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
4d90: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 73 74  e3VdbePrintOp(st
4da0: 64 6f 75 74 2c 20 69 2c 20 26 61 4f 70 5b 69 5d  dout, i, &aOp[i]
4db0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
4dc0: 66 28 20 66 69 6c 65 45 78 69 73 74 73 28 64 62  f( fileExists(db
4dd0: 2c 20 22 76 64 62 65 5f 74 72 61 63 65 22 29 20  , "vdbe_trace") 
4de0: 29 7b 0a 20 20 20 20 70 2d 3e 74 72 61 63 65 20  ){.    p->trace 
4df0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 0a 20 20  = stdout;.  }.  
4e00: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
4e10: 4d 61 6c 6c 6f 63 28 29 3b 0a 23 65 6e 64 69 66  Malloc();.#endif
4e20: 0a 20 20 66 6f 72 28 70 63 3d 70 2d 3e 70 63 3b  .  for(pc=p->pc;
4e30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
4e40: 70 63 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72  pc++){.    asser
4e50: 74 28 20 70 63 3e 3d 30 20 26 26 20 70 63 3c 70  t( pc>=0 && pc<p
4e60: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 20 20 69 66 28  ->nOp );.    if(
4e70: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
4e80: 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  d ) goto no_mem;
4e90: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
4ea0: 46 49 4c 45 0a 20 20 20 20 6f 72 69 67 50 63 20  FILE.    origPc 
4eb0: 3d 20 70 63 3b 0a 20 20 20 20 73 74 61 72 74 20  = pc;.    start 
4ec0: 3d 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28  = sqlite3Hwtime(
4ed0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4f  );.#endif.    pO
4ee0: 70 20 3d 20 26 61 4f 70 5b 70 63 5d 3b 0a 0a 20  p = &aOp[pc];.. 
4ef0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77     /* Only allow
4f00: 20 74 72 61 63 69 6e 67 20 69 66 20 53 51 4c 49   tracing if SQLI
4f10: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
4f20: 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 64  ned..    */.#ifd
4f30: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
4f40: 20 20 20 20 69 66 28 20 70 2d 3e 74 72 61 63 65      if( p->trace
4f50: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 63   ){.      if( pc
4f60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
4f70: 72 69 6e 74 66 28 22 56 44 42 45 20 45 78 65 63  rintf("VDBE Exec
4f80: 75 74 69 6f 6e 20 54 72 61 63 65 3a 5c 6e 22 29  ution Trace:\n")
4f90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4fa0: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 70 29  3VdbePrintSql(p)
4fb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4fc0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
4fd0: 4f 70 28 70 2d 3e 74 72 61 63 65 2c 20 70 63 2c  Op(p->trace, pc,
4fe0: 20 70 4f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20   pOp);.    }.   
4ff0: 20 69 66 28 20 70 2d 3e 74 72 61 63 65 3d 3d 30   if( p->trace==0
5000: 20 26 26 20 70 63 3d 3d 30 20 29 7b 0a 20 20 20   && pc==0 ){.   
5010: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
5020: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
5030: 20 20 20 20 20 69 66 28 20 66 69 6c 65 45 78 69       if( fileExi
5040: 73 74 73 28 64 62 2c 20 22 76 64 62 65 5f 73 71  sts(db, "vdbe_sq
5050: 6c 74 72 61 63 65 22 29 20 29 7b 0a 20 20 20 20  ltrace") ){.    
5060: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
5070: 72 69 6e 74 53 71 6c 28 70 29 3b 0a 20 20 20 20  rintSql(p);.    
5080: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
5090: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
50a0: 28 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ();.    }.#endif
50b0: 0a 20 20 20 20 20 20 0a 0a 20 20 20 20 2f 2a 20  .      ..    /* 
50c0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
50d0: 77 65 20 6e 65 65 64 20 74 6f 20 73 69 6d 75 6c  we need to simul
50e0: 61 74 65 20 61 6e 20 69 6e 74 65 72 72 75 70 74  ate an interrupt
50f0: 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  .  This only hap
5100: 70 65 6e 73 0a 20 20 20 20 2a 2a 20 69 66 20 77  pens.    ** if w
5110: 65 20 68 61 76 65 20 61 20 73 70 65 63 69 61 6c  e have a special
5120: 20 74 65 73 74 20 62 75 69 6c 64 2e 0a 20 20 20   test build..   
5130: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
5140: 45 5f 54 45 53 54 0a 20 20 20 20 69 66 28 20 73  E_TEST.    if( s
5150: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
5160: 5f 63 6f 75 6e 74 3e 30 20 29 7b 0a 20 20 20 20  _count>0 ){.    
5170: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72    sqlite3_interr
5180: 75 70 74 5f 63 6f 75 6e 74 2d 2d 3b 0a 20 20 20  upt_count--;.   
5190: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69     if( sqlite3_i
51a0: 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3d 3d  nterrupt_count==
51b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
51c0: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64  ite3_interrupt(d
51d0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
51e0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
5200: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
5210: 20 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20      /* Call the 
5220: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
5230: 6b 20 69 66 20 69 74 20 69 73 20 63 6f 6e 66 69  k if it is confi
5240: 67 75 72 65 64 20 61 6e 64 20 74 68 65 20 72 65  gured and the re
5250: 71 75 69 72 65 64 20 6e 75 6d 62 65 72 0a 20 20  quired number.  
5260: 20 20 2a 2a 20 6f 66 20 56 44 42 45 20 6f 70 73    ** of VDBE ops
5270: 20 68 61 76 65 20 62 65 65 6e 20 65 78 65 63 75   have been execu
5280: 74 65 64 20 28 65 69 74 68 65 72 20 73 69 6e 63  ted (either sinc
5290: 65 20 74 68 69 73 20 69 6e 76 6f 63 61 74 69 6f  e this invocatio
52a0: 6e 20 6f 66 0a 20 20 20 20 2a 2a 20 73 71 6c 69  n of.    ** sqli
52b0: 74 65 33 56 64 62 65 45 78 65 63 28 29 20 6f 72  te3VdbeExec() or
52c0: 20 73 69 6e 63 65 20 6c 61 73 74 20 74 69 6d 65   since last time
52d0: 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   the progress ca
52e0: 6c 6c 62 61 63 6b 20 77 61 73 20 63 61 6c 6c 65  llback was calle
52f0: 64 29 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68  d)..    ** If th
5300: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
5310: 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ack returns non-
5320: 7a 65 72 6f 2c 20 65 78 69 74 20 74 68 65 20 76  zero, exit the v
5330: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 77  irtual machine w
5340: 69 74 68 0a 20 20 20 20 2a 2a 20 61 20 72 65 74  ith.    ** a ret
5350: 75 72 6e 20 63 6f 64 65 20 53 51 4c 49 54 45 5f  urn code SQLITE_
5360: 41 42 4f 52 54 2e 0a 20 20 20 20 2a 2f 0a 20 20  ABORT..    */.  
5370: 20 20 69 66 28 20 63 68 65 63 6b 50 72 6f 67 72    if( checkProgr
5380: 65 73 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ess ){.      if(
5390: 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70   db->nProgressOp
53a0: 73 3d 3d 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  s==nProgressOps 
53b0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 70  ){.        int p
53c0: 72 63 3b 0a 20 20 20 20 20 20 20 20 70 72 63 20  rc;.        prc 
53d0: 3d 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 28  = db->xProgress(
53e0: 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67  db->pProgressArg
53f0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
5400: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
5410: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
5420: 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 20 20  NTERRUPT;.      
5430: 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 65 72      goto vdbe_er
5440: 72 6f 72 5f 68 61 6c 74 3b 0a 20 20 20 20 20 20  ror_halt;.      
5450: 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 50 72 6f    }.        nPro
5460: 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20  gressOps = 0;.  
5470: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 50 72 6f      }.      nPro
5480: 67 72 65 73 73 4f 70 73 2b 2b 3b 0a 20 20 20 20  gressOps++;.    
5490: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
54a0: 20 4f 6e 20 61 6e 79 20 6f 70 63 6f 64 65 20 77   On any opcode w
54b0: 69 74 68 20 74 68 65 20 22 6f 75 74 32 2d 70 72  ith the "out2-pr
54c0: 65 72 65 6c 61 73 65 22 20 74 61 67 2c 20 66 72  erelase" tag, fr
54d0: 65 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 65 78  ee any.    ** ex
54e0: 74 65 72 6e 61 6c 20 61 6c 6c 6f 63 61 74 69 6f  ternal allocatio
54f0: 6e 73 20 6f 75 74 20 6f 66 20 6d 65 6d 5b 70 32  ns out of mem[p2
5500: 5d 20 61 6e 64 20 73 65 74 20 6d 65 6d 5b 70 32  ] and set mem[p2
5510: 5d 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 61  ] to be.    ** a
5520: 6e 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 74 65  n undefined inte
5530: 67 65 72 2e 20 20 4f 70 63 6f 64 65 73 20 77 69  ger.  Opcodes wi
5540: 6c 6c 20 65 69 74 68 65 72 20 66 69 6c 6c 20 69  ll either fill i
5550: 6e 20 74 68 65 20 69 6e 74 65 67 65 72 0a 20 20  n the integer.  
5560: 20 20 2a 2a 20 76 61 6c 75 65 20 6f 72 20 63 6f    ** value or co
5570: 6e 76 65 72 74 20 6d 65 6d 5b 70 32 5d 20 74 6f  nvert mem[p2] to
5580: 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 79 70   a different typ
5590: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
55a0: 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 66 6c 61  sert( pOp->opfla
55b0: 67 73 3d 3d 73 71 6c 69 74 65 33 4f 70 63 6f 64  gs==sqlite3Opcod
55c0: 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f  eProperty[pOp->o
55d0: 70 63 6f 64 65 5d 20 29 3b 0a 20 20 20 20 69 66  pcode] );.    if
55e0: 28 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26  ( pOp->opflags &
55f0: 20 4f 50 46 4c 47 5f 4f 55 54 32 5f 50 52 45 52   OPFLG_OUT2_PRER
5600: 45 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20  ELEASE ){.      
5610: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e  assert( pOp->p2>
5620: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
5630: 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e  t( pOp->p2<=p->n
5640: 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20 70 4f 75  Mem );.      pOu
5650: 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
5660: 32 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2];.      sqlite
5670: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 45  3VdbeMemReleaseE
5680: 78 74 65 72 6e 61 6c 28 70 4f 75 74 29 3b 0a 20  xternal(pOut);. 
5690: 20 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73       pOut->flags
56a0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
56b0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 61 6e 69 74 79  }..    /* Sanity
56c0: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 6f 74 68   checking on oth
56d0: 65 72 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 23  er operands */.#
56e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
56f0: 55 47 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d  UG.    if( (pOp-
5700: 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47  >opflags & OPFLG
5710: 5f 49 4e 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  _IN1)!=0 ){.    
5720: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
5730: 31 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  1>0 );.      ass
5740: 65 72 74 28 20 70 4f 70 2d 3e 70 31 3c 3d 70 2d  ert( pOp->p1<=p-
5750: 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20 52  >nMem );.      R
5760: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
5770: 70 2d 3e 70 31 2c 20 26 61 4d 65 6d 5b 70 4f 70  p->p1, &aMem[pOp
5780: 2d 3e 70 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ->p1]);.    }.  
5790: 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c    if( (pOp->opfl
57a0: 61 67 73 20 26 20 4f 50 46 4c 47 5f 49 4e 32 29  ags & OPFLG_IN2)
57b0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
57c0: 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29  ert( pOp->p2>0 )
57d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
57e0: 70 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p2<=p->nMem
57f0: 20 29 3b 0a 20 20 20 20 20 20 52 45 47 49 53 54   );.      REGIST
5800: 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32  ER_TRACE(pOp->p2
5810: 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  , &aMem[pOp->p2]
5820: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
5830: 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26   (pOp->opflags &
5840: 20 4f 50 46 4c 47 5f 49 4e 33 29 21 3d 30 20 29   OPFLG_IN3)!=0 )
5850: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5860: 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20  pOp->p3>0 );.   
5870: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
5880: 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  p3<=p->nMem );. 
5890: 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52       REGISTER_TR
58a0: 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 26 61 4d  ACE(pOp->p3, &aM
58b0: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20  em[pOp->p3]);.  
58c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 4f 70    }.    if( (pOp
58d0: 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c  ->opflags & OPFL
58e0: 47 5f 4f 55 54 32 29 21 3d 30 20 29 7b 0a 20 20  G_OUT2)!=0 ){.  
58f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
5900: 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  >p2>0 );.      a
5910: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d  ssert( pOp->p2<=
5920: 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 7d  p->nMem );.    }
5930: 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f  .    if( (pOp->o
5940: 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 4f  pflags & OPFLG_O
5950: 55 54 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  UT3)!=0 ){.     
5960: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
5970: 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
5980: 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e  rt( pOp->p3<=p->
5990: 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 7d 0a 23 65  nMem );.    }.#e
59a0: 6e 64 69 66 0a 20 20 0a 20 20 20 20 73 77 69 74  ndif.  .    swit
59b0: 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ch( pOp->opcode 
59c0: 29 7b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ){../***********
59d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a10: 2a 2a 0a 2a 2a 20 57 68 61 74 20 66 6f 6c 6c 6f  **.** What follo
5a20: 77 73 20 69 73 20 61 20 6d 61 73 73 69 76 65 20  ws is a massive 
5a30: 73 77 69 74 63 68 20 73 74 61 74 65 6d 65 6e 74  switch statement
5a40: 20 77 68 65 72 65 20 65 61 63 68 20 63 61 73 65   where each case
5a50: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 0a 2a 2a   implements a.**
5a60: 20 73 65 70 61 72 61 74 65 20 69 6e 73 74 72 75   separate instru
5a70: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 69 72  ction in the vir
5a80: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 49  tual machine.  I
5a90: 66 20 77 65 20 66 6f 6c 6c 6f 77 20 74 68 65 20  f we follow the 
5aa0: 75 73 75 61 6c 0a 2a 2a 20 69 6e 64 65 6e 74 61  usual.** indenta
5ab0: 74 69 6f 6e 20 63 6f 6e 76 65 6e 74 69 6f 6e 73  tion conventions
5ac0: 2c 20 65 61 63 68 20 63 61 73 65 20 73 68 6f 75  , each case shou
5ad0: 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64 20 62  ld be indented b
5ae0: 79 20 36 20 73 70 61 63 65 73 2e 20 20 42 75 74  y 6 spaces.  But
5af0: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 20 6c 6f  .** that is a lo
5b00: 74 20 6f 66 20 77 61 73 74 65 64 20 73 70 61 63  t of wasted spac
5b10: 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 6d 61  e on the left ma
5b20: 72 67 69 6e 2e 20 20 53 6f 20 74 68 65 20 63 6f  rgin.  So the co
5b30: 64 65 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65  de within.** the
5b40: 20 73 77 69 74 63 68 20 73 74 61 74 65 6d 65 6e   switch statemen
5b50: 74 20 77 69 6c 6c 20 62 72 65 61 6b 20 77 69 74  t will break wit
5b60: 68 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 61 6e 64  h convention and
5b70: 20 62 65 20 66 6c 75 73 68 2d 6c 65 66 74 2e 20   be flush-left. 
5b80: 41 6e 6f 74 68 65 72 0a 2a 2a 20 62 69 67 20 63  Another.** big c
5b90: 6f 6d 6d 65 6e 74 20 28 73 69 6d 69 6c 61 72 20  omment (similar 
5ba0: 74 6f 20 74 68 69 73 20 6f 6e 65 29 20 77 69 6c  to this one) wil
5bb0: 6c 20 6d 61 72 6b 20 74 68 65 20 70 6f 69 6e 74  l mark the point
5bc0: 20 69 6e 20 74 68 65 20 63 6f 64 65 20 77 68 65   in the code whe
5bd0: 72 65 0a 2a 2a 20 77 65 20 74 72 61 6e 73 69 74  re.** we transit
5be0: 69 6f 6e 20 62 61 63 6b 20 74 6f 20 6e 6f 72 6d  ion back to norm
5bf0: 61 6c 20 69 6e 64 65 6e 74 61 74 69 6f 6e 2e 0a  al indentation..
5c00: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
5c10: 74 69 6e 67 20 6f 66 20 65 61 63 68 20 63 61 73  ting of each cas
5c20: 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  e is important. 
5c30: 20 54 68 65 20 6d 61 6b 65 66 69 6c 65 20 66 6f   The makefile fo
5c40: 72 20 53 51 4c 69 74 65 0a 2a 2a 20 67 65 6e 65  r SQLite.** gene
5c50: 72 61 74 65 73 20 74 77 6f 20 43 20 66 69 6c 65  rates two C file
5c60: 73 20 22 6f 70 63 6f 64 65 73 2e 68 22 20 61 6e  s "opcodes.h" an
5c70: 64 20 22 6f 70 63 6f 64 65 73 2e 63 22 20 62 79  d "opcodes.c" by
5c80: 20 73 63 61 6e 6e 69 6e 67 20 74 68 69 73 0a 2a   scanning this.*
5c90: 2a 20 66 69 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66  * file looking f
5ca0: 6f 72 20 6c 69 6e 65 73 20 74 68 61 74 20 62 65  or lines that be
5cb0: 67 69 6e 20 77 69 74 68 20 22 63 61 73 65 20 4f  gin with "case O
5cc0: 50 5f 22 2e 20 20 54 68 65 20 6f 70 63 6f 64 65  P_".  The opcode
5cd0: 73 2e 68 20 66 69 6c 65 73 0a 2a 2a 20 77 69 6c  s.h files.** wil
5ce0: 6c 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68  l be filled with
5cf0: 20 23 64 65 66 69 6e 65 73 20 74 68 61 74 20 67   #defines that g
5d00: 69 76 65 20 75 6e 69 71 75 65 20 69 6e 74 65 67  ive unique integ
5d10: 65 72 20 76 61 6c 75 65 73 20 74 6f 20 65 61 63  er values to eac
5d20: 68 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 6e 64 20  h.** opcode and 
5d30: 74 68 65 20 6f 70 63 6f 64 65 73 2e 63 20 66 69  the opcodes.c fi
5d40: 6c 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  le is filled wit
5d50: 68 20 61 6e 20 61 72 72 61 79 20 6f 66 20 73 74  h an array of st
5d60: 72 69 6e 67 73 20 77 68 65 72 65 0a 2a 2a 20 65  rings where.** e
5d70: 61 63 68 20 73 74 72 69 6e 67 20 69 73 20 74 68  ach string is th
5d80: 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20  e symbolic name 
5d90: 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  for the correspo
5da0: 6e 64 69 6e 67 20 6f 70 63 6f 64 65 2e 20 20 49  nding opcode.  I
5db0: 66 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 73 74  f the.** case st
5dc0: 61 74 65 6d 65 6e 74 20 69 73 20 66 6f 6c 6c 6f  atement is follo
5dd0: 77 65 64 20 62 79 20 61 20 63 6f 6d 6d 65 6e 74  wed by a comment
5de0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2f 23   of the form "/#
5df0: 20 73 61 6d 65 20 61 73 20 2e 2e 2e 20 23 2f 22   same as ... #/"
5e00: 0a 2a 2a 20 74 68 61 74 20 63 6f 6d 6d 65 6e 74  .** that comment
5e10: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
5e20: 72 6d 69 6e 65 20 74 68 65 20 70 61 72 74 69 63  rmine the partic
5e30: 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68  ular value of th
5e40: 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  e opcode..**.** 
5e50: 4f 74 68 65 72 20 6b 65 79 77 6f 72 64 73 20 69  Other keywords i
5e60: 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 68  n the comment th
5e70: 61 74 20 66 6f 6c 6c 6f 77 73 20 65 61 63 68 20  at follows each 
5e80: 63 61 73 65 20 61 72 65 20 75 73 65 64 20 74 6f  case are used to
5e90: 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 74 68  .** construct th
5ea0: 65 20 4f 50 46 4c 47 5f 49 4e 49 54 49 41 4c 49  e OPFLG_INITIALI
5eb0: 5a 45 52 20 76 61 6c 75 65 20 74 68 61 74 20 69  ZER value that i
5ec0: 6e 69 74 69 61 6c 69 7a 65 73 20 6f 70 63 6f 64  nitializes opcod
5ed0: 65 50 72 6f 70 65 72 74 79 5b 5d 2e 0a 2a 2a 20  eProperty[]..** 
5ee0: 4b 65 79 77 6f 72 64 73 20 69 6e 63 6c 75 64 65  Keywords include
5ef0: 3a 20 69 6e 31 2c 20 69 6e 32 2c 20 69 6e 33 2c  : in1, in2, in3,
5f00: 20 6f 75 74 32 5f 70 72 65 72 65 6c 65 61 73 65   out2_prerelease
5f10: 2c 20 6f 75 74 32 2c 20 6f 75 74 33 2e 20 20 53  , out2, out3.  S
5f20: 65 65 0a 2a 2a 20 74 68 65 20 6d 6b 6f 70 63 6f  ee.** the mkopco
5f30: 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 66  deh.awk script f
5f40: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
5f50: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
5f60: 20 44 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 61   Documentation a
5f70: 62 6f 75 74 20 56 44 42 45 20 6f 70 63 6f 64 65  bout VDBE opcode
5f80: 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  s is generated b
5f90: 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 69 73 20  y scanning this 
5fa0: 66 69 6c 65 0a 2a 2a 20 66 6f 72 20 6c 69 6e 65  file.** for line
5fb0: 73 20 6f 66 20 74 68 61 74 20 63 6f 6e 74 61 69  s of that contai
5fc0: 6e 20 22 4f 70 63 6f 64 65 3a 22 2e 20 20 54 68  n "Opcode:".  Th
5fd0: 61 74 20 6c 69 6e 65 20 61 6e 64 20 61 6c 6c 20  at line and all 
5fe0: 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 63 6f  subsequent.** co
5ff0: 6d 6d 65 6e 74 20 6c 69 6e 65 73 20 61 72 65 20  mment lines are 
6000: 75 73 65 64 20 69 6e 20 74 68 65 20 67 65 6e 65  used in the gene
6010: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70  ration of the op
6020: 63 6f 64 65 2e 68 74 6d 6c 20 64 6f 63 75 6d 65  code.html docume
6030: 6e 74 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2e  ntation.** file.
6040: 0a 2a 2a 0a 2a 2a 20 53 55 4d 4d 41 52 59 3a 0a  .**.** SUMMARY:.
6050: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 6d 61 74  **.**     Format
6060: 74 69 6e 67 20 69 73 20 69 6d 70 6f 72 74 61 6e  ting is importan
6070: 74 20 74 6f 20 73 63 72 69 70 74 73 20 74 68 61  t to scripts tha
6080: 74 20 73 63 61 6e 20 74 68 69 73 20 66 69 6c 65  t scan this file
6090: 2e 0a 2a 2a 20 20 20 20 20 44 6f 20 6e 6f 74 20  ..**     Do not 
60a0: 64 65 76 69 61 74 65 20 66 72 6f 6d 20 74 68 65  deviate from the
60b0: 20 66 6f 72 6d 61 74 74 69 6e 67 20 73 74 79 6c   formatting styl
60c0: 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
60d0: 73 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  se..**.*********
60e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6120: 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ****/../* Opcode
6130: 3a 20 20 47 6f 74 6f 20 2a 20 50 32 20 2a 20 2a  :  Goto * P2 * *
6140: 20 2a 0a 2a 2a 0a 2a 2a 20 41 6e 20 75 6e 63 6f   *.**.** An unco
6150: 6e 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74  nditional jump t
6160: 6f 20 61 64 64 72 65 73 73 20 50 32 2e 0a 2a 2a  o address P2..**
6170: 20 54 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   The next instru
6180: 63 74 69 6f 6e 20 65 78 65 63 75 74 65 64 20 77  ction executed w
6190: 69 6c 6c 20 62 65 20 0a 2a 2a 20 74 68 65 20 6f  ill be .** the o
61a0: 6e 65 20 61 74 20 69 6e 64 65 78 20 50 32 20 66  ne at index P2 f
61b0: 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
61c0: 67 20 6f 66 0a 2a 2a 20 74 68 65 20 70 72 6f 67  g of.** the prog
61d0: 72 61 6d 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ram..*/.case OP_
61e0: 47 6f 74 6f 3a 20 7b 20 20 20 20 20 20 20 20 20  Goto: {         
61f0: 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20      /* jump */. 
6200: 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52   CHECK_FOR_INTER
6210: 52 55 50 54 3b 0a 20 20 70 63 20 3d 20 70 4f 70  RUPT;.  pc = pOp
6220: 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 62 72 65 61  ->p2 - 1;.  brea
6230: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
6240: 20 20 47 6f 73 75 62 20 50 31 20 50 32 20 2a 20    Gosub P1 P2 * 
6250: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  * *.**.** Write 
6260: 74 68 65 20 63 75 72 72 65 6e 74 20 61 64 64 72  the current addr
6270: 65 73 73 20 6f 6e 74 6f 20 72 65 67 69 73 74 65  ess onto registe
6280: 72 20 50 31 0a 2a 2a 20 61 6e 64 20 74 68 65 6e  r P1.** and then
6290: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73   jump to address
62a0: 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
62b0: 47 6f 73 75 62 3a 20 7b 20 20 20 20 20 20 20 20  Gosub: {        
62c0: 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31      /* jump, in1
62d0: 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
62e0: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  em[pOp->p1];.  a
62f0: 73 73 65 72 74 28 20 28 70 49 6e 31 2d 3e 66 6c  ssert( (pIn1->fl
6300: 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d  ags & MEM_Dyn)==
6310: 30 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61  0 );.  pIn1->fla
6320: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
6330: 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 70 63 3b 0a  pIn1->u.i = pc;.
6340: 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
6350: 28 70 4f 70 2d 3e 70 31 2c 20 70 49 6e 31 29 3b  (pOp->p1, pIn1);
6360: 0a 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20  .  pc = pOp->p2 
6370: 2d 20 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  - 1;.  break;.}.
6380: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 52 65 74  ./* Opcode:  Ret
6390: 75 72 6e 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a  urn P1 * * * *.*
63a0: 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65  *.** Jump to the
63b0: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
63c0: 6e 20 61 66 74 65 72 20 74 68 65 20 61 64 64 72  n after the addr
63d0: 65 73 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  ess in register 
63e0: 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  P1..*/.case OP_R
63f0: 65 74 75 72 6e 3a 20 7b 20 20 20 20 20 20 20 20  eturn: {        
6400: 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70     /* in1 */.  p
6410: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
6420: 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
6430: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
6440: 4d 5f 49 6e 74 20 29 3b 0a 20 20 70 63 20 3d 20  M_Int );.  pc = 
6450: 28 69 6e 74 29 70 49 6e 31 2d 3e 75 2e 69 3b 0a  (int)pIn1->u.i;.
6460: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
6470: 70 63 6f 64 65 3a 20 20 59 69 65 6c 64 20 50 31  pcode:  Yield P1
6480: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53   * * * *.**.** S
6490: 77 61 70 20 74 68 65 20 70 72 6f 67 72 61 6d 20  wap the program 
64a0: 63 6f 75 6e 74 65 72 20 77 69 74 68 20 74 68 65  counter with the
64b0: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
64c0: 65 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f  er P1..*/.case O
64d0: 50 5f 59 69 65 6c 64 3a 20 7b 20 20 20 20 20 20  P_Yield: {      
64e0: 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a        /* in1 */.
64f0: 20 20 69 6e 74 20 70 63 44 65 73 74 3b 0a 20 20    int pcDest;.  
6500: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
6510: 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
6520: 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
6530: 4d 45 4d 5f 44 79 6e 29 3d 3d 30 20 29 3b 0a 20  MEM_Dyn)==0 );. 
6540: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d   pIn1->flags = M
6550: 45 4d 5f 49 6e 74 3b 0a 20 20 70 63 44 65 73 74  EM_Int;.  pcDest
6560: 20 3d 20 28 69 6e 74 29 70 49 6e 31 2d 3e 75 2e   = (int)pIn1->u.
6570: 69 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20 3d  i;.  pIn1->u.i =
6580: 20 70 63 3b 0a 20 20 52 45 47 49 53 54 45 52 5f   pc;.  REGISTER_
6590: 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70  TRACE(pOp->p1, p
65a0: 49 6e 31 29 3b 0a 20 20 70 63 20 3d 20 70 63 44  In1);.  pc = pcD
65b0: 65 73 74 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  est;.  break;.}.
65c0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 48 61 6c  ./* Opcode:  Hal
65d0: 74 49 66 4e 75 6c 6c 20 20 50 31 20 50 32 20 50  tIfNull  P1 P2 P
65e0: 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 65  3 P4 *.**.** Che
65f0: 63 6b 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ck the value in 
6600: 72 65 67 69 73 74 65 72 20 50 33 2e 20 20 49 66  register P3.  If
6610: 20 69 73 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e   is is NULL then
6620: 20 48 61 6c 74 20 75 73 69 6e 67 0a 2a 2a 20 70   Halt using.** p
6630: 61 72 61 6d 65 74 65 72 20 50 31 2c 20 50 32 2c  arameter P1, P2,
6640: 20 61 6e 64 20 50 34 20 61 73 20 69 66 20 74 68   and P4 as if th
6650: 69 73 20 77 65 72 65 20 61 20 48 61 6c 74 20 69  is were a Halt i
6660: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20  nstruction.  If 
6670: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20  the.** value in 
6680: 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20 6e  register P3 is n
6690: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
66a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
66b0: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63 61 73 65 20 4f  no-op..*/.case O
66c0: 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 3a 20 7b 20  P_HaltIfNull: { 
66d0: 20 20 20 20 20 2f 2a 20 69 6e 33 20 2a 2f 0a 20       /* in3 */. 
66e0: 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn3 = &aMem[pO
66f0: 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 28 70  p->p3];.  if( (p
6700: 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
6710: 5f 4e 75 6c 6c 29 3d 3d 30 20 29 20 62 72 65 61  _Null)==0 ) brea
6720: 6b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72  k;.  /* Fall thr
6730: 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 48 61 6c  ough into OP_Hal
6740: 74 20 2a 2f 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  t */.}../* Opcod
6750: 65 3a 20 20 48 61 6c 74 20 50 31 20 50 32 20 2a  e:  Halt P1 P2 *
6760: 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 69 74   P4 *.**.** Exit
6770: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 41   immediately.  A
6780: 6c 6c 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2c  ll open cursors,
6790: 20 65 74 63 20 61 72 65 20 63 6c 6f 73 65 64 0a   etc are closed.
67a0: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
67b0: 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68  ..**.** P1 is th
67c0: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20 72 65  e result code re
67d0: 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
67e0: 33 5f 65 78 65 63 28 29 2c 20 73 71 6c 69 74 65  3_exec(), sqlite
67f0: 33 5f 72 65 73 65 74 28 29 2c 0a 2a 2a 20 6f 72  3_reset(),.** or
6800: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
6810: 65 28 29 2e 20 20 46 6f 72 20 61 20 6e 6f 72 6d  e().  For a norm
6820: 61 6c 20 68 61 6c 74 2c 20 74 68 69 73 20 73 68  al halt, this sh
6830: 6f 75 6c 64 20 62 65 20 53 51 4c 49 54 45 5f 4f  ould be SQLITE_O
6840: 4b 20 28 30 29 2e 0a 2a 2a 20 46 6f 72 20 65 72  K (0)..** For er
6850: 72 6f 72 73 2c 20 69 74 20 63 61 6e 20 62 65 20  rors, it can be 
6860: 73 6f 6d 65 20 6f 74 68 65 72 20 76 61 6c 75 65  some other value
6870: 2e 20 20 49 66 20 50 31 21 3d 30 20 74 68 65 6e  .  If P1!=0 then
6880: 20 50 32 20 77 69 6c 6c 20 64 65 74 65 72 6d 69   P2 will determi
6890: 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  ne.** whether or
68a0: 20 6e 6f 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b   not to rollback
68b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
68c0: 6e 73 61 63 74 69 6f 6e 2e 20 20 44 6f 20 6e 6f  nsaction.  Do no
68d0: 74 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66  t rollback.** if
68e0: 20 50 32 3d 3d 4f 45 5f 46 61 69 6c 2e 20 44 6f   P2==OE_Fail. Do
68f0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 66   the rollback if
6900: 20 50 32 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b   P2==OE_Rollback
6910: 2e 20 20 49 66 20 50 32 3d 3d 4f 45 5f 41 62 6f  .  If P2==OE_Abo
6920: 72 74 2c 0a 2a 2a 20 74 68 65 6e 20 62 61 63 6b  rt,.** then back
6930: 20 6f 75 74 20 61 6c 6c 20 63 68 61 6e 67 65 73   out all changes
6940: 20 74 68 61 74 20 68 61 76 65 20 6f 63 63 75 72   that have occur
6950: 72 65 64 20 64 75 72 69 6e 67 20 74 68 69 73 20  red during this 
6960: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
6970: 0a 2a 2a 20 56 44 42 45 2c 20 62 75 74 20 64 6f  .** VDBE, but do
6980: 20 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68   not rollback th
6990: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a  e transaction. .
69a0: 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 6e  **.** If P4 is n
69b0: 6f 74 20 6e 75 6c 6c 20 74 68 65 6e 20 69 74 20  ot null then it 
69c0: 69 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  is an error mess
69d0: 61 67 65 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  age string..**.*
69e0: 2a 20 54 68 65 72 65 20 69 73 20 61 6e 20 69 6d  * There is an im
69f0: 70 6c 69 65 64 20 22 48 61 6c 74 20 30 20 30 20  plied "Halt 0 0 
6a00: 30 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  0" instruction i
6a10: 6e 73 65 72 74 65 64 20 61 74 20 74 68 65 20 76  nserted at the v
6a20: 65 72 79 20 65 6e 64 20 6f 66 0a 2a 2a 20 65 76  ery end of.** ev
6a30: 65 72 79 20 70 72 6f 67 72 61 6d 2e 20 20 53 6f  ery program.  So
6a40: 20 61 20 6a 75 6d 70 20 70 61 73 74 20 74 68 65   a jump past the
6a50: 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74 69 6f   last instructio
6a60: 6e 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  n of the program
6a70: 0a 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20  .** is the same 
6a80: 61 73 20 65 78 65 63 75 74 69 6e 67 20 48 61 6c  as executing Hal
6a90: 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 48 61  t..*/.case OP_Ha
6aa0: 6c 74 3a 20 7b 0a 20 20 69 66 28 20 70 4f 70 2d  lt: {.  if( pOp-
6ab0: 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >p1==SQLITE_OK &
6ac0: 26 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20  & p->pFrame ){. 
6ad0: 20 20 20 2f 2a 20 48 61 6c 74 20 74 68 65 20 73     /* Halt the s
6ae0: 75 62 2d 70 72 6f 67 72 61 6d 2e 20 52 65 74 75  ub-program. Retu
6af0: 72 6e 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68  rn control to th
6b00: 65 20 70 61 72 65 6e 74 20 66 72 61 6d 65 2e 20  e parent frame. 
6b10: 2a 2f 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  */.    VdbeFrame
6b20: 20 2a 70 46 72 61 6d 65 20 3d 20 70 2d 3e 70 46   *pFrame = p->pF
6b30: 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 46 72  rame;.    p->pFr
6b40: 61 6d 65 20 3d 20 70 46 72 61 6d 65 2d 3e 70 50  ame = pFrame->pP
6b50: 61 72 65 6e 74 3b 0a 20 20 20 20 70 2d 3e 6e 46  arent;.    p->nF
6b60: 72 61 6d 65 2d 2d 3b 0a 20 20 20 20 73 71 6c 69  rame--;.    sqli
6b70: 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
6b80: 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
6b90: 29 3b 0a 20 20 20 20 70 63 20 3d 20 73 71 6c 69  );.    pc = sqli
6ba0: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
6bb0: 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20  ore(pFrame);.   
6bc0: 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45   if( pOp->p2==OE
6bd0: 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
6be0: 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20   /* Instruction 
6bf0: 70 63 20 69 73 20 74 68 65 20 4f 50 5f 50 72 6f  pc is the OP_Pro
6c00: 67 72 61 6d 20 74 68 61 74 20 69 6e 76 6f 6b 65  gram that invoke
6c10: 64 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61  d the sub-progra
6c20: 6d 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72  m .      ** curr
6c30: 65 6e 74 6c 79 20 62 65 69 6e 67 20 68 61 6c 74  ently being halt
6c40: 65 64 2e 20 49 66 20 74 68 65 20 70 32 20 69 6e  ed. If the p2 in
6c50: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 69  struction of thi
6c60: 73 20 4f 50 5f 48 61 6c 74 0a 20 20 20 20 20 20  s OP_Halt.      
6c70: 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ** instruction i
6c80: 73 20 73 65 74 20 74 6f 20 4f 45 5f 49 67 6e 6f  s set to OE_Igno
6c90: 72 65 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62  re, then the sub
6ca0: 2d 70 72 6f 67 72 61 6d 20 69 73 20 74 68 72 6f  -program is thro
6cb0: 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 6e  wing.      ** an
6cc0: 20 49 47 4e 4f 52 45 20 65 78 63 65 70 74 69 6f   IGNORE exceptio
6cd0: 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  n. In this case 
6ce0: 6a 75 6d 70 20 74 6f 20 74 68 65 20 61 64 64 72  jump to the addr
6cf0: 65 73 73 20 73 70 65 63 69 66 69 65 64 0a 20 20  ess specified.  
6d00: 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 70 32      ** as the p2
6d10: 20 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   of the calling 
6d20: 4f 50 5f 50 72 6f 67 72 61 6d 2e 20 20 2a 2f 0a  OP_Program.  */.
6d30: 20 20 20 20 20 20 70 63 20 3d 20 70 2d 3e 61 4f        pc = p->aO
6d40: 70 5b 70 63 5d 2e 70 32 2d 31 3b 0a 20 20 20 20  p[pc].p2-1;.    
6d50: 7d 0a 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61  }.    aOp = p->a
6d60: 4f 70 3b 0a 20 20 20 20 61 4d 65 6d 20 3d 20 70  Op;.    aMem = p
6d70: 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 62 72 65 61  ->aMem;.    brea
6d80: 6b 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20  k;.  }..  p->rc 
6d90: 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 2d 3e  = pOp->p1;.  p->
6da0: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 28 75  errorAction = (u
6db0: 38 29 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 2d 3e  8)pOp->p2;.  p->
6dc0: 70 63 20 3d 20 70 63 3b 0a 20 20 69 66 28 20 70  pc = pc;.  if( p
6dd0: 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20 20  Op->p4.z ){.    
6de0: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
6df0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
6e00: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
6e10: 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
6e20: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%s", pOp->p4.
6e30: 7a 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  z);.    testcase
6e40: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
6e50: 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
6e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
6e70: 28 70 4f 70 2d 3e 70 31 2c 20 22 61 62 6f 72 74  (pOp->p1, "abort
6e80: 20 61 74 20 25 64 20 69 6e 20 5b 25 73 5d 3a 20   at %d in [%s]: 
6e90: 25 73 22 2c 20 70 63 2c 20 70 2d 3e 7a 53 71 6c  %s", pc, p->zSql
6ea0: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
6eb0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
6ec0: 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ){.    testcase(
6ed0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
6ee0: 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
6ef0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
6f00: 70 4f 70 2d 3e 70 31 2c 20 22 63 6f 6e 73 74 72  pOp->p1, "constr
6f10: 61 69 6e 74 20 66 61 69 6c 65 64 20 61 74 20 25  aint failed at %
6f20: 64 20 69 6e 20 5b 25 73 5d 22 2c 20 70 63 2c 20  d in [%s]", pc, 
6f30: 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20  p->zSql);.  }.  
6f40: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
6f50: 48 61 6c 74 28 70 29 3b 0a 20 20 61 73 73 65 72  Halt(p);.  asser
6f60: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  t( rc==SQLITE_BU
6f70: 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  SY || rc==SQLITE
6f80: 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
6f90: 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28  E_ERROR );.  if(
6fa0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
6fb0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
6fc0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
6fd0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
6fe0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
6ff0: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
7000: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
7010: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
7020: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
7030: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
7040: 6e 73 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  ns>0 );.    rc =
7050: 20 70 2d 3e 72 63 20 3f 20 53 51 4c 49 54 45 5f   p->rc ? SQLITE_
7060: 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44  ERROR : SQLITE_D
7070: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20  ONE;.  }.  goto 
7080: 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a  vdbe_return;.}..
7090: 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67  /* Opcode: Integ
70a0: 65 72 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  er P1 P2 * * *.*
70b0: 2a 0a 2a 2a 20 54 68 65 20 33 32 2d 62 69 74 20  *.** The 32-bit 
70c0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 50 31  integer value P1
70d0: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
70e0: 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f   register P2..*/
70f0: 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65 67 65 72  .case OP_Integer
7100: 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  : {         /* o
7110: 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a  ut2-prerelease *
7120: 2f 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  /.  pOut->u.i = 
7130: 70 4f 70 2d 3e 70 31 3b 0a 20 20 62 72 65 61 6b  pOp->p1;.  break
7140: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
7150: 49 6e 74 36 34 20 2a 20 50 32 20 2a 20 50 34 20  Int64 * P2 * P4 
7160: 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20  *.**.** P4 is a 
7170: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 36 34 2d  pointer to a 64-
7180: 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75  bit integer valu
7190: 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 61 74  e..** Write that
71a0: 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67 69   value into regi
71b0: 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  ster P2..*/.case
71c0: 20 4f 50 5f 49 6e 74 36 34 3a 20 7b 20 20 20 20   OP_Int64: {    
71d0: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70         /* out2-p
71e0: 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 61  rerelease */.  a
71f0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 70  ssert( pOp->p4.p
7200: 49 36 34 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74  I64!=0 );.  pOut
7210: 2d 3e 75 2e 69 20 3d 20 2a 70 4f 70 2d 3e 70 34  ->u.i = *pOp->p4
7220: 2e 70 49 36 34 3b 0a 20 20 62 72 65 61 6b 3b 0a  .pI64;.  break;.
7230: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7240: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
7250: 50 4f 49 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a  POINT./* Opcode:
7260: 20 52 65 61 6c 20 2a 20 50 32 20 2a 20 50 34 20   Real * P2 * P4 
7270: 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20  *.**.** P4 is a 
7280: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 36 34 2d  pointer to a 64-
7290: 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  bit floating poi
72a0: 6e 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 57 72 69  nt value..** Wri
72b0: 74 65 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e  te that value in
72c0: 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
72d0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61 6c 3a  */.case OP_Real:
72e0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {            /*
72f0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 46 4c 4f 41   same as TK_FLOA
7300: 54 2c 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61  T, out2-prerelea
7310: 73 65 20 2a 2f 0a 20 20 70 4f 75 74 2d 3e 66 6c  se */.  pOut->fl
7320: 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ags = MEM_Real;.
7330: 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
7340: 65 33 49 73 4e 61 4e 28 2a 70 4f 70 2d 3e 70 34  e3IsNaN(*pOp->p4
7350: 2e 70 52 65 61 6c 29 20 29 3b 0a 20 20 70 4f 75  .pReal) );.  pOu
7360: 74 2d 3e 72 20 3d 20 2a 70 4f 70 2d 3e 70 34 2e  t->r = *pOp->p4.
7370: 70 52 65 61 6c 3b 0a 20 20 62 72 65 61 6b 3b 0a  pReal;.  break;.
7380: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63  }.#endif../* Opc
7390: 6f 64 65 3a 20 53 74 72 69 6e 67 38 20 2a 20 50  ode: String8 * P
73a0: 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50  2 * P4 *.**.** P
73b0: 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75  4 points to a nu
73c0: 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l terminated UTF
73d0: 2d 38 20 73 74 72 69 6e 67 2e 20 54 68 69 73 20  -8 string. This 
73e0: 6f 70 63 6f 64 65 20 69 73 20 74 72 61 6e 73 66  opcode is transf
73f0: 6f 72 6d 65 64 20 0a 2a 2a 20 69 6e 74 6f 20 61  ormed .** into a
7400: 6e 20 4f 50 5f 53 74 72 69 6e 67 20 62 65 66 6f  n OP_String befo
7410: 72 65 20 69 74 20 69 73 20 65 78 65 63 75 74 65  re it is execute
7420: 64 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  d for the first 
7430: 74 69 6d 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  time..*/.case OP
7440: 5f 53 74 72 69 6e 67 38 3a 20 7b 20 20 20 20 20  _String8: {     
7450: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
7460: 4b 5f 53 54 52 49 4e 47 2c 20 6f 75 74 32 2d 70  K_STRING, out2-p
7470: 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 61  rerelease */.  a
7480: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 7a  ssert( pOp->p4.z
7490: 21 3d 30 20 29 3b 0a 20 20 70 4f 70 2d 3e 6f 70  !=0 );.  pOp->op
74a0: 63 6f 64 65 20 3d 20 4f 50 5f 53 74 72 69 6e 67  code = OP_String
74b0: 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 73 71  ;.  pOp->p1 = sq
74c0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4f  lite3Strlen30(pO
74d0: 70 2d 3e 70 34 2e 7a 29 3b 0a 0a 23 69 66 6e 64  p->p4.z);..#ifnd
74e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
74f0: 54 46 31 36 0a 20 20 69 66 28 20 65 6e 63 6f 64  TF16.  if( encod
7500: 69 6e 67 21 3d 53 51 4c 49 54 45 5f 55 54 46 38  ing!=SQLITE_UTF8
7510: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
7520: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
7530: 72 28 70 4f 75 74 2c 20 70 4f 70 2d 3e 70 34 2e  r(pOut, pOp->p4.
7540: 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  z, -1, SQLITE_UT
7550: 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
7560: 43 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  C);.    if( rc==
7570: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 29 20  SQLITE_TOOBIG ) 
7580: 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20  goto too_big;.  
7590: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
75a0: 3d 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e  =sqlite3VdbeChan
75b0: 67 65 45 6e 63 6f 64 69 6e 67 28 70 4f 75 74 2c  geEncoding(pOut,
75c0: 20 65 6e 63 6f 64 69 6e 67 29 20 29 20 67 6f 74   encoding) ) got
75d0: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 61 73  o no_mem;.    as
75e0: 73 65 72 74 28 20 70 4f 75 74 2d 3e 7a 4d 61 6c  sert( pOut->zMal
75f0: 6c 6f 63 3d 3d 70 4f 75 74 2d 3e 7a 20 29 3b 0a  loc==pOut->z );.
7600: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 75 74      assert( pOut
7610: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79  ->flags & MEM_Dy
7620: 6e 20 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a  n );.    pOut->z
7630: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
7640: 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pOut->flags |= M
7650: 45 4d 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 70  EM_Static;.    p
7660: 4f 75 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 4d  Out->flags &= ~M
7670: 45 4d 5f 44 79 6e 3b 0a 20 20 20 20 69 66 28 20  EM_Dyn;.    if( 
7680: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
7690: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
76a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
76b0: 62 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  b, pOp->p4.z);. 
76c0: 20 20 20 7d 0a 20 20 20 20 70 4f 70 2d 3e 70 34     }.    pOp->p4
76d0: 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49  type = P4_DYNAMI
76e0: 43 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  C;.    pOp->p4.z
76f0: 20 3d 20 70 4f 75 74 2d 3e 7a 3b 0a 20 20 20 20   = pOut->z;.    
7700: 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 75 74 2d 3e  pOp->p1 = pOut->
7710: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  n;.  }.#endif.  
7720: 69 66 28 20 70 4f 70 2d 3e 70 31 3e 64 62 2d 3e  if( pOp->p1>db->
7730: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7740: 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20  MIT_LENGTH] ){. 
7750: 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b     goto too_big;
7760: 0a 20 20 7d 0a 20 20 2f 2a 20 46 61 6c 6c 20 74  .  }.  /* Fall t
7770: 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
7780: 78 74 20 63 61 73 65 2c 20 4f 50 5f 53 74 72 69  xt case, OP_Stri
7790: 6e 67 20 2a 2f 0a 7d 0a 20 20 0a 2f 2a 20 4f 70  ng */.}.  ./* Op
77a0: 63 6f 64 65 3a 20 53 74 72 69 6e 67 20 50 31 20  code: String P1 
77b0: 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  P2 * P4 *.**.** 
77c0: 54 68 65 20 73 74 72 69 6e 67 20 76 61 6c 75 65  The string value
77d0: 20 50 34 20 6f 66 20 6c 65 6e 67 74 68 20 50 31   P4 of length P1
77e0: 20 28 62 79 74 65 73 29 20 69 73 20 73 74 6f 72   (bytes) is stor
77f0: 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
7800: 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 74  2..*/.case OP_St
7810: 72 69 6e 67 3a 20 7b 20 20 20 20 20 20 20 20 20  ring: {         
7820: 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65   /* out2-prerele
7830: 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ase */.  assert(
7840: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b   pOp->p4.z!=0 );
7850: 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d  .  pOut->flags =
7860: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74 61   MEM_Str|MEM_Sta
7870: 74 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  tic|MEM_Term;.  
7880: 70 4f 75 74 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 70  pOut->z = pOp->p
7890: 34 2e 7a 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d  4.z;.  pOut->n =
78a0: 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 4f 75 74   pOp->p1;.  pOut
78b0: 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67  ->enc = encoding
78c0: 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
78d0: 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20  LOBSIZE(pOut);. 
78e0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
78f0: 63 6f 64 65 3a 20 4e 75 6c 6c 20 2a 20 50 32 20  code: Null * P2 
7900: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74  * * *.**.** Writ
7910: 65 20 61 20 4e 55 4c 4c 20 69 6e 74 6f 20 72 65  e a NULL into re
7920: 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61  gister P2..*/.ca
7930: 73 65 20 4f 50 5f 4e 75 6c 6c 3a 20 7b 20 20 20  se OP_Null: {   
7940: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
7950: 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
7960: 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
7970: 4d 5f 4e 75 6c 6c 3b 0a 20 20 62 72 65 61 6b 3b  M_Null;.  break;
7980: 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  .}.../* Opcode: 
7990: 42 6c 6f 62 20 50 31 20 50 32 20 2a 20 50 34 0a  Blob P1 P2 * P4.
79a0: 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74 73 20  **.** P4 points 
79b0: 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  to a blob of dat
79c0: 61 20 50 31 20 62 79 74 65 73 20 6c 6f 6e 67 2e  a P1 bytes long.
79d0: 20 20 53 74 6f 72 65 20 74 68 69 73 0a 2a 2a 20    Store this.** 
79e0: 62 6c 6f 62 20 69 6e 20 72 65 67 69 73 74 65 72  blob in register
79f0: 20 50 32 2e 20 54 68 69 73 20 69 6e 73 74 72 75   P2. This instru
7a00: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 64  ction is not cod
7a10: 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62  ed directly.** b
7a20: 79 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20  y the compiler. 
7a30: 49 6e 73 74 65 61 64 2c 20 74 68 65 20 63 6f 6d  Instead, the com
7a40: 70 69 6c 65 72 20 6c 61 79 65 72 20 73 70 65 63  piler layer spec
7a50: 69 66 69 65 73 0a 2a 2a 20 61 6e 20 4f 50 5f 48  ifies.** an OP_H
7a60: 65 78 42 6c 6f 62 20 6f 70 63 6f 64 65 2c 20 77  exBlob opcode, w
7a70: 69 74 68 20 74 68 65 20 68 65 78 20 73 74 72 69  ith the hex stri
7a80: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
7a90: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  n of.** the blob
7aa0: 20 61 73 20 50 34 2e 20 54 68 69 73 20 6f 70 63   as P4. This opc
7ab0: 6f 64 65 20 69 73 20 74 72 61 6e 73 66 6f 72 6d  ode is transform
7ac0: 65 64 20 74 6f 20 61 6e 20 4f 50 5f 42 6c 6f 62  ed to an OP_Blob
7ad0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 69  .** the first ti
7ae0: 6d 65 20 69 74 20 69 73 20 65 78 65 63 75 74 65  me it is execute
7af0: 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 6c  d..*/.case OP_Bl
7b00: 6f 62 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ob: {           
7b10: 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65       /* out2-pre
7b20: 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 61 73 73  release */.  ass
7b30: 65 72 74 28 20 70 4f 70 2d 3e 70 31 20 3c 3d 20  ert( pOp->p1 <= 
7b40: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
7b50: 48 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  H );.  sqlite3Vd
7b60: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4f 75 74  beMemSetStr(pOut
7b70: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 70 4f 70  , pOp->p4.z, pOp
7b80: 2d 3e 70 31 2c 20 30 2c 20 30 29 3b 0a 20 20 70  ->p1, 0, 0);.  p
7b90: 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64  Out->enc = encod
7ba0: 69 6e 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  ing;.  UPDATE_MA
7bb0: 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29  X_BLOBSIZE(pOut)
7bc0: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
7bd0: 20 4f 70 63 6f 64 65 3a 20 56 61 72 69 61 62 6c   Opcode: Variabl
7be0: 65 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  e P1 P2 P3 P4 *.
7bf0: 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 74  **.** Transfer t
7c00: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 62 6f 75  he values of bou
7c10: 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20 50 31  nd parameters P1
7c20: 2e 2e 50 31 2b 50 33 2d 31 20 69 6e 74 6f 20 72  ..P1+P3-1 into r
7c30: 65 67 69 73 74 65 72 73 0a 2a 2a 20 50 32 2e 2e  egisters.** P2..
7c40: 50 32 2b 50 33 2d 31 2e 0a 2a 2a 0a 2a 2a 20 49  P2+P3-1..**.** I
7c50: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
7c60: 69 73 20 6e 61 6d 65 64 2c 20 74 68 65 6e 20 69  is named, then i
7c70: 74 73 20 6e 61 6d 65 20 61 70 70 65 61 72 73 20  ts name appears 
7c80: 69 6e 20 50 34 20 61 6e 64 20 50 33 3d 3d 31 2e  in P4 and P3==1.
7c90: 0a 2a 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65  .** The P4 value
7ca0: 20 69 73 20 75 73 65 64 20 62 79 20 73 71 6c 69   is used by sqli
7cb0: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
7cc0: 65 72 5f 6e 61 6d 65 28 29 2e 0a 2a 2f 0a 63 61  er_name()..*/.ca
7cd0: 73 65 20 4f 50 5f 56 61 72 69 61 62 6c 65 3a 20  se OP_Variable: 
7ce0: 7b 0a 20 20 69 6e 74 20 70 31 3b 20 20 20 20 20  {.  int p1;     
7cf0: 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65       /* Variable
7d00: 20 74 6f 20 63 6f 70 79 20 66 72 6f 6d 20 2a 2f   to copy from */
7d10: 0a 20 20 69 6e 74 20 70 32 3b 20 20 20 20 20 20  .  int p2;      
7d20: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
7d30: 74 6f 20 63 6f 70 79 20 74 6f 20 2a 2f 0a 20 20  to copy to */.  
7d40: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
7d50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
7d60: 6c 75 65 73 20 6c 65 66 74 20 74 6f 20 63 6f 70  lues left to cop
7d70: 79 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 56 61 72  y */.  Mem *pVar
7d80: 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65  ;       /* Value
7d90: 20 62 65 69 6e 67 20 74 72 61 6e 73 66 65 72 72   being transferr
7da0: 65 64 20 2a 2f 0a 0a 20 20 70 31 20 3d 20 70 4f  ed */..  p1 = pO
7db0: 70 2d 3e 70 31 20 2d 20 31 3b 0a 20 20 70 32 20  p->p1 - 1;.  p2 
7dc0: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 6e 20 3d  = pOp->p2;.  n =
7dd0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65   pOp->p3;.  asse
7de0: 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 2b  rt( p1>=0 && p1+
7df0: 6e 3c 3d 70 2d 3e 6e 56 61 72 20 29 3b 0a 20 20  n<=p->nVar );.  
7e00: 61 73 73 65 72 74 28 20 70 32 3e 3d 31 20 26 26  assert( p2>=1 &&
7e10: 20 70 32 2b 6e 2d 31 3c 3d 70 2d 3e 6e 4d 65 6d   p2+n-1<=p->nMem
7e20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
7e30: 70 2d 3e 70 34 2e 7a 3d 3d 30 20 7c 7c 20 70 4f  p->p4.z==0 || pO
7e40: 70 2d 3e 70 33 3d 3d 31 20 7c 7c 20 70 4f 70 2d  p->p3==1 || pOp-
7e50: 3e 70 33 3d 3d 30 20 29 3b 0a 0a 20 20 77 68 69  >p3==0 );..  whi
7e60: 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20  le( n-- > 0 ){. 
7e70: 20 20 20 70 56 61 72 20 3d 20 26 70 2d 3e 61 56     pVar = &p->aV
7e80: 61 72 5b 70 31 2b 2b 5d 3b 0a 20 20 20 20 69 66  ar[p1++];.    if
7e90: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
7ea0: 54 6f 6f 42 69 67 28 70 56 61 72 29 20 29 7b 0a  TooBig(pVar) ){.
7eb0: 20 20 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62        goto too_b
7ec0: 69 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f  ig;.    }.    pO
7ed0: 75 74 20 3d 20 26 61 4d 65 6d 5b 70 32 2b 2b 5d  ut = &aMem[p2++]
7ee0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7ef0: 65 4d 65 6d 52 65 6c 65 61 73 65 45 78 74 65 72  eMemReleaseExter
7f00: 6e 61 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20 70  nal(pOut);.    p
7f10: 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
7f20: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  _Null;.    sqlit
7f30: 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
7f40: 43 6f 70 79 28 70 4f 75 74 2c 20 70 56 61 72 2c  Copy(pOut, pVar,
7f50: 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20   MEM_Static);.  
7f60: 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
7f70: 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 7d  BSIZE(pOut);.  }
7f80: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
7f90: 4f 70 63 6f 64 65 3a 20 4d 6f 76 65 20 50 31 20  Opcode: Move P1 
7fa0: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
7fb0: 4d 6f 76 65 20 74 68 65 20 76 61 6c 75 65 73 20  Move the values 
7fc0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 2e  in register P1..
7fd0: 50 31 2b 50 33 2d 31 20 6f 76 65 72 20 69 6e 74  P1+P3-1 over int
7fe0: 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 50  o.** registers P
7ff0: 32 2e 2e 50 32 2b 50 33 2d 31 2e 20 20 52 65 67  2..P2+P3-1.  Reg
8000: 69 73 74 65 72 73 20 50 31 2e 2e 50 31 2b 50 31  isters P1..P1+P1
8010: 2d 31 20 61 72 65 0a 2a 2a 20 6c 65 66 74 20 68  -1 are.** left h
8020: 6f 6c 64 69 6e 67 20 61 20 4e 55 4c 4c 2e 20 20  olding a NULL.  
8030: 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 66  It is an error f
8040: 6f 72 20 72 65 67 69 73 74 65 72 20 72 61 6e 67  or register rang
8050: 65 73 0a 2a 2a 20 50 31 2e 2e 50 31 2b 50 33 2d  es.** P1..P1+P3-
8060: 31 20 61 6e 64 20 50 32 2e 2e 50 32 2b 50 33 2d  1 and P2..P2+P3-
8070: 31 20 74 6f 20 6f 76 65 72 6c 61 70 2e 0a 2a 2f  1 to overlap..*/
8080: 0a 63 61 73 65 20 4f 50 5f 4d 6f 76 65 3a 20 7b  .case OP_Move: {
8090: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 6c 6c 6f 63  .  char *zMalloc
80a0: 3b 20 20 20 2f 2a 20 48 6f 6c 64 69 6e 67 20 76  ;   /* Holding v
80b0: 61 72 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f  ariable for allo
80c0: 63 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  cated memory */.
80d0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
80e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
80f0: 72 65 67 69 73 74 65 72 73 20 6c 65 66 74 20 74  registers left t
8100: 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
8110: 70 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p1;          /* 
8120: 52 65 67 69 73 74 65 72 20 74 6f 20 63 6f 70 79  Register to copy
8130: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 70   from */.  int p
8140: 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  2;          /* R
8150: 65 67 69 73 74 65 72 20 74 6f 20 63 6f 70 79 20  egister to copy 
8160: 74 6f 20 2a 2f 0a 0a 20 20 6e 20 3d 20 70 4f 70  to */..  n = pOp
8170: 2d 3e 70 33 3b 0a 20 20 70 31 20 3d 20 70 4f 70  ->p3;.  p1 = pOp
8180: 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70 4f 70  ->p1;.  p2 = pOp
8190: 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p2;.  assert( 
81a0: 6e 3e 30 20 26 26 20 70 31 3e 30 20 26 26 20 70  n>0 && p1>0 && p
81b0: 32 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  2>0 );.  assert(
81c0: 20 70 31 2b 6e 3c 3d 70 32 20 7c 7c 20 70 32 2b   p1+n<=p2 || p2+
81d0: 6e 3c 3d 70 31 20 29 3b 0a 0a 20 20 70 49 6e 31  n<=p1 );..  pIn1
81e0: 20 3d 20 26 61 4d 65 6d 5b 70 31 5d 3b 0a 20 20   = &aMem[p1];.  
81f0: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 32 5d  pOut = &aMem[p2]
8200: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 29  ;.  while( n-- )
8210: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  {.    assert( pO
8220: 75 74 3c 3d 26 61 4d 65 6d 5b 70 2d 3e 6e 4d 65  ut<=&aMem[p->nMe
8230: 6d 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  m] );.    assert
8240: 28 20 70 49 6e 31 3c 3d 26 61 4d 65 6d 5b 70 2d  ( pIn1<=&aMem[p-
8250: 3e 6e 4d 65 6d 5d 20 29 3b 0a 20 20 20 20 7a 4d  >nMem] );.    zM
8260: 61 6c 6c 6f 63 20 3d 20 70 4f 75 74 2d 3e 7a 4d  alloc = pOut->zM
8270: 61 6c 6c 6f 63 3b 0a 20 20 20 20 70 4f 75 74 2d  alloc;.    pOut-
8280: 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  >zMalloc = 0;.  
8290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
82a0: 4d 6f 76 65 28 70 4f 75 74 2c 20 70 49 6e 31 29  Move(pOut, pIn1)
82b0: 3b 0a 20 20 20 20 70 49 6e 31 2d 3e 7a 4d 61 6c  ;.    pIn1->zMal
82c0: 6c 6f 63 20 3d 20 7a 4d 61 6c 6c 6f 63 3b 0a 20  loc = zMalloc;. 
82d0: 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
82e0: 45 28 70 32 2b 2b 2c 20 70 4f 75 74 29 3b 0a 20  E(p2++, pOut);. 
82f0: 20 20 20 70 49 6e 31 2b 2b 3b 0a 20 20 20 20 70     pIn1++;.    p
8300: 4f 75 74 2b 2b 3b 0a 20 20 7d 0a 20 20 62 72 65  Out++;.  }.  bre
8310: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
8320: 3a 20 43 6f 70 79 20 50 31 20 50 32 20 2a 20 2a  : Copy P1 P2 * *
8330: 20 2a 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20   *.**.** Make a 
8340: 63 6f 70 79 20 6f 66 20 72 65 67 69 73 74 65 72  copy of register
8350: 20 50 31 20 69 6e 74 6f 20 72 65 67 69 73 74 65   P1 into registe
8360: 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  r P2..**.** This
8370: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6d 61 6b   instruction mak
8380: 65 73 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f  es a deep copy o
8390: 66 20 74 68 65 20 76 61 6c 75 65 2e 20 20 41 20  f the value.  A 
83a0: 64 75 70 6c 69 63 61 74 65 0a 2a 2a 20 69 73 20  duplicate.** is 
83b0: 6d 61 64 65 20 6f 66 20 61 6e 79 20 73 74 72 69  made of any stri
83c0: 6e 67 20 6f 72 20 62 6c 6f 62 20 63 6f 6e 73 74  ng or blob const
83d0: 61 6e 74 2e 20 20 53 65 65 20 61 6c 73 6f 20 4f  ant.  See also O
83e0: 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 63 61 73 65  P_SCopy..*/.case
83f0: 20 4f 50 5f 43 6f 70 79 3a 20 7b 20 20 20 20 20   OP_Copy: {     
8400: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 2c 20          /* in1, 
8410: 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d  out2 */.  pIn1 =
8420: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
8430: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
8440: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65  pOp->p2];.  asse
8450: 72 74 28 20 70 4f 75 74 21 3d 70 49 6e 31 20 29  rt( pOut!=pIn1 )
8460: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
8470: 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f  emShallowCopy(pO
8480: 75 74 2c 20 70 49 6e 31 2c 20 4d 45 4d 5f 45 70  ut, pIn1, MEM_Ep
8490: 68 65 6d 29 3b 0a 20 20 44 65 65 70 68 65 6d 65  hem);.  Deepheme
84a0: 72 61 6c 69 7a 65 28 70 4f 75 74 29 3b 0a 20 20  ralize(pOut);.  
84b0: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
84c0: 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20  Op->p2, pOut);. 
84d0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
84e0: 63 6f 64 65 3a 20 53 43 6f 70 79 20 50 31 20 50  code: SCopy P1 P
84f0: 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 61  2 * * *.**.** Ma
8500: 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70  ke a shallow cop
8510: 79 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 31  y of register P1
8520: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
8530: 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  2..**.** This in
8540: 73 74 72 75 63 74 69 6f 6e 20 6d 61 6b 65 73 20  struction makes 
8550: 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f  a shallow copy o
8560: 66 20 74 68 65 20 76 61 6c 75 65 2e 20 20 49 66  f the value.  If
8570: 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 73   the value.** is
8580: 20 61 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f   a string or blo
8590: 62 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 70 79  b, then the copy
85a0: 20 69 73 20 6f 6e 6c 79 20 61 20 70 6f 69 6e 74   is only a point
85b0: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 6f 72 69  er to the.** ori
85c0: 67 69 6e 61 6c 20 61 6e 64 20 68 65 6e 63 65 20  ginal and hence 
85d0: 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  if the original 
85e0: 63 68 61 6e 67 65 73 20 73 6f 20 77 69 6c 6c 20  changes so will 
85f0: 74 68 65 20 63 6f 70 79 2e 0a 2a 2a 20 57 6f 72  the copy..** Wor
8600: 73 65 2c 20 69 66 20 74 68 65 20 6f 72 69 67 69  se, if the origi
8610: 6e 61 6c 20 69 73 20 64 65 61 6c 6c 6f 63 61 74  nal is deallocat
8620: 65 64 2c 20 74 68 65 20 63 6f 70 79 20 62 65 63  ed, the copy bec
8630: 6f 6d 65 73 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a  omes invalid..**
8640: 20 54 68 75 73 20 74 68 65 20 70 72 6f 67 72 61   Thus the progra
8650: 6d 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  m must guarantee
8660: 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
8670: 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 63 68 61 6e  al will not chan
8680: 67 65 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68 65  ge.** during the
8690: 20 6c 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65   lifetime of the
86a0: 20 63 6f 70 79 2e 20 20 55 73 65 20 4f 50 5f 43   copy.  Use OP_C
86b0: 6f 70 79 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f  opy to make a co
86c0: 6d 70 6c 65 74 65 0a 2a 2a 20 63 6f 70 79 2e 0a  mplete.** copy..
86d0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 43 6f 70 79  */.case OP_SCopy
86e0: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
86f0: 2a 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20  * in1, out2 */. 
8700: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
8710: 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d  p->p1];.  pOut =
8720: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
8730: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 75 74 21  .  assert( pOut!
8740: 3d 70 49 6e 31 20 29 3b 0a 20 20 73 71 6c 69 74  =pIn1 );.  sqlit
8750: 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
8760: 43 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 31 2c  Copy(pOut, pIn1,
8770: 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 52   MEM_Ephem);.  R
8780: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
8790: 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20  p->p2, pOut);.  
87a0: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
87b0: 6f 64 65 3a 20 52 65 73 75 6c 74 52 6f 77 20 50  ode: ResultRow P
87c0: 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
87d0: 20 54 68 65 20 72 65 67 69 73 74 65 72 73 20 50   The registers P
87e0: 31 20 74 68 72 6f 75 67 68 20 50 31 2b 50 32 2d  1 through P1+P2-
87f0: 31 20 63 6f 6e 74 61 69 6e 20 61 20 73 69 6e 67  1 contain a sing
8800: 6c 65 20 72 6f 77 20 6f 66 0a 2a 2a 20 72 65 73  le row of.** res
8810: 75 6c 74 73 2e 20 54 68 69 73 20 6f 70 63 6f 64  ults. This opcod
8820: 65 20 63 61 75 73 65 73 20 74 68 65 20 73 71 6c  e causes the sql
8830: 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c  ite3_step() call
8840: 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 0a 2a 2a   to terminate.**
8850: 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f   with an SQLITE_
8860: 52 4f 57 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ROW return code 
8870: 61 6e 64 20 69 74 20 73 65 74 73 20 75 70 20 74  and it sets up t
8880: 68 65 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 0a  he sqlite3_stmt.
8890: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ** structure to 
88a0: 70 72 6f 76 69 64 65 20 61 63 63 65 73 73 20 74  provide access t
88b0: 6f 20 74 68 65 20 74 6f 70 20 50 31 20 76 61 6c  o the top P1 val
88c0: 75 65 73 20 61 73 20 74 68 65 20 72 65 73 75 6c  ues as the resul
88d0: 74 0a 2a 2a 20 72 6f 77 2e 0a 2a 2f 0a 63 61 73  t.** row..*/.cas
88e0: 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 3a 20  e OP_ResultRow: 
88f0: 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20  {.  Mem *pMem;. 
8900: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
8910: 28 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 3d  ( p->nResColumn=
8920: 3d 70 4f 70 2d 3e 70 32 20 29 3b 0a 20 20 61 73  =pOp->p2 );.  as
8930: 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20  sert( pOp->p1>0 
8940: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
8950: 2d 3e 70 31 2b 70 4f 70 2d 3e 70 32 3c 3d 70 2d  ->p1+pOp->p2<=p-
8960: 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 0a 20 20 2f 2a  >nMem+1 );..  /*
8970: 20 49 66 20 74 68 69 73 20 73 74 61 74 65 6d 65   If this stateme
8980: 6e 74 20 68 61 73 20 76 69 6f 6c 61 74 65 64 20  nt has violated 
8990: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
89a0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
89b0: 73 2c 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 72  s, do.  ** not r
89c0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
89d0: 20 6f 66 20 72 6f 77 73 20 6d 6f 64 69 66 69 65   of rows modifie
89e0: 64 2e 20 41 6e 64 20 64 6f 20 6e 6f 74 20 52 45  d. And do not RE
89f0: 4c 45 41 53 45 20 74 68 65 20 73 74 61 74 65 6d  LEASE the statem
8a00: 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ent.  ** transac
8a10: 74 69 6f 6e 2e 20 49 74 20 6e 65 65 64 73 20 74  tion. It needs t
8a20: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
8a30: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
8a40: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
8a50: 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
8a60: 70 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 61 73  p, 0)) ){.    as
8a70: 73 65 72 74 28 20 64 62 2d 3e 66 6c 61 67 73 26  sert( db->flags&
8a80: 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
8a90: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8aa0: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
8ab0: 61 6c 20 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  al );.    break;
8ac0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
8ad0: 65 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  e SQLITE_CountRo
8ae0: 77 73 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  ws flag is set i
8af0: 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73 20  n sqlite3.flags 
8b00: 6d 61 73 6b 2c 20 74 68 65 6e 20 0a 20 20 2a 2a  mask, then .  **
8b10: 20 44 4d 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   DML statements 
8b20: 69 6e 76 6f 6b 65 20 74 68 69 73 20 6f 70 63 6f  invoke this opco
8b30: 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65  de to return the
8b40: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
8b50: 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74  .  ** modified t
8b60: 6f 20 74 68 65 20 75 73 65 72 2e 20 54 68 69 73  o the user. This
8b70: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
8b80: 20 74 68 61 74 20 61 20 56 4d 20 74 68 61 74 0a   that a VM that.
8b90: 20 20 2a 2a 20 6f 70 65 6e 73 20 61 20 73 74 61    ** opens a sta
8ba0: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
8bb0: 6f 6e 20 6d 61 79 20 69 6e 76 6f 6b 65 20 74 68  on may invoke th
8bc0: 69 73 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2a 0a  is opcode..  **.
8bd0: 20 20 2a 2a 20 49 6e 20 63 61 73 65 20 74 68 69    ** In case thi
8be0: 73 20 69 73 20 73 75 63 68 20 61 20 73 74 61 74  s is such a stat
8bf0: 65 6d 65 6e 74 2c 20 63 6c 6f 73 65 20 61 6e 79  ement, close any
8c00: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
8c10: 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e  action.  ** open
8c20: 65 64 20 62 79 20 74 68 69 73 20 56 4d 20 62 65  ed by this VM be
8c30: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 63  fore returning c
8c40: 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 75 73  ontrol to the us
8c50: 65 72 2e 20 54 68 69 73 20 69 73 20 74 6f 0a 20  er. This is to. 
8c60: 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20   ** ensure that 
8c70: 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
8c80: 63 74 69 6f 6e 73 20 61 72 65 20 61 6c 77 61 79  ctions are alway
8c90: 73 20 6e 65 73 74 65 64 2c 20 6e 6f 74 20 6f 76  s nested, not ov
8ca0: 65 72 6c 61 70 70 69 6e 67 2e 0a 20 20 2a 2a 20  erlapping..  ** 
8cb0: 49 66 20 74 68 65 20 6f 70 65 6e 20 73 74 61 74  If the open stat
8cc0: 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
8cd0: 6e 20 69 73 20 6e 6f 74 20 63 6c 6f 73 65 64 20  n is not closed 
8ce0: 68 65 72 65 2c 20 74 68 65 6e 20 74 68 65 20 75  here, then the u
8cf0: 73 65 72 0a 20 20 2a 2a 20 6d 61 79 20 73 74 65  ser.  ** may ste
8d00: 70 20 61 6e 6f 74 68 65 72 20 56 4d 20 74 68 61  p another VM tha
8d10: 74 20 6f 70 65 6e 73 20 69 74 73 20 6f 77 6e 20  t opens its own 
8d20: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
8d30: 63 74 69 6f 6e 2e 20 54 68 69 73 0a 20 20 2a 2a  ction. This.  **
8d40: 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 6f 76 65   may lead to ove
8d50: 72 6c 61 70 70 69 6e 67 20 73 74 61 74 65 6d 65  rlapping stateme
8d60: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  nt transactions.
8d70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
8d80: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
8d90: 74 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 61 20  tion is never a 
8da0: 74 6f 70 2d 6c 65 76 65 6c 20 74 72 61 6e 73 61  top-level transa
8db0: 63 74 69 6f 6e 2e 20 20 48 65 6e 63 65 0a 20 20  ction.  Hence.  
8dc0: 2a 2a 20 74 68 65 20 52 45 4c 45 41 53 45 20 63  ** the RELEASE c
8dd0: 61 6c 6c 20 62 65 6c 6f 77 20 63 61 6e 20 6e 65  all below can ne
8de0: 76 65 72 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20  ver fail..  */. 
8df0: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61   assert( p->iSta
8e00: 74 65 6d 65 6e 74 3d 3d 30 20 7c 7c 20 64 62 2d  tement==0 || db-
8e10: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6f  >flags&SQLITE_Co
8e20: 75 6e 74 52 6f 77 73 20 29 3b 0a 20 20 72 63 20  untRows );.  rc 
8e30: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  = sqlite3VdbeClo
8e40: 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 53  seStatement(p, S
8e50: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
8e60: 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 72  );.  if( NEVER(r
8e70: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b  c!=SQLITE_OK) ){
8e80: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
8e90: 0a 20 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74 65  .  /* Invalidate
8ea0: 20 61 6c 6c 20 65 70 68 65 6d 65 72 61 6c 20 63   all ephemeral c
8eb0: 75 72 73 6f 72 20 72 6f 77 20 63 61 63 68 65 73  ursor row caches
8ec0: 20 2a 2f 0a 20 20 70 2d 3e 63 61 63 68 65 43 74   */.  p->cacheCt
8ed0: 72 20 3d 20 28 70 2d 3e 63 61 63 68 65 43 74 72  r = (p->cacheCtr
8ee0: 20 2b 20 32 29 7c 31 3b 0a 0a 20 20 2f 2a 20 4d   + 2)|1;..  /* M
8ef0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 72 65 73  ake sure the res
8f00: 75 6c 74 73 20 6f 66 20 74 68 65 20 63 75 72 72  ults of the curr
8f10: 65 6e 74 20 72 6f 77 20 61 72 65 20 5c 30 30 30  ent row are \000
8f20: 20 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 2a 2a   terminated.  **
8f30: 20 61 6e 64 20 68 61 76 65 20 61 6e 20 61 73 73   and have an ass
8f40: 69 67 6e 65 64 20 74 79 70 65 2e 20 20 54 68 65  igned type.  The
8f50: 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 65 2d   results are de-
8f60: 65 70 68 65 6d 65 72 61 6c 69 7a 65 64 20 61 73  ephemeralized as
8f70: 0a 20 20 2a 2a 20 61 73 20 73 69 64 65 20 65 66  .  ** as side ef
8f80: 66 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 70 4d 65  fect..  */.  pMe
8f90: 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  m = p->pResultSe
8fa0: 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
8fb0: 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  1];.  for(i=0; i
8fc0: 3c 70 4f 70 2d 3e 70 32 3b 20 69 2b 2b 29 7b 0a  <pOp->p2; i++){.
8fd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
8fe0: 65 6d 4e 75 6c 54 65 72 6d 69 6e 61 74 65 28 26  emNulTerminate(&
8ff0: 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 20 20 73 71  pMem[i]);.    sq
9000: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f 72  lite3VdbeMemStor
9010: 65 54 79 70 65 28 26 70 4d 65 6d 5b 69 5d 29 3b  eType(&pMem[i]);
9020: 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52  .    REGISTER_TR
9030: 41 43 45 28 70 4f 70 2d 3e 70 31 2b 69 2c 20 26  ACE(pOp->p1+i, &
9040: 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pMem[i]);.  }.  
9050: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
9060: 69 6c 65 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  iled ) goto no_m
9070: 65 6d 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e  em;..  /* Return
9080: 20 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20 2a 2f   SQLITE_ROW.  */
9090: 0a 20 20 70 2d 3e 70 63 20 3d 20 70 63 20 2b 20  .  p->pc = pc + 
90a0: 31 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  1;.  rc = SQLITE
90b0: 5f 52 4f 57 3b 0a 20 20 67 6f 74 6f 20 76 64 62  _ROW;.  goto vdb
90c0: 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20  e_return;.}../* 
90d0: 4f 70 63 6f 64 65 3a 20 43 6f 6e 63 61 74 20 50  Opcode: Concat P
90e0: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
90f0: 2a 20 41 64 64 20 74 68 65 20 74 65 78 74 20 69  * Add the text i
9100: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 6f 6e  n register P1 on
9110: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
9120: 65 20 74 65 78 74 20 69 6e 0a 2a 2a 20 72 65 67  e text in.** reg
9130: 69 73 74 65 72 20 50 32 20 61 6e 64 20 73 74 6f  ister P2 and sto
9140: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
9150: 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
9160: 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20 50   If either the P
9170: 31 20 6f 72 20 50 32 20 74 65 78 74 20 61 72 65  1 or P2 text are
9180: 20 4e 55 4c 4c 20 74 68 65 6e 20 73 74 6f 72 65   NULL then store
9190: 20 4e 55 4c 4c 20 69 6e 20 50 33 2e 0a 2a 2a 0a   NULL in P3..**.
91a0: 2a 2a 20 20 20 50 33 20 3d 20 50 32 20 7c 7c 20  **   P3 = P2 || 
91b0: 50 31 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  P1.**.** It is i
91c0: 6c 6c 65 67 61 6c 20 66 6f 72 20 50 31 20 61 6e  llegal for P1 an
91d0: 64 20 50 33 20 74 6f 20 62 65 20 74 68 65 20 73  d P3 to be the s
91e0: 61 6d 65 20 72 65 67 69 73 74 65 72 2e 20 53 6f  ame register. So
91f0: 6d 65 74 69 6d 65 73 2c 0a 2a 2a 20 69 66 20 50  metimes,.** if P
9200: 33 20 69 73 20 74 68 65 20 73 61 6d 65 20 72 65  3 is the same re
9210: 67 69 73 74 65 72 20 61 73 20 50 32 2c 20 74 68  gister as P2, th
9220: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
9230: 20 69 73 20 61 62 6c 65 0a 2a 2a 20 74 6f 20 61   is able.** to a
9240: 76 6f 69 64 20 61 20 6d 65 6d 63 70 79 28 29 2e  void a memcpy().
9250: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6e 63  .*/.case OP_Conc
9260: 61 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  at: {           
9270: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 43 4f  /* same as TK_CO
9280: 4e 43 41 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20  NCAT, in1, in2, 
9290: 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34 20 6e 42  out3 */.  i64 nB
92a0: 79 74 65 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26  yte;..  pIn1 = &
92b0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
92c0: 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn2 = &aMem[pO
92d0: 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75 74 20 3d  p->p2];.  pOut =
92e0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
92f0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 21  .  assert( pIn1!
9300: 3d 70 4f 75 74 20 29 3b 0a 20 20 69 66 28 20 28  =pOut );.  if( (
9310: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49  pIn1->flags | pI
9320: 6e 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d  n2->flags) & MEM
9330: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c  _Null ){.    sql
9340: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
9350: 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20 62 72  ll(pOut);.    br
9360: 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45  eak;.  }.  if( E
9370: 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31 29 20  xpandBlob(pIn1) 
9380: 7c 7c 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49  || ExpandBlob(pI
9390: 6e 32 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  n2) ) goto no_me
93a0: 6d 3b 0a 20 20 53 74 72 69 6e 67 69 66 79 28 70  m;.  Stringify(p
93b0: 49 6e 31 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  In1, encoding);.
93c0: 20 20 53 74 72 69 6e 67 69 66 79 28 70 49 6e 32    Stringify(pIn2
93d0: 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 6e  , encoding);.  n
93e0: 42 79 74 65 20 3d 20 70 49 6e 31 2d 3e 6e 20 2b  Byte = pIn1->n +
93f0: 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 69 66 28 20   pIn2->n;.  if( 
9400: 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69 6d 69 74  nByte>db->aLimit
9410: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
9420: 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74  NGTH] ){.    got
9430: 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20  o too_big;.  }. 
9440: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
9450: 70 4f 75 74 2c 20 4d 45 4d 5f 53 74 72 29 3b 0a  pOut, MEM_Str);.
9460: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
9470: 65 4d 65 6d 47 72 6f 77 28 70 4f 75 74 2c 20 28  eMemGrow(pOut, (
9480: 69 6e 74 29 6e 42 79 74 65 2b 32 2c 20 70 4f 75  int)nByte+2, pOu
9490: 74 3d 3d 70 49 6e 32 29 20 29 7b 0a 20 20 20 20  t==pIn2) ){.    
94a0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
94b0: 0a 20 20 69 66 28 20 70 4f 75 74 21 3d 70 49 6e  .  if( pOut!=pIn
94c0: 32 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  2 ){.    memcpy(
94d0: 70 4f 75 74 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 7a  pOut->z, pIn2->z
94e0: 2c 20 70 49 6e 32 2d 3e 6e 29 3b 0a 20 20 7d 0a  , pIn2->n);.  }.
94f0: 20 20 6d 65 6d 63 70 79 28 26 70 4f 75 74 2d 3e    memcpy(&pOut->
9500: 7a 5b 70 49 6e 32 2d 3e 6e 5d 2c 20 70 49 6e 31  z[pIn2->n], pIn1
9510: 2d 3e 7a 2c 20 70 49 6e 31 2d 3e 6e 29 3b 0a 20  ->z, pIn1->n);. 
9520: 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74 65 5d 20   pOut->z[nByte] 
9530: 3d 20 30 3b 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e  = 0;.  pOut->z[n
9540: 42 79 74 65 2b 31 5d 20 3d 20 30 3b 0a 20 20 70  Byte+1] = 0;.  p
9550: 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45  Out->flags |= ME
9560: 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e  M_Term;.  pOut->
9570: 6e 20 3d 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a  n = (int)nByte;.
9580: 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e    pOut->enc = en
9590: 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41 54 45  coding;.  UPDATE
95a0: 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f  _MAX_BLOBSIZE(pO
95b0: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
95c0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 64 64 20  ./* Opcode: Add 
95d0: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
95e0: 2a 2a 20 41 64 64 20 74 68 65 20 76 61 6c 75 65  ** Add the value
95f0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
9600: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  to the value in 
9610: 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61  register P2.** a
9620: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
9630: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ult in register 
9640: 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  P3..** If either
9650: 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20   input is NULL, 
9660: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
9670: 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  LL..*/./* Opcode
9680: 3a 20 4d 75 6c 74 69 70 6c 79 20 50 31 20 50 32  : Multiply P1 P2
9690: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 0a 2a 2a   P3 * *.**.**.**
96a0: 20 4d 75 6c 74 69 70 6c 79 20 74 68 65 20 76 61   Multiply the va
96b0: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
96c0: 50 31 20 62 79 20 74 68 65 20 76 61 6c 75 65 20  P1 by the value 
96d0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a  in register P2.*
96e0: 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
96f0: 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74  result in regist
9700: 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74  er P3..** If eit
9710: 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c  her input is NUL
9720: 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  L, the result is
9730: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63   NULL..*/./* Opc
9740: 6f 64 65 3a 20 53 75 62 74 72 61 63 74 20 50 31  ode: Subtract P1
9750: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
9760: 20 53 75 62 74 72 61 63 74 20 74 68 65 20 76 61   Subtract the va
9770: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
9780: 50 31 20 66 72 6f 6d 20 74 68 65 20 76 61 6c 75  P1 from the valu
9790: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
97a0: 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
97b0: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
97c0: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
97d0: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
97e0: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
97f0: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f  is NULL..*/./* O
9800: 70 63 6f 64 65 3a 20 44 69 76 69 64 65 20 50 31  pcode: Divide P1
9810: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
9820: 20 44 69 76 69 64 65 20 74 68 65 20 76 61 6c 75   Divide the valu
9830: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
9840: 20 62 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e   by the value in
9850: 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20   register P2.** 
9860: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
9870: 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72  sult in register
9880: 20 50 33 20 28 50 33 3d 50 32 2f 50 31 29 2e 20   P3 (P3=P2/P1). 
9890: 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  If the value in 
98a0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 20  .** register P1 
98b0: 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  is zero, then th
98c0: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
98d0: 2e 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75  . If either inpu
98e0: 74 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  t is .** NULL, t
98f0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
9900: 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  L..*/./* Opcode:
9910: 20 52 65 6d 61 69 6e 64 65 72 20 50 31 20 50 32   Remainder P1 P2
9920: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f   P3 * *.**.** Co
9930: 6d 70 75 74 65 20 74 68 65 20 72 65 6d 61 69 6e  mpute the remain
9940: 64 65 72 20 61 66 74 65 72 20 69 6e 74 65 67 65  der after intege
9950: 72 20 64 69 76 69 73 69 6f 6e 20 6f 66 20 74 68  r division of th
9960: 65 20 76 61 6c 75 65 20 69 6e 0a 2a 2a 20 72 65  e value in.** re
9970: 67 69 73 74 65 72 20 50 31 20 62 79 20 74 68 65  gister P1 by the
9980: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
9990: 65 72 20 50 32 20 61 6e 64 20 73 74 6f 72 65 20  er P2 and store 
99a0: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 50 33  the result in P3
99b0: 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c  . .** If the val
99c0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
99d0: 32 20 69 73 20 7a 65 72 6f 20 74 68 65 20 72 65  2 is zero the re
99e0: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  sult is NULL..**
99f0: 20 49 66 20 65 69 74 68 65 72 20 6f 70 65 72 61   If either opera
9a00: 6e 64 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  nd is NULL, the 
9a10: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
9a20: 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 64 64 3a 20  */.case OP_Add: 
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a40: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
9a50: 50 4c 55 53 2c 20 69 6e 31 2c 20 69 6e 32 2c 20  PLUS, in1, in2, 
9a60: 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  out3 */.case OP_
9a70: 53 75 62 74 72 61 63 74 3a 20 20 20 20 20 20 20  Subtract:       
9a80: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
9a90: 73 20 54 4b 5f 4d 49 4e 55 53 2c 20 69 6e 31 2c  s TK_MINUS, in1,
9aa0: 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61   in2, out3 */.ca
9ab0: 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20  se OP_Multiply: 
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ad0: 73 61 6d 65 20 61 73 20 54 4b 5f 53 54 41 52 2c  same as TK_STAR,
9ae0: 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
9af0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 69 76 69 64  */.case OP_Divid
9b00: 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e:              
9b10: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
9b20: 53 4c 41 53 48 2c 20 69 6e 31 2c 20 69 6e 32 2c  SLASH, in1, in2,
9b30: 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50   out3 */.case OP
9b40: 5f 52 65 6d 61 69 6e 64 65 72 3a 20 7b 20 20 20  _Remainder: {   
9b50: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
9b60: 61 73 20 54 4b 5f 52 45 4d 2c 20 69 6e 31 2c 20  as TK_REM, in1, 
9b70: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69  in2, out3 */.  i
9b80: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 2f  nt flags;      /
9b90: 2a 20 43 6f 6d 62 69 6e 65 64 20 4d 45 4d 5f 2a  * Combined MEM_*
9ba0: 20 66 6c 61 67 73 20 66 72 6f 6d 20 62 6f 74 68   flags from both
9bb0: 20 69 6e 70 75 74 73 20 2a 2f 0a 20 20 69 36 34   inputs */.  i64
9bc0: 20 69 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   iA;         /* 
9bd0: 49 6e 74 65 67 65 72 20 76 61 6c 75 65 20 6f 66  Integer value of
9be0: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
9bf0: 0a 20 20 69 36 34 20 69 42 3b 20 20 20 20 20 20  .  i64 iB;      
9c00: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 76 61     /* Integer va
9c10: 6c 75 65 20 6f 66 20 72 69 67 68 74 20 6f 70 65  lue of right ope
9c20: 72 61 6e 64 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  rand */.  double
9c30: 20 72 41 3b 20 20 20 20 20 20 2f 2a 20 52 65 61   rA;      /* Rea
9c40: 6c 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74 20  l value of left 
9c50: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f 75  operand */.  dou
9c60: 62 6c 65 20 72 42 3b 20 20 20 20 20 20 2f 2a 20  ble rB;      /* 
9c70: 52 65 61 6c 20 76 61 6c 75 65 20 6f 66 20 72 69  Real value of ri
9c80: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 0a  ght operand */..
9c90: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
9ca0: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 70 70 6c 79  Op->p1];.  apply
9cb0: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
9cc0: 70 49 6e 31 29 3b 0a 20 20 70 49 6e 32 20 3d 20  pIn1);.  pIn2 = 
9cd0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
9ce0: 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66    applyNumericAf
9cf0: 66 69 6e 69 74 79 28 70 49 6e 32 29 3b 0a 20 20  finity(pIn2);.  
9d00: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
9d10: 2d 3e 70 33 5d 3b 0a 20 20 66 6c 61 67 73 20 3d  ->p3];.  flags =
9d20: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70   pIn1->flags | p
9d30: 49 6e 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66  In2->flags;.  if
9d40: 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  ( (flags & MEM_N
9d50: 75 6c 6c 29 21 3d 30 20 29 20 67 6f 74 6f 20 61  ull)!=0 ) goto a
9d60: 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74  rithmetic_result
9d70: 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 69 66 28 20  _is_null;.  if( 
9d80: 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 70  (pIn1->flags & p
9d90: 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In2->flags & MEM
9da0: 5f 49 6e 74 29 3d 3d 4d 45 4d 5f 49 6e 74 20 29  _Int)==MEM_Int )
9db0: 7b 0a 20 20 20 20 69 41 20 3d 20 70 49 6e 31 2d  {.    iA = pIn1-
9dc0: 3e 75 2e 69 3b 0a 20 20 20 20 69 42 20 3d 20 70  >u.i;.    iB = p
9dd0: 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 73 77  In2->u.i;.    sw
9de0: 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  itch( pOp->opcod
9df0: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
9e00: 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20 20 20  OP_Add:         
9e10: 69 42 20 2b 3d 20 69 41 3b 20 20 20 20 20 20 20  iB += iA;       
9e20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9e30: 65 20 4f 50 5f 53 75 62 74 72 61 63 74 3a 20 20  e OP_Subtract:  
9e40: 20 20 69 42 20 2d 3d 20 69 41 3b 20 20 20 20 20    iB -= iA;     
9e50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9e60: 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a  ase OP_Multiply:
9e70: 20 20 20 20 69 42 20 2a 3d 20 69 41 3b 20 20 20      iB *= iA;   
9e80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9e90: 20 63 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a   case OP_Divide:
9ea0: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   {.        if( i
9eb0: 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74  A==0 ) goto arit
9ec0: 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73  hmetic_result_is
9ed0: 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 2f  _null;.        /
9ee0: 2a 20 44 69 76 69 64 69 6e 67 20 74 68 65 20 6c  * Dividing the l
9ef0: 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20  argest possible 
9f00: 6e 65 67 61 74 69 76 65 20 36 34 2d 62 69 74 20  negative 64-bit 
9f10: 69 6e 74 65 67 65 72 20 28 31 3c 3c 36 33 29 20  integer (1<<63) 
9f20: 62 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 2d  by .        ** -
9f30: 31 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e 74  1 returns an int
9f40: 65 67 65 72 20 74 6f 6f 20 6c 61 72 67 65 20 74  eger too large t
9f50: 6f 20 73 74 6f 72 65 20 69 6e 20 61 20 36 34 2d  o store in a 64-
9f60: 62 69 74 20 64 61 74 61 2d 74 79 70 65 2e 20 4f  bit data-type. O
9f70: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d  n.        ** som
9f80: 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c  e architectures,
9f90: 20 74 68 65 20 76 61 6c 75 65 20 6f 76 65 72 66   the value overf
9fa0: 6c 6f 77 73 20 74 6f 20 28 31 3c 3c 36 33 29 2e  lows to (1<<63).
9fb0: 20 4f 6e 20 6f 74 68 65 72 73 2c 0a 20 20 20 20   On others,.    
9fc0: 20 20 20 20 2a 2a 20 61 20 53 49 47 46 50 45 20      ** a SIGFPE 
9fd0: 69 73 20 69 73 73 75 65 64 2e 20 54 68 65 20 66  is issued. The f
9fe0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
9ff0: 6e 74 20 6e 6f 72 6d 61 6c 69 7a 65 73 20 74 68  nt normalizes th
a000: 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65  is.        ** be
a010: 68 61 76 69 6f 72 20 73 6f 20 74 68 61 74 20 61  havior so that a
a020: 6c 6c 20 61 72 63 68 69 74 65 63 74 75 72 65 73  ll architectures
a030: 20 62 65 68 61 76 65 20 61 73 20 69 66 20 69 6e   behave as if in
a040: 74 65 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a  teger .        *
a050: 2a 20 6f 76 65 72 66 6c 6f 77 20 6f 63 63 75 72  * overflow occur
a060: 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  red..        */.
a070: 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d          if( iA==
a080: 2d 31 20 26 26 20 69 42 3d 3d 53 4d 41 4c 4c 45  -1 && iB==SMALLE
a090: 53 54 5f 49 4e 54 36 34 20 29 20 69 41 20 3d 20  ST_INT64 ) iA = 
a0a0: 31 3b 0a 20 20 20 20 20 20 20 20 69 42 20 2f 3d  1;.        iB /=
a0b0: 20 69 41 3b 0a 20 20 20 20 20 20 20 20 62 72 65   iA;.        bre
a0c0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
a0d0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
a0e0: 20 20 20 20 20 69 66 28 20 69 41 3d 3d 30 20 29       if( iA==0 )
a0f0: 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63   goto arithmetic
a100: 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b  _result_is_null;
a110: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d  .        if( iA=
a120: 3d 2d 31 20 29 20 69 41 20 3d 20 31 3b 0a 20 20  =-1 ) iA = 1;.  
a130: 20 20 20 20 20 20 69 42 20 25 3d 20 69 41 3b 0a        iB %= iA;.
a140: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a150: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
a160: 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 42 3b   pOut->u.i = iB;
a170: 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46  .    MemSetTypeF
a180: 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e  lag(pOut, MEM_In
a190: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
a1a0: 20 72 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rA = sqlite3Vdb
a1b0: 65 52 65 61 6c 56 61 6c 75 65 28 70 49 6e 31 29  eRealValue(pIn1)
a1c0: 3b 0a 20 20 20 20 72 42 20 3d 20 73 71 6c 69 74  ;.    rB = sqlit
a1d0: 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28  e3VdbeRealValue(
a1e0: 70 49 6e 32 29 3b 0a 20 20 20 20 73 77 69 74 63  pIn2);.    switc
a1f0: 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29  h( pOp->opcode )
a200: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  {.      case OP_
a210: 41 64 64 3a 20 20 20 20 20 20 20 20 20 72 42 20  Add:         rB 
a220: 2b 3d 20 72 41 3b 20 20 20 20 20 20 20 62 72 65  += rA;       bre
a230: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
a240: 50 5f 53 75 62 74 72 61 63 74 3a 20 20 20 20 72  P_Subtract:    r
a250: 42 20 2d 3d 20 72 41 3b 20 20 20 20 20 20 20 62  B -= rA;       b
a260: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a270: 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20 20   OP_Multiply:   
a280: 20 72 42 20 2a 3d 20 72 41 3b 20 20 20 20 20 20   rB *= rA;      
a290: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a2a0: 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 7b 0a  se OP_Divide: {.
a2b0: 20 20 20 20 20 20 20 20 2f 2a 20 28 64 6f 75 62          /* (doub
a2c0: 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20  le)0 In case of 
a2d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
a2e0: 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f  TING_POINT... */
a2f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 41 3d  .        if( rA=
a300: 3d 28 64 6f 75 62 6c 65 29 30 20 29 20 67 6f 74  =(double)0 ) got
a310: 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73  o arithmetic_res
a320: 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20  ult_is_null;.   
a330: 20 20 20 20 20 72 42 20 2f 3d 20 72 41 3b 0a 20       rB /= rA;. 
a340: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a350: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61      }.      defa
a360: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ult: {.        i
a370: 41 20 3d 20 28 69 36 34 29 72 41 3b 0a 20 20 20  A = (i64)rA;.   
a380: 20 20 20 20 20 69 42 20 3d 20 28 69 36 34 29 72       iB = (i64)r
a390: 42 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  B;.        if( i
a3a0: 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74  A==0 ) goto arit
a3b0: 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73  hmetic_result_is
a3c0: 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69  _null;.        i
a3d0: 66 28 20 69 41 3d 3d 2d 31 20 29 20 69 41 20 3d  f( iA==-1 ) iA =
a3e0: 20 31 3b 0a 20 20 20 20 20 20 20 20 72 42 20 3d   1;.        rB =
a3f0: 20 28 64 6f 75 62 6c 65 29 28 69 42 20 25 20 69   (double)(iB % i
a400: 41 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  A);.        brea
a410: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
a420: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
a430: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
a440: 4e 54 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69  NT.    pOut->u.i
a450: 20 3d 20 72 42 3b 0a 20 20 20 20 4d 65 6d 53 65   = rB;.    MemSe
a460: 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20  tTypeFlag(pOut, 
a470: 4d 45 4d 5f 49 6e 74 29 3b 0a 23 65 6c 73 65 0a  MEM_Int);.#else.
a480: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
a490: 73 4e 61 4e 28 72 42 29 20 29 7b 0a 20 20 20 20  sNaN(rB) ){.    
a4a0: 20 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69    goto arithmeti
a4b0: 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c  c_result_is_null
a4c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74  ;.    }.    pOut
a4d0: 2d 3e 72 20 3d 20 72 42 3b 0a 20 20 20 20 4d 65  ->r = rB;.    Me
a4e0: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
a4f0: 74 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b 0a 20 20  t, MEM_Real);.  
a500: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d    if( (flags & M
a510: 45 4d 5f 52 65 61 6c 29 3d 3d 30 20 29 7b 0a 20  EM_Real)==0 ){. 
a520: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a530: 49 6e 74 65 67 65 72 41 66 66 69 6e 69 74 79 28  IntegerAffinity(
a540: 70 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pOut);.    }.#en
a550: 64 69 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  dif.  }.  break;
a560: 0a 0a 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73  ..arithmetic_res
a570: 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3a 0a 20 20 73  ult_is_null:.  s
a580: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
a590: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 62 72  Null(pOut);.  br
a5a0: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
a5b0: 65 3a 20 43 6f 6c 6c 53 65 71 20 2a 20 2a 20 50  e: CollSeq * * P
a5c0: 34 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20  4.**.** P4 is a 
a5d0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 43 6f 6c  pointer to a Col
a5e0: 6c 53 65 71 20 73 74 72 75 63 74 2e 20 49 66 20  lSeq struct. If 
a5f0: 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
a600: 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e   a user function
a610: 0a 2a 2a 20 6f 72 20 61 67 67 72 65 67 61 74 65  .** or aggregate
a620: 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 47 65   calls sqlite3Ge
a630: 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 29 2c 20  tFuncCollSeq(), 
a640: 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  this collation s
a650: 65 71 75 65 6e 63 65 20 77 69 6c 6c 0a 2a 2a 20  equence will.** 
a660: 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  be returned. Thi
a670: 73 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  s is used by the
a680: 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 2c   built-in min(),
a690: 20 6d 61 78 28 29 20 61 6e 64 20 6e 75 6c 6c 69   max() and nulli
a6a0: 66 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  f().** functions
a6b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
a6c0: 72 66 61 63 65 20 75 73 65 64 20 62 79 20 74 68  rface used by th
a6d0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
a6e0: 20 6f 66 20 74 68 65 20 61 66 6f 72 65 6d 65 6e   of the aforemen
a6f0: 74 69 6f 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  tioned functions
a700: 0a 2a 2a 20 74 6f 20 72 65 74 72 69 65 76 65 20  .** to retrieve 
a710: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
a720: 71 75 65 6e 63 65 20 73 65 74 20 62 79 20 74 68  quence set by th
a730: 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6e 6f 74  is opcode is not
a740: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 70 75   available.** pu
a750: 62 6c 69 63 6c 79 2c 20 6f 6e 6c 79 20 74 6f 20  blicly, only to 
a760: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 64  user functions d
a770: 65 66 69 6e 65 64 20 69 6e 20 66 75 6e 63 2e 63  efined in func.c
a780: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6c  ..*/.case OP_Col
a790: 6c 53 65 71 3a 20 7b 0a 20 20 61 73 73 65 72 74  lSeq: {.  assert
a7a0: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
a7b0: 34 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 62  4_COLLSEQ );.  b
a7c0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
a7d0: 64 65 3a 20 46 75 6e 63 74 69 6f 6e 20 50 31 20  de: Function P1 
a7e0: 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
a7f0: 2a 20 49 6e 76 6f 6b 65 20 61 20 75 73 65 72 20  * Invoke a user 
a800: 66 75 6e 63 74 69 6f 6e 20 28 50 34 20 69 73 20  function (P4 is 
a810: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 46  a pointer to a F
a820: 75 6e 63 74 69 6f 6e 20 73 74 72 75 63 74 75 72  unction structur
a830: 65 20 74 68 61 74 0a 2a 2a 20 64 65 66 69 6e 65  e that.** define
a840: 73 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 29 20  s the function) 
a850: 77 69 74 68 20 50 35 20 61 72 67 75 6d 65 6e 74  with P5 argument
a860: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67  s taken from reg
a870: 69 73 74 65 72 20 50 32 20 61 6e 64 0a 2a 2a 20  ister P2 and.** 
a880: 73 75 63 63 65 73 73 6f 72 73 2e 20 20 54 68 65  successors.  The
a890: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 66   result of the f
a8a0: 75 6e 63 74 69 6f 6e 20 69 73 20 73 74 6f 72 65  unction is store
a8b0: 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  d in register P3
a8c0: 2e 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 33  ..** Register P3
a8d0: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 6e 65   must not be one
a8e0: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
a8f0: 20 69 6e 70 75 74 73 2e 0a 2a 2a 0a 2a 2a 20 50   inputs..**.** P
a900: 31 20 69 73 20 61 20 33 32 2d 62 69 74 20 62 69  1 is a 32-bit bi
a910: 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67  tmask indicating
a920: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
a930: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 74 6f  each argument to
a940: 20 74 68 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f   the .** functio
a950: 6e 20 77 61 73 20 64 65 74 65 72 6d 69 6e 65 64  n was determined
a960: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
a970: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2e  at compile time.
a980: 20 49 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   If the first.**
a990: 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 63 6f   argument was co
a9a0: 6e 73 74 61 6e 74 20 74 68 65 6e 20 62 69 74 20  nstant then bit 
a9b0: 30 20 6f 66 20 50 31 20 69 73 20 73 65 74 2e 20  0 of P1 is set. 
a9c0: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
a9d0: 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65  determine.** whe
a9e0: 74 68 65 72 20 6d 65 74 61 20 64 61 74 61 20 61  ther meta data a
a9f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
aa00: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 61   user function a
aa10: 72 67 75 6d 65 6e 74 20 75 73 69 6e 67 20 74 68  rgument using th
aa20: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 65 74  e.** sqlite3_set
aa30: 5f 61 75 78 64 61 74 61 28 29 20 41 50 49 20 6d  _auxdata() API m
aa40: 61 79 20 62 65 20 73 61 66 65 6c 79 20 72 65 74  ay be safely ret
aa50: 61 69 6e 65 64 20 75 6e 74 69 6c 20 74 68 65 20  ained until the 
aa60: 6e 65 78 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69  next.** invocati
aa70: 6f 6e 20 6f 66 20 74 68 69 73 20 6f 70 63 6f 64  on of this opcod
aa80: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
aa90: 6f 3a 20 41 67 67 53 74 65 70 20 61 6e 64 20 41  o: AggStep and A
aaa0: 67 67 46 69 6e 61 6c 0a 2a 2f 0a 63 61 73 65 20  ggFinal.*/.case 
aab0: 4f 50 5f 46 75 6e 63 74 69 6f 6e 3a 20 7b 0a 20  OP_Function: {. 
aac0: 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 70   int i;.  Mem *p
aad0: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63  Arg;.  sqlite3_c
aae0: 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 73 71  ontext ctx;.  sq
aaf0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
ab00: 56 61 6c 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20  Val;.  int n;.. 
ab10: 20 6e 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20   n = pOp->p5;.  
ab20: 61 70 56 61 6c 20 3d 20 70 2d 3e 61 70 41 72 67  apVal = p->apArg
ab30: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70 56 61  ;.  assert( apVa
ab40: 6c 20 7c 7c 20 6e 3d 3d 30 20 29 3b 0a 0a 20 20  l || n==0 );..  
ab50: 61 73 73 65 72 74 28 20 6e 3d 3d 30 20 7c 7c 20  assert( n==0 || 
ab60: 28 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f  (pOp->p2>0 && pO
ab70: 70 2d 3e 70 32 2b 6e 3c 3d 70 2d 3e 6e 4d 65 6d  p->p2+n<=p->nMem
ab80: 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  +1) );.  assert(
ab90: 20 70 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e 70 32   pOp->p3<pOp->p2
aba0: 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70 4f 70   || pOp->p3>=pOp
abb0: 2d 3e 70 32 2b 6e 20 29 3b 0a 20 20 70 41 72 67  ->p2+n );.  pArg
abc0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
abd0: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
abe0: 6e 3b 20 69 2b 2b 2c 20 70 41 72 67 2b 2b 29 7b  n; i++, pArg++){
abf0: 0a 20 20 20 20 61 70 56 61 6c 5b 69 5d 20 3d 20  .    apVal[i] = 
ac00: 70 41 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65  pArg;.    sqlite
ac10: 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70  3VdbeMemStoreTyp
ac20: 65 28 70 41 72 67 29 3b 0a 20 20 20 20 52 45 47  e(pArg);.    REG
ac30: 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
ac40: 3e 70 32 2b 69 2c 20 70 41 72 67 29 3b 0a 20 20  >p2+i, pArg);.  
ac50: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  }..  assert( pOp
ac60: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e  ->p4type==P4_FUN
ac70: 43 44 45 46 20 7c 7c 20 70 4f 70 2d 3e 70 34 74  CDEF || pOp->p4t
ac80: 79 70 65 3d 3d 50 34 5f 56 44 42 45 46 55 4e 43  ype==P4_VDBEFUNC
ac90: 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   );.  if( pOp->p
aca0: 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43 44 45  4type==P4_FUNCDE
acb0: 46 20 29 7b 0a 20 20 20 20 63 74 78 2e 70 46 75  F ){.    ctx.pFu
acc0: 6e 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75  nc = pOp->p4.pFu
acd0: 6e 63 3b 0a 20 20 20 20 63 74 78 2e 70 56 64 62  nc;.    ctx.pVdb
ace0: 65 46 75 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  eFunc = 0;.  }el
acf0: 73 65 7b 0a 20 20 20 20 63 74 78 2e 70 56 64 62  se{.    ctx.pVdb
ad00: 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e  eFunc = (VdbeFun
ad10: 63 2a 29 70 4f 70 2d 3e 70 34 2e 70 56 64 62 65  c*)pOp->p4.pVdbe
ad20: 46 75 6e 63 3b 0a 20 20 20 20 63 74 78 2e 70 46  Func;.    ctx.pF
ad30: 75 6e 63 20 3d 20 63 74 78 2e 70 56 64 62 65 46  unc = ctx.pVdbeF
ad40: 75 6e 63 2d 3e 70 46 75 6e 63 3b 0a 20 20 7d 0a  unc->pFunc;.  }.
ad50: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
ad60: 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c  p3>0 && pOp->p3<
ad70: 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 4f  =p->nMem );.  pO
ad80: 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
ad90: 70 33 5d 3b 0a 20 20 63 74 78 2e 73 2e 66 6c 61  p3];.  ctx.s.fla
ada0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
adb0: 20 63 74 78 2e 73 2e 64 62 20 3d 20 64 62 3b 0a   ctx.s.db = db;.
adc0: 20 20 63 74 78 2e 73 2e 78 44 65 6c 20 3d 20 30    ctx.s.xDel = 0
add0: 3b 0a 20 20 63 74 78 2e 73 2e 7a 4d 61 6c 6c 6f  ;.  ctx.s.zMallo
ade0: 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65  c = 0;..  /* The
adf0: 20 6f 75 74 70 75 74 20 63 65 6c 6c 20 6d 61 79   output cell may
ae00: 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
ae10: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
ae20: 2e 20 4d 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20  . Move.  ** the 
ae30: 70 6f 69 6e 74 65 72 20 74 6f 20 63 74 78 2e 73  pointer to ctx.s
ae40: 20 73 6f 20 69 6e 20 63 61 73 65 20 74 68 65 20   so in case the 
ae50: 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 63 61  user-function ca
ae60: 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 61  n use.  ** the a
ae70: 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64  lready allocated
ae80: 20 62 75 66 66 65 72 20 69 6e 73 74 65 61 64 20   buffer instead 
ae90: 6f 66 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  of allocating a 
aea0: 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  new one..  */.  
aeb0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f  sqlite3VdbeMemMo
aec0: 76 65 28 26 63 74 78 2e 73 2c 20 70 4f 75 74 29  ve(&ctx.s, pOut)
aed0: 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c  ;.  MemSetTypeFl
aee0: 61 67 28 26 63 74 78 2e 73 2c 20 4d 45 4d 5f 4e  ag(&ctx.s, MEM_N
aef0: 75 6c 6c 29 3b 0a 0a 20 20 63 74 78 2e 69 73 45  ull);..  ctx.isE
af00: 72 72 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  rror = 0;.  if( 
af10: 63 74 78 2e 70 46 75 6e 63 2d 3e 66 6c 61 67 73  ctx.pFunc->flags
af20: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
af30: 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 61  EEDCOLL ){.    a
af40: 73 73 65 72 74 28 20 70 4f 70 3e 61 4f 70 20 29  ssert( pOp>aOp )
af50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
af60: 70 5b 2d 31 5d 2e 70 34 74 79 70 65 3d 3d 50 34  p[-1].p4type==P4
af70: 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 20 20  _COLLSEQ );.    
af80: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
af90: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53  opcode==OP_CollS
afa0: 65 71 20 29 3b 0a 20 20 20 20 63 74 78 2e 70 43  eq );.    ctx.pC
afb0: 6f 6c 6c 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 34  oll = pOp[-1].p4
afc0: 2e 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 28 2a  .pColl;.  }.  (*
afd0: 63 74 78 2e 70 46 75 6e 63 2d 3e 78 46 75 6e 63  ctx.pFunc->xFunc
afe0: 29 28 26 63 74 78 2c 20 6e 2c 20 61 70 56 61 6c  )(&ctx, n, apVal
aff0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
b000: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
b010: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
b020: 61 20 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 66  a malloc() has f
b030: 61 69 6c 65 64 2c 20 74 68 65 20 69 6d 70 6c 65  ailed, the imple
b040: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
b050: 0a 20 20 20 20 2a 2a 20 75 73 65 72 20 66 75 6e  .    ** user fun
b060: 63 74 69 6f 6e 20 6d 61 79 20 68 61 76 65 20 63  ction may have c
b070: 61 6c 6c 65 64 20 61 6e 20 73 71 6c 69 74 65 33  alled an sqlite3
b080: 5f 72 65 73 75 6c 74 5f 58 58 58 28 29 20 66 75  _result_XXX() fu
b090: 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 6f  nction.    ** to
b0a0: 20 72 65 74 75 72 6e 20 61 20 76 61 6c 75 65 2e   return a value.
b0b0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
b0c0: 61 6c 6c 20 72 65 6c 65 61 73 65 73 20 61 6e 79  all releases any
b0d0: 20 72 65 73 6f 75 72 63 65 73 0a 20 20 20 20 2a   resources.    *
b0e0: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
b0f0: 68 20 73 75 63 68 20 61 20 76 61 6c 75 65 2e 0a  h such a value..
b100: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
b110: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
b120: 28 26 63 74 78 2e 73 29 3b 0a 20 20 20 20 67 6f  (&ctx.s);.    go
b130: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 0a  to no_mem;.  }..
b140: 20 20 2f 2a 20 49 66 20 61 6e 79 20 61 75 78 69    /* If any auxi
b150: 6c 69 61 72 79 20 64 61 74 61 20 66 75 6e 63 74  liary data funct
b160: 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 20 63  ions have been c
b170: 61 6c 6c 65 64 20 62 79 20 74 68 69 73 20 75 73  alled by this us
b180: 65 72 20 66 75 6e 63 74 69 6f 6e 2c 0a 20 20 2a  er function,.  *
b190: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 63 61  * immediately ca
b1a0: 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ll the destructo
b1b0: 72 20 66 6f 72 20 61 6e 79 20 6e 6f 6e 2d 73 74  r for any non-st
b1c0: 61 74 69 63 20 76 61 6c 75 65 73 2e 0a 20 20 2a  atic values..  *
b1d0: 2f 0a 20 20 69 66 28 20 63 74 78 2e 70 56 64 62  /.  if( ctx.pVdb
b1e0: 65 46 75 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c  eFunc ){.    sql
b1f0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
b200: 78 44 61 74 61 28 63 74 78 2e 70 56 64 62 65 46  xData(ctx.pVdbeF
b210: 75 6e 63 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20  unc, pOp->p1);. 
b220: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 56 64 62 65     pOp->p4.pVdbe
b230: 46 75 6e 63 20 3d 20 63 74 78 2e 70 56 64 62 65  Func = ctx.pVdbe
b240: 46 75 6e 63 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  Func;.    pOp->p
b250: 34 74 79 70 65 20 3d 20 50 34 5f 56 44 42 45 46  4type = P4_VDBEF
b260: 55 4e 43 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  UNC;.  }..  /* I
b270: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72  f the function r
b280: 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
b290: 2c 20 74 68 72 6f 77 20 61 6e 20 65 78 63 65 70  , throw an excep
b2a0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 63 74  tion */.  if( ct
b2b0: 78 2e 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20  x.isError ){.   
b2c0: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
b2d0: 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  g(&p->zErrMsg, d
b2e0: 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  b, "%s", sqlite3
b2f0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 26 63 74 78  _value_text(&ctx
b300: 2e 73 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  .s));.    rc = c
b310: 74 78 2e 69 73 45 72 72 6f 72 3b 0a 20 20 7d 0a  tx.isError;.  }.
b320: 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72  .  /* Copy the r
b330: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e  esult of the fun
b340: 63 74 69 6f 6e 20 69 6e 74 6f 20 72 65 67 69 73  ction into regis
b350: 74 65 72 20 50 33 20 2a 2f 0a 20 20 73 71 6c 69  ter P3 */.  sqli
b360: 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
b370: 6f 64 69 6e 67 28 26 63 74 78 2e 73 2c 20 65 6e  oding(&ctx.s, en
b380: 63 6f 64 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74  coding);.  sqlit
b390: 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 70 4f  e3VdbeMemMove(pO
b3a0: 75 74 2c 20 26 63 74 78 2e 73 29 3b 0a 20 20 69  ut, &ctx.s);.  i
b3b0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
b3c0: 6d 54 6f 6f 42 69 67 28 70 4f 75 74 29 20 29 7b  mTooBig(pOut) ){
b3d0: 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69  .    goto too_bi
b3e0: 67 3b 0a 20 20 7d 0a 20 20 52 45 47 49 53 54 45  g;.  }.  REGISTE
b3f0: 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c  R_TRACE(pOp->p3,
b400: 20 70 4f 75 74 29 3b 0a 20 20 55 50 44 41 54 45   pOut);.  UPDATE
b410: 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f  _MAX_BLOBSIZE(pO
b420: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
b430: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69 74 41  ./* Opcode: BitA
b440: 6e 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  nd P1 P2 P3 * *.
b450: 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 62  **.** Take the b
b460: 69 74 2d 77 69 73 65 20 41 4e 44 20 6f 66 20 74  it-wise AND of t
b470: 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67  he values in reg
b480: 69 73 74 65 72 20 50 31 20 61 6e 64 20 50 32 20  ister P1 and P2 
b490: 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65  and.** store the
b4a0: 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73   result in regis
b4b0: 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69  ter P3..** If ei
b4c0: 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55  ther input is NU
b4d0: 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  LL, the result i
b4e0: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70  s NULL..*/./* Op
b4f0: 63 6f 64 65 3a 20 42 69 74 4f 72 20 50 31 20 50  code: BitOr P1 P
b500: 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  2 P3 * *.**.** T
b510: 61 6b 65 20 74 68 65 20 62 69 74 2d 77 69 73 65  ake the bit-wise
b520: 20 4f 52 20 6f 66 20 74 68 65 20 76 61 6c 75 65   OR of the value
b530: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  s in register P1
b540: 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73   and P2 and.** s
b550: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
b560: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
b570: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70  ** If either inp
b580: 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  ut is NULL, the 
b590: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
b5a0: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68  */./* Opcode: Sh
b5b0: 69 66 74 4c 65 66 74 20 50 31 20 50 32 20 50 33  iftLeft P1 P2 P3
b5c0: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74   * *.**.** Shift
b5d0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
b5e0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
b5f0: 32 20 74 6f 20 74 68 65 20 6c 65 66 74 20 62 79  2 to the left by
b600: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
b610: 66 20 62 69 74 73 20 73 70 65 63 69 66 69 65 64  f bits specified
b620: 20 62 79 20 74 68 65 20 69 6e 74 65 67 65 72 20   by the integer 
b630: 69 6e 20 72 65 67 69 73 65 72 20 50 31 2e 0a 2a  in regiser P1..*
b640: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
b650: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
b660: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
b670: 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74  input is NULL, t
b680: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
b690: 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  L..*/./* Opcode:
b6a0: 20 53 68 69 66 74 52 69 67 68 74 20 50 31 20 50   ShiftRight P1 P
b6b0: 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53  2 P3 * *.**.** S
b6c0: 68 69 66 74 20 74 68 65 20 69 6e 74 65 67 65 72  hift the integer
b6d0: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
b6e0: 65 72 20 50 32 20 74 6f 20 74 68 65 20 72 69 67  er P2 to the rig
b6f0: 68 74 20 62 79 20 74 68 65 0a 2a 2a 20 6e 75 6d  ht by the.** num
b700: 62 65 72 20 6f 66 20 62 69 74 73 20 73 70 65 63  ber of bits spec
b710: 69 66 69 65 64 20 62 79 20 74 68 65 20 69 6e 74  ified by the int
b720: 65 67 65 72 20 69 6e 20 72 65 67 69 73 74 65 72  eger in register
b730: 20 50 31 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68   P1..** Store th
b740: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
b750: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
b760: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
b770: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
b780: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65  is NULL..*/.case
b790: 20 4f 50 5f 42 69 74 41 6e 64 3a 20 20 20 20 20   OP_BitAnd:     
b7a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
b7b0: 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 41 4e 44  ame as TK_BITAND
b7c0: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
b7d0: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74 4f   */.case OP_BitO
b7e0: 72 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r:              
b7f0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
b800: 4b 5f 42 49 54 4f 52 2c 20 69 6e 31 2c 20 69 6e  K_BITOR, in1, in
b810: 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
b820: 4f 50 5f 53 68 69 66 74 4c 65 66 74 3a 20 20 20  OP_ShiftLeft:   
b830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
b840: 6d 65 20 61 73 20 54 4b 5f 4c 53 48 49 46 54 2c  me as TK_LSHIFT,
b850: 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
b860: 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 68 69 66 74  */.case OP_Shift
b870: 52 69 67 68 74 3a 20 7b 20 20 20 20 20 20 20 20  Right: {        
b880: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
b890: 5f 52 53 48 49 46 54 2c 20 69 6e 31 2c 20 69 6e  _RSHIFT, in1, in
b8a0: 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34  2, out3 */.  i64
b8b0: 20 61 3b 0a 20 20 69 36 34 20 62 3b 0a 0a 20 20   a;.  i64 b;..  
b8c0: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
b8d0: 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20  ->p1];.  pIn2 = 
b8e0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
b8f0: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
b900: 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 28  Op->p3];.  if( (
b910: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49  pIn1->flags | pI
b920: 6e 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d  n2->flags) & MEM
b930: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c  _Null ){.    sql
b940: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
b950: 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20 62 72  ll(pOut);.    br
b960: 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 20 3d 20 73  eak;.  }.  a = s
b970: 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c  qlite3VdbeIntVal
b980: 75 65 28 70 49 6e 32 29 3b 0a 20 20 62 20 3d 20  ue(pIn2);.  b = 
b990: 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
b9a0: 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 73 77 69  lue(pIn1);.  swi
b9b0: 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  tch( pOp->opcode
b9c0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f   ){.    case OP_
b9d0: 42 69 74 41 6e 64 3a 20 20 20 20 20 20 61 20 26  BitAnd:      a &
b9e0: 3d 20 62 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  = b;     break;.
b9f0: 20 20 20 20 63 61 73 65 20 4f 50 5f 42 69 74 4f      case OP_BitO
ba00: 72 3a 20 20 20 20 20 20 20 61 20 7c 3d 20 62 3b  r:       a |= b;
ba10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ba20: 63 61 73 65 20 4f 50 5f 53 68 69 66 74 4c 65 66  case OP_ShiftLef
ba30: 74 3a 20 20 20 61 20 3c 3c 3d 20 62 3b 20 20 20  t:   a <<= b;   
ba40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
ba50: 75 6c 74 3a 20 20 61 73 73 65 72 74 28 20 70 4f  ult:  assert( pO
ba60: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 68  p->opcode==OP_Sh
ba70: 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20 20  iftRight );.    
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 20 20 20 20 61 20 3e 3e 3d 20 62 3b 20 20 20       a >>= b;   
baa0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 4f   break;.  }.  pO
bab0: 75 74 2d 3e 75 2e 69 20 3d 20 61 3b 0a 20 20 4d  ut->u.i = a;.  M
bac0: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
bad0: 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20  ut, MEM_Int);.  
bae0: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
baf0: 6f 64 65 3a 20 41 64 64 49 6d 6d 20 20 50 31 20  ode: AddImm  P1 
bb00: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 0a 2a 2a 20  P2 * * *.** .** 
bb10: 41 64 64 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  Add the constant
bb20: 20 50 32 20 74 6f 20 74 68 65 20 76 61 6c 75 65   P2 to the value
bb30: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
bb40: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
bb50: 73 20 61 6c 77 61 79 73 20 61 6e 20 69 6e 74 65  s always an inte
bb60: 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 66 6f  ger..**.** To fo
bb70: 72 63 65 20 61 6e 79 20 72 65 67 69 73 74 65 72  rce any register
bb80: 20 74 6f 20 62 65 20 61 6e 20 69 6e 74 65 67 65   to be an intege
bb90: 72 2c 20 6a 75 73 74 20 61 64 64 20 30 2e 0a 2a  r, just add 0..*
bba0: 2f 0a 63 61 73 65 20 4f 50 5f 41 64 64 49 6d 6d  /.case OP_AddImm
bbb0: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
bbc0: 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  * in1 */.  pIn1 
bbd0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
bbe0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
bbf0: 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e  emIntegerify(pIn
bc00: 31 29 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20  1);.  pIn1->u.i 
bc10: 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 62 72  += pOp->p2;.  br
bc20: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
bc30: 65 3a 20 4d 75 73 74 42 65 49 6e 74 20 50 31 20  e: MustBeInt P1 
bc40: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 0a 2a 2a 20  P2 * * *.** .** 
bc50: 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75 65 20  Force the value 
bc60: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 74  in register P1 t
bc70: 6f 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 2e  o be an integer.
bc80: 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a    If the value.*
bc90: 2a 20 69 6e 20 50 31 20 69 73 20 6e 6f 74 20 61  * in P1 is not a
bca0: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20 63 61  n integer and ca
bcb0: 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74 65  nnot be converte
bcc0: 64 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65  d into an intege
bcd0: 72 0a 2a 2a 20 77 69 74 68 6f 75 74 20 64 61 74  r.** without dat
bce0: 61 20 6c 6f 73 73 2c 20 74 68 65 6e 20 6a 75 6d  a loss, then jum
bcf0: 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
bd00: 20 50 32 2c 20 6f 72 20 69 66 20 50 32 3d 3d 30   P2, or if P2==0
bd10: 0a 2a 2a 20 72 61 69 73 65 20 61 6e 20 53 51 4c  .** raise an SQL
bd20: 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 65 78 63  ITE_MISMATCH exc
bd30: 65 70 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  eption..*/.case 
bd40: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 3a 20 7b 20  OP_MustBeInt: { 
bd50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75             /* ju
bd60: 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e  mp, in1 */.  pIn
bd70: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
bd80: 31 5d 3b 0a 20 20 61 70 70 6c 79 41 66 66 69 6e  1];.  applyAffin
bd90: 69 74 79 28 70 49 6e 31 2c 20 53 51 4c 49 54 45  ity(pIn1, SQLITE
bda0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c 20 65 6e  _AFF_NUMERIC, en
bdb0: 63 6f 64 69 6e 67 29 3b 0a 20 20 69 66 28 20 28  coding);.  if( (
bdc0: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
bdd0: 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20  M_Int)==0 ){.   
bde0: 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 30 20   if( pOp->p2==0 
bdf0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
be00: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3b 0a 20  LITE_MISMATCH;. 
be10: 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
be20: 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
be30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
be40: 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
be50: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
be60: 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
be70: 61 67 28 70 49 6e 31 2c 20 4d 45 4d 5f 49 6e 74  ag(pIn1, MEM_Int
be80: 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
be90: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
bea0: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
beb0: 50 4f 49 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a  POINT./* Opcode:
bec0: 20 52 65 61 6c 41 66 66 69 6e 69 74 79 20 50 31   RealAffinity P1
bed0: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49   * * * *.**.** I
bee0: 66 20 72 65 67 69 73 74 65 72 20 50 31 20 68 6f  f register P1 ho
bef0: 6c 64 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63  lds an integer c
bf00: 6f 6e 76 65 72 74 20 69 74 20 74 6f 20 61 20 72  onvert it to a r
bf10: 65 61 6c 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  eal value..**.**
bf20: 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   This opcode is 
bf30: 75 73 65 64 20 77 68 65 6e 20 65 78 74 72 61 63  used when extrac
bf40: 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
bf50: 20 66 72 6f 6d 20 61 20 63 6f 6c 75 6d 6e 20 74   from a column t
bf60: 68 61 74 0a 2a 2a 20 68 61 73 20 52 45 41 4c 20  hat.** has REAL 
bf70: 61 66 66 69 6e 69 74 79 2e 20 20 53 75 63 68 20  affinity.  Such 
bf80: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 6d 61  column values ma
bf90: 79 20 73 74 69 6c 6c 20 62 65 20 73 74 6f 72 65  y still be store
bfa0: 64 20 61 73 0a 2a 2a 20 69 6e 74 65 67 65 72 73  d as.** integers
bfb0: 2c 20 66 6f 72 20 73 70 61 63 65 20 65 66 66 69  , for space effi
bfc0: 63 69 65 6e 63 79 2c 20 62 75 74 20 61 66 74 65  ciency, but afte
bfd0: 72 20 65 78 74 72 61 63 74 69 6f 6e 20 77 65 20  r extraction we 
bfe0: 77 61 6e 74 20 74 68 65 6d 0a 2a 2a 20 74 6f 20  want them.** to 
bff0: 68 61 76 65 20 6f 6e 6c 79 20 61 20 72 65 61 6c  have only a real
c000: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 63 61 73 65 20   value..*/.case 
c010: 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 3a  OP_RealAffinity:
c020: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
c030: 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20      /* in1 */.  
c040: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
c050: 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70 49 6e  ->p1];.  if( pIn
c060: 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  1->flags & MEM_I
c070: 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
c080: 33 56 64 62 65 4d 65 6d 52 65 61 6c 69 66 79 28  3VdbeMemRealify(
c090: 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65  pIn1);.  }.  bre
c0a0: 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ak;.}.#endif..#i
c0b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c0c0: 54 5f 43 41 53 54 0a 2f 2a 20 4f 70 63 6f 64 65  T_CAST./* Opcode
c0d0: 3a 20 54 6f 54 65 78 74 20 50 31 20 2a 20 2a 20  : ToText P1 * * 
c0e0: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20  * *.**.** Force 
c0f0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
c100: 69 73 74 65 72 20 50 31 20 74 6f 20 62 65 20 74  ister P1 to be t
c110: 65 78 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 76  ext..** If the v
c120: 61 6c 75 65 20 69 73 20 6e 75 6d 65 72 69 63 2c  alue is numeric,
c130: 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f 20 61   convert it to a
c140: 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20 74 68   string using th
c150: 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  e.** equivalent 
c160: 6f 66 20 70 72 69 6e 74 66 28 29 2e 20 20 42 6c  of printf().  Bl
c170: 6f 62 20 76 61 6c 75 65 73 20 61 72 65 20 75 6e  ob values are un
c180: 63 68 61 6e 67 65 64 20 61 6e 64 0a 2a 2a 20 61  changed and.** a
c190: 72 65 20 61 66 74 65 72 77 61 72 64 73 20 73 69  re afterwards si
c1a0: 6d 70 6c 79 20 69 6e 74 65 72 70 72 65 74 65 64  mply interpreted
c1b0: 20 61 73 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20   as text..**.** 
c1c0: 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20  A NULL value is 
c1d0: 6e 6f 74 20 63 68 61 6e 67 65 64 20 62 79 20 74  not changed by t
c1e0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 49 74  his routine.  It
c1f0: 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a   remains NULL..*
c200: 2f 0a 63 61 73 65 20 4f 50 5f 54 6f 54 65 78 74  /.case OP_ToText
c210: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
c220: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
c230: 54 4b 5f 54 4f 5f 54 45 58 54 2c 20 69 6e 31 20  TK_TO_TEXT, in1 
c240: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
c250: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66  m[pOp->p1];.  if
c260: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20  ( pIn1->flags & 
c270: 4d 45 4d 5f 4e 75 6c 6c 20 29 20 62 72 65 61 6b  MEM_Null ) break
c280: 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d 5f  ;.  assert( MEM_
c290: 53 74 72 3d 3d 28 4d 45 4d 5f 42 6c 6f 62 3e 3e  Str==(MEM_Blob>>
c2a0: 33 29 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c  3) );.  pIn1->fl
c2b0: 61 67 73 20 7c 3d 20 28 70 49 6e 31 2d 3e 66 6c  ags |= (pIn1->fl
c2c0: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 29 3e 3e 33  ags&MEM_Blob)>>3
c2d0: 3b 0a 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74  ;.  applyAffinit
c2e0: 79 28 70 49 6e 31 2c 20 53 51 4c 49 54 45 5f 41  y(pIn1, SQLITE_A
c2f0: 46 46 5f 54 45 58 54 2c 20 65 6e 63 6f 64 69 6e  FF_TEXT, encodin
c300: 67 29 3b 0a 20 20 72 63 20 3d 20 45 78 70 61 6e  g);.  rc = Expan
c310: 64 42 6c 6f 62 28 70 49 6e 31 29 3b 0a 20 20 61  dBlob(pIn1);.  a
c320: 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61  ssert( pIn1->fla
c330: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 7c 7c 20  gs & MEM_Str || 
c340: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c350: 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67   );.  pIn1->flag
c360: 73 20 26 3d 20 7e 28 4d 45 4d 5f 49 6e 74 7c 4d  s &= ~(MEM_Int|M
c370: 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 42 6c 6f 62  EM_Real|MEM_Blob
c380: 7c 4d 45 4d 5f 5a 65 72 6f 29 3b 0a 20 20 55 50  |MEM_Zero);.  UP
c390: 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
c3a0: 45 28 70 49 6e 31 29 3b 0a 20 20 62 72 65 61 6b  E(pIn1);.  break
c3b0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
c3c0: 54 6f 42 6c 6f 62 20 50 31 20 2a 20 2a 20 2a 20  ToBlob P1 * * * 
c3d0: 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20 74 68  *.**.** Force th
c3e0: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
c3f0: 74 65 72 20 50 31 20 74 6f 20 62 65 20 61 20 42  ter P1 to be a B
c400: 4c 4f 42 2e 0a 2a 2a 20 49 66 20 74 68 65 20 76  LOB..** If the v
c410: 61 6c 75 65 20 69 73 20 6e 75 6d 65 72 69 63 2c  alue is numeric,
c420: 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f 20 61   convert it to a
c430: 20 73 74 72 69 6e 67 20 66 69 72 73 74 2e 0a 2a   string first..*
c440: 2a 20 53 74 72 69 6e 67 73 20 61 72 65 20 73 69  * Strings are si
c450: 6d 70 6c 79 20 72 65 69 6e 74 65 72 70 72 65 74  mply reinterpret
c460: 65 64 20 61 73 20 62 6c 6f 62 73 20 77 69 74 68  ed as blobs with
c470: 20 6e 6f 20 63 68 61 6e 67 65 0a 2a 2a 20 74 6f   no change.** to
c480: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
c490: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  data..**.** A NU
c4a0: 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20  LL value is not 
c4b0: 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20  changed by this 
c4c0: 72 6f 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d  routine.  It rem
c4d0: 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61  ains NULL..*/.ca
c4e0: 73 65 20 4f 50 5f 54 6f 42 6c 6f 62 3a 20 7b 20  se OP_ToBlob: { 
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c500: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 54   /* same as TK_T
c510: 4f 5f 42 4c 4f 42 2c 20 69 6e 31 20 2a 2f 0a 20  O_BLOB, in1 */. 
c520: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
c530: 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70 49  p->p1];.  if( pI
c540: 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
c550: 4e 75 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20  Null ) break;.  
c560: 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
c570: 20 26 20 4d 45 4d 5f 42 6c 6f 62 29 3d 3d 30 20   & MEM_Blob)==0 
c580: 29 7b 0a 20 20 20 20 61 70 70 6c 79 41 66 66 69  ){.    applyAffi
c590: 6e 69 74 79 28 70 49 6e 31 2c 20 53 51 4c 49 54  nity(pIn1, SQLIT
c5a0: 45 5f 41 46 46 5f 54 45 58 54 2c 20 65 6e 63 6f  E_AFF_TEXT, enco
c5b0: 64 69 6e 67 29 3b 0a 20 20 20 20 61 73 73 65 72  ding);.    asser
c5c0: 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  t( pIn1->flags &
c5d0: 20 4d 45 4d 5f 53 74 72 20 7c 7c 20 64 62 2d 3e   MEM_Str || db->
c5e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
c5f0: 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
c600: 61 67 28 70 49 6e 31 2c 20 4d 45 4d 5f 42 6c 6f  ag(pIn1, MEM_Blo
c610: 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
c620: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 3d 20   pIn1->flags &= 
c630: 7e 28 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 26 7e  ~(MEM_TypeMask&~
c640: 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 20 20 7d 0a 20  MEM_Blob);.  }. 
c650: 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42   UPDATE_MAX_BLOB
c660: 53 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20 62 72  SIZE(pIn1);.  br
c670: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
c680: 65 3a 20 54 6f 4e 75 6d 65 72 69 63 20 50 31 20  e: ToNumeric P1 
c690: 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f  * * * *.**.** Fo
c6a0: 72 63 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  rce the value in
c6b0: 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20   register P1 to 
c6c0: 62 65 20 6e 75 6d 65 72 69 63 20 28 65 69 74 68  be numeric (eith
c6d0: 65 72 20 61 6e 0a 2a 2a 20 69 6e 74 65 67 65 72  er an.** integer
c6e0: 20 6f 72 20 61 20 66 6c 6f 61 74 69 6e 67 2d 70   or a floating-p
c6f0: 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 29 0a 2a 2a  oint number.).**
c700: 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   If the value is
c710: 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 2c 20 74   text or blob, t
c720: 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 69 74  ry to convert it
c730: 20 74 6f 20 61 6e 20 75 73 69 6e 67 20 74 68 65   to an using the
c740: 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 6f  .** equivalent o
c750: 66 20 61 74 6f 69 28 29 20 6f 72 20 61 74 6f 66  f atoi() or atof
c760: 28 29 20 61 6e 64 20 73 74 6f 72 65 20 30 20 69  () and store 0 i
c770: 66 20 6e 6f 20 73 75 63 68 20 63 6f 6e 76 65 72  f no such conver
c780: 73 69 6f 6e 20 0a 2a 2a 20 69 73 20 70 6f 73 73  sion .** is poss
c790: 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  ible..**.** A NU
c7a0: 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20  LL value is not 
c7b0: 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20  changed by this 
c7c0: 72 6f 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d  routine.  It rem
c7d0: 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61  ains NULL..*/.ca
c7e0: 73 65 20 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 3a  se OP_ToNumeric:
c7f0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
c800: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
c810: 4b 5f 54 4f 5f 4e 55 4d 45 52 49 43 2c 20 69 6e  K_TO_NUMERIC, in
c820: 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61  1 */.  pIn1 = &a
c830: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
c840: 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
c850: 20 26 20 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d   & (MEM_Null|MEM
c860: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 3d  _Int|MEM_Real))=
c870: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
c880: 33 56 64 62 65 4d 65 6d 4e 75 6d 65 72 69 66 79  3VdbeMemNumerify
c890: 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72  (pIn1);.  }.  br
c8a0: 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
c8b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
c8c0: 54 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  T */../* Opcode:
c8d0: 20 54 6f 49 6e 74 20 50 31 20 2a 20 2a 20 2a 20   ToInt P1 * * * 
c8e0: 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20 74 68  *.**.** Force th
c8f0: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
c900: 74 65 72 20 50 31 20 62 65 20 61 6e 20 69 6e 74  ter P1 be an int
c910: 65 67 65 72 2e 20 20 49 66 0a 2a 2a 20 54 68 65  eger.  If.** The
c920: 20 76 61 6c 75 65 20 69 73 20 63 75 72 72 65 6e   value is curren
c930: 74 6c 79 20 61 20 72 65 61 6c 20 6e 75 6d 62 65  tly a real numbe
c940: 72 2c 20 64 72 6f 70 20 69 74 73 20 66 72 61 63  r, drop its frac
c950: 74 69 6f 6e 61 6c 20 70 61 72 74 2e 0a 2a 2a 20  tional part..** 
c960: 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  If the value is 
c970: 74 65 78 74 20 6f 72 20 62 6c 6f 62 2c 20 74 72  text or blob, tr
c980: 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 69 74 20  y to convert it 
c990: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 75 73  to an integer us
c9a0: 69 6e 67 20 74 68 65 0a 2a 2a 20 65 71 75 69 76  ing the.** equiv
c9b0: 61 6c 65 6e 74 20 6f 66 20 61 74 6f 69 28 29 20  alent of atoi() 
c9c0: 61 6e 64 20 73 74 6f 72 65 20 30 20 69 66 20 6e  and store 0 if n
c9d0: 6f 20 73 75 63 68 20 63 6f 6e 76 65 72 73 69 6f  o such conversio
c9e0: 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  n is possible..*
c9f0: 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75  *.** A NULL valu
ca00: 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
ca10: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
ca20: 2e 20 20 49 74 20 72 65 6d 61 69 6e 73 20 4e 55  .  It remains NU
ca30: 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54  LL..*/.case OP_T
ca40: 6f 49 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20  oInt: {         
ca50: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
ca60: 20 61 73 20 54 4b 5f 54 4f 5f 49 4e 54 2c 20 69   as TK_TO_INT, i
ca70: 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
ca80: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
ca90: 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
caa0: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30  s & MEM_Null)==0
cab0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
cac0: 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79  dbeMemIntegerify
cad0: 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72  (pIn1);.  }.  br
cae0: 65 61 6b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  eak;.}..#if !def
caf0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
cb00: 5f 43 41 53 54 29 20 26 26 20 21 64 65 66 69 6e  _CAST) && !defin
cb10: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
cb20: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 2f  LOATING_POINT)./
cb30: 2a 20 4f 70 63 6f 64 65 3a 20 54 6f 52 65 61 6c  * Opcode: ToReal
cb40: 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
cb50: 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75  * Force the valu
cb60: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
cb70: 20 74 6f 20 62 65 20 61 20 66 6c 6f 61 74 69 6e   to be a floatin
cb80: 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 0a  g point number..
cb90: 2a 2a 20 49 66 20 54 68 65 20 76 61 6c 75 65 20  ** If The value 
cba0: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20  is currently an 
cbb0: 69 6e 74 65 67 65 72 2c 20 63 6f 6e 76 65 72 74  integer, convert
cbc0: 20 69 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 76   it..** If the v
cbd0: 61 6c 75 65 20 69 73 20 74 65 78 74 20 6f 72 20  alue is text or 
cbe0: 62 6c 6f 62 2c 20 74 72 79 20 74 6f 20 63 6f 6e  blob, try to con
cbf0: 76 65 72 74 20 69 74 20 74 6f 20 61 6e 20 69 6e  vert it to an in
cc00: 74 65 67 65 72 20 75 73 69 6e 67 20 74 68 65 0a  teger using the.
cc10: 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66  ** equivalent of
cc20: 20 61 74 6f 69 28 29 20 61 6e 64 20 73 74 6f 72   atoi() and stor
cc30: 65 20 30 2e 30 20 69 66 20 6e 6f 20 73 75 63 68  e 0.0 if no such
cc40: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 70   conversion is p
cc50: 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  ossible..**.** A
cc60: 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e   NULL value is n
cc70: 6f 74 20 63 68 61 6e 67 65 64 20 62 79 20 74 68  ot changed by th
cc80: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 49 74 20  is routine.  It 
cc90: 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f  remains NULL..*/
cca0: 0a 63 61 73 65 20 4f 50 5f 54 6f 52 65 61 6c 3a  .case OP_ToReal:
ccb0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
ccc0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
ccd0: 4b 5f 54 4f 5f 52 45 41 4c 2c 20 69 6e 31 20 2a  K_TO_REAL, in1 *
cce0: 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
ccf0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28  [pOp->p1];.  if(
cd00: 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
cd10: 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a  MEM_Null)==0 ){.
cd20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
cd30: 65 6d 52 65 61 6c 69 66 79 28 70 49 6e 31 29 3b  emRealify(pIn1);
cd40: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
cd50: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
cd60: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
cd70: 41 53 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  AST) && !defined
cd80: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
cd90: 41 54 49 4e 47 5f 50 4f 49 4e 54 29 20 2a 2f 0a  ATING_POINT) */.
cda0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 74 20 50  ./* Opcode: Lt P
cdb0: 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
cdc0: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
cdd0: 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74  values in regist
cde0: 65 72 20 50 31 20 61 6e 64 20 50 33 2e 20 20 49  er P1 and P3.  I
cdf0: 66 20 72 65 67 28 50 33 29 3c 72 65 67 28 50 31  f reg(P3)<reg(P1
ce00: 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 74  ) then.** jump t
ce10: 6f 20 61 64 64 72 65 73 73 20 50 32 2e 20 20 0a  o address P2.  .
ce20: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c  **.** If the SQL
ce30: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 62  ITE_JUMPIFNULL b
ce40: 69 74 20 6f 66 20 50 35 20 69 73 20 73 65 74 20  it of P5 is set 
ce50: 61 6e 64 20 65 69 74 68 65 72 20 72 65 67 28 50  and either reg(P
ce60: 31 29 20 6f 72 0a 2a 2a 20 72 65 67 28 50 33 29  1) or.** reg(P3)
ce70: 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 61   is NULL then ta
ce80: 6b 65 20 74 68 65 20 6a 75 6d 70 2e 20 20 49 66  ke the jump.  If
ce90: 20 74 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50   the SQLITE_JUMP
cea0: 49 46 4e 55 4c 4c 20 0a 2a 2a 20 62 69 74 20 69  IFNULL .** bit i
ceb0: 73 20 63 6c 65 61 72 20 74 68 65 6e 20 66 61 6c  s clear then fal
cec0: 6c 20 74 68 72 75 20 69 66 20 65 69 74 68 65 72  l thru if either
ced0: 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c   operand is NULL
cee0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
cef0: 54 45 5f 41 46 46 5f 4d 41 53 4b 20 70 6f 72 74  TE_AFF_MASK port
cf00: 69 6f 6e 20 6f 66 20 50 35 20 6d 75 73 74 20 62  ion of P5 must b
cf10: 65 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68  e an affinity ch
cf20: 61 72 61 63 74 65 72 20 2d 0a 2a 2a 20 53 51 4c  aracter -.** SQL
cf30: 49 54 45 5f 41 46 46 5f 54 45 58 54 2c 20 53 51  ITE_AFF_TEXT, SQ
cf40: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
cf50: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  , and so forth. 
cf60: 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  An attempt is ma
cf70: 64 65 20 0a 2a 2a 20 74 6f 20 63 6f 65 72 63 65  de .** to coerce
cf80: 20 62 6f 74 68 20 69 6e 70 75 74 73 20 61 63 63   both inputs acc
cf90: 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 61  ording to this a
cfa0: 66 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20 74  ffinity before t
cfb0: 68 65 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e  he.** comparison
cfc0: 20 69 73 20 6d 61 64 65 2e 20 49 66 20 74 68 65   is made. If the
cfd0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b   SQLITE_AFF_MASK
cfe0: 20 69 73 20 30 78 30 30 2c 20 74 68 65 6e 20 6e   is 0x00, then n
cff0: 75 6d 65 72 69 63 0a 2a 2a 20 61 66 66 69 6e 69  umeric.** affini
d000: 74 79 20 69 73 20 75 73 65 64 2e 20 4e 6f 74 65  ty is used. Note
d010: 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69   that the affini
d020: 74 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61  ty conversions a
d030: 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 62 61 63  re stored.** bac
d040: 6b 20 69 6e 74 6f 20 74 68 65 20 69 6e 70 75 74  k into the input
d050: 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61 6e   registers P1 an
d060: 64 20 50 33 2e 20 20 53 6f 20 74 68 69 73 20 6f  d P3.  So this o
d070: 70 63 6f 64 65 20 63 61 6e 20 63 61 75 73 65 0a  pcode can cause.
d080: 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 20 63 68  ** persistent ch
d090: 61 6e 67 65 73 20 74 6f 20 72 65 67 69 73 74 65  anges to registe
d0a0: 72 73 20 50 31 20 61 6e 64 20 50 33 2e 0a 2a 2a  rs P1 and P3..**
d0b0: 0a 2a 2a 20 4f 6e 63 65 20 61 6e 79 20 63 6f 6e  .** Once any con
d0c0: 76 65 72 73 69 6f 6e 73 20 68 61 76 65 20 74 61  versions have ta
d0d0: 6b 65 6e 20 70 6c 61 63 65 2c 20 61 6e 64 20 6e  ken place, and n
d0e0: 65 69 74 68 65 72 20 76 61 6c 75 65 20 69 73 20  either value is 
d0f0: 4e 55 4c 4c 2c 20 0a 2a 2a 20 74 68 65 20 76 61  NULL, .** the va
d100: 6c 75 65 73 20 61 72 65 20 63 6f 6d 70 61 72 65  lues are compare
d110: 64 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65  d. If both value
d120: 73 20 61 72 65 20 62 6c 6f 62 73 20 74 68 65 6e  s are blobs then
d130: 20 6d 65 6d 63 6d 70 28 29 20 69 73 0a 2a 2a 20   memcmp() is.** 
d140: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
d150: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
d160: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
d170: 20 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73    If both values
d180: 0a 2a 2a 20 61 72 65 20 74 65 78 74 2c 20 74 68  .** are text, th
d190: 65 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  en the appropria
d1a0: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  te collating fun
d1b0: 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
d1c0: 69 6e 0a 2a 2a 20 50 34 20 69 73 20 20 75 73 65  in.** P4 is  use
d1d0: 64 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70  d to do the comp
d1e0: 61 72 69 73 6f 6e 2e 20 20 49 66 20 50 34 20 69  arison.  If P4 i
d1f0: 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  s not specified 
d200: 74 68 65 6e 0a 2a 2a 20 6d 65 6d 63 6d 70 28 29  then.** memcmp()
d210: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   is used to comp
d220: 61 72 65 20 74 65 78 74 20 73 74 72 69 6e 67 2e  are text string.
d230: 20 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73    If both values
d240: 20 61 72 65 0a 2a 2a 20 6e 75 6d 65 72 69 63 2c   are.** numeric,
d250: 20 74 68 65 6e 20 61 20 6e 75 6d 65 72 69 63 20   then a numeric 
d260: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 75 73  comparison is us
d270: 65 64 2e 20 49 66 20 74 68 65 20 74 77 6f 20 76  ed. If the two v
d280: 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 6f 66 20  alues.** are of 
d290: 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 2c  different types,
d2a0: 20 74 68 65 6e 20 6e 75 6d 62 65 72 73 20 61 72   then numbers ar
d2b0: 65 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 65 73  e considered les
d2c0: 73 20 74 68 61 6e 0a 2a 2a 20 73 74 72 69 6e 67  s than.** string
d2d0: 73 20 61 6e 64 20 73 74 72 69 6e 67 73 20 61 72  s and strings ar
d2e0: 65 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 65 73  e considered les
d2f0: 73 20 74 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2a  s than blobs..**
d300: 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54  .** If the SQLIT
d310: 45 5f 53 54 4f 52 45 50 32 20 62 69 74 20 6f 66  E_STOREP2 bit of
d320: 20 50 35 20 69 73 20 73 65 74 2c 20 74 68 65 6e   P5 is set, then
d330: 20 64 6f 20 6e 6f 74 20 6a 75 6d 70 2e 20 20 49   do not jump.  I
d340: 6e 73 74 65 61 64 2c 0a 2a 2a 20 73 74 6f 72 65  nstead,.** store
d350: 20 61 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c   a boolean resul
d360: 74 20 28 65 69 74 68 65 72 20 30 2c 20 6f 72 20  t (either 0, or 
d370: 31 2c 20 6f 72 20 4e 55 4c 4c 29 20 69 6e 20 72  1, or NULL) in r
d380: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 2f  egister P2..*/./
d390: 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 20 50 31 20  * Opcode: Ne P1 
d3a0: 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
d3b0: 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
d3c0: 74 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70  t like the Lt op
d3d0: 63 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74  code except that
d3e0: 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
d3f0: 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 6f 70 65  en if.** the ope
d400: 72 61 6e 64 73 20 69 6e 20 72 65 67 69 73 74 65  rands in registe
d410: 72 73 20 50 31 20 61 6e 64 20 50 33 20 61 72 65  rs P1 and P3 are
d420: 20 6e 6f 74 20 65 71 75 61 6c 2e 20 20 53 65 65   not equal.  See
d430: 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66   the Lt opcode f
d440: 6f 72 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c  or.** additional
d450: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
d460: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4e 55  .** If SQLITE_NU
d470: 4c 4c 45 51 20 69 73 20 73 65 74 20 69 6e 20 50  LLEQ is set in P
d480: 35 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  5 then the resul
d490: 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
d4a0: 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72  is always either
d4b0: 0a 2a 2a 20 74 72 75 65 20 6f 72 20 66 61 6c 73  .** true or fals
d4c0: 65 20 61 6e 64 20 69 73 20 6e 65 76 65 72 20 4e  e and is never N
d4d0: 55 4c 4c 2e 20 20 49 66 20 62 6f 74 68 20 6f 70  ULL.  If both op
d4e0: 65 72 61 6e 64 73 20 61 72 65 20 4e 55 4c 4c 20  erands are NULL 
d4f0: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a  then the result.
d500: 2a 2a 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ** of comparison
d510: 20 69 73 20 66 61 6c 73 65 2e 20 20 49 66 20 65   is false.  If e
d520: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
d530: 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72   NULL then the r
d540: 65 73 75 6c 74 20 69 73 20 74 72 75 65 2e 0a 2a  esult is true..*
d550: 2a 20 49 66 20 6e 65 69 74 68 65 72 20 6f 70 65  * If neither ope
d560: 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74 68 65  rand is NULL the
d570: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   the result is t
d580: 68 65 20 73 61 6d 65 20 61 73 20 69 74 20 77 6f  he same as it wo
d590: 75 6c 64 20 62 65 20 69 66 0a 2a 2a 20 74 68 65  uld be if.** the
d5a0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 66   SQLITE_NULLEQ f
d5b0: 6c 61 67 20 77 65 72 65 20 6f 6d 69 74 74 65 64  lag were omitted
d5c0: 20 66 72 6f 6d 20 50 35 2e 0a 2a 2f 0a 2f 2a 20   from P5..*/./* 
d5d0: 4f 70 63 6f 64 65 3a 20 45 71 20 50 31 20 50 32  Opcode: Eq P1 P2
d5e0: 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20   P3 P4 P5.**.** 
d5f0: 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20  This works just 
d600: 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f  like the Lt opco
d610: 64 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74  de except that t
d620: 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
d630: 20 69 66 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61   if.** the opera
d640: 6e 64 73 20 69 6e 20 72 65 67 69 73 74 65 72 73  nds in registers
d650: 20 50 31 20 61 6e 64 20 50 33 20 61 72 65 20 65   P1 and P3 are e
d660: 71 75 61 6c 2e 0a 2a 2a 20 53 65 65 20 74 68 65  qual..** See the
d670: 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20 61   Lt opcode for a
d680: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
d690: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
d6a0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73  SQLITE_NULLEQ is
d6b0: 20 73 65 74 20 69 6e 20 50 35 20 74 68 65 6e 20   set in P5 then 
d6c0: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  the result of co
d6d0: 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 6c 77 61  mparison is alwa
d6e0: 79 73 20 65 69 74 68 65 72 0a 2a 2a 20 74 72 75  ys either.** tru
d6f0: 65 20 6f 72 20 66 61 6c 73 65 20 61 6e 64 20 69  e or false and i
d700: 73 20 6e 65 76 65 72 20 4e 55 4c 4c 2e 20 20 49  s never NULL.  I
d710: 66 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20  f both operands 
d720: 61 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68  are NULL then th
d730: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 66 20 63  e result.** of c
d740: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 72 75  omparison is tru
d750: 65 2e 20 20 49 66 20 65 69 74 68 65 72 20 6f 70  e.  If either op
d760: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74 68  erand is NULL th
d770: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
d780: 20 66 61 6c 73 65 2e 0a 2a 2a 20 49 66 20 6e 65   false..** If ne
d790: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
d7a0: 20 4e 55 4c 4c 20 74 68 65 20 74 68 65 20 72 65   NULL the the re
d7b0: 73 75 6c 74 20 69 73 20 74 68 65 20 73 61 6d 65  sult is the same
d7c0: 20 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20   as it would be 
d7d0: 69 66 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  if.** the SQLITE
d7e0: 5f 4e 55 4c 4c 45 51 20 66 6c 61 67 20 77 65 72  _NULLEQ flag wer
d7f0: 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 50  e omitted from P
d800: 35 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  5..*/./* Opcode:
d810: 20 4c 65 20 50 31 20 50 32 20 50 33 20 50 34 20   Le P1 P2 P3 P4 
d820: 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  P5.**.** This wo
d830: 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68  rks just like th
d840: 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65  e Lt opcode exce
d850: 70 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70  pt that the jump
d860: 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20   is taken if.** 
d870: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72  the content of r
d880: 65 67 69 73 74 65 72 20 50 33 20 69 73 20 6c 65  egister P3 is le
d890: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
d8a0: 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   to the content 
d8b0: 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50  of.** register P
d8c0: 31 2e 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f  1.  See the Lt o
d8d0: 70 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69  pcode for additi
d8e0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
d8f0: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
d900: 47 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50  Gt P1 P2 P3 P4 P
d910: 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  5.**.** This wor
d920: 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65  ks just like the
d930: 20 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70   Lt opcode excep
d940: 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20  t that the jump 
d950: 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74  is taken if.** t
d960: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65  he content of re
d970: 67 69 73 74 65 72 20 50 33 20 69 73 20 67 72 65  gister P3 is gre
d980: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 6f  ater than the co
d990: 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69  ntent of.** regi
d9a0: 73 74 65 72 20 50 31 2e 20 20 53 65 65 20 74 68  ster P1.  See th
d9b0: 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20  e Lt opcode for 
d9c0: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
d9d0: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70  mation..*/./* Op
d9e0: 63 6f 64 65 3a 20 47 65 20 50 31 20 50 32 20 50  code: Ge P1 P2 P
d9f0: 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68  3 P4 P5.**.** Th
da00: 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  is works just li
da10: 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65  ke the Lt opcode
da20: 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
da30: 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69   jump is taken i
da40: 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  f.** the content
da50: 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20   of register P3 
da60: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
da70: 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
da80: 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65  content of.** re
da90: 67 69 73 74 65 72 20 50 31 2e 20 20 53 65 65 20  gister P1.  See 
daa0: 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f  the Lt opcode fo
dab0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
dac0: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73  ormation..*/.cas
dad0: 65 20 4f 50 5f 45 71 3a 20 20 20 20 20 20 20 20  e OP_Eq:        
dae0: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
daf0: 73 20 54 4b 5f 45 51 2c 20 6a 75 6d 70 2c 20 69  s TK_EQ, jump, i
db00: 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20  n1, in3 */.case 
db10: 4f 50 5f 4e 65 3a 20 20 20 20 20 20 20 20 20 20  OP_Ne:          
db20: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
db30: 54 4b 5f 4e 45 2c 20 6a 75 6d 70 2c 20 69 6e 31  TK_NE, jump, in1
db40: 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
db50: 5f 4c 74 3a 20 20 20 20 20 20 20 20 20 20 20 20  _Lt:            
db60: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
db70: 5f 4c 54 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20  _LT, jump, in1, 
db80: 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c  in3 */.case OP_L
db90: 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e:              
dba0: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c   /* same as TK_L
dbb0: 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e  E, jump, in1, in
dbc0: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 74 3a  3 */.case OP_Gt:
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dbe0: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 47 54 2c  * same as TK_GT,
dbf0: 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20   jump, in1, in3 
dc00: 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 65 3a 20 7b  */.case OP_Ge: {
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dc20: 73 61 6d 65 20 61 73 20 54 4b 5f 47 45 2c 20 6a  same as TK_GE, j
dc30: 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f  ump, in1, in3 */
dc40: 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20  .  int res;     
dc50: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
dc60: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
dc70: 6f 6e 20 6f 66 20 70 49 6e 31 20 61 67 61 69 6e  on of pIn1 again
dc80: 73 74 20 70 49 6e 33 20 2a 2f 0a 20 20 63 68 61  st pIn3 */.  cha
dc90: 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20  r affinity;     
dca0: 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 74 6f 20   /* Affinity to 
dcb0: 75 73 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  use for comparis
dcc0: 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67  on */.  u16 flag
dcd0: 73 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  s1;         /* C
dce0: 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 20 76  opy of initial v
dcf0: 61 6c 75 65 20 6f 66 20 70 49 6e 31 2d 3e 66 6c  alue of pIn1->fl
dd00: 61 67 73 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61  ags */.  u16 fla
dd10: 67 73 33 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gs3;         /* 
dd20: 43 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 20  Copy of initial 
dd30: 76 61 6c 75 65 20 6f 66 20 70 49 6e 33 2d 3e 66  value of pIn3->f
dd40: 6c 61 67 73 20 2a 2f 0a 0a 20 20 70 49 6e 31 20  lags */..  pIn1 
dd50: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
dd60: 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d  ;.  pIn3 = &aMem
dd70: 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 66 6c 61  [pOp->p3];.  fla
dd80: 67 73 31 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67  gs1 = pIn1->flag
dd90: 73 3b 0a 20 20 66 6c 61 67 73 33 20 3d 20 70 49  s;.  flags3 = pI
dda0: 6e 33 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28  n3->flags;.  if(
ddb0: 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20   (pIn1->flags | 
ddc0: 70 49 6e 33 2d 3e 66 6c 61 67 73 29 26 4d 45 4d  pIn3->flags)&MEM
ddd0: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2f 2a 20  _Null ){.    /* 
dde0: 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 70 65 72  One or both oper
ddf0: 61 6e 64 73 20 61 72 65 20 4e 55 4c 4c 20 2a 2f  ands are NULL */
de00: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35  .    if( pOp->p5
de10: 20 26 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   & SQLITE_NULLEQ
de20: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
de30: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73  SQLITE_NULLEQ is
de40: 20 73 65 74 20 28 77 68 69 63 68 20 77 69 6c 6c   set (which will
de50: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
de60: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 0a  the operator is.
de70: 20 20 20 20 20 20 2a 2a 20 4f 50 5f 45 71 20 6f        ** OP_Eq o
de80: 72 20 4f 50 5f 4e 65 29 20 74 68 65 6e 20 74 61  r OP_Ne) then ta
de90: 6b 65 20 74 68 65 20 6a 75 6d 70 20 6f 72 20 6e  ke the jump or n
dea0: 6f 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ot depending on 
deb0: 77 68 65 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  whether.      **
dec0: 20 6f 72 20 6e 6f 74 20 62 6f 74 68 20 6f 70 65   or not both ope
ded0: 72 61 6e 64 73 20 61 72 65 20 6e 75 6c 6c 2e 0a  rands are null..
dee0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
def0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
df00: 64 65 3d 3d 4f 50 5f 45 71 20 7c 7c 20 70 4f 70  de==OP_Eq || pOp
df10: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20  ->opcode==OP_Ne 
df20: 29 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 28  );.      res = (
df30: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 70 49  pIn1->flags & pI
df40: 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n3->flags & MEM_
df50: 4e 75 6c 6c 29 3d 3d 30 3b 0a 20 20 20 20 7d 65  Null)==0;.    }e
df60: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 51  lse{.      /* SQ
df70: 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 63  LITE_NULLEQ is c
df80: 6c 65 61 72 20 61 6e 64 20 61 74 20 6c 65 61 73  lear and at leas
df90: 74 20 6f 6e 65 20 6f 70 65 72 61 6e 64 20 69 73  t one operand is
dfa0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 2a 2a 20   NULL,.      ** 
dfb0: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
dfc0: 69 73 20 61 6c 77 61 79 73 20 4e 55 4c 4c 2e 0a  is always NULL..
dfd0: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 6d        ** The jum
dfe0: 70 20 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68  p is taken if th
dff0: 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  e SQLITE_JUMPIFN
e000: 55 4c 4c 20 62 69 74 20 69 73 20 73 65 74 2e 0a  ULL bit is set..
e010: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
e020: 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  f( pOp->p5 & SQL
e030: 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20  ITE_STOREP2 ){. 
e040: 20 20 20 20 20 20 20 70 4f 75 74 20 3d 20 26 61         pOut = &a
e050: 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
e060: 20 20 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65        MemSetType
e070: 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 4e  Flag(pOut, MEM_N
e080: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 52 45  ull);.        RE
e090: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
e0a0: 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20 20  ->p2, pOut);.   
e0b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
e0c0: 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4a 55  ->p5 & SQLITE_JU
e0d0: 4d 50 49 46 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  MPIFNULL ){.    
e0e0: 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
e0f0: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
e100: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e110: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e   }else{.    /* N
e120: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
e130: 73 20 4e 55 4c 4c 2e 20 20 44 6f 20 61 20 63 6f  s NULL.  Do a co
e140: 6d 70 61 72 69 73 6f 6e 2e 20 2a 2f 0a 20 20 20  mparison. */.   
e150: 20 61 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d   affinity = pOp-
e160: 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 41 46 46  >p5 & SQLITE_AFF
e170: 5f 4d 41 53 4b 3b 0a 20 20 20 20 69 66 28 20 61  _MASK;.    if( a
e180: 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
e190: 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70   applyAffinity(p
e1a0: 49 6e 31 2c 20 61 66 66 69 6e 69 74 79 2c 20 65  In1, affinity, e
e1b0: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 20 20  ncoding);.      
e1c0: 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49  applyAffinity(pI
e1d0: 6e 33 2c 20 61 66 66 69 6e 69 74 79 2c 20 65 6e  n3, affinity, en
e1e0: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 69  coding);.      i
e1f0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
e200: 6c 65 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  led ) goto no_me
e210: 6d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  m;.    }..    as
e220: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
e230: 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51 20 7c 7c  e==P4_COLLSEQ ||
e240: 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3d 3d   pOp->p4.pColl==
e250: 30 20 29 3b 0a 20 20 20 20 45 78 70 61 6e 64 42  0 );.    ExpandB
e260: 6c 6f 62 28 70 49 6e 31 29 3b 0a 20 20 20 20 45  lob(pIn1);.    E
e270: 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 33 29 3b  xpandBlob(pIn3);
e280: 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74  .    res = sqlit
e290: 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 49 6e  e3MemCompare(pIn
e2a0: 33 2c 20 70 49 6e 31 2c 20 70 4f 70 2d 3e 70 34  3, pIn1, pOp->p4
e2b0: 2e 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73  .pColl);.  }.  s
e2c0: 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f  witch( pOp->opco
e2d0: 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4f  de ){.    case O
e2e0: 50 5f 45 71 3a 20 20 20 20 72 65 73 20 3d 20 72  P_Eq:    res = r
e2f0: 65 73 3d 3d 30 3b 20 20 20 20 20 62 72 65 61 6b  es==0;     break
e300: 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65  ;.    case OP_Ne
e310: 3a 20 20 20 20 72 65 73 20 3d 20 72 65 73 21 3d  :    res = res!=
e320: 30 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  0;     break;.  
e330: 20 20 63 61 73 65 20 4f 50 5f 4c 74 3a 20 20 20    case OP_Lt:   
e340: 20 72 65 73 20 3d 20 72 65 73 3c 30 3b 20 20 20   res = res<0;   
e350: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
e360: 73 65 20 4f 50 5f 4c 65 3a 20 20 20 20 72 65 73  se OP_Le:    res
e370: 20 3d 20 72 65 73 3c 3d 30 3b 20 20 20 20 20 62   = res<=0;     b
e380: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f  reak;.    case O
e390: 50 5f 47 74 3a 20 20 20 20 72 65 73 20 3d 20 72  P_Gt:    res = r
e3a0: 65 73 3e 30 3b 20 20 20 20 20 20 62 72 65 61 6b  es>0;      break
e3b0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
e3c0: 20 20 20 20 20 72 65 73 20 3d 20 72 65 73 3e 3d       res = res>=
e3d0: 30 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  0;     break;.  
e3e0: 7d 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35  }..  if( pOp->p5
e3f0: 20 26 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50   & SQLITE_STOREP
e400: 32 20 29 7b 0a 20 20 20 20 70 4f 75 74 20 3d 20  2 ){.    pOut = 
e410: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
e420: 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
e430: 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74  ag(pOut, MEM_Int
e440: 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69  );.    pOut->u.i
e450: 20 3d 20 72 65 73 3b 0a 20 20 20 20 52 45 47 49   = res;.    REGI
e460: 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
e470: 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20 7d 65 6c  p2, pOut);.  }el
e480: 73 65 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20  se if( res ){.  
e490: 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31    pc = pOp->p2-1
e4a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 64 6f  ;.  }..  /* Undo
e4b0: 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64   any changes mad
e4c0: 65 20 62 79 20 61 70 70 6c 79 41 66 66 69 6e 69  e by applyAffini
e4d0: 74 79 28 29 20 74 6f 20 74 68 65 20 69 6e 70 75  ty() to the inpu
e4e0: 74 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a  t registers. */.
e4f0: 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20    pIn1->flags = 
e500: 28 70 49 6e 31 2d 3e 66 6c 61 67 73 26 7e 4d 45  (pIn1->flags&~ME
e510: 4d 5f 54 79 70 65 4d 61 73 6b 29 20 7c 20 28 66  M_TypeMask) | (f
e520: 6c 61 67 73 31 26 4d 45 4d 5f 54 79 70 65 4d 61  lags1&MEM_TypeMa
e530: 73 6b 29 3b 0a 20 20 70 49 6e 33 2d 3e 66 6c 61  sk);.  pIn3->fla
e540: 67 73 20 3d 20 28 70 49 6e 33 2d 3e 66 6c 61 67  gs = (pIn3->flag
e550: 73 26 7e 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29  s&~MEM_TypeMask)
e560: 20 7c 20 28 66 6c 61 67 73 33 26 4d 45 4d 5f 54   | (flags3&MEM_T
e570: 79 70 65 4d 61 73 6b 29 3b 0a 20 20 62 72 65 61  ypeMask);.  brea
e580: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
e590: 20 50 65 72 6d 75 74 61 74 69 6f 6e 20 2a 20 2a   Permutation * *
e5a0: 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 53 65   * P4 *.**.** Se
e5b0: 74 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f  t the permutatio
e5c0: 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 4f 50  n used by the OP
e5d0: 5f 43 6f 6d 70 61 72 65 20 6f 70 65 72 61 74 6f  _Compare operato
e5e0: 72 20 74 6f 20 62 65 20 74 68 65 20 61 72 72 61  r to be the arra
e5f0: 79 0a 2a 2a 20 6f 66 20 69 6e 74 65 67 65 72 73  y.** of integers
e600: 20 69 6e 20 50 34 2e 0a 2a 2a 0a 2a 2a 20 54 68   in P4..**.** Th
e610: 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 69 73  e permutation is
e620: 20 6f 6e 6c 79 20 76 61 6c 69 64 20 75 6e 74 69   only valid unti
e630: 6c 20 74 68 65 20 6e 65 78 74 20 4f 50 5f 50 65  l the next OP_Pe
e640: 72 6d 75 74 61 74 69 6f 6e 2c 20 4f 50 5f 43 6f  rmutation, OP_Co
e650: 6d 70 61 72 65 2c 0a 2a 2a 20 4f 50 5f 48 61 6c  mpare,.** OP_Hal
e660: 74 2c 20 6f 72 20 4f 50 5f 52 65 73 75 6c 74 52  t, or OP_ResultR
e670: 6f 77 2e 20 20 54 79 70 69 63 61 6c 6c 79 20 74  ow.  Typically t
e680: 68 65 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f  he OP_Permutatio
e690: 6e 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 0a 2a  n should occur.*
e6a0: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 70 72  * immediately pr
e6b0: 69 6f 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f  ior to the OP_Co
e6c0: 6d 70 61 72 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  mpare..*/.case O
e6d0: 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 3a 20 7b  P_Permutation: {
e6e0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
e6f0: 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 41 52  p4type==P4_INTAR
e700: 52 41 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RAY );.  assert(
e710: 20 70 4f 70 2d 3e 70 34 2e 61 69 20 29 3b 0a 20   pOp->p4.ai );. 
e720: 20 61 50 65 72 6d 75 74 65 20 3d 20 70 4f 70 2d   aPermute = pOp-
e730: 3e 70 34 2e 61 69 3b 0a 20 20 62 72 65 61 6b 3b  >p4.ai;.  break;
e740: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  .}../* Opcode: C
e750: 6f 6d 70 61 72 65 20 50 31 20 50 32 20 50 33 20  ompare P1 P2 P3 
e760: 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61  P4 *.**.** Compa
e770: 72 65 20 74 6f 20 76 65 63 74 6f 72 73 20 6f 66  re to vectors of
e780: 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 72 65   registers in re
e790: 67 28 50 31 29 2e 2e 72 65 67 28 50 31 2b 50 33  g(P1)..reg(P1+P3
e7a0: 2d 31 29 20 28 61 6c 6c 20 74 68 69 73 0a 2a 2a  -1) (all this.**
e7b0: 20 6f 6e 65 20 22 41 22 29 20 61 6e 64 20 69 6e   one "A") and in
e7c0: 20 72 65 67 28 50 32 29 2e 2e 72 65 67 28 50 32   reg(P2)..reg(P2
e7d0: 2b 50 33 2d 31 29 20 28 22 42 22 29 2e 20 20 53  +P3-1) ("B").  S
e7e0: 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f  ave the result o
e7f0: 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69  f.** the compari
e800: 73 6f 6e 20 66 6f 72 20 75 73 65 20 62 79 20 74  son for use by t
e810: 68 65 20 6e 65 78 74 20 4f 50 5f 4a 75 6d 70 20  he next OP_Jump 
e820: 69 6e 73 74 72 75 63 74 2e 0a 2a 2a 0a 2a 2a 20  instruct..**.** 
e830: 50 34 20 69 73 20 61 20 4b 65 79 49 6e 66 6f 20  P4 is a KeyInfo 
e840: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
e850: 65 66 69 6e 65 73 20 63 6f 6c 6c 61 74 69 6e 67  efines collating
e860: 20 73 65 71 75 65 6e 63 65 73 20 61 6e 64 20 73   sequences and s
e870: 6f 72 74 0a 2a 2a 20 6f 72 64 65 72 73 20 66 6f  ort.** orders fo
e880: 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  r the comparison
e890: 2e 20 20 54 68 65 20 70 65 72 6d 75 74 61 74 69  .  The permutati
e8a0: 6f 6e 20 61 70 70 6c 69 65 73 20 74 6f 20 72 65  on applies to re
e8b0: 67 69 73 74 65 72 73 0a 2a 2a 20 6f 6e 6c 79 2e  gisters.** only.
e8c0: 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 65 6c    The KeyInfo el
e8d0: 65 6d 65 6e 74 73 20 61 72 65 20 75 73 65 64 20  ements are used 
e8e0: 73 65 71 75 65 6e 74 69 61 6c 6c 79 2e 0a 2a 2a  sequentially..**
e8f0: 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73  .** The comparis
e900: 6f 6e 20 69 73 20 61 20 73 6f 72 74 20 63 6f 6d  on is a sort com
e910: 70 61 72 69 73 6f 6e 2c 20 73 6f 20 4e 55 4c 4c  parison, so NULL
e920: 73 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 2c  s compare equal,
e930: 0a 2a 2a 20 4e 55 4c 4c 73 20 61 72 65 20 6c 65  .** NULLs are le
e940: 73 73 20 74 68 61 6e 20 6e 75 6d 62 65 72 73 2c  ss than numbers,
e950: 20 6e 75 6d 62 65 72 73 20 61 72 65 20 6c 65 73   numbers are les
e960: 73 20 74 68 61 6e 20 73 74 72 69 6e 67 73 2c 0a  s than strings,.
e970: 2a 2a 20 61 6e 64 20 73 74 72 69 6e 67 73 20 61  ** and strings a
e980: 72 65 20 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f  re less than blo
e990: 62 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  bs..*/.case OP_C
e9a0: 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 69 6e 74 20  ompare: {.  int 
e9b0: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
e9c0: 74 20 70 31 3b 0a 20 20 69 6e 74 20 70 32 3b 0a  t p1;.  int p2;.
e9d0: 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20    const KeyInfo 
e9e0: 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74  *pKeyInfo;.  int
e9f0: 20 69 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20   idx;.  CollSeq 
ea00: 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 43 6f  *pColl;    /* Co
ea10: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
ea20: 20 74 6f 20 75 73 65 20 6f 6e 20 74 68 69 73 20   to use on this 
ea30: 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 52  term */.  int bR
ea40: 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
ea50: 54 72 75 65 20 66 6f 72 20 44 45 53 43 45 4e 44  True for DESCEND
ea60: 49 4e 47 20 73 6f 72 74 20 6f 72 64 65 72 20 2a  ING sort order *
ea70: 2f 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33  /..  n = pOp->p3
ea80: 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ;.  pKeyInfo = p
ea90: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
eaa0: 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29  .  assert( n>0 )
eab0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
eac0: 49 6e 66 6f 21 3d 30 20 29 3b 0a 20 20 70 31 20  Info!=0 );.  p1 
ead0: 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 32 20  = pOp->p1;.  p2 
eae0: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 23 69 66 20 53  = pOp->p2;.#if S
eaf0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
eb00: 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20  ( aPermute ){.  
eb10: 20 20 69 6e 74 20 6b 2c 20 6d 78 20 3d 20 30 3b    int k, mx = 0;
eb20: 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  .    for(k=0; k<
eb30: 6e 3b 20 6b 2b 2b 29 20 69 66 28 20 61 50 65 72  n; k++) if( aPer
eb40: 6d 75 74 65 5b 6b 5d 3e 6d 78 20 29 20 6d 78 20  mute[k]>mx ) mx 
eb50: 3d 20 61 50 65 72 6d 75 74 65 5b 6b 5d 3b 0a 20  = aPermute[k];. 
eb60: 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 30 20     assert( p1>0 
eb70: 26 26 20 70 31 2b 6d 78 3c 3d 70 2d 3e 6e 4d 65  && p1+mx<=p->nMe
eb80: 6d 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  m+1 );.    asser
eb90: 74 28 20 70 32 3e 30 20 26 26 20 70 32 2b 6d 78  t( p2>0 && p2+mx
eba0: 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 20  <=p->nMem+1 );. 
ebb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
ebc0: 72 74 28 20 70 31 3e 30 20 26 26 20 70 31 2b 6e  rt( p1>0 && p1+n
ebd0: 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 20  <=p->nMem+1 );. 
ebe0: 20 20 20 61 73 73 65 72 74 28 20 70 32 3e 30 20     assert( p2>0 
ebf0: 26 26 20 70 32 2b 6e 3c 3d 70 2d 3e 6e 4d 65 6d  && p2+n<=p->nMem
ec00: 2b 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  +1 );.  }.#endif
ec10: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
ec20: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
ec30: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 64  <n; i++){.    id
ec40: 78 20 3d 20 61 50 65 72 6d 75 74 65 20 3f 20 61  x = aPermute ? a
ec50: 50 65 72 6d 75 74 65 5b 69 5d 20 3a 20 69 3b 0a  Permute[i] : i;.
ec60: 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
ec70: 43 45 28 70 31 2b 69 64 78 2c 20 26 61 4d 65 6d  CE(p1+idx, &aMem
ec80: 5b 70 31 2b 69 64 78 5d 29 3b 0a 20 20 20 20 52  [p1+idx]);.    R
ec90: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 32  EGISTER_TRACE(p2
eca0: 2b 69 64 78 2c 20 26 61 4d 65 6d 5b 70 32 2b 69  +idx, &aMem[p2+i
ecb0: 64 78 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dx]);.    assert
ecc0: 28 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  ( i<pKeyInfo->nF
ecd0: 69 65 6c 64 20 29 3b 0a 20 20 20 20 70 43 6f 6c  ield );.    pCol
ece0: 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
ecf0: 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 62 52 65 76  oll[i];.    bRev
ed00: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f   = pKeyInfo->aSo
ed10: 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20  rtOrder[i];.    
ed20: 69 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74  iCompare = sqlit
ed30: 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 61 4d  e3MemCompare(&aM
ed40: 65 6d 5b 70 31 2b 69 64 78 5d 2c 20 26 61 4d 65  em[p1+idx], &aMe
ed50: 6d 5b 70 32 2b 69 64 78 5d 2c 20 70 43 6f 6c 6c  m[p2+idx], pColl
ed60: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6d 70  );.    if( iComp
ed70: 61 72 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  are ){.      if(
ed80: 20 62 52 65 76 20 29 20 69 43 6f 6d 70 61 72 65   bRev ) iCompare
ed90: 20 3d 20 2d 69 43 6f 6d 70 61 72 65 3b 0a 20 20   = -iCompare;.  
eda0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
edb0: 0a 20 20 7d 0a 20 20 61 50 65 72 6d 75 74 65 20  .  }.  aPermute 
edc0: 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  = 0;.  break;.}.
edd0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4a 75 6d 70  ./* Opcode: Jump
ede0: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
edf0: 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20  .** Jump to the 
ee00: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20 61  instruction at a
ee10: 64 64 72 65 73 73 20 50 31 2c 20 50 32 2c 20 6f  ddress P1, P2, o
ee20: 72 20 50 33 20 64 65 70 65 6e 64 69 6e 67 20 6f  r P3 depending o
ee30: 6e 20 77 68 65 74 68 65 72 0a 2a 2a 20 69 6e 20  n whether.** in 
ee40: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
ee50: 4f 50 5f 43 6f 6d 70 61 72 65 20 69 6e 73 74 72  OP_Compare instr
ee60: 75 63 74 69 6f 6e 20 74 68 65 20 50 31 20 76 65  uction the P1 ve
ee70: 63 74 6f 72 20 77 61 73 20 6c 65 73 73 20 74 68  ctor was less th
ee80: 61 6e 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20  an.** equal to, 
ee90: 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
eea0: 74 68 65 20 50 32 20 76 65 63 74 6f 72 2c 20 72  the P2 vector, r
eeb0: 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a  espectively..*/.
eec0: 63 61 73 65 20 4f 50 5f 4a 75 6d 70 3a 20 7b 20  case OP_Jump: { 
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
eee0: 75 6d 70 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f  ump */.  if( iCo
eef0: 6d 70 61 72 65 3c 30 20 29 7b 0a 20 20 20 20 70  mpare<0 ){.    p
ef00: 63 20 3d 20 70 4f 70 2d 3e 70 31 20 2d 20 31 3b  c = pOp->p1 - 1;
ef10: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f  .  }else if( iCo
ef20: 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mpare==0 ){.    
ef30: 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
ef40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
ef50: 63 20 3d 20 70 4f 70 2d 3e 70 33 20 2d 20 31 3b  c = pOp->p3 - 1;
ef60: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
ef70: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 6e 64 20  ./* Opcode: And 
ef80: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
ef90: 2a 2a 20 54 61 6b 65 20 74 68 65 20 6c 6f 67 69  ** Take the logi
efa0: 63 61 6c 20 41 4e 44 20 6f 66 20 74 68 65 20 76  cal AND of the v
efb0: 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65  alues in registe
efc0: 72 73 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64  rs P1 and P2 and
efd0: 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 72 65  .** write the re
efe0: 73 75 6c 74 20 69 6e 74 6f 20 72 65 67 69 73 74  sult into regist
eff0: 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  er P3..**.** If 
f000: 65 69 74 68 65 72 20 50 31 20 6f 72 20 50 32 20  either P1 or P2 
f010: 69 73 20 30 20 28 66 61 6c 73 65 29 20 74 68 65  is 0 (false) the
f020: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
f030: 30 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  0 even if.** the
f040: 20 6f 74 68 65 72 20 69 6e 70 75 74 20 69 73 20   other input is 
f050: 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c 20 61 6e  NULL.  A NULL an
f060: 64 20 74 72 75 65 20 6f 72 20 74 77 6f 20 4e 55  d true or two NU
f070: 4c 4c 73 20 67 69 76 65 0a 2a 2a 20 61 20 4e 55  LLs give.** a NU
f080: 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 2f 2a  LL output..*/./*
f090: 20 4f 70 63 6f 64 65 3a 20 4f 72 20 50 31 20 50   Opcode: Or P1 P
f0a0: 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  2 P3 * *.**.** T
f0b0: 61 6b 65 20 74 68 65 20 6c 6f 67 69 63 61 6c 20  ake the logical 
f0c0: 4f 52 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73  OR of the values
f0d0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
f0e0: 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73 74  and P2 and.** st
f0f0: 6f 72 65 20 74 68 65 20 61 6e 73 77 65 72 20 69  ore the answer i
f100: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
f110: 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 50  *.** If either P
f120: 31 20 6f 72 20 50 32 20 69 73 20 6e 6f 6e 7a 65  1 or P2 is nonze
f130: 72 6f 20 28 74 72 75 65 29 20 74 68 65 6e 20 74  ro (true) then t
f140: 68 65 20 72 65 73 75 6c 74 20 69 73 20 31 20 28  he result is 1 (
f150: 74 72 75 65 29 0a 2a 2a 20 65 76 65 6e 20 69 66  true).** even if
f160: 20 74 68 65 20 6f 74 68 65 72 20 69 6e 70 75 74   the other input
f170: 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c   is NULL.  A NUL
f180: 4c 20 61 6e 64 20 66 61 6c 73 65 20 6f 72 20 74  L and false or t
f190: 77 6f 20 4e 55 4c 4c 73 0a 2a 2a 20 67 69 76 65  wo NULLs.** give
f1a0: 20 61 20 4e 55 4c 4c 20 6f 75 74 70 75 74 2e 0a   a NULL output..
f1b0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 6e 64 3a 20  */.case OP_And: 
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f1d0: 73 61 6d 65 20 61 73 20 54 4b 5f 41 4e 44 2c 20  same as TK_AND, 
f1e0: 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a  in1, in2, out3 *
f1f0: 2f 0a 63 61 73 65 20 4f 50 5f 4f 72 3a 20 7b 20  /.case OP_Or: { 
f200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
f210: 61 6d 65 20 61 73 20 54 4b 5f 4f 52 2c 20 69 6e  ame as TK_OR, in
f220: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
f230: 20 20 69 6e 74 20 76 31 3b 20 20 20 20 2f 2a 20    int v1;    /* 
f240: 4c 65 66 74 20 6f 70 65 72 61 6e 64 3a 20 20 30  Left operand:  0
f250: 3d 3d 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55 45  ==FALSE, 1==TRUE
f260: 2c 20 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20  , 2==UNKNOWN or 
f270: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 76 32  NULL */.  int v2
f280: 3b 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70  ;    /* Right op
f290: 65 72 61 6e 64 3a 20 30 3d 3d 46 41 4c 53 45 2c  erand: 0==FALSE,
f2a0: 20 31 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e 4b   1==TRUE, 2==UNK
f2b0: 4e 4f 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  NOWN or NULL */.
f2c0: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
f2d0: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20  pOp->p1];.  if( 
f2e0: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
f2f0: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 76 31  M_Null ){.    v1
f300: 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 2;.  }else{. 
f310: 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56     v1 = sqlite3V
f320: 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31  dbeIntValue(pIn1
f330: 29 21 3d 30 3b 0a 20 20 7d 0a 20 20 70 49 6e 32  )!=0;.  }.  pIn2
f340: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
f350: 5d 3b 0a 20 20 69 66 28 20 70 49 6e 32 2d 3e 66  ];.  if( pIn2->f
f360: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
f370: 29 7b 0a 20 20 20 20 76 32 20 3d 20 32 3b 0a 20  ){.    v2 = 2;. 
f380: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 32 20 3d   }else{.    v2 =
f390: 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56   sqlite3VdbeIntV
f3a0: 61 6c 75 65 28 70 49 6e 32 29 21 3d 30 3b 0a 20  alue(pIn2)!=0;. 
f3b0: 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70   }.  if( pOp->op
f3c0: 63 6f 64 65 3d 3d 4f 50 5f 41 6e 64 20 29 7b 0a  code==OP_And ){.
f3d0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
f3e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
f3f0: 6e 64 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20 30  nd_logic[] = { 0
f400: 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 32 2c  , 0, 0, 0, 1, 2,
f410: 20 30 2c 20 32 2c 20 32 20 7d 3b 0a 20 20 20 20   0, 2, 2 };.    
f420: 76 31 20 3d 20 61 6e 64 5f 6c 6f 67 69 63 5b 76  v1 = and_logic[v
f430: 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d 65 6c 73 65  1*3+v2];.  }else
f440: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
f450: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
f460: 20 6f 72 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20   or_logic[] = { 
f470: 30 2c 20 31 2c 20 32 2c 20 31 2c 20 31 2c 20 31  0, 1, 2, 1, 1, 1
f480: 2c 20 32 2c 20 31 2c 20 32 20 7d 3b 0a 20 20 20  , 2, 1, 2 };.   
f490: 20 76 31 20 3d 20 6f 72 5f 6c 6f 67 69 63 5b 76   v1 = or_logic[v
f4a0: 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d 0a 20 20 70  1*3+v2];.  }.  p
f4b0: 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
f4c0: 3e 70 33 5d 3b 0a 20 20 69 66 28 20 76 31 3d 3d  >p3];.  if( v1==
f4d0: 32 20 29 7b 0a 20 20 20 20 4d 65 6d 53 65 74 54  2 ){.    MemSetT
f4e0: 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45  ypeFlag(pOut, ME
f4f0: 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65  M_Null);.  }else
f500: 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20  {.    pOut->u.i 
f510: 3d 20 76 31 3b 0a 20 20 20 20 4d 65 6d 53 65 74  = v1;.    MemSet
f520: 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d  TypeFlag(pOut, M
f530: 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 20 20 62  EM_Int);.  }.  b
f540: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
f550: 64 65 3a 20 4e 6f 74 20 50 31 20 50 32 20 2a 20  de: Not P1 P2 * 
f560: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70  * *.**.** Interp
f570: 72 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ret the value in
f580: 20 72 65 67 69 73 74 65 72 20 50 31 20 61 73 20   register P1 as 
f590: 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e  a boolean value.
f5a0: 20 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20 62    Store the.** b
f5b0: 6f 6f 6c 65 61 6e 20 63 6f 6d 70 6c 65 6d 65 6e  oolean complemen
f5c0: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  t in register P2
f5d0: 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  .  If the value 
f5e0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69  in register P1 i
f5f0: 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e  s .** NULL, then
f600: 20 61 20 4e 55 4c 4c 20 69 73 20 73 74 6f 72 65   a NULL is store
f610: 64 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  d in P2..*/.case
f620: 20 4f 50 5f 4e 6f 74 3a 20 7b 20 20 20 20 20 20   OP_Not: {      
f630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
f640: 65 20 61 73 20 54 4b 5f 4e 4f 54 2c 20 69 6e 31  e as TK_NOT, in1
f650: 2c 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31  , out2 */.  pIn1
f660: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
f670: 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65  ];.  pOut = &aMe
f680: 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69 66  m[pOp->p2];.  if
f690: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20  ( pIn1->flags & 
f6a0: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
f6b0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
f6c0: 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 7d  tNull(pOut);.  }
f6d0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
f6e0: 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34  3VdbeMemSetInt64
f6f0: 28 70 4f 75 74 2c 20 21 73 71 6c 69 74 65 33 56  (pOut, !sqlite3V
f700: 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31  dbeIntValue(pIn1
f710: 29 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  ));.  }.  break;
f720: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42  .}../* Opcode: B
f730: 69 74 4e 6f 74 20 50 31 20 50 32 20 2a 20 2a 20  itNot P1 P2 * * 
f740: 2a 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  *.**.** Interpre
f750: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
f760: 20 72 65 67 69 73 74 65 72 20 50 31 20 61 73 20   register P1 as 
f770: 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 53 74 6f  an integer.  Sto
f780: 72 65 20 74 68 65 0a 2a 2a 20 6f 6e 65 73 2d 63  re the.** ones-c
f790: 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  omplement of the
f7a0: 20 50 31 20 76 61 6c 75 65 20 69 6e 74 6f 20 72   P1 value into r
f7b0: 65 67 69 73 74 65 72 20 50 32 2e 20 20 49 66 20  egister P2.  If 
f7c0: 50 31 20 68 6f 6c 64 73 0a 2a 2a 20 61 20 4e 55  P1 holds.** a NU
f7d0: 4c 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 61 20  LL then store a 
f7e0: 4e 55 4c 4c 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63  NULL in P2..*/.c
f7f0: 61 73 65 20 4f 50 5f 42 69 74 4e 6f 74 3a 20 7b  ase OP_BitNot: {
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f810: 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 4e 4f  same as TK_BITNO
f820: 54 2c 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a  T, in1, out2 */.
f830: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
f840: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20  Op->p1];.  pOut 
f850: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
f860: 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c  ;.  if( pIn1->fl
f870: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
f880: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
f890: 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74  eMemSetNull(pOut
f8a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f8b0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
f8c0: 74 49 6e 74 36 34 28 70 4f 75 74 2c 20 7e 73 71  tInt64(pOut, ~sq
f8d0: 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
f8e0: 65 28 70 49 6e 31 29 29 3b 0a 20 20 7d 0a 20 20  e(pIn1));.  }.  
f8f0: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
f900: 6f 64 65 3a 20 49 66 20 50 31 20 50 32 20 50 33  ode: If P1 P2 P3
f910: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20   * *.**.** Jump 
f920: 74 6f 20 50 32 20 69 66 20 74 68 65 20 76 61 6c  to P2 if the val
f930: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
f940: 31 20 69 73 20 74 72 75 65 2e 20 20 54 68 65 20  1 is true.  The 
f950: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 69 73 20 63  value is.** is c
f960: 6f 6e 73 69 64 65 72 65 64 20 74 72 75 65 20 69  onsidered true i
f970: 66 20 69 74 20 69 73 20 6e 75 6d 65 72 69 63 20  f it is numeric 
f980: 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49  and non-zero.  I
f990: 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69  f the value.** i
f9a0: 6e 20 50 31 20 69 73 20 4e 55 4c 4c 20 74 68 65  n P1 is NULL the
f9b0: 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  n take the jump 
f9c0: 69 66 20 50 33 20 69 73 20 74 72 75 65 2e 0a 2a  if P3 is true..*
f9d0: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 4e  /./* Opcode: IfN
f9e0: 6f 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  ot P1 P2 P3 * *.
f9f0: 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32  **.** Jump to P2
fa00: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e   if the value in
fa10: 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20   register P1 is 
fa20: 46 61 6c 73 65 2e 20 20 54 68 65 20 76 61 6c 75  False.  The valu
fa30: 65 20 69 73 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  e is.** is consi
fa40: 64 65 72 65 64 20 74 72 75 65 20 69 66 20 69 74  dered true if it
fa50: 20 68 61 73 20 61 20 6e 75 6d 65 72 69 63 20 76   has a numeric v
fa60: 61 6c 75 65 20 6f 66 20 7a 65 72 6f 2e 20 20 49  alue of zero.  I
fa70: 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69  f the value.** i
fa80: 6e 20 50 31 20 69 73 20 4e 55 4c 4c 20 74 68 65  n P1 is NULL the
fa90: 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  n take the jump 
faa0: 69 66 20 50 33 20 69 73 20 74 72 75 65 2e 0a 2a  if P3 is true..*
fab0: 2f 0a 63 61 73 65 20 4f 50 5f 49 66 3a 20 20 20  /.case OP_If:   
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fad0: 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 63 61   jump, in1 */.ca
fae0: 73 65 20 4f 50 5f 49 66 4e 6f 74 3a 20 7b 20 20  se OP_IfNot: {  
faf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d            /* jum
fb00: 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 69 6e 74 20  p, in1 */.  int 
fb10: 63 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  c;.  pIn1 = &aMe
fb20: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66  m[pOp->p1];.  if
fb30: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20  ( pIn1->flags & 
fb40: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
fb50: 63 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d  c = pOp->p3;.  }
fb60: 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c  else{.#ifdef SQL
fb70: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
fb80: 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 20 3d 20  G_POINT.    c = 
fb90: 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
fba0: 6c 75 65 28 70 49 6e 31 29 21 3d 30 3b 0a 23 65  lue(pIn1)!=0;.#e
fbb0: 6c 73 65 0a 20 20 20 20 63 20 3d 20 73 71 6c 69  lse.    c = sqli
fbc0: 74 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65  te3VdbeRealValue
fbd0: 28 70 49 6e 31 29 21 3d 30 2e 30 3b 0a 23 65 6e  (pIn1)!=0.0;.#en
fbe0: 64 69 66 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  dif.    if( pOp-
fbf0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 66 4e 6f  >opcode==OP_IfNo
fc00: 74 20 29 20 63 20 3d 20 21 63 3b 0a 20 20 7d 0a  t ) c = !c;.  }.
fc10: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 70    if( c ){.    p
fc20: 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20  c = pOp->p2-1;. 
fc30: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
fc40: 2a 20 4f 70 63 6f 64 65 3a 20 49 73 4e 75 6c 6c  * Opcode: IsNull
fc50: 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
fc60: 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66  ** Jump to P2 if
fc70: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
fc80: 67 69 73 74 65 72 20 50 31 20 69 73 20 4e 55 4c  gister P1 is NUL
fc90: 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 73  L..*/.case OP_Is
fca0: 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20 20  Null: {         
fcb0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
fcc0: 5f 49 53 4e 55 4c 4c 2c 20 6a 75 6d 70 2c 20 69  _ISNULL, jump, i
fcd0: 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
fce0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
fcf0: 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
fd00: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30  s & MEM_Null)!=0
fd10: 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70   ){.    pc = pOp
fd20: 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  ->p2 - 1;.  }.  
fd30: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
fd40: 6f 64 65 3a 20 4e 6f 74 4e 75 6c 6c 20 50 31 20  ode: NotNull P1 
fd50: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a  P2 * * *.**.** J
fd60: 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65  ump to P2 if the
fd70: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
fd80: 65 72 20 50 31 20 69 73 20 6e 6f 74 20 4e 55 4c  er P1 is not NUL
fd90: 4c 2e 20 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  L.  .*/.case OP_
fda0: 4e 6f 74 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20  NotNull: {      
fdb0: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
fdc0: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 6a 75 6d   TK_NOTNULL, jum
fdd0: 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31  p, in1 */.  pIn1
fde0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
fdf0: 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  ];.  if( (pIn1->
fe00: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
fe10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 63 20 3d  )==0 ){.    pc =
fe20: 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
fe30: 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
fe40: 20 4f 70 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e 20   Opcode: Column 
fe50: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
fe60: 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74  *.** Interpret t
fe70: 68 65 20 64 61 74 61 20 74 68 61 74 20 63 75 72  he data that cur
fe80: 73 6f 72 20 50 31 20 70 6f 69 6e 74 73 20 74 6f  sor P1 points to
fe90: 20 61 73 20 61 20 73 74 72 75 63 74 75 72 65 20   as a structure 
fea0: 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a 2a 20 74  built using.** t
feb0: 68 65 20 4d 61 6b 65 52 65 63 6f 72 64 20 69 6e  he MakeRecord in
fec0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 28 53 65 65  struction.  (See
fed0: 20 74 68 65 20 4d 61 6b 65 52 65 63 6f 72 64 20   the MakeRecord 
fee0: 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74  opcode for addit
fef0: 69 6f 6e 61 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  ional.** informa
ff00: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66  tion about the f
ff10: 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 64 61 74  ormat of the dat
ff20: 61 2e 29 20 20 45 78 74 72 61 63 74 20 74 68 65  a.)  Extract the
ff30: 20 50 32 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a   P2-th column.**
ff40: 20 66 72 6f 6d 20 74 68 69 73 20 72 65 63 6f 72   from this recor
ff50: 64 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  d.  If there are
ff60: 20 6c 65 73 73 20 74 68 61 74 20 28 50 32 2b 31   less that (P2+1
ff70: 29 20 0a 2a 2a 20 76 61 6c 75 65 73 20 69 6e 20  ) .** values in 
ff80: 74 68 65 20 72 65 63 6f 72 64 2c 20 65 78 74 72  the record, extr
ff90: 61 63 74 20 61 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  act a NULL..**.*
ffa0: 2a 20 54 68 65 20 76 61 6c 75 65 20 65 78 74 72  * The value extr
ffb0: 61 63 74 65 64 20 69 73 20 73 74 6f 72 65 64 20  acted is stored 
ffc0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
ffd0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6c  **.** If the col
ffe0: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 66 65 77  umn contains few
fff0: 65 72 20 74 68 61 6e 20 50 32 20 66 69 65 6c 64  er than P2 field
10000 73 2c 20 74 68 65 6e 20 65 78 74 72 61 63 74 20  s, then extract 
10010 61 20 4e 55 4c 4c 2e 20 20 4f 72 2c 0a 2a 2a 20  a NULL.  Or,.** 
10020 69 66 20 74 68 65 20 50 34 20 61 72 67 75 6d 65  if the P4 argume
10030 6e 74 20 69 73 20 61 20 50 34 5f 4d 45 4d 20 75  nt is a P4_MEM u
10040 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  se the value of 
10050 74 68 65 20 50 34 20 61 72 67 75 6d 65 6e 74 20  the P4 argument 
10060 61 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  as.** the result
10070 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f  ..**.** If the O
10080 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45  PFLAG_CLEARCACHE
10090 20 62 69 74 20 69 73 20 73 65 74 20 6f 6e 20 50   bit is set on P
100a0 35 20 61 6e 64 20 50 31 20 69 73 20 61 20 70 73  5 and P1 is a ps
100b0 65 75 64 6f 2d 74 61 62 6c 65 20 63 75 72 73 6f  eudo-table curso
100c0 72 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 63  r,.** then the c
100d0 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
100e0 6f 72 20 69 73 20 72 65 73 65 74 20 70 72 69 6f  or is reset prio
100f0 72 20 74 6f 20 65 78 74 72 61 63 74 69 6e 67 20  r to extracting 
10100 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54  the column..** T
10110 68 65 20 66 69 72 73 74 20 4f 50 5f 43 6f 6c 75  he first OP_Colu
10120 6d 6e 20 61 67 61 69 6e 73 74 20 61 20 70 73 65  mn against a pse
10130 75 64 6f 2d 74 61 62 6c 65 20 61 66 74 65 72 20  udo-table after 
10140 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
10150 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 72 65 67 69   content.** regi
10160 73 74 65 72 20 68 61 73 20 63 68 61 6e 67 65 64  ster has changed
10170 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 69   should have thi
10180 73 20 62 69 74 20 73 65 74 2e 0a 2a 2f 0a 63 61  s bit set..*/.ca
10190 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a  se OP_Column: {.
101a0 20 20 75 33 32 20 70 61 79 6c 6f 61 64 53 69 7a    u32 payloadSiz
101b0 65 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  e;   /* Number o
101c0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 72  f bytes in the r
101d0 65 63 6f 72 64 20 2a 2f 0a 20 20 69 36 34 20 70  ecord */.  i64 p
101e0 61 79 6c 6f 61 64 53 69 7a 65 36 34 3b 20 2f 2a  ayloadSize64; /*
101f0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
10200 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a   in the record *
10210 2f 0a 20 20 69 6e 74 20 70 31 3b 20 20 20 20 20  /.  int p1;     
10220 20 20 20 20 20 20 20 2f 2a 20 50 31 20 76 61 6c         /* P1 val
10230 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  ue of the opcode
10240 20 2a 2f 0a 20 20 69 6e 74 20 70 32 3b 20 20 20   */.  int p2;   
10250 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6c 75           /* colu
10260 6d 6e 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 74  mn number to ret
10270 72 69 65 76 65 20 2a 2f 0a 20 20 56 64 62 65 43  rieve */.  VdbeC
10280 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 20 2f 2a  ursor *pC;    /*
10290 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
102a0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 65 63   */.  char *zRec
102b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ;        /* Poin
102c0 74 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  ter to complete 
102d0 72 65 63 6f 72 64 2d 64 61 74 61 20 2a 2f 0a 20  record-data */. 
102e0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72   BtCursor *pCrsr
102f0 3b 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65  ;   /* The BTree
10300 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 75 33 32   cursor */.  u32
10310 20 2a 61 54 79 70 65 3b 20 20 20 20 20 20 20 20   *aType;        
10320 2f 2a 20 61 54 79 70 65 5b 69 5d 20 68 6f 6c 64  /* aType[i] hold
10330 73 20 74 68 65 20 6e 75 6d 65 72 69 63 20 74 79  s the numeric ty
10340 70 65 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63  pe of the i-th c
10350 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 75 33 32 20 2a  olumn */.  u32 *
10360 61 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a  aOffset;      /*
10370 20 61 4f 66 66 73 65 74 5b 69 5d 20 69 73 20 6f   aOffset[i] is o
10380 66 66 73 65 74 20 74 6f 20 73 74 61 72 74 20 6f  ffset to start o
10390 66 20 64 61 74 61 20 66 6f 72 20 69 2d 74 68 20  f data for i-th 
103a0 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
103b0 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20 2f  nField;        /
103c0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  * number of fiel
103d0 64 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ds in the record
103e0 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 20   */.  int len;  
103f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10400 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 65  length of the se
10410 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 66 6f  rialized data fo
10420 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  r the column */.
10430 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
10440 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
10450 6e 74 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  nter */.  char *
10460 7a 44 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  zData;       /* 
10470 50 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f  Part of the reco
10480 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64  rd being decoded
10490 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 44 65 73 74   */.  Mem *pDest
104a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ;        /* Wher
104b0 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 65  e to write the e
104c0 78 74 72 61 63 74 65 64 20 76 61 6c 75 65 20 2a  xtracted value *
104d0 2f 0a 20 20 4d 65 6d 20 73 4d 65 6d 3b 20 20 20  /.  Mem sMem;   
104e0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 74         /* For st
104f0 6f 72 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  oring the record
10500 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a   being decoded *
10510 2f 0a 20 20 75 38 20 2a 7a 49 64 78 3b 20 20 20  /.  u8 *zIdx;   
10520 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
10530 69 6e 74 6f 20 68 65 61 64 65 72 20 2a 2f 0a 20  into header */. 
10540 20 75 38 20 2a 7a 45 6e 64 48 64 72 3b 20 20 20   u8 *zEndHdr;   
10550 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
10560 6f 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74  o first byte aft
10570 65 72 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  er the header */
10580 0a 20 20 75 33 32 20 6f 66 66 73 65 74 3b 20 20  .  u32 offset;  
10590 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
105a0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 2a 2f  into the data */
105b0 0a 20 20 75 33 32 20 73 7a 46 69 65 6c 64 3b 20  .  u32 szField; 
105c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
105d0 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
105e0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 66 69 65  content of a fie
105f0 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 48 64  ld */.  int szHd
10600 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  r;         /* Si
10610 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
10620 20 73 69 7a 65 20 66 69 65 6c 64 20 61 74 20 73   size field at s
10630 74 61 72 74 20 6f 66 20 72 65 63 6f 72 64 20 2a  tart of record *
10640 2f 0a 20 20 69 6e 74 20 61 76 61 69 6c 3b 20 20  /.  int avail;  
10650 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10660 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
10670 69 6c 61 62 6c 65 20 64 61 74 61 20 2a 2f 0a 20  ilable data */. 
10680 20 4d 65 6d 20 2a 70 52 65 67 3b 20 20 20 20 20   Mem *pReg;     
10690 20 20 20 20 2f 2a 20 50 73 65 75 64 6f 54 61 62      /* PseudoTab
106a0 6c 65 20 69 6e 70 75 74 20 72 65 67 69 73 74 65  le input registe
106b0 72 20 2a 2f 0a 0a 0a 20 20 70 31 20 3d 20 70 4f  r */...  p1 = pO
106c0 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70 4f  p->p1;.  p2 = pO
106d0 70 2d 3e 70 32 3b 0a 20 20 70 43 20 3d 20 30 3b  p->p2;.  pC = 0;
106e0 0a 20 20 6d 65 6d 73 65 74 28 26 73 4d 65 6d 2c  .  memset(&sMem,
106f0 20 30 2c 20 73 69 7a 65 6f 66 28 73 4d 65 6d 29   0, sizeof(sMem)
10700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 3c  );.  assert( p1<
10710 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
10720 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
10730 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d  0 && pOp->p3<=p-
10740 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 44 65 73 74  >nMem );.  pDest
10750 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
10760 5d 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46  ];.  MemSetTypeF
10770 6c 61 67 28 70 44 65 73 74 2c 20 4d 45 4d 5f 4e  lag(pDest, MEM_N
10780 75 6c 6c 29 3b 0a 20 20 7a 52 65 63 20 3d 20 30  ull);.  zRec = 0
10790 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  ;..  /* This blo
107a0 63 6b 20 73 65 74 73 20 74 68 65 20 76 61 72 69  ck sets the vari
107b0 61 62 6c 65 20 70 61 79 6c 6f 61 64 53 69 7a 65  able payloadSize
107c0 20 74 6f 20 62 65 20 74 68 65 20 74 6f 74 61 6c   to be the total
107d0 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
107e0 62 79 74 65 73 20 69 6e 20 74 68 65 20 72 65 63  bytes in the rec
107f0 6f 72 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 7a  ord..  **.  ** z
10800 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 62 65  Rec is set to be
10810 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
10820 78 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  xt of the record
10830 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c 61   if it is availa
10840 62 6c 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f  ble..  ** The co
10850 6d 70 6c 65 74 65 20 72 65 63 6f 72 64 20 74 65  mplete record te
10860 78 74 20 69 73 20 61 6c 77 61 79 73 20 61 76 61  xt is always ava
10870 69 6c 61 62 6c 65 20 66 6f 72 20 70 73 65 75 64  ilable for pseud
10880 6f 2d 74 61 62 6c 65 73 0a 20 20 2a 2a 20 49 66  o-tables.  ** If
10890 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 73   the record is s
108a0 74 6f 72 65 64 20 69 6e 20 61 20 63 75 72 73 6f  tored in a curso
108b0 72 2c 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  r, the complete 
108c0 72 65 63 6f 72 64 20 74 65 78 74 0a 20 20 2a 2a  record text.  **
108d0 20 6d 69 67 68 74 20 62 65 20 61 76 61 69 6c 61   might be availa
108e0 62 6c 65 20 69 6e 20 74 68 65 20 20 70 43 2d 3e  ble in the  pC->
108f0 61 52 6f 77 20 63 61 63 68 65 2e 20 20 4f 72 20  aRow cache.  Or 
10900 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 2e  it might not be.
10910 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 64 61 74  .  ** If the dat
10920 61 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  a is unavailable
10930 2c 20 20 7a 52 65 63 20 69 73 20 73 65 74 20 74  ,  zRec is set t
10940 6f 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a  o NULL..  **.  *
10950 2a 20 57 65 20 61 6c 73 6f 20 63 6f 6d 70 75 74  * We also comput
10960 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
10970 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
10980 65 63 6f 72 64 2e 20 20 46 6f 72 20 63 75 72 73  ecord.  For curs
10990 6f 72 73 2c 0a 20 20 2a 2a 20 74 68 65 20 6e 75  ors,.  ** the nu
109a0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
109b0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
109c0 20 56 64 62 65 43 75 72 73 6f 72 2e 6e 46 69 65   VdbeCursor.nFie
109d0 6c 64 20 65 6c 65 6d 65 6e 74 2e 0a 20 20 2a 2f  ld element..  */
109e0 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
109f0 5b 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  [p1];.  assert( 
10a00 70 43 21 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66  pC!=0 );.#ifndef
10a10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
10a20 54 55 41 4c 54 41 42 4c 45 0a 20 20 61 73 73 65  TUALTABLE.  asse
10a30 72 74 28 20 70 43 2d 3e 70 56 74 61 62 43 75 72  rt( pC->pVtabCur
10a40 73 6f 72 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  sor==0 );.#endif
10a50 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 70  .  pCrsr = pC->p
10a60 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43  Cursor;.  if( pC
10a70 72 73 72 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rsr!=0 ){.    /*
10a80 20 54 68 65 20 72 65 63 6f 72 64 20 69 73 20 73   The record is s
10a90 74 6f 72 65 64 20 69 6e 20 61 20 42 2d 54 72 65  tored in a B-Tre
10aa0 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  e */.    rc = sq
10ab0 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
10ac0 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 20 20 69  oveto(pC);.    i
10ad0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
10ae0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
10af0 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c  .    if( pC->nul
10b00 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 61  lRow ){.      pa
10b10 79 6c 6f 61 64 53 69 7a 65 20 3d 20 30 3b 0a 20  yloadSize = 0;. 
10b20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 2d     }else if( pC-
10b30 3e 63 61 63 68 65 53 74 61 74 75 73 3d 3d 70 2d  >cacheStatus==p-
10b40 3e 63 61 63 68 65 43 74 72 20 29 7b 0a 20 20 20  >cacheCtr ){.   
10b50 20 20 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d     payloadSize =
10b60 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65   pC->payloadSize
10b70 3b 0a 20 20 20 20 20 20 7a 52 65 63 20 3d 20 28  ;.      zRec = (
10b80 63 68 61 72 2a 29 70 43 2d 3e 61 52 6f 77 3b 0a  char*)pC->aRow;.
10b90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43      }else if( pC
10ba0 2d 3e 69 73 49 6e 64 65 78 20 29 7b 0a 20 20 20  ->isIndex ){.   
10bb0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
10bc0 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
10bd0 61 6c 69 64 28 70 43 72 73 72 29 20 29 3b 0a 20  alid(pCrsr) );. 
10be0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10bf0 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
10c00 72 73 72 2c 20 26 70 61 79 6c 6f 61 64 53 69 7a  rsr, &payloadSiz
10c10 65 36 34 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e64);.      asse
10c20 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
10c30 4b 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 62  K );   /* True b
10c40 65 63 61 75 73 65 20 6f 66 20 43 75 72 73 6f 72  ecause of Cursor
10c50 4d 6f 76 65 74 6f 28 29 20 63 61 6c 6c 20 61 62  Moveto() call ab
10c60 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ove */.      /* 
10c70 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
10c80 65 43 65 6c 6c 50 74 72 28 29 20 75 73 65 73 20  eCellPtr() uses 
10c90 67 65 74 56 61 72 69 6e 74 33 32 28 29 20 74 6f  getVarint32() to
10ca0 20 65 78 74 72 61 63 74 20 74 68 65 0a 20 20 20   extract the.   
10cb0 20 20 20 2a 2a 20 70 61 79 6c 6f 61 64 20 73 69     ** payload si
10cc0 7a 65 2c 20 73 6f 20 69 74 20 69 73 20 69 6d 70  ze, so it is imp
10cd0 6f 73 73 69 62 6c 65 20 66 6f 72 20 70 61 79 6c  ossible for payl
10ce0 6f 61 64 53 69 7a 65 36 34 20 74 6f 20 62 65 0a  oadSize64 to be.
10cf0 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 72 20        ** larger 
10d00 74 68 61 6e 20 33 32 20 62 69 74 73 2e 20 2a 2f  than 32 bits. */
10d10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
10d20 70 61 79 6c 6f 61 64 53 69 7a 65 36 34 20 26 20  payloadSize64 & 
10d30 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d  SQLITE_MAX_U32)=
10d40 3d 28 75 36 34 29 70 61 79 6c 6f 61 64 53 69 7a  =(u64)payloadSiz
10d50 65 36 34 20 29 3b 0a 20 20 20 20 20 20 70 61 79  e64 );.      pay
10d60 6c 6f 61 64 53 69 7a 65 20 3d 20 28 75 33 32 29  loadSize = (u32)
10d70 70 61 79 6c 6f 61 64 53 69 7a 65 36 34 3b 0a 20  payloadSize64;. 
10d80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10d90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
10da0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
10db0 64 28 70 43 72 73 72 29 20 29 3b 0a 20 20 20 20  d(pCrsr) );.    
10dc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
10dd0 72 65 65 44 61 74 61 53 69 7a 65 28 70 43 72 73  reeDataSize(pCrs
10de0 72 2c 20 26 70 61 79 6c 6f 61 64 53 69 7a 65 29  r, &payloadSize)
10df0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10e00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
10e10 20 20 20 2f 2a 20 44 61 74 61 53 69 7a 65 28 29     /* DataSize()
10e20 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
10e30 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
10e40 28 20 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c  ( pC->pseudoTabl
10e50 65 52 65 67 3e 30 20 29 7b 0a 20 20 20 20 70 52  eReg>0 ){.    pR
10e60 65 67 20 3d 20 26 61 4d 65 6d 5b 70 43 2d 3e 70  eg = &aMem[pC->p
10e70 73 65 75 64 6f 54 61 62 6c 65 52 65 67 5d 3b 0a  seudoTableReg];.
10e80 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 67      assert( pReg
10e90 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
10ea0 6f 62 20 29 3b 0a 20 20 20 20 70 61 79 6c 6f 61  ob );.    payloa
10eb0 64 53 69 7a 65 20 3d 20 70 52 65 67 2d 3e 6e 3b  dSize = pReg->n;
10ec0 0a 20 20 20 20 7a 52 65 63 20 3d 20 70 52 65 67  .    zRec = pReg
10ed0 2d 3e 7a 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63  ->z;.    pC->cac
10ee0 68 65 53 74 61 74 75 73 20 3d 20 28 70 4f 70 2d  heStatus = (pOp-
10ef0 3e 70 35 26 4f 50 46 4c 41 47 5f 43 4c 45 41 52  >p5&OPFLAG_CLEAR
10f00 43 41 43 48 45 29 20 3f 20 43 41 43 48 45 5f 53  CACHE) ? CACHE_S
10f10 54 41 4c 45 20 3a 20 70 2d 3e 63 61 63 68 65 43  TALE : p->cacheC
10f20 74 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  tr;.    assert( 
10f30 70 61 79 6c 6f 61 64 53 69 7a 65 3d 3d 30 20 7c  payloadSize==0 |
10f40 7c 20 7a 52 65 63 21 3d 30 20 29 3b 0a 20 20 7d  | zRec!=0 );.  }
10f50 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e  else{.    /* Con
10f60 73 69 64 65 72 20 74 68 65 20 72 6f 77 20 74 6f  sider the row to
10f70 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20   be NULL */.    
10f80 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 30 3b  payloadSize = 0;
10f90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 61  .  }..  /* If pa
10fa0 79 6c 6f 61 64 53 69 7a 65 20 69 73 20 30 2c 20  yloadSize is 0, 
10fb0 74 68 65 6e 20 6a 75 73 74 20 73 74 6f 72 65 20  then just store 
10fc0 61 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 66 28 20  a NULL */.  if( 
10fd0 70 61 79 6c 6f 61 64 53 69 7a 65 3d 3d 30 20 29  payloadSize==0 )
10fe0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44  {.    assert( pD
10ff0 65 73 74 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e  est->flags&MEM_N
11000 75 6c 6c 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ull );.    goto 
11010 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20  op_column_out;. 
11020 20 7d 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d   }.  assert( db-
11030 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
11040 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3e 3d 30 20  IMIT_LENGTH]>=0 
11050 29 3b 0a 20 20 69 66 28 20 70 61 79 6c 6f 61 64  );.  if( payload
11060 53 69 7a 65 20 3e 20 28 75 33 32 29 64 62 2d 3e  Size > (u32)db->
11070 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
11080 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20  MIT_LENGTH] ){. 
11090 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b     goto too_big;
110a0 0a 20 20 7d 0a 0a 20 20 6e 46 69 65 6c 64 20 3d  .  }..  nField =
110b0 20 70 43 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 61   pC->nField;.  a
110c0 73 73 65 72 74 28 20 70 32 3c 6e 46 69 65 6c 64  ssert( p2<nField
110d0 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 61   );..  /* Read a
110e0 6e 64 20 70 61 72 73 65 20 74 68 65 20 74 61 62  nd parse the tab
110f0 6c 65 20 68 65 61 64 65 72 2e 20 20 53 74 6f 72  le header.  Stor
11100 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
11110 20 74 68 65 20 70 61 72 73 65 0a 20 20 2a 2a 20   the parse.  ** 
11120 69 6e 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20  into the record 
11130 68 65 61 64 65 72 20 63 61 63 68 65 20 66 69 65  header cache fie
11140 6c 64 73 20 6f 66 20 74 68 65 20 63 75 72 73 6f  lds of the curso
11150 72 2e 0a 20 20 2a 2f 0a 20 20 61 54 79 70 65 20  r..  */.  aType 
11160 3d 20 70 43 2d 3e 61 54 79 70 65 3b 0a 20 20 69  = pC->aType;.  i
11170 66 28 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74  f( pC->cacheStat
11180 75 73 3d 3d 70 2d 3e 63 61 63 68 65 43 74 72 20  us==p->cacheCtr 
11190 29 7b 0a 20 20 20 20 61 4f 66 66 73 65 74 20 3d  ){.    aOffset =
111a0 20 70 43 2d 3e 61 4f 66 66 73 65 74 3b 0a 20 20   pC->aOffset;.  
111b0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
111c0 74 28 61 54 79 70 65 29 3b 0a 20 20 20 20 61 76  t(aType);.    av
111d0 61 69 6c 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d  ail = 0;.    pC-
111e0 3e 61 4f 66 66 73 65 74 20 3d 20 61 4f 66 66 73  >aOffset = aOffs
111f0 65 74 20 3d 20 26 61 54 79 70 65 5b 6e 46 69 65  et = &aType[nFie
11200 6c 64 5d 3b 0a 20 20 20 20 70 43 2d 3e 70 61 79  ld];.    pC->pay
11210 6c 6f 61 64 53 69 7a 65 20 3d 20 70 61 79 6c 6f  loadSize = paylo
11220 61 64 53 69 7a 65 3b 0a 20 20 20 20 70 43 2d 3e  adSize;.    pC->
11230 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 70 2d  cacheStatus = p-
11240 3e 63 61 63 68 65 43 74 72 3b 0a 0a 20 20 20 20  >cacheCtr;..    
11250 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
11260 77 20 6d 61 6e 79 20 62 79 74 65 73 20 61 72 65  w many bytes are
11270 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 2a   in the header *
11280 2f 0a 20 20 20 20 69 66 28 20 7a 52 65 63 20 29  /.    if( zRec )
11290 7b 0a 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20  {.      zData = 
112a0 7a 52 65 63 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  zRec;.    }else{
112b0 0a 20 20 20 20 20 20 69 66 28 20 70 43 2d 3e 69  .      if( pC->i
112c0 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  sIndex ){.      
112d0 20 20 7a 44 61 74 61 20 3d 20 28 63 68 61 72 2a    zData = (char*
112e0 29 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79  )sqlite3BtreeKey
112f0 46 65 74 63 68 28 70 43 72 73 72 2c 20 26 61 76  Fetch(pCrsr, &av
11300 61 69 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ail);.      }els
11310 65 7b 0a 20 20 20 20 20 20 20 20 7a 44 61 74 61  e{.        zData
11320 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
11330 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28  3BtreeDataFetch(
11340 70 43 72 73 72 2c 20 26 61 76 61 69 6c 29 3b 0a  pCrsr, &avail);.
11350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
11360 20 49 66 20 4b 65 79 46 65 74 63 68 28 29 2f 44   If KeyFetch()/D
11370 61 74 61 46 65 74 63 68 28 29 20 6d 61 6e 61 67  ataFetch() manag
11380 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 65 6e  ed to get the en
11390 74 69 72 65 20 70 61 79 6c 6f 61 64 2c 0a 20 20  tire payload,.  
113a0 20 20 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20      ** save the 
113b0 70 61 79 6c 6f 61 64 20 69 6e 20 74 68 65 20 70  payload in the p
113c0 43 2d 3e 61 52 6f 77 20 63 61 63 68 65 2e 20 20  C->aRow cache.  
113d0 54 68 61 74 20 77 69 6c 6c 20 73 61 76 65 20 75  That will save u
113e0 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20  s from.      ** 
113f0 68 61 76 69 6e 67 20 74 6f 20 6d 61 6b 65 20 61  having to make a
11400 64 64 69 74 69 6f 6e 61 6c 20 63 61 6c 6c 73 20  dditional calls 
11410 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e  to fetch the con
11420 74 65 6e 74 20 70 6f 72 74 69 6f 6e 20 6f 66 0a  tent portion of.
11430 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 63        ** the rec
11440 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ord..      */.  
11450 20 20 20 20 61 73 73 65 72 74 28 20 61 76 61 69      assert( avai
11460 6c 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  l>=0 );.      if
11470 28 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 3c 3d  ( payloadSize <=
11480 20 28 75 33 32 29 61 76 61 69 6c 20 29 7b 0a 20   (u32)avail ){. 
11490 20 20 20 20 20 20 20 7a 52 65 63 20 3d 20 7a 44         zRec = zD
114a0 61 74 61 3b 0a 20 20 20 20 20 20 20 20 70 43 2d  ata;.        pC-
114b0 3e 61 52 6f 77 20 3d 20 28 75 38 2a 29 7a 44 61  >aRow = (u8*)zDa
114c0 74 61 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ta;.      }else{
114d0 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 61 52 6f  .        pC->aRo
114e0 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  w = 0;.      }. 
114f0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20     }.    /* The 
11500 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
11510 20 69 73 20 74 72 75 65 20 69 6e 20 61 6c 6c 20   is true in all 
11520 63 61 73 65 73 20 61 63 63 65 70 74 20 77 68 65  cases accept whe
11530 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  n.    ** the dat
11540 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62  abase file has b
11550 65 65 6e 20 63 6f 72 72 75 70 74 65 64 20 65 78  een corrupted ex
11560 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 20 20 2a 2a  ternally..    **
11570 20 20 20 20 61 73 73 65 72 74 28 20 7a 52 65 63      assert( zRec
11580 21 3d 30 20 7c 7c 20 61 76 61 69 6c 3e 3d 70 61  !=0 || avail>=pa
11590 79 6c 6f 61 64 53 69 7a 65 20 7c 7c 20 61 76 61  yloadSize || ava
115a0 69 6c 3e 3d 39 20 29 3b 20 2a 2f 0a 20 20 20 20  il>=9 ); */.    
115b0 73 7a 48 64 72 20 3d 20 67 65 74 56 61 72 69 6e  szHdr = getVarin
115c0 74 33 32 28 28 75 38 2a 29 7a 44 61 74 61 2c 20  t32((u8*)zData, 
115d0 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 2f 2a  offset);..    /*
115e0 20 4d 61 6b 65 20 73 75 72 65 20 61 20 63 6f 72   Make sure a cor
115f0 72 75 70 74 20 64 61 74 61 62 61 73 65 20 68 61  rupt database ha
11600 73 20 6e 6f 74 20 67 69 76 65 6e 20 75 73 20 61  s not given us a
11610 6e 20 6f 76 65 72 73 69 7a 65 20 68 65 61 64 65  n oversize heade
11620 72 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  r..    ** Do thi
11630 73 20 6e 6f 77 20 74 6f 20 61 76 6f 69 64 20 61  s now to avoid a
11640 6e 20 6f 76 65 72 73 69 7a 65 20 6d 65 6d 6f 72  n oversize memor
11650 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 20 20  y allocation..  
11660 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 79 70 65    **.    ** Type
11670 20 65 6e 74 72 69 65 73 20 63 61 6e 20 62 65 20   entries can be 
11680 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 35 20  between 1 and 5 
11690 62 79 74 65 73 20 65 61 63 68 2e 20 20 42 75 74  bytes each.  But
116a0 20 34 20 61 6e 64 20 35 20 62 79 74 65 0a 20 20   4 and 5 byte.  
116b0 20 20 2a 2a 20 74 79 70 65 73 20 75 73 65 20 73    ** types use s
116c0 6f 20 6d 75 63 68 20 64 61 74 61 20 73 70 61 63  o much data spac
116d0 65 20 74 68 61 74 20 74 68 65 72 65 20 63 61 6e  e that there can
116e0 20 6f 6e 6c 79 20 62 65 20 34 30 39 36 20 61 6e   only be 4096 an
116f0 64 20 33 32 20 6f 66 0a 20 20 20 20 2a 2a 20 74  d 32 of.    ** t
11700 68 65 6d 2c 20 72 65 73 70 65 63 74 69 76 65 6c  hem, respectivel
11710 79 2e 20 20 53 6f 20 74 68 65 20 6d 61 78 69 6d  y.  So the maxim
11720 75 6d 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68  um header length
11730 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 61 0a   results from a.
11740 20 20 20 20 2a 2a 20 33 2d 62 79 74 65 20 74 79      ** 3-byte ty
11750 70 65 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74  pe for each of t
11760 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 33 32  he maximum of 32
11770 37 36 38 20 63 6f 6c 75 6d 6e 73 20 70 6c 75 73  768 columns plus
11780 20 74 68 72 65 65 0a 20 20 20 20 2a 2a 20 65 78   three.    ** ex
11790 74 72 61 20 62 79 74 65 73 20 66 6f 72 20 74 68  tra bytes for th
117a0 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20  e header length 
117b0 69 74 73 65 6c 66 2e 20 20 33 32 37 36 38 2a 33  itself.  32768*3
117c0 20 2b 20 33 20 3d 20 39 38 33 30 37 2e 0a 20 20   + 3 = 98307..  
117d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66    */.    if( off
117e0 73 65 74 20 3e 20 39 38 33 30 37 20 29 7b 0a 20  set > 98307 ){. 
117f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11800 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
11810 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c       goto op_col
11820 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  umn_out;.    }..
11830 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 69      /* Compute i
11840 6e 20 6c 65 6e 20 74 68 65 20 6e 75 6d 62 65 72  n len the number
11850 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
11860 61 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 61  a we need to rea
11870 64 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a  d in order.    *
11880 2a 20 74 6f 20 67 65 74 20 6e 46 69 65 6c 64 20  * to get nField 
11890 74 79 70 65 20 76 61 6c 75 65 73 2e 20 20 6f 66  type values.  of
118a0 66 73 65 74 20 69 73 20 61 6e 20 75 70 70 65 72  fset is an upper
118b0 20 62 6f 75 6e 64 20 6f 6e 20 74 68 69 73 2e 20   bound on this. 
118c0 20 42 75 74 0a 20 20 20 20 2a 2a 20 6e 46 69 65   But.    ** nFie
118d0 6c 64 20 6d 69 67 68 74 20 62 65 20 73 69 67 6e  ld might be sign
118e0 69 66 69 63 61 6e 74 6c 79 20 6c 65 73 73 20 74  ificantly less t
118f0 68 61 6e 20 74 68 65 20 74 72 75 65 20 6e 75 6d  han the true num
11900 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 20  ber of columns. 
11910 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 74 61 62     ** in the tab
11920 6c 65 2c 20 61 6e 64 20 69 6e 20 74 68 61 74 20  le, and in that 
11930 63 61 73 65 2c 20 35 2a 6e 46 69 65 6c 64 2b 33  case, 5*nField+3
11940 20 6d 69 67 68 74 20 62 65 20 73 6d 61 6c 6c 65   might be smalle
11950 72 20 74 68 61 6e 20 6f 66 66 73 65 74 2e 0a 20  r than offset.. 
11960 20 20 20 2a 2a 20 57 65 20 77 61 6e 74 20 74 6f     ** We want to
11970 20 6d 69 6e 69 6d 69 7a 65 20 6c 65 6e 20 69 6e   minimize len in
11980 20 6f 72 64 65 72 20 74 6f 20 6c 69 6d 69 74 20   order to limit 
11990 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
119a0 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 61 6c  memory.    ** al
119b0 6c 6f 63 61 74 69 6f 6e 2c 20 65 73 70 65 63 69  location, especi
119c0 61 6c 6c 79 20 69 66 20 61 20 63 6f 72 72 75 70  ally if a corrup
119d0 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  t database file 
119e0 68 61 73 20 63 61 75 73 65 64 20 6f 66 66 73 65  has caused offse
119f0 74 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 6f  t.    ** to be o
11a00 76 65 72 73 69 7a 65 64 2e 20 4f 66 66 73 65 74  versized. Offset
11a10 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20 39   is limited to 9
11a20 38 33 30 37 20 61 62 6f 76 65 2e 20 20 42 75 74  8307 above.  But
11a30 20 39 38 33 30 37 20 6d 69 67 68 74 0a 20 20 20   98307 might.   
11a40 20 2a 2a 20 73 74 69 6c 6c 20 65 78 63 65 65 64   ** still exceed
11a50 20 52 6f 62 73 6f 6e 20 6d 65 6d 6f 72 79 20 61   Robson memory a
11a60 6c 6c 6f 63 61 74 69 6f 6e 20 6c 69 6d 69 74 73  llocation limits
11a70 20 6f 6e 20 73 6f 6d 65 20 63 6f 6e 66 69 67 75   on some configu
11a80 72 61 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  rations..    ** 
11a90 4f 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74 20  On systems that 
11aa0 63 61 6e 6e 6f 74 20 74 6f 6c 65 72 61 74 65 20  cannot tolerate 
11ab0 6c 61 72 67 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  large memory all
11ac0 6f 63 61 74 69 6f 6e 73 2c 20 6e 46 69 65 6c 64  ocations, nField
11ad0 2a 35 2b 33 0a 20 20 20 20 2a 2a 20 77 69 6c 6c  *5+3.    ** will
11ae0 20 6c 69 6b 65 6c 79 20 62 65 20 6d 75 63 68 20   likely be much 
11af0 73 6d 61 6c 6c 65 72 20 73 69 6e 63 65 20 6e 46  smaller since nF
11b00 69 65 6c 64 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ield will likely
11b10 20 62 65 20 6c 65 73 73 20 74 68 61 6e 0a 20 20   be less than.  
11b20 20 20 2a 2a 20 32 30 20 6f 72 20 73 6f 2e 20 20    ** 20 or so.  
11b30 54 68 69 73 20 69 6e 73 75 72 65 73 20 74 68 61  This insures tha
11b40 74 20 52 6f 62 73 6f 6e 20 6d 65 6d 6f 72 79 20  t Robson memory 
11b50 61 6c 6c 6f 63 61 74 69 6f 6e 20 6c 69 6d 69 74  allocation limit
11b60 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  s are.    ** not
11b70 20 65 78 63 65 65 64 65 64 20 65 76 65 6e 20 66   exceeded even f
11b80 6f 72 20 63 6f 72 72 75 70 74 20 64 61 74 61 62  or corrupt datab
11b90 61 73 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a  ase files..    *
11ba0 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 6e 46 69 65  /.    len = nFie
11bb0 6c 64 2a 35 20 2b 20 33 3b 0a 20 20 20 20 69 66  ld*5 + 3;.    if
11bc0 28 20 6c 65 6e 20 3e 20 28 69 6e 74 29 6f 66 66  ( len > (int)off
11bd0 73 65 74 20 29 20 6c 65 6e 20 3d 20 28 69 6e 74  set ) len = (int
11be0 29 6f 66 66 73 65 74 3b 0a 0a 20 20 20 20 2f 2a  )offset;..    /*
11bf0 20 54 68 65 20 4b 65 79 46 65 74 63 68 28 29 20   The KeyFetch() 
11c00 6f 72 20 44 61 74 61 46 65 74 63 68 28 29 20 61  or DataFetch() a
11c10 62 6f 76 65 20 61 72 65 20 66 61 73 74 20 61 6e  bove are fast an
11c20 64 20 77 69 6c 6c 20 67 65 74 20 74 68 65 20 65  d will get the e
11c30 6e 74 69 72 65 0a 20 20 20 20 2a 2a 20 72 65 63  ntire.    ** rec
11c40 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 6d 6f  ord header in mo
11c50 73 74 20 63 61 73 65 73 2e 20 20 42 75 74 20 74  st cases.  But t
11c60 68 65 79 20 77 69 6c 6c 20 66 61 69 6c 20 74 6f  hey will fail to
11c70 20 67 65 74 20 74 68 65 20 63 6f 6d 70 6c 65 74   get the complet
11c80 65 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 20  e.    ** record 
11c90 68 65 61 64 65 72 20 69 66 20 74 68 65 20 72 65  header if the re
11ca0 63 6f 72 64 20 68 65 61 64 65 72 20 64 6f 65 73  cord header does
11cb0 20 6e 6f 74 20 66 69 74 20 6f 6e 20 61 20 73 69   not fit on a si
11cc0 6e 67 6c 65 20 70 61 67 65 0a 20 20 20 20 2a 2a  ngle page.    **
11cd0 20 69 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20   in the B-Tree. 
11ce0 20 57 68 65 6e 20 74 68 61 74 20 68 61 70 70 65   When that happe
11cf0 6e 73 2c 20 75 73 65 20 73 71 6c 69 74 65 33 56  ns, use sqlite3V
11d00 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
11d10 29 20 74 6f 0a 20 20 20 20 2a 2a 20 61 63 71 75  ) to.    ** acqu
11d20 69 72 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ire the complete
11d30 20 68 65 61 64 65 72 20 74 65 78 74 2e 0a 20 20   header text..  
11d40 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 7a 52    */.    if( !zR
11d50 65 63 20 26 26 20 61 76 61 69 6c 3c 6c 65 6e 20  ec && avail<len 
11d60 29 7b 0a 20 20 20 20 20 20 73 4d 65 6d 2e 66 6c  ){.      sMem.fl
11d70 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ags = 0;.      s
11d80 4d 65 6d 2e 64 62 20 3d 20 30 3b 0a 20 20 20 20  Mem.db = 0;.    
11d90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
11da0 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
11db0 43 72 73 72 2c 20 30 2c 20 6c 65 6e 2c 20 70 43  Crsr, 0, len, pC
11dc0 2d 3e 69 73 49 6e 64 65 78 2c 20 26 73 4d 65 6d  ->isIndex, &sMem
11dd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
11de0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11df0 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f        goto op_co
11e00 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20  lumn_out;.      
11e10 7d 0a 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20  }.      zData = 
11e20 73 4d 65 6d 2e 7a 3b 0a 20 20 20 20 7d 0a 20 20  sMem.z;.    }.  
11e30 20 20 7a 45 6e 64 48 64 72 20 3d 20 28 75 38 20    zEndHdr = (u8 
11e40 2a 29 26 7a 44 61 74 61 5b 6c 65 6e 5d 3b 0a 20  *)&zData[len];. 
11e50 20 20 20 7a 49 64 78 20 3d 20 28 75 38 20 2a 29     zIdx = (u8 *)
11e60 26 7a 44 61 74 61 5b 73 7a 48 64 72 5d 3b 0a 0a  &zData[szHdr];..
11e70 20 20 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20      /* Scan the 
11e80 68 65 61 64 65 72 20 61 6e 64 20 75 73 65 20 69  header and use i
11e90 74 20 74 6f 20 66 69 6c 6c 20 69 6e 20 74 68 65  t to fill in the
11ea0 20 61 54 79 70 65 5b 5d 20 61 6e 64 20 61 4f 66   aType[] and aOf
11eb0 66 73 65 74 5b 5d 0a 20 20 20 20 2a 2a 20 61 72  fset[].    ** ar
11ec0 72 61 79 73 2e 20 20 61 54 79 70 65 5b 69 5d 20  rays.  aType[i] 
11ed0 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65  will contain the
11ee0 20 74 79 70 65 20 69 6e 74 65 67 65 72 20 66 6f   type integer fo
11ef0 72 20 74 68 65 20 69 2d 74 68 0a 20 20 20 20 2a  r the i-th.    *
11f00 2a 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 61 4f 66  * column and aOf
11f10 66 73 65 74 5b 69 5d 20 77 69 6c 6c 20 63 6f 6e  fset[i] will con
11f20 74 61 69 6e 20 74 68 65 20 6f 66 66 73 65 74 20  tain the offset 
11f30 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
11f40 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ng.    ** of the
11f50 20 72 65 63 6f 72 64 20 74 6f 20 74 68 65 20 73   record to the s
11f60 74 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  tart of the data
11f70 20 66 6f 72 20 74 68 65 20 69 2d 74 68 20 63 6f   for the i-th co
11f80 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lumn.    */.    
11f90 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c  for(i=0; i<nFiel
11fa0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  d; i++){.      i
11fb0 66 28 20 7a 49 64 78 3c 7a 45 6e 64 48 64 72 20  f( zIdx<zEndHdr 
11fc0 29 7b 0a 20 20 20 20 20 20 20 20 61 4f 66 66 73  ){.        aOffs
11fd0 65 74 5b 69 5d 20 3d 20 6f 66 66 73 65 74 3b 0a  et[i] = offset;.
11fe0 20 20 20 20 20 20 20 20 7a 49 64 78 20 2b 3d 20          zIdx += 
11ff0 67 65 74 56 61 72 69 6e 74 33 32 28 7a 49 64 78  getVarint32(zIdx
12000 2c 20 61 54 79 70 65 5b 69 5d 29 3b 0a 20 20 20  , aType[i]);.   
12010 20 20 20 20 20 73 7a 46 69 65 6c 64 20 3d 20 73       szField = s
12020 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
12030 54 79 70 65 4c 65 6e 28 61 54 79 70 65 5b 69 5d  TypeLen(aType[i]
12040 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  );.        offse
12050 74 20 2b 3d 20 73 7a 46 69 65 6c 64 3b 0a 20 20  t += szField;.  
12060 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
12070 3c 73 7a 46 69 65 6c 64 20 29 7b 20 20 2f 2a 20  <szField ){  /* 
12080 54 72 75 65 20 69 66 20 6f 66 66 73 65 74 20 6f  True if offset o
12090 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 20 20  verflows */.    
120a0 20 20 20 20 20 20 7a 49 64 78 20 3d 20 26 7a 45        zIdx = &zE
120b0 6e 64 48 64 72 5b 31 5d 3b 20 20 2f 2a 20 46 6f  ndHdr[1];  /* Fo
120c0 72 63 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  rces SQLITE_CORR
120d0 55 50 54 20 72 65 74 75 72 6e 20 62 65 6c 6f 77  UPT return below
120e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 62 72   */.          br
120f0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
12100 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12110 20 20 20 20 2f 2a 20 49 66 20 69 20 69 73 20 6c      /* If i is l
12120 65 73 73 20 74 68 61 74 20 6e 46 69 65 6c 64 2c  ess that nField,
12130 20 74 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   then there are 
12140 6c 65 73 73 20 66 69 65 6c 64 73 20 69 6e 20 74  less fields in t
12150 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  his.        ** r
12160 65 63 6f 72 64 20 74 68 61 6e 20 53 65 74 4e 75  ecord than SetNu
12170 6d 43 6f 6c 75 6d 6e 73 20 69 6e 64 69 63 61 74  mColumns indicat
12180 65 64 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c  ed there are col
12190 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20  umns in the.    
121a0 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 53 65      ** table. Se
121b0 74 20 74 68 65 20 6f 66 66 73 65 74 20 66 6f 72  t the offset for
121c0 20 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d   any extra colum
121d0 6e 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  ns not present i
121e0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
121f0 20 72 65 63 6f 72 64 20 74 6f 20 30 2e 20 54 68   record to 0. Th
12200 69 73 20 74 65 6c 6c 73 20 63 6f 64 65 20 62 65  is tells code be
12210 6c 6f 77 20 74 6f 20 73 74 6f 72 65 20 61 20 4e  low to store a N
12220 55 4c 4c 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ULL.        ** i
12230 6e 73 74 65 61 64 20 6f 66 20 64 65 73 65 72 69  nstead of deseri
12240 61 6c 69 7a 69 6e 67 20 61 20 76 61 6c 75 65 20  alizing a value 
12250 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 2e  from the record.
12260 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
12270 20 20 20 20 61 4f 66 66 73 65 74 5b 69 5d 20 3d      aOffset[i] =
12280 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
12290 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
122a0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 73 4d 65  eMemRelease(&sMe
122b0 6d 29 3b 0a 20 20 20 20 73 4d 65 6d 2e 66 6c 61  m);.    sMem.fla
122c0 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 0a  gs = MEM_Null;..
122d0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76      /* If we hav
122e0 65 20 72 65 61 64 20 6d 6f 72 65 20 68 65 61 64  e read more head
122f0 65 72 20 64 61 74 61 20 74 68 61 6e 20 77 61 73  er data than was
12300 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
12310 65 20 68 65 61 64 65 72 2c 0a 20 20 20 20 2a 2a  e header,.    **
12320 20 6f 72 20 69 66 20 74 68 65 20 65 6e 64 20 6f   or if the end o
12330 66 20 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64  f the last field
12340 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 70   appears to be p
12350 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
12360 68 65 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64  he.    ** record
12370 2c 20 6f 72 20 69 66 20 74 68 65 20 65 6e 64 20  , or if the end 
12380 6f 66 20 74 68 65 20 6c 61 73 74 20 66 69 65 6c  of the last fiel
12390 64 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  d appears to be 
123a0 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64 0a 20  before the end. 
123b0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 65 63     ** of the rec
123c0 6f 72 64 20 28 77 68 65 6e 20 61 6c 6c 20 66 69  ord (when all fi
123d0 65 6c 64 73 20 70 72 65 73 65 6e 74 29 2c 20 74  elds present), t
123e0 68 65 6e 20 77 65 20 6d 75 73 74 20 62 65 20 64  hen we must be d
123f0 65 61 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 77  ealing .    ** w
12400 69 74 68 20 61 20 63 6f 72 72 75 70 74 20 64 61  ith a corrupt da
12410 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
12420 20 20 20 69 66 28 20 28 7a 49 64 78 20 3e 20 7a     if( (zIdx > z
12430 45 6e 64 48 64 72 29 20 7c 7c 20 28 6f 66 66 73  EndHdr) || (offs
12440 65 74 20 3e 20 70 61 79 6c 6f 61 64 53 69 7a 65  et > payloadSize
12450 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 7a  ).         || (z
12460 49 64 78 3d 3d 7a 45 6e 64 48 64 72 20 26 26 20  Idx==zEndHdr && 
12470 6f 66 66 73 65 74 21 3d 70 61 79 6c 6f 61 64 53  offset!=payloadS
12480 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ize) ){.      rc
12490 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
124a0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
124b0 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74  to op_column_out
124c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
124d0 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e  * Get the column
124e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 49 66   information. If
124f0 20 61 4f 66 66 73 65 74 5b 70 32 5d 20 69 73 20   aOffset[p2] is 
12500 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 0a  non-zero, then .
12510 20 20 2a 2a 20 64 65 73 65 72 69 61 6c 69 7a 65    ** deserialize
12520 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
12530 74 68 65 20 72 65 63 6f 72 64 2e 20 49 66 20 61  the record. If a
12540 4f 66 66 73 65 74 5b 70 32 5d 20 69 73 20 7a 65  Offset[p2] is ze
12550 72 6f 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  ro,.  ** then th
12560 65 72 65 20 61 72 65 20 6e 6f 74 20 65 6e 6f 75  ere are not enou
12570 67 68 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  gh fields in the
12580 20 72 65 63 6f 72 64 20 74 6f 20 73 61 74 69 73   record to satis
12590 66 79 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75  fy the.  ** requ
125a0 65 73 74 2e 20 20 49 6e 20 74 68 69 73 20 63 61  est.  In this ca
125b0 73 65 2c 20 73 65 74 20 74 68 65 20 76 61 6c 75  se, set the valu
125c0 65 20 4e 55 4c 4c 20 6f 72 20 74 6f 20 50 34 20  e NULL or to P4 
125d0 69 66 20 50 34 20 69 73 0a 20 20 2a 2a 20 61 20  if P4 is.  ** a 
125e0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d  pointer to a Mem
125f0 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   object..  */.  
12600 69 66 28 20 61 4f 66 66 73 65 74 5b 70 32 5d 20  if( aOffset[p2] 
12610 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
12620 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
12630 20 20 20 20 69 66 28 20 7a 52 65 63 20 29 7b 0a      if( zRec ){.
12640 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12650 65 4d 65 6d 52 65 6c 65 61 73 65 45 78 74 65 72  eMemReleaseExter
12660 6e 61 6c 28 70 44 65 73 74 29 3b 0a 20 20 20 20  nal(pDest);.    
12670 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
12680 69 61 6c 47 65 74 28 28 75 38 20 2a 29 26 7a 52  ialGet((u8 *)&zR
12690 65 63 5b 61 4f 66 66 73 65 74 5b 70 32 5d 5d 2c  ec[aOffset[p2]],
126a0 20 61 54 79 70 65 5b 70 32 5d 2c 20 70 44 65 73   aType[p2], pDes
126b0 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
126c0 20 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74       len = sqlit
126d0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
126e0 4c 65 6e 28 61 54 79 70 65 5b 70 32 5d 29 3b 0a  Len(aType[p2]);.
126f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12700 65 4d 65 6d 4d 6f 76 65 28 26 73 4d 65 6d 2c 20  eMemMove(&sMem, 
12710 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72 63  pDest);.      rc
12720 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
12730 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 72 73 72  mFromBtree(pCrsr
12740 2c 20 61 4f 66 66 73 65 74 5b 70 32 5d 2c 20 6c  , aOffset[p2], l
12750 65 6e 2c 20 70 43 2d 3e 69 73 49 6e 64 65 78 2c  en, pC->isIndex,
12760 20 26 73 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69   &sMem);.      i
12770 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12780 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
12790 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a   op_column_out;.
127a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 44        }.      zD
127b0 61 74 61 20 3d 20 73 4d 65 6d 2e 7a 3b 0a 20 20  ata = sMem.z;.  
127c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
127d0 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 7a 44  erialGet((u8*)zD
127e0 61 74 61 2c 20 61 54 79 70 65 5b 70 32 5d 2c 20  ata, aType[p2], 
127f0 70 44 65 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pDest);.    }.  
12800 20 20 70 44 65 73 74 2d 3e 65 6e 63 20 3d 20 65    pDest->enc = e
12810 6e 63 6f 64 69 6e 67 3b 0a 20 20 7d 65 6c 73 65  ncoding;.  }else
12820 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  {.    if( pOp->p
12830 34 74 79 70 65 3d 3d 50 34 5f 4d 45 4d 20 29 7b  4type==P4_MEM ){
12840 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12850 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
12860 28 70 44 65 73 74 2c 20 70 4f 70 2d 3e 70 34 2e  (pDest, pOp->p4.
12870 70 4d 65 6d 2c 20 4d 45 4d 5f 53 74 61 74 69 63  pMem, MEM_Static
12880 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12890 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73      assert( pDes
128a0 74 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  t->flags&MEM_Nul
128b0 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  l );.    }.  }..
128c0 20 20 2f 2a 20 49 66 20 77 65 20 64 79 6e 61 6d    /* If we dynam
128d0 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
128e0 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   space to hold t
128f0 68 65 20 64 61 74 61 20 28 69 6e 20 74 68 65 0a  he data (in the.
12900 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
12910 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 29 20 63  MemFromBtree() c
12920 61 6c 6c 20 61 62 6f 76 65 29 20 74 68 65 6e 20  all above) then 
12930 74 72 61 6e 73 66 65 72 20 63 6f 6e 74 72 6f 6c  transfer control
12940 20 6f 66 20 74 68 61 74 0a 20 20 2a 2a 20 64 79   of that.  ** dy
12950 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
12960 74 65 64 20 73 70 61 63 65 20 6f 76 65 72 20 74  ted space over t
12970 6f 20 74 68 65 20 70 44 65 73 74 20 73 74 72 75  o the pDest stru
12980 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 69 73  cture..  ** This
12990 20 70 72 65 76 65 6e 74 73 20 61 20 6d 65 6d 6f   prevents a memo
129a0 72 79 20 63 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20  ry copy..  */.  
129b0 69 66 28 20 73 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63  if( sMem.zMalloc
129c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
129d0 73 4d 65 6d 2e 7a 3d 3d 73 4d 65 6d 2e 7a 4d 61  sMem.z==sMem.zMa
129e0 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 61 73 73 65  lloc );.    asse
129f0 72 74 28 20 21 28 70 44 65 73 74 2d 3e 66 6c 61  rt( !(pDest->fla
12a00 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29 20 29 3b  gs & MEM_Dyn) );
12a10 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 28 70  .    assert( !(p
12a20 44 65 73 74 2d 3e 66 6c 61 67 73 20 26 20 28 4d  Dest->flags & (M
12a30 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29  EM_Blob|MEM_Str)
12a40 29 20 7c 7c 20 70 44 65 73 74 2d 3e 7a 3d 3d 73  ) || pDest->z==s
12a50 4d 65 6d 2e 7a 20 29 3b 0a 20 20 20 20 70 44 65  Mem.z );.    pDe
12a60 73 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d  st->flags &= ~(M
12a70 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 61  EM_Ephem|MEM_Sta
12a80 74 69 63 29 3b 0a 20 20 20 20 70 44 65 73 74 2d  tic);.    pDest-
12a90 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65  >flags |= MEM_Te
12aa0 72 6d 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 7a  rm;.    pDest->z
12ab0 20 3d 20 73 4d 65 6d 2e 7a 3b 0a 20 20 20 20 70   = sMem.z;.    p
12ac0 44 65 73 74 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20  Dest->zMalloc = 
12ad0 73 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20  sMem.zMalloc;.  
12ae0 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
12af0 33 56 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74  3VdbeMemMakeWrit
12b00 65 61 62 6c 65 28 70 44 65 73 74 29 3b 0a 0a 6f  eable(pDest);..o
12b10 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3a 0a 20 20  p_column_out:.  
12b20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
12b30 49 5a 45 28 70 44 65 73 74 29 3b 0a 20 20 52 45  IZE(pDest);.  RE
12b40 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
12b50 2d 3e 70 33 2c 20 70 44 65 73 74 29 3b 0a 20 20  ->p3, pDest);.  
12b60 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
12b70 6f 64 65 3a 20 41 66 66 69 6e 69 74 79 20 50 31  ode: Affinity P1
12b80 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a   P2 * P4 *.**.**
12b90 20 41 70 70 6c 79 20 61 66 66 69 6e 69 74 69 65   Apply affinitie
12ba0 73 20 74 6f 20 61 20 72 61 6e 67 65 20 6f 66 20  s to a range of 
12bb0 50 32 20 72 65 67 69 73 74 65 72 73 20 73 74 61  P2 registers sta
12bc0 72 74 69 6e 67 20 77 69 74 68 20 50 31 2e 0a 2a  rting with P1..*
12bd0 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 73 74 72  *.** P4 is a str
12be0 69 6e 67 20 74 68 61 74 20 69 73 20 50 32 20 63  ing that is P2 c
12bf0 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20  haracters long. 
12c00 54 68 65 20 6e 74 68 20 63 68 61 72 61 63 74 65  The nth characte
12c10 72 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 72 69  r of the.** stri
12c20 6e 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  ng indicates the
12c30 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
12c40 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
12c50 75 73 65 64 20 66 6f 72 20 74 68 65 20 6e 74 68  used for the nth
12c60 0a 2a 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  .** memory cell 
12c70 69 6e 20 74 68 65 20 72 61 6e 67 65 2e 0a 2a 2f  in the range..*/
12c80 0a 63 61 73 65 20 4f 50 5f 41 66 66 69 6e 69 74  .case OP_Affinit
12c90 79 3a 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  y: {.  const cha
12ca0 72 20 2a 7a 41 66 66 69 6e 69 74 79 3b 20 20 20  r *zAffinity;   
12cb0 2f 2a 20 54 68 65 20 61 66 66 69 6e 69 74 79 20  /* The affinity 
12cc0 74 6f 20 62 65 20 61 70 70 6c 69 65 64 20 2a 2f  to be applied */
12cd0 0a 20 20 63 68 61 72 20 63 41 66 66 3b 20 20 20  .  char cAff;   
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
12cf0 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65   single characte
12d00 72 20 6f 66 20 61 66 66 69 6e 69 74 79 20 2a 2f  r of affinity */
12d10 0a 0a 20 20 7a 41 66 66 69 6e 69 74 79 20 3d 20  ..  zAffinity = 
12d20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 61 73 73  pOp->p4.z;.  ass
12d30 65 72 74 28 20 7a 41 66 66 69 6e 69 74 79 21 3d  ert( zAffinity!=
12d40 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  0 );.  assert( z
12d50 41 66 66 69 6e 69 74 79 5b 70 4f 70 2d 3e 70 32  Affinity[pOp->p2
12d60 5d 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31 20 3d  ]==0 );.  pIn1 =
12d70 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
12d80 0a 20 20 77 68 69 6c 65 28 20 28 63 41 66 66 20  .  while( (cAff 
12d90 3d 20 2a 28 7a 41 66 66 69 6e 69 74 79 2b 2b 29  = *(zAffinity++)
12da0 29 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )!=0 ){.    asse
12db0 72 74 28 20 70 49 6e 31 20 3c 3d 20 26 70 2d 3e  rt( pIn1 <= &p->
12dc0 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 5d 20 29 3b  aMem[p->nMem] );
12dd0 0a 20 20 20 20 45 78 70 61 6e 64 42 6c 6f 62 28  .    ExpandBlob(
12de0 70 49 6e 31 29 3b 0a 20 20 20 20 61 70 70 6c 79  pIn1);.    apply
12df0 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 63  Affinity(pIn1, c
12e00 41 66 66 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  Aff, encoding);.
12e10 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20 20 7d 0a      pIn1++;.  }.
12e20 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
12e30 70 63 6f 64 65 3a 20 4d 61 6b 65 52 65 63 6f 72  pcode: MakeRecor
12e40 64 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  d P1 P2 P3 P4 *.
12e50 2a 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 50 32  **.** Convert P2
12e60 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e   registers begin
12e70 6e 69 6e 67 20 77 69 74 68 20 50 31 20 69 6e 74  ning with P1 int
12e80 6f 20 61 20 73 69 6e 67 6c 65 20 65 6e 74 72 79  o a single entry
12e90 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72  .** suitable for
12ea0 20 75 73 65 20 61 73 20 61 20 64 61 74 61 20 72   use as a data r
12eb0 65 63 6f 72 64 20 69 6e 20 61 20 64 61 74 61 62  ecord in a datab
12ec0 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 73 20  ase table or as 
12ed0 61 20 6b 65 79 0a 2a 2a 20 69 6e 20 61 6e 20 69  a key.** in an i
12ee0 6e 64 65 78 2e 20 20 54 68 65 20 64 65 74 61 69  ndex.  The detai
12ef0 6c 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 61 74  ls of the format
12f00 20 61 72 65 20 69 72 72 65 6c 65 76 61 6e 74 20   are irrelevant 
12f10 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 74 68  as long as.** th
12f20 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f  e OP_Column opco
12f30 64 65 20 63 61 6e 20 64 65 63 6f 64 65 20 74 68  de can decode th
12f40 65 20 72 65 63 6f 72 64 20 6c 61 74 65 72 2e 0a  e record later..
12f50 2a 2a 20 52 65 66 65 72 20 74 6f 20 73 6f 75 72  ** Refer to sour
12f60 63 65 20 63 6f 64 65 20 63 6f 6d 6d 65 6e 74 73  ce code comments
12f70 20 66 6f 72 20 74 68 65 20 64 65 74 61 69 6c 73   for the details
12f80 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 0a 2a   of the record.*
12f90 2a 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  * format..**.** 
12fa0 50 34 20 6d 61 79 20 62 65 20 61 20 73 74 72 69  P4 may be a stri
12fb0 6e 67 20 74 68 61 74 20 69 73 20 50 32 20 63 68  ng that is P2 ch
12fc0 61 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20 20  aracters long.  
12fd0 54 68 65 20 6e 74 68 20 63 68 61 72 61 63 74 65  The nth characte
12fe0 72 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 72 69  r of the.** stri
12ff0 6e 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  ng indicates the
13000 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
13010 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
13020 75 73 65 64 20 66 6f 72 20 74 68 65 20 6e 74 68  used for the nth
13030 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
13040 20 69 6e 64 65 78 20 6b 65 79 2e 0a 2a 2a 0a 2a   index key..**.*
13050 2a 20 54 68 65 20 6d 61 70 70 69 6e 67 20 66 72  * The mapping fr
13060 6f 6d 20 63 68 61 72 61 63 74 65 72 20 74 6f 20  om character to 
13070 61 66 66 69 6e 69 74 79 20 69 73 20 67 69 76 65  affinity is give
13080 6e 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  n by the SQLITE_
13090 41 46 46 5f 0a 2a 2a 20 6d 61 63 72 6f 73 20 64  AFF_.** macros d
130a0 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
130b0 49 6e 74 2e 68 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Int.h..**.** If 
130c0 50 34 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  P4 is NULL then 
130d0 61 6c 6c 20 69 6e 64 65 78 20 66 69 65 6c 64 73  all index fields
130e0 20 68 61 76 65 20 74 68 65 20 61 66 66 69 6e 69   have the affini
130f0 74 79 20 4e 4f 4e 45 2e 0a 2a 2f 0a 63 61 73 65  ty NONE..*/.case
13100 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 3a 20   OP_MakeRecord: 
13110 7b 0a 20 20 75 38 20 2a 7a 4e 65 77 52 65 63 6f  {.  u8 *zNewReco
13120 72 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  rd;        /* A 
13130 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
13140 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  he data for the 
13150 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  new record */.  
13160 4d 65 6d 20 2a 70 52 65 63 3b 20 20 20 20 20 20  Mem *pRec;      
13170 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
13180 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 75 36  w record */.  u6
13190 34 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20  4 nData;        
131a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
131b0 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
131c0 73 70 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  space */.  int n
131d0 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
131e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
131f0 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
13200 70 61 63 65 20 2a 2f 0a 20 20 69 36 34 20 6e 42  pace */.  i64 nB
13210 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
13220 20 2f 2a 20 44 61 74 61 20 73 70 61 63 65 20 72   /* Data space r
13230 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 69 73  equired for this
13240 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
13250 20 6e 5a 65 72 6f 3b 20 20 20 20 20 20 20 20 20   nZero;         
13260 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13270 20 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74   zero bytes at t
13280 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65  he end of the re
13290 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  cord */.  int nV
132a0 61 72 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  arint;          
132b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
132c0 74 65 73 20 69 6e 20 61 20 76 61 72 69 6e 74 20  tes in a varint 
132d0 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
132e0 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  type;       /* T
132f0 79 70 65 20 66 69 65 6c 64 20 2a 2f 0a 20 20 4d  ype field */.  M
13300 65 6d 20 2a 70 44 61 74 61 30 3b 20 20 20 20 20  em *pData0;     
13310 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66        /* First f
13320 69 65 6c 64 20 74 6f 20 62 65 20 63 6f 6d 62 69  ield to be combi
13330 6e 65 64 20 69 6e 74 6f 20 74 68 65 20 72 65 63  ned into the rec
13340 6f 72 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4c  ord */.  Mem *pL
13350 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
13360 2f 2a 20 4c 61 73 74 20 66 69 65 6c 64 20 6f 66  /* Last field of
13370 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20   the record */. 
13380 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20   int nField;    
13390 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
133a0 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74  r of fields in t
133b0 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  he record */.  c
133c0 68 61 72 20 2a 7a 41 66 66 69 6e 69 74 79 3b 20  har *zAffinity; 
133d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 66 66        /* The aff
133e0 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72  inity string for
133f0 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20   the record */. 
13400 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
13410 3b 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20  ;       /* File 
13420 66 6f 72 6d 61 74 20 74 6f 20 75 73 65 20 66 6f  format to use fo
13430 72 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  r encoding */.  
13440 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
13450 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
13460 75 73 65 64 20 69 6e 20 7a 4e 65 77 52 65 63 6f  used in zNewReco
13470 72 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  rd[] */.  int le
13480 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
13490 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 61 20   /* Length of a 
134a0 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41  field */..  /* A
134b0 73 73 75 6d 69 6e 67 20 74 68 65 20 72 65 63 6f  ssuming the reco
134c0 72 64 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69  rd contains N fi
134d0 65 6c 64 73 2c 20 74 68 65 20 72 65 63 6f 72 64  elds, the record
134e0 20 66 6f 72 6d 61 74 20 6c 6f 6f 6b 73 0a 20 20   format looks.  
134f0 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  ** like this:.  
13500 2a 2a 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  **.  ** --------
13510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13550 0a 20 20 2a 2a 20 7c 20 68 64 72 2d 73 69 7a 65  .  ** | hdr-size
13560 20 7c 20 74 79 70 65 20 30 20 7c 20 74 79 70 65   | type 0 | type
13570 20 31 20 7c 20 2e 2e 2e 20 7c 20 74 79 70 65 20   1 | ... | type 
13580 4e 2d 31 20 7c 20 64 61 74 61 30 20 7c 20 2e 2e  N-1 | data0 | ..
13590 2e 20 7c 20 64 61 74 61 20 4e 2d 31 20 7c 20 0a  . | data N-1 | .
135a0 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    ** -----------
135b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20  -------------.  
135f0 2a 2a 0a 20 20 2a 2a 20 44 61 74 61 28 30 29 20  **.  ** Data(0) 
13600 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65  is taken from re
13610 67 69 73 74 65 72 20 50 31 2e 20 20 44 61 74 61  gister P1.  Data
13620 28 31 29 20 63 6f 6d 65 73 20 66 72 6f 6d 20 72  (1) comes from r
13630 65 67 69 73 74 65 72 20 50 31 2b 31 0a 20 20 2a  egister P1+1.  *
13640 2a 20 61 6e 64 20 73 6f 20 66 72 6f 74 68 2e 0a  * and so froth..
13650 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 63 68 20 74    **.  ** Each t
13660 79 70 65 20 66 69 65 6c 64 20 69 73 20 61 20 76  ype field is a v
13670 61 72 69 6e 74 20 72 65 70 72 65 73 65 6e 74 69  arint representi
13680 6e 67 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  ng the serial ty
13690 70 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  pe of the .  ** 
136a0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61  corresponding da
136b0 74 61 20 65 6c 65 6d 65 6e 74 20 28 73 65 65 20  ta element (see 
136c0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
136d0 6c 54 79 70 65 28 29 29 2e 20 54 68 65 0a 20 20  lType()). The.  
136e0 2a 2a 20 68 64 72 2d 73 69 7a 65 20 66 69 65 6c  ** hdr-size fiel
136f0 64 20 69 73 20 61 6c 73 6f 20 61 20 76 61 72 69  d is also a vari
13700 6e 74 20 77 68 69 63 68 20 69 73 20 74 68 65 20  nt which is the 
13710 6f 66 66 73 65 74 20 66 72 6f 6d 20 74 68 65 20  offset from the 
13720 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f  beginning.  ** o
13730 66 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20  f the record to 
13740 64 61 74 61 30 2e 0a 20 20 2a 2f 0a 20 20 6e 44  data0..  */.  nD
13750 61 74 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ata = 0;        
13760 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
13770 74 65 73 20 6f 66 20 64 61 74 61 20 73 70 61 63  tes of data spac
13780 65 20 2a 2f 0a 20 20 6e 48 64 72 20 3d 20 30 3b  e */.  nHdr = 0;
13790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
137a0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
137b0 68 65 61 64 65 72 20 73 70 61 63 65 20 2a 2f 0a  header space */.
137c0 20 20 6e 42 79 74 65 20 3d 20 30 3b 20 20 20 20    nByte = 0;    
137d0 20 20 20 20 20 2f 2a 20 44 61 74 61 20 73 70 61       /* Data spa
137e0 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
137f0 74 68 69 73 20 72 65 63 6f 72 64 20 2a 2f 0a 20  this record */. 
13800 20 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20   nZero = 0;     
13810 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13820 20 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74   zero bytes at t
13830 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65  he end of the re
13840 63 6f 72 64 20 2a 2f 0a 20 20 6e 46 69 65 6c 64  cord */.  nField
13850 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 41   = pOp->p1;.  zA
13860 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70  ffinity = pOp->p
13870 34 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  4.z;.  assert( n
13880 46 69 65 6c 64 3e 30 20 26 26 20 70 4f 70 2d 3e  Field>0 && pOp->
13890 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b  p2>0 && pOp->p2+
138a0 6e 46 69 65 6c 64 3c 3d 70 2d 3e 6e 4d 65 6d 2b  nField<=p->nMem+
138b0 31 20 29 3b 0a 20 20 70 44 61 74 61 30 20 3d 20  1 );.  pData0 = 
138c0 26 61 4d 65 6d 5b 6e 46 69 65 6c 64 5d 3b 0a 20  &aMem[nField];. 
138d0 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70   nField = pOp->p
138e0 32 3b 0a 20 20 70 4c 61 73 74 20 3d 20 26 70 44  2;.  pLast = &pD
138f0 61 74 61 30 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a  ata0[nField-1];.
13900 20 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20    file_format = 
13910 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
13920 6f 72 6d 61 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  ormat;..  /* Loo
13930 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 6c  p through the el
13940 65 6d 65 6e 74 73 20 74 68 61 74 20 77 69 6c 6c  ements that will
13950 20 6d 61 6b 65 20 75 70 20 74 68 65 20 72 65 63   make up the rec
13960 6f 72 64 20 74 6f 20 66 69 67 75 72 65 0a 20 20  ord to figure.  
13970 2a 2a 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20  ** out how much 
13980 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65  space is require
13990 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 72 65  d for the new re
139a0 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  cord..  */.  for
139b0 28 70 52 65 63 3d 70 44 61 74 61 30 3b 20 70 52  (pRec=pData0; pR
139c0 65 63 3c 3d 70 4c 61 73 74 3b 20 70 52 65 63 2b  ec<=pLast; pRec+
139d0 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 41 66 66  +){.    if( zAff
139e0 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 61  inity ){.      a
139f0 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65  pplyAffinity(pRe
13a00 63 2c 20 7a 41 66 66 69 6e 69 74 79 5b 70 52 65  c, zAffinity[pRe
13a10 63 2d 70 44 61 74 61 30 5d 2c 20 65 6e 63 6f 64  c-pData0], encod
13a20 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ing);.    }.    
13a30 69 66 28 20 70 52 65 63 2d 3e 66 6c 61 67 73 26  if( pRec->flags&
13a40 4d 45 4d 5f 5a 65 72 6f 20 26 26 20 70 52 65 63  MEM_Zero && pRec
13a50 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  ->n>0 ){.      s
13a60 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 45 78 70  qlite3VdbeMemExp
13a70 61 6e 64 42 6c 6f 62 28 70 52 65 63 29 3b 0a 20  andBlob(pRec);. 
13a80 20 20 20 7d 0a 20 20 20 20 73 65 72 69 61 6c 5f     }.    serial_
13a90 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64  type = sqlite3Vd
13aa0 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 52 65  beSerialType(pRe
13ab0 63 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b  c, file_format);
13ac0 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  .    len = sqlit
13ad0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
13ae0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
13af0 3b 0a 20 20 20 20 6e 44 61 74 61 20 2b 3d 20 6c  ;.    nData += l
13b00 65 6e 3b 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20  en;.    nHdr += 
13b10 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e  sqlite3VarintLen
13b20 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
13b30 20 20 20 69 66 28 20 70 52 65 63 2d 3e 66 6c 61     if( pRec->fla
13b40 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
13b50 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70  .      /* Only p
13b60 75 72 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  ure zero-filled 
13b70 42 4c 4f 42 73 20 63 61 6e 20 62 65 20 69 6e 70  BLOBs can be inp
13b80 75 74 20 74 6f 20 74 68 69 73 20 4f 70 63 6f 64  ut to this Opcod
13b90 65 2e 0a 20 20 20 20 20 20 2a 2a 20 57 65 20 64  e..      ** We d
13ba0 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 62 6c 6f 62  o not allow blob
13bb0 73 20 77 69 74 68 20 61 20 70 72 65 66 69 78 20  s with a prefix 
13bc0 61 6e 64 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65  and a zero-fille
13bd0 64 20 74 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20  d tail. */.     
13be0 20 6e 5a 65 72 6f 20 2b 3d 20 70 52 65 63 2d 3e   nZero += pRec->
13bf0 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 65 6c  u.nZero;.    }el
13c00 73 65 20 69 66 28 20 6c 65 6e 20 29 7b 0a 20 20  se if( len ){.  
13c10 20 20 20 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20      nZero = 0;. 
13c20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
13c30 64 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 68  dd the initial h
13c40 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 6e 64  eader varint and
13c50 20 74 6f 74 61 6c 20 74 68 65 20 73 69 7a 65 20   total the size 
13c60 2a 2f 0a 20 20 6e 48 64 72 20 2b 3d 20 6e 56 61  */.  nHdr += nVa
13c70 72 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 61  rint = sqlite3Va
13c80 72 69 6e 74 4c 65 6e 28 6e 48 64 72 29 3b 0a 20  rintLen(nHdr);. 
13c90 20 69 66 28 20 6e 56 61 72 69 6e 74 3c 73 71 6c   if( nVarint<sql
13ca0 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 6e 48  ite3VarintLen(nH
13cb0 64 72 29 20 29 7b 0a 20 20 20 20 6e 48 64 72 2b  dr) ){.    nHdr+
13cc0 2b 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  +;.  }.  nByte =
13cd0 20 6e 48 64 72 2b 6e 44 61 74 61 2d 6e 5a 65 72   nHdr+nData-nZer
13ce0 6f 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 64  o;.  if( nByte>d
13cf0 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
13d00 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29  _LIMIT_LENGTH] )
13d10 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62  {.    goto too_b
13d20 69 67 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  ig;.  }..  /* Ma
13d30 6b 65 20 73 75 72 65 20 74 68 65 20 6f 75 74 70  ke sure the outp
13d40 75 74 20 72 65 67 69 73 74 65 72 20 68 61 73 20  ut register has 
13d50 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20 65  a buffer large e
13d60 6e 6f 75 67 68 20 74 6f 20 73 74 6f 72 65 20 0a  nough to store .
13d70 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 72 65 63    ** the new rec
13d80 6f 72 64 2e 20 54 68 65 20 6f 75 74 70 75 74 20  ord. The output 
13d90 72 65 67 69 73 74 65 72 20 28 70 4f 70 2d 3e 70  register (pOp->p
13da0 33 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  3) is not allowe
13db0 64 20 74 6f 0a 20 20 2a 2a 20 62 65 20 6f 6e 65  d to.  ** be one
13dc0 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 72 65   of the input re
13dd0 67 69 73 74 65 72 73 20 28 62 65 63 61 75 73 65  gisters (because
13de0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
13df0 61 6c 6c 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69  all to.  ** sqli
13e00 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 29  te3VdbeMemGrow()
13e10 20 63 6f 75 6c 64 20 63 6c 6f 62 62 65 72 20 74   could clobber t
13e20 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
13e30 69 74 20 69 73 20 75 73 65 64 29 2e 0a 20 20 2a  it is used)..  *
13e40 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  /.  assert( pOp-
13e50 3e 70 33 3c 70 4f 70 2d 3e 70 31 20 7c 7c 20 70  >p3<pOp->p1 || p
13e60 4f 70 2d 3e 70 33 3e 3d 70 4f 70 2d 3e 70 31 2b  Op->p3>=pOp->p1+
13e70 70 4f 70 2d 3e 70 32 20 29 3b 0a 20 20 70 4f 75  pOp->p2 );.  pOu
13e80 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
13e90 33 5d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  3];.  if( sqlite
13ea0 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4f 75  3VdbeMemGrow(pOu
13eb0 74 2c 20 28 69 6e 74 29 6e 42 79 74 65 2c 20 30  t, (int)nByte, 0
13ec0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f  ) ){.    goto no
13ed0 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 7a 4e 65 77  _mem;.  }.  zNew
13ee0 52 65 63 6f 72 64 20 3d 20 28 75 38 20 2a 29 70  Record = (u8 *)p
13ef0 4f 75 74 2d 3e 7a 3b 0a 0a 20 20 2f 2a 20 57 72  Out->z;..  /* Wr
13f00 69 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 2a  ite the record *
13f10 2f 0a 20 20 69 20 3d 20 70 75 74 56 61 72 69 6e  /.  i = putVarin
13f20 74 33 32 28 7a 4e 65 77 52 65 63 6f 72 64 2c 20  t32(zNewRecord, 
13f30 6e 48 64 72 29 3b 0a 20 20 66 6f 72 28 70 52 65  nHdr);.  for(pRe
13f40 63 3d 70 44 61 74 61 30 3b 20 70 52 65 63 3c 3d  c=pData0; pRec<=
13f50 70 4c 61 73 74 3b 20 70 52 65 63 2b 2b 29 7b 0a  pLast; pRec++){.
13f60 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
13f70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
13f80 69 61 6c 54 79 70 65 28 70 52 65 63 2c 20 66 69  ialType(pRec, fi
13f90 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20  le_format);.    
13fa0 69 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32  i += putVarint32
13fb0 28 26 7a 4e 65 77 52 65 63 6f 72 64 5b 69 5d 2c  (&zNewRecord[i],
13fc0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 20 20   serial_type);  
13fd0 20 20 20 20 2f 2a 20 73 65 72 69 61 6c 20 74 79      /* serial ty
13fe0 70 65 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28  pe */.  }.  for(
13ff0 70 52 65 63 3d 70 44 61 74 61 30 3b 20 70 52 65  pRec=pData0; pRe
14000 63 3c 3d 70 4c 61 73 74 3b 20 70 52 65 63 2b 2b  c<=pLast; pRec++
14010 29 7b 20 20 2f 2a 20 73 65 72 69 61 6c 20 64 61  ){  /* serial da
14020 74 61 20 2a 2f 0a 20 20 20 20 69 20 2b 3d 20 73  ta */.    i += s
14030 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14040 50 75 74 28 26 7a 4e 65 77 52 65 63 6f 72 64 5b  Put(&zNewRecord[
14050 69 5d 2c 20 28 69 6e 74 29 28 6e 42 79 74 65 2d  i], (int)(nByte-
14060 69 29 2c 20 70 52 65 63 2c 66 69 6c 65 5f 66 6f  i), pRec,file_fo
14070 72 6d 61 74 29 3b 0a 20 20 7d 0a 20 20 61 73 73  rmat);.  }.  ass
14080 65 72 74 28 20 69 3d 3d 6e 42 79 74 65 20 29 3b  ert( i==nByte );
14090 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
140a0 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33  >p3>0 && pOp->p3
140b0 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70  <=p->nMem );.  p
140c0 4f 75 74 2d 3e 6e 20 3d 20 28 69 6e 74 29 6e 42  Out->n = (int)nB
140d0 79 74 65 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61  yte;.  pOut->fla
140e0 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20  gs = MEM_Blob | 
140f0 4d 45 4d 5f 44 79 6e 3b 0a 20 20 70 4f 75 74 2d  MEM_Dyn;.  pOut-
14100 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 69 66 28  >xDel = 0;.  if(
14110 20 6e 5a 65 72 6f 20 29 7b 0a 20 20 20 20 70 4f   nZero ){.    pO
14120 75 74 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20 6e 5a  ut->u.nZero = nZ
14130 65 72 6f 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66  ero;.    pOut->f
14140 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 5a 65 72 6f  lags |= MEM_Zero
14150 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 65 6e  ;.  }.  pOut->en
14160 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
14170 20 20 2f 2a 20 49 6e 20 63 61 73 65 20 74 68 65    /* In case the
14180 20 62 6c 6f 62 20 69 73 20 65 76 65 72 20 63 6f   blob is ever co
14190 6e 76 65 72 74 65 64 20 74 6f 20 74 65 78 74 20  nverted to text 
141a0 2a 2f 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  */.  REGISTER_TR
141b0 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4f 75  ACE(pOp->p3, pOu
141c0 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58  t);.  UPDATE_MAX
141d0 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b  _BLOBSIZE(pOut);
141e0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
141f0 4f 70 63 6f 64 65 3a 20 43 6f 75 6e 74 20 50 31  Opcode: Count P1
14200 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
14210 53 74 6f 72 65 20 74 68 65 20 6e 75 6d 62 65 72  Store the number
14220 20 6f 66 20 65 6e 74 72 69 65 73 20 28 61 6e 20   of entries (an 
14230 69 6e 74 65 67 65 72 20 76 61 6c 75 65 29 20 69  integer value) i
14240 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  n the table or i
14250 6e 64 65 78 20 0a 2a 2a 20 6f 70 65 6e 65 64 20  ndex .** opened 
14260 62 79 20 63 75 72 73 6f 72 20 50 31 20 69 6e 20  by cursor P1 in 
14270 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2f 0a 23  register P2.*/.#
14280 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14290 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 63 61  IT_BTREECOUNT.ca
142a0 73 65 20 4f 50 5f 43 6f 75 6e 74 3a 20 7b 20 20  se OP_Count: {  
142b0 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70         /* out2-p
142c0 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  rerelease */.  i
142d0 36 34 20 6e 45 6e 74 72 79 3b 0a 20 20 42 74 43  64 nEntry;.  BtC
142e0 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 0a 20  ursor *pCrsr;.. 
142f0 20 70 43 72 73 72 20 3d 20 70 2d 3e 61 70 43 73   pCrsr = p->apCs
14300 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 70 43 75 72  r[pOp->p1]->pCur
14310 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 72 73 72  sor;.  if( pCrsr
14320 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
14330 69 74 65 33 42 74 72 65 65 43 6f 75 6e 74 28 70  ite3BtreeCount(p
14340 43 72 73 72 2c 20 26 6e 45 6e 74 72 79 29 3b 0a  Crsr, &nEntry);.
14350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 45 6e    }else{.    nEn
14360 74 72 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  try = 0;.  }.  p
14370 4f 75 74 2d 3e 75 2e 69 20 3d 20 6e 45 6e 74 72  Out->u.i = nEntr
14380 79 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  y;.  break;.}.#e
14390 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ndif../* Opcode:
143a0 20 53 61 76 65 70 6f 69 6e 74 20 50 31 20 2a 20   Savepoint P1 * 
143b0 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65  * P4 *.**.** Ope
143c0 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  n, release or ro
143d0 6c 6c 62 61 63 6b 20 74 68 65 20 73 61 76 65 70  llback the savep
143e0 6f 69 6e 74 20 6e 61 6d 65 64 20 62 79 20 70 61  oint named by pa
143f0 72 61 6d 65 74 65 72 20 50 34 2c 20 64 65 70 65  rameter P4, depe
14400 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20  nding.** on the 
14410 76 61 6c 75 65 20 6f 66 20 50 31 2e 20 54 6f 20  value of P1. To 
14420 6f 70 65 6e 20 61 20 6e 65 77 20 73 61 76 65 70  open a new savep
14430 6f 69 6e 74 2c 20 50 31 3d 3d 30 2e 20 54 6f 20  oint, P1==0. To 
14440 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29  release (commit)
14450 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20   an.** existing 
14460 73 61 76 65 70 6f 69 6e 74 2c 20 50 31 3d 3d 31  savepoint, P1==1
14470 2c 20 6f 72 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  , or to rollback
14480 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 61 76   an existing sav
14490 65 70 6f 69 6e 74 20 50 31 3d 3d 32 2e 0a 2a 2f  epoint P1==2..*/
144a0 0a 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69  .case OP_Savepoi
144b0 6e 74 3a 20 7b 0a 20 20 69 6e 74 20 70 31 3b 20  nt: {.  int p1; 
144c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144d0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
144e0 20 6f 66 20 50 31 20 6f 70 65 72 61 6e 64 20 2a   of P1 operand *
144f0 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14510 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73      /* Name of s
14520 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 69 6e  avepoint */.  in
14530 74 20 6e 4e 61 6d 65 3b 0a 20 20 53 61 76 65 70  t nName;.  Savep
14540 6f 69 6e 74 20 2a 70 4e 65 77 3b 0a 20 20 53 61  oint *pNew;.  Sa
14550 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
14560 69 6e 74 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74  int;.  Savepoint
14570 20 2a 70 54 6d 70 3b 0a 20 20 69 6e 74 20 69 53   *pTmp;.  int iS
14580 61 76 65 70 6f 69 6e 74 3b 0a 20 20 69 6e 74 20  avepoint;.  int 
14590 69 69 3b 0a 0a 20 20 70 31 20 3d 20 70 4f 70 2d  ii;..  p1 = pOp-
145a0 3e 70 31 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 70  >p1;.  zName = p
145b0 4f 70 2d 3e 70 34 2e 7a 3b 0a 0a 20 20 2f 2a 20  Op->p4.z;..  /* 
145c0 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
145d0 70 31 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p1 parameter is 
145e0 76 61 6c 69 64 2e 20 41 6c 73 6f 20 74 68 61 74  valid. Also that
145f0 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
14600 6f 70 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 61  open.  ** transa
14610 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 72  ction, then ther
14620 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 79 20  e cannot be any 
14630 73 61 76 65 70 6f 69 6e 74 73 2e 20 0a 20 20 2a  savepoints. .  *
14640 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  /.  assert( db->
14650 70 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c  pSavepoint==0 ||
14660 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
14670 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
14680 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45  p1==SAVEPOINT_BE
14690 47 49 4e 7c 7c 70 31 3d 3d 53 41 56 45 50 4f 49  GIN||p1==SAVEPOI
146a0 4e 54 5f 52 45 4c 45 41 53 45 7c 7c 70 31 3d 3d  NT_RELEASE||p1==
146b0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
146c0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
146d0 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 7c  db->pSavepoint |
146e0 7c 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74  | db->isTransact
146f0 69 6f 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20  ionSavepoint==0 
14700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 68 65  );.  assert( che
14710 63 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74  ckSavepointCount
14720 28 64 62 29 20 29 3b 0a 0a 20 20 69 66 28 20 70  (db) );..  if( p
14730 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45 47  1==SAVEPOINT_BEG
14740 49 4e 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  IN ){.    if( db
14750 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 3e 30  ->writeVdbeCnt>0
14760 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e   ){.      /* A n
14770 65 77 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  ew savepoint can
14780 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 20 69  not be created i
14790 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
147a0 76 65 20 77 72 69 74 65 20 0a 20 20 20 20 20 20  ve write .      
147b0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 28 69  ** statements (i
147c0 2e 65 2e 20 6f 70 65 6e 20 72 65 61 64 2f 77 72  .e. open read/wr
147d0 69 74 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  ite incremental 
147e0 62 6c 6f 62 20 68 61 6e 64 6c 65 73 29 2e 0a 20  blob handles).. 
147f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
14800 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
14810 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
14820 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 61 76  "cannot open sav
14830 65 70 6f 69 6e 74 20 2d 20 22 0a 20 20 20 20 20  epoint - ".     
14840 20 20 20 22 53 51 4c 20 73 74 61 74 65 6d 65 6e     "SQL statemen
14850 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73 22 29  ts in progress")
14860 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
14870 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65  ITE_BUSY;.    }e
14880 6c 73 65 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65  lse{.      nName
14890 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
148a0 33 30 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  30(zName);..    
148b0 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65    /* Create a ne
148c0 77 20 73 61 76 65 70 6f 69 6e 74 20 73 74 72 75  w savepoint stru
148d0 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20  cture. */.      
148e0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
148f0 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
14900 7a 65 6f 66 28 53 61 76 65 70 6f 69 6e 74 29 2b  zeof(Savepoint)+
14910 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 20 20  nName+1);.      
14920 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
14930 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20      pNew->zName 
14940 3d 20 28 63 68 61 72 20 2a 29 26 70 4e 65 77 5b  = (char *)&pNew[
14950 31 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  1];.        memc
14960 70 79 28 70 4e 65 77 2d 3e 7a 4e 61 6d 65 2c 20  py(pNew->zName, 
14970 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b  zName, nName+1);
14980 0a 20 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a  .    .        /*
14990 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
149a0 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  open transaction
149b0 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 69 73  , then mark this
149c0 20 61 73 20 61 20 73 70 65 63 69 61 6c 0a 20 20   as a special.  
149d0 20 20 20 20 20 20 2a 2a 20 22 74 72 61 6e 73 61        ** "transa
149e0 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 22  ction savepoint"
149f0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
14a00 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
14a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  ){.          db-
14a20 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 30 3b  >autoCommit = 0;
14a30 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 69  .          db->i
14a40 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65  sTransactionSave
14a50 70 6f 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20  point = 1;.     
14a60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14a70 20 20 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69      db->nSavepoi
14a80 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nt++;.        }.
14a90 20 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20      .        /* 
14aa0 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 73 61 76  Link the new sav
14ab0 65 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68 65 20  epoint into the 
14ac0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 27  database handle'
14ad0 73 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 20  s list. */.     
14ae0 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d     pNew->pNext =
14af0 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b   db->pSavepoint;
14b00 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53 61  .        db->pSa
14b10 76 65 70 6f 69 6e 74 20 3d 20 70 4e 65 77 3b 0a  vepoint = pNew;.
14b20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 44          pNew->nD
14b30 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 64 62  eferredCons = db
14b40 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3b  ->nDeferredCons;
14b50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 53 61 76   }else{.    iSav
14b70 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 0a 20 20 20  epoint = 0;..   
14b80 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   /* Find the nam
14b90 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66  ed savepoint. If
14ba0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63   there is no suc
14bb0 68 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65  h savepoint, the
14bc0 6e 20 61 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 65  n an.    ** an e
14bd0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
14be0 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 20 2a   to the user.  *
14bf0 2f 0a 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20  /.    for(.     
14c00 20 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 64 62   pSavepoint = db
14c10 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 20 0a 20  ->pSavepoint; . 
14c20 20 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74 20       pSavepoint 
14c30 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
14c40 70 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 7a 4e  p(pSavepoint->zN
14c50 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ame, zName);.   
14c60 20 20 20 70 53 61 76 65 70 6f 69 6e 74 20 3d 20     pSavepoint = 
14c70 70 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78  pSavepoint->pNex
14c80 74 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  t.    ){.      i
14c90 53 61 76 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20  Savepoint++;.   
14ca0 20 7d 0a 20 20 20 20 69 66 28 20 21 70 53 61 76   }.    if( !pSav
14cb0 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20  epoint ){.      
14cc0 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
14cd0 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
14ce0 2c 20 22 6e 6f 20 73 75 63 68 20 73 61 76 65 70  , "no such savep
14cf0 6f 69 6e 74 3a 20 25 73 22 2c 20 7a 4e 61 6d 65  oint: %s", zName
14d00 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
14d10 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
14d20 7d 65 6c 73 65 20 69 66 28 20 0a 20 20 20 20 20  }else if( .     
14d30 20 20 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65     db->writeVdbe
14d40 43 6e 74 3e 30 20 7c 7c 20 28 70 31 3d 3d 53 41  Cnt>0 || (p1==SA
14d50 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
14d60 20 26 26 20 64 62 2d 3e 61 63 74 69 76 65 56 64   && db->activeVd
14d70 62 65 43 6e 74 3e 31 29 20 0a 20 20 20 20 29 7b  beCnt>1) .    ){
14d80 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
14d90 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
14da0 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29  release (commit)
14db0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 66 20   a savepoint if 
14dc0 74 68 65 72 65 20 61 72 65 20 0a 20 20 20 20 20  there are .     
14dd0 20 2a 2a 20 61 63 74 69 76 65 20 77 72 69 74 65   ** active write
14de0 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20   statements. It 
14df0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
14e00 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 73 61  to rollback a sa
14e10 76 65 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  vepoint.      **
14e20 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
14e30 79 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  y active stateme
14e40 6e 74 73 20 61 74 20 61 6c 6c 2e 0a 20 20 20 20  nts at all..    
14e50 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
14e60 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
14e70 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 0a 20 20  zErrMsg, db, .  
14e80 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 25 73        "cannot %s
14e90 20 73 61 76 65 70 6f 69 6e 74 20 2d 20 53 51 4c   savepoint - SQL
14ea0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70   statements in p
14eb0 72 6f 67 72 65 73 73 22 2c 0a 20 20 20 20 20 20  rogress",.      
14ec0 20 20 28 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54    (p1==SAVEPOINT
14ed0 5f 52 4f 4c 4c 42 41 43 4b 20 3f 20 22 72 6f 6c  _ROLLBACK ? "rol
14ee0 6c 62 61 63 6b 22 3a 20 22 72 65 6c 65 61 73 65  lback": "release
14ef0 22 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ").      );.    
14f00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
14f10 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 0a  SY;.    }else{..
14f20 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69        /* Determi
14f30 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
14f40 74 20 74 68 69 73 20 69 73 20 61 20 74 72 61 6e  t this is a tran
14f50 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
14f60 74 2e 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20  t. If so,.      
14f70 2a 2a 20 61 6e 64 20 74 68 69 73 20 69 73 20 61  ** and this is a
14f80 20 52 45 4c 45 41 53 45 20 63 6f 6d 6d 61 6e 64   RELEASE command
14f90 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65  , then the curre
14fa0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  nt transaction .
14fb0 20 20 20 20 20 20 2a 2a 20 69 73 20 63 6f 6d 6d        ** is comm
14fc0 69 74 74 65 64 2e 20 0a 20 20 20 20 20 20 2a 2f  itted. .      */
14fd0 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 61  .      int isTra
14fe0 6e 73 61 63 74 69 6f 6e 20 3d 20 70 53 61 76 65  nsaction = pSave
14ff0 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 3d 3d 30 20  point->pNext==0 
15000 26 26 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63  && db->isTransac
15010 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20  tionSavepoint;. 
15020 20 20 20 20 20 69 66 28 20 69 73 54 72 61 6e 73       if( isTrans
15030 61 63 74 69 6f 6e 20 26 26 20 70 31 3d 3d 53 41  action && p1==SA
15040 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
15050 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
15060 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
15070 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 29 21 3d  CheckFk(p, 1))!=
15080 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15090 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62 65         goto vdbe
150a0 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20  _return;.       
150b0 20 7d 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61   }.        db->a
150c0 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
150d0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
150e0 65 33 56 64 62 65 48 61 6c 74 28 70 29 3d 3d 53  e3VdbeHalt(p)==S
150f0 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
15100 20 20 20 20 20 20 20 20 70 2d 3e 70 63 20 3d 20          p->pc = 
15110 70 63 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  pc;.          db
15120 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 30  ->autoCommit = 0
15130 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  ;.          p->r
15140 63 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  c = rc = SQLITE_
15150 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
15160 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e  goto vdbe_return
15170 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15180 20 20 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61      db->isTransa
15190 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
151a0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
151b0 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 7d 65   p->rc;.      }e
151c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 53 61  lse{.        iSa
151d0 76 65 70 6f 69 6e 74 20 3d 20 64 62 2d 3e 6e 53  vepoint = db->nS
151e0 61 76 65 70 6f 69 6e 74 20 2d 20 69 53 61 76 65  avepoint - iSave
151f0 70 6f 69 6e 74 20 2d 20 31 3b 0a 20 20 20 20 20  point - 1;.     
15200 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
15210 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a  db->nDb; ii++){.
15220 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
15230 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
15240 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 69 5d  oint(db->aDb[ii]
15250 2e 70 42 74 2c 20 70 31 2c 20 69 53 61 76 65 70  .pBt, p1, iSavep
15260 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  oint);.         
15270 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15280 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
15290 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
152a0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
152b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
152c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 31 3d  .        if( p1=
152d0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
152e0 41 43 4b 20 26 26 20 28 64 62 2d 3e 66 6c 61 67  ACK && (db->flag
152f0 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  s&SQLITE_InternC
15300 68 61 6e 67 65 73 29 21 3d 30 20 29 7b 0a 20 20  hanges)!=0 ){.  
15310 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15320 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
15330 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
15340 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
15350 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
15360 61 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  a(db, 0);.      
15370 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20    }.      }.  . 
15380 20 20 20 20 20 2f 2a 20 52 65 67 61 72 64 6c 65       /* Regardle
15390 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68  ss of whether th
153a0 69 73 20 69 73 20 61 20 52 45 4c 45 41 53 45 20  is is a RELEASE 
153b0 6f 72 20 52 4f 4c 4c 42 41 43 4b 2c 20 64 65 73  or ROLLBACK, des
153c0 74 72 6f 79 20 61 6c 6c 20 0a 20 20 20 20 20 20  troy all .      
153d0 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 6e 65  ** savepoints ne
153e0 73 74 65 64 20 69 6e 73 69 64 65 20 6f 66 20 74  sted inside of t
153f0 68 65 20 73 61 76 65 70 6f 69 6e 74 20 62 65 69  he savepoint bei
15400 6e 67 20 6f 70 65 72 61 74 65 64 20 6f 6e 2e 20  ng operated on. 
15410 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
15420 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 21 3d  db->pSavepoint!=
15430 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
15440 20 20 20 20 20 20 70 54 6d 70 20 3d 20 64 62 2d        pTmp = db-
15450 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20  >pSavepoint;.   
15460 20 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f       db->pSavepo
15470 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78  int = pTmp->pNex
15480 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  t;.        sqlit
15490 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d  e3DbFree(db, pTm
154a0 70 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  p);.        db->
154b0 6e 53 61 76 65 70 6f 69 6e 74 2d 2d 3b 0a 20 20  nSavepoint--;.  
154c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
154d0 49 66 20 69 74 20 69 73 20 61 20 52 45 4c 45 41  If it is a RELEA
154e0 53 45 2c 20 74 68 65 6e 20 64 65 73 74 72 6f 79  SE, then destroy
154f0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 62   the savepoint b
15500 65 69 6e 67 20 6f 70 65 72 61 74 65 64 20 6f 6e  eing operated on
15510 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6f 2e 20   .      ** too. 
15520 49 66 20 69 74 20 69 73 20 61 20 52 4f 4c 4c 42  If it is a ROLLB
15530 41 43 4b 20 54 4f 2c 20 74 68 65 6e 20 73 65 74  ACK TO, then set
15540 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64   the number of d
15550 65 66 65 72 72 65 64 20 0a 20 20 20 20 20 20 2a  eferred .      *
15560 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f  * constraint vio
15570 6c 61 74 69 6f 6e 73 20 70 72 65 73 65 6e 74 20  lations present 
15580 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
15590 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  to the value sto
155a0 72 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  red.      ** whe
155b0 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  n the savepoint 
155c0 77 61 73 20 63 72 65 61 74 65 64 2e 20 20 2a 2f  was created.  */
155d0 0a 20 20 20 20 20 20 69 66 28 20 70 31 3d 3d 53  .      if( p1==S
155e0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
155f0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
15600 72 74 28 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d  rt( pSavepoint==
15610 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29  db->pSavepoint )
15620 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53  ;.        db->pS
15630 61 76 65 70 6f 69 6e 74 20 3d 20 70 53 61 76 65  avepoint = pSave
15640 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  point->pNext;.  
15650 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
15660 72 65 65 28 64 62 2c 20 70 53 61 76 65 70 6f 69  ree(db, pSavepoi
15670 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nt);.        if(
15680 20 21 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 20   !isTransaction 
15690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  ){.          db-
156a0 3e 6e 53 61 76 65 70 6f 69 6e 74 2d 2d 3b 0a 20  >nSavepoint--;. 
156b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
156c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62  else{.        db
156d0 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
156e0 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 44  = pSavepoint->nD
156f0 65 66 65 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20  eferredCons;.   
15700 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
15710 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
15720 70 63 6f 64 65 3a 20 41 75 74 6f 43 6f 6d 6d 69  pcode: AutoCommi
15730 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  t P1 P2 * * *.**
15740 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 61 74 61  .** Set the data
15750 62 61 73 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74  base auto-commit
15760 20 66 6c 61 67 20 74 6f 20 50 31 20 28 31 20 6f   flag to P1 (1 o
15770 72 20 30 29 2e 20 49 66 20 50 32 20 69 73 20 74  r 0). If P2 is t
15780 72 75 65 2c 20 72 6f 6c 6c 0a 2a 2a 20 62 61 63  rue, roll.** bac
15790 6b 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20  k any currently 
157a0 61 63 74 69 76 65 20 62 74 72 65 65 20 74 72 61  active btree tra
157b0 6e 73 61 63 74 69 6f 6e 73 2e 20 49 66 20 74 68  nsactions. If th
157c0 65 72 65 20 61 72 65 20 61 6e 79 20 61 63 74 69  ere are any acti
157d0 76 65 0a 2a 2a 20 56 4d 73 20 28 61 70 61 72 74  ve.** VMs (apart
157e0 20 66 72 6f 6d 20 74 68 69 73 20 6f 6e 65 29 2c   from this one),
157f0 20 74 68 65 6e 20 61 20 52 4f 4c 4c 42 41 43 4b   then a ROLLBACK
15800 20 66 61 69 6c 73 2e 20 20 41 20 43 4f 4d 4d 49   fails.  A COMMI
15810 54 20 66 61 69 6c 73 20 69 66 0a 2a 2a 20 74 68  T fails if.** th
15820 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 77  ere are active w
15830 72 69 74 69 6e 67 20 56 4d 73 20 6f 72 20 61 63  riting VMs or ac
15840 74 69 76 65 20 56 4d 73 20 74 68 61 74 20 75 73  tive VMs that us
15850 65 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 0a  e shared cache..
15860 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72  **.** This instr
15870 75 63 74 69 6f 6e 20 63 61 75 73 65 73 20 74 68  uction causes th
15880 65 20 56 4d 20 74 6f 20 68 61 6c 74 2e 0a 2a 2f  e VM to halt..*/
15890 0a 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d  .case OP_AutoCom
158a0 6d 69 74 3a 20 7b 0a 20 20 69 6e 74 20 64 65 73  mit: {.  int des
158b0 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3b 0a  iredAutoCommit;.
158c0 20 20 69 6e 74 20 69 52 6f 6c 6c 62 61 63 6b 3b    int iRollback;
158d0 0a 20 20 69 6e 74 20 74 75 72 6e 4f 6e 41 43 3b  .  int turnOnAC;
158e0 0a 0a 20 20 64 65 73 69 72 65 64 41 75 74 6f 43  ..  desiredAutoC
158f0 6f 6d 6d 69 74 20 3d 20 70 4f 70 2d 3e 70 31 3b  ommit = pOp->p1;
15900 0a 20 20 69 52 6f 6c 6c 62 61 63 6b 20 3d 20 70  .  iRollback = p
15910 4f 70 2d 3e 70 32 3b 0a 20 20 74 75 72 6e 4f 6e  Op->p2;.  turnOn
15920 41 43 20 3d 20 64 65 73 69 72 65 64 41 75 74 6f  AC = desiredAuto
15930 43 6f 6d 6d 69 74 20 26 26 20 21 64 62 2d 3e 61  Commit && !db->a
15940 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20 61 73 73  utoCommit;.  ass
15950 65 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f  ert( desiredAuto
15960 43 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 64 65 73  Commit==1 || des
15970 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d  iredAutoCommit==
15980 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  0 );.  assert( d
15990 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
159a0 3d 3d 31 20 7c 7c 20 69 52 6f 6c 6c 62 61 63 6b  ==1 || iRollback
159b0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
159c0 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
159d0 6e 74 3e 30 20 29 3b 20 20 2f 2a 20 41 74 20 6c  nt>0 );  /* At l
159e0 65 61 73 74 20 74 68 69 73 20 6f 6e 65 20 56 4d  east this one VM
159f0 20 69 73 20 61 63 74 69 76 65 20 2a 2f 0a 0a 20   is active */.. 
15a00 20 69 66 28 20 74 75 72 6e 4f 6e 41 43 20 26 26   if( turnOnAC &&
15a10 20 69 52 6f 6c 6c 62 61 63 6b 20 26 26 20 64 62   iRollback && db
15a20 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e  ->activeVdbeCnt>
15a30 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  1 ){.    /* If t
15a40 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
15a50 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 52 4f 4c  implements a ROL
15a60 4c 42 41 43 4b 20 61 6e 64 20 6f 74 68 65 72 20  LBACK and other 
15a70 56 4d 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73  VMs are.    ** s
15a80 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 2c 20 61 6e  till running, an
15a90 64 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  d a transaction 
15aa0 69 73 20 61 63 74 69 76 65 2c 20 72 65 74 75 72  is active, retur
15ab0 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 64 69 63  n an error indic
15ac0 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 61  ating.    ** tha
15ad0 74 20 74 68 65 20 6f 74 68 65 72 20 56 4d 73 20  t the other VMs 
15ae0 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 66 69  must complete fi
15af0 72 73 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  rst. .    */.   
15b00 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
15b10 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  g(&p->zErrMsg, d
15b20 62 2c 20 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62  b, "cannot rollb
15b30 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ack transaction 
15b40 2d 20 22 0a 20 20 20 20 20 20 20 20 22 53 51 4c  - ".        "SQL
15b50 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70   statements in p
15b60 72 6f 67 72 65 73 73 22 29 3b 0a 20 20 20 20 72  rogress");.    r
15b70 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
15b80 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 74 75 72  .  }else if( tur
15b90 6e 4f 6e 41 43 20 26 26 20 21 69 52 6f 6c 6c 62  nOnAC && !iRollb
15ba0 61 63 6b 20 26 26 20 64 62 2d 3e 77 72 69 74 65  ack && db->write
15bb0 56 64 62 65 43 6e 74 3e 30 20 29 7b 0a 20 20 20  VdbeCnt>0 ){.   
15bc0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 73 74   /* If this inst
15bd0 72 75 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e  ruction implemen
15be0 74 73 20 61 20 43 4f 4d 4d 49 54 20 61 6e 64 20  ts a COMMIT and 
15bf0 6f 74 68 65 72 20 56 4d 73 20 61 72 65 20 77 72  other VMs are wr
15c00 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 72 65 74  iting.    ** ret
15c10 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 64  urn an error ind
15c20 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65  icating that the
15c30 20 6f 74 68 65 72 20 56 4d 73 20 6d 75 73 74 20   other VMs must 
15c40 63 6f 6d 70 6c 65 74 65 20 66 69 72 73 74 2e 20  complete first. 
15c50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
15c60 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
15c70 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 63  >zErrMsg, db, "c
15c80 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 74 72 61  annot commit tra
15c90 6e 73 61 63 74 69 6f 6e 20 2d 20 22 0a 20 20 20  nsaction - ".   
15ca0 20 20 20 20 20 22 53 51 4c 20 73 74 61 74 65 6d       "SQL statem
15cb0 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73  ents in progress
15cc0 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ");.    rc = SQL
15cd0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73  ITE_BUSY;.  }els
15ce0 65 20 69 66 28 20 64 65 73 69 72 65 64 41 75 74  e if( desiredAut
15cf0 6f 43 6f 6d 6d 69 74 21 3d 64 62 2d 3e 61 75 74  oCommit!=db->aut
15d00 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 69  oCommit ){.    i
15d10 66 28 20 69 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  f( iRollback ){.
15d20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65        assert( de
15d30 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d  siredAutoCommit=
15d40 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
15d50 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
15d60 62 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 75  b);.      db->au
15d70 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
15d80 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20    }else if( (rc 
15d90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
15da0 63 6b 46 6b 28 70 2c 20 31 29 29 21 3d 53 51 4c  ckFk(p, 1))!=SQL
15db0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15dc0 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e  goto vdbe_return
15dd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15de0 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
15df0 74 20 3d 20 28 75 38 29 64 65 73 69 72 65 64 41  t = (u8)desiredA
15e00 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20  utoCommit;.     
15e10 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
15e20 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45 5f  Halt(p)==SQLITE_
15e30 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
15e40 70 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20 20 20  p->pc = pc;.    
15e50 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
15e60 69 74 20 3d 20 28 75 38 29 28 31 2d 64 65 73 69  it = (u8)(1-desi
15e70 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a  redAutoCommit);.
15e80 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
15e90 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
15ea0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76  ;.        goto v
15eb0 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20  dbe_return;.    
15ec0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
15ed0 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65  sert( db->nState
15ee0 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  ment==0 );.    s
15ef0 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
15f00 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 69  oints(db);.    i
15f10 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
15f20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
15f30 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
15f40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15f50 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
15f60 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  R;.    }.    got
15f70 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20  o vdbe_return;. 
15f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
15f90 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
15fa0 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 0a 20 20  >zErrMsg, db,.  
15fb0 20 20 20 20 20 20 28 21 64 65 73 69 72 65 64 41        (!desiredA
15fc0 75 74 6f 43 6f 6d 6d 69 74 29 3f 22 63 61 6e 6e  utoCommit)?"cann
15fd0 6f 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  ot start a trans
15fe0 61 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20  action within a 
15ff0 74 72 61 6e 73 61 63 74 69 6f 6e 22 3a 28 0a 20  transaction":(. 
16000 20 20 20 20 20 20 20 28 69 52 6f 6c 6c 62 61 63         (iRollbac
16010 6b 29 3f 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62  k)?"cannot rollb
16020 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63  ack - no transac
16030 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 3a  tion is active":
16040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16050 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d      "cannot comm
16060 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74  it - no transact
16070 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29 29  ion is active"))
16080 3b 0a 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  ;.         .    
16090 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
160a0 52 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  R;.  }.  break;.
160b0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 72  }../* Opcode: Tr
160c0 61 6e 73 61 63 74 69 6f 6e 20 50 31 20 50 32 20  ansaction P1 P2 
160d0 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 42 65 67 69  * * *.**.** Begi
160e0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  n a transaction.
160f0 20 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f    The transactio
16100 6e 20 65 6e 64 73 20 77 68 65 6e 20 61 20 43 6f  n ends when a Co
16110 6d 6d 69 74 20 6f 72 20 52 6f 6c 6c 62 61 63 6b  mmit or Rollback
16120 0a 2a 2a 20 6f 70 63 6f 64 65 20 69 73 20 65 6e  .** opcode is en
16130 63 6f 75 6e 74 65 72 65 64 2e 20 20 44 65 70 65  countered.  Depe
16140 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 4f 4e 20  nding on the ON 
16150 43 4f 4e 46 4c 49 43 54 20 73 65 74 74 69 6e 67  CONFLICT setting
16160 2c 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  , the.** transac
16170 74 69 6f 6e 20 6d 69 67 68 74 20 61 6c 73 6f 20  tion might also 
16180 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  be rolled back i
16190 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
161a0 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
161b0 20 50 31 20 69 73 20 74 68 65 20 69 6e 64 65 78   P1 is the index
161c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
161d0 20 66 69 6c 65 20 6f 6e 20 77 68 69 63 68 20 74   file on which t
161e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
161f0 73 0a 2a 2a 20 73 74 61 72 74 65 64 2e 20 20 49  s.** started.  I
16200 6e 64 65 78 20 30 20 69 73 20 74 68 65 20 6d 61  ndex 0 is the ma
16210 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
16220 20 61 6e 64 20 69 6e 64 65 78 20 31 20 69 73 20   and index 1 is 
16230 74 68 65 0a 2a 2a 20 66 69 6c 65 20 75 73 65 64  the.** file used
16240 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74   for temporary t
16250 61 62 6c 65 73 2e 20 20 49 6e 64 69 63 65 73 20  ables.  Indices 
16260 6f 66 20 32 20 6f 72 20 6d 6f 72 65 20 61 72 65  of 2 or more are
16270 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 61 74 74   used for.** att
16280 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2e  ached databases.
16290 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32 20 69 73 20  .**.** If P2 is 
162a0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
162b0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
162c0 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2e 20 20  on is started.  
162d0 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
162e0 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 6f  is.** obtained o
162f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
16300 69 6c 65 20 77 68 65 6e 20 61 20 77 72 69 74 65  ile when a write
16310 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
16320 73 74 61 72 74 65 64 2e 20 20 4e 6f 0a 2a 2a 20  started.  No.** 
16330 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 61  other process ca
16340 6e 20 73 74 61 72 74 20 61 6e 6f 74 68 65 72 20  n start another 
16350 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
16360 6e 20 77 68 69 6c 65 20 74 68 69 73 20 74 72 61  n while this tra
16370 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 75  nsaction is.** u
16380 6e 64 65 72 77 61 79 2e 20 20 53 74 61 72 74 69  nderway.  Starti
16390 6e 67 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ng a write trans
163a0 61 63 74 69 6f 6e 20 61 6c 73 6f 20 63 72 65 61  action also crea
163b0 74 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  tes a rollback j
163c0 6f 75 72 6e 61 6c 2e 20 41 0a 2a 2a 20 77 72 69  ournal. A.** wri
163d0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
163e0 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
163f0 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
16400 73 20 63 61 6e 20 62 65 20 6d 61 64 65 20 74 6f  s can be made to
16410 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
16420 2e 20 20 49 66 20 50 32 20 69 73 20 32 20 6f 72  .  If P2 is 2 or
16430 20 67 72 65 61 74 65 72 20 74 68 65 6e 20 61 6e   greater then an
16440 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
16450 69 73 20 61 6c 73 6f 20 6f 62 74 61 69 6e 65 64  is also obtained
16460 0a 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  .** on the file.
16470 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 77 72 69 74  .**.** If a writ
16480 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
16490 20 73 74 61 72 74 65 64 20 61 6e 64 20 74 68 65   started and the
164a0 20 56 64 62 65 2e 75 73 65 73 53 74 6d 74 4a 6f   Vdbe.usesStmtJo
164b0 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 0a 2a 2a  urnal flag is.**
164c0 20 74 72 75 65 20 28 74 68 69 73 20 66 6c 61 67   true (this flag
164d0 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20 56   is set if the V
164e0 64 62 65 20 6d 61 79 20 6d 6f 64 69 66 79 20 6d  dbe may modify m
164f0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77  ore than one row
16500 20 61 6e 64 20 6d 61 79 0a 2a 2a 20 74 68 72 6f   and may.** thro
16510 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70  w an ABORT excep
16520 74 69 6f 6e 29 2c 20 61 20 73 74 61 74 65 6d 65  tion), a stateme
16530 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  nt transaction m
16540 61 79 20 61 6c 73 6f 20 62 65 20 6f 70 65 6e 65  ay also be opene
16550 64 2e 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  d..** More speci
16560 66 69 63 61 6c 6c 79 2c 20 61 20 73 74 61 74 65  fically, a state
16570 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
16580 20 69 73 20 6f 70 65 6e 65 64 20 69 66 66 20 74   is opened iff t
16590 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
165a0 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 75 72  onnection is cur
165b0 72 65 6e 74 6c 79 20 6e 6f 74 20 69 6e 20 61 75  rently not in au
165c0 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 6f  tocommit mode, o
165d0 72 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f  r if there are o
165e0 74 68 65 72 0a 2a 2a 20 61 63 74 69 76 65 20 73  ther.** active s
165f0 74 61 74 65 6d 65 6e 74 73 2e 20 41 20 73 74 61  tatements. A sta
16600 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
16610 6f 6e 20 61 6c 6c 6f 77 73 20 74 68 65 20 61 66  on allows the af
16620 66 65 63 74 73 20 6f 66 20 74 68 69 73 0a 2a 2a  fects of this.**
16630 20 56 44 42 45 20 74 6f 20 62 65 20 72 6f 6c 6c   VDBE to be roll
16640 65 64 20 62 61 63 6b 20 61 66 74 65 72 20 61 6e  ed back after an
16650 20 65 72 72 6f 72 20 77 69 74 68 6f 75 74 20 68   error without h
16660 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 62 61  aving to roll ba
16670 63 6b 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65  ck the.** entire
16680 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
16690 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 65 6e 63   no error is enc
166a0 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 20 73 74  ountered, the st
166b0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
166c0 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 61 75 74 6f  ion.** will auto
166d0 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69 74  matically commit
166e0 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 68   when the VDBE h
166f0 61 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  alts..**.** If P
16700 32 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  2 is zero, then 
16710 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f  a read-lock is o
16720 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64  btained on the d
16730 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
16740 0a 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63  .case OP_Transac
16750 74 69 6f 6e 3a 20 7b 0a 20 20 42 74 72 65 65 20  tion: {.  Btree 
16760 2a 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pBt;..  assert(
16770 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
16780 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29  Op->p1<db->nDb )
16790 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  ;.  assert( (p->
167a0 62 74 72 65 65 4d 61 73 6b 20 26 20 28 31 3c 3c  btreeMask & (1<<
167b0 70 4f 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a  pOp->p1))!=0 );.
167c0 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b    pBt = db->aDb[
167d0 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 0a 20  pOp->p1].pBt;.. 
167e0 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
167f0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
16800 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c  eBeginTrans(pBt,
16810 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 20 20 69   pOp->p2);.    i
16820 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
16830 53 59 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  SY ){.      p->p
16840 63 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 70 2d  c = pc;.      p-
16850 3e 72 63 20 3d 20 72 63 20 3d 20 53 51 4c 49 54  >rc = rc = SQLIT
16860 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 67 6f  E_BUSY;.      go
16870 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a  to vdbe_return;.
16880 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
16890 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
168a0 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
168b0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
168c0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 70    }..    if( pOp
168d0 2d 3e 70 32 20 26 26 20 70 2d 3e 75 73 65 73 53  ->p2 && p->usesS
168e0 74 6d 74 4a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  tmtJournal .    
168f0 20 26 26 20 28 64 62 2d 3e 61 75 74 6f 43 6f 6d   && (db->autoCom
16900 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 63  mit==0 || db->ac
16910 74 69 76 65 56 64 62 65 43 6e 74 3e 31 29 20 0a  tiveVdbeCnt>1) .
16920 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
16930 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
16940 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
16950 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
16960 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 7b  iStatement==0 ){
16970 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16980 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e   db->nStatement>
16990 3d 30 20 26 26 20 64 62 2d 3e 6e 53 61 76 65 70  =0 && db->nSavep
169a0 6f 69 6e 74 3e 3d 30 20 29 3b 0a 20 20 20 20 20  oint>=0 );.     
169b0 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
169c0 74 2b 2b 3b 20 0a 20 20 20 20 20 20 20 20 70 2d  t++; .        p-
169d0 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 64 62  >iStatement = db
169e0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20 64  ->nSavepoint + d
169f0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3b 0a 20  b->nStatement;. 
16a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
16a10 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
16a20 67 69 6e 53 74 6d 74 28 70 42 74 2c 20 70 2d 3e  ginStmt(pBt, p->
16a30 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 0a 20 20  iStatement);..  
16a40 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
16a50 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
16a60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
16a70 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20  andles deferred 
16a80 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20  constraint.     
16a90 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 49 66 20   ** counter. If 
16aa0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
16ab0 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20  ansaction needs 
16ac0 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
16ad0 6b 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  k,.      ** the 
16ae0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 63 6f  value of this co
16af0 75 6e 74 65 72 20 6e 65 65 64 73 20 74 6f 20 62  unter needs to b
16b00 65 20 72 65 73 74 6f 72 65 64 20 74 6f 6f 2e 20  e restored too. 
16b10 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74   */.      p->nSt
16b20 6d 74 44 65 66 43 6f 6e 73 20 3d 20 64 62 2d 3e  mtDefCons = db->
16b30 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3b 0a 20  nDeferredCons;. 
16b40 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
16b50 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
16b60 52 65 61 64 43 6f 6f 6b 69 65 20 50 31 20 50 32  ReadCookie P1 P2
16b70 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65   P3 * *.**.** Re
16b80 61 64 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72  ad cookie number
16b90 20 50 33 20 66 72 6f 6d 20 64 61 74 61 62 61 73   P3 from databas
16ba0 65 20 50 31 20 61 6e 64 20 77 72 69 74 65 20 69  e P1 and write i
16bb0 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  t into register 
16bc0 50 32 2e 0a 2a 2a 20 50 33 3d 3d 31 20 69 73 20  P2..** P3==1 is 
16bd0 74 68 65 20 73 63 68 65 6d 61 20 76 65 72 73 69  the schema versi
16be0 6f 6e 2e 20 20 50 33 3d 3d 32 20 69 73 20 74 68  on.  P3==2 is th
16bf0 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61  e database forma
16c00 74 2e 0a 2a 2a 20 50 33 3d 3d 33 20 69 73 20 74  t..** P3==3 is t
16c10 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70  he recommended p
16c20 61 67 65 72 20 63 61 63 68 65 20 73 69 7a 65 2c  ager cache size,
16c30 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   and so forth.  
16c40 50 31 3d 3d 30 20 69 73 0a 2a 2a 20 74 68 65 20  P1==0 is.** the 
16c50 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
16c60 6c 65 20 61 6e 64 20 50 31 3d 3d 31 20 69 73 20  le and P1==1 is 
16c70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16c80 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
16c90 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
16ca0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  les..**.** There
16cb0 20 6d 75 73 74 20 62 65 20 61 20 72 65 61 64 2d   must be a read-
16cc0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
16cd0 62 61 73 65 20 28 65 69 74 68 65 72 20 61 20 74  base (either a t
16ce0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75  ransaction.** mu
16cf0 73 74 20 62 65 20 73 74 61 72 74 65 64 20 6f 72  st be started or
16d00 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
16d10 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 29 20 62  n open cursor) b
16d20 65 66 6f 72 65 0a 2a 2a 20 65 78 65 63 75 74 69  efore.** executi
16d30 6e 67 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  ng this instruct
16d40 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ion..*/.case OP_
16d50 52 65 61 64 43 6f 6f 6b 69 65 3a 20 7b 20 20 20  ReadCookie: {   
16d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
16d70 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a  ut2-prerelease *
16d80 2f 0a 20 20 69 6e 74 20 69 4d 65 74 61 3b 0a 20  /.  int iMeta;. 
16d90 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20   int iDb;.  int 
16da0 69 43 6f 6f 6b 69 65 3b 0a 0a 20 20 69 44 62 20  iCookie;..  iDb 
16db0 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 43 6f  = pOp->p1;.  iCo
16dc0 6f 6b 69 65 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a  okie = pOp->p3;.
16dd0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
16de0 33 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45  3<SQLITE_N_BTREE
16df0 5f 4d 45 54 41 20 29 3b 0a 20 20 61 73 73 65 72  _META );.  asser
16e00 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
16e10 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
16e20 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44  sert( db->aDb[iD
16e30 62 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  b].pBt!=0 );.  a
16e40 73 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65  ssert( (p->btree
16e50 4d 61 73 6b 20 26 20 28 31 3c 3c 69 44 62 29 29  Mask & (1<<iDb))
16e60 21 3d 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  !=0 );..  sqlite
16e70 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 64 62  3BtreeGetMeta(db
16e80 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20  ->aDb[iDb].pBt, 
16e90 69 43 6f 6f 6b 69 65 2c 20 28 75 33 32 20 2a 29  iCookie, (u32 *)
16ea0 26 69 4d 65 74 61 29 3b 0a 20 20 70 4f 75 74 2d  &iMeta);.  pOut-
16eb0 3e 75 2e 69 20 3d 20 69 4d 65 74 61 3b 0a 20 20  >u.i = iMeta;.  
16ec0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
16ed0 6f 64 65 3a 20 53 65 74 43 6f 6f 6b 69 65 20 50  ode: SetCookie P
16ee0 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
16ef0 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74  * Write the cont
16f00 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20  ent of register 
16f10 50 33 20 28 69 6e 74 65 72 70 72 65 74 65 64 20  P3 (interpreted 
16f20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 29 0a 2a  as an integer).*
16f30 2a 20 69 6e 74 6f 20 63 6f 6f 6b 69 65 20 6e 75  * into cookie nu
16f40 6d 62 65 72 20 50 32 20 6f 66 20 64 61 74 61 62  mber P2 of datab
16f50 61 73 65 20 50 31 2e 20 20 50 32 3d 3d 31 20 69  ase P1.  P2==1 i
16f60 73 20 74 68 65 20 73 63 68 65 6d 61 20 76 65 72  s the schema ver
16f70 73 69 6f 6e 2e 20 20 0a 2a 2a 20 50 32 3d 3d 32  sion.  .** P2==2
16f80 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
16f90 20 66 6f 72 6d 61 74 2e 20 50 32 3d 3d 33 20 69   format. P2==3 i
16fa0 73 20 74 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65  s the recommende
16fb0 64 20 70 61 67 65 72 20 63 61 63 68 65 20 0a 2a  d pager cache .*
16fc0 2a 20 73 69 7a 65 2c 20 61 6e 64 20 73 6f 20 66  * size, and so f
16fd0 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20 69 73 20  orth.  P1==0 is 
16fe0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
16ff0 65 20 66 69 6c 65 20 61 6e 64 20 50 31 3d 3d 31  e file and P1==1
17000 20 69 73 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   is the .** data
17010 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 74  base file used t
17020 6f 20 73 74 6f 72 65 20 74 65 6d 70 6f 72 61 72  o store temporar
17030 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  y tables..**.** 
17040 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
17050 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
17060 66 6f 72 65 20 65 78 65 63 75 74 69 6e 67 20 74  fore executing t
17070 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63  his opcode..*/.c
17080 61 73 65 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  ase OP_SetCookie
17090 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 69 6e 33  : {       /* in3
170a0 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20   */.  Db *pDb;. 
170b0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
170c0 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f  <SQLITE_N_BTREE_
170d0 4d 45 54 41 20 29 3b 0a 20 20 61 73 73 65 72 74  META );.  assert
170e0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
170f0 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20  pOp->p1<db->nDb 
17100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
17110 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 31 3c  >btreeMask & (1<
17120 3c 70 4f 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b  <pOp->p1))!=0 );
17130 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
17140 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  b[pOp->p1];.  as
17150 73 65 72 74 28 20 70 44 62 2d 3e 70 42 74 21 3d  sert( pDb->pBt!=
17160 30 20 29 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61  0 );.  pIn3 = &a
17170 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
17180 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
17190 74 65 67 65 72 69 66 79 28 70 49 6e 33 29 3b 0a  tegerify(pIn3);.
171a0 20 20 2f 2a 20 53 65 65 20 6e 6f 74 65 20 61 62    /* See note ab
171b0 6f 75 74 20 69 6e 64 65 78 20 73 68 69 66 74 69  out index shifti
171c0 6e 67 20 6f 6e 20 4f 50 5f 52 65 61 64 43 6f 6f  ng on OP_ReadCoo
171d0 6b 69 65 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  kie */.  rc = sq
171e0 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
171f0 4d 65 74 61 28 70 44 62 2d 3e 70 42 74 2c 20 70  Meta(pDb->pBt, p
17200 4f 70 2d 3e 70 32 2c 20 28 69 6e 74 29 70 49 6e  Op->p2, (int)pIn
17210 33 2d 3e 75 2e 69 29 3b 0a 20 20 69 66 28 20 70  3->u.i);.  if( p
17220 4f 70 2d 3e 70 32 3d 3d 42 54 52 45 45 5f 53 43  Op->p2==BTREE_SC
17230 48 45 4d 41 5f 56 45 52 53 49 4f 4e 20 29 7b 0a  HEMA_VERSION ){.
17240 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20      /* When the 
17250 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 63 68  schema cookie ch
17260 61 6e 67 65 73 2c 20 72 65 63 6f 72 64 20 74 68  anges, record th
17270 65 20 6e 65 77 20 63 6f 6f 6b 69 65 20 69 6e 74  e new cookie int
17280 65 72 6e 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 70  ernally */.    p
17290 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68  Db->pSchema->sch
172a0 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 28 69 6e  ema_cookie = (in
172b0 74 29 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 20  t)pIn3->u.i;.   
172c0 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
172d0 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
172e0 65 73 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  es;.  }else if( 
172f0 70 4f 70 2d 3e 70 32 3d 3d 42 54 52 45 45 5f 46  pOp->p2==BTREE_F
17300 49 4c 45 5f 46 4f 52 4d 41 54 20 29 7b 0a 20 20  ILE_FORMAT ){.  
17310 20 20 2f 2a 20 52 65 63 6f 72 64 20 63 68 61 6e    /* Record chan
17320 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
17330 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 70 44  format */.    pD
17340 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
17350 5f 66 6f 72 6d 61 74 20 3d 20 28 75 38 29 70 49  _format = (u8)pI
17360 6e 33 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 69  n3->u.i;.  }.  i
17370 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 31 20 29 7b  f( pOp->p1==1 ){
17380 0a 20 20 20 20 2f 2a 20 49 6e 76 61 6c 69 64 61  .    /* Invalida
17390 74 65 20 61 6c 6c 20 70 72 65 70 61 72 65 64 20  te all prepared 
173a0 73 74 61 74 65 6d 65 6e 74 73 20 77 68 65 6e 65  statements whene
173b0 76 65 72 20 74 68 65 20 54 45 4d 50 20 64 61 74  ver the TEMP dat
173c0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 73 63 68  abase.    ** sch
173d0 65 6d 61 20 69 73 20 63 68 61 6e 67 65 64 2e 20  ema is changed. 
173e0 20 54 69 63 6b 65 74 20 23 31 36 34 34 20 2a 2f   Ticket #1644 */
173f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
17400 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
17410 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 70 2d  ents(db);.    p-
17420 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 20 20  >expired = 0;.  
17430 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
17440 20 4f 70 63 6f 64 65 3a 20 56 65 72 69 66 79 43   Opcode: VerifyC
17450 6f 6f 6b 69 65 20 50 31 20 50 32 20 2a 0a 2a 2a  ookie P1 P2 *.**
17460 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 76 61  .** Check the va
17470 6c 75 65 20 6f 66 20 67 6c 6f 62 61 6c 20 64 61  lue of global da
17480 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72  tabase parameter
17490 20 6e 75 6d 62 65 72 20 30 20 28 74 68 65 0a 2a   number 0 (the.*
174a0 2a 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e  * schema version
174b0 29 20 61 6e 64 20 6d 61 6b 65 20 73 75 72 65 20  ) and make sure 
174c0 69 74 20 69 73 20 65 71 75 61 6c 20 74 6f 20 50  it is equal to P
174d0 32 2e 20 20 0a 2a 2a 20 50 31 20 69 73 20 74 68  2.  .** P1 is th
174e0 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  e database numbe
174f0 72 20 77 68 69 63 68 20 69 73 20 30 20 66 6f 72  r which is 0 for
17500 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
17510 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 31  se file.** and 1
17520 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 68 6f   for the file ho
17530 6c 64 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  lding temporary 
17540 74 61 62 6c 65 73 20 61 6e 64 20 73 6f 6d 65 20  tables and some 
17550 68 69 67 68 65 72 20 6e 75 6d 62 65 72 0a 2a 2a  higher number.**
17560 20 66 6f 72 20 61 75 78 69 6c 69 61 72 79 20 64   for auxiliary d
17570 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20  atabases..**.** 
17580 54 68 65 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67  The cookie chang
17590 65 73 20 69 74 73 20 76 61 6c 75 65 20 77 68 65  es its value whe
175a0 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
175b0 73 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  se schema change
175c0 73 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61  s..** This opera
175d0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
175e0 64 65 74 65 63 74 20 77 68 65 6e 20 74 68 61 74  detect when that
175f0 20 74 68 65 20 63 6f 6f 6b 69 65 20 68 61 73 20   the cookie has 
17600 63 68 61 6e 67 65 64 0a 2a 2a 20 61 6e 64 20 74  changed.** and t
17610 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  hat the current 
17620 70 72 6f 63 65 73 73 20 6e 65 65 64 73 20 74 6f  process needs to
17630 20 72 65 72 65 61 64 20 74 68 65 20 73 63 68 65   reread the sche
17640 6d 61 2e 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72  ma..**.** Either
17650 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e   a transaction n
17660 65 65 64 73 20 74 6f 20 68 61 76 65 20 62 65 65  eeds to have bee
17670 6e 20 73 74 61 72 74 65 64 20 6f 72 20 61 6e 20  n started or an 
17680 4f 50 5f 4f 70 65 6e 20 6e 65 65 64 73 0a 2a 2a  OP_Open needs.**
17690 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 20   to be executed 
176a0 28 74 6f 20 65 73 74 61 62 6c 69 73 68 20 61 20  (to establish a 
176b0 72 65 61 64 20 6c 6f 63 6b 29 20 62 65 66 6f 72  read lock) befor
176c0 65 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73  e this opcode is
176d0 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a  .** invoked..*/.
176e0 63 61 73 65 20 4f 50 5f 56 65 72 69 66 79 43 6f  case OP_VerifyCo
176f0 6f 6b 69 65 3a 20 7b 0a 20 20 69 6e 74 20 69 4d  okie: {.  int iM
17700 65 74 61 3b 0a 20 20 42 74 72 65 65 20 2a 70 42  eta;.  Btree *pB
17710 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  t;.  assert( pOp
17720 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
17730 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p1<db->nDb );.  
17740 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65  assert( (p->btre
17750 65 4d 61 73 6b 20 26 20 28 31 3c 3c 70 4f 70 2d  eMask & (1<<pOp-
17760 3e 70 31 29 29 21 3d 30 20 29 3b 0a 20 20 70 42  >p1))!=0 );.  pB
17770 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d  t = db->aDb[pOp-
17780 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 69 66 28 20  >p1].pBt;.  if( 
17790 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBt ){.    sqlit
177a0 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
177b0 42 74 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41  Bt, BTREE_SCHEMA
177c0 5f 56 45 52 53 49 4f 4e 2c 20 28 75 33 32 20 2a  _VERSION, (u32 *
177d0 29 26 69 4d 65 74 61 29 3b 0a 20 20 7d 65 6c 73  )&iMeta);.  }els
177e0 65 7b 0a 20 20 20 20 69 4d 65 74 61 20 3d 20 30  e{.    iMeta = 0
177f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 4d 65 74  ;.  }.  if( iMet
17800 61 21 3d 70 4f 70 2d 3e 70 32 20 29 7b 0a 20 20  a!=pOp->p2 ){.  
17810 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
17820 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
17830 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
17840 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
17850 70 28 64 62 2c 20 22 64 61 74 61 62 61 73 65 20  p(db, "database 
17860 73 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67  schema has chang
17870 65 64 22 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ed");.    /* If 
17880 74 68 65 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69  the schema-cooki
17890 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
178a0 61 73 65 20 66 69 6c 65 20 6d 61 74 63 68 65 73  ase file matches
178b0 20 74 68 65 20 63 6f 6f 6b 69 65 20 0a 20 20 20   the cookie .   
178c0 20 2a 2a 20 73 74 6f 72 65 64 20 77 69 74 68 20   ** stored with 
178d0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
178e0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
178f0 74 68 65 20 73 63 68 65 6d 61 2c 20 64 6f 0a 20  the schema, do. 
17900 20 20 20 2a 2a 20 6e 6f 74 20 72 65 6c 6f 61 64     ** not reload
17910 20 74 68 65 20 73 63 68 65 6d 61 20 66 72 6f 6d   the schema from
17920 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17930 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
17940 2a 20 49 66 20 76 69 72 74 75 61 6c 2d 74 61 62  * If virtual-tab
17950 6c 65 73 20 61 72 65 20 69 6e 20 75 73 65 2c 20  les are in use, 
17960 74 68 69 73 20 69 73 20 6e 6f 74 20 6a 75 73 74  this is not just
17970 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
17980 2e 0a 20 20 20 20 2a 2a 20 4f 66 74 65 6e 2c 20  ..    ** Often, 
17990 76 2d 74 61 62 6c 65 73 20 73 74 6f 72 65 20 74  v-tables store t
179a0 68 65 69 72 20 64 61 74 61 20 69 6e 20 6f 74 68  heir data in oth
179b0 65 72 20 53 51 4c 69 74 65 20 74 61 62 6c 65 73  er SQLite tables
179c0 2c 20 77 68 69 63 68 0a 20 20 20 20 2a 2a 20 61  , which.    ** a
179d0 72 65 20 71 75 65 72 69 65 64 20 66 72 6f 6d 20  re queried from 
179e0 77 69 74 68 69 6e 20 78 4e 65 78 74 28 29 20 61  within xNext() a
179f0 6e 64 20 6f 74 68 65 72 20 76 2d 74 61 62 6c 65  nd other v-table
17a00 20 6d 65 74 68 6f 64 73 20 75 73 69 6e 67 0a 20   methods using. 
17a10 20 20 20 2a 2a 20 70 72 65 70 61 72 65 64 20 71     ** prepared q
17a20 75 65 72 69 65 73 2e 20 49 66 20 73 75 63 68 20  ueries. If such 
17a30 61 20 71 75 65 72 79 20 69 73 20 6f 75 74 2d 6f  a query is out-o
17a40 66 2d 64 61 74 65 2c 20 77 65 20 64 6f 20 6e 6f  f-date, we do no
17a50 74 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 2a 2a  t want to.    **
17a60 20 64 69 73 63 61 72 64 20 74 68 65 20 64 61 74   discard the dat
17a70 61 62 61 73 65 20 73 63 68 65 6d 61 2c 20 61 73  abase schema, as
17a80 20 74 68 65 20 75 73 65 72 20 63 6f 64 65 20 69   the user code i
17a90 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 0a  mplementing the.
17aa0 20 20 20 20 2a 2a 20 76 2d 74 61 62 6c 65 20 77      ** v-table w
17ab0 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 62 65 20  ould have to be 
17ac0 72 65 61 64 79 20 66 6f 72 20 74 68 65 20 73 71  ready for the sq
17ad0 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63  lite3_vtab struc
17ae0 74 75 72 65 20 69 74 73 65 6c 66 0a 20 20 20 20  ture itself.    
17af0 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  ** to be invalid
17b00 61 74 65 64 20 77 68 65 6e 65 76 65 72 20 73 71  ated whenever sq
17b10 6c 69 74 65 33 5f 73 74 65 70 28 29 20 69 73 20  lite3_step() is 
17b20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
17b30 69 6e 20 0a 20 20 20 20 2a 2a 20 61 20 76 2d 74  in .    ** a v-t
17b40 61 62 6c 65 20 6d 65 74 68 6f 64 2e 0a 20 20 20  able method..   
17b50 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   */.    if( db->
17b60 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 53 63  aDb[pOp->p1].pSc
17b70 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
17b80 6b 69 65 21 3d 69 4d 65 74 61 20 29 7b 0a 20 20  kie!=iMeta ){.  
17b90 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
17ba0 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64  InternalSchema(d
17bb0 62 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20  b, pOp->p1);.   
17bc0 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45   }..    sqlite3E
17bd0 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
17be0 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
17bf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 53 43 48   rc = SQLITE_SCH
17c00 45 4d 41 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  EMA;.  }.  break
17c10 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
17c20 4f 70 65 6e 52 65 61 64 20 50 31 20 50 32 20 50  OpenRead P1 P2 P
17c30 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 4f 70  3 P4 P5.**.** Op
17c40 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  en a read-only c
17c50 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61  ursor for the da
17c60 74 61 62 61 73 65 20 74 61 62 6c 65 20 77 68 6f  tabase table who
17c70 73 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 0a  se root page is.
17c80 2a 2a 20 50 32 20 69 6e 20 61 20 64 61 74 61 62  ** P2 in a datab
17c90 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 64  ase file.  The d
17ca0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
17cb0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 50 33  determined by P3
17cc0 2e 20 0a 2a 2a 20 50 33 3d 3d 30 20 6d 65 61 6e  . .** P3==0 mean
17cd0 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
17ce0 61 73 65 2c 20 50 33 3d 3d 31 20 6d 65 61 6e 73  ase, P3==1 means
17cf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
17d00 65 64 20 66 6f 72 20 0a 2a 2a 20 74 65 6d 70 6f  ed for .** tempo
17d10 72 61 72 79 20 74 61 62 6c 65 73 2c 20 61 6e 64  rary tables, and
17d20 20 50 33 3e 31 20 6d 65 61 6e 73 20 75 73 65 64   P3>1 means used
17d30 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
17d40 6e 67 20 61 74 74 61 63 68 65 64 0a 2a 2a 20 64  ng attached.** d
17d50 61 74 61 62 61 73 65 2e 20 20 47 69 76 65 20 74  atabase.  Give t
17d60 68 65 20 6e 65 77 20 63 75 72 73 6f 72 20 61 6e  he new cursor an
17d70 20 69 64 65 6e 74 69 66 69 65 72 20 6f 66 20 50   identifier of P
17d80 31 2e 20 20 54 68 65 20 50 31 0a 2a 2a 20 76 61  1.  The P1.** va
17d90 6c 75 65 73 20 6e 65 65 64 20 6e 6f 74 20 62 65  lues need not be
17da0 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 75 74 20   contiguous but 
17db0 61 6c 6c 20 50 31 20 76 61 6c 75 65 73 20 73 68  all P1 values sh
17dc0 6f 75 6c 64 20 62 65 20 73 6d 61 6c 6c 20 69 6e  ould be small in
17dd0 74 65 67 65 72 73 2e 0a 2a 2a 20 49 74 20 69 73  tegers..** It is
17de0 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 50 31   an error for P1
17df0 20 74 6f 20 62 65 20 6e 65 67 61 74 69 76 65 2e   to be negative.
17e00 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 21 3d 30 20  .**.** If P5!=0 
17e10 74 68 65 6e 20 75 73 65 20 74 68 65 20 63 6f 6e  then use the con
17e20 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72  tent of register
17e30 20 50 32 20 61 73 20 74 68 65 20 72 6f 6f 74 20   P2 as the root 
17e40 70 61 67 65 2c 20 6e 6f 74 0a 2a 2a 20 74 68 65  page, not.** the
17e50 20 76 61 6c 75 65 20 6f 66 20 50 32 20 69 74 73   value of P2 its
17e60 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  elf..**.** There
17e70 20 77 69 6c 6c 20 62 65 20 61 20 72 65 61 64 20   will be a read 
17e80 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
17e90 62 61 73 65 20 77 68 65 6e 65 76 65 72 20 74 68  base whenever th
17ea0 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 6f 70 65  ere is an.** ope
17eb0 6e 20 63 75 72 73 6f 72 2e 20 20 49 66 20 74 68  n cursor.  If th
17ec0 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 75  e database was u
17ed0 6e 6c 6f 63 6b 65 64 20 70 72 69 6f 72 20 74 6f  nlocked prior to
17ee0 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
17ef0 6e 0a 2a 2a 20 74 68 65 6e 20 61 20 72 65 61 64  n.** then a read
17f00 20 6c 6f 63 6b 20 69 73 20 61 63 71 75 69 72 65   lock is acquire
17f10 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69  d as part of thi
17f20 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  s instruction.  
17f30 41 20 72 65 61 64 0a 2a 2a 20 6c 6f 63 6b 20 61  A read.** lock a
17f40 6c 6c 6f 77 73 20 6f 74 68 65 72 20 70 72 6f 63  llows other proc
17f50 65 73 73 65 73 20 74 6f 20 72 65 61 64 20 74 68  esses to read th
17f60 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 70  e database but p
17f70 72 6f 68 69 62 69 74 73 0a 2a 2a 20 61 6e 79 20  rohibits.** any 
17f80 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 66 72  other process fr
17f90 6f 6d 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  om modifying the
17fa0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
17fb0 72 65 61 64 20 6c 6f 63 6b 20 69 73 0a 2a 2a 20  read lock is.** 
17fc0 72 65 6c 65 61 73 65 64 20 77 68 65 6e 20 61 6c  released when al
17fd0 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6c  l cursors are cl
17fe0 6f 73 65 64 2e 20 20 49 66 20 74 68 69 73 20 69  osed.  If this i
17ff0 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 74 65 6d  nstruction attem
18000 70 74 73 0a 2a 2a 20 74 6f 20 67 65 74 20 61 20  pts.** to get a 
18010 72 65 61 64 20 6c 6f 63 6b 20 62 75 74 20 66 61  read lock but fa
18020 69 6c 73 2c 20 74 68 65 20 73 63 72 69 70 74 20  ils, the script 
18030 74 65 72 6d 69 6e 61 74 65 73 20 77 69 74 68 20  terminates with 
18040 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  an.** SQLITE_BUS
18050 59 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  Y error code..**
18060 0a 2a 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65  .** The P4 value
18070 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61   may be either a
18080 6e 20 69 6e 74 65 67 65 72 20 28 50 34 5f 49 4e  n integer (P4_IN
18090 54 33 32 29 20 6f 72 20 61 20 70 6f 69 6e 74 65  T32) or a pointe
180a0 72 20 74 6f 0a 2a 2a 20 61 20 4b 65 79 49 6e 66  r to.** a KeyInf
180b0 6f 20 73 74 72 75 63 74 75 72 65 20 28 50 34 5f  o structure (P4_
180c0 4b 45 59 49 4e 46 4f 29 2e 20 49 66 20 69 74 20  KEYINFO). If it 
180d0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
180e0 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74  a KeyInfo .** st
180f0 72 75 63 74 75 72 65 2c 20 74 68 65 6e 20 73 61  ructure, then sa
18100 69 64 20 73 74 72 75 63 74 75 72 65 20 64 65 66  id structure def
18110 69 6e 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  ines the content
18120 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 0a   and collating .
18130 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74  ** sequence of t
18140 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 6f  he index being o
18150 70 65 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  pened. Otherwise
18160 2c 20 69 66 20 50 34 20 69 73 20 61 6e 20 69 6e  , if P4 is an in
18170 74 65 67 65 72 20 0a 2a 2a 20 76 61 6c 75 65 2c  teger .** value,
18180 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 74 68   it is set to th
18190 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
181a0 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
181b0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
181c0 20 4f 70 65 6e 57 72 69 74 65 2e 0a 2a 2f 0a 2f   OpenWrite..*/./
181d0 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 57 72  * Opcode: OpenWr
181e0 69 74 65 20 50 31 20 50 32 20 50 33 20 50 34 20  ite P1 P2 P3 P4 
181f0 50 35 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  P5.**.** Open a 
18200 72 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f  read/write curso
18210 72 20 6e 61 6d 65 64 20 50 31 20 6f 6e 20 74 68  r named P1 on th
18220 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
18230 20 77 68 6f 73 65 20 72 6f 6f 74 0a 2a 2a 20 70   whose root.** p
18240 61 67 65 20 69 73 20 50 32 2e 20 20 4f 72 20 69  age is P2.  Or i
18250 66 20 50 35 21 3d 30 20 75 73 65 20 74 68 65 20  f P5!=0 use the 
18260 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73  content of regis
18270 74 65 72 20 50 32 20 74 6f 20 66 69 6e 64 20 74  ter P2 to find t
18280 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e  he.** root page.
18290 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 76 61  .**.** The P4 va
182a0 6c 75 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  lue may be eithe
182b0 72 20 61 6e 20 69 6e 74 65 67 65 72 20 28 50 34  r an integer (P4
182c0 5f 49 4e 54 33 32 29 20 6f 72 20 61 20 70 6f 69  _INT32) or a poi
182d0 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20 4b 65 79  nter to.** a Key
182e0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 28  Info structure (
182f0 50 34 5f 4b 45 59 49 4e 46 4f 29 2e 20 49 66 20  P4_KEYINFO). If 
18300 69 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  it is a pointer 
18310 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a  to a KeyInfo .**
18320 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e   structure, then
18330 20 73 61 69 64 20 73 74 72 75 63 74 75 72 65 20   said structure 
18340 64 65 66 69 6e 65 73 20 74 68 65 20 63 6f 6e 74  defines the cont
18350 65 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ent and collatin
18360 67 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f  g .** sequence o
18370 66 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  f the index bein
18380 67 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65 72 77  g opened. Otherw
18390 69 73 65 2c 20 69 66 20 50 34 20 69 73 20 61 6e  ise, if P4 is an
183a0 20 69 6e 74 65 67 65 72 20 0a 2a 2a 20 76 61 6c   integer .** val
183b0 75 65 2c 20 69 74 20 69 73 20 73 65 74 20 74 6f  ue, it is set to
183c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
183d0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
183e0 62 6c 65 2c 20 6f 72 20 74 6f 20 74 68 65 0a 2a  ble, or to the.*
183f0 2a 20 6c 61 72 67 65 73 74 20 69 6e 64 65 78 20  * largest index 
18400 6f 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66  of any column of
18410 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
18420 69 73 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64  is actually used
18430 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73  ..**.** This ins
18440 74 72 75 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6a  truction works j
18450 75 73 74 20 6c 69 6b 65 20 4f 70 65 6e 52 65 61  ust like OpenRea
18460 64 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  d except that it
18470 20 6f 70 65 6e 73 20 74 68 65 20 63 75 72 73 6f   opens the curso
18480 72 0a 2a 2a 20 69 6e 20 72 65 61 64 2f 77 72 69  r.** in read/wri
18490 74 65 20 6d 6f 64 65 2e 20 20 46 6f 72 20 61 20  te mode.  For a 
184a0 67 69 76 65 6e 20 74 61 62 6c 65 2c 20 74 68 65  given table, the
184b0 72 65 20 63 61 6e 20 62 65 20 6f 6e 65 20 6f 72  re can be one or
184c0 20 6d 6f 72 65 20 72 65 61 64 2d 6f 6e 6c 79 0a   more read-only.
184d0 2a 2a 20 63 75 72 73 6f 72 73 20 6f 72 20 61 20  ** cursors or a 
184e0 73 69 6e 67 6c 65 20 72 65 61 64 2f 77 72 69 74  single read/writ
184f0 65 20 63 75 72 73 6f 72 20 62 75 74 20 6e 6f 74  e cursor but not
18500 20 62 6f 74 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   both..**.** See
18510 20 61 6c 73 6f 20 4f 70 65 6e 52 65 61 64 2e 0a   also OpenRead..
18520 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 52  */.case OP_OpenR
18530 65 61 64 3a 0a 63 61 73 65 20 4f 50 5f 4f 70 65  ead:.case OP_Ope
18540 6e 57 72 69 74 65 3a 20 7b 0a 20 20 69 6e 74 20  nWrite: {.  int 
18550 6e 46 69 65 6c 64 3b 0a 20 20 4b 65 79 49 6e 66  nField;.  KeyInf
18560 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69  o *pKeyInfo;.  i
18570 6e 74 20 70 32 3b 0a 20 20 69 6e 74 20 69 44 62  nt p2;.  int iDb
18580 3b 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 3b 0a  ;.  int wrFlag;.
18590 20 20 42 74 72 65 65 20 2a 70 58 3b 0a 20 20 56    Btree *pX;.  V
185a0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b  dbeCursor *pCur;
185b0 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 69  .  Db *pDb;..  i
185c0 66 28 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  f( p->expired ){
185d0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
185e0 5f 41 42 4f 52 54 3b 0a 20 20 20 20 62 72 65 61  _ABORT;.    brea
185f0 6b 3b 0a 20 20 7d 0a 0a 20 20 6e 46 69 65 6c 64  k;.  }..  nField
18600 20 3d 20 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f   = 0;.  pKeyInfo
18610 20 3d 20 30 3b 0a 20 20 70 32 20 3d 20 70 4f 70   = 0;.  p2 = pOp
18620 2d 3e 70 32 3b 0a 20 20 69 44 62 20 3d 20 70 4f  ->p2;.  iDb = pO
18630 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72 74 28  p->p3;.  assert(
18640 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
18650 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
18660 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73  rt( (p->btreeMas
18670 6b 20 26 20 28 31 3c 3c 69 44 62 29 29 21 3d 30  k & (1<<iDb))!=0
18680 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   );.  pDb = &db-
18690 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 58 20  >aDb[iDb];.  pX 
186a0 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 61 73  = pDb->pBt;.  as
186b0 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
186c0 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
186d0 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 29  ==OP_OpenWrite )
186e0 7b 0a 20 20 20 20 77 72 46 6c 61 67 20 3d 20 31  {.    wrFlag = 1
186f0 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
18700 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72  Schema->file_for
18710 6d 61 74 20 3c 20 70 2d 3e 6d 69 6e 57 72 69 74  mat < p->minWrit
18720 65 46 69 6c 65 46 6f 72 6d 61 74 20 29 7b 0a 20  eFileFormat ){. 
18730 20 20 20 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65       p->minWrite
18740 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 70 44 62  FileFormat = pDb
18750 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f  ->pSchema->file_
18760 66 6f 72 6d 61 74 3b 0a 20 20 20 20 7d 0a 20 20  format;.    }.  
18770 7d 65 6c 73 65 7b 0a 20 20 20 20 77 72 46 6c 61  }else{.    wrFla
18780 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  g = 0;.  }.  if(
18790 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20   pOp->p5 ){.    
187a0 61 73 73 65 72 74 28 20 70 32 3e 30 20 29 3b 0a  assert( p2>0 );.
187b0 20 20 20 20 61 73 73 65 72 74 28 20 70 32 3c 3d      assert( p2<=
187c0 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 70  p->nMem );.    p
187d0 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b  In2 = &aMem[p2];
187e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
187f0 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49  MemIntegerify(pI
18800 6e 32 29 3b 0a 20 20 20 20 70 32 20 3d 20 28 69  n2);.    p2 = (i
18810 6e 74 29 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20  nt)pIn2->u.i;.  
18820 20 20 2f 2a 20 54 68 65 20 70 32 20 76 61 6c 75    /* The p2 valu
18830 65 20 61 6c 77 61 79 73 20 63 6f 6d 65 73 20 66  e always comes f
18840 72 6f 6d 20 61 20 70 72 69 6f 72 20 4f 50 5f 43  rom a prior OP_C
18850 72 65 61 74 65 54 61 62 6c 65 20 6f 70 63 6f 64  reateTable opcod
18860 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 61  e and.    ** tha
18870 74 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 61 6c  t opcode will al
18880 77 61 79 73 20 73 65 74 20 74 68 65 20 70 32 20  ways set the p2 
18890 76 61 6c 75 65 20 74 6f 20 32 20 6f 72 20 6d 6f  value to 2 or mo
188a0 72 65 20 6f 72 20 65 6c 73 65 20 66 61 69 6c 2e  re or else fail.
188b0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
188c0 20 77 65 72 65 20 61 20 66 61 69 6c 75 72 65 2c   were a failure,
188d0 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
188e0 61 74 65 6d 65 6e 74 20 77 6f 75 6c 64 20 68 61  atement would ha
188f0 76 65 20 68 61 6c 74 65 64 0a 20 20 20 20 2a 2a  ve halted.    **
18900 20 62 65 66 6f 72 65 20 72 65 61 63 68 69 6e 67   before reaching
18910 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
18920 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45  n. */.    if( NE
18930 56 45 52 28 70 32 3c 32 29 20 29 20 7b 0a 20 20  VER(p2<2) ) {.  
18940 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18950 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
18960 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
18970 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
18980 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70   }.  }.  if( pOp
18990 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59  ->p4type==P4_KEY
189a0 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70 4b 65 79  INFO ){.    pKey
189b0 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Info = pOp->p4.p
189c0 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65  KeyInfo;.    pKe
189d0 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43  yInfo->enc = ENC
189e0 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 6e 46 69  (p->db);.    nFi
189f0 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
18a00 6e 46 69 65 6c 64 2b 31 3b 0a 20 20 7d 65 6c 73  nField+1;.  }els
18a10 65 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70  e if( pOp->p4typ
18a20 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20  e==P4_INT32 ){. 
18a30 20 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d     nField = pOp-
18a40 3e 70 34 2e 69 3b 0a 20 20 7d 0a 20 20 61 73 73  >p4.i;.  }.  ass
18a50 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
18a60 29 3b 0a 20 20 70 43 75 72 20 3d 20 61 6c 6c 6f  );.  pCur = allo
18a70 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f  cateCursor(p, pO
18a80 70 2d 3e 70 31 2c 20 6e 46 69 65 6c 64 2c 20 69  p->p1, nField, i
18a90 44 62 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43  Db, 1);.  if( pC
18aa0 75 72 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  ur==0 ) goto no_
18ab0 6d 65 6d 3b 0a 20 20 70 43 75 72 2d 3e 6e 75 6c  mem;.  pCur->nul
18ac0 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 63 20 3d  lRow = 1;.  rc =
18ad0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
18ae0 73 6f 72 28 70 58 2c 20 70 32 2c 20 77 72 46 6c  sor(pX, p2, wrFl
18af0 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
18b00 75 72 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20  ur->pCursor);.  
18b10 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
18b20 20 70 4b 65 79 49 6e 66 6f 3b 0a 0a 20 20 2f 2a   pKeyInfo;..  /*
18b30 20 53 69 6e 63 65 20 69 74 20 70 65 72 66 6f 72   Since it perfor
18b40 6d 73 20 6e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  ms no memory all
18b50 6f 63 61 74 69 6f 6e 20 6f 72 20 49 4f 2c 20 74  ocation or IO, t
18b60 68 65 20 6f 6e 6c 79 20 76 61 6c 75 65 73 20 74  he only values t
18b70 68 61 74 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  hat.  ** sqlite3
18b80 42 74 72 65 65 43 75 72 73 6f 72 28 29 20 6d 61  BtreeCursor() ma
18b90 79 20 72 65 74 75 72 6e 20 61 72 65 20 53 51 4c  y return are SQL
18ba0 49 54 45 5f 45 4d 50 54 59 20 61 6e 64 20 53 51  ITE_EMPTY and SQ
18bb0 4c 49 54 45 5f 4f 4b 2e 20 0a 20 20 2a 2a 20 53  LITE_OK. .  ** S
18bc0 51 4c 49 54 45 5f 45 4d 50 54 59 20 69 73 20 6f  QLITE_EMPTY is o
18bd0 6e 6c 79 20 72 65 74 75 72 6e 65 64 20 77 68 65  nly returned whe
18be0 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
18bf0 6f 70 65 6e 20 74 68 65 20 74 61 62 6c 65 0a 20  open the table. 
18c00 20 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61   ** rooted at pa
18c10 67 65 20 31 20 6f 66 20 61 20 7a 65 72 6f 2d 62  ge 1 of a zero-b
18c20 79 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a  yte database.  *
18c30 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  /.  assert( rc==
18c40 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 7c 7c 20  SQLITE_EMPTY || 
18c50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
18c60 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18c70 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 70  E_EMPTY ){.    p
18c80 43 75 72 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  Cur->pCursor = 0
18c90 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
18ca0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
18cb0 53 65 74 20 74 68 65 20 56 64 62 65 43 75 72 73  Set the VdbeCurs
18cc0 6f 72 2e 69 73 54 61 62 6c 65 20 61 6e 64 20 69  or.isTable and i
18cd0 73 49 6e 64 65 78 20 76 61 72 69 61 62 6c 65 73  sIndex variables
18ce0 2e 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69  . Previous versi
18cf0 6f 6e 73 20 6f 66 0a 20 20 2a 2a 20 53 51 4c 69  ons of.  ** SQLi
18d00 74 65 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  te used to check
18d10 20 69 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   if the root-pag
18d20 65 20 66 6c 61 67 73 20 77 65 72 65 20 73 61 6e  e flags were san
18d30 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 0a  e at this point.
18d40 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 20    ** and report 
18d50 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
18d60 69 6f 6e 20 69 66 20 74 68 65 79 20 77 65 72 65  ion if they were
18d70 20 6e 6f 74 2c 20 62 75 74 20 74 68 69 73 20 63   not, but this c
18d80 68 65 63 6b 20 68 61 73 0a 20 20 2a 2a 20 73 69  heck has.  ** si
18d90 6e 63 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74  nce moved into t
18da0 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 20  he btree layer. 
18db0 20 2a 2f 20 20 0a 20 20 70 43 75 72 2d 3e 69 73   */  .  pCur->is
18dc0 54 61 62 6c 65 20 3d 20 70 4f 70 2d 3e 70 34 74  Table = pOp->p4t
18dd0 79 70 65 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 3b  ype!=P4_KEYINFO;
18de0 0a 20 20 70 43 75 72 2d 3e 69 73 49 6e 64 65 78  .  pCur->isIndex
18df0 20 3d 20 21 70 43 75 72 2d 3e 69 73 54 61 62 6c   = !pCur->isTabl
18e00 65 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  e;.  break;.}../
18e10 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 45 70  * Opcode: OpenEp
18e20 68 65 6d 65 72 61 6c 20 50 31 20 50 32 20 2a 20  hemeral P1 P2 * 
18e30 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  P4 *.**.** Open 
18e40 61 20 6e 65 77 20 63 75 72 73 6f 72 20 50 31 20  a new cursor P1 
18e50 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  to a transient t
18e60 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 63 75 72  able..** The cur
18e70 73 6f 72 20 69 73 20 61 6c 77 61 79 73 20 6f 70  sor is always op
18e80 65 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65 20  ened read/write 
18e90 65 76 65 6e 20 69 66 20 0a 2a 2a 20 74 68 65 20  even if .** the 
18ea0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
18eb0 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 54 68 65   read-only.  The
18ec0 20 65 70 68 65 6d 65 72 61 6c 0a 2a 2a 20 74 61   ephemeral.** ta
18ed0 62 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20 61  ble is deleted a
18ee0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
18ef0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
18f00 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 32  closed..**.** P2
18f10 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
18f20 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
18f30 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
18f40 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20  ..** The cursor 
18f50 70 6f 69 6e 74 73 20 74 6f 20 61 20 42 54 72 65  points to a BTre
18f60 65 20 74 61 62 6c 65 20 69 66 20 50 34 3d 3d 30  e table if P4==0
18f70 20 61 6e 64 20 74 6f 20 61 20 42 54 72 65 65 20   and to a BTree 
18f80 69 6e 64 65 78 0a 2a 2a 20 69 66 20 50 34 20 69  index.** if P4 i
18f90 73 20 6e 6f 74 20 30 2e 20 20 49 66 20 50 34 20  s not 0.  If P4 
18fa0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
18fb0 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49  points to a KeyI
18fc0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  nfo structure.**
18fd0 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
18fe0 65 20 66 6f 72 6d 61 74 20 6f 66 20 6b 65 79 73  e format of keys
18ff0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a   in the index..*
19000 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
19010 20 77 61 73 20 6f 6e 63 65 20 63 61 6c 6c 65 64   was once called
19020 20 4f 70 65 6e 54 65 6d 70 2e 20 20 42 75 74 20   OpenTemp.  But 
19030 74 68 61 74 20 63 72 65 61 74 65 64 0a 2a 2a 20  that created.** 
19040 63 6f 6e 66 75 73 69 6f 6e 20 62 65 63 61 75 73  confusion becaus
19050 65 20 74 68 65 20 74 65 72 6d 20 22 74 65 6d 70  e the term "temp
19060 20 74 61 62 6c 65 22 2c 20 6d 69 67 68 74 20 72   table", might r
19070 65 66 65 72 20 65 69 74 68 65 72 0a 2a 2a 20 74  efer either.** t
19080 6f 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 61  o a TEMP table a
19090 74 20 74 68 65 20 53 51 4c 20 6c 65 76 65 6c 2c  t the SQL level,
190a0 20 6f 72 20 74 6f 20 61 20 74 61 62 6c 65 20 6f   or to a table o
190b0 70 65 6e 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  pened by.** this
190c0 20 6f 70 63 6f 64 65 2e 20 20 54 68 65 6e 20 74   opcode.  Then t
190d0 68 69 73 20 6f 70 63 6f 64 65 20 77 61 73 20 63  his opcode was c
190e0 61 6c 6c 20 4f 70 65 6e 56 69 72 74 75 61 6c 2e  all OpenVirtual.
190f0 20 20 42 75 74 0a 2a 2a 20 74 68 61 74 20 63 72    But.** that cr
19100 65 61 74 65 64 20 63 6f 6e 66 75 73 69 6f 6e 20  eated confusion 
19110 77 69 74 68 20 74 68 65 20 77 68 6f 6c 65 20 76  with the whole v
19120 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 69 64 65  irtual-table ide
19130 61 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  a..*/./* Opcode:
19140 20 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 20 50   OpenAutoindex P
19150 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  1 P2 * P4 *.**.*
19160 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f  * This opcode wo
19170 72 6b 73 20 74 68 65 20 73 61 6d 65 20 61 73 20  rks the same as 
19180 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
19190 2e 20 20 49 74 20 68 61 73 20 61 0a 2a 2a 20 64  .  It has a.** d
191a0 69 66 66 65 72 65 6e 74 20 6e 61 6d 65 20 74 6f  ifferent name to
191b0 20 64 69 73 74 69 6e 67 75 69 73 68 20 69 74 73   distinguish its
191c0 20 75 73 65 2e 20 20 54 61 62 6c 65 73 20 63 72   use.  Tables cr
191d0 65 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 62  eated using.** b
191e0 79 20 74 68 69 73 20 6f 70 63 6f 64 65 20 77 69  y this opcode wi
191f0 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 61  ll be used for a
19200 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65  utomatically cre
19210 61 74 65 64 20 74 72 61 6e 73 69 65 6e 74 0a 2a  ated transient.*
19220 2a 20 69 6e 64 69 63 65 73 20 69 6e 20 6a 6f 69  * indices in joi
19230 6e 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f  ns..*/.case OP_O
19240 70 65 6e 41 75 74 6f 69 6e 64 65 78 3a 20 0a 63  penAutoindex: .c
19250 61 73 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  ase OP_OpenEphem
19260 65 72 61 6c 3a 20 7b 0a 20 20 56 64 62 65 43 75  eral: {.  VdbeCu
19270 72 73 6f 72 20 2a 70 43 78 3b 0a 20 20 73 74 61  rsor *pCx;.  sta
19280 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 6f 70  tic const int op
19290 65 6e 46 6c 61 67 73 20 3d 20 0a 20 20 20 20 20  enFlags = .     
192a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
192b0 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 53  DWRITE |.      S
192c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
192d0 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45  E |.      SQLITE
192e0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
192f0 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  |.      SQLITE_O
19300 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
19310 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45  E |.      SQLITE
19320 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
19330 44 42 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  DB;..  assert( p
19340 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 70  Op->p1>=0 );.  p
19350 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72  Cx = allocateCur
19360 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20  sor(p, pOp->p1, 
19370 70 4f 70 2d 3e 70 32 2c 20 2d 31 2c 20 31 29 3b  pOp->p2, -1, 1);
19380 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20  .  if( pCx==0 ) 
19390 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70  goto no_mem;.  p
193a0 43 78 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b  Cx->nullRow = 1;
193b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
193c0 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20  treeFactory(db, 
193d0 30 2c 20 31 2c 20 53 51 4c 49 54 45 5f 44 45 46  0, 1, SQLITE_DEF
193e0 41 55 4c 54 5f 54 45 4d 50 5f 43 41 43 48 45 5f  AULT_TEMP_CACHE_
193f0 53 49 5a 45 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  SIZE, openFlags,
19400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19410 20 20 20 20 20 20 20 20 20 20 20 20 26 70 43 78              &pCx
19420 2d 3e 70 42 74 29 3b 0a 20 20 69 66 28 20 72 63  ->pBt);.  if( rc
19430 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19440 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
19450 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
19460 43 78 2d 3e 70 42 74 2c 20 31 29 3b 0a 20 20 7d  Cx->pBt, 1);.  }
19470 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19480 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49  E_OK ){.    /* I
19490 66 20 61 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  f a transient in
194a0 64 65 78 20 69 73 20 72 65 71 75 69 72 65 64 2c  dex is required,
194b0 20 63 72 65 61 74 65 20 69 74 20 62 79 20 63 61   create it by ca
194c0 6c 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 73 71 6c  lling.    ** sql
194d0 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
194e0 61 62 6c 65 28 29 20 77 69 74 68 20 74 68 65 20  able() with the 
194f0 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 66  BTREE_ZERODATA f
19500 6c 61 67 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  lag before.    *
19510 2a 20 6f 70 65 6e 69 6e 67 20 69 74 2e 20 49 66  * opening it. If
19520 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
19530 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 2c 20  le is required, 
19540 6a 75 73 74 20 75 73 65 20 74 68 65 0a 20 20 20  just use the.   
19550 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
19560 79 20 63 72 65 61 74 65 64 20 74 61 62 6c 65 20  y created table 
19570 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 31  with root-page 1
19580 20 28 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c   (an INTKEY tabl
19590 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  e)..    */.    i
195a0 66 28 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49  f( pOp->p4.pKeyI
195b0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  nfo ){.      int
195c0 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 61 73 73   pgno;.      ass
195d0 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
195e0 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a  ==P4_KEYINFO );.
195f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19600 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
19610 6c 65 28 70 43 78 2d 3e 70 42 74 2c 20 26 70 67  le(pCx->pBt, &pg
19620 6e 6f 2c 20 42 54 52 45 45 5f 5a 45 52 4f 44 41  no, BTREE_ZERODA
19630 54 41 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20  TA); .      if( 
19640 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19650 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
19660 20 70 67 6e 6f 3d 3d 4d 41 53 54 45 52 5f 52 4f   pgno==MASTER_RO
19670 4f 54 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  OT+1 );.        
19680 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
19690 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 42 74  eCursor(pCx->pBt
196a0 2c 20 70 67 6e 6f 2c 20 31 2c 20 0a 20 20 20 20  , pgno, 1, .    
196b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196c0 20 20 20 20 20 20 20 20 20 20 20 20 28 4b 65 79              (Key
196d0 49 6e 66 6f 2a 29 70 4f 70 2d 3e 70 34 2e 7a 2c  Info*)pOp->p4.z,
196e0 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a   pCx->pCursor);.
196f0 20 20 20 20 20 20 20 20 70 43 78 2d 3e 70 4b 65          pCx->pKe
19700 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e  yInfo = pOp->p4.
19710 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pKeyInfo;.      
19720 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d    pCx->pKeyInfo-
19730 3e 65 6e 63 20 3d 20 45 4e 43 28 70 2d 3e 64 62  >enc = ENC(p->db
19740 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19750 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20   pCx->isTable = 
19760 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
19770 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19780 42 74 72 65 65 43 75 72 73 6f 72 28 70 43 78 2d  BtreeCursor(pCx-
19790 3e 70 42 74 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  >pBt, MASTER_ROO
197a0 54 2c 20 31 2c 20 30 2c 20 70 43 78 2d 3e 70 43  T, 1, 0, pCx->pC
197b0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 43  ursor);.      pC
197c0 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20 31 3b 0a  x->isTable = 1;.
197d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 78 2d      }.  }.  pCx-
197e0 3e 69 73 49 6e 64 65 78 20 3d 20 21 70 43 78 2d  >isIndex = !pCx-
197f0 3e 69 73 54 61 62 6c 65 3b 0a 20 20 62 72 65 61  >isTable;.  brea
19800 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
19810 20 4f 70 65 6e 50 73 65 75 64 6f 20 50 31 20 50   OpenPseudo P1 P
19820 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4f  2 P3 * *.**.** O
19830 70 65 6e 20 61 20 6e 65 77 20 63 75 72 73 6f 72  pen a new cursor
19840 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20   that points to 
19850 61 20 66 61 6b 65 20 74 61 62 6c 65 20 74 68 61  a fake table tha
19860 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  t contains a sin
19870 67 6c 65 0a 2a 2a 20 72 6f 77 20 6f 66 20 64 61  gle.** row of da
19880 74 61 2e 20 20 54 68 65 20 63 6f 6e 74 65 6e 74  ta.  The content
19890 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 72 6f 77   of that one row
198a0 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
198b0 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67  of memory.** reg
198c0 69 73 74 65 72 20 50 32 2e 20 20 49 6e 20 6f 74  ister P2.  In ot
198d0 68 65 72 20 77 6f 72 64 73 2c 20 63 75 72 73 6f  her words, curso
198e0 72 20 50 31 20 62 65 63 6f 6d 65 73 20 61 6e 20  r P1 becomes an 
198f0 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 0a 2a  alias for the .*
19900 2a 20 4d 45 4d 5f 42 6c 6f 62 20 63 6f 6e 74 65  * MEM_Blob conte
19910 6e 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  nt contained in 
19920 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a  register P2..**.
19930 2a 2a 20 41 20 70 73 65 75 64 6f 2d 74 61 62 6c  ** A pseudo-tabl
19940 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  e created by thi
19950 73 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64  s opcode is used
19960 20 74 6f 20 68 6f 6c 64 20 61 20 73 69 6e 67 6c   to hold a singl
19970 65 0a 2a 2a 20 72 6f 77 20 6f 75 74 70 75 74 20  e.** row output 
19980 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20  from the sorter 
19990 73 6f 20 74 68 61 74 20 74 68 65 20 72 6f 77 20  so that the row 
199a0 63 61 6e 20 62 65 20 64 65 63 6f 6d 70 6f 73 65  can be decompose
199b0 64 20 69 6e 74 6f 0a 2a 2a 20 69 6e 64 69 76 69  d into.** indivi
199c0 64 75 61 6c 20 63 6f 6c 75 6d 6e 73 20 75 73 69  dual columns usi
199d0 6e 67 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e  ng the OP_Column
199e0 20 6f 70 63 6f 64 65 2e 20 20 54 68 65 20 4f 50   opcode.  The OP
199f0 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 0a 2a  _Column opcode.*
19a00 2a 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 63 75  * is the only cu
19a10 72 73 6f 72 20 6f 70 63 6f 64 65 20 74 68 61 74  rsor opcode that
19a20 20 77 6f 72 6b 73 20 77 69 74 68 20 61 20 70 73   works with a ps
19a30 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  eudo-table..**.*
19a40 2a 20 50 33 20 69 73 20 74 68 65 20 6e 75 6d 62  * P3 is the numb
19a50 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
19a60 74 68 65 20 72 65 63 6f 72 64 73 20 74 68 61 74  the records that
19a70 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
19a80 62 79 0a 2a 2a 20 74 68 65 20 70 73 65 75 64 6f  by.** the pseudo
19a90 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20  -table..*/.case 
19aa0 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 3a 20 7b  OP_OpenPseudo: {
19ab0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
19ac0 43 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Cx;..  assert( p
19ad0 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 70  Op->p1>=0 );.  p
19ae0 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72  Cx = allocateCur
19af0 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20  sor(p, pOp->p1, 
19b00 70 4f 70 2d 3e 70 33 2c 20 2d 31 2c 20 30 29 3b  pOp->p3, -1, 0);
19b10 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20  .  if( pCx==0 ) 
19b20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70  goto no_mem;.  p
19b30 43 78 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b  Cx->nullRow = 1;
19b40 0a 20 20 70 43 78 2d 3e 70 73 65 75 64 6f 54 61  .  pCx->pseudoTa
19b50 62 6c 65 52 65 67 20 3d 20 70 4f 70 2d 3e 70 32  bleReg = pOp->p2
19b60 3b 0a 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65  ;.  pCx->isTable
19b70 20 3d 20 31 3b 0a 20 20 70 43 78 2d 3e 69 73 49   = 1;.  pCx->isI
19b80 6e 64 65 78 20 3d 20 30 3b 0a 20 20 62 72 65 61  ndex = 0;.  brea
19b90 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
19ba0 20 43 6c 6f 73 65 20 50 31 20 2a 20 2a 20 2a 20   Close P1 * * * 
19bb0 2a 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  *.**.** Close a 
19bc0 63 75 72 73 6f 72 20 70 72 65 76 69 6f 75 73 6c  cursor previousl
19bd0 79 20 6f 70 65 6e 65 64 20 61 73 20 50 31 2e 20  y opened as P1. 
19be0 20 49 66 20 50 31 20 69 73 20 6e 6f 74 0a 2a 2a   If P1 is not.**
19bf0 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c   currently open,
19c00 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
19c10 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  n is a no-op..*/
19c20 0a 63 61 73 65 20 4f 50 5f 43 6c 6f 73 65 3a 20  .case OP_Close: 
19c30 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  {.  assert( pOp-
19c40 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
19c50 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
19c60 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
19c70 65 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70  eCursor(p, p->ap
19c80 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 29 3b 0a 20  Csr[pOp->p1]);. 
19c90 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
19ca0 31 5d 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b  1] = 0;.  break;
19cb0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .}../* Opcode: S
19cc0 65 65 6b 47 65 20 50 31 20 50 32 20 50 33 20 50  eekGe P1 P2 P3 P
19cd0 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72  4 *.**.** If cur
19ce0 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f  sor P1 refers to
19cf0 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42   an SQL table (B
19d00 2d 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20  -Tree that uses 
19d10 69 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a  integer keys), .
19d20 2a 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65  ** use the value
19d30 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20   in register P3 
19d40 61 73 20 74 68 65 20 6b 65 79 2e 20 20 49 66 20  as the key.  If 
19d50 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73  cursor P1 refers
19d60 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69   .** to an SQL i
19d70 6e 64 65 78 2c 20 74 68 65 6e 20 50 33 20 69 73  ndex, then P3 is
19d80 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e   the first in an
19d90 20 61 72 72 61 79 20 6f 66 20 50 34 20 72 65 67   array of P4 reg
19da0 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20  isters .** that 
19db0 61 72 65 20 75 73 65 64 20 61 73 20 61 6e 20 75  are used as an u
19dc0 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
19dd0 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69  y. .**.** Reposi
19de0 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 73  tion cursor P1 s
19df0 6f 20 74 68 61 74 20 20 69 74 20 70 6f 69 6e 74  o that  it point
19e00 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73  s to the smalles
19e10 74 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a  t entry that .**
19e20 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
19e30 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
19e40 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74   key value. If t
19e50 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f  here are no reco
19e60 72 64 73 20 0a 2a 2a 20 67 72 65 61 74 65 72 20  rds .** greater 
19e70 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
19e80 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20   the key and P2 
19e90 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
19ea0 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a  n jump to P2..**
19eb0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f  .** See also: Fo
19ec0 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44  und, NotFound, D
19ed0 69 73 74 69 6e 63 74 2c 20 53 65 65 6b 4c 74 2c  istinct, SeekLt,
19ee0 20 53 65 65 6b 47 74 2c 20 53 65 65 6b 4c 65 0a   SeekGt, SeekLe.
19ef0 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65  */./* Opcode: Se
19f00 65 6b 47 74 20 50 31 20 50 32 20 50 33 20 50 34  ekGt P1 P2 P3 P4
19f10 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73   *.**.** If curs
19f20 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f 20  or P1 refers to 
19f30 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d  an SQL table (B-
19f40 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20 69  Tree that uses i
19f50 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a  nteger keys), .*
19f60 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20  * use the value 
19f70 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 61  in register P3 a
19f80 73 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73  s a key. If curs
19f90 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a  or P1 refers .**
19fa0 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
19fb0 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 65  , then P3 is the
19fc0 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   first in an arr
19fd0 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 65  ay of P4 registe
19fe0 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  rs .** that are 
19ff0 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63  used as an unpac
1a000 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a  ked index key. .
1a010 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e  **.** Reposition
1a020 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68   cursor P1 so th
1a030 61 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  at  it points to
1a040 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e   the smallest en
1a050 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20  try that .** is 
1a060 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
1a070 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74   key value. If t
1a080 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f  here are no reco
1a090 72 64 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  rds greater than
1a0a0 20 0a 2a 2a 20 74 68 65 20 6b 65 79 20 61 6e 64   .** the key and
1a0b0 20 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c   P2 is not zero,
1a0c0 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32   then jump to P2
1a0d0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
1a0e0 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e  : Found, NotFoun
1a0f0 64 2c 20 44 69 73 74 69 6e 63 74 2c 20 53 65 65  d, Distinct, See
1a100 6b 4c 74 2c 20 53 65 65 6b 47 65 2c 20 53 65 65  kLt, SeekGe, See
1a110 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  kLe.*/./* Opcode
1a120 3a 20 53 65 65 6b 4c 74 20 50 31 20 50 32 20 50  : SeekLt P1 P2 P
1a130 33 20 50 34 20 2a 20 0a 2a 2a 0a 2a 2a 20 49 66  3 P4 * .**.** If
1a140 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72   cursor P1 refer
1a150 73 20 74 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c  s to an SQL tabl
1a160 65 20 28 42 2d 54 72 65 65 20 74 68 61 74 20 75  e (B-Tree that u
1a170 73 65 73 20 69 6e 74 65 67 65 72 20 6b 65 79 73  ses integer keys
1a180 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65 20 76  ), .** use the v
1a190 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
1a1a0 20 50 33 20 61 73 20 61 20 6b 65 79 2e 20 49 66   P3 as a key. If
1a1b0 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72   cursor P1 refer
1a1c0 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20  s .** to an SQL 
1a1d0 69 6e 64 65 78 2c 20 74 68 65 6e 20 50 33 20 69  index, then P3 i
1a1e0 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  s the first in a
1a1f0 6e 20 61 72 72 61 79 20 6f 66 20 50 34 20 72 65  n array of P4 re
1a200 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74  gisters .** that
1a210 20 61 72 65 20 75 73 65 64 20 61 73 20 61 6e 20   are used as an 
1a220 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  unpacked index k
1a230 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73  ey. .**.** Repos
1a240 69 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20  ition cursor P1 
1a250 73 6f 20 74 68 61 74 20 20 69 74 20 70 6f 69 6e  so that  it poin
1a260 74 73 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73  ts to the larges
1a270 74 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a  t entry that .**
1a280 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
1a290 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20  e key value. If 
1a2a0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63  there are no rec
1a2b0 6f 72 64 73 20 6c 65 73 73 20 74 68 61 6e 20 0a  ords less than .
1a2c0 2a 2a 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50  ** the key and P
1a2d0 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  2 is not zero, t
1a2e0 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a  hen jump to P2..
1a2f0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1a300 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c  Found, NotFound,
1a310 20 44 69 73 74 69 6e 63 74 2c 20 53 65 65 6b 47   Distinct, SeekG
1a320 74 2c 20 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c  t, SeekGe, SeekL
1a330 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  e.*/./* Opcode: 
1a340 53 65 65 6b 4c 65 20 50 31 20 50 32 20 50 33 20  SeekLe P1 P2 P3 
1a350 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75  P4 *.**.** If cu
1a360 72 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 74  rsor P1 refers t
1a370 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28  o an SQL table (
1a380 42 2d 54 72 65 65 20 74 68 61 74 20 75 73 65 73  B-Tree that uses
1a390 20 69 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20   integer keys), 
1a3a0 0a 2a 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75  .** use the valu
1a3b0 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  e in register P3
1a3c0 20 61 73 20 61 20 6b 65 79 2e 20 49 66 20 63 75   as a key. If cu
1a3d0 72 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a  rsor P1 refers .
1a3e0 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64  ** to an SQL ind
1a3f0 65 78 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74  ex, then P3 is t
1a400 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
1a410 72 72 61 79 20 6f 66 20 50 34 20 72 65 67 69 73  rray of P4 regis
1a420 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72  ters .** that ar
1a430 65 20 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70  e used as an unp
1a440 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e  acked index key.
1a450 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69   .**.** Repositi
1a460 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20  on cursor P1 so 
1a470 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
1a480 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e  o the largest en
1a490 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20  try that .** is 
1a4a0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
1a4b0 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61  al to the key va
1a4c0 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72  lue. If there ar
1a4d0 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a 2a 2a  e no records .**
1a4e0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
1a4f0 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 61  ual to the key a
1a500 6e 64 20 50 32 20 69 73 20 6e 6f 74 20 7a 65 72  nd P2 is not zer
1a510 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  o, then jump to 
1a520 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  P2..**.** See al
1a530 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f  so: Found, NotFo
1a540 75 6e 64 2c 20 44 69 73 74 69 6e 63 74 2c 20 53  und, Distinct, S
1a550 65 65 6b 47 74 2c 20 53 65 65 6b 47 65 2c 20 53  eekGt, SeekGe, S
1a560 65 65 6b 4c 74 0a 2a 2f 0a 63 61 73 65 20 4f 50  eekLt.*/.case OP
1a570 5f 53 65 65 6b 4c 74 3a 20 20 20 20 20 20 20 20  _SeekLt:        
1a580 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f   /* jump, in3 */
1a590 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 4c 65 3a  .case OP_SeekLe:
1a5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
1a5b0 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
1a5c0 5f 53 65 65 6b 47 65 3a 20 20 20 20 20 20 20 20  _SeekGe:        
1a5d0 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f   /* jump, in3 */
1a5e0 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 47 74 3a  .case OP_SeekGt:
1a5f0 20 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70   {       /* jump
1a600 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 72  , in3 */.  int r
1a610 65 73 3b 0a 20 20 69 6e 74 20 6f 63 3b 0a 20 20  es;.  int oc;.  
1a620 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
1a630 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1a640 20 72 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   r;.  int nField
1a650 3b 0a 20 20 69 36 34 20 69 4b 65 79 3b 20 20 20  ;.  i64 iKey;   
1a660 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20     /* The rowid 
1a670 77 65 20 61 72 65 20 74 6f 20 73 65 65 6b 20 74  we are to seek t
1a680 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
1a690 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
1a6a0 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
1a6b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
1a6c0 70 2d 3e 70 32 21 3d 30 20 29 3b 0a 20 20 70 43  p->p2!=0 );.  pC
1a6d0 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
1a6e0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
1a6f0 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pC!=0 );.  asser
1a700 74 28 20 70 43 2d 3e 70 73 65 75 64 6f 54 61 62  t( pC->pseudoTab
1a710 6c 65 52 65 67 3d 3d 30 20 29 3b 0a 20 20 61 73  leReg==0 );.  as
1a720 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 4c 65 20  sert( OP_SeekLe 
1a730 3d 3d 20 4f 50 5f 53 65 65 6b 4c 74 2b 31 20 29  == OP_SeekLt+1 )
1a740 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53  ;.  assert( OP_S
1a750 65 65 6b 47 65 20 3d 3d 20 4f 50 5f 53 65 65 6b  eekGe == OP_Seek
1a760 4c 74 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74  Lt+2 );.  assert
1a770 28 20 4f 50 5f 53 65 65 6b 47 74 20 3d 3d 20 4f  ( OP_SeekGt == O
1a780 50 5f 53 65 65 6b 4c 74 2b 33 20 29 3b 0a 20 20  P_SeekLt+3 );.  
1a790 69 66 28 20 70 43 2d 3e 70 43 75 72 73 6f 72 21  if( pC->pCursor!
1a7a0 3d 30 20 29 7b 0a 20 20 20 20 6f 63 20 3d 20 70  =0 ){.    oc = p
1a7b0 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  Op->opcode;.    
1a7c0 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b  pC->nullRow = 0;
1a7d0 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 69 73 54  .    if( pC->isT
1a7e0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  able ){.      /*
1a7f0 20 54 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65   The input value
1a800 20 69 6e 20 50 33 20 6d 69 67 68 74 20 62 65 20   in P3 might be 
1a810 6f 66 20 61 6e 79 20 74 79 70 65 3a 20 69 6e 74  of any type: int
1a820 65 67 65 72 2c 20 72 65 61 6c 2c 20 73 74 72 69  eger, real, stri
1a830 6e 67 2c 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  ng,.      ** blo
1a840 62 2c 20 6f 72 20 4e 55 4c 4c 2e 20 20 42 75 74  b, or NULL.  But
1a850 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
1a860 61 6e 20 69 6e 74 65 67 65 72 20 62 65 66 6f 72  an integer befor
1a870 65 20 77 65 20 63 61 6e 20 64 6f 0a 20 20 20 20  e we can do.    
1a880 20 20 2a 2a 20 74 68 65 20 73 65 65 6b 2c 20 73    ** the seek, s
1a890 6f 20 63 6f 76 65 72 74 20 69 74 2e 20 2a 2f 0a  o covert it. */.
1a8a0 20 20 20 20 20 20 70 49 6e 33 20 3d 20 26 61 4d        pIn3 = &aM
1a8b0 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20  em[pOp->p3];.   
1a8c0 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41     applyNumericA
1a8d0 66 66 69 6e 69 74 79 28 70 49 6e 33 29 3b 0a 20  ffinity(pIn3);. 
1a8e0 20 20 20 20 20 69 4b 65 79 20 3d 20 73 71 6c 69       iKey = sqli
1a8f0 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28  te3VdbeIntValue(
1a900 70 49 6e 33 29 3b 0a 20 20 20 20 20 20 70 43 2d  pIn3);.      pC-
1a910 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20  >rowidIsValid = 
1a920 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  0;..      /* If 
1a930 74 68 65 20 50 33 20 76 61 6c 75 65 20 63 6f 75  the P3 value cou
1a940 6c 64 20 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72  ld not be conver
1a950 74 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65  ted into an inte
1a960 67 65 72 20 77 69 74 68 6f 75 74 0a 20 20 20 20  ger without.    
1a970 20 20 2a 2a 20 6c 6f 73 73 20 6f 66 20 69 6e 66    ** loss of inf
1a980 6f 72 6d 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73  ormation, then s
1a990 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  pecial processin
1a9a0 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 2e 2e  g is required...
1a9b0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70   */.      if( (p
1a9c0 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
1a9d0 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Int)==0 ){.    
1a9e0 20 20 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66      if( (pIn3->f
1a9f0 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 29  lags & MEM_Real)
1aa00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1aa10 20 2f 2a 20 49 66 20 74 68 65 20 50 33 20 76 61   /* If the P3 va
1aa20 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  lue cannot be co
1aa30 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 79  nverted into any
1aa40 20 6b 69 6e 64 20 6f 66 20 61 20 6e 75 6d 62 65   kind of a numbe
1aa50 72 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  r,.          ** 
1aa60 74 68 65 6e 20 74 68 65 20 73 65 65 6b 20 69 73  then the seek is
1aa70 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20 73   not possible, s
1aa80 6f 20 6a 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a  o jump to P2 */.
1aa90 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 70            pc = p
1aaa0 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20  Op->p2 - 1;.    
1aab0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1aac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
1aad0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
1aae0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74  is point, then t
1aaf0 68 65 20 50 33 20 76 61 6c 75 65 20 6d 75 73 74  he P3 value must
1ab00 20 62 65 20 61 20 66 6c 6f 61 74 69 6e 67 0a 20   be a floating. 
1ab10 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 20         ** point 
1ab20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20  number. */.     
1ab30 20 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 33     assert( (pIn3
1ab40 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
1ab50 61 6c 29 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20  al)!=0 );..     
1ab60 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 53 4d 41     if( iKey==SMA
1ab70 4c 4c 45 53 54 5f 49 4e 54 36 34 20 26 26 20 28  LLEST_INT64 && (
1ab80 70 49 6e 33 2d 3e 72 3c 28 64 6f 75 62 6c 65 29  pIn3->r<(double)
1ab90 69 4b 65 79 20 7c 7c 20 70 49 6e 33 2d 3e 72 3e  iKey || pIn3->r>
1aba0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
1abb0 2f 2a 20 54 68 65 20 50 33 20 76 61 6c 75 65 20  /* The P3 value 
1abc0 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 69 6e 20  is too large in 
1abd0 6d 61 67 6e 69 74 75 64 65 20 74 6f 20 62 65 20  magnitude to be 
1abe0 65 78 70 72 65 73 73 65 64 20 61 73 20 61 6e 0a  expressed as an.
1abf0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74            ** int
1ac00 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  eger. */.       
1ac10 20 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 20 20     res = 1;.    
1ac20 20 20 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e        if( pIn3->
1ac30 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
1ac40 20 20 20 69 66 28 20 6f 63 3e 3d 4f 50 5f 53 65     if( oc>=OP_Se
1ac50 65 6b 47 65 20 29 7b 20 20 61 73 73 65 72 74 28  ekGe ){  assert(
1ac60 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 7c   oc==OP_SeekGe |
1ac70 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 74 20  | oc==OP_SeekGt 
1ac80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1ac90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1aca0 65 65 46 69 72 73 74 28 70 43 2d 3e 70 43 75 72  eeFirst(pC->pCur
1acb0 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  sor, &res);.    
1acc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1acd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1ace0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1acf0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  error;.         
1ad00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1ad10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1ad20 20 20 69 66 28 20 6f 63 3c 3d 4f 50 5f 53 65 65    if( oc<=OP_See
1ad30 6b 4c 65 20 29 7b 20 20 61 73 73 65 72 74 28 20  kLe ){  assert( 
1ad40 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 7c 7c  oc==OP_SeekLt ||
1ad50 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29   oc==OP_SeekLe )
1ad60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1ad70 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1ad80 65 4c 61 73 74 28 70 43 2d 3e 70 43 75 72 73 6f  eLast(pC->pCurso
1ad90 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20  r, &res);.      
1ada0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1adb0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1adc0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
1add0 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ror;.           
1ade0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1adf0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73           if( res
1ae00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ae10 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
1ae20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1ae30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1ae40 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1ae50 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 7c   oc==OP_SeekLt |
1ae60 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 65 20  | oc==OP_SeekGe 
1ae70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1ae80 55 73 65 20 74 68 65 20 63 65 69 6c 69 6e 67 28  Use the ceiling(
1ae90 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 6f  ) function to co
1aea0 6e 76 65 72 74 20 72 65 61 6c 2d 3e 69 6e 74 20  nvert real->int 
1aeb0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1aec0 20 70 49 6e 33 2d 3e 72 20 3e 20 28 64 6f 75 62   pIn3->r > (doub
1aed0 6c 65 29 69 4b 65 79 20 29 20 69 4b 65 79 2b 2b  le)iKey ) iKey++
1aee0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1aef0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  .          /* Us
1af00 65 20 74 68 65 20 66 6c 6f 6f 72 28 29 20 66 75  e the floor() fu
1af10 6e 63 74 69 6f 6e 20 74 6f 20 63 6f 6e 76 65 72  nction to conver
1af20 74 20 72 65 61 6c 2d 3e 69 6e 74 20 2a 2f 0a 20  t real->int */. 
1af30 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1af40 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 7c   oc==OP_SeekLe |
1af50 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 74 20  | oc==OP_SeekGt 
1af60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1af70 20 70 49 6e 33 2d 3e 72 20 3c 20 28 64 6f 75 62   pIn3->r < (doub
1af80 6c 65 29 69 4b 65 79 20 29 20 69 4b 65 79 2d 2d  le)iKey ) iKey--
1af90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1afa0 20 20 7d 20 0a 20 20 20 20 20 20 72 63 20 3d 20    } .      rc = 
1afb0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1afc0 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 70  toUnpacked(pC->p
1afd0 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 36 34 29  Cursor, 0, (u64)
1afe0 69 4b 65 79 2c 20 30 2c 20 26 72 65 73 29 3b 0a  iKey, 0, &res);.
1aff0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b000 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b010 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
1b020 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
1b030 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65    }.      if( re
1b040 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
1b050 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64  pC->rowidIsValid
1b060 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
1b070 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 69 4b  ->lastRowid = iK
1b080 65 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ey;.      }.    
1b090 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 46 69  }else{.      nFi
1b0a0 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b  eld = pOp->p4.i;
1b0b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b0c0 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49  Op->p4type==P4_I
1b0d0 4e 54 33 32 20 29 3b 0a 20 20 20 20 20 20 61 73  NT32 );.      as
1b0e0 73 65 72 74 28 20 6e 46 69 65 6c 64 3e 30 20 29  sert( nField>0 )
1b0f0 3b 0a 20 20 20 20 20 20 72 2e 70 4b 65 79 49 6e  ;.      r.pKeyIn
1b100 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66  fo = pC->pKeyInf
1b110 6f 3b 0a 20 20 20 20 20 20 72 2e 6e 46 69 65 6c  o;.      r.nFiel
1b120 64 20 3d 20 28 75 31 36 29 6e 46 69 65 6c 64 3b  d = (u16)nField;
1b130 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  ..      /* The n
1b140 65 78 74 20 6c 69 6e 65 20 6f 66 20 63 6f 64 65  ext line of code
1b150 20 63 6f 6d 70 75 74 65 73 20 61 73 20 66 6f 6c   computes as fol
1b160 6c 6f 77 73 2c 20 6f 6e 6c 79 20 66 61 73 74 65  lows, only faste
1b170 72 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20 69 66  r:.      **   if
1b180 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 74 20  ( oc==OP_SeekGt 
1b190 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65  || oc==OP_SeekLe
1b1a0 20 29 7b 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   ){.      **    
1b1b0 20 72 2e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43   r.flags = UNPAC
1b1c0 4b 45 44 5f 49 4e 43 52 4b 45 59 3b 0a 20 20 20  KED_INCRKEY;.   
1b1d0 20 20 20 2a 2a 20 20 20 7d 65 6c 73 65 7b 0a 20     **   }else{. 
1b1e0 20 20 20 20 20 2a 2a 20 20 20 20 20 72 2e 66 6c       **     r.fl
1b1f0 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a  ags = 0;.      *
1b200 2a 20 20 20 7d 0a 20 20 20 20 20 20 2a 2f 0a 20  *   }.      */. 
1b210 20 20 20 20 20 72 2e 66 6c 61 67 73 20 3d 20 28       r.flags = (
1b220 75 31 36 29 28 55 4e 50 41 43 4b 45 44 5f 49 4e  u16)(UNPACKED_IN
1b230 43 52 4b 45 59 20 2a 20 28 31 20 26 20 28 6f 63  CRKEY * (1 & (oc
1b240 20 2d 20 4f 50 5f 53 65 65 6b 4c 74 29 29 29 3b   - OP_SeekLt)));
1b250 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
1b260 63 21 3d 4f 50 5f 53 65 65 6b 47 74 20 7c 7c 20  c!=OP_SeekGt || 
1b270 72 2e 66 6c 61 67 73 3d 3d 55 4e 50 41 43 4b 45  r.flags==UNPACKE
1b280 44 5f 49 4e 43 52 4b 45 59 20 29 3b 0a 20 20 20  D_INCRKEY );.   
1b290 20 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f     assert( oc!=O
1b2a0 50 5f 53 65 65 6b 4c 65 20 7c 7c 20 72 2e 66 6c  P_SeekLe || r.fl
1b2b0 61 67 73 3d 3d 55 4e 50 41 43 4b 45 44 5f 49 4e  ags==UNPACKED_IN
1b2c0 43 52 4b 45 59 20 29 3b 0a 20 20 20 20 20 20 61  CRKEY );.      a
1b2d0 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65  ssert( oc!=OP_Se
1b2e0 65 6b 47 65 20 7c 7c 20 72 2e 66 6c 61 67 73 3d  ekGe || r.flags=
1b2f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
1b300 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 4c  rt( oc!=OP_SeekL
1b310 74 20 7c 7c 20 72 2e 66 6c 61 67 73 3d 3d 30 20  t || r.flags==0 
1b320 29 3b 0a 0a 20 20 20 20 20 20 72 2e 61 4d 65 6d  );..      r.aMem
1b330 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
1b340 5d 3b 0a 20 20 20 20 20 20 45 78 70 61 6e 64 42  ];.      ExpandB
1b350 6c 6f 62 28 72 2e 61 4d 65 6d 29 3b 0a 20 20 20  lob(r.aMem);.   
1b360 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1b370 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
1b380 65 64 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ed(pC->pCursor, 
1b390 26 72 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b  &r, 0, 0, &res);
1b3a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1b3b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b3c0 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
1b3d0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
1b3e0 20 20 20 7d 0a 20 20 20 20 20 20 70 43 2d 3e 72     }.      pC->r
1b3f0 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b  owidIsValid = 0;
1b400 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e 64  .    }.    pC->d
1b410 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
1b420 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65  0;.    pC->cache
1b430 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
1b440 54 41 4c 45 3b 0a 23 69 66 64 65 66 20 53 51 4c  TALE;.#ifdef SQL
1b450 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c  ITE_TEST.    sql
1b460 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
1b470 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  t++;.#endif.    
1b480 69 66 28 20 6f 63 3e 3d 4f 50 5f 53 65 65 6b 47  if( oc>=OP_SeekG
1b490 65 20 29 7b 20 20 61 73 73 65 72 74 28 20 6f 63  e ){  assert( oc
1b4a0 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 7c 7c 20 6f  ==OP_SeekGe || o
1b4b0 63 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a  c==OP_SeekGt );.
1b4c0 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20        if( res<0 
1b4d0 7c 7c 20 28 72 65 73 3d 3d 30 20 26 26 20 6f 63  || (res==0 && oc
1b4e0 3d 3d 4f 50 5f 53 65 65 6b 47 74 29 20 29 7b 0a  ==OP_SeekGt) ){.
1b4f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1b500 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
1b510 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29  ->pCursor, &res)
1b520 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1b530 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1b540 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1b550 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  error;.        p
1b560 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  C->rowidIsValid 
1b570 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
1b580 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
1b590 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1b5a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1b5b0 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c  rt( oc==OP_SeekL
1b5c0 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  t || oc==OP_Seek
1b5d0 4c 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Le );.      if( 
1b5e0 72 65 73 3e 30 20 7c 7c 20 28 72 65 73 3d 3d 30  res>0 || (res==0
1b5f0 20 26 26 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c   && oc==OP_SeekL
1b600 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
1b610 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
1b620 72 65 76 69 6f 75 73 28 70 43 2d 3e 70 43 75 72  revious(pC->pCur
1b630 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  sor, &res);.    
1b640 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b650 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f  TE_OK ) goto abo
1b660 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
1b670 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 72 6f 77  .        pC->row
1b680 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20  idIsValid = 0;. 
1b690 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b6a0 20 20 20 20 2f 2a 20 72 65 73 20 6d 69 67 68 74      /* res might
1b6b0 20 62 65 20 6e 65 67 61 74 69 76 65 20 62 65 63   be negative bec
1b6c0 61 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 69  ause the table i
1b6d0 73 20 65 6d 70 74 79 2e 20 20 43 68 65 63 6b 20  s empty.  Check 
1b6e0 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  to.        ** se
1b6f0 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  e if this is the
1b700 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 2a   case..        *
1b710 2f 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  /.        res = 
1b720 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
1b730 70 43 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20  pC->pCursor);.  
1b740 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b750 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e  assert( pOp->p2>
1b760 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  0 );.    if( res
1b770 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70   ){.      pc = p
1b780 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20  Op->p2 - 1;.    
1b790 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
1b7a0 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77  * This happens w
1b7b0 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74  hen attempting t
1b7c0 6f 20 6f 70 65 6e 20 74 68 65 20 73 71 6c 69 74  o open the sqlit
1b7d0 65 33 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 0a  e3_master table.
1b7e0 20 20 20 20 2a 2a 20 66 6f 72 20 72 65 61 64 20      ** for read 
1b7f0 61 63 63 65 73 73 20 72 65 74 75 72 6e 73 20 53  access returns S
1b800 51 4c 49 54 45 5f 45 4d 50 54 59 2e 20 49 6e 20  QLITE_EMPTY. In 
1b810 74 68 69 73 20 63 61 73 65 20 61 6c 77 61 79 73  this case always
1b820 0a 20 20 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  .    ** take the
1b830 20 6a 75 6d 70 20 28 73 69 6e 63 65 20 74 68 65   jump (since the
1b840 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64  re are no record
1b850 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 29 2e  s in the table).
1b860 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 63 20 3d  .    */.    pc =
1b870 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
1b880 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
1b890 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 20 50 31   Opcode: Seek P1
1b8a0 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
1b8b0 50 31 20 69 73 20 61 6e 20 6f 70 65 6e 20 74 61  P1 is an open ta
1b8c0 62 6c 65 20 63 75 72 73 6f 72 20 61 6e 64 20 50  ble cursor and P
1b8d0 32 20 69 73 20 61 20 72 6f 77 69 64 20 69 6e 74  2 is a rowid int
1b8e0 65 67 65 72 2e 20 20 41 72 72 61 6e 67 65 0a 2a  eger.  Arrange.*
1b8f0 2a 20 66 6f 72 20 50 31 20 74 6f 20 6d 6f 76 65  * for P1 to move
1b900 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
1b910 74 73 20 74 6f 20 74 68 65 20 72 6f 77 69 64 20  ts to the rowid 
1b920 67 69 76 65 6e 20 62 79 20 50 32 2e 0a 2a 2a 0a  given by P2..**.
1b930 2a 2a 20 54 68 69 73 20 69 73 20 61 63 74 75 61  ** This is actua
1b940 6c 6c 79 20 61 20 64 65 66 65 72 72 65 64 20 73  lly a deferred s
1b950 65 65 6b 2e 20 20 4e 6f 74 68 69 6e 67 20 61 63  eek.  Nothing ac
1b960 74 75 61 6c 6c 79 20 68 61 70 70 65 6e 73 20 75  tually happens u
1b970 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 63 75 72 73  ntil.** the curs
1b980 6f 72 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  or is used to re
1b990 61 64 20 61 20 72 65 63 6f 72 64 2e 20 20 54 68  ad a record.  Th
1b9a0 61 74 20 77 61 79 2c 20 69 66 20 6e 6f 20 72 65  at way, if no re
1b9b0 61 64 73 0a 2a 2a 20 6f 63 63 75 72 2c 20 6e 6f  ads.** occur, no
1b9c0 20 75 6e 6e 65 63 65 73 73 61 72 79 20 49 2f 4f   unnecessary I/O
1b9d0 20 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 63 61 73   happens..*/.cas
1b9e0 65 20 4f 50 5f 53 65 65 6b 3a 20 7b 20 20 20 20  e OP_Seek: {    
1b9f0 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56 64 62 65  /* in2 */.  Vdbe
1ba00 43 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 61  Cursor *pC;..  a
1ba10 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
1ba20 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
1ba30 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
1ba40 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
1ba50 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
1ba60 43 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c  C!=0 );.  if( AL
1ba70 57 41 59 53 28 70 43 2d 3e 70 43 75 72 73 6f 72  WAYS(pC->pCursor
1ba80 21 3d 30 29 20 29 7b 0a 20 20 20 20 61 73 73 65  !=0) ){.    asse
1ba90 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20  rt( pC->isTable 
1baa0 29 3b 0a 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52  );.    pC->nullR
1bab0 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e 32  ow = 0;.    pIn2
1bac0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
1bad0 5d 3b 0a 20 20 20 20 70 43 2d 3e 6d 6f 76 65 74  ];.    pC->movet
1bae0 6f 54 61 72 67 65 74 20 3d 20 73 71 6c 69 74 65  oTarget = sqlite
1baf0 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49  3VdbeIntValue(pI
1bb00 6e 32 29 3b 0a 20 20 20 20 70 43 2d 3e 72 6f 77  n2);.    pC->row
1bb10 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20  idIsValid = 0;. 
1bb20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d     pC->deferredM
1bb30 6f 76 65 74 6f 20 3d 20 31 3b 0a 20 20 7d 0a 20  oveto = 1;.  }. 
1bb40 20 62 72 65 61 6b 3b 0a 7d 0a 20 20 0a 0a 2f 2a   break;.}.  ../*
1bb50 20 4f 70 63 6f 64 65 3a 20 46 6f 75 6e 64 20 50   Opcode: Found P
1bb60 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a  1 P2 P3 P4 *.**.
1bb70 2a 2a 20 49 66 20 50 34 3d 3d 30 20 74 68 65 6e  ** If P4==0 then
1bb80 20 72 65 67 69 73 74 65 72 20 50 33 20 68 6f 6c   register P3 hol
1bb90 64 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72  ds a blob constr
1bba0 75 63 74 65 64 20 62 79 20 4d 61 6b 65 52 65 63  ucted by MakeRec
1bbb0 6f 72 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30  ord.  If.** P4>0
1bbc0 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 50   then register P
1bbd0 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  3 is the first o
1bbe0 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20 74  f P4 registers t
1bbf0 68 61 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61  hat form an unpa
1bc00 63 6b 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a  cked.** record..
1bc10 2a 2a 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20  **.** Cursor P1 
1bc20 69 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62  is on an index b
1bc30 74 72 65 65 2e 20 20 49 66 20 74 68 65 20 72 65  tree.  If the re
1bc40 63 6f 72 64 20 69 64 65 6e 74 69 66 69 65 64 20  cord identified 
1bc50 62 79 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20  by P3 and P4.** 
1bc60 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 61  is a prefix of a
1bc70 6e 79 20 65 6e 74 72 79 20 69 6e 20 50 31 20 74  ny entry in P1 t
1bc80 68 65 6e 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hen a jump is ma
1bc90 64 65 20 74 6f 20 50 32 20 61 6e 64 0a 2a 2a 20  de to P2 and.** 
1bca0 50 31 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  P1 is left point
1bcb0 69 6e 67 20 61 74 20 74 68 65 20 6d 61 74 63 68  ing at the match
1bcc0 69 6e 67 20 65 6e 74 72 79 2e 0a 2a 2f 0a 2f 2a  ing entry..*/./*
1bcd0 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 46 6f 75 6e   Opcode: NotFoun
1bce0 64 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  d P1 P2 P3 P4 *.
1bcf0 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d 3d 30 20 74  **.** If P4==0 t
1bd00 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33 20  hen register P3 
1bd10 68 6f 6c 64 73 20 61 20 62 6c 6f 62 20 63 6f 6e  holds a blob con
1bd20 73 74 72 75 63 74 65 64 20 62 79 20 4d 61 6b 65  structed by Make
1bd30 52 65 63 6f 72 64 2e 20 20 49 66 0a 2a 2a 20 50  Record.  If.** P
1bd40 34 3e 30 20 74 68 65 6e 20 72 65 67 69 73 74 65  4>0 then registe
1bd50 72 20 50 33 20 69 73 20 74 68 65 20 66 69 72 73  r P3 is the firs
1bd60 74 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72  t of P4 register
1bd70 73 20 74 68 61 74 20 66 6f 72 6d 20 61 6e 20 75  s that form an u
1bd80 6e 70 61 63 6b 65 64 0a 2a 2a 20 72 65 63 6f 72  npacked.** recor
1bd90 64 2e 0a 2a 2a 20 0a 2a 2a 20 43 75 72 73 6f 72  d..** .** Cursor
1bda0 20 50 31 20 69 73 20 6f 6e 20 61 6e 20 69 6e 64   P1 is on an ind
1bdb0 65 78 20 62 74 72 65 65 2e 20 20 49 66 20 74 68  ex btree.  If th
1bdc0 65 20 72 65 63 6f 72 64 20 69 64 65 6e 74 69 66  e record identif
1bdd0 69 65 64 20 62 79 20 50 33 20 61 6e 64 20 50 34  ied by P3 and P4
1bde0 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 70  .** is not the p
1bdf0 72 65 66 69 78 20 6f 66 20 61 6e 79 20 65 6e 74  refix of any ent
1be00 72 79 20 69 6e 20 50 31 20 74 68 65 6e 20 61 20  ry in P1 then a 
1be10 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f 20  jump is made to 
1be20 50 32 2e 20 20 49 66 20 50 31 20 0a 2a 2a 20 64  P2.  If P1 .** d
1be30 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 6e 20 65  oes contain an e
1be40 6e 74 72 79 20 77 68 6f 73 65 20 70 72 65 66 69  ntry whose prefi
1be50 78 20 6d 61 74 63 68 65 73 20 74 68 65 20 50 33  x matches the P3
1be60 2f 50 34 20 72 65 63 6f 72 64 20 74 68 65 6e 20  /P4 record then 
1be70 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 66 61 6c 6c 73  control.** falls
1be80 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
1be90 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
1bea0 20 61 6e 64 20 50 31 20 69 73 20 6c 65 66 74 20   and P1 is left 
1beb0 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 0a  pointing at the.
1bec0 2a 2a 20 6d 61 74 63 68 69 6e 67 20 65 6e 74 72  ** matching entr
1bed0 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  y..**.** See als
1bee0 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 45 78 69  o: Found, NotExi
1bef0 73 74 73 2c 20 49 73 55 6e 69 71 75 65 0a 2a 2f  sts, IsUnique.*/
1bf00 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e  .case OP_NotFoun
1bf10 64 3a 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  d:       /* jump
1bf20 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
1bf30 5f 46 6f 75 6e 64 3a 20 7b 20 20 20 20 20 20 20  _Found: {       
1bf40 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f   /* jump, in3 */
1bf50 0a 20 20 69 6e 74 20 61 6c 72 65 61 64 79 45 78  .  int alreadyEx
1bf60 69 73 74 73 3b 0a 20 20 56 64 62 65 43 75 72 73  ists;.  VdbeCurs
1bf70 6f 72 20 2a 70 43 3b 0a 20 20 69 6e 74 20 72 65  or *pC;.  int re
1bf80 73 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  s;.  UnpackedRec
1bf90 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 0a 20 20  ord *pIdxKey;.  
1bfa0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72  UnpackedRecord r
1bfb0 3b 0a 20 20 63 68 61 72 20 61 54 65 6d 70 52 65  ;.  char aTempRe
1bfc0 63 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  c[ROUND8(sizeof(
1bfd0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
1bfe0 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 33   + sizeof(Mem)*3
1bff0 20 2b 20 37 5d 3b 0a 0a 23 69 66 64 65 66 20 53   + 7];..#ifdef S
1c000 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
1c010 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74  ite3_found_count
1c020 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 6c  ++;.#endif..  al
1c030 72 65 61 64 79 45 78 69 73 74 73 20 3d 20 30 3b  readyExists = 0;
1c040 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1c050 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
1c060 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
1c070 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
1c080 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29  type==P4_INT32 )
1c090 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
1c0a0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
1c0b0 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
1c0c0 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn3 = &aMem[pO
1c0d0 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 41 4c  p->p3];.  if( AL
1c0e0 57 41 59 53 28 70 43 2d 3e 70 43 75 72 73 6f 72  WAYS(pC->pCursor
1c0f0 21 3d 30 29 20 29 7b 0a 0a 20 20 20 20 61 73 73  !=0) ){..    ass
1c100 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65  ert( pC->isTable
1c110 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
1c120 4f 70 2d 3e 70 34 2e 69 3e 30 20 29 7b 0a 20 20  Op->p4.i>0 ){.  
1c130 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d      r.pKeyInfo =
1c140 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20   pC->pKeyInfo;. 
1c150 20 20 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20       r.nField = 
1c160 28 75 31 36 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a  (u16)pOp->p4.i;.
1c170 20 20 20 20 20 20 72 2e 61 4d 65 6d 20 3d 20 70        r.aMem = p
1c180 49 6e 33 3b 0a 20 20 20 20 20 20 72 2e 66 6c 61  In3;.      r.fla
1c190 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs = UNPACKED_PR
1c1a0 45 46 49 58 5f 4d 41 54 43 48 3b 0a 20 20 20 20  EFIX_MATCH;.    
1c1b0 20 20 70 49 64 78 4b 65 79 20 3d 20 26 72 3b 0a    pIdxKey = &r;.
1c1c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c1d0 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66   assert( pIn3->f
1c1e0 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
1c1f0 29 3b 0a 20 20 20 20 20 20 45 78 70 61 6e 64 42  );.      ExpandB
1c200 6c 6f 62 28 70 49 6e 33 29 3b 0a 20 20 20 20 20  lob(pIn3);.     
1c210 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74   pIdxKey = sqlit
1c220 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
1c230 63 6b 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c  ck(pC->pKeyInfo,
1c240 20 70 49 6e 33 2d 3e 6e 2c 20 70 49 6e 33 2d 3e   pIn3->n, pIn3->
1c250 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  z,.             
1c260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c270 20 20 20 20 20 20 20 20 20 20 20 61 54 65 6d 70             aTemp
1c280 52 65 63 2c 20 73 69 7a 65 6f 66 28 61 54 65 6d  Rec, sizeof(aTem
1c290 70 52 65 63 29 29 3b 0a 20 20 20 20 20 20 69 66  pRec));.      if
1c2a0 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 7b 0a  ( pIdxKey==0 ){.
1c2b0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f          goto no_
1c2c0 6d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  mem;.      }.   
1c2d0 20 20 20 70 49 64 78 4b 65 79 2d 3e 66 6c 61 67     pIdxKey->flag
1c2e0 73 20 7c 3d 20 55 4e 50 41 43 4b 45 44 5f 50 52  s |= UNPACKED_PR
1c2f0 45 46 49 58 5f 4d 41 54 43 48 3b 0a 20 20 20 20  EFIX_MATCH;.    
1c300 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
1c310 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
1c320 61 63 6b 65 64 28 70 43 2d 3e 70 43 75 72 73 6f  acked(pC->pCurso
1c330 72 2c 20 70 49 64 78 4b 65 79 2c 20 30 2c 20 30  r, pIdxKey, 0, 0
1c340 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
1c350 20 70 4f 70 2d 3e 70 34 2e 69 3d 3d 30 20 29 7b   pOp->p4.i==0 ){
1c360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1c370 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64  beDeleteUnpacked
1c380 52 65 63 6f 72 64 28 70 49 64 78 4b 65 79 29 3b  Record(pIdxKey);
1c390 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1c3a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c3b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c3c0 20 7d 0a 20 20 20 20 61 6c 72 65 61 64 79 45 78   }.    alreadyEx
1c3d0 69 73 74 73 20 3d 20 28 72 65 73 3d 3d 30 29 3b  ists = (res==0);
1c3e0 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65  .    pC->deferre
1c3f0 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20  dMoveto = 0;.   
1c400 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
1c410 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
1c420 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f    }.  if( pOp->o
1c430 70 63 6f 64 65 3d 3d 4f 50 5f 46 6f 75 6e 64 20  pcode==OP_Found 
1c440 29 7b 0a 20 20 20 20 69 66 28 20 61 6c 72 65 61  ){.    if( alrea
1c450 64 79 45 78 69 73 74 73 20 29 20 70 63 20 3d 20  dyExists ) pc = 
1c460 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d  pOp->p2 - 1;.  }
1c470 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 21 61  else{.    if( !a
1c480 6c 72 65 61 64 79 45 78 69 73 74 73 20 29 20 70  lreadyExists ) p
1c490 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
1c4a0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
1c4b0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 73 55 6e  ./* Opcode: IsUn
1c4c0 69 71 75 65 20 50 31 20 50 32 20 50 33 20 50 34  ique P1 P2 P3 P4
1c4d0 20 2a 0a 2a 2a 0a 2a 2a 20 43 75 72 73 6f 72 20   *.**.** Cursor 
1c4e0 50 31 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 6e  P1 is open on an
1c4f0 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2d 20   index b-tree - 
1c500 74 68 61 74 20 69 73 20 74 6f 20 73 61 79 2c 20  that is to say, 
1c510 61 20 62 74 72 65 65 20 77 68 69 63 68 0a 2a 2a  a btree which.**
1c520 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 77 68 65   no data and whe
1c530 72 65 20 74 68 65 20 6b 65 79 20 61 72 65 20 72  re the key are r
1c540 65 63 6f 72 64 73 20 67 65 6e 65 72 61 74 65 64  ecords generated
1c550 20 62 79 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   by OP_MakeRecor
1c560 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6c 69  d with.** the li
1c570 73 74 20 66 69 65 6c 64 20 62 65 69 6e 67 20 74  st field being t
1c580 68 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44  he integer ROWID
1c590 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74 68   of the entry th
1c5a0 61 74 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  at the index.** 
1c5b0 65 6e 74 72 79 20 72 65 66 65 72 73 20 74 6f 2e  entry refers to.
1c5c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 33 20 72 65  .**.** The P3 re
1c5d0 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 73 20  gister contains 
1c5e0 61 6e 20 69 6e 74 65 67 65 72 20 72 65 63 6f 72  an integer recor
1c5f0 64 20 6e 75 6d 62 65 72 2e 20 43 61 6c 6c 20 74  d number. Call t
1c600 68 69 73 20 72 65 63 6f 72 64 20 0a 2a 2a 20 6e  his record .** n
1c610 75 6d 62 65 72 20 52 2e 20 52 65 67 69 73 74 65  umber R. Registe
1c620 72 20 50 34 20 69 73 20 74 68 65 20 66 69 72 73  r P4 is the firs
1c630 74 20 69 6e 20 61 20 73 65 74 20 6f 66 20 4e 20  t in a set of N 
1c640 63 6f 6e 74 69 67 75 6f 75 73 20 72 65 67 69 73  contiguous regis
1c650 74 65 72 73 0a 2a 2a 20 74 68 61 74 20 6d 61 6b  ters.** that mak
1c660 65 20 75 70 20 61 6e 20 75 6e 70 61 63 6b 65 64  e up an unpacked
1c670 20 69 6e 64 65 78 20 6b 65 79 20 74 68 61 74 20   index key that 
1c680 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
1c690 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 20 54   cursor P1..** T
1c6a0 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 20 63 61  he value of N ca
1c6b0 6e 20 62 65 20 69 6e 66 65 72 72 65 64 20 66 72  n be inferred fr
1c6c0 6f 6d 20 74 68 65 20 63 75 72 73 6f 72 2e 20 4e  om the cursor. N
1c6d0 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 72 6f   includes the ro
1c6e0 77 69 64 0a 2a 2a 20 76 61 6c 75 65 20 61 70 70  wid.** value app
1c6f0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64  ended to the end
1c700 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65   of the index re
1c710 63 6f 72 64 2e 20 54 68 69 73 20 72 6f 77 69 64  cord. This rowid
1c720 20 76 61 6c 75 65 20 6d 61 79 0a 2a 2a 20 6f 72   value may.** or
1c730 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20   may not be the 
1c740 73 61 6d 65 20 61 73 20 52 2e 0a 2a 2a 0a 2a 2a  same as R..**.**
1c750 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 4e   If any of the N
1c760 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e   registers begin
1c770 6e 69 6e 67 20 77 69 74 68 20 72 65 67 69 73 74  ning with regist
1c780 65 72 20 50 34 20 63 6f 6e 74 61 69 6e 73 20 61  er P4 contains a
1c790 20 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 75 65 2c 20   NULL.** value, 
1c7a0 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
1c7b0 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 4f 74   to P2..**.** Ot
1c7c0 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 69 6e  herwise, this in
1c7d0 73 74 72 75 63 74 69 6f 6e 20 63 68 65 63 6b 73  struction checks
1c7e0 20 69 66 20 63 75 72 73 6f 72 20 50 31 20 63 6f   if cursor P1 co
1c7f0 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74 72 79 0a  ntains an entry.
1c800 2a 2a 20 77 68 65 72 65 20 74 68 65 20 66 69 72  ** where the fir
1c810 73 74 20 28 4e 2d 31 29 20 66 69 65 6c 64 73 20  st (N-1) fields 
1c820 6d 61 74 63 68 20 62 75 74 20 74 68 65 20 72 6f  match but the ro
1c830 77 69 64 20 76 61 6c 75 65 20 61 74 20 74 68 65  wid value at the
1c840 20 65 6e 64 0a 2a 2a 20 6f 66 20 74 68 65 20 69   end.** of the i
1c850 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 6e 6f  ndex entry is no
1c860 74 20 52 2e 20 49 66 20 74 68 65 72 65 20 69 73  t R. If there is
1c870 20 6e 6f 20 73 75 63 68 20 65 6e 74 72 79 2c 20   no such entry, 
1c880 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 2a 2a  control jumps.**
1c890 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   to instruction 
1c8a0 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  P2. Otherwise, t
1c8b0 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
1c8c0 63 6f 6e 66 6c 69 63 74 69 6e 67 20 69 6e 64 65  conflicting inde
1c8d0 78 0a 2a 2a 20 65 6e 74 72 79 20 69 73 20 63 6f  x.** entry is co
1c8e0 70 69 65 64 20 74 6f 20 72 65 67 69 73 74 65 72  pied to register
1c8f0 20 50 33 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20   P3 and control 
1c900 66 61 6c 6c 73 20 74 68 72 6f 75 67 68 20 74 6f  falls through to
1c910 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 73   the next.** ins
1c920 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
1c930 53 65 65 20 61 6c 73 6f 3a 20 4e 6f 74 46 6f 75  See also: NotFou
1c940 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73 2c 20 46  nd, NotExists, F
1c950 6f 75 6e 64 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ound.*/.case OP_
1c960 49 73 55 6e 69 71 75 65 3a 20 7b 20 20 20 20 20  IsUnique: {     
1c970 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20     /* jump, in3 
1c980 2a 2f 0a 20 20 75 31 36 20 69 69 3b 0a 20 20 56  */.  u16 ii;.  V
1c990 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a  dbeCursor *pCx;.
1c9a0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
1c9b0 72 3b 0a 20 20 75 31 36 20 6e 46 69 65 6c 64 3b  r;.  u16 nField;
1c9c0 0a 20 20 4d 65 6d 20 2a 61 4d 78 3b 0a 20 20 55  .  Mem *aMx;.  U
1c9d0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72 3b  npackedRecord r;
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9f0 20 20 2f 2a 20 42 2d 54 72 65 65 20 69 6e 64 65    /* B-Tree inde
1ca00 78 20 73 65 61 72 63 68 20 6b 65 79 20 2a 2f 0a  x search key */.
1ca10 20 20 69 36 34 20 52 3b 20 20 20 20 20 20 20 20    i64 R;        
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca30 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 73 74       /* Rowid st
1ca40 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
1ca50 20 50 33 20 2a 2f 0a 0a 20 20 70 49 6e 33 20 3d   P3 */..  pIn3 =
1ca60 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
1ca70 0a 20 20 61 4d 78 20 3d 20 26 61 4d 65 6d 5b 70  .  aMx = &aMem[p
1ca80 4f 70 2d 3e 70 34 2e 69 5d 3b 0a 20 20 2f 2a 20  Op->p4.i];.  /* 
1ca90 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
1caa0 76 61 6c 75 65 73 20 6f 66 20 70 61 72 61 6d 65  values of parame
1cab0 74 65 72 73 20 50 31 20 61 6e 64 20 50 34 20 61  ters P1 and P4 a
1cac0 72 65 20 69 6e 20 72 61 6e 67 65 2e 20 2a 2f 0a  re in range. */.
1cad0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1cae0 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20  4type==P4_INT32 
1caf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
1cb00 2d 3e 70 34 2e 69 3e 30 20 26 26 20 70 4f 70 2d  ->p4.i>0 && pOp-
1cb10 3e 70 34 2e 69 3c 3d 70 2d 3e 6e 4d 65 6d 20 29  >p4.i<=p->nMem )
1cb20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1cb30 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
1cb40 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
1cb50 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 69  .  /* Find the i
1cb60 6e 64 65 78 20 63 75 72 73 6f 72 2e 20 2a 2f 0a  ndex cursor. */.
1cb70 20 20 70 43 78 20 3d 20 70 2d 3e 61 70 43 73 72    pCx = p->apCsr
1cb80 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
1cb90 65 72 74 28 20 70 43 78 2d 3e 64 65 66 65 72 72  ert( pCx->deferr
1cba0 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20  edMoveto==0 );. 
1cbb0 20 70 43 78 2d 3e 73 65 65 6b 52 65 73 75 6c 74   pCx->seekResult
1cbc0 20 3d 20 30 3b 0a 20 20 70 43 78 2d 3e 63 61 63   = 0;.  pCx->cac
1cbd0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
1cbe0 5f 53 54 41 4c 45 3b 0a 20 20 70 43 72 73 72 20  _STALE;.  pCrsr 
1cbf0 3d 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pCx->pCursor;.
1cc00 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  /* If any of 
1cc10 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 4e  the values are N
1cc20 55 4c 4c 2c 20 74 61 6b 65 20 74 68 65 20 6a 75  ULL, take the ju
1cc30 6d 70 2e 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20  mp. */.  nField 
1cc40 3d 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d  = pCx->pKeyInfo-
1cc50 3e 6e 46 69 65 6c 64 3b 0a 20 20 66 6f 72 28 69  >nField;.  for(i
1cc60 69 3d 30 3b 20 69 69 3c 6e 46 69 65 6c 64 3b 20  i=0; ii<nField; 
1cc70 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61  ii++){.    if( a
1cc80 4d 78 5b 69 69 5d 2e 66 6c 61 67 73 20 26 20 4d  Mx[ii].flags & M
1cc90 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  EM_Null ){.     
1cca0 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
1ccb0 31 3b 0a 20 20 20 20 20 20 70 43 72 73 72 20 3d  1;.      pCrsr =
1ccc0 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
1ccd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
1cce0 65 72 74 28 20 28 61 4d 78 5b 6e 46 69 65 6c 64  ert( (aMx[nField
1ccf0 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ].flags & MEM_Nu
1cd00 6c 6c 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ll)==0 );..  if(
1cd10 20 70 43 72 73 72 21 3d 30 20 29 7b 0a 20 20 20   pCrsr!=0 ){.   
1cd20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
1cd30 20 69 6e 64 65 78 20 73 65 61 72 63 68 20 6b 65   index search ke
1cd40 79 2e 20 2a 2f 0a 20 20 20 20 72 2e 70 4b 65 79  y. */.    r.pKey
1cd50 49 6e 66 6f 20 3d 20 70 43 78 2d 3e 70 4b 65 79  Info = pCx->pKey
1cd60 49 6e 66 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65  Info;.    r.nFie
1cd70 6c 64 20 3d 20 6e 46 69 65 6c 64 20 2b 20 31 3b  ld = nField + 1;
1cd80 0a 20 20 20 20 72 2e 66 6c 61 67 73 20 3d 20 55  .    r.flags = U
1cd90 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53  NPACKED_PREFIX_S
1cda0 45 41 52 43 48 3b 0a 20 20 20 20 72 2e 61 4d 65  EARCH;.    r.aMe
1cdb0 6d 20 3d 20 61 4d 78 3b 0a 0a 20 20 20 20 2f 2a  m = aMx;..    /*
1cdc0 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
1cdd0 75 65 20 6f 66 20 52 20 66 72 6f 6d 20 72 65 67  ue of R from reg
1cde0 69 73 74 65 72 20 50 33 2e 20 2a 2f 0a 20 20 20  ister P3. */.   
1cdf0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
1ce00 6e 74 65 67 65 72 69 66 79 28 70 49 6e 33 29 3b  ntegerify(pIn3);
1ce10 0a 20 20 20 20 52 20 3d 20 70 49 6e 33 2d 3e 75  .    R = pIn3->u
1ce20 2e 69 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72  .i;..    /* Sear
1ce30 63 68 20 74 68 65 20 42 2d 54 72 65 65 20 69 6e  ch the B-Tree in
1ce40 64 65 78 2e 20 49 66 20 6e 6f 20 63 6f 6e 66 6c  dex. If no confl
1ce50 69 63 74 69 6e 67 20 72 65 63 6f 72 64 20 69 73  icting record is
1ce60 20 66 6f 75 6e 64 2c 20 6a 75 6d 70 0a 20 20 20   found, jump.   
1ce70 20 2a 2a 20 74 6f 20 50 32 2e 20 4f 74 68 65 72   ** to P2. Other
1ce80 77 69 73 65 2c 20 63 6f 70 79 20 74 68 65 20 72  wise, copy the r
1ce90 6f 77 69 64 20 6f 66 20 74 68 65 20 63 6f 6e 66  owid of the conf
1cea0 6c 69 63 74 69 6e 67 20 72 65 63 6f 72 64 20 74  licting record t
1ceb0 6f 0a 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65  o.    ** registe
1cec0 72 20 50 33 20 61 6e 64 20 66 61 6c 6c 20 74 68  r P3 and fall th
1ced0 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
1cee0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  t instruction.  
1cef0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1cf00 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
1cf10 70 61 63 6b 65 64 28 70 43 72 73 72 2c 20 26 72  packed(pCrsr, &r
1cf20 2c 20 30 2c 20 30 2c 20 26 70 43 78 2d 3e 73 65  , 0, 0, &pCx->se
1cf30 65 6b 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 69  ekResult);.    i
1cf40 66 28 20 28 72 2e 66 6c 61 67 73 20 26 20 55 4e  f( (r.flags & UN
1cf50 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45  PACKED_PREFIX_SE
1cf60 41 52 43 48 29 20 7c 7c 20 72 2e 72 6f 77 69 64  ARCH) || r.rowid
1cf70 3d 3d 52 20 29 7b 0a 20 20 20 20 20 20 70 63 20  ==R ){.      pc 
1cf80 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
1cf90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cfa0 70 49 6e 33 2d 3e 75 2e 69 20 3d 20 72 2e 72 6f  pIn3->u.i = r.ro
1cfb0 77 69 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  wid;.    }.  }. 
1cfc0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
1cfd0 63 6f 64 65 3a 20 4e 6f 74 45 78 69 73 74 73 20  code: NotExists 
1cfe0 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
1cff0 2a 2a 20 55 73 65 20 74 68 65 20 63 6f 6e 74 65  ** Use the conte
1d000 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
1d010 33 20 61 73 20 61 20 69 6e 74 65 67 65 72 20 6b  3 as a integer k
1d020 65 79 2e 20 20 49 66 20 61 20 72 65 63 6f 72 64  ey.  If a record
1d030 20 0a 2a 2a 20 77 69 74 68 20 74 68 61 74 20 6b   .** with that k
1d040 65 79 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  ey does not exis
1d050 74 20 69 6e 20 74 61 62 6c 65 20 6f 66 20 50 31  t in table of P1
1d060 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50  , then jump to P
1d070 32 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  2. .** If the re
1d080 63 6f 72 64 20 64 6f 65 73 20 65 78 69 73 74 2c  cord does exist,
1d090 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 75 2e   then fall thru.
1d0a0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1d0b0 6c 65 66 74 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  left .** pointin
1d0c0 67 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20  g to the record 
1d0d0 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a 2a 2a  if it exists..**
1d0e0 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
1d0f0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
1d100 6f 70 65 72 61 74 69 6f 6e 20 61 6e 64 20 4e 6f  operation and No
1d110 74 46 6f 75 6e 64 20 69 73 20 74 68 61 74 20 74  tFound is that t
1d120 68 69 73 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  his.** operation
1d130 20 61 73 73 75 6d 65 73 20 74 68 65 20 6b 65 79   assumes the key
1d140 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 61   is an integer a
1d150 6e 64 20 74 68 61 74 20 50 31 20 69 73 20 61 20  nd that P1 is a 
1d160 74 61 62 6c 65 20 77 68 65 72 65 61 73 0a 2a 2a  table whereas.**
1d170 20 4e 6f 74 46 6f 75 6e 64 20 61 73 73 75 6d 65   NotFound assume
1d180 73 20 6b 65 79 20 69 73 20 61 20 62 6c 6f 62 20  s key is a blob 
1d190 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72 6f 6d  constructed from
1d1a0 20 4d 61 6b 65 52 65 63 6f 72 64 20 61 6e 64 0a   MakeRecord and.
1d1b0 2a 2a 20 50 31 20 69 73 20 61 6e 20 69 6e 64 65  ** P1 is an inde
1d1c0 78 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  x..**.** See als
1d1d0 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75  o: Found, NotFou
1d1e0 6e 64 2c 20 49 73 55 6e 69 71 75 65 0a 2a 2f 0a  nd, IsUnique.*/.
1d1f0 63 61 73 65 20 4f 50 5f 4e 6f 74 45 78 69 73 74  case OP_NotExist
1d200 73 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a  s: {        /* j
1d210 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 56 64  ump, in3 */.  Vd
1d220 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
1d230 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
1d240 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 36  .  int res;.  u6
1d250 34 20 69 4b 65 79 3b 0a 0a 20 20 70 49 6e 33 20  4 iKey;..  pIn3 
1d260 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
1d270 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 33  ;.  assert( pIn3
1d280 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
1d290 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1d2a0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
1d2b0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
1d2c0 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
1d2d0 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
1d2e0 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
1d2f0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73    assert( pC->is
1d300 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  Table );.  asser
1d310 74 28 20 70 43 2d 3e 70 73 65 75 64 6f 54 61 62  t( pC->pseudoTab
1d320 6c 65 52 65 67 3d 3d 30 20 29 3b 0a 20 20 70 43  leReg==0 );.  pC
1d330 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  rsr = pC->pCurso
1d340 72 3b 0a 20 20 69 66 28 20 70 43 72 73 72 21 3d  r;.  if( pCrsr!=
1d350 30 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 30  0 ){.    res = 0
1d360 3b 0a 20 20 20 20 69 4b 65 79 20 3d 20 70 49 6e  ;.    iKey = pIn
1d370 33 2d 3e 75 2e 69 3b 0a 20 20 20 20 72 63 20 3d  3->u.i;.    rc =
1d380 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1d390 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 72 73  etoUnpacked(pCrs
1d3a0 72 2c 20 30 2c 20 69 4b 65 79 2c 20 30 2c 20 26  r, 0, iKey, 0, &
1d3b0 72 65 73 29 3b 0a 20 20 20 20 70 43 2d 3e 6c 61  res);.    pC->la
1d3c0 73 74 52 6f 77 69 64 20 3d 20 70 49 6e 33 2d 3e  stRowid = pIn3->
1d3d0 75 2e 69 3b 0a 20 20 20 20 70 43 2d 3e 72 6f 77  u.i;.    pC->row
1d3e0 69 64 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d  idIsValid = res=
1d3f0 3d 30 20 3f 31 3a 30 3b 0a 20 20 20 20 70 43 2d  =0 ?1:0;.    pC-
1d400 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20  >nullRow = 0;.  
1d410 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
1d420 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
1d430 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65  .    pC->deferre
1d440 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20  dMoveto = 0;.   
1d450 20 69 66 28 20 72 65 73 21 3d 30 20 29 7b 0a 20   if( res!=0 ){. 
1d460 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70       pc = pOp->p
1d470 32 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  2 - 1;.      ass
1d480 65 72 74 28 20 70 43 2d 3e 72 6f 77 69 64 49 73  ert( pC->rowidIs
1d490 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20  Valid==0 );.    
1d4a0 7d 0a 20 20 20 20 70 43 2d 3e 73 65 65 6b 52 65  }.    pC->seekRe
1d4b0 73 75 6c 74 20 3d 20 72 65 73 3b 0a 20 20 7d 65  sult = res;.  }e
1d4c0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
1d4d0 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 6e   happens when an
1d4e0 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e   attempt to open
1d4f0 20 61 20 72 65 61 64 20 63 75 72 73 6f 72 20 6f   a read cursor o
1d500 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 71  n the .    ** sq
1d510 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
1d520 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
1d530 5f 45 4d 50 54 59 2e 0a 20 20 20 20 2a 2f 0a 20  _EMPTY..    */. 
1d540 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
1d550 2d 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  - 1;.    assert(
1d560 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69   pC->rowidIsVali
1d570 64 3d 3d 30 20 29 3b 0a 20 20 20 20 70 43 2d 3e  d==0 );.    pC->
1d580 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 30 3b 0a  seekResult = 0;.
1d590 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
1d5a0 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 71 75 65  /* Opcode: Seque
1d5b0 6e 63 65 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  nce P1 P2 * * *.
1d5c0 2a 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e  **.** Find the n
1d5d0 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 73 65  ext available se
1d5e0 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 66 6f  quence number fo
1d5f0 72 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 20  r cursor P1..** 
1d600 57 72 69 74 65 20 74 68 65 20 73 65 71 75 65 6e  Write the sequen
1d610 63 65 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 72  ce number into r
1d620 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 20 54  egister P2..** T
1d630 68 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62  he sequence numb
1d640 65 72 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  er on the cursor
1d650 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
1d660 61 66 74 65 72 20 74 68 69 73 0a 2a 2a 20 69 6e  after this.** in
1d670 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a  struction.  .*/.
1d680 63 61 73 65 20 4f 50 5f 53 65 71 75 65 6e 63 65  case OP_Sequence
1d690 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  : {           /*
1d6a0 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65   out2-prerelease
1d6b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f   */.  assert( pO
1d6c0 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
1d6d0 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
1d6e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
1d6f0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 21 3d 30  pCsr[pOp->p1]!=0
1d700 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20   );.  pOut->u.i 
1d710 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
1d720 70 31 5d 2d 3e 73 65 71 43 6f 75 6e 74 2b 2b 3b  p1]->seqCount++;
1d730 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a  .  break;.}.../*
1d740 20 4f 70 63 6f 64 65 3a 20 4e 65 77 52 6f 77 69   Opcode: NewRowi
1d750 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  d P1 P2 P3 * *.*
1d760 2a 0a 2a 2a 20 47 65 74 20 61 20 6e 65 77 20 69  *.** Get a new i
1d770 6e 74 65 67 65 72 20 72 65 63 6f 72 64 20 6e 75  nteger record nu
1d780 6d 62 65 72 20 28 61 2e 6b 2e 61 20 22 72 6f 77  mber (a.k.a "row
1d790 69 64 22 29 20 75 73 65 64 20 61 73 20 74 68 65  id") used as the
1d7a0 20 6b 65 79 20 74 6f 20 61 20 74 61 62 6c 65 2e   key to a table.
1d7b0 0a 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 6e  .** The record n
1d7c0 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 70 72 65  umber is not pre
1d7d0 76 69 6f 75 73 6c 79 20 75 73 65 64 20 61 73 20  viously used as 
1d7e0 61 20 6b 65 79 20 69 6e 20 74 68 65 20 64 61 74  a key in the dat
1d7f0 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 74  abase.** table t
1d800 68 61 74 20 63 75 72 73 6f 72 20 50 31 20 70 6f  hat cursor P1 po
1d810 69 6e 74 73 20 74 6f 2e 20 20 54 68 65 20 6e 65  ints to.  The ne
1d820 77 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  w record number 
1d830 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 77 72  is written.** wr
1d840 69 74 74 65 6e 20 74 6f 20 72 65 67 69 73 74 65  itten to registe
1d850 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  r P2..**.** If P
1d860 33 3e 30 20 74 68 65 6e 20 50 33 20 69 73 20 61  3>0 then P3 is a
1d870 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65   register in the
1d880 20 72 6f 6f 74 20 66 72 61 6d 65 20 6f 66 20 74   root frame of t
1d890 68 69 73 20 56 44 42 45 20 74 68 61 74 20 68 6f  his VDBE that ho
1d8a0 6c 64 73 20 0a 2a 2a 20 74 68 65 20 6c 61 72 67  lds .** the larg
1d8b0 65 73 74 20 70 72 65 76 69 6f 75 73 6c 79 20 67  est previously g
1d8c0 65 6e 65 72 61 74 65 64 20 72 65 63 6f 72 64 20  enerated record 
1d8d0 6e 75 6d 62 65 72 2e 20 4e 6f 20 6e 65 77 20 72  number. No new r
1d8e0 65 63 6f 72 64 20 6e 75 6d 62 65 72 73 20 61 72  ecord numbers ar
1d8f0 65 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 74 6f 20  e.** allowed to 
1d900 62 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 69  be less than thi
1d910 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 20 74 68  s value. When th
1d920 69 73 20 76 61 6c 75 65 20 72 65 61 63 68 65 73  is value reaches
1d930 20 69 74 73 20 6d 61 78 69 6d 75 6d 2c 20 0a 2a   its maximum, .*
1d940 2a 20 61 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  * a SQLITE_FULL 
1d950 65 72 72 6f 72 20 69 73 20 67 65 6e 65 72 61 74  error is generat
1d960 65 64 2e 20 54 68 65 20 50 33 20 72 65 67 69 73  ed. The P3 regis
1d970 74 65 72 20 69 73 20 75 70 64 61 74 65 64 20 77  ter is updated w
1d980 69 74 68 20 74 68 65 20 27 0a 2a 2a 20 67 65 6e  ith the '.** gen
1d990 65 72 61 74 65 64 20 72 65 63 6f 72 64 20 6e 75  erated record nu
1d9a0 6d 62 65 72 2e 20 54 68 69 73 20 50 33 20 6d 65  mber. This P3 me
1d9b0 63 68 61 6e 69 73 6d 20 69 73 20 75 73 65 64 20  chanism is used 
1d9c0 74 6f 20 68 65 6c 70 20 69 6d 70 6c 65 6d 65 6e  to help implemen
1d9d0 74 20 74 68 65 0a 2a 2a 20 41 55 54 4f 49 4e 43  t the.** AUTOINC
1d9e0 52 45 4d 45 4e 54 20 66 65 61 74 75 72 65 2e 0a  REMENT feature..
1d9f0 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 77 52 6f  */.case OP_NewRo
1da00 77 69 64 3a 20 7b 20 20 20 20 20 20 20 20 20 20  wid: {          
1da10 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65   /* out2-prerele
1da20 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 76 3b 20  ase */.  i64 v; 
1da30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da40 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 77 69 64  /* The new rowid
1da50 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
1da60 20 2a 70 43 3b 20 20 20 20 20 20 20 20 2f 2a 20   *pC;        /* 
1da70 43 75 72 73 6f 72 20 6f 66 20 74 61 62 6c 65 20  Cursor of table 
1da80 74 6f 20 67 65 74 20 74 68 65 20 6e 65 77 20 72  to get the new r
1da90 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  owid */.  int re
1daa0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1dab0 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 6e   /* Result of an
1dac0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
1dad0 74 28 29 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  t() */.  int cnt
1dae0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1daf0 2f 2a 20 43 6f 75 6e 74 65 72 20 74 6f 20 6c 69  /* Counter to li
1db00 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  mit the number o
1db10 66 20 73 65 61 72 63 68 65 73 20 2a 2f 0a 20 20  f searches */.  
1db20 4d 65 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20  Mem *pMem;      
1db30 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
1db40 65 72 20 68 6f 6c 64 69 6e 67 20 6c 61 72 67 65  er holding large
1db50 73 74 20 72 6f 77 69 64 20 66 6f 72 20 41 55 54  st rowid for AUT
1db60 4f 49 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 20 20  OINCREMENT */.  
1db70 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
1db80 65 3b 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 66  e;     /* Root f
1db90 72 61 6d 65 20 6f 66 20 56 44 42 45 20 2a 2f 0a  rame of VDBE */.
1dba0 0a 20 20 76 20 3d 20 30 3b 0a 20 20 72 65 73 20  .  v = 0;.  res 
1dbb0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
1dbc0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
1dbd0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
1dbe0 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
1dbf0 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
1dc00 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
1dc10 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 2d 3e    if( NEVER(pC->
1dc20 70 43 75 72 73 6f 72 3d 3d 30 29 20 29 7b 0a 20  pCursor==0) ){. 
1dc30 20 20 20 2f 2a 20 54 68 65 20 7a 65 72 6f 20 69     /* The zero i
1dc40 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61 62  nitialization ab
1dc50 6f 76 65 20 69 73 20 61 6c 6c 20 74 68 61 74 20  ove is all that 
1dc60 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 7d  is needed */.  }
1dc70 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
1dc80 20 6e 65 78 74 20 72 6f 77 69 64 20 6f 72 20 72   next rowid or r
1dc90 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 28 64 69  ecord number (di
1dca0 66 66 65 72 65 6e 74 20 74 65 72 6d 73 20 66 6f  fferent terms fo
1dcb0 72 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a  r the same.    *
1dcc0 2a 20 74 68 69 6e 67 29 20 69 73 20 6f 62 74 61  * thing) is obta
1dcd0 69 6e 65 64 20 69 6e 20 61 20 74 77 6f 2d 73 74  ined in a two-st
1dce0 65 70 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20  ep algorithm..  
1dcf0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73    **.    ** Firs
1dd00 74 20 77 65 20 61 74 74 65 6d 70 74 20 74 6f 20  t we attempt to 
1dd10 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74  find the largest
1dd20 20 65 78 69 73 74 69 6e 67 20 72 6f 77 69 64 20   existing rowid 
1dd30 61 6e 64 20 61 64 64 20 6f 6e 65 0a 20 20 20 20  and add one.    
1dd40 2a 2a 20 74 6f 20 74 68 61 74 2e 20 20 42 75 74  ** to that.  But
1dd50 20 69 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   if the largest 
1dd60 65 78 69 73 74 69 6e 67 20 72 6f 77 69 64 20 69  existing rowid i
1dd70 73 20 61 6c 72 65 61 64 79 20 74 68 65 20 6d 61  s already the ma
1dd80 78 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 70 6f 73  ximum.    ** pos
1dd90 69 74 69 76 65 20 69 6e 74 65 67 65 72 2c 20 77  itive integer, w
1dda0 65 20 68 61 76 65 20 74 6f 20 66 61 6c 6c 20 74  e have to fall t
1ddb0 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 73 65  hrough to the se
1ddc0 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 70 72 6f 62  cond.    ** prob
1ddd0 61 62 69 6c 69 73 74 69 63 20 61 6c 67 6f 72 69  abilistic algori
1dde0 74 68 6d 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  thm.    **.    *
1ddf0 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 6c 67  * The second alg
1de00 6f 72 69 74 68 6d 20 69 73 20 74 6f 20 73 65 6c  orithm is to sel
1de10 65 63 74 20 61 20 72 6f 77 69 64 20 61 74 20 72  ect a rowid at r
1de20 61 6e 64 6f 6d 20 61 6e 64 20 73 65 65 20 69 66  andom and see if
1de30 0a 20 20 20 20 2a 2a 20 69 74 20 61 6c 72 65 61  .    ** it alrea
1de40 64 79 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  dy exists in the
1de50 20 74 61 62 6c 65 2e 20 20 49 66 20 69 74 20 64   table.  If it d
1de60 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 77  oes not exist, w
1de70 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 73 75  e have.    ** su
1de80 63 63 65 65 64 65 64 2e 20 20 49 66 20 74 68 65  cceeded.  If the
1de90 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20 64 6f   random rowid do
1dea0 65 73 20 65 78 69 73 74 2c 20 77 65 20 73 65 6c  es exist, we sel
1deb0 65 63 74 20 61 20 6e 65 77 20 6f 6e 65 0a 20 20  ect a new one.  
1dec0 20 20 2a 2a 20 61 6e 64 20 74 72 79 20 61 67 61    ** and try aga
1ded0 69 6e 2c 20 75 70 20 74 6f 20 31 30 30 20 74 69  in, up to 100 ti
1dee0 6d 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mes..    */.    
1def0 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61  assert( pC->isTa
1df00 62 6c 65 20 29 3b 0a 20 20 20 20 63 6e 74 20 3d  ble );.    cnt =
1df10 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   0;..#ifdef SQLI
1df20 54 45 5f 33 32 42 49 54 5f 52 4f 57 49 44 0a 23  TE_32BIT_ROWID.#
1df30 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 52 4f     define MAX_RO
1df40 57 49 44 20 30 78 37 66 66 66 66 66 66 66 0a 23  WID 0x7fffffff.#
1df50 65 6c 73 65 0a 20 20 20 20 2f 2a 20 53 6f 6d 65  else.    /* Some
1df60 20 63 6f 6d 70 69 6c 65 72 73 20 63 6f 6d 70 6c   compilers compl
1df70 61 69 6e 20 61 62 6f 75 74 20 63 6f 6e 73 74 61  ain about consta
1df80 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  nts of the form 
1df90 30 78 37 66 66 66 66 66 66 66 66 66 66 66 66 66  0x7fffffffffffff
1dfa0 66 66 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72  ff..    ** Other
1dfb0 73 20 63 6f 6d 70 6c 61 69 6e 20 61 62 6f 75 74  s complain about
1dfc0 20 30 78 37 66 66 66 66 66 66 66 66 66 66 66 66   0x7ffffffffffff
1dfd0 66 66 66 66 4c 4c 2e 20 20 54 68 65 20 66 6f 6c  ffffLL.  The fol
1dfe0 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 73 65 65  lowing macro see
1dff0 6d 73 0a 20 20 20 20 2a 2a 20 74 6f 20 70 72 6f  ms.    ** to pro
1e000 76 69 64 65 20 74 68 65 20 63 6f 6e 73 74 61 6e  vide the constan
1e010 74 20 77 68 69 6c 65 20 6d 61 6b 69 6e 67 20 61  t while making a
1e020 6c 6c 20 63 6f 6d 70 69 6c 65 72 73 20 68 61 70  ll compilers hap
1e030 70 79 2e 0a 20 20 20 20 2a 2f 0a 23 20 20 20 64  py..    */.#   d
1e040 65 66 69 6e 65 20 4d 41 58 5f 52 4f 57 49 44 20  efine MAX_ROWID 
1e050 20 28 69 36 34 29 28 20 28 28 28 75 36 34 29 30   (i64)( (((u64)0
1e060 78 37 66 66 66 66 66 66 66 29 3c 3c 33 32 29 20  x7fffffff)<<32) 
1e070 7c 20 28 75 36 34 29 30 78 66 66 66 66 66 66 66  | (u64)0xfffffff
1e080 66 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  f ).#endif..    
1e090 69 66 28 20 21 70 43 2d 3e 75 73 65 52 61 6e 64  if( !pC->useRand
1e0a0 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  omRowid ){.     
1e0b0 20 76 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65   v = sqlite3Btre
1e0c0 65 47 65 74 43 61 63 68 65 64 52 6f 77 69 64 28  eGetCachedRowid(
1e0d0 70 43 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20  pC->pCursor);.  
1e0e0 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a      if( v==0 ){.
1e0f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1e100 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 70 43  ite3BtreeLast(pC
1e110 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29  ->pCursor, &res)
1e120 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1e130 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e140 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62           goto ab
1e150 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
1e160 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e170 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
1e180 20 20 20 20 20 20 20 20 20 76 20 3d 20 31 3b 20           v = 1; 
1e190 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31 39 31    /* IMP: R-6191
1e1a0 34 2d 34 38 30 37 34 20 2a 2f 0a 20 20 20 20 20  4-48074 */.     
1e1b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e1c0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1e1d0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
1e1e0 56 61 6c 69 64 28 70 43 2d 3e 70 43 75 72 73 6f  Valid(pC->pCurso
1e1f0 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r) );.          
1e200 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1e210 65 4b 65 79 53 69 7a 65 28 70 43 2d 3e 70 43 75  eKeySize(pC->pCu
1e220 72 73 6f 72 2c 20 26 76 29 3b 0a 20 20 20 20 20  rsor, &v);.     
1e230 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
1e240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
1e250 2f 2a 20 43 61 6e 6e 6f 74 20 66 61 69 6c 20 66  /* Cannot fail f
1e260 6f 6c 6c 6f 77 69 6e 67 20 42 74 72 65 65 4c 61  ollowing BtreeLa
1e270 73 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  st() */.        
1e280 20 20 69 66 28 20 76 3d 3d 4d 41 58 5f 52 4f 57    if( v==MAX_ROW
1e290 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ID ){.          
1e2a0 20 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52    pC->useRandomR
1e2b0 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  owid = 1;.      
1e2c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e2d0 20 20 20 20 20 20 20 76 2b 2b 3b 20 20 20 2f 2a         v++;   /*
1e2e0 20 49 4d 50 3a 20 52 2d 32 39 35 33 38 2d 33 34   IMP: R-29538-34
1e2f0 39 38 37 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  987 */.         
1e300 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1e310 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
1e320 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
1e330 43 52 45 4d 45 4e 54 0a 20 20 20 20 20 20 69 66  CREMENT.      if
1e340 28 20 70 4f 70 2d 3e 70 33 20 29 7b 0a 20 20 20  ( pOp->p3 ){.   
1e350 20 20 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74       /* Assert t
1e360 68 61 74 20 50 33 20 69 73 20 61 20 76 61 6c 69  hat P3 is a vali
1e370 64 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a  d memory cell. *
1e380 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
1e390 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20  ( pOp->p3>0 );. 
1e3a0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 46         if( p->pF
1e3b0 72 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  rame ){.        
1e3c0 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e    for(pFrame=p->
1e3d0 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e  pFrame; pFrame->
1e3e0 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d  pParent; pFrame=
1e3f0 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29  pFrame->pParent)
1e400 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;.          /* A
1e410 73 73 65 72 74 20 74 68 61 74 20 50 33 20 69 73  ssert that P3 is
1e420 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20   a valid memory 
1e430 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20  cell. */.       
1e440 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
1e450 70 33 3c 3d 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d  p3<=pFrame->nMem
1e460 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d   );.          pM
1e470 65 6d 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d  em = &pFrame->aM
1e480 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20  em[pOp->p3];.   
1e490 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e4a0 20 20 20 20 20 20 2f 2a 20 41 73 73 65 72 74 20        /* Assert 
1e4b0 74 68 61 74 20 50 33 20 69 73 20 61 20 76 61 6c  that P3 is a val
1e4c0 69 64 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20  id memory cell. 
1e4d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
1e4e0 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d  ert( pOp->p3<=p-
1e4f0 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20 20  >nMem );.       
1e500 20 20 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b     pMem = &aMem[
1e510 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20  pOp->p3];.      
1e520 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 52 45 47    }..        REG
1e530 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
1e540 3e 70 33 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  >p3, pMem);.    
1e550 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1e560 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 4d 65  emIntegerify(pMe
1e570 6d 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  m);.        asse
1e580 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73  rt( (pMem->flags
1e590 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29   & MEM_Int)!=0 )
1e5a0 3b 20 20 2f 2a 20 6d 65 6d 28 50 33 29 20 68 6f  ;  /* mem(P3) ho
1e5b0 6c 64 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a  lds an integer *
1e5c0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  /.        if( pM
1e5d0 65 6d 2d 3e 75 2e 69 3d 3d 4d 41 58 5f 52 4f 57  em->u.i==MAX_ROW
1e5e0 49 44 20 7c 7c 20 70 43 2d 3e 75 73 65 52 61 6e  ID || pC->useRan
1e5f0 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  domRowid ){.    
1e600 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e610 45 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50  E_FULL;   /* IMP
1e620 3a 20 52 2d 31 32 32 37 35 2d 36 31 33 33 38 20  : R-12275-61338 
1e630 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
1e640 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
1e650 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rror;.        }.
1e660 20 20 20 20 20 20 20 20 69 66 28 20 76 3c 70 4d          if( v<pM
1e670 65 6d 2d 3e 75 2e 69 2b 31 20 29 7b 0a 20 20 20  em->u.i+1 ){.   
1e680 20 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d         v = pMem-
1e690 3e 75 2e 69 20 2b 20 31 3b 0a 20 20 20 20 20 20  >u.i + 1;.      
1e6a0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4d 65 6d    }.        pMem
1e6b0 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 20 20 20  ->u.i = v;.     
1e6c0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
1e6d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
1e6e0 43 61 63 68 65 64 52 6f 77 69 64 28 70 43 2d 3e  CachedRowid(pC->
1e6f0 70 43 75 72 73 6f 72 2c 20 76 3c 4d 41 58 5f 52  pCursor, v<MAX_R
1e700 4f 57 49 44 20 3f 20 76 2b 31 20 3a 20 30 29 3b  OWID ? v+1 : 0);
1e710 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1e720 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69  C->useRandomRowi
1e730 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 4d  d ){.      /* IM
1e740 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
1e750 20 52 2d 34 38 35 39 38 2d 30 32 39 33 38 20 49   R-48598-02938 I
1e760 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 52 4f  f the largest RO
1e770 57 49 44 20 69 73 20 65 71 75 61 6c 20 74 6f 20  WID is equal to 
1e780 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72  the.      ** lar
1e790 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 69 6e  gest possible in
1e7a0 74 65 67 65 72 20 28 39 32 32 33 33 37 32 30 33  teger (922337203
1e7b0 36 38 35 34 37 37 35 38 30 37 29 20 74 68 65 6e  6854775807) then
1e7c0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1e7d0 20 20 20 20 2a 2a 20 65 6e 67 69 6e 65 20 73 74      ** engine st
1e7e0 61 72 74 73 20 70 69 63 6b 69 6e 67 20 63 61 6e  arts picking can
1e7f0 64 69 64 61 74 65 20 52 4f 57 49 44 73 20 61 74  didate ROWIDs at
1e800 20 72 61 6e 64 6f 6d 20 75 6e 74 69 6c 20 69 74   random until it
1e810 20 66 69 6e 64 73 20 6f 6e 65 0a 20 20 20 20 20   finds one.     
1e820 20 2a 2a 20 74 68 61 74 20 69 73 20 6e 6f 74 20   ** that is not 
1e830 70 72 65 76 69 6f 75 73 6c 79 20 75 73 65 64 2e  previously used.
1e840 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1e850 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3d  assert( pOp->p3=
1e860 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20 63 61 6e  =0 );  /* We can
1e870 6e 6f 74 20 62 65 20 69 6e 20 72 61 6e 64 6f 6d  not be in random
1e880 20 72 6f 77 69 64 20 6d 6f 64 65 20 69 66 20 74   rowid mode if t
1e890 68 69 73 20 69 73 0a 20 20 20 20 20 20 20 20 20  his is.         
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8b0 20 20 20 20 2a 2a 20 61 6e 20 41 55 54 4f 49 4e      ** an AUTOIN
1e8c0 43 52 45 4d 45 4e 54 20 74 61 62 6c 65 2e 20 2a  CREMENT table. *
1e8d0 2f 0a 20 20 20 20 20 20 76 20 3d 20 64 62 2d 3e  /.      v = db->
1e8e0 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 20 20 20  lastRowid;.     
1e8f0 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20   cnt = 0;.      
1e900 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  do{.        if( 
1e910 63 6e 74 3d 3d 30 20 26 26 20 28 76 26 30 78 66  cnt==0 && (v&0xf
1e920 66 66 66 66 66 29 3d 3d 76 20 29 7b 0a 20 20 20  fffff)==v ){.   
1e930 20 20 20 20 20 20 20 76 2b 2b 3b 0a 20 20 20 20         v++;.    
1e940 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e950 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
1e960 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 76  domness(sizeof(v
1e970 29 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20  ), &v);.        
1e980 20 20 69 66 28 20 63 6e 74 3c 35 20 29 20 76 20    if( cnt<5 ) v 
1e990 26 3d 20 30 78 66 66 66 66 66 66 3b 0a 20 20 20  &= 0xffffff;.   
1e9a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
1e9b0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1e9c0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
1e9d0 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28  C->pCursor, 0, (
1e9e0 75 36 34 29 76 2c 20 30 2c 20 26 72 65 73 29 3b  u64)v, 0, &res);
1e9f0 0a 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  .        cnt++;.
1ea00 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 63 6e        }while( cn
1ea10 74 3c 31 30 30 20 26 26 20 72 63 3d 3d 53 51 4c  t<100 && rc==SQL
1ea20 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 3d 3d 30  ITE_OK && res==0
1ea30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
1ea40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
1ea50 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
1ea60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
1ea70 4c 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33  L;   /* IMP: R-3
1ea80 38 32 31 39 2d 35 33 30 30 32 20 2a 2f 0a 20 20  8219-53002 */.  
1ea90 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74        goto abort
1eaa0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
1eab0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1eac0 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69   pC->rowidIsVali
1ead0 64 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 64  d = 0;.    pC->d
1eae0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
1eaf0 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65  0;.    pC->cache
1eb00 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
1eb10 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 70 4f 75 74  TALE;.  }.  pOut
1eb20 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 62 72 65  ->u.i = v;.  bre
1eb30 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1eb40 3a 20 49 6e 73 65 72 74 20 50 31 20 50 32 20 50  : Insert P1 P2 P
1eb50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 57 72  3 P4 P5.**.** Wr
1eb60 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
1eb70 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 63  o the table of c
1eb80 75 72 73 6f 72 20 50 31 2e 20 20 41 20 6e 65 77  ursor P1.  A new
1eb90 20 65 6e 74 72 79 20 69 73 0a 2a 2a 20 63 72 65   entry is.** cre
1eba0 61 74 65 64 20 69 66 20 69 74 20 64 6f 65 73 6e  ated if it doesn
1ebb0 27 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  't already exist
1ebc0 20 6f 72 20 74 68 65 20 64 61 74 61 20 66 6f 72   or the data for
1ebd0 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20   an existing.** 
1ebe0 65 6e 74 72 79 20 69 73 20 6f 76 65 72 77 72 69  entry is overwri
1ebf0 74 74 65 6e 2e 20 20 54 68 65 20 64 61 74 61 20  tten.  The data 
1ec00 69 73 20 74 68 65 20 76 61 6c 75 65 20 4d 45 4d  is the value MEM
1ec10 5f 42 6c 6f 62 20 73 74 6f 72 65 64 20 69 6e 20  _Blob stored in 
1ec20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6e 75 6d 62  register.** numb
1ec30 65 72 20 50 32 2e 20 54 68 65 20 6b 65 79 20 69  er P2. The key i
1ec40 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
1ec50 73 74 65 72 20 50 33 2e 20 54 68 65 20 6b 65 79  ster P3. The key
1ec60 20 6d 75 73 74 0a 2a 2a 20 62 65 20 61 20 4d 45   must.** be a ME
1ec70 4d 5f 49 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  M_Int..**.** If 
1ec80 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  the OPFLAG_NCHAN
1ec90 47 45 20 66 6c 61 67 20 6f 66 20 50 35 20 69 73  GE flag of P5 is
1eca0 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72   set, then the r
1ecb0 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20  ow change count 
1ecc0 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65  is.** incremente
1ecd0 64 20 28 6f 74 68 65 72 77 69 73 65 20 6e 6f 74  d (otherwise not
1ece0 29 2e 20 20 49 66 20 74 68 65 20 4f 50 46 4c 41  ).  If the OPFLA
1ecf0 47 5f 4c 41 53 54 52 4f 57 49 44 20 66 6c 61 67  G_LASTROWID flag
1ed00 20 6f 66 20 50 35 20 69 73 20 73 65 74 2c 0a 2a   of P5 is set,.*
1ed10 2a 20 74 68 65 6e 20 72 6f 77 69 64 20 69 73 20  * then rowid is 
1ed20 73 74 6f 72 65 64 20 66 6f 72 20 73 75 62 73 65  stored for subse
1ed30 71 75 65 6e 74 20 72 65 74 75 72 6e 20 62 79 20  quent return by 
1ed40 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6c  the.** sqlite3_l
1ed50 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
1ed60 28 29 20 66 75 6e 63 74 69 6f 6e 20 28 6f 74 68  () function (oth
1ed70 65 72 77 69 73 65 20 69 74 20 69 73 20 75 6e 6d  erwise it is unm
1ed80 6f 64 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  odified)..**.** 
1ed90 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53  If the OPFLAG_US
1eda0 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67  ESEEKRESULT flag
1edb0 20 6f 66 20 50 35 20 69 73 20 73 65 74 20 61 6e   of P5 is set an
1edc0 64 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  d if the result 
1edd0 6f 66 0a 2a 2a 20 74 68 65 20 6c 61 73 74 20 73  of.** the last s
1ede0 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20 28 4f  eek operation (O
1edf0 50 5f 4e 6f 74 45 78 69 73 74 73 29 20 77 61 73  P_NotExists) was
1ee00 20 61 20 73 75 63 63 65 73 73 2c 20 74 68 65 6e   a success, then
1ee10 20 74 68 69 73 0a 2a 2a 20 6f 70 65 72 61 74 69   this.** operati
1ee20 6f 6e 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65  on will not atte
1ee30 6d 70 74 20 74 6f 20 66 69 6e 64 20 74 68 65 20  mpt to find the 
1ee40 61 70 70 72 6f 70 72 69 61 74 65 20 72 6f 77 20  appropriate row 
1ee50 62 65 66 6f 72 65 20 64 6f 69 6e 67 0a 2a 2a 20  before doing.** 
1ee60 74 68 65 20 69 6e 73 65 72 74 20 62 75 74 20 77  the insert but w
1ee70 69 6c 6c 20 69 6e 73 74 65 61 64 20 6f 76 65 72  ill instead over
1ee80 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 68  write the row th
1ee90 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
1eea0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  .** currently po
1eeb0 69 6e 74 69 6e 67 20 74 6f 2e 20 20 50 72 65 73  inting to.  Pres
1eec0 75 6d 61 62 6c 79 2c 20 74 68 65 20 70 72 69 6f  umably, the prio
1eed0 72 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f  r OP_NotExists o
1eee0 70 63 6f 64 65 0a 2a 2a 20 68 61 73 20 61 6c 72  pcode.** has alr
1eef0 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20  eady positioned 
1ef00 74 68 65 20 63 75 72 73 6f 72 20 63 6f 72 72 65  the cursor corre
1ef10 63 74 6c 79 2e 20 20 54 68 69 73 20 69 73 20 61  ctly.  This is a
1ef20 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  n optimization.*
1ef30 2a 20 74 68 61 74 20 62 6f 6f 73 74 73 20 70 65  * that boosts pe
1ef40 72 66 6f 72 6d 61 6e 63 65 20 62 79 20 61 76 6f  rformance by avo
1ef50 69 64 69 6e 67 20 72 65 64 75 6e 64 61 6e 74 20  iding redundant 
1ef60 73 65 65 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  seeks..**.** If 
1ef70 74 68 65 20 4f 50 46 4c 41 47 5f 49 53 55 50 44  the OPFLAG_ISUPD
1ef80 41 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ATE flag is set,
1ef90 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63 6f 64   then this opcod
1efa0 65 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 0a  e is part of an.
1efb0 2a 2a 20 55 50 44 41 54 45 20 6f 70 65 72 61 74  ** UPDATE operat
1efc0 69 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ion.  Otherwise 
1efd0 28 69 66 20 74 68 65 20 66 6c 61 67 20 69 73 20  (if the flag is 
1efe0 63 6c 65 61 72 29 20 74 68 65 6e 20 74 68 69 73  clear) then this
1eff0 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 70 61   opcode.** is pa
1f000 72 74 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20  rt of an INSERT 
1f010 6f 70 65 72 61 74 69 6f 6e 2e 20 20 54 68 65 20  operation.  The 
1f020 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 6f 6e  difference is on
1f030 6c 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 0a  ly important to.
1f040 2a 2a 20 74 68 65 20 75 70 64 61 74 65 20 68 6f  ** the update ho
1f050 6f 6b 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  ok..**.** Parame
1f060 74 65 72 20 50 34 20 6d 61 79 20 70 6f 69 6e 74  ter P4 may point
1f070 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
1f080 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
1f090 65 2d 6e 61 6d 65 2c 20 6f 72 0a 2a 2a 20 6d 61  e-name, or.** ma
1f0a0 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69 74  y be NULL. If it
1f0b0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
1f0c0 65 6e 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f  en the update-ho
1f0d0 6f 6b 20 0a 2a 2a 20 28 73 71 6c 69 74 65 33 2e  ok .** (sqlite3.
1f0e0 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 29  xUpdateCallback)
1f0f0 20 69 73 20 69 6e 76 6f 6b 65 64 20 66 6f 6c 6c   is invoked foll
1f100 6f 77 69 6e 67 20 61 20 73 75 63 63 65 73 73 66  owing a successf
1f110 75 6c 20 69 6e 73 65 72 74 2e 0a 2a 2a 0a 2a 2a  ul insert..**.**
1f120 20 28 57 41 52 4e 49 4e 47 2f 54 4f 44 4f 3a 20   (WARNING/TODO: 
1f130 49 66 20 50 31 20 69 73 20 61 20 70 73 65 75 64  If P1 is a pseud
1f140 6f 2d 63 75 72 73 6f 72 20 61 6e 64 20 50 32 20  o-cursor and P2 
1f150 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a  is dynamically.*
1f160 2a 20 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65  * allocated, the
1f170 6e 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 50  n ownership of P
1f180 32 20 69 73 20 74 72 61 6e 73 66 65 72 72 65 64  2 is transferred
1f190 20 74 6f 20 74 68 65 20 70 73 65 75 64 6f 2d 63   to the pseudo-c
1f1a0 75 72 73 6f 72 0a 2a 2a 20 61 6e 64 20 72 65 67  ursor.** and reg
1f1b0 69 73 74 65 72 20 50 32 20 62 65 63 6f 6d 65 73  ister P2 becomes
1f1c0 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 49 66 20   ephemeral.  If 
1f1d0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 63 68  the cursor is ch
1f1e0 61 6e 67 65 64 2c 20 74 68 65 0a 2a 2a 20 76 61  anged, the.** va
1f1f0 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20  lue of register 
1f200 50 32 20 77 69 6c 6c 20 74 68 65 6e 20 63 68 61  P2 will then cha
1f210 6e 67 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  nge.  Make sure 
1f220 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  this does not.**
1f230 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
1f240 65 6d 73 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ems.).**.** This
1f250 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 6c   instruction onl
1f260 79 20 77 6f 72 6b 73 20 6f 6e 20 74 61 62 6c 65  y works on table
1f270 73 2e 20 20 54 68 65 20 65 71 75 69 76 61 6c 65  s.  The equivale
1f280 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  nt instruction.*
1f290 2a 20 66 6f 72 20 69 6e 64 69 63 65 73 20 69 73  * for indices is
1f2a0 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2e 0a 2a   OP_IdxInsert..*
1f2b0 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 73  /./* Opcode: Ins
1f2c0 65 72 74 49 6e 74 20 50 31 20 50 32 20 50 33 20  ertInt P1 P2 P3 
1f2d0 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73  P4 P5.**.** This
1f2e0 20 77 6f 72 6b 73 20 65 78 61 63 74 6c 79 20 6c   works exactly l
1f2f0 69 6b 65 20 4f 50 5f 49 6e 73 65 72 74 20 65 78  ike OP_Insert ex
1f300 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6b 65  cept that the ke
1f310 79 20 69 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65  y is the.** inte
1f320 67 65 72 20 76 61 6c 75 65 20 50 33 2c 20 6e 6f  ger value P3, no
1f330 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
1f340 68 65 20 69 6e 74 65 67 65 72 20 73 74 6f 72 65  he integer store
1f350 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  d in register P3
1f360 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 73  ..*/.case OP_Ins
1f370 65 72 74 3a 20 0a 63 61 73 65 20 4f 50 5f 49 6e  ert: .case OP_In
1f380 73 65 72 74 49 6e 74 3a 20 7b 0a 20 20 4d 65 6d  sertInt: {.  Mem
1f390 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 2f   *pData;       /
1f3a0 2a 20 4d 45 4d 20 63 65 6c 6c 20 68 6f 6c 64 69  * MEM cell holdi
1f3b0 6e 67 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ng data for the 
1f3c0 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73  record to be ins
1f3d0 65 72 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a  erted */.  Mem *
1f3e0 70 4b 65 79 3b 20 20 20 20 20 20 20 20 2f 2a 20  pKey;        /* 
1f3f0 4d 45 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67  MEM cell holding
1f400 20 6b 65 79 20 20 66 6f 72 20 74 68 65 20 72 65   key  for the re
1f410 63 6f 72 64 20 2a 2f 0a 20 20 69 36 34 20 69 4b  cord */.  i64 iK
1f420 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ey;         /* T
1f430 68 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44  he integer ROWID
1f440 20 6f 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20   or key for the 
1f450 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73  record to be ins
1f460 65 72 74 65 64 20 2a 2f 0a 20 20 56 64 62 65 43  erted */.  VdbeC
1f470 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 2f 2a 20  ursor *pC;   /* 
1f480 43 75 72 73 6f 72 20 74 6f 20 74 61 62 6c 65 20  Cursor to table 
1f490 69 6e 74 6f 20 77 68 69 63 68 20 69 6e 73 65 72  into which inser
1f4a0 74 20 69 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a  t is written */.
1f4b0 20 20 69 6e 74 20 6e 5a 65 72 6f 3b 20 20 20 20    int nZero;    
1f4c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f4d0 20 7a 65 72 6f 2d 62 79 74 65 73 20 74 6f 20 61   zero-bytes to a
1f4e0 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73  ppend */.  int s
1f4f0 65 65 6b 52 65 73 75 6c 74 3b 20 20 20 2f 2a 20  eekResult;   /* 
1f500 52 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20  Result of prior 
1f510 73 65 65 6b 20 6f 72 20 30 20 69 66 20 6e 6f 20  seek or 0 if no 
1f520 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c  USESEEKRESULT fl
1f530 61 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ag */.  const ch
1f540 61 72 20 2a 7a 44 62 3b 20 20 2f 2a 20 64 61 74  ar *zDb;  /* dat
1f550 61 62 61 73 65 20 6e 61 6d 65 20 2d 20 75 73 65  abase name - use
1f560 64 20 62 79 20 74 68 65 20 75 70 64 61 74 65 20  d by the update 
1f570 68 6f 6f 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  hook */.  const 
1f580 63 68 61 72 20 2a 7a 54 62 6c 3b 20 2f 2a 20 54  char *zTbl; /* T
1f590 61 62 6c 65 20 6e 61 6d 65 20 2d 20 75 73 65 64  able name - used
1f5a0 20 62 79 20 74 68 65 20 6f 70 64 61 74 65 20 68   by the opdate h
1f5b0 6f 6f 6b 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ook */.  int op;
1f5c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
1f5d0 63 6f 64 65 20 66 6f 72 20 75 70 64 61 74 65 20  code for update 
1f5e0 68 6f 6f 6b 3a 20 53 51 4c 49 54 45 5f 55 50 44  hook: SQLITE_UPD
1f5f0 41 54 45 20 6f 72 20 53 51 4c 49 54 45 5f 49 4e  ATE or SQLITE_IN
1f600 53 45 52 54 20 2a 2f 0a 0a 20 20 70 44 61 74 61  SERT */..  pData
1f610 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
1f620 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ];.  assert( pOp
1f630 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
1f640 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
1f650 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
1f660 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
1f670 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
1f680 61 73 73 65 72 74 28 20 70 43 2d 3e 70 43 75 72  assert( pC->pCur
1f690 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  sor!=0 );.  asse
1f6a0 72 74 28 20 70 43 2d 3e 70 73 65 75 64 6f 54 61  rt( pC->pseudoTa
1f6b0 62 6c 65 52 65 67 3d 3d 30 20 29 3b 0a 20 20 61  bleReg==0 );.  a
1f6c0 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62  ssert( pC->isTab
1f6d0 6c 65 20 29 3b 0a 20 20 52 45 47 49 53 54 45 52  le );.  REGISTER
1f6e0 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20  _TRACE(pOp->p2, 
1f6f0 70 44 61 74 61 29 3b 0a 0a 20 20 69 66 28 20 70  pData);..  if( p
1f700 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
1f710 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 70 4b 65  nsert ){.    pKe
1f720 79 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  y = &aMem[pOp->p
1f730 33 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  3];.    assert( 
1f740 70 4b 65 79 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pKey->flags & ME
1f750 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 52 45 47  M_Int );.    REG
1f760 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
1f770 3e 70 33 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  >p3, pKey);.    
1f780 69 4b 65 79 20 3d 20 70 4b 65 79 2d 3e 75 2e 69  iKey = pKey->u.i
1f790 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1f7a0 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
1f7b0 64 65 3d 3d 4f 50 5f 49 6e 73 65 72 74 49 6e 74  de==OP_InsertInt
1f7c0 20 29 3b 0a 20 20 20 20 69 4b 65 79 20 3d 20 70   );.    iKey = p
1f7d0 4f 70 2d 3e 70 33 3b 0a 20 20 7d 0a 0a 20 20 69  Op->p3;.  }..  i
1f7e0 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46  f( pOp->p5 & OPF
1f7f0 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29 20 70 2d  LAG_NCHANGE ) p-
1f800 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 69 66  >nChange++;.  if
1f810 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c  ( pOp->p5 & OPFL
1f820 41 47 5f 4c 41 53 54 52 4f 57 49 44 20 29 20 64  AG_LASTROWID ) d
1f830 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 69  b->lastRowid = i
1f840 4b 65 79 3b 0a 20 20 69 66 28 20 70 44 61 74 61  Key;.  if( pData
1f850 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
1f860 6c 6c 20 29 7b 0a 20 20 20 20 70 44 61 74 61 2d  ll ){.    pData-
1f870 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 70 44 61 74  >z = 0;.    pDat
1f880 61 2d 3e 6e 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  a->n = 0;.  }els
1f890 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
1f8a0 44 61 74 61 2d 3e 66 6c 61 67 73 20 26 20 28 4d  Data->flags & (M
1f8b0 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29  EM_Blob|MEM_Str)
1f8c0 20 29 3b 0a 20 20 7d 0a 20 20 73 65 65 6b 52 65   );.  }.  seekRe
1f8d0 73 75 6c 74 20 3d 20 28 28 70 4f 70 2d 3e 70 35  sult = ((pOp->p5
1f8e0 20 26 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45   & OPFLAG_USESEE
1f8f0 4b 52 45 53 55 4c 54 29 20 3f 20 70 43 2d 3e 73  KRESULT) ? pC->s
1f900 65 65 6b 52 65 73 75 6c 74 20 3a 20 30 29 3b 0a  eekResult : 0);.
1f910 20 20 69 66 28 20 70 44 61 74 61 2d 3e 66 6c 61    if( pData->fla
1f920 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
1f930 0a 20 20 20 20 6e 5a 65 72 6f 20 3d 20 70 44 61  .    nZero = pDa
1f940 74 61 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  ta->u.nZero;.  }
1f950 65 6c 73 65 7b 0a 20 20 20 20 6e 5a 65 72 6f 20  else{.    nZero 
1f960 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
1f970 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 64  e3BtreeSetCached
1f980 52 6f 77 69 64 28 70 43 2d 3e 70 43 75 72 73 6f  Rowid(pC->pCurso
1f990 72 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  r, 0);.  rc = sq
1f9a0 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
1f9b0 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  (pC->pCursor, 0,
1f9c0 20 69 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20   iKey,.         
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9e0 20 70 44 61 74 61 2d 3e 7a 2c 20 70 44 61 74 61   pData->z, pData
1f9f0 2d 3e 6e 2c 20 6e 5a 65 72 6f 2c 0a 20 20 20 20  ->n, nZero,.    
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa10 20 20 20 20 20 20 70 4f 70 2d 3e 70 35 20 26 20        pOp->p5 & 
1fa20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 2c 20 73  OPFLAG_APPEND, s
1fa30 65 65 6b 52 65 73 75 6c 74 0a 20 20 29 3b 0a 20  eekResult.  );. 
1fa40 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69   pC->rowidIsVali
1fa50 64 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 64 65 66  d = 0;.  pC->def
1fa60 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
1fa70 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74  .  pC->cacheStat
1fa80 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
1fa90 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74  ;..  /* Invoke t
1faa0 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69  he update-hook i
1fab0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
1fac0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fad0 4f 4b 20 26 26 20 64 62 2d 3e 78 55 70 64 61 74  OK && db->xUpdat
1fae0 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 70 4f 70  eCallback && pOp
1faf0 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20 20 7a 44  ->p4.z ){.    zD
1fb00 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 43 2d 3e  b = db->aDb[pC->
1fb10 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
1fb20 7a 54 62 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  zTbl = pOp->p4.z
1fb30 3b 0a 20 20 20 20 6f 70 20 3d 20 28 28 70 4f 70  ;.    op = ((pOp
1fb40 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 49 53  ->p5 & OPFLAG_IS
1fb50 55 50 44 41 54 45 29 20 3f 20 53 51 4c 49 54 45  UPDATE) ? SQLITE
1fb60 5f 55 50 44 41 54 45 20 3a 20 53 51 4c 49 54 45  _UPDATE : SQLITE
1fb70 5f 49 4e 53 45 52 54 29 3b 0a 20 20 20 20 61 73  _INSERT);.    as
1fb80 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c  sert( pC->isTabl
1fb90 65 20 29 3b 0a 20 20 20 20 64 62 2d 3e 78 55 70  e );.    db->xUp
1fba0 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d  dateCallback(db-
1fbb0 3e 70 55 70 64 61 74 65 41 72 67 2c 20 6f 70 2c  >pUpdateArg, op,
1fbc0 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79   zDb, zTbl, iKey
1fbd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1fbe0 43 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20 7d  C->iDb>=0 );.  }
1fbf0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
1fc00 4f 70 63 6f 64 65 3a 20 44 65 6c 65 74 65 20 50  Opcode: Delete P
1fc10 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  1 P2 * P4 *.**.*
1fc20 2a 20 44 65 6c 65 74 65 20 74 68 65 20 72 65 63  * Delete the rec
1fc30 6f 72 64 20 61 74 20 77 68 69 63 68 20 74 68 65  ord at which the
1fc40 20 50 31 20 63 75 72 73 6f 72 20 69 73 20 63 75   P1 cursor is cu
1fc50 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
1fc60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73  ..**.** The curs
1fc70 6f 72 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20  or will be left 
1fc80 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 69 74 68  pointing at eith
1fc90 65 72 20 74 68 65 20 6e 65 78 74 20 6f 72 20 74  er the next or t
1fca0 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 72  he previous.** r
1fcb0 65 63 6f 72 64 20 69 6e 20 74 68 65 20 74 61 62  ecord in the tab
1fcc0 6c 65 2e 20 49 66 20 69 74 20 69 73 20 6c 65 66  le. If it is lef
1fcd0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
1fce0 65 20 6e 65 78 74 20 72 65 63 6f 72 64 2c 20 74  e next record, t
1fcf0 68 65 6e 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20  hen.** the next 
1fd00 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  Next instruction
1fd10 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70   will be a no-op
1fd20 2e 20 20 48 65 6e 63 65 20 69 74 20 69 73 20 4f  .  Hence it is O
1fd30 4b 20 74 6f 20 64 65 6c 65 74 65 0a 2a 2a 20 61  K to delete.** a
1fd40 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 77 69 74   record from wit
1fd50 68 69 6e 20 61 6e 20 4e 65 78 74 20 6c 6f 6f 70  hin an Next loop
1fd60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f  ..**.** If the O
1fd70 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 66 6c  PFLAG_NCHANGE fl
1fd80 61 67 20 6f 66 20 50 32 20 69 73 20 73 65 74 2c  ag of P2 is set,
1fd90 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 63 68   then the row ch
1fda0 61 6e 67 65 20 63 6f 75 6e 74 20 69 73 0a 2a 2a  ange count is.**
1fdb0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 28 6f 74   incremented (ot
1fdc0 68 65 72 77 69 73 65 20 6e 6f 74 29 2e 0a 2a 2a  herwise not)..**
1fdd0 0a 2a 2a 20 50 31 20 6d 75 73 74 20 6e 6f 74 20  .** P1 must not 
1fde0 62 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  be pseudo-table.
1fdf0 20 20 49 74 20 68 61 73 20 74 6f 20 62 65 20 61    It has to be a
1fe00 20 72 65 61 6c 20 74 61 62 6c 65 20 77 69 74 68   real table with
1fe10 0a 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  .** multiple row
1fe20 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69  s..**.** If P4 i
1fe30 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
1fe40 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20   it is the name 
1fe50 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
1fe60 74 20 50 31 20 69 73 0a 2a 2a 20 70 6f 69 6e 74  t P1 is.** point
1fe70 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 75 70 64  ing to.  The upd
1fe80 61 74 65 20 68 6f 6f 6b 20 77 69 6c 6c 20 62 65  ate hook will be
1fe90 20 69 6e 76 6f 6b 65 64 2c 20 69 66 20 69 74 20   invoked, if it 
1fea0 65 78 69 73 74 73 2e 0a 2a 2a 20 49 66 20 50 34  exists..** If P4
1feb0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
1fec0 6e 20 74 68 65 20 50 31 20 63 75 72 73 6f 72 20  n the P1 cursor 
1fed0 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 70  must have been p
1fee0 6f 73 69 74 69 6f 6e 65 64 0a 2a 2a 20 75 73 69  ositioned.** usi
1fef0 6e 67 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 70  ng OP_NotFound p
1ff00 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67  rior to invoking
1ff10 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2f   this opcode..*/
1ff20 0a 63 61 73 65 20 4f 50 5f 44 65 6c 65 74 65 3a  .case OP_Delete:
1ff30 20 7b 0a 20 20 69 36 34 20 69 4b 65 79 3b 0a 20   {.  i64 iKey;. 
1ff40 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
1ff50 0a 0a 20 20 69 4b 65 79 20 3d 20 30 3b 0a 20 20  ..  iKey = 0;.  
1ff60 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
1ff70 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
1ff80 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
1ff90 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
1ffa0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
1ffb0 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pC!=0 );.  asser
1ffc0 74 28 20 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d  t( pC->pCursor!=
1ffd0 30 20 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 76 61  0 );  /* Only va
1ffe0 6c 69 64 20 66 6f 72 20 72 65 61 6c 20 74 61 62  lid for real tab
1fff0 6c 65 73 2c 20 6e 6f 20 70 73 65 75 64 6f 74 61  les, no pseudota
20000 62 6c 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  bles */..  /* If
20010 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b   the update-hook
20020 20 77 69 6c 6c 20 62 65 20 69 6e 76 6f 6b 65 64   will be invoked
20030 2c 20 73 65 74 20 69 4b 65 79 20 74 6f 20 74 68  , set iKey to th
20040 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 0a 20  e rowid of the. 
20050 20 2a 2a 20 72 6f 77 20 62 65 69 6e 67 20 64 65   ** row being de
20060 6c 65 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  leted..  */.  if
20070 28 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c  ( db->xUpdateCal
20080 6c 62 61 63 6b 20 26 26 20 70 4f 70 2d 3e 70 34  lback && pOp->p4
20090 2e 7a 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  .z ){.    assert
200a0 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b  ( pC->isTable );
200b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
200c0 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 29 3b  >rowidIsValid );
200d0 20 20 2f 2a 20 6c 61 73 74 52 6f 77 69 64 20 73    /* lastRowid s
200e0 65 74 20 62 79 20 70 72 65 76 69 6f 75 73 20 4f  et by previous O
200f0 50 5f 4e 6f 74 46 6f 75 6e 64 20 2a 2f 0a 20 20  P_NotFound */.  
20100 20 20 69 4b 65 79 20 3d 20 70 43 2d 3e 6c 61 73    iKey = pC->las
20110 74 52 6f 77 69 64 3b 0a 20 20 7d 0a 0a 20 20 2f  tRowid;.  }..  /
20120 2a 20 54 68 65 20 4f 50 5f 44 65 6c 65 74 65 20  * The OP_Delete 
20130 6f 70 63 6f 64 65 20 61 6c 77 61 79 73 20 66 6f  opcode always fo
20140 6c 6c 6f 77 73 20 61 6e 20 4f 50 5f 4e 6f 74 45  llows an OP_NotE
20150 78 69 73 74 73 20 6f 72 20 4f 50 5f 4c 61 73 74  xists or OP_Last
20160 20 6f 72 0a 20 20 2a 2a 20 4f 50 5f 43 6f 6c 75   or.  ** OP_Colu
20170 6d 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  mn on the same t
20180 61 62 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 79  able without any
20190 20 69 6e 74 65 72 76 65 6e 69 6e 67 20 6f 70 65   intervening ope
201a0 72 61 74 69 6f 6e 73 20 74 68 61 74 0a 20 20 2a  rations that.  *
201b0 2a 20 6d 69 67 68 74 20 6d 6f 76 65 20 6f 72 20  * might move or 
201c0 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63  invalidate the c
201d0 75 72 73 6f 72 2e 20 20 48 65 6e 63 65 20 63 75  ursor.  Hence cu
201e0 72 73 6f 72 20 70 43 20 69 73 20 61 6c 77 61 79  rsor pC is alway
201f0 73 20 70 6f 69 6e 74 69 6e 67 0a 20 20 2a 2a 20  s pointing.  ** 
20200 74 6f 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65  to the row to be
20210 20 64 65 6c 65 74 65 64 20 61 6e 64 20 74 68 65   deleted and the
20220 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
20230 6f 72 4d 6f 76 65 74 6f 28 29 20 6f 70 65 72 61  orMoveto() opera
20240 74 69 6f 6e 0a 20 20 2a 2a 20 62 65 6c 6f 77 20  tion.  ** below 
20250 69 73 20 61 6c 77 61 79 73 20 61 20 6e 6f 2d 6f  is always a no-o
20260 70 20 61 6e 64 20 63 61 6e 6e 6f 74 20 66 61 69  p and cannot fai
20270 6c 2e 20 20 57 65 20 77 69 6c 6c 20 72 75 6e 20  l.  We will run 
20280 69 74 20 61 6e 79 68 6f 77 2c 20 74 68 6f 75 67  it anyhow, thoug
20290 68 2c 0a 20 20 2a 2a 20 74 6f 20 67 75 61 72 64  h,.  ** to guard
202a0 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65 20   against future 
202b0 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 63  changes to the c
202c0 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 2e 0a 20  ode generator.. 
202d0 20 2a 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70   **/.  assert( p
202e0 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
202f0 6f 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  o==0 );.  rc = s
20300 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
20310 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 69 66  Moveto(pC);.  if
20320 28 20 4e 45 56 45 52 28 72 63 21 3d 53 51 4c 49  ( NEVER(rc!=SQLI
20330 54 45 5f 4f 4b 29 20 29 20 67 6f 74 6f 20 61 62  TE_OK) ) goto ab
20340 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
20350 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
20360 65 53 65 74 43 61 63 68 65 64 52 6f 77 69 64 28  eSetCachedRowid(
20370 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 29 3b  pC->pCursor, 0);
20380 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
20390 74 72 65 65 44 65 6c 65 74 65 28 70 43 2d 3e 70  treeDelete(pC->p
203a0 43 75 72 73 6f 72 29 3b 0a 20 20 70 43 2d 3e 63  Cursor);.  pC->c
203b0 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
203c0 48 45 5f 53 54 41 4c 45 3b 0a 0a 20 20 2f 2a 20  HE_STALE;..  /* 
203d0 49 6e 76 6f 6b 65 20 74 68 65 20 75 70 64 61 74  Invoke the updat
203e0 65 2d 68 6f 6f 6b 20 69 66 20 72 65 71 75 69 72  e-hook if requir
203f0 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ed. */.  if( rc=
20400 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62  =SQLITE_OK && db
20410 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63  ->xUpdateCallbac
20420 6b 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 20 29  k && pOp->p4.z )
20430 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
20440 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
20450 70 43 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  pC->iDb].zName;.
20460 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
20470 7a 54 62 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  zTbl = pOp->p4.z
20480 3b 0a 20 20 20 20 64 62 2d 3e 78 55 70 64 61 74  ;.    db->xUpdat
20490 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 55  eCallback(db->pU
204a0 70 64 61 74 65 41 72 67 2c 20 53 51 4c 49 54 45  pdateArg, SQLITE
204b0 5f 44 45 4c 45 54 45 2c 20 7a 44 62 2c 20 7a 54  _DELETE, zDb, zT
204c0 62 6c 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 61  bl, iKey);.    a
204d0 73 73 65 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d  ssert( pC->iDb>=
204e0 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  0 );.  }.  if( p
204f0 4f 70 2d 3e 70 32 20 26 20 4f 50 46 4c 41 47 5f  Op->p2 & OPFLAG_
20500 4e 43 48 41 4e 47 45 20 29 20 70 2d 3e 6e 43 68  NCHANGE ) p->nCh
20510 61 6e 67 65 2b 2b 3b 0a 20 20 62 72 65 61 6b 3b  ange++;.  break;
20520 0a 7d 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  .}./* Opcode: Re
20530 73 65 74 43 6f 75 6e 74 20 2a 20 2a 20 2a 20 2a  setCount * * * *
20540 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c   *.**.** The val
20550 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  ue of the change
20560 20 63 6f 75 6e 74 65 72 20 69 73 20 63 6f 70 69   counter is copi
20570 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
20580 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 63 68 61  se handle.** cha
20590 6e 67 65 20 63 6f 75 6e 74 65 72 20 28 72 65 74  nge counter (ret
205a0 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75  urned by subsequ
205b0 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
205c0 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 29 2e  ite3_changes()).
205d0 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 56 4d 73  .** Then the VMs
205e0 20 69 6e 74 65 72 6e 61 6c 20 63 68 61 6e 67 65   internal change
205f0 20 63 6f 75 6e 74 65 72 20 72 65 73 65 74 73 20   counter resets 
20600 74 6f 20 30 2e 0a 2a 2a 20 54 68 69 73 20 69 73  to 0..** This is
20610 20 75 73 65 64 20 62 79 20 74 72 69 67 67 65 72   used by trigger
20620 20 70 72 6f 67 72 61 6d 73 2e 0a 2a 2f 0a 63 61   programs..*/.ca
20630 73 65 20 4f 50 5f 52 65 73 65 74 43 6f 75 6e 74  se OP_ResetCount
20640 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  : {.  sqlite3Vdb
20650 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
20660 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 70  p->nChange);.  p
20670 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
20680 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
20690 63 6f 64 65 3a 20 52 6f 77 44 61 74 61 20 50 31  code: RowData P1
206a0 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
206b0 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67 69 73  Write into regis
206c0 74 65 72 20 50 32 20 74 68 65 20 63 6f 6d 70 6c  ter P2 the compl
206d0 65 74 65 20 72 6f 77 20 64 61 74 61 20 66 6f 72  ete row data for
206e0 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 20 54   cursor P1..** T
206f0 68 65 72 65 20 69 73 20 6e 6f 20 69 6e 74 65 72  here is no inter
20700 70 72 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  pretation of the
20710 20 64 61 74 61 2e 20 20 0a 2a 2a 20 49 74 20 69   data.  .** It i
20720 73 20 6a 75 73 74 20 63 6f 70 69 65 64 20 6f 6e  s just copied on
20730 74 6f 20 74 68 65 20 50 32 20 72 65 67 69 73 74  to the P2 regist
20740 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 0a 2a  er exactly as .*
20750 2a 20 69 74 20 69 73 20 66 6f 75 6e 64 20 69 6e  * it is found in
20760 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20770 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
20780 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73 74 20   P1 cursor must 
20790 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  be pointing to a
207a0 20 76 61 6c 69 64 20 72 6f 77 20 28 6e 6f 74 20   valid row (not 
207b0 61 20 4e 55 4c 4c 20 72 6f 77 29 0a 2a 2a 20 6f  a NULL row).** o
207c0 66 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2c 20  f a real table, 
207d0 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d 74 61 62  not a pseudo-tab
207e0 6c 65 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  le..*/./* Opcode
207f0 3a 20 52 6f 77 4b 65 79 20 50 31 20 50 32 20 2a  : RowKey P1 P2 *
20800 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65   * *.**.** Write
20810 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
20820 32 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72  2 the complete r
20830 6f 77 20 6b 65 79 20 66 6f 72 20 63 75 72 73 6f  ow key for curso
20840 72 20 50 31 2e 0a 2a 2a 20 54 68 65 72 65 20 69  r P1..** There i
20850 73 20 6e 6f 20 69 6e 74 65 72 70 72 65 74 61 74  s no interpretat
20860 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 2e  ion of the data.
20870 20 20 0a 2a 2a 20 54 68 65 20 6b 65 79 20 69 73    .** The key is
20880 20 63 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68 65   copied onto the
20890 20 50 33 20 72 65 67 69 73 74 65 72 20 65 78 61   P3 register exa
208a0 63 74 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20 69  ctly as .** it i
208b0 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64  s found in the d
208c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
208d0 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 63 75  .** If the P1 cu
208e0 72 73 6f 72 20 6d 75 73 74 20 62 65 20 70 6f 69  rsor must be poi
208f0 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64  nting to a valid
20900 20 72 6f 77 20 28 6e 6f 74 20 61 20 4e 55 4c 4c   row (not a NULL
20910 20 72 6f 77 29 0a 2a 2a 20 6f 66 20 61 20 72 65   row).** of a re
20920 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  al table, not a 
20930 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f  pseudo-table..*/
20940 0a 63 61 73 65 20 4f 50 5f 52 6f 77 4b 65 79 3a  .case OP_RowKey:
20950 0a 63 61 73 65 20 4f 50 5f 52 6f 77 44 61 74 61  .case OP_RowData
20960 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
20970 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
20980 20 2a 70 43 72 73 72 3b 0a 20 20 75 33 32 20 6e   *pCrsr;.  u32 n
20990 3b 0a 20 20 69 36 34 20 6e 36 34 3b 0a 0a 20 20  ;.  i64 n64;..  
209a0 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
209b0 2d 3e 70 32 5d 3b 0a 0a 20 20 2f 2a 20 4e 6f 74  ->p2];..  /* Not
209c0 65 20 74 68 61 74 20 52 6f 77 4b 65 79 20 61 6e  e that RowKey an
209d0 64 20 52 6f 77 44 61 74 61 20 61 72 65 20 72 65  d RowData are re
209e0 61 6c 6c 79 20 65 78 61 63 74 6c 79 20 74 68 65  ally exactly the
209f0 20 73 61 6d 65 20 69 6e 73 74 72 75 63 74 69 6f   same instructio
20a00 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  n */.  assert( p
20a10 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
20a20 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
20a30 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
20a40 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
20a50 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62  ssert( pC->isTab
20a60 6c 65 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64  le || pOp->opcod
20a70 65 3d 3d 4f 50 5f 52 6f 77 4b 65 79 20 29 3b 0a  e==OP_RowKey );.
20a80 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73    assert( pC->is
20a90 49 6e 64 65 78 20 7c 7c 20 70 4f 70 2d 3e 6f 70  Index || pOp->op
20aa0 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 44 61 74 61  code==OP_RowData
20ab0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
20ac0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
20ad0 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 3d 3d 30 20   pC->nullRow==0 
20ae0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
20af0 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67 3d  >pseudoTableReg=
20b00 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
20b10 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29  pC->pCursor!=0 )
20b20 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e  ;.  pCrsr = pC->
20b30 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72  pCursor;.  asser
20b40 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
20b50 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 72  ursorIsValid(pCr
20b60 73 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  sr) );..  /* The
20b70 20 4f 50 5f 52 6f 77 4b 65 79 20 61 6e 64 20 4f   OP_RowKey and O
20b80 50 5f 52 6f 77 44 61 74 61 20 6f 70 63 6f 64 65  P_RowData opcode
20b90 73 20 61 6c 77 61 79 73 20 66 6f 6c 6c 6f 77 20  s always follow 
20ba0 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f 72 0a  OP_NotExists or.
20bb0 20 20 2a 2a 20 4f 50 5f 52 65 77 69 6e 64 2f 4f    ** OP_Rewind/O
20bc0 70 5f 4e 65 78 74 20 77 69 74 68 20 6e 6f 20 69  p_Next with no i
20bd0 6e 74 65 72 76 65 6e 69 6e 67 20 69 6e 73 74 72  ntervening instr
20be0 75 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67  uctions that mig
20bf0 68 74 20 69 6e 76 61 6c 69 64 61 74 65 0a 20 20  ht invalidate.  
20c00 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  ** the cursor.  
20c10 48 65 6e 63 65 20 74 68 65 20 66 6f 6c 6c 6f 77  Hence the follow
20c20 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 43  ing sqlite3VdbeC
20c30 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29 20 63 61  ursorMoveto() ca
20c40 6c 6c 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a  ll is always.  *
20c50 2a 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 63 61  * a no-op and ca
20c60 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 20 42  n never fail.  B
20c70 75 74 20 77 65 20 6c 65 61 76 65 20 69 74 20 69  ut we leave it i
20c80 6e 20 70 6c 61 63 65 20 61 73 20 61 20 73 61 66  n place as a saf
20c90 65 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ety..  */.  asse
20ca0 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64  rt( pC->deferred
20cb0 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 72  Moveto==0 );.  r
20cc0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
20cd0 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b  ursorMoveto(pC);
20ce0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 72 63 21  .  if( NEVER(rc!
20cf0 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 20 67 6f  =SQLITE_OK) ) go
20d00 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
20d10 65 72 72 6f 72 3b 0a 0a 20 20 69 66 28 20 70 43  error;..  if( pC
20d20 2d 3e 69 73 49 6e 64 65 78 20 29 7b 0a 20 20 20  ->isIndex ){.   
20d30 20 61 73 73 65 72 74 28 20 21 70 43 2d 3e 69 73   assert( !pC->is
20d40 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20  Table );.    rc 
20d50 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
20d60 79 53 69 7a 65 28 70 43 72 73 72 2c 20 26 6e 36  ySize(pCrsr, &n6
20d70 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  4);.    assert( 
20d80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
20d90 20 20 20 20 2f 2a 20 54 72 75 65 20 62 65 63 61      /* True beca
20da0 75 73 65 20 6f 66 20 43 75 72 73 6f 72 4d 6f 76  use of CursorMov
20db0 65 74 6f 28 29 20 63 61 6c 6c 20 61 62 6f 76 65  eto() call above
20dc0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 36 34 3e   */.    if( n64>
20dd0 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
20de0 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20  E_LIMIT_LENGTH] 
20df0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 6f  ){.      goto to
20e00 6f 5f 62 69 67 3b 0a 20 20 20 20 7d 0a 20 20 20  o_big;.    }.   
20e10 20 6e 20 3d 20 28 75 33 32 29 6e 36 34 3b 0a 20   n = (u32)n64;. 
20e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
20e30 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
20e40 61 53 69 7a 65 28 70 43 72 73 72 2c 20 26 6e 29  aSize(pCrsr, &n)
20e50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
20e60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
20e70 20 20 2f 2a 20 44 61 74 61 53 69 7a 65 28 29 20    /* DataSize() 
20e80 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20  cannot fail */. 
20e90 20 20 20 69 66 28 20 6e 3e 28 75 33 32 29 64 62     if( n>(u32)db
20ea0 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
20eb0 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b  LIMIT_LENGTH] ){
20ec0 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f  .      goto too_
20ed0 62 69 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  big;.    }.  }. 
20ee0 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
20ef0 4d 65 6d 47 72 6f 77 28 70 4f 75 74 2c 20 6e 2c  MemGrow(pOut, n,
20f00 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   0) ){.    goto 
20f10 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 70 4f  no_mem;.  }.  pO
20f20 75 74 2d 3e 6e 20 3d 20 6e 3b 0a 20 20 4d 65 6d  ut->n = n;.  Mem
20f30 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
20f40 2c 20 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 20 20 69  , MEM_Blob);.  i
20f50 66 28 20 70 43 2d 3e 69 73 49 6e 64 65 78 20 29  f( pC->isIndex )
20f60 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
20f70 65 33 42 74 72 65 65 4b 65 79 28 70 43 72 73 72  e3BtreeKey(pCrsr
20f80 2c 20 30 2c 20 6e 2c 20 70 4f 75 74 2d 3e 7a 29  , 0, n, pOut->z)
20f90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
20fa0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
20fb0 44 61 74 61 28 70 43 72 73 72 2c 20 30 2c 20 6e  Data(pCrsr, 0, n
20fc0 2c 20 70 4f 75 74 2d 3e 7a 29 3b 0a 20 20 7d 0a  , pOut->z);.  }.
20fd0 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 53 51    pOut->enc = SQ
20fe0 4c 49 54 45 5f 55 54 46 38 3b 20 20 2f 2a 20 49  LITE_UTF8;  /* I
20ff0 6e 20 63 61 73 65 20 74 68 65 20 62 6c 6f 62 20  n case the blob 
21000 69 73 20 65 76 65 72 20 63 61 73 74 20 74 6f 20  is ever cast to 
21010 74 65 78 74 20 2a 2f 0a 20 20 55 50 44 41 54 45  text */.  UPDATE
21020 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f  _MAX_BLOBSIZE(pO
21030 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
21040 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 69  ./* Opcode: Rowi
21050 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  d P1 P2 * * *.**
21060 0a 2a 2a 20 53 74 6f 72 65 20 69 6e 20 72 65 67  .** Store in reg
21070 69 73 74 65 72 20 50 32 20 61 6e 20 69 6e 74 65  ister P2 an inte
21080 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
21090 20 6b 65 79 20 6f 66 20 74 68 65 20 74 61 62 6c   key of the tabl
210a0 65 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  e entry that.** 
210b0 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  P1 is currently 
210c0 70 6f 69 6e 74 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20  point to..**.** 
210d0 50 31 20 63 61 6e 20 62 65 20 65 69 74 68 65 72  P1 can be either
210e0 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   an ordinary tab
210f0 6c 65 20 6f 72 20 61 20 76 69 72 74 75 61 6c 20  le or a virtual 
21100 74 61 62 6c 65 2e 20 20 54 68 65 72 65 20 75 73  table.  There us
21110 65 64 20 74 6f 0a 2a 2a 20 62 65 20 61 20 73 65  ed to.** be a se
21120 70 61 72 61 74 65 20 4f 50 5f 56 52 6f 77 69 64  parate OP_VRowid
21130 20 6f 70 63 6f 64 65 20 66 6f 72 20 75 73 65 20   opcode for use 
21140 77 69 74 68 20 76 69 72 74 75 61 6c 20 74 61 62  with virtual tab
21150 6c 65 73 2c 20 62 75 74 20 74 68 69 73 0a 2a 2a  les, but this.**
21160 20 6f 6e 65 20 6f 70 63 6f 64 65 20 6e 6f 77 20   one opcode now 
21170 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 74  works for both t
21180 61 62 6c 65 20 74 79 70 65 73 2e 0a 2a 2f 0a 63  able types..*/.c
21190 61 73 65 20 4f 50 5f 52 6f 77 69 64 3a 20 7b 20  ase OP_Rowid: { 
211a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211b0 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61  /* out2-prerelea
211c0 73 65 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  se */.  VdbeCurs
211d0 6f 72 20 2a 70 43 3b 0a 20 20 69 36 34 20 76 3b  or *pC;.  i64 v;
211e0 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
211f0 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20  *pVtab;.  const 
21200 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
21210 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 61 73 73 65  pModule;..  asse
21220 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
21230 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
21240 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
21250 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
21260 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
21270 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
21280 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65  C->pseudoTableRe
21290 67 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  g==0 );.  if( pC
212a0 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20  ->nullRow ){.   
212b0 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
212c0 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 62 72 65  EM_Null;.    bre
212d0 61 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ak;.  }else if( 
212e0 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
212f0 74 6f 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 43  to ){.    v = pC
21300 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b 0a  ->movetoTarget;.
21310 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21320 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
21330 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 2d  .  }else if( pC-
21340 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a  >pVtabCursor ){.
21350 20 20 20 20 70 56 74 61 62 20 3d 20 70 43 2d 3e      pVtab = pC->
21360 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
21370 61 62 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 20  ab;.    pModule 
21380 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  = pVtab->pModule
21390 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ;.    assert( pM
213a0 6f 64 75 6c 65 2d 3e 78 52 6f 77 69 64 20 29 3b  odule->xRowid );
213b0 0a 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c  .    rc = pModul
213c0 65 2d 3e 78 52 6f 77 69 64 28 70 43 2d 3e 70 56  e->xRowid(pC->pV
213d0 74 61 62 43 75 72 73 6f 72 2c 20 26 76 29 3b 0a  tabCursor, &v);.
213e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
213f0 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
21400 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
21410 67 20 3d 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  g = pVtab->zErrM
21420 73 67 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a  sg;.    pVtab->z
21430 45 72 72 4d 73 67 20 3d 20 30 3b 0a 23 65 6e 64  ErrMsg = 0;.#end
21440 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
21450 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
21460 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  /.  }else{.    a
21470 73 73 65 72 74 28 20 70 43 2d 3e 70 43 75 72 73  ssert( pC->pCurs
21480 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  or!=0 );.    rc 
21490 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
214a0 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20  sorMoveto(pC);. 
214b0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
214c0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
214d0 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 43 2d  ror;.    if( pC-
214e0 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 29 7b  >rowidIsValid ){
214f0 0a 20 20 20 20 20 20 76 20 3d 20 70 43 2d 3e 6c  .      v = pC->l
21500 61 73 74 52 6f 77 69 64 3b 0a 20 20 20 20 7d 65  astRowid;.    }e
21510 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
21520 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
21530 69 7a 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c  ize(pC->pCursor,
21540 20 26 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65   &v);.      asse
21550 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
21560 4b 20 29 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20  K );  /* Always 
21570 73 6f 20 62 65 63 61 75 73 65 20 6f 66 20 43 75  so because of Cu
21580 72 73 6f 72 4d 6f 76 65 74 6f 28 29 20 61 62 6f  rsorMoveto() abo
21590 76 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  ve */.    }.  }.
215a0 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 3b    pOut->u.i = v;
215b0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
215c0 4f 70 63 6f 64 65 3a 20 4e 75 6c 6c 52 6f 77 20  Opcode: NullRow 
215d0 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  P1 * * * *.**.**
215e0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
215f0 20 50 31 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f   P1 to a null ro
21600 77 2e 20 20 41 6e 79 20 4f 50 5f 43 6f 6c 75 6d  w.  Any OP_Colum
21610 6e 20 6f 70 65 72 61 74 69 6f 6e 73 0a 2a 2a 20  n operations.** 
21620 74 68 61 74 20 6f 63 63 75 72 20 77 68 69 6c 65  that occur while
21630 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
21640 6e 20 74 68 65 20 6e 75 6c 6c 20 72 6f 77 20 77  n the null row w
21650 69 6c 6c 20 61 6c 77 61 79 73 0a 2a 2a 20 77 72  ill always.** wr
21660 69 74 65 20 61 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63  ite a NULL..*/.c
21670 61 73 65 20 4f 50 5f 4e 75 6c 6c 52 6f 77 3a 20  ase OP_NullRow: 
21680 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
21690 70 43 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  pC;..  assert( p
216a0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
216b0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
216c0 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
216d0 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
216e0 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
216f0 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20    pC->nullRow = 
21700 31 3b 0a 20 20 70 43 2d 3e 72 6f 77 69 64 49 73  1;.  pC->rowidIs
21710 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 69 66 28  Valid = 0;.  if(
21720 20 70 43 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a   pC->pCursor ){.
21730 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
21740 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 2d 3e  ClearCursor(pC->
21750 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20  pCursor);.  }.  
21760 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
21770 6f 64 65 3a 20 4c 61 73 74 20 50 31 20 50 32 20  ode: Last P1 P2 
21780 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  * * *.**.** The 
21790 6e 65 78 74 20 75 73 65 20 6f 66 20 74 68 65 20  next use of the 
217a0 52 6f 77 69 64 20 6f 72 20 43 6f 6c 75 6d 6e 20  Rowid or Column 
217b0 6f 72 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74  or Next instruct
217c0 69 6f 6e 20 66 6f 72 20 50 31 20 0a 2a 2a 20 77  ion for P1 .** w
217d0 69 6c 6c 20 72 65 66 65 72 20 74 6f 20 74 68 65  ill refer to the
217e0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
217f0 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  he database tabl
21800 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 49  e or index..** I
21810 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
21820 6e 64 65 78 20 69 73 20 65 6d 70 74 79 20 61 6e  ndex is empty an
21830 64 20 50 32 3e 30 2c 20 74 68 65 6e 20 6a 75 6d  d P2>0, then jum
21840 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
21850 20 50 32 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73   P2..** If P2 is
21860 20 30 20 6f 72 20 69 66 20 74 68 65 20 74 61 62   0 or if the tab
21870 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20 6e  le or index is n
21880 6f 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c 20 74  ot empty, fall t
21890 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65  hrough.** to the
218a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72   following instr
218b0 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  uction..*/.case 
218c0 4f 50 5f 4c 61 73 74 3a 20 7b 20 20 20 20 20 20  OP_Last: {      
218d0 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56    /* jump */.  V
218e0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
218f0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72   BtCursor *pCrsr
21900 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20  ;.  int res;..  
21910 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
21920 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
21930 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
21940 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
21950 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
21960 70 43 21 3d 30 20 29 3b 0a 20 20 70 43 72 73 72  pC!=0 );.  pCrsr
21970 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a   = pC->pCursor;.
21980 20 20 69 66 28 20 70 43 72 73 72 3d 3d 30 20 29    if( pCrsr==0 )
21990 7b 0a 20 20 20 20 72 65 73 20 3d 20 31 3b 0a 20  {.    res = 1;. 
219a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
219b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
219c0 74 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b 0a  t(pCrsr, &res);.
219d0 20 20 7d 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f    }.  pC->nullRo
219e0 77 20 3d 20 28 75 38 29 72 65 73 3b 0a 20 20 70  w = (u8)res;.  p
219f0 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
21a00 6f 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 72 6f 77  o = 0;.  pC->row
21a10 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20  idIsValid = 0;. 
21a20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
21a30 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
21a40 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 30 20    if( pOp->p2>0 
21a50 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 70 63  && res ){.    pc
21a60 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
21a70 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
21a80 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74  ./* Opcode: Sort
21a90 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
21aa0 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 64  ** This opcode d
21ab0 6f 65 73 20 65 78 61 63 74 6c 79 20 74 68 65 20  oes exactly the 
21ac0 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 4f 50  same thing as OP
21ad0 5f 52 65 77 69 6e 64 20 65 78 63 65 70 74 20 74  _Rewind except t
21ae0 68 61 74 0a 2a 2a 20 69 74 20 69 6e 63 72 65 6d  hat.** it increm
21af0 65 6e 74 73 20 61 6e 20 75 6e 64 6f 63 75 6d 65  ents an undocume
21b00 6e 74 65 64 20 67 6c 6f 62 61 6c 20 76 61 72 69  nted global vari
21b10 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 74 65  able used for te
21b20 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 53 6f 72  sting..**.** Sor
21b30 74 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69  ting is accompli
21b40 73 68 65 64 20 62 79 20 77 72 69 74 69 6e 67 20  shed by writing 
21b50 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 61 20 73  records into a s
21b60 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 0a 2a 2a  orting index,.**
21b70 20 74 68 65 6e 20 72 65 77 69 6e 64 69 6e 67 20   then rewinding 
21b80 74 68 61 74 20 69 6e 64 65 78 20 61 6e 64 20 70  that index and p
21b90 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 20 66  laying it back f
21ba0 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f  rom beginning to
21bb0 0a 2a 2a 20 65 6e 64 2e 20 20 57 65 20 75 73 65  .** end.  We use
21bc0 20 74 68 65 20 4f 50 5f 53 6f 72 74 20 6f 70 63   the OP_Sort opc
21bd0 6f 64 65 20 69 6e 73 74 65 61 64 20 6f 66 20 4f  ode instead of O
21be0 50 5f 52 65 77 69 6e 64 20 74 6f 20 64 6f 20 74  P_Rewind to do t
21bf0 68 65 0a 2a 2a 20 72 65 77 69 6e 64 69 6e 67 20  he.** rewinding 
21c00 73 6f 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62  so that the glob
21c10 61 6c 20 76 61 72 69 61 62 6c 65 20 77 69 6c 6c  al variable will
21c20 20 62 65 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   be incremented 
21c30 61 6e 64 0a 2a 2a 20 72 65 67 72 65 73 73 69 6f  and.** regressio
21c40 6e 20 74 65 73 74 73 20 63 61 6e 20 64 65 74 65  n tests can dete
21c50 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
21c60 20 6e 6f 74 20 74 68 65 20 6f 70 74 69 6d 69 7a   not the optimiz
21c70 65 72 20 69 73 0a 2a 2a 20 63 6f 72 72 65 63 74  er is.** correct
21c80 6c 79 20 6f 70 74 69 6d 69 7a 69 6e 67 20 6f 75  ly optimizing ou
21c90 74 20 73 6f 72 74 73 2e 0a 2a 2f 0a 63 61 73 65  t sorts..*/.case
21ca0 20 4f 50 5f 53 6f 72 74 3a 20 7b 20 20 20 20 20   OP_Sort: {     
21cb0 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 23 69     /* jump */.#i
21cc0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
21cd0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f  .  sqlite3_sort_
21ce0 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74  count++;.  sqlit
21cf0 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2d  e3_search_count-
21d00 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 61  -;.#endif.  p->a
21d10 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53  Counter[SQLITE_S
21d20 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2d 31  TMTSTATUS_SORT-1
21d30 5d 2b 2b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74  ]++;.  /* Fall t
21d40 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 52  hrough into OP_R
21d50 65 77 69 6e 64 20 2a 2f 0a 7d 0a 2f 2a 20 4f 70  ewind */.}./* Op
21d60 63 6f 64 65 3a 20 52 65 77 69 6e 64 20 50 31 20  code: Rewind P1 
21d70 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  P2 * * *.**.** T
21d80 68 65 20 6e 65 78 74 20 75 73 65 20 6f 66 20 74  he next use of t
21d90 68 65 20 52 6f 77 69 64 20 6f 72 20 43 6f 6c 75  he Rowid or Colu
21da0 6d 6e 20 6f 72 20 4e 65 78 74 20 69 6e 73 74 72  mn or Next instr
21db0 75 63 74 69 6f 6e 20 66 6f 72 20 50 31 20 0a 2a  uction for P1 .*
21dc0 2a 20 77 69 6c 6c 20 72 65 66 65 72 20 74 6f 20  * will refer to 
21dd0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
21de0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
21df0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a  table or index..
21e00 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  ** If the table 
21e10 6f 72 20 69 6e 64 65 78 20 69 73 20 65 6d 70 74  or index is empt
21e20 79 20 61 6e 64 20 50 32 3e 30 2c 20 74 68 65 6e  y and P2>0, then
21e30 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
21e40 79 20 74 6f 20 50 32 2e 0a 2a 2a 20 49 66 20 50  y to P2..** If P
21e50 32 20 69 73 20 30 20 6f 72 20 69 66 20 74 68 65  2 is 0 or if the
21e60 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
21e70 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61  is not empty, fa
21e80 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f  ll through.** to
21e90 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
21ea0 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  nstruction..*/.c
21eb0 61 73 65 20 4f 50 5f 52 65 77 69 6e 64 3a 20 7b  ase OP_Rewind: {
21ec0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
21ed0 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
21ee0 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  *pC;.  BtCursor 
21ef0 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65  *pCrsr;.  int re
21f00 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  s;..  assert( pO
21f10 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
21f20 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
21f30 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
21f40 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
21f50 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
21f60 20 69 66 28 20 28 70 43 72 73 72 20 3d 20 70 43   if( (pCrsr = pC
21f70 2d 3e 70 43 75 72 73 6f 72 29 21 3d 30 20 29 7b  ->pCursor)!=0 ){
21f80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21f90 33 42 74 72 65 65 46 69 72 73 74 28 70 43 72 73  3BtreeFirst(pCrs
21fa0 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 70 43  r, &res);.    pC
21fb0 2d 3e 61 74 46 69 72 73 74 20 3d 20 72 65 73 3d  ->atFirst = res=
21fc0 3d 30 20 3f 31 3a 30 3b 0a 20 20 20 20 70 43 2d  =0 ?1:0;.    pC-
21fd0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
21fe0 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63  = 0;.    pC->cac
21ff0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
22000 5f 53 54 41 4c 45 3b 0a 20 20 20 20 70 43 2d 3e  _STALE;.    pC->
22010 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30  rowidIsValid = 0
22020 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
22030 65 73 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 43  es = 1;.  }.  pC
22040 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29  ->nullRow = (u8)
22050 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70  res;.  assert( p
22060 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d  Op->p2>0 && pOp-
22070 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  >p2<p->nOp );.  
22080 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 70  if( res ){.    p
22090 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
220a0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
220b0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 78 74  ./* Opcode: Next
220c0 20 50 31 20 50 32 20 2a 20 2a 20 50 35 0a 2a 2a   P1 P2 * * P5.**
220d0 0a 2a 2a 20 41 64 76 61 6e 63 65 20 63 75 72 73  .** Advance curs
220e0 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 69 74  or P1 so that it
220f0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
22100 65 78 74 20 6b 65 79 2f 64 61 74 61 20 70 61 69  ext key/data pai
22110 72 20 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62 6c  r in its.** tabl
22120 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 49 66 20  e or index.  If 
22130 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
22140 65 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69 72  e key/value pair
22150 73 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  s then fall thro
22160 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f  ugh.** to the fo
22170 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74  llowing instruct
22180 69 6f 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65  ion.  But if the
22190 20 63 75 72 73 6f 72 20 61 64 76 61 6e 63 65 20   cursor advance 
221a0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 0a  was successful,.
221b0 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  ** jump immediat
221c0 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a  ely to P2..**.**
221d0 20 54 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d   The P1 cursor m
221e0 75 73 74 20 62 65 20 66 6f 72 20 61 20 72 65 61  ust be for a rea
221f0 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70  l table, not a p
22200 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a  seudo-table..**.
22210 2a 2a 20 49 66 20 50 35 20 69 73 20 70 6f 73 69  ** If P5 is posi
22220 74 69 76 65 20 61 6e 64 20 74 68 65 20 6a 75 6d  tive and the jum
22230 70 20 69 73 20 74 61 6b 65 6e 2c 20 74 68 65 6e  p is taken, then
22240 20 65 76 65 6e 74 20 63 6f 75 6e 74 65 72 0a 2a   event counter.*
22250 2a 20 6e 75 6d 62 65 72 20 50 35 2d 31 20 69 6e  * number P5-1 in
22260 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
22270 61 74 65 6d 65 6e 74 20 69 73 20 69 6e 63 72 65  atement is incre
22280 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  mented..**.** Se
22290 65 20 61 6c 73 6f 3a 20 50 72 65 76 0a 2a 2f 0a  e also: Prev.*/.
222a0 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 72 65 76 20  /* Opcode: Prev 
222b0 50 31 20 50 32 20 2a 20 2a 20 50 35 0a 2a 2a 0a  P1 P2 * * P5.**.
222c0 2a 2a 20 42 61 63 6b 20 75 70 20 63 75 72 73 6f  ** Back up curso
222d0 72 20 50 31 20 73 6f 20 74 68 61 74 20 69 74 20  r P1 so that it 
222e0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 70 72  points to the pr
222f0 65 76 69 6f 75 73 20 6b 65 79 2f 64 61 74 61 20  evious key/data 
22300 70 61 69 72 20 69 6e 20 69 74 73 0a 2a 2a 20 74  pair in its.** t
22310 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20 20  able or index.  
22320 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  If there is no p
22330 72 65 76 69 6f 75 73 20 6b 65 79 2f 76 61 6c 75  revious key/valu
22340 65 20 70 61 69 72 73 20 74 68 65 6e 20 66 61 6c  e pairs then fal
22350 6c 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20  l through.** to 
22360 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e  the following in
22370 73 74 72 75 63 74 69 6f 6e 2e 20 20 42 75 74 20  struction.  But 
22380 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 61  if the cursor ba
22390 63 6b 75 70 20 77 61 73 20 73 75 63 63 65 73 73  ckup was success
223a0 66 75 6c 2c 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d  ful,.** jump imm
223b0 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a  ediately to P2..
223c0 2a 2a 0a 2a 2a 20 54 68 65 20 50 31 20 63 75 72  **.** The P1 cur
223d0 73 6f 72 20 6d 75 73 74 20 62 65 20 66 6f 72 20  sor must be for 
223e0 61 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f  a real table, no
223f0 74 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  t a pseudo-table
22400 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73  ..**.** If P5 is
22410 20 70 6f 73 69 74 69 76 65 20 61 6e 64 20 74 68   positive and th
22420 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 2c  e jump is taken,
22430 20 74 68 65 6e 20 65 76 65 6e 74 20 63 6f 75 6e   then event coun
22440 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 35  ter.** number P5
22450 2d 31 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  -1 in the prepar
22460 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  ed statement is 
22470 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a  incremented..*/.
22480 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 20 20 20  case OP_Prev:   
22490 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
224a0 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 20  /.case OP_Next: 
224b0 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
224c0 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
224d0 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
224e0 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72   *pCrsr;.  int r
224f0 65 73 3b 0a 0a 20 20 43 48 45 43 4b 5f 46 4f 52  es;..  CHECK_FOR
22500 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 61 73  _INTERRUPT;.  as
22510 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
22520 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
22530 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65  Cursor );.  asse
22540 72 74 28 20 70 4f 70 2d 3e 70 35 3c 3d 41 72 72  rt( pOp->p5<=Arr
22550 61 79 53 69 7a 65 28 70 2d 3e 61 43 6f 75 6e 74  aySize(p->aCount
22560 65 72 29 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  er) );.  pC = p-
22570 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
22580 0a 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 0a  .  if( pC==0 ){.
22590 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 53      break;  /* S
225a0 65 65 20 74 69 63 6b 65 74 20 23 32 32 37 33 20  ee ticket #2273 
225b0 2a 2f 0a 20 20 7d 0a 20 20 70 43 72 73 72 20 3d  */.  }.  pCrsr =
225c0 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20   pC->pCursor;.  
225d0 69 66 28 20 70 43 72 73 72 3d 3d 30 20 29 7b 0a  if( pCrsr==0 ){.
225e0 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20      pC->nullRow 
225f0 3d 20 31 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  = 1;.    break;.
22600 20 20 7d 0a 20 20 72 65 73 20 3d 20 31 3b 0a 20    }.  res = 1;. 
22610 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66   assert( pC->def
22620 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29  erredMoveto==0 )
22630 3b 0a 20 20 72 63 20 3d 20 70 4f 70 2d 3e 6f 70  ;.  rc = pOp->op
22640 63 6f 64 65 3d 3d 4f 50 5f 4e 65 78 74 20 3f 20  code==OP_Next ? 
22650 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
22660 28 70 43 72 73 72 2c 20 26 72 65 73 29 20 3a 0a  (pCrsr, &res) :.
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
22690 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
226a0 75 73 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b  us(pCrsr, &res);
226b0 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d  .  pC->nullRow =
226c0 20 28 75 38 29 72 65 73 3b 0a 20 20 70 43 2d 3e   (u8)res;.  pC->
226d0 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
226e0 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28  CHE_STALE;.  if(
226f0 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 70   res==0 ){.    p
22700 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
22710 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35  .    if( pOp->p5
22720 20 29 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b 70   ) p->aCounter[p
22730 4f 70 2d 3e 70 35 2d 31 5d 2b 2b 3b 0a 23 69 66  Op->p5-1]++;.#if
22740 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
22750 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72      sqlite3_sear
22760 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
22770 69 66 0a 20 20 7d 0a 20 20 70 43 2d 3e 72 6f 77  if.  }.  pC->row
22780 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20  idIsValid = 0;. 
22790 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
227a0 63 6f 64 65 3a 20 49 64 78 49 6e 73 65 72 74 20  code: IdxInsert 
227b0 50 31 20 50 32 20 50 33 20 2a 20 50 35 0a 2a 2a  P1 P2 P3 * P5.**
227c0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 32 20  .** Register P2 
227d0 68 6f 6c 64 73 20 61 20 53 51 4c 20 69 6e 64 65  holds a SQL inde
227e0 78 20 6b 65 79 20 6d 61 64 65 20 75 73 69 6e 67  x key made using
227f0 20 74 68 65 0a 2a 2a 20 4d 61 6b 65 52 65 63 6f   the.** MakeReco
22800 72 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e  rd instructions.
22810 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 72    This opcode wr
22820 69 74 65 73 20 74 68 61 74 20 6b 65 79 0a 2a 2a  ites that key.**
22830 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 65 78 20   into the index 
22840 50 31 2e 20 20 44 61 74 61 20 66 6f 72 20 74 68  P1.  Data for th
22850 65 20 65 6e 74 72 79 20 69 73 20 6e 69 6c 2e 0a  e entry is nil..
22860 2a 2a 0a 2a 2a 20 50 33 20 69 73 20 61 20 66 6c  **.** P3 is a fl
22870 61 67 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  ag that provides
22880 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 62   a hint to the b
22890 2d 74 72 65 65 20 6c 61 79 65 72 20 74 68 61 74  -tree layer that
228a0 20 74 68 69 73 0a 2a 2a 20 69 6e 73 65 72 74 20   this.** insert 
228b0 69 73 20 6c 69 6b 65 6c 79 20 74 6f 20 62 65 20  is likely to be 
228c0 61 6e 20 61 70 70 65 6e 64 2e 0a 2a 2a 0a 2a 2a  an append..**.**
228d0 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   This instructio
228e0 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  n only works for
228f0 20 69 6e 64 69 63 65 73 2e 20 20 54 68 65 20 65   indices.  The e
22900 71 75 69 76 61 6c 65 6e 74 20 69 6e 73 74 72 75  quivalent instru
22910 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 61 62  ction.** for tab
22920 6c 65 73 20 69 73 20 4f 50 5f 49 6e 73 65 72 74  les is OP_Insert
22930 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78  ..*/.case OP_Idx
22940 49 6e 73 65 72 74 3a 20 7b 20 20 20 20 20 20 20  Insert: {       
22950 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56 64 62   /* in2 */.  Vdb
22960 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42  eCursor *pC;.  B
22970 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a  tCursor *pCrsr;.
22980 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 63 6f    int nKey;.  co
22990 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a  nst char *zKey;.
229a0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
229b0 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
229c0 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
229d0 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
229e0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
229f0 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70 49  t( pC!=0 );.  pI
22a00 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n2 = &aMem[pOp->
22a10 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p2];.  assert( p
22a20 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In2->flags & MEM
22a30 5f 42 6c 6f 62 20 29 3b 0a 20 20 70 43 72 73 72  _Blob );.  pCrsr
22a40 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a   = pC->pCursor;.
22a50 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 72    if( ALWAYS(pCr
22a60 73 72 21 3d 30 29 20 29 7b 0a 20 20 20 20 61 73  sr!=0) ){.    as
22a70 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c  sert( pC->isTabl
22a80 65 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  e==0 );.    rc =
22a90 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 32   ExpandBlob(pIn2
22aa0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
22ab0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22ac0 20 20 6e 4b 65 79 20 3d 20 70 49 6e 32 2d 3e 6e    nKey = pIn2->n
22ad0 3b 0a 20 20 20 20 20 20 7a 4b 65 79 20 3d 20 70  ;.      zKey = p
22ae0 49 6e 32 2d 3e 7a 3b 0a 20 20 20 20 20 20 72 63  In2->z;.      rc
22af0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
22b00 6e 73 65 72 74 28 70 43 72 73 72 2c 20 7a 4b 65  nsert(pCrsr, zKe
22b10 79 2c 20 6e 4b 65 79 2c 20 22 22 2c 20 30 2c 20  y, nKey, "", 0, 
22b20 30 2c 20 70 4f 70 2d 3e 70 33 2c 20 0a 20 20 20  0, pOp->p3, .   
22b30 20 20 20 20 20 20 20 28 28 70 4f 70 2d 3e 70 35         ((pOp->p5
22b40 20 26 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45   & OPFLAG_USESEE
22b50 4b 52 45 53 55 4c 54 29 20 3f 20 70 43 2d 3e 73  KRESULT) ? pC->s
22b60 65 65 6b 52 65 73 75 6c 74 20 3a 20 30 29 0a 20  eekResult : 0). 
22b70 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
22b80 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72  sert( pC->deferr
22b90 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20  edMoveto==0 );. 
22ba0 20 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74       pC->cacheSt
22bb0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
22bc0 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LE;.    }.  }.  
22bd0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
22be0 6f 64 65 3a 20 49 64 78 44 65 6c 65 74 65 20 50  ode: IdxDelete P
22bf0 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
22c00 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
22c10 20 50 33 20 72 65 67 69 73 74 65 72 73 20 73 74   P3 registers st
22c20 61 72 74 69 6e 67 20 61 74 20 72 65 67 69 73 74  arting at regist
22c30 65 72 20 50 32 20 66 6f 72 6d 0a 2a 2a 20 61 6e  er P2 form.** an
22c40 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
22c50 6b 65 79 2e 20 54 68 69 73 20 6f 70 63 6f 64 65  key. This opcode
22c60 20 72 65 6d 6f 76 65 73 20 74 68 61 74 20 65 6e   removes that en
22c70 74 72 79 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  try from the .**
22c80 20 69 6e 64 65 78 20 6f 70 65 6e 65 64 20 62 79   index opened by
22c90 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2f 0a 63   cursor P1..*/.c
22ca0 61 73 65 20 4f 50 5f 49 64 78 44 65 6c 65 74 65  ase OP_IdxDelete
22cb0 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
22cc0 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
22cd0 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72   *pCrsr;.  int r
22ce0 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  es;.  UnpackedRe
22cf0 63 6f 72 64 20 72 3b 0a 0a 20 20 61 73 73 65 72  cord r;..  asser
22d00 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a  t( pOp->p3>0 );.
22d10 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
22d20 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70  2>0 && pOp->p2+p
22d30 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 2b  Op->p3<=p->nMem+
22d40 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
22d50 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
22d60 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
22d70 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
22d80 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
22d90 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
22da0 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 70 43    pCrsr = pC->pC
22db0 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 41 4c 57  ursor;.  if( ALW
22dc0 41 59 53 28 70 43 72 73 72 21 3d 30 29 20 29 7b  AYS(pCrsr!=0) ){
22dd0 0a 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20  .    r.pKeyInfo 
22de0 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  = pC->pKeyInfo;.
22df0 20 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28      r.nField = (
22e00 75 31 36 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20  u16)pOp->p3;.   
22e10 20 72 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20   r.flags = 0;.  
22e20 20 20 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d    r.aMem = &aMem
22e30 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 72  [pOp->p2];.    r
22e40 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
22e50 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
22e60 43 72 73 72 2c 20 26 72 2c 20 30 2c 20 30 2c 20  Crsr, &r, 0, 0, 
22e70 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72  &res);.    if( r
22e80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
22e90 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
22ea0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
22eb0 65 44 65 6c 65 74 65 28 70 43 72 73 72 29 3b 0a  eDelete(pCrsr);.
22ec0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
22ed0 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f  ( pC->deferredMo
22ee0 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70  veto==0 );.    p
22ef0 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  C->cacheStatus =
22f00 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
22f10 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
22f20 20 4f 70 63 6f 64 65 3a 20 49 64 78 52 6f 77 69   Opcode: IdxRowi
22f30 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  d P1 P2 * * *.**
22f40 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 72  .** Write into r
22f50 65 67 69 73 74 65 72 20 50 32 20 61 6e 20 69 6e  egister P2 an in
22f60 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
22f70 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
22f80 20 74 68 65 20 72 65 63 6f 72 64 20 61 74 0a 2a   the record at.*
22f90 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
22fa0 20 69 6e 64 65 78 20 6b 65 79 20 70 6f 69 6e 74   index key point
22fb0 65 64 20 74 6f 20 62 79 20 63 75 72 73 6f 72 20  ed to by cursor 
22fc0 50 31 2e 20 20 54 68 69 73 20 69 6e 74 65 67 65  P1.  This intege
22fd0 72 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 74  r should be.** t
22fe0 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
22ff0 74 61 62 6c 65 20 65 6e 74 72 79 20 74 6f 20 77  table entry to w
23000 68 69 63 68 20 74 68 69 73 20 69 6e 64 65 78 20  hich this index 
23010 65 6e 74 72 79 20 70 6f 69 6e 74 73 2e 0a 2a 2a  entry points..**
23020 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 52 6f  .** See also: Ro
23030 77 69 64 2c 20 4d 61 6b 65 52 65 63 6f 72 64 2e  wid, MakeRecord.
23040 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 52  .*/.case OP_IdxR
23050 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20 20 20  owid: {         
23060 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65       /* out2-pre
23070 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 42 74 43  release */.  BtC
23080 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20  ursor *pCrsr;.  
23090 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
230a0 20 20 69 36 34 20 72 6f 77 69 64 3b 0a 0a 20 20    i64 rowid;..  
230b0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
230c0 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
230d0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
230e0 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
230f0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
23100 70 43 21 3d 30 20 29 3b 0a 20 20 70 43 72 73 72  pC!=0 );.  pCrsr
23110 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a   = pC->pCursor;.
23120 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
23130 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 69 66 28 20  MEM_Null;.  if( 
23140 41 4c 57 41 59 53 28 70 43 72 73 72 21 3d 30 29  ALWAYS(pCrsr!=0)
23150 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
23160 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
23170 76 65 74 6f 28 70 43 29 3b 0a 20 20 20 20 69 66  veto(pC);.    if
23180 28 20 4e 45 56 45 52 28 72 63 29 20 29 20 67 6f  ( NEVER(rc) ) go
23190 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
231a0 65 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72  error;.    asser
231b0 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d  t( pC->deferredM
231c0 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 20 20  oveto==0 );.    
231d0 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61  assert( pC->isTa
231e0 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ble==0 );.    if
231f0 28 20 21 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29  ( !pC->nullRow )
23200 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
23210 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
23220 28 64 62 2c 20 70 43 72 73 72 2c 20 26 72 6f 77  (db, pCrsr, &row
23230 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  id);.      if( r
23240 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23250 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f          goto abo
23260 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
23270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
23280 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 6f 77 69 64  Out->u.i = rowid
23290 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 66 6c  ;.      pOut->fl
232a0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
232b0 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
232c0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
232d0 49 64 78 47 45 20 50 31 20 50 32 20 50 33 20 50  IdxGE P1 P2 P3 P
232e0 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  4 P5.**.** The P
232f0 34 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65  4 register value
23300 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  s beginning with
23310 20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61   P3 form an unpa
23320 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b  cked index .** k
23330 65 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68  ey that omits th
23340 65 20 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72  e ROWID.  Compar
23350 65 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65  e this key value
23360 20 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64   against the ind
23370 65 78 20 0a 2a 2a 20 74 68 61 74 20 50 31 20 69  ex .** that P1 i
23380 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
23390 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e  ting to, ignorin
233a0 67 20 74 68 65 20 52 4f 57 49 44 20 6f 6e 20 74  g the ROWID on t
233b0 68 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a 0a  he P1 index..**.
233c0 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e 64  ** If the P1 ind
233d0 65 78 20 65 6e 74 72 79 20 69 73 20 67 72 65 61  ex entry is grea
233e0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
233f0 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c  l to the key val
23400 75 65 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d 70 20  ue.** then jump 
23410 74 6f 20 50 32 2e 20 20 4f 74 68 65 72 77 69 73  to P2.  Otherwis
23420 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  e fall through t
23430 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
23440 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  uction..**.** If
23450 20 50 35 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20   P5 is non-zero 
23460 74 68 65 6e 20 74 68 65 20 6b 65 79 20 76 61 6c  then the key val
23470 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20  ue is increased 
23480 62 79 20 61 6e 20 65 70 73 69 6c 6f 6e 20 0a 2a  by an epsilon .*
23490 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63  * prior to the c
234a0 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 69 73  omparison.  This
234b0 20 6d 61 6b 65 20 74 68 65 20 6f 70 63 6f 64 65   make the opcode
234c0 20 77 6f 72 6b 20 6c 69 6b 65 20 49 64 78 47 54   work like IdxGT
234d0 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20   except.** that 
234e0 69 66 20 74 68 65 20 6b 65 79 20 66 72 6f 6d 20  if the key from 
234f0 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20 61  register P3 is a
23500 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6b   prefix of the k
23510 65 79 20 69 6e 20 74 68 65 20 63 75 72 73 6f 72  ey in the cursor
23520 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  ,.** the result 
23530 69 73 20 66 61 6c 73 65 20 77 68 65 72 65 61 73  is false whereas
23540 20 69 74 20 77 6f 75 6c 64 20 62 65 20 74 72 75   it would be tru
23550 65 20 77 69 74 68 20 49 64 78 47 54 2e 0a 2a 2f  e with IdxGT..*/
23560 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 4c  ./* Opcode: IdxL
23570 54 20 50 31 20 50 32 20 50 33 20 2a 20 50 35 0a  T P1 P2 P3 * P5.
23580 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 72 65 67  **.** The P4 reg
23590 69 73 74 65 72 20 76 61 6c 75 65 73 20 62 65 67  ister values beg
235a0 69 6e 6e 69 6e 67 20 77 69 74 68 20 50 33 20 66  inning with P3 f
235b0 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 20  orm an unpacked 
235c0 69 6e 64 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68  index .** key th
235d0 61 74 20 6f 6d 69 74 73 20 74 68 65 20 52 4f 57  at omits the ROW
235e0 49 44 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 69  ID.  Compare thi
235f0 73 20 6b 65 79 20 76 61 6c 75 65 20 61 67 61 69  s key value agai
23600 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20 0a 2a  nst the index .*
23610 2a 20 74 68 61 74 20 50 31 20 69 73 20 63 75 72  * that P1 is cur
23620 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
23630 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74 68 65  to, ignoring the
23640 20 52 4f 57 49 44 20 6f 6e 20 74 68 65 20 50 31   ROWID on the P1
23650 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66   index..**.** If
23660 20 74 68 65 20 50 31 20 69 6e 64 65 78 20 65 6e   the P1 index en
23670 74 72 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e  try is less than
23680 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 74   the key value t
23690 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a  hen jump to P2..
236a0 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  ** Otherwise fal
236b0 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
236c0 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
236d0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69  n..**.** If P5 i
236e0 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20  s non-zero then 
236f0 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 69 73  the key value is
23700 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 61 6e   increased by an
23710 20 65 70 73 69 6c 6f 6e 20 70 72 69 6f 72 20 0a   epsilon prior .
23720 2a 2a 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72  ** to the compar
23730 69 73 6f 6e 2e 20 20 54 68 69 73 20 6d 61 6b 65  ison.  This make
23740 73 20 74 68 65 20 6f 70 63 6f 64 65 20 77 6f 72  s the opcode wor
23750 6b 20 6c 69 6b 65 20 49 64 78 4c 45 2e 0a 2a 2f  k like IdxLE..*/
23760 0a 63 61 73 65 20 4f 50 5f 49 64 78 4c 54 3a 20  .case OP_IdxLT: 
23770 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
23780 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 47   */.case OP_IdxG
23790 45 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a  E: {        /* j
237a0 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ump */.  VdbeCur
237b0 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e 74 20 72  sor *pC;.  int r
237c0 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  es;.  UnpackedRe
237d0 63 6f 72 64 20 72 3b 0a 0a 20 20 61 73 73 65 72  cord r;..  asser
237e0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
237f0 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
23800 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
23810 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
23820 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
23830 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
23840 28 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 29  (pC->pCursor!=0)
23850 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
23860 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
23870 74 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  to==0 );.    ass
23880 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20  ert( pOp->p5==0 
23890 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b  || pOp->p5==1 );
238a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
238b0 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54  ->p4type==P4_INT
238c0 33 32 20 29 3b 0a 20 20 20 20 72 2e 70 4b 65 79  32 );.    r.pKey
238d0 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49  Info = pC->pKeyI
238e0 6e 66 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65 6c  nfo;.    r.nFiel
238f0 64 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 34  d = (u16)pOp->p4
23900 2e 69 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  .i;.    if( pOp-
23910 3e 70 35 20 29 7b 0a 20 20 20 20 20 20 72 2e 66  >p5 ){.      r.f
23920 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f  lags = UNPACKED_
23930 49 4e 43 52 4b 45 59 20 7c 20 55 4e 50 41 43 4b  INCRKEY | UNPACK
23940 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 3b  ED_IGNORE_ROWID;
23950 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23960 20 20 72 2e 66 6c 61 67 73 20 3d 20 55 4e 50 41    r.flags = UNPA
23970 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49  CKED_IGNORE_ROWI
23980 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 2e 61  D;.    }.    r.a
23990 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Mem = &aMem[pOp-
239a0 3e 70 33 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73  >p3];.    rc = s
239b0 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
239c0 43 6f 6d 70 61 72 65 28 70 43 2c 20 26 72 2c 20  Compare(pC, &r, 
239d0 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 70  &res);.    if( p
239e0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
239f0 64 78 4c 54 20 29 7b 0a 20 20 20 20 20 20 72 65  dxLT ){.      re
23a00 73 20 3d 20 2d 72 65 73 3b 0a 20 20 20 20 7d 65  s = -res;.    }e
23a10 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
23a20 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  t( pOp->opcode==
23a30 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20  OP_IdxGE );.    
23a40 20 20 72 65 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20    res++;.    }. 
23a50 20 20 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a     if( res>0 ){.
23a60 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e        pc = pOp->
23a70 70 32 20 2d 20 31 20 3b 0a 20 20 20 20 7d 0a 20  p2 - 1 ;.    }. 
23a80 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
23a90 2a 20 4f 70 63 6f 64 65 3a 20 44 65 73 74 72 6f  * Opcode: Destro
23aa0 79 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  y P1 P2 P3 * *.*
23ab0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
23ac0 6e 74 69 72 65 20 64 61 74 61 62 61 73 65 20 74  ntire database t
23ad0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68  able or index wh
23ae0 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ose root page in
23af0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
23b00 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
23b10 79 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  y P1..**.** The 
23b20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 65 73 74  table being dest
23b30 72 6f 79 65 64 20 69 73 20 69 6e 20 74 68 65 20  royed is in the 
23b40 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
23b50 6c 65 20 69 66 20 50 33 3d 3d 30 2e 20 20 49 66  le if P3==0.  If
23b60 0a 2a 2a 20 50 33 3d 3d 31 20 74 68 65 6e 20 74  .** P3==1 then t
23b70 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 63  he table to be c
23b80 6c 65 61 72 20 69 73 20 69 6e 20 74 68 65 20 61  lear is in the a
23b90 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
23ba0 65 20 66 69 6c 65 0a 2a 2a 20 74 68 61 74 20 69  e file.** that i
23bb0 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
23bc0 74 61 62 6c 65 73 20 63 72 65 61 74 65 20 75 73  tables create us
23bd0 69 6e 67 20 43 52 45 41 54 45 20 54 45 4d 50 4f  ing CREATE TEMPO
23be0 52 41 52 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  RARY TABLE..**.*
23bf0 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20  * If AUTOVACUUM 
23c00 69 73 20 65 6e 61 62 6c 65 64 20 74 68 65 6e 20  is enabled then 
23c10 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
23c20 68 61 74 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74  hat another root
23c30 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62   page.** might b
23c40 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65  e moved into the
23c50 20 6e 65 77 6c 79 20 64 65 6c 65 74 65 64 20 72   newly deleted r
23c60 6f 6f 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65  oot page in orde
23c70 72 20 74 6f 20 6b 65 65 70 20 61 6c 6c 0a 2a 2a  r to keep all.**
23c80 20 72 6f 6f 74 20 70 61 67 65 73 20 63 6f 6e 74   root pages cont
23c90 69 67 75 6f 75 73 20 61 74 20 74 68 65 20 62 65  iguous at the be
23ca0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  ginning of the d
23cb0 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 66 6f  atabase.  The fo
23cc0 72 6d 65 72 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  rmer.** value of
23cd0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 74   the root page t
23ce0 68 61 74 20 6d 6f 76 65 64 20 2d 20 69 74 73 20  hat moved - its 
23cf0 76 61 6c 75 65 20 62 65 66 6f 72 65 20 74 68 65  value before the
23d00 20 6d 6f 76 65 20 6f 63 63 75 72 72 65 64 20 2d   move occurred -
23d10 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
23d20 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 20 49   register P2.  I
23d30 66 20 6e 6f 20 70 61 67 65 20 0a 2a 2a 20 6d 6f  f no page .** mo
23d40 76 65 6d 65 6e 74 20 77 61 73 20 72 65 71 75 69  vement was requi
23d50 72 65 64 20 28 62 65 63 61 75 73 65 20 74 68 65  red (because the
23d60 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
23d70 70 70 65 64 20 77 61 73 20 61 6c 72 65 61 64 79  pped was already
23d80 20 0a 2a 2a 20 74 68 65 20 6c 61 73 74 20 6f 6e   .** the last on
23d90 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
23da0 65 29 20 74 68 65 6e 20 61 20 7a 65 72 6f 20 69  e) then a zero i
23db0 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
23dc0 73 74 65 72 20 50 32 2e 0a 2a 2a 20 49 66 20 41  ster P2..** If A
23dd0 55 54 4f 56 41 43 55 55 4d 20 69 73 20 64 69 73  UTOVACUUM is dis
23de0 61 62 6c 65 64 20 74 68 65 6e 20 61 20 7a 65 72  abled then a zer
23df0 6f 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72  o is stored in r
23e00 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
23e10 2a 20 53 65 65 20 61 6c 73 6f 3a 20 43 6c 65 61  * See also: Clea
23e20 72 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65 73  r.*/.case OP_Des
23e30 74 72 6f 79 3a 20 7b 20 20 20 20 20 2f 2a 20 6f  troy: {     /* o
23e40 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a  ut2-prerelease *
23e50 2f 0a 20 20 69 6e 74 20 69 4d 6f 76 65 64 3b 0a  /.  int iMoved;.
23e60 20 20 69 6e 74 20 69 43 6e 74 3b 0a 20 20 56 64    int iCnt;.  Vd
23e70 62 65 20 2a 70 56 64 62 65 3b 0a 20 20 69 6e 74  be *pVdbe;.  int
23e80 20 69 44 62 3b 0a 23 69 66 6e 64 65 66 20 53 51   iDb;.#ifndef SQ
23e90 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
23ea0 4c 54 41 42 4c 45 0a 20 20 69 43 6e 74 20 3d 20  LTABLE.  iCnt = 
23eb0 30 3b 0a 20 20 66 6f 72 28 70 56 64 62 65 3d 64  0;.  for(pVdbe=d
23ec0 62 2d 3e 70 56 64 62 65 3b 20 70 56 64 62 65 3b  b->pVdbe; pVdbe;
23ed0 20 70 56 64 62 65 20 3d 20 70 56 64 62 65 2d 3e   pVdbe = pVdbe->
23ee0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
23ef0 70 56 64 62 65 2d 3e 6d 61 67 69 63 3d 3d 56 44  pVdbe->magic==VD
23f00 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20  BE_MAGIC_RUN && 
23f10 70 56 64 62 65 2d 3e 69 6e 56 74 61 62 4d 65 74  pVdbe->inVtabMet
23f20 68 6f 64 3c 32 20 26 26 20 70 56 64 62 65 2d 3e  hod<2 && pVdbe->
23f30 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  pc>=0 ){.      i
23f40 43 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Cnt++;.    }.  }
23f50 0a 23 65 6c 73 65 0a 20 20 69 43 6e 74 20 3d 20  .#else.  iCnt = 
23f60 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
23f70 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4f 75 74  t;.#endif.  pOut
23f80 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
23f90 6c 6c 3b 0a 20 20 69 66 28 20 69 43 6e 74 3e 31  ll;.  if( iCnt>1
23fa0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
23fb0 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  ITE_LOCKED;.    
23fc0 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
23fd0 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 7d 65 6c   OE_Abort;.  }el
23fe0 73 65 7b 0a 20 20 20 20 69 44 62 20 3d 20 70 4f  se{.    iDb = pO
23ff0 70 2d 3e 70 33 3b 0a 20 20 20 20 61 73 73 65 72  p->p3;.    asser
24000 74 28 20 69 43 6e 74 3d 3d 31 20 29 3b 0a 20 20  t( iCnt==1 );.  
24010 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74    assert( (p->bt
24020 72 65 65 4d 61 73 6b 20 26 20 28 31 3c 3c 69 44  reeMask & (1<<iD
24030 62 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 72 63  b))!=0 );.    rc
24040 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44   = sqlite3BtreeD
24050 72 6f 70 54 61 62 6c 65 28 64 62 2d 3e 61 44 62  ropTable(db->aDb
24060 5b 69 44 62 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e  [iDb].pBt, pOp->
24070 70 31 2c 20 26 69 4d 6f 76 65 64 29 3b 0a 20 20  p1, &iMoved);.  
24080 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
24090 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4f 75  MEM_Int;.    pOu
240a0 74 2d 3e 75 2e 69 20 3d 20 69 4d 6f 76 65 64 3b  t->u.i = iMoved;
240b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
240c0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
240d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
240e0 54 45 5f 4f 4b 20 26 26 20 69 4d 6f 76 65 64 21  TE_OK && iMoved!
240f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
24100 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64  te3RootPageMoved
24110 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2c 20  (&db->aDb[iDb], 
24120 69 4d 6f 76 65 64 2c 20 70 4f 70 2d 3e 70 31 29  iMoved, pOp->p1)
24130 3b 0a 20 20 20 20 20 20 72 65 73 65 74 53 63 68  ;.      resetSch
24140 65 6d 61 4f 6e 46 61 75 6c 74 20 3d 20 31 3b 0a  emaOnFault = 1;.
24150 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
24160 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
24170 4f 70 63 6f 64 65 3a 20 43 6c 65 61 72 20 50 31  Opcode: Clear P1
24180 20 50 32 20 50 33 0a 2a 2a 0a 2a 2a 20 44 65 6c   P2 P3.**.** Del
24190 65 74 65 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 73  ete all contents
241a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
241b0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
241c0 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 0a  whose root page.
241d0 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
241e0 73 65 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  se file is given
241f0 20 62 79 20 50 31 2e 20 20 42 75 74 2c 20 75 6e   by P1.  But, un
24200 6c 69 6b 65 20 44 65 73 74 72 6f 79 2c 20 64 6f  like Destroy, do
24210 20 6e 6f 74 0a 2a 2a 20 72 65 6d 6f 76 65 20 74   not.** remove t
24220 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
24230 78 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  x from the datab
24240 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
24250 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
24260 63 6c 65 61 72 20 69 73 20 69 6e 20 74 68 65 20  clear is in the 
24270 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
24280 6c 65 20 69 66 20 50 32 3d 3d 30 2e 20 20 49 66  le if P2==0.  If
24290 0a 2a 2a 20 50 32 3d 3d 31 20 74 68 65 6e 20 74  .** P2==1 then t
242a0 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 63  he table to be c
242b0 6c 65 61 72 20 69 73 20 69 6e 20 74 68 65 20 61  lear is in the a
242c0 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
242d0 65 20 66 69 6c 65 0a 2a 2a 20 74 68 61 74 20 69  e file.** that i
242e0 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
242f0 74 61 62 6c 65 73 20 63 72 65 61 74 65 20 75 73  tables create us
24300 69 6e 67 20 43 52 45 41 54 45 20 54 45 4d 50 4f  ing CREATE TEMPO
24310 52 41 52 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  RARY TABLE..**.*
24320 2a 20 49 66 20 74 68 65 20 50 33 20 76 61 6c 75  * If the P3 valu
24330 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  e is non-zero, t
24340 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 72 65  hen the table re
24350 66 65 72 72 65 64 20 74 6f 20 6d 75 73 74 20 62  ferred to must b
24360 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 74  e an.** intkey t
24370 61 62 6c 65 20 28 61 6e 20 53 51 4c 20 74 61 62  able (an SQL tab
24380 6c 65 2c 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78  le, not an index
24390 29 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ). In this case 
243a0 74 68 65 20 72 6f 77 20 63 68 61 6e 67 65 20 0a  the row change .
243b0 2a 2a 20 63 6f 75 6e 74 20 69 73 20 69 6e 63 72  ** count is incr
243c0 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e  emented by the n
243d0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
243e0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
243f0 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2a 20 49 66   cleared. .** If
24400 20 50 33 20 69 73 20 67 72 65 61 74 65 72 20 74   P3 is greater t
24410 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
24420 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
24430 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 69  in register P3 i
24440 73 0a 2a 2a 20 61 6c 73 6f 20 69 6e 63 72 65 6d  s.** also increm
24450 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  ented by the num
24460 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
24470 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63  he table being c
24480 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  leared..**.** Se
24490 65 20 61 6c 73 6f 3a 20 44 65 73 74 72 6f 79 0a  e also: Destroy.
244a0 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6c 65 61 72  */.case OP_Clear
244b0 3a 20 7b 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67  : {.  int nChang
244c0 65 3b 0a 20 0a 20 20 6e 43 68 61 6e 67 65 20 3d  e;. .  nChange =
244d0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   0;.  assert( (p
244e0 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 31  ->btreeMask & (1
244f0 3c 3c 70 4f 70 2d 3e 70 32 29 29 21 3d 30 20 29  <<pOp->p2))!=0 )
24500 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
24510 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
24520 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 70  .      db->aDb[p
24530 4f 70 2d 3e 70 32 5d 2e 70 42 74 2c 20 70 4f 70  Op->p2].pBt, pOp
24540 2d 3e 70 31 2c 20 28 70 4f 70 2d 3e 70 33 20 3f  ->p1, (pOp->p3 ?
24550 20 26 6e 43 68 61 6e 67 65 20 3a 20 30 29 0a 20   &nChange : 0). 
24560 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   );.  if( pOp->p
24570 33 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 43 68 61  3 ){.    p->nCha
24580 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
24590 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 3e      if( pOp->p3>
245a0 30 20 29 7b 0a 20 20 20 20 20 20 61 4d 65 6d 5b  0 ){.      aMem[
245b0 70 4f 70 2d 3e 70 33 5d 2e 75 2e 69 20 2b 3d 20  pOp->p3].u.i += 
245c0 6e 43 68 61 6e 67 65 3b 0a 20 20 20 20 7d 0a 20  nChange;.    }. 
245d0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
245e0 2a 20 4f 70 63 6f 64 65 3a 20 43 72 65 61 74 65  * Opcode: Create
245f0 54 61 62 6c 65 20 50 31 20 50 32 20 2a 20 2a 20  Table P1 P2 * * 
24600 2a 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  *.**.** Allocate
24610 20 61 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 20   a new table in 
24620 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
24630 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 30 20  e file if P1==0 
24640 6f 72 20 69 6e 20 74 68 65 0a 2a 2a 20 61 75 78  or in the.** aux
24650 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
24660 66 69 6c 65 20 69 66 20 50 31 3d 3d 31 20 6f 72  file if P1==1 or
24670 20 69 6e 20 61 6e 20 61 74 74 61 63 68 65 64 20   in an attached 
24680 64 61 74 61 62 61 73 65 20 69 66 0a 2a 2a 20 50  database if.** P
24690 31 3e 31 2e 20 20 57 72 69 74 65 20 74 68 65 20  1>1.  Write the 
246a0 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
246b0 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
246c0 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74  e into.** regist
246d0 65 72 20 50 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20  er P2.**.** The 
246e0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
246f0 65 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61  en a table and a
24700 6e 20 69 6e 64 65 78 20 69 73 20 74 68 69 73 3a  n index is this:
24710 20 20 41 20 74 61 62 6c 65 20 6d 75 73 74 0a 2a    A table must.*
24720 2a 20 68 61 76 65 20 61 20 34 2d 62 79 74 65 20  * have a 4-byte 
24730 69 6e 74 65 67 65 72 20 6b 65 79 20 61 6e 64 20  integer key and 
24740 63 61 6e 20 68 61 76 65 20 61 72 62 69 74 72 61  can have arbitra
24750 72 79 20 64 61 74 61 2e 20 20 41 6e 20 69 6e 64  ry data.  An ind
24760 65 78 0a 2a 2a 20 68 61 73 20 61 6e 20 61 72 62  ex.** has an arb
24770 69 74 72 61 72 79 20 6b 65 79 20 62 75 74 20 6e  itrary key but n
24780 6f 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 53 65  o data..**.** Se
24790 65 20 61 6c 73 6f 3a 20 43 72 65 61 74 65 49 6e  e also: CreateIn
247a0 64 65 78 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  dex.*/./* Opcode
247b0 3a 20 43 72 65 61 74 65 49 6e 64 65 78 20 50 31  : CreateIndex P1
247c0 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
247d0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 69  Allocate a new i
247e0 6e 64 65 78 20 69 6e 20 74 68 65 20 6d 61 69 6e  ndex in the main
247f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
24800 66 20 50 31 3d 3d 30 20 6f 72 20 69 6e 20 74 68  f P1==0 or in th
24810 65 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64  e.** auxiliary d
24820 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
24830 50 31 3d 3d 31 20 6f 72 20 69 6e 20 61 6e 20 61  P1==1 or in an a
24840 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
24850 20 69 66 0a 2a 2a 20 50 31 3e 31 2e 20 20 57 72   if.** P1>1.  Wr
24860 69 74 65 20 74 68 65 20 72 6f 6f 74 20 70 61 67  ite the root pag
24870 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
24880 6e 65 77 20 74 61 62 6c 65 20 69 6e 74 6f 0a 2a  new table into.*
24890 2a 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  * register P2..*
248a0 2a 0a 2a 2a 20 53 65 65 20 64 6f 63 75 6d 65 6e  *.** See documen
248b0 74 61 74 69 6f 6e 20 6f 6e 20 4f 50 5f 43 72 65  tation on OP_Cre
248c0 61 74 65 54 61 62 6c 65 20 66 6f 72 20 61 64 64  ateTable for add
248d0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
248e0 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ion..*/.case OP_
248f0 43 72 65 61 74 65 49 6e 64 65 78 3a 20 20 20 20  CreateIndex:    
24900 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
24910 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 63 61  prerelease */.ca
24920 73 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  se OP_CreateTabl
24930 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 2f 2a  e: {          /*
24940 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65   out2-prerelease
24950 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 0a   */.  int pgno;.
24960 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 44    int flags;.  D
24970 62 20 2a 70 44 62 3b 0a 0a 20 20 70 67 6e 6f 20  b *pDb;..  pgno 
24980 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
24990 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
249a0 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  ->p1<db->nDb );.
249b0 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74    assert( (p->bt
249c0 72 65 65 4d 61 73 6b 20 26 20 28 31 3c 3c 70 4f  reeMask & (1<<pO
249d0 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a 20 20  p->p1))!=0 );.  
249e0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70  pDb = &db->aDb[p
249f0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
24a00 74 28 20 70 44 62 2d 3e 70 42 74 21 3d 30 20 29  t( pDb->pBt!=0 )
24a10 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
24a20 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 54 61  ode==OP_CreateTa
24a30 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 66 6c  ble ){.    /* fl
24a40 61 67 73 20 3d 20 42 54 52 45 45 5f 49 4e 54 4b  ags = BTREE_INTK
24a50 45 59 3b 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73  EY; */.    flags
24a60 20 3d 20 42 54 52 45 45 5f 4c 45 41 46 44 41 54   = BTREE_LEAFDAT
24a70 41 7c 42 54 52 45 45 5f 49 4e 54 4b 45 59 3b 0a  A|BTREE_INTKEY;.
24a80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c 61    }else{.    fla
24a90 67 73 20 3d 20 42 54 52 45 45 5f 5a 45 52 4f 44  gs = BTREE_ZEROD
24aa0 41 54 41 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ATA;.  }.  rc = 
24ab0 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
24ac0 74 65 54 61 62 6c 65 28 70 44 62 2d 3e 70 42 74  teTable(pDb->pBt
24ad0 2c 20 26 70 67 6e 6f 2c 20 66 6c 61 67 73 29 3b  , &pgno, flags);
24ae0 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70  .  pOut->u.i = p
24af0 67 6e 6f 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  gno;.  break;.}.
24b00 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61 72 73  ./* Opcode: Pars
24b10 65 53 63 68 65 6d 61 20 50 31 20 50 32 20 2a 20  eSchema P1 P2 * 
24b20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20  P4 *.**.** Read 
24b30 61 6e 64 20 70 61 72 73 65 20 61 6c 6c 20 65 6e  and parse all en
24b40 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20 53  tries from the S
24b50 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
24b60 6c 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 50  le of database P
24b70 31 0a 2a 2a 20 74 68 61 74 20 6d 61 74 63 68 20  1.** that match 
24b80 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
24b90 20 50 34 2e 20 20 50 32 20 69 73 20 74 68 65 20   P4.  P2 is the 
24ba0 22 66 6f 72 63 65 22 20 66 6c 61 67 2e 20 20 20  "force" flag.   
24bb0 41 6c 77 61 79 73 20 64 6f 0a 2a 2a 20 74 68 65  Always do.** the
24bc0 20 70 61 72 73 69 6e 67 20 69 66 20 50 32 20 69   parsing if P2 i
24bd0 73 20 74 72 75 65 2e 20 20 49 66 20 50 32 20 69  s true.  If P2 i
24be0 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68  s false, then th
24bf0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 0a  is routine is a.
24c00 2a 2a 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20  ** no-op if the 
24c10 73 63 68 65 6d 61 20 69 73 20 6e 6f 74 20 63 75  schema is not cu
24c20 72 72 65 6e 74 6c 79 20 6c 6f 61 64 65 64 2e 20  rrently loaded. 
24c30 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
24c40 20 69 66 20 50 32 0a 2a 2a 20 69 73 20 66 61 6c   if P2.** is fal
24c50 73 65 2c 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  se, the SQLITE_M
24c60 41 53 54 45 52 20 74 61 62 6c 65 20 69 73 20 6f  ASTER table is o
24c70 6e 6c 79 20 70 61 72 73 65 64 20 69 66 20 74 68  nly parsed if th
24c80 65 20 72 65 73 74 20 6f 66 20 74 68 65 0a 2a 2a  e rest of the.**
24c90 20 73 63 68 65 6d 61 20 69 73 20 61 6c 72 65 61   schema is alrea
24ca0 64 79 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74  dy loaded into t
24cb0 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 2e  he symbol table.
24cc0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
24cd0 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 70  de invokes the p
24ce0 61 72 73 65 72 20 74 6f 20 63 72 65 61 74 65 20  arser to create 
24cf0 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 6d 61  a new virtual ma
24d00 63 68 69 6e 65 2c 0a 2a 2a 20 74 68 65 6e 20 72  chine,.** then r
24d10 75 6e 73 20 74 68 65 20 6e 65 77 20 76 69 72 74  uns the new virt
24d20 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 49 74  ual machine.  It
24d30 20 69 73 20 74 68 75 73 20 61 20 72 65 2d 65 6e   is thus a re-en
24d40 74 72 61 6e 74 20 6f 70 63 6f 64 65 2e 0a 2a 2f  trant opcode..*/
24d50 0a 63 61 73 65 20 4f 50 5f 50 61 72 73 65 53 63  .case OP_ParseSc
24d60 68 65 6d 61 3a 20 7b 0a 20 20 69 6e 74 20 69 44  hema: {.  int iD
24d70 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
24d80 2a 7a 4d 61 73 74 65 72 3b 0a 20 20 63 68 61 72  *zMaster;.  char
24d90 20 2a 7a 53 71 6c 3b 0a 20 20 49 6e 69 74 44 61   *zSql;.  InitDa
24da0 74 61 20 69 6e 69 74 44 61 74 61 3b 0a 0a 20 20  ta initData;..  
24db0 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20  iDb = pOp->p1;. 
24dc0 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
24dd0 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
24de0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 4f 70 2d 3e  ;..  /* If pOp->
24df0 70 32 20 69 73 20 30 2c 20 74 68 65 6e 20 74 68  p2 is 0, then th
24e00 69 73 20 6f 70 63 6f 64 65 20 69 73 20 62 65 69  is opcode is bei
24e10 6e 67 20 65 78 65 63 75 74 65 64 20 74 6f 20 72  ng executed to r
24e20 65 61 64 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c  ead a.  ** singl
24e30 65 20 72 6f 77 2c 20 66 6f 72 20 65 78 61 6d 70  e row, for examp
24e40 6c 65 20 74 68 65 20 72 6f 77 20 63 6f 72 72 65  le the row corre
24e50 73 70 6f 6e 64 69 6e 67 20 74 6f 20 61 20 6e 65  sponding to a ne
24e60 77 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63 72 65  w index.  ** cre
24e70 61 74 65 64 20 62 79 20 74 68 69 73 20 56 44 42  ated by this VDB
24e80 45 2c 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  E, from the sqli
24e90 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
24ea0 20 49 74 20 6f 6e 6c 79 0a 20 20 2a 2a 20 64 6f   It only.  ** do
24eb0 65 73 20 74 68 69 73 20 69 66 20 74 68 65 20 63  es this if the c
24ec0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 2d  orresponding in-
24ed0 6d 65 6d 6f 72 79 20 73 63 68 65 6d 61 20 69 73  memory schema is
24ee0 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
24ef0 6c 6f 61 64 65 64 2e 20 4f 74 68 65 72 77 69 73  loaded. Otherwis
24f00 65 2c 20 74 68 65 20 6e 65 77 20 69 6e 64 65 78  e, the new index
24f10 20 64 65 66 69 6e 69 74 69 6f 6e 20 63 61 6e 20   definition can 
24f20 62 65 20 6c 6f 61 64 65 64 20 61 6c 6f 6e 67 0a  be loaded along.
24f30 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 72 65    ** with the re
24f40 73 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  st of the schema
24f50 20 77 68 65 6e 20 69 74 20 69 73 20 72 65 71 75   when it is requ
24f60 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ired..  **.  ** 
24f70 41 6c 74 68 6f 75 67 68 20 74 68 65 20 6d 75 74  Although the mut
24f80 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
24f90 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63  ed object that c
24fa0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 0a 20 20  orresponds to.  
24fb0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 44 62 20  ** database iDb 
24fc0 28 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f  (the database co
24fd0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 71 6c  ntaining the sql
24fe0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
24ff0 0a 20 20 2a 2a 20 72 65 61 64 20 62 79 20 74 68  .  ** read by th
25000 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 29 20  is instruction) 
25010 69 73 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  is currently hel
25020 64 2c 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  d, it is necessa
25030 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69  ry to.  ** obtai
25040 6e 20 74 68 65 20 6d 75 74 65 78 65 73 20 6f 6e  n the mutexes on
25050 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
25060 74 61 62 61 73 65 73 20 62 65 66 6f 72 65 20 63  tabases before c
25070 68 65 63 6b 69 6e 67 20 69 66 0a 20 20 2a 2a 20  hecking if.  ** 
25080 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20 69 44  the schema of iD
25090 62 20 69 73 20 6c 6f 61 64 65 64 2e 20 54 68 69  b is loaded. Thi
250a0 73 20 69 73 20 62 65 63 61 75 73 65 2c 20 61 74  s is because, at
250b0 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 20 20   the start of.  
250c0 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 65  ** the sqlite3_e
250d0 78 65 63 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77  xec() call below
250e0 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 69 6e  , SQLite will in
250f0 76 6f 6b 65 20 0a 20 20 2a 2a 20 73 71 6c 69 74  voke .  ** sqlit
25100 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
25110 29 2e 20 49 66 20 61 6c 6c 20 6d 75 74 65 78 65  ). If all mutexe
25120 73 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64  s are not alread
25130 79 20 68 65 6c 64 2c 20 74 68 65 0a 20 20 2a 2a  y held, the.  **
25140 20 69 44 62 20 6d 75 74 65 78 20 6d 61 79 20 62   iDb mutex may b
25150 65 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 72 65  e temporarily re
25160 6c 65 61 73 65 64 20 74 6f 20 61 76 6f 69 64 20  leased to avoid 
25170 64 65 61 64 6c 6f 63 6b 2e 20 49 66 20 0a 20 20  deadlock. If .  
25180 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c  ** this happens,
25190 20 74 68 65 6e 20 73 6f 6d 65 20 6f 74 68 65 72   then some other
251a0 20 74 68 72 65 61 64 20 6d 61 79 20 64 65 6c 65   thread may dele
251b0 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
251c0 20 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 6f 66   .  ** schema of
251d0 20 64 61 74 61 62 61 73 65 20 69 44 62 20 62 65   database iDb be
251e0 66 6f 72 65 20 74 68 65 20 53 51 4c 20 73 74 61  fore the SQL sta
251f0 74 65 6d 65 6e 74 20 72 75 6e 73 2e 20 54 68 65  tement runs. The
25200 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 77 69 6c   schema.  ** wil
25210 6c 20 6e 6f 74 20 62 65 20 72 65 6c 6f 61 64 65  l not be reloade
25220 64 20 62 65 63 75 61 73 65 20 74 68 65 20 64 62  d becuase the db
25230 2d 3e 69 6e 69 74 2e 62 75 73 79 20 66 6c 61 67  ->init.busy flag
25240 20 69 73 20 73 65 74 2e 20 54 68 69 73 0a 20 20   is set. This.  
25250 2a 2a 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  ** can result in
25260 20 61 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c   a "no such tabl
25270 65 3a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  e: sqlite_master
25280 22 20 6f 72 20 22 6d 61 6c 66 6f 72 6d 65 64 0a  " or "malformed.
25290 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63    ** database sc
252a0 68 65 6d 61 22 20 65 72 72 6f 72 20 62 65 69 6e  hema" error bein
252b0 67 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  g returned to th
252c0 65 20 75 73 65 72 2e 0a 20 20 2a 2f 0a 20 20 61  e user..  */.  a
252d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
252e0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 64 62  reeHoldsMutex(db
252f0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 29 20  ->aDb[iDb].pBt) 
25300 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
25310 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
25320 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 7c 7c 20   if( pOp->p2 || 
25330 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
25340 2c 20 69 44 62 2c 20 44 42 5f 53 63 68 65 6d 61  , iDb, DB_Schema
25350 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20 7a  Loaded) ){.    z
25360 4d 61 73 74 65 72 20 3d 20 53 43 48 45 4d 41 5f  Master = SCHEMA_
25370 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
25380 69 6e 69 74 44 61 74 61 2e 64 62 20 3d 20 64 62  initData.db = db
25390 3b 0a 20 20 20 20 69 6e 69 74 44 61 74 61 2e 69  ;.    initData.i
253a0 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  Db = pOp->p1;.  
253b0 20 20 69 6e 69 74 44 61 74 61 2e 70 7a 45 72 72    initData.pzErr
253c0 4d 73 67 20 3d 20 26 70 2d 3e 7a 45 72 72 4d 73  Msg = &p->zErrMs
253d0 67 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  g;.    zSql = sq
253e0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
253f0 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  .       "SELECT 
25400 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20  name, rootpage, 
25410 73 71 6c 20 46 52 4f 4d 20 27 25 71 27 2e 25 73  sql FROM '%q'.%s
25420 20 57 48 45 52 45 20 25 73 20 4f 52 44 45 52 20   WHERE %s ORDER 
25430 42 59 20 72 6f 77 69 64 22 2c 0a 20 20 20 20 20  BY rowid",.     
25440 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
25450 4e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70  Name, zMaster, p
25460 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 69  Op->p4.z);.    i
25470 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
25480 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25490 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
254a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
254b0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
254c0 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e   );.      db->in
254d0 69 74 2e 62 75 73 79 20 3d 20 31 3b 0a 20 20 20  it.busy = 1;.   
254e0 20 20 20 69 6e 69 74 44 61 74 61 2e 72 63 20 3d     initData.rc =
254f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
25500 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
25510 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
25520 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
25530 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c  3_exec(db, zSql,
25540 20 73 71 6c 69 74 65 33 49 6e 69 74 43 61 6c 6c   sqlite3InitCall
25550 62 61 63 6b 2c 20 26 69 6e 69 74 44 61 74 61 2c  back, &initData,
25560 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
25570 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
25580 63 20 3d 20 69 6e 69 74 44 61 74 61 2e 72 63 3b  c = initData.rc;
25590 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
255a0 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a  Free(db, zSql);.
255b0 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62        db->init.b
255c0 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  usy = 0;.    }. 
255d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
255e0 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
255f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25600 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 67 6f 74  NOMEM ){.    got
25610 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20  o no_mem;.  }.  
25620 62 72 65 61 6b 3b 20 20 0a 7d 0a 0a 23 69 66 20  break;  .}..#if 
25630 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
25640 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 29 0a 2f 2a  OMIT_ANALYZE)./*
25650 20 4f 70 63 6f 64 65 3a 20 4c 6f 61 64 41 6e 61   Opcode: LoadAna
25660 6c 79 73 69 73 20 50 31 20 2a 20 2a 20 2a 20 2a  lysis P1 * * * *
25670 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  .**.** Read the 
25680 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62  sqlite_stat1 tab
25690 6c 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  le for database 
256a0 50 31 20 61 6e 64 20 6c 6f 61 64 20 74 68 65 20  P1 and load the 
256b0 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68  content.** of th
256c0 61 74 20 74 61 62 6c 65 20 69 6e 74 6f 20 74 68  at table into th
256d0 65 20 69 6e 74 65 72 6e 61 6c 20 69 6e 64 65 78  e internal index
256e0 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 54 68   hash table.  Th
256f0 69 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 2a 2a  is will cause.**
25700 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 74 6f   the analysis to
25710 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 70 72   be used when pr
25720 65 70 61 72 69 6e 67 20 61 6c 6c 20 73 75 62 73  eparing all subs
25730 65 71 75 65 6e 74 20 71 75 65 72 69 65 73 2e 0a  equent queries..
25740 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 6f 61 64 41  */.case OP_LoadA
25750 6e 61 6c 79 73 69 73 3a 20 7b 0a 20 20 61 73 73  nalysis: {.  ass
25760 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
25770 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e  && pOp->p1<db->n
25780 44 62 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Db );.  rc = sql
25790 69 74 65 33 41 6e 61 6c 79 73 69 73 4c 6f 61 64  ite3AnalysisLoad
257a0 28 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20  (db, pOp->p1);. 
257b0 20 62 72 65 61 6b 3b 20 20 0a 7d 0a 23 65 6e 64   break;  .}.#end
257c0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
257d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59  QLITE_OMIT_ANALY
257e0 5a 45 29 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64  ZE) */../* Opcod
257f0 65 3a 20 44 72 6f 70 54 61 62 6c 65 20 50 31 20  e: DropTable P1 
25800 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52  * * P4 *.**.** R
25810 65 6d 6f 76 65 20 74 68 65 20 69 6e 74 65 72 6e  emove the intern
25820 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29 20 64  al (in-memory) d
25830 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 74  ata structures t
25840 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a 2a 20  hat describe.** 
25850 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  the table named 
25860 50 34 20 69 6e 20 64 61 74 61 62 61 73 65 20 50  P4 in database P
25870 31 2e 20 20 54 68 69 73 20 69 73 20 63 61 6c 6c  1.  This is call
25880 65 64 20 61 66 74 65 72 20 61 20 74 61 62 6c 65  ed after a table
25890 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65 64 20 69  .** is dropped i
258a0 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
258b0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70  the internal rep
258c0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
258d0 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e  he.** schema con
258e0 73 69 73 74 65 6e 74 20 77 69 74 68 20 77 68 61  sistent with wha
258f0 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f  t is on disk..*/
25900 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70 54 61 62  .case OP_DropTab
25910 6c 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 55  le: {.  sqlite3U
25920 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61  nlinkAndDeleteTa
25930 62 6c 65 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c  ble(db, pOp->p1,
25940 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62   pOp->p4.z);.  b
25950 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
25960 64 65 3a 20 44 72 6f 70 49 6e 64 65 78 20 50 31  de: DropIndex P1
25970 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20   * * P4 *.**.** 
25980 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 74 65 72  Remove the inter
25990 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29 20  nal (in-memory) 
259a0 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
259b0 74 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a 2a  that describe.**
259c0 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64   the index named
259d0 20 50 34 20 69 6e 20 64 61 74 61 62 61 73 65 20   P4 in database 
259e0 50 31 2e 20 20 54 68 69 73 20 69 73 20 63 61 6c  P1.  This is cal
259f0 6c 65 64 20 61 66 74 65 72 20 61 6e 20 69 6e 64  led after an ind
25a00 65 78 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65 64  ex.** is dropped
25a10 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
25a20 70 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72  p the internal r
25a30 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
25a40 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63   the.** schema c
25a50 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 77  onsistent with w
25a60 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a  hat is on disk..
25a70 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70 49  */.case OP_DropI
25a80 6e 64 65 78 3a 20 7b 0a 20 20 73 71 6c 69 74 65  ndex: {.  sqlite
25a90 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
25aa0 49 6e 64 65 78 28 64 62 2c 20 70 4f 70 2d 3e 70  Index(db, pOp->p
25ab0 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  1, pOp->p4.z);. 
25ac0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
25ad0 63 6f 64 65 3a 20 44 72 6f 70 54 72 69 67 67 65  code: DropTrigge
25ae0 72 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  r P1 * * P4 *.**
25af0 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69  .** Remove the i
25b00 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f  nternal (in-memo
25b10 72 79 29 20 64 61 74 61 20 73 74 72 75 63 74 75  ry) data structu
25b20 72 65 73 20 74 68 61 74 20 64 65 73 63 72 69 62  res that describ
25b30 65 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72  e.** the trigger
25b40 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64 61 74   named P4 in dat
25b50 61 62 61 73 65 20 50 31 2e 20 20 54 68 69 73 20  abase P1.  This 
25b60 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
25b70 61 20 74 72 69 67 67 65 72 0a 2a 2a 20 69 73 20  a trigger.** is 
25b80 64 72 6f 70 70 65 64 20 69 6e 20 6f 72 64 65 72  dropped in order
25b90 20 74 6f 20 6b 65 65 70 20 74 68 65 20 69 6e 74   to keep the int
25ba0 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61  ernal representa
25bb0 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73  tion of the.** s
25bc0 63 68 65 6d 61 20 63 6f 6e 73 69 73 74 65 6e 74  chema consistent
25bd0 20 77 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e   with what is on
25be0 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f   disk..*/.case O
25bf0 50 5f 44 72 6f 70 54 72 69 67 67 65 72 3a 20 7b  P_DropTrigger: {
25c00 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  .  sqlite3Unlink
25c10 41 6e 64 44 65 6c 65 74 65 54 72 69 67 67 65 72  AndDeleteTrigger
25c20 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  (db, pOp->p1, pO
25c30 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61  p->p4.z);.  brea
25c40 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  k;.}...#ifndef S
25c50 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
25c60 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 20 4f 70  RITY_CHECK./* Op
25c70 63 6f 64 65 3a 20 49 6e 74 65 67 72 69 74 79 43  code: IntegrityC
25c80 6b 20 50 31 20 50 32 20 50 33 20 2a 20 50 35 0a  k P1 P2 P3 * P5.
25c90 2a 2a 0a 2a 2a 20 44 6f 20 61 6e 20 61 6e 61 6c  **.** Do an anal
25ca0 79 73 69 73 20 6f 66 20 74 68 65 20 63 75 72 72  ysis of the curr
25cb0 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74 61 62  ently open datab
25cc0 61 73 65 2e 20 20 53 74 6f 72 65 20 69 6e 0a 2a  ase.  Store in.*
25cd0 2a 20 72 65 67 69 73 74 65 72 20 50 31 20 74 68  * register P1 th
25ce0 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 72 72  e text of an err
25cf0 6f 72 20 6d 65 73 73 61 67 65 20 64 65 73 63 72  or message descr
25d00 69 62 69 6e 67 20 61 6e 79 20 70 72 6f 62 6c 65  ibing any proble
25d10 6d 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 70 72 6f  ms..** If no pro
25d20 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2c  blems are found,
25d30 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c 20 69 6e   store a NULL in
25d40 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a   register P1..**
25d50 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74 65 72  .** The register
25d60 20 50 33 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   P3 contains the
25d70 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
25d80 6f 66 20 61 6c 6c 6f 77 65 64 20 65 72 72 6f 72  of allowed error
25d90 73 2e 0a 2a 2a 20 41 74 20 6d 6f 73 74 20 72 65  s..** At most re
25da0 67 28 50 33 29 20 65 72 72 6f 72 73 20 77 69 6c  g(P3) errors wil
25db0 6c 20 62 65 20 72 65 70 6f 72 74 65 64 2e 0a 2a  l be reported..*
25dc0 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
25dd0 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 73  , the analysis s
25de0 74 6f 70 73 20 61 73 20 73 6f 6f 6e 20 61 73 20  tops as soon as 
25df0 72 65 67 28 50 31 29 20 65 72 72 6f 72 73 20 61  reg(P1) errors a
25e00 72 65 20 0a 2a 2a 20 73 65 65 6e 2e 20 20 52 65  re .** seen.  Re
25e10 67 28 50 31 29 20 69 73 20 75 70 64 61 74 65 64  g(P1) is updated
25e20 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62 65 72   with the number
25e30 20 6f 66 20 65 72 72 6f 72 73 20 72 65 6d 61 69   of errors remai
25e40 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ning..**.** The 
25e50 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
25e60 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  s of all tables 
25e70 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
25e80 61 72 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 73  are integer.** s
25e90 74 6f 72 65 64 20 69 6e 20 72 65 67 28 50 31 29  tored in reg(P1)
25ea0 2c 20 72 65 67 28 50 31 2b 31 29 2c 20 72 65 67  , reg(P1+1), reg
25eb0 28 50 31 2b 32 29 2c 20 2e 2e 2e 2e 20 20 54 68  (P1+2), ....  Th
25ec0 65 72 65 20 61 72 65 20 50 32 20 74 61 62 6c 65  ere are P2 table
25ed0 73 0a 2a 2a 20 74 6f 74 61 6c 2e 0a 2a 2a 0a 2a  s.** total..**.*
25ee0 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 74 20 7a  * If P5 is not z
25ef0 65 72 6f 2c 20 74 68 65 20 63 68 65 63 6b 20 69  ero, the check i
25f00 73 20 64 6f 6e 65 20 6f 6e 20 74 68 65 20 61 75  s done on the au
25f10 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
25f20 0a 2a 2a 20 66 69 6c 65 2c 20 6e 6f 74 20 74 68  .** file, not th
25f30 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
25f40 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
25f50 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
25f60 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
25f70 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
25f80 20 70 72 61 67 6d 61 2e 0a 2a 2f 0a 63 61 73 65   pragma..*/.case
25f90 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 3a   OP_IntegrityCk:
25fa0 20 7b 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 3b 20   {.  int nRoot; 
25fb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25fc0 66 20 74 61 62 6c 65 73 20 74 6f 20 63 68 65 63  f tables to chec
25fd0 6b 2e 20 20 28 4e 75 6d 62 65 72 20 6f 66 20 72  k.  (Number of r
25fe0 6f 6f 74 20 70 61 67 65 73 2e 29 20 2a 2f 0a 20  oot pages.) */. 
25ff0 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 20 20 20 20   int *aRoot;    
26000 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 6f 6f   /* Array of roo
26010 74 70 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f  tpage numbers fo
26020 72 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 63  r tables to be c
26030 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  hecked */.  int 
26040 6a 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  j;          /* L
26050 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
26060 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20   int nErr;      
26070 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
26080 72 6f 72 73 20 72 65 70 6f 72 74 65 64 20 2a 2f  rors reported */
26090 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
260a0 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
260b0 65 20 65 72 72 6f 72 20 72 65 70 6f 72 74 20 2a  e error report *
260c0 2f 0a 20 20 4d 65 6d 20 2a 70 6e 45 72 72 3b 20  /.  Mem *pnErr; 
260d0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
260e0 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66  keeping track of
260f0 20 65 72 72 6f 72 73 20 72 65 6d 61 69 6e 69 6e   errors remainin
26100 67 20 2a 2f 0a 20 20 0a 20 20 6e 52 6f 6f 74 20  g */.  .  nRoot 
26110 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73  = pOp->p2;.  ass
26120 65 72 74 28 20 6e 52 6f 6f 74 3e 30 20 29 3b 0a  ert( nRoot>0 );.
26130 20 20 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65    aRoot = sqlite
26140 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
26150 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 52   sizeof(int)*(nR
26160 6f 6f 74 2b 31 29 20 29 3b 0a 20 20 69 66 28 20  oot+1) );.  if( 
26170 61 52 6f 6f 74 3d 3d 30 20 29 20 67 6f 74 6f 20  aRoot==0 ) goto 
26180 6e 6f 5f 6d 65 6d 3b 0a 20 20 61 73 73 65 72 74  no_mem;.  assert
26190 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70  ( pOp->p3>0 && p
261a0 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20  Op->p3<=p->nMem 
261b0 29 3b 0a 20 20 70 6e 45 72 72 20 3d 20 26 61 4d  );.  pnErr = &aM
261c0 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61  em[pOp->p3];.  a
261d0 73 73 65 72 74 28 20 28 70 6e 45 72 72 2d 3e 66  ssert( (pnErr->f
261e0 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21  lags & MEM_Int)!
261f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
26200 28 70 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26 20  (pnErr->flags & 
26210 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
26220 62 29 29 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31  b))==0 );.  pIn1
26230 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
26240 5d 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  ];.  for(j=0; j<
26250 6e 52 6f 6f 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nRoot; j++){.   
26260 20 61 52 6f 6f 74 5b 6a 5d 20 3d 20 28 69 6e 74   aRoot[j] = (int
26270 29 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56  )sqlite3VdbeIntV
26280 61 6c 75 65 28 26 70 49 6e 31 5b 6a 5d 29 3b 0a  alue(&pIn1[j]);.
26290 20 20 7d 0a 20 20 61 52 6f 6f 74 5b 6a 5d 20 3d    }.  aRoot[j] =
262a0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   0;.  assert( pO
262b0 70 2d 3e 70 35 3c 64 62 2d 3e 6e 44 62 20 29 3b  p->p5<db->nDb );
262c0 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62  .  assert( (p->b
262d0 74 72 65 65 4d 61 73 6b 20 26 20 28 31 3c 3c 70  treeMask & (1<<p
262e0 4f 70 2d 3e 70 35 29 29 21 3d 30 20 29 3b 0a 20  Op->p5))!=0 );. 
262f0 20 7a 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65   z = sqlite3Btre
26300 65 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28  eIntegrityCheck(
26310 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 35 5d  db->aDb[pOp->p5]
26320 2e 70 42 74 2c 20 61 52 6f 6f 74 2c 20 6e 52 6f  .pBt, aRoot, nRo
26330 6f 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ot,.            
26340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26350 20 20 20 20 20 28 69 6e 74 29 70 6e 45 72 72 2d       (int)pnErr-
26360 3e 75 2e 69 2c 20 26 6e 45 72 72 29 3b 0a 20 20  >u.i, &nErr);.  
26370 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
26380 2c 20 61 52 6f 6f 74 29 3b 0a 20 20 70 6e 45 72  , aRoot);.  pnEr
26390 72 2d 3e 75 2e 69 20 2d 3d 20 6e 45 72 72 3b 0a  r->u.i -= nErr;.
263a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
263b0 53 65 74 4e 75 6c 6c 28 70 49 6e 31 29 3b 0a 20  SetNull(pIn1);. 
263c0 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 29 7b 0a   if( nErr==0 ){.
263d0 20 20 20 20 61 73 73 65 72 74 28 20 7a 3d 3d 30      assert( z==0
263e0 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
263f0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  z==0 ){.    goto
26400 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65   no_mem;.  }else
26410 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
26420 65 4d 65 6d 53 65 74 53 74 72 28 70 49 6e 31 2c  eMemSetStr(pIn1,
26430 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55   z, -1, SQLITE_U
26440 54 46 38 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  TF8, sqlite3_fre
26450 65 29 3b 0a 20 20 7d 0a 20 20 55 50 44 41 54 45  e);.  }.  UPDATE
26460 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 49  _MAX_BLOBSIZE(pI
26470 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  n1);.  sqlite3Vd
26480 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67  beChangeEncoding
26490 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69 6e 67 29  (pIn1, encoding)
264a0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
264b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
264c0 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
264d0 43 4b 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65  CK */../* Opcode
264e0 3a 20 52 6f 77 53 65 74 41 64 64 20 50 31 20 50  : RowSetAdd P1 P
264f0 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e  2 * * *.**.** In
26500 73 65 72 74 20 74 68 65 20 69 6e 74 65 67 65 72  sert the integer
26510 20 76 61 6c 75 65 20 68 65 6c 64 20 62 79 20 72   value held by r
26520 65 67 69 73 74 65 72 20 50 32 20 69 6e 74 6f 20  egister P2 into 
26530 61 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 0a  a boolean index.
26540 2a 2a 20 68 65 6c 64 20 69 6e 20 72 65 67 69 73  ** held in regis
26550 74 65 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 41 6e  ter P1..**.** An
26560 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73   assertion fails
26570 20 69 66 20 50 32 20 69 73 20 6e 6f 74 20 61 6e   if P2 is not an
26580 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 63 61 73   integer..*/.cas
26590 65 20 4f 50 5f 52 6f 77 53 65 74 41 64 64 3a 20  e OP_RowSetAdd: 
265a0 7b 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 2c 20  {       /* in1, 
265b0 69 6e 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  in2 */.  pIn1 = 
265c0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
265d0 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70    pIn2 = &aMem[p
265e0 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72  Op->p2];.  asser
265f0 74 28 20 28 70 49 6e 32 2d 3e 66 6c 61 67 73 20  t( (pIn2->flags 
26600 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b  & MEM_Int)!=0 );
26610 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
26620 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
26630 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
26640 74 65 33 56 64 62 65 4d 65 6d 53 65 74 52 6f 77  te3VdbeMemSetRow
26650 53 65 74 28 70 49 6e 31 29 3b 0a 20 20 20 20 69  Set(pIn1);.    i
26660 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
26670 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30  & MEM_RowSet)==0
26680 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
26690 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 6f 77    }.  sqlite3Row
266a0 53 65 74 49 6e 73 65 72 74 28 70 49 6e 31 2d 3e  SetInsert(pIn1->
266b0 75 2e 70 52 6f 77 53 65 74 2c 20 70 49 6e 32 2d  u.pRowSet, pIn2-
266c0 3e 75 2e 69 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  >u.i);.  break;.
266d0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f  }../* Opcode: Ro
266e0 77 53 65 74 52 65 61 64 20 50 31 20 50 32 20 50  wSetRead P1 P2 P
266f0 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 74 72  3 * *.**.** Extr
26700 61 63 74 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  act the smallest
26710 20 76 61 6c 75 65 20 66 72 6f 6d 20 62 6f 6f 6c   value from bool
26720 65 61 6e 20 69 6e 64 65 78 20 50 31 20 61 6e 64  ean index P1 and
26730 20 70 75 74 20 74 68 61 74 20 76 61 6c 75 65 20   put that value 
26740 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72  into.** register
26750 20 50 33 2e 20 20 4f 72 2c 20 69 66 20 62 6f 6f   P3.  Or, if boo
26760 6c 65 61 6e 20 69 6e 64 65 78 20 50 31 20 69 73  lean index P1 is
26770 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79   initially empty
26780 2c 20 6c 65 61 76 65 20 50 33 0a 2a 2a 20 75 6e  , leave P3.** un
26790 63 68 61 6e 67 65 64 20 61 6e 64 20 6a 75 6d 70  changed and jump
267a0 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   to instruction 
267b0 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  P2..*/.case OP_R
267c0 6f 77 53 65 74 52 65 61 64 3a 20 7b 20 20 20 20  owSetRead: {    
267d0 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 2c     /* jump, in1,
267e0 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34 20 76   out3 */.  i64 v
267f0 61 6c 3b 0a 20 20 43 48 45 43 4b 5f 46 4f 52 5f  al;.  CHECK_FOR_
26800 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 70 49 6e  INTERRUPT;.  pIn
26810 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
26820 31 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d  1];.  if( (pIn1-
26830 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77  >flags & MEM_Row
26840 53 65 74 29 3d 3d 30 20 0a 20 20 20 7c 7c 20 73  Set)==0 .   || s
26850 71 6c 69 74 65 33 52 6f 77 53 65 74 4e 65 78 74  qlite3RowSetNext
26860 28 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74  (pIn1->u.pRowSet
26870 2c 20 26 76 61 6c 29 3d 3d 30 0a 20 20 29 7b 0a  , &val)==0.  ){.
26880 20 20 20 20 2f 2a 20 54 68 65 20 62 6f 6f 6c 65      /* The boole
26890 61 6e 20 69 6e 64 65 78 20 69 73 20 65 6d 70 74  an index is empt
268a0 79 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  y */.    sqlite3
268b0 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70  VdbeMemSetNull(p
268c0 49 6e 31 29 3b 0a 20 20 20 20 70 63 20 3d 20 70  In1);.    pc = p
268d0 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 65  Op->p2 - 1;.  }e
268e0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 20 76 61  lse{.    /* A va
268f0 6c 75 65 20 77 61 73 20 70 75 6c 6c 65 64 20 66  lue was pulled f
26900 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  rom the index */
26910 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
26920 4d 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d 65  MemSetInt64(&aMe
26930 6d 5b 70 4f 70 2d 3e 70 33 5d 2c 20 76 61 6c 29  m[pOp->p3], val)
26940 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
26950 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77  ../* Opcode: Row
26960 53 65 74 54 65 73 74 20 50 31 20 50 32 20 50 33  SetTest P1 P2 P3
26970 20 50 34 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74   P4.**.** Regist
26980 65 72 20 50 33 20 69 73 20 61 73 73 75 6d 65 64  er P3 is assumed
26990 20 74 6f 20 68 6f 6c 64 20 61 20 36 34 2d 62 69   to hold a 64-bi
269a0 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e  t integer value.
269b0 20 49 66 20 72 65 67 69 73 74 65 72 20 50 31 0a   If register P1.
269c0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 52 6f  ** contains a Ro
269d0 77 53 65 74 20 6f 62 6a 65 63 74 20 61 6e 64 20  wSet object and 
269e0 74 68 61 74 20 52 6f 77 53 65 74 20 6f 62 6a 65  that RowSet obje
269f0 63 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  ct contains.** t
26a00 68 65 20 76 61 6c 75 65 20 68 65 6c 64 20 69 6e  he value held in
26a10 20 50 33 2c 20 6a 75 6d 70 20 74 6f 20 72 65 67   P3, jump to reg
26a20 69 73 74 65 72 20 50 32 2e 20 4f 74 68 65 72 77  ister P2. Otherw
26a30 69 73 65 2c 20 69 6e 73 65 72 74 20 74 68 65 0a  ise, insert the.
26a40 2a 2a 20 69 6e 74 65 67 65 72 20 69 6e 20 50 33  ** integer in P3
26a50 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74   into the RowSet
26a60 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 20 6f 6e   and continue on
26a70 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20   to the.** next 
26a80 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  opcode..**.** Th
26a90 65 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20  e RowSet object 
26aa0 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72  is optimized for
26ab0 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
26ac0 73 75 63 63 65 73 73 69 76 65 20 73 65 74 73 0a  successive sets.
26ad0 2a 2a 20 6f 66 20 69 6e 74 65 67 65 72 73 2c 20  ** of integers, 
26ae0 77 68 65 72 65 20 65 61 63 68 20 73 65 74 20 63  where each set c
26af0 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 75 70 6c 69  ontains no dupli
26b00 63 61 74 65 73 2e 20 45 61 63 68 20 73 65 74 0a  cates. Each set.
26b10 2a 2a 20 6f 66 20 76 61 6c 75 65 73 20 69 73 20  ** of values is 
26b20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 61 20  identified by a 
26b30 75 6e 69 71 75 65 20 50 34 20 76 61 6c 75 65 2e  unique P4 value.
26b40 20 54 68 65 20 66 69 72 73 74 20 73 65 74 0a 2a   The first set.*
26b50 2a 20 6d 75 73 74 20 68 61 76 65 20 50 34 3d 3d  * must have P4==
26b60 30 2c 20 74 68 65 20 66 69 6e 61 6c 20 73 65 74  0, the final set
26b70 20 50 34 3d 2d 31 2e 20 20 50 34 20 6d 75 73 74   P4=-1.  P4 must
26b80 20 62 65 20 65 69 74 68 65 72 20 2d 31 20 6f 72   be either -1 or
26b90 0a 2a 2a 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  .** non-negative
26ba0 2e 20 20 46 6f 72 20 6e 6f 6e 2d 6e 65 67 61 74  .  For non-negat
26bb0 69 76 65 20 76 61 6c 75 65 73 20 6f 66 20 50 34  ive values of P4
26bc0 20 6f 6e 6c 79 20 74 68 65 20 6c 6f 77 65 72 20   only the lower 
26bd0 34 0a 2a 2a 20 62 69 74 73 20 61 72 65 20 73 69  4.** bits are si
26be0 67 6e 69 66 69 63 61 6e 74 2e 0a 2a 2a 0a 2a 2a  gnificant..**.**
26bf0 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 6f 70 74   This allows opt
26c00 69 6d 69 7a 61 74 69 6f 6e 73 3a 20 28 61 29 20  imizations: (a) 
26c10 77 68 65 6e 20 50 34 3d 3d 30 20 74 68 65 72 65  when P4==0 there
26c20 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74   is no need to t
26c30 65 73 74 0a 2a 2a 20 74 68 65 20 72 6f 77 73 65  est.** the rowse
26c40 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 50 33 2c  t object for P3,
26c50 20 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e   as it is guaran
26c60 74 65 65 64 20 6e 6f 74 20 74 6f 20 63 6f 6e 74  teed not to cont
26c70 61 69 6e 20 69 74 2c 0a 2a 2a 20 28 62 29 20 77  ain it,.** (b) w
26c80 68 65 6e 20 50 34 3d 3d 2d 31 20 74 68 65 72 65  hen P4==-1 there
26c90 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69   is no need to i
26ca0 6e 73 65 72 74 20 74 68 65 20 76 61 6c 75 65 2c  nsert the value,
26cb0 20 61 73 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 6e   as it will.** n
26cc0 65 76 65 72 20 62 65 20 74 65 73 74 65 64 20 66  ever be tested f
26cd0 6f 72 2c 20 61 6e 64 20 28 63 29 20 77 68 65 6e  or, and (c) when
26ce0 20 61 20 76 61 6c 75 65 20 74 68 61 74 20 69 73   a value that is
26cf0 20 70 61 72 74 20 6f 66 20 73 65 74 20 58 20 69   part of set X i
26d00 73 0a 2a 2a 20 69 6e 73 65 72 74 65 64 2c 20 74  s.** inserted, t
26d10 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
26d20 74 6f 20 73 65 61 72 63 68 20 74 6f 20 73 65 65  to search to see
26d30 20 69 66 20 74 68 65 20 73 61 6d 65 20 76 61 6c   if the same val
26d40 75 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f  ue was.** previo
26d50 75 73 6c 79 20 69 6e 73 65 72 74 65 64 20 61 73  usly inserted as
26d60 20 70 61 72 74 20 6f 66 20 73 65 74 20 58 20 28   part of set X (
26d70 6f 6e 6c 79 20 69 66 20 69 74 20 77 61 73 20 70  only if it was p
26d80 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 69 6e 73  reviously.** ins
26d90 65 72 74 65 64 20 61 73 20 70 61 72 74 20 6f 66  erted as part of
26da0 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 65 74 29   some other set)
26db0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77  ..*/.case OP_Row
26dc0 53 65 74 54 65 73 74 3a 20 7b 20 20 20 20 20 20  SetTest: {      
26dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26de0 2a 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33  * jump, in1, in3
26df0 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 74 3b 0a   */.  int iSet;.
26e00 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 0a 20    int exists;.. 
26e10 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
26e20 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 33 20 3d  p->p1];.  pIn3 =
26e30 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
26e40 0a 20 20 69 53 65 74 20 3d 20 70 4f 70 2d 3e 70  .  iSet = pOp->p
26e50 34 2e 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70  4.i;.  assert( p
26e60 49 6e 33 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49  In3->flags&MEM_I
26e70 6e 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  nt );..  /* If t
26e80 68 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e 67  here is anything
26e90 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 72 6f   other than a ro
26ea0 77 73 65 74 20 6f 62 6a 65 63 74 20 69 6e 20 6d  wset object in m
26eb0 65 6d 6f 72 79 20 63 65 6c 6c 20 50 31 2c 0a 20  emory cell P1,. 
26ec0 20 2a 2a 20 64 65 6c 65 74 65 20 69 74 20 6e 6f   ** delete it no
26ed0 77 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  w and initialize
26ee0 20 50 31 20 77 69 74 68 20 61 6e 20 65 6d 70 74   P1 with an empt
26ef0 79 20 72 6f 77 73 65 74 0a 20 20 2a 2f 0a 20 20  y rowset.  */.  
26f00 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
26f10 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d   & MEM_RowSet)==
26f20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
26f30 56 64 62 65 4d 65 6d 53 65 74 52 6f 77 53 65 74  VdbeMemSetRowSet
26f40 28 70 49 6e 31 29 3b 0a 20 20 20 20 69 66 28 20  (pIn1);.    if( 
26f50 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn1->flags & M
26f60 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 20  EM_RowSet)==0 ) 
26f70 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
26f80 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
26f90 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
26fa0 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  2 );.  assert( i
26fb0 53 65 74 3d 3d 2d 31 20 7c 7c 20 69 53 65 74 3e  Set==-1 || iSet>
26fc0 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 53 65 74  =0 );.  if( iSet
26fd0 20 29 7b 0a 20 20 20 20 65 78 69 73 74 73 20 3d   ){.    exists =
26fe0 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74 54 65   sqlite3RowSetTe
26ff0 73 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53  st(pIn1->u.pRowS
27000 65 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  et, .           
27010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27020 20 20 20 20 28 75 38 29 28 69 53 65 74 3e 3d 30      (u8)(iSet>=0
27030 20 3f 20 69 53 65 74 20 26 20 30 78 66 20 3a 20   ? iSet & 0xf : 
27040 30 78 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20  0xff),.         
27050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27060 20 20 20 20 20 20 70 49 6e 33 2d 3e 75 2e 69 29        pIn3->u.i)
27070 3b 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73  ;.    if( exists
27080 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70   ){.      pc = p
27090 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20  Op->p2 - 1;.    
270a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
270b0 20 7d 0a 20 20 69 66 28 20 69 53 65 74 3e 3d 30   }.  if( iSet>=0
270c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
270d0 6f 77 53 65 74 49 6e 73 65 72 74 28 70 49 6e 31  owSetInsert(pIn1
270e0 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20 70 49 6e  ->u.pRowSet, pIn
270f0 33 2d 3e 75 2e 69 29 3b 0a 20 20 7d 0a 20 20 62  3->u.i);.  }.  b
27100 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  reak;.}...#ifnde
27110 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
27120 49 47 47 45 52 0a 0a 2f 2a 20 4f 70 63 6f 64 65  IGGER../* Opcode
27130 3a 20 50 72 6f 67 72 61 6d 20 50 31 20 50 32 20  : Program P1 P2 
27140 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 45 78  P3 P4 *.**.** Ex
27150 65 63 75 74 65 20 74 68 65 20 74 72 69 67 67 65  ecute the trigge
27160 72 20 70 72 6f 67 72 61 6d 20 70 61 73 73 65 64  r program passed
27170 20 61 73 20 50 34 20 28 74 79 70 65 20 50 34 5f   as P4 (type P4_
27180 53 55 42 50 52 4f 47 52 41 4d 29 2e 20 0a 2a 2a  SUBPROGRAM). .**
27190 0a 2a 2a 20 50 31 20 63 6f 6e 74 61 69 6e 73 20  .** P1 contains 
271a0 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
271b0 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  he memory cell t
271c0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
271d0 20 66 69 72 73 74 20 6d 65 6d 6f 72 79 20 0a 2a   first memory .*
271e0 2a 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72  * cell in an arr
271f0 61 79 20 6f 66 20 76 61 6c 75 65 73 20 75 73 65  ay of values use
27200 64 20 61 73 20 61 72 67 75 6d 65 6e 74 73 20 74  d as arguments t
27210 6f 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61  o the sub-progra
27220 6d 2e 20 50 32 20 0a 2a 2a 20 63 6f 6e 74 61 69  m. P2 .** contai
27230 6e 73 20 74 68 65 20 61 64 64 72 65 73 73 20 74  ns the address t
27240 6f 20 6a 75 6d 70 20 74 6f 20 69 66 20 74 68 65  o jump to if the
27250 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 74 68 72   sub-program thr
27260 6f 77 73 20 61 6e 20 49 47 4e 4f 52 45 20 0a 2a  ows an IGNORE .*
27270 2a 20 65 78 63 65 70 74 69 6f 6e 20 75 73 69 6e  * exception usin
27280 67 20 74 68 65 20 52 41 49 53 45 28 29 20 66 75  g the RAISE() fu
27290 6e 63 74 69 6f 6e 2e 20 52 65 67 69 73 74 65 72  nction. Register
272a0 20 50 33 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   P3 contains the
272b0 20 61 64 64 72 65 73 73 20 0a 2a 2a 20 6f 66 20   address .** of 
272c0 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  a memory cell in
272d0 20 74 68 69 73 20 28 74 68 65 20 70 61 72 65 6e   this (the paren
272e0 74 29 20 56 4d 20 74 68 61 74 20 69 73 20 75 73  t) VM that is us
272f0 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  ed to allocate t
27300 68 65 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 72 65  he .** memory re
27310 71 75 69 72 65 64 20 62 79 20 74 68 65 20 73 75  quired by the su
27320 62 2d 76 64 62 65 20 61 74 20 72 75 6e 74 69 6d  b-vdbe at runtim
27330 65 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61  e..**.** P4 is a
27340 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
27350 56 4d 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  VM containing th
27360 65 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  e trigger progra
27370 6d 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 72  m..*/.case OP_Pr
27380 6f 67 72 61 6d 3a 20 7b 20 20 20 20 20 20 20 20  ogram: {        
27390 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74  /* jump */.  int
273a0 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
273b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
273c0 66 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  f memory registe
273d0 72 73 20 66 6f 72 20 73 75 62 2d 70 72 6f 67 72  rs for sub-progr
273e0 61 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  am */.  int nByt
273f0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
27400 2f 2a 20 42 79 74 65 73 20 6f 66 20 72 75 6e 74  /* Bytes of runt
27410 69 6d 65 20 73 70 61 63 65 20 72 65 71 75 69 72  ime space requir
27420 65 64 20 66 6f 72 20 73 75 62 2d 70 72 6f 67 72  ed for sub-progr
27430 61 6d 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 74  am */.  Mem *pRt
27440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27450 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20 61  /* Register to a
27460 6c 6c 6f 63 61 74 65 20 72 75 6e 74 69 6d 65 20  llocate runtime 
27470 73 70 61 63 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  space */.  Mem *
27480 70 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pMem;           
27490 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
274a0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6d 65  erate through me
274b0 6d 6f 72 79 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  mory cells */.  
274c0 4d 65 6d 20 2a 70 45 6e 64 3b 20 20 20 20 20 20  Mem *pEnd;      
274d0 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
274e0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 6e  memory cell in n
274f0 65 77 20 61 72 72 61 79 20 2a 2f 0a 20 20 56 64  ew array */.  Vd
27500 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b  beFrame *pFrame;
27510 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 76 64 62        /* New vdb
27520 65 20 66 72 61 6d 65 20 74 6f 20 65 78 65 63 75  e frame to execu
27530 74 65 20 69 6e 20 2a 2f 0a 20 20 53 75 62 50 72  te in */.  SubPr
27540 6f 67 72 61 6d 20 2a 70 50 72 6f 67 72 61 6d 3b  ogram *pProgram;
27550 20 20 20 2f 2a 20 53 75 62 2d 70 72 6f 67 72 61     /* Sub-progra
27560 6d 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a  m to execute */.
27570 20 20 76 6f 69 64 20 2a 74 3b 20 20 20 20 20 20    void *t;      
27580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b            /* Tok
27590 65 6e 20 69 64 65 6e 74 69 66 79 69 6e 67 20 74  en identifying t
275a0 72 69 67 67 65 72 20 2a 2f 0a 0a 20 20 70 50 72  rigger */..  pPr
275b0 6f 67 72 61 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e  ogram = pOp->p4.
275c0 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 52 74 20  pProgram;.  pRt 
275d0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
275e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 6f  ;.  assert( pPro
275f0 67 72 61 6d 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  gram->nOp>0 );. 
27600 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 35   .  /* If the p5
27610 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20   flag is clear, 
27620 74 68 65 6e 20 72 65 63 75 72 73 69 76 65 20 69  then recursive i
27630 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 72 69  nvocation of tri
27640 67 67 65 72 73 20 69 73 20 0a 20 20 2a 2a 20 64  ggers is .  ** d
27650 69 73 61 62 6c 65 64 20 66 6f 72 20 62 61 63 6b  isabled for back
27660 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
27670 69 74 79 20 28 70 35 20 69 73 20 73 65 74 20 69  ity (p5 is set i
27680 66 20 74 68 69 73 20 73 75 62 2d 70 72 6f 67 72  f this sub-progr
27690 61 6d 0a 20 20 2a 2a 20 69 73 20 72 65 61 6c 6c  am.  ** is reall
276a0 79 20 61 20 74 72 69 67 67 65 72 2c 20 6e 6f 74  y a trigger, not
276b0 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61   a foreign key a
276c0 63 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65 20 66  ction, and the f
276d0 6c 61 67 20 73 65 74 0a 20 20 2a 2a 20 61 6e 64  lag set.  ** and
276e0 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 20   cleared by the 
276f0 22 50 52 41 47 4d 41 20 72 65 63 75 72 73 69 76  "PRAGMA recursiv
27700 65 5f 74 72 69 67 67 65 72 73 22 20 63 6f 6d 6d  e_triggers" comm
27710 61 6e 64 20 69 73 20 63 6c 65 61 72 29 2e 0a 20  and is clear).. 
27720 20 2a 2a 20 0a 20 20 2a 2a 20 49 74 20 69 73 20   ** .  ** It is 
27730 72 65 63 75 72 73 69 76 65 20 69 6e 76 6f 63 61  recursive invoca
27740 74 69 6f 6e 20 6f 66 20 74 72 69 67 67 65 72 73  tion of triggers
27750 2c 20 61 74 20 74 68 65 20 53 51 4c 20 6c 65 76  , at the SQL lev
27760 65 6c 2c 20 74 68 61 74 20 69 73 20 0a 20 20 2a  el, that is .  *
27770 2a 20 64 69 73 61 62 6c 65 64 2e 20 49 6e 20 73  * disabled. In s
27780 6f 6d 65 20 63 61 73 65 73 20 61 20 73 69 6e 67  ome cases a sing
27790 6c 65 20 74 72 69 67 67 65 72 20 6d 61 79 20 67  le trigger may g
277a0 65 6e 65 72 61 74 65 20 6d 6f 72 65 20 74 68 61  enerate more tha
277b0 6e 20 6f 6e 65 20 0a 20 20 2a 2a 20 53 75 62 50  n one .  ** SubP
277c0 72 6f 67 72 61 6d 20 28 69 66 20 74 68 65 20 74  rogram (if the t
277d0 72 69 67 67 65 72 20 6d 61 79 20 62 65 20 65 78  rigger may be ex
277e0 65 63 75 74 65 64 20 77 69 74 68 20 6d 6f 72 65  ecuted with more
277f0 20 74 68 61 6e 20 6f 6e 65 20 64 69 66 66 65 72   than one differ
27800 65 6e 74 20 0a 20 20 2a 2a 20 4f 4e 20 43 4f 4e  ent .  ** ON CON
27810 46 4c 49 43 54 20 61 6c 67 6f 72 69 74 68 6d 29  FLICT algorithm)
27820 2e 20 53 75 62 50 72 6f 67 72 61 6d 20 73 74 72  . SubProgram str
27830 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
27840 65 64 20 77 69 74 68 20 61 0a 20 20 2a 2a 20 73  ed with a.  ** s
27850 69 6e 67 6c 65 20 74 72 69 67 67 65 72 20 61 6c  ingle trigger al
27860 6c 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  l have the same 
27870 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 53 75  value for the Su
27880 62 50 72 6f 67 72 61 6d 2e 74 6f 6b 65 6e 20 0a  bProgram.token .
27890 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20    ** variable.  
278a0 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35  */.  if( pOp->p5
278b0 20 29 7b 0a 20 20 20 20 74 20 3d 20 70 50 72 6f   ){.    t = pPro
278c0 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  gram->token;.   
278d0 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
278e0 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 20 26 26  Frame; pFrame &&
278f0 20 70 46 72 61 6d 65 2d 3e 74 6f 6b 65 6e 21 3d   pFrame->token!=
27900 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
27910 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
27920 69 66 28 20 70 46 72 61 6d 65 20 29 20 62 72 65  if( pFrame ) bre
27930 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  ak;.  }..  if( p
27940 2d 3e 6e 46 72 61 6d 65 3e 3d 64 62 2d 3e 61 4c  ->nFrame>=db->aL
27950 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
27960 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 5d  T_TRIGGER_DEPTH]
27970 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
27980 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
27990 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
279a0 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
279b0 20 22 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c   "too many level
279c0 73 20 6f 66 20 74 72 69 67 67 65 72 20 72 65 63  s of trigger rec
279d0 75 72 73 69 6f 6e 22 29 3b 0a 20 20 20 20 62 72  ursion");.    br
279e0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  eak;.  }..  /* R
279f0 65 67 69 73 74 65 72 20 70 52 74 20 69 73 20 75  egister pRt is u
27a00 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
27a10 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64   memory required
27a20 20 74 6f 20 73 61 76 65 20 74 68 65 20 73 74 61   to save the sta
27a30 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 63  te.  ** of the c
27a40 75 72 72 65 6e 74 20 70 72 6f 67 72 61 6d 2c 20  urrent program, 
27a50 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 72  and the memory r
27a60 65 71 75 69 72 65 64 20 61 74 20 72 75 6e 74 69  equired at runti
27a70 6d 65 20 74 6f 20 65 78 65 63 75 74 65 0a 20 20  me to execute.  
27a80 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 70  ** the trigger p
27a90 72 6f 67 72 61 6d 2e 20 49 66 20 74 68 69 73 20  rogram. If this 
27aa0 74 72 69 67 67 65 72 20 68 61 73 20 62 65 65 6e  trigger has been
27ab0 20 66 69 72 65 64 20 62 65 66 6f 72 65 2c 20 74   fired before, t
27ac0 68 65 6e 20 70 52 74 20 0a 20 20 2a 2a 20 69 73  hen pRt .  ** is
27ad0 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74   already allocat
27ae0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
27af0 74 20 6d 75 73 74 20 62 65 20 69 6e 69 74 69 61  t must be initia
27b00 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28  lized.  */.  if(
27b10 20 28 70 52 74 2d 3e 66 6c 61 67 73 26 4d 45 4d   (pRt->flags&MEM
27b20 5f 46 72 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  _Frame)==0 ){.  
27b30 20 20 2f 2a 20 53 75 62 50 72 6f 67 72 61 6d 2e    /* SubProgram.
27b40 6e 4d 65 6d 20 69 73 20 73 65 74 20 74 6f 20 74  nMem is set to t
27b50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 65 6d  he number of mem
27b60 6f 72 79 20 63 65 6c 6c 73 20 75 73 65 64 20 62  ory cells used b
27b70 79 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 72  y the .    ** pr
27b80 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20  ogram stored in 
27b90 53 75 62 50 72 6f 67 72 61 6d 2e 61 4f 70 2e 20  SubProgram.aOp. 
27ba0 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 73 65  As well as these
27bb0 2c 20 6f 6e 65 20 6d 65 6d 6f 72 79 0a 20 20 20  , one memory.   
27bc0 20 2a 2a 20 63 65 6c 6c 20 69 73 20 72 65 71 75   ** cell is requ
27bd0 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 63 75  ired for each cu
27be0 72 73 6f 72 20 75 73 65 64 20 62 79 20 74 68 65  rsor used by the
27bf0 20 70 72 6f 67 72 61 6d 2e 20 53 65 74 20 6c 6f   program. Set lo
27c00 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  cal.    ** varia
27c10 62 6c 65 20 6e 4d 65 6d 20 28 61 6e 64 20 6c 61  ble nMem (and la
27c20 74 65 72 2c 20 56 64 62 65 46 72 61 6d 65 2e 6e  ter, VdbeFrame.n
27c30 43 68 69 6c 64 4d 65 6d 29 20 74 6f 20 74 68 69  ChildMem) to thi
27c40 73 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a  s value..    */.
27c50 20 20 20 20 6e 4d 65 6d 20 3d 20 70 50 72 6f 67      nMem = pProg
27c60 72 61 6d 2d 3e 6e 4d 65 6d 20 2b 20 70 50 72 6f  ram->nMem + pPro
27c70 67 72 61 6d 2d 3e 6e 43 73 72 3b 0a 20 20 20 20  gram->nCsr;.    
27c80 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73  nByte = ROUND8(s
27c90 69 7a 65 6f 66 28 56 64 62 65 46 72 61 6d 65 29  izeof(VdbeFrame)
27ca0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
27cb0 2b 20 6e 4d 65 6d 20 2a 20 73 69 7a 65 6f 66 28  + nMem * sizeof(
27cc0 4d 65 6d 29 0a 20 20 20 20 20 20 20 20 20 20 20  Mem).           
27cd0 20 20 20 2b 20 70 50 72 6f 67 72 61 6d 2d 3e 6e     + pProgram->n
27ce0 43 73 72 20 2a 20 73 69 7a 65 6f 66 28 56 64 62  Csr * sizeof(Vdb
27cf0 65 43 75 72 73 6f 72 20 2a 29 3b 0a 20 20 20 20  eCursor *);.    
27d00 70 46 72 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  pFrame = sqlite3
27d10 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
27d20 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
27d30 20 21 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20   !pFrame ){.    
27d40 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
27d50 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
27d60 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
27d70 52 74 29 3b 0a 20 20 20 20 70 52 74 2d 3e 66 6c  Rt);.    pRt->fl
27d80 61 67 73 20 3d 20 4d 45 4d 5f 46 72 61 6d 65 3b  ags = MEM_Frame;
27d90 0a 20 20 20 20 70 52 74 2d 3e 75 2e 70 46 72 61  .    pRt->u.pFra
27da0 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a 0a 20 20  me = pFrame;..  
27db0 20 20 70 46 72 61 6d 65 2d 3e 76 20 3d 20 70 3b    pFrame->v = p;
27dc0 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68  .    pFrame->nCh
27dd0 69 6c 64 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20  ildMem = nMem;. 
27de0 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c     pFrame->nChil
27df0 64 43 73 72 20 3d 20 70 50 72 6f 67 72 61 6d 2d  dCsr = pProgram-
27e00 3e 6e 43 73 72 3b 0a 20 20 20 20 70 46 72 61 6d  >nCsr;.    pFram
27e10 65 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20 20 20  e->pc = pc;.    
27e20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 20 3d 20 70  pFrame->aMem = p
27e30 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61  ->aMem;.    pFra
27e40 6d 65 2d 3e 6e 4d 65 6d 20 3d 20 70 2d 3e 6e 4d  me->nMem = p->nM
27e50 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e  em;.    pFrame->
27e60 61 70 43 73 72 20 3d 20 70 2d 3e 61 70 43 73 72  apCsr = p->apCsr
27e70 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43  ;.    pFrame->nC
27e80 75 72 73 6f 72 20 3d 20 70 2d 3e 6e 43 75 72 73  ursor = p->nCurs
27e90 6f 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e  or;.    pFrame->
27ea0 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20  aOp = p->aOp;.  
27eb0 20 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 20 3d 20    pFrame->nOp = 
27ec0 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 70 46 72 61  p->nOp;.    pFra
27ed0 6d 65 2d 3e 74 6f 6b 65 6e 20 3d 20 70 50 72 6f  me->token = pPro
27ee0 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 0a 20 20  gram->token;..  
27ef0 20 20 70 45 6e 64 20 3d 20 26 56 64 62 65 46 72    pEnd = &VdbeFr
27f00 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65 29 5b 70  ameMem(pFrame)[p
27f10 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d  Frame->nChildMem
27f20 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4d 65 6d 3d  ];.    for(pMem=
27f30 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 46 72  VdbeFrameMem(pFr
27f40 61 6d 65 29 3b 20 70 4d 65 6d 21 3d 70 45 6e 64  ame); pMem!=pEnd
27f50 3b 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 20  ; pMem++){.     
27f60 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
27f70 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70  EM_Null;.      p
27f80 4d 65 6d 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  Mem->db = db;.  
27f90 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
27fa0 20 70 46 72 61 6d 65 20 3d 20 70 52 74 2d 3e 75   pFrame = pRt->u
27fb0 2e 70 46 72 61 6d 65 3b 0a 20 20 20 20 61 73 73  .pFrame;.    ass
27fc0 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e  ert( pProgram->n
27fd0 4d 65 6d 2b 70 50 72 6f 67 72 61 6d 2d 3e 6e 43  Mem+pProgram->nC
27fe0 73 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68 69  sr==pFrame->nChi
27ff0 6c 64 4d 65 6d 20 29 3b 0a 20 20 20 20 61 73 73  ldMem );.    ass
28000 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e  ert( pProgram->n
28010 43 73 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68  Csr==pFrame->nCh
28020 69 6c 64 43 73 72 20 29 3b 0a 20 20 20 20 61 73  ildCsr );.    as
28030 73 65 72 74 28 20 70 63 3d 3d 70 46 72 61 6d 65  sert( pc==pFrame
28040 2d 3e 70 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 70  ->pc );.  }..  p
28050 2d 3e 6e 46 72 61 6d 65 2b 2b 3b 0a 20 20 70 46  ->nFrame++;.  pF
28060 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  rame->pParent = 
28070 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 70 46 72  p->pFrame;.  pFr
28080 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d  ame->lastRowid =
28090 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a   db->lastRowid;.
280a0 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67    pFrame->nChang
280b0 65 20 3d 20 70 2d 3e 6e 43 68 61 6e 67 65 3b 0a  e = p->nChange;.
280c0 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
280d0 3b 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20  ;.  p->pFrame = 
280e0 70 46 72 61 6d 65 3b 0a 20 20 70 2d 3e 61 4d 65  pFrame;.  p->aMe
280f0 6d 20 3d 20 61 4d 65 6d 20 3d 20 26 56 64 62 65  m = aMem = &Vdbe
28100 46 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65 29  FrameMem(pFrame)
28110 5b 2d 31 5d 3b 0a 20 20 70 2d 3e 6e 4d 65 6d 20  [-1];.  p->nMem 
28120 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64  = pFrame->nChild
28130 4d 65 6d 3b 0a 20 20 70 2d 3e 6e 43 75 72 73 6f  Mem;.  p->nCurso
28140 72 20 3d 20 28 75 31 36 29 70 46 72 61 6d 65 2d  r = (u16)pFrame-
28150 3e 6e 43 68 69 6c 64 43 73 72 3b 0a 20 20 70 2d  >nChildCsr;.  p-
28160 3e 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75  >apCsr = (VdbeCu
28170 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d  rsor **)&aMem[p-
28180 3e 6e 4d 65 6d 2b 31 5d 3b 0a 20 20 70 2d 3e 61  >nMem+1];.  p->a
28190 4f 70 20 3d 20 61 4f 70 20 3d 20 70 50 72 6f 67  Op = aOp = pProg
281a0 72 61 6d 2d 3e 61 4f 70 3b 0a 20 20 70 2d 3e 6e  ram->aOp;.  p->n
281b0 4f 70 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 6e  Op = pProgram->n
281c0 4f 70 3b 0a 20 20 70 63 20 3d 20 2d 31 3b 0a 0a  Op;.  pc = -1;..
281d0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
281e0 70 63 6f 64 65 3a 20 50 61 72 61 6d 20 50 31 20  pcode: Param P1 
281f0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  P2 * * *.**.** T
28200 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e  his opcode is on
28210 6c 79 20 65 76 65 72 20 70 72 65 73 65 6e 74 20  ly ever present 
28220 69 6e 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20  in sub-programs 
28230 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 0a  called via the .
28240 2a 2a 20 4f 50 5f 50 72 6f 67 72 61 6d 20 69 6e  ** OP_Program in
28250 73 74 72 75 63 74 69 6f 6e 2e 20 43 6f 70 79 20  struction. Copy 
28260 61 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c  a value currentl
28270 79 20 73 74 6f 72 65 64 20 69 6e 20 61 20 6d 65  y stored in a me
28280 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 6f 66  mory .** cell of
28290 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 28 70 61   the calling (pa
282a0 72 65 6e 74 29 20 66 72 61 6d 65 20 74 6f 20 63  rent) frame to c
282b0 65 6c 6c 20 50 32 20 69 6e 20 74 68 65 20 63 75  ell P2 in the cu
282c0 72 72 65 6e 74 20 66 72 61 6d 65 73 20 0a 2a 2a  rrent frames .**
282d0 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20   address space. 
282e0 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
282f0 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
28300 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 6e   to access the n
28310 65 77 2e 2a 20 0a 2a 2a 20 61 6e 64 20 6f 6c 64  ew.* .** and old
28320 2e 2a 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  .* values..**.**
28330 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   The address of 
28340 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20  the cell in the 
28350 70 61 72 65 6e 74 20 66 72 61 6d 65 20 69 73 20  parent frame is 
28360 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 64  determined by ad
28370 64 69 6e 67 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ding.** the valu
28380 65 20 6f 66 20 74 68 65 20 50 31 20 61 72 67 75  e of the P1 argu
28390 6d 65 6e 74 20 74 6f 20 74 68 65 20 76 61 6c 75  ment to the valu
283a0 65 20 6f 66 20 74 68 65 20 50 31 20 61 72 67 75  e of the P1 argu
283b0 6d 65 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ment to the.** c
283c0 61 6c 6c 69 6e 67 20 4f 50 5f 50 72 6f 67 72 61  alling OP_Progra
283d0 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  m instruction..*
283e0 2f 0a 63 61 73 65 20 4f 50 5f 50 61 72 61 6d 3a  /.case OP_Param:
283f0 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {           /* 
28400 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20  out2-prerelease 
28410 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a  */.  VdbeFrame *
28420 70 46 72 61 6d 65 3b 0a 20 20 4d 65 6d 20 2a 70  pFrame;.  Mem *p
28430 49 6e 3b 0a 20 20 70 46 72 61 6d 65 20 3d 20 70  In;.  pFrame = p
28440 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 70 49 6e 20  ->pFrame;.  pIn 
28450 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b  = &pFrame->aMem[
28460 70 4f 70 2d 3e 70 31 20 2b 20 70 46 72 61 6d 65  pOp->p1 + pFrame
28470 2d 3e 61 4f 70 5b 70 46 72 61 6d 65 2d 3e 70 63  ->aOp[pFrame->pc
28480 5d 2e 70 31 5d 3b 20 20 20 0a 20 20 73 71 6c 69  ].p1];   .  sqli
28490 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
284a0 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 2c  wCopy(pOut, pIn,
284b0 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 62   MEM_Ephem);.  b
284c0 72 65 61 6b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  reak;.}..#endif 
284d0 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
284e0 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 20 2a  E_OMIT_TRIGGER *
284f0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
28500 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
28510 45 59 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6b  EY./* Opcode: Fk
28520 43 6f 75 6e 74 65 72 20 50 31 20 50 32 20 2a 20  Counter P1 P2 * 
28530 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 6d  * *.**.** Increm
28540 65 6e 74 20 61 20 22 63 6f 6e 73 74 72 61 69 6e  ent a "constrain
28550 74 20 63 6f 75 6e 74 65 72 22 20 62 79 20 50 32  t counter" by P2
28560 20 28 50 32 20 6d 61 79 20 62 65 20 6e 65 67 61   (P2 may be nega
28570 74 69 76 65 20 6f 72 20 70 6f 73 69 74 69 76 65  tive or positive
28580 29 2e 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 6e  )..** If P1 is n
28590 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 64 61 74  on-zero, the dat
285a0 61 62 61 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  abase constraint
285b0 20 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 63 72   counter is incr
285c0 65 6d 65 6e 74 65 64 20 0a 2a 2a 20 28 64 65 66  emented .** (def
285d0 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  erred foreign ke
285e0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e 20  y constraints). 
285f0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 50 31  Otherwise, if P1
28600 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 20 0a 2a   is zero, the .*
28610 2a 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 75 6e  * statement coun
28620 74 65 72 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ter is increment
28630 65 64 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f  ed (immediate fo
28640 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
28650 61 69 6e 74 73 29 2e 0a 2a 2f 0a 63 61 73 65 20  aints)..*/.case 
28660 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 3a 20 7b 0a  OP_FkCounter: {.
28670 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b    if( pOp->p1 ){
28680 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  .    db->nDeferr
28690 65 64 43 6f 6e 73 20 2b 3d 20 70 4f 70 2d 3e 70  edCons += pOp->p
286a0 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
286b0 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
286c0 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d   += pOp->p2;.  }
286d0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
286e0 4f 70 63 6f 64 65 3a 20 46 6b 49 66 5a 65 72 6f  Opcode: FkIfZero
286f0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
28700 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 74  ** This opcode t
28710 65 73 74 73 20 69 66 20 61 20 66 6f 72 65 69 67  ests if a foreig
28720 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
28730 2d 63 6f 75 6e 74 65 72 20 69 73 20 63 75 72 72  -counter is curr
28740 65 6e 74 6c 79 20 7a 65 72 6f 2e 0a 2a 2a 20 49  ently zero..** I
28750 66 20 73 6f 2c 20 6a 75 6d 70 20 74 6f 20 69 6e  f so, jump to in
28760 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 20 4f 74  struction P2. Ot
28770 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68  herwise, fall th
28780 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
28790 74 20 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  t .** instructio
287a0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 31 20 69  n..**.** If P1 i
287b0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
287c0 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
287d0 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61  en if the databa
287e0 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f  se constraint-co
287f0 75 6e 74 65 72 0a 2a 2a 20 69 73 20 7a 65 72 6f  unter.** is zero
28800 20 28 74 68 65 20 6f 6e 65 20 74 68 61 74 20 63   (the one that c
28810 6f 75 6e 74 73 20 64 65 66 65 72 72 65 64 20 63  ounts deferred c
28820 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
28830 69 6f 6e 73 29 2e 20 49 66 20 50 31 20 69 73 0a  ions). If P1 is.
28840 2a 2a 20 7a 65 72 6f 2c 20 74 68 65 20 6a 75 6d  ** zero, the jum
28850 70 20 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68  p is taken if th
28860 65 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 73  e statement cons
28870 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72 20 69  traint-counter i
28880 73 20 7a 65 72 6f 0a 2a 2a 20 28 69 6d 6d 65 64  s zero.** (immed
28890 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
288a0 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
288b0 61 74 69 6f 6e 73 29 2e 0a 2a 2f 0a 63 61 73 65  ations)..*/.case
288c0 20 4f 50 5f 46 6b 49 66 5a 65 72 6f 3a 20 7b 20   OP_FkIfZero: { 
288d0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
288e0 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31  */.  if( pOp->p1
288f0 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
28900 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3d 3d 30  nDeferredCons==0
28910 20 29 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 2d   ) pc = pOp->p2-
28920 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
28930 69 66 28 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72  if( p->nFkConstr
28940 61 69 6e 74 3d 3d 30 20 29 20 70 63 20 3d 20 70  aint==0 ) pc = p
28950 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d 0a 20 20  Op->p2-1;.  }.  
28960 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
28970 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
28980 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
28990 45 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  EY */..#ifndef S
289a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
289b0 4e 43 52 45 4d 45 4e 54 0a 2f 2a 20 4f 70 63 6f  NCREMENT./* Opco
289c0 64 65 3a 20 4d 65 6d 4d 61 78 20 50 31 20 50 32  de: MemMax P1 P2
289d0 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 31 20   * * *.**.** P1 
289e0 69 73 20 61 20 72 65 67 69 73 74 65 72 20 69 6e  is a register in
289f0 20 74 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20   the root frame 
28a00 6f 66 20 74 68 69 73 20 56 4d 20 28 74 68 65 20  of this VM (the 
28a10 72 6f 6f 74 20 66 72 61 6d 65 20 69 73 0a 2a 2a  root frame is.**
28a20 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
28a30 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d  the current fram
28a40 65 20 69 66 20 74 68 69 73 20 69 6e 73 74 72 75  e if this instru
28a50 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 65  ction is being e
28a60 78 65 63 75 74 65 64 0a 2a 2a 20 77 69 74 68 69  xecuted.** withi
28a70 6e 20 61 20 73 75 62 2d 70 72 6f 67 72 61 6d 29  n a sub-program)
28a80 2e 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  . Set the value 
28a90 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20 74  of register P1 t
28aa0 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  o the maximum of
28ab0 20 0a 2a 2a 20 69 74 73 20 63 75 72 72 65 6e 74   .** its current
28ac0 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 76   value and the v
28ad0 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
28ae0 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   P2..**.** This 
28af0 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 72 6f  instruction thro
28b00 77 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ws an error if t
28b10 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  he memory cell i
28b20 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 0a  s not initially.
28b30 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a  ** an integer..*
28b40 2f 0a 63 61 73 65 20 4f 50 5f 4d 65 6d 4d 61 78  /.case OP_MemMax
28b50 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 69 6e  : {        /* in
28b60 32 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 31  2 */.  Mem *pIn1
28b70 3b 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70  ;.  VdbeFrame *p
28b80 46 72 61 6d 65 3b 0a 20 20 69 66 28 20 70 2d 3e  Frame;.  if( p->
28b90 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f  pFrame ){.    fo
28ba0 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61  r(pFrame=p->pFra
28bb0 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72  me; pFrame->pPar
28bc0 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61  ent; pFrame=pFra
28bd0 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  me->pParent);.  
28be0 20 20 70 49 6e 31 20 3d 20 26 70 46 72 61 6d 65    pIn1 = &pFrame
28bf0 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b  ->aMem[pOp->p1];
28c00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
28c10 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
28c20 70 31 5d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  p1];.  }.  sqlit
28c30 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72  e3VdbeMemInteger
28c40 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e  ify(pIn1);.  pIn
28c50 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  2 = &aMem[pOp->p
28c60 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  2];.  sqlite3Vdb
28c70 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70  eMemIntegerify(p
28c80 49 6e 32 29 3b 0a 20 20 69 66 28 20 70 49 6e 31  In2);.  if( pIn1
28c90 2d 3e 75 2e 69 3c 70 49 6e 32 2d 3e 75 2e 69 29  ->u.i<pIn2->u.i)
28ca0 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 75 2e 69 20  {.    pIn1->u.i 
28cb0 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 7d  = pIn2->u.i;.  }
28cc0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
28cd0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
28ce0 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  T_AUTOINCREMENT 
28cf0 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  */../* Opcode: I
28d00 66 50 6f 73 20 50 31 20 50 32 20 2a 20 2a 20 2a  fPos P1 P2 * * *
28d10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 76 61  .**.** If the va
28d20 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20  lue of register 
28d30 50 31 20 69 73 20 31 20 6f 72 20 67 72 65 61 74  P1 is 1 or great
28d40 65 72 2c 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a  er, jump to P2..
28d50 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  **.** It is ille
28d60 67 61 6c 20 74 6f 20 75 73 65 20 74 68 69 73 20  gal to use this 
28d70 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 20 61  instruction on a
28d80 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 64   register that d
28d90 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
28da0 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  in an integer.  
28db0 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75  An assertion fau
28dc0 6c 74 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  lt will result i
28dd0 66 20 79 6f 75 20 74 72 79 2e 0a 2a 2f 0a 63 61  f you try..*/.ca
28de0 73 65 20 4f 50 5f 49 66 50 6f 73 3a 20 7b 20 20  se OP_IfPos: {  
28df0 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69        /* jump, i
28e00 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
28e10 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
28e20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66   assert( pIn1->f
28e30 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a  lags&MEM_Int );.
28e40 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e    if( pIn1->u.i>
28e50 30 20 29 7b 0a 20 20 20 20 20 70 63 20 3d 20 70  0 ){.     pc = p
28e60 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a  Op->p2 - 1;.  }.
28e70 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
28e80 70 63 6f 64 65 3a 20 49 66 4e 65 67 20 50 31 20  pcode: IfNeg P1 
28e90 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49  P2 * * *.**.** I
28ea0 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 72  f the value of r
28eb0 65 67 69 73 74 65 72 20 50 31 20 69 73 20 6c 65  egister P1 is le
28ec0 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 6a 75  ss than zero, ju
28ed0 6d 70 20 74 6f 20 50 32 2e 20 0a 2a 2a 0a 2a 2a  mp to P2. .**.**
28ee0 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
28ef0 6f 20 75 73 65 20 74 68 69 73 20 69 6e 73 74 72  o use this instr
28f00 75 63 74 69 6f 6e 20 6f 6e 20 61 20 72 65 67 69  uction on a regi
28f10 73 74 65 72 20 74 68 61 74 20 64 6f 65 73 0a 2a  ster that does.*
28f20 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  * not contain an
28f30 20 69 6e 74 65 67 65 72 2e 20 20 41 6e 20 61 73   integer.  An as
28f40 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69  sertion fault wi
28f50 6c 6c 20 72 65 73 75 6c 74 20 69 66 20 79 6f 75  ll result if you
28f60 20 74 72 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50   try..*/.case OP
28f70 5f 49 66 4e 65 67 3a 20 7b 20 20 20 20 20 20 20  _IfNeg: {       
28f80 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f   /* jump, in1 */
28f90 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
28fa0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
28fb0 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26  rt( pIn1->flags&
28fc0 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 69 66 28  MEM_Int );.  if(
28fd0 20 70 49 6e 31 2d 3e 75 2e 69 3c 30 20 29 7b 0a   pIn1->u.i<0 ){.
28fe0 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70       pc = pOp->p
28ff0 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65  2 - 1;.  }.  bre
29000 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
29010 3a 20 49 66 5a 65 72 6f 20 50 31 20 50 32 20 50  : IfZero P1 P2 P
29020 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  3 * *.**.** The 
29030 72 65 67 69 73 74 65 72 20 50 31 20 6d 75 73 74  register P1 must
29040 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65   contain an inte
29050 67 65 72 2e 20 20 41 64 64 20 6c 69 74 65 72 61  ger.  Add litera
29060 6c 20 50 33 20 74 6f 20 74 68 65 0a 2a 2a 20 76  l P3 to the.** v
29070 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
29080 20 50 31 2e 20 20 49 66 20 74 68 65 20 72 65 73   P1.  If the res
29090 75 6c 74 20 69 73 20 65 78 61 63 74 6c 79 20 30  ult is exactly 0
290a0 2c 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 0a 2a  , jump to P2. .*
290b0 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  *.** It is illeg
290c0 61 6c 20 74 6f 20 75 73 65 20 74 68 69 73 20 69  al to use this i
290d0 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 20 61 20  nstruction on a 
290e0 72 65 67 69 73 74 65 72 20 74 68 61 74 20 64 6f  register that do
290f0 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
29100 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 41  n an integer.  A
29110 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c  n assertion faul
29120 74 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 66  t will result if
29130 20 79 6f 75 20 74 72 79 2e 0a 2a 2f 0a 63 61 73   you try..*/.cas
29140 65 20 4f 50 5f 49 66 5a 65 72 6f 3a 20 7b 20 20  e OP_IfZero: {  
29150 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69        /* jump, i
29160 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
29170 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
29180 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66   assert( pIn1->f
29190 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a  lags&MEM_Int );.
291a0 20 20 70 49 6e 31 2d 3e 75 2e 69 20 2b 3d 20 70    pIn1->u.i += p
291b0 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 70 49  Op->p3;.  if( pI
291c0 6e 31 2d 3e 75 2e 69 3d 3d 30 20 29 7b 0a 20 20  n1->u.i==0 ){.  
291d0 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
291e0 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  - 1;.  }.  break
291f0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
29200 41 67 67 53 74 65 70 20 2a 20 50 32 20 50 33 20  AggStep * P2 P3 
29210 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 45 78 65 63  P4 P5.**.** Exec
29220 75 74 65 20 74 68 65 20 73 74 65 70 20 66 75 6e  ute the step fun
29230 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 61 67 67  ction for an agg
29240 72 65 67 61 74 65 2e 20 20 54 68 65 0a 2a 2a 20  regate.  The.** 
29250 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 50 35 20  function has P5 
29260 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 50 34 20  arguments.   P4 
29270 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
29280 74 68 65 20 46 75 6e 63 44 65 66 0a 2a 2a 20 73  the FuncDef.** s
29290 74 72 75 63 74 75 72 65 20 74 68 61 74 20 73 70  tructure that sp
292a0 65 63 69 66 69 65 73 20 74 68 65 20 66 75 6e 63  ecifies the func
292b0 74 69 6f 6e 2e 20 20 55 73 65 20 72 65 67 69 73  tion.  Use regis
292c0 74 65 72 0a 2a 2a 20 50 33 20 61 73 20 74 68 65  ter.** P3 as the
292d0 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a   accumulator..**
292e0 0a 2a 2a 20 54 68 65 20 50 35 20 61 72 67 75 6d  .** The P5 argum
292f0 65 6e 74 73 20 61 72 65 20 74 61 6b 65 6e 20 66  ents are taken f
29300 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50 32 20  rom register P2 
29310 61 6e 64 20 69 74 73 0a 2a 2a 20 73 75 63 63 65  and its.** succe
29320 73 73 6f 72 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ssors..*/.case O
29330 50 5f 41 67 67 53 74 65 70 3a 20 7b 0a 20 20 69  P_AggStep: {.  i
29340 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  nt n;.  int i;. 
29350 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 4d 65   Mem *pMem;.  Me
29360 6d 20 2a 70 52 65 63 3b 0a 20 20 73 71 6c 69 74  m *pRec;.  sqlit
29370 65 33 5f 63 6f 6e 74 65 78 74 20 63 74 78 3b 0a  e3_context ctx;.
29380 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
29390 2a 2a 61 70 56 61 6c 3b 0a 0a 20 20 6e 20 3d 20  **apVal;..  n = 
293a0 70 4f 70 2d 3e 70 35 3b 0a 20 20 61 73 73 65 72  pOp->p5;.  asser
293b0 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 70 52 65  t( n>=0 );.  pRe
293c0 63 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  c = &aMem[pOp->p
293d0 32 5d 3b 0a 20 20 61 70 56 61 6c 20 3d 20 70 2d  2];.  apVal = p-
293e0 3e 61 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74  >apArg;.  assert
293f0 28 20 61 70 56 61 6c 20 7c 7c 20 6e 3d 3d 30 20  ( apVal || n==0 
29400 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
29410 6e 3b 20 69 2b 2b 2c 20 70 52 65 63 2b 2b 29 7b  n; i++, pRec++){
29420 0a 20 20 20 20 61 70 56 61 6c 5b 69 5d 20 3d 20  .    apVal[i] = 
29430 70 52 65 63 3b 0a 20 20 20 20 73 71 6c 69 74 65  pRec;.    sqlite
29440 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70  3VdbeMemStoreTyp
29450 65 28 70 52 65 63 29 3b 0a 20 20 7d 0a 20 20 63  e(pRec);.  }.  c
29460 74 78 2e 70 46 75 6e 63 20 3d 20 70 4f 70 2d 3e  tx.pFunc = pOp->
29470 70 34 2e 70 46 75 6e 63 3b 0a 20 20 61 73 73 65  p4.pFunc;.  asse
29480 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26  rt( pOp->p3>0 &&
29490 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65   pOp->p3<=p->nMe
294a0 6d 20 29 3b 0a 20 20 63 74 78 2e 70 4d 65 6d 20  m );.  ctx.pMem 
294b0 3d 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70  = pMem = &aMem[p
294c0 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 4d 65 6d 2d  Op->p3];.  pMem-
294d0 3e 6e 2b 2b 3b 0a 20 20 63 74 78 2e 73 2e 66 6c  >n++;.  ctx.s.fl
294e0 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
294f0 20 20 63 74 78 2e 73 2e 7a 20 3d 20 30 3b 0a 20    ctx.s.z = 0;. 
29500 20 63 74 78 2e 73 2e 7a 4d 61 6c 6c 6f 63 20 3d   ctx.s.zMalloc =
29510 20 30 3b 0a 20 20 63 74 78 2e 73 2e 78 44 65 6c   0;.  ctx.s.xDel
29520 20 3d 20 30 3b 0a 20 20 63 74 78 2e 73 2e 64 62   = 0;.  ctx.s.db
29530 20 3d 20 64 62 3b 0a 20 20 63 74 78 2e 69 73 45   = db;.  ctx.isE
29540 72 72 6f 72 20 3d 20 30 3b 0a 20 20 63 74 78 2e  rror = 0;.  ctx.
29550 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28  pColl = 0;.  if(
29560 20 63 74 78 2e 70 46 75 6e 63 2d 3e 66 6c 61 67   ctx.pFunc->flag
29570 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
29580 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20  NEEDCOLL ){.    
29590 61 73 73 65 72 74 28 20 70 4f 70 3e 70 2d 3e 61  assert( pOp>p->a
295a0 4f 70 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Op );.    assert
295b0 28 20 70 4f 70 5b 2d 31 5d 2e 70 34 74 79 70 65  ( pOp[-1].p4type
295c0 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a  ==P4_COLLSEQ );.
295d0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
295e0 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  -1].opcode==OP_C
295f0 6f 6c 6c 53 65 71 20 29 3b 0a 20 20 20 20 63 74  ollSeq );.    ct
29600 78 2e 70 43 6f 6c 6c 20 3d 20 70 4f 70 5b 2d 31  x.pColl = pOp[-1
29610 5d 2e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 7d 0a  ].p4.pColl;.  }.
29620 20 20 28 63 74 78 2e 70 46 75 6e 63 2d 3e 78 53    (ctx.pFunc->xS
29630 74 65 70 29 28 26 63 74 78 2c 20 6e 2c 20 61 70  tep)(&ctx, n, ap
29640 56 61 6c 29 3b 0a 20 20 69 66 28 20 63 74 78 2e  Val);.  if( ctx.
29650 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 73  isError ){.    s
29660 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
29670 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
29680 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76   "%s", sqlite3_v
29690 61 6c 75 65 5f 74 65 78 74 28 26 63 74 78 2e 73  alue_text(&ctx.s
296a0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 74 78  ));.    rc = ctx
296b0 2e 69 73 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  .isError;.  }.  
296c0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
296d0 6c 65 61 73 65 28 26 63 74 78 2e 73 29 3b 0a 20  lease(&ctx.s);. 
296e0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
296f0 63 6f 64 65 3a 20 41 67 67 46 69 6e 61 6c 20 50  code: AggFinal P
29700 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  1 P2 * P4 *.**.*
29710 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 66 69  * Execute the fi
29720 6e 61 6c 69 7a 65 72 20 66 75 6e 63 74 69 6f 6e  nalizer function
29730 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
29740 65 2e 20 20 50 31 20 69 73 0a 2a 2a 20 74 68 65  e.  P1 is.** the
29750 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
29760 20 74 68 61 74 20 69 73 20 74 68 65 20 61 63 63   that is the acc
29770 75 6d 75 6c 61 74 6f 72 20 66 6f 72 20 74 68 65  umulator for the
29780 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a   aggregate..**.*
29790 2a 20 50 32 20 69 73 20 74 68 65 20 6e 75 6d 62  * P2 is the numb
297a0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
297b0 74 68 61 74 20 74 68 65 20 73 74 65 70 20 66 75  that the step fu
297c0 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 61 6e 64  nction takes and
297d0 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e  .** P4 is a poin
297e0 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44  ter to the FuncD
297f0 65 66 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63  ef for this func
29800 74 69 6f 6e 2e 20 20 54 68 65 20 50 32 0a 2a 2a  tion.  The P2.**
29810 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
29820 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6f 70   used by this op
29830 63 6f 64 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c  code.  It is onl
29840 79 20 74 68 65 72 65 20 74 6f 20 64 69 73 61 6d  y there to disam
29850 62 69 67 75 61 74 65 0a 2a 2a 20 66 75 6e 63 74  biguate.** funct
29860 69 6f 6e 73 20 74 68 61 74 20 63 61 6e 20 74 61  ions that can ta
29870 6b 65 20 76 61 72 79 69 6e 67 20 6e 75 6d 62 65  ke varying numbe
29880 72 73 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  rs of arguments.
29890 20 20 54 68 65 0a 2a 2a 20 50 34 20 61 72 67 75    The.** P4 argu
298a0 6d 65 6e 74 20 69 73 20 6f 6e 6c 79 20 6e 65 65  ment is only nee
298b0 64 65 64 20 66 6f 72 20 74 68 65 20 64 65 67 65  ded for the dege
298c0 6e 65 72 61 74 65 20 63 61 73 65 20 77 68 65 72  nerate case wher
298d0 65 0a 2a 2a 20 74 68 65 20 73 74 65 70 20 66 75  e.** the step fu
298e0 6e 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 70  nction was not p
298f0 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64  reviously called
29900 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 67 67  ..*/.case OP_Agg
29910 46 69 6e 61 6c 3a 20 7b 0a 20 20 4d 65 6d 20 2a  Final: {.  Mem *
29920 70 4d 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  pMem;.  assert( 
29930 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70  pOp->p1>0 && pOp
29940 2d 3e 70 31 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b  ->p1<=p->nMem );
29950 0a 20 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b  .  pMem = &aMem[
29960 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
29970 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73  rt( (pMem->flags
29980 20 26 20 7e 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45   & ~(MEM_Null|ME
29990 4d 5f 41 67 67 29 29 3d 3d 30 20 29 3b 0a 20 20  M_Agg))==0 );.  
299a0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
299b0 4d 65 6d 46 69 6e 61 6c 69 7a 65 28 70 4d 65 6d  MemFinalize(pMem
299c0 2c 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 29  , pOp->p4.pFunc)
299d0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
299e0 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
299f0 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
29a00 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  db, "%s", sqlite
29a10 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 4d 65  3_value_text(pMe
29a20 6d 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  m));.  }.  sqlit
29a30 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f  e3VdbeChangeEnco
29a40 64 69 6e 67 28 70 4d 65 6d 2c 20 65 6e 63 6f 64  ding(pMem, encod
29a50 69 6e 67 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d  ing);.  UPDATE_M
29a60 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4d 65 6d  AX_BLOBSIZE(pMem
29a70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
29a80 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 4d  VdbeMemTooBig(pM
29a90 65 6d 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  em) ){.    goto 
29aa0 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 62  too_big;.  }.  b
29ab0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
29ac0 64 65 3a 20 43 68 65 63 6b 70 6f 69 6e 74 20 50  de: Checkpoint P
29ad0 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  1 * * * *.**.** 
29ae0 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62  Checkpoint datab
29af0 61 73 65 20 50 31 2e 20 54 68 69 73 20 69 73 20  ase P1. This is 
29b00 61 20 6e 6f 2d 6f 70 20 69 66 20 50 31 20 69 73  a no-op if P1 is
29b10 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 69   not currently i
29b20 6e 0a 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a  n.** WAL mode..*
29b30 2f 0a 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70  /.case OP_Checkp
29b40 6f 69 6e 74 3a 20 7b 0a 20 20 42 74 72 65 65 20  oint: {.  Btree 
29b50 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  *pBt;           
29b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
29b70 65 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74  ee to checkpoint
29b80 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
29b90 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
29ba0 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  ->p1<db->nDb );.
29bb0 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74    assert( (p->bt
29bc0 72 65 65 4d 61 73 6b 20 26 20 28 31 3c 3c 70 4f  reeMask & (1<<pO
29bd0 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a 20 20  p->p1))!=0 );.  
29be0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f  pBt = db->aDb[pO
29bf0 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 72 63  p->p1].pBt;.  rc
29c00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
29c10 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
29c20 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
29c30 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 20 20  );.  break;.};  
29c40 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4a 6f 75  ../* Opcode: Jou
29c50 72 6e 61 6c 4d 6f 64 65 20 50 31 20 50 32 20 50  rnalMode P1 P2 P
29c60 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  3 * *.**.** Chan
29c70 67 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  ge the journal m
29c80 6f 64 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ode of database 
29c90 50 31 20 74 6f 20 50 33 2e 20 50 33 20 6d 75 73  P1 to P3. P3 mus
29ca0 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 0a  t be one of the.
29cb0 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
29cc0 4d 4f 44 45 5f 58 58 58 20 76 61 6c 75 65 73 2e  MODE_XXX values.
29cd0 20 49 66 20 63 68 61 6e 67 69 6e 67 20 62 65 74   If changing bet
29ce0 77 65 65 6e 20 74 68 65 20 76 61 72 69 6f 75 73  ween the various
29cf0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6d 6f 64   rollback.** mod
29d00 65 73 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e  es (delete, trun
29d10 63 61 74 65 2c 20 70 65 72 73 69 73 74 2c 20 6f  cate, persist, o
29d20 66 66 20 61 6e 64 20 6d 65 6d 6f 72 79 29 2c 20  ff and memory), 
29d30 74 68 69 73 20 69 73 20 61 20 73 69 6d 70 6c 65  this is a simple
29d40 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 4e  .** operation. N
29d50 6f 20 49 4f 20 69 73 20 72 65 71 75 69 72 65 64  o IO is required
29d60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 68 61 6e 67  ..**.** If chang
29d70 69 6e 67 20 69 6e 74 6f 20 6f 72 20 6f 75 74 20  ing into or out 
29d80 6f 66 20 57 41 4c 20 6d 6f 64 65 20 74 68 65 20  of WAL mode the 
29d90 70 72 6f 63 65 64 75 72 65 20 69 73 20 6d 6f 72  procedure is mor
29da0 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a  e complicated..*
29db0 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 73 74 72  *.** Write a str
29dc0 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
29dd0 68 65 20 66 69 6e 61 6c 20 6a 6f 75 72 6e 61 6c  he final journal
29de0 2d 6d 6f 64 65 20 74 6f 20 72 65 67 69 73 74 65  -mode to registe
29df0 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  r P2..*/.case OP
29e00 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a  _JournalMode: {.
29e10 20 20 42 74 72 65 65 20 2a 70 42 74 3b 20 20 20    Btree *pBt;   
29e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e30 20 20 2f 2a 20 42 74 72 65 65 20 74 6f 20 63 68    /* Btree to ch
29e40 61 6e 67 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64  ange journal mod
29e50 65 20 6f 66 20 2a 2f 0a 20 20 50 61 67 65 72 20  e of */.  Pager 
29e60 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
29e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
29e80 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
29e90 74 68 20 70 42 74 20 2a 2f 0a 20 20 69 6e 74 20  th pBt */.  int 
29ea0 65 4e 65 77 20 3d 20 70 4f 70 2d 3e 70 33 3b 20  eNew = pOp->p3; 
29eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
29ec0 65 77 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20  ew journal mode 
29ed0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4e  */..  assert( eN
29ee0 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ew==PAGER_JOURNA
29ef0 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20  LMODE_DELETE .  
29f00 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41       || eNew==PA
29f10 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
29f20 54 52 55 4e 43 41 54 45 20 0a 20 20 20 20 20 20  TRUNCATE .      
29f30 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f   || eNew==PAGER_
29f40 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
29f50 49 53 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  IST .       || e
29f60 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  New==PAGER_JOURN
29f70 41 4c 4d 4f 44 45 5f 4f 46 46 0a 20 20 20 20 20  ALMODE_OFF.     
29f80 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52    || eNew==PAGER
29f90 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
29fa0 4f 52 59 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e  ORY.       || eN
29fb0 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ew==PAGER_JOURNA
29fc0 4c 4d 4f 44 45 5f 57 41 4c 0a 20 20 20 20 20 20  LMODE_WAL.      
29fd0 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f   || eNew==PAGER_
29fe0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
29ff0 59 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Y.  );.  assert(
2a000 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
2a010 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29  Op->p1<db->nDb )
2a020 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  ;.  assert( (p->
2a030 62 74 72 65 65 4d 61 73 6b 20 26 20 28 31 3c 3c  btreeMask & (1<<
2a040 70 4f 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a  pOp->p1))!=0 );.
2a050 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  .  pBt = db->aDb
2a060 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20  [pOp->p1].pBt;. 
2a070 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
2a080 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
2a090 3b 0a 0a 20 20 69 66 28 20 65 4e 65 77 21 3d 50  ;..  if( eNew!=P
2a0a0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2a0b0 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20 69 6e  _QUERY ){.    in
2a0c0 74 20 65 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33  t eOld = sqlite3
2a0d0 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65  PagerJournalMode
2a0e0 28 70 50 61 67 65 72 2c 20 50 41 47 45 52 5f 4a  (pPager, PAGER_J
2a0f0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
2a100 29 3b 0a 20 20 20 20 69 66 28 20 28 65 4e 65 77  );.    if( (eNew
2a110 21 3d 65 4f 6c 64 29 0a 20 20 20 20 20 26 26 20  !=eOld).     && 
2a120 28 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55  (eOld==PAGER_JOU
2a130 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 7c 7c 20  RNALMODE_WAL || 
2a140 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eNew==PAGER_JOUR
2a150 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20  NALMODE_WAL).   
2a160 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 64   ){.      if( !d
2a170 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 7c 7c  b->autoCommit ||
2a180 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
2a190 6e 74 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  nt>1 ){.        
2a1a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
2a1b0 52 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  R;.        sqlit
2a1c0 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
2a1d0 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 0a 20 20  zErrMsg, db, .  
2a1e0 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f            "canno
2a1f0 74 20 63 68 61 6e 67 65 20 25 73 20 77 61 6c 20  t change %s wal 
2a200 6d 6f 64 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  mode from within
2a210 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c   a transaction",
2a220 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 65 4e  .            (eN
2a230 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ew==PAGER_JOURNA
2a240 4c 4d 4f 44 45 5f 57 41 4c 20 3f 20 22 69 6e 74  LMODE_WAL ? "int
2a250 6f 22 20 3a 20 22 6f 75 74 20 6f 66 22 29 0a 20  o" : "out of"). 
2a260 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2a270 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 20 20  }else{.  .      
2a280 20 20 2f 2a 20 49 66 20 6c 65 61 76 69 6e 67 20    /* If leaving 
2a290 57 41 4c 20 6d 6f 64 65 2c 20 63 6c 6f 73 65 20  WAL mode, close 
2a2a0 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66  the log file. If
2a2b0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65   successful, the
2a2c0 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20   call to.       
2a2d0 20 2a 2a 20 50 61 67 65 72 43 6c 6f 73 65 4c 6f   ** PagerCloseLo
2a2e0 67 28 29 20 63 68 65 63 6b 70 6f 69 6e 74 73 20  g() checkpoints 
2a2f0 61 6e 64 20 64 65 6c 65 74 65 73 20 74 68 65 20  and deletes the 
2a300 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20  write-ahead-log 
2a310 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  file..        **
2a320 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   An EXCLUSIVE lo
2a330 63 6b 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ck is still held
2a340 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a350 20 66 69 6c 65 20 61 66 74 65 72 20 72 65 74 75   file after retu
2a360 72 6e 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a  rning..        *
2a370 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f  /.        if( eO
2a380 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ld==PAGER_JOURNA
2a390 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20  LMODE_WAL ){.   
2a3a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2a3b0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 4c 6f 67  te3PagerCloseLog
2a3c0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2a3d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a3e0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f  TE_OK ) goto abo
2a3f0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
2a400 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2a410 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f  e3PagerJournalMo
2a420 64 65 28 70 50 61 67 65 72 2c 20 65 4e 65 77 29  de(pPager, eNew)
2a430 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2a440 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2a450 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f  e3PagerJournalMo
2a460 64 65 28 70 50 61 67 65 72 2c 20 50 41 47 45 52  de(pPager, PAGER
2a470 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
2a480 45 54 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ETE);.        }.
2a490 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70    .        /* Op
2a4a0 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
2a4b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a4c0 20 66 69 6c 65 2e 20 52 65 67 61 72 64 6c 65 73   file. Regardles
2a4d0 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
2a4e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  .        ** mode
2a4f0 2c 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  , this transacti
2a500 6f 6e 20 61 6c 77 61 79 73 20 75 73 65 73 20 61  on always uses a
2a510 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2a520 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
2a530 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
2a540 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
2a550 61 6e 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20  ans(pBt)==0 );. 
2a560 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2a570 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
2a580 6e 73 28 70 42 74 2c 20 32 29 3b 0a 20 20 20 20  ns(pBt, 2);.    
2a590 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
2a5a0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65 4f 6c  SQLITE_OK || eOl
2a5b0 64 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  d!=PAGER_JOURNAL
2a5c0 4d 4f 44 45 5f 57 41 4c 20 29 3b 0a 20 20 20 20  MODE_WAL );.    
2a5d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a5e0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f  TE_OK ) goto abo
2a5f0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
2a600 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2a610 6c 69 74 65 33 42 74 72 65 65 53 65 74 56 65 72  lite3BtreeSetVer
2a620 73 69 6f 6e 28 70 42 74 2c 20 28 65 4e 65 77 3d  sion(pBt, (eNew=
2a630 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2a640 44 45 5f 57 41 4c 20 3f 20 32 20 3a 20 31 29 29  DE_WAL ? 2 : 1))
2a650 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2a660 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2a670 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
2a680 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20  error;.      }. 
2a690 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 4e 65 77     }.  }..  eNew
2a6a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a   = sqlite3PagerJ
2a6b0 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65  ournalMode(pPage
2a6c0 72 2c 20 65 4e 65 77 29 3b 0a 20 20 70 4f 75 74  r, eNew);.  pOut
2a6d0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
2a6e0 5d 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  ];.  pOut->flags
2a6f0 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53   = MEM_Str|MEM_S
2a700 74 61 74 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  tatic|MEM_Term;.
2a710 20 20 70 4f 75 74 2d 3e 7a 20 3d 20 73 71 6c 69    pOut->z = sqli
2a720 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e 61  te3JournalModena
2a730 6d 65 28 65 4e 65 77 29 3b 0a 20 20 70 4f 75 74  me(eNew);.  pOut
2a740 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
2a750 6c 65 6e 33 30 28 70 4f 75 74 2d 3e 7a 29 3b 0a  len30(pOut->z);.
2a760 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 53 51    pOut->enc = SQ
2a770 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 73 71 6c  LITE_UTF8;.  sql
2a780 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e  ite3VdbeChangeEn
2a790 63 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65 6e 63  coding(pOut, enc
2a7a0 6f 64 69 6e 67 29 3b 0a 20 20 62 72 65 61 6b 3b  oding);.  break;
2a7b0 0a 7d 3b 20 20 0a 0a 23 69 66 20 21 64 65 66 69  .};  ..#if !defi
2a7c0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2a7d0 56 41 43 55 55 4d 29 20 26 26 20 21 64 65 66 69  VACUUM) && !defi
2a7e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2a7f0 41 54 54 41 43 48 29 0a 2f 2a 20 4f 70 63 6f 64  ATTACH)./* Opcod
2a800 65 3a 20 56 61 63 75 75 6d 20 2a 20 2a 20 2a 20  e: Vacuum * * * 
2a810 2a 20 2a 0a 2a 2a 0a 2a 2a 20 56 61 63 75 75 6d  * *.**.** Vacuum
2a820 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61   the entire data
2a830 62 61 73 65 2e 20 20 54 68 69 73 20 6f 70 63 6f  base.  This opco
2a840 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20 6f 74  de will cause ot
2a850 68 65 72 20 76 69 72 74 75 61 6c 0a 2a 2a 20 6d  her virtual.** m
2a860 61 63 68 69 6e 65 73 20 74 6f 20 62 65 20 63 72  achines to be cr
2a870 65 61 74 65 64 20 61 6e 64 20 72 75 6e 2e 20 20  eated and run.  
2a880 49 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61  It may not be ca
2a890 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
2a8a0 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f  .** a transactio
2a8b0 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 61  n..*/.case OP_Va
2a8c0 63 75 75 6d 3a 20 7b 0a 20 20 72 63 20 3d 20 73  cuum: {.  rc = s
2a8d0 71 6c 69 74 65 33 52 75 6e 56 61 63 75 75 6d 28  qlite3RunVacuum(
2a8e0 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 29  &p->zErrMsg, db)
2a8f0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
2a900 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
2a910 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d(SQLITE_OMIT_AU
2a920 54 4f 56 41 43 55 55 4d 29 0a 2f 2a 20 4f 70 63  TOVACUUM)./* Opc
2a930 6f 64 65 3a 20 49 6e 63 72 56 61 63 75 75 6d 20  ode: IncrVacuum 
2a940 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
2a950 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
2a960 6c 65 20 73 74 65 70 20 6f 66 20 74 68 65 20 69  le step of the i
2a970 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
2a980 6d 20 70 72 6f 63 65 64 75 72 65 20 6f 6e 0a 2a  m procedure on.*
2a990 2a 20 74 68 65 20 50 31 20 64 61 74 61 62 61 73  * the P1 databas
2a9a0 65 2e 20 49 66 20 74 68 65 20 76 61 63 75 75 6d  e. If the vacuum
2a9b0 20 68 61 73 20 66 69 6e 69 73 68 65 64 2c 20 6a   has finished, j
2a9c0 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69  ump to instructi
2a9d0 6f 6e 0a 2a 2a 20 50 32 2e 20 4f 74 68 65 72 77  on.** P2. Otherw
2a9e0 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  ise, fall throug
2a9f0 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
2aa00 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  struction..*/.ca
2aa10 73 65 20 4f 50 5f 49 6e 63 72 56 61 63 75 75 6d  se OP_IncrVacuum
2aa20 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
2aa30 6d 70 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  mp */.  Btree *p
2aa40 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Bt;..  assert( p
2aa50 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
2aa60 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  ->p1<db->nDb );.
2aa70 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74    assert( (p->bt
2aa80 72 65 65 4d 61 73 6b 20 26 20 28 31 3c 3c 70 4f  reeMask & (1<<pO
2aa90 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a 20 20  p->p1))!=0 );.  
2aaa0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f  pBt = db->aDb[pO
2aab0 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 72 63  p->p1].pBt;.  rc
2aac0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
2aad0 6e 63 72 56 61 63 75 75 6d 28 70 42 74 29 3b 0a  ncrVacuum(pBt);.
2aae0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2aaf0 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 70 63 20  _DONE ){.    pc 
2ab00 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
2ab10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2ab20 4b 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  K;.  }.  break;.
2ab30 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63  }.#endif../* Opc
2ab40 6f 64 65 3a 20 45 78 70 69 72 65 20 50 31 20 2a  ode: Expire P1 *
2ab50 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 61 75   * * *.**.** Cau
2ab60 73 65 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73  se precompiled s
2ab70 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 62 65 63  tatements to bec
2ab80 6f 6d 65 20 65 78 70 69 72 65 64 2e 20 41 6e 20  ome expired. An 
2ab90 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e  expired statemen
2aba0 74 0a 2a 2a 20 66 61 69 6c 73 20 77 69 74 68 20  t.** fails with 
2abb0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 66  an error code of
2abc0 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 69   SQLITE_SCHEMA i
2abd0 66 20 69 74 20 69 73 20 65 76 65 72 20 65 78 65  f it is ever exe
2abe0 63 75 74 65 64 20 0a 2a 2a 20 28 76 69 61 20 73  cuted .** (via s
2abf0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 29 2e 0a  qlite3_step())..
2ac00 2a 2a 20 0a 2a 2a 20 49 66 20 50 31 20 69 73 20  ** .** If P1 is 
2ac10 30 2c 20 74 68 65 6e 20 61 6c 6c 20 53 51 4c 20  0, then all SQL 
2ac20 73 74 61 74 65 6d 65 6e 74 73 20 62 65 63 6f 6d  statements becom
2ac30 65 20 65 78 70 69 72 65 64 2e 20 49 66 20 50 31  e expired. If P1
2ac40 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a   is non-zero,.**
2ac50 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 63   then only the c
2ac60 75 72 72 65 6e 74 6c 79 20 65 78 65 63 75 74 69  urrently executi
2ac70 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  ng statement is 
2ac80 61 66 66 65 63 74 65 64 2e 20 0a 2a 2f 0a 63 61  affected. .*/.ca
2ac90 73 65 20 4f 50 5f 45 78 70 69 72 65 3a 20 7b 0a  se OP_Expire: {.
2aca0 20 20 69 66 28 20 21 70 4f 70 2d 3e 70 31 20 29    if( !pOp->p1 )
2acb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2acc0 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
2acd0 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 7d 65 6c  ments(db);.  }el
2ace0 73 65 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72  se{.    p->expir
2acf0 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 62 72  ed = 1;.  }.  br
2ad00 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  eak;.}..#ifndef 
2ad10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2ad20 45 44 5f 43 41 43 48 45 0a 2f 2a 20 4f 70 63 6f  ED_CACHE./* Opco
2ad30 64 65 3a 20 54 61 62 6c 65 4c 6f 63 6b 20 50 31  de: TableLock P1
2ad40 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a   P2 P3 P4 *.**.*
2ad50 2a 20 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  * Obtain a lock 
2ad60 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  on a particular 
2ad70 74 61 62 6c 65 2e 20 54 68 69 73 20 69 6e 73 74  table. This inst
2ad80 72 75 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  ruction is only 
2ad90 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65  used when.** the
2ada0 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65   shared-cache fe
2adb0 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64  ature is enabled
2adc0 2e 20 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74  . .**.** P1 is t
2add0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
2ade0 64 61 74 61 62 61 73 65 20 69 6e 20 73 71 6c 69  database in sqli
2adf0 74 65 33 2e 61 44 62 5b 5d 20 6f 66 20 74 68 65  te3.aDb[] of the
2ae00 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6f 6e 20   database.** on 
2ae10 77 68 69 63 68 20 74 68 65 20 6c 6f 63 6b 20 69  which the lock i
2ae20 73 20 61 63 71 75 69 72 65 64 2e 20 20 41 20 72  s acquired.  A r
2ae30 65 61 64 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  eadlock is obtai
2ae40 6e 65 64 20 69 66 20 50 33 3d 3d 30 20 6f 72 0a  ned if P3==0 or.
2ae50 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  ** a write lock 
2ae60 69 66 20 50 33 3d 3d 31 2e 0a 2a 2a 0a 2a 2a 20  if P3==1..**.** 
2ae70 50 32 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  P2 contains the 
2ae80 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 74 68 65  root-page of the
2ae90 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 2e 0a   table to lock..
2aea0 2a 2a 0a 2a 2a 20 50 34 20 63 6f 6e 74 61 69 6e  **.** P4 contain
2aeb0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
2aec0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
2aed0 61 62 6c 65 20 62 65 69 6e 67 20 6c 6f 63 6b 65  able being locke
2aee0 64 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 0a  d. This is only.
2aef0 2a 2a 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  ** used to gener
2af00 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ate an error mes
2af10 73 61 67 65 20 69 66 20 74 68 65 20 6c 6f 63 6b  sage if the lock
2af20 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
2af30 6e 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ned..*/.case OP_
2af40 54 61 62 6c 65 4c 6f 63 6b 3a 20 7b 0a 20 20 75  TableLock: {.  u
2af50 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20  8 isWriteLock = 
2af60 28 75 38 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 69  (u8)pOp->p3;.  i
2af70 66 28 20 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c  f( isWriteLock |
2af80 7c 20 30 3d 3d 28 64 62 2d 3e 66 6c 61 67 73 26  | 0==(db->flags&
2af90 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2afa0 6d 69 74 74 65 64 29 20 29 7b 0a 20 20 20 20 69  mitted) ){.    i
2afb0 6e 74 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b  nt p1 = pOp->p1;
2afc0 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 31   .    assert( p1
2afd0 3e 3d 30 20 26 26 20 70 31 3c 64 62 2d 3e 6e 44  >=0 && p1<db->nD
2afe0 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
2aff0 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26   (p->btreeMask &
2b000 20 28 31 3c 3c 70 31 29 29 21 3d 30 20 29 3b 0a   (1<<p1))!=0 );.
2b010 20 20 20 20 61 73 73 65 72 74 28 20 69 73 57 72      assert( isWr
2b020 69 74 65 4c 6f 63 6b 3d 3d 30 20 7c 7c 20 69 73  iteLock==0 || is
2b030 57 72 69 74 65 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  WriteLock==1 );.
2b040 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b050 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65 28 64  BtreeLockTable(d
2b060 62 2d 3e 61 44 62 5b 70 31 5d 2e 70 42 74 2c 20  b->aDb[p1].pBt, 
2b070 70 4f 70 2d 3e 70 32 2c 20 69 73 57 72 69 74 65  pOp->p2, isWrite
2b080 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 28  Lock);.    if( (
2b090 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45  rc&0xFF)==SQLITE
2b0a0 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
2b0b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
2b0c0 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
2b0d0 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
2b0e0 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
2b0f0 64 62 2c 20 22 64 61 74 61 62 61 73 65 20 74 61  db, "database ta
2b100 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 3a 20 25  ble is locked: %
2b110 73 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  s", z);.    }.  
2b120 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  }.  break;.}.#en
2b130 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2b140 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
2b150 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
2b160 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2b170 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ABLE./* Opcode: 
2b180 56 42 65 67 69 6e 20 2a 20 2a 20 2a 20 50 34 20  VBegin * * * P4 
2b190 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61 79 20 62  *.**.** P4 may b
2b1a0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
2b1b0 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73  n sqlite3_vtab s
2b1c0 74 72 75 63 74 75 72 65 2e 20 49 66 20 73 6f 2c  tructure. If so,
2b1d0 20 63 61 6c 6c 20 74 68 65 20 0a 2a 2a 20 78 42   call the .** xB
2b1e0 65 67 69 6e 20 6d 65 74 68 6f 64 20 66 6f 72 20  egin method for 
2b1f0 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  that table..**.*
2b200 2a 20 41 6c 73 6f 2c 20 77 68 65 74 68 65 72 20  * Also, whether 
2b210 6f 72 20 6e 6f 74 20 50 34 20 69 73 20 73 65 74  or not P4 is set
2b220 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 69  , check that thi
2b230 73 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 63  s is not being c
2b240 61 6c 6c 65 64 20 66 72 6f 6d 0a 2a 2a 20 77 69  alled from.** wi
2b250 74 68 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b 20  thin a callback 
2b260 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  to a virtual tab
2b270 6c 65 20 78 53 79 6e 63 28 29 20 6d 65 74 68 6f  le xSync() metho
2b280 64 2e 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  d. If it is, the
2b290 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 77   error.** code w
2b2a0 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 53 51  ill be set to SQ
2b2b0 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2f 0a  LITE_LOCKED..*/.
2b2c0 63 61 73 65 20 4f 50 5f 56 42 65 67 69 6e 3a 20  case OP_VBegin: 
2b2d0 7b 0a 20 20 56 54 61 62 6c 65 20 2a 70 56 54 61  {.  VTable *pVTa
2b2e0 62 3b 0a 20 20 70 56 54 61 62 20 3d 20 70 4f 70  b;.  pVTab = pOp
2b2f0 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20 20 72 63  ->p4.pVtab;.  rc
2b300 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 42 65   = sqlite3VtabBe
2b310 67 69 6e 28 64 62 2c 20 70 56 54 61 62 29 3b 0a  gin(db, pVTab);.
2b320 20 20 69 66 28 20 70 56 54 61 62 20 29 7b 0a 20    if( pVTab ){. 
2b330 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2b340 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
2b350 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
2b360 20 3d 20 70 56 54 61 62 2d 3e 70 56 74 61 62 2d   = pVTab->pVtab-
2b370 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 70 56  >zErrMsg;.    pV
2b380 54 61 62 2d 3e 70 56 74 61 62 2d 3e 7a 45 72 72  Tab->pVtab->zErr
2b390 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 62  Msg = 0;.  }.  b
2b3a0 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
2b3b0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
2b3c0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
2b3d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b3e0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2b3f0 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 43 72 65 61  /* Opcode: VCrea
2b400 74 65 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a  te P1 * * P4 *.*
2b410 2a 0a 2a 2a 20 50 34 20 69 73 20 74 68 65 20 6e  *.** P4 is the n
2b420 61 6d 65 20 6f 66 20 61 20 76 69 72 74 75 61 6c  ame of a virtual
2b430 20 74 61 62 6c 65 20 69 6e 20 64 61 74 61 62 61   table in databa
2b440 73 65 20 50 31 2e 20 43 61 6c 6c 20 74 68 65 20  se P1. Call the 
2b450 78 43 72 65 61 74 65 20 6d 65 74 68 6f 64 0a 2a  xCreate method.*
2b460 2a 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65  * for that table
2b470 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 43 72  ..*/.case OP_VCr
2b480 65 61 74 65 3a 20 7b 0a 20 20 72 63 20 3d 20 73  eate: {.  rc = s
2b490 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 72  qlite3VtabCallCr
2b4a0 65 61 74 65 28 64 62 2c 20 70 4f 70 2d 3e 70 31  eate(db, pOp->p1
2b4b0 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 26 70 2d  , pOp->p4.z, &p-
2b4c0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 62 72 65  >zErrMsg);.  bre
2b4d0 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ak;.}.#endif /* 
2b4e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2b4f0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
2b500 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b510 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
2b520 20 4f 70 63 6f 64 65 3a 20 56 44 65 73 74 72 6f   Opcode: VDestro
2b530 79 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  y P1 * * P4 *.**
2b540 0a 2a 2a 20 50 34 20 69 73 20 74 68 65 20 6e 61  .** P4 is the na
2b550 6d 65 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20  me of a virtual 
2b560 74 61 62 6c 65 20 69 6e 20 64 61 74 61 62 61 73  table in databas
2b570 65 20 50 31 2e 20 20 43 61 6c 6c 20 74 68 65 20  e P1.  Call the 
2b580 78 44 65 73 74 72 6f 79 20 6d 65 74 68 6f 64 0a  xDestroy method.
2b590 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  ** of that table
2b5a0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 44 65  ..*/.case OP_VDe
2b5b0 73 74 72 6f 79 3a 20 7b 0a 20 20 70 2d 3e 69 6e  stroy: {.  p->in
2b5c0 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 32 3b 0a  VtabMethod = 2;.
2b5d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
2b5e0 61 62 43 61 6c 6c 44 65 73 74 72 6f 79 28 64 62  abCallDestroy(db
2b5f0 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
2b600 70 34 2e 7a 29 3b 0a 20 20 70 2d 3e 69 6e 56 74  p4.z);.  p->inVt
2b610 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20  abMethod = 0;.  
2b620 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
2b630 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
2b640 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
2b650 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b660 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2b670 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 4f 70 65  ./* Opcode: VOpe
2b680 6e 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  n P1 * * P4 *.**
2b690 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e  .** P4 is a poin
2b6a0 74 65 72 20 74 6f 20 61 20 76 69 72 74 75 61 6c  ter to a virtual
2b6b0 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61   table object, a
2b6c0 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73  n sqlite3_vtab s
2b6d0 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 50 31 20  tructure..** P1 
2b6e0 69 73 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62  is a cursor numb
2b6f0 65 72 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65  er.  This opcode
2b700 20 6f 70 65 6e 73 20 61 20 63 75 72 73 6f 72 20   opens a cursor 
2b710 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a  to the virtual.*
2b720 2a 20 74 61 62 6c 65 20 61 6e 64 20 73 74 6f 72  * table and stor
2b730 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 69  es that cursor i
2b740 6e 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  n P1..*/.case OP
2b750 5f 56 4f 70 65 6e 3a 20 7b 0a 20 20 56 64 62 65  _VOpen: {.  Vdbe
2b760 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
2b770 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
2b780 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
2b790 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ;.  sqlite3_vtab
2b7a0 20 2a 70 56 74 61 62 3b 0a 20 20 73 71 6c 69 74   *pVtab;.  sqlit
2b7b0 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
2b7c0 6c 65 3b 0a 0a 20 20 70 43 75 72 20 3d 20 30 3b  le;..  pCur = 0;
2b7d0 0a 20 20 70 56 74 61 62 43 75 72 73 6f 72 20 3d  .  pVtabCursor =
2b7e0 20 30 3b 0a 20 20 70 56 74 61 62 20 3d 20 70 4f   0;.  pVtab = pO
2b7f0 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74  p->p4.pVtab->pVt
2b800 61 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20  ab;.  pModule = 
2b810 28 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20  (sqlite3_module 
2b820 2a 29 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  *)pVtab->pModule
2b830 3b 0a 20 20 61 73 73 65 72 74 28 70 56 74 61 62  ;.  assert(pVtab
2b840 20 26 26 20 70 4d 6f 64 75 6c 65 29 3b 0a 20 20   && pModule);.  
2b850 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4f  rc = pModule->xO
2b860 70 65 6e 28 70 56 74 61 62 2c 20 26 70 56 74 61  pen(pVtab, &pVta
2b870 62 43 75 72 73 6f 72 29 3b 0a 20 20 73 71 6c 69  bCursor);.  sqli
2b880 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
2b890 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e  >zErrMsg);.  p->
2b8a0 7a 45 72 72 4d 73 67 20 3d 20 70 56 74 61 62 2d  zErrMsg = pVtab-
2b8b0 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 70 56 74 61  >zErrMsg;.  pVta
2b8c0 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
2b8d0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
2b8e0 3d 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  =rc ){.    /* In
2b8f0 69 74 69 61 6c 69 7a 65 20 73 71 6c 69 74 65 33  itialize sqlite3
2b900 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73  _vtab_cursor bas
2b910 65 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20 20 70  e class */.    p
2b920 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
2b930 62 20 3d 20 70 56 74 61 62 3b 0a 0a 20 20 20 20  b = pVtab;..    
2b940 2f 2a 20 49 6e 69 74 69 61 6c 69 73 65 20 76 64  /* Initialise vd
2b950 62 65 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 74  be cursor object
2b960 20 2a 2f 0a 20 20 20 20 70 43 75 72 20 3d 20 61   */.    pCur = a
2b970 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c  llocateCursor(p,
2b980 20 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 2d 31 2c   pOp->p1, 0, -1,
2b990 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75   0);.    if( pCu
2b9a0 72 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  r ){.      pCur-
2b9b0 3e 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70  >pVtabCursor = p
2b9c0 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20  VtabCursor;.    
2b9d0 20 20 70 43 75 72 2d 3e 70 4d 6f 64 75 6c 65 20    pCur->pModule 
2b9e0 3d 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70  = pVtabCursor->p
2b9f0 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
2ba00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ba10 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2ba20 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4d 6f 64   = 1;.      pMod
2ba30 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61  ule->xClose(pVta
2ba40 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  bCursor);.    }.
2ba50 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23    }.  break;.}.#
2ba60 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2ba70 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2ba80 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2ba90 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2baa0 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65  LTABLE./* Opcode
2bab0 3a 20 56 46 69 6c 74 65 72 20 50 31 20 50 32 20  : VFilter P1 P2 
2bac0 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 31  P3 P4 *.**.** P1
2bad0 20 69 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65   is a cursor ope
2bae0 6e 65 64 20 75 73 69 6e 67 20 56 4f 70 65 6e 2e  ned using VOpen.
2baf0 20 20 50 32 20 69 73 20 61 6e 20 61 64 64 72 65    P2 is an addre
2bb00 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66  ss to jump to if
2bb10 0a 2a 2a 20 74 68 65 20 66 69 6c 74 65 72 65 64  .** the filtered
2bb20 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 65   result set is e
2bb30 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69  mpty..**.** P4 i
2bb40 73 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72  s either NULL or
2bb50 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 77   a string that w
2bb60 61 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  as generated by 
2bb70 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 0a 2a  the xBestIndex.*
2bb80 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  * method of the 
2bb90 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 69 6e 74  module.  The int
2bba0 65 72 70 72 65 74 61 74 69 6f 6e 20 6f 66 20 74  erpretation of t
2bbb0 68 65 20 50 34 20 73 74 72 69 6e 67 20 69 73 20  he P4 string is 
2bbc0 6c 65 66 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6d  left.** to the m
2bbd0 6f 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61  odule implementa
2bbe0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
2bbf0 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20   opcode invokes 
2bc00 74 68 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68  the xFilter meth
2bc10 6f 64 20 6f 6e 20 74 68 65 20 76 69 72 74 75 61  od on the virtua
2bc20 6c 20 74 61 62 6c 65 20 73 70 65 63 69 66 69 65  l table specifie
2bc30 64 0a 2a 2a 20 62 79 20 50 31 2e 20 20 54 68 65  d.** by P1.  The
2bc40 20 69 6e 74 65 67 65 72 20 71 75 65 72 79 20 70   integer query p
2bc50 6c 61 6e 20 70 61 72 61 6d 65 74 65 72 20 74 6f  lan parameter to
2bc60 20 78 46 69 6c 74 65 72 20 69 73 20 73 74 6f 72   xFilter is stor
2bc70 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 0a 2a  ed in register.*
2bc80 2a 20 50 33 2e 20 52 65 67 69 73 74 65 72 20 50  * P3. Register P
2bc90 33 2b 31 20 73 74 6f 72 65 73 20 74 68 65 20 61  3+1 stores the a
2bca0 72 67 63 20 70 61 72 61 6d 65 74 65 72 20 74 6f  rgc parameter to
2bcb0 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 74 68   be passed to th
2bcc0 65 0a 2a 2a 20 78 46 69 6c 74 65 72 20 6d 65 74  e.** xFilter met
2bcd0 68 6f 64 2e 20 52 65 67 69 73 74 65 72 73 20 50  hod. Registers P
2bce0 33 2b 32 2e 2e 50 33 2b 31 2b 61 72 67 63 20 61  3+2..P3+1+argc a
2bcf0 72 65 20 74 68 65 20 61 72 67 63 0a 2a 2a 20 61  re the argc.** a
2bd00 64 64 69 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65  dditional parame
2bd10 74 65 72 73 20 77 68 69 63 68 20 61 72 65 20 70  ters which are p
2bd20 61 73 73 65 64 20 74 6f 0a 2a 2a 20 78 46 69 6c  assed to.** xFil
2bd30 74 65 72 20 61 73 20 61 72 67 76 2e 20 52 65 67  ter as argv. Reg
2bd40 69 73 74 65 72 20 50 33 2b 32 20 62 65 63 6f 6d  ister P3+2 becom
2bd50 65 73 20 61 72 67 76 5b 30 5d 20 77 68 65 6e 20  es argv[0] when 
2bd60 70 61 73 73 65 64 20 74 6f 20 78 46 69 6c 74 65  passed to xFilte
2bd70 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  r..**.** A jump 
2bd80 69 73 20 6d 61 64 65 20 74 6f 20 50 32 20 69 66  is made to P2 if
2bd90 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
2bda0 61 66 74 65 72 20 66 69 6c 74 65 72 69 6e 67 20  after filtering 
2bdb0 77 6f 75 6c 64 20 62 65 20 65 6d 70 74 79 2e 0a  would be empty..
2bdc0 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 46 69 6c 74  */.case OP_VFilt
2bdd0 65 72 3a 20 7b 20 20 20 2f 2a 20 6a 75 6d 70 20  er: {   /* jump 
2bde0 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  */.  int nArg;. 
2bdf0 20 69 6e 74 20 69 51 75 65 72 79 3b 0a 20 20 63   int iQuery;.  c
2be00 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
2be10 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20  ule *pModule;.  
2be20 4d 65 6d 20 2a 70 51 75 65 72 79 3b 0a 20 20 4d  Mem *pQuery;.  M
2be30 65 6d 20 2a 70 41 72 67 63 3b 0a 20 20 73 71 6c  em *pArgc;.  sql
2be40 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
2be50 20 2a 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20   *pVtabCursor;. 
2be60 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
2be70 56 74 61 62 3b 0a 20 20 56 64 62 65 43 75 72 73  Vtab;.  VdbeCurs
2be80 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
2be90 72 65 73 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  res;.  int i;.  
2bea0 4d 65 6d 20 2a 2a 61 70 41 72 67 3b 0a 0a 20 20  Mem **apArg;..  
2beb0 70 51 75 65 72 79 20 3d 20 26 61 4d 65 6d 5b 70  pQuery = &aMem[p
2bec0 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 41 72 67 63  Op->p3];.  pArgc
2bed0 20 3d 20 26 70 51 75 65 72 79 5b 31 5d 3b 0a 20   = &pQuery[1];. 
2bee0 20 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72   pCur = p->apCsr
2bef0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 52 45 47  [pOp->p1];.  REG
2bf00 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
2bf10 3e 70 33 2c 20 70 51 75 65 72 79 29 3b 0a 20 20  >p3, pQuery);.  
2bf20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 56  assert( pCur->pV
2bf30 74 61 62 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  tabCursor );.  p
2bf40 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 75  VtabCursor = pCu
2bf50 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  r->pVtabCursor;.
2bf60 20 20 70 56 74 61 62 20 3d 20 70 56 74 61 62 43    pVtab = pVtabC
2bf70 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20  ursor->pVtab;.  
2bf80 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d  pModule = pVtab-
2bf90 3e 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 2f 2a 20  >pModule;..  /* 
2bfa0 47 72 61 62 20 74 68 65 20 69 6e 64 65 78 20 6e  Grab the index n
2bfb0 75 6d 62 65 72 20 61 6e 64 20 61 72 67 63 20 70  umber and argc p
2bfc0 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61  arameters */.  a
2bfd0 73 73 65 72 74 28 20 28 70 51 75 65 72 79 2d 3e  ssert( (pQuery->
2bfe0 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 29 21 3d  flags&MEM_Int)!=
2bff0 30 20 26 26 20 70 41 72 67 63 2d 3e 66 6c 61 67  0 && pArgc->flag
2c000 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20  s==MEM_Int );.  
2c010 6e 41 72 67 20 3d 20 28 69 6e 74 29 70 41 72 67  nArg = (int)pArg
2c020 63 2d 3e 75 2e 69 3b 0a 20 20 69 51 75 65 72 79  c->u.i;.  iQuery
2c030 20 3d 20 28 69 6e 74 29 70 51 75 65 72 79 2d 3e   = (int)pQuery->
2c040 75 2e 69 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b  u.i;..  /* Invok
2c050 65 20 74 68 65 20 78 46 69 6c 74 65 72 20 6d 65  e the xFilter me
2c060 74 68 6f 64 20 2a 2f 0a 20 20 7b 0a 20 20 20 20  thod */.  {.    
2c070 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 61 70 41  res = 0;.    apA
2c080 72 67 20 3d 20 70 2d 3e 61 70 41 72 67 3b 0a 20  rg = p->apArg;. 
2c090 20 20 20 66 6f 72 28 69 20 3d 20 30 3b 20 69 3c     for(i = 0; i<
2c0a0 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
2c0b0 20 20 61 70 41 72 67 5b 69 5d 20 3d 20 26 70 41    apArg[i] = &pA
2c0c0 72 67 63 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20  rgc[i+1];.      
2c0d0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74  sqlite3VdbeMemSt
2c0e0 6f 72 65 54 79 70 65 28 61 70 41 72 67 5b 69 5d  oreType(apArg[i]
2c0f0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d  );.    }..    p-
2c100 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20  >inVtabMethod = 
2c110 31 3b 0a 20 20 20 20 72 63 20 3d 20 70 4d 6f 64  1;.    rc = pMod
2c120 75 6c 65 2d 3e 78 46 69 6c 74 65 72 28 70 56 74  ule->xFilter(pVt
2c130 61 62 43 75 72 73 6f 72 2c 20 69 51 75 65 72 79  abCursor, iQuery
2c140 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 6e 41 72  , pOp->p4.z, nAr
2c150 67 2c 20 61 70 41 72 67 29 3b 0a 20 20 20 20 70  g, apArg);.    p
2c160 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
2c170 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   0;.    sqlite3D
2c180 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
2c190 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
2c1a0 72 72 4d 73 67 20 3d 20 70 56 74 61 62 2d 3e 7a  rrMsg = pVtab->z
2c1b0 45 72 72 4d 73 67 3b 0a 20 20 20 20 70 56 74 61  ErrMsg;.    pVta
2c1c0 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
2c1d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c1e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2c1f0 65 73 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 45  es = pModule->xE
2c200 6f 66 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b  of(pVtabCursor);
2c210 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2c220 72 65 73 20 29 7b 0a 20 20 20 20 20 20 70 63 20  res ){.      pc 
2c230 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
2c240 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d     }.  }.  pCur-
2c250 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 0a 20  >nullRow = 0;.. 
2c260 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
2c270 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2c280 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
2c290 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c2a0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2c2b0 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 43 6f  E./* Opcode: VCo
2c2c0 6c 75 6d 6e 20 50 31 20 50 32 20 50 33 20 2a 20  lumn P1 P2 P3 * 
2c2d0 2a 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 74 68  *.**.** Store th
2c2e0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
2c2f0 32 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  2-th column of.*
2c300 2a 20 74 68 65 20 72 6f 77 20 6f 66 20 74 68 65  * the row of the
2c310 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 74   virtual-table t
2c320 68 61 74 20 74 68 65 20 0a 2a 2a 20 50 31 20 63  hat the .** P1 c
2c330 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
2c340 67 20 74 6f 20 69 6e 74 6f 20 72 65 67 69 73 74  g to into regist
2c350 65 72 20 50 33 2e 0a 2a 2f 0a 63 61 73 65 20 4f  er P3..*/.case O
2c360 50 5f 56 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 73  P_VColumn: {.  s
2c370 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
2c380 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  ab;.  const sqli
2c390 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
2c3a0 75 6c 65 3b 0a 20 20 4d 65 6d 20 2a 70 44 65 73  ule;.  Mem *pDes
2c3b0 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  t;.  sqlite3_con
2c3c0 74 65 78 74 20 73 43 6f 6e 74 65 78 74 3b 0a 0a  text sContext;..
2c3d0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
2c3e0 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  ur = p->apCsr[pO
2c3f0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
2c400 28 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72  ( pCur->pVtabCur
2c410 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sor );.  assert(
2c420 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f   pOp->p3>0 && pO
2c430 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29  p->p3<=p->nMem )
2c440 3b 0a 20 20 70 44 65 73 74 20 3d 20 26 61 4d 65  ;.  pDest = &aMe
2c450 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66  m[pOp->p3];.  if
2c460 28 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20  ( pCur->nullRow 
2c470 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
2c480 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 44 65  beMemSetNull(pDe
2c490 73 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  st);.    break;.
2c4a0 20 20 7d 0a 20 20 70 56 74 61 62 20 3d 20 70 43    }.  pVtab = pC
2c4b0 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 2d  ur->pVtabCursor-
2c4c0 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64 75 6c  >pVtab;.  pModul
2c4d0 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  e = pVtab->pModu
2c4e0 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d  le;.  assert( pM
2c4f0 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d 6e 20 29  odule->xColumn )
2c500 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 43 6f 6e  ;.  memset(&sCon
2c510 74 65 78 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  text, 0, sizeof(
2c520 73 43 6f 6e 74 65 78 74 29 29 3b 0a 0a 20 20 2f  sContext));..  /
2c530 2a 20 54 68 65 20 6f 75 74 70 75 74 20 63 65 6c  * The output cel
2c540 6c 20 6d 61 79 20 61 6c 72 65 61 64 79 20 68 61  l may already ha
2c550 76 65 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  ve a buffer allo
2c560 63 61 74 65 64 2e 20 4d 6f 76 65 0a 20 20 2a 2a  cated. Move.  **
2c570 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
2c580 74 65 6e 74 73 20 74 6f 20 73 43 6f 6e 74 65 78  tents to sContex
2c590 74 2e 73 20 73 6f 20 69 6e 20 63 61 73 65 20 74  t.s so in case t
2c5a0 68 65 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e  he user-function
2c5b0 20 0a 20 20 2a 2a 20 63 61 6e 20 75 73 65 20 74   .  ** can use t
2c5c0 68 65 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  he already alloc
2c5d0 61 74 65 64 20 62 75 66 66 65 72 20 69 6e 73 74  ated buffer inst
2c5e0 65 61 64 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6e  ead of allocatin
2c5f0 67 20 61 20 0a 20 20 2a 2a 20 6e 65 77 20 6f 6e  g a .  ** new on
2c600 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
2c610 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 26 73 43  3VdbeMemMove(&sC
2c620 6f 6e 74 65 78 74 2e 73 2c 20 70 44 65 73 74 29  ontext.s, pDest)
2c630 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c  ;.  MemSetTypeFl
2c640 61 67 28 26 73 43 6f 6e 74 65 78 74 2e 73 2c 20  ag(&sContext.s, 
2c650 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 0a 20 20 72 63  MEM_Null);..  rc
2c660 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c   = pModule->xCol
2c670 75 6d 6e 28 70 43 75 72 2d 3e 70 56 74 61 62 43  umn(pCur->pVtabC
2c680 75 72 73 6f 72 2c 20 26 73 43 6f 6e 74 65 78 74  ursor, &sContext
2c690 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 73 71  , pOp->p2);.  sq
2c6a0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2c6b0 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
2c6c0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 70 56 74 61  ->zErrMsg = pVta
2c6d0 62 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 70 56  b->zErrMsg;.  pV
2c6e0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
2c6f0 3b 0a 20 20 69 66 28 20 73 43 6f 6e 74 65 78 74  ;.  if( sContext
2c700 2e 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  .isError ){.    
2c710 72 63 20 3d 20 73 43 6f 6e 74 65 78 74 2e 69 73  rc = sContext.is
2c720 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Error;.  }..  /*
2c730 20 43 6f 70 79 20 74 68 65 20 72 65 73 75 6c 74   Copy the result
2c740 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
2c750 20 74 6f 20 74 68 65 20 50 33 20 72 65 67 69 73   to the P3 regis
2c760 74 65 72 2e 20 57 65 0a 20 20 2a 2a 20 64 6f 20  ter. We.  ** do 
2c770 74 68 69 73 20 72 65 67 61 72 64 6c 65 73 73 20  this regardless 
2c780 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  of whether or no
2c790 74 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  t an error occur
2c7a0 72 65 64 20 74 6f 20 65 6e 73 75 72 65 20 61 6e  red to ensure an
2c7b0 79 0a 20 20 2a 2a 20 64 79 6e 61 6d 69 63 20 61  y.  ** dynamic a
2c7c0 6c 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 73 43 6f  llocation in sCo
2c7d0 6e 74 65 78 74 2e 73 20 28 61 20 4d 65 6d 20 73  ntext.s (a Mem s
2c7e0 74 72 75 63 74 29 20 69 73 20 20 72 65 6c 65 61  truct) is  relea
2c7f0 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  sed..  */.  sqli
2c800 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
2c810 6f 64 69 6e 67 28 26 73 43 6f 6e 74 65 78 74 2e  oding(&sContext.
2c820 73 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  s, encoding);.  
2c830 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f  sqlite3VdbeMemMo
2c840 76 65 28 70 44 65 73 74 2c 20 26 73 43 6f 6e 74  ve(pDest, &sCont
2c850 65 78 74 2e 73 29 3b 0a 20 20 52 45 47 49 53 54  ext.s);.  REGIST
2c860 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
2c870 2c 20 70 44 65 73 74 29 3b 0a 20 20 55 50 44 41  , pDest);.  UPDA
2c880 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
2c890 70 44 65 73 74 29 3b 0a 0a 20 20 69 66 28 20 73  pDest);..  if( s
2c8a0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f  qlite3VdbeMemToo
2c8b0 42 69 67 28 70 44 65 73 74 29 20 29 7b 0a 20 20  Big(pDest) ){.  
2c8c0 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a    goto too_big;.
2c8d0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23    }.  break;.}.#
2c8e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2c8f0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2c900 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2c910 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2c920 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65  LTABLE./* Opcode
2c930 3a 20 56 4e 65 78 74 20 50 31 20 50 32 20 2a 20  : VNext P1 P2 * 
2c940 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63  * *.**.** Advanc
2c950 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
2c960 50 31 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  P1 to the next r
2c970 6f 77 20 69 6e 20 69 74 73 20 72 65 73 75 6c 74  ow in its result
2c980 20 73 65 74 20 61 6e 64 0a 2a 2a 20 6a 75 6d 70   set and.** jump
2c990 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   to instruction 
2c9a0 50 32 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20  P2.  Or, if the 
2c9b0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  virtual table ha
2c9c0 73 20 72 65 61 63 68 65 64 0a 2a 2a 20 74 68 65  s reached.** the
2c9d0 20 65 6e 64 20 6f 66 20 69 74 73 20 72 65 73 75   end of its resu
2c9e0 6c 74 20 73 65 74 2c 20 74 68 65 6e 20 66 61 6c  lt set, then fal
2c9f0 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
2ca00 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
2ca10 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 4e  n..*/.case OP_VN
2ca20 65 78 74 3a 20 7b 20 20 20 2f 2a 20 6a 75 6d 70  ext: {   /* jump
2ca30 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 74   */.  sqlite3_vt
2ca40 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e  ab *pVtab;.  con
2ca50 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
2ca60 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e  e *pModule;.  in
2ca70 74 20 72 65 73 3b 0a 20 20 56 64 62 65 43 75 72  t res;.  VdbeCur
2ca80 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 72 65  sor *pCur;..  re
2ca90 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 20 3d 20  s = 0;.  pCur = 
2caa0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
2cab0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ];.  assert( pCu
2cac0 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29  r->pVtabCursor )
2cad0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 75  ;.  if( pCur->nu
2cae0 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 62 72 65  llRow ){.    bre
2caf0 61 6b 3b 0a 20 20 7d 0a 20 20 70 56 74 61 62 20  ak;.  }.  pVtab 
2cb00 3d 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72  = pCur->pVtabCur
2cb10 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d  sor->pVtab;.  pM
2cb20 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70  odule = pVtab->p
2cb30 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65 72 74  Module;.  assert
2cb40 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74  ( pModule->xNext
2cb50 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65   );..  /* Invoke
2cb60 20 74 68 65 20 78 4e 65 78 74 28 29 20 6d 65 74   the xNext() met
2cb70 68 6f 64 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c  hod of the modul
2cb80 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 77  e. There is no w
2cb90 61 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ay for the.  ** 
2cba0 75 6e 64 65 72 6c 79 69 6e 67 20 69 6d 70 6c 65  underlying imple
2cbb0 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20 72 65 74  mentation to ret
2cbc0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 66 20  urn an error if 
2cbd0 6f 6e 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e  one occurs durin
2cbe0 67 0a 20 20 2a 2a 20 78 4e 65 78 74 28 29 2e 20  g.  ** xNext(). 
2cbf0 49 6e 73 74 65 61 64 2c 20 69 66 20 61 6e 20 65  Instead, if an e
2cc00 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 72 75  rror occurs, tru
2cc10 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 69  e is returned (i
2cc20 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 0a  ndicating that .
2cc30 20 20 2a 2a 20 64 61 74 61 20 69 73 20 61 76 61    ** data is ava
2cc40 69 6c 61 62 6c 65 29 20 61 6e 64 20 74 68 65 20  ilable) and the 
2cc50 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72  error code retur
2cc60 6e 65 64 20 77 68 65 6e 20 78 43 6f 6c 75 6d 6e  ned when xColumn
2cc70 20 6f 72 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 74   or.  ** some ot
2cc80 68 65 72 20 6d 65 74 68 6f 64 20 69 73 20 6e 65  her method is ne
2cc90 78 74 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68  xt invoked on th
2cca0 65 20 73 61 76 65 20 76 69 72 74 75 61 6c 20 74  e save virtual t
2ccb0 61 62 6c 65 20 63 75 72 73 6f 72 2e 0a 20 20 2a  able cursor..  *
2ccc0 2f 0a 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74  /.  p->inVtabMet
2ccd0 68 6f 64 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20  hod = 1;.  rc = 
2cce0 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 28 70  pModule->xNext(p
2ccf0 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  Cur->pVtabCursor
2cd00 29 3b 0a 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  );.  p->inVtabMe
2cd10 74 68 6f 64 20 3d 20 30 3b 0a 20 20 73 71 6c 69  thod = 0;.  sqli
2cd20 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
2cd30 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e  >zErrMsg);.  p->
2cd40 7a 45 72 72 4d 73 67 20 3d 20 70 56 74 61 62 2d  zErrMsg = pVtab-
2cd50 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 70 56 74 61  >zErrMsg;.  pVta
2cd60 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
2cd70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2cd80 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  _OK ){.    res =
2cd90 20 70 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66 28 70   pModule->xEof(p
2cda0 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  Cur->pVtabCursor
2cdb0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 72  );.  }..  if( !r
2cdc0 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  es ){.    /* If 
2cdd0 74 68 65 72 65 20 69 73 20 64 61 74 61 2c 20 6a  there is data, j
2cde0 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20 20 20  ump to P2 */.   
2cdf0 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
2ce00 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  1;.  }.  break;.
2ce10 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2ce20 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2ce30 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ABLE */..#ifndef
2ce40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2ce50 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63  TUALTABLE./* Opc
2ce60 6f 64 65 3a 20 56 52 65 6e 61 6d 65 20 50 31 20  ode: VRename P1 
2ce70 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50  * * P4 *.**.** P
2ce80 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
2ce90 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  o a virtual tabl
2cea0 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c  e object, an sql
2ceb0 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74  ite3_vtab struct
2cec0 75 72 65 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ure..** This opc
2ced0 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ode invokes the 
2cee0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 78 52  corresponding xR
2cef0 65 6e 61 6d 65 20 6d 65 74 68 6f 64 2e 20 54 68  ename method. Th
2cf00 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 72 65  e value.** in re
2cf10 67 69 73 74 65 72 20 50 31 20 69 73 20 70 61 73  gister P1 is pas
2cf20 73 65 64 20 61 73 20 74 68 65 20 7a 4e 61 6d 65  sed as the zName
2cf30 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
2cf40 20 78 52 65 6e 61 6d 65 20 6d 65 74 68 6f 64 2e   xRename method.
2cf50 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 52 65 6e  .*/.case OP_VRen
2cf60 61 6d 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33  ame: {.  sqlite3
2cf70 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20  _vtab *pVtab;.  
2cf80 4d 65 6d 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 70  Mem *pName;..  p
2cf90 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Vtab = pOp->p4.p
2cfa0 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 70  Vtab->pVtab;.  p
2cfb0 4e 61 6d 65 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  Name = &aMem[pOp
2cfc0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2cfd0 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d   pVtab->pModule-
2cfe0 3e 78 52 65 6e 61 6d 65 20 29 3b 0a 20 20 52 45  >xRename );.  RE
2cff0 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
2d000 2d 3e 70 31 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  ->p1, pName);.  
2d010 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 66  assert( pName->f
2d020 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
2d030 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e  ;.  rc = pVtab->
2d040 70 4d 6f 64 75 6c 65 2d 3e 78 52 65 6e 61 6d 65  pModule->xRename
2d050 28 70 56 74 61 62 2c 20 70 4e 61 6d 65 2d 3e 7a  (pVtab, pName->z
2d060 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
2d070 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
2d080 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
2d090 20 3d 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73   = pVtab->zErrMs
2d0a0 67 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72  g;.  pVtab->zErr
2d0b0 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 62 72 65 61  Msg = 0;..  brea
2d0c0 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  k;.}.#endif..#if
2d0d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2d0e0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
2d0f0 20 4f 70 63 6f 64 65 3a 20 56 55 70 64 61 74 65   Opcode: VUpdate
2d100 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a   P1 P2 P3 P4 *.*
2d110 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69  *.** P4 is a poi
2d120 6e 74 65 72 20 74 6f 20 61 20 76 69 72 74 75 61  nter to a virtua
2d130 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 2c 20  l table object, 
2d140 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  an sqlite3_vtab 
2d150 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
2d160 69 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65  is opcode invoke
2d170 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
2d180 69 6e 67 20 78 55 70 64 61 74 65 20 6d 65 74 68  ing xUpdate meth
2d190 6f 64 2e 20 50 32 20 76 61 6c 75 65 73 0a 2a 2a  od. P2 values.**
2d1a0 20 61 72 65 20 63 6f 6e 74 69 67 75 6f 75 73 20   are contiguous 
2d1b0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 73 74 61  memory cells sta
2d1c0 72 74 69 6e 67 20 61 74 20 50 33 20 74 6f 20 70  rting at P3 to p
2d1d0 61 73 73 20 74 6f 20 74 68 65 20 78 55 70 64 61  ass to the xUpda
2d1e0 74 65 20 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f  te .** invocatio
2d1f0 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  n. The value in 
2d200 72 65 67 69 73 74 65 72 20 28 50 33 2b 50 32 2d  register (P3+P2-
2d210 31 29 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  1) corresponds t
2d220 6f 20 74 68 65 20 0a 2a 2a 20 70 32 74 68 20 65  o the .** p2th e
2d230 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 72  lement of the ar
2d240 67 76 20 61 72 72 61 79 20 70 61 73 73 65 64 20  gv array passed 
2d250 74 6f 20 78 55 70 64 61 74 65 2e 0a 2a 2a 0a 2a  to xUpdate..**.*
2d260 2a 20 54 68 65 20 78 55 70 64 61 74 65 20 6d 65  * The xUpdate me
2d270 74 68 6f 64 20 77 69 6c 6c 20 64 6f 20 61 20 44  thod will do a D
2d280 45 4c 45 54 45 20 6f 72 20 61 6e 20 49 4e 53 45  ELETE or an INSE
2d290 52 54 20 6f 72 20 62 6f 74 68 2e 0a 2a 2a 20 54  RT or both..** T
2d2a0 68 65 20 61 72 67 76 5b 30 5d 20 65 6c 65 6d 65  he argv[0] eleme
2d2b0 6e 74 20 28 77 68 69 63 68 20 63 6f 72 72 65 73  nt (which corres
2d2c0 70 6f 6e 64 73 20 74 6f 20 6d 65 6d 6f 72 79 20  ponds to memory 
2d2d0 63 65 6c 6c 20 50 33 29 0a 2a 2a 20 69 73 20 74  cell P3).** is t
2d2e0 68 65 20 72 6f 77 69 64 20 6f 66 20 61 20 72 6f  he rowid of a ro
2d2f0 77 20 74 6f 20 64 65 6c 65 74 65 2e 20 20 49 66  w to delete.  If
2d300 20 61 72 67 76 5b 30 5d 20 69 73 20 4e 55 4c 4c   argv[0] is NULL
2d310 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 64 65 6c   then no .** del
2d320 65 74 69 6f 6e 20 6f 63 63 75 72 73 2e 20 20 54  etion occurs.  T
2d330 68 65 20 61 72 67 76 5b 31 5d 20 65 6c 65 6d 65  he argv[1] eleme
2d340 6e 74 20 69 73 20 74 68 65 20 72 6f 77 69 64 20  nt is the rowid 
2d350 6f 66 20 74 68 65 20 6e 65 77 20 0a 2a 2a 20 72  of the new .** r
2d360 6f 77 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  ow.  This can be
2d370 20 4e 55 4c 4c 20 74 6f 20 68 61 76 65 20 74 68   NULL to have th
2d380 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
2d390 73 65 6c 65 63 74 20 74 68 65 20 6e 65 77 20 0a  select the new .
2d3a0 2a 2a 20 72 6f 77 69 64 20 66 6f 72 20 69 74 73  ** rowid for its
2d3b0 65 6c 66 2e 20 20 54 68 65 20 73 75 62 73 65 71  elf.  The subseq
2d3c0 75 65 6e 74 20 65 6c 65 6d 65 6e 74 73 20 69 6e  uent elements in
2d3d0 20 74 68 65 20 61 72 72 61 79 20 61 72 65 20 0a   the array are .
2d3e0 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  ** the values of
2d3f0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
2d400 6e 65 77 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49  new row..**.** I
2d410 66 20 50 32 3d 3d 31 20 74 68 65 6e 20 6e 6f 20  f P2==1 then no 
2d420 69 6e 73 65 72 74 20 69 73 20 70 65 72 66 6f 72  insert is perfor
2d430 6d 65 64 2e 20 20 61 72 67 76 5b 30 5d 20 69 73  med.  argv[0] is
2d440 20 74 68 65 20 72 6f 77 69 64 20 6f 66 0a 2a 2a   the rowid of.**
2d450 20 61 20 72 6f 77 20 74 6f 20 64 65 6c 65 74 65   a row to delete
2d460 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20  ..**.** P1 is a 
2d470 62 6f 6f 6c 65 61 6e 20 66 6c 61 67 2e 20 49 66  boolean flag. If
2d480 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   it is set to tr
2d490 75 65 20 61 6e 64 20 74 68 65 20 78 55 70 64 61  ue and the xUpda
2d4a0 74 65 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 73 75  te call.** is su
2d4b0 63 63 65 73 73 66 75 6c 2c 20 74 68 65 6e 20 74  ccessful, then t
2d4c0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
2d4d0 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6c 61 73  d by sqlite3_las
2d4e0 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29  t_insert_rowid()
2d4f0 20 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74   .** is set to t
2d500 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
2d510 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 72 6f  rowid for the ro
2d520 77 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64 2e  w just inserted.
2d530 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 55 70 64  .*/.case OP_VUpd
2d540 61 74 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33  ate: {.  sqlite3
2d550 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20  _vtab *pVtab;.  
2d560 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
2d570 70 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e 74 20 6e  pModule;.  int n
2d580 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Arg;.  int i;.  
2d590 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f 77  sqlite_int64 row
2d5a0 69 64 3b 0a 20 20 4d 65 6d 20 2a 2a 61 70 41 72  id;.  Mem **apAr
2d5b0 67 3b 0a 20 20 4d 65 6d 20 2a 70 58 3b 0a 0a 20  g;.  Mem *pX;.. 
2d5c0 20 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34   pVtab = pOp->p4
2d5d0 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20  .pVtab->pVtab;. 
2d5e0 20 70 4d 6f 64 75 6c 65 20 3d 20 28 73 71 6c 69   pModule = (sqli
2d5f0 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 29 70 56 74  te3_module *)pVt
2d600 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 6e  ab->pModule;.  n
2d610 41 72 67 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  Arg = pOp->p2;. 
2d620 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
2d630 74 79 70 65 3d 3d 50 34 5f 56 54 41 42 20 29 3b  type==P4_VTAB );
2d640 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4d  .  if( ALWAYS(pM
2d650 6f 64 75 6c 65 2d 3e 78 55 70 64 61 74 65 29 20  odule->xUpdate) 
2d660 29 7b 0a 20 20 20 20 61 70 41 72 67 20 3d 20 70  ){.    apArg = p
2d670 2d 3e 61 70 41 72 67 3b 0a 20 20 20 20 70 58 20  ->apArg;.    pX 
2d680 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
2d690 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2d6a0 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
2d6b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
2d6c0 6d 53 74 6f 72 65 54 79 70 65 28 70 58 29 3b 0a  mStoreType(pX);.
2d6d0 20 20 20 20 20 20 61 70 41 72 67 5b 69 5d 20 3d        apArg[i] =
2d6e0 20 70 58 3b 0a 20 20 20 20 20 20 70 58 2b 2b 3b   pX;.      pX++;
2d6f0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2d700 70 4d 6f 64 75 6c 65 2d 3e 78 55 70 64 61 74 65  pModule->xUpdate
2d710 28 70 56 74 61 62 2c 20 6e 41 72 67 2c 20 61 70  (pVtab, nArg, ap
2d720 41 72 67 2c 20 26 72 6f 77 69 64 29 3b 0a 20 20  Arg, &rowid);.  
2d730 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2d740 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
2d750 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
2d760 3d 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  = pVtab->zErrMsg
2d770 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a 45 72  ;.    pVtab->zEr
2d780 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66  rMsg = 0;.    if
2d790 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d7a0 26 26 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20  && pOp->p1 ){.  
2d7b0 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
2d7c0 3e 31 20 26 26 20 61 70 41 72 67 5b 30 5d 20 26  >1 && apArg[0] &
2d7d0 26 20 28 61 70 41 72 67 5b 30 5d 2d 3e 66 6c 61  & (apArg[0]->fla
2d7e0 67 73 26 4d 45 4d 5f 4e 75 6c 6c 29 20 29 3b 0a  gs&MEM_Null) );.
2d7f0 20 20 20 20 20 20 64 62 2d 3e 6c 61 73 74 52 6f        db->lastRo
2d800 77 69 64 20 3d 20 72 6f 77 69 64 3b 0a 20 20 20  wid = rowid;.   
2d810 20 7d 0a 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67   }.    p->nChang
2d820 65 2b 2b 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  e++;.  }.  break
2d830 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2d840 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2d850 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64  LTABLE */..#ifnd
2d860 65 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ef  SQLITE_OMIT_
2d870 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f 2a  PAGER_PRAGMAS./*
2d880 20 4f 70 63 6f 64 65 3a 20 50 61 67 65 63 6f 75   Opcode: Pagecou
2d890 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  nt P1 P2 * * *.*
2d8a0 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 63  *.** Write the c
2d8b0 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  urrent number of
2d8c0 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
2d8d0 73 65 20 50 31 20 74 6f 20 6d 65 6d 6f 72 79 20  se P1 to memory 
2d8e0 63 65 6c 6c 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  cell P2..*/.case
2d8f0 20 4f 50 5f 50 61 67 65 63 6f 75 6e 74 3a 20 7b   OP_Pagecount: {
2d900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
2d910 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a  ut2-prerelease *
2d920 2f 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  /.  pOut->u.i = 
2d930 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
2d940 50 61 67 65 28 64 62 2d 3e 61 44 62 5b 70 4f 70  Page(db->aDb[pOp
2d950 2d 3e 70 31 5d 2e 70 42 74 29 3b 0a 20 20 62 72  ->p1].pBt);.  br
2d960 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  eak;.}.#endif..#
2d970 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d980 49 54 5f 54 52 41 43 45 0a 2f 2a 20 4f 70 63 6f  IT_TRACE./* Opco
2d990 64 65 3a 20 54 72 61 63 65 20 2a 20 2a 20 2a 20  de: Trace * * * 
2d9a0 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72  P4 *.**.** If tr
2d9b0 61 63 69 6e 67 20 69 73 20 65 6e 61 62 6c 65 64  acing is enabled
2d9c0 20 28 62 79 20 74 68 65 20 73 71 6c 69 74 65 33   (by the sqlite3
2d9d0 5f 74 72 61 63 65 28 29 29 20 69 6e 74 65 72 66  _trace()) interf
2d9e0 61 63 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ace, then.** the
2d9f0 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 63 6f   UTF-8 string co
2da00 6e 74 61 69 6e 65 64 20 69 6e 20 50 34 20 69 73  ntained in P4 is
2da10 20 65 6d 69 74 74 65 64 20 6f 6e 20 74 68 65 20   emitted on the 
2da20 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  trace callback..
2da30 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 72 61 63 65  */.case OP_Trace
2da40 3a 20 7b 0a 20 20 63 68 61 72 20 2a 7a 54 72 61  : {.  char *zTra
2da50 63 65 3b 0a 0a 20 20 7a 54 72 61 63 65 20 3d 20  ce;..  zTrace = 
2da60 28 70 4f 70 2d 3e 70 34 2e 7a 20 3f 20 70 4f 70  (pOp->p4.z ? pOp
2da70 2d 3e 70 34 2e 7a 20 3a 20 70 2d 3e 7a 53 71 6c  ->p4.z : p->zSql
2da80 29 3b 0a 20 20 69 66 28 20 7a 54 72 61 63 65 20  );.  if( zTrace 
2da90 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 78  ){.    if( db->x
2daa0 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 63  Trace ){.      c
2dab0 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
2dac0 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 70 2c  VdbeExpandSql(p,
2dad0 20 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 20 20   zTrace);.      
2dae0 64 62 2d 3e 78 54 72 61 63 65 28 64 62 2d 3e 70  db->xTrace(db->p
2daf0 54 72 61 63 65 41 72 67 2c 20 7a 29 3b 0a 20 20  TraceArg, z);.  
2db00 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2db10 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a  e(db, z);.    }.
2db20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2db30 42 55 47 0a 20 20 20 20 69 66 28 20 28 64 62 2d  BUG.    if( (db-
2db40 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2db50 53 71 6c 54 72 61 63 65 29 21 3d 30 20 29 7b 0a  SqlTrace)!=0 ){.
2db60 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2db70 75 67 50 72 69 6e 74 66 28 22 53 51 4c 2d 74 72  ugPrintf("SQL-tr
2db80 61 63 65 3a 20 25 73 5c 6e 22 2c 20 7a 54 72 61  ace: %s\n", zTra
2db90 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ce);.    }.#endi
2dba0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
2dbb0 47 20 2a 2f 0a 20 20 7d 0a 20 20 62 72 65 61 6b  G */.  }.  break
2dbc0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20  ;.}.#endif.../* 
2dbd0 4f 70 63 6f 64 65 3a 20 4e 6f 6f 70 20 2a 20 2a  Opcode: Noop * *
2dbe0 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 6f 20   * * *.**.** Do 
2dbf0 6e 6f 74 68 69 6e 67 2e 20 20 54 68 69 73 20 69  nothing.  This i
2dc00 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6f 66  nstruction is of
2dc10 74 65 6e 20 75 73 65 66 75 6c 20 61 73 20 61 20  ten useful as a 
2dc20 6a 75 6d 70 0a 2a 2a 20 64 65 73 74 69 6e 61 74  jump.** destinat
2dc30 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  ion..*/./*.** Th
2dc40 65 20 6d 61 67 69 63 20 45 78 70 6c 61 69 6e 20  e magic Explain 
2dc50 6f 70 63 6f 64 65 20 61 72 65 20 6f 6e 6c 79 20  opcode are only 
2dc60 69 6e 73 65 72 74 65 64 20 77 68 65 6e 20 65 78  inserted when ex
2dc70 70 6c 61 69 6e 3d 3d 32 20 28 77 68 69 63 68 0a  plain==2 (which.
2dc80 2a 2a 20 69 73 20 74 6f 20 73 61 79 20 77 68 65  ** is to say whe
2dc90 6e 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55  n the EXPLAIN QU
2dca0 45 52 59 20 50 4c 41 4e 20 73 79 6e 74 61 78 20  ERY PLAN syntax 
2dcb0 69 73 20 75 73 65 64 2e 29 0a 2a 2a 20 54 68 69  is used.).** Thi
2dcc0 73 20 6f 70 63 6f 64 65 20 72 65 63 6f 72 64 73  s opcode records
2dcd0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
2dce0 6d 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e  m the optimizer.
2dcf0 20 20 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 74    It is the.** t
2dd00 68 65 20 73 61 6d 65 20 61 73 20 61 20 6e 6f 2d  he same as a no-
2dd10 6f 70 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65  op.  This opcode
2dd20 73 6e 65 76 65 72 20 61 70 70 65 61 72 73 20 69  snever appears i
2dd30 6e 20 61 20 72 65 61 6c 20 56 4d 20 70 72 6f 67  n a real VM prog
2dd40 72 61 6d 2e 0a 2a 2f 0a 64 65 66 61 75 6c 74 3a  ram..*/.default:
2dd50 20 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54   {          /* T
2dd60 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20 4f 50  his is really OP
2dd70 5f 4e 6f 6f 70 20 61 6e 64 20 4f 50 5f 45 78 70  _Noop and OP_Exp
2dd80 6c 61 69 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lain */.  assert
2dd90 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
2dda0 50 5f 4e 6f 6f 70 20 7c 7c 20 70 4f 70 2d 3e 6f  P_Noop || pOp->o
2ddb0 70 63 6f 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69  pcode==OP_Explai
2ddc0 6e 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  n );.  break;.}.
2ddd0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
2dde0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ddf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2de00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2de10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2de20 2a 2a 20 54 68 65 20 63 61 73 65 73 20 6f 66 20  ** The cases of 
2de30 74 68 65 20 73 77 69 74 63 68 20 73 74 61 74 65  the switch state
2de40 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 69 73 20  ment above this 
2de50 6c 69 6e 65 20 73 68 6f 75 6c 64 20 61 6c 6c 20  line should all 
2de60 62 65 20 69 6e 64 65 6e 74 65 64 0a 2a 2a 20 62  be indented.** b
2de70 79 20 36 20 73 70 61 63 65 73 2e 20 20 42 75 74  y 6 spaces.  But
2de80 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 36   the left-most 6
2de90 20 73 70 61 63 65 73 20 68 61 76 65 20 62 65 65   spaces have bee
2dea0 6e 20 72 65 6d 6f 76 65 64 20 74 6f 20 69 6d 70  n removed to imp
2deb0 72 6f 76 65 20 74 68 65 0a 2a 2a 20 72 65 61 64  rove the.** read
2dec0 61 62 69 6c 69 74 79 2e 20 20 46 72 6f 6d 20 74  ability.  From t
2ded0 68 69 73 20 70 6f 69 6e 74 20 6f 6e 20 64 6f 77  his point on dow
2dee0 6e 2c 20 74 68 65 20 6e 6f 72 6d 61 6c 20 69 6e  n, the normal in
2def0 64 65 6e 74 61 74 69 6f 6e 20 72 75 6c 65 73 20  dentation rules 
2df00 61 72 65 0a 2a 2a 20 72 65 73 74 6f 72 65 64 2e  are.** restored.
2df10 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2df20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2df30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2df40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2df50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
2df60 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 56 44      }..#ifdef VD
2df70 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 20 20 7b  BE_PROFILE.    {
2df80 0a 20 20 20 20 20 20 75 36 34 20 65 6c 61 70 73  .      u64 elaps
2df90 65 64 20 3d 20 73 71 6c 69 74 65 33 48 77 74 69  ed = sqlite3Hwti
2dfa0 6d 65 28 29 20 2d 20 73 74 61 72 74 3b 0a 20 20  me() - start;.  
2dfb0 20 20 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20      pOp->cycles 
2dfc0 2b 3d 20 65 6c 61 70 73 65 64 3b 0a 20 20 20 20  += elapsed;.    
2dfd0 20 20 70 4f 70 2d 3e 63 6e 74 2b 2b 3b 0a 23 69    pOp->cnt++;.#i
2dfe0 66 20 30 0a 20 20 20 20 20 20 20 20 66 70 72 69  f 0.        fpri
2dff0 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25 31 30  ntf(stdout, "%10
2e000 6c 6c 75 20 22 2c 20 65 6c 61 70 73 65 64 29 3b  llu ", elapsed);
2e010 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2e020 56 64 62 65 50 72 69 6e 74 4f 70 28 73 74 64 6f  VdbePrintOp(stdo
2e030 75 74 2c 20 6f 72 69 67 50 63 2c 20 26 61 4f 70  ut, origPc, &aOp
2e040 5b 6f 72 69 67 50 63 5d 29 3b 0a 23 65 6e 64 69  [origPc]);.#endi
2e050 66 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  f.    }.#endif..
2e060 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
2e070 77 69 6e 67 20 63 6f 64 65 20 61 64 64 73 20 6e  wing code adds n
2e080 6f 74 68 69 6e 67 20 74 6f 20 74 68 65 20 61 63  othing to the ac
2e090 74 75 61 6c 20 66 75 6e 63 74 69 6f 6e 61 6c 69  tual functionali
2e0a0 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ty.    ** of the
2e0b0 20 70 72 6f 67 72 61 6d 2e 20 20 49 74 20 69 73   program.  It is
2e0c0 20 6f 6e 6c 79 20 68 65 72 65 20 66 6f 72 20 74   only here for t
2e0d0 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
2e0e0 67 69 6e 67 2e 0a 20 20 20 20 2a 2a 20 4f 6e 20  ging..    ** On 
2e0f0 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
2e100 69 74 20 64 6f 65 73 20 62 75 72 6e 20 43 50 55  it does burn CPU
2e110 20 63 79 63 6c 65 73 20 65 76 65 72 79 20 74 69   cycles every ti
2e120 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a  me through.    *
2e130 2a 20 74 68 65 20 65 76 61 6c 75 61 74 6f 72 20  * the evaluator 
2e140 6c 6f 6f 70 2e 20 20 53 6f 20 77 65 20 63 61 6e  loop.  So we can
2e150 20 6c 65 61 76 65 20 69 74 20 6f 75 74 20 77 68   leave it out wh
2e160 65 6e 20 4e 44 45 42 55 47 20 69 73 20 64 65 66  en NDEBUG is def
2e170 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  ined..    */.#if
2e180 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
2e190 61 73 73 65 72 74 28 20 70 63 3e 3d 2d 31 20 26  assert( pc>=-1 &
2e1a0 26 20 70 63 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 0a  & pc<p->nOp );..
2e1b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2e1c0 42 55 47 0a 20 20 20 20 69 66 28 20 70 2d 3e 74  BUG.    if( p->t
2e1d0 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 69 66  race ){.      if
2e1e0 28 20 72 63 21 3d 30 20 29 20 66 70 72 69 6e 74  ( rc!=0 ) fprint
2e1f0 66 28 70 2d 3e 74 72 61 63 65 2c 22 72 63 3d 25  f(p->trace,"rc=%
2e200 64 5c 6e 22 2c 72 63 29 3b 0a 20 20 20 20 20 20  d\n",rc);.      
2e210 69 66 28 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73  if( pOp->opflags
2e220 20 26 20 28 4f 50 46 4c 47 5f 4f 55 54 32 5f 50   & (OPFLG_OUT2_P
2e230 52 45 52 45 4c 45 41 53 45 7c 4f 50 46 4c 47 5f  RERELEASE|OPFLG_
2e240 4f 55 54 32 29 20 29 7b 0a 20 20 20 20 20 20 20  OUT2) ){.       
2e250 20 72 65 67 69 73 74 65 72 54 72 61 63 65 28 70   registerTrace(p
2e260 2d 3e 74 72 61 63 65 2c 20 70 4f 70 2d 3e 70 32  ->trace, pOp->p2
2e270 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  , &aMem[pOp->p2]
2e280 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2e290 20 69 66 28 20 70 4f 70 2d 3e 6f 70 66 6c 61 67   if( pOp->opflag
2e2a0 73 20 26 20 4f 50 46 4c 47 5f 4f 55 54 33 20 29  s & OPFLG_OUT3 )
2e2b0 7b 0a 20 20 20 20 20 20 20 20 72 65 67 69 73 74  {.        regist
2e2c0 65 72 54 72 61 63 65 28 70 2d 3e 74 72 61 63 65  erTrace(p->trace
2e2d0 2c 20 70 4f 70 2d 3e 70 33 2c 20 26 61 4d 65 6d  , pOp->p3, &aMem
2e2e0 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20  [pOp->p3]);.    
2e2f0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
2e300 20 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55    /* SQLITE_DEBU
2e310 47 20 2a 2f 0a 23 65 6e 64 69 66 20 20 2f 2a 20  G */.#endif  /* 
2e320 4e 44 45 42 55 47 20 2a 2f 0a 20 20 7d 20 20 2f  NDEBUG */.  }  /
2e330 2a 20 54 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * The end of the
2e340 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 20 74 68   for(;;) loop th
2e350 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  e loops through 
2e360 6f 70 63 6f 64 65 73 20 2a 2f 0a 0a 20 20 2f 2a  opcodes */..  /*
2e370 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
2e380 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
2e390 73 20 74 68 61 74 20 65 78 65 63 75 74 69 6f 6e  s that execution
2e3a0 20 69 73 20 66 69 6e 69 73 68 65 64 20 77 69 74   is finished wit
2e3b0 68 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  h.  ** an error 
2e3c0 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 0a 20 20  of some kind..  
2e3d0 2a 2f 0a 76 64 62 65 5f 65 72 72 6f 72 5f 68 61  */.vdbe_error_ha
2e3e0 6c 74 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63  lt:.  assert( rc
2e3f0 20 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63   );.  p->rc = rc
2e400 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  ;.  testcase( sq
2e410 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2e420 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
2e430 71 6c 69 74 65 33 5f 6c 6f 67 28 72 63 2c 20 22  qlite3_log(rc, "
2e440 73 74 61 74 65 6d 65 6e 74 20 61 62 6f 72 74 73  statement aborts
2e450 20 61 74 20 25 64 3a 20 5b 25 73 5d 20 25 73 22   at %d: [%s] %s"
2e460 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2e470 20 20 20 20 20 20 70 63 2c 20 70 2d 3e 7a 53 71        pc, p->zSq
2e480 6c 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  l, p->zErrMsg);.
2e490 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c    sqlite3VdbeHal
2e4a0 74 28 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  t(p);.  if( rc==
2e4b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
2e4c0 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  EM ) db->mallocF
2e4d0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 72 63 20  ailed = 1;.  rc 
2e4e0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2e4f0 20 20 69 66 28 20 72 65 73 65 74 53 63 68 65 6d    if( resetSchem
2e500 61 4f 6e 46 61 75 6c 74 20 29 20 73 71 6c 69 74  aOnFault ) sqlit
2e510 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
2e520 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 0a 20  chema(db, 0);.. 
2e530 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
2e540 6f 6e 6c 79 20 77 61 79 20 6f 75 74 20 6f 66 20  only way out of 
2e550 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 20  this procedure. 
2e560 20 57 65 20 68 61 76 65 20 74 6f 0a 20 20 2a 2a   We have to.  **
2e570 20 72 65 6c 65 61 73 65 20 74 68 65 20 6d 75 74   release the mut
2e580 65 78 65 73 20 6f 6e 20 62 74 72 65 65 73 20 74  exes on btrees t
2e590 68 61 74 20 77 65 72 65 20 61 63 71 75 69 72 65  hat were acquire
2e5a0 64 20 61 74 20 74 68 65 0a 20 20 2a 2a 20 74 6f  d at the.  ** to
2e5b0 70 2e 20 2a 2f 0a 76 64 62 65 5f 72 65 74 75 72  p. */.vdbe_retur
2e5c0 6e 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n:.  sqlite3Btre
2e5d0 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76 65  eMutexArrayLeave
2e5e0 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20  (&p->aMutex);.  
2e5f0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
2e600 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66   Jump to here if
2e610 20 61 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f   a string or blo
2e620 62 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51  b larger than SQ
2e630 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a  LITE_MAX_LENGTH.
2e640 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
2e650 72 65 64 2e 0a 20 20 2a 2f 0a 74 6f 6f 5f 62 69  red..  */.too_bi
2e660 67 3a 0a 20 20 73 71 6c 69 74 65 33 53 65 74 53  g:.  sqlite3SetS
2e670 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
2e680 67 2c 20 64 62 2c 20 22 73 74 72 69 6e 67 20 6f  g, db, "string o
2e690 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 29  r blob too big")
2e6a0 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  ;.  rc = SQLITE_
2e6b0 54 4f 4f 42 49 47 3b 0a 20 20 67 6f 74 6f 20 76  TOOBIG;.  goto v
2e6c0 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a  dbe_error_halt;.
2e6d0 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65  .  /* Jump to he
2e6e0 72 65 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  re if a malloc()
2e6f0 20 66 61 69 6c 73 2e 0a 20 20 2a 2f 0a 6e 6f 5f   fails..  */.no_
2e700 6d 65 6d 3a 0a 20 20 64 62 2d 3e 6d 61 6c 6c 6f  mem:.  db->mallo
2e710 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 73  cFailed = 1;.  s
2e720 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
2e730 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
2e740 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
2e750 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  );.  rc = SQLITE
2e760 5f 4e 4f 4d 45 4d 3b 0a 20 20 67 6f 74 6f 20 76  _NOMEM;.  goto v
2e770 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a  dbe_error_halt;.
2e780 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65  .  /* Jump to he
2e790 72 65 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  re for any other
2e7a0 20 6b 69 6e 64 20 6f 66 20 66 61 74 61 6c 20 65   kind of fatal e
2e7b0 72 72 6f 72 2e 20 20 54 68 65 20 22 72 63 22 20  rror.  The "rc" 
2e7c0 76 61 72 69 61 62 6c 65 0a 20 20 2a 2a 20 73 68  variable.  ** sh
2e7d0 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 72  ould hold the er
2e7e0 72 6f 72 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f  ror number..  */
2e7f0 0a 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72  .abort_due_to_er
2e800 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70  ror:.  assert( p
2e810 2d 3e 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a  ->zErrMsg==0 );.
2e820 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2e830 46 61 69 6c 65 64 20 29 20 72 63 20 3d 20 53 51  Failed ) rc = SQ
2e840 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66  LITE_NOMEM;.  if
2e850 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc!=SQLITE_IOE
2e860 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  RR_NOMEM ){.    
2e870 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
2e880 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
2e890 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45  , "%s", sqlite3E
2e8a0 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 7d 0a  rrStr(rc));.  }.
2e8b0 20 20 67 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f    goto vdbe_erro
2e8c0 72 5f 68 61 6c 74 3b 0a 0a 20 20 2f 2a 20 4a 75  r_halt;..  /* Ju
2e8d0 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 74 68  mp to here if th
2e8e0 65 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  e sqlite3_interr
2e8f0 75 70 74 28 29 20 41 50 49 20 73 65 74 73 20 74  upt() API sets t
2e900 68 65 20 69 6e 74 65 72 72 75 70 74 0a 20 20 2a  he interrupt.  *
2e910 2a 20 66 6c 61 67 2e 0a 20 20 2a 2f 0a 61 62 6f  * flag..  */.abo
2e920 72 74 5f 64 75 65 5f 74 6f 5f 69 6e 74 65 72 72  rt_due_to_interr
2e930 75 70 74 3a 0a 20 20 61 73 73 65 72 74 28 20 64  upt:.  assert( d
2e940 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
2e950 74 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 53 51  ted );.  rc = SQ
2e960 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
2e970 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
2e980 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
2e990 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
2e9a0 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45  , "%s", sqlite3E
2e9b0 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 67 6f  rrStr(rc));.  go
2e9c0 74 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68 61  to vdbe_error_ha
2e9d0 6c 74 3b 0a 7d 0a                                lt;.}.