/ Hex Artifact Content
Login

Artifact 21c17c43e579789959efea50f100de60efbb955c:


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 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
0870: 68 69 73 20 6d 61 63 72 6f 20 6f 6e 20 6d 65 6d  his macro on mem
0880: 6f 72 79 20 63 65 6c 6c 73 20 6a 75 73 74 20 70  ory cells just p
0890: 72 69 6f 72 20 74 6f 20 63 68 61 6e 67 69 6e 67  rior to changing
08a0: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
08b0: 20 74 68 65 20 63 65 6c 6c 2e 20 20 54 68 69 73   the cell.  This
08c0: 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73 20   macro verifies 
08d0: 74 68 61 74 20 73 68 61 6c 6c 6f 77 20 63 6f 70  that shallow cop
08e0: 69 65 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 6d  ies are.** not m
08f0: 69 73 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65  isused..*/.#ifde
0900: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 23  f SQLITE_DEBUG.#
0910: 20 64 65 66 69 6e 65 20 6d 65 6d 41 62 6f 75 74   define memAbout
0920: 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 20 73 71  ToChange(P,M) sq
0930: 6c 69 74 65 33 56 64 62 65 4d 65 6d 41 62 6f 75  lite3VdbeMemAbou
0940: 74 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 0a 23  tToChange(P,M).#
0950: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6d 65  else.# define me
0960: 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 50  mAboutToChange(P
0970: 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,M).#endif../*.*
0980: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
0990: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
09a0: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 65  is incremented e
09b0: 76 65 72 79 20 74 69 6d 65 20 61 20 63 75 72 73  very time a curs
09c0: 6f 72 0a 2a 2a 20 6d 6f 76 65 73 2c 20 65 69 74  or.** moves, eit
09d0: 68 65 72 20 62 79 20 74 68 65 20 4f 50 5f 53 65  her by the OP_Se
09e0: 65 6b 58 58 2c 20 4f 50 5f 4e 65 78 74 2c 20 6f  ekXX, OP_Next, o
09f0: 72 20 4f 50 5f 50 72 65 76 20 6f 70 63 6f 64 65  r OP_Prev opcode
0a00: 73 2e 20 20 54 68 65 20 74 65 73 74 0a 2a 2a 20  s.  The test.** 
0a10: 70 72 6f 63 65 64 75 72 65 73 20 75 73 65 20 74  procedures use t
0a20: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
0a30: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
0a40: 74 20 69 6e 64 69 63 65 73 20 61 72 65 0a 2a 2a  t indices are.**
0a50: 20 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 74   working correct
0a60: 6c 79 2e 20 20 54 68 69 73 20 76 61 72 69 61 62  ly.  This variab
0a70: 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69  le has no functi
0a80: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f  on other than to
0a90: 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79 20  .** help verify 
0aa0: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
0ab0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62  ation of the lib
0ac0: 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  rary..*/.#ifdef 
0ad0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
0ae0: 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
0af0: 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
0b00: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
0b10: 73 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  s global variabl
0b20: 65 20 69 73 20 70 6f 73 69 74 69 76 65 2c 20 69  e is positive, i
0b30: 74 20 67 65 74 73 20 64 65 63 72 65 6d 65 6e 74  t gets decrement
0b40: 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 0a 2a  ed once before.*
0b50: 2a 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  * each instructi
0b60: 6f 6e 20 69 6e 20 74 68 65 20 56 44 42 45 2e 20  on in the VDBE. 
0b70: 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
0b80: 20 7a 65 72 6f 2c 20 74 68 65 20 75 31 2e 69 73   zero, the u1.is
0b90: 49 6e 74 65 72 72 75 70 74 65 64 0a 2a 2a 20 66  Interrupted.** f
0ba0: 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69  ield of the sqli
0bb0: 74 65 33 20 73 74 72 75 63 74 75 72 65 20 69 73  te3 structure is
0bc0: 20 73 65 74 20 69 6e 20 6f 72 64 65 72 20 74 6f   set in order to
0bd0: 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6e 74   simulate an int
0be0: 65 72 72 75 70 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  errupt..**.** Th
0bf0: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 75  is facility is u
0c00: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
0c10: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
0c20: 49 74 20 64 6f 65 73 20 6e 6f 74 20 66 75 6e 63  It does not func
0c30: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 6e 20 6f 72  tion.** in an or
0c40: 64 69 6e 61 72 79 20 62 75 69 6c 64 2e 0a 2a 2f  dinary build..*/
0c50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
0c60: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
0c70: 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 20  interrupt_count 
0c80: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
0c90: 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f 62  ** The next glob
0ca0: 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
0cb0: 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68 20  ncremented each 
0cc0: 74 79 70 65 20 74 68 65 20 4f 50 5f 53 6f 72 74  type the OP_Sort
0cd0: 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65 78   opcode.** is ex
0ce0: 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65 73  ecuted.  The tes
0cf0: 74 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 65  t procedures use
0d00: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
0d10: 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  n to make sure t
0d20: 68 61 74 0a 2a 2a 20 73 6f 72 74 69 6e 67 20 69  hat.** sorting i
0d30: 73 20 6f 63 63 75 72 72 69 6e 67 20 6f 72 20 6e  s occurring or n
0d40: 6f 74 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20  ot occurring at 
0d50: 61 70 70 72 6f 70 72 69 61 74 65 20 74 69 6d 65  appropriate time
0d60: 73 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62  s.   This variab
0d70: 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75 6e  le.** has no fun
0d80: 63 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ction other than
0d90: 20 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79 20   to help verify 
0da0: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
0db0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
0dc0: 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64  library..*/.#ifd
0dd0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
0de0: 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f  nt sqlite3_sort_
0df0: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0e00: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  f../*.** The nex
0e10: 74 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  t global variabl
0e20: 65 20 72 65 63 6f 72 64 73 20 74 68 65 20 73 69  e records the si
0e30: 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73  ze of the larges
0e40: 74 20 4d 45 4d 5f 42 6c 6f 62 0a 2a 2a 20 6f 72  t MEM_Blob.** or
0e50: 20 4d 45 4d 5f 53 74 72 20 74 68 61 74 20 68 61   MEM_Str that ha
0e60: 73 20 62 65 65 6e 20 75 73 65 64 20 62 79 20 61  s been used by a
0e70: 20 56 44 42 45 20 6f 70 63 6f 64 65 2e 20 20 54   VDBE opcode.  T
0e80: 68 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72  he test procedur
0e90: 65 73 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 69  es.** use this i
0ea0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6d 61  nformation to ma
0eb0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
0ec0: 20 7a 65 72 6f 2d 62 6c 6f 62 20 66 75 6e 63 74   zero-blob funct
0ed0: 69 6f 6e 61 6c 69 74 79 0a 2a 2a 20 69 73 20 77  ionality.** is w
0ee0: 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 74 6c 79  orking correctly
0ef0: 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62 6c  .   This variabl
0f00: 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69 6f  e has no functio
0f10: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f 0a  n other than to.
0f20: 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79 20 74  ** help verify t
0f30: 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
0f40: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62 72  tion of the libr
0f50: 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ary..*/.#ifdef S
0f60: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
0f70: 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73  qlite3_max_blobs
0f80: 69 7a 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ize = 0;.static 
0f90: 76 6f 69 64 20 75 70 64 61 74 65 4d 61 78 42 6c  void updateMaxBl
0fa0: 6f 62 73 69 7a 65 28 4d 65 6d 20 2a 70 29 7b 0a  obsize(Mem *p){.
0fb0: 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20    if( (p->flags 
0fc0: 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  & (MEM_Str|MEM_B
0fd0: 6c 6f 62 29 29 21 3d 30 20 26 26 20 70 2d 3e 6e  lob))!=0 && p->n
0fe0: 3e 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f  >sqlite3_max_blo
0ff0: 62 73 69 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c  bsize ){.    sql
1000: 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a  ite3_max_blobsiz
1010: 65 20 3d 20 70 2d 3e 6e 3b 0a 20 20 7d 0a 7d 0a  e = p->n;.  }.}.
1020: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1030: 65 20 6e 65 78 74 20 67 6c 6f 62 61 6c 20 76 61  e next global va
1040: 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
1050: 65 6e 74 65 64 20 65 61 63 68 20 74 79 70 65 20  ented each type 
1060: 74 68 65 20 4f 50 5f 46 6f 75 6e 64 20 6f 70 63  the OP_Found opc
1070: 6f 64 65 0a 2a 2a 20 69 73 20 65 78 65 63 75 74  ode.** is execut
1080: 65 64 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  ed. This is used
1090: 20 74 6f 20 74 65 73 74 20 77 68 65 74 68 65 72   to test whether
10a0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 66 6f 72 65   or not the fore
10b0: 69 67 6e 20 6b 65 79 0a 2a 2a 20 6f 70 65 72 61  ign key.** opera
10c0: 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  tion implemented
10d0: 20 75 73 69 6e 67 20 4f 50 5f 46 6b 49 73 5a 65   using OP_FkIsZe
10e0: 72 6f 20 69 73 20 77 6f 72 6b 69 6e 67 2e 20 54  ro is working. T
10f0: 68 69 73 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  his variable.** 
1100: 68 61 73 20 6e 6f 20 66 75 6e 63 74 69 6f 6e 20  has no function 
1110: 6f 74 68 65 72 20 74 68 61 6e 20 74 6f 20 68 65  other than to he
1120: 6c 70 20 76 65 72 69 66 79 20 74 68 65 20 63 6f  lp verify the co
1130: 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
1140: 6f 66 20 74 68 65 0a 2a 2a 20 6c 69 62 72 61 72  of the.** librar
1150: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
1160: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
1170: 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74  ite3_found_count
1180: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
1190: 0a 2a 2a 20 54 65 73 74 20 61 20 72 65 67 69 73  .** Test a regis
11a0: 74 65 72 20 74 6f 20 73 65 65 20 69 66 20 69 74  ter to see if it
11b0: 20 65 78 63 65 65 64 73 20 74 68 65 20 63 75 72   exceeds the cur
11c0: 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 62 6c 6f  rent maximum blo
11d0: 62 20 73 69 7a 65 2e 0a 2a 2a 20 49 66 20 69 74  b size..** If it
11e0: 20 64 6f 65 73 2c 20 72 65 63 6f 72 64 20 74 68   does, record th
11f0: 65 20 6e 65 77 20 6d 61 78 69 6d 75 6d 20 62 6c  e new maximum bl
1200: 6f 62 20 73 69 7a 65 2e 0a 2a 2f 0a 23 69 66 20  ob size..*/.#if 
1210: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1220: 45 53 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  EST) && !defined
1230: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49  (SQLITE_OMIT_BUI
1240: 4c 54 49 4e 5f 54 45 53 54 29 0a 23 20 64 65 66  LTIN_TEST).# def
1250: 69 6e 65 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ine UPDATE_MAX_B
1260: 4c 4f 42 53 49 5a 45 28 50 29 20 20 75 70 64 61  LOBSIZE(P)  upda
1270: 74 65 4d 61 78 42 6c 6f 62 73 69 7a 65 28 50 29  teMaxBlobsize(P)
1280: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1290: 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
12a0: 49 5a 45 28 50 29 0a 23 65 6e 64 69 66 0a 0a 2f  IZE(P).#endif../
12b0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65  *.** Convert the
12c0: 20 67 69 76 65 6e 20 72 65 67 69 73 74 65 72 20   given register 
12d0: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 69 66  into a string if
12e0: 20 69 74 20 69 73 6e 27 74 20 6f 6e 65 0a 2a 2a   it isn't one.**
12f0: 20 61 6c 72 65 61 64 79 2e 20 52 65 74 75 72 6e   already. Return
1300: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 6d   non-zero if a m
1310: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
1320: 2f 0a 23 64 65 66 69 6e 65 20 53 74 72 69 6e 67  /.#define String
1330: 69 66 79 28 50 2c 20 65 6e 63 29 20 5c 0a 20 20  ify(P, enc) \.  
1340: 20 69 66 28 28 28 50 29 2d 3e 66 6c 61 67 73 26   if(((P)->flags&
1350: 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
1360: 62 29 29 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  b))==0 && sqlite
1370: 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67 69 66  3VdbeMemStringif
1380: 79 28 50 2c 65 6e 63 29 29 20 5c 0a 20 20 20 20  y(P,enc)) \.    
1390: 20 7b 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 20   { goto no_mem; 
13a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 65 70 68 65  }../*.** An ephe
13b0: 6d 65 72 61 6c 20 73 74 72 69 6e 67 20 76 61 6c  meral string val
13c0: 75 65 20 28 73 69 67 6e 69 66 69 65 64 20 62 79  ue (signified by
13d0: 20 74 68 65 20 4d 45 4d 5f 45 70 68 65 6d 20 66   the MEM_Ephem f
13e0: 6c 61 67 29 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  lag) contains.**
13f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1400: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
1410: 63 61 74 65 64 20 73 74 72 69 6e 67 20 77 68 65  cated string whe
1420: 72 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 6e  re some other en
1430: 74 69 74 79 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tity.** is respo
1440: 6e 73 69 62 6c 65 20 66 6f 72 20 64 65 61 6c 6c  nsible for deall
1450: 6f 63 61 74 69 6e 67 20 74 68 61 74 20 73 74 72  ocating that str
1460: 69 6e 67 2e 20 20 42 65 63 61 75 73 65 20 74 68  ing.  Because th
1470: 65 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 64 6f  e register.** do
1480: 65 73 20 6e 6f 74 20 63 6f 6e 74 72 6f 6c 20 74  es not control t
1490: 68 65 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 69  he string, it mi
14a0: 67 68 74 20 62 65 20 64 65 6c 65 74 65 64 20 77  ght be deleted w
14b0: 69 74 68 6f 75 74 20 74 68 65 20 72 65 67 69 73  ithout the regis
14c0: 74 65 72 0a 2a 2a 20 6b 6e 6f 77 69 6e 67 20 69  ter.** knowing i
14d0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
14e0: 75 74 69 6e 65 20 63 6f 6e 76 65 72 74 73 20 61  utine converts a
14f0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69  n ephemeral stri
1500: 6e 67 20 69 6e 74 6f 20 61 20 64 79 6e 61 6d 69  ng into a dynami
1510: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 0a  cally allocated.
1520: 2a 2a 20 73 74 72 69 6e 67 20 74 68 61 74 20 74  ** string that t
1530: 68 65 20 72 65 67 69 73 74 65 72 20 69 74 73 65  he register itse
1540: 6c 66 20 63 6f 6e 74 72 6f 6c 73 2e 20 20 49 6e  lf controls.  In
1550: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74   other words, it
1560: 0a 2a 2a 20 63 6f 6e 76 65 72 74 73 20 61 6e 20  .** converts an 
1570: 4d 45 4d 5f 45 70 68 65 6d 20 73 74 72 69 6e 67  MEM_Ephem string
1580: 20 69 6e 74 6f 20 61 6e 20 4d 45 4d 5f 44 79 6e   into an MEM_Dyn
1590: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 23 64 65 66   string..*/.#def
15a0: 69 6e 65 20 44 65 65 70 68 65 6d 65 72 61 6c 69  ine Deephemerali
15b0: 7a 65 28 50 29 20 5c 0a 20 20 20 69 66 28 20 28  ze(P) \.   if( (
15c0: 28 50 29 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 45  (P)->flags&MEM_E
15d0: 70 68 65 6d 29 21 3d 30 20 5c 0a 20 20 20 20 20  phem)!=0 \.     
15e0: 20 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65    && sqlite3Vdbe
15f0: 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c 65  MemMakeWriteable
1600: 28 50 29 20 29 7b 20 67 6f 74 6f 20 6e 6f 5f 6d  (P) ){ goto no_m
1610: 65 6d 3b 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  em;}../* Return 
1620: 74 72 75 65 20 69 66 20 74 68 65 20 63 75 72 73  true if the curs
1630: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 75 73  or was opened us
1640: 69 6e 67 20 74 68 65 20 4f 50 5f 4f 70 65 6e 53  ing the OP_OpenS
1650: 6f 72 74 65 72 20 6f 70 63 6f 64 65 2e 20 2a 2f  orter opcode. */
1660: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
1670: 4d 49 54 5f 4d 45 52 47 45 5f 53 4f 52 54 0a 23  MIT_MERGE_SORT.#
1680: 20 64 65 66 69 6e 65 20 69 73 53 6f 72 74 65 72   define isSorter
1690: 28 78 29 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  (x) 0.#else.# de
16a0: 66 69 6e 65 20 69 73 53 6f 72 74 65 72 28 78 29  fine isSorter(x)
16b0: 20 28 28 78 29 2d 3e 70 53 6f 72 74 65 72 21 3d   ((x)->pSorter!=
16c0: 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0).#endif../*.**
16d0: 20 41 72 67 75 6d 65 6e 74 20 70 4d 65 6d 20 70   Argument pMem p
16e0: 6f 69 6e 74 73 20 61 74 20 61 20 72 65 67 69 73  oints at a regis
16f0: 74 65 72 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ter that will be
1700: 20 70 61 73 73 65 64 20 74 6f 20 61 0a 2a 2a 20   passed to a.** 
1710: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
1720: 63 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 65  ction or returne
1730: 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 61 73  d to the user as
1740: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61   the result of a
1750: 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 69 73 20   query..** This 
1760: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
1770: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 76 61 72 69   pMem->type vari
1780: 61 62 6c 65 20 75 73 65 64 20 62 79 20 74 68 65  able used by the
1790: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 2a   sqlite3_value_*
17a0: 28 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 2e  () .** routines.
17b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17c0: 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65  VdbeMemStoreType
17d0: 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69  (Mem *pMem){.  i
17e0: 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d  nt flags = pMem-
17f0: 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 66 6c  >flags;.  if( fl
1800: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
1810: 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  {.    pMem->type
1820: 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a   = SQLITE_NULL;.
1830: 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 66    }.  else if( f
1840: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
1850: 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  {.    pMem->type
1860: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
1870: 52 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  R;.  }.  else if
1880: 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ( flags & MEM_Re
1890: 61 6c 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e  al ){.    pMem->
18a0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 46 4c  type = SQLITE_FL
18b0: 4f 41 54 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20  OAT;.  }.  else 
18c0: 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  if( flags & MEM_
18d0: 53 74 72 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d  Str ){.    pMem-
18e0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
18f0: 45 58 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EXT;.  }else{.  
1900: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
1910: 51 4c 49 54 45 5f 42 4c 4f 42 3b 0a 20 20 7d 0a  QLITE_BLOB;.  }.
1920: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1930: 65 20 56 64 62 65 43 75 72 73 6f 72 20 6e 75 6d  e VdbeCursor num
1940: 62 65 72 20 69 43 75 72 2e 20 20 52 65 74 75 72  ber iCur.  Retur
1950: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
1960: 74 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  t.  Return NULL.
1970: 2a 2a 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74  ** if we run out
1980: 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73   of memory..*/.s
1990: 74 61 74 69 63 20 56 64 62 65 43 75 72 73 6f 72  tatic VdbeCursor
19a0: 20 2a 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72   *allocateCursor
19b0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
19c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19d0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
19e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1a00: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20  ndex of the new 
1a10: 56 64 62 65 43 75 72 73 6f 72 20 2a 2f 0a 20 20  VdbeCursor */.  
1a20: 69 6e 74 20 6e 46 69 65 6c 64 2c 20 20 20 20 20  int nField,     
1a30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1a40: 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  of fields in the
1a50: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
1a60: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20  */.  int iDb,   
1a70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1a80: 74 61 62 61 73 65 20 74 68 65 20 63 75 72 73 6f  tabase the curso
1a90: 72 20 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 6f 72  r belongs to, or
1aa0: 20 2d 31 20 2a 2f 0a 20 20 69 6e 74 20 69 73 42   -1 */.  int isB
1ab0: 74 72 65 65 43 75 72 73 6f 72 20 20 20 20 20 2f  treeCursor     /
1ac0: 2a 20 54 72 75 65 20 66 6f 72 20 42 2d 54 72 65  * True for B-Tre
1ad0: 65 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 70 73  e.  False for ps
1ae0: 65 75 64 6f 2d 74 61 62 6c 65 20 6f 72 20 76 74  eudo-table or vt
1af0: 61 62 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 46 69  ab */.){.  /* Fi
1b00: 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  nd the memory ce
1b10: 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ll that will be 
1b20: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
1b30: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
1b40: 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 66  .  ** required f
1b50: 6f 72 20 74 68 69 73 20 56 64 62 65 43 75 72 73  or this VdbeCurs
1b60: 6f 72 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  or structure. It
1b70: 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74   is convenient t
1b80: 6f 20 75 73 65 20 61 20 0a 20 20 2a 2a 20 76 64  o use a .  ** vd
1b90: 62 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  be memory cell t
1ba0: 6f 20 6d 61 6e 61 67 65 20 74 68 65 20 6d 65 6d  o manage the mem
1bb0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72  ory allocation r
1bc0: 65 71 75 69 72 65 64 20 66 6f 72 20 61 0a 20 20  equired for a.  
1bd0: 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 20 73 74  ** VdbeCursor st
1be0: 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20  ructure for the 
1bf0: 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e  following reason
1c00: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  s:.  **.  **   *
1c10: 20 53 6f 6d 65 74 69 6d 65 73 20 63 75 72 73 6f   Sometimes curso
1c20: 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 75 73  r numbers are us
1c30: 65 64 20 66 6f 72 20 61 20 63 6f 75 70 6c 65 20  ed for a couple 
1c40: 6f 66 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a  of different.  *
1c50: 2a 20 20 20 20 20 70 75 72 70 6f 73 65 73 20 69  *     purposes i
1c60: 6e 20 61 20 76 64 62 65 20 70 72 6f 67 72 61 6d  n a vdbe program
1c70: 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 74 20  . The different 
1c80: 75 73 65 73 20 6d 69 67 68 74 20 72 65 71 75 69  uses might requi
1c90: 72 65 0a 20 20 2a 2a 20 20 20 20 20 64 69 66 66  re.  **     diff
1ca0: 65 72 65 6e 74 20 73 69 7a 65 64 20 61 6c 6c 6f  erent sized allo
1cb0: 63 61 74 69 6f 6e 73 2e 20 4d 65 6d 6f 72 79 20  cations. Memory 
1cc0: 63 65 6c 6c 73 20 70 72 6f 76 69 64 65 20 67 72  cells provide gr
1cd0: 6f 77 61 62 6c 65 0a 20 20 2a 2a 20 20 20 20 20  owable.  **     
1ce0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a  allocations..  *
1cf0: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
1d00: 75 73 69 6e 67 20 45 4e 41 42 4c 45 5f 4d 45 4d  using ENABLE_MEM
1d10: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 2c 20  ORY_MANAGEMENT, 
1d20: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 62 75 66 66  memory cell buff
1d30: 65 72 73 20 63 61 6e 0a 20 20 2a 2a 20 20 20 20  ers can.  **    
1d40: 20 62 65 20 66 72 65 65 64 20 6c 61 7a 69 6c 79   be freed lazily
1d50: 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33   via the sqlite3
1d60: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
1d70: 29 20 41 50 49 2e 20 54 68 69 73 0a 20 20 2a 2a  ) API. This.  **
1d80: 20 20 20 20 20 6d 69 6e 69 6d 69 7a 65 73 20 74       minimizes t
1d90: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 6c  he number of mal
1da0: 6c 6f 63 20 63 61 6c 6c 73 20 6d 61 64 65 20 62  loc calls made b
1db0: 79 20 74 68 65 20 73 79 73 74 65 6d 2e 0a 20 20  y the system..  
1dc0: 2a 2a 0a 20 20 2a 2a 20 4d 65 6d 6f 72 79 20 63  **.  ** Memory c
1dd0: 65 6c 6c 73 20 66 6f 72 20 63 75 72 73 6f 72 73  ells for cursors
1de0: 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 61   are allocated a
1df0: 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  t the top of the
1e00: 20 61 64 64 72 65 73 73 0a 20 20 2a 2a 20 73 70   address.  ** sp
1e10: 61 63 65 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c  ace. Memory cell
1e20: 20 28 70 2d 3e 6e 4d 65 6d 29 20 63 6f 72 72 65   (p->nMem) corre
1e30: 73 70 6f 6e 64 73 20 74 6f 20 63 75 72 73 6f 72  sponds to cursor
1e40: 20 30 2e 20 53 70 61 63 65 20 66 6f 72 0a 20 20   0. Space for.  
1e50: 2a 2a 20 63 75 72 73 6f 72 20 31 20 69 73 20 6d  ** cursor 1 is m
1e60: 61 6e 61 67 65 64 20 62 79 20 6d 65 6d 6f 72 79  anaged by memory
1e70: 20 63 65 6c 6c 20 28 70 2d 3e 6e 4d 65 6d 2d 31   cell (p->nMem-1
1e80: 29 2c 20 65 74 63 2e 0a 20 20 2a 2f 0a 20 20 4d  ), etc..  */.  M
1e90: 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61  em *pMem = &p->a
1ea0: 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 2d 69 43 75 72  Mem[p->nMem-iCur
1eb0: 5d 3b 0a 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  ];..  int nByte;
1ec0: 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
1ed0: 43 78 20 3d 20 30 3b 0a 20 20 6e 42 79 74 65 20  Cx = 0;.  nByte 
1ee0: 3d 20 0a 20 20 20 20 20 20 52 4f 55 4e 44 38 28  = .      ROUND8(
1ef0: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
1f00: 72 29 29 20 2b 20 0a 20 20 20 20 20 20 28 69 73  r)) + .      (is
1f10: 42 74 72 65 65 43 75 72 73 6f 72 3f 73 71 6c 69  BtreeCursor?sqli
1f20: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
1f30: 7a 65 28 29 3a 30 29 20 2b 20 0a 20 20 20 20 20  ze():0) + .     
1f40: 20 32 2a 6e 46 69 65 6c 64 2a 73 69 7a 65 6f 66   2*nField*sizeof
1f50: 28 75 33 32 29 3b 0a 0a 20 20 61 73 73 65 72 74  (u32);..  assert
1f60: 28 20 69 43 75 72 3c 70 2d 3e 6e 43 75 72 73 6f  ( iCur<p->nCurso
1f70: 72 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  r );.  if( p->ap
1f80: 43 73 72 5b 69 43 75 72 5d 20 29 7b 0a 20 20 20  Csr[iCur] ){.   
1f90: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
1fa0: 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43  Cursor(p, p->apC
1fb0: 73 72 5b 69 43 75 72 5d 29 3b 0a 20 20 20 20 70  sr[iCur]);.    p
1fc0: 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20 3d 20  ->apCsr[iCur] = 
1fd0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c  0;.  }.  if( SQL
1fe0: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
1ff0: 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c  dbeMemGrow(pMem,
2000: 20 6e 42 79 74 65 2c 20 30 29 20 29 7b 0a 20 20   nByte, 0) ){.  
2010: 20 20 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d    p->apCsr[iCur]
2020: 20 3d 20 70 43 78 20 3d 20 28 56 64 62 65 43 75   = pCx = (VdbeCu
2030: 72 73 6f 72 2a 29 70 4d 65 6d 2d 3e 7a 3b 0a 20  rsor*)pMem->z;. 
2040: 20 20 20 6d 65 6d 73 65 74 28 70 43 78 2c 20 30     memset(pCx, 0
2050: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72  , sizeof(VdbeCur
2060: 73 6f 72 29 29 3b 0a 20 20 20 20 70 43 78 2d 3e  sor));.    pCx->
2070: 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20 20 70  iDb = iDb;.    p
2080: 43 78 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69  Cx->nField = nFi
2090: 65 6c 64 3b 0a 20 20 20 20 69 66 28 20 6e 46 69  eld;.    if( nFi
20a0: 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 43 78  eld ){.      pCx
20b0: 2d 3e 61 54 79 70 65 20 3d 20 28 75 33 32 20 2a  ->aType = (u32 *
20c0: 29 26 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38  )&pMem->z[ROUND8
20d0: 28 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73  (sizeof(VdbeCurs
20e0: 6f 72 29 29 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  or))];.    }.   
20f0: 20 69 66 28 20 69 73 42 74 72 65 65 43 75 72 73   if( isBtreeCurs
2100: 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 43 78 2d  or ){.      pCx-
2110: 3e 70 43 75 72 73 6f 72 20 3d 20 28 42 74 43 75  >pCursor = (BtCu
2120: 72 73 6f 72 2a 29 0a 20 20 20 20 20 20 20 20 20  rsor*).         
2130: 20 26 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38   &pMem->z[ROUND8
2140: 28 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73  (sizeof(VdbeCurs
2150: 6f 72 29 29 2b 32 2a 6e 46 69 65 6c 64 2a 73 69  or))+2*nField*si
2160: 7a 65 6f 66 28 75 33 32 29 5d 3b 0a 20 20 20 20  zeof(u32)];.    
2170: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75    sqlite3BtreeCu
2180: 72 73 6f 72 5a 65 72 6f 28 70 43 78 2d 3e 70 43  rsorZero(pCx->pC
2190: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
21a0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 78 3b 0a  }.  return pCx;.
21b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
21c0: 63 6f 6e 76 65 72 74 20 61 20 76 61 6c 75 65 20  convert a value 
21d0: 69 6e 74 6f 20 61 20 6e 75 6d 65 72 69 63 20 72  into a numeric r
21e0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 66  epresentation if
21f0: 20 77 65 20 63 61 6e 0a 2a 2a 20 64 6f 20 73 6f   we can.** do so
2200: 20 77 69 74 68 6f 75 74 20 6c 6f 73 73 20 6f 66   without loss of
2210: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
2220: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
2230: 66 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  f the string.** 
2240: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 6e 75 6d  looks like a num
2250: 62 65 72 2c 20 63 6f 6e 76 65 72 74 20 69 74 20  ber, convert it 
2260: 69 6e 74 6f 20 61 20 6e 75 6d 62 65 72 2e 20 20  into a number.  
2270: 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a  If it does not.*
2280: 2a 20 6c 6f 6f 6b 20 6c 69 6b 65 20 61 20 6e 75  * look like a nu
2290: 6d 62 65 72 2c 20 6c 65 61 76 65 20 69 74 20 61  mber, leave it a
22a0: 6c 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lone..*/.static 
22b0: 76 6f 69 64 20 61 70 70 6c 79 4e 75 6d 65 72 69  void applyNumeri
22c0: 63 41 66 66 69 6e 69 74 79 28 4d 65 6d 20 2a 70  cAffinity(Mem *p
22d0: 52 65 63 29 7b 0a 20 20 69 66 28 20 28 70 52 65  Rec){.  if( (pRe
22e0: 63 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  c->flags & (MEM_
22f0: 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 29 29 3d 3d  Real|MEM_Int))==
2300: 30 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  0 ){.    double 
2310: 72 56 61 6c 75 65 3b 0a 20 20 20 20 69 36 34 20  rValue;.    i64 
2320: 69 56 61 6c 75 65 3b 0a 20 20 20 20 75 38 20 65  iValue;.    u8 e
2330: 6e 63 20 3d 20 70 52 65 63 2d 3e 65 6e 63 3b 0a  nc = pRec->enc;.
2340: 20 20 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66      if( (pRec->f
2350: 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 3d 3d 30  lags&MEM_Str)==0
2360: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
2370: 66 28 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70  f( sqlite3AtoF(p
2380: 52 65 63 2d 3e 7a 2c 20 26 72 56 61 6c 75 65 2c  Rec->z, &rValue,
2390: 20 70 52 65 63 2d 3e 6e 2c 20 65 6e 63 29 3d 3d   pRec->n, enc)==
23a0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
23b0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 41 74  if( 0==sqlite3At
23c0: 6f 69 36 34 28 70 52 65 63 2d 3e 7a 2c 20 26 69  oi64(pRec->z, &i
23d0: 56 61 6c 75 65 2c 20 70 52 65 63 2d 3e 6e 2c 20  Value, pRec->n, 
23e0: 65 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 70 52  enc) ){.      pR
23f0: 65 63 2d 3e 75 2e 69 20 3d 20 69 56 61 6c 75 65  ec->u.i = iValue
2400: 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 66 6c  ;.      pRec->fl
2410: 61 67 73 20 7c 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  ags |= MEM_Int;.
2420: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2430: 20 70 52 65 63 2d 3e 72 20 3d 20 72 56 61 6c 75   pRec->r = rValu
2440: 65 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 66  e;.      pRec->f
2450: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 52 65 61 6c  lags |= MEM_Real
2460: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
2470: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 69 6e 67 20  *.** Processing 
2480: 69 73 20 64 65 74 65 72 6d 69 6e 65 20 62 79 20  is determine by 
2490: 74 68 65 20 61 66 66 69 6e 69 74 79 20 70 61 72  the affinity par
24a0: 61 6d 65 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 53 51  ameter:.**.** SQ
24b0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
24c0: 3a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  :.** SQLITE_AFF_
24d0: 52 45 41 4c 3a 0a 2a 2a 20 53 51 4c 49 54 45 5f  REAL:.** SQLITE_
24e0: 41 46 46 5f 4e 55 4d 45 52 49 43 3a 0a 2a 2a 20  AFF_NUMERIC:.** 
24f0: 20 20 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72     Try to conver
2500: 74 20 70 52 65 63 20 74 6f 20 61 6e 20 69 6e 74  t pRec to an int
2510: 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61 74  eger representat
2520: 69 6f 6e 20 6f 72 20 61 20 0a 2a 2a 20 20 20 20  ion or a .**    
2530: 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 72  floating-point r
2540: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 66  epresentation if
2550: 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72   an integer repr
2560: 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
2570: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
2580: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
2590: 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73 65   integer represe
25a0: 6e 74 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 20 20  ntation is.**   
25b0: 20 61 6c 77 61 79 73 20 70 72 65 66 65 72 72 65   always preferre
25c0: 64 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 61  d, even if the a
25d0: 66 66 69 6e 69 74 79 20 69 73 20 52 45 41 4c 2c  ffinity is REAL,
25e0: 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 61   because.**    a
25f0: 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73  n integer repres
2600: 65 6e 74 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65  entation is more
2610: 20 73 70 61 63 65 20 65 66 66 69 63 69 65 6e 74   space efficient
2620: 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   on disk..**.** 
2630: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a  SQLITE_AFF_TEXT:
2640: 0a 2a 2a 20 20 20 20 43 6f 6e 76 65 72 74 20 70  .**    Convert p
2650: 52 65 63 20 74 6f 20 61 20 74 65 78 74 20 72 65  Rec to a text re
2660: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a  presentation..**
2670: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  .** SQLITE_AFF_N
2680: 4f 4e 45 3a 0a 2a 2a 20 20 20 20 4e 6f 2d 6f 70  ONE:.**    No-op
2690: 2e 20 20 70 52 65 63 20 69 73 20 75 6e 63 68 61  .  pRec is uncha
26a0: 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nged..*/.static 
26b0: 76 6f 69 64 20 61 70 70 6c 79 41 66 66 69 6e 69  void applyAffini
26c0: 74 79 28 0a 20 20 4d 65 6d 20 2a 70 52 65 63 2c  ty(.  Mem *pRec,
26d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26e0: 20 76 61 6c 75 65 20 74 6f 20 61 70 70 6c 79 20   value to apply 
26f0: 61 66 66 69 6e 69 74 79 20 74 6f 20 2a 2f 0a 20  affinity to */. 
2700: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 2c 20   char affinity, 
2710: 20 20 20 20 20 2f 2a 20 54 68 65 20 61 66 66 69       /* The affi
2720: 6e 69 74 79 20 74 6f 20 62 65 20 61 70 70 6c 69  nity to be appli
2730: 65 64 20 2a 2f 0a 20 20 75 38 20 65 6e 63 20 20  ed */.  u8 enc  
2740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
2750: 73 65 20 74 68 69 73 20 74 65 78 74 20 65 6e 63  se this text enc
2760: 6f 64 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66  oding */.){.  if
2770: 28 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ( affinity==SQLI
2780: 54 45 5f 41 46 46 5f 54 45 58 54 20 29 7b 0a 20  TE_AFF_TEXT ){. 
2790: 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 74 74 65 6d     /* Only attem
27a0: 70 74 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  pt the conversio
27b0: 6e 20 74 6f 20 54 45 58 54 20 69 66 20 74 68 65  n to TEXT if the
27c0: 72 65 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  re is an integer
27d0: 20 6f 72 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20   or real.    ** 
27e0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 28  representation (
27f0: 62 6c 6f 62 20 61 6e 64 20 4e 55 4c 4c 20 64 6f  blob and NULL do
2800: 20 6e 6f 74 20 67 65 74 20 63 6f 6e 76 65 72 74   not get convert
2810: 65 64 29 20 62 75 74 20 6e 6f 20 73 74 72 69 6e  ed) but no strin
2820: 67 0a 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65  g.    ** represe
2830: 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ntation..    */.
2840: 20 20 20 20 69 66 28 20 30 3d 3d 28 70 52 65 63      if( 0==(pRec
2850: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29  ->flags&MEM_Str)
2860: 20 26 26 20 28 70 52 65 63 2d 3e 66 6c 61 67 73   && (pRec->flags
2870: 26 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49  &(MEM_Real|MEM_I
2880: 6e 74 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71  nt)) ){.      sq
2890: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69  lite3VdbeMemStri
28a0: 6e 67 69 66 79 28 70 52 65 63 2c 20 65 6e 63 29  ngify(pRec, enc)
28b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 63  ;.    }.    pRec
28c0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d  ->flags &= ~(MEM
28d0: 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 29 3b 0a  _Real|MEM_Int);.
28e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 66 66 69    }else if( affi
28f0: 6e 69 74 79 21 3d 53 51 4c 49 54 45 5f 41 46 46  nity!=SQLITE_AFF
2900: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73  _NONE ){.    ass
2910: 65 72 74 28 20 61 66 66 69 6e 69 74 79 3d 3d 53  ert( affinity==S
2920: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
2930: 52 20 7c 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53  R || affinity==S
2940: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20  QLITE_AFF_REAL. 
2950: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 61              || a
2960: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
2970: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20  AFF_NUMERIC );. 
2980: 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41     applyNumericA
2990: 66 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a 20  ffinity(pRec);. 
29a0: 20 20 20 69 66 28 20 70 52 65 63 2d 3e 66 6c 61     if( pRec->fla
29b0: 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b  gs & MEM_Real ){
29c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
29d0: 62 65 49 6e 74 65 67 65 72 41 66 66 69 6e 69 74  beIntegerAffinit
29e0: 79 28 70 52 65 63 29 3b 0a 20 20 20 20 7d 0a 20  y(pRec);.    }. 
29f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20   }.}../*.** Try 
2a00: 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20 74  to convert the t
2a10: 79 70 65 20 6f 66 20 61 20 66 75 6e 63 74 69 6f  ype of a functio
2a20: 6e 20 61 72 67 75 6d 65 6e 74 20 6f 72 20 61 20  n argument or a 
2a30: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 0a 2a 2a  result column.**
2a40: 20 69 6e 74 6f 20 61 20 6e 75 6d 65 72 69 63 20   into a numeric 
2a50: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20  representation. 
2a60: 20 55 73 65 20 65 69 74 68 65 72 20 49 4e 54 45   Use either INTE
2a70: 47 45 52 20 6f 72 20 52 45 41 4c 20 77 68 69 63  GER or REAL whic
2a80: 68 65 76 65 72 0a 2a 2a 20 69 73 20 61 70 70 72  hever.** is appr
2a90: 6f 70 72 69 61 74 65 2e 20 20 42 75 74 20 6f 6e  opriate.  But on
2aa0: 6c 79 20 64 6f 20 74 68 65 20 63 6f 6e 76 65 72  ly do the conver
2ab0: 73 69 6f 6e 20 69 66 20 69 74 20 69 73 20 70 6f  sion if it is po
2ac0: 73 73 69 62 6c 65 20 77 69 74 68 6f 75 74 0a 2a  ssible without.*
2ad0: 2a 20 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72 6d  * loss of inform
2ae0: 61 74 69 6f 6e 20 61 6e 64 20 72 65 74 75 72 6e  ation and return
2af0: 20 74 68 65 20 72 65 76 69 73 65 64 20 74 79 70   the revised typ
2b00: 65 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e  e of the argumen
2b10: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2b20: 33 5f 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f  3_value_numeric_
2b30: 74 79 70 65 28 73 71 6c 69 74 65 33 5f 76 61 6c  type(sqlite3_val
2b40: 75 65 20 2a 70 56 61 6c 29 7b 0a 20 20 4d 65 6d  ue *pVal){.  Mem
2b50: 20 2a 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 70   *pMem = (Mem*)p
2b60: 56 61 6c 3b 0a 20 20 69 66 28 20 70 4d 65 6d 2d  Val;.  if( pMem-
2b70: 3e 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45  >type==SQLITE_TE
2b80: 58 54 20 29 7b 0a 20 20 20 20 61 70 70 6c 79 4e  XT ){.    applyN
2b90: 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 70  umericAffinity(p
2ba0: 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Mem);.    sqlite
2bb0: 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70  3VdbeMemStoreTyp
2bc0: 65 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 72  e(pMem);.  }.  r
2bd0: 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 74 79 70 65  eturn pMem->type
2be0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6f 72  ;.}../*.** Expor
2bf0: 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 61  ted version of a
2c00: 70 70 6c 79 41 66 66 69 6e 69 74 79 28 29 2e 20  pplyAffinity(). 
2c10: 54 68 69 73 20 6f 6e 65 20 77 6f 72 6b 73 20 6f  This one works o
2c20: 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  n sqlite3_value*
2c30: 2c 20 0a 2a 2a 20 6e 6f 74 20 74 68 65 20 69 6e  , .** not the in
2c40: 74 65 72 6e 61 6c 20 4d 65 6d 2a 20 74 79 70 65  ternal Mem* type
2c50: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2c60: 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e  3ValueApplyAffin
2c70: 69 74 79 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ity(.  sqlite3_v
2c80: 61 6c 75 65 20 2a 70 56 61 6c 2c 20 0a 20 20 75  alue *pVal, .  u
2c90: 38 20 61 66 66 69 6e 69 74 79 2c 20 0a 20 20 75  8 affinity, .  u
2ca0: 38 20 65 6e 63 0a 29 7b 0a 20 20 61 70 70 6c 79  8 enc.){.  apply
2cb0: 41 66 66 69 6e 69 74 79 28 28 4d 65 6d 20 2a 29  Affinity((Mem *)
2cc0: 70 56 61 6c 2c 20 61 66 66 69 6e 69 74 79 2c 20  pVal, affinity, 
2cd0: 65 6e 63 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  enc);.}..#ifdef 
2ce0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
2cf0: 2a 2a 20 57 72 69 74 65 20 61 20 6e 69 63 65 20  ** Write a nice 
2d00: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
2d10: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e  ation of the con
2d20: 74 65 6e 74 73 20 6f 66 20 63 65 6c 6c 20 70 4d  tents of cell pM
2d30: 65 6d 0a 2a 2a 20 69 6e 74 6f 20 62 75 66 66 65  em.** into buffe
2d40: 72 20 7a 42 75 66 2c 20 6c 65 6e 67 74 68 20 6e  r zBuf, length n
2d50: 42 75 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  Buf..*/.void sql
2d60: 69 74 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74  ite3VdbeMemPrett
2d70: 79 50 72 69 6e 74 28 4d 65 6d 20 2a 70 4d 65 6d  yPrint(Mem *pMem
2d80: 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
2d90: 20 63 68 61 72 20 2a 7a 43 73 72 20 3d 20 7a 42   char *zCsr = zB
2da0: 75 66 3b 0a 20 20 69 6e 74 20 66 20 3d 20 70 4d  uf;.  int f = pM
2db0: 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20 73 74  em->flags;..  st
2dc0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2dd0: 2a 63 6f 6e 73 74 20 65 6e 63 6e 61 6d 65 73 5b  *const encnames[
2de0: 5d 20 3d 20 7b 22 28 58 29 22 2c 20 22 28 38 29  ] = {"(X)", "(8)
2df0: 22 2c 20 22 28 31 36 4c 45 29 22 2c 20 22 28 31  ", "(16LE)", "(1
2e00: 36 42 45 29 22 7d 3b 0a 0a 20 20 69 66 28 20 66  6BE)"};..  if( f
2e10: 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20  &MEM_Blob ){.   
2e20: 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72   int i;.    char
2e30: 20 63 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20   c;.    if( f & 
2e40: 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20  MEM_Dyn ){.     
2e50: 20 63 20 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20   c = 'z';.      
2e60: 61 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45  assert( (f & (ME
2e70: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68  M_Static|MEM_Eph
2e80: 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  em))==0 );.    }
2e90: 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d  else if( f & MEM
2ea0: 5f 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  _Static ){.     
2eb0: 20 63 20 3d 20 27 74 27 3b 0a 20 20 20 20 20 20   c = 't';.      
2ec0: 61 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45  assert( (f & (ME
2ed0: 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29  M_Dyn|MEM_Ephem)
2ee0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73  )==0 );.    }els
2ef0: 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 45 70  e if( f & MEM_Ep
2f00: 68 65 6d 20 29 7b 0a 20 20 20 20 20 20 63 20 3d  hem ){.      c =
2f10: 20 27 65 27 3b 0a 20 20 20 20 20 20 61 73 73 65   'e';.      asse
2f20: 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74  rt( (f & (MEM_St
2f30: 61 74 69 63 7c 4d 45 4d 5f 44 79 6e 29 29 3d 3d  atic|MEM_Dyn))==
2f40: 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0 );.    }else{.
2f50: 20 20 20 20 20 20 63 20 3d 20 27 73 27 3b 0a 20        c = 's';. 
2f60: 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
2f70: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20  3_snprintf(100, 
2f80: 7a 43 73 72 2c 20 22 25 63 22 2c 20 63 29 3b 0a  zCsr, "%c", c);.
2f90: 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69      zCsr += sqli
2fa0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72  te3Strlen30(zCsr
2fb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
2fc0: 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73  nprintf(100, zCs
2fd0: 72 2c 20 22 25 64 5b 22 2c 20 70 4d 65 6d 2d 3e  r, "%d[", pMem->
2fe0: 6e 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20  n);.    zCsr += 
2ff0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3000: 7a 43 73 72 29 3b 0a 20 20 20 20 66 6f 72 28 69  zCsr);.    for(i
3010: 3d 30 3b 20 69 3c 31 36 20 26 26 20 69 3c 70 4d  =0; i<16 && i<pM
3020: 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  em->n; i++){.   
3030: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
3040: 6e 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 20 22  ntf(100, zCsr, "
3050: 25 30 32 58 22 2c 20 28 28 69 6e 74 29 70 4d 65  %02X", ((int)pMe
3060: 6d 2d 3e 7a 5b 69 5d 20 26 20 30 78 46 46 29 29  m->z[i] & 0xFF))
3070: 3b 0a 20 20 20 20 20 20 7a 43 73 72 20 2b 3d 20  ;.      zCsr += 
3080: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3090: 7a 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCsr);.    }.   
30a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 36 20 26   for(i=0; i<16 &
30b0: 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b 20 69 2b 2b  & i<pMem->n; i++
30c0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 20  ){.      char z 
30d0: 3d 20 70 4d 65 6d 2d 3e 7a 5b 69 5d 3b 0a 20 20  = pMem->z[i];.  
30e0: 20 20 20 20 69 66 28 20 7a 3c 33 32 20 7c 7c 20      if( z<32 || 
30f0: 7a 3e 31 32 36 20 29 20 2a 7a 43 73 72 2b 2b 20  z>126 ) *zCsr++ 
3100: 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20 65 6c 73  = '.';.      els
3110: 65 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a 3b 0a 20  e *zCsr++ = z;. 
3120: 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
3130: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20  3_snprintf(100, 
3140: 7a 43 73 72 2c 20 22 5d 25 73 22 2c 20 65 6e 63  zCsr, "]%s", enc
3150: 6e 61 6d 65 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d  names[pMem->enc]
3160: 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 73  );.    zCsr += s
3170: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
3180: 43 73 72 29 3b 0a 20 20 20 20 69 66 28 20 66 20  Csr);.    if( f 
3190: 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
31a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
31b0: 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 22  intf(100, zCsr,"
31c0: 2b 25 64 7a 22 2c 70 4d 65 6d 2d 3e 75 2e 6e 5a  +%dz",pMem->u.nZ
31d0: 65 72 6f 29 3b 0a 20 20 20 20 20 20 7a 43 73 72  ero);.      zCsr
31e0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
31f0: 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 7d  n30(zCsr);.    }
3200: 0a 20 20 20 20 2a 7a 43 73 72 20 3d 20 27 5c 30  .    *zCsr = '\0
3210: 27 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  ';.  }else if( f
3220: 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20   & MEM_Str ){.  
3230: 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20 20 20    int j, k;.    
3240: 7a 42 75 66 5b 30 5d 20 3d 20 27 20 27 3b 0a 20  zBuf[0] = ' ';. 
3250: 20 20 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 44     if( f & MEM_D
3260: 79 6e 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66  yn ){.      zBuf
3270: 5b 31 5d 20 3d 20 27 7a 27 3b 0a 20 20 20 20 20  [1] = 'z';.     
3280: 20 61 73 73 65 72 74 28 20 28 66 20 26 20 28 4d   assert( (f & (M
3290: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 45 70  EM_Static|MEM_Ep
32a0: 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  hem))==0 );.    
32b0: 7d 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45  }else if( f & ME
32c0: 4d 5f 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  M_Static ){.    
32d0: 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 74 27 3b    zBuf[1] = 't';
32e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
32f0: 66 20 26 20 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  f & (MEM_Dyn|MEM
3300: 5f 45 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20  _Ephem))==0 );. 
3310: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26     }else if( f &
3320: 20 4d 45 4d 5f 45 70 68 65 6d 20 29 7b 0a 20 20   MEM_Ephem ){.  
3330: 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 65      zBuf[1] = 'e
3340: 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ';.      assert(
3350: 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69   (f & (MEM_Stati
3360: 63 7c 4d 45 4d 5f 44 79 6e 29 29 3d 3d 30 20 29  c|MEM_Dyn))==0 )
3370: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3380: 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 73 27     zBuf[1] = 's'
3390: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6b 20 3d 20  ;.    }.    k = 
33a0: 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  2;.    sqlite3_s
33b0: 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 26 7a 42  nprintf(100, &zB
33c0: 75 66 5b 6b 5d 2c 20 22 25 64 22 2c 20 70 4d 65  uf[k], "%d", pMe
33d0: 6d 2d 3e 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20  m->n);.    k += 
33e0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
33f0: 26 7a 42 75 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a  &zBuf[k]);.    z
3400: 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27 5b 27 3b 0a  Buf[k++] = '[';.
3410: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31      for(j=0; j<1
3420: 35 20 26 26 20 6a 3c 70 4d 65 6d 2d 3e 6e 3b 20  5 && j<pMem->n; 
3430: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 63  j++){.      u8 c
3440: 20 3d 20 70 4d 65 6d 2d 3e 7a 5b 6a 5d 3b 0a 20   = pMem->z[j];. 
3450: 20 20 20 20 20 69 66 28 20 63 3e 3d 30 78 32 30       if( c>=0x20
3460: 20 26 26 20 63 3c 30 78 37 66 20 29 7b 0a 20 20   && c<0x7f ){.  
3470: 20 20 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20        zBuf[k++] 
3480: 3d 20 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = c;.      }else
3490: 7b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6b  {.        zBuf[k
34a0: 2b 2b 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20 20  ++] = '.';.     
34b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75   }.    }.    zBu
34c0: 66 5b 6b 2b 2b 5d 20 3d 20 27 5d 27 3b 0a 20 20  f[k++] = ']';.  
34d0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
34e0: 74 66 28 31 30 30 2c 26 7a 42 75 66 5b 6b 5d 2c  tf(100,&zBuf[k],
34f0: 20 65 6e 63 6e 61 6d 65 73 5b 70 4d 65 6d 2d 3e   encnames[pMem->
3500: 65 6e 63 5d 29 3b 0a 20 20 20 20 6b 20 2b 3d 20  enc]);.    k += 
3510: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3520: 26 7a 42 75 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a  &zBuf[k]);.    z
3530: 42 75 66 5b 6b 2b 2b 5d 20 3d 20 30 3b 0a 20 20  Buf[k++] = 0;.  
3540: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  }.}.#endif..#ifd
3550: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
3560: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
3570: 76 61 6c 75 65 20 6f 66 20 61 20 72 65 67 69 73  value of a regis
3580: 74 65 72 20 66 6f 72 20 74 72 61 63 69 6e 67 20  ter for tracing 
3590: 70 75 72 70 6f 73 65 73 3a 0a 2a 2f 0a 73 74 61  purposes:.*/.sta
35a0: 74 69 63 20 76 6f 69 64 20 6d 65 6d 54 72 61 63  tic void memTrac
35b0: 65 50 72 69 6e 74 28 46 49 4c 45 20 2a 6f 75 74  ePrint(FILE *out
35c0: 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28  , Mem *p){.  if(
35d0: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
35e0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 66 70 72 69  Null ){.    fpri
35f0: 6e 74 66 28 6f 75 74 2c 20 22 20 4e 55 4c 4c 22  ntf(out, " NULL"
3600: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  );.  }else if( (
3610: 70 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  p->flags & (MEM_
3620: 49 6e 74 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 28  Int|MEM_Str))==(
3630: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 53 74 72 29  MEM_Int|MEM_Str)
3640: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
3650: 6f 75 74 2c 20 22 20 73 69 3a 25 6c 6c 64 22 2c  out, " si:%lld",
3660: 20 70 2d 3e 75 2e 69 29 3b 0a 20 20 7d 65 6c 73   p->u.i);.  }els
3670: 65 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26  e if( p->flags &
3680: 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20   MEM_Int ){.    
3690: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 69  fprintf(out, " i
36a0: 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e 69 29 3b  :%lld", p->u.i);
36b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36c0: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
36d0: 49 4e 54 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  INT.  }else if( 
36e0: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  p->flags & MEM_R
36f0: 65 61 6c 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  eal ){.    fprin
3700: 74 66 28 6f 75 74 2c 20 22 20 72 3a 25 67 22 2c  tf(out, " r:%g",
3710: 20 70 2d 3e 72 29 3b 0a 23 65 6e 64 69 66 0a 20   p->r);.#endif. 
3720: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c   }else if( p->fl
3730: 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
3740: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
3750: 6f 75 74 2c 20 22 20 28 72 6f 77 73 65 74 29 22  out, " (rowset)"
3760: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3770: 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a  char zBuf[200];.
3780: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
3790: 65 6d 50 72 65 74 74 79 50 72 69 6e 74 28 70 2c  emPrettyPrint(p,
37a0: 20 7a 42 75 66 29 3b 0a 20 20 20 20 66 70 72 69   zBuf);.    fpri
37b0: 6e 74 66 28 6f 75 74 2c 20 22 20 22 29 3b 0a 20  ntf(out, " ");. 
37c0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
37d0: 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d  "%s", zBuf);.  }
37e0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
37f0: 65 67 69 73 74 65 72 54 72 61 63 65 28 46 49 4c  egisterTrace(FIL
3800: 45 20 2a 6f 75 74 2c 20 69 6e 74 20 69 52 65 67  E *out, int iReg
3810: 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20 66 70 72  , Mem *p){.  fpr
3820: 69 6e 74 66 28 6f 75 74 2c 20 22 52 45 47 5b 25  intf(out, "REG[%
3830: 64 5d 20 3d 20 22 2c 20 69 52 65 67 29 3b 0a 20  d] = ", iReg);. 
3840: 20 6d 65 6d 54 72 61 63 65 50 72 69 6e 74 28 6f   memTracePrint(o
3850: 75 74 2c 20 70 29 3b 0a 20 20 66 70 72 69 6e 74  ut, p);.  fprint
3860: 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 7d 0a  f(out, "\n");.}.
3870: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
3880: 51 4c 49 54 45 5f 44 45 42 55 47 0a 23 20 20 64  QLITE_DEBUG.#  d
3890: 65 66 69 6e 65 20 52 45 47 49 53 54 45 52 5f 54  efine REGISTER_T
38a0: 52 41 43 45 28 52 2c 4d 29 20 69 66 28 70 2d 3e  RACE(R,M) if(p->
38b0: 74 72 61 63 65 29 72 65 67 69 73 74 65 72 54 72  trace)registerTr
38c0: 61 63 65 28 70 2d 3e 74 72 61 63 65 2c 52 2c 4d  ace(p->trace,R,M
38d0: 29 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  ).#else.#  defin
38e0: 65 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45  e REGISTER_TRACE
38f0: 28 52 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 0a 23  (R,M).#endif...#
3900: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
3910: 4c 45 0a 0a 2f 2a 20 0a 2a 2a 20 68 77 74 69 6d  LE../* .** hwtim
3920: 65 2e 68 20 63 6f 6e 74 61 69 6e 73 20 69 6e 6c  e.h contains inl
3930: 69 6e 65 20 61 73 73 65 6d 62 6c 65 72 20 63 6f  ine assembler co
3940: 64 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74  de for implement
3950: 69 6e 67 20 0a 2a 2a 20 68 69 67 68 2d 70 65 72  ing .** high-per
3960: 66 6f 72 6d 61 6e 63 65 20 74 69 6d 69 6e 67 20  formance timing 
3970: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a 23 69 6e  routines..*/.#in
3980: 63 6c 75 64 65 20 22 68 77 74 69 6d 65 2e 68 22  clude "hwtime.h"
3990: 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ..#endif../*.** 
39a0: 54 68 65 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e  The CHECK_FOR_IN
39b0: 54 45 52 52 55 50 54 20 6d 61 63 72 6f 20 64 65  TERRUPT macro de
39c0: 66 69 6e 65 64 20 68 65 72 65 20 6c 6f 6f 6b 73  fined here looks
39d0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 0a 2a   to see if the.*
39e0: 2a 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  * sqlite3_interr
39f0: 75 70 74 28 29 20 72 6f 75 74 69 6e 65 20 68 61  upt() routine ha
3a00: 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 2e 20 20  s been called.  
3a10: 49 66 20 69 74 20 68 61 73 20 62 65 65 6e 2c 20  If it has been, 
3a20: 74 68 65 6e 0a 2a 2a 20 70 72 6f 63 65 73 73 69  then.** processi
3a30: 6e 67 20 6f 66 20 74 68 65 20 56 44 42 45 20 70  ng of the VDBE p
3a40: 72 6f 67 72 61 6d 20 69 73 20 69 6e 74 65 72 72  rogram is interr
3a50: 75 70 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  upted..**.** Thi
3a60: 73 20 6d 61 63 72 6f 20 61 64 64 65 64 20 74 6f  s macro added to
3a70: 20 65 76 65 72 79 20 69 6e 73 74 72 75 63 74 69   every instructi
3a80: 6f 6e 20 74 68 61 74 20 64 6f 65 73 20 61 20 6a  on that does a j
3a90: 75 6d 70 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a  ump in order to.
3aa0: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 6c  ** implement a l
3ab0: 6f 6f 70 2e 20 20 54 68 69 73 20 74 65 73 74 20  oop.  This test 
3ac0: 75 73 65 64 20 74 6f 20 62 65 20 6f 6e 20 65 76  used to be on ev
3ad0: 65 72 79 20 73 69 6e 67 6c 65 20 69 6e 73 74 72  ery single instr
3ae0: 75 63 74 69 6f 6e 2c 0a 2a 2a 20 62 75 74 20 74  uction,.** but t
3af0: 68 61 74 20 6d 65 61 6e 74 20 77 65 20 6d 6f 72  hat meant we mor
3b00: 65 20 74 65 73 74 69 6e 67 20 74 68 61 6e 20 77  e testing than w
3b10: 65 20 6e 65 65 64 65 64 2e 20 20 42 79 20 6f 6e  e needed.  By on
3b20: 6c 79 20 74 65 73 74 69 6e 67 20 74 68 65 0a 2a  ly testing the.*
3b30: 2a 20 66 6c 61 67 20 6f 6e 20 6a 75 6d 70 20 69  * flag on jump i
3b40: 6e 73 74 72 75 63 74 69 6f 6e 73 2c 20 77 65 20  nstructions, we 
3b50: 67 65 74 20 61 20 28 73 6d 61 6c 6c 29 20 73 70  get a (small) sp
3b60: 65 65 64 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e  eed improvement.
3b70: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43  .*/.#define CHEC
3b80: 4b 5f 46 4f 52 5f 49 4e 54 45 52 52 55 50 54 20  K_FOR_INTERRUPT 
3b90: 5c 0a 20 20 20 69 66 28 20 64 62 2d 3e 75 31 2e  \.   if( db->u1.
3ba0: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 20  isInterrupted ) 
3bb0: 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
3bc0: 6f 5f 69 6e 74 65 72 72 75 70 74 3b 0a 0a 0a 23  o_interrupt;...#
3bd0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
3be0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3bf0: 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  n is only called
3c00: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20   from within an 
3c10: 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73  assert() express
3c20: 69 6f 6e 2e 20 49 74 0a 2a 2a 20 63 68 65 63 6b  ion. It.** check
3c30: 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  s that the sqlit
3c40: 65 33 2e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  e3.nTransaction 
3c50: 76 61 72 69 61 62 6c 65 20 69 73 20 63 6f 72 72  variable is corr
3c60: 65 63 74 6c 79 20 73 65 74 20 74 6f 0a 2a 2a 20  ectly set to.** 
3c70: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f  the number of no
3c80: 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  n-transaction sa
3c90: 76 65 70 6f 69 6e 74 73 20 63 75 72 72 65 6e 74  vepoints current
3ca0: 6c 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ly in the .** li
3cb0: 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
3cc0: 6e 67 20 61 74 20 73 71 6c 69 74 65 33 2e 70 53  ng at sqlite3.pS
3cd0: 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 0a 2a 2a  avepoint..** .**
3ce0: 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   Usage:.**.**   
3cf0: 20 20 61 73 73 65 72 74 28 20 63 68 65 63 6b 53    assert( checkS
3d00: 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28 64 62  avepointCount(db
3d10: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
3d20: 6e 74 20 63 68 65 63 6b 53 61 76 65 70 6f 69 6e  nt checkSavepoin
3d30: 74 43 6f 75 6e 74 28 73 71 6c 69 74 65 33 20 2a  tCount(sqlite3 *
3d40: 64 62 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  db){.  int n = 0
3d50: 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70  ;.  Savepoint *p
3d60: 3b 0a 20 20 66 6f 72 28 70 3d 64 62 2d 3e 70 53  ;.  for(p=db->pS
3d70: 61 76 65 70 6f 69 6e 74 3b 20 70 3b 20 70 3d 70  avepoint; p; p=p
3d80: 2d 3e 70 4e 65 78 74 29 20 6e 2b 2b 3b 0a 20 20  ->pNext) n++;.  
3d90: 61 73 73 65 72 74 28 20 6e 3d 3d 28 64 62 2d 3e  assert( n==(db->
3da0: 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20 64 62 2d  nSavepoint + db-
3db0: 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
3dc0: 76 65 70 6f 69 6e 74 29 20 29 3b 0a 20 20 72 65  vepoint) );.  re
3dd0: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
3de0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  ../*.** Transfer
3df0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
3e00: 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69  ext from an sqli
3e10: 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67  te3_vtab.zErrMsg
3e20: 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
3e30: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
3e40: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
3e50: 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20  _malloc) into a 
3e60: 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65  Vdbe.zErrMsg (te
3e70: 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
3e80: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
3e90: 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
3ea0: 6c 6c 6f 63 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  lloc)..*/.static
3eb0: 20 76 6f 69 64 20 69 6d 70 6f 72 74 56 74 61 62   void importVtab
3ec0: 45 72 72 4d 73 67 28 56 64 62 65 20 2a 70 2c 20  ErrMsg(Vdbe *p, 
3ed0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
3ee0: 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  tab){.  sqlite3 
3ef0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73  *db = p->db;.  s
3f00: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3f10: 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
3f20: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  p->zErrMsg = sql
3f30: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
3f40: 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
3f50: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
3f60: 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
3f70: 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ;.  pVtab->zErrM
3f80: 73 67 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  sg = 0;.}.../*.*
3f90: 2a 20 45 78 65 63 75 74 65 20 61 73 20 6d 75 63  * Execute as muc
3fa0: 68 20 6f 66 20 61 20 56 44 42 45 20 70 72 6f 67  h of a VDBE prog
3fb0: 72 61 6d 20 61 73 20 77 65 20 63 61 6e 20 74 68  ram as we can th
3fc0: 65 6e 20 72 65 74 75 72 6e 2e 0a 2a 2a 0a 2a 2a  en return..**.**
3fd0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
3fe0: 52 65 61 64 79 28 29 20 6d 75 73 74 20 62 65 20  Ready() must be 
3ff0: 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 74 68  called before th
4000: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  is routine in or
4010: 64 65 72 20 74 6f 0a 2a 2a 20 63 6c 6f 73 65 20  der to.** close 
4020: 74 68 65 20 70 72 6f 67 72 61 6d 20 77 69 74 68  the program with
4030: 20 61 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74   a final OP_Halt
4040: 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74   and to set up t
4050: 68 65 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2a 20  he callbacks.** 
4060: 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 6d 65  and the error me
4070: 73 73 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 2a  ssage pointer..*
4080: 2a 0a 2a 2a 20 57 68 65 6e 65 76 65 72 20 61 20  *.** Whenever a 
4090: 72 6f 77 20 6f 72 20 72 65 73 75 6c 74 20 64 61  row or result da
40a0: 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ta is available,
40b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
40c0: 6c 6c 20 65 69 74 68 65 72 0a 2a 2a 20 69 6e 76  ll either.** inv
40d0: 6f 6b 65 20 74 68 65 20 72 65 73 75 6c 74 20 63  oke the result c
40e0: 61 6c 6c 62 61 63 6b 20 28 69 66 20 74 68 65 72  allback (if ther
40f0: 65 20 69 73 20 6f 6e 65 29 20 6f 72 20 72 65 74  e is one) or ret
4100: 75 72 6e 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49  urn with.** SQLI
4110: 54 45 5f 52 4f 57 2e 0a 2a 2a 0a 2a 2a 20 49 66  TE_ROW..**.** If
4120: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
4130: 61 64 65 20 74 6f 20 6f 70 65 6e 20 61 20 6c 6f  ade to open a lo
4140: 63 6b 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  cked database, t
4150: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
4160: 0a 2a 2a 20 77 69 6c 6c 20 65 69 74 68 65 72 20  .** will either 
4170: 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
4180: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 74 68 65  callback (if the
4190: 72 65 20 69 73 20 6f 6e 65 29 20 6f 72 20 69 74  re is one) or it
41a0: 20 77 69 6c 6c 0a 2a 2a 20 72 65 74 75 72 6e 20   will.** return 
41b0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a  SQLITE_BUSY..**.
41c0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
41d0: 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
41e0: 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
41f0: 65 6e 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74  en to memory obt
4200: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
4210: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61  lite3_malloc() a
4220: 6e 64 20 70 2d 3e 7a 45 72 72 4d 73 67 20 69 73  nd p->zErrMsg is
4230: 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
4240: 6f 20 74 68 61 74 20 6d 65 6d 6f 72 79 2e 0a 2a  o that memory..*
4250: 2a 20 54 68 65 20 65 72 72 6f 72 20 63 6f 64 65  * The error code
4260: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 2d   is stored in p-
4270: 3e 72 63 20 61 6e 64 20 74 68 69 73 20 72 6f 75  >rc and this rou
4280: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
4290: 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a  ITE_ERROR..**.**
42a0: 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   If the callback
42b0: 20 65 76 65 72 20 72 65 74 75 72 6e 73 20 6e 6f   ever returns no
42c0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
42d0: 20 70 72 6f 67 72 61 6d 20 65 78 69 74 73 0a 2a   program exits.*
42e0: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20  * immediately.  
42f0: 54 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f  There will be no
4300: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62   error message b
4310: 75 74 20 74 68 65 20 70 2d 3e 72 63 20 66 69 65  ut the p->rc fie
4320: 6c 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ld is.** set to 
4330: 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 61 6e 64  SQLITE_ABORT and
4340: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
4350: 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ll return SQLITE
4360: 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41 20  _ERROR..**.** A 
4370: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
4380: 6e 20 65 72 72 6f 72 20 63 61 75 73 65 73 20 70  n error causes p
4390: 2d 3e 72 63 20 74 6f 20 62 65 20 73 65 74 20 74  ->rc to be set t
43a0: 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61  o SQLITE_NOMEM a
43b0: 6e 64 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  nd this.** routi
43c0: 6e 65 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c  ne to return SQL
43d0: 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a  ITE_ERROR..**.**
43e0: 20 4f 74 68 65 72 20 66 61 74 61 6c 20 65 72 72   Other fatal err
43f0: 6f 72 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ors return SQLIT
4400: 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41  E_ERROR..**.** A
4410: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
4420: 65 20 68 61 73 20 66 69 6e 69 73 68 65 64 2c 20  e has finished, 
4430: 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c  sqlite3VdbeFinal
4440: 69 7a 65 28 29 20 73 68 6f 75 6c 64 20 62 65 0a  ize() should be.
4450: 2a 2a 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  ** used to clean
4460: 20 75 70 20 74 68 65 20 6d 65 73 73 20 74 68 61   up the mess tha
4470: 74 20 77 61 73 20 6c 65 66 74 20 62 65 68 69 6e  t was left behin
4480: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
4490: 33 56 64 62 65 45 78 65 63 28 0a 20 20 56 64 62  3VdbeExec(.  Vdb
44a0: 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20  e *p            
44b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
44c0: 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  DBE */.){.  int 
44d0: 70 63 3d 30 3b 20 20 20 20 20 20 20 20 20 20 20  pc=0;           
44e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
44f0: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f  ogram counter */
4500: 0a 20 20 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e  .  Op *aOp = p->
4510: 61 4f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  aOp;          /*
4520: 20 43 6f 70 79 20 6f 66 20 70 2d 3e 61 4f 70 20   Copy of p->aOp 
4530: 2a 2f 0a 20 20 4f 70 20 2a 70 4f 70 3b 20 20 20  */.  Op *pOp;   
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4550: 2f 2a 20 43 75 72 72 65 6e 74 20 6f 70 65 72 61  /* Current opera
4560: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
4570: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
4580: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
4590: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c   return */.  sql
45a0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
45b0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  ;       /* The d
45c0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
45d0: 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75  resetSchemaOnFau
45e0: 6c 74 20 3d 20 30 3b 20 2f 2a 20 52 65 73 65 74  lt = 0; /* Reset
45f0: 20 73 63 68 65 6d 61 20 61 66 74 65 72 20 61 6e   schema after an
4600: 20 65 72 72 6f 72 20 69 66 20 70 6f 73 69 74 69   error if positi
4610: 76 65 20 2a 2f 0a 20 20 75 38 20 65 6e 63 6f 64  ve */.  u8 encod
4620: 69 6e 67 20 3d 20 45 4e 43 28 64 62 29 3b 20 20  ing = ENC(db);  
4630: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
4640: 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 23  se encoding */.#
4650: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4660: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
4670: 42 41 43 4b 0a 20 20 69 6e 74 20 63 68 65 63 6b  BACK.  int check
4680: 50 72 6f 67 72 65 73 73 3b 20 20 20 20 20 20 20  Progress;       
4690: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 72 6f    /* True if pro
46a0: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 73 20  gress callbacks 
46b0: 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  are enabled */. 
46c0: 20 69 6e 74 20 6e 50 72 6f 67 72 65 73 73 4f 70   int nProgressOp
46d0: 73 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f  s = 0;      /* O
46e0: 70 63 6f 64 65 73 20 65 78 65 63 75 74 65 64 20  pcodes executed 
46f0: 73 69 6e 63 65 20 70 72 6f 67 72 65 73 73 20 63  since progress c
4700: 61 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 23 65 6e 64  allback. */.#end
4710: 69 66 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d  if.  Mem *aMem =
4720: 20 70 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20   p->aMem;       
4730: 2f 2a 20 43 6f 70 79 20 6f 66 20 70 2d 3e 61 4d  /* Copy of p->aM
4740: 65 6d 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e  em */.  Mem *pIn
4750: 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
4760: 20 20 20 2f 2a 20 31 73 74 20 69 6e 70 75 74 20     /* 1st input 
4770: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d  operand */.  Mem
4780: 20 2a 70 49 6e 32 20 3d 20 30 3b 20 20 20 20 20   *pIn2 = 0;     
4790: 20 20 20 20 20 20 20 20 2f 2a 20 32 6e 64 20 69          /* 2nd i
47a0: 6e 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  nput operand */.
47b0: 20 20 4d 65 6d 20 2a 70 49 6e 33 20 3d 20 30 3b    Mem *pIn3 = 0;
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
47d0: 33 72 64 20 69 6e 70 75 74 20 6f 70 65 72 61 6e  3rd input operan
47e0: 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4f 75 74  d */.  Mem *pOut
47f0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
4800: 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 70 65 72    /* Output oper
4810: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  and */.  int iCo
4820: 6d 70 61 72 65 20 3d 20 30 3b 20 20 20 20 20 20  mpare = 0;      
4830: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
4840: 20 6c 61 73 74 20 4f 50 5f 43 6f 6d 70 61 72 65   last OP_Compare
4850: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
4860: 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 20 3d 20  int *aPermute = 
4870: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65  0;         /* Pe
4880: 72 6d 75 74 61 74 69 6f 6e 20 6f 66 20 63 6f 6c  rmutation of col
4890: 75 6d 6e 73 20 66 6f 72 20 4f 50 5f 43 6f 6d 70  umns for OP_Comp
48a0: 61 72 65 20 2a 2f 0a 20 20 69 36 34 20 6c 61 73  are */.  i64 las
48b0: 74 52 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61 73  tRowid = db->las
48c0: 74 52 6f 77 69 64 3b 20 20 2f 2a 20 53 61 76 65  tRowid;  /* Save
48d0: 64 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c  d value of the l
48e0: 61 73 74 20 69 6e 73 65 72 74 20 52 4f 57 49 44  ast insert ROWID
48f0: 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f   */.#ifdef VDBE_
4900: 50 52 4f 46 49 4c 45 0a 20 20 75 36 34 20 73 74  PROFILE.  u64 st
4910: 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  art;            
4920: 20 20 20 20 20 2f 2a 20 43 50 55 20 63 6c 6f 63       /* CPU cloc
4930: 6b 20 63 6f 75 6e 74 20 61 74 20 73 74 61 72 74  k count at start
4940: 20 6f 66 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20   of opcode */.  
4950: 69 6e 74 20 6f 72 69 67 50 63 3b 20 20 20 20 20  int origPc;     
4960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
4970: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 61 74  ogram counter at
4980: 20 73 74 61 72 74 20 6f 66 20 6f 70 63 6f 64 65   start of opcode
4990: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 2a   */.#endif.  /**
49a0: 2a 20 49 4e 53 45 52 54 20 53 54 41 43 4b 20 55  * INSERT STACK U
49b0: 4e 49 4f 4e 20 48 45 52 45 20 2a 2a 2a 2f 0a 0a  NION HERE ***/..
49c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
49d0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
49e0: 55 4e 20 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65  UN );  /* sqlite
49f0: 33 5f 73 74 65 70 28 29 20 76 65 72 69 66 69 65  3_step() verifie
4a00: 73 20 74 68 69 73 20 2a 2f 0a 20 20 73 71 6c 69  s this */.  sqli
4a10: 74 65 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b  te3VdbeEnter(p);
4a20: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
4a30: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
4a40: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
4a50: 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  s if a malloc() 
4a60: 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f  inside a call to
4a70: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
4a80: 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a  text() or.    **
4a90: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
4aa0: 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e  text16() failed.
4ab0: 20 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 6e 6f    */.    goto no
4ac0: 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _mem;.  }.  asse
4ad0: 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
4ae0: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
4af0: 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20  QLITE_BUSY );.  
4b00: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
4b10: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  K;.  assert( p->
4b20: 65 78 70 6c 61 69 6e 3d 3d 30 20 29 3b 0a 20 20  explain==0 );.  
4b30: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
4b40: 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  0;.  db->busyHan
4b50: 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a  dler.nBusy = 0;.
4b60: 20 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45    CHECK_FOR_INTE
4b70: 52 52 55 50 54 3b 0a 20 20 73 71 6c 69 74 65 33  RRUPT;.  sqlite3
4b80: 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 70  VdbeIOTraceSql(p
4b90: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
4ba0: 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f  E_OMIT_PROGRESS_
4bb0: 43 41 4c 4c 42 41 43 4b 0a 20 20 63 68 65 63 6b  CALLBACK.  check
4bc0: 50 72 6f 67 72 65 73 73 20 3d 20 64 62 2d 3e 78  Progress = db->x
4bd0: 50 72 6f 67 72 65 73 73 21 3d 30 3b 0a 23 65 6e  Progress!=0;.#en
4be0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
4bf0: 45 5f 44 45 42 55 47 0a 20 20 73 71 6c 69 74 65  E_DEBUG.  sqlite
4c00: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
4c10: 6f 63 28 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  oc();.  if( p->p
4c20: 63 3d 3d 30 20 20 26 26 20 28 70 2d 3e 64 62 2d  c==0  && (p->db-
4c30: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
4c40: 56 64 62 65 4c 69 73 74 69 6e 67 29 21 3d 30 20  VdbeListing)!=0 
4c50: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
4c60: 20 20 70 72 69 6e 74 66 28 22 56 44 42 45 20 50    printf("VDBE P
4c70: 72 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67 3a 5c  rogram Listing:\
4c80: 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
4c90: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 70 29 3b  VdbePrintSql(p);
4ca0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4cb0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
4cc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
4cd0: 72 69 6e 74 4f 70 28 73 74 64 6f 75 74 2c 20 69  rintOp(stdout, i
4ce0: 2c 20 26 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  , &aOp[i]);.    
4cf0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  }.  }.  sqlite3E
4d00: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
4d10: 3b 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 70  ;.#endif.  for(p
4d20: 63 3d 70 2d 3e 70 63 3b 20 72 63 3d 3d 53 51 4c  c=p->pc; rc==SQL
4d30: 49 54 45 5f 4f 4b 3b 20 70 63 2b 2b 29 7b 0a 20  ITE_OK; pc++){. 
4d40: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 30     assert( pc>=0
4d50: 20 26 26 20 70 63 3c 70 2d 3e 6e 4f 70 20 29 3b   && pc<p->nOp );
4d60: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
4d70: 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
4d80: 20 6e 6f 5f 6d 65 6d 3b 0a 23 69 66 64 65 66 20   no_mem;.#ifdef 
4d90: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 20  VDBE_PROFILE.   
4da0: 20 6f 72 69 67 50 63 20 3d 20 70 63 3b 0a 20 20   origPc = pc;.  
4db0: 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65    start = sqlite
4dc0: 33 48 77 74 69 6d 65 28 29 3b 0a 23 65 6e 64 69  3Hwtime();.#endi
4dd0: 66 0a 20 20 20 20 70 4f 70 20 3d 20 26 61 4f 70  f.    pOp = &aOp
4de0: 5b 70 63 5d 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e  [pc];..    /* On
4df0: 6c 79 20 61 6c 6c 6f 77 20 74 72 61 63 69 6e 67  ly allow tracing
4e00: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
4e10: 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20 20   is defined..   
4e20: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
4e30: 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20  E_DEBUG.    if( 
4e40: 70 2d 3e 74 72 61 63 65 20 29 7b 0a 20 20 20 20  p->trace ){.    
4e50: 20 20 69 66 28 20 70 63 3d 3d 30 20 29 7b 0a 20    if( pc==0 ){. 
4e60: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 56         printf("V
4e70: 44 42 45 20 45 78 65 63 75 74 69 6f 6e 20 54 72  DBE Execution Tr
4e80: 61 63 65 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ace:\n");.      
4e90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
4ea0: 6e 74 53 71 6c 28 70 29 3b 0a 20 20 20 20 20 20  ntSql(p);.      
4eb0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
4ec0: 64 62 65 50 72 69 6e 74 4f 70 28 70 2d 3e 74 72  dbePrintOp(p->tr
4ed0: 61 63 65 2c 20 70 63 2c 20 70 4f 70 29 3b 0a 20  ace, pc, pOp);. 
4ee0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
4ef0: 20 20 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b    ..    /* Check
4f00: 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
4f10: 65 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  ed to simulate a
4f20: 6e 20 69 6e 74 65 72 72 75 70 74 2e 20 20 54 68  n interrupt.  Th
4f30: 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 0a  is only happens.
4f40: 20 20 20 20 2a 2a 20 69 66 20 77 65 20 68 61 76      ** if we hav
4f50: 65 20 61 20 73 70 65 63 69 61 6c 20 74 65 73 74  e a special test
4f60: 20 62 75 69 6c 64 2e 0a 20 20 20 20 2a 2f 0a 23   build..    */.#
4f70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
4f80: 54 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  T.    if( sqlite
4f90: 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e  3_interrupt_coun
4fa0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  t>0 ){.      sql
4fb0: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63  ite3_interrupt_c
4fc0: 6f 75 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 69 66  ount--;.      if
4fd0: 28 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  ( sqlite3_interr
4fe0: 75 70 74 5f 63 6f 75 6e 74 3d 3d 30 20 29 7b 0a  upt_count==0 ){.
4ff0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5000: 69 6e 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20  interrupt(db);. 
5010: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
5020: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
5030: 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
5040: 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 2f  S_CALLBACK.    /
5050: 2a 20 43 61 6c 6c 20 74 68 65 20 70 72 6f 67 72  * Call the progr
5060: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  ess callback if 
5070: 69 74 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  it is configured
5080: 20 61 6e 64 20 74 68 65 20 72 65 71 75 69 72 65   and the require
5090: 64 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2a 20  d number.    ** 
50a0: 6f 66 20 56 44 42 45 20 6f 70 73 20 68 61 76 65  of VDBE ops have
50b0: 20 62 65 65 6e 20 65 78 65 63 75 74 65 64 20 28   been executed (
50c0: 65 69 74 68 65 72 20 73 69 6e 63 65 20 74 68 69  either since thi
50d0: 73 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 0a  s invocation of.
50e0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64      ** sqlite3Vd
50f0: 62 65 45 78 65 63 28 29 20 6f 72 20 73 69 6e 63  beExec() or sinc
5100: 65 20 6c 61 73 74 20 74 69 6d 65 20 74 68 65 20  e last time the 
5110: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
5120: 6b 20 77 61 73 20 63 61 6c 6c 65 64 29 2e 0a 20  k was called).. 
5130: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 70 72 6f     ** If the pro
5140: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 72  gress callback r
5150: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
5160: 20 65 78 69 74 20 74 68 65 20 76 69 72 74 75 61   exit the virtua
5170: 6c 20 6d 61 63 68 69 6e 65 20 77 69 74 68 0a 20  l machine with. 
5180: 20 20 20 2a 2a 20 61 20 72 65 74 75 72 6e 20 63     ** a return c
5190: 6f 64 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ode SQLITE_ABORT
51a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
51b0: 20 63 68 65 63 6b 50 72 6f 67 72 65 73 73 20 29   checkProgress )
51c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
51d0: 6e 50 72 6f 67 72 65 73 73 4f 70 73 3d 3d 6e 50  nProgressOps==nP
51e0: 72 6f 67 72 65 73 73 4f 70 73 20 29 7b 0a 20 20  rogressOps ){.  
51f0: 20 20 20 20 20 20 69 6e 74 20 70 72 63 3b 0a 20        int prc;. 
5200: 20 20 20 20 20 20 20 70 72 63 20 3d 20 64 62 2d         prc = db-
5210: 3e 78 50 72 6f 67 72 65 73 73 28 64 62 2d 3e 70  >xProgress(db->p
5220: 50 72 6f 67 72 65 73 73 41 72 67 29 3b 0a 20 20  ProgressArg);.  
5230: 20 20 20 20 20 20 69 66 28 20 70 72 63 21 3d 30        if( prc!=0
5240: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
5250: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
5260: 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  UPT;.          g
5270: 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68  oto vdbe_error_h
5280: 61 6c 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  alt;.        }. 
5290: 20 20 20 20 20 20 20 6e 50 72 6f 67 72 65 73 73         nProgress
52a0: 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Ops = 0;.      }
52b0: 0a 20 20 20 20 20 20 6e 50 72 6f 67 72 65 73 73  .      nProgress
52c0: 4f 70 73 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e  Ops++;.    }.#en
52d0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 4f 6e 20 61  dif..    /* On a
52e0: 6e 79 20 6f 70 63 6f 64 65 20 77 69 74 68 20 74  ny opcode with t
52f0: 68 65 20 22 6f 75 74 32 2d 70 72 65 72 65 6c 61  he "out2-prerela
5300: 73 65 22 20 74 61 67 2c 20 66 72 65 65 20 61 6e  se" tag, free an
5310: 79 0a 20 20 20 20 2a 2a 20 65 78 74 65 72 6e 61  y.    ** externa
5320: 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 75  l allocations ou
5330: 74 20 6f 66 20 6d 65 6d 5b 70 32 5d 20 61 6e 64  t of mem[p2] and
5340: 20 73 65 74 20 6d 65 6d 5b 70 32 5d 20 74 6f 20   set mem[p2] to 
5350: 62 65 0a 20 20 20 20 2a 2a 20 61 6e 20 75 6e 64  be.    ** an und
5360: 65 66 69 6e 65 64 20 69 6e 74 65 67 65 72 2e 20  efined integer. 
5370: 20 4f 70 63 6f 64 65 73 20 77 69 6c 6c 20 65 69   Opcodes will ei
5380: 74 68 65 72 20 66 69 6c 6c 20 69 6e 20 74 68 65  ther fill in the
5390: 20 69 6e 74 65 67 65 72 0a 20 20 20 20 2a 2a 20   integer.    ** 
53a0: 76 61 6c 75 65 20 6f 72 20 63 6f 6e 76 65 72 74  value or convert
53b0: 20 6d 65 6d 5b 70 32 5d 20 74 6f 20 61 20 64 69   mem[p2] to a di
53c0: 66 66 65 72 65 6e 74 20 74 79 70 65 2e 0a 20 20  fferent type..  
53d0: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
53e0: 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 3d 3d 73   pOp->opflags==s
53f0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70  qlite3OpcodeProp
5400: 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65  erty[pOp->opcode
5410: 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  ] );.    if( pOp
5420: 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c  ->opflags & OPFL
5430: 47 5f 4f 55 54 32 5f 50 52 45 52 45 4c 45 41 53  G_OUT2_PRERELEAS
5440: 45 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E ){.      asser
5450: 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a  t( pOp->p2>0 );.
5460: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
5470: 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d 20 29  p->p2<=p->nMem )
5480: 3b 0a 20 20 20 20 20 20 70 4f 75 74 20 3d 20 26  ;.      pOut = &
5490: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
54a0: 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43       memAboutToC
54b0: 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a  hange(p, pOut);.
54c0: 20 20 20 20 20 20 56 64 62 65 4d 65 6d 52 65 6c        VdbeMemRel
54d0: 65 61 73 65 28 70 4f 75 74 29 3b 0a 20 20 20 20  ease(pOut);.    
54e0: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
54f0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 7d 0a 0a  MEM_Int;.    }..
5500: 20 20 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68      /* Sanity ch
5510: 65 63 6b 69 6e 67 20 6f 6e 20 6f 74 68 65 72 20  ecking on other 
5520: 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 23 69 66 64  operands */.#ifd
5530: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
5540: 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70      if( (pOp->op
5550: 66 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 49 4e  flags & OPFLG_IN
5560: 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  1)!=0 ){.      a
5570: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30  ssert( pOp->p1>0
5580: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
5590: 28 20 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 4d  ( pOp->p1<=p->nM
55a0: 65 6d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  em );.      asse
55b0: 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26  rt( memIsValid(&
55c0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20 29  aMem[pOp->p1]) )
55d0: 3b 0a 20 20 20 20 20 20 52 45 47 49 53 54 45 52  ;.      REGISTER
55e0: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20  _TRACE(pOp->p1, 
55f0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 3b  &aMem[pOp->p1]);
5600: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
5610: 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f  pOp->opflags & O
5620: 50 46 4c 47 5f 49 4e 32 29 21 3d 30 20 29 7b 0a  PFLG_IN2)!=0 ){.
5630: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
5640: 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20 20  p->p2>0 );.     
5650: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
5660: 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20  <=p->nMem );.   
5670: 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
5680: 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d  Valid(&aMem[pOp-
5690: 3e 70 32 5d 29 20 29 3b 0a 20 20 20 20 20 20 52  >p2]) );.      R
56a0: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
56b0: 70 2d 3e 70 32 2c 20 26 61 4d 65 6d 5b 70 4f 70  p->p2, &aMem[pOp
56c0: 2d 3e 70 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ->p2]);.    }.  
56d0: 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c    if( (pOp->opfl
56e0: 61 67 73 20 26 20 4f 50 46 4c 47 5f 49 4e 33 29  ags & OPFLG_IN3)
56f0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
5700: 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29  ert( pOp->p3>0 )
5710: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
5720: 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p3<=p->nMem
5730: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
5740: 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d  ( memIsValid(&aM
5750: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a  em[pOp->p3]) );.
5760: 20 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54        REGISTER_T
5770: 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 26 61  RACE(pOp->p3, &a
5780: 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20  Mem[pOp->p3]);. 
5790: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 4f     }.    if( (pO
57a0: 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46  p->opflags & OPF
57b0: 4c 47 5f 4f 55 54 32 29 21 3d 30 20 29 7b 0a 20  LG_OUT2)!=0 ){. 
57c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
57d0: 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20 20 20  ->p2>0 );.      
57e0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c  assert( pOp->p2<
57f0: 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20  =p->nMem );.    
5800: 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
5810: 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d  ge(p, &aMem[pOp-
5820: 3e 70 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >p2]);.    }.   
5830: 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61   if( (pOp->opfla
5840: 67 73 20 26 20 4f 50 46 4c 47 5f 4f 55 54 33 29  gs & OPFLG_OUT3)
5850: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
5860: 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29  ert( pOp->p3>0 )
5870: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
5880: 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p3<=p->nMem
5890: 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62 6f   );.      memAbo
58a0: 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 26 61  utToChange(p, &a
58b0: 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20  Mem[pOp->p3]);. 
58c0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20     }.#endif.  . 
58d0: 20 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e     switch( pOp->
58e0: 6f 70 63 6f 64 65 20 29 7b 0a 0a 2f 2a 2a 2a 2a  opcode ){../****
58f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 57 68 61  *********.** Wha
5940: 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 61 20 6d  t follows is a m
5950: 61 73 73 69 76 65 20 73 77 69 74 63 68 20 73 74  assive switch st
5960: 61 74 65 6d 65 6e 74 20 77 68 65 72 65 20 65 61  atement where ea
5970: 63 68 20 63 61 73 65 20 69 6d 70 6c 65 6d 65 6e  ch case implemen
5980: 74 73 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65  ts a.** separate
5990: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20   instruction in 
59a0: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
59b0: 69 6e 65 2e 20 20 49 66 20 77 65 20 66 6f 6c 6c  ine.  If we foll
59c0: 6f 77 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  ow the usual.** 
59d0: 69 6e 64 65 6e 74 61 74 69 6f 6e 20 63 6f 6e 76  indentation conv
59e0: 65 6e 74 69 6f 6e 73 2c 20 65 61 63 68 20 63 61  entions, each ca
59f0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 64  se should be ind
5a00: 65 6e 74 65 64 20 62 79 20 36 20 73 70 61 63 65  ented by 6 space
5a10: 73 2e 20 20 42 75 74 0a 2a 2a 20 74 68 61 74 20  s.  But.** that 
5a20: 69 73 20 61 20 6c 6f 74 20 6f 66 20 77 61 73 74  is a lot of wast
5a30: 65 64 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ed space on the 
5a40: 6c 65 66 74 20 6d 61 72 67 69 6e 2e 20 20 53 6f  left margin.  So
5a50: 20 74 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   the code within
5a60: 0a 2a 2a 20 74 68 65 20 73 77 69 74 63 68 20 73  .** the switch s
5a70: 74 61 74 65 6d 65 6e 74 20 77 69 6c 6c 20 62 72  tatement will br
5a80: 65 61 6b 20 77 69 74 68 20 63 6f 6e 76 65 6e 74  eak with convent
5a90: 69 6f 6e 20 61 6e 64 20 62 65 20 66 6c 75 73 68  ion and be flush
5aa0: 2d 6c 65 66 74 2e 20 41 6e 6f 74 68 65 72 0a 2a  -left. Another.*
5ab0: 2a 20 62 69 67 20 63 6f 6d 6d 65 6e 74 20 28 73  * big comment (s
5ac0: 69 6d 69 6c 61 72 20 74 6f 20 74 68 69 73 20 6f  imilar to this o
5ad0: 6e 65 29 20 77 69 6c 6c 20 6d 61 72 6b 20 74 68  ne) will mark th
5ae0: 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63  e point in the c
5af0: 6f 64 65 20 77 68 65 72 65 0a 2a 2a 20 77 65 20  ode where.** we 
5b00: 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b 20  transition back 
5b10: 74 6f 20 6e 6f 72 6d 61 6c 20 69 6e 64 65 6e 74  to normal indent
5b20: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
5b30: 20 66 6f 72 6d 61 74 74 69 6e 67 20 6f 66 20 65   formatting of e
5b40: 61 63 68 20 63 61 73 65 20 69 73 20 69 6d 70 6f  ach case is impo
5b50: 72 74 61 6e 74 2e 20 20 54 68 65 20 6d 61 6b 65  rtant.  The make
5b60: 66 69 6c 65 20 66 6f 72 20 53 51 4c 69 74 65 0a  file for SQLite.
5b70: 2a 2a 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f  ** generates two
5b80: 20 43 20 66 69 6c 65 73 20 22 6f 70 63 6f 64 65   C files "opcode
5b90: 73 2e 68 22 20 61 6e 64 20 22 6f 70 63 6f 64 65  s.h" and "opcode
5ba0: 73 2e 63 22 20 62 79 20 73 63 61 6e 6e 69 6e 67  s.c" by scanning
5bb0: 20 74 68 69 73 0a 2a 2a 20 66 69 6c 65 20 6c 6f   this.** file lo
5bc0: 6f 6b 69 6e 67 20 66 6f 72 20 6c 69 6e 65 73 20  oking for lines 
5bd0: 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
5be0: 22 63 61 73 65 20 4f 50 5f 22 2e 20 20 54 68 65  "case OP_".  The
5bf0: 20 6f 70 63 6f 64 65 73 2e 68 20 66 69 6c 65 73   opcodes.h files
5c00: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 66 69 6c 6c  .** will be fill
5c10: 65 64 20 77 69 74 68 20 23 64 65 66 69 6e 65 73  ed with #defines
5c20: 20 74 68 61 74 20 67 69 76 65 20 75 6e 69 71 75   that give uniqu
5c30: 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  e integer values
5c40: 20 74 6f 20 65 61 63 68 0a 2a 2a 20 6f 70 63 6f   to each.** opco
5c50: 64 65 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64  de and the opcod
5c60: 65 73 2e 63 20 66 69 6c 65 20 69 73 20 66 69 6c  es.c file is fil
5c70: 6c 65 64 20 77 69 74 68 20 61 6e 20 61 72 72 61  led with an arra
5c80: 79 20 6f 66 20 73 74 72 69 6e 67 73 20 77 68 65  y of strings whe
5c90: 72 65 0a 2a 2a 20 65 61 63 68 20 73 74 72 69 6e  re.** each strin
5ca0: 67 20 69 73 20 74 68 65 20 73 79 6d 62 6f 6c 69  g is the symboli
5cb0: 63 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63  c name for the c
5cc0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6f 70 63  orresponding opc
5cd0: 6f 64 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ode.  If the.** 
5ce0: 63 61 73 65 20 73 74 61 74 65 6d 65 6e 74 20 69  case statement i
5cf0: 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  s followed by a 
5d00: 63 6f 6d 6d 65 6e 74 20 6f 66 20 74 68 65 20 66  comment of the f
5d10: 6f 72 6d 20 22 2f 23 20 73 61 6d 65 20 61 73 20  orm "/# same as 
5d20: 2e 2e 2e 20 23 2f 22 0a 2a 2a 20 74 68 61 74 20  ... #/".** that 
5d30: 63 6f 6d 6d 65 6e 74 20 69 73 20 75 73 65 64 20  comment is used 
5d40: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
5d50: 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75   particular valu
5d60: 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2e  e of the opcode.
5d70: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 20 6b 65 79  .**.** Other key
5d80: 77 6f 72 64 73 20 69 6e 20 74 68 65 20 63 6f 6d  words in the com
5d90: 6d 65 6e 74 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ment that follow
5da0: 73 20 65 61 63 68 20 63 61 73 65 20 61 72 65 20  s each case are 
5db0: 75 73 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e 73 74  used to.** const
5dc0: 72 75 63 74 20 74 68 65 20 4f 50 46 4c 47 5f 49  ruct the OPFLG_I
5dd0: 4e 49 54 49 41 4c 49 5a 45 52 20 76 61 6c 75 65  NITIALIZER value
5de0: 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65   that initialize
5df0: 73 20 6f 70 63 6f 64 65 50 72 6f 70 65 72 74 79  s opcodeProperty
5e00: 5b 5d 2e 0a 2a 2a 20 4b 65 79 77 6f 72 64 73 20  []..** Keywords 
5e10: 69 6e 63 6c 75 64 65 3a 20 69 6e 31 2c 20 69 6e  include: in1, in
5e20: 32 2c 20 69 6e 33 2c 20 6f 75 74 32 5f 70 72 65  2, in3, out2_pre
5e30: 72 65 6c 65 61 73 65 2c 20 6f 75 74 32 2c 20 6f  release, out2, o
5e40: 75 74 33 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65  ut3.  See.** the
5e50: 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73   mkopcodeh.awk s
5e60: 63 72 69 70 74 20 66 6f 72 20 61 64 64 69 74 69  cript for additi
5e70: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
5e80: 2e 0a 2a 2a 0a 2a 2a 20 44 6f 63 75 6d 65 6e 74  ..**.** Document
5e90: 61 74 69 6f 6e 20 61 62 6f 75 74 20 56 44 42 45  ation about VDBE
5ea0: 20 6f 70 63 6f 64 65 73 20 69 73 20 67 65 6e 65   opcodes is gene
5eb0: 72 61 74 65 64 20 62 79 20 73 63 61 6e 6e 69 6e  rated by scannin
5ec0: 67 20 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20 66  g this file.** f
5ed0: 6f 72 20 6c 69 6e 65 73 20 6f 66 20 74 68 61 74  or lines of that
5ee0: 20 63 6f 6e 74 61 69 6e 20 22 4f 70 63 6f 64 65   contain "Opcode
5ef0: 3a 22 2e 20 20 54 68 61 74 20 6c 69 6e 65 20 61  :".  That line a
5f00: 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  nd all subsequen
5f10: 74 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 6c 69 6e  t.** comment lin
5f20: 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74  es are used in t
5f30: 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66  he generation of
5f40: 20 74 68 65 20 6f 70 63 6f 64 65 2e 68 74 6d 6c   the opcode.html
5f50: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 0a 2a   documentation.*
5f60: 2a 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 55  * file..**.** SU
5f70: 4d 4d 41 52 59 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  MMARY:.**.**    
5f80: 20 46 6f 72 6d 61 74 74 69 6e 67 20 69 73 20 69   Formatting is i
5f90: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 63 72 69  mportant to scri
5fa0: 70 74 73 20 74 68 61 74 20 73 63 61 6e 20 74 68  pts that scan th
5fb0: 69 73 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20  is file..**     
5fc0: 44 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66  Do not deviate f
5fd0: 72 6f 6d 20 74 68 65 20 66 6f 72 6d 61 74 74 69  rom the formatti
5fe0: 6e 67 20 73 74 79 6c 65 20 63 75 72 72 65 6e 74  ng style current
5ff0: 6c 79 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  ly in use..**.**
6000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
6050: 20 4f 70 63 6f 64 65 3a 20 20 47 6f 74 6f 20 2a   Opcode:  Goto *
6060: 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
6070: 41 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c  An unconditional
6080: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73   jump to address
6090: 20 50 32 2e 0a 2a 2a 20 54 68 65 20 6e 65 78 74   P2..** The next
60a0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 78 65   instruction exe
60b0: 63 75 74 65 64 20 77 69 6c 6c 20 62 65 20 0a 2a  cuted will be .*
60c0: 2a 20 74 68 65 20 6f 6e 65 20 61 74 20 69 6e 64  * the one at ind
60d0: 65 78 20 50 32 20 66 72 6f 6d 20 74 68 65 20 62  ex P2 from the b
60e0: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74  eginning of.** t
60f0: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 63  he program..*/.c
6100: 61 73 65 20 4f 50 5f 47 6f 74 6f 3a 20 7b 20 20  ase OP_Goto: {  
6110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75             /* ju
6120: 6d 70 20 2a 2f 0a 20 20 43 48 45 43 4b 5f 46 4f  mp */.  CHECK_FO
6130: 52 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 70  R_INTERRUPT;.  p
6140: 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
6150: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
6160: 4f 70 63 6f 64 65 3a 20 20 47 6f 73 75 62 20 50  Opcode:  Gosub P
6170: 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
6180: 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
6190: 6e 74 20 61 64 64 72 65 73 73 20 6f 6e 74 6f 20  nt address onto 
61a0: 72 65 67 69 73 74 65 72 20 50 31 0a 2a 2a 20 61  register P1.** a
61b0: 6e 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  nd then jump to 
61c0: 61 64 64 72 65 73 73 20 50 32 2e 0a 2a 2f 0a 63  address P2..*/.c
61d0: 61 73 65 20 4f 50 5f 47 6f 73 75 62 3a 20 7b 20  ase OP_Gosub: { 
61e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75             /* ju
61f0: 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  mp */.  assert( 
6200: 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70  pOp->p1>0 && pOp
6210: 2d 3e 70 31 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b  ->p1<=p->nMem );
6220: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
6230: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
6240: 72 74 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  rt( (pIn1->flags
6250: 20 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d 30 20 29   & MEM_Dyn)==0 )
6260: 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68  ;.  memAboutToCh
6270: 61 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20  ange(p, pIn1);. 
6280: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d   pIn1->flags = M
6290: 45 4d 5f 49 6e 74 3b 0a 20 20 70 49 6e 31 2d 3e  EM_Int;.  pIn1->
62a0: 75 2e 69 20 3d 20 70 63 3b 0a 20 20 52 45 47 49  u.i = pc;.  REGI
62b0: 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
62c0: 70 31 2c 20 70 49 6e 31 29 3b 0a 20 20 70 63 20  p1, pIn1);.  pc 
62d0: 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
62e0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
62f0: 63 6f 64 65 3a 20 20 52 65 74 75 72 6e 20 50 31  code:  Return P1
6300: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a   * * * *.**.** J
6310: 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ump to the next 
6320: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 66 74 65  instruction afte
6330: 72 20 74 68 65 20 61 64 64 72 65 73 73 20 69 6e  r the address in
6340: 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2f   register P1..*/
6350: 0a 63 61 73 65 20 4f 50 5f 52 65 74 75 72 6e 3a  .case OP_Return:
6360: 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {           /* 
6370: 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  in1 */.  pIn1 = 
6380: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
6390: 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e    assert( pIn1->
63a0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
63b0: 29 3b 0a 20 20 70 63 20 3d 20 28 69 6e 74 29 70  );.  pc = (int)p
63c0: 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 62 72 65 61  In1->u.i;.  brea
63d0: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
63e0: 20 20 59 69 65 6c 64 20 50 31 20 2a 20 2a 20 2a    Yield P1 * * *
63f0: 20 2a 0a 2a 2a 0a 2a 2a 20 53 77 61 70 20 74 68   *.**.** Swap th
6400: 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  e program counte
6410: 72 20 77 69 74 68 20 74 68 65 20 76 61 6c 75 65  r with the value
6420: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
6430: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 59 69 65 6c  .*/.case OP_Yiel
6440: 64 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  d: {            
6450: 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 69 6e 74 20  /* in1 */.  int 
6460: 70 63 44 65 73 74 3b 0a 20 20 70 49 6e 31 20 3d  pcDest;.  pIn1 =
6470: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
6480: 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 31  .  assert( (pIn1
6490: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79  ->flags & MEM_Dy
64a0: 6e 29 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31 2d  n)==0 );.  pIn1-
64b0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
64c0: 3b 0a 20 20 70 63 44 65 73 74 20 3d 20 28 69 6e  ;.  pcDest = (in
64d0: 74 29 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 70  t)pIn1->u.i;.  p
64e0: 49 6e 31 2d 3e 75 2e 69 20 3d 20 70 63 3b 0a 20  In1->u.i = pc;. 
64f0: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
6500: 70 4f 70 2d 3e 70 31 2c 20 70 49 6e 31 29 3b 0a  pOp->p1, pIn1);.
6510: 20 20 70 63 20 3d 20 70 63 44 65 73 74 3b 0a 20    pc = pcDest;. 
6520: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
6530: 63 6f 64 65 3a 20 20 48 61 6c 74 49 66 4e 75 6c  code:  HaltIfNul
6540: 6c 20 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  l  P1 P2 P3 P4 *
6550: 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65  .**.** Check the
6560: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
6570: 65 72 20 50 33 2e 20 20 49 66 20 69 74 20 69 73  er P3.  If it is
6580: 20 4e 55 4c 4c 20 74 68 65 6e 20 48 61 6c 74 20   NULL then Halt 
6590: 75 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74  using.** paramet
65a0: 65 72 20 50 31 2c 20 50 32 2c 20 61 6e 64 20 50  er P1, P2, and P
65b0: 34 20 61 73 20 69 66 20 74 68 69 73 20 77 65 72  4 as if this wer
65c0: 65 20 61 20 48 61 6c 74 20 69 6e 73 74 72 75 63  e a Halt instruc
65d0: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 0a 2a 2a  tion.  If the.**
65e0: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
65f0: 65 72 20 50 33 20 69 73 20 6e 6f 74 20 4e 55 4c  er P3 is not NUL
6600: 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  L, then this rou
6610: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
6620: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 48 61 6c 74  .*/.case OP_Halt
6630: 49 66 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 2f  IfNull: {      /
6640: 2a 20 69 6e 33 20 2a 2f 0a 20 20 70 49 6e 33 20  * in3 */.  pIn3 
6650: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
6660: 3b 0a 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66  ;.  if( (pIn3->f
6670: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
6680: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 2f  ==0 ) break;.  /
6690: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  * Fall through i
66a0: 6e 74 6f 20 4f 50 5f 48 61 6c 74 20 2a 2f 0a 7d  nto OP_Halt */.}
66b0: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 48 61  ../* Opcode:  Ha
66c0: 6c 74 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a  lt P1 P2 * P4 *.
66d0: 2a 2a 0a 2a 2a 20 45 78 69 74 20 69 6d 6d 65 64  **.** Exit immed
66e0: 69 61 74 65 6c 79 2e 20 20 41 6c 6c 20 6f 70 65  iately.  All ope
66f0: 6e 20 63 75 72 73 6f 72 73 2c 20 65 74 63 20 61  n cursors, etc a
6700: 72 65 20 63 6c 6f 73 65 64 0a 2a 2a 20 61 75 74  re closed.** aut
6710: 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2a 0a 2a  omatically..**.*
6720: 2a 20 50 31 20 69 73 20 74 68 65 20 72 65 73 75  * P1 is the resu
6730: 6c 74 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  lt code returned
6740: 20 62 79 20 73 71 6c 69 74 65 33 5f 65 78 65 63   by sqlite3_exec
6750: 28 29 2c 20 73 71 6c 69 74 65 33 5f 72 65 73 65  (), sqlite3_rese
6760: 74 28 29 2c 0a 2a 2a 20 6f 72 20 73 71 6c 69 74  t(),.** or sqlit
6770: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 2e 20 20  e3_finalize().  
6780: 46 6f 72 20 61 20 6e 6f 72 6d 61 6c 20 68 61 6c  For a normal hal
6790: 74 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 62  t, this should b
67a0: 65 20 53 51 4c 49 54 45 5f 4f 4b 20 28 30 29 2e  e SQLITE_OK (0).
67b0: 0a 2a 2a 20 46 6f 72 20 65 72 72 6f 72 73 2c 20  .** For errors, 
67c0: 69 74 20 63 61 6e 20 62 65 20 73 6f 6d 65 20 6f  it can be some o
67d0: 74 68 65 72 20 76 61 6c 75 65 2e 20 20 49 66 20  ther value.  If 
67e0: 50 31 21 3d 30 20 74 68 65 6e 20 50 32 20 77 69  P1!=0 then P2 wi
67f0: 6c 6c 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  ll determine.** 
6800: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
6810: 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 63  o rollback the c
6820: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
6830: 6f 6e 2e 20 20 44 6f 20 6e 6f 74 20 72 6f 6c 6c  on.  Do not roll
6840: 62 61 63 6b 0a 2a 2a 20 69 66 20 50 32 3d 3d 4f  back.** if P2==O
6850: 45 5f 46 61 69 6c 2e 20 44 6f 20 74 68 65 20 72  E_Fail. Do the r
6860: 6f 6c 6c 62 61 63 6b 20 69 66 20 50 32 3d 3d 4f  ollback if P2==O
6870: 45 5f 52 6f 6c 6c 62 61 63 6b 2e 20 20 49 66 20  E_Rollback.  If 
6880: 50 32 3d 3d 4f 45 5f 41 62 6f 72 74 2c 0a 2a 2a  P2==OE_Abort,.**
6890: 20 74 68 65 6e 20 62 61 63 6b 20 6f 75 74 20 61   then back out a
68a0: 6c 6c 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ll changes that 
68b0: 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 64 75  have occurred du
68c0: 72 69 6e 67 20 74 68 69 73 20 65 78 65 63 75 74  ring this execut
68d0: 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44  ion of the.** VD
68e0: 42 45 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 72  BE, but do not r
68f0: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
6900: 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  saction. .**.** 
6910: 49 66 20 50 34 20 69 73 20 6e 6f 74 20 6e 75 6c  If P4 is not nul
6920: 6c 20 74 68 65 6e 20 69 74 20 69 73 20 61 6e 20  l then it is an 
6930: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
6940: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ring..**.** Ther
6950: 65 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64 20  e is an implied 
6960: 22 48 61 6c 74 20 30 20 30 20 30 22 20 69 6e 73  "Halt 0 0 0" ins
6970: 74 72 75 63 74 69 6f 6e 20 69 6e 73 65 72 74 65  truction inserte
6980: 64 20 61 74 20 74 68 65 20 76 65 72 79 20 65 6e  d at the very en
6990: 64 20 6f 66 0a 2a 2a 20 65 76 65 72 79 20 70 72  d of.** every pr
69a0: 6f 67 72 61 6d 2e 20 20 53 6f 20 61 20 6a 75 6d  ogram.  So a jum
69b0: 70 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  p past the last 
69c0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74  instruction of t
69d0: 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 69 73  he program.** is
69e0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 65 78 65   the same as exe
69f0: 63 75 74 69 6e 67 20 48 61 6c 74 2e 0a 2a 2f 0a  cuting Halt..*/.
6a00: 63 61 73 65 20 4f 50 5f 48 61 6c 74 3a 20 7b 0a  case OP_Halt: {.
6a10: 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 53    if( pOp->p1==S
6a20: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70  QLITE_OK && p->p
6a30: 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Frame ){.    /* 
6a40: 48 61 6c 74 20 74 68 65 20 73 75 62 2d 70 72 6f  Halt the sub-pro
6a50: 67 72 61 6d 2e 20 52 65 74 75 72 6e 20 63 6f 6e  gram. Return con
6a60: 74 72 6f 6c 20 74 6f 20 74 68 65 20 70 61 72 65  trol to the pare
6a70: 6e 74 20 66 72 61 6d 65 2e 20 2a 2f 0a 20 20 20  nt frame. */.   
6a80: 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61   VdbeFrame *pFra
6a90: 6d 65 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a  me = p->pFrame;.
6aa0: 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20      p->pFrame = 
6ab0: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b  pFrame->pParent;
6ac0: 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 2d 2d  .    p->nFrame--
6ad0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6ae0: 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
6af0: 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
6b00: 20 70 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   pc = sqlite3Vdb
6b10: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46  eFrameRestore(pF
6b20: 72 61 6d 65 29 3b 0a 20 20 20 20 6c 61 73 74 52  rame);.    lastR
6b30: 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61 73 74 52  owid = db->lastR
6b40: 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20 70 4f  owid;.    if( pO
6b50: 70 2d 3e 70 32 3d 3d 4f 45 5f 49 67 6e 6f 72 65  p->p2==OE_Ignore
6b60: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 73   ){.      /* Ins
6b70: 74 72 75 63 74 69 6f 6e 20 70 63 20 69 73 20 74  truction pc is t
6b80: 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 74 68  he OP_Program th
6b90: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 65 20 73  at invoked the s
6ba0: 75 62 2d 70 72 6f 67 72 61 6d 20 0a 20 20 20 20  ub-program .    
6bb0: 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62    ** currently b
6bc0: 65 69 6e 67 20 68 61 6c 74 65 64 2e 20 49 66 20  eing halted. If 
6bd0: 74 68 65 20 70 32 20 69 6e 73 74 72 75 63 74 69  the p2 instructi
6be0: 6f 6e 20 6f 66 20 74 68 69 73 20 4f 50 5f 48 61  on of this OP_Ha
6bf0: 6c 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73 74  lt.      ** inst
6c00: 72 75 63 74 69 6f 6e 20 69 73 20 73 65 74 20 74  ruction is set t
6c10: 6f 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 74 68 65  o OE_Ignore, the
6c20: 6e 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61  n the sub-progra
6c30: 6d 20 69 73 20 74 68 72 6f 77 69 6e 67 0a 20 20  m is throwing.  
6c40: 20 20 20 20 2a 2a 20 61 6e 20 49 47 4e 4f 52 45      ** an IGNORE
6c50: 20 65 78 63 65 70 74 69 6f 6e 2e 20 49 6e 20 74   exception. In t
6c60: 68 69 73 20 63 61 73 65 20 6a 75 6d 70 20 74 6f  his case jump to
6c70: 20 74 68 65 20 61 64 64 72 65 73 73 20 73 70 65   the address spe
6c80: 63 69 66 69 65 64 0a 20 20 20 20 20 20 2a 2a 20  cified.      ** 
6c90: 61 73 20 74 68 65 20 70 32 20 6f 66 20 74 68 65  as the p2 of the
6ca0: 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50 72 6f 67   calling OP_Prog
6cb0: 72 61 6d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70  ram.  */.      p
6cc0: 63 20 3d 20 70 2d 3e 61 4f 70 5b 70 63 5d 2e 70  c = p->aOp[pc].p
6cd0: 32 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  2-1;.    }.    a
6ce0: 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20  Op = p->aOp;.   
6cf0: 20 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b   aMem = p->aMem;
6d00: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6d10: 0a 20 20 70 2d 3e 72 63 20 3d 20 70 4f 70 2d 3e  .  p->rc = pOp->
6d20: 70 31 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63  p1;.  p->errorAc
6d30: 74 69 6f 6e 20 3d 20 28 75 38 29 70 4f 70 2d 3e  tion = (u8)pOp->
6d40: 70 32 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 70 63  p2;.  p->pc = pc
6d50: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 2e  ;.  if( pOp->p4.
6d60: 7a 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  z ){.    assert(
6d70: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
6d80: 4b 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  K );.    sqlite3
6d90: 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
6da0: 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c  rrMsg, db, "%s",
6db0: 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20   pOp->p4.z);.   
6dc0: 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
6dd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
6de0: 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 20 20 73 71  Log!=0 );.    sq
6df0: 6c 69 74 65 33 5f 6c 6f 67 28 70 4f 70 2d 3e 70  lite3_log(pOp->p
6e00: 31 2c 20 22 61 62 6f 72 74 20 61 74 20 25 64 20  1, "abort at %d 
6e10: 69 6e 20 5b 25 73 5d 3a 20 25 73 22 2c 20 70 63  in [%s]: %s", pc
6e20: 2c 20 70 2d 3e 7a 53 71 6c 2c 20 70 4f 70 2d 3e  , p->zSql, pOp->
6e30: 70 34 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65 20 69  p4.z);.  }else i
6e40: 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20  f( p->rc ){.    
6e50: 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
6e60: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
6e70: 6f 67 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  og!=0 );.    sql
6e80: 69 74 65 33 5f 6c 6f 67 28 70 4f 70 2d 3e 70 31  ite3_log(pOp->p1
6e90: 2c 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  , "constraint fa
6ea0: 69 6c 65 64 20 61 74 20 25 64 20 69 6e 20 5b 25  iled at %d in [%
6eb0: 73 5d 22 2c 20 70 63 2c 20 70 2d 3e 7a 53 71 6c  s]", pc, p->zSql
6ec0: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
6ed0: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
6ee0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
6ef0: 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 72  SQLITE_BUSY || r
6f00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
6f10: 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
6f20: 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
6f30: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
6f40: 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53 51   p->rc = rc = SQ
6f50: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  LITE_BUSY;.  }el
6f60: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
6f70: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
6f80: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43   p->rc==SQLITE_C
6f90: 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 20  ONSTRAINT );.   
6fa0: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
6fb0: 49 54 45 5f 4f 4b 20 7c 7c 20 64 62 2d 3e 6e 44  ITE_OK || db->nD
6fc0: 65 66 65 72 72 65 64 43 6f 6e 73 3e 30 20 29 3b  eferredCons>0 );
6fd0: 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 20  .    rc = p->rc 
6fe0: 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a  ? SQLITE_ERROR :
6ff0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
7000: 7d 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65  }.  goto vdbe_re
7010: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  turn;.}../* Opco
7020: 64 65 3a 20 49 6e 74 65 67 65 72 20 50 31 20 50  de: Integer P1 P
7030: 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68  2 * * *.**.** Th
7040: 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  e 32-bit integer
7050: 20 76 61 6c 75 65 20 50 31 20 69 73 20 77 72 69   value P1 is wri
7060: 74 74 65 6e 20 69 6e 74 6f 20 72 65 67 69 73 74  tten into regist
7070: 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f  er P2..*/.case O
7080: 50 5f 49 6e 74 65 67 65 72 3a 20 7b 20 20 20 20  P_Integer: {    
7090: 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65       /* out2-pre
70a0: 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 70 4f 75  release */.  pOu
70b0: 74 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  t->u.i = pOp->p1
70c0: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
70d0: 20 4f 70 63 6f 64 65 3a 20 49 6e 74 36 34 20 2a   Opcode: Int64 *
70e0: 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a   P2 * P4 *.**.**
70f0: 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72   P4 is a pointer
7100: 20 74 6f 20 61 20 36 34 2d 62 69 74 20 69 6e 74   to a 64-bit int
7110: 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2a 20 57  eger value..** W
7120: 72 69 74 65 20 74 68 61 74 20 76 61 6c 75 65 20  rite that value 
7130: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  into register P2
7140: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74  ..*/.case OP_Int
7150: 36 34 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  64: {           
7160: 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61  /* out2-prerelea
7170: 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
7180: 70 4f 70 2d 3e 70 34 2e 70 49 36 34 21 3d 30 20  pOp->p4.pI64!=0 
7190: 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  );.  pOut->u.i =
71a0: 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 3b 0a   *pOp->p4.pI64;.
71b0: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e    break;.}..#ifn
71c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
71d0: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f  FLOATING_POINT./
71e0: 2a 20 4f 70 63 6f 64 65 3a 20 52 65 61 6c 20 2a  * Opcode: Real *
71f0: 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a   P2 * P4 *.**.**
7200: 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72   P4 is a pointer
7210: 20 74 6f 20 61 20 36 34 2d 62 69 74 20 66 6c 6f   to a 64-bit flo
7220: 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
7230: 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 61 74  e..** Write that
7240: 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67 69   value into regi
7250: 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  ster P2..*/.case
7260: 20 4f 50 5f 52 65 61 6c 3a 20 7b 20 20 20 20 20   OP_Real: {     
7270: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
7280: 73 20 54 4b 5f 46 4c 4f 41 54 2c 20 6f 75 74 32  s TK_FLOAT, out2
7290: 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20  -prerelease */. 
72a0: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
72b0: 45 4d 5f 52 65 61 6c 3b 0a 20 20 61 73 73 65 72  EM_Real;.  asser
72c0: 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e  t( !sqlite3IsNaN
72d0: 28 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29  (*pOp->p4.pReal)
72e0: 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 72 20 3d 20   );.  pOut->r = 
72f0: 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 3b 0a  *pOp->p4.pReal;.
7300: 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
7310: 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 74  f../* Opcode: St
7320: 72 69 6e 67 38 20 2a 20 50 32 20 2a 20 50 34 20  ring8 * P2 * P4 
7330: 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74  *.**.** P4 point
7340: 73 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69  s to a nul termi
7350: 6e 61 74 65 64 20 55 54 46 2d 38 20 73 74 72 69  nated UTF-8 stri
7360: 6e 67 2e 20 54 68 69 73 20 6f 70 63 6f 64 65 20  ng. This opcode 
7370: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 0a  is transformed .
7380: 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 53 74  ** into an OP_St
7390: 72 69 6e 67 20 62 65 66 6f 72 65 20 69 74 20 69  ring before it i
73a0: 73 20 65 78 65 63 75 74 65 64 20 66 6f 72 20 74  s executed for t
73b0: 68 65 20 66 69 72 73 74 20 74 69 6d 65 2e 0a 2a  he first time..*
73c0: 2f 0a 63 61 73 65 20 4f 50 5f 53 74 72 69 6e 67  /.case OP_String
73d0: 38 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20  8: {         /* 
73e0: 73 61 6d 65 20 61 73 20 54 4b 5f 53 54 52 49 4e  same as TK_STRIN
73f0: 47 2c 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61  G, out2-prerelea
7400: 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
7410: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a  pOp->p4.z!=0 );.
7420: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
7430: 4f 50 5f 53 74 72 69 6e 67 3b 0a 20 20 70 4f 70  OP_String;.  pOp
7440: 2d 3e 70 31 20 3d 20 73 71 6c 69 74 65 33 53 74  ->p1 = sqlite3St
7450: 72 6c 65 6e 33 30 28 70 4f 70 2d 3e 70 34 2e 7a  rlen30(pOp->p4.z
7460: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
7470: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
7480: 69 66 28 20 65 6e 63 6f 64 69 6e 67 21 3d 53 51  if( encoding!=SQ
7490: 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20  LITE_UTF8 ){.   
74a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
74b0: 65 4d 65 6d 53 65 74 53 74 72 28 70 4f 75 74 2c  eMemSetStr(pOut,
74c0: 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 2d 31 2c 20   pOp->p4.z, -1, 
74d0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
74e0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
74f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7500: 54 4f 4f 42 49 47 20 29 20 67 6f 74 6f 20 74 6f  TOOBIG ) goto to
7510: 6f 5f 62 69 67 3b 0a 20 20 20 20 69 66 28 20 53  o_big;.    if( S
7520: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
7530: 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64  3VdbeChangeEncod
7540: 69 6e 67 28 70 4f 75 74 2c 20 65 6e 63 6f 64 69  ing(pOut, encodi
7550: 6e 67 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ng) ) goto no_me
7560: 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
7570: 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 70 4f  Out->zMalloc==pO
7580: 75 74 2d 3e 7a 20 29 3b 0a 20 20 20 20 61 73 73  ut->z );.    ass
7590: 65 72 74 28 20 70 4f 75 74 2d 3e 66 6c 61 67 73  ert( pOut->flags
75a0: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20   & MEM_Dyn );.  
75b0: 20 20 70 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 20    pOut->zMalloc 
75c0: 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66  = 0;.    pOut->f
75d0: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 53 74 61 74  lags |= MEM_Stat
75e0: 69 63 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c  ic;.    pOut->fl
75f0: 61 67 73 20 26 3d 20 7e 4d 45 4d 5f 44 79 6e 3b  ags &= ~MEM_Dyn;
7600: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34  .    if( pOp->p4
7610: 74 79 70 65 3d 3d 50 34 5f 44 59 4e 41 4d 49 43  type==P4_DYNAMIC
7620: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7630: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d  3DbFree(db, pOp-
7640: 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  >p4.z);.    }.  
7650: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
7660: 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 20 20  P4_DYNAMIC;.    
7670: 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 70 4f 75 74  pOp->p4.z = pOut
7680: 2d 3e 7a 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 31  ->z;.    pOp->p1
7690: 20 3d 20 70 4f 75 74 2d 3e 6e 3b 0a 20 20 7d 0a   = pOut->n;.  }.
76a0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4f 70  #endif.  if( pOp
76b0: 2d 3e 70 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  ->p1>db->aLimit[
76c0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
76d0: 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f  GTH] ){.    goto
76e0: 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20   too_big;.  }.  
76f0: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
7700: 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65  to the next case
7710: 2c 20 4f 50 5f 53 74 72 69 6e 67 20 2a 2f 0a 7d  , OP_String */.}
7720: 0a 20 20 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .  ./* Opcode: S
7730: 74 72 69 6e 67 20 50 31 20 50 32 20 2a 20 50 34  tring P1 P2 * P4
7740: 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 72   *.**.** The str
7750: 69 6e 67 20 76 61 6c 75 65 20 50 34 20 6f 66 20  ing value P4 of 
7760: 6c 65 6e 67 74 68 20 50 31 20 28 62 79 74 65 73  length P1 (bytes
7770: 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72  ) is stored in r
7780: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63  egister P2..*/.c
7790: 61 73 65 20 4f 50 5f 53 74 72 69 6e 67 3a 20 7b  ase OP_String: {
77a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
77b0: 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a  2-prerelease */.
77c0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
77d0: 34 2e 7a 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74  4.z!=0 );.  pOut
77e0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
77f0: 72 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d  r|MEM_Static|MEM
7800: 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e 7a  _Term;.  pOut->z
7810: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
7820: 70 4f 75 74 2d 3e 6e 20 3d 20 70 4f 70 2d 3e 70  pOut->n = pOp->p
7830: 31 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d  1;.  pOut->enc =
7840: 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44   encoding;.  UPD
7850: 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
7860: 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b  (pOut);.  break;
7870: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  .}../* Opcode: N
7880: 75 6c 6c 20 2a 20 50 32 20 50 33 20 2a 20 2a 0a  ull * P2 P3 * *.
7890: 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 4e 55  **.** Write a NU
78a0: 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  LL into register
78b0: 73 20 50 32 2e 20 20 49 66 20 50 33 20 67 72 65  s P2.  If P3 gre
78c0: 61 74 65 72 20 74 68 61 6e 20 50 32 2c 20 74 68  ater than P2, th
78d0: 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a 2a  en also write.**
78e0: 20 4e 55 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73   NULL into regis
78f0: 74 65 72 20 50 33 20 61 6e 64 20 65 76 65 72 20  ter P3 and ever 
7900: 72 65 67 69 73 74 65 72 20 69 6e 20 62 65 74 77  register in betw
7910: 65 65 6e 20 50 32 20 61 6e 64 20 50 33 2e 20 20  een P2 and P3.  
7920: 49 66 20 50 33 0a 2a 2a 20 69 73 20 6c 65 73 73  If P3.** is less
7930: 20 74 68 61 6e 20 50 32 20 28 74 79 70 69 63 61   than P2 (typica
7940: 6c 6c 79 20 50 33 20 69 73 20 7a 65 72 6f 29 20  lly P3 is zero) 
7950: 74 68 65 6e 20 6f 6e 6c 79 20 72 65 67 69 73 74  then only regist
7960: 65 72 20 50 32 20 69 73 0a 2a 2a 20 73 65 74 20  er P2 is.** set 
7970: 74 6f 20 4e 55 4c 4c 0a 2a 2f 0a 63 61 73 65 20  to NULL.*/.case 
7980: 4f 50 5f 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20  OP_Null: {      
7990: 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65       /* out2-pre
79a0: 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
79b0: 20 63 6e 74 3b 0a 20 20 63 6e 74 20 3d 20 70 4f   cnt;.  cnt = pO
79c0: 70 2d 3e 70 33 2d 70 4f 70 2d 3e 70 32 3b 0a 20  p->p3-pOp->p2;. 
79d0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
79e0: 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70  <=p->nMem );.  p
79f0: 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
7a00: 5f 4e 75 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20  _Null;.  while( 
7a10: 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 70 4f 75  cnt>0 ){.    pOu
7a20: 74 2b 2b 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75  t++;.    memAbou
7a30: 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75  tToChange(p, pOu
7a40: 74 29 3b 0a 20 20 20 20 56 64 62 65 4d 65 6d 52  t);.    VdbeMemR
7a50: 65 6c 65 61 73 65 28 70 4f 75 74 29 3b 0a 20 20  elease(pOut);.  
7a60: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
7a70: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 63 6e  MEM_Null;.    cn
7a80: 74 2d 2d 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  t--;.  }.  break
7a90: 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ;.}.../* Opcode:
7aa0: 20 42 6c 6f 62 20 50 31 20 50 32 20 2a 20 50 34   Blob P1 P2 * P4
7ab0: 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74 73  .**.** P4 points
7ac0: 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 64 61   to a blob of da
7ad0: 74 61 20 50 31 20 62 79 74 65 73 20 6c 6f 6e 67  ta P1 bytes long
7ae0: 2e 20 20 53 74 6f 72 65 20 74 68 69 73 0a 2a 2a  .  Store this.**
7af0: 20 62 6c 6f 62 20 69 6e 20 72 65 67 69 73 74 65   blob in registe
7b00: 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  r P2..*/.case OP
7b10: 5f 42 6c 6f 62 3a 20 7b 20 20 20 20 20 20 20 20  _Blob: {        
7b20: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
7b30: 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
7b40: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 20  assert( pOp->p1 
7b50: 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  <= SQLITE_MAX_LE
7b60: 4e 47 54 48 20 29 3b 0a 20 20 73 71 6c 69 74 65  NGTH );.  sqlite
7b70: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
7b80: 4f 75 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20  Out, pOp->p4.z, 
7b90: 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 30 29 3b 0a  pOp->p1, 0, 0);.
7ba0: 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e    pOut->enc = en
7bb0: 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41 54 45  coding;.  UPDATE
7bc0: 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f  _MAX_BLOBSIZE(pO
7bd0: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
7be0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 61 72 69  ./* Opcode: Vari
7bf0: 61 62 6c 65 20 50 31 20 50 32 20 2a 20 50 34 20  able P1 P2 * P4 
7c00: 2a 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  *.**.** Transfer
7c10: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 62   the values of b
7c20: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 50  ound parameter P
7c30: 31 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  1 into register 
7c40: 50 32 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  P2.**.** If the 
7c50: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 61 6d  parameter is nam
7c60: 65 64 2c 20 74 68 65 6e 20 69 74 73 20 6e 61 6d  ed, then its nam
7c70: 65 20 61 70 70 65 61 72 73 20 69 6e 20 50 34 20  e appears in P4 
7c80: 61 6e 64 20 50 33 3d 3d 31 2e 0a 2a 2a 20 54 68  and P3==1..** Th
7c90: 65 20 50 34 20 76 61 6c 75 65 20 69 73 20 75 73  e P4 value is us
7ca0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 62 69  ed by sqlite3_bi
7cb0: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
7cc0: 65 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  e()..*/.case OP_
7cd0: 56 61 72 69 61 62 6c 65 3a 20 7b 20 20 20 20 20  Variable: {     
7ce0: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70         /* out2-p
7cf0: 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 4d  rerelease */.  M
7d00: 65 6d 20 2a 70 56 61 72 3b 20 20 20 20 20 20 20  em *pVar;       
7d10: 2f 2a 20 56 61 6c 75 65 20 62 65 69 6e 67 20 74  /* Value being t
7d20: 72 61 6e 73 66 65 72 72 65 64 20 2a 2f 0a 0a 20  ransferred */.. 
7d30: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
7d40: 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 70  >0 && pOp->p1<=p
7d50: 2d 3e 6e 56 61 72 20 29 3b 0a 20 20 61 73 73 65  ->nVar );.  asse
7d60: 72 74 28 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 30  rt( pOp->p4.z==0
7d70: 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 70   || pOp->p4.z==p
7d80: 2d 3e 61 7a 56 61 72 5b 70 4f 70 2d 3e 70 31 2d  ->azVar[pOp->p1-
7d90: 31 5d 20 29 3b 0a 20 20 70 56 61 72 20 3d 20 26  1] );.  pVar = &
7da0: 70 2d 3e 61 56 61 72 5b 70 4f 70 2d 3e 70 31 20  p->aVar[pOp->p1 
7db0: 2d 20 31 5d 3b 0a 20 20 69 66 28 20 73 71 6c 69  - 1];.  if( sqli
7dc0: 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67  te3VdbeMemTooBig
7dd0: 28 70 56 61 72 29 20 29 7b 0a 20 20 20 20 67 6f  (pVar) ){.    go
7de0: 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a  to too_big;.  }.
7df0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
7e00: 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74  ShallowCopy(pOut
7e10: 2c 20 70 56 61 72 2c 20 4d 45 4d 5f 53 74 61 74  , pVar, MEM_Stat
7e20: 69 63 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  ic);.  UPDATE_MA
7e30: 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29  X_BLOBSIZE(pOut)
7e40: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
7e50: 20 4f 70 63 6f 64 65 3a 20 4d 6f 76 65 20 50 31   Opcode: Move P1
7e60: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
7e70: 20 4d 6f 76 65 20 74 68 65 20 76 61 6c 75 65 73   Move the values
7e80: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
7e90: 2e 50 31 2b 50 33 2d 31 20 6f 76 65 72 20 69 6e  .P1+P3-1 over in
7ea0: 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20  to.** registers 
7eb0: 50 32 2e 2e 50 32 2b 50 33 2d 31 2e 20 20 52 65  P2..P2+P3-1.  Re
7ec0: 67 69 73 74 65 72 73 20 50 31 2e 2e 50 31 2b 50  gisters P1..P1+P
7ed0: 31 2d 31 20 61 72 65 0a 2a 2a 20 6c 65 66 74 20  1-1 are.** left 
7ee0: 68 6f 6c 64 69 6e 67 20 61 20 4e 55 4c 4c 2e 20  holding a NULL. 
7ef0: 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
7f00: 66 6f 72 20 72 65 67 69 73 74 65 72 20 72 61 6e  for register ran
7f10: 67 65 73 0a 2a 2a 20 50 31 2e 2e 50 31 2b 50 33  ges.** P1..P1+P3
7f20: 2d 31 20 61 6e 64 20 50 32 2e 2e 50 32 2b 50 33  -1 and P2..P2+P3
7f30: 2d 31 20 74 6f 20 6f 76 65 72 6c 61 70 2e 0a 2a  -1 to overlap..*
7f40: 2f 0a 63 61 73 65 20 4f 50 5f 4d 6f 76 65 3a 20  /.case OP_Move: 
7f50: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 6c 6c 6f  {.  char *zMallo
7f60: 63 3b 20 20 20 2f 2a 20 48 6f 6c 64 69 6e 67 20  c;   /* Holding 
7f70: 76 61 72 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c  variable for all
7f80: 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  ocated memory */
7f90: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
7fa0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7fb0: 20 72 65 67 69 73 74 65 72 73 20 6c 65 66 74 20   registers left 
7fc0: 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
7fd0: 20 70 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   p1;          /*
7fe0: 20 52 65 67 69 73 74 65 72 20 74 6f 20 63 6f 70   Register to cop
7ff0: 79 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  y from */.  int 
8000: 70 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p2;          /* 
8010: 52 65 67 69 73 74 65 72 20 74 6f 20 63 6f 70 79  Register to copy
8020: 20 74 6f 20 2a 2f 0a 0a 20 20 6e 20 3d 20 70 4f   to */..  n = pO
8030: 70 2d 3e 70 33 3b 0a 20 20 70 31 20 3d 20 70 4f  p->p3;.  p1 = pO
8040: 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70 4f  p->p1;.  p2 = pO
8050: 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28  p->p2;.  assert(
8060: 20 6e 3e 30 20 26 26 20 70 31 3e 30 20 26 26 20   n>0 && p1>0 && 
8070: 70 32 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p2>0 );.  assert
8080: 28 20 70 31 2b 6e 3c 3d 70 32 20 7c 7c 20 70 32  ( p1+n<=p2 || p2
8090: 2b 6e 3c 3d 70 31 20 29 3b 0a 0a 20 20 70 49 6e  +n<=p1 );..  pIn
80a0: 31 20 3d 20 26 61 4d 65 6d 5b 70 31 5d 3b 0a 20  1 = &aMem[p1];. 
80b0: 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 32   pOut = &aMem[p2
80c0: 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  ];.  while( n-- 
80d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
80e0: 4f 75 74 3c 3d 26 61 4d 65 6d 5b 70 2d 3e 6e 4d  Out<=&aMem[p->nM
80f0: 65 6d 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  em] );.    asser
8100: 74 28 20 70 49 6e 31 3c 3d 26 61 4d 65 6d 5b 70  t( pIn1<=&aMem[p
8110: 2d 3e 6e 4d 65 6d 5d 20 29 3b 0a 20 20 20 20 61  ->nMem] );.    a
8120: 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
8130: 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 20 20 6d  d(pIn1) );.    m
8140: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
8150: 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 7a 4d  p, pOut);.    zM
8160: 61 6c 6c 6f 63 20 3d 20 70 4f 75 74 2d 3e 7a 4d  alloc = pOut->zM
8170: 61 6c 6c 6f 63 3b 0a 20 20 20 20 70 4f 75 74 2d  alloc;.    pOut-
8180: 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  >zMalloc = 0;.  
8190: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
81a0: 4d 6f 76 65 28 70 4f 75 74 2c 20 70 49 6e 31 29  Move(pOut, pIn1)
81b0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
81c0: 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 4f  DEBUG.    if( pO
81d0: 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3e 3d  ut->pScopyFrom>=
81e0: 26 61 4d 65 6d 5b 70 31 5d 20 26 26 20 70 4f 75  &aMem[p1] && pOu
81f0: 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3c 26 61  t->pScopyFrom<&a
8200: 4d 65 6d 5b 70 31 2b 70 4f 70 2d 3e 70 33 5d 20  Mem[p1+pOp->p3] 
8210: 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  ){.      pOut->p
8220: 53 63 6f 70 79 46 72 6f 6d 20 2b 3d 20 70 31 20  ScopyFrom += p1 
8230: 2d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 7d  - pOp->p2;.    }
8240: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 49 6e 31  .#endif.    pIn1
8250: 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 7a 4d 61 6c  ->zMalloc = zMal
8260: 6c 6f 63 3b 0a 20 20 20 20 52 45 47 49 53 54 45  loc;.    REGISTE
8270: 52 5f 54 52 41 43 45 28 70 32 2b 2b 2c 20 70 4f  R_TRACE(p2++, pO
8280: 75 74 29 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b  ut);.    pIn1++;
8290: 0a 20 20 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 7d  .    pOut++;.  }
82a0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
82b0: 4f 70 63 6f 64 65 3a 20 43 6f 70 79 20 50 31 20  Opcode: Copy P1 
82c0: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d  P2 * * *.**.** M
82d0: 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 72 65  ake a copy of re
82e0: 67 69 73 74 65 72 20 50 31 20 69 6e 74 6f 20 72  gister P1 into r
82f0: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
8300: 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69  * This instructi
8310: 6f 6e 20 6d 61 6b 65 73 20 61 20 64 65 65 70 20  on makes a deep 
8320: 63 6f 70 79 20 6f 66 20 74 68 65 20 76 61 6c 75  copy of the valu
8330: 65 2e 20 20 41 20 64 75 70 6c 69 63 61 74 65 0a  e.  A duplicate.
8340: 2a 2a 20 69 73 20 6d 61 64 65 20 6f 66 20 61 6e  ** is made of an
8350: 79 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  y string or blob
8360: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20   constant.  See 
8370: 61 6c 73 6f 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a  also OP_SCopy..*
8380: 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 70 79 3a 20  /.case OP_Copy: 
8390: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {             /*
83a0: 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20 20   in1, out2 */.  
83b0: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
83c0: 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20  ->p1];.  pOut = 
83d0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
83e0: 20 20 61 73 73 65 72 74 28 20 70 4f 75 74 21 3d    assert( pOut!=
83f0: 70 49 6e 31 20 29 3b 0a 20 20 73 71 6c 69 74 65  pIn1 );.  sqlite
8400: 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
8410: 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 31 2c 20  opy(pOut, pIn1, 
8420: 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 44 65  MEM_Ephem);.  De
8430: 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 70 4f 75  ephemeralize(pOu
8440: 74 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54  t);.  REGISTER_T
8450: 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f  RACE(pOp->p2, pO
8460: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
8470: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 43 6f 70  ./* Opcode: SCop
8480: 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  y P1 P2 * * *.**
8490: 0a 2a 2a 20 4d 61 6b 65 20 61 20 73 68 61 6c 6c  .** Make a shall
84a0: 6f 77 20 63 6f 70 79 20 6f 66 20 72 65 67 69 73  ow copy of regis
84b0: 74 65 72 20 50 31 20 69 6e 74 6f 20 72 65 67 69  ter P1 into regi
84c0: 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54  ster P2..**.** T
84d0: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
84e0: 6d 61 6b 65 73 20 61 20 73 68 61 6c 6c 6f 77 20  makes a shallow 
84f0: 63 6f 70 79 20 6f 66 20 74 68 65 20 76 61 6c 75  copy of the valu
8500: 65 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65  e.  If the value
8510: 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20  .** is a string 
8520: 6f 72 20 62 6c 6f 62 2c 20 74 68 65 6e 20 74 68  or blob, then th
8530: 65 20 63 6f 70 79 20 69 73 20 6f 6e 6c 79 20 61  e copy is only a
8540: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
8550: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 61 6e 64 20  ** original and 
8560: 68 65 6e 63 65 20 69 66 20 74 68 65 20 6f 72 69  hence if the ori
8570: 67 69 6e 61 6c 20 63 68 61 6e 67 65 73 20 73 6f  ginal changes so
8580: 20 77 69 6c 6c 20 74 68 65 20 63 6f 70 79 2e 0a   will the copy..
8590: 2a 2a 20 57 6f 72 73 65 2c 20 69 66 20 74 68 65  ** Worse, if the
85a0: 20 6f 72 69 67 69 6e 61 6c 20 69 73 20 64 65 61   original is dea
85b0: 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 20 63 6f  llocated, the co
85c0: 70 79 20 62 65 63 6f 6d 65 73 20 69 6e 76 61 6c  py becomes inval
85d0: 69 64 2e 0a 2a 2a 20 54 68 75 73 20 74 68 65 20  id..** Thus the 
85e0: 70 72 6f 67 72 61 6d 20 6d 75 73 74 20 67 75 61  program must gua
85f0: 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
8600: 6f 72 69 67 69 6e 61 6c 20 77 69 6c 6c 20 6e 6f  original will no
8610: 74 20 63 68 61 6e 67 65 0a 2a 2a 20 64 75 72 69  t change.** duri
8620: 6e 67 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  ng the lifetime 
8630: 6f 66 20 74 68 65 20 63 6f 70 79 2e 20 20 55 73  of the copy.  Us
8640: 65 20 4f 50 5f 43 6f 70 79 20 74 6f 20 6d 61 6b  e OP_Copy to mak
8650: 65 20 61 20 63 6f 6d 70 6c 65 74 65 0a 2a 2a 20  e a complete.** 
8660: 63 6f 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  copy..*/.case OP
8670: 5f 53 43 6f 70 79 3a 20 7b 20 20 20 20 20 20 20  _SCopy: {       
8680: 20 20 20 20 20 2f 2a 20 69 6e 31 2c 20 6f 75 74       /* in1, out
8690: 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61  2 */.  pIn1 = &a
86a0: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
86b0: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
86c0: 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p2];.  assert(
86d0: 20 70 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a 20   pOut!=pIn1 );. 
86e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
86f0: 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c  hallowCopy(pOut,
8700: 20 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65 6d   pIn1, MEM_Ephem
8710: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
8720: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 4f 75  _DEBUG.  if( pOu
8730: 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3d 3d 30  t->pScopyFrom==0
8740: 20 29 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46   ) pOut->pScopyF
8750: 72 6f 6d 20 3d 20 70 49 6e 31 3b 0a 23 65 6e 64  rom = pIn1;.#end
8760: 69 66 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  if.  REGISTER_TR
8770: 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75  ACE(pOp->p2, pOu
8780: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
8790: 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 75 6c  /* Opcode: Resul
87a0: 74 52 6f 77 20 50 31 20 50 32 20 2a 20 2a 20 2a  tRow P1 P2 * * *
87b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69 73  .**.** The regis
87c0: 74 65 72 73 20 50 31 20 74 68 72 6f 75 67 68 20  ters P1 through 
87d0: 50 31 2b 50 32 2d 31 20 63 6f 6e 74 61 69 6e 20  P1+P2-1 contain 
87e0: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 0a  a single row of.
87f0: 2a 2a 20 72 65 73 75 6c 74 73 2e 20 54 68 69 73  ** results. This
8800: 20 6f 70 63 6f 64 65 20 63 61 75 73 65 73 20 74   opcode causes t
8810: 68 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  he sqlite3_step(
8820: 29 20 63 61 6c 6c 20 74 6f 20 74 65 72 6d 69 6e  ) call to termin
8830: 61 74 65 0a 2a 2a 20 77 69 74 68 20 61 6e 20 53  ate.** with an S
8840: 51 4c 49 54 45 5f 52 4f 57 20 72 65 74 75 72 6e  QLITE_ROW return
8850: 20 63 6f 64 65 20 61 6e 64 20 69 74 20 73 65 74   code and it set
8860: 73 20 75 70 20 74 68 65 20 73 71 6c 69 74 65 33  s up the sqlite3
8870: 5f 73 74 6d 74 0a 2a 2a 20 73 74 72 75 63 74 75  _stmt.** structu
8880: 72 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61 63  re to provide ac
8890: 63 65 73 73 20 74 6f 20 74 68 65 20 74 6f 70 20  cess to the top 
88a0: 50 31 20 76 61 6c 75 65 73 20 61 73 20 74 68 65  P1 values as the
88b0: 20 72 65 73 75 6c 74 0a 2a 2a 20 72 6f 77 2e 0a   result.** row..
88c0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 75 6c  */.case OP_Resul
88d0: 74 52 6f 77 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70  tRow: {.  Mem *p
88e0: 4d 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Mem;.  int i;.  
88f0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 73 43  assert( p->nResC
8900: 6f 6c 75 6d 6e 3d 3d 70 4f 70 2d 3e 70 32 20 29  olumn==pOp->p2 )
8910: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
8920: 3e 70 31 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  >p1>0 );.  asser
8930: 74 28 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e  t( pOp->p1+pOp->
8940: 70 32 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29 3b  p2<=p->nMem+1 );
8950: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73  ..  /* If this s
8960: 74 61 74 65 6d 65 6e 74 20 68 61 73 20 76 69 6f  tatement has vio
8970: 6c 61 74 65 64 20 69 6d 6d 65 64 69 61 74 65 20  lated immediate 
8980: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
8990: 74 72 61 69 6e 74 73 2c 20 64 6f 0a 20 20 2a 2a  traints, do.  **
89a0: 20 6e 6f 74 20 72 65 74 75 72 6e 20 74 68 65 20   not return the 
89b0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6d  number of rows m
89c0: 6f 64 69 66 69 65 64 2e 20 41 6e 64 20 64 6f 20  odified. And do 
89d0: 6e 6f 74 20 52 45 4c 45 41 53 45 20 74 68 65 20  not RELEASE the 
89e0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
89f0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 6e  ransaction. It n
8a00: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
8a10: 64 20 62 61 63 6b 2e 20 20 2a 2f 0a 20 20 69 66  d back.  */.  if
8a20: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
8a30: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
8a40: 65 63 6b 46 6b 28 70 2c 20 30 29 29 20 29 7b 0a  eckFk(p, 0)) ){.
8a50: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
8a60: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6f 75  flags&SQLITE_Cou
8a70: 6e 74 52 6f 77 73 20 29 3b 0a 20 20 20 20 61 73  ntRows );.    as
8a80: 73 65 72 74 28 20 70 2d 3e 75 73 65 73 53 74 6d  sert( p->usesStm
8a90: 74 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  tJournal );.    
8aa0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
8ab0: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 43   If the SQLITE_C
8ac0: 6f 75 6e 74 52 6f 77 73 20 66 6c 61 67 20 69 73  ountRows flag is
8ad0: 20 73 65 74 20 69 6e 20 73 71 6c 69 74 65 33 2e   set in sqlite3.
8ae0: 66 6c 61 67 73 20 6d 61 73 6b 2c 20 74 68 65 6e  flags mask, then
8af0: 20 0a 20 20 2a 2a 20 44 4d 4c 20 73 74 61 74 65   .  ** DML state
8b00: 6d 65 6e 74 73 20 69 6e 76 6f 6b 65 20 74 68 69  ments invoke thi
8b10: 73 20 6f 70 63 6f 64 65 20 74 6f 20 72 65 74 75  s opcode to retu
8b20: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
8b30: 20 72 6f 77 73 20 0a 20 20 2a 2a 20 6d 6f 64 69   rows .  ** modi
8b40: 66 69 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  fied to the user
8b50: 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e  . This is the on
8b60: 6c 79 20 77 61 79 20 74 68 61 74 20 61 20 56 4d  ly way that a VM
8b70: 20 74 68 61 74 0a 20 20 2a 2a 20 6f 70 65 6e 73   that.  ** opens
8b80: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
8b90: 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 69 6e 76  nsaction may inv
8ba0: 6f 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65 2e  oke this opcode.
8bb0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63 61  .  **.  ** In ca
8bc0: 73 65 20 74 68 69 73 20 69 73 20 73 75 63 68 20  se this is such 
8bd0: 61 20 73 74 61 74 65 6d 65 6e 74 2c 20 63 6c 6f  a statement, clo
8be0: 73 65 20 61 6e 79 20 73 74 61 74 65 6d 65 6e 74  se any statement
8bf0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
8c00: 2a 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73  * opened by this
8c10: 20 56 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72   VM before retur
8c20: 6e 69 6e 67 20 63 6f 6e 74 72 6f 6c 20 74 6f 20  ning control to 
8c30: 74 68 65 20 75 73 65 72 2e 20 54 68 69 73 20 69  the user. This i
8c40: 73 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65  s to.  ** ensure
8c50: 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2d   that statement-
8c60: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
8c70: 20 61 6c 77 61 79 73 20 6e 65 73 74 65 64 2c 20   always nested, 
8c80: 6e 6f 74 20 6f 76 65 72 6c 61 70 70 69 6e 67 2e  not overlapping.
8c90: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 65  .  ** If the ope
8ca0: 6e 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  n statement-tran
8cb0: 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63  saction is not c
8cc0: 6c 6f 73 65 64 20 68 65 72 65 2c 20 74 68 65 6e  losed here, then
8cd0: 20 74 68 65 20 75 73 65 72 0a 20 20 2a 2a 20 6d   the user.  ** m
8ce0: 61 79 20 73 74 65 70 20 61 6e 6f 74 68 65 72 20  ay step another 
8cf0: 56 4d 20 74 68 61 74 20 6f 70 65 6e 73 20 69 74  VM that opens it
8d00: 73 20 6f 77 6e 20 73 74 61 74 65 6d 65 6e 74 20  s own statement 
8d10: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
8d20: 73 0a 20 20 2a 2a 20 6d 61 79 20 6c 65 61 64 20  s.  ** may lead 
8d30: 74 6f 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 73  to overlapping s
8d40: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
8d50: 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
8d60: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   The statement t
8d70: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65  ransaction is ne
8d80: 76 65 72 20 61 20 74 6f 70 2d 6c 65 76 65 6c 20  ver a top-level 
8d90: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 48 65  transaction.  He
8da0: 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 52 45 4c  nce.  ** the REL
8db0: 45 41 53 45 20 63 61 6c 6c 20 62 65 6c 6f 77 20  EASE call below 
8dc0: 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a  can never fail..
8dd0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
8de0: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->iStatement==0 
8df0: 7c 7c 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  || db->flags&SQL
8e00: 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 3b  ITE_CountRows );
8e10: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
8e20: 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
8e30: 74 28 70 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  t(p, SAVEPOINT_R
8e40: 45 4c 45 41 53 45 29 3b 0a 20 20 69 66 28 20 4e  ELEASE);.  if( N
8e50: 45 56 45 52 28 72 63 21 3d 53 51 4c 49 54 45 5f  EVER(rc!=SQLITE_
8e60: 4f 4b 29 20 29 7b 0a 20 20 20 20 62 72 65 61 6b  OK) ){.    break
8e70: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 76 61  ;.  }..  /* Inva
8e80: 6c 69 64 61 74 65 20 61 6c 6c 20 65 70 68 65 6d  lidate all ephem
8e90: 65 72 61 6c 20 63 75 72 73 6f 72 20 72 6f 77 20  eral cursor row 
8ea0: 63 61 63 68 65 73 20 2a 2f 0a 20 20 70 2d 3e 63  caches */.  p->c
8eb0: 61 63 68 65 43 74 72 20 3d 20 28 70 2d 3e 63 61  acheCtr = (p->ca
8ec0: 63 68 65 43 74 72 20 2b 20 32 29 7c 31 3b 0a 0a  cheCtr + 2)|1;..
8ed0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
8ee0: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
8ef0: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 61 72  e current row ar
8f00: 65 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  e \000 terminate
8f10: 64 0a 20 20 2a 2a 20 61 6e 64 20 68 61 76 65 20  d.  ** and have 
8f20: 61 6e 20 61 73 73 69 67 6e 65 64 20 74 79 70 65  an assigned type
8f30: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
8f40: 72 65 20 64 65 2d 65 70 68 65 6d 65 72 61 6c 69  re de-ephemerali
8f50: 7a 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 73 69  zed as.  ** a si
8f60: 64 65 20 65 66 66 65 63 74 2e 0a 20 20 2a 2f 0a  de effect..  */.
8f70: 20 20 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73    pMem = p->pRes
8f80: 75 6c 74 53 65 74 20 3d 20 26 61 4d 65 6d 5b 70  ultSet = &aMem[p
8f90: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 66 6f 72 28 69  Op->p1];.  for(i
8fa0: 3d 30 3b 20 69 3c 70 4f 70 2d 3e 70 32 3b 20 69  =0; i<pOp->p2; i
8fb0: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
8fc0: 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 70 4d 65   memIsValid(&pMe
8fd0: 6d 5b 69 5d 29 20 29 3b 0a 20 20 20 20 44 65 65  m[i]) );.    Dee
8fe0: 70 68 65 6d 65 72 61 6c 69 7a 65 28 26 70 4d 65  phemeralize(&pMe
8ff0: 6d 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  m[i]);.    asser
9000: 74 28 20 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67  t( (pMem[i].flag
9010: 73 20 26 20 4d 45 4d 5f 45 70 68 65 6d 29 3d 3d  s & MEM_Ephem)==
9020: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
9030: 20 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20   (pMem[i].flags 
9040: 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  & (MEM_Str|MEM_B
9050: 6c 6f 62 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  lob))==0 );.    
9060: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e 75  sqlite3VdbeMemNu
9070: 6c 54 65 72 6d 69 6e 61 74 65 28 26 70 4d 65 6d  lTerminate(&pMem
9080: 5b 69 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  [i]);.    sqlite
9090: 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70  3VdbeMemStoreTyp
90a0: 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 20  e(&pMem[i]);.   
90b0: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
90c0: 70 4f 70 2d 3e 70 31 2b 69 2c 20 26 70 4d 65 6d  pOp->p1+i, &pMem
90d0: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [i]);.  }.  if( 
90e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
90f0: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
9100: 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 53 51 4c  .  /* Return SQL
9110: 49 54 45 5f 52 4f 57 0a 20 20 2a 2f 0a 20 20 70  ITE_ROW.  */.  p
9120: 2d 3e 70 63 20 3d 20 70 63 20 2b 20 31 3b 0a 20  ->pc = pc + 1;. 
9130: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
9140: 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65  ;.  goto vdbe_re
9150: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  turn;.}../* Opco
9160: 64 65 3a 20 43 6f 6e 63 61 74 20 50 31 20 50 32  de: Concat P1 P2
9170: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 64   P3 * *.**.** Ad
9180: 64 20 74 68 65 20 74 65 78 74 20 69 6e 20 72 65  d the text in re
9190: 67 69 73 74 65 72 20 50 31 20 6f 6e 74 6f 20 74  gister P1 onto t
91a0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 65  he end of the te
91b0: 78 74 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74 65  xt in.** registe
91c0: 72 20 50 32 20 61 6e 64 20 73 74 6f 72 65 20 74  r P2 and store t
91d0: 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  he result in reg
91e0: 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20  ister P3..** If 
91f0: 65 69 74 68 65 72 20 74 68 65 20 50 31 20 6f 72  either the P1 or
9200: 20 50 32 20 74 65 78 74 20 61 72 65 20 4e 55 4c   P2 text are NUL
9210: 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 4e 55 4c  L then store NUL
9220: 4c 20 69 6e 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 20  L in P3..**.**  
9230: 20 50 33 20 3d 20 50 32 20 7c 7c 20 50 31 0a 2a   P3 = P2 || P1.*
9240: 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  *.** It is illeg
9250: 61 6c 20 66 6f 72 20 50 31 20 61 6e 64 20 50 33  al for P1 and P3
9260: 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 20   to be the same 
9270: 72 65 67 69 73 74 65 72 2e 20 53 6f 6d 65 74 69  register. Someti
9280: 6d 65 73 2c 0a 2a 2a 20 69 66 20 50 33 20 69 73  mes,.** if P3 is
9290: 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74   the same regist
92a0: 65 72 20 61 73 20 50 32 2c 20 74 68 65 20 69 6d  er as P2, the im
92b0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
92c0: 61 62 6c 65 0a 2a 2a 20 74 6f 20 61 76 6f 69 64  able.** to avoid
92d0: 20 61 20 6d 65 6d 63 70 79 28 29 2e 0a 2a 2f 0a   a memcpy()..*/.
92e0: 63 61 73 65 20 4f 50 5f 43 6f 6e 63 61 74 3a 20  case OP_Concat: 
92f0: 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  {           /* s
9300: 61 6d 65 20 61 73 20 54 4b 5f 43 4f 4e 43 41 54  ame as TK_CONCAT
9310: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
9320: 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74 65 3b   */.  i64 nByte;
9330: 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ..  pIn1 = &aMem
9340: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e  [pOp->p1];.  pIn
9350: 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  2 = &aMem[pOp->p
9360: 32 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d  2];.  pOut = &aM
9370: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61  em[pOp->p3];.  a
9380: 73 73 65 72 74 28 20 70 49 6e 31 21 3d 70 4f 75  ssert( pIn1!=pOu
9390: 74 20 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31  t );.  if( (pIn1
93a0: 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e  ->flags | pIn2->
93b0: 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 4e 75 6c  flags) & MEM_Nul
93c0: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
93d0: 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70  VdbeMemSetNull(p
93e0: 4f 75 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  Out);.    break;
93f0: 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 61 6e  .  }.  if( Expan
9400: 64 42 6c 6f 62 28 70 49 6e 31 29 20 7c 7c 20 45  dBlob(pIn1) || E
9410: 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29 20  xpandBlob(pIn2) 
9420: 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
9430: 20 53 74 72 69 6e 67 69 66 79 28 70 49 6e 31 2c   Stringify(pIn1,
9440: 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 53 74   encoding);.  St
9450: 72 69 6e 67 69 66 79 28 70 49 6e 32 2c 20 65 6e  ringify(pIn2, en
9460: 63 6f 64 69 6e 67 29 3b 0a 20 20 6e 42 79 74 65  coding);.  nByte
9470: 20 3d 20 70 49 6e 31 2d 3e 6e 20 2b 20 70 49 6e   = pIn1->n + pIn
9480: 32 2d 3e 6e 3b 0a 20 20 69 66 28 20 6e 42 79 74  2->n;.  if( nByt
9490: 65 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  e>db->aLimit[SQL
94a0: 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
94b0: 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f  ] ){.    goto to
94c0: 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 4d 65 6d  o_big;.  }.  Mem
94d0: 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
94e0: 2c 20 4d 45 4d 5f 53 74 72 29 3b 0a 20 20 69 66  , MEM_Str);.  if
94f0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
9500: 47 72 6f 77 28 70 4f 75 74 2c 20 28 69 6e 74 29  Grow(pOut, (int)
9510: 6e 42 79 74 65 2b 32 2c 20 70 4f 75 74 3d 3d 70  nByte+2, pOut==p
9520: 49 6e 32 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  In2) ){.    goto
9530: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 69   no_mem;.  }.  i
9540: 66 28 20 70 4f 75 74 21 3d 70 49 6e 32 20 29 7b  f( pOut!=pIn2 ){
9550: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74  .    memcpy(pOut
9560: 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 7a 2c 20 70 49  ->z, pIn2->z, pI
9570: 6e 32 2d 3e 6e 29 3b 0a 20 20 7d 0a 20 20 6d 65  n2->n);.  }.  me
9580: 6d 63 70 79 28 26 70 4f 75 74 2d 3e 7a 5b 70 49  mcpy(&pOut->z[pI
9590: 6e 32 2d 3e 6e 5d 2c 20 70 49 6e 31 2d 3e 7a 2c  n2->n], pIn1->z,
95a0: 20 70 49 6e 31 2d 3e 6e 29 3b 0a 20 20 70 4f 75   pIn1->n);.  pOu
95b0: 74 2d 3e 7a 5b 6e 42 79 74 65 5d 20 3d 20 30 3b  t->z[nByte] = 0;
95c0: 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74 65  .  pOut->z[nByte
95d0: 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 4f 75 74 2d  +1] = 0;.  pOut-
95e0: 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65  >flags |= MEM_Te
95f0: 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20  rm;.  pOut->n = 
9600: 28 69 6e 74 29 6e 42 79 74 65 3b 0a 20 20 70 4f  (int)nByte;.  pO
9610: 75 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69  ut->enc = encodi
9620: 6e 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58  ng;.  UPDATE_MAX
9630: 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b  _BLOBSIZE(pOut);
9640: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
9650: 4f 70 63 6f 64 65 3a 20 41 64 64 20 50 31 20 50  Opcode: Add P1 P
9660: 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41  2 P3 * *.**.** A
9670: 64 64 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  dd the value in 
9680: 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20 74  register P1 to t
9690: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
96a0: 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73  ster P2.** and s
96b0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
96c0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
96d0: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70  ** If either inp
96e0: 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  ut is NULL, the 
96f0: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
9700: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 75  */./* Opcode: Mu
9710: 6c 74 69 70 6c 79 20 50 31 20 50 32 20 50 33 20  ltiply P1 P2 P3 
9720: 2a 20 2a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4d 75 6c  * *.**.**.** Mul
9730: 74 69 70 6c 79 20 74 68 65 20 76 61 6c 75 65 20  tiply the value 
9740: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 62  in register P1 b
9750: 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  y the value in r
9760: 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e  egister P2.** an
9770: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
9780: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
9790: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
97a0: 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74  input is NULL, t
97b0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
97c0: 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  L..*/./* Opcode:
97d0: 20 53 75 62 74 72 61 63 74 20 50 31 20 50 32 20   Subtract P1 P2 
97e0: 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 75 62  P3 * *.**.** Sub
97f0: 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
9800: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 66  in register P1 f
9810: 72 6f 6d 20 74 68 65 20 76 61 6c 75 65 20 69 6e  rom the value in
9820: 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20   register P2.** 
9830: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
9840: 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72  sult in register
9850: 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65   P3..** If eithe
9860: 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c  r input is NULL,
9870: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
9880: 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ULL..*/./* Opcod
9890: 65 3a 20 44 69 76 69 64 65 20 50 31 20 50 32 20  e: Divide P1 P2 
98a0: 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 69 76  P3 * *.**.** Div
98b0: 69 64 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ide the value in
98c0: 20 72 65 67 69 73 74 65 72 20 50 31 20 62 79 20   register P1 by 
98d0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
98e0: 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20  ister P2.** and 
98f0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
9900: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20   in register P3 
9910: 28 50 33 3d 50 32 2f 50 31 29 2e 20 49 66 20 74  (P3=P2/P1). If t
9920: 68 65 20 76 61 6c 75 65 20 69 6e 20 0a 2a 2a 20  he value in .** 
9930: 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 7a  register P1 is z
9940: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ero, then the re
9950: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 49 66  sult is NULL. If
9960: 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73   either input is
9970: 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 72   .** NULL, the r
9980: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
9990: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6d  /./* Opcode: Rem
99a0: 61 69 6e 64 65 72 20 50 31 20 50 32 20 50 33 20  ainder P1 P2 P3 
99b0: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74  * *.**.** Comput
99c0: 65 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  e the remainder 
99d0: 61 66 74 65 72 20 69 6e 74 65 67 65 72 20 64 69  after integer di
99e0: 76 69 73 69 6f 6e 20 6f 66 20 74 68 65 20 76 61  vision of the va
99f0: 6c 75 65 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74  lue in.** regist
9a00: 65 72 20 50 31 20 62 79 20 74 68 65 20 76 61 6c  er P1 by the val
9a10: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
9a20: 32 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  2 and store the 
9a30: 72 65 73 75 6c 74 20 69 6e 20 50 33 2e 20 0a 2a  result in P3. .*
9a40: 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69  * If the value i
9a50: 6e 20 72 65 67 69 73 74 65 72 20 50 32 20 69 73  n register P2 is
9a60: 20 7a 65 72 6f 20 74 68 65 20 72 65 73 75 6c 74   zero the result
9a70: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 66 20   is NULL..** If 
9a80: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
9a90: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75  s NULL, the resu
9aa0: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63  lt is NULL..*/.c
9ab0: 61 73 65 20 4f 50 5f 41 64 64 3a 20 20 20 20 20  ase OP_Add:     
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9ad0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 50 4c 55 53   same as TK_PLUS
9ae0: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
9af0: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 75 62 74   */.case OP_Subt
9b00: 72 61 63 74 3a 20 20 20 20 20 20 20 20 20 20 20  ract:           
9b10: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
9b20: 5f 4d 49 4e 55 53 2c 20 69 6e 31 2c 20 69 6e 32  _MINUS, in1, in2
9b30: 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f  , out3 */.case O
9b40: 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20 20  P_Multiply:     
9b50: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
9b60: 20 61 73 20 54 4b 5f 53 54 41 52 2c 20 69 6e 31   as TK_STAR, in1
9b70: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63  , in2, out3 */.c
9b80: 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 20  ase OP_Divide:  
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9ba0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 4c 41 53   same as TK_SLAS
9bb0: 48 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  H, in1, in2, out
9bc0: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 6d  3 */.case OP_Rem
9bd0: 61 69 6e 64 65 72 3a 20 7b 20 20 20 20 20 20 20  ainder: {       
9be0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
9bf0: 4b 5f 52 45 4d 2c 20 69 6e 31 2c 20 69 6e 32 2c  K_REM, in1, in2,
9c00: 20 6f 75 74 33 20 2a 2f 0a 20 20 69 6e 74 20 66   out3 */.  int f
9c10: 6c 61 67 73 3b 20 20 20 20 20 20 2f 2a 20 43 6f  lags;      /* Co
9c20: 6d 62 69 6e 65 64 20 4d 45 4d 5f 2a 20 66 6c 61  mbined MEM_* fla
9c30: 67 73 20 66 72 6f 6d 20 62 6f 74 68 20 69 6e 70  gs from both inp
9c40: 75 74 73 20 2a 2f 0a 20 20 69 36 34 20 69 41 3b  uts */.  i64 iA;
9c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
9c60: 67 65 72 20 76 61 6c 75 65 20 6f 66 20 6c 65 66  ger value of lef
9c70: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
9c80: 36 34 20 69 42 3b 20 20 20 20 20 20 20 20 20 2f  64 iB;         /
9c90: 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65 20  * Integer value 
9ca0: 6f 66 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  of right operand
9cb0: 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 41 3b   */.  double rA;
9cc0: 20 20 20 20 20 20 2f 2a 20 52 65 61 6c 20 76 61        /* Real va
9cd0: 6c 75 65 20 6f 66 20 6c 65 66 74 20 6f 70 65 72  lue of left oper
9ce0: 61 6e 64 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  and */.  double 
9cf0: 72 42 3b 20 20 20 20 20 20 2f 2a 20 52 65 61 6c  rB;      /* Real
9d00: 20 76 61 6c 75 65 20 6f 66 20 72 69 67 68 74 20   value of right 
9d10: 6f 70 65 72 61 6e 64 20 2a 2f 0a 0a 20 20 70 49  operand */..  pI
9d20: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
9d30: 70 31 5d 3b 0a 20 20 61 70 70 6c 79 4e 75 6d 65  p1];.  applyNume
9d40: 72 69 63 41 66 66 69 6e 69 74 79 28 70 49 6e 31  ricAffinity(pIn1
9d50: 29 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65  );.  pIn2 = &aMe
9d60: 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 70  m[pOp->p2];.  ap
9d70: 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  plyNumericAffini
9d80: 74 79 28 70 49 6e 32 29 3b 0a 20 20 70 4f 75 74  ty(pIn2);.  pOut
9d90: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
9da0: 5d 3b 0a 20 20 66 6c 61 67 73 20 3d 20 70 49 6e  ];.  flags = pIn
9db0: 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d  1->flags | pIn2-
9dc0: 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 66  >flags;.  if( (f
9dd0: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
9de0: 21 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68  !=0 ) goto arith
9df0: 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f  metic_result_is_
9e00: 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 28 70 49 6e  null;.  if( (pIn
9e10: 31 2d 3e 66 6c 61 67 73 20 26 20 70 49 6e 32 2d  1->flags & pIn2-
9e20: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
9e30: 29 3d 3d 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  )==MEM_Int ){.  
9e40: 20 20 69 41 20 3d 20 70 49 6e 31 2d 3e 75 2e 69    iA = pIn1->u.i
9e50: 3b 0a 20 20 20 20 69 42 20 3d 20 70 49 6e 32 2d  ;.    iB = pIn2-
9e60: 3e 75 2e 69 3b 0a 20 20 20 20 73 77 69 74 63 68  >u.i;.    switch
9e70: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b  ( pOp->opcode ){
9e80: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41  .      case OP_A
9e90: 64 64 3a 20 20 20 20 20 20 20 69 66 28 20 73 71  dd:       if( sq
9ea0: 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28 26 69  lite3AddInt64(&i
9eb0: 42 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 70 5f  B,iA) ) goto fp_
9ec0: 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20  math;  break;.  
9ed0: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 75 62 74      case OP_Subt
9ee0: 72 61 63 74 3a 20 20 69 66 28 20 73 71 6c 69 74  ract:  if( sqlit
9ef0: 65 33 53 75 62 49 6e 74 36 34 28 26 69 42 2c 69  e3SubInt64(&iB,i
9f00: 41 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74  A) ) goto fp_mat
9f10: 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  h;  break;.     
9f20: 20 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c   case OP_Multipl
9f30: 79 3a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d  y:  if( sqlite3M
9f40: 75 6c 49 6e 74 36 34 28 26 69 42 2c 69 41 29 20  ulInt64(&iB,iA) 
9f50: 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 20  ) goto fp_math; 
9f60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9f70: 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 7b 0a  se OP_Divide: {.
9f80: 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d          if( iA==
9f90: 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d 65  0 ) goto arithme
9fa0: 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75  tic_result_is_nu
9fb0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ll;.        if( 
9fc0: 69 41 3d 3d 2d 31 20 26 26 20 69 42 3d 3d 53 4d  iA==-1 && iB==SM
9fd0: 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29 20 67  ALLEST_INT64 ) g
9fe0: 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 0a 20 20 20  oto fp_math;.   
9ff0: 20 20 20 20 20 69 42 20 2f 3d 20 69 41 3b 0a 20       iB /= iA;. 
a000: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a010: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61      }.      defa
a020: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ult: {.        i
a030: 66 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20  f( iA==0 ) goto 
a040: 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c  arithmetic_resul
a050: 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20  t_is_null;.     
a060: 20 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 29 20     if( iA==-1 ) 
a070: 69 41 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  iA = 1;.        
a080: 69 42 20 25 3d 20 69 41 3b 0a 20 20 20 20 20 20  iB %= iA;.      
a090: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
a0a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74 2d  .    }.    pOut-
a0b0: 3e 75 2e 69 20 3d 20 69 42 3b 0a 20 20 20 20 4d  >u.i = iB;.    M
a0c0: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
a0d0: 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20  ut, MEM_Int);.  
a0e0: 7d 65 6c 73 65 7b 0a 66 70 5f 6d 61 74 68 3a 0a  }else{.fp_math:.
a0f0: 20 20 20 20 72 41 20 3d 20 73 71 6c 69 74 65 33      rA = sqlite3
a100: 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28 70 49  VdbeRealValue(pI
a110: 6e 31 29 3b 0a 20 20 20 20 72 42 20 3d 20 73 71  n1);.    rB = sq
a120: 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56 61 6c  lite3VdbeRealVal
a130: 75 65 28 70 49 6e 32 29 3b 0a 20 20 20 20 73 77  ue(pIn2);.    sw
a140: 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  itch( pOp->opcod
a150: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
a160: 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20 20 20  OP_Add:         
a170: 72 42 20 2b 3d 20 72 41 3b 20 20 20 20 20 20 20  rB += rA;       
a180: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a190: 65 20 4f 50 5f 53 75 62 74 72 61 63 74 3a 20 20  e OP_Subtract:  
a1a0: 20 20 72 42 20 2d 3d 20 72 41 3b 20 20 20 20 20    rB -= rA;     
a1b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a1c0: 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a  ase OP_Multiply:
a1d0: 20 20 20 20 72 42 20 2a 3d 20 72 41 3b 20 20 20      rB *= rA;   
a1e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a1f0: 20 63 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a   case OP_Divide:
a200: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 28 64   {.        /* (d
a210: 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20  ouble)0 In case 
a220: 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  of SQLITE_OMIT_F
a230: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e  LOATING_POINT...
a240: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
a250: 72 41 3d 3d 28 64 6f 75 62 6c 65 29 30 20 29 20  rA==(double)0 ) 
a260: 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f  goto arithmetic_
a270: 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a  result_is_null;.
a280: 20 20 20 20 20 20 20 20 72 42 20 2f 3d 20 72 41          rB /= rA
a290: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
a2a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
a2b0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
a2c0: 20 20 69 41 20 3d 20 28 69 36 34 29 72 41 3b 0a    iA = (i64)rA;.
a2d0: 20 20 20 20 20 20 20 20 69 42 20 3d 20 28 69 36          iB = (i6
a2e0: 34 29 72 42 3b 0a 20 20 20 20 20 20 20 20 69 66  4)rB;.        if
a2f0: 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61  ( iA==0 ) goto a
a300: 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74  rithmetic_result
a310: 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20  _is_null;.      
a320: 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 29 20 69    if( iA==-1 ) i
a330: 41 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  A = 1;.        r
a340: 42 20 3d 20 28 64 6f 75 62 6c 65 29 28 69 42 20  B = (double)(iB 
a350: 25 20 69 41 29 3b 0a 20 20 20 20 20 20 20 20 62  % iA);.        b
a360: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
a370: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
a380: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
a390: 50 4f 49 4e 54 0a 20 20 20 20 70 4f 75 74 2d 3e  POINT.    pOut->
a3a0: 75 2e 69 20 3d 20 72 42 3b 0a 20 20 20 20 4d 65  u.i = rB;.    Me
a3b0: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
a3c0: 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 23 65 6c  t, MEM_Int);.#el
a3d0: 73 65 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  se.    if( sqlit
a3e0: 65 33 49 73 4e 61 4e 28 72 42 29 20 29 7b 0a 20  e3IsNaN(rB) ){. 
a3f0: 20 20 20 20 20 67 6f 74 6f 20 61 72 69 74 68 6d       goto arithm
a400: 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e  etic_result_is_n
a410: 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ull;.    }.    p
a420: 4f 75 74 2d 3e 72 20 3d 20 72 42 3b 0a 20 20 20  Out->r = rB;.   
a430: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
a440: 70 4f 75 74 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b  pOut, MEM_Real);
a450: 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
a460: 26 20 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20 29  & MEM_Real)==0 )
a470: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
a480: 64 62 65 49 6e 74 65 67 65 72 41 66 66 69 6e 69  dbeIntegerAffini
a490: 74 79 28 70 4f 75 74 29 3b 0a 20 20 20 20 7d 0a  ty(pOut);.    }.
a4a0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 62 72 65  #endif.  }.  bre
a4b0: 61 6b 3b 0a 0a 61 72 69 74 68 6d 65 74 69 63 5f  ak;..arithmetic_
a4c0: 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3a 0a  result_is_null:.
a4d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
a4e0: 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
a4f0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
a500: 63 6f 64 65 3a 20 43 6f 6c 6c 53 65 71 20 50 31  code: CollSeq P1
a510: 20 2a 20 2a 20 50 34 0a 2a 2a 0a 2a 2a 20 50 34   * * P4.**.** P4
a520: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
a530: 20 61 20 43 6f 6c 6c 53 65 71 20 73 74 72 75 63   a CollSeq struc
a540: 74 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 63  t. If the next c
a550: 61 6c 6c 20 74 6f 20 61 20 75 73 65 72 20 66 75  all to a user fu
a560: 6e 63 74 69 6f 6e 0a 2a 2a 20 6f 72 20 61 67 67  nction.** or agg
a570: 72 65 67 61 74 65 20 63 61 6c 6c 73 20 73 71 6c  regate calls sql
a580: 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53  ite3GetFuncCollS
a590: 65 71 28 29 2c 20 74 68 69 73 20 63 6f 6c 6c 61  eq(), this colla
a5a0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
a5b0: 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72 6e 65  ll.** be returne
a5c0: 64 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  d. This is used 
a5d0: 62 79 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  by the built-in 
a5e0: 6d 69 6e 28 29 2c 20 6d 61 78 28 29 20 61 6e 64  min(), max() and
a5f0: 20 6e 75 6c 6c 69 66 28 29 0a 2a 2a 20 66 75 6e   nullif().** fun
a600: 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ctions..**.** If
a610: 20 50 31 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c   P1 is not zero,
a620: 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65   then it is a re
a630: 67 69 73 74 65 72 20 74 68 61 74 20 61 20 73 75  gister that a su
a640: 62 73 65 71 75 65 6e 74 20 6d 69 6e 28 29 20 6f  bsequent min() o
a650: 72 0a 2a 2a 20 6d 61 78 28 29 20 61 67 67 72 65  r.** max() aggre
a660: 67 61 74 65 20 77 69 6c 6c 20 73 65 74 20 74 6f  gate will set to
a670: 20 31 20 69 66 20 74 68 65 20 63 75 72 72 65 6e   1 if the curren
a680: 74 20 72 6f 77 20 69 73 20 6e 6f 74 20 74 68 65  t row is not the
a690: 20 6d 69 6e 69 6d 75 6d 20 6f 72 0a 2a 2a 20 6d   minimum or.** m
a6a0: 61 78 69 6d 75 6d 2e 20 20 54 68 65 20 50 31 20  aximum.  The P1 
a6b0: 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74  register is init
a6c0: 69 61 6c 69 7a 65 64 20 74 6f 20 30 20 62 79 20  ialized to 0 by 
a6d0: 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
a6e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
a6f0: 72 66 61 63 65 20 75 73 65 64 20 62 79 20 74 68  rface used by th
a700: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
a710: 20 6f 66 20 74 68 65 20 61 66 6f 72 65 6d 65 6e   of the aforemen
a720: 74 69 6f 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  tioned functions
a730: 0a 2a 2a 20 74 6f 20 72 65 74 72 69 65 76 65 20  .** to retrieve 
a740: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
a750: 71 75 65 6e 63 65 20 73 65 74 20 62 79 20 74 68  quence set by th
a760: 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6e 6f 74  is opcode is not
a770: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 70 75   available.** pu
a780: 62 6c 69 63 6c 79 2c 20 6f 6e 6c 79 20 74 6f 20  blicly, only to 
a790: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 64  user functions d
a7a0: 65 66 69 6e 65 64 20 69 6e 20 66 75 6e 63 2e 63  efined in func.c
a7b0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6c  ..*/.case OP_Col
a7c0: 6c 53 65 71 3a 20 7b 0a 20 20 61 73 73 65 72 74  lSeq: {.  assert
a7d0: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
a7e0: 34 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 69  4_COLLSEQ );.  i
a7f0: 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20  f( pOp->p1 ){.  
a800: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
a810: 53 65 74 49 6e 74 36 34 28 26 61 4d 65 6d 5b 70  SetInt64(&aMem[p
a820: 4f 70 2d 3e 70 31 5d 2c 20 30 29 3b 0a 20 20 7d  Op->p1], 0);.  }
a830: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
a840: 4f 70 63 6f 64 65 3a 20 46 75 6e 63 74 69 6f 6e  Opcode: Function
a850: 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
a860: 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 61 20 75  **.** Invoke a u
a870: 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 50 34  ser function (P4
a880: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
a890: 20 61 20 46 75 6e 63 74 69 6f 6e 20 73 74 72 75   a Function stru
a8a0: 63 74 75 72 65 20 74 68 61 74 0a 2a 2a 20 64 65  cture that.** de
a8b0: 66 69 6e 65 73 20 74 68 65 20 66 75 6e 63 74 69  fines the functi
a8c0: 6f 6e 29 20 77 69 74 68 20 50 35 20 61 72 67 75  on) with P5 argu
a8d0: 6d 65 6e 74 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ments taken from
a8e0: 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 64   register P2 and
a8f0: 0a 2a 2a 20 73 75 63 63 65 73 73 6f 72 73 2e 20  .** successors. 
a900: 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   The result of t
a910: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  he function is s
a920: 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
a930: 72 20 50 33 2e 0a 2a 2a 20 52 65 67 69 73 74 65  r P3..** Registe
a940: 72 20 50 33 20 6d 75 73 74 20 6e 6f 74 20 62 65  r P3 must not be
a950: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 75 6e 63   one of the func
a960: 74 69 6f 6e 20 69 6e 70 75 74 73 2e 0a 2a 2a 0a  tion inputs..**.
a970: 2a 2a 20 50 31 20 69 73 20 61 20 33 32 2d 62 69  ** P1 is a 32-bi
a980: 74 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61  t bitmask indica
a990: 74 69 6e 67 20 77 68 65 74 68 65 72 20 6f 72 20  ting whether or 
a9a0: 6e 6f 74 20 65 61 63 68 20 61 72 67 75 6d 65 6e  not each argumen
a9b0: 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66 75 6e  t to the .** fun
a9c0: 63 74 69 6f 6e 20 77 61 73 20 64 65 74 65 72 6d  ction was determ
a9d0: 69 6e 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 74  ined to be const
a9e0: 61 6e 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  ant at compile t
a9f0: 69 6d 65 2e 20 49 66 20 74 68 65 20 66 69 72 73  ime. If the firs
aa00: 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 77 61  t.** argument wa
aa10: 73 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20  s constant then 
aa20: 62 69 74 20 30 20 6f 66 20 50 31 20 69 73 20 73  bit 0 of P1 is s
aa30: 65 74 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  et. This is used
aa40: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a   to determine.**
aa50: 20 77 68 65 74 68 65 72 20 6d 65 74 61 20 64 61   whether meta da
aa60: 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
aa70: 74 68 20 61 20 75 73 65 72 20 66 75 6e 63 74 69  th a user functi
aa80: 6f 6e 20 61 72 67 75 6d 65 6e 74 20 75 73 69 6e  on argument usin
aa90: 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  g the.** sqlite3
aaa0: 5f 73 65 74 5f 61 75 78 64 61 74 61 28 29 20 41  _set_auxdata() A
aab0: 50 49 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79  PI may be safely
aac0: 20 72 65 74 61 69 6e 65 64 20 75 6e 74 69 6c 20   retained until 
aad0: 74 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 76 6f  the next.** invo
aae0: 63 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 6f  cation of this o
aaf0: 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  pcode..**.** See
ab00: 20 61 6c 73 6f 3a 20 41 67 67 53 74 65 70 20 61   also: AggStep a
ab10: 6e 64 20 41 67 67 46 69 6e 61 6c 0a 2a 2f 0a 63  nd AggFinal.*/.c
ab20: 61 73 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 3a  ase OP_Function:
ab30: 20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65   {.  int i;.  Me
ab40: 6d 20 2a 70 41 72 67 3b 0a 20 20 73 71 6c 69 74  m *pArg;.  sqlit
ab50: 65 33 5f 63 6f 6e 74 65 78 74 20 63 74 78 3b 0a  e3_context ctx;.
ab60: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
ab70: 2a 2a 61 70 56 61 6c 3b 0a 20 20 69 6e 74 20 6e  **apVal;.  int n
ab80: 3b 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 35  ;..  n = pOp->p5
ab90: 3b 0a 20 20 61 70 56 61 6c 20 3d 20 70 2d 3e 61  ;.  apVal = p->a
aba0: 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
abb0: 61 70 56 61 6c 20 7c 7c 20 6e 3d 3d 30 20 29 3b  apVal || n==0 );
abc0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
abd0: 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c  p3>0 && pOp->p3<
abe0: 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 4f  =p->nMem );.  pO
abf0: 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
ac00: 70 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54  p3];.  memAboutT
ac10: 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29  oChange(p, pOut)
ac20: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  ;..  assert( n==
ac30: 30 20 7c 7c 20 28 70 4f 70 2d 3e 70 32 3e 30 20  0 || (pOp->p2>0 
ac40: 26 26 20 70 4f 70 2d 3e 70 32 2b 6e 3c 3d 70 2d  && pOp->p2+n<=p-
ac50: 3e 6e 4d 65 6d 2b 31 29 20 29 3b 0a 20 20 61 73  >nMem+1) );.  as
ac60: 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f  sert( pOp->p3<pO
ac70: 70 2d 3e 70 32 20 7c 7c 20 70 4f 70 2d 3e 70 33  p->p2 || pOp->p3
ac80: 3e 3d 70 4f 70 2d 3e 70 32 2b 6e 20 29 3b 0a 20  >=pOp->p2+n );. 
ac90: 20 70 41 72 67 20 3d 20 26 61 4d 65 6d 5b 70 4f   pArg = &aMem[pO
aca0: 70 2d 3e 70 32 5d 3b 0a 20 20 66 6f 72 28 69 3d  p->p2];.  for(i=
acb0: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 41 72  0; i<n; i++, pAr
acc0: 67 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  g++){.    assert
acd0: 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 41 72  ( memIsValid(pAr
ace0: 67 29 20 29 3b 0a 20 20 20 20 61 70 56 61 6c 5b  g) );.    apVal[
acf0: 69 5d 20 3d 20 70 41 72 67 3b 0a 20 20 20 20 44  i] = pArg;.    D
ad00: 65 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 70 41  eephemeralize(pA
ad10: 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
ad20: 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65  VdbeMemStoreType
ad30: 28 70 41 72 67 29 3b 0a 20 20 20 20 52 45 47 49  (pArg);.    REGI
ad40: 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
ad50: 70 32 2b 69 2c 20 70 41 72 67 29 3b 0a 20 20 7d  p2+i, pArg);.  }
ad60: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
ad70: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43  >p4type==P4_FUNC
ad80: 44 45 46 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79  DEF || pOp->p4ty
ad90: 70 65 3d 3d 50 34 5f 56 44 42 45 46 55 4e 43 20  pe==P4_VDBEFUNC 
ada0: 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34  );.  if( pOp->p4
adb0: 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43 44 45 46  type==P4_FUNCDEF
adc0: 20 29 7b 0a 20 20 20 20 63 74 78 2e 70 46 75 6e   ){.    ctx.pFun
add0: 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  c = pOp->p4.pFun
ade0: 63 3b 0a 20 20 20 20 63 74 78 2e 70 56 64 62 65  c;.    ctx.pVdbe
adf0: 46 75 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Func = 0;.  }els
ae00: 65 7b 0a 20 20 20 20 63 74 78 2e 70 56 64 62 65  e{.    ctx.pVdbe
ae10: 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63  Func = (VdbeFunc
ae20: 2a 29 70 4f 70 2d 3e 70 34 2e 70 56 64 62 65 46  *)pOp->p4.pVdbeF
ae30: 75 6e 63 3b 0a 20 20 20 20 63 74 78 2e 70 46 75  unc;.    ctx.pFu
ae40: 6e 63 20 3d 20 63 74 78 2e 70 56 64 62 65 46 75  nc = ctx.pVdbeFu
ae50: 6e 63 2d 3e 70 46 75 6e 63 3b 0a 20 20 7d 0a 0a  nc->pFunc;.  }..
ae60: 20 20 63 74 78 2e 73 2e 66 6c 61 67 73 20 3d 20    ctx.s.flags = 
ae70: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 63 74 78 2e  MEM_Null;.  ctx.
ae80: 73 2e 64 62 20 3d 20 64 62 3b 0a 20 20 63 74 78  s.db = db;.  ctx
ae90: 2e 73 2e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 63  .s.xDel = 0;.  c
aea0: 74 78 2e 73 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30  tx.s.zMalloc = 0
aeb0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6f 75 74 70  ;..  /* The outp
aec0: 75 74 20 63 65 6c 6c 20 6d 61 79 20 61 6c 72 65  ut cell may alre
aed0: 61 64 79 20 68 61 76 65 20 61 20 62 75 66 66 65  ady have a buffe
aee0: 72 20 61 6c 6c 6f 63 61 74 65 64 2e 20 4d 6f 76  r allocated. Mov
aef0: 65 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  e.  ** the point
af00: 65 72 20 74 6f 20 63 74 78 2e 73 20 73 6f 20 69  er to ctx.s so i
af10: 6e 20 63 61 73 65 20 74 68 65 20 75 73 65 72 2d  n case the user-
af20: 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 75 73 65  function can use
af30: 0a 20 20 2a 2a 20 74 68 65 20 61 6c 72 65 61 64  .  ** the alread
af40: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  y allocated buff
af50: 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6c  er instead of al
af60: 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 6f  locating a new o
af70: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ne..  */.  sqlit
af80: 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 26 63  e3VdbeMemMove(&c
af90: 74 78 2e 73 2c 20 70 4f 75 74 29 3b 0a 20 20 4d  tx.s, pOut);.  M
afa0: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 26 63  emSetTypeFlag(&c
afb0: 74 78 2e 73 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  tx.s, MEM_Null);
afc0: 0a 0a 20 20 63 74 78 2e 69 73 45 72 72 6f 72 20  ..  ctx.isError 
afd0: 3d 20 30 3b 0a 20 20 69 66 28 20 63 74 78 2e 70  = 0;.  if( ctx.p
afe0: 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26 20 53 51  Func->flags & SQ
aff0: 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
b000: 4c 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  LL ){.    assert
b010: 28 20 70 4f 70 3e 61 4f 70 20 29 3b 0a 20 20 20  ( pOp>aOp );.   
b020: 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
b030: 2e 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c  .p4type==P4_COLL
b040: 53 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  SEQ );.    asser
b050: 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64  t( pOp[-1].opcod
b060: 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71 20 29 3b  e==OP_CollSeq );
b070: 0a 20 20 20 20 63 74 78 2e 70 43 6f 6c 6c 20 3d  .    ctx.pColl =
b080: 20 70 4f 70 5b 2d 31 5d 2e 70 34 2e 70 43 6f 6c   pOp[-1].p4.pCol
b090: 6c 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c 61 73  l;.  }.  db->las
b0a0: 74 52 6f 77 69 64 20 3d 20 6c 61 73 74 52 6f 77  tRowid = lastRow
b0b0: 69 64 3b 0a 20 20 28 2a 63 74 78 2e 70 46 75 6e  id;.  (*ctx.pFun
b0c0: 63 2d 3e 78 46 75 6e 63 29 28 26 63 74 78 2c 20  c->xFunc)(&ctx, 
b0d0: 6e 2c 20 61 70 56 61 6c 29 3b 20 2f 2a 20 49 4d  n, apVal); /* IM
b0e0: 50 3a 20 52 2d 32 34 35 30 35 2d 32 33 32 33 30  P: R-24505-23230
b0f0: 20 2a 2f 0a 20 20 6c 61 73 74 52 6f 77 69 64 20   */.  lastRowid 
b100: 3d 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b  = db->lastRowid;
b110: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 61 75  ..  /* If any au
b120: 78 69 6c 69 61 72 79 20 64 61 74 61 20 66 75 6e  xiliary data fun
b130: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
b140: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 69 73 20   called by this 
b150: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2c 0a 20  user function,. 
b160: 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   ** immediately 
b170: 63 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63  call the destruc
b180: 74 6f 72 20 66 6f 72 20 61 6e 79 20 6e 6f 6e 2d  tor for any non-
b190: 73 74 61 74 69 63 20 76 61 6c 75 65 73 2e 0a 20  static values.. 
b1a0: 20 2a 2f 0a 20 20 69 66 28 20 63 74 78 2e 70 56   */.  if( ctx.pV
b1b0: 64 62 65 46 75 6e 63 20 29 7b 0a 20 20 20 20 73  dbeFunc ){.    s
b1c0: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
b1d0: 41 75 78 44 61 74 61 28 63 74 78 2e 70 56 64 62  AuxData(ctx.pVdb
b1e0: 65 46 75 6e 63 2c 20 70 4f 70 2d 3e 70 31 29 3b  eFunc, pOp->p1);
b1f0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 56 64  .    pOp->p4.pVd
b200: 62 65 46 75 6e 63 20 3d 20 63 74 78 2e 70 56 64  beFunc = ctx.pVd
b210: 62 65 46 75 6e 63 3b 0a 20 20 20 20 70 4f 70 2d  beFunc;.    pOp-
b220: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56 44 42  >p4type = P4_VDB
b230: 45 46 55 4e 43 3b 0a 20 20 7d 0a 0a 20 20 69 66  EFUNC;.  }..  if
b240: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
b250: 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 45 76 65  ed ){.    /* Eve
b260: 6e 20 74 68 6f 75 67 68 20 61 20 6d 61 6c 6c 6f  n though a mallo
b270: 63 28 29 20 68 61 73 20 66 61 69 6c 65 64 2c 20  c() has failed, 
b280: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
b290: 6f 6e 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  on of the.    **
b2a0: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 6d   user function m
b2b0: 61 79 20 68 61 76 65 20 63 61 6c 6c 65 64 20 61  ay have called a
b2c0: 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  n sqlite3_result
b2d0: 5f 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 0a  _XXX() function.
b2e0: 20 20 20 20 2a 2a 20 74 6f 20 72 65 74 75 72 6e      ** to return
b2f0: 20 61 20 76 61 6c 75 65 2e 20 54 68 65 20 66 6f   a value. The fo
b300: 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 72 65 6c  llowing call rel
b310: 65 61 73 65 73 20 61 6e 79 20 72 65 73 6f 75 72  eases any resour
b320: 63 65 73 0a 20 20 20 20 2a 2a 20 61 73 73 6f 63  ces.    ** assoc
b330: 69 61 74 65 64 20 77 69 74 68 20 73 75 63 68 20  iated with such 
b340: 61 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a  a value..    */.
b350: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
b360: 65 6d 52 65 6c 65 61 73 65 28 26 63 74 78 2e 73  emRelease(&ctx.s
b370: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  );.    goto no_m
b380: 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  em;.  }..  /* If
b390: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65   the function re
b3a0: 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 2c  turned an error,
b3b0: 20 74 68 72 6f 77 20 61 6e 20 65 78 63 65 70 74   throw an except
b3c0: 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 63 74 78  ion */.  if( ctx
b3d0: 2e 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  .isError ){.    
b3e0: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
b3f0: 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
b400: 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  , "%s", sqlite3_
b410: 76 61 6c 75 65 5f 74 65 78 74 28 26 63 74 78 2e  value_text(&ctx.
b420: 73 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 74  s));.    rc = ct
b430: 78 2e 69 73 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a  x.isError;.  }..
b440: 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 65    /* Copy the re
b450: 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63  sult of the func
b460: 74 69 6f 6e 20 69 6e 74 6f 20 72 65 67 69 73 74  tion into regist
b470: 65 72 20 50 33 20 2a 2f 0a 20 20 73 71 6c 69 74  er P3 */.  sqlit
b480: 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f  e3VdbeChangeEnco
b490: 64 69 6e 67 28 26 63 74 78 2e 73 2c 20 65 6e 63  ding(&ctx.s, enc
b4a0: 6f 64 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  oding);.  sqlite
b4b0: 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 70 4f 75  3VdbeMemMove(pOu
b4c0: 74 2c 20 26 63 74 78 2e 73 29 3b 0a 20 20 69 66  t, &ctx.s);.  if
b4d0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
b4e0: 54 6f 6f 42 69 67 28 70 4f 75 74 29 20 29 7b 0a  TooBig(pOut) ){.
b4f0: 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67      goto too_big
b500: 3b 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 2f  ;.  }..#if 0.  /
b510: 2a 20 54 68 65 20 61 70 70 2d 64 65 66 69 6e 65  * The app-define
b520: 64 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 64  d function has d
b530: 6f 6e 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68  one something th
b540: 61 74 20 61 73 20 63 61 75 73 65 64 20 74 68 69  at as caused thi
b550: 73 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  s.  ** statement
b560: 20 74 6f 20 65 78 70 69 72 65 2e 20 20 28 50 65   to expire.  (Pe
b570: 72 68 61 70 73 20 74 68 65 20 66 75 6e 63 74 69  rhaps the functi
b580: 6f 6e 20 63 61 6c 6c 65 64 20 73 71 6c 69 74 65  on called sqlite
b590: 33 5f 65 78 65 63 28 29 0a 20 20 2a 2a 20 77 69  3_exec().  ** wi
b5a0: 74 68 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  th a CREATE TABL
b5b0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 29 0a 20 20  E statement.).  
b5c0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 69  */.  if( p->expi
b5d0: 72 65 64 20 29 20 72 63 20 3d 20 53 51 4c 49 54  red ) rc = SQLIT
b5e0: 45 5f 41 42 4f 52 54 3b 0a 23 65 6e 64 69 66 0a  E_ABORT;.#endif.
b5f0: 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
b600: 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4f 75 74 29  E(pOp->p3, pOut)
b610: 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
b620: 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20  LOBSIZE(pOut);. 
b630: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
b640: 63 6f 64 65 3a 20 42 69 74 41 6e 64 20 50 31 20  code: BitAnd P1 
b650: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
b660: 54 61 6b 65 20 74 68 65 20 62 69 74 2d 77 69 73  Take the bit-wis
b670: 65 20 41 4e 44 20 6f 66 20 74 68 65 20 76 61 6c  e AND of the val
b680: 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  ues in register 
b690: 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a  P1 and P2 and.**
b6a0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
b6b0: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  t in register P3
b6c0: 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69  ..** If either i
b6d0: 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  nput is NULL, th
b6e0: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
b6f0: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
b700: 42 69 74 4f 72 20 50 31 20 50 32 20 50 33 20 2a  BitOr P1 P2 P3 *
b710: 20 2a 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68   *.**.** Take th
b720: 65 20 62 69 74 2d 77 69 73 65 20 4f 52 20 6f 66  e bit-wise OR of
b730: 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72   the values in r
b740: 65 67 69 73 74 65 72 20 50 31 20 61 6e 64 20 50  egister P1 and P
b750: 32 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74  2 and.** store t
b760: 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  he result in reg
b770: 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20  ister P3..** If 
b780: 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20  either input is 
b790: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74  NULL, the result
b7a0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20   is NULL..*/./* 
b7b0: 4f 70 63 6f 64 65 3a 20 53 68 69 66 74 4c 65 66  Opcode: ShiftLef
b7c0: 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  t P1 P2 P3 * *.*
b7d0: 2a 0a 2a 2a 20 53 68 69 66 74 20 74 68 65 20 69  *.** Shift the i
b7e0: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69 6e 20  nteger value in 
b7f0: 72 65 67 69 73 74 65 72 20 50 32 20 74 6f 20 74  register P2 to t
b800: 68 65 20 6c 65 66 74 20 62 79 20 74 68 65 0a 2a  he left by the.*
b810: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  * number of bits
b820: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
b830: 65 20 69 6e 74 65 67 65 72 20 69 6e 20 72 65 67  e integer in reg
b840: 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20 53 74 6f  ister P1..** Sto
b850: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
b860: 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
b870: 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74   If either input
b880: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   is NULL, the re
b890: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  sult is NULL..*/
b8a0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68 69 66  ./* Opcode: Shif
b8b0: 74 52 69 67 68 74 20 50 31 20 50 32 20 50 33 20  tRight P1 P2 P3 
b8c0: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74 20  * *.**.** Shift 
b8d0: 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
b8e0: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
b8f0: 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 62 79   to the right by
b900: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
b910: 66 20 62 69 74 73 20 73 70 65 63 69 66 69 65 64  f bits specified
b920: 20 62 79 20 74 68 65 20 69 6e 74 65 67 65 72 20   by the integer 
b930: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a  in register P1..
b940: 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  ** Store the res
b950: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ult in register 
b960: 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  P3..** If either
b970: 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20   input is NULL, 
b980: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
b990: 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42  LL..*/.case OP_B
b9a0: 69 74 41 6e 64 3a 20 20 20 20 20 20 20 20 20 20  itAnd:          
b9b0: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
b9c0: 73 20 54 4b 5f 42 49 54 41 4e 44 2c 20 69 6e 31  s TK_BITAND, in1
b9d0: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63  , in2, out3 */.c
b9e0: 61 73 65 20 4f 50 5f 42 69 74 4f 72 3a 20 20 20  ase OP_BitOr:   
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba00: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54  * same as TK_BIT
ba10: 4f 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  OR, in1, in2, ou
ba20: 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 68  t3 */.case OP_Sh
ba30: 69 66 74 4c 65 66 74 3a 20 20 20 20 20 20 20 20  iftLeft:        
ba40: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
ba50: 20 54 4b 5f 4c 53 48 49 46 54 2c 20 69 6e 31 2c   TK_LSHIFT, in1,
ba60: 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61   in2, out3 */.ca
ba70: 73 65 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74  se OP_ShiftRight
ba80: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  : {           /*
ba90: 20 73 61 6d 65 20 61 73 20 54 4b 5f 52 53 48 49   same as TK_RSHI
baa0: 46 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  FT, in1, in2, ou
bab0: 74 33 20 2a 2f 0a 20 20 69 36 34 20 69 41 3b 0a  t3 */.  i64 iA;.
bac0: 20 20 75 36 34 20 75 41 3b 0a 20 20 69 36 34 20    u64 uA;.  i64 
bad0: 69 42 3b 0a 20 20 75 38 20 6f 70 3b 0a 0a 20 20  iB;.  u8 op;..  
bae0: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
baf0: 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20  ->p1];.  pIn2 = 
bb00: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
bb10: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
bb20: 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 28  Op->p3];.  if( (
bb30: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49  pIn1->flags | pI
bb40: 6e 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d  n2->flags) & MEM
bb50: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c  _Null ){.    sql
bb60: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
bb70: 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20 62 72  ll(pOut);.    br
bb80: 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 41 20 3d 20  eak;.  }.  iA = 
bb90: 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
bba0: 6c 75 65 28 70 49 6e 32 29 3b 0a 20 20 69 42 20  lue(pIn2);.  iB 
bbb0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74  = sqlite3VdbeInt
bbc0: 56 61 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 6f  Value(pIn1);.  o
bbd0: 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b  p = pOp->opcode;
bbe0: 0a 20 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 42 69  .  if( op==OP_Bi
bbf0: 74 41 6e 64 20 29 7b 0a 20 20 20 20 69 41 20 26  tAnd ){.    iA &
bc00: 3d 20 69 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = iB;.  }else if
bc10: 28 20 6f 70 3d 3d 4f 50 5f 42 69 74 4f 72 20 29  ( op==OP_BitOr )
bc20: 7b 0a 20 20 20 20 69 41 20 7c 3d 20 69 42 3b 0a  {.    iA |= iB;.
bc30: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 42 21 3d    }else if( iB!=
bc40: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
bc50: 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67   op==OP_ShiftRig
bc60: 68 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68 69  ht || op==OP_Shi
bc70: 66 74 4c 65 66 74 20 29 3b 0a 0a 20 20 20 20 2f  ftLeft );..    /
bc80: 2a 20 49 66 20 73 68 69 66 74 69 6e 67 20 62 79  * If shifting by
bc90: 20 61 20 6e 65 67 61 74 69 76 65 20 61 6d 6f 75   a negative amou
bca0: 6e 74 2c 20 73 68 69 66 74 20 69 6e 20 74 68 65  nt, shift in the
bcb0: 20 6f 74 68 65 72 20 64 69 72 65 63 74 69 6f 6e   other direction
bcc0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 42 3c 30   */.    if( iB<0
bcd0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
bce0: 28 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74 3d  ( OP_ShiftRight=
bcf0: 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 2b 31 20  =OP_ShiftLeft+1 
bd00: 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 32 2a  );.      op = 2*
bd10: 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 2b 20 31  OP_ShiftLeft + 1
bd20: 20 2d 20 6f 70 3b 0a 20 20 20 20 20 20 69 42 20   - op;.      iB 
bd30: 3d 20 69 42 3e 28 2d 36 34 29 20 3f 20 2d 69 42  = iB>(-64) ? -iB
bd40: 20 3a 20 36 34 3b 0a 20 20 20 20 7d 0a 0a 20 20   : 64;.    }..  
bd50: 20 20 69 66 28 20 69 42 3e 3d 36 34 20 29 7b 0a    if( iB>=64 ){.
bd60: 20 20 20 20 20 20 69 41 20 3d 20 28 69 41 3e 3d        iA = (iA>=
bd70: 30 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68 69 66  0 || op==OP_Shif
bd80: 74 4c 65 66 74 29 20 3f 20 30 20 3a 20 2d 31 3b  tLeft) ? 0 : -1;
bd90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
bda0: 20 20 6d 65 6d 63 70 79 28 26 75 41 2c 20 26 69    memcpy(&uA, &i
bdb0: 41 2c 20 73 69 7a 65 6f 66 28 75 41 29 29 3b 0a  A, sizeof(uA));.
bdc0: 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 4f 50        if( op==OP
bdd0: 5f 53 68 69 66 74 4c 65 66 74 20 29 7b 0a 20 20  _ShiftLeft ){.  
bde0: 20 20 20 20 20 20 75 41 20 3c 3c 3d 20 69 42 3b        uA <<= iB;
bdf0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
be00: 20 20 20 20 20 20 75 41 20 3e 3e 3d 20 69 42 3b        uA >>= iB;
be10: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 67 6e  .        /* Sign
be20: 2d 65 78 74 65 6e 64 20 6f 6e 20 61 20 72 69 67  -extend on a rig
be30: 68 74 20 73 68 69 66 74 20 6f 66 20 61 20 6e 65  ht shift of a ne
be40: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 2a 2f  gative number */
be50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3c  .        if( iA<
be60: 30 20 29 20 75 41 20 7c 3d 20 28 28 28 28 75 36  0 ) uA |= ((((u6
be70: 34 29 30 78 66 66 66 66 66 66 66 66 29 3c 3c 33  4)0xffffffff)<<3
be80: 32 29 7c 30 78 66 66 66 66 66 66 66 66 29 20 3c  2)|0xffffffff) <
be90: 3c 20 28 36 34 2d 69 42 29 3b 0a 20 20 20 20 20  < (64-iB);.     
bea0: 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28   }.      memcpy(
beb0: 26 69 41 2c 20 26 75 41 2c 20 73 69 7a 65 6f 66  &iA, &uA, sizeof
bec0: 28 69 41 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (iA));.    }.  }
bed0: 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69  .  pOut->u.i = i
bee0: 41 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46  A;.  MemSetTypeF
bef0: 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e  lag(pOut, MEM_In
bf00: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
bf10: 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 64 64 49 6d  /* Opcode: AddIm
bf20: 6d 20 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  m  P1 P2 * * *.*
bf30: 2a 20 0a 2a 2a 20 41 64 64 20 74 68 65 20 63 6f  * .** Add the co
bf40: 6e 73 74 61 6e 74 20 50 32 20 74 6f 20 74 68 65  nstant P2 to the
bf50: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
bf60: 65 72 20 50 31 2e 0a 2a 2a 20 54 68 65 20 72 65  er P1..** The re
bf70: 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73 20 61  sult is always a
bf80: 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  n integer..**.**
bf90: 20 54 6f 20 66 6f 72 63 65 20 61 6e 79 20 72 65   To force any re
bfa0: 67 69 73 74 65 72 20 74 6f 20 62 65 20 61 6e 20  gister to be an 
bfb0: 69 6e 74 65 67 65 72 2c 20 6a 75 73 74 20 61 64  integer, just ad
bfc0: 64 20 30 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  d 0..*/.case OP_
bfd0: 41 64 64 49 6d 6d 3a 20 7b 20 20 20 20 20 20 20  AddImm: {       
bfe0: 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20       /* in1 */. 
bff0: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
c000: 70 2d 3e 70 31 5d 3b 0a 20 20 6d 65 6d 41 62 6f  p->p1];.  memAbo
c010: 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 49  utToChange(p, pI
c020: 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  n1);.  sqlite3Vd
c030: 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28  beMemIntegerify(
c040: 70 49 6e 31 29 3b 0a 20 20 70 49 6e 31 2d 3e 75  pIn1);.  pIn1->u
c050: 2e 69 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  .i += pOp->p2;. 
c060: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
c070: 63 6f 64 65 3a 20 4d 75 73 74 42 65 49 6e 74 20  code: MustBeInt 
c080: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 0a  P1 P2 * * *.** .
c090: 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c  ** Force the val
c0a0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
c0b0: 31 20 74 6f 20 62 65 20 61 6e 20 69 6e 74 65 67  1 to be an integ
c0c0: 65 72 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75  er.  If the valu
c0d0: 65 0a 2a 2a 20 69 6e 20 50 31 20 69 73 20 6e 6f  e.** in P1 is no
c0e0: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64  t an integer and
c0f0: 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65   cannot be conve
c100: 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 74  rted into an int
c110: 65 67 65 72 0a 2a 2a 20 77 69 74 68 6f 75 74 20  eger.** without 
c120: 64 61 74 61 20 6c 6f 73 73 2c 20 74 68 65 6e 20  data loss, then 
c130: 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
c140: 20 74 6f 20 50 32 2c 20 6f 72 20 69 66 20 50 32   to P2, or if P2
c150: 3d 3d 30 0a 2a 2a 20 72 61 69 73 65 20 61 6e 20  ==0.** raise an 
c160: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20  SQLITE_MISMATCH 
c170: 65 78 63 65 70 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  exception..*/.ca
c180: 73 65 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 3a  se OP_MustBeInt:
c190: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {            /*
c1a0: 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20   jump, in1 */.  
c1b0: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
c1c0: 2d 3e 70 31 5d 3b 0a 20 20 61 70 70 6c 79 41 66  ->p1];.  applyAf
c1d0: 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 53 51 4c  finity(pIn1, SQL
c1e0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c  ITE_AFF_NUMERIC,
c1f0: 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 69 66   encoding);.  if
c200: 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
c210: 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a   MEM_Int)==0 ){.
c220: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d      if( pOp->p2=
c230: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
c240: 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48   SQLITE_MISMATCH
c250: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f  ;.      goto abo
c260: 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
c270: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c280: 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
c290: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
c2a0: 65 7b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70  e{.    MemSetTyp
c2b0: 65 46 6c 61 67 28 70 49 6e 31 2c 20 4d 45 4d 5f  eFlag(pIn1, MEM_
c2c0: 49 6e 74 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  Int);.  }.  brea
c2d0: 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  k;.}..#ifndef SQ
c2e0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
c2f0: 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 20 4f 70 63 6f  NG_POINT./* Opco
c300: 64 65 3a 20 52 65 61 6c 41 66 66 69 6e 69 74 79  de: RealAffinity
c310: 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
c320: 2a 20 49 66 20 72 65 67 69 73 74 65 72 20 50 31  * If register P1
c330: 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65 67 65   holds an intege
c340: 72 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f 20  r convert it to 
c350: 61 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a 2a 2a  a real value..**
c360: 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
c370: 69 73 20 75 73 65 64 20 77 68 65 6e 20 65 78 74  is used when ext
c380: 72 61 63 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74  racting informat
c390: 69 6f 6e 20 66 72 6f 6d 20 61 20 63 6f 6c 75 6d  ion from a colum
c3a0: 6e 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 52 45  n that.** has RE
c3b0: 41 4c 20 61 66 66 69 6e 69 74 79 2e 20 20 53 75  AL affinity.  Su
c3c0: 63 68 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73  ch column values
c3d0: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 73 74   may still be st
c3e0: 6f 72 65 64 20 61 73 0a 2a 2a 20 69 6e 74 65 67  ored as.** integ
c3f0: 65 72 73 2c 20 66 6f 72 20 73 70 61 63 65 20 65  ers, for space e
c400: 66 66 69 63 69 65 6e 63 79 2c 20 62 75 74 20 61  fficiency, but a
c410: 66 74 65 72 20 65 78 74 72 61 63 74 69 6f 6e 20  fter extraction 
c420: 77 65 20 77 61 6e 74 20 74 68 65 6d 0a 2a 2a 20  we want them.** 
c430: 74 6f 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 72  to have only a r
c440: 65 61 6c 20 76 61 6c 75 65 2e 0a 2a 2f 0a 63 61  eal value..*/.ca
c450: 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  se OP_RealAffini
c460: 74 79 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ty: {           
c470: 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f         /* in1 */
c480: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
c490: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20  pOp->p1];.  if( 
c4a0: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
c4b0: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  M_Int ){.    sql
c4c0: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 61 6c 69  ite3VdbeMemReali
c4d0: 66 79 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20  fy(pIn1);.  }.  
c4e0: 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  break;.}.#endif.
c4f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c500: 4f 4d 49 54 5f 43 41 53 54 0a 2f 2a 20 4f 70 63  OMIT_CAST./* Opc
c510: 6f 64 65 3a 20 54 6f 54 65 78 74 20 50 31 20 2a  ode: ToText P1 *
c520: 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72   * * *.**.** For
c530: 63 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ce the value in 
c540: 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20 62  register P1 to b
c550: 65 20 74 65 78 74 2e 0a 2a 2a 20 49 66 20 74 68  e text..** If th
c560: 65 20 76 61 6c 75 65 20 69 73 20 6e 75 6d 65 72  e value is numer
c570: 69 63 2c 20 63 6f 6e 76 65 72 74 20 69 74 20 74  ic, convert it t
c580: 6f 20 61 20 73 74 72 69 6e 67 20 75 73 69 6e 67  o a string using
c590: 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65   the.** equivale
c5a0: 6e 74 20 6f 66 20 70 72 69 6e 74 66 28 29 2e 20  nt of printf(). 
c5b0: 20 42 6c 6f 62 20 76 61 6c 75 65 73 20 61 72 65   Blob values are
c5c0: 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 2a   unchanged and.*
c5d0: 2a 20 61 72 65 20 61 66 74 65 72 77 61 72 64 73  * are afterwards
c5e0: 20 73 69 6d 70 6c 79 20 69 6e 74 65 72 70 72 65   simply interpre
c5f0: 74 65 64 20 61 73 20 74 65 78 74 2e 0a 2a 2a 0a  ted as text..**.
c600: 2a 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20  ** A NULL value 
c610: 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 62  is not changed b
c620: 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  y this routine. 
c630: 20 49 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c   It remains NULL
c640: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f 54  ..*/.case OP_ToT
c650: 65 78 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ext: {          
c660: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
c670: 61 73 20 54 4b 5f 54 4f 5f 54 45 58 54 2c 20 69  as TK_TO_TEXT, i
c680: 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
c690: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
c6a0: 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
c6b0: 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20 20 69 66  e(p, pIn1);.  if
c6c0: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20  ( pIn1->flags & 
c6d0: 4d 45 4d 5f 4e 75 6c 6c 20 29 20 62 72 65 61 6b  MEM_Null ) break
c6e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d 5f  ;.  assert( MEM_
c6f0: 53 74 72 3d 3d 28 4d 45 4d 5f 42 6c 6f 62 3e 3e  Str==(MEM_Blob>>
c700: 33 29 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c  3) );.  pIn1->fl
c710: 61 67 73 20 7c 3d 20 28 70 49 6e 31 2d 3e 66 6c  ags |= (pIn1->fl
c720: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 29 3e 3e 33  ags&MEM_Blob)>>3
c730: 3b 0a 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74  ;.  applyAffinit
c740: 79 28 70 49 6e 31 2c 20 53 51 4c 49 54 45 5f 41  y(pIn1, SQLITE_A
c750: 46 46 5f 54 45 58 54 2c 20 65 6e 63 6f 64 69 6e  FF_TEXT, encodin
c760: 67 29 3b 0a 20 20 72 63 20 3d 20 45 78 70 61 6e  g);.  rc = Expan
c770: 64 42 6c 6f 62 28 70 49 6e 31 29 3b 0a 20 20 61  dBlob(pIn1);.  a
c780: 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61  ssert( pIn1->fla
c790: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 7c 7c 20  gs & MEM_Str || 
c7a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c7b0: 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67   );.  pIn1->flag
c7c0: 73 20 26 3d 20 7e 28 4d 45 4d 5f 49 6e 74 7c 4d  s &= ~(MEM_Int|M
c7d0: 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 42 6c 6f 62  EM_Real|MEM_Blob
c7e0: 7c 4d 45 4d 5f 5a 65 72 6f 29 3b 0a 20 20 55 50  |MEM_Zero);.  UP
c7f0: 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
c800: 45 28 70 49 6e 31 29 3b 0a 20 20 62 72 65 61 6b  E(pIn1);.  break
c810: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
c820: 54 6f 42 6c 6f 62 20 50 31 20 2a 20 2a 20 2a 20  ToBlob P1 * * * 
c830: 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20 74 68  *.**.** Force th
c840: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
c850: 74 65 72 20 50 31 20 74 6f 20 62 65 20 61 20 42  ter P1 to be a B
c860: 4c 4f 42 2e 0a 2a 2a 20 49 66 20 74 68 65 20 76  LOB..** If the v
c870: 61 6c 75 65 20 69 73 20 6e 75 6d 65 72 69 63 2c  alue is numeric,
c880: 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f 20 61   convert it to a
c890: 20 73 74 72 69 6e 67 20 66 69 72 73 74 2e 0a 2a   string first..*
c8a0: 2a 20 53 74 72 69 6e 67 73 20 61 72 65 20 73 69  * Strings are si
c8b0: 6d 70 6c 79 20 72 65 69 6e 74 65 72 70 72 65 74  mply reinterpret
c8c0: 65 64 20 61 73 20 62 6c 6f 62 73 20 77 69 74 68  ed as blobs with
c8d0: 20 6e 6f 20 63 68 61 6e 67 65 0a 2a 2a 20 74 6f   no change.** to
c8e0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
c8f0: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  data..**.** A NU
c900: 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20  LL value is not 
c910: 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20  changed by this 
c920: 72 6f 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d  routine.  It rem
c930: 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61  ains NULL..*/.ca
c940: 73 65 20 4f 50 5f 54 6f 42 6c 6f 62 3a 20 7b 20  se OP_ToBlob: { 
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c960: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 54   /* same as TK_T
c970: 4f 5f 42 4c 4f 42 2c 20 69 6e 31 20 2a 2f 0a 20  O_BLOB, in1 */. 
c980: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
c990: 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70 49  p->p1];.  if( pI
c9a0: 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
c9b0: 4e 75 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20  Null ) break;.  
c9c0: 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
c9d0: 20 26 20 4d 45 4d 5f 42 6c 6f 62 29 3d 3d 30 20   & MEM_Blob)==0 
c9e0: 29 7b 0a 20 20 20 20 61 70 70 6c 79 41 66 66 69  ){.    applyAffi
c9f0: 6e 69 74 79 28 70 49 6e 31 2c 20 53 51 4c 49 54  nity(pIn1, SQLIT
ca00: 45 5f 41 46 46 5f 54 45 58 54 2c 20 65 6e 63 6f  E_AFF_TEXT, enco
ca10: 64 69 6e 67 29 3b 0a 20 20 20 20 61 73 73 65 72  ding);.    asser
ca20: 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  t( pIn1->flags &
ca30: 20 4d 45 4d 5f 53 74 72 20 7c 7c 20 64 62 2d 3e   MEM_Str || db->
ca40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
ca50: 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
ca60: 61 67 28 70 49 6e 31 2c 20 4d 45 4d 5f 42 6c 6f  ag(pIn1, MEM_Blo
ca70: 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
ca80: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 3d 20   pIn1->flags &= 
ca90: 7e 28 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 26 7e  ~(MEM_TypeMask&~
caa0: 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 20 20 7d 0a 20  MEM_Blob);.  }. 
cab0: 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42   UPDATE_MAX_BLOB
cac0: 53 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20 62 72  SIZE(pIn1);.  br
cad0: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
cae0: 65 3a 20 54 6f 4e 75 6d 65 72 69 63 20 50 31 20  e: ToNumeric P1 
caf0: 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f  * * * *.**.** Fo
cb00: 72 63 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  rce the value in
cb10: 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20   register P1 to 
cb20: 62 65 20 6e 75 6d 65 72 69 63 20 28 65 69 74 68  be numeric (eith
cb30: 65 72 20 61 6e 0a 2a 2a 20 69 6e 74 65 67 65 72  er an.** integer
cb40: 20 6f 72 20 61 20 66 6c 6f 61 74 69 6e 67 2d 70   or a floating-p
cb50: 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 29 0a 2a 2a  oint number.).**
cb60: 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   If the value is
cb70: 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 2c 20 74   text or blob, t
cb80: 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 69 74  ry to convert it
cb90: 20 74 6f 20 61 6e 20 75 73 69 6e 67 20 74 68 65   to an using the
cba0: 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 6f  .** equivalent o
cbb0: 66 20 61 74 6f 69 28 29 20 6f 72 20 61 74 6f 66  f atoi() or atof
cbc0: 28 29 20 61 6e 64 20 73 74 6f 72 65 20 30 20 69  () and store 0 i
cbd0: 66 20 6e 6f 20 73 75 63 68 20 63 6f 6e 76 65 72  f no such conver
cbe0: 73 69 6f 6e 20 0a 2a 2a 20 69 73 20 70 6f 73 73  sion .** is poss
cbf0: 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  ible..**.** A NU
cc00: 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20  LL value is not 
cc10: 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20  changed by this 
cc20: 72 6f 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d  routine.  It rem
cc30: 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61  ains NULL..*/.ca
cc40: 73 65 20 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 3a  se OP_ToNumeric:
cc50: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
cc60: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
cc70: 4b 5f 54 4f 5f 4e 55 4d 45 52 49 43 2c 20 69 6e  K_TO_NUMERIC, in
cc80: 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61  1 */.  pIn1 = &a
cc90: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
cca0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e 75  sqlite3VdbeMemNu
ccb0: 6d 65 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20  merify(pIn1);.  
ccc0: 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
ccd0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
cce0: 41 53 54 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64  AST */../* Opcod
ccf0: 65 3a 20 54 6f 49 6e 74 20 50 31 20 2a 20 2a 20  e: ToInt P1 * * 
cd00: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20  * *.**.** Force 
cd10: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
cd20: 69 73 74 65 72 20 50 31 20 74 6f 20 62 65 20 61  ister P1 to be a
cd30: 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66 0a 2a  n integer.  If.*
cd40: 2a 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 63  * The value is c
cd50: 75 72 72 65 6e 74 6c 79 20 61 20 72 65 61 6c 20  urrently a real 
cd60: 6e 75 6d 62 65 72 2c 20 64 72 6f 70 20 69 74 73  number, drop its
cd70: 20 66 72 61 63 74 69 6f 6e 61 6c 20 70 61 72 74   fractional part
cd80: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75  ..** If the valu
cd90: 65 20 69 73 20 74 65 78 74 20 6f 72 20 62 6c 6f  e is text or blo
cda0: 62 2c 20 74 72 79 20 74 6f 20 63 6f 6e 76 65 72  b, try to conver
cdb0: 74 20 69 74 20 74 6f 20 61 6e 20 69 6e 74 65 67  t it to an integ
cdc0: 65 72 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20  er using the.** 
cdd0: 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 61 74  equivalent of at
cde0: 6f 69 28 29 20 61 6e 64 20 73 74 6f 72 65 20 30  oi() and store 0
cdf0: 20 69 66 20 6e 6f 20 73 75 63 68 20 63 6f 6e 76   if no such conv
ce00: 65 72 73 69 6f 6e 20 69 73 20 70 6f 73 73 69 62  ersion is possib
ce10: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c  le..**.** A NULL
ce20: 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 63 68   value is not ch
ce30: 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 72 6f  anged by this ro
ce40: 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d 61 69  utine.  It remai
ce50: 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65  ns NULL..*/.case
ce60: 20 4f 50 5f 54 6f 49 6e 74 3a 20 7b 20 20 20 20   OP_ToInt: {    
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ce80: 20 73 61 6d 65 20 61 73 20 54 4b 5f 54 4f 5f 49   same as TK_TO_I
ce90: 4e 54 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e  NT, in1 */.  pIn
cea0: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
ceb0: 31 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d  1];.  if( (pIn1-
cec0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
ced0: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  l)==0 ){.    sql
cee0: 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67  ite3VdbeMemInteg
cef0: 65 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 7d  erify(pIn1);.  }
cf00: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66  .  break;.}..#if
cf10: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
cf20: 5f 4f 4d 49 54 5f 43 41 53 54 29 20 26 26 20 21  _OMIT_CAST) && !
cf30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
cf40: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
cf50: 4e 54 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54  NT)./* Opcode: T
cf60: 6f 52 65 61 6c 20 50 31 20 2a 20 2a 20 2a 20 2a  oReal P1 * * * *
cf70: 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65  .**.** Force the
cf80: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
cf90: 65 72 20 50 31 20 74 6f 20 62 65 20 61 20 66 6c  er P1 to be a fl
cfa0: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d  oating point num
cfb0: 62 65 72 2e 0a 2a 2a 20 49 66 20 54 68 65 20 76  ber..** If The v
cfc0: 61 6c 75 65 20 69 73 20 63 75 72 72 65 6e 74 6c  alue is currentl
cfd0: 79 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 63 6f  y an integer, co
cfe0: 6e 76 65 72 74 20 69 74 2e 0a 2a 2a 20 49 66 20  nvert it..** If 
cff0: 74 68 65 20 76 61 6c 75 65 20 69 73 20 74 65 78  the value is tex
d000: 74 20 6f 72 20 62 6c 6f 62 2c 20 74 72 79 20 74  t or blob, try t
d010: 6f 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f 20  o convert it to 
d020: 61 6e 20 69 6e 74 65 67 65 72 20 75 73 69 6e 67  an integer using
d030: 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65   the.** equivale
d040: 6e 74 20 6f 66 20 61 74 6f 69 28 29 20 61 6e 64  nt of atoi() and
d050: 20 73 74 6f 72 65 20 30 2e 30 20 69 66 20 6e 6f   store 0.0 if no
d060: 20 73 75 63 68 20 63 6f 6e 76 65 72 73 69 6f 6e   such conversion
d070: 20 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a   is possible..**
d080: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65  .** A NULL value
d090: 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20   is not changed 
d0a0: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
d0b0: 20 20 49 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c    It remains NUL
d0c0: 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f  L..*/.case OP_To
d0d0: 52 65 61 6c 3a 20 7b 20 20 20 20 20 20 20 20 20  Real: {         
d0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
d0f0: 20 61 73 20 54 4b 5f 54 4f 5f 52 45 41 4c 2c 20   as TK_TO_REAL, 
d100: 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  in1 */.  pIn1 = 
d110: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
d120: 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
d130: 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20 20 69  ge(p, pIn1);.  i
d140: 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
d150: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
d160: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
d170: 65 4d 65 6d 52 65 61 6c 69 66 79 28 70 49 6e 31  eMemRealify(pIn1
d180: 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
d190: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
d1a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
d1b0: 5f 43 41 53 54 29 20 26 26 20 21 64 65 66 69 6e  _CAST) && !defin
d1c0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
d1d0: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 20 2a  LOATING_POINT) *
d1e0: 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 74  /../* Opcode: Lt
d1f0: 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
d200: 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  **.** Compare th
d210: 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69  e values in regi
d220: 73 74 65 72 20 50 31 20 61 6e 64 20 50 33 2e 20  ster P1 and P3. 
d230: 20 49 66 20 72 65 67 28 50 33 29 3c 72 65 67 28   If reg(P3)<reg(
d240: 50 31 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70  P1) then.** jump
d250: 20 74 6f 20 61 64 64 72 65 73 73 20 50 32 2e 20   to address P2. 
d260: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53   .**.** If the S
d270: 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
d280: 20 62 69 74 20 6f 66 20 50 35 20 69 73 20 73 65   bit of P5 is se
d290: 74 20 61 6e 64 20 65 69 74 68 65 72 20 72 65 67  t and either reg
d2a0: 28 50 31 29 20 6f 72 0a 2a 2a 20 72 65 67 28 50  (P1) or.** reg(P
d2b0: 33 29 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  3) is NULL then 
d2c0: 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 2e 20 20  take the jump.  
d2d0: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4a 55  If the SQLITE_JU
d2e0: 4d 50 49 46 4e 55 4c 4c 20 0a 2a 2a 20 62 69 74  MPIFNULL .** bit
d2f0: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 66   is clear then f
d300: 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 65  all through if e
d310: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
d320: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
d330: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b   SQLITE_AFF_MASK
d340: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 50 35 20 6d   portion of P5 m
d350: 75 73 74 20 62 65 20 61 6e 20 61 66 66 69 6e 69  ust be an affini
d360: 74 79 20 63 68 61 72 61 63 74 65 72 20 2d 0a 2a  ty character -.*
d370: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  * SQLITE_AFF_TEX
d380: 54 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  T, SQLITE_AFF_IN
d390: 54 45 47 45 52 2c 20 61 6e 64 20 73 6f 20 66 6f  TEGER, and so fo
d3a0: 72 74 68 2e 20 41 6e 20 61 74 74 65 6d 70 74 20  rth. An attempt 
d3b0: 69 73 20 6d 61 64 65 20 0a 2a 2a 20 74 6f 20 63  is made .** to c
d3c0: 6f 65 72 63 65 20 62 6f 74 68 20 69 6e 70 75 74  oerce both input
d3d0: 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  s according to t
d3e0: 68 69 73 20 61 66 66 69 6e 69 74 79 20 62 65 66  his affinity bef
d3f0: 6f 72 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 61  ore the.** compa
d400: 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 2e 20 49  rison is made. I
d410: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46  f the SQLITE_AFF
d420: 5f 4d 41 53 4b 20 69 73 20 30 78 30 30 2c 20 74  _MASK is 0x00, t
d430: 68 65 6e 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 61  hen numeric.** a
d440: 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 2e  ffinity is used.
d450: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61   Note that the a
d460: 66 66 69 6e 69 74 79 20 63 6f 6e 76 65 72 73 69  ffinity conversi
d470: 6f 6e 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  ons are stored.*
d480: 2a 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  * back into the 
d490: 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 73 20  input registers 
d4a0: 50 31 20 61 6e 64 20 50 33 2e 20 20 53 6f 20 74  P1 and P3.  So t
d4b0: 68 69 73 20 6f 70 63 6f 64 65 20 63 61 6e 20 63  his opcode can c
d4c0: 61 75 73 65 0a 2a 2a 20 70 65 72 73 69 73 74 65  ause.** persiste
d4d0: 6e 74 20 63 68 61 6e 67 65 73 20 74 6f 20 72 65  nt changes to re
d4e0: 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50  gisters P1 and P
d4f0: 33 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  3..**.** Once an
d500: 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 68 61  y conversions ha
d510: 76 65 20 74 61 6b 65 6e 20 70 6c 61 63 65 2c 20  ve taken place, 
d520: 61 6e 64 20 6e 65 69 74 68 65 72 20 76 61 6c 75  and neither valu
d530: 65 20 69 73 20 4e 55 4c 4c 2c 20 0a 2a 2a 20 74  e is NULL, .** t
d540: 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  he values are co
d550: 6d 70 61 72 65 64 2e 20 49 66 20 62 6f 74 68 20  mpared. If both 
d560: 76 61 6c 75 65 73 20 61 72 65 20 62 6c 6f 62 73  values are blobs
d570: 20 74 68 65 6e 20 6d 65 6d 63 6d 70 28 29 20 69   then memcmp() i
d580: 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 64 65 74  s.** used to det
d590: 65 72 6d 69 6e 65 20 74 68 65 20 72 65 73 75 6c  ermine the resul
d5a0: 74 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  ts of the compar
d5b0: 69 73 6f 6e 2e 20 20 49 66 20 62 6f 74 68 20 76  ison.  If both v
d5c0: 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 74 65 78  alues.** are tex
d5d0: 74 2c 20 74 68 65 6e 20 74 68 65 20 61 70 70 72  t, then the appr
d5e0: 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
d5f0: 67 20 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 69  g function speci
d600: 66 69 65 64 20 69 6e 0a 2a 2a 20 50 34 20 69 73  fied in.** P4 is
d610: 20 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65    used to do the
d620: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66   comparison.  If
d630: 20 50 34 20 69 73 20 6e 6f 74 20 73 70 65 63 69   P4 is not speci
d640: 66 69 65 64 20 74 68 65 6e 0a 2a 2a 20 6d 65 6d  fied then.** mem
d650: 63 6d 70 28 29 20 69 73 20 75 73 65 64 20 74 6f  cmp() is used to
d660: 20 63 6f 6d 70 61 72 65 20 74 65 78 74 20 73 74   compare text st
d670: 72 69 6e 67 2e 20 20 49 66 20 62 6f 74 68 20 76  ring.  If both v
d680: 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 6e 75 6d  alues are.** num
d690: 65 72 69 63 2c 20 74 68 65 6e 20 61 20 6e 75 6d  eric, then a num
d6a0: 65 72 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e 20  eric comparison 
d6b0: 69 73 20 75 73 65 64 2e 20 49 66 20 74 68 65 20  is used. If the 
d6c0: 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72  two values.** ar
d6d0: 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 74  e of different t
d6e0: 79 70 65 73 2c 20 74 68 65 6e 20 6e 75 6d 62 65  ypes, then numbe
d6f0: 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  rs are considere
d700: 64 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 73  d less than.** s
d710: 74 72 69 6e 67 73 20 61 6e 64 20 73 74 72 69 6e  trings and strin
d720: 67 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  gs are considere
d730: 64 20 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f 62  d less than blob
d740: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
d750: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 62  SQLITE_STOREP2 b
d760: 69 74 20 6f 66 20 50 35 20 69 73 20 73 65 74 2c  it of P5 is set,
d770: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6a 75 6d   then do not jum
d780: 70 2e 20 20 49 6e 73 74 65 61 64 2c 0a 2a 2a 20  p.  Instead,.** 
d790: 73 74 6f 72 65 20 61 20 62 6f 6f 6c 65 61 6e 20  store a boolean 
d7a0: 72 65 73 75 6c 74 20 28 65 69 74 68 65 72 20 30  result (either 0
d7b0: 2c 20 6f 72 20 31 2c 20 6f 72 20 4e 55 4c 4c 29  , or 1, or NULL)
d7c0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
d7d0: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  .*/./* Opcode: N
d7e0: 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  e P1 P2 P3 P4 P5
d7f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
d800: 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20  s just like the 
d810: 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74  Lt opcode except
d820: 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69   that the jump i
d830: 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68  s taken if.** th
d840: 65 20 6f 70 65 72 61 6e 64 73 20 69 6e 20 72 65  e operands in re
d850: 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50  gisters P1 and P
d860: 33 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 2e  3 are not equal.
d870: 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63    See the Lt opc
d880: 6f 64 65 20 66 6f 72 0a 2a 2a 20 61 64 64 69 74  ode for.** addit
d890: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
d8a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  n..**.** If SQLI
d8b0: 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 73 65 74  TE_NULLEQ is set
d8c0: 20 69 6e 20 50 35 20 74 68 65 6e 20 74 68 65 20   in P5 then the 
d8d0: 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  result of compar
d8e0: 69 73 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65  ison is always e
d8f0: 69 74 68 65 72 0a 2a 2a 20 74 72 75 65 20 6f 72  ither.** true or
d900: 20 66 61 6c 73 65 20 61 6e 64 20 69 73 20 6e 65   false and is ne
d910: 76 65 72 20 4e 55 4c 4c 2e 20 20 49 66 20 62 6f  ver NULL.  If bo
d920: 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20  th operands are 
d930: 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72 65  NULL then the re
d940: 73 75 6c 74 0a 2a 2a 20 6f 66 20 63 6f 6d 70 61  sult.** of compa
d950: 72 69 73 6f 6e 20 69 73 20 66 61 6c 73 65 2e 20  rison is false. 
d960: 20 49 66 20 65 69 74 68 65 72 20 6f 70 65 72 61   If either opera
d970: 6e 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  nd is NULL then 
d980: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 72  the result is tr
d990: 75 65 2e 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65  ue..** If neithe
d9a0: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
d9b0: 4c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  L the result is 
d9c0: 74 68 65 20 73 61 6d 65 20 61 73 20 69 74 20 77  the same as it w
d9d0: 6f 75 6c 64 20 62 65 20 69 66 0a 2a 2a 20 74 68  ould be if.** th
d9e0: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20  e SQLITE_NULLEQ 
d9f0: 66 6c 61 67 20 77 65 72 65 20 6f 6d 69 74 74 65  flag were omitte
da00: 64 20 66 72 6f 6d 20 50 35 2e 0a 2a 2f 0a 2f 2a  d from P5..*/./*
da10: 20 4f 70 63 6f 64 65 3a 20 45 71 20 50 31 20 50   Opcode: Eq P1 P
da20: 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
da30: 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74   This works just
da40: 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63   like the Lt opc
da50: 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74 20  ode except that 
da60: 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65  the jump is take
da70: 6e 20 69 66 0a 2a 2a 20 74 68 65 20 6f 70 65 72  n if.** the oper
da80: 61 6e 64 73 20 69 6e 20 72 65 67 69 73 74 65 72  ands in register
da90: 73 20 50 31 20 61 6e 64 20 50 33 20 61 72 65 20  s P1 and P3 are 
daa0: 65 71 75 61 6c 2e 0a 2a 2a 20 53 65 65 20 74 68  equal..** See th
dab0: 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20  e Lt opcode for 
dac0: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
dad0: 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  mation..**.** If
dae0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69   SQLITE_NULLEQ i
daf0: 73 20 73 65 74 20 69 6e 20 50 35 20 74 68 65 6e  s set in P5 then
db00: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   the result of c
db10: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 6c 77  omparison is alw
db20: 61 79 73 20 65 69 74 68 65 72 0a 2a 2a 20 74 72  ays either.** tr
db30: 75 65 20 6f 72 20 66 61 6c 73 65 20 61 6e 64 20  ue or false and 
db40: 69 73 20 6e 65 76 65 72 20 4e 55 4c 4c 2e 20 20  is never NULL.  
db50: 49 66 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73  If both operands
db60: 20 61 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20 74   are NULL then t
db70: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 66 20  he result.** of 
db80: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 72  comparison is tr
db90: 75 65 2e 20 20 49 66 20 65 69 74 68 65 72 20 6f  ue.  If either o
dba0: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74  perand is NULL t
dbb0: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
dbc0: 73 20 66 61 6c 73 65 2e 0a 2a 2a 20 49 66 20 6e  s false..** If n
dbd0: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
dbe0: 73 20 4e 55 4c 4c 20 74 68 65 20 72 65 73 75 6c  s NULL the resul
dbf0: 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  t is the same as
dc00: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 66 0a   it would be if.
dc10: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 55  ** the SQLITE_NU
dc20: 4c 4c 45 51 20 66 6c 61 67 20 77 65 72 65 20 6f  LLEQ flag were o
dc30: 6d 69 74 74 65 64 20 66 72 6f 6d 20 50 35 2e 0a  mitted from P5..
dc40: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 65  */./* Opcode: Le
dc50: 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
dc60: 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
dc70: 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 4c   just like the L
dc80: 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20  t opcode except 
dc90: 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73  that the jump is
dca0: 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65   taken if.** the
dcb0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69   content of regi
dcc0: 73 74 65 72 20 50 33 20 69 73 20 6c 65 73 73 20  ster P3 is less 
dcd0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
dce0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
dcf0: 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 2e 20  ** register P1. 
dd00: 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f   See the Lt opco
dd10: 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  de for additiona
dd20: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
dd30: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 74 20  /./* Opcode: Gt 
dd40: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
dd50: 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
dd60: 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 4c 74  just like the Lt
dd70: 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20 74   opcode except t
dd80: 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20  hat the jump is 
dd90: 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20  taken if.** the 
dda0: 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73  content of regis
ddb0: 74 65 72 20 50 33 20 69 73 20 67 72 65 61 74 65  ter P3 is greate
ddc0: 72 20 74 68 61 6e 20 74 68 65 20 63 6f 6e 74 65  r than the conte
ddd0: 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65  nt of.** registe
dde0: 72 20 50 31 2e 20 20 53 65 65 20 74 68 65 20 4c  r P1.  See the L
ddf0: 74 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 64  t opcode for add
de00: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
de10: 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ion..*/./* Opcod
de20: 65 3a 20 47 65 20 50 31 20 50 32 20 50 33 20 50  e: Ge P1 P2 P3 P
de30: 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4 P5.**.** This 
de40: 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20  works just like 
de50: 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78  the Lt opcode ex
de60: 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6a 75  cept that the ju
de70: 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a  mp is taken if.*
de80: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
de90: 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20   register P3 is 
dea0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
deb0: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 63 6f 6e  equal to the con
dec0: 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69 73  tent of.** regis
ded0: 74 65 72 20 50 31 2e 20 20 53 65 65 20 74 68 65  ter P1.  See the
dee0: 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20 61   Lt opcode for a
def0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
df00: 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ation..*/.case O
df10: 50 5f 45 71 3a 20 20 20 20 20 20 20 20 20 20 20  P_Eq:           
df20: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
df30: 4b 5f 45 51 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c  K_EQ, jump, in1,
df40: 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in3 */.case OP_
df50: 4e 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  Ne:             
df60: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
df70: 4e 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69  NE, jump, in1, i
df80: 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 74  n3 */.case OP_Lt
df90: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
dfa0: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c 54  /* same as TK_LT
dfb0: 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33  , jump, in1, in3
dfc0: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 65 3a 20   */.case OP_Le: 
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dfe0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c 45 2c 20   same as TK_LE, 
dff0: 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a  jump, in1, in3 *
e000: 2f 0a 63 61 73 65 20 4f 50 5f 47 74 3a 20 20 20  /.case OP_Gt:   
e010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
e020: 61 6d 65 20 61 73 20 54 4b 5f 47 54 2c 20 6a 75  ame as TK_GT, ju
e030: 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a  mp, in1, in3 */.
e040: 63 61 73 65 20 4f 50 5f 47 65 3a 20 7b 20 20 20  case OP_Ge: {   
e050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
e060: 65 20 61 73 20 54 4b 5f 47 45 2c 20 6a 75 6d 70  e as TK_GE, jump
e070: 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 20 20  , in1, in3 */.  
e080: 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
e090: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
e0a0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
e0b0: 6f 66 20 70 49 6e 31 20 61 67 61 69 6e 73 74 20  of pIn1 against 
e0c0: 70 49 6e 33 20 2a 2f 0a 20 20 63 68 61 72 20 61  pIn3 */.  char a
e0d0: 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 2f 2a  ffinity;      /*
e0e0: 20 41 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65   Affinity to use
e0f0: 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20   for comparison 
e100: 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73 31 3b  */.  u16 flags1;
e110: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
e120: 20 6f 66 20 69 6e 69 74 69 61 6c 20 76 61 6c 75   of initial valu
e130: 65 20 6f 66 20 70 49 6e 31 2d 3e 66 6c 61 67 73  e of pIn1->flags
e140: 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73 33   */.  u16 flags3
e150: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  ;         /* Cop
e160: 79 20 6f 66 20 69 6e 69 74 69 61 6c 20 76 61 6c  y of initial val
e170: 75 65 20 6f 66 20 70 49 6e 33 2d 3e 66 6c 61 67  ue of pIn3->flag
e180: 73 20 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d 20 26  s */..  pIn1 = &
e190: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
e1a0: 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn3 = &aMem[pO
e1b0: 70 2d 3e 70 33 5d 3b 0a 20 20 66 6c 61 67 73 31  p->p3];.  flags1
e1c0: 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73 3b 0a   = pIn1->flags;.
e1d0: 20 20 66 6c 61 67 73 33 20 3d 20 70 49 6e 33 2d    flags3 = pIn3-
e1e0: 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 66  >flags;.  if( (f
e1f0: 6c 61 67 73 31 20 7c 20 66 6c 61 67 73 33 29 26  lags1 | flags3)&
e200: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
e210: 2f 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f  /* One or both o
e220: 70 65 72 61 6e 64 73 20 61 72 65 20 4e 55 4c 4c  perands are NULL
e230: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 70 2d   */.    if( pOp-
e240: 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4e 55 4c  >p5 & SQLITE_NUL
e250: 4c 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  LEQ ){.      /* 
e260: 49 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  If SQLITE_NULLEQ
e270: 20 69 73 20 73 65 74 20 28 77 68 69 63 68 20 77   is set (which w
e280: 69 6c 6c 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  ill only happen 
e290: 69 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  if the operator 
e2a0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 4f 50 5f 45  is.      ** OP_E
e2b0: 71 20 6f 72 20 4f 50 5f 4e 65 29 20 74 68 65 6e  q or OP_Ne) then
e2c0: 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 6f   take the jump o
e2d0: 72 20 6e 6f 74 20 64 65 70 65 6e 64 69 6e 67 20  r not depending 
e2e0: 6f 6e 20 77 68 65 74 68 65 72 0a 20 20 20 20 20  on whether.     
e2f0: 20 2a 2a 20 6f 72 20 6e 6f 74 20 62 6f 74 68 20   ** or not both 
e300: 6f 70 65 72 61 6e 64 73 20 61 72 65 20 6e 75 6c  operands are nul
e310: 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
e320: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
e330: 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 20 7c 7c 20  pcode==OP_Eq || 
e340: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
e350: 4e 65 20 29 3b 0a 20 20 20 20 20 20 72 65 73 20  Ne );.      res 
e360: 3d 20 28 66 6c 61 67 73 31 20 26 20 66 6c 61 67  = (flags1 & flag
e370: 73 33 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d  s3 & MEM_Null)==
e380: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
e390: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55      /* SQLITE_NU
e3a0: 4c 4c 45 51 20 69 73 20 63 6c 65 61 72 20 61 6e  LLEQ is clear an
e3b0: 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  d at least one o
e3c0: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c 0a  perand is NULL,.
e3d0: 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
e3e0: 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61  e result is alwa
e3f0: 79 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 2a  ys NULL..      *
e400: 2a 20 54 68 65 20 6a 75 6d 70 20 69 73 20 74 61  * The jump is ta
e410: 6b 65 6e 20 69 66 20 74 68 65 20 53 51 4c 49 54  ken if the SQLIT
e420: 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 62 69 74  E_JUMPIFNULL bit
e430: 20 69 73 20 73 65 74 2e 0a 20 20 20 20 20 20 2a   is set..      *
e440: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  /.      if( pOp-
e450: 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f  >p5 & SQLITE_STO
e460: 52 45 50 32 20 29 7b 0a 20 20 20 20 20 20 20 20  REP2 ){.        
e470: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
e480: 2d 3e 70 32 5d 3b 0a 20 20 20 20 20 20 20 20 4d  ->p2];.        M
e490: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
e4a0: 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  ut, MEM_Null);. 
e4b0: 20 20 20 20 20 20 20 52 45 47 49 53 54 45 52 5f         REGISTER_
e4c0: 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70  TRACE(pOp->p2, p
e4d0: 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Out);.      }els
e4e0: 65 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20  e if( pOp->p5 & 
e4f0: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
e500: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20  L ){.        pc 
e510: 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 20  = pOp->p2-1;.   
e520: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
e530: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
e540: 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20  .    /* Neither 
e550: 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2e  operand is NULL.
e560: 20 20 44 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f    Do a compariso
e570: 6e 2e 20 2a 2f 0a 20 20 20 20 61 66 66 69 6e 69  n. */.    affini
e580: 74 79 20 3d 20 70 4f 70 2d 3e 70 35 20 26 20 53  ty = pOp->p5 & S
e590: 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 3b 0a  QLITE_AFF_MASK;.
e5a0: 20 20 20 20 69 66 28 20 61 66 66 69 6e 69 74 79      if( affinity
e5b0: 20 29 7b 0a 20 20 20 20 20 20 61 70 70 6c 79 41   ){.      applyA
e5c0: 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 61 66  ffinity(pIn1, af
e5d0: 66 69 6e 69 74 79 2c 20 65 6e 63 6f 64 69 6e 67  finity, encoding
e5e0: 29 3b 0a 20 20 20 20 20 20 61 70 70 6c 79 41 66  );.      applyAf
e5f0: 66 69 6e 69 74 79 28 70 49 6e 33 2c 20 61 66 66  finity(pIn3, aff
e600: 69 6e 69 74 79 2c 20 65 6e 63 6f 64 69 6e 67 29  inity, encoding)
e610: 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
e620: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
e630: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
e640: 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
e650: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 43  Op->p4type==P4_C
e660: 4f 4c 4c 53 45 51 20 7c 7c 20 70 4f 70 2d 3e 70  OLLSEQ || pOp->p
e670: 34 2e 70 43 6f 6c 6c 3d 3d 30 20 29 3b 0a 20 20  4.pColl==0 );.  
e680: 20 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e    ExpandBlob(pIn
e690: 31 29 3b 0a 20 20 20 20 45 78 70 61 6e 64 42 6c  1);.    ExpandBl
e6a0: 6f 62 28 70 49 6e 33 29 3b 0a 20 20 20 20 72 65  ob(pIn3);.    re
e6b0: 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  s = sqlite3MemCo
e6c0: 6d 70 61 72 65 28 70 49 6e 33 2c 20 70 49 6e 31  mpare(pIn3, pIn1
e6d0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 29  , pOp->p4.pColl)
e6e0: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
e6f0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20  pOp->opcode ){. 
e700: 20 20 20 63 61 73 65 20 4f 50 5f 45 71 3a 20 20     case OP_Eq:  
e710: 20 20 72 65 73 20 3d 20 72 65 73 3d 3d 30 3b 20    res = res==0; 
e720: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
e730: 61 73 65 20 4f 50 5f 4e 65 3a 20 20 20 20 72 65  ase OP_Ne:    re
e740: 73 20 3d 20 72 65 73 21 3d 30 3b 20 20 20 20 20  s = res!=0;     
e750: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
e760: 4f 50 5f 4c 74 3a 20 20 20 20 72 65 73 20 3d 20  OP_Lt:    res = 
e770: 72 65 73 3c 30 3b 20 20 20 20 20 20 62 72 65 61  res<0;      brea
e780: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 4c  k;.    case OP_L
e790: 65 3a 20 20 20 20 72 65 73 20 3d 20 72 65 73 3c  e:    res = res<
e7a0: 3d 30 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  =0;     break;. 
e7b0: 20 20 20 63 61 73 65 20 4f 50 5f 47 74 3a 20 20     case OP_Gt:  
e7c0: 20 20 72 65 73 20 3d 20 72 65 73 3e 30 3b 20 20    res = res>0;  
e7d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
e7e0: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 72 65  efault:       re
e7f0: 73 20 3d 20 72 65 73 3e 3d 30 3b 20 20 20 20 20  s = res>=0;     
e800: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66  break;.  }..  if
e810: 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49  ( pOp->p5 & SQLI
e820: 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 20  TE_STOREP2 ){.  
e830: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
e840: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 6d 65 6d  Op->p2];.    mem
e850: 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
e860: 20 70 4f 75 74 29 3b 0a 20 20 20 20 4d 65 6d 53   pOut);.    MemS
e870: 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c  etTypeFlag(pOut,
e880: 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 20 20 70   MEM_Int);.    p
e890: 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 65 73 3b 0a  Out->u.i = res;.
e8a0: 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
e8b0: 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75 74  CE(pOp->p2, pOut
e8c0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  );.  }else if( r
e8d0: 65 73 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70  es ){.    pc = p
e8e0: 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d 0a 0a 20  Op->p2-1;.  }.. 
e8f0: 20 2f 2a 20 55 6e 64 6f 20 61 6e 79 20 63 68 61   /* Undo any cha
e900: 6e 67 65 73 20 6d 61 64 65 20 62 79 20 61 70 70  nges made by app
e910: 6c 79 41 66 66 69 6e 69 74 79 28 29 20 74 6f 20  lyAffinity() to 
e920: 74 68 65 20 69 6e 70 75 74 20 72 65 67 69 73 74  the input regist
e930: 65 72 73 2e 20 2a 2f 0a 20 20 70 49 6e 31 2d 3e  ers. */.  pIn1->
e940: 66 6c 61 67 73 20 3d 20 28 70 49 6e 31 2d 3e 66  flags = (pIn1->f
e950: 6c 61 67 73 26 7e 4d 45 4d 5f 54 79 70 65 4d 61  lags&~MEM_TypeMa
e960: 73 6b 29 20 7c 20 28 66 6c 61 67 73 31 26 4d 45  sk) | (flags1&ME
e970: 4d 5f 54 79 70 65 4d 61 73 6b 29 3b 0a 20 20 70  M_TypeMask);.  p
e980: 49 6e 33 2d 3e 66 6c 61 67 73 20 3d 20 28 70 49  In3->flags = (pI
e990: 6e 33 2d 3e 66 6c 61 67 73 26 7e 4d 45 4d 5f 54  n3->flags&~MEM_T
e9a0: 79 70 65 4d 61 73 6b 29 20 7c 20 28 66 6c 61 67  ypeMask) | (flag
e9b0: 73 33 26 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29  s3&MEM_TypeMask)
e9c0: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
e9d0: 20 4f 70 63 6f 64 65 3a 20 50 65 72 6d 75 74 61   Opcode: Permuta
e9e0: 74 69 6f 6e 20 2a 20 2a 20 2a 20 50 34 20 2a 0a  tion * * * P4 *.
e9f0: 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 65  **.** Set the pe
ea00: 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 62  rmutation used b
ea10: 79 20 74 68 65 20 4f 50 5f 43 6f 6d 70 61 72 65  y the OP_Compare
ea20: 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
ea30: 74 68 65 20 61 72 72 61 79 0a 2a 2a 20 6f 66 20  the array.** of 
ea40: 69 6e 74 65 67 65 72 73 20 69 6e 20 50 34 2e 0a  integers in P4..
ea50: 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 6d 75 74  **.** The permut
ea60: 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 76 61  ation is only va
ea70: 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 6e 65  lid until the ne
ea80: 78 74 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f  xt OP_Permutatio
ea90: 6e 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 0a 2a  n, OP_Compare,.*
eaa0: 2a 20 4f 50 5f 48 61 6c 74 2c 20 6f 72 20 4f 50  * OP_Halt, or OP
eab0: 5f 52 65 73 75 6c 74 52 6f 77 2e 20 20 54 79 70  _ResultRow.  Typ
eac0: 69 63 61 6c 6c 79 20 74 68 65 20 4f 50 5f 50 65  ically the OP_Pe
ead0: 72 6d 75 74 61 74 69 6f 6e 20 73 68 6f 75 6c 64  rmutation should
eae0: 20 6f 63 63 75 72 0a 2a 2a 20 69 6d 6d 65 64 69   occur.** immedi
eaf0: 61 74 65 6c 79 20 70 72 69 6f 72 20 74 6f 20 74  ately prior to t
eb00: 68 65 20 4f 50 5f 43 6f 6d 70 61 72 65 2e 0a 2a  he OP_Compare..*
eb10: 2f 0a 63 61 73 65 20 4f 50 5f 50 65 72 6d 75 74  /.case OP_Permut
eb20: 61 74 69 6f 6e 3a 20 7b 0a 20 20 61 73 73 65 72  ation: {.  asser
eb30: 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
eb40: 50 34 5f 49 4e 54 41 52 52 41 59 20 29 3b 0a 20  P4_INTARRAY );. 
eb50: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
eb60: 2e 61 69 20 29 3b 0a 20 20 61 50 65 72 6d 75 74  .ai );.  aPermut
eb70: 65 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a  e = pOp->p4.ai;.
eb80: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
eb90: 70 63 6f 64 65 3a 20 43 6f 6d 70 61 72 65 20 50  pcode: Compare P
eba0: 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a  1 P2 P3 P4 *.**.
ebb0: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 76  ** Compare two v
ebc0: 65 63 74 6f 72 73 20 6f 66 20 72 65 67 69 73 74  ectors of regist
ebd0: 65 72 73 20 69 6e 20 72 65 67 28 50 31 29 2e 2e  ers in reg(P1)..
ebe0: 72 65 67 28 50 31 2b 50 33 2d 31 29 20 28 63 61  reg(P1+P3-1) (ca
ebf0: 6c 6c 20 74 68 69 73 0a 2a 2a 20 76 65 63 74 6f  ll this.** vecto
ec00: 72 20 22 41 22 29 20 61 6e 64 20 69 6e 20 72 65  r "A") and in re
ec10: 67 28 50 32 29 2e 2e 72 65 67 28 50 32 2b 50 33  g(P2)..reg(P2+P3
ec20: 2d 31 29 20 28 22 42 22 29 2e 20 20 53 61 76 65  -1) ("B").  Save
ec30: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
ec40: 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * the comparison
ec50: 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
ec60: 6e 65 78 74 20 4f 50 5f 4a 75 6d 70 20 69 6e 73  next OP_Jump ins
ec70: 74 72 75 63 74 2e 0a 2a 2a 0a 2a 2a 20 50 34 20  truct..**.** P4 
ec80: 69 73 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  is a KeyInfo str
ec90: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69  ucture that defi
eca0: 6e 65 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  nes collating se
ecb0: 71 75 65 6e 63 65 73 20 61 6e 64 20 73 6f 72 74  quences and sort
ecc0: 0a 2a 2a 20 6f 72 64 65 72 73 20 66 6f 72 20 74  .** orders for t
ecd0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  he comparison.  
ece0: 54 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  The permutation 
ecf0: 61 70 70 6c 69 65 73 20 74 6f 20 72 65 67 69 73  applies to regis
ed00: 74 65 72 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 20 54  ters.** only.  T
ed10: 68 65 20 4b 65 79 49 6e 66 6f 20 65 6c 65 6d 65  he KeyInfo eleme
ed20: 6e 74 73 20 61 72 65 20 75 73 65 64 20 73 65 71  nts are used seq
ed30: 75 65 6e 74 69 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a  uentially..**.**
ed40: 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
ed50: 69 73 20 61 20 73 6f 72 74 20 63 6f 6d 70 61 72  is a sort compar
ed60: 69 73 6f 6e 2c 20 73 6f 20 4e 55 4c 4c 73 20 63  ison, so NULLs c
ed70: 6f 6d 70 61 72 65 20 65 71 75 61 6c 2c 0a 2a 2a  ompare equal,.**
ed80: 20 4e 55 4c 4c 73 20 61 72 65 20 6c 65 73 73 20   NULLs are less 
ed90: 74 68 61 6e 20 6e 75 6d 62 65 72 73 2c 20 6e 75  than numbers, nu
eda0: 6d 62 65 72 73 20 61 72 65 20 6c 65 73 73 20 74  mbers are less t
edb0: 68 61 6e 20 73 74 72 69 6e 67 73 2c 0a 2a 2a 20  han strings,.** 
edc0: 61 6e 64 20 73 74 72 69 6e 67 73 20 61 72 65 20  and strings are 
edd0: 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f 62 73 2e  less than blobs.
ede0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6d 70  .*/.case OP_Comp
edf0: 61 72 65 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a  are: {.  int n;.
ee00: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 70    int i;.  int p
ee10: 31 3b 0a 20 20 69 6e 74 20 70 32 3b 0a 20 20 63  1;.  int p2;.  c
ee20: 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  onst KeyInfo *pK
ee30: 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 69 64  eyInfo;.  int id
ee40: 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  x;.  CollSeq *pC
ee50: 6f 6c 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61  oll;    /* Colla
ee60: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
ee70: 20 75 73 65 20 6f 6e 20 74 68 69 73 20 74 65 72   use on this ter
ee80: 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b  m */.  int bRev;
ee90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
eea0: 65 20 66 6f 72 20 44 45 53 43 45 4e 44 49 4e 47  e for DESCENDING
eeb0: 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 0a   sort order */..
eec0: 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20    n = pOp->p3;. 
eed0: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d   pKeyInfo = pOp-
eee0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
eef0: 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20  assert( n>0 );. 
ef00: 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
ef10: 6f 21 3d 30 20 29 3b 0a 20 20 70 31 20 3d 20 70  o!=0 );.  p1 = p
ef20: 4f 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70  Op->p1;.  p2 = p
ef30: 4f 70 2d 3e 70 32 3b 0a 23 69 66 20 53 51 4c 49  Op->p2;.#if SQLI
ef40: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 61  TE_DEBUG.  if( a
ef50: 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 69  Permute ){.    i
ef60: 6e 74 20 6b 2c 20 6d 78 20 3d 20 30 3b 0a 20 20  nt k, mx = 0;.  
ef70: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 3b 20    for(k=0; k<n; 
ef80: 6b 2b 2b 29 20 69 66 28 20 61 50 65 72 6d 75 74  k++) if( aPermut
ef90: 65 5b 6b 5d 3e 6d 78 20 29 20 6d 78 20 3d 20 61  e[k]>mx ) mx = a
efa0: 50 65 72 6d 75 74 65 5b 6b 5d 3b 0a 20 20 20 20  Permute[k];.    
efb0: 61 73 73 65 72 74 28 20 70 31 3e 30 20 26 26 20  assert( p1>0 && 
efc0: 70 31 2b 6d 78 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31  p1+mx<=p->nMem+1
efd0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
efe0: 70 32 3e 30 20 26 26 20 70 32 2b 6d 78 3c 3d 70  p2>0 && p2+mx<=p
eff0: 2d 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 20 20 7d 65  ->nMem+1 );.  }e
f000: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
f010: 20 70 31 3e 30 20 26 26 20 70 31 2b 6e 3c 3d 70   p1>0 && p1+n<=p
f020: 2d 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 20 20 20 20  ->nMem+1 );.    
f030: 61 73 73 65 72 74 28 20 70 32 3e 30 20 26 26 20  assert( p2>0 && 
f040: 70 32 2b 6e 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20  p2+n<=p->nMem+1 
f050: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
f060: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
f070: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b  .  for(i=0; i<n;
f080: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 64 78 20 3d   i++){.    idx =
f090: 20 61 50 65 72 6d 75 74 65 20 3f 20 61 50 65 72   aPermute ? aPer
f0a0: 6d 75 74 65 5b 69 5d 20 3a 20 69 3b 0a 20 20 20  mute[i] : i;.   
f0b0: 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
f0c0: 6c 69 64 28 26 61 4d 65 6d 5b 70 31 2b 69 64 78  lid(&aMem[p1+idx
f0d0: 5d 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ]) );.    assert
f0e0: 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d  ( memIsValid(&aM
f0f0: 65 6d 5b 70 32 2b 69 64 78 5d 29 20 29 3b 0a 20  em[p2+idx]) );. 
f100: 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
f110: 45 28 70 31 2b 69 64 78 2c 20 26 61 4d 65 6d 5b  E(p1+idx, &aMem[
f120: 70 31 2b 69 64 78 5d 29 3b 0a 20 20 20 20 52 45  p1+idx]);.    RE
f130: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 32 2b  GISTER_TRACE(p2+
f140: 69 64 78 2c 20 26 61 4d 65 6d 5b 70 32 2b 69 64  idx, &aMem[p2+id
f150: 78 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  x]);.    assert(
f160: 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   i<pKeyInfo->nFi
f170: 65 6c 64 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  eld );.    pColl
f180: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
f190: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 62 52 65 76 20  ll[i];.    bRev 
f1a0: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  = pKeyInfo->aSor
f1b0: 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 69  tOrder[i];.    i
f1c0: 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65  Compare = sqlite
f1d0: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 61 4d 65  3MemCompare(&aMe
f1e0: 6d 5b 70 31 2b 69 64 78 5d 2c 20 26 61 4d 65 6d  m[p1+idx], &aMem
f1f0: 5b 70 32 2b 69 64 78 5d 2c 20 70 43 6f 6c 6c 29  [p2+idx], pColl)
f200: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6d 70 61  ;.    if( iCompa
f210: 72 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  re ){.      if( 
f220: 62 52 65 76 20 29 20 69 43 6f 6d 70 61 72 65 20  bRev ) iCompare 
f230: 3d 20 2d 69 43 6f 6d 70 61 72 65 3b 0a 20 20 20  = -iCompare;.   
f240: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f250: 20 20 7d 0a 20 20 61 50 65 72 6d 75 74 65 20 3d    }.  aPermute =
f260: 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   0;.  break;.}..
f270: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4a 75 6d 70 20  /* Opcode: Jump 
f280: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
f290: 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 69  ** Jump to the i
f2a0: 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20 61 64  nstruction at ad
f2b0: 64 72 65 73 73 20 50 31 2c 20 50 32 2c 20 6f 72  dress P1, P2, or
f2c0: 20 50 33 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e   P3 depending on
f2d0: 20 77 68 65 74 68 65 72 0a 2a 2a 20 69 6e 20 74   whether.** in t
f2e0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 4f  he most recent O
f2f0: 50 5f 43 6f 6d 70 61 72 65 20 69 6e 73 74 72 75  P_Compare instru
f300: 63 74 69 6f 6e 20 74 68 65 20 50 31 20 76 65 63  ction the P1 vec
f310: 74 6f 72 20 77 61 73 20 6c 65 73 73 20 74 68 61  tor was less tha
f320: 6e 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f  n.** equal to, o
f330: 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
f340: 68 65 20 50 32 20 76 65 63 74 6f 72 2c 20 72 65  he P2 vector, re
f350: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 63  spectively..*/.c
f360: 61 73 65 20 4f 50 5f 4a 75 6d 70 3a 20 7b 20 20  ase OP_Jump: {  
f370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75             /* ju
f380: 6d 70 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6d  mp */.  if( iCom
f390: 70 61 72 65 3c 30 20 29 7b 0a 20 20 20 20 70 63  pare<0 ){.    pc
f3a0: 20 3d 20 70 4f 70 2d 3e 70 31 20 2d 20 31 3b 0a   = pOp->p1 - 1;.
f3b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6d    }else if( iCom
f3c0: 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pare==0 ){.    p
f3d0: 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
f3e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 63  .  }else{.    pc
f3f0: 20 3d 20 70 4f 70 2d 3e 70 33 20 2d 20 31 3b 0a   = pOp->p3 - 1;.
f400: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
f410: 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 6e 64 20 50  /* Opcode: And P
f420: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
f430: 2a 20 54 61 6b 65 20 74 68 65 20 6c 6f 67 69 63  * Take the logic
f440: 61 6c 20 41 4e 44 20 6f 66 20 74 68 65 20 76 61  al AND of the va
f450: 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72  lues in register
f460: 73 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a  s P1 and P2 and.
f470: 2a 2a 20 77 72 69 74 65 20 74 68 65 20 72 65 73  ** write the res
f480: 75 6c 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65  ult into registe
f490: 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  r P3..**.** If e
f4a0: 69 74 68 65 72 20 50 31 20 6f 72 20 50 32 20 69  ither P1 or P2 i
f4b0: 73 20 30 20 28 66 61 6c 73 65 29 20 74 68 65 6e  s 0 (false) then
f4c0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 30   the result is 0
f4d0: 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20   even if.** the 
f4e0: 6f 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  other input is N
f4f0: 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c 20 61 6e 64  ULL.  A NULL and
f500: 20 74 72 75 65 20 6f 72 20 74 77 6f 20 4e 55 4c   true or two NUL
f510: 4c 73 20 67 69 76 65 0a 2a 2a 20 61 20 4e 55 4c  Ls give.** a NUL
f520: 4c 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 2f 2a 20  L output..*/./* 
f530: 4f 70 63 6f 64 65 3a 20 4f 72 20 50 31 20 50 32  Opcode: Or P1 P2
f540: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 61   P3 * *.**.** Ta
f550: 6b 65 20 74 68 65 20 6c 6f 67 69 63 61 6c 20 4f  ke the logical O
f560: 52 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  R of the values 
f570: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 61  in register P1 a
f580: 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f  nd P2 and.** sto
f590: 72 65 20 74 68 65 20 61 6e 73 77 65 72 20 69 6e  re the answer in
f5a0: 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
f5b0: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 50 31  .** If either P1
f5c0: 20 6f 72 20 50 32 20 69 73 20 6e 6f 6e 7a 65 72   or P2 is nonzer
f5d0: 6f 20 28 74 72 75 65 29 20 74 68 65 6e 20 74 68  o (true) then th
f5e0: 65 20 72 65 73 75 6c 74 20 69 73 20 31 20 28 74  e result is 1 (t
f5f0: 72 75 65 29 0a 2a 2a 20 65 76 65 6e 20 69 66 20  rue).** even if 
f600: 74 68 65 20 6f 74 68 65 72 20 69 6e 70 75 74 20  the other input 
f610: 69 73 20 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c  is NULL.  A NULL
f620: 20 61 6e 64 20 66 61 6c 73 65 20 6f 72 20 74 77   and false or tw
f630: 6f 20 4e 55 4c 4c 73 0a 2a 2a 20 67 69 76 65 20  o NULLs.** give 
f640: 61 20 4e 55 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a  a NULL output..*
f650: 2f 0a 63 61 73 65 20 4f 50 5f 41 6e 64 3a 20 20  /.case OP_And:  
f660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
f670: 61 6d 65 20 61 73 20 54 4b 5f 41 4e 44 2c 20 69  ame as TK_AND, i
f680: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
f690: 0a 63 61 73 65 20 4f 50 5f 4f 72 3a 20 7b 20 20  .case OP_Or: {  
f6a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
f6b0: 6d 65 20 61 73 20 54 4b 5f 4f 52 2c 20 69 6e 31  me as TK_OR, in1
f6c0: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20  , in2, out3 */. 
f6d0: 20 69 6e 74 20 76 31 3b 20 20 20 20 2f 2a 20 4c   int v1;    /* L
f6e0: 65 66 74 20 6f 70 65 72 61 6e 64 3a 20 20 30 3d  eft operand:  0=
f6f0: 3d 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c  =FALSE, 1==TRUE,
f700: 20 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e   2==UNKNOWN or N
f710: 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 76 32 3b  ULL */.  int v2;
f720: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65      /* Right ope
f730: 72 61 6e 64 3a 20 30 3d 3d 46 41 4c 53 45 2c 20  rand: 0==FALSE, 
f740: 31 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e  1==TRUE, 2==UNKN
f750: 4f 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 0a  OWN or NULL */..
f760: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
f770: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70  Op->p1];.  if( p
f780: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
f790: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 76 31 20  _Null ){.    v1 
f7a0: 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 2;.  }else{.  
f7b0: 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 64    v1 = sqlite3Vd
f7c0: 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29  beIntValue(pIn1)
f7d0: 21 3d 30 3b 0a 20 20 7d 0a 20 20 70 49 6e 32 20  !=0;.  }.  pIn2 
f7e0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
f7f0: 3b 0a 20 20 69 66 28 20 70 49 6e 32 2d 3e 66 6c  ;.  if( pIn2->fl
f800: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
f810: 7b 0a 20 20 20 20 76 32 20 3d 20 32 3b 0a 20 20  {.    v2 = 2;.  
f820: 7d 65 6c 73 65 7b 0a 20 20 20 20 76 32 20 3d 20  }else{.    v2 = 
f830: 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
f840: 6c 75 65 28 70 49 6e 32 29 21 3d 30 3b 0a 20 20  lue(pIn2)!=0;.  
f850: 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  }.  if( pOp->opc
f860: 6f 64 65 3d 3d 4f 50 5f 41 6e 64 20 29 7b 0a 20  ode==OP_And ){. 
f870: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
f880: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 6e  unsigned char an
f890: 64 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20 30 2c  d_logic[] = { 0,
f8a0: 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20   0, 0, 0, 1, 2, 
f8b0: 30 2c 20 32 2c 20 32 20 7d 3b 0a 20 20 20 20 76  0, 2, 2 };.    v
f8c0: 31 20 3d 20 61 6e 64 5f 6c 6f 67 69 63 5b 76 31  1 = and_logic[v1
f8d0: 2a 33 2b 76 32 5d 3b 0a 20 20 7d 65 6c 73 65 7b  *3+v2];.  }else{
f8e0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
f8f0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
f900: 6f 72 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20 30  or_logic[] = { 0
f910: 2c 20 31 2c 20 32 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 2, 1, 1, 1,
f920: 20 32 2c 20 31 2c 20 32 20 7d 3b 0a 20 20 20 20   2, 1, 2 };.    
f930: 76 31 20 3d 20 6f 72 5f 6c 6f 67 69 63 5b 76 31  v1 = or_logic[v1
f940: 2a 33 2b 76 32 5d 3b 0a 20 20 7d 0a 20 20 70 4f  *3+v2];.  }.  pO
f950: 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
f960: 70 33 5d 3b 0a 20 20 69 66 28 20 76 31 3d 3d 32  p3];.  if( v1==2
f970: 20 29 7b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79   ){.    MemSetTy
f980: 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d  peFlag(pOut, MEM
f990: 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  _Null);.  }else{
f9a0: 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  .    pOut->u.i =
f9b0: 20 76 31 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54   v1;.    MemSetT
f9c0: 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45  ypeFlag(pOut, ME
f9d0: 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 20 20 62 72  M_Int);.  }.  br
f9e0: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
f9f0: 65 3a 20 4e 6f 74 20 50 31 20 50 32 20 2a 20 2a  e: Not P1 P2 * *
fa00: 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72   *.**.** Interpr
fa10: 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  et the value in 
fa20: 72 65 67 69 73 74 65 72 20 50 31 20 61 73 20 61  register P1 as a
fa30: 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20   boolean value. 
fa40: 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20 62 6f   Store the.** bo
fa50: 6f 6c 65 61 6e 20 63 6f 6d 70 6c 65 6d 65 6e 74  olean complement
fa60: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
fa70: 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69    If the value i
fa80: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  n register P1 is
fa90: 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   .** NULL, then 
faa0: 61 20 4e 55 4c 4c 20 69 73 20 73 74 6f 72 65 64  a NULL is stored
fab0: 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20   in P2..*/.case 
fac0: 4f 50 5f 4e 6f 74 3a 20 7b 20 20 20 20 20 20 20  OP_Not: {       
fad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
fae0: 20 61 73 20 54 4b 5f 4e 4f 54 2c 20 69 6e 31 2c   as TK_NOT, in1,
faf0: 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20   out2 */.  pIn1 
fb00: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
fb10: 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  ;.  pOut = &aMem
fb20: 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69 66 28  [pOp->p2];.  if(
fb30: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn1->flags & M
fb40: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73  EM_Null ){.    s
fb50: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
fb60: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 7d 65  Null(pOut);.  }e
fb70: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
fb80: 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28  VdbeMemSetInt64(
fb90: 70 4f 75 74 2c 20 21 73 71 6c 69 74 65 33 56 64  pOut, !sqlite3Vd
fba0: 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29  beIntValue(pIn1)
fbb0: 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
fbc0: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69  }../* Opcode: Bi
fbd0: 74 4e 6f 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  tNot P1 P2 * * *
fbe0: 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  .**.** Interpret
fbf0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
fc00: 72 65 67 69 73 74 65 72 20 50 31 20 61 73 20 61  register P1 as a
fc10: 6e 20 69 6e 74 65 67 65 72 2e 20 20 53 74 6f 72  n integer.  Stor
fc20: 65 20 74 68 65 0a 2a 2a 20 6f 6e 65 73 2d 63 6f  e the.** ones-co
fc30: 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20  mplement of the 
fc40: 50 31 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65  P1 value into re
fc50: 67 69 73 74 65 72 20 50 32 2e 20 20 49 66 20 50  gister P2.  If P
fc60: 31 20 68 6f 6c 64 73 0a 2a 2a 20 61 20 4e 55 4c  1 holds.** a NUL
fc70: 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 61 20 4e  L then store a N
fc80: 55 4c 4c 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61  ULL in P2..*/.ca
fc90: 73 65 20 4f 50 5f 42 69 74 4e 6f 74 3a 20 7b 20  se OP_BitNot: { 
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
fcb0: 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 4e 4f 54  ame as TK_BITNOT
fcc0: 2c 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20  , in1, out2 */. 
fcd0: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
fce0: 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d  p->p1];.  pOut =
fcf0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
fd00: 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61  .  if( pIn1->fla
fd10: 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  gs & MEM_Null ){
fd20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fd30: 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29  MemSetNull(pOut)
fd40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
fd50: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
fd60: 49 6e 74 36 34 28 70 4f 75 74 2c 20 7e 73 71 6c  Int64(pOut, ~sql
fd70: 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65  ite3VdbeIntValue
fd80: 28 70 49 6e 31 29 29 3b 0a 20 20 7d 0a 20 20 62  (pIn1));.  }.  b
fd90: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
fda0: 64 65 3a 20 4f 6e 63 65 20 50 31 20 50 32 20 2a  de: Once P1 P2 *
fdb0: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   * *.**.** Check
fdc0: 20 69 66 20 4f 50 5f 4f 6e 63 65 20 66 6c 61 67   if OP_Once flag
fdd0: 20 50 31 20 69 73 20 73 65 74 2e 20 49 66 20 73   P1 is set. If s
fde0: 6f 2c 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72  o, jump to instr
fdf0: 75 63 74 69 6f 6e 20 50 32 2e 20 4f 74 68 65 72  uction P2. Other
fe00: 77 69 73 65 2c 0a 2a 2a 20 73 65 74 20 74 68 65  wise,.** set the
fe10: 20 66 6c 61 67 20 61 6e 64 20 66 61 6c 6c 20 74   flag and fall t
fe20: 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
fe30: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  xt instruction..
fe40: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
fe50: 4a 75 6d 70 4f 6e 63 65 0a 2a 2f 0a 63 61 73 65  JumpOnce.*/.case
fe60: 20 4f 50 5f 4f 6e 63 65 3a 20 7b 20 20 20 20 20   OP_Once: {     
fe70: 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
fe80: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
fe90: 2d 3e 70 31 3c 70 2d 3e 6e 4f 6e 63 65 46 6c 61  ->p1<p->nOnceFla
fea0: 67 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  g );.  if( p->aO
feb0: 6e 63 65 46 6c 61 67 5b 70 4f 70 2d 3e 70 31 5d  nceFlag[pOp->p1]
fec0: 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70   ){.    pc = pOp
fed0: 2d 3e 70 32 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  ->p2-1;.  }else{
fee0: 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61  .    p->aOnceFla
fef0: 67 5b 70 4f 70 2d 3e 70 31 5d 20 3d 20 31 3b 0a  g[pOp->p1] = 1;.
ff00: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
ff10: 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 20 50 31  /* Opcode: If P1
ff20: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
ff30: 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74   Jump to P2 if t
ff40: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
ff50: 73 74 65 72 20 50 31 20 69 73 20 74 72 75 65 2e  ster P1 is true.
ff60: 20 20 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69    The value.** i
ff70: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 72 75  s considered tru
ff80: 65 20 69 66 20 69 74 20 69 73 20 6e 75 6d 65 72  e if it is numer
ff90: 69 63 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 2e  ic and non-zero.
ffa0: 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a    If the value.*
ffb0: 2a 20 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c 20  * in P1 is NULL 
ffc0: 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75  then take the ju
ffd0: 6d 70 20 69 66 20 50 33 20 69 73 20 6e 6f 6e 2d  mp if P3 is non-
ffe0: 7a 65 72 6f 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  zero..*/./* Opco
fff0: 64 65 3a 20 49 66 4e 6f 74 20 50 31 20 50 32 20  de: IfNot P1 P2 
10000 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d  P3 * *.**.** Jum
10010 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 76  p to P2 if the v
10020 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
10030 20 50 31 20 69 73 20 46 61 6c 73 65 2e 20 20 54   P1 is False.  T
10040 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 63  he value.** is c
10050 6f 6e 73 69 64 65 72 65 64 20 66 61 6c 73 65 20  onsidered false 
10060 69 66 20 69 74 20 68 61 73 20 61 20 6e 75 6d 65  if it has a nume
10070 72 69 63 20 76 61 6c 75 65 20 6f 66 20 7a 65 72  ric value of zer
10080 6f 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65  o.  If the value
10090 0a 2a 2a 20 69 6e 20 50 31 20 69 73 20 4e 55 4c  .** in P1 is NUL
100a0 4c 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20  L then take the 
100b0 6a 75 6d 70 20 69 66 20 50 33 20 69 73 20 7a 65  jump if P3 is ze
100c0 72 6f 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  ro..*/.case OP_I
100d0 66 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f:              
100e0 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20     /* jump, in1 
100f0 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 4e 6f 74  */.case OP_IfNot
10100 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
10110 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20  * jump, in1 */. 
10120 20 69 6e 74 20 63 3b 0a 20 20 70 49 6e 31 20 3d   int c;.  pIn1 =
10130 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
10140 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61  .  if( pIn1->fla
10150 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  gs & MEM_Null ){
10160 0a 20 20 20 20 63 20 3d 20 70 4f 70 2d 3e 70 33  .    c = pOp->p3
10170 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65  ;.  }else{.#ifde
10180 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
10190 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
101a0 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
101b0 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 21 3d  IntValue(pIn1)!=
101c0 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 20 3d  0;.#else.    c =
101d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c   sqlite3VdbeReal
101e0 56 61 6c 75 65 28 70 49 6e 31 29 21 3d 30 2e 30  Value(pIn1)!=0.0
101f0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
10200 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
10210 5f 49 66 4e 6f 74 20 29 20 63 20 3d 20 21 63 3b  _IfNot ) c = !c;
10220 0a 20 20 7d 0a 20 20 69 66 28 20 63 20 29 7b 0a  .  }.  if( c ){.
10230 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
10240 2d 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  -1;.  }.  break;
10250 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .}../* Opcode: I
10260 73 4e 75 6c 6c 20 50 31 20 50 32 20 2a 20 2a 20  sNull P1 P2 * * 
10270 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20  *.**.** Jump to 
10280 50 32 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  P2 if the value 
10290 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69  in register P1 i
102a0 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20  s NULL..*/.case 
102b0 4f 50 5f 49 73 4e 75 6c 6c 3a 20 7b 20 20 20 20  OP_IsNull: {    
102c0 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
102d0 61 73 20 54 4b 5f 49 53 4e 55 4c 4c 2c 20 6a 75  as TK_ISNULL, ju
102e0 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e  mp, in1 */.  pIn
102f0 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
10300 31 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d  1];.  if( (pIn1-
10310 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
10320 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 63 20  l)!=0 ){.    pc 
10330 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
10340 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
10350 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 4e 75 6c  * Opcode: NotNul
10360 6c 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  l P1 P2 * * *.**
10370 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69  .** Jump to P2 i
10380 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  f the value in r
10390 65 67 69 73 74 65 72 20 50 31 20 69 73 20 6e 6f  egister P1 is no
103a0 74 20 4e 55 4c 4c 2e 20 20 0a 2a 2f 0a 63 61 73  t NULL.  .*/.cas
103b0 65 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3a 20 7b 20  e OP_NotNull: { 
103c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
103d0 6d 65 20 61 73 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  me as TK_NOTNULL
103e0 2c 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20  , jump, in1 */. 
103f0 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
10400 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 28 70  p->p1];.  if( (p
10410 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
10420 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  _Null)==0 ){.   
10430 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
10440 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  1;.  }.  break;.
10450 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f  }../* Opcode: Co
10460 6c 75 6d 6e 20 50 31 20 50 32 20 50 33 20 50 34  lumn P1 P2 P3 P4
10470 20 50 35 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70   P5.**.** Interp
10480 72 65 74 20 74 68 65 20 64 61 74 61 20 74 68 61  ret the data tha
10490 74 20 63 75 72 73 6f 72 20 50 31 20 70 6f 69 6e  t cursor P1 poin
104a0 74 73 20 74 6f 20 61 73 20 61 20 73 74 72 75 63  ts to as a struc
104b0 74 75 72 65 20 62 75 69 6c 74 20 75 73 69 6e 67  ture built using
104c0 0a 2a 2a 20 74 68 65 20 4d 61 6b 65 52 65 63 6f  .** the MakeReco
104d0 72 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  rd instruction. 
104e0 20 28 53 65 65 20 74 68 65 20 4d 61 6b 65 52 65   (See the MakeRe
104f0 63 6f 72 64 20 6f 70 63 6f 64 65 20 66 6f 72 20  cord opcode for 
10500 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e  additional.** in
10510 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
10520 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 74 68  the format of th
10530 65 20 64 61 74 61 2e 29 20 20 45 78 74 72 61 63  e data.)  Extrac
10540 74 20 74 68 65 20 50 32 2d 74 68 20 63 6f 6c 75  t the P2-th colu
10550 6d 6e 0a 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20  mn.** from this 
10560 72 65 63 6f 72 64 2e 20 20 49 66 20 74 68 65 72  record.  If ther
10570 65 20 61 72 65 20 6c 65 73 73 20 74 68 61 74 20  e are less that 
10580 28 50 32 2b 31 29 20 0a 2a 2a 20 76 61 6c 75 65  (P2+1) .** value
10590 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 2c  s in the record,
105a0 20 65 78 74 72 61 63 74 20 61 20 4e 55 4c 4c 2e   extract a NULL.
105b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
105c0 20 65 78 74 72 61 63 74 65 64 20 69 73 20 73 74   extracted is st
105d0 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
105e0 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   P3..**.** If th
105f0 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  e column contain
10600 73 20 66 65 77 65 72 20 74 68 61 6e 20 50 32 20  s fewer than P2 
10610 66 69 65 6c 64 73 2c 20 74 68 65 6e 20 65 78 74  fields, then ext
10620 72 61 63 74 20 61 20 4e 55 4c 4c 2e 20 20 4f 72  ract a NULL.  Or
10630 2c 0a 2a 2a 20 69 66 20 74 68 65 20 50 34 20 61  ,.** if the P4 a
10640 72 67 75 6d 65 6e 74 20 69 73 20 61 20 50 34 5f  rgument is a P4_
10650 4d 45 4d 20 75 73 65 20 74 68 65 20 76 61 6c 75  MEM use the valu
10660 65 20 6f 66 20 74 68 65 20 50 34 20 61 72 67 75  e of the P4 argu
10670 6d 65 6e 74 20 61 73 0a 2a 2a 20 74 68 65 20 72  ment as.** the r
10680 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  esult..**.** If 
10690 74 68 65 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52  the OPFLAG_CLEAR
106a0 43 41 43 48 45 20 62 69 74 20 69 73 20 73 65 74  CACHE bit is set
106b0 20 6f 6e 20 50 35 20 61 6e 64 20 50 31 20 69 73   on P5 and P1 is
106c0 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20   a pseudo-table 
106d0 63 75 72 73 6f 72 2c 0a 2a 2a 20 74 68 65 6e 20  cursor,.** then 
106e0 74 68 65 20 63 61 63 68 65 20 6f 66 20 74 68 65  the cache of the
106f0 20 63 75 72 73 6f 72 20 69 73 20 72 65 73 65 74   cursor is reset
10700 20 70 72 69 6f 72 20 74 6f 20 65 78 74 72 61 63   prior to extrac
10710 74 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  ting the column.
10720 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 4f 50  .** The first OP
10730 5f 43 6f 6c 75 6d 6e 20 61 67 61 69 6e 73 74 20  _Column against 
10740 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 61  a pseudo-table a
10750 66 74 65 72 20 74 68 65 20 76 61 6c 75 65 20 6f  fter the value o
10760 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a  f the content.**
10770 20 72 65 67 69 73 74 65 72 20 68 61 73 20 63 68   register has ch
10780 61 6e 67 65 64 20 73 68 6f 75 6c 64 20 68 61 76  anged should hav
10790 65 20 74 68 69 73 20 62 69 74 20 73 65 74 2e 0a  e this bit set..
107a0 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6c 75 6d  */.case OP_Colum
107b0 6e 3a 20 7b 0a 20 20 75 33 32 20 70 61 79 6c 6f  n: {.  u32 paylo
107c0 61 64 53 69 7a 65 3b 20 20 20 2f 2a 20 4e 75 6d  adSize;   /* Num
107d0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
107e0 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
107f0 69 36 34 20 70 61 79 6c 6f 61 64 53 69 7a 65 36  i64 payloadSize6
10800 34 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  4; /* Number of 
10810 62 79 74 65 73 20 69 6e 20 74 68 65 20 72 65 63  bytes in the rec
10820 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 70 31 3b  ord */.  int p1;
10830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
10840 31 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6f  1 value of the o
10850 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70  pcode */.  int p
10860 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2;            /*
10870 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 74   column number t
10880 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20  o retrieve */.  
10890 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 20  VdbeCursor *pC; 
108a0 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
108b0 75 72 73 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20  ursor */.  char 
108c0 2a 7a 52 65 63 3b 20 20 20 20 20 20 20 20 2f 2a  *zRec;        /*
108d0 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 6f 6d 70   Pointer to comp
108e0 6c 65 74 65 20 72 65 63 6f 72 64 2d 64 61 74 61  lete record-data
108f0 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
10900 70 43 72 73 72 3b 20 20 20 2f 2a 20 54 68 65 20  pCrsr;   /* The 
10910 42 54 72 65 65 20 63 75 72 73 6f 72 20 2a 2f 0a  BTree cursor */.
10920 20 20 75 33 32 20 2a 61 54 79 70 65 3b 20 20 20    u32 *aType;   
10930 20 20 20 20 20 2f 2a 20 61 54 79 70 65 5b 69 5d       /* aType[i]
10940 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 65 72   holds the numer
10950 69 63 20 74 79 70 65 20 6f 66 20 74 68 65 20 69  ic type of the i
10960 2d 74 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  -th column */.  
10970 75 33 32 20 2a 61 4f 66 66 73 65 74 3b 20 20 20  u32 *aOffset;   
10980 20 20 20 2f 2a 20 61 4f 66 66 73 65 74 5b 69 5d     /* aOffset[i]
10990 20 69 73 20 6f 66 66 73 65 74 20 74 6f 20 73 74   is offset to st
109a0 61 72 74 20 6f 66 20 64 61 74 61 20 66 6f 72 20  art of data for 
109b0 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  i-th column */. 
109c0 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20   int nField;    
109d0 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66      /* number of
109e0 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 72   fields in the r
109f0 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6c  ecord */.  int l
10a00 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  en;           /*
10a10 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   The length of t
10a20 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61  he serialized da
10a30 74 61 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ta for the colum
10a40 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  n */.  int i;   
10a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
10a60 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 63  p counter */.  c
10a70 68 61 72 20 2a 7a 44 61 74 61 3b 20 20 20 20 20  har *zData;     
10a80 20 20 2f 2a 20 50 61 72 74 20 6f 66 20 74 68 65    /* Part of the
10a90 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65   record being de
10aa0 63 6f 64 65 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a  coded */.  Mem *
10ab0 70 44 65 73 74 3b 20 20 20 20 20 20 20 20 2f 2a  pDest;        /*
10ac0 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
10ad0 74 68 65 20 65 78 74 72 61 63 74 65 64 20 76 61  the extracted va
10ae0 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 73 4d 65  lue */.  Mem sMe
10af0 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
10b00 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 20 72  or storing the r
10b10 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f  ecord being deco
10b20 64 65 64 20 2a 2f 0a 20 20 75 38 20 2a 7a 49 64  ded */.  u8 *zId
10b30 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  x;          /* I
10b40 6e 64 65 78 20 69 6e 74 6f 20 68 65 61 64 65 72  ndex into header
10b50 20 2a 2f 0a 20 20 75 38 20 2a 7a 45 6e 64 48 64   */.  u8 *zEndHd
10b60 72 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  r;       /* Poin
10b70 74 65 72 20 74 6f 20 66 69 72 73 74 20 62 79 74  ter to first byt
10b80 65 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  e after the head
10b90 65 72 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73  er */.  u32 offs
10ba0 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  et;        /* Of
10bb0 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 64 61  fset into the da
10bc0 74 61 20 2a 2f 0a 20 20 75 33 32 20 73 7a 46 69  ta */.  u32 szFi
10bd0 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  eld;       /* Nu
10be0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
10bf0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
10c00 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  a field */.  int
10c10 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 20   szHdr;         
10c20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68  /* Size of the h
10c30 65 61 64 65 72 20 73 69 7a 65 20 66 69 65 6c 64  eader size field
10c40 20 61 74 20 73 74 61 72 74 20 6f 66 20 72 65 63   at start of rec
10c50 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 61 76 61  ord */.  int ava
10c60 69 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  il;         /* N
10c70 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
10c80 66 20 61 76 61 69 6c 61 62 6c 65 20 64 61 74 61  f available data
10c90 20 2a 2f 0a 20 20 75 33 32 20 74 3b 20 20 20 20   */.  u32 t;    
10ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 79           /* A ty
10cb0 70 65 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65  pe code from the
10cc0 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20 2a   record header *
10cd0 2f 0a 20 20 4d 65 6d 20 2a 70 52 65 67 3b 20 20  /.  Mem *pReg;  
10ce0 20 20 20 20 20 20 20 2f 2a 20 50 73 65 75 64 6f         /* Pseudo
10cf0 54 61 62 6c 65 20 69 6e 70 75 74 20 72 65 67 69  Table input regi
10d00 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 70 31 20 3d  ster */...  p1 =
10d10 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d   pOp->p1;.  p2 =
10d20 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 43 20 3d   pOp->p2;.  pC =
10d30 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4d   0;.  memset(&sM
10d40 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4d  em, 0, sizeof(sM
10d50 65 6d 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  em));.  assert( 
10d60 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
10d70 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
10d80 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c  p3>0 && pOp->p3<
10d90 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 44  =p->nMem );.  pD
10da0 65 73 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  est = &aMem[pOp-
10db0 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74  >p3];.  memAbout
10dc0 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 44 65 73  ToChange(p, pDes
10dd0 74 29 3b 0a 20 20 7a 52 65 63 20 3d 20 30 3b 0a  t);.  zRec = 0;.
10de0 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b  .  /* This block
10df0 20 73 65 74 73 20 74 68 65 20 76 61 72 69 61 62   sets the variab
10e00 6c 65 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 74  le payloadSize t
10e10 6f 20 62 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  o be the total n
10e20 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 79  umber of.  ** by
10e30 74 65 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72  tes in the recor
10e40 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 7a 52 65  d..  **.  ** zRe
10e50 63 20 69 73 20 73 65 74 20 74 6f 20 62 65 20 74  c is set to be t
10e60 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
10e70 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   of the record i
10e80 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c  f it is availabl
10e90 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6d 70  e..  ** The comp
10ea0 6c 65 74 65 20 72 65 63 6f 72 64 20 74 65 78 74  lete record text
10eb0 20 69 73 20 61 6c 77 61 79 73 20 61 76 61 69 6c   is always avail
10ec0 61 62 6c 65 20 66 6f 72 20 70 73 65 75 64 6f 2d  able for pseudo-
10ed0 74 61 62 6c 65 73 0a 20 20 2a 2a 20 49 66 20 74  tables.  ** If t
10ee0 68 65 20 72 65 63 6f 72 64 20 69 73 20 73 74 6f  he record is sto
10ef0 72 65 64 20 69 6e 20 61 20 63 75 72 73 6f 72 2c  red in a cursor,
10f00 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 65   the complete re
10f10 63 6f 72 64 20 74 65 78 74 0a 20 20 2a 2a 20 6d  cord text.  ** m
10f20 69 67 68 74 20 62 65 20 61 76 61 69 6c 61 62 6c  ight be availabl
10f30 65 20 69 6e 20 74 68 65 20 20 70 43 2d 3e 61 52  e in the  pC->aR
10f40 6f 77 20 63 61 63 68 65 2e 20 20 4f 72 20 69 74  ow cache.  Or it
10f50 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 2e 0a 20   might not be.. 
10f60 20 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 20   ** If the data 
10f70 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2c 20  is unavailable, 
10f80 20 7a 52 65 63 20 69 73 20 73 65 74 20 74 6f 20   zRec is set to 
10f90 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  NULL..  **.  ** 
10fa0 57 65 20 61 6c 73 6f 20 63 6f 6d 70 75 74 65 20  We also compute 
10fb0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
10fc0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63  lumns in the rec
10fd0 6f 72 64 2e 20 20 46 6f 72 20 63 75 72 73 6f 72  ord.  For cursor
10fe0 73 2c 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62  s,.  ** the numb
10ff0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 73  er of columns is
11000 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
11010 64 62 65 43 75 72 73 6f 72 2e 6e 46 69 65 6c 64  dbeCursor.nField
11020 20 65 6c 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20   element..  */. 
11030 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
11040 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
11050 21 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  !=0 );.#ifndef S
11060 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
11070 41 4c 54 41 42 4c 45 0a 20 20 61 73 73 65 72 74  ALTABLE.  assert
11080 28 20 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f  ( pC->pVtabCurso
11090 72 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20  r==0 );.#endif. 
110a0 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75   pCrsr = pC->pCu
110b0 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 72 73  rsor;.  if( pCrs
110c0 72 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  r!=0 ){.    /* T
110d0 68 65 20 72 65 63 6f 72 64 20 69 73 20 73 74 6f  he record is sto
110e0 72 65 64 20 69 6e 20 61 20 42 2d 54 72 65 65 20  red in a B-Tree 
110f0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
11100 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
11110 65 74 6f 28 70 43 29 3b 0a 20 20 20 20 69 66 28  eto(pC);.    if(
11120 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
11130 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
11140 20 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c 52     if( pC->nullR
11150 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 61 79 6c  ow ){.      payl
11160 6f 61 64 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  oadSize = 0;.   
11170 20 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 63   }else if( pC->c
11180 61 63 68 65 53 74 61 74 75 73 3d 3d 70 2d 3e 63  acheStatus==p->c
11190 61 63 68 65 43 74 72 20 29 7b 0a 20 20 20 20 20  acheCtr ){.     
111a0 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 70   payloadSize = p
111b0 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 3b 0a  C->payloadSize;.
111c0 20 20 20 20 20 20 7a 52 65 63 20 3d 20 28 63 68        zRec = (ch
111d0 61 72 2a 29 70 43 2d 3e 61 52 6f 77 3b 0a 20 20  ar*)pC->aRow;.  
111e0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e    }else if( pC->
111f0 69 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20  isIndex ){.     
11200 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11210 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
11220 69 64 28 70 43 72 73 72 29 20 29 3b 0a 20 20 20  id(pCrsr) );.   
11230 20 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d     VVA_ONLY(rc =
11240 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  ) sqlite3BtreeKe
11250 79 53 69 7a 65 28 70 43 72 73 72 2c 20 26 70 61  ySize(pCrsr, &pa
11260 79 6c 6f 61 64 53 69 7a 65 36 34 29 3b 0a 20 20  yloadSize64);.  
11270 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
11280 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 2f  SQLITE_OK );   /
11290 2a 20 54 72 75 65 20 62 65 63 61 75 73 65 20 6f  * True because o
112a0 66 20 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29  f CursorMoveto()
112b0 20 63 61 6c 6c 20 61 62 6f 76 65 20 2a 2f 0a 20   call above */. 
112c0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 42       /* sqlite3B
112d0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
112e0 28 29 20 75 73 65 73 20 67 65 74 56 61 72 69 6e  () uses getVarin
112f0 74 33 32 28 29 20 74 6f 20 65 78 74 72 61 63 74  t32() to extract
11300 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61   the.      ** pa
11310 79 6c 6f 61 64 20 73 69 7a 65 2c 20 73 6f 20 69  yload size, so i
11320 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20  t is impossible 
11330 66 6f 72 20 70 61 79 6c 6f 61 64 53 69 7a 65 36  for payloadSize6
11340 34 20 74 6f 20 62 65 0a 20 20 20 20 20 20 2a 2a  4 to be.      **
11350 20 6c 61 72 67 65 72 20 74 68 61 6e 20 33 32 20   larger than 32 
11360 62 69 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61  bits. */.      a
11370 73 73 65 72 74 28 20 28 70 61 79 6c 6f 61 64 53  ssert( (payloadS
11380 69 7a 65 36 34 20 26 20 53 51 4c 49 54 45 5f 4d  ize64 & SQLITE_M
11390 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 70 61  AX_U32)==(u64)pa
113a0 79 6c 6f 61 64 53 69 7a 65 36 34 20 29 3b 0a 20  yloadSize64 );. 
113b0 20 20 20 20 20 70 61 79 6c 6f 61 64 53 69 7a 65       payloadSize
113c0 20 3d 20 28 75 33 32 29 70 61 79 6c 6f 61 64 53   = (u32)payloadS
113d0 69 7a 65 36 34 3b 0a 20 20 20 20 7d 65 6c 73 65  ize64;.    }else
113e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
113f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
11400 6f 72 49 73 56 61 6c 69 64 28 70 43 72 73 72 29  orIsValid(pCrsr)
11410 20 29 3b 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e   );.      VVA_ON
11420 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33  LY(rc =) sqlite3
11430 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 70 43  BtreeDataSize(pC
11440 72 73 72 2c 20 26 70 61 79 6c 6f 61 64 53 69 7a  rsr, &payloadSiz
11450 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
11460 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11470 29 3b 20 20 20 2f 2a 20 44 61 74 61 53 69 7a 65  );   /* DataSize
11480 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  () cannot fail *
11490 2f 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  /.    }.  }else 
114a0 69 66 28 20 41 4c 57 41 59 53 28 70 43 2d 3e 70  if( ALWAYS(pC->p
114b0 73 65 75 64 6f 54 61 62 6c 65 52 65 67 3e 30 29  seudoTableReg>0)
114c0 20 29 7b 0a 20 20 20 20 70 52 65 67 20 3d 20 26   ){.    pReg = &
114d0 61 4d 65 6d 5b 70 43 2d 3e 70 73 65 75 64 6f 54  aMem[pC->pseudoT
114e0 61 62 6c 65 52 65 67 5d 3b 0a 20 20 20 20 61 73  ableReg];.    as
114f0 73 65 72 74 28 20 70 52 65 67 2d 3e 66 6c 61 67  sert( pReg->flag
11500 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a  s & MEM_Blob );.
11510 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
11520 73 56 61 6c 69 64 28 70 52 65 67 29 20 29 3b 0a  sValid(pReg) );.
11530 20 20 20 20 70 61 79 6c 6f 61 64 53 69 7a 65 20      payloadSize 
11540 3d 20 70 52 65 67 2d 3e 6e 3b 0a 20 20 20 20 7a  = pReg->n;.    z
11550 52 65 63 20 3d 20 70 52 65 67 2d 3e 7a 3b 0a 20  Rec = pReg->z;. 
11560 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74     pC->cacheStat
11570 75 73 20 3d 20 28 70 4f 70 2d 3e 70 35 26 4f 50  us = (pOp->p5&OP
11580 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29  FLAG_CLEARCACHE)
11590 20 3f 20 43 41 43 48 45 5f 53 54 41 4c 45 20 3a   ? CACHE_STALE :
115a0 20 70 2d 3e 63 61 63 68 65 43 74 72 3b 0a 20 20   p->cacheCtr;.  
115b0 20 20 61 73 73 65 72 74 28 20 70 61 79 6c 6f 61    assert( payloa
115c0 64 53 69 7a 65 3d 3d 30 20 7c 7c 20 7a 52 65 63  dSize==0 || zRec
115d0 21 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  !=0 );.  }else{.
115e0 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20      /* Consider 
115f0 74 68 65 20 72 6f 77 20 74 6f 20 62 65 20 4e 55  the row to be NU
11600 4c 4c 20 2a 2f 0a 20 20 20 20 70 61 79 6c 6f 61  LL */.    payloa
11610 64 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  dSize = 0;.  }..
11620 20 20 2f 2a 20 49 66 20 70 61 79 6c 6f 61 64 53    /* If payloadS
11630 69 7a 65 20 69 73 20 30 2c 20 74 68 65 6e 20 6a  ize is 0, then j
11640 75 73 74 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c  ust store a NULL
11650 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  .  This can happ
11660 65 6e 20 62 65 63 61 75 73 65 20 6f 66 0a 20 20  en because of.  
11670 2a 2a 20 6e 75 6c 6c 52 6f 77 20 6f 72 20 62 65  ** nullRow or be
11680 63 61 75 73 65 20 6f 66 20 61 20 63 6f 72 72 75  cause of a corru
11690 70 74 20 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a  pt database. */.
116a0 20 20 69 66 28 20 70 61 79 6c 6f 61 64 53 69 7a    if( payloadSiz
116b0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 53  e==0 ){.    MemS
116c0 65 74 54 79 70 65 46 6c 61 67 28 70 44 65 73 74  etTypeFlag(pDest
116d0 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
116e0 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f   goto op_column_
116f0 6f 75 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  out;.  }.  asser
11700 74 28 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  t( db->aLimit[SQ
11710 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
11720 48 5d 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  H]>=0 );.  if( p
11730 61 79 6c 6f 61 64 53 69 7a 65 20 3e 20 28 75 33  ayloadSize > (u3
11740 32 29 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  2)db->aLimit[SQL
11750 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
11760 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f  ] ){.    goto to
11770 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a 20 20 6e 46  o_big;.  }..  nF
11780 69 65 6c 64 20 3d 20 70 43 2d 3e 6e 46 69 65 6c  ield = pC->nFiel
11790 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 32 3c  d;.  assert( p2<
117a0 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20  nField );..  /* 
117b0 52 65 61 64 20 61 6e 64 20 70 61 72 73 65 20 74  Read and parse t
117c0 68 65 20 74 61 62 6c 65 20 68 65 61 64 65 72 2e  he table header.
117d0 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75    Store the resu
117e0 6c 74 73 20 6f 66 20 74 68 65 20 70 61 72 73 65  lts of the parse
117f0 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 72  .  ** into the r
11800 65 63 6f 72 64 20 68 65 61 64 65 72 20 63 61 63  ecord header cac
11810 68 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  he fields of the
11820 20 63 75 72 73 6f 72 2e 0a 20 20 2a 2f 0a 20 20   cursor..  */.  
11830 61 54 79 70 65 20 3d 20 70 43 2d 3e 61 54 79 70  aType = pC->aTyp
11840 65 3b 0a 20 20 69 66 28 20 70 43 2d 3e 63 61 63  e;.  if( pC->cac
11850 68 65 53 74 61 74 75 73 3d 3d 70 2d 3e 63 61 63  heStatus==p->cac
11860 68 65 43 74 72 20 29 7b 0a 20 20 20 20 61 4f 66  heCtr ){.    aOf
11870 66 73 65 74 20 3d 20 70 43 2d 3e 61 4f 66 66 73  fset = pC->aOffs
11880 65 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  et;.  }else{.   
11890 20 61 73 73 65 72 74 28 61 54 79 70 65 29 3b 0a   assert(aType);.
118a0 20 20 20 20 61 76 61 69 6c 20 3d 20 30 3b 0a 20      avail = 0;. 
118b0 20 20 20 70 43 2d 3e 61 4f 66 66 73 65 74 20 3d     pC->aOffset =
118c0 20 61 4f 66 66 73 65 74 20 3d 20 26 61 54 79 70   aOffset = &aTyp
118d0 65 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 70  e[nField];.    p
118e0 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d  C->payloadSize =
118f0 20 70 61 79 6c 6f 61 64 53 69 7a 65 3b 0a 20 20   payloadSize;.  
11900 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
11910 73 20 3d 20 70 2d 3e 63 61 63 68 65 43 74 72 3b  s = p->cacheCtr;
11920 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
11930 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74  out how many byt
11940 65 73 20 61 72 65 20 69 6e 20 74 68 65 20 68 65  es are in the he
11950 61 64 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  ader */.    if( 
11960 7a 52 65 63 20 29 7b 0a 20 20 20 20 20 20 7a 44  zRec ){.      zD
11970 61 74 61 20 3d 20 7a 52 65 63 3b 0a 20 20 20 20  ata = zRec;.    
11980 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
11990 20 70 43 2d 3e 69 73 49 6e 64 65 78 20 29 7b 0a   pC->isIndex ){.
119a0 20 20 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20          zData = 
119b0 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 42 74  (char*)sqlite3Bt
119c0 72 65 65 4b 65 79 46 65 74 63 68 28 70 43 72 73  reeKeyFetch(pCrs
119d0 72 2c 20 26 61 76 61 69 6c 29 3b 0a 20 20 20 20  r, &avail);.    
119e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
119f0 20 7a 44 61 74 61 20 3d 20 28 63 68 61 72 2a 29   zData = (char*)
11a00 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
11a10 46 65 74 63 68 28 70 43 72 73 72 2c 20 26 61 76  Fetch(pCrsr, &av
11a20 61 69 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ail);.      }.  
11a30 20 20 20 20 2f 2a 20 49 66 20 4b 65 79 46 65 74      /* If KeyFet
11a40 63 68 28 29 2f 44 61 74 61 46 65 74 63 68 28 29  ch()/DataFetch()
11a50 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20   managed to get 
11a60 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
11a70 61 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73 61 76  ad,.      ** sav
11a80 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e  e the payload in
11a90 20 74 68 65 20 70 43 2d 3e 61 52 6f 77 20 63 61   the pC->aRow ca
11aa0 63 68 65 2e 20 20 54 68 61 74 20 77 69 6c 6c 20  che.  That will 
11ab0 73 61 76 65 20 75 73 20 66 72 6f 6d 0a 20 20 20  save us from.   
11ac0 20 20 20 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20     ** having to 
11ad0 6d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  make additional 
11ae0 63 61 6c 6c 73 20 74 6f 20 66 65 74 63 68 20 74  calls to fetch t
11af0 68 65 20 63 6f 6e 74 65 6e 74 20 70 6f 72 74 69  he content porti
11b00 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  on of.      ** t
11b10 68 65 20 72 65 63 6f 72 64 2e 0a 20 20 20 20 20  he record..     
11b20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
11b30 28 20 61 76 61 69 6c 3e 3d 30 20 29 3b 0a 20 20  ( avail>=0 );.  
11b40 20 20 20 20 69 66 28 20 70 61 79 6c 6f 61 64 53      if( payloadS
11b50 69 7a 65 20 3c 3d 20 28 75 33 32 29 61 76 61 69  ize <= (u32)avai
11b60 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  l ){.        zRe
11b70 63 20 3d 20 7a 44 61 74 61 3b 0a 20 20 20 20 20  c = zData;.     
11b80 20 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20 28 75     pC->aRow = (u
11b90 38 2a 29 7a 44 61 74 61 3b 0a 20 20 20 20 20 20  8*)zData;.      
11ba0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
11bb0 43 2d 3e 61 52 6f 77 20 3d 20 30 3b 0a 20 20 20  C->aRow = 0;.   
11bc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f     }.    }.    /
11bd0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
11be0 61 73 73 65 72 74 20 69 73 20 74 72 75 65 20 69  assert is true i
11bf0 6e 20 61 6c 6c 20 63 61 73 65 73 20 61 63 63 65  n all cases acce
11c00 70 74 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 74  pt when.    ** t
11c10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11c20 20 68 61 73 20 62 65 65 6e 20 63 6f 72 72 75 70   has been corrup
11c30 74 65 64 20 65 78 74 65 72 6e 61 6c 6c 79 2e 0a  ted externally..
11c40 20 20 20 20 2a 2a 20 20 20 20 61 73 73 65 72 74      **    assert
11c50 28 20 7a 52 65 63 21 3d 30 20 7c 7c 20 61 76 61  ( zRec!=0 || ava
11c60 69 6c 3e 3d 70 61 79 6c 6f 61 64 53 69 7a 65 20  il>=payloadSize 
11c70 7c 7c 20 61 76 61 69 6c 3e 3d 39 20 29 3b 20 2a  || avail>=9 ); *
11c80 2f 0a 20 20 20 20 73 7a 48 64 72 20 3d 20 67 65  /.    szHdr = ge
11c90 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 7a  tVarint32((u8*)z
11ca0 44 61 74 61 2c 20 6f 66 66 73 65 74 29 3b 0a 0a  Data, offset);..
11cb0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
11cc0 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
11cd0 61 73 65 20 68 61 73 20 6e 6f 74 20 67 69 76 65  ase has not give
11ce0 6e 20 75 73 20 61 6e 20 6f 76 65 72 73 69 7a 65  n us an oversize
11cf0 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2a 20   header..    ** 
11d00 44 6f 20 74 68 69 73 20 6e 6f 77 20 74 6f 20 61  Do this now to a
11d10 76 6f 69 64 20 61 6e 20 6f 76 65 72 73 69 7a 65  void an oversize
11d20 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
11d30 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  on..    **.    *
11d40 2a 20 54 79 70 65 20 65 6e 74 72 69 65 73 20 63  * Type entries c
11d50 61 6e 20 62 65 20 62 65 74 77 65 65 6e 20 31 20  an be between 1 
11d60 61 6e 64 20 35 20 62 79 74 65 73 20 65 61 63 68  and 5 bytes each
11d70 2e 20 20 42 75 74 20 34 20 61 6e 64 20 35 20 62  .  But 4 and 5 b
11d80 79 74 65 0a 20 20 20 20 2a 2a 20 74 79 70 65 73  yte.    ** types
11d90 20 75 73 65 20 73 6f 20 6d 75 63 68 20 64 61 74   use so much dat
11da0 61 20 73 70 61 63 65 20 74 68 61 74 20 74 68 65  a space that the
11db0 72 65 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 34  re can only be 4
11dc0 30 39 36 20 61 6e 64 20 33 32 20 6f 66 0a 20 20  096 and 32 of.  
11dd0 20 20 2a 2a 20 74 68 65 6d 2c 20 72 65 73 70 65    ** them, respe
11de0 63 74 69 76 65 6c 79 2e 20 20 53 6f 20 74 68 65  ctively.  So the
11df0 20 6d 61 78 69 6d 75 6d 20 68 65 61 64 65 72 20   maximum header 
11e00 6c 65 6e 67 74 68 20 72 65 73 75 6c 74 73 20 66  length results f
11e10 72 6f 6d 20 61 0a 20 20 20 20 2a 2a 20 33 2d 62  rom a.    ** 3-b
11e20 79 74 65 20 74 79 70 65 20 66 6f 72 20 65 61 63  yte type for eac
11e30 68 20 6f 66 20 74 68 65 20 6d 61 78 69 6d 75 6d  h of the maximum
11e40 20 6f 66 20 33 32 37 36 38 20 63 6f 6c 75 6d 6e   of 32768 column
11e50 73 20 70 6c 75 73 20 74 68 72 65 65 0a 20 20 20  s plus three.   
11e60 20 2a 2a 20 65 78 74 72 61 20 62 79 74 65 73 20   ** extra bytes 
11e70 66 6f 72 20 74 68 65 20 68 65 61 64 65 72 20 6c  for the header l
11e80 65 6e 67 74 68 20 69 74 73 65 6c 66 2e 20 20 33  ength itself.  3
11e90 32 37 36 38 2a 33 20 2b 20 33 20 3d 20 39 38 33  2768*3 + 3 = 983
11ea0 30 37 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  07..    */.    i
11eb0 66 28 20 6f 66 66 73 65 74 20 3e 20 39 38 33 30  f( offset > 9830
11ec0 37 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  7 ){.      rc = 
11ed0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11ee0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
11ef0 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20  op_column_out;. 
11f00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d     }..    /* Com
11f10 70 75 74 65 20 69 6e 20 6c 65 6e 20 74 68 65 20  pute in len the 
11f20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
11f30 6f 66 20 64 61 74 61 20 77 65 20 6e 65 65 64 20  of data we need 
11f40 74 6f 20 72 65 61 64 20 69 6e 20 6f 72 64 65 72  to read in order
11f50 0a 20 20 20 20 2a 2a 20 74 6f 20 67 65 74 20 6e  .    ** to get n
11f60 46 69 65 6c 64 20 74 79 70 65 20 76 61 6c 75 65  Field type value
11f70 73 2e 20 20 6f 66 66 73 65 74 20 69 73 20 61 6e  s.  offset is an
11f80 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   upper bound on 
11f90 74 68 69 73 2e 20 20 42 75 74 0a 20 20 20 20 2a  this.  But.    *
11fa0 2a 20 6e 46 69 65 6c 64 20 6d 69 67 68 74 20 62  * nField might b
11fb0 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20  e significantly 
11fc0 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 74 72  less than the tr
11fd0 75 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  ue number of col
11fe0 75 6d 6e 73 0a 20 20 20 20 2a 2a 20 69 6e 20 74  umns.    ** in t
11ff0 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 69 6e  he table, and in
12000 20 74 68 61 74 20 63 61 73 65 2c 20 35 2a 6e 46   that case, 5*nF
12010 69 65 6c 64 2b 33 20 6d 69 67 68 74 20 62 65 20  ield+3 might be 
12020 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 66 66  smaller than off
12030 73 65 74 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77  set..    ** We w
12040 61 6e 74 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20  ant to minimize 
12050 6c 65 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  len in order to 
12060 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f  limit the size o
12070 66 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20  f the memory.   
12080 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20   ** allocation, 
12090 65 73 70 65 63 69 61 6c 6c 79 20 69 66 20 61 20  especially if a 
120a0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
120b0 20 66 69 6c 65 20 68 61 73 20 63 61 75 73 65 64   file has caused
120c0 20 6f 66 66 73 65 74 0a 20 20 20 20 2a 2a 20 74   offset.    ** t
120d0 6f 20 62 65 20 6f 76 65 72 73 69 7a 65 64 2e 20  o be oversized. 
120e0 4f 66 66 73 65 74 20 69 73 20 6c 69 6d 69 74 65  Offset is limite
120f0 64 20 74 6f 20 39 38 33 30 37 20 61 62 6f 76 65  d to 98307 above
12100 2e 20 20 42 75 74 20 39 38 33 30 37 20 6d 69 67  .  But 98307 mig
12110 68 74 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20  ht.    ** still 
12120 65 78 63 65 65 64 20 52 6f 62 73 6f 6e 20 6d 65  exceed Robson me
12130 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
12140 6c 69 6d 69 74 73 20 6f 6e 20 73 6f 6d 65 20 63  limits on some c
12150 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 0a 20  onfigurations.. 
12160 20 20 20 2a 2a 20 4f 6e 20 73 79 73 74 65 6d 73     ** On systems
12170 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 74 6f 6c   that cannot tol
12180 65 72 61 74 65 20 6c 61 72 67 65 20 6d 65 6d 6f  erate large memo
12190 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2c 20  ry allocations, 
121a0 6e 46 69 65 6c 64 2a 35 2b 33 0a 20 20 20 20 2a  nField*5+3.    *
121b0 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 62 65  * will likely be
121c0 20 6d 75 63 68 20 73 6d 61 6c 6c 65 72 20 73 69   much smaller si
121d0 6e 63 65 20 6e 46 69 65 6c 64 20 77 69 6c 6c 20  nce nField will 
121e0 6c 69 6b 65 6c 79 20 62 65 20 6c 65 73 73 20 74  likely be less t
121f0 68 61 6e 0a 20 20 20 20 2a 2a 20 32 30 20 6f 72  han.    ** 20 or
12200 20 73 6f 2e 20 20 54 68 69 73 20 69 6e 73 75 72   so.  This insur
12210 65 73 20 74 68 61 74 20 52 6f 62 73 6f 6e 20 6d  es that Robson m
12220 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
12230 20 6c 69 6d 69 74 73 20 61 72 65 0a 20 20 20 20   limits are.    
12240 2a 2a 20 6e 6f 74 20 65 78 63 65 65 64 65 64 20  ** not exceeded 
12250 65 76 65 6e 20 66 6f 72 20 63 6f 72 72 75 70 74  even for corrupt
12260 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
12270 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20  .    */.    len 
12280 3d 20 6e 46 69 65 6c 64 2a 35 20 2b 20 33 3b 0a  = nField*5 + 3;.
12290 20 20 20 20 69 66 28 20 6c 65 6e 20 3e 20 28 69      if( len > (i
122a0 6e 74 29 6f 66 66 73 65 74 20 29 20 6c 65 6e 20  nt)offset ) len 
122b0 3d 20 28 69 6e 74 29 6f 66 66 73 65 74 3b 0a 0a  = (int)offset;..
122c0 20 20 20 20 2f 2a 20 54 68 65 20 4b 65 79 46 65      /* The KeyFe
122d0 74 63 68 28 29 20 6f 72 20 44 61 74 61 46 65 74  tch() or DataFet
122e0 63 68 28 29 20 61 62 6f 76 65 20 61 72 65 20 66  ch() above are f
122f0 61 73 74 20 61 6e 64 20 77 69 6c 6c 20 67 65 74  ast and will get
12300 20 74 68 65 20 65 6e 74 69 72 65 0a 20 20 20 20   the entire.    
12310 2a 2a 20 72 65 63 6f 72 64 20 68 65 61 64 65 72  ** record header
12320 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 2e 20   in most cases. 
12330 20 42 75 74 20 74 68 65 79 20 77 69 6c 6c 20 66   But they will f
12340 61 69 6c 20 74 6f 20 67 65 74 20 74 68 65 20 63  ail to get the c
12350 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 72  omplete.    ** r
12360 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 66 20  ecord header if 
12370 74 68 65 20 72 65 63 6f 72 64 20 68 65 61 64 65  the record heade
12380 72 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 6f  r does not fit o
12390 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 0a  n a single page.
123a0 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 42 2d      ** in the B-
123b0 54 72 65 65 2e 20 20 57 68 65 6e 20 74 68 61 74  Tree.  When that
123c0 20 68 61 70 70 65 6e 73 2c 20 75 73 65 20 73 71   happens, use sq
123d0 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
123e0 42 74 72 65 65 28 29 20 74 6f 0a 20 20 20 20 2a  Btree() to.    *
123f0 2a 20 61 63 71 75 69 72 65 20 74 68 65 20 63 6f  * acquire the co
12400 6d 70 6c 65 74 65 20 68 65 61 64 65 72 20 74 65  mplete header te
12410 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  xt..    */.    i
12420 66 28 20 21 7a 52 65 63 20 26 26 20 61 76 61 69  f( !zRec && avai
12430 6c 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 20 20 73  l<len ){.      s
12440 4d 65 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20  Mem.flags = 0;. 
12450 20 20 20 20 20 73 4d 65 6d 2e 64 62 20 3d 20 30       sMem.db = 0
12460 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
12470 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
12480 74 72 65 65 28 70 43 72 73 72 2c 20 30 2c 20 6c  tree(pCrsr, 0, l
12490 65 6e 2c 20 70 43 2d 3e 69 73 49 6e 64 65 78 2c  en, pC->isIndex,
124a0 20 26 73 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69   &sMem);.      i
124b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
124c0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
124d0 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a   op_column_out;.
124e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 44        }.      zD
124f0 61 74 61 20 3d 20 73 4d 65 6d 2e 7a 3b 0a 20 20  ata = sMem.z;.  
12500 20 20 7d 0a 20 20 20 20 7a 45 6e 64 48 64 72 20    }.    zEndHdr 
12510 3d 20 28 75 38 20 2a 29 26 7a 44 61 74 61 5b 6c  = (u8 *)&zData[l
12520 65 6e 5d 3b 0a 20 20 20 20 7a 49 64 78 20 3d 20  en];.    zIdx = 
12530 28 75 38 20 2a 29 26 7a 44 61 74 61 5b 73 7a 48  (u8 *)&zData[szH
12540 64 72 5d 3b 0a 0a 20 20 20 20 2f 2a 20 53 63 61  dr];..    /* Sca
12550 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  n the header and
12560 20 75 73 65 20 69 74 20 74 6f 20 66 69 6c 6c 20   use it to fill 
12570 69 6e 20 74 68 65 20 61 54 79 70 65 5b 5d 20 61  in the aType[] a
12580 6e 64 20 61 4f 66 66 73 65 74 5b 5d 0a 20 20 20  nd aOffset[].   
12590 20 2a 2a 20 61 72 72 61 79 73 2e 20 20 61 54 79   ** arrays.  aTy
125a0 70 65 5b 69 5d 20 77 69 6c 6c 20 63 6f 6e 74 61  pe[i] will conta
125b0 69 6e 20 74 68 65 20 74 79 70 65 20 69 6e 74 65  in the type inte
125c0 67 65 72 20 66 6f 72 20 74 68 65 20 69 2d 74 68  ger for the i-th
125d0 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 61  .    ** column a
125e0 6e 64 20 61 4f 66 66 73 65 74 5b 69 5d 20 77 69  nd aOffset[i] wi
125f0 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6f  ll contain the o
12600 66 66 73 65 74 20 66 72 6f 6d 20 74 68 65 20 62  ffset from the b
12610 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  eginning.    ** 
12620 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f  of the record to
12630 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
12640 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 69  e data for the i
12650 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  -th column.    *
12660 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
12670 3c 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20  <nField; i++){. 
12680 20 20 20 20 20 69 66 28 20 7a 49 64 78 3c 7a 45       if( zIdx<zE
12690 6e 64 48 64 72 20 29 7b 0a 20 20 20 20 20 20 20  ndHdr ){.       
126a0 20 61 4f 66 66 73 65 74 5b 69 5d 20 3d 20 6f 66   aOffset[i] = of
126b0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66  fset;.        if
126c0 28 20 7a 49 64 78 5b 30 5d 3c 30 78 38 30 20 29  ( zIdx[0]<0x80 )
126d0 7b 0a 20 20 20 20 20 20 20 20 20 20 74 20 3d 20  {.          t = 
126e0 7a 49 64 78 5b 30 5d 3b 0a 20 20 20 20 20 20 20  zIdx[0];.       
126f0 20 20 20 7a 49 64 78 2b 2b 3b 0a 20 20 20 20 20     zIdx++;.     
12700 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12710 20 20 20 20 7a 49 64 78 20 2b 3d 20 73 71 6c 69      zIdx += sqli
12720 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 7a  te3GetVarint32(z
12730 49 64 78 2c 20 26 74 29 3b 0a 20 20 20 20 20 20  Idx, &t);.      
12740 20 20 7d 0a 20 20 20 20 20 20 20 20 61 54 79 70    }.        aTyp
12750 65 5b 69 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20  e[i] = t;.      
12760 20 20 73 7a 46 69 65 6c 64 20 3d 20 73 71 6c 69    szField = sqli
12770 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
12780 65 4c 65 6e 28 74 29 3b 0a 20 20 20 20 20 20 20  eLen(t);.       
12790 20 6f 66 66 73 65 74 20 2b 3d 20 73 7a 46 69 65   offset += szFie
127a0 6c 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ld;.        if( 
127b0 6f 66 66 73 65 74 3c 73 7a 46 69 65 6c 64 20 29  offset<szField )
127c0 7b 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 66  {  /* True if of
127d0 66 73 65 74 20 6f 76 65 72 66 6c 6f 77 73 20 2a  fset overflows *
127e0 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 49 64 78  /.          zIdx
127f0 20 3d 20 26 7a 45 6e 64 48 64 72 5b 31 5d 3b 20   = &zEndHdr[1]; 
12800 20 2f 2a 20 46 6f 72 63 65 73 20 53 51 4c 49 54   /* Forces SQLIT
12810 45 5f 43 4f 52 52 55 50 54 20 72 65 74 75 72 6e  E_CORRUPT return
12820 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
12830 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
12840 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
12850 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
12860 69 20 69 73 20 6c 65 73 73 20 74 68 61 74 20 6e  i is less that n
12870 46 69 65 6c 64 2c 20 74 68 65 6e 20 74 68 65 72  Field, then ther
12880 65 20 61 72 65 20 6c 65 73 73 20 66 69 65 6c 64  e are less field
12890 73 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20  s in this.      
128a0 20 20 2a 2a 20 72 65 63 6f 72 64 20 74 68 61 6e    ** record than
128b0 20 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20 69   SetNumColumns i
128c0 6e 64 69 63 61 74 65 64 20 74 68 65 72 65 20 61  ndicated there a
128d0 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  re columns in th
128e0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  e.        ** tab
128f0 6c 65 2e 20 53 65 74 20 74 68 65 20 6f 66 66 73  le. Set the offs
12900 65 74 20 66 6f 72 20 61 6e 79 20 65 78 74 72 61  et for any extra
12910 20 63 6f 6c 75 6d 6e 73 20 6e 6f 74 20 70 72 65   columns not pre
12920 73 65 6e 74 20 69 6e 0a 20 20 20 20 20 20 20 20  sent in.        
12930 2a 2a 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f  ** the record to
12940 20 30 2e 20 54 68 69 73 20 74 65 6c 6c 73 20 63   0. This tells c
12950 6f 64 65 20 62 65 6c 6f 77 20 74 6f 20 73 74 6f  ode below to sto
12960 72 65 20 61 20 4e 55 4c 4c 0a 20 20 20 20 20 20  re a NULL.      
12970 20 20 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20    ** instead of 
12980 64 65 73 65 72 69 61 6c 69 7a 69 6e 67 20 61 20  deserializing a 
12990 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 72  value from the r
129a0 65 63 6f 72 64 2e 0a 20 20 20 20 20 20 20 20 2a  ecord..        *
129b0 2f 0a 20 20 20 20 20 20 20 20 61 4f 66 66 73 65  /.        aOffse
129c0 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  t[i] = 0;.      
129d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
129e0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
129f0 65 28 26 73 4d 65 6d 29 3b 0a 20 20 20 20 73 4d  e(&sMem);.    sM
12a00 65 6d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  em.flags = MEM_N
12a10 75 6c 6c 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ull;..    /* If 
12a20 77 65 20 68 61 76 65 20 72 65 61 64 20 6d 6f 72  we have read mor
12a30 65 20 68 65 61 64 65 72 20 64 61 74 61 20 74 68  e header data th
12a40 61 6e 20 77 61 73 20 63 6f 6e 74 61 69 6e 65 64  an was contained
12a50 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2c 0a   in the header,.
12a60 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65      ** or if the
12a70 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73 74   end of the last
12a80 20 66 69 65 6c 64 20 61 70 70 65 61 72 73 20 74   field appears t
12a90 6f 20 62 65 20 70 61 73 74 20 74 68 65 20 65 6e  o be past the en
12aa0 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
12ab0 72 65 63 6f 72 64 2c 20 6f 72 20 69 66 20 74 68  record, or if th
12ac0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73  e end of the las
12ad0 74 20 66 69 65 6c 64 20 61 70 70 65 61 72 73 20  t field appears 
12ae0 74 6f 20 62 65 20 62 65 66 6f 72 65 20 74 68 65  to be before the
12af0 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 74   end.    ** of t
12b00 68 65 20 72 65 63 6f 72 64 20 28 77 68 65 6e 20  he record (when 
12b10 61 6c 6c 20 66 69 65 6c 64 73 20 70 72 65 73 65  all fields prese
12b20 6e 74 29 2c 20 74 68 65 6e 20 77 65 20 6d 75 73  nt), then we mus
12b30 74 20 62 65 20 64 65 61 6c 69 6e 67 20 0a 20 20  t be dealing .  
12b40 20 20 2a 2a 20 77 69 74 68 20 61 20 63 6f 72 72    ** with a corr
12b50 75 70 74 20 64 61 74 61 62 61 73 65 2e 0a 20 20  upt database..  
12b60 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 7a 49    */.    if( (zI
12b70 64 78 20 3e 20 7a 45 6e 64 48 64 72 29 20 7c 7c  dx > zEndHdr) ||
12b80 20 28 6f 66 66 73 65 74 20 3e 20 70 61 79 6c 6f   (offset > paylo
12b90 61 64 53 69 7a 65 29 0a 20 20 20 20 20 20 20 20  adSize).        
12ba0 20 7c 7c 20 28 7a 49 64 78 3d 3d 7a 45 6e 64 48   || (zIdx==zEndH
12bb0 64 72 20 26 26 20 6f 66 66 73 65 74 21 3d 70 61  dr && offset!=pa
12bc0 79 6c 6f 61 64 53 69 7a 65 29 20 29 7b 0a 20 20  yloadSize) ){.  
12bd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12be0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
12bf0 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75      goto op_colu
12c00 6d 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  mn_out;.    }.  
12c10 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  }..  /* Get the 
12c20 63 6f 6c 75 6d 6e 20 69 6e 66 6f 72 6d 61 74 69  column informati
12c30 6f 6e 2e 20 49 66 20 61 4f 66 66 73 65 74 5b 70  on. If aOffset[p
12c40 32 5d 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  2] is non-zero, 
12c50 74 68 65 6e 20 0a 20 20 2a 2a 20 64 65 73 65 72  then .  ** deser
12c60 69 61 6c 69 7a 65 20 74 68 65 20 76 61 6c 75 65  ialize the value
12c70 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64   from the record
12c80 2e 20 49 66 20 61 4f 66 66 73 65 74 5b 70 32 5d  . If aOffset[p2]
12c90 20 69 73 20 7a 65 72 6f 2c 0a 20 20 2a 2a 20 74   is zero,.  ** t
12ca0 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
12cb0 74 20 65 6e 6f 75 67 68 20 66 69 65 6c 64 73 20  t enough fields 
12cc0 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f  in the record to
12cd0 20 73 61 74 69 73 66 79 20 74 68 65 0a 20 20 2a   satisfy the.  *
12ce0 2a 20 72 65 71 75 65 73 74 2e 20 20 49 6e 20 74  * request.  In t
12cf0 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74 68  his case, set th
12d00 65 20 76 61 6c 75 65 20 4e 55 4c 4c 20 6f 72 20  e value NULL or 
12d10 74 6f 20 50 34 20 69 66 20 50 34 20 69 73 0a 20  to P4 if P4 is. 
12d20 20 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   ** a pointer to
12d30 20 61 20 4d 65 6d 20 6f 62 6a 65 63 74 2e 0a 20   a Mem object.. 
12d40 20 2a 2f 0a 20 20 69 66 28 20 61 4f 66 66 73 65   */.  if( aOffse
12d50 74 5b 70 32 5d 20 29 7b 0a 20 20 20 20 61 73 73  t[p2] ){.    ass
12d60 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
12d70 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 52  OK );.    if( zR
12d80 65 63 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65  ec ){.      Vdbe
12d90 4d 65 6d 52 65 6c 65 61 73 65 28 70 44 65 73 74  MemRelease(pDest
12da0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12db0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
12dc0 38 20 2a 29 26 7a 52 65 63 5b 61 4f 66 66 73 65  8 *)&zRec[aOffse
12dd0 74 5b 70 32 5d 5d 2c 20 61 54 79 70 65 5b 70 32  t[p2]], aType[p2
12de0 5d 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 7d  ], pDest);.    }
12df0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 65 6e 20  else{.      len 
12e00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
12e10 69 61 6c 54 79 70 65 4c 65 6e 28 61 54 79 70 65  ialTypeLen(aType
12e20 5b 70 32 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c  [p2]);.      sql
12e30 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28  ite3VdbeMemMove(
12e40 26 73 4d 65 6d 2c 20 70 44 65 73 74 29 3b 0a 20  &sMem, pDest);. 
12e50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12e60 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
12e70 65 28 70 43 72 73 72 2c 20 61 4f 66 66 73 65 74  e(pCrsr, aOffset
12e80 5b 70 32 5d 2c 20 6c 65 6e 2c 20 70 43 2d 3e 69  [p2], len, pC->i
12e90 73 49 6e 64 65 78 2c 20 26 73 4d 65 6d 29 3b 0a  sIndex, &sMem);.
12ea0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
12eb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12ec0 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d     goto op_colum
12ed0 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  n_out;.      }. 
12ee0 20 20 20 20 20 7a 44 61 74 61 20 3d 20 73 4d 65       zData = sMe
12ef0 6d 2e 7a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  m.z;.      sqlit
12f00 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
12f10 28 75 38 2a 29 7a 44 61 74 61 2c 20 61 54 79 70  (u8*)zData, aTyp
12f20 65 5b 70 32 5d 2c 20 70 44 65 73 74 29 3b 0a 20  e[p2], pDest);. 
12f30 20 20 20 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e     }.    pDest->
12f40 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a  enc = encoding;.
12f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
12f60 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
12f70 5f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71  _MEM ){.      sq
12f80 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
12f90 6c 6f 77 43 6f 70 79 28 70 44 65 73 74 2c 20 70  lowCopy(pDest, p
12fa0 4f 70 2d 3e 70 34 2e 70 4d 65 6d 2c 20 4d 45 4d  Op->p4.pMem, MEM
12fb0 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 7d 65  _Static);.    }e
12fc0 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65 6d 53 65  lse{.      MemSe
12fd0 74 54 79 70 65 46 6c 61 67 28 70 44 65 73 74 2c  tTypeFlag(pDest,
12fe0 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20   MEM_Null);.    
12ff0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  }.  }..  /* If w
13000 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  e dynamically al
13010 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20 74 6f  located space to
13020 20 68 6f 6c 64 20 74 68 65 20 64 61 74 61 20 28   hold the data (
13030 69 6e 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  in the.  ** sqli
13040 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
13050 72 65 65 28 29 20 63 61 6c 6c 20 61 62 6f 76 65  ree() call above
13060 29 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  ) then transfer 
13070 63 6f 6e 74 72 6f 6c 20 6f 66 20 74 68 61 74 0a  control of that.
13080 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79    ** dynamically
13090 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
130a0 20 6f 76 65 72 20 74 6f 20 74 68 65 20 70 44 65   over to the pDe
130b0 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  st structure..  
130c0 2a 2a 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  ** This prevents
130d0 20 61 20 6d 65 6d 6f 72 79 20 63 6f 70 79 2e 0a   a memory copy..
130e0 20 20 2a 2f 0a 20 20 69 66 28 20 73 4d 65 6d 2e    */.  if( sMem.
130f0 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 61  zMalloc ){.    a
13100 73 73 65 72 74 28 20 73 4d 65 6d 2e 7a 3d 3d 73  ssert( sMem.z==s
13110 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63 20 29 3b 0a 20  Mem.zMalloc );. 
13120 20 20 20 61 73 73 65 72 74 28 20 21 28 70 44 65     assert( !(pDe
13130 73 74 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  st->flags & MEM_
13140 44 79 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65  Dyn) );.    asse
13150 72 74 28 20 21 28 70 44 65 73 74 2d 3e 66 6c 61  rt( !(pDest->fla
13160 67 73 20 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c 4d  gs & (MEM_Blob|M
13170 45 4d 5f 53 74 72 29 29 20 7c 7c 20 70 44 65 73  EM_Str)) || pDes
13180 74 2d 3e 7a 3d 3d 73 4d 65 6d 2e 7a 20 29 3b 0a  t->z==sMem.z );.
13190 20 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73      pDest->flags
131a0 20 26 3d 20 7e 28 4d 45 4d 5f 45 70 68 65 6d 7c   &= ~(MEM_Ephem|
131b0 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20 20  MEM_Static);.   
131c0 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 7c 3d   pDest->flags |=
131d0 20 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 70   MEM_Term;.    p
131e0 44 65 73 74 2d 3e 7a 20 3d 20 73 4d 65 6d 2e 7a  Dest->z = sMem.z
131f0 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 7a 4d 61  ;.    pDest->zMa
13200 6c 6c 6f 63 20 3d 20 73 4d 65 6d 2e 7a 4d 61 6c  lloc = sMem.zMal
13210 6c 6f 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  loc;.  }..  rc =
13220 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d   sqlite3VdbeMemM
13230 61 6b 65 57 72 69 74 65 61 62 6c 65 28 70 44 65  akeWriteable(pDe
13240 73 74 29 3b 0a 0a 6f 70 5f 63 6f 6c 75 6d 6e 5f  st);..op_column_
13250 6f 75 74 3a 0a 20 20 55 50 44 41 54 45 5f 4d 41  out:.  UPDATE_MA
13260 58 5f 42 4c 4f 42 53 49 5a 45 28 70 44 65 73 74  X_BLOBSIZE(pDest
13270 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  );.  REGISTER_TR
13280 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 44 65  ACE(pOp->p3, pDe
13290 73 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  st);.  break;.}.
132a0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 66 66 69  ./* Opcode: Affi
132b0 6e 69 74 79 20 50 31 20 50 32 20 2a 20 50 34 20  nity P1 P2 * P4 
132c0 2a 0a 2a 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 66  *.**.** Apply af
132d0 66 69 6e 69 74 69 65 73 20 74 6f 20 61 20 72 61  finities to a ra
132e0 6e 67 65 20 6f 66 20 50 32 20 72 65 67 69 73 74  nge of P2 regist
132f0 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74  ers starting wit
13300 68 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69  h P1..**.** P4 i
13310 73 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  s a string that 
13320 69 73 20 50 32 20 63 68 61 72 61 63 74 65 72 73  is P2 characters
13330 20 6c 6f 6e 67 2e 20 54 68 65 20 6e 74 68 20 63   long. The nth c
13340 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 0a  haracter of the.
13350 2a 2a 20 73 74 72 69 6e 67 20 69 6e 64 69 63 61  ** string indica
13360 74 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  tes the column a
13370 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
13380 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20  uld be used for 
13390 74 68 65 20 6e 74 68 0a 2a 2a 20 6d 65 6d 6f 72  the nth.** memor
133a0 79 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 72 61  y cell in the ra
133b0 6e 67 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  nge..*/.case OP_
133c0 41 66 66 69 6e 69 74 79 3a 20 7b 0a 20 20 63 6f  Affinity: {.  co
133d0 6e 73 74 20 63 68 61 72 20 2a 7a 41 66 66 69 6e  nst char *zAffin
133e0 69 74 79 3b 20 20 20 2f 2a 20 54 68 65 20 61 66  ity;   /* The af
133f0 66 69 6e 69 74 79 20 74 6f 20 62 65 20 61 70 70  finity to be app
13400 6c 69 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 63  lied */.  char c
13410 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aff;            
13420 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63     /* A single c
13430 68 61 72 61 63 74 65 72 20 6f 66 20 61 66 66 69  haracter of affi
13440 6e 69 74 79 20 2a 2f 0a 0a 20 20 7a 41 66 66 69  nity */..  zAffi
13450 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  nity = pOp->p4.z
13460 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66 66  ;.  assert( zAff
13470 69 6e 69 74 79 21 3d 30 20 29 3b 0a 20 20 61 73  inity!=0 );.  as
13480 73 65 72 74 28 20 7a 41 66 66 69 6e 69 74 79 5b  sert( zAffinity[
13490 70 4f 70 2d 3e 70 32 5d 3d 3d 30 20 29 3b 0a 20  pOp->p2]==0 );. 
134a0 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
134b0 70 2d 3e 70 31 5d 3b 0a 20 20 77 68 69 6c 65 28  p->p1];.  while(
134c0 20 28 63 41 66 66 20 3d 20 2a 28 7a 41 66 66 69   (cAff = *(zAffi
134d0 6e 69 74 79 2b 2b 29 29 21 3d 30 20 29 7b 0a 20  nity++))!=0 ){. 
134e0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 20     assert( pIn1 
134f0 3c 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 2d 3e 6e  <= &p->aMem[p->n
13500 4d 65 6d 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  Mem] );.    asse
13510 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70  rt( memIsValid(p
13520 49 6e 31 29 20 29 3b 0a 20 20 20 20 45 78 70 61  In1) );.    Expa
13530 6e 64 42 6c 6f 62 28 70 49 6e 31 29 3b 0a 20 20  ndBlob(pIn1);.  
13540 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28    applyAffinity(
13550 70 49 6e 31 2c 20 63 41 66 66 2c 20 65 6e 63 6f  pIn1, cAff, enco
13560 64 69 6e 67 29 3b 0a 20 20 20 20 70 49 6e 31 2b  ding);.    pIn1+
13570 2b 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  +;.  }.  break;.
13580 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 61  }../* Opcode: Ma
13590 6b 65 52 65 63 6f 72 64 20 50 31 20 50 32 20 50  keRecord P1 P2 P
135a0 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6e  3 P4 *.**.** Con
135b0 76 65 72 74 20 50 32 20 72 65 67 69 73 74 65 72  vert P2 register
135c0 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  s beginning with
135d0 20 50 31 20 69 6e 74 6f 20 74 68 65 20 5b 72 65   P1 into the [re
135e0 63 6f 72 64 20 66 6f 72 6d 61 74 5d 0a 2a 2a 20  cord format].** 
135f0 75 73 65 20 61 73 20 61 20 64 61 74 61 20 72 65  use as a data re
13600 63 6f 72 64 20 69 6e 20 61 20 64 61 74 61 62 61  cord in a databa
13610 73 65 20 74 61 62 6c 65 20 6f 72 20 61 73 20 61  se table or as a
13620 20 6b 65 79 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e   key.** in an in
13630 64 65 78 2e 20 20 54 68 65 20 4f 50 5f 43 6f 6c  dex.  The OP_Col
13640 75 6d 6e 20 6f 70 63 6f 64 65 20 63 61 6e 20 64  umn opcode can d
13650 65 63 6f 64 65 20 74 68 65 20 72 65 63 6f 72 64  ecode the record
13660 20 6c 61 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 50 34   later..**.** P4
13670 20 6d 61 79 20 62 65 20 61 20 73 74 72 69 6e 67   may be a string
13680 20 74 68 61 74 20 69 73 20 50 32 20 63 68 61 72   that is P2 char
13690 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20 20 54 68  acters long.  Th
136a0 65 20 6e 74 68 20 63 68 61 72 61 63 74 65 72 20  e nth character 
136b0 6f 66 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67  of the.** string
136c0 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 63   indicates the c
136d0 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 74  olumn affinity t
136e0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
136f0 65 64 20 66 6f 72 20 74 68 65 20 6e 74 68 0a 2a  ed for the nth.*
13700 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69  * field of the i
13710 6e 64 65 78 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  ndex key..**.** 
13720 54 68 65 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d  The mapping from
13730 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 61 66   character to af
13740 66 69 6e 69 74 79 20 69 73 20 67 69 76 65 6e 20  finity is given 
13750 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  by the SQLITE_AF
13760 46 5f 0a 2a 2a 20 6d 61 63 72 6f 73 20 64 65 66  F_.** macros def
13770 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e  ined in sqliteIn
13780 74 2e 68 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34  t.h..**.** If P4
13790 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 6c   is NULL then al
137a0 6c 20 69 6e 64 65 78 20 66 69 65 6c 64 73 20 68  l index fields h
137b0 61 76 65 20 74 68 65 20 61 66 66 69 6e 69 74 79  ave the affinity
137c0 20 4e 4f 4e 45 2e 0a 2a 2f 0a 63 61 73 65 20 4f   NONE..*/.case O
137d0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 3a 20 7b 0a  P_MakeRecord: {.
137e0 20 20 75 38 20 2a 7a 4e 65 77 52 65 63 6f 72 64    u8 *zNewRecord
137f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 75  ;        /* A bu
13800 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
13810 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 6e 65   data for the ne
13820 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65  w record */.  Me
13830 6d 20 2a 70 52 65 63 3b 20 20 20 20 20 20 20 20  m *pRec;        
13840 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
13850 72 65 63 6f 72 64 20 2a 2f 0a 20 20 75 36 34 20  record */.  u64 
13860 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
13870 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13880 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 73 70  bytes of data sp
13890 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 64  ace */.  int nHd
138a0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
138b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
138c0 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 70 61  es of header spa
138d0 63 65 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74  ce */.  i64 nByt
138e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
138f0 2a 20 44 61 74 61 20 73 70 61 63 65 20 72 65 71  * Data space req
13900 75 69 72 65 64 20 66 6f 72 20 74 68 69 73 20 72  uired for this r
13910 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
13920 5a 65 72 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Zero;           
13930 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a    /* Number of z
13940 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65  ero bytes at the
13950 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f   end of the reco
13960 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  rd */.  int nVar
13970 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  int;           /
13980 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
13990 73 20 69 6e 20 61 20 76 61 72 69 6e 74 20 2a 2f  s in a varint */
139a0 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
139b0 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 79 70  pe;       /* Typ
139c0 65 20 66 69 65 6c 64 20 2a 2f 0a 20 20 4d 65 6d  e field */.  Mem
139d0 20 2a 70 44 61 74 61 30 3b 20 20 20 20 20 20 20   *pData0;       
139e0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66 69 65      /* First fie
139f0 6c 64 20 74 6f 20 62 65 20 63 6f 6d 62 69 6e 65  ld to be combine
13a00 64 20 69 6e 74 6f 20 74 68 65 20 72 65 63 6f 72  d into the recor
13a10 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4c 61 73  d */.  Mem *pLas
13a20 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
13a30 20 4c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   Last field of t
13a40 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  he record */.  i
13a50 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20  nt nField;      
13a60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13a70 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  of fields in the
13a80 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61   record */.  cha
13a90 72 20 2a 7a 41 66 66 69 6e 69 74 79 3b 20 20 20  r *zAffinity;   
13aa0 20 20 20 20 2f 2a 20 54 68 65 20 61 66 66 69 6e      /* The affin
13ab0 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 74  ity string for t
13ac0 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  he record */.  i
13ad0 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3b 20  nt file_format; 
13ae0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 66 6f        /* File fo
13af0 72 6d 61 74 20 74 6f 20 75 73 65 20 66 6f 72 20  rmat to use for 
13b00 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  encoding */.  in
13b10 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
13b20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73       /* Space us
13b30 65 64 20 69 6e 20 7a 4e 65 77 52 65 63 6f 72 64  ed in zNewRecord
13b40 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b  [] */.  int len;
13b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13b60 2a 20 4c 65 6e 67 74 68 20 6f 66 20 61 20 66 69  * Length of a fi
13b70 65 6c 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 73 73  eld */..  /* Ass
13b80 75 6d 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  uming the record
13b90 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c   contains N fiel
13ba0 64 73 2c 20 74 68 65 20 72 65 63 6f 72 64 20 66  ds, the record f
13bb0 6f 72 6d 61 74 20 6c 6f 6f 6b 73 0a 20 20 2a 2a  ormat looks.  **
13bc0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
13bd0 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .  ** ----------
13be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
13c20 20 2a 2a 20 7c 20 68 64 72 2d 73 69 7a 65 20 7c   ** | hdr-size |
13c30 20 74 79 70 65 20 30 20 7c 20 74 79 70 65 20 31   type 0 | type 1
13c40 20 7c 20 2e 2e 2e 20 7c 20 74 79 70 65 20 4e 2d   | ... | type N-
13c50 31 20 7c 20 64 61 74 61 30 20 7c 20 2e 2e 2e 20  1 | data0 | ... 
13c60 7c 20 64 61 74 61 20 4e 2d 31 20 7c 20 0a 20 20  | data N-1 | .  
13c70 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
13c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a  -----------.  **
13cc0 0a 20 20 2a 2a 20 44 61 74 61 28 30 29 20 69 73  .  ** Data(0) is
13cd0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69   taken from regi
13ce0 73 74 65 72 20 50 31 2e 20 20 44 61 74 61 28 31  ster P1.  Data(1
13cf0 29 20 63 6f 6d 65 73 20 66 72 6f 6d 20 72 65 67  ) comes from reg
13d00 69 73 74 65 72 20 50 31 2b 31 0a 20 20 2a 2a 20  ister P1+1.  ** 
13d10 61 6e 64 20 73 6f 20 66 72 6f 74 68 2e 0a 20 20  and so froth..  
13d20 2a 2a 0a 20 20 2a 2a 20 45 61 63 68 20 74 79 70  **.  ** Each typ
13d30 65 20 66 69 65 6c 64 20 69 73 20 61 20 76 61 72  e field is a var
13d40 69 6e 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  int representing
13d50 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
13d60 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f   of the .  ** co
13d70 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61  rresponding data
13d80 20 65 6c 65 6d 65 6e 74 20 28 73 65 65 20 73 71   element (see sq
13d90 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
13da0 79 70 65 28 29 29 2e 20 54 68 65 0a 20 20 2a 2a  ype()). The.  **
13db0 20 68 64 72 2d 73 69 7a 65 20 66 69 65 6c 64 20   hdr-size field 
13dc0 69 73 20 61 6c 73 6f 20 61 20 76 61 72 69 6e 74  is also a varint
13dd0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6f 66   which is the of
13de0 66 73 65 74 20 66 72 6f 6d 20 74 68 65 20 62 65  fset from the be
13df0 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20  ginning.  ** of 
13e00 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 64 61  the record to da
13e10 74 61 30 2e 0a 20 20 2a 2f 0a 20 20 6e 44 61 74  ta0..  */.  nDat
13e20 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  a = 0;         /
13e30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
13e40 73 20 6f 66 20 64 61 74 61 20 73 70 61 63 65 20  s of data space 
13e50 2a 2f 0a 20 20 6e 48 64 72 20 3d 20 30 3b 20 20  */.  nHdr = 0;  
13e60 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13e70 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 68 65  r of bytes of he
13e80 61 64 65 72 20 73 70 61 63 65 20 2a 2f 0a 20 20  ader space */.  
13e90 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20  nZero = 0;      
13ea0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13eb0 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68  zero bytes at th
13ec0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 63  e end of the rec
13ed0 6f 72 64 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20  ord */.  nField 
13ee0 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 41 66  = pOp->p1;.  zAf
13ef0 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34  finity = pOp->p4
13f00 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46  .z;.  assert( nF
13f10 69 65 6c 64 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ield>0 && pOp->p
13f20 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 6e  2>0 && pOp->p2+n
13f30 46 69 65 6c 64 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31  Field<=p->nMem+1
13f40 20 29 3b 0a 20 20 70 44 61 74 61 30 20 3d 20 26   );.  pData0 = &
13f50 61 4d 65 6d 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20  aMem[nField];.  
13f60 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 32  nField = pOp->p2
13f70 3b 0a 20 20 70 4c 61 73 74 20 3d 20 26 70 44 61  ;.  pLast = &pDa
13f80 74 61 30 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a 20  ta0[nField-1];. 
13f90 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 70   file_format = p
13fa0 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f  ->minWriteFileFo
13fb0 72 6d 61 74 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e  rmat;..  /* Iden
13fc0 74 69 66 79 20 74 68 65 20 6f 75 74 70 75 74 20  tify the output 
13fd0 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 61 73  register */.  as
13fe0 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f  sert( pOp->p3<pO
13ff0 70 2d 3e 70 31 20 7c 7c 20 70 4f 70 2d 3e 70 33  p->p1 || pOp->p3
14000 3e 3d 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70  >=pOp->p1+pOp->p
14010 32 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61  2 );.  pOut = &a
14020 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
14030 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
14040 28 70 2c 20 70 4f 75 74 29 3b 0a 0a 20 20 2f 2a  (p, pOut);..  /*
14050 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
14060 65 20 65 6c 65 6d 65 6e 74 73 20 74 68 61 74 20  e elements that 
14070 77 69 6c 6c 20 6d 61 6b 65 20 75 70 20 74 68 65  will make up the
14080 20 72 65 63 6f 72 64 20 74 6f 20 66 69 67 75 72   record to figur
14090 65 0a 20 20 2a 2a 20 6f 75 74 20 68 6f 77 20 6d  e.  ** out how m
140a0 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71  uch space is req
140b0 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 6e 65  uired for the ne
140c0 77 20 72 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20  w record..  */. 
140d0 20 66 6f 72 28 70 52 65 63 3d 70 44 61 74 61 30   for(pRec=pData0
140e0 3b 20 70 52 65 63 3c 3d 70 4c 61 73 74 3b 20 70  ; pRec<=pLast; p
140f0 52 65 63 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  Rec++){.    asse
14100 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70  rt( memIsValid(p
14110 52 65 63 29 20 29 3b 0a 20 20 20 20 69 66 28 20  Rec) );.    if( 
14120 7a 41 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  zAffinity ){.   
14130 20 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79     applyAffinity
14140 28 70 52 65 63 2c 20 7a 41 66 66 69 6e 69 74 79  (pRec, zAffinity
14150 5b 70 52 65 63 2d 70 44 61 74 61 30 5d 2c 20 65  [pRec-pData0], e
14160 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 7d 0a  ncoding);.    }.
14170 20 20 20 20 69 66 28 20 70 52 65 63 2d 3e 66 6c      if( pRec->fl
14180 61 67 73 26 4d 45 4d 5f 5a 65 72 6f 20 26 26 20  ags&MEM_Zero && 
14190 70 52 65 63 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  pRec->n>0 ){.   
141a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
141b0 6d 45 78 70 61 6e 64 42 6c 6f 62 28 70 52 65 63  mExpandBlob(pRec
141c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 72  );.    }.    ser
141d0 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74  ial_type = sqlit
141e0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
141f0 28 70 52 65 63 2c 20 66 69 6c 65 5f 66 6f 72 6d  (pRec, file_form
14200 61 74 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  at);.    len = s
14210 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14220 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
14230 79 70 65 29 3b 0a 20 20 20 20 6e 44 61 74 61 20  ype);.    nData 
14240 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 6e 48 64 72  += len;.    nHdr
14250 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e   += sqlite3Varin
14260 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  tLen(serial_type
14270 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 63 2d  );.    if( pRec-
14280 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
14290 6f 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  o ){.      /* On
142a0 6c 79 20 70 75 72 65 20 7a 65 72 6f 2d 66 69 6c  ly pure zero-fil
142b0 6c 65 64 20 42 4c 4f 42 73 20 63 61 6e 20 62 65  led BLOBs can be
142c0 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 4f   input to this O
142d0 70 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2a 20  pcode..      ** 
142e0 57 65 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  We do not allow 
142f0 62 6c 6f 62 73 20 77 69 74 68 20 61 20 70 72 65  blobs with a pre
14300 66 69 78 20 61 6e 64 20 61 20 7a 65 72 6f 2d 66  fix and a zero-f
14310 69 6c 6c 65 64 20 74 61 69 6c 2e 20 2a 2f 0a 20  illed tail. */. 
14320 20 20 20 20 20 6e 5a 65 72 6f 20 2b 3d 20 70 52       nZero += pR
14330 65 63 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  ec->u.nZero;.   
14340 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 6e 20 29   }else if( len )
14350 7b 0a 20 20 20 20 20 20 6e 5a 65 72 6f 20 3d 20  {.      nZero = 
14360 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
14370 2f 2a 20 41 64 64 20 74 68 65 20 69 6e 69 74 69  /* Add the initi
14380 61 6c 20 68 65 61 64 65 72 20 76 61 72 69 6e 74  al header varint
14390 20 61 6e 64 20 74 6f 74 61 6c 20 74 68 65 20 73   and total the s
143a0 69 7a 65 20 2a 2f 0a 20 20 6e 48 64 72 20 2b 3d  ize */.  nHdr +=
143b0 20 6e 56 61 72 69 6e 74 20 3d 20 73 71 6c 69 74   nVarint = sqlit
143c0 65 33 56 61 72 69 6e 74 4c 65 6e 28 6e 48 64 72  e3VarintLen(nHdr
143d0 29 3b 0a 20 20 69 66 28 20 6e 56 61 72 69 6e 74  );.  if( nVarint
143e0 3c 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65  <sqlite3VarintLe
143f0 6e 28 6e 48 64 72 29 20 29 7b 0a 20 20 20 20 6e  n(nHdr) ){.    n
14400 48 64 72 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 42 79  Hdr++;.  }.  nBy
14410 74 65 20 3d 20 6e 48 64 72 2b 6e 44 61 74 61 2d  te = nHdr+nData-
14420 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 6e 42 79  nZero;.  if( nBy
14430 74 65 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  te>db->aLimit[SQ
14440 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
14450 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  H] ){.    goto t
14460 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a 20 20 2f  oo_big;.  }..  /
14470 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
14480 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  output register 
14490 68 61 73 20 61 20 62 75 66 66 65 72 20 6c 61 72  has a buffer lar
144a0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 73 74 6f  ge enough to sto
144b0 72 65 20 0a 20 20 2a 2a 20 74 68 65 20 6e 65 77  re .  ** the new
144c0 20 72 65 63 6f 72 64 2e 20 54 68 65 20 6f 75 74   record. The out
144d0 70 75 74 20 72 65 67 69 73 74 65 72 20 28 70 4f  put register (pO
144e0 70 2d 3e 70 33 29 20 69 73 20 6e 6f 74 20 61 6c  p->p3) is not al
144f0 6c 6f 77 65 64 20 74 6f 0a 20 20 2a 2a 20 62 65  lowed to.  ** be
14500 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 70 75   one of the inpu
14510 74 20 72 65 67 69 73 74 65 72 73 20 28 62 65 63  t registers (bec
14520 61 75 73 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ause the followi
14530 6e 67 20 63 61 6c 6c 20 74 6f 0a 20 20 2a 2a 20  ng call to.  ** 
14540 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72  sqlite3VdbeMemGr
14550 6f 77 28 29 20 63 6f 75 6c 64 20 63 6c 6f 62 62  ow() could clobb
14560 65 72 20 74 68 65 20 76 61 6c 75 65 20 62 65 66  er the value bef
14570 6f 72 65 20 69 74 20 69 73 20 75 73 65 64 29 2e  ore it is used).
14580 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
14590 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
145a0 4f 75 74 2c 20 28 69 6e 74 29 6e 42 79 74 65 2c  Out, (int)nByte,
145b0 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   0) ){.    goto 
145c0 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 7a 4e  no_mem;.  }.  zN
145d0 65 77 52 65 63 6f 72 64 20 3d 20 28 75 38 20 2a  ewRecord = (u8 *
145e0 29 70 4f 75 74 2d 3e 7a 3b 0a 0a 20 20 2f 2a 20  )pOut->z;..  /* 
145f0 57 72 69 74 65 20 74 68 65 20 72 65 63 6f 72 64  Write the record
14600 20 2a 2f 0a 20 20 69 20 3d 20 70 75 74 56 61 72   */.  i = putVar
14610 69 6e 74 33 32 28 7a 4e 65 77 52 65 63 6f 72 64  int32(zNewRecord
14620 2c 20 6e 48 64 72 29 3b 0a 20 20 66 6f 72 28 70  , nHdr);.  for(p
14630 52 65 63 3d 70 44 61 74 61 30 3b 20 70 52 65 63  Rec=pData0; pRec
14640 3c 3d 70 4c 61 73 74 3b 20 70 52 65 63 2b 2b 29  <=pLast; pRec++)
14650 7b 0a 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70  {.    serial_typ
14660 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  e = sqlite3VdbeS
14670 65 72 69 61 6c 54 79 70 65 28 70 52 65 63 2c 20  erialType(pRec, 
14680 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20  file_format);.  
14690 20 20 69 20 2b 3d 20 70 75 74 56 61 72 69 6e 74    i += putVarint
146a0 33 32 28 26 7a 4e 65 77 52 65 63 6f 72 64 5b 69  32(&zNewRecord[i
146b0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
146c0 20 20 20 20 20 20 2f 2a 20 73 65 72 69 61 6c 20        /* serial 
146d0 74 79 70 65 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f  type */.  }.  fo
146e0 72 28 70 52 65 63 3d 70 44 61 74 61 30 3b 20 70  r(pRec=pData0; p
146f0 52 65 63 3c 3d 70 4c 61 73 74 3b 20 70 52 65 63  Rec<=pLast; pRec
14700 2b 2b 29 7b 20 20 2f 2a 20 73 65 72 69 61 6c 20  ++){  /* serial 
14710 64 61 74 61 20 2a 2f 0a 20 20 20 20 69 20 2b 3d  data */.    i +=
14720 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
14730 61 6c 50 75 74 28 26 7a 4e 65 77 52 65 63 6f 72  alPut(&zNewRecor
14740 64 5b 69 5d 2c 20 28 69 6e 74 29 28 6e 42 79 74  d[i], (int)(nByt
14750 65 2d 69 29 2c 20 70 52 65 63 2c 66 69 6c 65 5f  e-i), pRec,file_
14760 66 6f 72 6d 61 74 29 3b 0a 20 20 7d 0a 20 20 61  format);.  }.  a
14770 73 73 65 72 74 28 20 69 3d 3d 6e 42 79 74 65 20  ssert( i==nByte 
14780 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  );..  assert( pO
14790 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e  p->p3>0 && pOp->
147a0 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  p3<=p->nMem );. 
147b0 20 70 4f 75 74 2d 3e 6e 20 3d 20 28 69 6e 74 29   pOut->n = (int)
147c0 6e 42 79 74 65 3b 0a 20 20 70 4f 75 74 2d 3e 66  nByte;.  pOut->f
147d0 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20  lags = MEM_Blob 
147e0 7c 20 4d 45 4d 5f 44 79 6e 3b 0a 20 20 70 4f 75  | MEM_Dyn;.  pOu
147f0 74 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 69  t->xDel = 0;.  i
14800 66 28 20 6e 5a 65 72 6f 20 29 7b 0a 20 20 20 20  f( nZero ){.    
14810 70 4f 75 74 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20  pOut->u.nZero = 
14820 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4f 75 74 2d  nZero;.    pOut-
14830 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 5a 65  >flags |= MEM_Ze
14840 72 6f 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e  ro;.  }.  pOut->
14850 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
14860 38 3b 20 20 2f 2a 20 49 6e 20 63 61 73 65 20 74  8;  /* In case t
14870 68 65 20 62 6c 6f 62 20 69 73 20 65 76 65 72 20  he blob is ever 
14880 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 74 65 78  converted to tex
14890 74 20 2a 2f 0a 20 20 52 45 47 49 53 54 45 52 5f  t */.  REGISTER_
148a0 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70  TRACE(pOp->p3, p
148b0 4f 75 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d  Out);.  UPDATE_M
148c0 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74  AX_BLOBSIZE(pOut
148d0 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
148e0 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 75 6e 74 20  * Opcode: Count 
148f0 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
14900 2a 20 53 74 6f 72 65 20 74 68 65 20 6e 75 6d 62  * Store the numb
14910 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 28 61  er of entries (a
14920 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 29  n integer value)
14930 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
14940 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 70 65 6e 65   index .** opene
14950 64 20 62 79 20 63 75 72 73 6f 72 20 50 31 20 69  d by cursor P1 i
14960 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2f  n register P2.*/
14970 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14980 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a  OMIT_BTREECOUNT.
14990 63 61 73 65 20 4f 50 5f 43 6f 75 6e 74 3a 20 7b  case OP_Count: {
149a0 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
149b0 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20  -prerelease */. 
149c0 20 69 36 34 20 6e 45 6e 74 72 79 3b 0a 20 20 42   i64 nEntry;.  B
149d0 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a  tCursor *pCrsr;.
149e0 0a 20 20 70 43 72 73 72 20 3d 20 70 2d 3e 61 70  .  pCrsr = p->ap
149f0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 70 43  Csr[pOp->p1]->pC
14a00 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 41 4c 57  ursor;.  if( ALW
14a10 41 59 53 28 70 43 72 73 72 29 20 29 7b 0a 20 20  AYS(pCrsr) ){.  
14a20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
14a30 72 65 65 43 6f 75 6e 74 28 70 43 72 73 72 2c 20  reeCount(pCrsr, 
14a40 26 6e 45 6e 74 72 79 29 3b 0a 20 20 7d 65 6c 73  &nEntry);.  }els
14a50 65 7b 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d 20  e{.    nEntry = 
14a60 30 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75  0;.  }.  pOut->u
14a70 2e 69 20 3d 20 6e 45 6e 74 72 79 3b 0a 20 20 62  .i = nEntry;.  b
14a80 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  reak;.}.#endif..
14a90 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 61 76 65 70  /* Opcode: Savep
14aa0 6f 69 6e 74 20 50 31 20 2a 20 2a 20 50 34 20 2a  oint P1 * * P4 *
14ab0 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 2c 20 72 65 6c  .**.** Open, rel
14ac0 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
14ad0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6e   the savepoint n
14ae0 61 6d 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  amed by paramete
14af0 72 20 50 34 2c 20 64 65 70 65 6e 64 69 6e 67 0a  r P4, depending.
14b00 2a 2a 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ** on the value 
14b10 6f 66 20 50 31 2e 20 54 6f 20 6f 70 65 6e 20 61  of P1. To open a
14b20 20 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 2c 20   new savepoint, 
14b30 50 31 3d 3d 30 2e 20 54 6f 20 72 65 6c 65 61 73  P1==0. To releas
14b40 65 20 28 63 6f 6d 6d 69 74 29 20 61 6e 0a 2a 2a  e (commit) an.**
14b50 20 65 78 69 73 74 69 6e 67 20 73 61 76 65 70 6f   existing savepo
14b60 69 6e 74 2c 20 50 31 3d 3d 31 2c 20 6f 72 20 74  int, P1==1, or t
14b70 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 65 78  o rollback an ex
14b80 69 73 74 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  isting savepoint
14b90 20 50 31 3d 3d 32 2e 0a 2a 2f 0a 63 61 73 65 20   P1==2..*/.case 
14ba0 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a  OP_Savepoint: {.
14bb0 20 20 69 6e 74 20 70 31 3b 20 20 20 20 20 20 20    int p1;       
14bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bd0 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 50 31    /* Value of P1
14be0 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 68   operand */.  ch
14bf0 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
14c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14c10 20 4e 61 6d 65 20 6f 66 20 73 61 76 65 70 6f 69   Name of savepoi
14c20 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  nt */.  int nNam
14c30 65 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  e;.  Savepoint *
14c40 70 4e 65 77 3b 0a 20 20 53 61 76 65 70 6f 69 6e  pNew;.  Savepoin
14c50 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20  t *pSavepoint;. 
14c60 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70   Savepoint *pTmp
14c70 3b 0a 20 20 69 6e 74 20 69 53 61 76 65 70 6f 69  ;.  int iSavepoi
14c80 6e 74 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20  nt;.  int ii;.. 
14c90 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20   p1 = pOp->p1;. 
14ca0 20 7a 4e 61 6d 65 20 3d 20 70 4f 70 2d 3e 70 34   zName = pOp->p4
14cb0 2e 7a 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74  .z;..  /* Assert
14cc0 20 74 68 61 74 20 74 68 65 20 70 31 20 70 61 72   that the p1 par
14cd0 61 6d 65 74 65 72 20 69 73 20 76 61 6c 69 64 2e  ameter is valid.
14ce0 20 41 6c 73 6f 20 74 68 61 74 20 69 66 20 74 68   Also that if th
14cf0 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 0a 20  ere is no open. 
14d00 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c   ** transaction,
14d10 20 74 68 65 6e 20 74 68 65 72 65 20 63 61 6e 6e   then there cann
14d20 6f 74 20 62 65 20 61 6e 79 20 73 61 76 65 70 6f  ot be any savepo
14d30 69 6e 74 73 2e 20 0a 20 20 2a 2f 0a 20 20 61 73  ints. .  */.  as
14d40 73 65 72 74 28 20 64 62 2d 3e 70 53 61 76 65 70  sert( db->pSavep
14d50 6f 69 6e 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  oint==0 || db->a
14d60 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 3b 0a  utoCommit==0 );.
14d70 20 20 61 73 73 65 72 74 28 20 70 31 3d 3d 53 41    assert( p1==SA
14d80 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 7c 7c 70  VEPOINT_BEGIN||p
14d90 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  1==SAVEPOINT_REL
14da0 45 41 53 45 7c 7c 70 31 3d 3d 53 41 56 45 50 4f  EASE||p1==SAVEPO
14db0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
14dc0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 53    assert( db->pS
14dd0 61 76 65 70 6f 69 6e 74 20 7c 7c 20 64 62 2d 3e  avepoint || db->
14de0 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76  isTransactionSav
14df0 65 70 6f 69 6e 74 3d 3d 30 20 29 3b 0a 20 20 61  epoint==0 );.  a
14e00 73 73 65 72 74 28 20 63 68 65 63 6b 53 61 76 65  ssert( checkSave
14e10 70 6f 69 6e 74 43 6f 75 6e 74 28 64 62 29 20 29  pointCount(db) )
14e20 3b 0a 0a 20 20 69 66 28 20 70 31 3d 3d 53 41 56  ;..  if( p1==SAV
14e30 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 29 7b 0a  EPOINT_BEGIN ){.
14e40 20 20 20 20 69 66 28 20 64 62 2d 3e 77 72 69 74      if( db->writ
14e50 65 56 64 62 65 43 6e 74 3e 30 20 29 7b 0a 20 20  eVdbeCnt>0 ){.  
14e60 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 61 76      /* A new sav
14e70 65 70 6f 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  epoint cannot be
14e80 20 63 72 65 61 74 65 64 20 69 66 20 74 68 65 72   created if ther
14e90 65 20 61 72 65 20 61 63 74 69 76 65 20 77 72 69  e are active wri
14ea0 74 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  te .      ** sta
14eb0 74 65 6d 65 6e 74 73 20 28 69 2e 65 2e 20 6f 70  tements (i.e. op
14ec0 65 6e 20 72 65 61 64 2f 77 72 69 74 65 20 69 6e  en read/write in
14ed0 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 68  cremental blob h
14ee0 61 6e 64 6c 65 73 29 2e 0a 20 20 20 20 20 20 2a  andles)..      *
14ef0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
14f00 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
14f10 72 4d 73 67 2c 20 64 62 2c 20 22 63 61 6e 6e 6f  rMsg, db, "canno
14f20 74 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  t open savepoint
14f30 20 2d 20 22 0a 20 20 20 20 20 20 20 20 22 53 51   - ".        "SQ
14f40 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  L statements in 
14f50 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20 20 20  progress");.    
14f60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
14f70 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  SY;.    }else{. 
14f80 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c       nName = sql
14f90 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
14fa0 6d 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  me);..#ifndef SQ
14fb0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
14fc0 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20  LTABLE.      /* 
14fd0 54 68 69 73 20 63 61 6c 6c 20 69 73 20 4f 6b 20  This call is Ok 
14fe0 65 76 65 6e 20 69 66 20 74 68 69 73 20 73 61 76  even if this sav
14ff0 65 70 6f 69 6e 74 20 69 73 20 61 63 74 75 61 6c  epoint is actual
15000 6c 79 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ly a transaction
15010 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 65 70 6f  .      ** savepo
15020 69 6e 74 20 28 61 6e 64 20 74 68 65 72 65 66 6f  int (and therefo
15030 72 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 70 72  re should not pr
15040 6f 6d 70 74 20 78 53 61 76 65 70 6f 69 6e 74 28  ompt xSavepoint(
15050 29 29 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20  )) callbacks..  
15060 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
15070 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
15080 73 61 76 65 70 6f 69 6e 74 20 62 65 69 6e 67 20  savepoint being 
15090 6f 70 65 6e 65 64 2c 20 69 74 20 69 73 20 67 75  opened, it is gu
150a0 61 72 61 6e 74 65 65 64 0a 20 20 20 20 20 20 2a  aranteed.      *
150b0 2a 20 74 68 61 74 20 74 68 65 20 64 62 2d 3e 61  * that the db->a
150c0 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 20 69  VTrans[] array i
150d0 73 20 65 6d 70 74 79 2e 20 20 2a 2f 0a 20 20 20  s empty.  */.   
150e0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
150f0 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20  utoCommit==0 || 
15100 64 62 2d 3e 6e 56 54 72 61 6e 73 3d 3d 30 20 29  db->nVTrans==0 )
15110 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
15120 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
15130 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
15140 42 45 47 49 4e 2c 0a 20 20 20 20 20 20 20 20 20  BEGIN,.         
15150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15160 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74         db->nStat
15170 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70  ement+db->nSavep
15180 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  oint);.      if(
15190 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
151a0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
151b0 74 6f 5f 65 72 72 6f 72 3b 0a 23 65 6e 64 69 66  to_error;.#endif
151c0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  ..      /* Creat
151d0 65 20 61 20 6e 65 77 20 73 61 76 65 70 6f 69 6e  e a new savepoin
151e0 74 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  t structure. */.
151f0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
15200 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
15210 64 62 2c 20 73 69 7a 65 6f 66 28 53 61 76 65 70  db, sizeof(Savep
15220 6f 69 6e 74 29 2b 6e 4e 61 6d 65 2b 31 29 3b 0a  oint)+nName+1);.
15230 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
15240 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
15250 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29  zName = (char *)
15260 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20  &pNew[1];.      
15270 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a    memcpy(pNew->z
15280 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Name, zName, nNa
15290 6d 65 2b 31 29 3b 0a 20 20 20 20 0a 20 20 20 20  me+1);.    .    
152a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
152b0 69 73 20 6e 6f 20 6f 70 65 6e 20 74 72 61 6e 73  is no open trans
152c0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6d 61 72  action, then mar
152d0 6b 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63  k this as a spec
152e0 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  ial.        ** "
152f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
15300 70 6f 69 6e 74 22 2e 20 2a 2f 0a 20 20 20 20 20  point". */.     
15310 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43     if( db->autoC
15320 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  ommit ){.       
15330 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
15340 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
15350 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69   db->isTransacti
15360 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 31 3b  onSavepoint = 1;
15370 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
15380 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53            db->nS
15390 61 76 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20  avepoint++;.    
153a0 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20      }.    .     
153b0 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e     /* Link the n
153c0 65 77 20 73 61 76 65 70 6f 69 6e 74 20 69 6e 74  ew savepoint int
153d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  o the database h
153e0 61 6e 64 6c 65 27 73 20 6c 69 73 74 2e 20 2a 2f  andle's list. */
153f0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
15400 4e 65 78 74 20 3d 20 64 62 2d 3e 70 53 61 76 65  Next = db->pSave
15410 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 64  point;.        d
15420 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20  b->pSavepoint = 
15430 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4e  pNew;.        pN
15440 65 77 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  ew->nDeferredCon
15450 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72 65  s = db->nDeferre
15460 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 7d 0a 20  dCons;.      }. 
15470 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
15480 20 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 30    iSavepoint = 0
15490 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74  ;..    /* Find t
154a0 68 65 20 6e 61 6d 65 64 20 73 61 76 65 70 6f 69  he named savepoi
154b0 6e 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  nt. If there is 
154c0 6e 6f 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e  no such savepoin
154d0 74 2c 20 74 68 65 6e 20 61 6e 0a 20 20 20 20 2a  t, then an.    *
154e0 2a 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  * an error is re
154f0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73  turned to the us
15500 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  er.  */.    for(
15510 0a 20 20 20 20 20 20 70 53 61 76 65 70 6f 69 6e  .      pSavepoin
15520 74 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  t = db->pSavepoi
15530 6e 74 3b 20 0a 20 20 20 20 20 20 70 53 61 76 65  nt; .      pSave
15540 70 6f 69 6e 74 20 26 26 20 73 71 6c 69 74 65 33  point && sqlite3
15550 53 74 72 49 43 6d 70 28 70 53 61 76 65 70 6f 69  StrICmp(pSavepoi
15560 6e 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  nt->zName, zName
15570 29 3b 0a 20 20 20 20 20 20 70 53 61 76 65 70 6f  );.      pSavepo
15580 69 6e 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  int = pSavepoint
15590 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 7b 0a 20  ->pNext.    ){. 
155a0 20 20 20 20 20 69 53 61 76 65 70 6f 69 6e 74 2b       iSavepoint+
155b0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
155c0 20 21 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a   !pSavepoint ){.
155d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
155e0 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
155f0 73 67 2c 20 64 62 2c 20 22 6e 6f 20 73 75 63 68  sg, db, "no such
15600 20 73 61 76 65 70 6f 69 6e 74 3a 20 25 73 22 2c   savepoint: %s",
15610 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72   zName);.      r
15620 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
15630 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
15640 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
15650 3e 30 20 26 26 20 70 31 3d 3d 53 41 56 45 50 4f  >0 && p1==SAVEPO
15660 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20  INT_RELEASE ){. 
15670 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f       /* It is no
15680 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65  t possible to re
15690 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20 61  lease (commit) a
156a0 20 73 61 76 65 70 6f 69 6e 74 20 69 66 20 74 68   savepoint if th
156b0 65 72 65 20 61 72 65 20 0a 20 20 20 20 20 20 2a  ere are .      *
156c0 2a 20 61 63 74 69 76 65 20 77 72 69 74 65 20 73  * active write s
156d0 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20  tatements..     
156e0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
156f0 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
15700 45 72 72 4d 73 67 2c 20 64 62 2c 20 0a 20 20 20  ErrMsg, db, .   
15710 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 72 65 6c       "cannot rel
15720 65 61 73 65 20 73 61 76 65 70 6f 69 6e 74 20 2d  ease savepoint -
15730 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
15740 69 6e 20 70 72 6f 67 72 65 73 73 22 0a 20 20 20  in progress".   
15750 20 20 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d     );.      rc =
15760 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
15770 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 20 20    }else{..      
15780 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  /* Determine whe
15790 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73  ther or not this
157a0 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
157b0 6e 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20  n savepoint. If 
157c0 73 6f 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  so,.      ** and
157d0 20 74 68 69 73 20 69 73 20 61 20 52 45 4c 45 41   this is a RELEA
157e0 53 45 20 63 6f 6d 6d 61 6e 64 2c 20 74 68 65 6e  SE command, then
157f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
15800 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 20 20  nsaction .      
15810 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  ** is committed.
15820 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
15830 20 69 6e 74 20 69 73 54 72 61 6e 73 61 63 74 69   int isTransacti
15840 6f 6e 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  on = pSavepoint-
15850 3e 70 4e 65 78 74 3d 3d 30 20 26 26 20 64 62 2d  >pNext==0 && db-
15860 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
15870 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 69  vepoint;.      i
15880 66 28 20 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  f( isTransaction
15890 20 26 26 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e   && p1==SAVEPOIN
158a0 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20  T_RELEASE ){.   
158b0 20 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73       if( (rc = s
158c0 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
158d0 6b 28 70 2c 20 31 29 29 21 3d 53 51 4c 49 54 45  k(p, 1))!=SQLITE
158e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
158f0 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72   goto vdbe_retur
15900 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
15910 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
15920 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
15930 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
15940 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45 5f  Halt(p)==SQLITE_
15950 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
15960 20 20 70 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20    p->pc = pc;.  
15970 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
15980 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  Commit = 0;.    
15990 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
159a0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
159b0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76            goto v
159c0 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20  dbe_return;.    
159d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 62      }.        db
159e0 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53  ->isTransactionS
159f0 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
15a00 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63        rc = p->rc
15a10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15a20 20 20 20 20 20 20 20 69 53 61 76 65 70 6f 69 6e         iSavepoin
15a30 74 20 3d 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69  t = db->nSavepoi
15a40 6e 74 20 2d 20 69 53 61 76 65 70 6f 69 6e 74 20  nt - iSavepoint 
15a50 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  - 1;.        for
15a60 28 69 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44  (ii=0; ii<db->nD
15a70 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  b; ii++){.      
15a80 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
15a90 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 64  TripAllCursors(d
15aa0 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c 20  b->aDb[ii].pBt, 
15ab0 53 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20  SQLITE_ABORT);. 
15ac0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15ad0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 64 62   for(ii=0; ii<db
15ae0 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20  ->nDb; ii++){.  
15af0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
15b00 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
15b10 6e 74 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70  nt(db->aDb[ii].p
15b20 42 74 2c 20 70 31 2c 20 69 53 61 76 65 70 6f 69  Bt, p1, iSavepoi
15b30 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
15b40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15b50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15b60 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
15b70 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  o_error;.       
15b80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
15b90 20 20 20 20 20 20 20 69 66 28 20 70 31 3d 3d 53         if( p1==S
15ba0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
15bb0 4b 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 26  K && (db->flags&
15bc0 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
15bd0 6e 67 65 73 29 21 3d 30 20 29 7b 0a 20 20 20 20  nges)!=0 ){.    
15be0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15bf0 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
15c00 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  ments(db);.     
15c10 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65       sqlite3Rese
15c20 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
15c30 64 62 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  db, -1);.       
15c40 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28     db->flags = (
15c50 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49  db->flags | SQLI
15c60 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
15c70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15c80 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a     }.  .      /*
15c90 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   Regardless of w
15ca0 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61  hether this is a
15cb0 20 52 45 4c 45 41 53 45 20 6f 72 20 52 4f 4c 4c   RELEASE or ROLL
15cc0 42 41 43 4b 2c 20 64 65 73 74 72 6f 79 20 61 6c  BACK, destroy al
15cd0 6c 20 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 65  l .      ** save
15ce0 70 6f 69 6e 74 73 20 6e 65 73 74 65 64 20 69 6e  points nested in
15cf0 73 69 64 65 20 6f 66 20 74 68 65 20 73 61 76 65  side of the save
15d00 70 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70 65 72  point being oper
15d10 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ated on. */.    
15d20 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61    while( db->pSa
15d30 76 65 70 6f 69 6e 74 21 3d 70 53 61 76 65 70 6f  vepoint!=pSavepo
15d40 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  int ){.        p
15d50 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65 70  Tmp = db->pSavep
15d60 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 64 62  oint;.        db
15d70 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  ->pSavepoint = p
15d80 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Tmp->pNext;.    
15d90 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15da0 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 20  e(db, pTmp);.   
15db0 20 20 20 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f       db->nSavepo
15dc0 69 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 0a  int--;.      }..
15dd0 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69        /* If it i
15de0 73 20 61 20 52 45 4c 45 41 53 45 2c 20 74 68 65  s a RELEASE, the
15df0 6e 20 64 65 73 74 72 6f 79 20 74 68 65 20 73 61  n destroy the sa
15e00 76 65 70 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70  vepoint being op
15e10 65 72 61 74 65 64 20 6f 6e 20 0a 20 20 20 20 20  erated on .     
15e20 20 2a 2a 20 74 6f 6f 2e 20 49 66 20 69 74 20 69   ** too. If it i
15e30 73 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 2c  s a ROLLBACK TO,
15e40 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 6e 75   then set the nu
15e50 6d 62 65 72 20 6f 66 20 64 65 66 65 72 72 65 64  mber of deferred
15e60 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74   .      ** const
15e70 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73  raint violations
15e80 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
15e90 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 20  database to the 
15ea0 76 61 6c 75 65 20 73 74 6f 72 65 64 0a 20 20 20  value stored.   
15eb0 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 73     ** when the s
15ec0 61 76 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65  avepoint was cre
15ed0 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ated.  */.      
15ee0 69 66 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e  if( p1==SAVEPOIN
15ef0 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20  T_RELEASE ){.   
15f00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 61       assert( pSa
15f10 76 65 70 6f 69 6e 74 3d 3d 64 62 2d 3e 70 53 61  vepoint==db->pSa
15f20 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 20 20 20  vepoint );.     
15f30 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e     db->pSavepoin
15f40 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t = pSavepoint->
15f50 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73  pNext;.        s
15f60 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
15f70 20 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   pSavepoint);.  
15f80 20 20 20 20 20 20 69 66 28 20 21 69 73 54 72 61        if( !isTra
15f90 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
15fa0 20 20 20 20 20 20 64 62 2d 3e 6e 53 61 76 65 70        db->nSavep
15fb0 6f 69 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  oint--;.        
15fc0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
15fd0 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65         db->nDefe
15fe0 72 72 65 64 43 6f 6e 73 20 3d 20 70 53 61 76 65  rredCons = pSave
15ff0 70 6f 69 6e 74 2d 3e 6e 44 65 66 65 72 72 65 64  point->nDeferred
16000 43 6f 6e 73 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Cons;.      }.. 
16010 20 20 20 20 20 69 66 28 20 21 69 73 54 72 61 6e       if( !isTran
16020 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
16030 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
16040 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c  tabSavepoint(db,
16050 20 70 31 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   p1, iSavepoint)
16060 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16070 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
16080 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
16090 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20  error;.      }. 
160a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 72 65 61     }.  }..  brea
160b0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
160c0 20 41 75 74 6f 43 6f 6d 6d 69 74 20 50 31 20 50   AutoCommit P1 P
160d0 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 65  2 * * *.**.** Se
160e0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  t the database a
160f0 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
16100 74 6f 20 50 31 20 28 31 20 6f 72 20 30 29 2e 20  to P1 (1 or 0). 
16110 49 66 20 50 32 20 69 73 20 74 72 75 65 2c 20 72  If P2 is true, r
16120 6f 6c 6c 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20  oll.** back any 
16130 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
16140 20 62 74 72 65 65 20 74 72 61 6e 73 61 63 74 69   btree transacti
16150 6f 6e 73 2e 20 49 66 20 74 68 65 72 65 20 61 72  ons. If there ar
16160 65 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20  e any active.** 
16170 56 4d 73 20 28 61 70 61 72 74 20 66 72 6f 6d 20  VMs (apart from 
16180 74 68 69 73 20 6f 6e 65 29 2c 20 74 68 65 6e 20  this one), then 
16190 61 20 52 4f 4c 4c 42 41 43 4b 20 66 61 69 6c 73  a ROLLBACK fails
161a0 2e 20 20 41 20 43 4f 4d 4d 49 54 20 66 61 69 6c  .  A COMMIT fail
161b0 73 20 69 66 0a 2a 2a 20 74 68 65 72 65 20 61 72  s if.** there ar
161c0 65 20 61 63 74 69 76 65 20 77 72 69 74 69 6e 67  e active writing
161d0 20 56 4d 73 20 6f 72 20 61 63 74 69 76 65 20 56   VMs or active V
161e0 4d 73 20 74 68 61 74 20 75 73 65 20 73 68 61 72  Ms that use shar
161f0 65 64 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  ed cache..**.** 
16200 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  This instruction
16210 20 63 61 75 73 65 73 20 74 68 65 20 56 4d 20 74   causes the VM t
16220 6f 20 68 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20  o halt..*/.case 
16230 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 20 7b  OP_AutoCommit: {
16240 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64 41 75  .  int desiredAu
16250 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20 69 6e 74 20  toCommit;.  int 
16260 69 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20 69 6e 74  iRollback;.  int
16270 20 74 75 72 6e 4f 6e 41 43 3b 0a 0a 20 20 64 65   turnOnAC;..  de
16280 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 20  siredAutoCommit 
16290 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 52 6f  = pOp->p1;.  iRo
162a0 6c 6c 62 61 63 6b 20 3d 20 70 4f 70 2d 3e 70 32  llback = pOp->p2
162b0 3b 0a 20 20 74 75 72 6e 4f 6e 41 43 20 3d 20 64  ;.  turnOnAC = d
162c0 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
162d0 20 26 26 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d   && !db->autoCom
162e0 6d 69 74 3b 0a 20 20 61 73 73 65 72 74 28 20 64  mit;.  assert( d
162f0 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
16300 3d 3d 31 20 7c 7c 20 64 65 73 69 72 65 64 41 75  ==1 || desiredAu
16310 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 3b 0a 20  toCommit==0 );. 
16320 20 61 73 73 65 72 74 28 20 64 65 73 69 72 65 64   assert( desired
16330 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 7c 7c  AutoCommit==1 ||
16340 20 69 52 6f 6c 6c 62 61 63 6b 3d 3d 30 20 29 3b   iRollback==0 );
16350 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61  .  assert( db->a
16360 63 74 69 76 65 56 64 62 65 43 6e 74 3e 30 20 29  ctiveVdbeCnt>0 )
16370 3b 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20 74  ;  /* At least t
16380 68 69 73 20 6f 6e 65 20 56 4d 20 69 73 20 61 63  his one VM is ac
16390 74 69 76 65 20 2a 2f 0a 0a 23 69 66 20 30 0a 20  tive */..#if 0. 
163a0 20 69 66 28 20 74 75 72 6e 4f 6e 41 43 20 26 26   if( turnOnAC &&
163b0 20 69 52 6f 6c 6c 62 61 63 6b 20 26 26 20 64 62   iRollback && db
163c0 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e  ->activeVdbeCnt>
163d0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  1 ){.    /* If t
163e0 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
163f0 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 52 4f 4c  implements a ROL
16400 4c 42 41 43 4b 20 61 6e 64 20 6f 74 68 65 72 20  LBACK and other 
16410 56 4d 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73  VMs are.    ** s
16420 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 2c 20 61 6e  till running, an
16430 64 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  d a transaction 
16440 69 73 20 61 63 74 69 76 65 2c 20 72 65 74 75 72  is active, retur
16450 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 64 69 63  n an error indic
16460 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 61  ating.    ** tha
16470 74 20 74 68 65 20 6f 74 68 65 72 20 56 4d 73 20  t the other VMs 
16480 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 66 69  must complete fi
16490 72 73 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  rst. .    */.   
164a0 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
164b0 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  g(&p->zErrMsg, d
164c0 62 2c 20 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62  b, "cannot rollb
164d0 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ack transaction 
164e0 2d 20 22 0a 20 20 20 20 20 20 20 20 22 53 51 4c  - ".        "SQL
164f0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70   statements in p
16500 72 6f 67 72 65 73 73 22 29 3b 0a 20 20 20 20 72  rogress");.    r
16510 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
16520 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
16530 20 20 69 66 28 20 74 75 72 6e 4f 6e 41 43 20 26    if( turnOnAC &
16540 26 20 21 69 52 6f 6c 6c 62 61 63 6b 20 26 26 20  & !iRollback && 
16550 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
16560 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >0 ){.    /* If 
16570 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
16580 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 43 4f   implements a CO
16590 4d 4d 49 54 20 61 6e 64 20 6f 74 68 65 72 20 56  MMIT and other V
165a0 4d 73 20 61 72 65 20 77 72 69 74 69 6e 67 0a 20  Ms are writing. 
165b0 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20     ** return an 
165c0 65 72 72 6f 72 20 69 6e 64 69 63 61 74 69 6e 67  error indicating
165d0 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20   that the other 
165e0 56 4d 73 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74  VMs must complet
165f0 65 20 66 69 72 73 74 2e 20 0a 20 20 20 20 2a 2f  e first. .    */
16600 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
16610 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
16620 67 2c 20 64 62 2c 20 22 63 61 6e 6e 6f 74 20 63  g, db, "cannot c
16630 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63 74 69 6f  ommit transactio
16640 6e 20 2d 20 22 0a 20 20 20 20 20 20 20 20 22 53  n - ".        "S
16650 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  QL statements in
16660 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20 20   progress");.   
16670 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
16680 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  Y;.  }else if( d
16690 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
166a0 21 3d 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  !=db->autoCommit
166b0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 6c   ){.    if( iRol
166c0 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 61  lback ){.      a
166d0 73 73 65 72 74 28 20 64 65 73 69 72 65 64 41 75  ssert( desiredAu
166e0 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 29 3b 0a 20  toCommit==1 );. 
166f0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
16700 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
16710 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
16720 4b 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 75  K);.      db->au
16730 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
16740 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20    }else if( (rc 
16750 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
16760 63 6b 46 6b 28 70 2c 20 31 29 29 21 3d 53 51 4c  ckFk(p, 1))!=SQL
16770 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16780 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e  goto vdbe_return
16790 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
167a0 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
167b0 74 20 3d 20 28 75 38 29 64 65 73 69 72 65 64 41  t = (u8)desiredA
167c0 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20  utoCommit;.     
167d0 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
167e0 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45 5f  Halt(p)==SQLITE_
167f0 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
16800 70 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20 20 20  p->pc = pc;.    
16810 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
16820 69 74 20 3d 20 28 75 38 29 28 31 2d 64 65 73 69  it = (u8)(1-desi
16830 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a  redAutoCommit);.
16840 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
16850 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
16860 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76  ;.        goto v
16870 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20  dbe_return;.    
16880 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
16890 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65  sert( db->nState
168a0 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  ment==0 );.    s
168b0 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
168c0 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 69  oints(db);.    i
168d0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
168e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
168f0 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
16900 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16910 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
16920 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  R;.    }.    got
16930 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20  o vdbe_return;. 
16940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
16950 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
16960 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 0a 20 20  >zErrMsg, db,.  
16970 20 20 20 20 20 20 28 21 64 65 73 69 72 65 64 41        (!desiredA
16980 75 74 6f 43 6f 6d 6d 69 74 29 3f 22 63 61 6e 6e  utoCommit)?"cann
16990 6f 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  ot start a trans
169a0 61 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20  action within a 
169b0 74 72 61 6e 73 61 63 74 69 6f 6e 22 3a 28 0a 20  transaction":(. 
169c0 20 20 20 20 20 20 20 28 69 52 6f 6c 6c 62 61 63         (iRollbac
169d0 6b 29 3f 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62  k)?"cannot rollb
169e0 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63  ack - no transac
169f0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 3a  tion is active":
16a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16a10 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d      "cannot comm
16a20 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74  it - no transact
16a30 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29 29  ion is active"))
16a40 3b 0a 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  ;.         .    
16a50 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
16a60 52 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  R;.  }.  break;.
16a70 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 72  }../* Opcode: Tr
16a80 61 6e 73 61 63 74 69 6f 6e 20 50 31 20 50 32 20  ansaction P1 P2 
16a90 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 42 65 67 69  * * *.**.** Begi
16aa0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  n a transaction.
16ab0 20 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f    The transactio
16ac0 6e 20 65 6e 64 73 20 77 68 65 6e 20 61 20 43 6f  n ends when a Co
16ad0 6d 6d 69 74 20 6f 72 20 52 6f 6c 6c 62 61 63 6b  mmit or Rollback
16ae0 0a 2a 2a 20 6f 70 63 6f 64 65 20 69 73 20 65 6e  .** opcode is en
16af0 63 6f 75 6e 74 65 72 65 64 2e 20 20 44 65 70 65  countered.  Depe
16b00 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 4f 4e 20  nding on the ON 
16b10 43 4f 4e 46 4c 49 43 54 20 73 65 74 74 69 6e 67  CONFLICT setting
16b20 2c 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  , the.** transac
16b30 74 69 6f 6e 20 6d 69 67 68 74 20 61 6c 73 6f 20  tion might also 
16b40 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  be rolled back i
16b50 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
16b60 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
16b70 20 50 31 20 69 73 20 74 68 65 20 69 6e 64 65 78   P1 is the index
16b80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
16b90 20 66 69 6c 65 20 6f 6e 20 77 68 69 63 68 20 74   file on which t
16ba0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
16bb0 73 0a 2a 2a 20 73 74 61 72 74 65 64 2e 20 20 49  s.** started.  I
16bc0 6e 64 65 78 20 30 20 69 73 20 74 68 65 20 6d 61  ndex 0 is the ma
16bd0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
16be0 20 61 6e 64 20 69 6e 64 65 78 20 31 20 69 73 20   and index 1 is 
16bf0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 75 73 65 64  the.** file used
16c00 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74   for temporary t
16c10 61 62 6c 65 73 2e 20 20 49 6e 64 69 63 65 73 20  ables.  Indices 
16c20 6f 66 20 32 20 6f 72 20 6d 6f 72 65 20 61 72 65  of 2 or more are
16c30 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 61 74 74   used for.** att
16c40 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2e  ached databases.
16c50 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32 20 69 73 20  .**.** If P2 is 
16c60 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
16c70 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
16c80 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2e 20 20  on is started.  
16c90 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
16ca0 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 6f  is.** obtained o
16cb0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
16cc0 69 6c 65 20 77 68 65 6e 20 61 20 77 72 69 74 65  ile when a write
16cd0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
16ce0 73 74 61 72 74 65 64 2e 20 20 4e 6f 0a 2a 2a 20  started.  No.** 
16cf0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 61  other process ca
16d00 6e 20 73 74 61 72 74 20 61 6e 6f 74 68 65 72 20  n start another 
16d10 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
16d20 6e 20 77 68 69 6c 65 20 74 68 69 73 20 74 72 61  n while this tra
16d30 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 75  nsaction is.** u
16d40 6e 64 65 72 77 61 79 2e 20 20 53 74 61 72 74 69  nderway.  Starti
16d50 6e 67 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ng a write trans
16d60 61 63 74 69 6f 6e 20 61 6c 73 6f 20 63 72 65 61  action also crea
16d70 74 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  tes a rollback j
16d80 6f 75 72 6e 61 6c 2e 20 41 0a 2a 2a 20 77 72 69  ournal. A.** wri
16d90 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
16da0 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
16db0 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
16dc0 73 20 63 61 6e 20 62 65 20 6d 61 64 65 20 74 6f  s can be made to
16dd0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
16de0 2e 20 20 49 66 20 50 32 20 69 73 20 32 20 6f 72  .  If P2 is 2 or
16df0 20 67 72 65 61 74 65 72 20 74 68 65 6e 20 61 6e   greater then an
16e00 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
16e10 69 73 20 61 6c 73 6f 20 6f 62 74 61 69 6e 65 64  is also obtained
16e20 0a 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  .** on the file.
16e30 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 77 72 69 74  .**.** If a writ
16e40 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
16e50 20 73 74 61 72 74 65 64 20 61 6e 64 20 74 68 65   started and the
16e60 20 56 64 62 65 2e 75 73 65 73 53 74 6d 74 4a 6f   Vdbe.usesStmtJo
16e70 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 0a 2a 2a  urnal flag is.**
16e80 20 74 72 75 65 20 28 74 68 69 73 20 66 6c 61 67   true (this flag
16e90 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20 56   is set if the V
16ea0 64 62 65 20 6d 61 79 20 6d 6f 64 69 66 79 20 6d  dbe may modify m
16eb0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77  ore than one row
16ec0 20 61 6e 64 20 6d 61 79 0a 2a 2a 20 74 68 72 6f   and may.** thro
16ed0 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70  w an ABORT excep
16ee0 74 69 6f 6e 29 2c 20 61 20 73 74 61 74 65 6d 65  tion), a stateme
16ef0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  nt transaction m
16f00 61 79 20 61 6c 73 6f 20 62 65 20 6f 70 65 6e 65  ay also be opene
16f10 64 2e 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  d..** More speci
16f20 66 69 63 61 6c 6c 79 2c 20 61 20 73 74 61 74 65  fically, a state
16f30 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
16f40 20 69 73 20 6f 70 65 6e 65 64 20 69 66 66 20 74   is opened iff t
16f50 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
16f60 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 75 72  onnection is cur
16f70 72 65 6e 74 6c 79 20 6e 6f 74 20 69 6e 20 61 75  rently not in au
16f80 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 6f  tocommit mode, o
16f90 72 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f  r if there are o
16fa0 74 68 65 72 0a 2a 2a 20 61 63 74 69 76 65 20 73  ther.** active s
16fb0 74 61 74 65 6d 65 6e 74 73 2e 20 41 20 73 74 61  tatements. A sta
16fc0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
16fd0 6f 6e 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68  on allows the ch
16fe0 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
16ff0 69 73 0a 2a 2a 20 56 44 42 45 20 74 6f 20 62 65  is.** VDBE to be
17000 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74   rolled back aft
17010 65 72 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68  er an error with
17020 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
17030 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 65  ll back the.** e
17040 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
17050 6e 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 69  n. If no error i
17060 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
17070 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
17080 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
17090 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
170a0 6f 6d 6d 69 74 20 77 68 65 6e 20 74 68 65 20 56  ommit when the V
170b0 44 42 45 20 68 61 6c 74 73 2e 0a 2a 2a 0a 2a 2a  DBE halts..**.**
170c0 20 49 66 20 50 32 20 69 73 20 7a 65 72 6f 2c 20   If P2 is zero, 
170d0 74 68 65 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  then a read-lock
170e0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20   is obtained on 
170f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17100 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 72  e..*/.case OP_Tr
17110 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 42  ansaction: {.  B
17120 74 72 65 65 20 2a 70 42 74 3b 0a 0a 20 20 61 73  tree *pBt;..  as
17130 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
17140 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e   && pOp->p1<db->
17150 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
17160 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26   (p->btreeMask &
17170 20 28 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c   (((yDbMask)1)<<
17180 70 4f 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a  pOp->p1))!=0 );.
17190 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b    pBt = db->aDb[
171a0 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 0a 20  pOp->p1].pBt;.. 
171b0 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
171c0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
171d0 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c  eBeginTrans(pBt,
171e0 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 20 20 69   pOp->p2);.    i
171f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
17200 53 59 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  SY ){.      p->p
17210 63 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 70 2d  c = pc;.      p-
17220 3e 72 63 20 3d 20 72 63 20 3d 20 53 51 4c 49 54  >rc = rc = SQLIT
17230 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 67 6f  E_BUSY;.      go
17240 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a  to vdbe_return;.
17250 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
17260 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17270 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
17280 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
17290 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 70    }..    if( pOp
172a0 2d 3e 70 32 20 26 26 20 70 2d 3e 75 73 65 73 53  ->p2 && p->usesS
172b0 74 6d 74 4a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  tmtJournal .    
172c0 20 26 26 20 28 64 62 2d 3e 61 75 74 6f 43 6f 6d   && (db->autoCom
172d0 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 63  mit==0 || db->ac
172e0 74 69 76 65 56 64 62 65 43 6e 74 3e 31 29 20 0a  tiveVdbeCnt>1) .
172f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
17300 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
17310 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
17320 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
17330 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 7b  iStatement==0 ){
17340 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17350 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e   db->nStatement>
17360 3d 30 20 26 26 20 64 62 2d 3e 6e 53 61 76 65 70  =0 && db->nSavep
17370 6f 69 6e 74 3e 3d 30 20 29 3b 0a 20 20 20 20 20  oint>=0 );.     
17380 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
17390 74 2b 2b 3b 20 0a 20 20 20 20 20 20 20 20 70 2d  t++; .        p-
173a0 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 64 62  >iStatement = db
173b0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20 64  ->nSavepoint + d
173c0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3b 0a 20  b->nStatement;. 
173d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63       }..      rc
173e0 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
173f0 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45  vepoint(db, SAVE
17400 50 4f 49 4e 54 5f 42 45 47 49 4e 2c 20 70 2d 3e  POINT_BEGIN, p->
17410 69 53 74 61 74 65 6d 65 6e 74 2d 31 29 3b 0a 20  iStatement-1);. 
17420 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
17430 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17440 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
17450 72 65 65 42 65 67 69 6e 53 74 6d 74 28 70 42 74  reeBeginStmt(pBt
17460 2c 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 29  , p->iStatement)
17470 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
17480 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 63 75   /* Store the cu
17490 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74  rrent value of t
174a0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
174b0 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e  les deferred con
174c0 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20 2a 2a  straint.      **
174d0 20 63 6f 75 6e 74 65 72 2e 20 49 66 20 74 68 65   counter. If the
174e0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
174f0 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  action needs to 
17500 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 0a  be rolled back,.
17510 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c        ** the val
17520 75 65 20 6f 66 20 74 68 69 73 20 63 6f 75 6e 74  ue of this count
17530 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  er needs to be r
17540 65 73 74 6f 72 65 64 20 74 6f 6f 2e 20 20 2a 2f  estored too.  */
17550 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74 6d 74 44  .      p->nStmtD
17560 65 66 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65  efCons = db->nDe
17570 66 65 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20  ferredCons;.    
17580 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  }.  }.  break;.}
17590 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 61  ../* Opcode: Rea
175a0 64 43 6f 6f 6b 69 65 20 50 31 20 50 32 20 50 33  dCookie P1 P2 P3
175b0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20   * *.**.** Read 
175c0 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20 50 33  cookie number P3
175d0 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 50   from database P
175e0 31 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 69  1 and write it i
175f0 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e  nto register P2.
17600 0a 2a 2a 20 50 33 3d 3d 31 20 69 73 20 74 68 65  .** P3==1 is the
17610 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 2e   schema version.
17620 20 20 50 33 3d 3d 32 20 69 73 20 74 68 65 20 64    P3==2 is the d
17630 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 2e 0a  atabase format..
17640 2a 2a 20 50 33 3d 3d 33 20 69 73 20 74 68 65 20  ** P3==3 is the 
17650 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61 67 65  recommended page
17660 72 20 63 61 63 68 65 20 73 69 7a 65 2c 20 61 6e  r cache size, an
17670 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 50 31 3d  d so forth.  P1=
17680 3d 30 20 69 73 0a 2a 2a 20 74 68 65 20 6d 61 69  =0 is.** the mai
17690 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
176a0 61 6e 64 20 50 31 3d 3d 31 20 69 73 20 74 68 65  and P1==1 is the
176b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
176c0 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20  sed to store.** 
176d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
176e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
176f0 73 74 20 62 65 20 61 20 72 65 61 64 2d 6c 6f 63  st be a read-loc
17700 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
17710 65 20 28 65 69 74 68 65 72 20 61 20 74 72 61 6e  e (either a tran
17720 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  saction.** must 
17730 62 65 20 73 74 61 72 74 65 64 20 6f 72 20 74 68  be started or th
17740 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f  ere must be an o
17750 70 65 6e 20 63 75 72 73 6f 72 29 20 62 65 66 6f  pen cursor) befo
17760 72 65 0a 2a 2a 20 65 78 65 63 75 74 69 6e 67 20  re.** executing 
17770 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
17780 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61  ..*/.case OP_Rea
17790 64 43 6f 6f 6b 69 65 3a 20 7b 20 20 20 20 20 20  dCookie: {      
177a0 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
177b0 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20  -prerelease */. 
177c0 20 69 6e 74 20 69 4d 65 74 61 3b 0a 20 20 69 6e   int iMeta;.  in
177d0 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 43 6f  t iDb;.  int iCo
177e0 6f 6b 69 65 3b 0a 0a 20 20 69 44 62 20 3d 20 70  okie;..  iDb = p
177f0 4f 70 2d 3e 70 31 3b 0a 20 20 69 43 6f 6f 6b 69  Op->p1;.  iCooki
17800 65 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61  e = pOp->p3;.  a
17810 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 53  ssert( pOp->p3<S
17820 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45  QLITE_N_BTREE_ME
17830 54 41 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TA );.  assert( 
17840 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
17850 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
17860 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t( db->aDb[iDb].
17870 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
17880 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73  rt( (p->btreeMas
17890 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31  k & (((yDbMask)1
178a0 29 3c 3c 69 44 62 29 29 21 3d 30 20 29 3b 0a 0a  )<<iDb))!=0 );..
178b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65    sqlite3BtreeGe
178c0 74 4d 65 74 61 28 64 62 2d 3e 61 44 62 5b 69 44  tMeta(db->aDb[iD
178d0 62 5d 2e 70 42 74 2c 20 69 43 6f 6f 6b 69 65 2c  b].pBt, iCookie,
178e0 20 28 75 33 32 20 2a 29 26 69 4d 65 74 61 29 3b   (u32 *)&iMeta);
178f0 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69  .  pOut->u.i = i
17900 4d 65 74 61 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  Meta;.  break;.}
17910 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 74  ../* Opcode: Set
17920 43 6f 6f 6b 69 65 20 50 31 20 50 32 20 50 33 20  Cookie P1 P2 P3 
17930 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  * *.**.** Write 
17940 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72  the content of r
17950 65 67 69 73 74 65 72 20 50 33 20 28 69 6e 74 65  egister P3 (inte
17960 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 69 6e  rpreted as an in
17970 74 65 67 65 72 29 0a 2a 2a 20 69 6e 74 6f 20 63  teger).** into c
17980 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20 50 32 20  ookie number P2 
17990 6f 66 20 64 61 74 61 62 61 73 65 20 50 31 2e 20  of database P1. 
179a0 20 50 32 3d 3d 31 20 69 73 20 74 68 65 20 73 63   P2==1 is the sc
179b0 68 65 6d 61 20 76 65 72 73 69 6f 6e 2e 20 20 0a  hema version.  .
179c0 2a 2a 20 50 32 3d 3d 32 20 69 73 20 74 68 65 20  ** P2==2 is the 
179d0 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 2e  database format.
179e0 20 50 32 3d 3d 33 20 69 73 20 74 68 65 20 72 65   P2==3 is the re
179f0 63 6f 6d 6d 65 6e 64 65 64 20 70 61 67 65 72 20  commended pager 
17a00 63 61 63 68 65 20 0a 2a 2a 20 73 69 7a 65 2c 20  cache .** size, 
17a10 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 50  and so forth.  P
17a20 31 3d 3d 30 20 69 73 20 74 68 65 20 6d 61 69 6e  1==0 is the main
17a30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
17a40 6e 64 20 50 31 3d 3d 31 20 69 73 20 74 68 65 20  nd P1==1 is the 
17a50 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
17a60 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  e used to store 
17a70 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
17a80 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61  ..**.** A transa
17a90 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74  ction must be st
17aa0 61 72 74 65 64 20 62 65 66 6f 72 65 20 65 78 65  arted before exe
17ab0 63 75 74 69 6e 67 20 74 68 69 73 20 6f 70 63 6f  cuting this opco
17ac0 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  de..*/.case OP_S
17ad0 65 74 43 6f 6f 6b 69 65 3a 20 7b 20 20 20 20 20  etCookie: {     
17ae0 20 20 2f 2a 20 69 6e 33 20 2a 2f 0a 20 20 44 62    /* in3 */.  Db
17af0 20 2a 70 44 62 3b 0a 20 20 61 73 73 65 72 74 28   *pDb;.  assert(
17b00 20 70 4f 70 2d 3e 70 32 3c 53 51 4c 49 54 45 5f   pOp->p2<SQLITE_
17b10 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20 29 3b 0a  N_BTREE_META );.
17b20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
17b30 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
17b40 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
17b50 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61  ert( (p->btreeMa
17b60 73 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29  sk & (((yDbMask)
17b70 31 29 3c 3c 70 4f 70 2d 3e 70 31 29 29 21 3d 30  1)<<pOp->p1))!=0
17b80 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   );.  pDb = &db-
17b90 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  >aDb[pOp->p1];. 
17ba0 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 42   assert( pDb->pB
17bb0 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
17bc0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
17bd0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 70 4f 70  utexHeld(db, pOp
17be0 2d 3e 70 31 2c 20 30 29 20 29 3b 0a 20 20 70 49  ->p1, 0) );.  pI
17bf0 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n3 = &aMem[pOp->
17c00 70 33 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3];.  sqlite3Vd
17c10 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28  beMemIntegerify(
17c20 70 49 6e 33 29 3b 0a 20 20 2f 2a 20 53 65 65 20  pIn3);.  /* See 
17c30 6e 6f 74 65 20 61 62 6f 75 74 20 69 6e 64 65 78  note about index
17c40 20 73 68 69 66 74 69 6e 67 20 6f 6e 20 4f 50 5f   shifting on OP_
17c50 52 65 61 64 43 6f 6f 6b 69 65 20 2a 2f 0a 20 20  ReadCookie */.  
17c60 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
17c70 65 55 70 64 61 74 65 4d 65 74 61 28 70 44 62 2d  eUpdateMeta(pDb-
17c80 3e 70 42 74 2c 20 70 4f 70 2d 3e 70 32 2c 20 28  >pBt, pOp->p2, (
17c90 69 6e 74 29 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a  int)pIn3->u.i);.
17ca0 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 42    if( pOp->p2==B
17cb0 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53  TREE_SCHEMA_VERS
17cc0 49 4f 4e 20 29 7b 0a 20 20 20 20 2f 2a 20 57 68  ION ){.    /* Wh
17cd0 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  en the schema co
17ce0 6f 6b 69 65 20 63 68 61 6e 67 65 73 2c 20 72 65  okie changes, re
17cf0 63 6f 72 64 20 74 68 65 20 6e 65 77 20 63 6f 6f  cord the new coo
17d00 6b 69 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 2a  kie internally *
17d10 2f 0a 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65  /.    pDb->pSche
17d20 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  ma->schema_cooki
17d30 65 20 3d 20 28 69 6e 74 29 70 49 6e 33 2d 3e 75  e = (int)pIn3->u
17d40 2e 69 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  .i;.    db->flag
17d50 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
17d60 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 65 6c  rnChanges;.  }el
17d70 73 65 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d  se if( pOp->p2==
17d80 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41  BTREE_FILE_FORMA
17d90 54 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f  T ){.    /* Reco
17da0 72 64 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68  rd changes in th
17db0 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 2a 2f  e file format */
17dc0 0a 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d  .    pDb->pSchem
17dd0 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d  a->file_format =
17de0 20 28 75 38 29 70 49 6e 33 2d 3e 75 2e 69 3b 0a   (u8)pIn3->u.i;.
17df0 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70    }.  if( pOp->p
17e00 31 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  1==1 ){.    /* I
17e10 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
17e20 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
17e30 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 54  s whenever the T
17e40 45 4d 50 20 64 61 74 61 62 61 73 65 0a 20 20 20  EMP database.   
17e50 20 2a 2a 20 73 63 68 65 6d 61 20 69 73 20 63 68   ** schema is ch
17e60 61 6e 67 65 64 2e 20 20 54 69 63 6b 65 74 20 23  anged.  Ticket #
17e70 31 36 34 34 20 2a 2f 0a 20 20 20 20 73 71 6c 69  1644 */.    sqli
17e80 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
17e90 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
17ea0 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
17eb0 3d 20 30 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  = 0;.  }.  break
17ec0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
17ed0 56 65 72 69 66 79 43 6f 6f 6b 69 65 20 50 31 20  VerifyCookie P1 
17ee0 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
17ef0 43 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65 20  Check the value 
17f00 6f 66 20 67 6c 6f 62 61 6c 20 64 61 74 61 62 61  of global databa
17f10 73 65 20 70 61 72 61 6d 65 74 65 72 20 6e 75 6d  se parameter num
17f20 62 65 72 20 30 20 28 74 68 65 0a 2a 2a 20 73 63  ber 0 (the.** sc
17f30 68 65 6d 61 20 76 65 72 73 69 6f 6e 29 20 61 6e  hema version) an
17f40 64 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69  d make sure it i
17f50 73 20 65 71 75 61 6c 20 74 6f 20 50 32 20 61 6e  s equal to P2 an
17f60 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 67 65  d that the.** ge
17f70 6e 65 72 61 74 69 6f 6e 20 63 6f 75 6e 74 65 72  neration counter
17f80 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 73 63   on the local sc
17f90 68 65 6d 61 20 70 61 72 73 65 20 65 71 75 61 6c  hema parse equal
17fa0 73 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69  s P3..**.** P1 i
17fb0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  s the database n
17fc0 75 6d 62 65 72 20 77 68 69 63 68 20 69 73 20 30  umber which is 0
17fd0 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
17fe0 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61  tabase file.** a
17ff0 6e 64 20 31 20 66 6f 72 20 74 68 65 20 66 69 6c  nd 1 for the fil
18000 65 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f 72  e holding tempor
18010 61 72 79 20 74 61 62 6c 65 73 20 61 6e 64 20 73  ary tables and s
18020 6f 6d 65 20 68 69 67 68 65 72 20 6e 75 6d 62 65  ome higher numbe
18030 72 0a 2a 2a 20 66 6f 72 20 61 75 78 69 6c 69 61  r.** for auxilia
18040 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a  ry databases..**
18050 0a 2a 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 63  .** The cookie c
18060 68 61 6e 67 65 73 20 69 74 73 20 76 61 6c 75 65  hanges its value
18070 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 64 61   whenever the da
18080 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 63 68  tabase schema ch
18090 61 6e 67 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6f  anges..** This o
180a0 70 65 72 61 74 69 6f 6e 20 69 73 20 75 73 65 64  peration is used
180b0 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20   to detect when 
180c0 74 68 61 74 20 74 68 65 20 63 6f 6f 6b 69 65 20  that the cookie 
180d0 68 61 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20 61  has changed.** a
180e0 6e 64 20 74 68 61 74 20 74 68 65 20 63 75 72 72  nd that the curr
180f0 65 6e 74 20 70 72 6f 63 65 73 73 20 6e 65 65 64  ent process need
18100 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65 20  s to reread the 
18110 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 45 69  schema..**.** Ei
18120 74 68 65 72 20 61 20 74 72 61 6e 73 61 63 74 69  ther a transacti
18130 6f 6e 20 6e 65 65 64 73 20 74 6f 20 68 61 76 65  on needs to have
18140 20 62 65 65 6e 20 73 74 61 72 74 65 64 20 6f 72   been started or
18150 20 61 6e 20 4f 50 5f 4f 70 65 6e 20 6e 65 65 64   an OP_Open need
18160 73 0a 2a 2a 20 74 6f 20 62 65 20 65 78 65 63 75  s.** to be execu
18170 74 65 64 20 28 74 6f 20 65 73 74 61 62 6c 69 73  ted (to establis
18180 68 20 61 20 72 65 61 64 20 6c 6f 63 6b 29 20 62  h a read lock) b
18190 65 66 6f 72 65 20 74 68 69 73 20 6f 70 63 6f 64  efore this opcod
181a0 65 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e  e is.** invoked.
181b0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 65 72 69  .*/.case OP_Veri
181c0 66 79 43 6f 6f 6b 69 65 3a 20 7b 0a 20 20 69 6e  fyCookie: {.  in
181d0 74 20 69 4d 65 74 61 3b 0a 20 20 69 6e 74 20 69  t iMeta;.  int i
181e0 47 65 6e 3b 0a 20 20 42 74 72 65 65 20 2a 70 42  Gen;.  Btree *pB
181f0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  t;..  assert( pO
18200 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
18210 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  >p1<db->nDb );. 
18220 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74 72   assert( (p->btr
18230 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44 62 4d  eeMask & (((yDbM
18240 61 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e 70 31 29  ask)1)<<pOp->p1)
18250 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
18260 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
18270 75 74 65 78 48 65 6c 64 28 64 62 2c 20 70 4f 70  utexHeld(db, pOp
18280 2d 3e 70 31 2c 20 30 29 20 29 3b 0a 20 20 70 42  ->p1, 0) );.  pB
18290 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d  t = db->aDb[pOp-
182a0 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 69 66 28 20  >p1].pBt;.  if( 
182b0 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBt ){.    sqlit
182c0 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
182d0 42 74 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41  Bt, BTREE_SCHEMA
182e0 5f 56 45 52 53 49 4f 4e 2c 20 28 75 33 32 20 2a  _VERSION, (u32 *
182f0 29 26 69 4d 65 74 61 29 3b 0a 20 20 20 20 69 47  )&iMeta);.    iG
18300 65 6e 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70  en = db->aDb[pOp
18310 2d 3e 70 31 5d 2e 70 53 63 68 65 6d 61 2d 3e 69  ->p1].pSchema->i
18320 47 65 6e 65 72 61 74 69 6f 6e 3b 0a 20 20 7d 65  Generation;.  }e
18330 6c 73 65 7b 0a 20 20 20 20 69 47 65 6e 20 3d 20  lse{.    iGen = 
18340 69 4d 65 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20  iMeta = 0;.  }. 
18350 20 69 66 28 20 69 4d 65 74 61 21 3d 70 4f 70 2d   if( iMeta!=pOp-
18360 3e 70 32 20 7c 7c 20 69 47 65 6e 21 3d 70 4f 70  >p2 || iGen!=pOp
18370 2d 3e 70 33 20 29 7b 0a 20 20 20 20 73 71 6c 69  ->p3 ){.    sqli
18380 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
18390 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
183a0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  ->zErrMsg = sqli
183b0 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
183c0 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61  "database schema
183d0 20 68 61 73 20 63 68 61 6e 67 65 64 22 29 3b 0a   has changed");.
183e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 63      /* If the sc
183f0 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 66 72 6f 6d  hema-cookie from
18400 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18410 6c 65 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  le matches the c
18420 6f 6f 6b 69 65 20 0a 20 20 20 20 2a 2a 20 73 74  ookie .    ** st
18430 6f 72 65 64 20 77 69 74 68 20 74 68 65 20 69 6e  ored with the in
18440 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
18450 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63  tation of the sc
18460 68 65 6d 61 2c 20 64 6f 0a 20 20 20 20 2a 2a 20  hema, do.    ** 
18470 6e 6f 74 20 72 65 6c 6f 61 64 20 74 68 65 20 73  not reload the s
18480 63 68 65 6d 61 20 66 72 6f 6d 20 74 68 65 20 64  chema from the d
18490 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
184a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 76    **.    ** If v
184b0 69 72 74 75 61 6c 2d 74 61 62 6c 65 73 20 61 72  irtual-tables ar
184c0 65 20 69 6e 20 75 73 65 2c 20 74 68 69 73 20 69  e in use, this i
184d0 73 20 6e 6f 74 20 6a 75 73 74 20 61 6e 20 6f 70  s not just an op
184e0 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20  timization..    
184f0 2a 2a 20 4f 66 74 65 6e 2c 20 76 2d 74 61 62 6c  ** Often, v-tabl
18500 65 73 20 73 74 6f 72 65 20 74 68 65 69 72 20 64  es store their d
18510 61 74 61 20 69 6e 20 6f 74 68 65 72 20 53 51 4c  ata in other SQL
18520 69 74 65 20 74 61 62 6c 65 73 2c 20 77 68 69 63  ite tables, whic
18530 68 0a 20 20 20 20 2a 2a 20 61 72 65 20 71 75 65  h.    ** are que
18540 72 69 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  ried from within
18550 20 78 4e 65 78 74 28 29 20 61 6e 64 20 6f 74 68   xNext() and oth
18560 65 72 20 76 2d 74 61 62 6c 65 20 6d 65 74 68 6f  er v-table metho
18570 64 73 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20  ds using.    ** 
18580 70 72 65 70 61 72 65 64 20 71 75 65 72 69 65 73  prepared queries
18590 2e 20 49 66 20 73 75 63 68 20 61 20 71 75 65 72  . If such a quer
185a0 79 20 69 73 20 6f 75 74 2d 6f 66 2d 64 61 74 65  y is out-of-date
185b0 2c 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74  , we do not want
185c0 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 63 61   to.    ** disca
185d0 72 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rd the database 
185e0 73 63 68 65 6d 61 2c 20 61 73 20 74 68 65 20 75  schema, as the u
185f0 73 65 72 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65  ser code impleme
18600 6e 74 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  nting the.    **
18610 20 76 2d 74 61 62 6c 65 20 77 6f 75 6c 64 20 68   v-table would h
18620 61 76 65 20 74 6f 20 62 65 20 72 65 61 64 79 20  ave to be ready 
18630 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f  for the sqlite3_
18640 76 74 61 62 20 73 74 72 75 63 74 75 72 65 20 69  vtab structure i
18650 74 73 65 6c 66 0a 20 20 20 20 2a 2a 20 74 6f 20  tself.    ** to 
18660 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 77  be invalidated w
18670 68 65 6e 65 76 65 72 20 73 71 6c 69 74 65 33 5f  henever sqlite3_
18680 73 74 65 70 28 29 20 69 73 20 63 61 6c 6c 65 64  step() is called
18690 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 0a 20 20   from within .  
186a0 20 20 2a 2a 20 61 20 76 2d 74 61 62 6c 65 20 6d    ** a v-table m
186b0 65 74 68 6f 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ethod..    */.  
186c0 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 70 4f    if( db->aDb[pO
186d0 70 2d 3e 70 31 5d 2e 70 53 63 68 65 6d 61 2d 3e  p->p1].pSchema->
186e0 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 21 3d 69  schema_cookie!=i
186f0 4d 65 74 61 20 29 7b 0a 20 20 20 20 20 20 73 71  Meta ){.      sq
18700 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
18710 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 70 4f 70  alSchema(db, pOp
18720 2d 3e 70 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ->p1);.    }..  
18730 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31    p->expired = 1
18740 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
18750 45 5f 53 43 48 45 4d 41 3b 0a 20 20 7d 0a 20 20  E_SCHEMA;.  }.  
18760 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
18770 6f 64 65 3a 20 4f 70 65 6e 52 65 61 64 20 50 31  ode: OpenRead P1
18780 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a   P2 P3 P4 P5.**.
18790 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f  ** Open a read-o
187a0 6e 6c 79 20 63 75 72 73 6f 72 20 66 6f 72 20 74  nly cursor for t
187b0 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  he database tabl
187c0 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67  e whose root pag
187d0 65 20 69 73 0a 2a 2a 20 50 32 20 69 6e 20 61 20  e is.** P2 in a 
187e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
187f0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
18800 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
18810 62 79 20 50 33 2e 20 0a 2a 2a 20 50 33 3d 3d 30  by P3. .** P3==0
18820 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20   means the main 
18830 64 61 74 61 62 61 73 65 2c 20 50 33 3d 3d 31 20  database, P3==1 
18840 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
18850 73 65 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20  se used for .** 
18860 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
18870 2c 20 61 6e 64 20 50 33 3e 31 20 6d 65 61 6e 73  , and P3>1 means
18880 20 75 73 65 64 20 74 68 65 20 63 6f 72 72 65 73   used the corres
18890 70 6f 6e 64 69 6e 67 20 61 74 74 61 63 68 65 64  ponding attached
188a0 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20 47  .** database.  G
188b0 69 76 65 20 74 68 65 20 6e 65 77 20 63 75 72 73  ive the new curs
188c0 6f 72 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  or an identifier
188d0 20 6f 66 20 50 31 2e 20 20 54 68 65 20 50 31 0a   of P1.  The P1.
188e0 2a 2a 20 76 61 6c 75 65 73 20 6e 65 65 64 20 6e  ** values need n
188f0 6f 74 20 62 65 20 63 6f 6e 74 69 67 75 6f 75 73  ot be contiguous
18900 20 62 75 74 20 61 6c 6c 20 50 31 20 76 61 6c 75   but all P1 valu
18910 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 6d 61  es should be sma
18920 6c 6c 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 20  ll integers..** 
18930 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 66  It is an error f
18940 6f 72 20 50 31 20 74 6f 20 62 65 20 6e 65 67 61  or P1 to be nega
18950 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  tive..**.** If P
18960 35 21 3d 30 20 74 68 65 6e 20 75 73 65 20 74 68  5!=0 then use th
18970 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67  e content of reg
18980 69 73 74 65 72 20 50 32 20 61 73 20 74 68 65 20  ister P2 as the 
18990 72 6f 6f 74 20 70 61 67 65 2c 20 6e 6f 74 0a 2a  root page, not.*
189a0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  * the value of P
189b0 32 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20  2 itself..**.** 
189c0 54 68 65 72 65 20 77 69 6c 6c 20 62 65 20 61 20  There will be a 
189d0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
189e0 20 64 61 74 61 62 61 73 65 20 77 68 65 6e 65 76   database whenev
189f0 65 72 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a  er there is an.*
18a00 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 2e 20 20  * open cursor.  
18a10 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
18a20 77 61 73 20 75 6e 6c 6f 63 6b 65 64 20 70 72 69  was unlocked pri
18a30 6f 72 20 74 6f 20 74 68 69 73 20 69 6e 73 74 72  or to this instr
18a40 75 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20 61  uction.** then a
18a50 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 61 63   read lock is ac
18a60 71 75 69 72 65 64 20 61 73 20 70 61 72 74 20 6f  quired as part o
18a70 66 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  f this instructi
18a80 6f 6e 2e 20 20 41 20 72 65 61 64 0a 2a 2a 20 6c  on.  A read.** l
18a90 6f 63 6b 20 61 6c 6c 6f 77 73 20 6f 74 68 65 72  ock allows other
18aa0 20 70 72 6f 63 65 73 73 65 73 20 74 6f 20 72 65   processes to re
18ab0 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
18ac0 62 75 74 20 70 72 6f 68 69 62 69 74 73 0a 2a 2a  but prohibits.**
18ad0 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
18ae0 73 73 20 66 72 6f 6d 20 6d 6f 64 69 66 79 69 6e  ss from modifyin
18af0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  g the database. 
18b00 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 69   The read lock i
18b10 73 0a 2a 2a 20 72 65 6c 65 61 73 65 64 20 77 68  s.** released wh
18b20 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  en all cursors a
18b30 72 65 20 63 6c 6f 73 65 64 2e 20 20 49 66 20 74  re closed.  If t
18b40 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
18b50 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 67  attempts.** to g
18b60 65 74 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 62  et a read lock b
18b70 75 74 20 66 61 69 6c 73 2c 20 74 68 65 20 73 63  ut fails, the sc
18b80 72 69 70 74 20 74 65 72 6d 69 6e 61 74 65 73 20  ript terminates 
18b90 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54  with an.** SQLIT
18ba0 45 5f 42 55 53 59 20 65 72 72 6f 72 20 63 6f 64  E_BUSY error cod
18bb0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20  e..**.** The P4 
18bc0 76 61 6c 75 65 20 6d 61 79 20 62 65 20 65 69 74  value may be eit
18bd0 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20 28  her an integer (
18be0 50 34 5f 49 4e 54 33 32 29 20 6f 72 20 61 20 70  P4_INT32) or a p
18bf0 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20 4b  ointer to.** a K
18c00 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
18c10 20 28 50 34 5f 4b 45 59 49 4e 46 4f 29 2e 20 49   (P4_KEYINFO). I
18c20 66 20 69 74 20 69 73 20 61 20 70 6f 69 6e 74 65  f it is a pointe
18c30 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 0a  r to a KeyInfo .
18c40 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  ** structure, th
18c50 65 6e 20 73 61 69 64 20 73 74 72 75 63 74 75 72  en said structur
18c60 65 20 64 65 66 69 6e 65 73 20 74 68 65 20 63 6f  e defines the co
18c70 6e 74 65 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74  ntent and collat
18c80 69 6e 67 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ing .** sequence
18c90 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 62 65   of the index be
18ca0 69 6e 67 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65  ing opened. Othe
18cb0 72 77 69 73 65 2c 20 69 66 20 50 34 20 69 73 20  rwise, if P4 is 
18cc0 61 6e 20 69 6e 74 65 67 65 72 20 0a 2a 2a 20 76  an integer .** v
18cd0 61 6c 75 65 2c 20 69 74 20 69 73 20 73 65 74 20  alue, it is set 
18ce0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
18cf0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
18d00 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  table..**.** See
18d10 20 61 6c 73 6f 20 4f 70 65 6e 57 72 69 74 65 2e   also OpenWrite.
18d20 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .*/./* Opcode: O
18d30 70 65 6e 57 72 69 74 65 20 50 31 20 50 32 20 50  penWrite P1 P2 P
18d40 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 4f 70  3 P4 P5.**.** Op
18d50 65 6e 20 61 20 72 65 61 64 2f 77 72 69 74 65 20  en a read/write 
18d60 63 75 72 73 6f 72 20 6e 61 6d 65 64 20 50 31 20  cursor named P1 
18d70 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  on the table or 
18d80 69 6e 64 65 78 20 77 68 6f 73 65 20 72 6f 6f 74  index whose root
18d90 0a 2a 2a 20 70 61 67 65 20 69 73 20 50 32 2e 20  .** page is P2. 
18da0 20 4f 72 20 69 66 20 50 35 21 3d 30 20 75 73 65   Or if P5!=0 use
18db0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
18dc0 72 65 67 69 73 74 65 72 20 50 32 20 74 6f 20 66  register P2 to f
18dd0 69 6e 64 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20  ind the.** root 
18de0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
18df0 50 34 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  P4 value may be 
18e00 65 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65  either an intege
18e10 72 20 28 50 34 5f 49 4e 54 33 32 29 20 6f 72 20  r (P4_INT32) or 
18e20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  a pointer to.** 
18e30 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
18e40 75 72 65 20 28 50 34 5f 4b 45 59 49 4e 46 4f 29  ure (P4_KEYINFO)
18e50 2e 20 49 66 20 69 74 20 69 73 20 61 20 70 6f 69  . If it is a poi
18e60 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66  nter to a KeyInf
18e70 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2c  o .** structure,
18e80 20 74 68 65 6e 20 73 61 69 64 20 73 74 72 75 63   then said struc
18e90 74 75 72 65 20 64 65 66 69 6e 65 73 20 74 68 65  ture defines the
18ea0 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 63 6f 6c   content and col
18eb0 6c 61 74 69 6e 67 20 0a 2a 2a 20 73 65 71 75 65  lating .** seque
18ec0 6e 63 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  nce of the index
18ed0 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 2e 20 4f   being opened. O
18ee0 74 68 65 72 77 69 73 65 2c 20 69 66 20 50 34 20  therwise, if P4 
18ef0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 0a 2a  is an integer .*
18f00 2a 20 76 61 6c 75 65 2c 20 69 74 20 69 73 20 73  * value, it is s
18f10 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
18f20 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
18f30 68 65 20 74 61 62 6c 65 2c 20 6f 72 20 74 6f 20  he table, or to 
18f40 74 68 65 0a 2a 2a 20 6c 61 72 67 65 73 74 20 69  the.** largest i
18f50 6e 64 65 78 20 6f 66 20 61 6e 79 20 63 6f 6c 75  ndex of any colu
18f60 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  mn of the table 
18f70 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79  that is actually
18f80 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   used..**.** Thi
18f90 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 6f  s instruction wo
18fa0 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 4f 70  rks just like Op
18fb0 65 6e 52 65 61 64 20 65 78 63 65 70 74 20 74 68  enRead except th
18fc0 61 74 20 69 74 20 6f 70 65 6e 73 20 74 68 65 20  at it opens the 
18fd0 63 75 72 73 6f 72 0a 2a 2a 20 69 6e 20 72 65 61  cursor.** in rea
18fe0 64 2f 77 72 69 74 65 20 6d 6f 64 65 2e 20 20 46  d/write mode.  F
18ff0 6f 72 20 61 20 67 69 76 65 6e 20 74 61 62 6c 65  or a given table
19000 2c 20 74 68 65 72 65 20 63 61 6e 20 62 65 20 6f  , there can be o
19010 6e 65 20 6f 72 20 6d 6f 72 65 20 72 65 61 64 2d  ne or more read-
19020 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20  only.** cursors 
19030 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 61 64  or a single read
19040 2f 77 72 69 74 65 20 63 75 72 73 6f 72 20 62 75  /write cursor bu
19050 74 20 6e 6f 74 20 62 6f 74 68 2e 0a 2a 2a 0a 2a  t not both..**.*
19060 2a 20 53 65 65 20 61 6c 73 6f 20 4f 70 65 6e 52  * See also OpenR
19070 65 61 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ead..*/.case OP_
19080 4f 70 65 6e 52 65 61 64 3a 0a 63 61 73 65 20 4f  OpenRead:.case O
19090 50 5f 4f 70 65 6e 57 72 69 74 65 3a 20 7b 0a 20  P_OpenWrite: {. 
190a0 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 4b   int nField;.  K
190b0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
190c0 3b 0a 20 20 69 6e 74 20 70 32 3b 0a 20 20 69 6e  ;.  int p2;.  in
190d0 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 77 72 46  t iDb;.  int wrF
190e0 6c 61 67 3b 0a 20 20 42 74 72 65 65 20 2a 70 58  lag;.  Btree *pX
190f0 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  ;.  VdbeCursor *
19100 70 43 75 72 3b 0a 20 20 44 62 20 2a 70 44 62 3b  pCur;.  Db *pDb;
19110 0a 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 69 72  ..  if( p->expir
19120 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ed ){.    rc = S
19130 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20  QLITE_ABORT;.   
19140 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 6e   break;.  }..  n
19150 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 70 4b 65  Field = 0;.  pKe
19160 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 70 32 20  yInfo = 0;.  p2 
19170 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 44 62  = pOp->p2;.  iDb
19180 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73   = pOp->p3;.  as
19190 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
191a0 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
191b0 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74 72   assert( (p->btr
191c0 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44 62 4d  eeMask & (((yDbM
191d0 61 73 6b 29 31 29 3c 3c 69 44 62 29 29 21 3d 30  ask)1)<<iDb))!=0
191e0 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   );.  pDb = &db-
191f0 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 58 20  >aDb[iDb];.  pX 
19200 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 61 73  = pDb->pBt;.  as
19210 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
19220 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
19230 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 29  ==OP_OpenWrite )
19240 7b 0a 20 20 20 20 77 72 46 6c 61 67 20 3d 20 31  {.    wrFlag = 1
19250 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
19260 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
19270 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
19280 20 29 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d   );.    if( pDb-
19290 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66  >pSchema->file_f
192a0 6f 72 6d 61 74 20 3c 20 70 2d 3e 6d 69 6e 57 72  ormat < p->minWr
192b0 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 29 7b  iteFileFormat ){
192c0 0a 20 20 20 20 20 20 70 2d 3e 6d 69 6e 57 72 69  .      p->minWri
192d0 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 70  teFileFormat = p
192e0 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c  Db->pSchema->fil
192f0 65 5f 66 6f 72 6d 61 74 3b 0a 20 20 20 20 7d 0a  e_format;.    }.
19300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 72 46    }else{.    wrF
19310 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  lag = 0;.  }.  i
19320 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20  f( pOp->p5 ){.  
19330 20 20 61 73 73 65 72 74 28 20 70 32 3e 30 20 29    assert( p2>0 )
19340 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 32  ;.    assert( p2
19350 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20  <=p->nMem );.   
19360 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 32   pIn2 = &aMem[p2
19370 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  ];.    assert( m
19380 65 6d 49 73 56 61 6c 69 64 28 70 49 6e 32 29 20  emIsValid(pIn2) 
19390 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
193a0 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn2->flags & ME
193b0 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20 20  M_Int)!=0 );.   
193c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
193d0 6e 74 65 67 65 72 69 66 79 28 70 49 6e 32 29 3b  ntegerify(pIn2);
193e0 0a 20 20 20 20 70 32 20 3d 20 28 69 6e 74 29 70  .    p2 = (int)p
193f0 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 2f 2a  In2->u.i;.    /*
19400 20 54 68 65 20 70 32 20 76 61 6c 75 65 20 61 6c   The p2 value al
19410 77 61 79 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ways comes from 
19420 61 20 70 72 69 6f 72 20 4f 50 5f 43 72 65 61 74  a prior OP_Creat
19430 65 54 61 62 6c 65 20 6f 70 63 6f 64 65 20 61 6e  eTable opcode an
19440 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 70  d.    ** that op
19450 63 6f 64 65 20 77 69 6c 6c 20 61 6c 77 61 79 73  code will always
19460 20 73 65 74 20 74 68 65 20 70 32 20 76 61 6c 75   set the p2 valu
19470 65 20 74 6f 20 32 20 6f 72 20 6d 6f 72 65 20 6f  e to 2 or more o
19480 72 20 65 6c 73 65 20 66 61 69 6c 2e 0a 20 20 20  r else fail..   
19490 20 2a 2a 20 49 66 20 74 68 65 72 65 20 77 65 72   ** If there wer
194a0 65 20 61 20 66 61 69 6c 75 72 65 2c 20 74 68 65  e a failure, the
194b0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
194c0 65 6e 74 20 77 6f 75 6c 64 20 68 61 76 65 20 68  ent would have h
194d0 61 6c 74 65 64 0a 20 20 20 20 2a 2a 20 62 65 66  alted.    ** bef
194e0 6f 72 65 20 72 65 61 63 68 69 6e 67 20 74 68 69  ore reaching thi
194f0 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 2a  s instruction. *
19500 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  /.    if( NEVER(
19510 70 32 3c 32 29 20 29 20 7b 0a 20 20 20 20 20 20  p2<2) ) {.      
19520 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
19530 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
19540 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
19550 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  o_error;.    }. 
19560 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34   }.  if( pOp->p4
19570 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  type==P4_KEYINFO
19580 20 29 7b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f   ){.    pKeyInfo
19590 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
195a0 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  nfo;.    pKeyInf
195b0 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 70 2d 3e  o->enc = ENC(p->
195c0 64 62 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 20  db);.    nField 
195d0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  = pKeyInfo->nFie
195e0 6c 64 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ld+1;.  }else if
195f0 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
19600 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 6e  4_INT32 ){.    n
19610 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 34 2e  Field = pOp->p4.
19620 69 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  i;.  }.  assert(
19630 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20   pOp->p1>=0 );. 
19640 20 70 43 75 72 20 3d 20 61 6c 6c 6f 63 61 74 65   pCur = allocate
19650 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70  Cursor(p, pOp->p
19660 31 2c 20 6e 46 69 65 6c 64 2c 20 69 44 62 2c 20  1, nField, iDb, 
19670 31 29 3b 0a 20 20 69 66 28 20 70 43 75 72 3d 3d  1);.  if( pCur==
19680 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
19690 0a 20 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77  .  pCur->nullRow
196a0 20 3d 20 31 3b 0a 20 20 70 43 75 72 2d 3e 69 73   = 1;.  pCur->is
196b0 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 72  Ordered = 1;.  r
196c0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
196d0 43 75 72 73 6f 72 28 70 58 2c 20 70 32 2c 20 77  Cursor(pX, p2, w
196e0 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c  rFlag, pKeyInfo,
196f0 20 70 43 75 72 2d 3e 70 43 75 72 73 6f 72 29 3b   pCur->pCursor);
19700 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
19710 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 0a 20  o = pKeyInfo;.. 
19720 20 2f 2a 20 53 69 6e 63 65 20 69 74 20 70 65 72   /* Since it per
19730 66 6f 72 6d 73 20 6e 6f 20 6d 65 6d 6f 72 79 20  forms no memory 
19740 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 49 4f  allocation or IO
19750 2c 20 74 68 65 20 6f 6e 6c 79 20 76 61 6c 75 65  , the only value
19760 20 74 68 61 74 0a 20 20 2a 2a 20 73 71 6c 69 74   that.  ** sqlit
19770 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 29 20  e3BtreeCursor() 
19780 6d 61 79 20 72 65 74 75 72 6e 20 69 73 20 53 51  may return is SQ
19790 4c 49 54 45 5f 4f 4b 2e 20 2a 2f 0a 20 20 61 73  LITE_OK. */.  as
197a0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
197b0 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  _OK );..  /* Set
197c0 20 74 68 65 20 56 64 62 65 43 75 72 73 6f 72 2e   the VdbeCursor.
197d0 69 73 54 61 62 6c 65 20 61 6e 64 20 69 73 49 6e  isTable and isIn
197e0 64 65 78 20 76 61 72 69 61 62 6c 65 73 2e 20 50  dex variables. P
197f0 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73  revious versions
19800 20 6f 66 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20   of.  ** SQLite 
19810 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  used to check if
19820 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 66   the root-page f
19830 6c 61 67 73 20 77 65 72 65 20 73 61 6e 65 20 61  lags were sane a
19840 74 20 74 68 69 73 20 70 6f 69 6e 74 0a 20 20 2a  t this point.  *
19850 2a 20 61 6e 64 20 72 65 70 6f 72 74 20 64 61 74  * and report dat
19860 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
19870 20 69 66 20 74 68 65 79 20 77 65 72 65 20 6e 6f   if they were no
19880 74 2c 20 62 75 74 20 74 68 69 73 20 63 68 65 63  t, but this chec
19890 6b 20 68 61 73 0a 20 20 2a 2a 20 73 69 6e 63 65  k has.  ** since
198a0 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20   moved into the 
198b0 62 74 72 65 65 20 6c 61 79 65 72 2e 20 20 2a 2f  btree layer.  */
198c0 20 20 0a 20 20 70 43 75 72 2d 3e 69 73 54 61 62    .  pCur->isTab
198d0 6c 65 20 3d 20 70 4f 70 2d 3e 70 34 74 79 70 65  le = pOp->p4type
198e0 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  !=P4_KEYINFO;.  
198f0 70 43 75 72 2d 3e 69 73 49 6e 64 65 78 20 3d 20  pCur->isIndex = 
19900 21 70 43 75 72 2d 3e 69 73 54 61 62 6c 65 3b 0a  !pCur->isTable;.
19910 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
19920 70 63 6f 64 65 3a 20 4f 70 65 6e 45 70 68 65 6d  pcode: OpenEphem
19930 65 72 61 6c 20 50 31 20 50 32 20 2a 20 50 34 20  eral P1 P2 * P4 
19940 50 35 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  P5.**.** Open a 
19950 6e 65 77 20 63 75 72 73 6f 72 20 50 31 20 74 6f  new cursor P1 to
19960 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
19970 6c 65 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f  le..** The curso
19980 72 20 69 73 20 61 6c 77 61 79 73 20 6f 70 65 6e  r is always open
19990 65 64 20 72 65 61 64 2f 77 72 69 74 65 20 65 76  ed read/write ev
199a0 65 6e 20 69 66 20 0a 2a 2a 20 74 68 65 20 6d 61  en if .** the ma
199b0 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 72  in database is r
199c0 65 61 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 65  ead-only.  The e
199d0 70 68 65 6d 65 72 61 6c 0a 2a 2a 20 74 61 62 6c  phemeral.** tabl
199e0 65 20 69 73 20 64 65 6c 65 74 65 64 20 61 75 74  e is deleted aut
199f0 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
19a00 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 63 6c  the cursor is cl
19a10 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69  osed..**.** P2 i
19a20 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
19a30 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 65  columns in the e
19a40 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a  phemeral table..
19a50 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  ** The cursor po
19a60 69 6e 74 73 20 74 6f 20 61 20 42 54 72 65 65 20  ints to a BTree 
19a70 74 61 62 6c 65 20 69 66 20 50 34 3d 3d 30 20 61  table if P4==0 a
19a80 6e 64 20 74 6f 20 61 20 42 54 72 65 65 20 69 6e  nd to a BTree in
19a90 64 65 78 0a 2a 2a 20 69 66 20 50 34 20 69 73 20  dex.** if P4 is 
19aa0 6e 6f 74 20 30 2e 20 20 49 66 20 50 34 20 69 73  not 0.  If P4 is
19ab0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f   not NULL, it po
19ac0 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66  ints to a KeyInf
19ad0 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  o structure.** t
19ae0 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
19af0 66 6f 72 6d 61 74 20 6f 66 20 6b 65 79 73 20 69  format of keys i
19b00 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a  n the index..**.
19b10 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77  ** This opcode w
19b20 61 73 20 6f 6e 63 65 20 63 61 6c 6c 65 64 20 4f  as once called O
19b30 70 65 6e 54 65 6d 70 2e 20 20 42 75 74 20 74 68  penTemp.  But th
19b40 61 74 20 63 72 65 61 74 65 64 0a 2a 2a 20 63 6f  at created.** co
19b50 6e 66 75 73 69 6f 6e 20 62 65 63 61 75 73 65 20  nfusion because 
19b60 74 68 65 20 74 65 72 6d 20 22 74 65 6d 70 20 74  the term "temp t
19b70 61 62 6c 65 22 2c 20 6d 69 67 68 74 20 72 65 66  able", might ref
19b80 65 72 20 65 69 74 68 65 72 0a 2a 2a 20 74 6f 20  er either.** to 
19b90 61 20 54 45 4d 50 20 74 61 62 6c 65 20 61 74 20  a TEMP table at 
19ba0 74 68 65 20 53 51 4c 20 6c 65 76 65 6c 2c 20 6f  the SQL level, o
19bb0 72 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 70 65  r to a table ope
19bc0 6e 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 6f  ned by.** this o
19bd0 70 63 6f 64 65 2e 20 20 54 68 65 6e 20 74 68 69  pcode.  Then thi
19be0 73 20 6f 70 63 6f 64 65 20 77 61 73 20 63 61 6c  s opcode was cal
19bf0 6c 20 4f 70 65 6e 56 69 72 74 75 61 6c 2e 20 20  l OpenVirtual.  
19c00 42 75 74 0a 2a 2a 20 74 68 61 74 20 63 72 65 61  But.** that crea
19c10 74 65 64 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69  ted confusion wi
19c20 74 68 20 74 68 65 20 77 68 6f 6c 65 20 76 69 72  th the whole vir
19c30 74 75 61 6c 2d 74 61 62 6c 65 20 69 64 65 61 2e  tual-table idea.
19c40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 70 61  .**.** The P5 pa
19c50 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20 61  rameter can be a
19c60 20 6d 61 73 6b 20 6f 66 20 74 68 65 20 42 54 52   mask of the BTR
19c70 45 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  EE_* flags defin
19c80 65 64 0a 2a 2a 20 69 6e 20 62 74 72 65 65 2e 68  ed.** in btree.h
19c90 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 63  .  These flags c
19ca0 6f 6e 74 72 6f 6c 20 61 73 70 65 63 74 73 20 6f  ontrol aspects o
19cb0 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  f the operation 
19cc0 6f 66 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 2e  of.** the btree.
19cd0 20 20 54 68 65 20 42 54 52 45 45 5f 4f 4d 49 54    The BTREE_OMIT
19ce0 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 42 54 52  _JOURNAL and BTR
19cf0 45 45 5f 53 49 4e 47 4c 45 20 66 6c 61 67 73 20  EE_SINGLE flags 
19d00 61 72 65 0a 2a 2a 20 61 64 64 65 64 20 61 75 74  are.** added aut
19d10 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 2f  omatically..*/./
19d20 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 41 75  * Opcode: OpenAu
19d30 74 6f 69 6e 64 65 78 20 50 31 20 50 32 20 2a 20  toindex P1 P2 * 
19d40 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  P4 *.**.** This 
19d50 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20 74 68 65  opcode works the
19d60 20 73 61 6d 65 20 61 73 20 4f 50 5f 4f 70 65 6e   same as OP_Open
19d70 45 70 68 65 6d 65 72 61 6c 2e 20 20 49 74 20 68  Ephemeral.  It h
19d80 61 73 20 61 0a 2a 2a 20 64 69 66 66 65 72 65 6e  as a.** differen
19d90 74 20 6e 61 6d 65 20 74 6f 20 64 69 73 74 69 6e  t name to distin
19da0 67 75 69 73 68 20 69 74 73 20 75 73 65 2e 20 20  guish its use.  
19db0 54 61 62 6c 65 73 20 63 72 65 61 74 65 64 20 75  Tables created u
19dc0 73 69 6e 67 0a 2a 2a 20 62 79 20 74 68 69 73 20  sing.** by this 
19dd0 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 75  opcode will be u
19de0 73 65 64 20 66 6f 72 20 61 75 74 6f 6d 61 74 69  sed for automati
19df0 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 74 72  cally created tr
19e00 61 6e 73 69 65 6e 74 0a 2a 2a 20 69 6e 64 69 63  ansient.** indic
19e10 65 73 20 69 6e 20 6a 6f 69 6e 73 2e 0a 2a 2f 0a  es in joins..*/.
19e20 63 61 73 65 20 4f 50 5f 4f 70 65 6e 41 75 74 6f  case OP_OpenAuto
19e30 69 6e 64 65 78 3a 20 0a 63 61 73 65 20 4f 50 5f  index: .case OP_
19e40 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 3a 20 7b  OpenEphemeral: {
19e50 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
19e60 43 78 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  Cx;.  static con
19e70 73 74 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  st int vfsFlags 
19e80 3d 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  = .      SQLITE_
19e90 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
19ea0 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  .      SQLITE_OP
19eb0 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
19ec0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
19ed0 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20  CLUSIVE |.      
19ee0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
19ef0 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
19f00 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52    SQLITE_OPEN_TR
19f10 41 4e 53 49 45 4e 54 5f 44 42 3b 0a 0a 20 20 61  ANSIENT_DB;..  a
19f20 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
19f30 30 20 29 3b 0a 20 20 70 43 78 20 3d 20 61 6c 6c  0 );.  pCx = all
19f40 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70  ocateCursor(p, p
19f50 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c  Op->p1, pOp->p2,
19f60 20 2d 31 2c 20 31 29 3b 0a 20 20 69 66 28 20 70   -1, 1);.  if( p
19f70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  Cx==0 ) goto no_
19f80 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c  mem;.  pCx->null
19f90 52 6f 77 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20  Row = 1;.  rc = 
19fa0 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
19fb0 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62  (db->pVfs, 0, db
19fc0 2c 20 26 70 43 78 2d 3e 70 42 74 2c 20 0a 20 20  , &pCx->pBt, .  
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fe0 20 20 20 20 20 20 42 54 52 45 45 5f 4f 4d 49 54        BTREE_OMIT
19ff0 5f 4a 4f 55 52 4e 41 4c 20 7c 20 42 54 52 45 45  _JOURNAL | BTREE
1a000 5f 53 49 4e 47 4c 45 20 7c 20 70 4f 70 2d 3e 70  _SINGLE | pOp->p
1a010 35 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  5, vfsFlags);.  
1a020 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a030 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1a040 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
1a050 72 61 6e 73 28 70 43 78 2d 3e 70 42 74 2c 20 31  rans(pCx->pBt, 1
1a060 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1a070 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a080 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 69    /* If a transi
1a090 65 6e 74 20 69 6e 64 65 78 20 69 73 20 72 65 71  ent index is req
1a0a0 75 69 72 65 64 2c 20 63 72 65 61 74 65 20 69 74  uired, create it
1a0b0 20 62 79 20 63 61 6c 6c 69 6e 67 0a 20 20 20 20   by calling.    
1a0c0 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
1a0d0 72 65 61 74 65 54 61 62 6c 65 28 29 20 77 69 74  reateTable() wit
1a0e0 68 20 74 68 65 20 42 54 52 45 45 5f 42 4c 4f 42  h the BTREE_BLOB
1a0f0 4b 45 59 20 66 6c 61 67 20 62 65 66 6f 72 65 0a  KEY flag before.
1a100 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 69      ** opening i
1a110 74 2e 20 49 66 20 61 20 74 72 61 6e 73 69 65 6e  t. If a transien
1a120 74 20 74 61 62 6c 65 20 69 73 20 72 65 71 75 69  t table is requi
1a130 72 65 64 2c 20 6a 75 73 74 20 75 73 65 20 74 68  red, just use th
1a140 65 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74  e.    ** automat
1a150 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 74  ically created t
1a160 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
1a170 61 67 65 20 31 20 28 61 6e 20 42 4c 4f 42 5f 49  age 1 (an BLOB_I
1a180 4e 54 4b 45 59 20 74 61 62 6c 65 29 2e 0a 20 20  NTKEY table)..  
1a190 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 70    */.    if( pOp
1a1a0 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 29 7b  ->p4.pKeyInfo ){
1a1b0 0a 20 20 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b  .      int pgno;
1a1c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a1d0 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b  Op->p4type==P4_K
1a1e0 45 59 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20  EYINFO );.      
1a1f0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1a200 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 43 78  eCreateTable(pCx
1a210 2d 3e 70 42 74 2c 20 26 70 67 6e 6f 2c 20 42 54  ->pBt, &pgno, BT
1a220 52 45 45 5f 42 4c 4f 42 4b 45 59 20 7c 20 70 4f  REE_BLOBKEY | pO
1a230 70 2d 3e 70 35 29 3b 20 0a 20 20 20 20 20 20 69  p->p5); .      i
1a240 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a250 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1a260 72 74 28 20 70 67 6e 6f 3d 3d 4d 41 53 54 45 52  rt( pgno==MASTER
1a270 5f 52 4f 4f 54 2b 31 20 29 3b 0a 20 20 20 20 20  _ROOT+1 );.     
1a280 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1a290 74 72 65 65 43 75 72 73 6f 72 28 70 43 78 2d 3e  treeCursor(pCx->
1a2a0 70 42 74 2c 20 70 67 6e 6f 2c 20 31 2c 20 0a 20  pBt, pgno, 1, . 
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1a2d0 4b 65 79 49 6e 66 6f 2a 29 70 4f 70 2d 3e 70 34  KeyInfo*)pOp->p4
1a2e0 2e 7a 2c 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  .z, pCx->pCursor
1a2f0 29 3b 0a 20 20 20 20 20 20 20 20 70 43 78 2d 3e  );.        pCx->
1a300 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
1a310 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  p4.pKeyInfo;.   
1a320 20 20 20 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e       pCx->pKeyIn
1a330 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 70 2d  fo->enc = ENC(p-
1a340 3e 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >db);.      }.  
1a350 20 20 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65      pCx->isTable
1a360 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1a370 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1a380 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 70  te3BtreeCursor(p
1a390 43 78 2d 3e 70 42 74 2c 20 4d 41 53 54 45 52 5f  Cx->pBt, MASTER_
1a3a0 52 4f 4f 54 2c 20 31 2c 20 30 2c 20 70 43 78 2d  ROOT, 1, 0, pCx-
1a3b0 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >pCursor);.     
1a3c0 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20   pCx->isTable = 
1a3d0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
1a3e0 43 78 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20  Cx->isOrdered = 
1a3f0 28 70 4f 70 2d 3e 70 35 21 3d 42 54 52 45 45 5f  (pOp->p5!=BTREE_
1a400 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 70 43  UNORDERED);.  pC
1a410 78 2d 3e 69 73 49 6e 64 65 78 20 3d 20 21 70 43  x->isIndex = !pC
1a420 78 2d 3e 69 73 54 61 62 6c 65 3b 0a 20 20 62 72  x->isTable;.  br
1a430 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
1a440 65 3a 20 4f 70 65 6e 53 6f 72 74 65 72 20 50 31  e: OpenSorter P1
1a450 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a   P2 * P4 *.**.**
1a460 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f 72   This opcode wor
1a470 6b 73 20 6c 69 6b 65 20 4f 50 5f 4f 70 65 6e 45  ks like OP_OpenE
1a480 70 68 65 6d 65 72 61 6c 20 65 78 63 65 70 74 20  phemeral except 
1a490 74 68 61 74 20 69 74 20 6f 70 65 6e 73 0a 2a 2a  that it opens.**
1a4a0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64   a transient ind
1a4b0 65 78 20 74 68 61 74 20 69 73 20 73 70 65 63 69  ex that is speci
1a4c0 66 69 63 61 6c 6c 79 20 64 65 73 69 67 6e 65 64  fically designed
1a4d0 20 74 6f 20 73 6f 72 74 20 6c 61 72 67 65 0a 2a   to sort large.*
1a4e0 2a 20 74 61 62 6c 65 73 20 75 73 69 6e 67 20 61  * tables using a
1a4f0 6e 20 65 78 74 65 72 6e 61 6c 20 6d 65 72 67 65  n external merge
1a500 2d 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 2e  -sort algorithm.
1a510 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74  .*/.case OP_Sort
1a520 65 72 4f 70 65 6e 3a 20 7b 0a 20 20 56 64 62 65  erOpen: {.  Vdbe
1a530 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 23 69 66  Cursor *pCx;.#if
1a540 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a550 5f 4d 45 52 47 45 5f 53 4f 52 54 0a 20 20 70 43  _MERGE_SORT.  pC
1a560 78 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  x = allocateCurs
1a570 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  or(p, pOp->p1, p
1a580 4f 70 2d 3e 70 32 2c 20 2d 31 2c 20 31 29 3b 0a  Op->p2, -1, 1);.
1a590 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20 67    if( pCx==0 ) g
1a5a0 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43  oto no_mem;.  pC
1a5b0 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f  x->pKeyInfo = pO
1a5c0 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
1a5d0 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d    pCx->pKeyInfo-
1a5e0 3e 65 6e 63 20 3d 20 45 4e 43 28 70 2d 3e 64 62  >enc = ENC(p->db
1a5f0 29 3b 0a 20 20 70 43 78 2d 3e 69 73 53 6f 72 74  );.  pCx->isSort
1a600 65 72 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73  er = 1;.  rc = s
1a610 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
1a620 49 6e 69 74 28 64 62 2c 20 70 43 78 29 3b 0a 23  Init(db, pCx);.#
1a630 65 6c 73 65 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f  else.  pOp->opco
1a640 64 65 20 3d 20 4f 50 5f 4f 70 65 6e 45 70 68 65  de = OP_OpenEphe
1a650 6d 65 72 61 6c 3b 0a 20 20 70 63 2d 2d 3b 0a 23  meral;.  pc--;.#
1a660 65 6e 64 69 66 0a 20 20 62 72 65 61 6b 3b 0a 7d  endif.  break;.}
1a670 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65  ../* Opcode: Ope
1a680 6e 50 73 65 75 64 6f 20 50 31 20 50 32 20 50 33  nPseudo P1 P2 P3
1a690 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20   * *.**.** Open 
1a6a0 61 20 6e 65 77 20 63 75 72 73 6f 72 20 74 68 61  a new cursor tha
1a6b0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 61  t points to a fa
1a6c0 6b 65 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f  ke table that co
1a6d0 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 0a  ntains a single.
1a6e0 2a 2a 20 72 6f 77 20 6f 66 20 64 61 74 61 2e 20  ** row of data. 
1a6f0 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
1a700 74 68 61 74 20 6f 6e 65 20 72 6f 77 20 69 6e 20  that one row in 
1a710 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6d  the content of m
1a720 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 73 74 65  emory.** registe
1a730 72 20 50 32 2e 20 20 49 6e 20 6f 74 68 65 72 20  r P2.  In other 
1a740 77 6f 72 64 73 2c 20 63 75 72 73 6f 72 20 50 31  words, cursor P1
1a750 20 62 65 63 6f 6d 65 73 20 61 6e 20 61 6c 69 61   becomes an alia
1a760 73 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 4d 45  s for the .** ME
1a770 4d 5f 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 20 63  M_Blob content c
1a780 6f 6e 74 61 69 6e 65 64 20 69 6e 20 72 65 67 69  ontained in regi
1a790 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 41  ster P2..**.** A
1a7a0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 63 72   pseudo-table cr
1a7b0 65 61 74 65 64 20 62 79 20 74 68 69 73 20 6f 70  eated by this op
1a7c0 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20  code is used to 
1a7d0 68 6f 6c 64 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  hold a single.**
1a7e0 20 72 6f 77 20 6f 75 74 70 75 74 20 66 72 6f 6d   row output from
1a7f0 20 74 68 65 20 73 6f 72 74 65 72 20 73 6f 20 74   the sorter so t
1a800 68 61 74 20 74 68 65 20 72 6f 77 20 63 61 6e 20  hat the row can 
1a810 62 65 20 64 65 63 6f 6d 70 6f 73 65 64 20 69 6e  be decomposed in
1a820 74 6f 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  to.** individual
1a830 20 63 6f 6c 75 6d 6e 73 20 75 73 69 6e 67 20 74   columns using t
1a840 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63  he OP_Column opc
1a850 6f 64 65 2e 20 20 54 68 65 20 4f 50 5f 43 6f 6c  ode.  The OP_Col
1a860 75 6d 6e 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73  umn opcode.** is
1a870 20 74 68 65 20 6f 6e 6c 79 20 63 75 72 73 6f 72   the only cursor
1a880 20 6f 70 63 6f 64 65 20 74 68 61 74 20 77 6f 72   opcode that wor
1a890 6b 73 20 77 69 74 68 20 61 20 70 73 65 75 64 6f  ks with a pseudo
1a8a0 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 50 33  -table..**.** P3
1a8b0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1a8c0 66 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  f fields in the 
1a8d0 72 65 63 6f 72 64 73 20 74 68 61 74 20 77 69 6c  records that wil
1a8e0 6c 20 62 65 20 73 74 6f 72 65 64 20 62 79 0a 2a  l be stored by.*
1a8f0 2a 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62  * the pseudo-tab
1a900 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f  le..*/.case OP_O
1a910 70 65 6e 50 73 65 75 64 6f 3a 20 7b 0a 20 20 56  penPseudo: {.  V
1a920 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a  dbeCursor *pCx;.
1a930 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1a940 70 31 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20 3d  p1>=0 );.  pCx =
1a950 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
1a960 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  p, pOp->p1, pOp-
1a970 3e 70 33 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 69  >p3, -1, 0);.  i
1a980 66 28 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f  f( pCx==0 ) goto
1a990 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e   no_mem;.  pCx->
1a9a0 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70  nullRow = 1;.  p
1a9b0 43 78 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52  Cx->pseudoTableR
1a9c0 65 67 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  eg = pOp->p2;.  
1a9d0 70 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20 31  pCx->isTable = 1
1a9e0 3b 0a 20 20 70 43 78 2d 3e 69 73 49 6e 64 65 78  ;.  pCx->isIndex
1a9f0 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d   = 0;.  break;.}
1aa00 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6c 6f  ../* Opcode: Clo
1aa10 73 65 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  se P1 * * * *.**
1aa20 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
1aa30 6f 72 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70  or previously op
1aa40 65 6e 65 64 20 61 73 20 50 31 2e 20 20 49 66 20  ened as P1.  If 
1aa50 50 31 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 75 72  P1 is not.** cur
1aa60 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 74 68 69  rently open, thi
1aa70 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  s instruction is
1aa80 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63 61 73   a no-op..*/.cas
1aa90 65 20 4f 50 5f 43 6c 6f 73 65 3a 20 7b 0a 20 20  e OP_Close: {.  
1aaa0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
1aab0 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
1aac0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 73 71  >nCursor );.  sq
1aad0 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
1aae0 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43 73 72 5b  sor(p, p->apCsr[
1aaf0 70 4f 70 2d 3e 70 31 5d 29 3b 0a 20 20 70 2d 3e  pOp->p1]);.  p->
1ab00 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 20 3d  apCsr[pOp->p1] =
1ab10 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   0;.  break;.}..
1ab20 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 47  /* Opcode: SeekG
1ab30 65 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  e P1 P2 P3 P4 *.
1ab40 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20  **.** If cursor 
1ab50 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20  P1 refers to an 
1ab60 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65  SQL table (B-Tre
1ab70 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74 65  e that uses inte
1ab80 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75  ger keys), .** u
1ab90 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  se the value in 
1aba0 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20 74  register P3 as t
1abb0 68 65 20 6b 65 79 2e 20 20 49 66 20 63 75 72 73  he key.  If curs
1abc0 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a  or P1 refers .**
1abd0 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
1abe0 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 65  , then P3 is the
1abf0 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   first in an arr
1ac00 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 65  ay of P4 registe
1ac10 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  rs .** that are 
1ac20 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63  used as an unpac
1ac30 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a  ked index key. .
1ac40 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e  **.** Reposition
1ac50 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68   cursor P1 so th
1ac60 61 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  at  it points to
1ac70 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e   the smallest en
1ac80 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20  try that .** is 
1ac90 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1aca0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79  equal to the key
1acb0 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65   value. If there
1acc0 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20   are no records 
1acd0 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
1ace0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1acf0 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e   key and P2 is n
1ad00 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75  ot zero, then ju
1ad10 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  mp to P2..**.** 
1ad20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c  See also: Found,
1ad30 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73 74 69   NotFound, Disti
1ad40 6e 63 74 2c 20 53 65 65 6b 4c 74 2c 20 53 65 65  nct, SeekLt, See
1ad50 6b 47 74 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f  kGt, SeekLe.*/./
1ad60 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 47 74  * Opcode: SeekGt
1ad70 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a   P1 P2 P3 P4 *.*
1ad80 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50  *.** If cursor P
1ad90 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53  1 refers to an S
1ada0 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65  QL table (B-Tree
1adb0 20 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67   that uses integ
1adc0 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73  er keys), .** us
1add0 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  e the value in r
1ade0 65 67 69 73 74 65 72 20 50 33 20 61 73 20 61 20  egister P3 as a 
1adf0 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72 20 50  key. If cursor P
1ae00 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20  1 refers .** to 
1ae10 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68  an SQL index, th
1ae20 65 6e 20 50 33 20 69 73 20 74 68 65 20 66 69 72  en P3 is the fir
1ae30 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  st in an array o
1ae40 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20 0a  f P4 registers .
1ae50 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ** that are used
1ae60 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20   as an unpacked 
1ae70 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a  index key. .**.*
1ae80 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72  * Reposition cur
1ae90 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 20  sor P1 so that  
1aea0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
1aeb0 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72 79 20   smallest entry 
1aec0 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72 65 61  that .** is grea
1aed0 74 65 72 20 74 68 61 6e 20 74 68 65 20 6b 65 79  ter than the key
1aee0 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65   value. If there
1aef0 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20   are no records 
1af00 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a  greater than .**
1af10 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20   the key and P2 
1af20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
1af30 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a  n jump to P2..**
1af40 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f  .** See also: Fo
1af50 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44  und, NotFound, D
1af60 69 73 74 69 6e 63 74 2c 20 53 65 65 6b 4c 74 2c  istinct, SeekLt,
1af70 20 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a   SeekGe, SeekLe.
1af80 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65  */./* Opcode: Se
1af90 65 6b 4c 74 20 50 31 20 50 32 20 50 33 20 50 34  ekLt P1 P2 P3 P4
1afa0 20 2a 20 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72   * .**.** If cur
1afb0 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f  sor P1 refers to
1afc0 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42   an SQL table (B
1afd0 2d 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20  -Tree that uses 
1afe0 69 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a  integer keys), .
1aff0 2a 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65  ** use the value
1b000 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20   in register P3 
1b010 61 73 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72  as a key. If cur
1b020 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a  sor P1 refers .*
1b030 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  * to an SQL inde
1b040 78 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68  x, then P3 is th
1b050 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
1b060 72 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74  ray of P4 regist
1b070 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65  ers .** that are
1b080 20 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61   used as an unpa
1b090 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20  cked index key. 
1b0a0 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f  .**.** Repositio
1b0b0 6e 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74  n cursor P1 so t
1b0c0 68 61 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74  hat  it points t
1b0d0 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e  o the largest en
1b0e0 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20  try that .** is 
1b0f0 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6b 65  less than the ke
1b100 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72  y value. If ther
1b110 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73  e are no records
1b120 20 6c 65 73 73 20 74 68 61 6e 20 0a 2a 2a 20 74   less than .** t
1b130 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73  he key and P2 is
1b140 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
1b150 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a  jump to P2..**.*
1b160 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e  * See also: Foun
1b170 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73  d, NotFound, Dis
1b180 74 69 6e 63 74 2c 20 53 65 65 6b 47 74 2c 20 53  tinct, SeekGt, S
1b190 65 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f  eekGe, SeekLe.*/
1b1a0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b  ./* Opcode: Seek
1b1b0 4c 65 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  Le P1 P2 P3 P4 *
1b1c0 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  .**.** If cursor
1b1d0 20 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e   P1 refers to an
1b1e0 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72   SQL table (B-Tr
1b1f0 65 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74  ee that uses int
1b200 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20  eger keys), .** 
1b210 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  use the value in
1b220 20 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20   register P3 as 
1b230 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72  a key. If cursor
1b240 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74   P1 refers .** t
1b250 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20  o an SQL index, 
1b260 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66  then P3 is the f
1b270 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
1b280 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73   of P4 registers
1b290 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73   .** that are us
1b2a0 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65  ed as an unpacke
1b2b0 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a  d index key. .**
1b2c0 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63  .** Reposition c
1b2d0 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
1b2e0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
1b2f0 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20  e largest entry 
1b300 74 68 61 74 20 0a 2a 2a 20 69 73 20 6c 65 73 73  that .** is less
1b310 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1b320 6f 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e  o the key value.
1b330 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1b340 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 6c 65 73   records .** les
1b350 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
1b360 74 6f 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50  to the key and P
1b370 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  2 is not zero, t
1b380 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a  hen jump to P2..
1b390 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1b3a0 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c  Found, NotFound,
1b3b0 20 44 69 73 74 69 6e 63 74 2c 20 53 65 65 6b 47   Distinct, SeekG
1b3c0 74 2c 20 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c  t, SeekGe, SeekL
1b3d0 74 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65  t.*/.case OP_See
1b3e0 6b 4c 74 3a 20 20 20 20 20 20 20 20 20 2f 2a 20  kLt:         /* 
1b3f0 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73  jump, in3 */.cas
1b400 65 20 4f 50 5f 53 65 65 6b 4c 65 3a 20 20 20 20  e OP_SeekLe:    
1b410 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
1b420 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65  3 */.case OP_See
1b430 6b 47 65 3a 20 20 20 20 20 20 20 20 20 2f 2a 20  kGe:         /* 
1b440 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73  jump, in3 */.cas
1b450 65 20 4f 50 5f 53 65 65 6b 47 74 3a 20 7b 20 20  e OP_SeekGt: {  
1b460 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
1b470 33 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 0a  3 */.  int res;.
1b480 20 20 69 6e 74 20 6f 63 3b 0a 20 20 56 64 62 65    int oc;.  Vdbe
1b490 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 55 6e  Cursor *pC;.  Un
1b4a0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a  packedRecord r;.
1b4b0 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20    int nField;.  
1b4c0 69 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 2f  i64 iKey;      /
1b4d0 2a 20 54 68 65 20 72 6f 77 69 64 20 77 65 20 61  * The rowid we a
1b4e0 72 65 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f  re to seek to */
1b4f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
1b500 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
1b510 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
1b520 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1b530 32 21 3d 30 20 29 3b 0a 20 20 70 43 20 3d 20 70  2!=0 );.  pC = p
1b540 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
1b550 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
1b560 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1b570 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65  C->pseudoTableRe
1b580 67 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  g==0 );.  assert
1b590 28 20 4f 50 5f 53 65 65 6b 4c 65 20 3d 3d 20 4f  ( OP_SeekLe == O
1b5a0 50 5f 53 65 65 6b 4c 74 2b 31 20 29 3b 0a 20 20  P_SeekLt+1 );.  
1b5b0 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 47  assert( OP_SeekG
1b5c0 65 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c 74 2b 32  e == OP_SeekLt+2
1b5d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50   );.  assert( OP
1b5e0 5f 53 65 65 6b 47 74 20 3d 3d 20 4f 50 5f 53 65  _SeekGt == OP_Se
1b5f0 65 6b 4c 74 2b 33 20 29 3b 0a 20 20 61 73 73 65  ekLt+3 );.  asse
1b600 72 74 28 20 70 43 2d 3e 69 73 4f 72 64 65 72 65  rt( pC->isOrdere
1b610 64 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  d );.  if( ALWAY
1b620 53 28 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30  S(pC->pCursor!=0
1b630 29 20 29 7b 0a 20 20 20 20 6f 63 20 3d 20 70 4f  ) ){.    oc = pO
1b640 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70  p->opcode;.    p
1b650 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a  C->nullRow = 0;.
1b660 20 20 20 20 69 66 28 20 70 43 2d 3e 69 73 54 61      if( pC->isTa
1b670 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ble ){.      /* 
1b680 54 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 20  The input value 
1b690 69 6e 20 50 33 20 6d 69 67 68 74 20 62 65 20 6f  in P3 might be o
1b6a0 66 20 61 6e 79 20 74 79 70 65 3a 20 69 6e 74 65  f any type: inte
1b6b0 67 65 72 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e  ger, real, strin
1b6c0 67 2c 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 62  g,.      ** blob
1b6d0 2c 20 6f 72 20 4e 55 4c 4c 2e 20 20 42 75 74 20  , or NULL.  But 
1b6e0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  it needs to be a
1b6f0 6e 20 69 6e 74 65 67 65 72 20 62 65 66 6f 72 65  n integer before
1b700 20 77 65 20 63 61 6e 20 64 6f 0a 20 20 20 20 20   we can do.     
1b710 20 2a 2a 20 74 68 65 20 73 65 65 6b 2c 20 73 6f   ** the seek, so
1b720 20 63 6f 76 65 72 74 20 69 74 2e 20 2a 2f 0a 20   covert it. */. 
1b730 20 20 20 20 20 70 49 6e 33 20 3d 20 26 61 4d 65       pIn3 = &aMe
1b740 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20  m[pOp->p3];.    
1b750 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66    applyNumericAf
1b760 66 69 6e 69 74 79 28 70 49 6e 33 29 3b 0a 20 20  finity(pIn3);.  
1b770 20 20 20 20 69 4b 65 79 20 3d 20 73 71 6c 69 74      iKey = sqlit
1b780 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70  e3VdbeIntValue(p
1b790 49 6e 33 29 3b 0a 20 20 20 20 20 20 70 43 2d 3e  In3);.      pC->
1b7a0 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30  rowidIsValid = 0
1b7b0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
1b7c0 68 65 20 50 33 20 76 61 6c 75 65 20 63 6f 75 6c  he P3 value coul
1b7d0 64 20 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74  d not be convert
1b7e0 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67  ed into an integ
1b7f0 65 72 20 77 69 74 68 6f 75 74 0a 20 20 20 20 20  er without.     
1b800 20 2a 2a 20 6c 6f 73 73 20 6f 66 20 69 6e 66 6f   ** loss of info
1b810 72 6d 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73 70  rmation, then sp
1b820 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ecial processing
1b830 20 69 73 20 72 65 71 75 69 72 65 64 2e 2e 2e 20   is required... 
1b840 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 49  */.      if( (pI
1b850 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n3->flags & MEM_
1b860 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Int)==0 ){.     
1b870 20 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c     if( (pIn3->fl
1b880 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 29 3d  ags & MEM_Real)=
1b890 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1b8a0 2f 2a 20 49 66 20 74 68 65 20 50 33 20 76 61 6c  /* If the P3 val
1b8b0 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e  ue cannot be con
1b8c0 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 79 20  verted into any 
1b8d0 6b 69 6e 64 20 6f 66 20 61 20 6e 75 6d 62 65 72  kind of a number
1b8e0 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  ,.          ** t
1b8f0 68 65 6e 20 74 68 65 20 73 65 65 6b 20 69 73 20  hen the seek is 
1b900 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20 73 6f  not possible, so
1b910 20 6a 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20   jump to P2 */. 
1b920 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 70 4f           pc = pO
1b930 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20  p->p2 - 1;.     
1b940 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b950 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
1b960 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
1b970 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68  s point, then th
1b980 65 20 50 33 20 76 61 6c 75 65 20 6d 75 73 74 20  e P3 value must 
1b990 62 65 20 61 20 66 6c 6f 61 74 69 6e 67 0a 20 20  be a floating.  
1b9a0 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 20 6e        ** point n
1b9b0 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  umber. */.      
1b9c0 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 33 2d    assert( (pIn3-
1b9d0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
1b9e0 6c 29 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  l)!=0 );..      
1b9f0 20 20 69 66 28 20 69 4b 65 79 3d 3d 53 4d 41 4c    if( iKey==SMAL
1ba00 4c 45 53 54 5f 49 4e 54 36 34 20 26 26 20 28 70  LEST_INT64 && (p
1ba10 49 6e 33 2d 3e 72 3c 28 64 6f 75 62 6c 65 29 69  In3->r<(double)i
1ba20 4b 65 79 20 7c 7c 20 70 49 6e 33 2d 3e 72 3e 30  Key || pIn3->r>0
1ba30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
1ba40 2a 20 54 68 65 20 50 33 20 76 61 6c 75 65 20 69  * The P3 value i
1ba50 73 20 74 6f 6f 20 6c 61 72 67 65 20 69 6e 20 6d  s too large in m
1ba60 61 67 6e 69 74 75 64 65 20 74 6f 20 62 65 20 65  agnitude to be e
1ba70 78 70 72 65 73 73 65 64 20 61 73 20 61 6e 0a 20  xpressed as an. 
1ba80 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65           ** inte
1ba90 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ger. */.        
1baa0 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 20    res = 1;.     
1bab0 20 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e 72       if( pIn3->r
1bac0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
1bad0 20 20 69 66 28 20 6f 63 3e 3d 4f 50 5f 53 65 65    if( oc>=OP_See
1bae0 6b 47 65 20 29 7b 20 20 61 73 73 65 72 74 28 20  kGe ){  assert( 
1baf0 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 7c 7c  oc==OP_SeekGe ||
1bb00 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29   oc==OP_SeekGt )
1bb10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1bb20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1bb30 65 46 69 72 73 74 28 70 43 2d 3e 70 43 75 72 73  eFirst(pC->pCurs
1bb40 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20  or, &res);.     
1bb50 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1bb60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1bb70 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
1bb80 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
1bb90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
1bba0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1bbb0 20 69 66 28 20 6f 63 3c 3d 4f 50 5f 53 65 65 6b   if( oc<=OP_Seek
1bbc0 4c 65 20 29 7b 20 20 61 73 73 65 72 74 28 20 6f  Le ){  assert( o
1bbd0 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 7c 7c 20  c==OP_SeekLt || 
1bbe0 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b  oc==OP_SeekLe );
1bbf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
1bc00 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1bc10 4c 61 73 74 28 70 43 2d 3e 70 43 75 72 73 6f 72  Last(pC->pCursor
1bc20 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20  , &res);.       
1bc30 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1bc40 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1bc50 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
1bc60 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  or;.            
1bc70 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1bc80 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 20          if( res 
1bc90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1bca0 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
1bcb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1bcc0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1bcd0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1bce0 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 7c 7c  oc==OP_SeekLt ||
1bcf0 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29   oc==OP_SeekGe )
1bd00 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  {.          /* U
1bd10 73 65 20 74 68 65 20 63 65 69 6c 69 6e 67 28 29  se the ceiling()
1bd20 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 6f 6e   function to con
1bd30 76 65 72 74 20 72 65 61 6c 2d 3e 69 6e 74 20 2a  vert real->int *
1bd40 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
1bd50 70 49 6e 33 2d 3e 72 20 3e 20 28 64 6f 75 62 6c  pIn3->r > (doubl
1bd60 65 29 69 4b 65 79 20 29 20 69 4b 65 79 2b 2b 3b  e)iKey ) iKey++;
1bd70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1bd80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
1bd90 20 74 68 65 20 66 6c 6f 6f 72 28 29 20 66 75 6e   the floor() fun
1bda0 63 74 69 6f 6e 20 74 6f 20 63 6f 6e 76 65 72 74  ction to convert
1bdb0 20 72 65 61 6c 2d 3e 69 6e 74 20 2a 2f 0a 20 20   real->int */.  
1bdc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1bdd0 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 7c 7c  oc==OP_SeekLe ||
1bde0 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29   oc==OP_SeekGt )
1bdf0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1be00 70 49 6e 33 2d 3e 72 20 3c 20 28 64 6f 75 62 6c  pIn3->r < (doubl
1be10 65 29 69 4b 65 79 20 29 20 69 4b 65 79 2d 2d 3b  e)iKey ) iKey--;
1be20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1be30 20 7d 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73   } .      rc = s
1be40 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
1be50 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 70 43  oUnpacked(pC->pC
1be60 75 72 73 6f 72 2c 20 30 2c 20 28 75 36 34 29 69  ursor, 0, (u64)i
1be70 4b 65 79 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  Key, 0, &res);. 
1be80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1be90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bea0 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
1beb0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
1bec0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 73   }.      if( res
1bed0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1bee0 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  C->rowidIsValid 
1bef0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 2d  = 1;.        pC-
1bf00 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 69 4b 65  >lastRowid = iKe
1bf10 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  y;.      }.    }
1bf20 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 46 69 65  else{.      nFie
1bf30 6c 64 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  ld = pOp->p4.i;.
1bf40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
1bf50 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
1bf60 54 33 32 20 29 3b 0a 20 20 20 20 20 20 61 73 73  T32 );.      ass
1bf70 65 72 74 28 20 6e 46 69 65 6c 64 3e 30 20 29 3b  ert( nField>0 );
1bf80 0a 20 20 20 20 20 20 72 2e 70 4b 65 79 49 6e 66  .      r.pKeyInf
1bf90 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f  o = pC->pKeyInfo
1bfa0 3b 0a 20 20 20 20 20 20 72 2e 6e 46 69 65 6c 64  ;.      r.nField
1bfb0 20 3d 20 28 75 31 36 29 6e 46 69 65 6c 64 3b 0a   = (u16)nField;.
1bfc0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  .      /* The ne
1bfd0 78 74 20 6c 69 6e 65 20 6f 66 20 63 6f 64 65 20  xt line of code 
1bfe0 63 6f 6d 70 75 74 65 73 20 61 73 20 66 6f 6c 6c  computes as foll
1bff0 6f 77 73 2c 20 6f 6e 6c 79 20 66 61 73 74 65 72  ows, only faster
1c000 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20 69 66 28  :.      **   if(
1c010 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 7c   oc==OP_SeekGt |
1c020 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20  | oc==OP_SeekLe 
1c030 29 7b 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  ){.      **     
1c040 72 2e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b  r.flags = UNPACK
1c050 45 44 5f 49 4e 43 52 4b 45 59 3b 0a 20 20 20 20  ED_INCRKEY;.    
1c060 20 20 2a 2a 20 20 20 7d 65 6c 73 65 7b 0a 20 20    **   }else{.  
1c070 20 20 20 20 2a 2a 20 20 20 20 20 72 2e 66 6c 61      **     r.fla
1c080 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 2a  gs = 0;.      **
1c090 20 20 20 7d 0a 20 20 20 20 20 20 2a 2f 0a 20 20     }.      */.  
1c0a0 20 20 20 20 72 2e 66 6c 61 67 73 20 3d 20 28 75      r.flags = (u
1c0b0 31 36 29 28 55 4e 50 41 43 4b 45 44 5f 49 4e 43  16)(UNPACKED_INC
1c0c0 52 4b 45 59 20 2a 20 28 31 20 26 20 28 6f 63 20  RKEY * (1 & (oc 
1c0d0 2d 20 4f 50 5f 53 65 65 6b 4c 74 29 29 29 3b 0a  - OP_SeekLt)));.
1c0e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63        assert( oc
1c0f0 21 3d 4f 50 5f 53 65 65 6b 47 74 20 7c 7c 20 72  !=OP_SeekGt || r
1c100 2e 66 6c 61 67 73 3d 3d 55 4e 50 41 43 4b 45 44  .flags==UNPACKED
1c110 5f 49 4e 43 52 4b 45 59 20 29 3b 0a 20 20 20 20  _INCRKEY );.    
1c120 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50    assert( oc!=OP
1c130 5f 53 65 65 6b 4c 65 20 7c 7c 20 72 2e 66 6c 61  _SeekLe || r.fla
1c140 67 73 3d 3d 55 4e 50 41 43 4b 45 44 5f 49 4e 43  gs==UNPACKED_INC
1c150 52 4b 45 59 20 29 3b 0a 20 20 20 20 20 20 61 73  RKEY );.      as
1c160 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65  sert( oc!=OP_See
1c170 6b 47 65 20 7c 7c 20 72 2e 66 6c 61 67 73 3d 3d  kGe || r.flags==
1c180 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1c190 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 4c 74  t( oc!=OP_SeekLt
1c1a0 20 7c 7c 20 72 2e 66 6c 61 67 73 3d 3d 30 20 29   || r.flags==0 )
1c1b0 3b 0a 0a 20 20 20 20 20 20 72 2e 61 4d 65 6d 20  ;..      r.aMem 
1c1c0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
1c1d0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1c1e0 44 45 42 55 47 0a 20 20 20 20 20 20 7b 20 69 6e  DEBUG.      { in
1c1f0 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t i; for(i=0; i<
1c200 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20 61  r.nField; i++) a
1c210 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
1c220 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b  d(&r.aMem[i]) );
1c230 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
1c240 45 78 70 61 6e 64 42 6c 6f 62 28 72 2e 61 4d 65  ExpandBlob(r.aMe
1c250 6d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  m);.      rc = s
1c260 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
1c270 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 70 43  oUnpacked(pC->pC
1c280 75 72 73 6f 72 2c 20 26 72 2c 20 30 2c 20 30 2c  ursor, &r, 0, 0,
1c290 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66   &res);.      if
1c2a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c2b0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1c2c0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
1c2d0 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
1c2e0 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c    pC->rowidIsVal
1c2f0 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  id = 0;.    }.  
1c300 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f    pC->deferredMo
1c310 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 43  veto = 0;.    pC
1c320 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
1c330 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 23 69 66  CACHE_STALE;.#if
1c340 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1c350 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72      sqlite3_sear
1c360 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
1c370 69 66 0a 20 20 20 20 69 66 28 20 6f 63 3e 3d 4f  if.    if( oc>=O
1c380 50 5f 53 65 65 6b 47 65 20 29 7b 20 20 61 73 73  P_SeekGe ){  ass
1c390 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  ert( oc==OP_Seek
1c3a0 47 65 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65  Ge || oc==OP_See
1c3b0 6b 47 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  kGt );.      if(
1c3c0 20 72 65 73 3c 30 20 7c 7c 20 28 72 65 73 3d 3d   res<0 || (res==
1c3d0 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  0 && oc==OP_Seek
1c3e0 47 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Gt) ){.        r
1c3f0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1c400 4e 65 78 74 28 70 43 2d 3e 70 43 75 72 73 6f 72  Next(pC->pCursor
1c410 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20  , &res);.       
1c420 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c430 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  OK ) goto abort_
1c440 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
1c450 20 20 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49        pC->rowidI
1c460 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  sValid = 0;.    
1c470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c480 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20   res = 0;.      
1c490 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1c4a0 20 20 20 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f     assert( oc==O
1c4b0 50 5f 53 65 65 6b 4c 74 20 7c 7c 20 6f 63 3d 3d  P_SeekLt || oc==
1c4c0 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20  OP_SeekLe );.   
1c4d0 20 20 20 69 66 28 20 72 65 73 3e 30 20 7c 7c 20     if( res>0 || 
1c4e0 28 72 65 73 3d 3d 30 20 26 26 20 6f 63 3d 3d 4f  (res==0 && oc==O
1c4f0 50 5f 53 65 65 6b 4c 74 29 20 29 7b 0a 20 20 20  P_SeekLt) ){.   
1c500 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c510 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
1c520 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73  C->pCursor, &res
1c530 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1c540 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1c550 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1c560 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  _error;.        
1c570 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64  pC->rowidIsValid
1c580 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
1c590 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 72 65  e{.        /* re
1c5a0 73 20 6d 69 67 68 74 20 62 65 20 6e 65 67 61 74  s might be negat
1c5b0 69 76 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ive because the 
1c5c0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 20  table is empty. 
1c5d0 20 43 68 65 63 6b 20 74 6f 0a 20 20 20 20 20 20   Check to.      
1c5e0 20 20 2a 2a 20 73 65 65 20 69 66 20 74 68 69 73    ** see if this
1c5f0 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
1c600 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1c610 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 42 74   res = sqlite3Bt
1c620 72 65 65 45 6f 66 28 70 43 2d 3e 70 43 75 72 73  reeEof(pC->pCurs
1c630 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
1c640 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1c650 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20  Op->p2>0 );.    
1c660 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
1c670 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
1c680 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
1c690 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
1c6a0 70 70 65 6e 73 20 77 68 65 6e 20 61 74 74 65 6d  ppens when attem
1c6b0 70 74 69 6e 67 20 74 6f 20 6f 70 65 6e 20 74 68  pting to open th
1c6c0 65 20 73 71 6c 69 74 65 33 5f 6d 61 73 74 65 72  e sqlite3_master
1c6d0 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 66 6f   table.    ** fo
1c6e0 72 20 72 65 61 64 20 61 63 63 65 73 73 20 72 65  r read access re
1c6f0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 4d 50  turns SQLITE_EMP
1c700 54 59 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  TY. In this case
1c710 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 74   always.    ** t
1c720 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 28 73 69  ake the jump (si
1c730 6e 63 65 20 74 68 65 72 65 20 61 72 65 20 6e 6f  nce there are no
1c740 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   records in the 
1c750 74 61 62 6c 65 29 2e 0a 20 20 20 20 2a 2f 0a 20  table)..    */. 
1c760 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
1c770 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  - 1;.  }.  break
1c780 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1c790 53 65 65 6b 20 50 31 20 50 32 20 2a 20 2a 20 2a  Seek P1 P2 * * *
1c7a0 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 6e 20  .**.** P1 is an 
1c7b0 6f 70 65 6e 20 74 61 62 6c 65 20 63 75 72 73 6f  open table curso
1c7c0 72 20 61 6e 64 20 50 32 20 69 73 20 61 20 72 6f  r and P2 is a ro
1c7d0 77 69 64 20 69 6e 74 65 67 65 72 2e 20 20 41 72  wid integer.  Ar
1c7e0 72 61 6e 67 65 0a 2a 2a 20 66 6f 72 20 50 31 20  range.** for P1 
1c7f0 74 6f 20 6d 6f 76 65 20 73 6f 20 74 68 61 74 20  to move so that 
1c800 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
1c810 20 72 6f 77 69 64 20 67 69 76 65 6e 20 62 79 20   rowid given by 
1c820 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  P2..**.** This i
1c830 73 20 61 63 74 75 61 6c 6c 79 20 61 20 64 65 66  s actually a def
1c840 65 72 72 65 64 20 73 65 65 6b 2e 20 20 4e 6f 74  erred seek.  Not
1c850 68 69 6e 67 20 61 63 74 75 61 6c 6c 79 20 68 61  hing actually ha
1c860 70 70 65 6e 73 20 75 6e 74 69 6c 0a 2a 2a 20 74  ppens until.** t
1c870 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65  he cursor is use
1c880 64 20 74 6f 20 72 65 61 64 20 61 20 72 65 63 6f  d to read a reco
1c890 72 64 2e 20 20 54 68 61 74 20 77 61 79 2c 20 69  rd.  That way, i
1c8a0 66 20 6e 6f 20 72 65 61 64 73 0a 2a 2a 20 6f 63  f no reads.** oc
1c8b0 63 75 72 2c 20 6e 6f 20 75 6e 6e 65 63 65 73 73  cur, no unnecess
1c8c0 61 72 79 20 49 2f 4f 20 68 61 70 70 65 6e 73 2e  ary I/O happens.
1c8d0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b  .*/.case OP_Seek
1c8e0 3a 20 7b 20 20 20 20 2f 2a 20 69 6e 32 20 2a 2f  : {    /* in2 */
1c8f0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
1c900 43 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  C;..  assert( pO
1c910 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
1c920 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
1c930 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
1c940 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
1c950 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
1c960 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 2d 3e   if( ALWAYS(pC->
1c970 70 43 75 72 73 6f 72 21 3d 30 29 20 29 7b 0a 20  pCursor!=0) ){. 
1c980 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
1c990 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 70 43  sTable );.    pC
1c9a0 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20  ->nullRow = 0;. 
1c9b0 20 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b     pIn2 = &aMem[
1c9c0 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 70 43  pOp->p2];.    pC
1c9d0 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 20 3d  ->movetoTarget =
1c9e0 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56   sqlite3VdbeIntV
1c9f0 61 6c 75 65 28 70 49 6e 32 29 3b 0a 20 20 20 20  alue(pIn2);.    
1ca00 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64  pC->rowidIsValid
1ca10 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 64 65   = 0;.    pC->de
1ca20 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 31  ferredMoveto = 1
1ca30 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
1ca40 0a 20 20 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  .  ../* Opcode: 
1ca50 46 6f 75 6e 64 20 50 31 20 50 32 20 50 33 20 50  Found P1 P2 P3 P
1ca60 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d  4 *.**.** If P4=
1ca70 3d 30 20 74 68 65 6e 20 72 65 67 69 73 74 65 72  =0 then register
1ca80 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f 62   P3 holds a blob
1ca90 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
1caa0 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 49 66 0a  MakeRecord.  If.
1cab0 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20 72 65 67  ** P4>0 then reg
1cac0 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65 20  ister P3 is the 
1cad0 66 69 72 73 74 20 6f 66 20 50 34 20 72 65 67 69  first of P4 regi
1cae0 73 74 65 72 73 20 74 68 61 74 20 66 6f 72 6d 20  sters that form 
1caf0 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 72  an unpacked.** r
1cb00 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 43 75 72  ecord..**.** Cur
1cb10 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61 6e 20  sor P1 is on an 
1cb20 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20 49 66  index btree.  If
1cb30 20 74 68 65 20 72 65 63 6f 72 64 20 69 64 65 6e   the record iden
1cb40 74 69 66 69 65 64 20 62 79 20 50 33 20 61 6e 64  tified by P3 and
1cb50 20 50 34 0a 2a 2a 20 69 73 20 61 20 70 72 65 66   P4.** is a pref
1cb60 69 78 20 6f 66 20 61 6e 79 20 65 6e 74 72 79 20  ix of any entry 
1cb70 69 6e 20 50 31 20 74 68 65 6e 20 61 20 6a 75 6d  in P1 then a jum
1cb80 70 20 69 73 20 6d 61 64 65 20 74 6f 20 50 32 20  p is made to P2 
1cb90 61 6e 64 0a 2a 2a 20 50 31 20 69 73 20 6c 65 66  and.** P1 is lef
1cba0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
1cbb0 65 20 6d 61 74 63 68 69 6e 67 20 65 6e 74 72 79  e matching entry
1cbc0 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
1cbd0 4e 6f 74 46 6f 75 6e 64 20 50 31 20 50 32 20 50  NotFound P1 P2 P
1cbe0 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20  3 P4 *.**.** If 
1cbf0 50 34 3d 3d 30 20 74 68 65 6e 20 72 65 67 69 73  P4==0 then regis
1cc00 74 65 72 20 50 33 20 68 6f 6c 64 73 20 61 20 62  ter P3 holds a b
1cc10 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20  lob constructed 
1cc20 62 79 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20  by MakeRecord.  
1cc30 49 66 0a 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20  If.** P4>0 then 
1cc40 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20 74  register P3 is t
1cc50 68 65 20 66 69 72 73 74 20 6f 66 20 50 34 20 72  he first of P4 r
1cc60 65 67 69 73 74 65 72 73 20 74 68 61 74 20 66 6f  egisters that fo
1cc70 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a  rm an unpacked.*
1cc80 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 0a 2a 2a  * record..** .**
1cc90 20 43 75 72 73 6f 72 20 50 31 20 69 73 20 6f 6e   Cursor P1 is on
1cca0 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2e   an index btree.
1ccb0 20 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20    If the record 
1ccc0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 50 33  identified by P3
1ccd0 20 61 6e 64 20 50 34 0a 2a 2a 20 69 73 20 6e 6f   and P4.** is no
1cce0 74 20 74 68 65 20 70 72 65 66 69 78 20 6f 66 20  t the prefix of 
1ccf0 61 6e 79 20 65 6e 74 72 79 20 69 6e 20 50 31 20  any entry in P1 
1cd00 74 68 65 6e 20 61 20 6a 75 6d 70 20 69 73 20 6d  then a jump is m
1cd10 61 64 65 20 74 6f 20 50 32 2e 20 20 49 66 20 50  ade to P2.  If P
1cd20 31 20 0a 2a 2a 20 64 6f 65 73 20 63 6f 6e 74 61  1 .** does conta
1cd30 69 6e 20 61 6e 20 65 6e 74 72 79 20 77 68 6f 73  in an entry whos
1cd40 65 20 70 72 65 66 69 78 20 6d 61 74 63 68 65 73  e prefix matches
1cd50 20 74 68 65 20 50 33 2f 50 34 20 72 65 63 6f 72   the P3/P4 recor
1cd60 64 20 74 68 65 6e 20 63 6f 6e 74 72 6f 6c 0a 2a  d then control.*
1cd70 2a 20 66 61 6c 6c 73 20 74 68 72 6f 75 67 68 20  * falls through 
1cd80 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
1cd90 72 75 63 74 69 6f 6e 20 61 6e 64 20 50 31 20 69  ruction and P1 i
1cda0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
1cdb0 61 74 20 74 68 65 0a 2a 2a 20 6d 61 74 63 68 69  at the.** matchi
1cdc0 6e 67 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ng entry..**.** 
1cdd0 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c  See also: Found,
1cde0 20 4e 6f 74 45 78 69 73 74 73 2c 20 49 73 55 6e   NotExists, IsUn
1cdf0 69 71 75 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ique.*/.case OP_
1ce00 4e 6f 74 46 6f 75 6e 64 3a 20 20 20 20 20 20 20  NotFound:       
1ce10 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a  /* jump, in3 */.
1ce20 63 61 73 65 20 4f 50 5f 46 6f 75 6e 64 3a 20 7b  case OP_Found: {
1ce30 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
1ce40 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 61 6c   in3 */.  int al
1ce50 72 65 61 64 79 45 78 69 73 74 73 3b 0a 20 20 56  readyExists;.  V
1ce60 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
1ce70 20 69 6e 74 20 72 65 73 3b 0a 20 20 63 68 61 72   int res;.  char
1ce80 20 2a 70 46 72 65 65 3b 0a 20 20 55 6e 70 61 63   *pFree;.  Unpac
1ce90 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b  kedRecord *pIdxK
1cea0 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  ey;.  UnpackedRe
1ceb0 63 6f 72 64 20 72 3b 0a 20 20 63 68 61 72 20 61  cord r;.  char a
1cec0 54 65 6d 70 52 65 63 5b 52 4f 55 4e 44 38 28 73  TempRec[ROUND8(s
1ced0 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
1cee0 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28  cord)) + sizeof(
1cef0 4d 65 6d 29 2a 33 20 2b 20 37 5d 3b 0a 0a 23 69  Mem)*3 + 7];..#i
1cf00 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1cf10 0a 20 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64  .  sqlite3_found
1cf20 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
1cf30 0a 0a 20 20 61 6c 72 65 61 64 79 45 78 69 73 74  ..  alreadyExist
1cf40 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  s = 0;.  assert(
1cf50 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
1cf60 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
1cf70 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
1cf80 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49  Op->p4type==P4_I
1cf90 4e 54 33 32 20 29 3b 0a 20 20 70 43 20 3d 20 70  NT32 );.  pC = p
1cfa0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
1cfb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
1cfc0 30 20 29 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61  0 );.  pIn3 = &a
1cfd0 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
1cfe0 69 66 28 20 41 4c 57 41 59 53 28 70 43 2d 3e 70  if( ALWAYS(pC->p
1cff0 43 75 72 73 6f 72 21 3d 30 29 20 29 7b 0a 0a 20  Cursor!=0) ){.. 
1d000 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
1d010 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  sTable==0 );.   
1d020 20 69 66 28 20 70 4f 70 2d 3e 70 34 2e 69 3e 30   if( pOp->p4.i>0
1d030 20 29 7b 0a 20 20 20 20 20 20 72 2e 70 4b 65 79   ){.      r.pKey
1d040 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49  Info = pC->pKeyI
1d050 6e 66 6f 3b 0a 20 20 20 20 20 20 72 2e 6e 46 69  nfo;.      r.nFi
1d060 65 6c 64 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e  eld = (u16)pOp->
1d070 70 34 2e 69 3b 0a 20 20 20 20 20 20 72 2e 61 4d  p4.i;.      r.aM
1d080 65 6d 20 3d 20 70 49 6e 33 3b 0a 23 69 66 64 65  em = pIn3;.#ifde
1d090 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1d0a0 20 20 20 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f       { int i; fo
1d0b0 72 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c  r(i=0; i<r.nFiel
1d0c0 64 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  d; i++) assert( 
1d0d0 6d 65 6d 49 73 56 61 6c 69 64 28 26 72 2e 61 4d  memIsValid(&r.aM
1d0e0 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64  em[i]) ); }.#end
1d0f0 69 66 0a 20 20 20 20 20 20 72 2e 66 6c 61 67 73  if.      r.flags
1d100 20 3d 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46   = UNPACKED_PREF
1d110 49 58 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  IX_MATCH;.      
1d120 70 49 64 78 4b 65 79 20 3d 20 26 72 3b 0a 20 20  pIdxKey = &r;.  
1d130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1d140 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
1d150 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
1d160 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20  dRecord(.       
1d170 20 20 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c     pC->pKeyInfo,
1d180 20 61 54 65 6d 70 52 65 63 2c 20 73 69 7a 65 6f   aTempRec, sizeo
1d190 66 28 61 54 65 6d 70 52 65 63 29 2c 20 26 70 46  f(aTempRec), &pF
1d1a0 72 65 65 0a 20 20 20 20 20 20 29 3b 20 0a 20 20  ree.      ); .  
1d1b0 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d      if( pIdxKey=
1d1c0 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
1d1d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d1e0 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
1d1f0 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  M_Blob );.      
1d200 61 73 73 65 72 74 28 20 28 70 49 6e 33 2d 3e 66  assert( (pIn3->f
1d210 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
1d220 3d 3d 30 20 29 3b 20 20 2f 2a 20 7a 65 72 6f 62  ==0 );  /* zerob
1d230 6c 6f 62 73 20 61 6c 72 65 61 64 79 20 65 78 70  lobs already exp
1d240 61 6e 64 65 64 20 2a 2f 0a 20 20 20 20 20 20 73  anded */.      s
1d250 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1d260 55 6e 70 61 63 6b 28 70 43 2d 3e 70 4b 65 79 49  Unpack(pC->pKeyI
1d270 6e 66 6f 2c 20 70 49 6e 33 2d 3e 6e 2c 20 70 49  nfo, pIn3->n, pI
1d280 6e 33 2d 3e 7a 2c 20 70 49 64 78 4b 65 79 29 3b  n3->z, pIdxKey);
1d290 0a 20 20 20 20 20 20 70 49 64 78 4b 65 79 2d 3e  .      pIdxKey->
1d2a0 66 6c 61 67 73 20 7c 3d 20 55 4e 50 41 43 4b 45  flags |= UNPACKE
1d2b0 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 3b 0a  D_PREFIX_MATCH;.
1d2c0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
1d2d0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
1d2e0 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 70 43  oUnpacked(pC->pC
1d2f0 75 72 73 6f 72 2c 20 70 49 64 78 4b 65 79 2c 20  ursor, pIdxKey, 
1d300 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20  0, 0, &res);.   
1d310 20 69 66 28 20 70 4f 70 2d 3e 70 34 2e 69 3d 3d   if( pOp->p4.i==
1d320 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1d330 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 72  e3DbFree(db, pFr
1d340 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ee);.    }.    i
1d350 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d360 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
1d370 0a 20 20 20 20 7d 0a 20 20 20 20 61 6c 72 65 61  .    }.    alrea
1d380 64 79 45 78 69 73 74 73 20 3d 20 28 72 65 73 3d  dyExists = (res=
1d390 3d 30 29 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66  =0);.    pC->def
1d3a0 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
1d3b0 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74  .    pC->cacheSt
1d3c0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
1d3d0 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f  LE;.  }.  if( pO
1d3e0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6f  p->opcode==OP_Fo
1d3f0 75 6e 64 20 29 7b 0a 20 20 20 20 69 66 28 20 61  und ){.    if( a
1d400 6c 72 65 61 64 79 45 78 69 73 74 73 20 29 20 70  lreadyExists ) p
1d410 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
1d420 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
1d430 28 20 21 61 6c 72 65 61 64 79 45 78 69 73 74 73  ( !alreadyExists
1d440 20 29 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20   ) pc = pOp->p2 
1d450 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  - 1;.  }.  break
1d460 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1d470 49 73 55 6e 69 71 75 65 20 50 31 20 50 32 20 50  IsUnique P1 P2 P
1d480 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 43 75 72  3 P4 *.**.** Cur
1d490 73 6f 72 20 50 31 20 69 73 20 6f 70 65 6e 20 6f  sor P1 is open o
1d4a0 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
1d4b0 65 20 2d 20 74 68 61 74 20 69 73 20 74 6f 20 73  e - that is to s
1d4c0 61 79 2c 20 61 20 62 74 72 65 65 20 77 68 69 63  ay, a btree whic
1d4d0 68 0a 2a 2a 20 6e 6f 20 64 61 74 61 20 61 6e 64  h.** no data and
1d4e0 20 77 68 65 72 65 20 74 68 65 20 6b 65 79 20 61   where the key a
1d4f0 72 65 20 72 65 63 6f 72 64 73 20 67 65 6e 65 72  re records gener
1d500 61 74 65 64 20 62 79 20 4f 50 5f 4d 61 6b 65 52  ated by OP_MakeR
1d510 65 63 6f 72 64 20 77 69 74 68 0a 2a 2a 20 74 68  ecord with.** th
1d520 65 20 6c 69 73 74 20 66 69 65 6c 64 20 62 65 69  e list field bei
1d530 6e 67 20 74 68 65 20 69 6e 74 65 67 65 72 20 52  ng the integer R
1d540 4f 57 49 44 20 6f 66 20 74 68 65 20 65 6e 74 72  OWID of the entr
1d550 79 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  y that the index
1d560 0a 2a 2a 20 65 6e 74 72 79 20 72 65 66 65 72 73  .** entry refers
1d570 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50   to..**.** The P
1d580 33 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 61  3 register conta
1d590 69 6e 73 20 61 6e 20 69 6e 74 65 67 65 72 20 72  ins an integer r
1d5a0 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20 43 61  ecord number. Ca
1d5b0 6c 6c 20 74 68 69 73 20 72 65 63 6f 72 64 20 0a  ll this record .
1d5c0 2a 2a 20 6e 75 6d 62 65 72 20 52 2e 20 52 65 67  ** number R. Reg
1d5d0 69 73 74 65 72 20 50 34 20 69 73 20 74 68 65 20  ister P4 is the 
1d5e0 66 69 72 73 74 20 69 6e 20 61 20 73 65 74 20 6f  first in a set o
1d5f0 66 20 4e 20 63 6f 6e 74 69 67 75 6f 75 73 20 72  f N contiguous r
1d600 65 67 69 73 74 65 72 73 0a 2a 2a 20 74 68 61 74  egisters.** that
1d610 20 6d 61 6b 65 20 75 70 20 61 6e 20 75 6e 70 61   make up an unpa
1d620 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 74  cked index key t
1d630 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
1d640 77 69 74 68 20 63 75 72 73 6f 72 20 50 31 2e 0a  with cursor P1..
1d650 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
1d660 4e 20 63 61 6e 20 62 65 20 69 6e 66 65 72 72 65  N can be inferre
1d670 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 73 6f  d from the curso
1d680 72 2e 20 4e 20 69 6e 63 6c 75 64 65 73 20 74 68  r. N includes th
1d690 65 20 72 6f 77 69 64 0a 2a 2a 20 76 61 6c 75 65  e rowid.** value
1d6a0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
1d6b0 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
1d6c0 78 20 72 65 63 6f 72 64 2e 20 54 68 69 73 20 72  x record. This r
1d6d0 6f 77 69 64 20 76 61 6c 75 65 20 6d 61 79 0a 2a  owid value may.*
1d6e0 2a 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  * or may not be 
1d6f0 74 68 65 20 73 61 6d 65 20 61 73 20 52 2e 0a 2a  the same as R..*
1d700 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74  *.** If any of t
1d710 68 65 20 4e 20 72 65 67 69 73 74 65 72 73 20 62  he N registers b
1d720 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 72 65  eginning with re
1d730 67 69 73 74 65 72 20 50 34 20 63 6f 6e 74 61 69  gister P4 contai
1d740 6e 73 20 61 20 4e 55 4c 4c 0a 2a 2a 20 76 61 6c  ns a NULL.** val
1d750 75 65 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ue, jump immedia
1d760 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a  tely to P2..**.*
1d770 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69  * Otherwise, thi
1d780 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 68  s instruction ch
1d790 65 63 6b 73 20 69 66 20 63 75 72 73 6f 72 20 50  ecks if cursor P
1d7a0 31 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e  1 contains an en
1d7b0 74 72 79 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  try.** where the
1d7c0 20 66 69 72 73 74 20 28 4e 2d 31 29 20 66 69 65   first (N-1) fie
1d7d0 6c 64 73 20 6d 61 74 63 68 20 62 75 74 20 74 68  lds match but th
1d7e0 65 20 72 6f 77 69 64 20 76 61 6c 75 65 20 61 74  e rowid value at
1d7f0 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 74   the end.** of t
1d800 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69  he index entry i
1d810 73 20 6e 6f 74 20 52 2e 20 49 66 20 74 68 65 72  s not R. If ther
1d820 65 20 69 73 20 6e 6f 20 73 75 63 68 20 65 6e 74  e is no such ent
1d830 72 79 2c 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70  ry, control jump
1d840 73 0a 2a 2a 20 74 6f 20 69 6e 73 74 72 75 63 74  s.** to instruct
1d850 69 6f 6e 20 50 32 2e 20 4f 74 68 65 72 77 69 73  ion P2. Otherwis
1d860 65 2c 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  e, the rowid of 
1d870 74 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  the conflicting 
1d880 69 6e 64 65 78 0a 2a 2a 20 65 6e 74 72 79 20 69  index.** entry i
1d890 73 20 63 6f 70 69 65 64 20 74 6f 20 72 65 67 69  s copied to regi
1d8a0 73 74 65 72 20 50 33 20 61 6e 64 20 63 6f 6e 74  ster P3 and cont
1d8b0 72 6f 6c 20 66 61 6c 6c 73 20 74 68 72 6f 75 67  rol falls throug
1d8c0 68 20 74 6f 20 74 68 65 20 6e 65 78 74 0a 2a 2a  h to the next.**
1d8d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
1d8e0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 4e 6f  .** See also: No
1d8f0 74 46 6f 75 6e 64 2c 20 4e 6f 74 45 78 69 73 74  tFound, NotExist
1d900 73 2c 20 46 6f 75 6e 64 0a 2a 2f 0a 63 61 73 65  s, Found.*/.case
1d910 20 4f 50 5f 49 73 55 6e 69 71 75 65 3a 20 7b 20   OP_IsUnique: { 
1d920 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
1d930 69 6e 33 20 2a 2f 0a 20 20 75 31 36 20 69 69 3b  in3 */.  u16 ii;
1d940 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
1d950 43 78 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  Cx;.  BtCursor *
1d960 70 43 72 73 72 3b 0a 20 20 75 31 36 20 6e 46 69  pCrsr;.  u16 nFi
1d970 65 6c 64 3b 0a 20 20 4d 65 6d 20 2a 61 4d 78 3b  eld;.  Mem *aMx;
1d980 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1d990 64 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  d r;            
1d9a0 20 20 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20        /* B-Tree 
1d9b0 69 6e 64 65 78 20 73 65 61 72 63 68 20 6b 65 79  index search key
1d9c0 20 2a 2f 0a 20 20 69 36 34 20 52 3b 20 20 20 20   */.  i64 R;    
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
1d9f0 64 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  d stored in regi
1da00 73 74 65 72 20 50 33 20 2a 2f 0a 0a 20 20 70 49  ster P3 */..  pI
1da10 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n3 = &aMem[pOp->
1da20 70 33 5d 3b 0a 20 20 61 4d 78 20 3d 20 26 61 4d  p3];.  aMx = &aM
1da30 65 6d 5b 70 4f 70 2d 3e 70 34 2e 69 5d 3b 0a 20  em[pOp->p4.i];. 
1da40 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
1da50 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 70 61  the values of pa
1da60 72 61 6d 65 74 65 72 73 20 50 31 20 61 6e 64 20  rameters P1 and 
1da70 50 34 20 61 72 65 20 69 6e 20 72 61 6e 67 65 2e  P4 are in range.
1da80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f   */.  assert( pO
1da90 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
1daa0 54 33 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  T32 );.  assert(
1dab0 20 70 4f 70 2d 3e 70 34 2e 69 3e 30 20 26 26 20   pOp->p4.i>0 && 
1dac0 70 4f 70 2d 3e 70 34 2e 69 3c 3d 70 2d 3e 6e 4d  pOp->p4.i<=p->nM
1dad0 65 6d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  em );.  assert( 
1dae0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
1daf0 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
1db00 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74   );..  /* Find t
1db10 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 2e  he index cursor.
1db20 20 2a 2f 0a 20 20 70 43 78 20 3d 20 70 2d 3e 61   */.  pCx = p->a
1db30 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
1db40 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 64 65   assert( pCx->de
1db50 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20  ferredMoveto==0 
1db60 29 3b 0a 20 20 70 43 78 2d 3e 73 65 65 6b 52 65  );.  pCx->seekRe
1db70 73 75 6c 74 20 3d 20 30 3b 0a 20 20 70 43 78 2d  sult = 0;.  pCx-
1db80 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
1db90 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 70 43  ACHE_STALE;.  pC
1dba0 72 73 72 20 3d 20 70 43 78 2d 3e 70 43 75 72 73  rsr = pCx->pCurs
1dbb0 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79  or;..  /* If any
1dbc0 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 61   of the values a
1dbd0 72 65 20 4e 55 4c 4c 2c 20 74 61 6b 65 20 74 68  re NULL, take th
1dbe0 65 20 6a 75 6d 70 2e 20 2a 2f 0a 20 20 6e 46 69  e jump. */.  nFi
1dbf0 65 6c 64 20 3d 20 70 43 78 2d 3e 70 4b 65 79 49  eld = pCx->pKeyI
1dc00 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 66  nfo->nField;.  f
1dc10 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 46 69 65  or(ii=0; ii<nFie
1dc20 6c 64 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  ld; ii++){.    i
1dc30 66 28 20 61 4d 78 5b 69 69 5d 2e 66 6c 61 67 73  f( aMx[ii].flags
1dc40 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
1dc50 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70       pc = pOp->p
1dc60 32 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 43 72  2 - 1;.      pCr
1dc70 73 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  sr = 0;.      br
1dc80 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1dc90 20 61 73 73 65 72 74 28 20 28 61 4d 78 5b 6e 46   assert( (aMx[nF
1dca0 69 65 6c 64 5d 2e 66 6c 61 67 73 20 26 20 4d 45  ield].flags & ME
1dcb0 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 0a 20  M_Null)==0 );.. 
1dcc0 20 69 66 28 20 70 43 72 73 72 21 3d 30 20 29 7b   if( pCrsr!=0 ){
1dcd0 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
1dce0 20 74 68 65 20 69 6e 64 65 78 20 73 65 61 72 63   the index searc
1dcf0 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 72 2e  h key. */.    r.
1dd00 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 78 2d 3e  pKeyInfo = pCx->
1dd10 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 72 2e  pKeyInfo;.    r.
1dd20 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 20  nField = nField 
1dd30 2b 20 31 3b 0a 20 20 20 20 72 2e 66 6c 61 67 73  + 1;.    r.flags
1dd40 20 3d 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46   = UNPACKED_PREF
1dd50 49 58 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 72  IX_SEARCH;.    r
1dd60 2e 61 4d 65 6d 20 3d 20 61 4d 78 3b 0a 23 69 66  .aMem = aMx;.#if
1dd70 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1dd80 0a 20 20 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f  .    { int i; fo
1dd90 72 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c  r(i=0; i<r.nFiel
1dda0 64 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  d; i++) assert( 
1ddb0 6d 65 6d 49 73 56 61 6c 69 64 28 26 72 2e 61 4d  memIsValid(&r.aM
1ddc0 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64  em[i]) ); }.#end
1ddd0 69 66 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61  if..    /* Extra
1dde0 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ct the value of 
1ddf0 52 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20  R from register 
1de00 50 33 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  P3. */.    sqlit
1de10 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72  e3VdbeMemInteger
1de20 69 66 79 28 70 49 6e 33 29 3b 0a 20 20 20 20 52  ify(pIn3);.    R
1de30 20 3d 20 70 49 6e 33 2d 3e 75 2e 69 3b 0a 0a 20   = pIn3->u.i;.. 
1de40 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65     /* Search the
1de50 20 42 2d 54 72 65 65 20 69 6e 64 65 78 2e 20 49   B-Tree index. I
1de60 66 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 69 6e 67  f no conflicting
1de70 20 72 65 63 6f 72 64 20 69 73 20 66 6f 75 6e 64   record is found
1de80 2c 20 6a 75 6d 70 0a 20 20 20 20 2a 2a 20 74 6f  , jump.    ** to
1de90 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20   P2. Otherwise, 
1dea0 63 6f 70 79 20 74 68 65 20 72 6f 77 69 64 20 6f  copy the rowid o
1deb0 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e  f the conflictin
1dec0 67 20 72 65 63 6f 72 64 20 74 6f 0a 20 20 20 20  g record to.    
1ded0 2a 2a 20 72 65 67 69 73 74 65 72 20 50 33 20 61  ** register P3 a
1dee0 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  nd fall through 
1def0 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
1df00 72 75 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  ruction.  */.   
1df10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1df20 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
1df30 28 70 43 72 73 72 2c 20 26 72 2c 20 30 2c 20 30  (pCrsr, &r, 0, 0
1df40 2c 20 26 70 43 78 2d 3e 73 65 65 6b 52 65 73 75  , &pCx->seekResu
1df50 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 28 72 2e  lt);.    if( (r.
1df60 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
1df70 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48 29 20  _PREFIX_SEARCH) 
1df80 7c 7c 20 72 2e 72 6f 77 69 64 3d 3d 52 20 29 7b  || r.rowid==R ){
1df90 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  .      pc = pOp-
1dfa0 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c  >p2 - 1;.    }el
1dfb0 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 33 2d 3e  se{.      pIn3->
1dfc0 75 2e 69 20 3d 20 72 2e 72 6f 77 69 64 3b 0a 20  u.i = r.rowid;. 
1dfd0 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
1dfe0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1dff0 4e 6f 74 45 78 69 73 74 73 20 50 31 20 50 32 20  NotExists P1 P2 
1e000 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 55 73 65  P3 * *.**.** Use
1e010 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1e020 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20 61  register P3 as a
1e030 6e 20 69 6e 74 65 67 65 72 20 6b 65 79 2e 20 20  n integer key.  
1e040 49 66 20 61 20 72 65 63 6f 72 64 20 0a 2a 2a 20  If a record .** 
1e050 77 69 74 68 20 74 68 61 74 20 6b 65 79 20 64 6f  with that key do
1e060 65 73 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 20  es not exist in 
1e070 74 61 62 6c 65 20 6f 66 20 50 31 2c 20 74 68 65  table of P1, the
1e080 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 0a 2a  n jump to P2. .*
1e090 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
1e0a0 64 6f 65 73 20 65 78 69 73 74 2c 20 74 68 65 6e  does exist, then
1e0b0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 20 20   fall through.  
1e0c0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1e0d0 66 74 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  ft .** pointing 
1e0e0 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20 69 66  to the record if
1e0f0 20 69 74 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a   it exists..**.*
1e100 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
1e110 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 6f 70   between this op
1e120 65 72 61 74 69 6f 6e 20 61 6e 64 20 4e 6f 74 46  eration and NotF
1e130 6f 75 6e 64 20 69 73 20 74 68 61 74 20 74 68 69  ound is that thi
1e140 73 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 61  s.** operation a
1e150 73 73 75 6d 65 73 20 74 68 65 20 6b 65 79 20 69  ssumes the key i
1e160 73 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64  s an integer and
1e170 20 74 68 61 74 20 50 31 20 69 73 20 61 20 74 61   that P1 is a ta
1e180 62 6c 65 20 77 68 65 72 65 61 73 0a 2a 2a 20 4e  ble whereas.** N
1e190 6f 74 46 6f 75 6e 64 20 61 73 73 75 6d 65 73 20  otFound assumes 
1e1a0 6b 65 79 20 69 73 20 61 20 62 6c 6f 62 20 63 6f  key is a blob co
1e1b0 6e 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 4d  nstructed from M
1e1c0 61 6b 65 52 65 63 6f 72 64 20 61 6e 64 0a 2a 2a  akeRecord and.**
1e1d0 20 50 31 20 69 73 20 61 6e 20 69 6e 64 65 78 2e   P1 is an index.
1e1e0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
1e1f0 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64   Found, NotFound
1e200 2c 20 49 73 55 6e 69 71 75 65 0a 2a 2f 0a 63 61  , IsUnique.*/.ca
1e210 73 65 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 3a  se OP_NotExists:
1e220 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
1e230 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 56 64 62 65  p, in3 */.  Vdbe
1e240 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74  Cursor *pC;.  Bt
1e250 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20  Cursor *pCrsr;. 
1e260 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 36 34 20   int res;.  u64 
1e270 69 4b 65 79 3b 0a 0a 20 20 70 49 6e 33 20 3d 20  iKey;..  pIn3 = 
1e280 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
1e290 20 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e    assert( pIn3->
1e2a0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
1e2b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
1e2c0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
1e2d0 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
1e2e0 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
1e2f0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
1e300 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
1e310 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61  assert( pC->isTa
1e320 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ble );.  assert(
1e330 20 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65   pC->pseudoTable
1e340 52 65 67 3d 3d 30 20 29 3b 0a 20 20 70 43 72 73  Reg==0 );.  pCrs
1e350 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b  r = pC->pCursor;
1e360 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43  .  if( ALWAYS(pC
1e370 72 73 72 21 3d 30 29 20 29 7b 0a 20 20 20 20 72  rsr!=0) ){.    r
1e380 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 4b 65 79  es = 0;.    iKey
1e390 20 3d 20 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20   = pIn3->u.i;.  
1e3a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1e3b0 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
1e3c0 64 28 70 43 72 73 72 2c 20 30 2c 20 69 4b 65 79  d(pCrsr, 0, iKey
1e3d0 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  , 0, &res);.    
1e3e0 70 43 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  pC->lastRowid = 
1e3f0 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 20 20 70  pIn3->u.i;.    p
1e400 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  C->rowidIsValid 
1e410 3d 20 72 65 73 3d 3d 30 20 3f 31 3a 30 3b 0a 20  = res==0 ?1:0;. 
1e420 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d     pC->nullRow =
1e430 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68   0;.    pC->cach
1e440 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
1e450 53 54 41 4c 45 3b 0a 20 20 20 20 70 43 2d 3e 64  STALE;.    pC->d
1e460 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
1e470 30 3b 0a 20 20 20 20 69 66 28 20 72 65 73 21 3d  0;.    if( res!=
1e480 30 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20  0 ){.      pc = 
1e490 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20  pOp->p2 - 1;.   
1e4a0 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 72     assert( pC->r
1e4b0 6f 77 69 64 49 73 56 61 6c 69 64 3d 3d 30 20 29  owidIsValid==0 )
1e4c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e  ;.    }.    pC->
1e4d0 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 72 65 73  seekResult = res
1e4e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1e4f0 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77  * This happens w
1e500 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 74  hen an attempt t
1e510 6f 20 6f 70 65 6e 20 61 20 72 65 61 64 20 63 75  o open a read cu
1e520 72 73 6f 72 20 6f 6e 20 74 68 65 20 0a 20 20 20  rsor on the .   
1e530 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   ** sqlite_maste
1e540 72 20 74 61 62 6c 65 20 72 65 74 75 72 6e 73 20  r table returns 
1e550 53 51 4c 49 54 45 5f 45 4d 50 54 59 2e 0a 20 20  SQLITE_EMPTY..  
1e560 20 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 70 4f    */.    pc = pO
1e570 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 61  p->p2 - 1;.    a
1e580 73 73 65 72 74 28 20 70 43 2d 3e 72 6f 77 69 64  ssert( pC->rowid
1e590 49 73 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20  IsValid==0 );.  
1e5a0 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74    pC->seekResult
1e5b0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 62 72 65 61   = 0;.  }.  brea
1e5c0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
1e5d0 20 53 65 71 75 65 6e 63 65 20 50 31 20 50 32 20   Sequence P1 P2 
1e5e0 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 69 6e 64  * * *.**.** Find
1e5f0 20 74 68 65 20 6e 65 78 74 20 61 76 61 69 6c 61   the next availa
1e600 62 6c 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d  ble sequence num
1e610 62 65 72 20 66 6f 72 20 63 75 72 73 6f 72 20 50  ber for cursor P
1e620 31 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  1..** Write the 
1e630 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20  sequence number 
1e640 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  into register P2
1e650 2e 0a 2a 2a 20 54 68 65 20 73 65 71 75 65 6e 63  ..** The sequenc
1e660 65 20 6e 75 6d 62 65 72 20 6f 6e 20 74 68 65 20  e number on the 
1e670 63 75 72 73 6f 72 20 69 73 20 69 6e 63 72 65 6d  cursor is increm
1e680 65 6e 74 65 64 20 61 66 74 65 72 20 74 68 69 73  ented after this
1e690 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  .** instruction.
1e6a0 20 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65    .*/.case OP_Se
1e6b0 71 75 65 6e 63 65 3a 20 7b 20 20 20 20 20 20 20  quence: {       
1e6c0 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72      /* out2-prer
1e6d0 65 6c 65 61 73 65 20 2a 2f 0a 20 20 61 73 73 65  elease */.  asse
1e6e0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
1e6f0 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
1e700 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74  rsor );.  assert
1e710 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  ( p->apCsr[pOp->
1e720 70 31 5d 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74  p1]!=0 );.  pOut
1e730 2d 3e 75 2e 69 20 3d 20 70 2d 3e 61 70 43 73 72  ->u.i = p->apCsr
1e740 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 73 65 71 43 6f  [pOp->p1]->seqCo
1e750 75 6e 74 2b 2b 3b 0a 20 20 62 72 65 61 6b 3b 0a  unt++;.  break;.
1e760 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  }.../* Opcode: N
1e770 65 77 52 6f 77 69 64 20 50 31 20 50 32 20 50 33  ewRowid P1 P2 P3
1e780 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61   * *.**.** Get a
1e790 20 6e 65 77 20 69 6e 74 65 67 65 72 20 72 65 63   new integer rec
1e7a0 6f 72 64 20 6e 75 6d 62 65 72 20 28 61 2e 6b 2e  ord number (a.k.
1e7b0 61 20 22 72 6f 77 69 64 22 29 20 75 73 65 64 20  a "rowid") used 
1e7c0 61 73 20 74 68 65 20 6b 65 79 20 74 6f 20 61 20  as the key to a 
1e7d0 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 72 65  table..** The re
1e7e0 63 6f 72 64 20 6e 75 6d 62 65 72 20 69 73 20 6e  cord number is n
1e7f0 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 75 73  ot previously us
1e800 65 64 20 61 73 20 61 20 6b 65 79 20 69 6e 20 74  ed as a key in t
1e810 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  he database.** t
1e820 61 62 6c 65 20 74 68 61 74 20 63 75 72 73 6f 72  able that cursor
1e830 20 50 31 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20   P1 points to.  
1e840 54 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 6e  The new record n
1e850 75 6d 62 65 72 20 69 73 20 77 72 69 74 74 65 6e  umber is written
1e860 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 72  .** written to r
1e870 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
1e880 2a 20 49 66 20 50 33 3e 30 20 74 68 65 6e 20 50  * If P3>0 then P
1e890 33 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  3 is a register 
1e8a0 69 6e 20 74 68 65 20 72 6f 6f 74 20 66 72 61 6d  in the root fram
1e8b0 65 20 6f 66 20 74 68 69 73 20 56 44 42 45 20 74  e of this VDBE t
1e8c0 68 61 74 20 68 6f 6c 64 73 20 0a 2a 2a 20 74 68  hat holds .** th
1e8d0 65 20 6c 61 72 67 65 73 74 20 70 72 65 76 69 6f  e largest previo
1e8e0 75 73 6c 79 20 67 65 6e 65 72 61 74 65 64 20 72  usly generated r
1e8f0 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20 4e 6f  ecord number. No
1e900 20 6e 65 77 20 72 65 63 6f 72 64 20 6e 75 6d 62   new record numb
1e910 65 72 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77  ers are.** allow
1e920 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
1e930 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57  an this value. W
1e940 68 65 6e 20 74 68 69 73 20 76 61 6c 75 65 20 72  hen this value r
1e950 65 61 63 68 65 73 20 69 74 73 20 6d 61 78 69 6d  eaches its maxim
1e960 75 6d 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 49 54  um, .** an SQLIT
1e970 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 69 73 20  E_FULL error is 
1e980 67 65 6e 65 72 61 74 65 64 2e 20 54 68 65 20 50  generated. The P
1e990 33 20 72 65 67 69 73 74 65 72 20 69 73 20 75 70  3 register is up
1e9a0 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20 27  dated with the '
1e9b0 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 72 65  .** generated re
1e9c0 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20 54 68 69  cord number. Thi
1e9d0 73 20 50 33 20 6d 65 63 68 61 6e 69 73 6d 20 69  s P3 mechanism i
1e9e0 73 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20 69  s used to help i
1e9f0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  mplement the.** 
1ea00 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 66 65  AUTOINCREMENT fe
1ea10 61 74 75 72 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ature..*/.case O
1ea20 50 5f 4e 65 77 52 6f 77 69 64 3a 20 7b 20 20 20  P_NewRowid: {   
1ea30 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
1ea40 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
1ea50 69 36 34 20 76 3b 20 20 20 20 20 20 20 20 20 20  i64 v;          
1ea60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
1ea70 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20 56 64 62  w rowid */.  Vdb
1ea80 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 20  eCursor *pC;    
1ea90 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66      /* Cursor of
1eaa0 20 74 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68   table to get th
1eab0 65 20 6e 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20  e new rowid */. 
1eac0 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20   int res;       
1ead0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1eae0 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 42  t of an sqlite3B
1eaf0 74 72 65 65 4c 61 73 74 28 29 20 2a 2f 0a 20 20  treeLast() */.  
1eb00 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20  int cnt;        
1eb10 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
1eb20 72 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e  r to limit the n
1eb30 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 65  umber of searche
1eb40 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  s */.  Mem *pMem
1eb50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1eb60 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
1eb70 67 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20  g largest rowid 
1eb80 66 6f 72 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  for AUTOINCREMEN
1eb90 54 20 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d 65  T */.  VdbeFrame
1eba0 20 2a 70 46 72 61 6d 65 3b 20 20 20 20 20 2f 2a   *pFrame;     /*
1ebb0 20 52 6f 6f 74 20 66 72 61 6d 65 20 6f 66 20 56   Root frame of V
1ebc0 44 42 45 20 2a 2f 0a 0a 20 20 76 20 3d 20 30 3b  DBE */..  v = 0;
1ebd0 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 61 73  .  res = 0;.  as
1ebe0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
1ebf0 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
1ec00 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
1ec10 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
1ec20 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
1ec30 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  !=0 );.  if( NEV
1ec40 45 52 28 70 43 2d 3e 70 43 75 72 73 6f 72 3d 3d  ER(pC->pCursor==
1ec50 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  0) ){.    /* The
1ec60 20 7a 65 72 6f 20 69 6e 69 74 69 61 6c 69 7a 61   zero initializa
1ec70 74 69 6f 6e 20 61 62 6f 76 65 20 69 73 20 61 6c  tion above is al
1ec80 6c 20 74 68 61 74 20 69 73 20 6e 65 65 64 65 64  l that is needed
1ec90 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
1eca0 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 77   /* The next row
1ecb0 69 64 20 6f 72 20 72 65 63 6f 72 64 20 6e 75 6d  id or record num
1ecc0 62 65 72 20 28 64 69 66 66 65 72 65 6e 74 20 74  ber (different t
1ecd0 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73 61 6d  erms for the sam
1ece0 65 0a 20 20 20 20 2a 2a 20 74 68 69 6e 67 29 20  e.    ** thing) 
1ecf0 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 61  is obtained in a
1ed00 20 74 77 6f 2d 73 74 65 70 20 61 6c 67 6f 72 69   two-step algori
1ed10 74 68 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  thm..    **.    
1ed20 2a 2a 20 46 69 72 73 74 20 77 65 20 61 74 74 65  ** First we atte
1ed30 6d 70 74 20 74 6f 20 66 69 6e 64 20 74 68 65 20  mpt to find the 
1ed40 6c 61 72 67 65 73 74 20 65 78 69 73 74 69 6e 67  largest existing
1ed50 20 72 6f 77 69 64 20 61 6e 64 20 61 64 64 20 6f   rowid and add o
1ed60 6e 65 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 61  ne.    ** to tha
1ed70 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6c  t.  But if the l
1ed80 61 72 67 65 73 74 20 65 78 69 73 74 69 6e 67 20  argest existing 
1ed90 72 6f 77 69 64 20 69 73 20 61 6c 72 65 61 64 79  rowid is already
1eda0 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 20 20 20   the maximum.   
1edb0 20 2a 2a 20 70 6f 73 69 74 69 76 65 20 69 6e 74   ** positive int
1edc0 65 67 65 72 2c 20 77 65 20 68 61 76 65 20 74 6f  eger, we have to
1edd0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
1ede0 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20   the second.    
1edf0 2a 2a 20 70 72 6f 62 61 62 69 6c 69 73 74 69 63  ** probabilistic
1ee00 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20 20 20 2a   algorithm.    *
1ee10 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63  *.    ** The sec
1ee20 6f 6e 64 20 61 6c 67 6f 72 69 74 68 6d 20 69 73  ond algorithm is
1ee30 20 74 6f 20 73 65 6c 65 63 74 20 61 20 72 6f 77   to select a row
1ee40 69 64 20 61 74 20 72 61 6e 64 6f 6d 20 61 6e 64  id at random and
1ee50 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 69   see if.    ** i
1ee60 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  t already exists
1ee70 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
1ee80 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  If it does not e
1ee90 78 69 73 74 2c 20 77 65 20 68 61 76 65 0a 20 20  xist, we have.  
1eea0 20 20 2a 2a 20 73 75 63 63 65 65 64 65 64 2e 20    ** succeeded. 
1eeb0 20 49 66 20 74 68 65 20 72 61 6e 64 6f 6d 20 72   If the random r
1eec0 6f 77 69 64 20 64 6f 65 73 20 65 78 69 73 74 2c  owid does exist,
1eed0 20 77 65 20 73 65 6c 65 63 74 20 61 20 6e 65 77   we select a new
1eee0 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20   one.    ** and 
1eef0 74 72 79 20 61 67 61 69 6e 2c 20 75 70 20 74 6f  try again, up to
1ef00 20 31 30 30 20 74 69 6d 65 73 2e 0a 20 20 20 20   100 times..    
1ef10 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1ef20 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 0a 23  C->isTable );..#
1ef30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 33 32 42  ifdef SQLITE_32B
1ef40 49 54 5f 52 4f 57 49 44 0a 23 20 20 20 64 65 66  IT_ROWID.#   def
1ef50 69 6e 65 20 4d 41 58 5f 52 4f 57 49 44 20 30 78  ine MAX_ROWID 0x
1ef60 37 66 66 66 66 66 66 66 0a 23 65 6c 73 65 0a 20  7fffffff.#else. 
1ef70 20 20 20 2f 2a 20 53 6f 6d 65 20 63 6f 6d 70 69     /* Some compi
1ef80 6c 65 72 73 20 63 6f 6d 70 6c 61 69 6e 20 61 62  lers complain ab
1ef90 6f 75 74 20 63 6f 6e 73 74 61 6e 74 73 20 6f 66  out constants of
1efa0 20 74 68 65 20 66 6f 72 6d 20 30 78 37 66 66 66   the form 0x7fff
1efb0 66 66 66 66 66 66 66 66 66 66 66 66 2e 0a 20 20  ffffffffffff..  
1efc0 20 20 2a 2a 20 4f 74 68 65 72 73 20 63 6f 6d 70    ** Others comp
1efd0 6c 61 69 6e 20 61 62 6f 75 74 20 30 78 37 66 66  lain about 0x7ff
1efe0 66 66 66 66 66 66 66 66 66 66 66 66 66 66 4c 4c  ffffffffffffffLL
1eff0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
1f000 20 6d 61 63 72 6f 20 73 65 65 6d 73 0a 20 20 20   macro seems.   
1f010 20 2a 2a 20 74 6f 20 70 72 6f 76 69 64 65 20 74   ** to provide t
1f020 68 65 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 6c  he constant whil
1f030 65 20 6d 61 6b 69 6e 67 20 61 6c 6c 20 63 6f 6d  e making all com
1f040 70 69 6c 65 72 73 20 68 61 70 70 79 2e 0a 20 20  pilers happy..  
1f050 20 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20    */.#   define 
1f060 4d 41 58 5f 52 4f 57 49 44 20 20 28 69 36 34 29  MAX_ROWID  (i64)
1f070 28 20 28 28 28 75 36 34 29 30 78 37 66 66 66 66  ( (((u64)0x7ffff
1f080 66 66 66 29 3c 3c 33 32 29 20 7c 20 28 75 36 34  fff)<<32) | (u64
1f090 29 30 78 66 66 66 66 66 66 66 66 20 29 0a 23 65  )0xffffffff ).#e
1f0a0 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 21 70  ndif..    if( !p
1f0b0 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69  C->useRandomRowi
1f0c0 64 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 73  d ){.      v = s
1f0d0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 43 61  qlite3BtreeGetCa
1f0e0 63 68 65 64 52 6f 77 69 64 28 70 43 2d 3e 70 43  chedRowid(pC->pC
1f0f0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66  ursor);.      if
1f100 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( v==0 ){.      
1f110 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1f120 72 65 65 4c 61 73 74 28 70 43 2d 3e 70 43 75 72  reeLast(pC->pCur
1f130 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  sor, &res);.    
1f140 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f150 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f160 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
1f170 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
1f180 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1f190 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20  ( res ){.       
1f1a0 20 20 20 76 20 3d 20 31 3b 20 20 20 2f 2a 20 49     v = 1;   /* I
1f1b0 4d 50 3a 20 52 2d 36 31 39 31 34 2d 34 38 30 37  MP: R-61914-4807
1f1c0 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  4 */.        }el
1f1d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
1f1e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1f1f0 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
1f200 70 43 2d 3e 70 43 75 72 73 6f 72 29 20 29 3b 0a  pC->pCursor) );.
1f210 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1f220 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
1f230 7a 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ze(pC->pCursor, 
1f240 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  &v);.          a
1f250 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
1f260 45 5f 4f 4b 20 29 3b 20 20 20 2f 2a 20 43 61 6e  E_OK );   /* Can
1f270 6e 6f 74 20 66 61 69 6c 20 66 6f 6c 6c 6f 77 69  not fail followi
1f280 6e 67 20 42 74 72 65 65 4c 61 73 74 28 29 20 2a  ng BtreeLast() *
1f290 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
1f2a0 76 3d 3d 4d 41 58 5f 52 4f 57 49 44 20 29 7b 0a  v==MAX_ROWID ){.
1f2b0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 2d 3e              pC->
1f2c0 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 3d  useRandomRowid =
1f2d0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   1;.          }e
1f2e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1f2f0 20 76 2b 2b 3b 20 20 20 2f 2a 20 49 4d 50 3a 20   v++;   /* IMP: 
1f300 52 2d 32 39 35 33 38 2d 33 34 39 38 37 20 2a 2f  R-29538-34987 */
1f310 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1f320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
1f330 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f340 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
1f350 54 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  T.      if( pOp-
1f360 3e 70 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  >p3 ){.        /
1f370 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 50 33  * Assert that P3
1f380 20 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f   is a valid memo
1f390 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20  ry cell. */.    
1f3a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
1f3b0 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  >p3>0 );.       
1f3c0 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29   if( p->pFrame )
1f3d0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
1f3e0 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
1f3f0 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  ; pFrame->pParen
1f400 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
1f410 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
1f420 20 20 20 20 20 20 2f 2a 20 41 73 73 65 72 74 20        /* Assert 
1f430 74 68 61 74 20 50 33 20 69 73 20 61 20 76 61 6c  that P3 is a val
1f440 69 64 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20  id memory cell. 
1f450 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
1f460 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 70 46  ert( pOp->p3<=pF
1f470 72 61 6d 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  rame->nMem );.  
1f480 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 26          pMem = &
1f490 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70  pFrame->aMem[pOp
1f4a0 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20 20 20 7d  ->p3];.        }
1f4b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f4c0 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 50  /* Assert that P
1f4d0 33 20 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d  3 is a valid mem
1f4e0 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20  ory cell. */.   
1f4f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1f500 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20  Op->p3<=p->nMem 
1f510 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 65  );.          pMe
1f520 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  m = &aMem[pOp->p
1f530 33 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  3];.          me
1f540 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
1f550 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  , pMem);.       
1f560 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
1f570 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 4d  t( memIsValid(pM
1f580 65 6d 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  em) );..        
1f590 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
1f5a0 4f 70 2d 3e 70 33 2c 20 70 4d 65 6d 29 3b 0a 20  Op->p3, pMem);. 
1f5b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1f5c0 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28  beMemIntegerify(
1f5d0 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 61  pMem);.        a
1f5e0 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c  ssert( (pMem->fl
1f5f0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d  ags & MEM_Int)!=
1f600 30 20 29 3b 20 20 2f 2a 20 6d 65 6d 28 50 33 29  0 );  /* mem(P3)
1f610 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65 67 65   holds an intege
1f620 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  r */.        if(
1f630 20 70 4d 65 6d 2d 3e 75 2e 69 3d 3d 4d 41 58 5f   pMem->u.i==MAX_
1f640 52 4f 57 49 44 20 7c 7c 20 70 43 2d 3e 75 73 65  ROWID || pC->use
1f650 52 61 6e 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20  RandomRowid ){. 
1f660 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1f670 4c 49 54 45 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20  LITE_FULL;   /* 
1f680 49 4d 50 3a 20 52 2d 31 32 32 37 35 2d 36 31 33  IMP: R-12275-613
1f690 33 38 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  38 */.          
1f6a0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
1f6b0 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  o_error;.       
1f6c0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 76   }.        if( v
1f6d0 3c 70 4d 65 6d 2d 3e 75 2e 69 2b 31 20 29 7b 0a  <pMem->u.i+1 ){.
1f6e0 20 20 20 20 20 20 20 20 20 20 76 20 3d 20 70 4d            v = pM
1f6f0 65 6d 2d 3e 75 2e 69 20 2b 20 31 3b 0a 20 20 20  em->u.i + 1;.   
1f700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1f710 4d 65 6d 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20  Mem->u.i = v;.  
1f720 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1f730 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1f740 53 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 70  SetCachedRowid(p
1f750 43 2d 3e 70 43 75 72 73 6f 72 2c 20 76 3c 4d 41  C->pCursor, v<MA
1f760 58 5f 52 4f 57 49 44 20 3f 20 76 2b 31 20 3a 20  X_ROWID ? v+1 : 
1f770 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
1f780 28 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52  ( pC->useRandomR
1f790 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a  owid ){.      /*
1f7a0 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
1f7b0 4f 46 3a 20 52 2d 30 37 36 37 37 2d 34 31 38 38  OF: R-07677-4188
1f7c0 31 20 49 66 20 74 68 65 20 6c 61 72 67 65 73 74  1 If the largest
1f7d0 20 52 4f 57 49 44 20 69 73 20 65 71 75 61 6c 20   ROWID is equal 
1f7e0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
1f7f0 6c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65  largest possible
1f800 20 69 6e 74 65 67 65 72 20 28 39 32 32 33 33 37   integer (922337
1f810 32 30 33 36 38 35 34 37 37 35 38 30 37 29 20 74  2036854775807) t
1f820 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
1f830 0a 20 20 20 20 20 20 2a 2a 20 65 6e 67 69 6e 65  .      ** engine
1f840 20 73 74 61 72 74 73 20 70 69 63 6b 69 6e 67 20   starts picking 
1f850 70 6f 73 69 74 69 76 65 20 63 61 6e 64 69 64 61  positive candida
1f860 74 65 20 52 4f 57 49 44 73 20 61 74 20 72 61 6e  te ROWIDs at ran
1f870 64 6f 6d 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  dom until.      
1f880 2a 2a 20 69 74 20 66 69 6e 64 73 20 6f 6e 65 20  ** it finds one 
1f890 74 68 61 74 20 69 73 20 6e 6f 74 20 70 72 65 76  that is not prev
1f8a0 69 6f 75 73 6c 79 20 75 73 65 64 2e 20 2a 2f 0a  iously used. */.
1f8b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
1f8c0 70 2d 3e 70 33 3d 3d 30 20 29 3b 20 20 2f 2a 20  p->p3==0 );  /* 
1f8d0 57 65 20 63 61 6e 6e 6f 74 20 62 65 20 69 6e 20  We cannot be in 
1f8e0 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20 6d 6f 64  random rowid mod
1f8f0 65 20 69 66 20 74 68 69 73 20 69 73 0a 20 20 20  e if this is.   
1f900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f910 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20            ** an 
1f920 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 74 61  AUTOINCREMENT ta
1f930 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  ble. */.      /*
1f940 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 61 74   on the first at
1f950 74 65 6d 70 74 2c 20 73 69 6d 70 6c 79 20 64 6f  tempt, simply do
1f960 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 70   one more than p
1f970 72 65 76 69 6f 75 73 20 2a 2f 0a 20 20 20 20 20  revious */.     
1f980 20 76 20 3d 20 6c 61 73 74 52 6f 77 69 64 3b 0a   v = lastRowid;.
1f990 20 20 20 20 20 20 76 20 26 3d 20 28 4d 41 58 5f        v &= (MAX_
1f9a0 52 4f 57 49 44 3e 3e 31 29 3b 20 2f 2a 20 65 6e  ROWID>>1); /* en
1f9b0 73 75 72 65 20 64 6f 65 73 6e 27 74 20 67 6f 20  sure doesn't go 
1f9c0 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 20 20  negative */.    
1f9d0 20 20 76 2b 2b 3b 20 2f 2a 20 65 6e 73 75 72 65    v++; /* ensure
1f9e0 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20   non-zero */.   
1f9f0 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20     cnt = 0;.    
1fa00 20 20 77 68 69 6c 65 28 20 20 20 28 28 72 63 20    while(   ((rc 
1fa10 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
1fa20 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d  vetoUnpacked(pC-
1fa30 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 36  >pCursor, 0, (u6
1fa40 34 29 76 2c 0a 20 20 20 20 20 20 20 20 20 20 20  4)v,.           
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa70 20 20 20 20 20 20 30 2c 20 26 72 65 73 29 29 3d        0, &res))=
1fa80 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20  =SQLITE_OK).    
1fa90 20 20 20 20 20 20 20 20 26 26 20 28 72 65 73 3d          && (res=
1faa0 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0).            
1fab0 26 26 20 28 2b 2b 63 6e 74 3c 31 30 30 29 29 7b  && (++cnt<100)){
1fac0 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6c 6c  .        /* coll
1fad0 69 73 69 6f 6e 20 2d 20 74 72 79 20 61 6e 6f 74  ision - try anot
1fae0 68 65 72 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64  her random rowid
1faf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
1fb00 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
1fb10 69 7a 65 6f 66 28 76 29 2c 20 26 76 29 3b 0a 20  izeof(v), &v);. 
1fb20 20 20 20 20 20 20 20 69 66 28 20 63 6e 74 3c 35         if( cnt<5
1fb30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1fb40 20 74 72 79 20 22 73 6d 61 6c 6c 22 20 72 61 6e   try "small" ran
1fb50 64 6f 6d 20 72 6f 77 69 64 73 20 66 6f 72 20 74  dom rowids for t
1fb60 68 65 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  he initial attem
1fb70 70 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  pts */.         
1fb80 20 76 20 26 3d 20 30 78 66 66 66 66 66 66 3b 0a   v &= 0xffffff;.
1fb90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1fba0 20 20 20 20 20 20 20 20 20 76 20 26 3d 20 28 4d           v &= (M
1fbb0 41 58 5f 52 4f 57 49 44 3e 3e 31 29 3b 20 2f 2a  AX_ROWID>>1); /*
1fbc0 20 65 6e 73 75 72 65 20 64 6f 65 73 6e 27 74 20   ensure doesn't 
1fbd0 67 6f 20 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20  go negative */. 
1fbe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fbf0 20 76 2b 2b 3b 20 2f 2a 20 65 6e 73 75 72 65 20   v++; /* ensure 
1fc00 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20  non-zero */.    
1fc10 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1fc20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
1fc30 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
1fc40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
1fc50 4c 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33  L;   /* IMP: R-3
1fc60 38 32 31 39 2d 35 33 30 30 32 20 2a 2f 0a 20 20  8219-53002 */.  
1fc70 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74        goto abort
1fc80 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
1fc90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
1fca0 65 72 74 28 20 76 3e 30 20 29 3b 20 20 2f 2a 20  ert( v>0 );  /* 
1fcb0 45 56 3a 20 52 2d 34 30 38 31 32 2d 30 33 35 37  EV: R-40812-0357
1fcc0 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70  0 */.    }.    p
1fcd0 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  C->rowidIsValid 
1fce0 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66  = 0;.    pC->def
1fcf0 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
1fd00 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74  .    pC->cacheSt
1fd10 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
1fd20 4c 45 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e  LE;.  }.  pOut->
1fd30 75 2e 69 20 3d 20 76 3b 0a 20 20 62 72 65 61 6b  u.i = v;.  break
1fd40 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1fd50 49 6e 73 65 72 74 20 50 31 20 50 32 20 50 33 20  Insert P1 P2 P3 
1fd60 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 57 72 69 74  P4 P5.**.** Writ
1fd70 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
1fd80 74 68 65 20 74 61 62 6c 65 20 6f 66 20 63 75 72  the table of cur
1fd90 73 6f 72 20 50 31 2e 20 20 41 20 6e 65 77 20 65  sor P1.  A new e
1fda0 6e 74 72 79 20 69 73 0a 2a 2a 20 63 72 65 61 74  ntry is.** creat
1fdb0 65 64 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74  ed if it doesn't
1fdc0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 20 6f   already exist o
1fdd0 72 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 61  r the data for a
1fde0 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 65 6e  n existing.** en
1fdf0 74 72 79 20 69 73 20 6f 76 65 72 77 72 69 74 74  try is overwritt
1fe00 65 6e 2e 20 20 54 68 65 20 64 61 74 61 20 69 73  en.  The data is
1fe10 20 74 68 65 20 76 61 6c 75 65 20 4d 45 4d 5f 42   the value MEM_B
1fe20 6c 6f 62 20 73 74 6f 72 65 64 20 69 6e 20 72 65  lob stored in re
1fe30 67 69 73 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72  gister.** number
1fe40 20 50 32 2e 20 54 68 65 20 6b 65 79 20 69 73 20   P2. The key is 
1fe50 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
1fe60 65 72 20 50 33 2e 20 54 68 65 20 6b 65 79 20 6d  er P3. The key m
1fe70 75 73 74 0a 2a 2a 20 62 65 20 61 20 4d 45 4d 5f  ust.** be a MEM_
1fe80 49 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  Int..**.** If th
1fe90 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45  e OPFLAG_NCHANGE
1fea0 20 66 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73   flag of P5 is s
1feb0 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77  et, then the row
1fec0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20 69 73   change count is
1fed0 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64 20  .** incremented 
1fee0 28 6f 74 68 65 72 77 69 73 65 20 6e 6f 74 29 2e  (otherwise not).
1fef0 20 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f    If the OPFLAG_
1ff00 4c 41 53 54 52 4f 57 49 44 20 66 6c 61 67 20 6f  LASTROWID flag o
1ff10 66 20 50 35 20 69 73 20 73 65 74 2c 0a 2a 2a 20  f P5 is set,.** 
1ff20 74 68 65 6e 20 72 6f 77 69 64 20 69 73 20 73 74  then rowid is st
1ff30 6f 72 65 64 20 66 6f 72 20 73 75 62 73 65 71 75  ored for subsequ
1ff40 65 6e 74 20 72 65 74 75 72 6e 20 62 79 20 74 68  ent return by th
1ff50 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 61 73  e.** sqlite3_las
1ff60 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29  t_insert_rowid()
1ff70 20 66 75 6e 63 74 69 6f 6e 20 28 6f 74 68 65 72   function (other
1ff80 77 69 73 65 20 69 74 20 69 73 20 75 6e 6d 6f 64  wise it is unmod
1ff90 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ified)..**.** If
1ffa0 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53   the OPFLAG_USES
1ffb0 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6f  EEKRESULT flag o
1ffc0 66 20 50 35 20 69 73 20 73 65 74 20 61 6e 64 20  f P5 is set and 
1ffd0 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  if the result of
1ffe0 0a 2a 2a 20 74 68 65 20 6c 61 73 74 20 73 65 65  .** the last see
1fff0 6b 20 6f 70 65 72 61 74 69 6f 6e 20 28 4f 50 5f  k operation (OP_
20000 4e 6f 74 45 78 69 73 74 73 29 20 77 61 73 20 61  NotExists) was a
20010 20 73 75 63 63 65 73 73 2c 20 74 68 65 6e 20 74   success, then t
20020 68 69 73 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  his.** operation
20030 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70   will not attemp
20040 74 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61 70  t to find the ap
20050 70 72 6f 70 72 69 61 74 65 20 72 6f 77 20 62 65  propriate row be
20060 66 6f 72 65 20 64 6f 69 6e 67 0a 2a 2a 20 74 68  fore doing.** th
20070 65 20 69 6e 73 65 72 74 20 62 75 74 20 77 69 6c  e insert but wil
20080 6c 20 69 6e 73 74 65 61 64 20 6f 76 65 72 77 72  l instead overwr
20090 69 74 65 20 74 68 65 20 72 6f 77 20 74 68 61 74  ite the row that
200a0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a 2a   the cursor is.*
200b0 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  * currently poin
200c0 74 69 6e 67 20 74 6f 2e 20 20 50 72 65 73 75 6d  ting to.  Presum
200d0 61 62 6c 79 2c 20 74 68 65 20 70 72 69 6f 72 20  ably, the prior 
200e0 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f 70 63  OP_NotExists opc
200f0 6f 64 65 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  ode.** has alrea
20100 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 74 68  dy positioned th
20110 65 20 63 75 72 73 6f 72 20 63 6f 72 72 65 63 74  e cursor correct
20120 6c 79 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20  ly.  This is an 
20130 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
20140 74 68 61 74 20 62 6f 6f 73 74 73 20 70 65 72 66  that boosts perf
20150 6f 72 6d 61 6e 63 65 20 62 79 20 61 76 6f 69 64  ormance by avoid
20160 69 6e 67 20 72 65 64 75 6e 64 61 6e 74 20 73 65  ing redundant se
20170 65 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eks..**.** If th
20180 65 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54  e OPFLAG_ISUPDAT
20190 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
201a0 68 65 6e 20 74 68 69 73 20 6f 70 63 6f 64 65 20  hen this opcode 
201b0 69 73 20 70 61 72 74 20 6f 66 20 61 6e 0a 2a 2a  is part of an.**
201c0 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f   UPDATE operatio
201d0 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 20 28 69  n.  Otherwise (i
201e0 66 20 74 68 65 20 66 6c 61 67 20 69 73 20 63 6c  f the flag is cl
201f0 65 61 72 29 20 74 68 65 6e 20 74 68 69 73 20 6f  ear) then this o
20200 70 63 6f 64 65 0a 2a 2a 20 69 73 20 70 61 72 74  pcode.** is part
20210 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 6f 70   of an INSERT op
20220 65 72 61 74 69 6f 6e 2e 20 20 54 68 65 20 64 69  eration.  The di
20230 66 66 65 72 65 6e 63 65 20 69 73 20 6f 6e 6c 79  fference is only
20240 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 0a 2a 2a   important to.**
20250 20 74 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b   the update hook
20260 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
20270 72 20 50 34 20 6d 61 79 20 70 6f 69 6e 74 20 74  r P4 may point t
20280 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  o a string conta
20290 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2d  ining the table-
202a0 6e 61 6d 65 2c 20 6f 72 0a 2a 2a 20 6d 61 79 20  name, or.** may 
202b0 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69  be NULL. If it i
202c0 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
202d0 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b   the update-hook
202e0 20 0a 2a 2a 20 28 73 71 6c 69 74 65 33 2e 78 55   .** (sqlite3.xU
202f0 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 29 20 69  pdateCallback) i
20300 73 20 69 6e 76 6f 6b 65 64 20 66 6f 6c 6c 6f 77  s invoked follow
20310 69 6e 67 20 61 20 73 75 63 63 65 73 73 66 75 6c  ing a successful
20320 20 69 6e 73 65 72 74 2e 0a 2a 2a 0a 2a 2a 20 28   insert..**.** (
20330 57 41 52 4e 49 4e 47 2f 54 4f 44 4f 3a 20 49 66  WARNING/TODO: If
20340 20 50 31 20 69 73 20 61 20 70 73 65 75 64 6f 2d   P1 is a pseudo-
20350 63 75 72 73 6f 72 20 61 6e 64 20 50 32 20 69 73  cursor and P2 is
20360 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
20370 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 6e 20  allocated, then 
20380 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 50 32 20  ownership of P2 
20390 69 73 20 74 72 61 6e 73 66 65 72 72 65 64 20 74  is transferred t
203a0 6f 20 74 68 65 20 70 73 65 75 64 6f 2d 63 75 72  o the pseudo-cur
203b0 73 6f 72 0a 2a 2a 20 61 6e 64 20 72 65 67 69 73  sor.** and regis
203c0 74 65 72 20 50 32 20 62 65 63 6f 6d 65 73 20 65  ter P2 becomes e
203d0 70 68 65 6d 65 72 61 6c 2e 20 20 49 66 20 74 68  phemeral.  If th
203e0 65 20 63 75 72 73 6f 72 20 69 73 20 63 68 61 6e  e cursor is chan
203f0 67 65 64 2c 20 74 68 65 0a 2a 2a 20 76 61 6c 75  ged, the.** valu
20400 65 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 32  e of register P2
20410 20 77 69 6c 6c 20 74 68 65 6e 20 63 68 61 6e 67   will then chang
20420 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  e.  Make sure th
20430 69 73 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63  is does not.** c
20440 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
20450 73 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  s.).**.** This i
20460 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20  nstruction only 
20470 77 6f 72 6b 73 20 6f 6e 20 74 61 62 6c 65 73 2e  works on tables.
20480 20 20 54 68 65 20 65 71 75 69 76 61 6c 65 6e 74    The equivalent
20490 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20   instruction.** 
204a0 66 6f 72 20 69 6e 64 69 63 65 73 20 69 73 20 4f  for indices is O
204b0 50 5f 49 64 78 49 6e 73 65 72 74 2e 0a 2a 2f 0a  P_IdxInsert..*/.
204c0 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 73 65 72  /* Opcode: Inser
204d0 74 49 6e 74 20 50 31 20 50 32 20 50 33 20 50 34  tInt P1 P2 P3 P4
204e0 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77   P5.**.** This w
204f0 6f 72 6b 73 20 65 78 61 63 74 6c 79 20 6c 69 6b  orks exactly lik
20500 65 20 4f 50 5f 49 6e 73 65 72 74 20 65 78 63 65  e OP_Insert exce
20510 70 74 20 74 68 61 74 20 74 68 65 20 6b 65 79 20  pt that the key 
20520 69 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65  is the.** intege
20530 72 20 76 61 6c 75 65 20 50 33 2c 20 6e 6f 74 20  r value P3, not 
20540 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
20550 20 69 6e 74 65 67 65 72 20 73 74 6f 72 65 64 20   integer stored 
20560 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
20570 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65 72  */.case OP_Inser
20580 74 3a 20 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65  t: .case OP_Inse
20590 72 74 49 6e 74 3a 20 7b 0a 20 20 4d 65 6d 20 2a  rtInt: {.  Mem *
205a0 70 44 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  pData;       /* 
205b0 4d 45 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67  MEM cell holding
205c0 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65   data for the re
205d0 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72  cord to be inser
205e0 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4b  ted */.  Mem *pK
205f0 65 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 45  ey;        /* ME
20600 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 6b  M cell holding k
20610 65 79 20 20 66 6f 72 20 74 68 65 20 72 65 63 6f  ey  for the reco
20620 72 64 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79  rd */.  i64 iKey
20630 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
20640 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20 6f   integer ROWID o
20650 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 65  r key for the re
20660 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72  cord to be inser
20670 74 65 64 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ted */.  VdbeCur
20680 73 6f 72 20 2a 70 43 3b 20 20 20 2f 2a 20 43 75  sor *pC;   /* Cu
20690 72 73 6f 72 20 74 6f 20 74 61 62 6c 65 20 69 6e  rsor to table in
206a0 74 6f 20 77 68 69 63 68 20 69 6e 73 65 72 74 20  to which insert 
206b0 69 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  is written */.  
206c0 69 6e 74 20 6e 5a 65 72 6f 3b 20 20 20 20 20 20  int nZero;      
206d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a    /* Number of z
206e0 65 72 6f 2d 62 79 74 65 73 20 74 6f 20 61 70 70  ero-bytes to app
206f0 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65  end */.  int see
20700 6b 52 65 73 75 6c 74 3b 20 20 20 2f 2a 20 52 65  kResult;   /* Re
20710 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20 73 65  sult of prior se
20720 65 6b 20 6f 72 20 30 20 69 66 20 6e 6f 20 55 53  ek or 0 if no US
20730 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67  ESEEKRESULT flag
20740 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
20750 20 2a 7a 44 62 3b 20 20 2f 2a 20 64 61 74 61 62   *zDb;  /* datab
20760 61 73 65 20 6e 61 6d 65 20 2d 20 75 73 65 64 20  ase name - used 
20770 62 79 20 74 68 65 20 75 70 64 61 74 65 20 68 6f  by the update ho
20780 6f 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ok */.  const ch
20790 61 72 20 2a 7a 54 62 6c 3b 20 2f 2a 20 54 61 62  ar *zTbl; /* Tab
207a0 6c 65 20 6e 61 6d 65 20 2d 20 75 73 65 64 20 62  le name - used b
207b0 79 20 74 68 65 20 6f 70 64 61 74 65 20 68 6f 6f  y the opdate hoo
207c0 6b 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  k */.  int op;  
207d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
207e0 64 65 20 66 6f 72 20 75 70 64 61 74 65 20 68 6f  de for update ho
207f0 6f 6b 3a 20 53 51 4c 49 54 45 5f 55 50 44 41 54  ok: SQLITE_UPDAT
20800 45 20 6f 72 20 53 51 4c 49 54 45 5f 49 4e 53 45  E or SQLITE_INSE
20810 52 54 20 2a 2f 0a 0a 20 20 70 44 61 74 61 20 3d  RT */..  pData =
20820 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
20830 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
20840 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
20850 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
20860 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
20870 6c 69 64 28 70 44 61 74 61 29 20 29 3b 0a 20 20  lid(pData) );.  
20880 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
20890 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
208a0 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
208b0 65 72 74 28 20 70 43 2d 3e 70 43 75 72 73 6f 72  ert( pC->pCursor
208c0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
208d0 20 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65   pC->pseudoTable
208e0 52 65 67 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Reg==0 );.  asse
208f0 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20  rt( pC->isTable 
20900 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  );.  REGISTER_TR
20910 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 44 61  ACE(pOp->p2, pDa
20920 74 61 29 3b 0a 0a 20 20 69 66 28 20 70 4f 70 2d  ta);..  if( pOp-
20930 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 73 65  >opcode==OP_Inse
20940 72 74 20 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d  rt ){.    pKey =
20950 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
20960 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65  .    assert( pKe
20970 79 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  y->flags & MEM_I
20980 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nt );.    assert
20990 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 4b 65  ( memIsValid(pKe
209a0 79 29 20 29 3b 0a 20 20 20 20 52 45 47 49 53 54  y) );.    REGIST
209b0 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
209c0 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 69 4b 65  , pKey);.    iKe
209d0 79 20 3d 20 70 4b 65 79 2d 3e 75 2e 69 3b 0a 20  y = pKey->u.i;. 
209e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
209f0 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  rt( pOp->opcode=
20a00 3d 4f 50 5f 49 6e 73 65 72 74 49 6e 74 20 29 3b  =OP_InsertInt );
20a10 0a 20 20 20 20 69 4b 65 79 20 3d 20 70 4f 70 2d  .    iKey = pOp-
20a20 3e 70 33 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  >p3;.  }..  if( 
20a30 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
20a40 5f 4e 43 48 41 4e 47 45 20 29 20 70 2d 3e 6e 43  _NCHANGE ) p->nC
20a50 68 61 6e 67 65 2b 2b 3b 0a 20 20 69 66 28 20 70  hange++;.  if( p
20a60 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
20a70 4c 41 53 54 52 4f 57 49 44 20 29 20 64 62 2d 3e  LASTROWID ) db->
20a80 6c 61 73 74 52 6f 77 69 64 20 3d 20 6c 61 73 74  lastRowid = last
20a90 52 6f 77 69 64 20 3d 20 69 4b 65 79 3b 0a 20 20  Rowid = iKey;.  
20aa0 69 66 28 20 70 44 61 74 61 2d 3e 66 6c 61 67 73  if( pData->flags
20ab0 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
20ac0 20 20 20 70 44 61 74 61 2d 3e 7a 20 3d 20 30 3b     pData->z = 0;
20ad0 0a 20 20 20 20 70 44 61 74 61 2d 3e 6e 20 3d 20  .    pData->n = 
20ae0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
20af0 61 73 73 65 72 74 28 20 70 44 61 74 61 2d 3e 66  assert( pData->f
20b00 6c 61 67 73 20 26 20 28 4d 45 4d 5f 42 6c 6f 62  lags & (MEM_Blob
20b10 7c 4d 45 4d 5f 53 74 72 29 20 29 3b 0a 20 20 7d  |MEM_Str) );.  }
20b20 0a 20 20 73 65 65 6b 52 65 73 75 6c 74 20 3d 20  .  seekResult = 
20b30 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c  ((pOp->p5 & OPFL
20b40 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
20b50 29 20 3f 20 70 43 2d 3e 73 65 65 6b 52 65 73 75  ) ? pC->seekResu
20b60 6c 74 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 70  lt : 0);.  if( p
20b70 44 61 74 61 2d 3e 66 6c 61 67 73 20 26 20 4d 45  Data->flags & ME
20b80 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 5a  M_Zero ){.    nZ
20b90 65 72 6f 20 3d 20 70 44 61 74 61 2d 3e 75 2e 6e  ero = pData->u.n
20ba0 5a 65 72 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Zero;.  }else{. 
20bb0 20 20 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20     nZero = 0;.  
20bc0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
20bd0 53 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 70  SetCachedRowid(p
20be0 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 29 3b 0a  C->pCursor, 0);.
20bf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
20c00 72 65 65 49 6e 73 65 72 74 28 70 43 2d 3e 70 43  reeInsert(pC->pC
20c10 75 72 73 6f 72 2c 20 30 2c 20 69 4b 65 79 2c 0a  ursor, 0, iKey,.
20c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c30 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 2d            pData-
20c40 3e 7a 2c 20 70 44 61 74 61 2d 3e 6e 2c 20 6e 5a  >z, pData->n, nZ
20c50 65 72 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ero,.           
20c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
20c70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
20c80 41 50 50 45 4e 44 2c 20 73 65 65 6b 52 65 73 75  APPEND, seekResu
20c90 6c 74 0a 20 20 29 3b 0a 20 20 70 43 2d 3e 72 6f  lt.  );.  pC->ro
20ca0 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a  widIsValid = 0;.
20cb0 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f    pC->deferredMo
20cc0 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43 2d 3e  veto = 0;.  pC->
20cd0 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
20ce0 43 48 45 5f 53 54 41 4c 45 3b 0a 0a 20 20 2f 2a  CHE_STALE;..  /*
20cf0 20 49 6e 76 6f 6b 65 20 74 68 65 20 75 70 64 61   Invoke the upda
20d00 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65 71 75 69  te-hook if requi
20d10 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  red. */.  if( rc
20d20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64  ==SQLITE_OK && d
20d30 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61  b->xUpdateCallba
20d40 63 6b 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 20  ck && pOp->p4.z 
20d50 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20 64 62 2d  ){.    zDb = db-
20d60 3e 61 44 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a 4e  >aDb[pC->iDb].zN
20d70 61 6d 65 3b 0a 20 20 20 20 7a 54 62 6c 20 3d 20  ame;.    zTbl = 
20d80 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 6f  pOp->p4.z;.    o
20d90 70 20 3d 20 28 28 70 4f 70 2d 3e 70 35 20 26 20  p = ((pOp->p5 & 
20da0 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 29  OPFLAG_ISUPDATE)
20db0 20 3f 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45   ? SQLITE_UPDATE
20dc0 20 3a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54   : SQLITE_INSERT
20dd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
20de0 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  C->isTable );.  
20df0 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c    db->xUpdateCal
20e00 6c 62 61 63 6b 28 64 62 2d 3e 70 55 70 64 61 74  lback(db->pUpdat
20e10 65 41 72 67 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a  eArg, op, zDb, z
20e20 54 62 6c 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20  Tbl, iKey);.    
20e30 61 73 73 65 72 74 28 20 70 43 2d 3e 69 44 62 3e  assert( pC->iDb>
20e40 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  =0 );.  }.  brea
20e50 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
20e60 20 44 65 6c 65 74 65 20 50 31 20 50 32 20 2a 20   Delete P1 P2 * 
20e70 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74  P4 *.**.** Delet
20e80 65 20 74 68 65 20 72 65 63 6f 72 64 20 61 74 20  e the record at 
20e90 77 68 69 63 68 20 74 68 65 20 50 31 20 63 75 72  which the P1 cur
20ea0 73 6f 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  sor is currently
20eb0 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
20ec0 20 54 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c   The cursor will
20ed0 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   be left pointin
20ee0 67 20 61 74 20 65 69 74 68 65 72 20 74 68 65 20  g at either the 
20ef0 6e 65 78 74 20 6f 72 20 74 68 65 20 70 72 65 76  next or the prev
20f00 69 6f 75 73 0a 2a 2a 20 72 65 63 6f 72 64 20 69  ious.** record i
20f10 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20  n the table. If 
20f20 69 74 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  it is left point
20f30 69 6e 67 20 61 74 20 74 68 65 20 6e 65 78 74 20  ing at the next 
20f40 72 65 63 6f 72 64 2c 20 74 68 65 6e 0a 2a 2a 20  record, then.** 
20f50 74 68 65 20 6e 65 78 74 20 4e 65 78 74 20 69 6e  the next Next in
20f60 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
20f70 65 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 65 6e 63  e a no-op.  Henc
20f80 65 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 64 65  e it is OK to de
20f90 6c 65 74 65 0a 2a 2a 20 61 20 72 65 63 6f 72 64  lete.** a record
20fa0 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20   from within an 
20fb0 4e 65 78 74 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a  Next loop..**.**
20fc0 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e   If the OPFLAG_N
20fd0 43 48 41 4e 47 45 20 66 6c 61 67 20 6f 66 20 50  CHANGE flag of P
20fe0 32 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  2 is set, then t
20ff0 68 65 20 72 6f 77 20 63 68 61 6e 67 65 20 63 6f  he row change co
21000 75 6e 74 20 69 73 0a 2a 2a 20 69 6e 63 72 65 6d  unt is.** increm
21010 65 6e 74 65 64 20 28 6f 74 68 65 72 77 69 73 65  ented (otherwise
21020 20 6e 6f 74 29 2e 0a 2a 2a 0a 2a 2a 20 50 31 20   not)..**.** P1 
21030 6d 75 73 74 20 6e 6f 74 20 62 65 20 70 73 65 75  must not be pseu
21040 64 6f 2d 74 61 62 6c 65 2e 20 20 49 74 20 68 61  do-table.  It ha
21050 73 20 74 6f 20 62 65 20 61 20 72 65 61 6c 20 74  s to be a real t
21060 61 62 6c 65 20 77 69 74 68 0a 2a 2a 20 6d 75 6c  able with.** mul
21070 74 69 70 6c 65 20 72 6f 77 73 2e 0a 2a 2a 0a 2a  tiple rows..**.*
21080 2a 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20 4e  * If P4 is not N
21090 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
210a0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
210b0 74 61 62 6c 65 20 74 68 61 74 20 50 31 20 69 73  table that P1 is
210c0 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e  .** pointing to.
210d0 20 20 54 68 65 20 75 70 64 61 74 65 20 68 6f 6f    The update hoo
210e0 6b 20 77 69 6c 6c 20 62 65 20 69 6e 76 6f 6b 65  k will be invoke
210f0 64 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  d, if it exists.
21100 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 6e 6f 74  .** If P4 is not
21110 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 50   NULL then the P
21120 31 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  1 cursor must ha
21130 76 65 20 62 65 65 6e 20 70 6f 73 69 74 69 6f 6e  ve been position
21140 65 64 0a 2a 2a 20 75 73 69 6e 67 20 4f 50 5f 4e  ed.** using OP_N
21150 6f 74 46 6f 75 6e 64 20 70 72 69 6f 72 20 74 6f  otFound prior to
21160 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 6f   invoking this o
21170 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  pcode..*/.case O
21180 50 5f 44 65 6c 65 74 65 3a 20 7b 0a 20 20 69 36  P_Delete: {.  i6
21190 34 20 69 4b 65 79 3b 0a 20 20 56 64 62 65 43 75  4 iKey;.  VdbeCu
211a0 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 69 4b 65  rsor *pC;..  iKe
211b0 79 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  y = 0;.  assert(
211c0 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
211d0 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
211e0 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  r );.  pC = p->a
211f0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
21200 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
21210 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
21220 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 20 20 2f  pCursor!=0 );  /
21230 2a 20 4f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72  * Only valid for
21240 20 72 65 61 6c 20 74 61 62 6c 65 73 2c 20 6e 6f   real tables, no
21250 20 70 73 65 75 64 6f 74 61 62 6c 65 73 20 2a 2f   pseudotables */
21260 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 70  ..  /* If the up
21270 64 61 74 65 2d 68 6f 6f 6b 20 77 69 6c 6c 20 62  date-hook will b
21280 65 20 69 6e 76 6f 6b 65 64 2c 20 73 65 74 20 69  e invoked, set i
21290 4b 65 79 20 74 6f 20 74 68 65 20 72 6f 77 69 64  Key to the rowid
212a0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77   of the.  ** row
212b0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a   being deleted..
212c0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78    */.  if( db->x
212d0 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26  UpdateCallback &
212e0 26 20 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20  & pOp->p4.z ){. 
212f0 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
21300 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 61 73  sTable );.    as
21310 73 65 72 74 28 20 70 43 2d 3e 72 6f 77 69 64 49  sert( pC->rowidI
21320 73 56 61 6c 69 64 20 29 3b 20 20 2f 2a 20 6c 61  sValid );  /* la
21330 73 74 52 6f 77 69 64 20 73 65 74 20 62 79 20 70  stRowid set by p
21340 72 65 76 69 6f 75 73 20 4f 50 5f 4e 6f 74 46 6f  revious OP_NotFo
21350 75 6e 64 20 2a 2f 0a 20 20 20 20 69 4b 65 79 20  und */.    iKey 
21360 3d 20 70 43 2d 3e 6c 61 73 74 52 6f 77 69 64 3b  = pC->lastRowid;
21370 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 4f  .  }..  /* The O
21380 50 5f 44 65 6c 65 74 65 20 6f 70 63 6f 64 65 20  P_Delete opcode 
21390 61 6c 77 61 79 73 20 66 6f 6c 6c 6f 77 73 20 61  always follows a
213a0 6e 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f  n OP_NotExists o
213b0 72 20 4f 50 5f 4c 61 73 74 20 6f 72 0a 20 20 2a  r OP_Last or.  *
213c0 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 6e 20 74  * OP_Column on t
213d0 68 65 20 73 61 6d 65 20 74 61 62 6c 65 20 77 69  he same table wi
213e0 74 68 6f 75 74 20 61 6e 79 20 69 6e 74 65 72 76  thout any interv
213f0 65 6e 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  ening operations
21400 20 74 68 61 74 0a 20 20 2a 2a 20 6d 69 67 68 74   that.  ** might
21410 20 6d 6f 76 65 20 6f 72 20 69 6e 76 61 6c 69 64   move or invalid
21420 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ate the cursor. 
21430 20 48 65 6e 63 65 20 63 75 72 73 6f 72 20 70 43   Hence cursor pC
21440 20 69 73 20 61 6c 77 61 79 73 20 70 6f 69 6e 74   is always point
21450 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ing.  ** to the 
21460 72 6f 77 20 74 6f 20 62 65 20 64 65 6c 65 74 65  row to be delete
21470 64 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65  d and the sqlite
21480 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
21490 6f 28 29 20 6f 70 65 72 61 74 69 6f 6e 0a 20 20  o() operation.  
214a0 2a 2a 20 62 65 6c 6f 77 20 69 73 20 61 6c 77 61  ** below is alwa
214b0 79 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 63  ys a no-op and c
214c0 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 57 65 20  annot fail.  We 
214d0 77 69 6c 6c 20 72 75 6e 20 69 74 20 61 6e 79 68  will run it anyh
214e0 6f 77 2c 20 74 68 6f 75 67 68 2c 0a 20 20 2a 2a  ow, though,.  **
214f0 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
21500 74 20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73  t future changes
21510 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
21520 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 2f 0a 20 20  erator..  **/.  
21530 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65  assert( pC->defe
21540 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
21550 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
21560 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
21570 70 43 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  pC);.  if( NEVER
21580 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc!=SQLITE_OK) 
21590 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
215a0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 73 71  _to_error;..  sq
215b0 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
215c0 68 65 64 52 6f 77 69 64 28 70 43 2d 3e 70 43 75  hedRowid(pC->pCu
215d0 72 73 6f 72 2c 20 30 29 3b 0a 20 20 72 63 20 3d  rsor, 0);.  rc =
215e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
215f0 65 74 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 29  ete(pC->pCursor)
21600 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61  ;.  pC->cacheSta
21610 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
21620 45 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  E;..  /* Invoke 
21630 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20  the update-hook 
21640 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
21650 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21660 5f 4f 4b 20 26 26 20 64 62 2d 3e 78 55 70 64 61  _OK && db->xUpda
21670 74 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 70 4f  teCallback && pO
21680 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20 20 63  p->p4.z ){.    c
21690 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
216a0 20 64 62 2d 3e 61 44 62 5b 70 43 2d 3e 69 44 62   db->aDb[pC->iDb
216b0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
216c0 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20  st char *zTbl = 
216d0 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 64  pOp->p4.z;.    d
216e0 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61  b->xUpdateCallba
216f0 63 6b 28 64 62 2d 3e 70 55 70 64 61 74 65 41 72  ck(db->pUpdateAr
21700 67 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  g, SQLITE_DELETE
21710 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65  , zDb, zTbl, iKe
21720 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
21730 70 43 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20  pC->iDb>=0 );.  
21740 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20  }.  if( pOp->p2 
21750 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45  & OPFLAG_NCHANGE
21760 20 29 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b   ) p->nChange++;
21770 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 2f 2a 20 4f  .  break;.}./* O
21780 70 63 6f 64 65 3a 20 52 65 73 65 74 43 6f 75 6e  pcode: ResetCoun
21790 74 20 2a 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  t * * * * *.**.*
217a0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * The value of t
217b0 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
217c0 72 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74  r is copied to t
217d0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
217e0 6c 65 0a 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75  le.** change cou
217f0 6e 74 65 72 20 28 72 65 74 75 72 6e 65 64 20 62  nter (returned b
21800 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
21810 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 68  ls to sqlite3_ch
21820 61 6e 67 65 73 28 29 29 2e 0a 2a 2a 20 54 68 65  anges())..** The
21830 6e 20 74 68 65 20 56 4d 73 20 69 6e 74 65 72 6e  n the VMs intern
21840 61 6c 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  al change counte
21850 72 20 72 65 73 65 74 73 20 74 6f 20 30 2e 0a 2a  r resets to 0..*
21860 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62  * This is used b
21870 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  y trigger progra
21880 6d 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  ms..*/.case OP_R
21890 65 73 65 74 43 6f 75 6e 74 3a 20 7b 0a 20 20 73  esetCount: {.  s
218a0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
218b0 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
218c0 6e 67 65 29 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e  nge);.  p->nChan
218d0 67 65 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b  ge = 0;.  break;
218e0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .}../* Opcode: S
218f0 6f 72 74 65 72 43 6f 6d 70 61 72 65 20 50 31 20  orterCompare P1 
21900 50 32 20 50 33 0a 2a 2a 0a 2a 2a 20 50 31 20 69  P2 P3.**.** P1 i
21910 73 20 61 20 73 6f 72 74 65 72 20 63 75 72 73 6f  s a sorter curso
21920 72 2e 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  r. This instruct
21930 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
21940 20 72 65 63 6f 72 64 20 62 6c 6f 62 20 69 6e 20   record blob in 
21950 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 33 20  .** register P3 
21960 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74  with the entry t
21970 68 61 74 20 74 68 65 20 73 6f 72 74 65 72 20 63  hat the sorter c
21980 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
21990 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 20 49 66  points to..** If
219a0 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20  , excluding the 
219b0 72 6f 77 69 64 20 66 69 65 6c 64 73 20 61 74 20  rowid fields at 
219c0 74 68 65 20 65 6e 64 2c 20 74 68 65 20 74 77 6f  the end, the two
219d0 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 20 6d   records are a m
219e0 61 74 63 68 2c 0a 2a 2a 20 66 61 6c 6c 20 74 68  atch,.** fall th
219f0 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
21a00 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 4f  t instruction. O
21a10 74 68 65 72 77 69 73 65 2c 20 6a 75 6d 70 20 74  therwise, jump t
21a20 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32  o instruction P2
21a30 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72  ..*/.case OP_Sor
21a40 74 65 72 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20  terCompare: {.  
21a50 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
21a60 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 70 43    int res;..  pC
21a70 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
21a80 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
21a90 69 73 53 6f 72 74 65 72 28 70 43 29 20 29 3b 0a  isSorter(pC) );.
21aa0 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
21ab0 4f 70 2d 3e 70 33 5d 3b 0a 20 20 72 63 20 3d 20  Op->p3];.  rc = 
21ac0 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
21ad0 72 43 6f 6d 70 61 72 65 28 70 43 2c 20 70 49 6e  rCompare(pC, pIn
21ae0 33 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20  3, &res);.  if( 
21af0 72 65 73 20 29 7b 0a 20 20 20 20 70 63 20 3d 20  res ){.    pc = 
21b00 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d 0a 20  pOp->p2-1;.  }. 
21b10 20 62 72 65 61 6b 3b 0a 7d 3b 0a 0a 2f 2a 20 4f   break;.};../* O
21b20 70 63 6f 64 65 3a 20 53 6f 72 74 65 72 44 61 74  pcode: SorterDat
21b30 61 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  a P1 P2 * * *.**
21b40 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 72  .** Write into r
21b50 65 67 69 73 74 65 72 20 50 32 20 74 68 65 20 63  egister P2 the c
21b60 75 72 72 65 6e 74 20 73 6f 72 74 65 72 20 64 61  urrent sorter da
21b70 74 61 20 66 6f 72 20 73 6f 72 74 65 72 20 63 75  ta for sorter cu
21b80 72 73 6f 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65  rsor P1..*/.case
21b90 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 3a 20   OP_SorterData: 
21ba0 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
21bb0 70 43 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  pC;.#ifndef SQLI
21bc0 54 45 5f 4f 4d 49 54 5f 4d 45 52 47 45 5f 53 4f  TE_OMIT_MERGE_SO
21bd0 52 54 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65  RT.  pOut = &aMe
21be0 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 43  m[pOp->p2];.  pC
21bf0 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
21c00 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
21c10 70 43 2d 3e 69 73 53 6f 72 74 65 72 20 29 3b 0a  pC->isSorter );.
21c20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
21c30 62 65 53 6f 72 74 65 72 52 6f 77 6b 65 79 28 70  beSorterRowkey(p
21c40 43 2c 20 70 4f 75 74 29 3b 0a 23 65 6c 73 65 0a  C, pOut);.#else.
21c50 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
21c60 4f 50 5f 52 6f 77 4b 65 79 3b 0a 20 20 70 63 2d  OP_RowKey;.  pc-
21c70 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 62 72 65 61  -;.#endif.  brea
21c80 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
21c90 20 52 6f 77 44 61 74 61 20 50 31 20 50 32 20 2a   RowData P1 P2 *
21ca0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65   * *.**.** Write
21cb0 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
21cc0 32 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72  2 the complete r
21cd0 6f 77 20 64 61 74 61 20 66 6f 72 20 63 75 72 73  ow data for curs
21ce0 6f 72 20 50 31 2e 0a 2a 2a 20 54 68 65 72 65 20  or P1..** There 
21cf0 69 73 20 6e 6f 20 69 6e 74 65 72 70 72 65 74 61  is no interpreta
21d00 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
21d10 2e 20 20 0a 2a 2a 20 49 74 20 69 73 20 6a 75 73  .  .** It is jus
21d20 74 20 63 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68  t copied onto th
21d30 65 20 50 32 20 72 65 67 69 73 74 65 72 20 65 78  e P2 register ex
21d40 61 63 74 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20  actly as .** it 
21d50 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  is found in the 
21d60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21d70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 63  *.** If the P1 c
21d80 75 72 73 6f 72 20 6d 75 73 74 20 62 65 20 70 6f  ursor must be po
21d90 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69  inting to a vali
21da0 64 20 72 6f 77 20 28 6e 6f 74 20 61 20 4e 55 4c  d row (not a NUL
21db0 4c 20 72 6f 77 29 0a 2a 2a 20 6f 66 20 61 20 72  L row).** of a r
21dc0 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  eal table, not a
21dd0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a   pseudo-table..*
21de0 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77  /./* Opcode: Row
21df0 4b 65 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  Key P1 P2 * * *.
21e00 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f  **.** Write into
21e10 20 72 65 67 69 73 74 65 72 20 50 32 20 74 68 65   register P2 the
21e20 20 63 6f 6d 70 6c 65 74 65 20 72 6f 77 20 6b 65   complete row ke
21e30 79 20 66 6f 72 20 63 75 72 73 6f 72 20 50 31 2e  y for cursor P1.
21e40 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20  .** There is no 
21e50 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20 6f  interpretation o
21e60 66 20 74 68 65 20 64 61 74 61 2e 20 20 0a 2a 2a  f the data.  .**
21e70 20 54 68 65 20 6b 65 79 20 69 73 20 63 6f 70 69   The key is copi
21e80 65 64 20 6f 6e 74 6f 20 74 68 65 20 50 33 20 72  ed onto the P3 r
21e90 65 67 69 73 74 65 72 20 65 78 61 63 74 6c 79 20  egister exactly 
21ea0 61 73 20 0a 2a 2a 20 69 74 20 69 73 20 66 6f 75  as .** it is fou
21eb0 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nd in the databa
21ec0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
21ed0 66 20 74 68 65 20 50 31 20 63 75 72 73 6f 72 20  f the P1 cursor 
21ee0 6d 75 73 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  must be pointing
21ef0 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 20   to a valid row 
21f00 28 6e 6f 74 20 61 20 4e 55 4c 4c 20 72 6f 77 29  (not a NULL row)
21f10 0a 2a 2a 20 6f 66 20 61 20 72 65 61 6c 20 74 61  .** of a real ta
21f20 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65 75 64  ble, not a pseud
21f30 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65  o-table..*/.case
21f40 20 4f 50 5f 52 6f 77 4b 65 79 3a 0a 63 61 73 65   OP_RowKey:.case
21f50 20 4f 50 5f 52 6f 77 44 61 74 61 3a 20 7b 0a 20   OP_RowData: {. 
21f60 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
21f70 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72  .  BtCursor *pCr
21f80 73 72 3b 0a 20 20 75 33 32 20 6e 3b 0a 20 20 69  sr;.  u32 n;.  i
21f90 36 34 20 6e 36 34 3b 0a 0a 20 20 70 4f 75 74 20  64 n64;..  pOut 
21fa0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
21fb0 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68  ;.  memAboutToCh
21fc0 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 0a  ange(p, pOut);..
21fd0 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 52    /* Note that R
21fe0 6f 77 4b 65 79 20 61 6e 64 20 52 6f 77 44 61 74  owKey and RowDat
21ff0 61 20 61 72 65 20 72 65 61 6c 6c 79 20 65 78 61  a are really exa
22000 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 69 6e  ctly the same in
22010 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 61  struction */.  a
22020 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
22030 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
22040 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
22050 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
22060 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
22070 43 2d 3e 69 73 53 6f 72 74 65 72 3d 3d 30 20 29  C->isSorter==0 )
22080 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
22090 69 73 54 61 62 6c 65 20 7c 7c 20 70 4f 70 2d 3e  isTable || pOp->
220a0 6f 70 63 6f 64 65 21 3d 4f 50 5f 52 6f 77 44 61  opcode!=OP_RowDa
220b0 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
220c0 70 43 2d 3e 69 73 49 6e 64 65 78 20 7c 7c 20 70  pC->isIndex || p
220d0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
220e0 6f 77 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  owData );.  asse
220f0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
22100 73 73 65 72 74 28 20 70 43 2d 3e 6e 75 6c 6c 52  ssert( pC->nullR
22110 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
22120 74 28 20 70 43 2d 3e 70 73 65 75 64 6f 54 61 62  t( pC->pseudoTab
22130 6c 65 52 65 67 3d 3d 30 20 29 3b 0a 20 20 61 73  leReg==0 );.  as
22140 73 65 72 74 28 20 21 70 43 2d 3e 69 73 53 6f 72  sert( !pC->isSor
22150 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ter );.  assert(
22160 20 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20   pC->pCursor!=0 
22170 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d  );.  pCrsr = pC-
22180 3e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65  >pCursor;.  asse
22190 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
221a0 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
221b0 72 73 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  rsr) );..  /* Th
221c0 65 20 4f 50 5f 52 6f 77 4b 65 79 20 61 6e 64 20  e OP_RowKey and 
221d0 4f 50 5f 52 6f 77 44 61 74 61 20 6f 70 63 6f 64  OP_RowData opcod
221e0 65 73 20 61 6c 77 61 79 73 20 66 6f 6c 6c 6f 77  es always follow
221f0 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f 72   OP_NotExists or
22200 0a 20 20 2a 2a 20 4f 50 5f 52 65 77 69 6e 64 2f  .  ** OP_Rewind/
22210 4f 70 5f 4e 65 78 74 20 77 69 74 68 20 6e 6f 20  Op_Next with no 
22220 69 6e 74 65 72 76 65 6e 69 6e 67 20 69 6e 73 74  intervening inst
22230 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 69  ructions that mi
22240 67 68 74 20 69 6e 76 61 6c 69 64 61 74 65 0a 20  ght invalidate. 
22250 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 2e 20   ** the cursor. 
22260 20 48 65 6e 63 65 20 74 68 65 20 66 6f 6c 6c 6f   Hence the follo
22270 77 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  wing sqlite3Vdbe
22280 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29 20 63  CursorMoveto() c
22290 61 6c 6c 20 69 73 20 61 6c 77 61 79 73 0a 20 20  all is always.  
222a0 2a 2a 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 63  ** a no-op and c
222b0 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 20  an never fail.  
222c0 42 75 74 20 77 65 20 6c 65 61 76 65 20 69 74 20  But we leave it 
222d0 69 6e 20 70 6c 61 63 65 20 61 73 20 61 20 73 61  in place as a sa
222e0 66 65 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  fety..  */.  ass
222f0 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65  ert( pC->deferre
22300 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20  dMoveto==0 );.  
22310 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
22320 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29  CursorMoveto(pC)
22330 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 72 63  ;.  if( NEVER(rc
22340 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 20 67  !=SQLITE_OK) ) g
22350 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
22360 5f 65 72 72 6f 72 3b 0a 0a 20 20 69 66 28 20 70  _error;..  if( p
22370 43 2d 3e 69 73 49 6e 64 65 78 20 29 7b 0a 20 20  C->isIndex ){.  
22380 20 20 61 73 73 65 72 74 28 20 21 70 43 2d 3e 69    assert( !pC->i
22390 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 56 56  sTable );.    VV
223a0 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c  A_ONLY(rc =) sql
223b0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
223c0 28 70 43 72 73 72 2c 20 26 6e 36 34 29 3b 0a 20  (pCrsr, &n64);. 
223d0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
223e0 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f  QLITE_OK );    /
223f0 2a 20 54 72 75 65 20 62 65 63 61 75 73 65 20 6f  * True because o
22400 66 20 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29  f CursorMoveto()
22410 20 63 61 6c 6c 20 61 62 6f 76 65 20 2a 2f 0a 20   call above */. 
22420 20 20 20 69 66 28 20 6e 36 34 3e 64 62 2d 3e 61     if( n64>db->a
22430 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
22440 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
22450 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67      goto too_big
22460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
22470 28 75 33 32 29 6e 36 34 3b 0a 20 20 7d 65 6c 73  (u32)n64;.  }els
22480 65 7b 0a 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28  e{.    VVA_ONLY(
22490 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72  rc =) sqlite3Btr
224a0 65 65 44 61 74 61 53 69 7a 65 28 70 43 72 73 72  eeDataSize(pCrsr
224b0 2c 20 26 6e 29 3b 0a 20 20 20 20 61 73 73 65 72  , &n);.    asser
224c0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
224d0 20 29 3b 20 20 20 20 2f 2a 20 44 61 74 61 53 69   );    /* DataSi
224e0 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  ze() cannot fail
224f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 3e 28 75   */.    if( n>(u
22500 33 32 29 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  32)db->aLimit[SQ
22510 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
22520 48 5d 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  H] ){.      goto
22530 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20 20 7d 0a   too_big;.    }.
22540 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
22550 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4f 75  3VdbeMemGrow(pOu
22560 74 2c 20 6e 2c 20 30 29 20 29 7b 0a 20 20 20 20  t, n, 0) ){.    
22570 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
22580 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 6e 3b 0a  .  pOut->n = n;.
22590 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
225a0 28 70 4f 75 74 2c 20 4d 45 4d 5f 42 6c 6f 62 29  (pOut, MEM_Blob)
225b0 3b 0a 20 20 69 66 28 20 70 43 2d 3e 69 73 49 6e  ;.  if( pC->isIn
225c0 64 65 78 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  dex ){.    rc = 
225d0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
225e0 70 43 72 73 72 2c 20 30 2c 20 6e 2c 20 70 4f 75  pCrsr, 0, n, pOu
225f0 74 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t->z);.  }else{.
22600 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22610 42 74 72 65 65 44 61 74 61 28 70 43 72 73 72 2c  BtreeData(pCrsr,
22620 20 30 2c 20 6e 2c 20 70 4f 75 74 2d 3e 7a 29 3b   0, n, pOut->z);
22630 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 65 6e 63  .  }.  pOut->enc
22640 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 20   = SQLITE_UTF8; 
22650 20 2f 2a 20 49 6e 20 63 61 73 65 20 74 68 65 20   /* In case the 
22660 62 6c 6f 62 20 69 73 20 65 76 65 72 20 63 61 73  blob is ever cas
22670 74 20 74 6f 20 74 65 78 74 20 2a 2f 0a 20 20 55  t to text */.  U
22680 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49  PDATE_MAX_BLOBSI
22690 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61  ZE(pOut);.  brea
226a0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
226b0 20 52 6f 77 69 64 20 50 31 20 50 32 20 2a 20 2a   Rowid P1 P2 * *
226c0 20 2a 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 69   *.**.** Store i
226d0 6e 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e  n register P2 an
226e0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
226f0 73 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  s the key of the
22700 20 74 61 62 6c 65 20 65 6e 74 72 79 20 74 68 61   table entry tha
22710 74 0a 2a 2a 20 50 31 20 69 73 20 63 75 72 72 65  t.** P1 is curre
22720 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f 2e 0a 2a  ntly point to..*
22730 2a 0a 2a 2a 20 50 31 20 63 61 6e 20 62 65 20 65  *.** P1 can be e
22740 69 74 68 65 72 20 61 6e 20 6f 72 64 69 6e 61 72  ither an ordinar
22750 79 20 74 61 62 6c 65 20 6f 72 20 61 20 76 69 72  y table or a vir
22760 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65  tual table.  The
22770 72 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 62 65  re used to.** be
22780 20 61 20 73 65 70 61 72 61 74 65 20 4f 50 5f 56   a separate OP_V
22790 52 6f 77 69 64 20 6f 70 63 6f 64 65 20 66 6f 72  Rowid opcode for
227a0 20 75 73 65 20 77 69 74 68 20 76 69 72 74 75 61   use with virtua
227b0 6c 20 74 61 62 6c 65 73 2c 20 62 75 74 20 74 68  l tables, but th
227c0 69 73 0a 2a 2a 20 6f 6e 65 20 6f 70 63 6f 64 65  is.** one opcode
227d0 20 6e 6f 77 20 77 6f 72 6b 73 20 66 6f 72 20 62   now works for b
227e0 6f 74 68 20 74 61 62 6c 65 20 74 79 70 65 73 2e  oth table types.
227f0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 69  .*/.case OP_Rowi
22800 64 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  d: {            
22810 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65       /* out2-pre
22820 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 56 64 62  release */.  Vdb
22830 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69  eCursor *pC;.  i
22840 36 34 20 76 3b 0a 20 20 73 71 6c 69 74 65 33 5f  64 v;.  sqlite3_
22850 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 63  vtab *pVtab;.  c
22860 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
22870 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 0a 20  ule *pModule;.. 
22880 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
22890 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
228a0 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
228b0 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
228c0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
228d0 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
228e0 72 74 28 20 70 43 2d 3e 70 73 65 75 64 6f 54 61  rt( pC->pseudoTa
228f0 62 6c 65 52 65 67 3d 3d 30 20 29 3b 0a 20 20 69  bleReg==0 );.  i
22900 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29  f( pC->nullRow )
22910 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67  {.    pOut->flag
22920 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
22930 20 20 62 72 65 61 6b 3b 0a 20 20 7d 65 6c 73 65    break;.  }else
22940 20 69 66 28 20 70 43 2d 3e 64 65 66 65 72 72 65   if( pC->deferre
22950 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 76  dMoveto ){.    v
22960 20 3d 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72   = pC->movetoTar
22970 67 65 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  get;.#ifndef SQL
22980 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
22990 54 41 42 4c 45 0a 20 20 7d 65 6c 73 65 20 69 66  TABLE.  }else if
229a0 28 20 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f  ( pC->pVtabCurso
229b0 72 20 29 7b 0a 20 20 20 20 70 56 74 61 62 20 3d  r ){.    pVtab =
229c0 20 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f 72   pC->pVtabCursor
229d0 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 70 4d 6f  ->pVtab;.    pMo
229e0 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d  dule = pVtab->pM
229f0 6f 64 75 6c 65 3b 0a 20 20 20 20 61 73 73 65 72  odule;.    asser
22a00 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 6f 77  t( pModule->xRow
22a10 69 64 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  id );.    rc = p
22a20 4d 6f 64 75 6c 65 2d 3e 78 52 6f 77 69 64 28 70  Module->xRowid(p
22a30 43 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 2c 20  C->pVtabCursor, 
22a40 26 76 29 3b 0a 20 20 20 20 69 6d 70 6f 72 74 56  &v);.    importV
22a50 74 61 62 45 72 72 4d 73 67 28 70 2c 20 70 56 74  tabErrMsg(p, pVt
22a60 61 62 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ab);.#endif /* S
22a70 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
22a80 41 4c 54 41 42 4c 45 20 2a 2f 0a 20 20 7d 65 6c  ALTABLE */.  }el
22a90 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
22aa0 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29  pC->pCursor!=0 )
22ab0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
22ac0 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
22ad0 74 6f 28 70 43 29 3b 0a 20 20 20 20 69 66 28 20  to(pC);.    if( 
22ae0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
22af0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
22b00 20 20 69 66 28 20 70 43 2d 3e 72 6f 77 69 64 49    if( pC->rowidI
22b10 73 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  sValid ){.      
22b20 76 20 3d 20 70 43 2d 3e 6c 61 73 74 52 6f 77 69  v = pC->lastRowi
22b30 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  d;.    }else{.  
22b40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22b50 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 2d  BtreeKeySize(pC-
22b60 3e 70 43 75 72 73 6f 72 2c 20 26 76 29 3b 0a 20  >pCursor, &v);. 
22b70 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
22b80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f  =SQLITE_OK );  /
22b90 2a 20 41 6c 77 61 79 73 20 73 6f 20 62 65 63 61  * Always so beca
22ba0 75 73 65 20 6f 66 20 43 75 72 73 6f 72 4d 6f 76  use of CursorMov
22bb0 65 74 6f 28 29 20 61 62 6f 76 65 20 2a 2f 0a 20  eto() above */. 
22bc0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4f 75 74 2d     }.  }.  pOut-
22bd0 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 62 72 65 61  >u.i = v;.  brea
22be0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
22bf0 20 4e 75 6c 6c 52 6f 77 20 50 31 20 2a 20 2a 20   NullRow P1 * * 
22c00 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74  * *.**.** Move t
22c10 68 65 20 63 75 72 73 6f 72 20 50 31 20 74 6f 20  he cursor P1 to 
22c20 61 20 6e 75 6c 6c 20 72 6f 77 2e 20 20 41 6e 79  a null row.  Any
22c30 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 65 72 61   OP_Column opera
22c40 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 6f 63  tions.** that oc
22c50 63 75 72 20 77 68 69 6c 65 20 74 68 65 20 63 75  cur while the cu
22c60 72 73 6f 72 20 69 73 20 6f 6e 20 74 68 65 20 6e  rsor is on the n
22c70 75 6c 6c 20 72 6f 77 20 77 69 6c 6c 20 61 6c 77  ull row will alw
22c80 61 79 73 0a 2a 2a 20 77 72 69 74 65 20 61 20 4e  ays.** write a N
22c90 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ULL..*/.case OP_
22ca0 4e 75 6c 6c 52 6f 77 3a 20 7b 0a 20 20 56 64 62  NullRow: {.  Vdb
22cb0 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20  eCursor *pC;..  
22cc0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
22cd0 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
22ce0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
22cf0 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
22d00 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
22d10 70 43 21 3d 30 20 29 3b 0a 20 20 70 43 2d 3e 6e  pC!=0 );.  pC->n
22d20 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43  ullRow = 1;.  pC
22d30 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d  ->rowidIsValid =
22d40 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   0;.  assert( pC
22d50 2d 3e 70 43 75 72 73 6f 72 20 7c 7c 20 70 43 2d  ->pCursor || pC-
22d60 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 3b 0a  >pVtabCursor );.
22d70 20 20 69 66 28 20 70 43 2d 3e 70 43 75 72 73 6f    if( pC->pCurso
22d80 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
22d90 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
22da0 28 70 43 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20  (pC->pCursor);. 
22db0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
22dc0 2a 20 4f 70 63 6f 64 65 3a 20 4c 61 73 74 20 50  * Opcode: Last P
22dd0 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
22de0 20 54 68 65 20 6e 65 78 74 20 75 73 65 20 6f 66   The next use of
22df0 20 74 68 65 20 52 6f 77 69 64 20 6f 72 20 43 6f   the Rowid or Co
22e00 6c 75 6d 6e 20 6f 72 20 4e 65 78 74 20 69 6e 73  lumn or Next ins
22e10 74 72 75 63 74 69 6f 6e 20 66 6f 72 20 50 31 20  truction for P1 
22e20 0a 2a 2a 20 77 69 6c 6c 20 72 65 66 65 72 20 74  .** will refer t
22e30 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
22e40 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
22e50 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e   table or index.
22e60 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
22e70 20 6f 72 20 69 6e 64 65 78 20 69 73 20 65 6d 70   or index is emp
22e80 74 79 20 61 6e 64 20 50 32 3e 30 2c 20 74 68 65  ty and P2>0, the
22e90 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  n jump immediate
22ea0 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 20 49 66 20  ly to P2..** If 
22eb0 50 32 20 69 73 20 30 20 6f 72 20 69 66 20 74 68  P2 is 0 or if th
22ec0 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
22ed0 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 66   is not empty, f
22ee0 61 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74  all through.** t
22ef0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
22f00 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
22f10 63 61 73 65 20 4f 50 5f 4c 61 73 74 3a 20 7b 20  case OP_Last: { 
22f20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
22f30 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
22f40 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  pC;.  BtCursor *
22f50 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73  pCrsr;.  int res
22f60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
22f70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
22f80 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
22f90 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
22fa0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
22fb0 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
22fc0 70 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72  pCrsr = pC->pCur
22fd0 73 6f 72 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a  sor;.  res = 0;.
22fe0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 72    if( ALWAYS(pCr
22ff0 73 72 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 63  sr!=0) ){.    rc
23000 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c   = sqlite3BtreeL
23010 61 73 74 28 70 43 72 73 72 2c 20 26 72 65 73 29  ast(pCrsr, &res)
23020 3b 0a 20 20 7d 0a 20 20 70 43 2d 3e 6e 75 6c 6c  ;.  }.  pC->null
23030 52 6f 77 20 3d 20 28 75 38 29 72 65 73 3b 0a 20  Row = (u8)res;. 
23040 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
23050 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 72  eto = 0;.  pC->r
23060 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b  owidIsValid = 0;
23070 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74  .  pC->cacheStat
23080 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
23090 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e  ;.  if( pOp->p2>
230a0 30 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  0 && res ){.    
230b0 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
230c0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
230d0 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f  .../* Opcode: So
230e0 72 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  rt P1 P2 * * *.*
230f0 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
23100 20 64 6f 65 73 20 65 78 61 63 74 6c 79 20 74 68   does exactly th
23110 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
23120 4f 50 5f 52 65 77 69 6e 64 20 65 78 63 65 70 74  OP_Rewind except
23130 20 74 68 61 74 0a 2a 2a 20 69 74 20 69 6e 63 72   that.** it incr
23140 65 6d 65 6e 74 73 20 61 6e 20 75 6e 64 6f 63 75  ements an undocu
23150 6d 65 6e 74 65 64 20 67 6c 6f 62 61 6c 20 76 61  mented global va
23160 72 69 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20  riable used for 
23170 74 65 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 53  testing..**.** S
23180 6f 72 74 69 6e 67 20 69 73 20 61 63 63 6f 6d 70  orting is accomp
23190 6c 69 73 68 65 64 20 62 79 20 77 72 69 74 69 6e  lished by writin
231a0 67 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 61  g records into a
231b0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 0a   sorting index,.
231c0 2a 2a 20 74 68 65 6e 20 72 65 77 69 6e 64 69 6e  ** then rewindin
231d0 67 20 74 68 61 74 20 69 6e 64 65 78 20 61 6e 64  g that index and
231e0 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b   playing it back
231f0 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20   from beginning 
23200 74 6f 0a 2a 2a 20 65 6e 64 2e 20 20 57 65 20 75  to.** end.  We u
23210 73 65 20 74 68 65 20 4f 50 5f 53 6f 72 74 20 6f  se the OP_Sort o
23220 70 63 6f 64 65 20 69 6e 73 74 65 61 64 20 6f 66  pcode instead of
23230 20 4f 50 5f 52 65 77 69 6e 64 20 74 6f 20 64 6f   OP_Rewind to do
23240 20 74 68 65 0a 2a 2a 20 72 65 77 69 6e 64 69 6e   the.** rewindin
23250 67 20 73 6f 20 74 68 61 74 20 74 68 65 20 67 6c  g so that the gl
23260 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 77 69  obal variable wi
23270 6c 6c 20 62 65 20 69 6e 63 72 65 6d 65 6e 74 65  ll be incremente
23280 64 20 61 6e 64 0a 2a 2a 20 72 65 67 72 65 73 73  d and.** regress
23290 69 6f 6e 20 74 65 73 74 73 20 63 61 6e 20 64 65  ion tests can de
232a0 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
232b0 6f 72 20 6e 6f 74 20 74 68 65 20 6f 70 74 69 6d  or not the optim
232c0 69 7a 65 72 20 69 73 0a 2a 2a 20 63 6f 72 72 65  izer is.** corre
232d0 63 74 6c 79 20 6f 70 74 69 6d 69 7a 69 6e 67 20  ctly optimizing 
232e0 6f 75 74 20 73 6f 72 74 73 2e 0a 2a 2f 0a 63 61  out sorts..*/.ca
232f0 73 65 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  se OP_SorterSort
23300 3a 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a  :    /* jump */.
23310 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
23320 49 54 5f 4d 45 52 47 45 5f 53 4f 52 54 0a 20 20  IT_MERGE_SORT.  
23330 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
23340 5f 53 6f 72 74 3b 0a 23 65 6e 64 69 66 0a 63 61  _Sort;.#endif.ca
23350 73 65 20 4f 50 5f 53 6f 72 74 3a 20 7b 20 20 20  se OP_Sort: {   
23360 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
23370 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
23380 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 6f 72  ST.  sqlite3_sor
23390 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c  t_count++;.  sql
233a0 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
233b0 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d  t--;.#endif.  p-
233c0 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45  >aCounter[SQLITE
233d0 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54  _STMTSTATUS_SORT
233e0 2d 31 5d 2b 2b 3b 0a 20 20 2f 2a 20 46 61 6c 6c  -1]++;.  /* Fall
233f0 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50   through into OP
23400 5f 52 65 77 69 6e 64 20 2a 2f 0a 7d 0a 2f 2a 20  _Rewind */.}./* 
23410 4f 70 63 6f 64 65 3a 20 52 65 77 69 6e 64 20 50  Opcode: Rewind P
23420 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
23430 20 54 68 65 20 6e 65 78 74 20 75 73 65 20 6f 66   The next use of
23440 20 74 68 65 20 52 6f 77 69 64 20 6f 72 20 43 6f   the Rowid or Co
23450 6c 75 6d 6e 20 6f 72 20 4e 65 78 74 20 69 6e 73  lumn or Next ins
23460 74 72 75 63 74 69 6f 6e 20 66 6f 72 20 50 31 20  truction for P1 
23470 0a 2a 2a 20 77 69 6c 6c 20 72 65 66 65 72 20 74  .** will refer t
23480 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
23490 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
234a0 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
234b0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c  ..** If the tabl
234c0 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20 65 6d  e or index is em
234d0 70 74 79 20 61 6e 64 20 50 32 3e 30 2c 20 74 68  pty and P2>0, th
234e0 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  en jump immediat
234f0 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 20 49 66  ely to P2..** If
23500 20 50 32 20 69 73 20 30 20 6f 72 20 69 66 20 74   P2 is 0 or if t
23510 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
23520 78 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20  x is not empty, 
23530 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a 20  fall through.** 
23540 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
23550 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
23560 0a 63 61 73 65 20 4f 50 5f 52 65 77 69 6e 64 3a  .case OP_Rewind:
23570 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
23580 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  p */.  VdbeCurso
23590 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f  r *pC;.  BtCurso
235a0 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20  r *pCrsr;.  int 
235b0 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  res;..  assert( 
235c0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
235d0 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
235e0 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
235f0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
23600 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
23610 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69  .  assert( pC->i
23620 73 53 6f 72 74 65 72 3d 3d 28 70 4f 70 2d 3e 6f  sSorter==(pOp->o
23630 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72  pcode==OP_Sorter
23640 53 6f 72 74 29 20 29 3b 0a 20 20 72 65 73 20 3d  Sort) );.  res =
23650 20 31 3b 0a 20 20 69 66 28 20 69 73 53 6f 72 74   1;.  if( isSort
23660 65 72 28 70 43 29 20 29 7b 0a 20 20 20 20 72 63  er(pC) ){.    rc
23670 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f   = sqlite3VdbeSo
23680 72 74 65 72 52 65 77 69 6e 64 28 64 62 2c 20 70  rterRewind(db, p
23690 43 2c 20 26 72 65 73 29 3b 0a 20 20 7d 65 6c 73  C, &res);.  }els
236a0 65 7b 0a 20 20 20 20 70 43 72 73 72 20 3d 20 70  e{.    pCrsr = p
236b0 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20  C->pCursor;.    
236c0 61 73 73 65 72 74 28 20 70 43 72 73 72 20 29 3b  assert( pCrsr );
236d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
236e0 33 42 74 72 65 65 46 69 72 73 74 28 70 43 72 73  3BtreeFirst(pCrs
236f0 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 70 43  r, &res);.    pC
23700 2d 3e 61 74 46 69 72 73 74 20 3d 20 72 65 73 3d  ->atFirst = res=
23710 3d 30 20 3f 31 3a 30 3b 0a 20 20 20 20 70 43 2d  =0 ?1:0;.    pC-
23720 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
23730 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63  = 0;.    pC->cac
23740 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
23750 5f 53 54 41 4c 45 3b 0a 20 20 20 20 70 43 2d 3e  _STALE;.    pC->
23760 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30  rowidIsValid = 0
23770 3b 0a 20 20 7d 0a 20 20 70 43 2d 3e 6e 75 6c 6c  ;.  }.  pC->null
23780 52 6f 77 20 3d 20 28 75 38 29 72 65 73 3b 0a 20  Row = (u8)res;. 
23790 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
237a0 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 70 2d  >0 && pOp->p2<p-
237b0 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 72 65  >nOp );.  if( re
237c0 73 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f  s ){.    pc = pO
237d0 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20  p->p2 - 1;.  }. 
237e0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
237f0 63 6f 64 65 3a 20 4e 65 78 74 20 50 31 20 50 32  code: Next P1 P2
23800 20 2a 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 41   * P4 P5.**.** A
23810 64 76 61 6e 63 65 20 63 75 72 73 6f 72 20 50 31  dvance cursor P1
23820 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
23830 74 73 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6b  ts to the next k
23840 65 79 2f 64 61 74 61 20 70 61 69 72 20 69 6e 20  ey/data pair in 
23850 69 74 73 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20  its.** table or 
23860 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 72 65  index.  If there
23870 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6b 65 79   are no more key
23880 2f 76 61 6c 75 65 20 70 61 69 72 73 20 74 68 65  /value pairs the
23890 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 2a  n fall through.*
238a0 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * to the followi
238b0 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ng instruction. 
238c0 20 42 75 74 20 69 66 20 74 68 65 20 63 75 72 73   But if the curs
238d0 6f 72 20 61 64 76 61 6e 63 65 20 77 61 73 20 73  or advance was s
238e0 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 6a 75  uccessful,.** ju
238f0 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
23900 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o P2..**.** The 
23910 50 31 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  P1 cursor must b
23920 65 20 66 6f 72 20 61 20 72 65 61 6c 20 74 61 62  e for a real tab
23930 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65 75 64 6f  le, not a pseudo
23940 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 50 34  -table..**.** P4
23950 20 69 73 20 61 6c 77 61 79 73 20 6f 66 20 74 79   is always of ty
23960 70 65 20 50 34 5f 41 44 56 41 4e 43 45 2e 20 54  pe P4_ADVANCE. T
23970 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  he function poin
23980 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
23990 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
239a0 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35  t()..**.** If P5
239b0 20 69 73 20 70 6f 73 69 74 69 76 65 20 61 6e 64   is positive and
239c0 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
239d0 65 6e 2c 20 74 68 65 6e 20 65 76 65 6e 74 20 63  en, then event c
239e0 6f 75 6e 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72  ounter.** number
239f0 20 50 35 2d 31 20 69 6e 20 74 68 65 20 70 72 65   P5-1 in the pre
23a00 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
23a10 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
23a20 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
23a30 50 72 65 76 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  Prev.*/./* Opcod
23a40 65 3a 20 50 72 65 76 20 50 31 20 50 32 20 2a 20  e: Prev P1 P2 * 
23a50 2a 20 50 35 0a 2a 2a 0a 2a 2a 20 42 61 63 6b 20  * P5.**.** Back 
23a60 75 70 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20  up cursor P1 so 
23a70 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
23a80 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6b  o the previous k
23a90 65 79 2f 64 61 74 61 20 70 61 69 72 20 69 6e 20  ey/data pair in 
23aa0 69 74 73 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20  its.** table or 
23ab0 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 72 65  index.  If there
23ac0 20 69 73 20 6e 6f 20 70 72 65 76 69 6f 75 73 20   is no previous 
23ad0 6b 65 79 2f 76 61 6c 75 65 20 70 61 69 72 73 20  key/value pairs 
23ae0 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67  then fall throug
23af0 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c  h.** to the foll
23b00 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f  owing instructio
23b10 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 63  n.  But if the c
23b20 75 72 73 6f 72 20 62 61 63 6b 75 70 20 77 61 73  ursor backup was
23b30 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20   successful,.** 
23b40 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
23b50 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68   to P2..**.** Th
23b60 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73 74  e P1 cursor must
23b70 20 62 65 20 66 6f 72 20 61 20 72 65 61 6c 20 74   be for a real t
23b80 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65 75  able, not a pseu
23b90 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  do-table..**.** 
23ba0 50 34 20 69 73 20 61 6c 77 61 79 73 20 6f 66 20  P4 is always of 
23bb0 74 79 70 65 20 50 34 5f 41 44 56 41 4e 43 45 2e  type P4_ADVANCE.
23bc0 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f   The function po
23bd0 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  inter points to.
23be0 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  ** sqlite3BtreeP
23bf0 72 65 76 69 6f 75 73 28 29 2e 0a 2a 2a 0a 2a 2a  revious()..**.**
23c00 20 49 66 20 50 35 20 69 73 20 70 6f 73 69 74 69   If P5 is positi
23c10 76 65 20 61 6e 64 20 74 68 65 20 6a 75 6d 70 20  ve and the jump 
23c20 69 73 20 74 61 6b 65 6e 2c 20 74 68 65 6e 20 65  is taken, then e
23c30 76 65 6e 74 20 63 6f 75 6e 74 65 72 0a 2a 2a 20  vent counter.** 
23c40 6e 75 6d 62 65 72 20 50 35 2d 31 20 69 6e 20 74  number P5-1 in t
23c50 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
23c60 65 6d 65 6e 74 20 69 73 20 69 6e 63 72 65 6d 65  ement is increme
23c70 6e 74 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  nted..*/.case OP
23c80 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 20 20 20  _SorterNext:    
23c90 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 23 69 66 64 65  /* jump */.#ifde
23ca0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
23cb0 52 47 45 5f 53 4f 52 54 0a 20 20 70 4f 70 2d 3e  RGE_SORT.  pOp->
23cc0 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 65 78 74  opcode = OP_Next
23cd0 3b 0a 23 65 6e 64 69 66 0a 63 61 73 65 20 4f 50  ;.#endif.case OP
23ce0 5f 50 72 65 76 3a 20 20 20 20 20 20 20 20 20 20  _Prev:          
23cf0 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20  /* jump */.case 
23d00 4f 50 5f 4e 65 78 74 3a 20 7b 20 20 20 20 20 20  OP_Next: {      
23d10 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56    /* jump */.  V
23d20 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
23d30 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 43 48 45   int res;..  CHE
23d40 43 4b 5f 46 4f 52 5f 49 4e 54 45 52 52 55 50 54  CK_FOR_INTERRUPT
23d50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
23d60 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
23d70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
23d80 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
23d90 35 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 2d 3e  5<=ArraySize(p->
23da0 61 43 6f 75 6e 74 65 72 29 20 29 3b 0a 20 20 70  aCounter) );.  p
23db0 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
23dc0 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70 43 3d  ->p1];.  if( pC=
23dd0 3d 30 20 29 7b 0a 20 20 20 20 62 72 65 61 6b 3b  =0 ){.    break;
23de0 20 20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20    /* See ticket 
23df0 23 32 32 37 33 20 2a 2f 0a 20 20 7d 0a 20 20 61  #2273 */.  }.  a
23e00 73 73 65 72 74 28 20 70 43 2d 3e 69 73 53 6f 72  ssert( pC->isSor
23e10 74 65 72 3d 3d 28 70 4f 70 2d 3e 6f 70 63 6f 64  ter==(pOp->opcod
23e20 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  e==OP_SorterNext
23e30 29 20 29 3b 0a 20 20 69 66 28 20 69 73 53 6f 72  ) );.  if( isSor
23e40 74 65 72 28 70 43 29 20 29 7b 0a 20 20 20 20 61  ter(pC) ){.    a
23e50 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
23e60 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 4e 65 78  de==OP_SorterNex
23e70 74 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  t );.    rc = sq
23e80 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 4e  lite3VdbeSorterN
23e90 65 78 74 28 64 62 2c 20 70 43 2c 20 26 72 65 73  ext(db, pC, &res
23ea0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23eb0 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 61 73 73  res = 1;.    ass
23ec0 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65  ert( pC->deferre
23ed0 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20  dMoveto==0 );.  
23ee0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70 43    assert( pC->pC
23ef0 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 61 73 73  ursor );.    ass
23f00 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
23f10 21 3d 4f 50 5f 4e 65 78 74 20 7c 7c 20 70 4f 70  !=OP_Next || pOp
23f20 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d 73  ->p4.xAdvance==s
23f30 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 20  qlite3BtreeNext 
23f40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
23f50 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 50  Op->opcode!=OP_P
23f60 72 65 76 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78  rev || pOp->p4.x
23f70 41 64 76 61 6e 63 65 3d 3d 73 71 6c 69 74 65 33  Advance==sqlite3
23f80 42 74 72 65 65 50 72 65 76 69 6f 75 73 20 29 3b  BtreePrevious );
23f90 0a 20 20 20 20 72 63 20 3d 20 70 4f 70 2d 3e 70  .    rc = pOp->p
23fa0 34 2e 78 41 64 76 61 6e 63 65 28 70 43 2d 3e 70  4.xAdvance(pC->p
23fb0 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20  Cursor, &res);. 
23fc0 20 7d 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77   }.  pC->nullRow
23fd0 20 3d 20 28 75 38 29 72 65 73 3b 0a 20 20 70 43   = (u8)res;.  pC
23fe0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
23ff0 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69  CACHE_STALE;.  i
24000 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
24010 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
24020 31 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  1;.    if( pOp->
24030 70 35 20 29 20 70 2d 3e 61 43 6f 75 6e 74 65 72  p5 ) p->aCounter
24040 5b 70 4f 70 2d 3e 70 35 2d 31 5d 2b 2b 3b 0a 23  [pOp->p5-1]++;.#
24050 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
24060 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65  T.    sqlite3_se
24070 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  arch_count++;.#e
24080 6e 64 69 66 0a 20 20 7d 0a 20 20 70 43 2d 3e 72  ndif.  }.  pC->r
24090 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b  owidIsValid = 0;
240a0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
240b0 4f 70 63 6f 64 65 3a 20 49 64 78 49 6e 73 65 72  Opcode: IdxInser
240c0 74 20 50 31 20 50 32 20 50 33 20 2a 20 50 35 0a  t P1 P2 P3 * P5.
240d0 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50  **.** Register P
240e0 32 20 68 6f 6c 64 73 20 61 6e 20 53 51 4c 20 69  2 holds an SQL i
240f0 6e 64 65 78 20 6b 65 79 20 6d 61 64 65 20 75 73  ndex key made us
24100 69 6e 67 20 74 68 65 0a 2a 2a 20 4d 61 6b 65 52  ing the.** MakeR
24110 65 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69 6f  ecord instructio
24120 6e 73 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65  ns.  This opcode
24130 20 77 72 69 74 65 73 20 74 68 61 74 20 6b 65 79   writes that key
24140 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 69 6e 64  .** into the ind
24150 65 78 20 50 31 2e 20 20 44 61 74 61 20 66 6f 72  ex P1.  Data for
24160 20 74 68 65 20 65 6e 74 72 79 20 69 73 20 6e 69   the entry is ni
24170 6c 2e 0a 2a 2a 0a 2a 2a 20 50 33 20 69 73 20 61  l..**.** P3 is a
24180 20 66 6c 61 67 20 74 68 61 74 20 70 72 6f 76 69   flag that provi
24190 64 65 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68  des a hint to th
241a0 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20 74  e b-tree layer t
241b0 68 61 74 20 74 68 69 73 0a 2a 2a 20 69 6e 73 65  hat this.** inse
241c0 72 74 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f 20  rt is likely to 
241d0 62 65 20 61 6e 20 61 70 70 65 6e 64 2e 0a 2a 2a  be an append..**
241e0 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63  .** This instruc
241f0 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  tion only works 
24200 66 6f 72 20 69 6e 64 69 63 65 73 2e 20 20 54 68  for indices.  Th
24210 65 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e 73  e equivalent ins
24220 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  truction.** for 
24230 74 61 62 6c 65 73 20 69 73 20 4f 50 5f 49 6e 73  tables is OP_Ins
24240 65 72 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ert..*/.case OP_
24250 53 6f 72 74 65 72 49 6e 73 65 72 74 3a 20 20 20  SorterInsert:   
24260 20 20 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 23 69      /* in2 */.#i
24270 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
24280 5f 4d 45 52 47 45 5f 53 4f 52 54 0a 20 20 70 4f  _MERGE_SORT.  pO
24290 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49  p->opcode = OP_I
242a0 64 78 49 6e 73 65 72 74 3b 0a 23 65 6e 64 69 66  dxInsert;.#endif
242b0 0a 63 61 73 65 20 4f 50 5f 49 64 78 49 6e 73 65  .case OP_IdxInse
242c0 72 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  rt: {        /* 
242d0 69 6e 32 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  in2 */.  VdbeCur
242e0 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72  sor *pC;.  BtCur
242f0 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e  sor *pCrsr;.  in
24300 74 20 6e 4b 65 79 3b 0a 20 20 63 6f 6e 73 74 20  t nKey;.  const 
24310 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 0a 20 20 61  char *zKey;..  a
24320 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
24330 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
24340 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
24350 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
24360 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
24370 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
24380 28 20 70 43 2d 3e 69 73 53 6f 72 74 65 72 3d 3d  ( pC->isSorter==
24390 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  (pOp->opcode==OP
243a0 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 29 20 29  _SorterInsert) )
243b0 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d  ;.  pIn2 = &aMem
243c0 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73  [pOp->p2];.  ass
243d0 65 72 74 28 20 70 49 6e 32 2d 3e 66 6c 61 67 73  ert( pIn2->flags
243e0 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20   & MEM_Blob );. 
243f0 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75   pCrsr = pC->pCu
24400 72 73 6f 72 3b 0a 20 20 69 66 28 20 41 4c 57 41  rsor;.  if( ALWA
24410 59 53 28 70 43 72 73 72 21 3d 30 29 20 29 7b 0a  YS(pCrsr!=0) ){.
24420 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
24430 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  isTable==0 );.  
24440 20 20 72 63 20 3d 20 45 78 70 61 6e 64 42 6c 6f    rc = ExpandBlo
24450 62 28 70 49 6e 32 29 3b 0a 20 20 20 20 69 66 28  b(pIn2);.    if(
24460 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24470 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 53 6f  {.      if( isSo
24480 72 74 65 72 28 70 43 29 20 29 7b 0a 20 20 20 20  rter(pC) ){.    
24490 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
244a0 56 64 62 65 53 6f 72 74 65 72 57 72 69 74 65 28  VdbeSorterWrite(
244b0 64 62 2c 20 70 43 2c 20 70 49 6e 32 29 3b 0a 20  db, pC, pIn2);. 
244c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
244d0 20 20 20 20 6e 4b 65 79 20 3d 20 70 49 6e 32 2d      nKey = pIn2-
244e0 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7a 4b 65 79  >n;.        zKey
244f0 20 3d 20 70 49 6e 32 2d 3e 7a 3b 0a 20 20 20 20   = pIn2->z;.    
24500 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24510 42 74 72 65 65 49 6e 73 65 72 74 28 70 43 72 73  BtreeInsert(pCrs
24520 72 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 2c 20 22  r, zKey, nKey, "
24530 22 2c 20 30 2c 20 30 2c 20 70 4f 70 2d 3e 70 33  ", 0, 0, pOp->p3
24540 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  , .            (
24550 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41  (pOp->p5 & OPFLA
24560 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
24570 20 3f 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c   ? pC->seekResul
24580 74 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20  t : 0).         
24590 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73     );.        as
245a0 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72  sert( pC->deferr
245b0 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20  edMoveto==0 );. 
245c0 20 20 20 20 20 20 20 70 43 2d 3e 63 61 63 68 65         pC->cache
245d0 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
245e0 54 41 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TALE;.      }.  
245f0 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
24600 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .}../* Opcode: I
24610 64 78 44 65 6c 65 74 65 20 50 31 20 50 32 20 50  dxDelete P1 P2 P
24620 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  3 * *.**.** The 
24630 63 6f 6e 74 65 6e 74 20 6f 66 20 50 33 20 72 65  content of P3 re
24640 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
24650 20 61 74 20 72 65 67 69 73 74 65 72 20 50 32 20   at register P2 
24660 66 6f 72 6d 0a 2a 2a 20 61 6e 20 75 6e 70 61 63  form.** an unpac
24670 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 54  ked index key. T
24680 68 69 73 20 6f 70 63 6f 64 65 20 72 65 6d 6f 76  his opcode remov
24690 65 73 20 74 68 61 74 20 65 6e 74 72 79 20 66 72  es that entry fr
246a0 6f 6d 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78  om the .** index
246b0 20 6f 70 65 6e 65 64 20 62 79 20 63 75 72 73 6f   opened by curso
246c0 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  r P1..*/.case OP
246d0 5f 49 64 78 44 65 6c 65 74 65 3a 20 7b 0a 20 20  _IdxDelete: {.  
246e0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
246f0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
24700 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  r;.  int res;.  
24710 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72  UnpackedRecord r
24720 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
24730 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 61 73 73 65  ->p3>0 );.  asse
24740 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26  rt( pOp->p2>0 &&
24750 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33   pOp->p2+pOp->p3
24760 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 20  <=p->nMem+1 );. 
24770 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
24780 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
24790 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
247a0 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
247b0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
247c0 20 70 43 21 3d 30 20 29 3b 0a 20 20 70 43 72 73   pC!=0 );.  pCrs
247d0 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b  r = pC->pCursor;
247e0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43  .  if( ALWAYS(pC
247f0 72 73 72 21 3d 30 29 20 29 7b 0a 20 20 20 20 72  rsr!=0) ){.    r
24800 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e  .pKeyInfo = pC->
24810 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 72 2e  pKeyInfo;.    r.
24820 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 70 4f  nField = (u16)pO
24830 70 2d 3e 70 33 3b 0a 20 20 20 20 72 2e 66 6c 61  p->p3;.    r.fla
24840 67 73 20 3d 20 30 3b 0a 20 20 20 20 72 2e 61 4d  gs = 0;.    r.aM
24850 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  em = &aMem[pOp->
24860 70 32 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  p2];.#ifdef SQLI
24870 54 45 5f 44 45 42 55 47 0a 20 20 20 20 7b 20 69  TE_DEBUG.    { i
24880 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69  nt i; for(i=0; i
24890 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20  <r.nField; i++) 
248a0 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
248b0 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29  id(&r.aMem[i]) )
248c0 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  ; }.#endif.    r
248d0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
248e0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
248f0 43 72 73 72 2c 20 26 72 2c 20 30 2c 20 30 2c 20  Crsr, &r, 0, 0, 
24900 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72  &res);.    if( r
24910 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24920 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
24930 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
24940 65 44 65 6c 65 74 65 28 70 43 72 73 72 29 3b 0a  eDelete(pCrsr);.
24950 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
24960 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f  ( pC->deferredMo
24970 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70  veto==0 );.    p
24980 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  C->cacheStatus =
24990 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
249a0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
249b0 20 4f 70 63 6f 64 65 3a 20 49 64 78 52 6f 77 69   Opcode: IdxRowi
249c0 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  d P1 P2 * * *.**
249d0 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 72  .** Write into r
249e0 65 67 69 73 74 65 72 20 50 32 20 61 6e 20 69 6e  egister P2 an in
249f0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
24a00 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
24a10 20 74 68 65 20 72 65 63 6f 72 64 20 61 74 0a 2a   the record at.*
24a20 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
24a30 20 69 6e 64 65 78 20 6b 65 79 20 70 6f 69 6e 74   index key point
24a40 65 64 20 74 6f 20 62 79 20 63 75 72 73 6f 72 20  ed to by cursor 
24a50 50 31 2e 20 20 54 68 69 73 20 69 6e 74 65 67 65  P1.  This intege
24a60 72 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 74  r should be.** t
24a70 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
24a80 74 61 62 6c 65 20 65 6e 74 72 79 20 74 6f 20 77  table entry to w
24a90 68 69 63 68 20 74 68 69 73 20 69 6e 64 65 78 20  hich this index 
24aa0 65 6e 74 72 79 20 70 6f 69 6e 74 73 2e 0a 2a 2a  entry points..**
24ab0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 52 6f  .** See also: Ro
24ac0 77 69 64 2c 20 4d 61 6b 65 52 65 63 6f 72 64 2e  wid, MakeRecord.
24ad0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 52  .*/.case OP_IdxR
24ae0 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20 20 20  owid: {         
24af0 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65       /* out2-pre
24b00 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 42 74 43  release */.  BtC
24b10 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20  ursor *pCrsr;.  
24b20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
24b30 20 20 69 36 34 20 72 6f 77 69 64 3b 0a 0a 20 20    i64 rowid;..  
24b40 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
24b50 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
24b60 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
24b70 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
24b80 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
24b90 70 43 21 3d 30 20 29 3b 0a 20 20 70 43 72 73 72  pC!=0 );.  pCrsr
24ba0 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a   = pC->pCursor;.
24bb0 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
24bc0 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 69 66 28 20  MEM_Null;.  if( 
24bd0 41 4c 57 41 59 53 28 70 43 72 73 72 21 3d 30 29  ALWAYS(pCrsr!=0)
24be0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
24bf0 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
24c00 76 65 74 6f 28 70 43 29 3b 0a 20 20 20 20 69 66  veto(pC);.    if
24c10 28 20 4e 45 56 45 52 28 72 63 29 20 29 20 67 6f  ( NEVER(rc) ) go
24c20 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
24c30 65 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72  error;.    asser
24c40 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d  t( pC->deferredM
24c50 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 20 20  oveto==0 );.    
24c60 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61  assert( pC->isTa
24c70 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ble==0 );.    if
24c80 28 20 21 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29  ( !pC->nullRow )
24c90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
24ca0 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
24cb0 28 64 62 2c 20 70 43 72 73 72 2c 20 26 72 6f 77  (db, pCrsr, &row
24cc0 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  id);.      if( r
24cd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24ce0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f          goto abo
24cf0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
24d00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
24d10 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 6f 77 69 64  Out->u.i = rowid
24d20 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 66 6c  ;.      pOut->fl
24d30 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
24d40 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
24d50 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
24d60 49 64 78 47 45 20 50 31 20 50 32 20 50 33 20 50  IdxGE P1 P2 P3 P
24d70 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  4 P5.**.** The P
24d80 34 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65  4 register value
24d90 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  s beginning with
24da0 20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61   P3 form an unpa
24db0 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b  cked index .** k
24dc0 65 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68  ey that omits th
24dd0 65 20 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72  e ROWID.  Compar
24de0 65 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65  e this key value
24df0 20 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64   against the ind
24e00 65 78 20 0a 2a 2a 20 74 68 61 74 20 50 31 20 69  ex .** that P1 i
24e10 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
24e20 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e  ting to, ignorin
24e30 67 20 74 68 65 20 52 4f 57 49 44 20 6f 6e 20 74  g the ROWID on t
24e40 68 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a 0a  he P1 index..**.
24e50 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e 64  ** If the P1 ind
24e60 65 78 20 65 6e 74 72 79 20 69 73 20 67 72 65 61  ex entry is grea
24e70 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
24e80 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c  l to the key val
24e90 75 65 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d 70 20  ue.** then jump 
24ea0 74 6f 20 50 32 2e 20 20 4f 74 68 65 72 77 69 73  to P2.  Otherwis
24eb0 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  e fall through t
24ec0 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
24ed0 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  uction..**.** If
24ee0 20 50 35 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20   P5 is non-zero 
24ef0 74 68 65 6e 20 74 68 65 20 6b 65 79 20 76 61 6c  then the key val
24f00 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20  ue is increased 
24f10 62 79 20 61 6e 20 65 70 73 69 6c 6f 6e 20 0a 2a  by an epsilon .*
24f20 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63  * prior to the c
24f30 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 69 73  omparison.  This
24f40 20 6d 61 6b 65 20 74 68 65 20 6f 70 63 6f 64 65   make the opcode
24f50 20 77 6f 72 6b 20 6c 69 6b 65 20 49 64 78 47 54   work like IdxGT
24f60 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20   except.** that 
24f70 69 66 20 74 68 65 20 6b 65 79 20 66 72 6f 6d 20  if the key from 
24f80 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20 61  register P3 is a
24f90 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6b   prefix of the k
24fa0 65 79 20 69 6e 20 74 68 65 20 63 75 72 73 6f 72  ey in the cursor
24fb0 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  ,.** the result 
24fc0 69 73 20 66 61 6c 73 65 20 77 68 65 72 65 61 73  is false whereas
24fd0 20 69 74 20 77 6f 75 6c 64 20 62 65 20 74 72 75   it would be tru
24fe0 65 20 77 69 74 68 20 49 64 78 47 54 2e 0a 2a 2f  e with IdxGT..*/
24ff0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 4c  ./* Opcode: IdxL
25000 54 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  T P1 P2 P3 P4 P5
25010 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 72 65  .**.** The P4 re
25020 67 69 73 74 65 72 20 76 61 6c 75 65 73 20 62 65  gister values be
25030 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 50 33 20  ginning with P3 
25040 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64  form an unpacked
25050 20 69 6e 64 65 78 20 0a 2a 2a 20 6b 65 79 20 74   index .** key t
25060 68 61 74 20 6f 6d 69 74 73 20 74 68 65 20 52 4f  hat omits the RO
25070 57 49 44 2e 20 20 43 6f 6d 70 61 72 65 20 74 68  WID.  Compare th
25080 69 73 20 6b 65 79 20 76 61 6c 75 65 20 61 67 61  is key value aga
25090 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20 0a  inst the index .
250a0 2a 2a 20 74 68 61 74 20 50 31 20 69 73 20 63 75  ** that P1 is cu
250b0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
250c0 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74 68   to, ignoring th
250d0 65 20 52 4f 57 49 44 20 6f 6e 20 74 68 65 20 50  e ROWID on the P
250e0 31 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49  1 index..**.** I
250f0 66 20 74 68 65 20 50 31 20 69 6e 64 65 78 20 65  f the P1 index e
25100 6e 74 72 79 20 69 73 20 6c 65 73 73 20 74 68 61  ntry is less tha
25110 6e 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20  n the key value 
25120 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e  then jump to P2.
25130 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61  .** Otherwise fa
25140 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
25150 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
25160 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20  on..**.** If P5 
25170 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e  is non-zero then
25180 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 69   the key value i
25190 73 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 61  s increased by a
251a0 6e 20 65 70 73 69 6c 6f 6e 20 70 72 69 6f 72 20  n epsilon prior 
251b0 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 6d 70 61  .** to the compa
251c0 72 69 73 6f 6e 2e 20 20 54 68 69 73 20 6d 61 6b  rison.  This mak
251d0 65 73 20 74 68 65 20 6f 70 63 6f 64 65 20 77 6f  es the opcode wo
251e0 72 6b 20 6c 69 6b 65 20 49 64 78 4c 45 2e 0a 2a  rk like IdxLE..*
251f0 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 4c 54 3a  /.case OP_IdxLT:
25200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d            /* jum
25210 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78  p */.case OP_Idx
25220 47 45 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  GE: {        /* 
25230 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43 75  jump */.  VdbeCu
25240 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e 74 20  rsor *pC;.  int 
25250 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  res;.  UnpackedR
25260 65 63 6f 72 64 20 72 3b 0a 0a 20 20 61 73 73 65  ecord r;..  asse
25270 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
25280 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
25290 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
252a0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
252b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
252c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
252d0 43 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 3b 0a  C->isOrdered );.
252e0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 2d    if( ALWAYS(pC-
252f0 3e 70 43 75 72 73 6f 72 21 3d 30 29 20 29 7b 0a  >pCursor!=0) ){.
25300 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
25310 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d  deferredMoveto==
25320 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
25330 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70   pOp->p5==0 || p
25340 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b 0a 20 20 20  Op->p5==1 );.   
25350 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
25360 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29  type==P4_INT32 )
25370 3b 0a 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f  ;.    r.pKeyInfo
25380 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b   = pC->pKeyInfo;
25390 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20  .    r.nField = 
253a0 28 75 31 36 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a  (u16)pOp->p4.i;.
253b0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20      if( pOp->p5 
253c0 29 7b 0a 20 20 20 20 20 20 72 2e 66 6c 61 67 73  ){.      r.flags
253d0 20 3d 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52   = UNPACKED_INCR
253e0 4b 45 59 20 7c 20 55 4e 50 41 43 4b 45 44 5f 50  KEY | UNPACKED_P
253f0 52 45 46 49 58 5f 4d 41 54 43 48 3b 0a 20 20 20  REFIX_MATCH;.   
25400 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 2e   }else{.      r.
25410 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44  flags = UNPACKED
25420 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 3b 0a 20  _PREFIX_MATCH;. 
25430 20 20 20 7d 0a 20 20 20 20 72 2e 61 4d 65 6d 20     }.    r.aMem 
25440 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
25450 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
25460 44 45 42 55 47 0a 20 20 20 20 7b 20 69 6e 74 20  DEBUG.    { int 
25470 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 2e  i; for(i=0; i<r.
25480 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20 61 73 73  nField; i++) ass
25490 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
254a0 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d  &r.aMem[i]) ); }
254b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
254c0 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
254d0 65 79 43 6f 6d 70 61 72 65 28 70 43 2c 20 26 72  eyCompare(pC, &r
254e0 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
254f0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
25500 5f 49 64 78 4c 54 20 29 7b 0a 20 20 20 20 20 20  _IdxLT ){.      
25510 72 65 73 20 3d 20 2d 72 65 73 3b 0a 20 20 20 20  res = -res;.    
25520 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
25530 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
25540 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20  ==OP_IdxGE );.  
25550 20 20 20 20 72 65 73 2b 2b 3b 0a 20 20 20 20 7d      res++;.    }
25560 0a 20 20 20 20 69 66 28 20 72 65 73 3e 30 20 29  .    if( res>0 )
25570 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70  {.      pc = pOp
25580 2d 3e 70 32 20 2d 20 31 20 3b 0a 20 20 20 20 7d  ->p2 - 1 ;.    }
25590 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
255a0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65 73 74  ./* Opcode: Dest
255b0 72 6f 79 20 50 31 20 50 32 20 50 33 20 2a 20 2a  roy P1 P2 P3 * *
255c0 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  .**.** Delete an
255d0 20 65 6e 74 69 72 65 20 64 61 74 61 62 61 73 65   entire database
255e0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
255f0 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 20  whose root page 
25600 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  in the database.
25610 2a 2a 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  ** file is given
25620 20 62 79 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68   by P1..**.** Th
25630 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 65  e table being de
25640 73 74 72 6f 79 65 64 20 69 73 20 69 6e 20 74 68  stroyed is in th
25650 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
25660 66 69 6c 65 20 69 66 20 50 33 3d 3d 30 2e 20 20  file if P3==0.  
25670 49 66 0a 2a 2a 20 50 33 3d 3d 31 20 74 68 65 6e  If.** P3==1 then
25680 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
25690 20 63 6c 65 61 72 20 69 73 20 69 6e 20 74 68 65   clear is in the
256a0 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
256b0 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74 68 61 74  ase file.** that
256c0 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
256d0 65 20 74 61 62 6c 65 73 20 63 72 65 61 74 65 20  e tables create 
256e0 75 73 69 6e 67 20 43 52 45 41 54 45 20 54 45 4d  using CREATE TEM
256f0 50 4f 52 41 52 59 20 54 41 42 4c 45 2e 0a 2a 2a  PORARY TABLE..**
25700 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55  .** If AUTOVACUU
25710 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 74 68 65  M is enabled the
25720 6e 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  n it is possible
25730 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20 72 6f   that another ro
25740 6f 74 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74  ot page.** might
25750 20 62 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74   be moved into t
25760 68 65 20 6e 65 77 6c 79 20 64 65 6c 65 74 65 64  he newly deleted
25770 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 6f 72   root page in or
25780 64 65 72 20 74 6f 20 6b 65 65 70 20 61 6c 6c 0a  der to keep all.
25790 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 63 6f  ** root pages co
257a0 6e 74 69 67 75 6f 75 73 20 61 74 20 74 68 65 20  ntiguous at the 
257b0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
257c0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
257d0 66 6f 72 6d 65 72 0a 2a 2a 20 76 61 6c 75 65 20  former.** value 
257e0 6f 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  of the root page
257f0 20 74 68 61 74 20 6d 6f 76 65 64 20 2d 20 69 74   that moved - it
25800 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 74  s value before t
25810 68 65 20 6d 6f 76 65 20 6f 63 63 75 72 72 65 64  he move occurred
25820 20 2d 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20   -.** is stored 
25830 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 20  in register P2. 
25840 20 49 66 20 6e 6f 20 70 61 67 65 20 0a 2a 2a 20   If no page .** 
25850 6d 6f 76 65 6d 65 6e 74 20 77 61 73 20 72 65 71  movement was req
25860 75 69 72 65 64 20 28 62 65 63 61 75 73 65 20 74  uired (because t
25870 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
25880 72 6f 70 70 65 64 20 77 61 73 20 61 6c 72 65 61  ropped was alrea
25890 64 79 20 0a 2a 2a 20 74 68 65 20 6c 61 73 74 20  dy .** the last 
258a0 6f 6e 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  one in the datab
258b0 61 73 65 29 20 74 68 65 6e 20 61 20 7a 65 72 6f  ase) then a zero
258c0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
258d0 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 20 49 66  gister P2..** If
258e0 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 64   AUTOVACUUM is d
258f0 69 73 61 62 6c 65 64 20 74 68 65 6e 20 61 20 7a  isabled then a z
25900 65 72 6f 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ero is stored in
25910 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
25920 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 43 6c  .** See also: Cl
25930 65 61 72 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44  ear.*/.case OP_D
25940 65 73 74 72 6f 79 3a 20 7b 20 20 20 20 20 2f 2a  estroy: {     /*
25950 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65   out2-prerelease
25960 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 6f 76 65 64   */.  int iMoved
25970 3b 0a 20 20 69 6e 74 20 69 43 6e 74 3b 0a 20 20  ;.  int iCnt;.  
25980 56 64 62 65 20 2a 70 56 64 62 65 3b 0a 20 20 69  Vdbe *pVdbe;.  i
25990 6e 74 20 69 44 62 3b 0a 23 69 66 6e 64 65 66 20  nt iDb;.#ifndef 
259a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
259b0 55 41 4c 54 41 42 4c 45 0a 20 20 69 43 6e 74 20  UALTABLE.  iCnt 
259c0 3d 20 30 3b 0a 20 20 66 6f 72 28 70 56 64 62 65  = 0;.  for(pVdbe
259d0 3d 64 62 2d 3e 70 56 64 62 65 3b 20 70 56 64 62  =db->pVdbe; pVdb
259e0 65 3b 20 70 56 64 62 65 20 3d 20 70 56 64 62 65  e; pVdbe = pVdbe
259f0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
25a00 28 20 70 56 64 62 65 2d 3e 6d 61 67 69 63 3d 3d  ( pVdbe->magic==
25a10 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26  VDBE_MAGIC_RUN &
25a20 26 20 70 56 64 62 65 2d 3e 69 6e 56 74 61 62 4d  & pVdbe->inVtabM
25a30 65 74 68 6f 64 3c 32 20 26 26 20 70 56 64 62 65  ethod<2 && pVdbe
25a40 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ->pc>=0 ){.     
25a50 20 69 43 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20   iCnt++;.    }. 
25a60 20 7d 0a 23 65 6c 73 65 0a 20 20 69 43 6e 74 20   }.#else.  iCnt 
25a70 3d 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  = db->activeVdbe
25a80 43 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4f  Cnt;.#endif.  pO
25a90 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ut->flags = MEM_
25aa0 4e 75 6c 6c 3b 0a 20 20 69 66 28 20 69 43 6e 74  Null;.  if( iCnt
25ab0 3e 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  >1 ){.    rc = S
25ac0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
25ad0 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
25ae0 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 7d   = OE_Abort;.  }
25af0 65 6c 73 65 7b 0a 20 20 20 20 69 44 62 20 3d 20  else{.    iDb = 
25b00 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 61 73 73  pOp->p3;.    ass
25b10 65 72 74 28 20 69 43 6e 74 3d 3d 31 20 29 3b 0a  ert( iCnt==1 );.
25b20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
25b30 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79  btreeMask & (((y
25b40 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62 29 29  DbMask)1)<<iDb))
25b50 21 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  !=0 );.    rc = 
25b60 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
25b70 54 61 62 6c 65 28 64 62 2d 3e 61 44 62 5b 69 44  Table(db->aDb[iD
25b80 62 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 31 2c  b].pBt, pOp->p1,
25b90 20 26 69 4d 6f 76 65 64 29 3b 0a 20 20 20 20 70   &iMoved);.    p
25ba0 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
25bb0 5f 49 6e 74 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  _Int;.    pOut->
25bc0 75 2e 69 20 3d 20 69 4d 6f 76 65 64 3b 0a 23 69  u.i = iMoved;.#i
25bd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25be0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
25bf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25c00 4f 4b 20 26 26 20 69 4d 6f 76 65 64 21 3d 30 20  OK && iMoved!=0 
25c10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
25c20 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 64 62  RootPageMoved(db
25c30 2c 20 69 44 62 2c 20 69 4d 6f 76 65 64 2c 20 70  , iDb, iMoved, p
25c40 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20 20 20 2f  Op->p1);.      /
25c50 2a 20 41 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79  * All OP_Destroy
25c60 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75   operations occu
25c70 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74  r on the same bt
25c80 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ree */.      ass
25c90 65 72 74 28 20 72 65 73 65 74 53 63 68 65 6d 61  ert( resetSchema
25ca0 4f 6e 46 61 75 6c 74 3d 3d 30 20 7c 7c 20 72 65  OnFault==0 || re
25cb0 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74  setSchemaOnFault
25cc0 3d 3d 69 44 62 2b 31 20 29 3b 0a 20 20 20 20 20  ==iDb+1 );.     
25cd0 20 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61   resetSchemaOnFa
25ce0 75 6c 74 20 3d 20 69 44 62 2b 31 3b 0a 20 20 20  ult = iDb+1;.   
25cf0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
25d00 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
25d10 6f 64 65 3a 20 43 6c 65 61 72 20 50 31 20 50 32  ode: Clear P1 P2
25d20 20 50 33 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65   P3.**.** Delete
25d30 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 73 20 6f 66   all contents of
25d40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61   the database ta
25d50 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68 6f  ble or index who
25d60 73 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20  se root page.** 
25d70 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
25d80 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79  file is given by
25d90 20 50 31 2e 20 20 42 75 74 2c 20 75 6e 6c 69 6b   P1.  But, unlik
25da0 65 20 44 65 73 74 72 6f 79 2c 20 64 6f 20 6e 6f  e Destroy, do no
25db0 74 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  t.** remove the 
25dc0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 66  table or index f
25dd0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
25de0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
25df0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c 65   table being cle
25e00 61 72 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69  ar is in the mai
25e10 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
25e20 69 66 20 50 32 3d 3d 30 2e 20 20 49 66 0a 2a 2a  if P2==0.  If.**
25e30 20 50 32 3d 3d 31 20 74 68 65 6e 20 74 68 65 20   P2==1 then the 
25e40 74 61 62 6c 65 20 74 6f 20 62 65 20 63 6c 65 61  table to be clea
25e50 72 20 69 73 20 69 6e 20 74 68 65 20 61 75 78 69  r is in the auxi
25e60 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66  liary database f
25e70 69 6c 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 75  ile.** that is u
25e80 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 61 62  sed to store tab
25e90 6c 65 73 20 63 72 65 61 74 65 20 75 73 69 6e 67  les create using
25ea0 20 43 52 45 41 54 45 20 54 45 4d 50 4f 52 41 52   CREATE TEMPORAR
25eb0 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 49  Y TABLE..**.** I
25ec0 66 20 74 68 65 20 50 33 20 76 61 6c 75 65 20 69  f the P3 value i
25ed0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
25ee0 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72   the table refer
25ef0 72 65 64 20 74 6f 20 6d 75 73 74 20 62 65 20 61  red to must be a
25f00 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 74 61 62 6c  n.** intkey tabl
25f10 65 20 28 61 6e 20 53 51 4c 20 74 61 62 6c 65 2c  e (an SQL table,
25f20 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78 29 2e 20   not an index). 
25f30 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
25f40 20 72 6f 77 20 63 68 61 6e 67 65 20 0a 2a 2a 20   row change .** 
25f50 63 6f 75 6e 74 20 69 73 20 69 6e 63 72 65 6d 65  count is increme
25f60 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  nted by the numb
25f70 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
25f80 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c  e table being cl
25f90 65 61 72 65 64 2e 20 0a 2a 2a 20 49 66 20 50 33  eared. .** If P3
25fa0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
25fb0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
25fc0 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
25fd0 72 65 67 69 73 74 65 72 20 50 33 20 69 73 0a 2a  register P3 is.*
25fe0 2a 20 61 6c 73 6f 20 69 6e 63 72 65 6d 65 6e 74  * also increment
25ff0 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
26000 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
26010 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c 65 61  table being clea
26020 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  red..**.** See a
26030 6c 73 6f 3a 20 44 65 73 74 72 6f 79 0a 2a 2f 0a  lso: Destroy.*/.
26040 63 61 73 65 20 4f 50 5f 43 6c 65 61 72 3a 20 7b  case OP_Clear: {
26050 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 3b 0a  .  int nChange;.
26060 20 0a 20 20 6e 43 68 61 6e 67 65 20 3d 20 30 3b   .  nChange = 0;
26070 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62  .  assert( (p->b
26080 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44  treeMask & (((yD
26090 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e 70  bMask)1)<<pOp->p
260a0 32 29 29 21 3d 30 20 29 3b 0a 20 20 72 63 20 3d  2))!=0 );.  rc =
260b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
260c0 61 72 54 61 62 6c 65 28 0a 20 20 20 20 20 20 64  arTable(.      d
260d0 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 32 5d 2e  b->aDb[pOp->p2].
260e0 70 42 74 2c 20 70 4f 70 2d 3e 70 31 2c 20 28 70  pBt, pOp->p1, (p
260f0 4f 70 2d 3e 70 33 20 3f 20 26 6e 43 68 61 6e 67  Op->p3 ? &nChang
26100 65 20 3a 20 30 29 0a 20 20 29 3b 0a 20 20 69 66  e : 0).  );.  if
26110 28 20 70 4f 70 2d 3e 70 33 20 29 7b 0a 20 20 20  ( pOp->p3 ){.   
26120 20 70 2d 3e 6e 43 68 61 6e 67 65 20 2b 3d 20 6e   p->nChange += n
26130 43 68 61 6e 67 65 3b 0a 20 20 20 20 69 66 28 20  Change;.    if( 
26140 70 4f 70 2d 3e 70 33 3e 30 20 29 7b 0a 20 20 20  pOp->p3>0 ){.   
26150 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
26160 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d  Valid(&aMem[pOp-
26170 3e 70 33 5d 29 20 29 3b 0a 20 20 20 20 20 20 6d  >p3]) );.      m
26180 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
26190 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33  p, &aMem[pOp->p3
261a0 5d 29 3b 0a 20 20 20 20 20 20 61 4d 65 6d 5b 70  ]);.      aMem[p
261b0 4f 70 2d 3e 70 33 5d 2e 75 2e 69 20 2b 3d 20 6e  Op->p3].u.i += n
261c0 43 68 61 6e 67 65 3b 0a 20 20 20 20 7d 0a 20 20  Change;.    }.  
261d0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
261e0 20 4f 70 63 6f 64 65 3a 20 43 72 65 61 74 65 54   Opcode: CreateT
261f0 61 62 6c 65 20 50 31 20 50 32 20 2a 20 2a 20 2a  able P1 P2 * * *
26200 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  .**.** Allocate 
26210 61 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 20 74  a new table in t
26220 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
26230 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 30 20 6f   file if P1==0 o
26240 72 20 69 6e 20 74 68 65 0a 2a 2a 20 61 75 78 69  r in the.** auxi
26250 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66  liary database f
26260 69 6c 65 20 69 66 20 50 31 3d 3d 31 20 6f 72 20  ile if P1==1 or 
26270 69 6e 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  in an attached d
26280 61 74 61 62 61 73 65 20 69 66 0a 2a 2a 20 50 31  atabase if.** P1
26290 3e 31 2e 20 20 57 72 69 74 65 20 74 68 65 20 72  >1.  Write the r
262a0 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
262b0 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
262c0 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65   into.** registe
262d0 72 20 50 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  r P2.**.** The d
262e0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
262f0 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61 6e  n a table and an
26300 20 69 6e 64 65 78 20 69 73 20 74 68 69 73 3a 20   index is this: 
26310 20 41 20 74 61 62 6c 65 20 6d 75 73 74 0a 2a 2a   A table must.**
26320 20 68 61 76 65 20 61 20 34 2d 62 79 74 65 20 69   have a 4-byte i
26330 6e 74 65 67 65 72 20 6b 65 79 20 61 6e 64 20 63  nteger key and c
26340 61 6e 20 68 61 76 65 20 61 72 62 69 74 72 61 72  an have arbitrar
26350 79 20 64 61 74 61 2e 20 20 41 6e 20 69 6e 64 65  y data.  An inde
26360 78 0a 2a 2a 20 68 61 73 20 61 6e 20 61 72 62 69  x.** has an arbi
26370 74 72 61 72 79 20 6b 65 79 20 62 75 74 20 6e 6f  trary key but no
26380 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   data..**.** See
26390 20 61 6c 73 6f 3a 20 43 72 65 61 74 65 49 6e 64   also: CreateInd
263a0 65 78 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ex.*/./* Opcode:
263b0 20 43 72 65 61 74 65 49 6e 64 65 78 20 50 31 20   CreateIndex P1 
263c0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41  P2 * * *.**.** A
263d0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 69 6e  llocate a new in
263e0 64 65 78 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  dex in the main 
263f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
26400 20 50 31 3d 3d 30 20 6f 72 20 69 6e 20 74 68 65   P1==0 or in the
26410 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61  .** auxiliary da
26420 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 50  tabase file if P
26430 31 3d 3d 31 20 6f 72 20 69 6e 20 61 6e 20 61 74  1==1 or in an at
26440 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20  tached database 
26450 69 66 0a 2a 2a 20 50 31 3e 31 2e 20 20 57 72 69  if.** P1>1.  Wri
26460 74 65 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  te the root page
26470 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
26480 65 77 20 74 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a  ew table into.**
26490 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
264a0 0a 2a 2a 20 53 65 65 20 64 6f 63 75 6d 65 6e 74  .** See document
264b0 61 74 69 6f 6e 20 6f 6e 20 4f 50 5f 43 72 65 61  ation on OP_Crea
264c0 74 65 54 61 62 6c 65 20 66 6f 72 20 61 64 64 69  teTable for addi
264d0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
264e0 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  on..*/.case OP_C
264f0 72 65 61 74 65 49 6e 64 65 78 3a 20 20 20 20 20  reateIndex:     
26500 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70         /* out2-p
26510 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 63 61 73  rerelease */.cas
26520 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  e OP_CreateTable
26530 3a 20 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  : {          /* 
26540 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20  out2-prerelease 
26550 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20  */.  int pgno;. 
26560 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 44 62   int flags;.  Db
26570 20 2a 70 44 62 3b 0a 0a 20 20 70 67 6e 6f 20 3d   *pDb;..  pgno =
26580 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   0;.  assert( pO
26590 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
265a0 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  >p1<db->nDb );. 
265b0 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74 72   assert( (p->btr
265c0 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44 62 4d  eeMask & (((yDbM
265d0 61 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e 70 31 29  ask)1)<<pOp->p1)
265e0 29 21 3d 30 20 29 3b 0a 20 20 70 44 62 20 3d 20  )!=0 );.  pDb = 
265f0 26 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31  &db->aDb[pOp->p1
26600 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  ];.  assert( pDb
26610 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 69 66  ->pBt!=0 );.  if
26620 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
26630 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 29 7b  P_CreateTable ){
26640 0a 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 3d 20  .    /* flags = 
26650 42 54 52 45 45 5f 49 4e 54 4b 45 59 3b 20 2a 2f  BTREE_INTKEY; */
26660 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 42 54 52  .    flags = BTR
26670 45 45 5f 49 4e 54 4b 45 59 3b 0a 20 20 7d 65 6c  EE_INTKEY;.  }el
26680 73 65 7b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20  se{.    flags = 
26690 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 3b 0a 20  BTREE_BLOBKEY;. 
266a0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
266b0 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
266c0 65 28 70 44 62 2d 3e 70 42 74 2c 20 26 70 67 6e  e(pDb->pBt, &pgn
266d0 6f 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4f 75  o, flags);.  pOu
266e0 74 2d 3e 75 2e 69 20 3d 20 70 67 6e 6f 3b 0a 20  t->u.i = pgno;. 
266f0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
26700 63 6f 64 65 3a 20 50 61 72 73 65 53 63 68 65 6d  code: ParseSchem
26710 61 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  a P1 * * P4 *.**
26720 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 70 61 72  .** Read and par
26730 73 65 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 66  se all entries f
26740 72 6f 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  rom the SQLITE_M
26750 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 64  ASTER table of d
26760 61 74 61 62 61 73 65 20 50 31 0a 2a 2a 20 74 68  atabase P1.** th
26770 61 74 20 6d 61 74 63 68 20 74 68 65 20 57 48 45  at match the WHE
26780 52 45 20 63 6c 61 75 73 65 20 50 34 2e 20 0a 2a  RE clause P4. .*
26790 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
267a0 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 70 61 72   invokes the par
267b0 73 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20  ser to create a 
267c0 6e 65 77 20 76 69 72 74 75 61 6c 20 6d 61 63 68  new virtual mach
267d0 69 6e 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 75 6e  ine,.** then run
267e0 73 20 74 68 65 20 6e 65 77 20 76 69 72 74 75 61  s the new virtua
267f0 6c 20 6d 61 63 68 69 6e 65 2e 20 20 49 74 20 69  l machine.  It i
26800 73 20 74 68 75 73 20 61 20 72 65 2d 65 6e 74 72  s thus a re-entr
26810 61 6e 74 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63  ant opcode..*/.c
26820 61 73 65 20 4f 50 5f 50 61 72 73 65 53 63 68 65  ase OP_ParseSche
26830 6d 61 3a 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b  ma: {.  int iDb;
26840 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
26850 4d 61 73 74 65 72 3b 0a 20 20 63 68 61 72 20 2a  Master;.  char *
26860 7a 53 71 6c 3b 0a 20 20 49 6e 69 74 44 61 74 61  zSql;.  InitData
26870 20 69 6e 69 74 44 61 74 61 3b 0a 0a 20 20 2f 2a   initData;..  /*
26880 20 41 6e 79 20 70 72 65 70 61 72 65 64 20 73 74   Any prepared st
26890 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 6e 76  atement that inv
268a0 6f 6b 65 73 20 74 68 69 73 20 6f 70 63 6f 64 65  okes this opcode
268b0 20 77 69 6c 6c 20 68 6f 6c 64 20 6d 75 74 65 78   will hold mutex
268c0 65 73 0a 20 20 2a 2a 20 6f 6e 20 65 76 65 72 79  es.  ** on every
268d0 20 62 74 72 65 65 2e 20 20 54 68 69 73 20 69 73   btree.  This is
268e0 20 61 20 70 72 65 72 65 71 75 69 73 69 74 65 20   a prerequisite 
268f0 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 0a 20 20  for invoking .  
26900 2a 2a 20 73 71 6c 69 74 65 33 49 6e 69 74 43 61  ** sqlite3InitCa
26910 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 2a 2f 0a 23  llback()..  */.#
26920 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
26930 55 47 0a 20 20 66 6f 72 28 69 44 62 3d 30 3b 20  UG.  for(iDb=0; 
26940 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62  iDb<db->nDb; iDb
26950 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
26960 20 69 44 62 3d 3d 31 20 7c 7c 20 73 71 6c 69 74   iDb==1 || sqlit
26970 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
26980 78 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  x(db->aDb[iDb].p
26990 42 74 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Bt) );.  }.#endi
269a0 66 0a 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e  f..  iDb = pOp->
269b0 70 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  p1;.  assert( iD
269c0 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
269d0 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
269e0 20 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64   DbHasProperty(d
269f0 62 2c 20 69 44 62 2c 20 44 42 5f 53 63 68 65 6d  b, iDb, DB_Schem
26a00 61 4c 6f 61 64 65 64 29 20 29 3b 0a 20 20 2f 2a  aLoaded) );.  /*
26a10 20 55 73 65 64 20 74 6f 20 62 65 20 61 20 63 6f   Used to be a co
26a20 6e 64 69 74 69 6f 6e 61 6c 20 2a 2f 20 7b 0a 20  nditional */ {. 
26a30 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 53 43 48     zMaster = SCH
26a40 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a  EMA_TABLE(iDb);.
26a50 20 20 20 20 69 6e 69 74 44 61 74 61 2e 64 62 20      initData.db 
26a60 3d 20 64 62 3b 0a 20 20 20 20 69 6e 69 74 44 61  = db;.    initDa
26a70 74 61 2e 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31  ta.iDb = pOp->p1
26a80 3b 0a 20 20 20 20 69 6e 69 74 44 61 74 61 2e 70  ;.    initData.p
26a90 7a 45 72 72 4d 73 67 20 3d 20 26 70 2d 3e 7a 45  zErrMsg = &p->zE
26aa0 72 72 4d 73 67 3b 0a 20 20 20 20 7a 53 71 6c 20  rrMsg;.    zSql 
26ab0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
26ac0 28 64 62 2c 0a 20 20 20 20 20 20 20 22 53 45 4c  (db,.       "SEL
26ad0 45 43 54 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61  ECT name, rootpa
26ae0 67 65 2c 20 73 71 6c 20 46 52 4f 4d 20 27 25 71  ge, sql FROM '%q
26af0 27 2e 25 73 20 57 48 45 52 45 20 25 73 20 4f 52  '.%s WHERE %s OR
26b00 44 45 52 20 42 59 20 72 6f 77 69 64 22 2c 0a 20  DER BY rowid",. 
26b10 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
26b20 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 4d 61 73 74 65  b].zName, zMaste
26b30 72 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  r, pOp->p4.z);. 
26b40 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
26b50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
26b60 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
26b70 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
26b80 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  rt( db->init.bus
26b90 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 64 62  y==0 );.      db
26ba0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20 31 3b  ->init.busy = 1;
26bb0 0a 20 20 20 20 20 20 69 6e 69 74 44 61 74 61 2e  .      initData.
26bc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26bd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
26be0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
26bf0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
26c00 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
26c10 53 71 6c 2c 20 73 71 6c 69 74 65 33 49 6e 69 74  Sql, sqlite3Init
26c20 43 61 6c 6c 62 61 63 6b 2c 20 26 69 6e 69 74 44  Callback, &initD
26c30 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ata, 0);.      i
26c40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26c50 20 29 20 72 63 20 3d 20 69 6e 69 74 44 61 74 61   ) rc = initData
26c60 2e 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  .rc;.      sqlit
26c70 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71  e3DbFree(db, zSq
26c80 6c 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e  l);.      db->in
26c90 69 74 2e 62 75 73 79 20 3d 20 30 3b 0a 20 20 20  it.busy = 0;.   
26ca0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20   }.  }.  if( rc 
26cb0 29 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e  ) sqlite3ResetIn
26cc0 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c  ternalSchema(db,
26cd0 20 2d 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d   -1);.  if( rc==
26ce0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
26cf0 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
26d00 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 20 20 0a  .  }.  break;  .
26d10 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
26d20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c  SQLITE_OMIT_ANAL
26d30 59 5a 45 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  YZE)./* Opcode: 
26d40 4c 6f 61 64 41 6e 61 6c 79 73 69 73 20 50 31 20  LoadAnalysis P1 
26d50 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65  * * * *.**.** Re
26d60 61 64 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  ad the sqlite_st
26d70 61 74 31 20 74 61 62 6c 65 20 66 6f 72 20 64 61  at1 table for da
26d80 74 61 62 61 73 65 20 50 31 20 61 6e 64 20 6c 6f  tabase P1 and lo
26d90 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a  ad the content.*
26da0 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  * of that table 
26db0 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  into the interna
26dc0 6c 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62  l index hash tab
26dd0 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  le.  This will c
26de0 61 75 73 65 0a 2a 2a 20 74 68 65 20 61 6e 61 6c  ause.** the anal
26df0 79 73 69 73 20 74 6f 20 62 65 20 75 73 65 64 20  ysis to be used 
26e00 77 68 65 6e 20 70 72 65 70 61 72 69 6e 67 20 61  when preparing a
26e10 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 71 75  ll subsequent qu
26e20 65 72 69 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f  eries..*/.case O
26e30 50 5f 4c 6f 61 64 41 6e 61 6c 79 73 69 73 3a 20  P_LoadAnalysis: 
26e40 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  {.  assert( pOp-
26e50 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
26e60 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 72  1<db->nDb );.  r
26e70 63 20 3d 20 73 71 6c 69 74 65 33 41 6e 61 6c 79  c = sqlite3Analy
26e80 73 69 73 4c 6f 61 64 28 64 62 2c 20 70 4f 70 2d  sisLoad(db, pOp-
26e90 3e 70 31 29 3b 0a 20 20 62 72 65 61 6b 3b 20 20  >p1);.  break;  
26ea0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
26eb0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
26ec0 54 5f 41 4e 41 4c 59 5a 45 29 20 2a 2f 0a 0a 2f  T_ANALYZE) */../
26ed0 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70 54 61  * Opcode: DropTa
26ee0 62 6c 65 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a  ble P1 * * P4 *.
26ef0 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  **.** Remove the
26f00 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65   internal (in-me
26f10 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72 75 63  mory) data struc
26f20 74 75 72 65 73 20 74 68 61 74 20 64 65 73 63 72  tures that descr
26f30 69 62 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ibe.** the table
26f40 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64 61 74   named P4 in dat
26f50 61 62 61 73 65 20 50 31 2e 20 20 54 68 69 73 20  abase P1.  This 
26f60 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
26f70 61 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 64 72  a table.** is dr
26f80 6f 70 70 65 64 20 69 6e 20 6f 72 64 65 72 20 74  opped in order t
26f90 6f 20 6b 65 65 70 20 74 68 65 20 69 6e 74 65 72  o keep the inter
26fa0 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69  nal representati
26fb0 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68  on of the.** sch
26fc0 65 6d 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  ema consistent w
26fd0 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64  ith what is on d
26fe0 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  isk..*/.case OP_
26ff0 44 72 6f 70 54 61 62 6c 65 3a 20 7b 0a 20 20 73  DropTable: {.  s
27000 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
27010 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
27020 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e  Op->p1, pOp->p4.
27030 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  z);.  break;.}..
27040 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70 49  /* Opcode: DropI
27050 6e 64 65 78 20 50 31 20 2a 20 2a 20 50 34 20 2a  ndex P1 * * P4 *
27060 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  .**.** Remove th
27070 65 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d  e internal (in-m
27080 65 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72 75  emory) data stru
27090 63 74 75 72 65 73 20 74 68 61 74 20 64 65 73 63  ctures that desc
270a0 72 69 62 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65  ribe.** the inde
270b0 78 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64 61  x named P4 in da
270c0 74 61 62 61 73 65 20 50 31 2e 20 20 54 68 69 73  tabase P1.  This
270d0 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
270e0 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 73 20   an index.** is 
270f0 64 72 6f 70 70 65 64 20 69 6e 20 6f 72 64 65 72  dropped in order
27100 20 74 6f 20 6b 65 65 70 20 74 68 65 20 69 6e 74   to keep the int
27110 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61  ernal representa
27120 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73  tion of the.** s
27130 63 68 65 6d 61 20 63 6f 6e 73 69 73 74 65 6e 74  chema consistent
27140 20 77 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e   with what is on
27150 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f   disk..*/.case O
27160 50 5f 44 72 6f 70 49 6e 64 65 78 3a 20 7b 0a 20  P_DropIndex: {. 
27170 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
27180 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  dDeleteIndex(db,
27190 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
271a0 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  4.z);.  break;.}
271b0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f  ../* Opcode: Dro
271c0 70 54 72 69 67 67 65 72 20 50 31 20 2a 20 2a 20  pTrigger P1 * * 
271d0 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76  P4 *.**.** Remov
271e0 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28  e the internal (
271f0 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20  in-memory) data 
27200 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20  structures that 
27210 64 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20  describe.** the 
27220 74 72 69 67 67 65 72 20 6e 61 6d 65 64 20 50 34  trigger named P4
27230 20 69 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e   in database P1.
27240 20 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64    This is called
27250 20 61 66 74 65 72 20 61 20 74 72 69 67 67 65 72   after a trigger
27260 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65 64 20 69  .** is dropped i
27270 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
27280 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70  the internal rep
27290 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
272a0 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e  he.** schema con
272b0 73 69 73 74 65 6e 74 20 77 69 74 68 20 77 68 61  sistent with wha
272c0 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f  t is on disk..*/
272d0 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70 54 72 69  .case OP_DropTri
272e0 67 67 65 72 3a 20 7b 0a 20 20 73 71 6c 69 74 65  gger: {.  sqlite
272f0 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
27300 54 72 69 67 67 65 72 28 64 62 2c 20 70 4f 70 2d  Trigger(db, pOp-
27310 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  >p1, pOp->p4.z);
27320 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69  .  break;.}...#i
27330 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27340 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
27350 4b 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74  K./* Opcode: Int
27360 65 67 72 69 74 79 43 6b 20 50 31 20 50 32 20 50  egrityCk P1 P2 P
27370 33 20 2a 20 50 35 0a 2a 2a 0a 2a 2a 20 44 6f 20  3 * P5.**.** Do 
27380 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 74  an analysis of t
27390 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  he currently ope
273a0 6e 20 64 61 74 61 62 61 73 65 2e 20 20 53 74 6f  n database.  Sto
273b0 72 65 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74 65  re in.** registe
273c0 72 20 50 31 20 74 68 65 20 74 65 78 74 20 6f 66  r P1 the text of
273d0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
273e0 65 20 64 65 73 63 72 69 62 69 6e 67 20 61 6e 79  e describing any
273f0 20 70 72 6f 62 6c 65 6d 73 2e 0a 2a 2a 20 49 66   problems..** If
27400 20 6e 6f 20 70 72 6f 62 6c 65 6d 73 20 61 72 65   no problems are
27410 20 66 6f 75 6e 64 2c 20 73 74 6f 72 65 20 61 20   found, store a 
27420 4e 55 4c 4c 20 69 6e 20 72 65 67 69 73 74 65 72  NULL in register
27430 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72   P1..**.** The r
27440 65 67 69 73 74 65 72 20 50 33 20 63 6f 6e 74 61  egister P3 conta
27450 69 6e 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ins the maximum 
27460 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 77 65  number of allowe
27470 64 20 65 72 72 6f 72 73 2e 0a 2a 2a 20 41 74 20  d errors..** At 
27480 6d 6f 73 74 20 72 65 67 28 50 33 29 20 65 72 72  most reg(P3) err
27490 6f 72 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ors will be repo
274a0 72 74 65 64 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65  rted..** In othe
274b0 72 20 77 6f 72 64 73 2c 20 74 68 65 20 61 6e 61  r words, the ana
274c0 6c 79 73 69 73 20 73 74 6f 70 73 20 61 73 20 73  lysis stops as s
274d0 6f 6f 6e 20 61 73 20 72 65 67 28 50 31 29 20 65  oon as reg(P1) e
274e0 72 72 6f 72 73 20 61 72 65 20 0a 2a 2a 20 73 65  rrors are .** se
274f0 65 6e 2e 20 20 52 65 67 28 50 31 29 20 69 73 20  en.  Reg(P1) is 
27500 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65  updated with the
27510 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
27520 73 20 72 65 6d 61 69 6e 69 6e 67 2e 0a 2a 2a 0a  s remaining..**.
27530 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  ** The root page
27540 20 6e 75 6d 62 65 72 73 20 6f 66 20 61 6c 6c 20   numbers of all 
27550 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 61  tables in the da
27560 74 61 62 61 73 65 20 61 72 65 20 69 6e 74 65 67  tabase are integ
27570 65 72 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  er.** stored in 
27580 72 65 67 28 50 31 29 2c 20 72 65 67 28 50 31 2b  reg(P1), reg(P1+
27590 31 29 2c 20 72 65 67 28 50 31 2b 32 29 2c 20 2e  1), reg(P1+2), .
275a0 2e 2e 2e 20 20 54 68 65 72 65 20 61 72 65 20 50  ...  There are P
275b0 32 20 74 61 62 6c 65 73 0a 2a 2a 20 74 6f 74 61  2 tables.** tota
275c0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69  l..**.** If P5 i
275d0 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 20  s not zero, the 
275e0 63 68 65 63 6b 20 69 73 20 64 6f 6e 65 20 6f 6e  check is done on
275f0 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
27600 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 2c  atabase.** file,
27610 20 6e 6f 74 20 74 68 65 20 6d 61 69 6e 20 64 61   not the main da
27620 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
27630 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69  ** This opcode i
27640 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
27650 65 6e 74 20 74 68 65 20 69 6e 74 65 67 72 69 74  ent the integrit
27660 79 5f 63 68 65 63 6b 20 70 72 61 67 6d 61 2e 0a  y_check pragma..
27670 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65 67  */.case OP_Integ
27680 72 69 74 79 43 6b 3a 20 7b 0a 20 20 69 6e 74 20  rityCk: {.  int 
27690 6e 52 6f 6f 74 3b 20 20 20 20 20 20 2f 2a 20 4e  nRoot;      /* N
276a0 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
276b0 74 6f 20 63 68 65 63 6b 2e 20 20 28 4e 75 6d 62  to check.  (Numb
276c0 65 72 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73  er of root pages
276d0 2e 29 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f  .) */.  int *aRo
276e0 6f 74 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79  ot;     /* Array
276f0 20 6f 66 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d   of rootpage num
27700 62 65 72 73 20 66 6f 72 20 74 61 62 6c 65 73 20  bers for tables 
27710 74 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f  to be checked */
27720 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
27730 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
27740 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72  er */.  int nErr
27750 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
27760 72 20 6f 66 20 65 72 72 6f 72 73 20 72 65 70 6f  r of errors repo
27770 72 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  rted */.  char *
27780 7a 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78  z;        /* Tex
27790 74 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 72  t of the error r
277a0 65 70 6f 72 74 20 2a 2f 0a 20 20 4d 65 6d 20 2a  eport */.  Mem *
277b0 70 6e 45 72 72 3b 20 20 20 20 20 2f 2a 20 52 65  pnErr;     /* Re
277c0 67 69 73 74 65 72 20 6b 65 65 70 69 6e 67 20 74  gister keeping t
277d0 72 61 63 6b 20 6f 66 20 65 72 72 6f 72 73 20 72  rack of errors r
277e0 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20  emaining */.  . 
277f0 20 6e 52 6f 6f 74 20 3d 20 70 4f 70 2d 3e 70 32   nRoot = pOp->p2
27800 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 6f 6f  ;.  assert( nRoo
27810 74 3e 30 20 29 3b 0a 20 20 61 52 6f 6f 74 20 3d  t>0 );.  aRoot =
27820 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
27830 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69  Raw(db, sizeof(i
27840 6e 74 29 2a 28 6e 52 6f 6f 74 2b 31 29 20 29 3b  nt)*(nRoot+1) );
27850 0a 20 20 69 66 28 20 61 52 6f 6f 74 3d 3d 30 20  .  if( aRoot==0 
27860 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
27870 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
27880 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 70  >0 && pOp->p3<=p
27890 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 6e 45 72  ->nMem );.  pnEr
278a0 72 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  r = &aMem[pOp->p
278b0 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  3];.  assert( (p
278c0 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26 20 4d 45  nErr->flags & ME
278d0 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20 61  M_Int)!=0 );.  a
278e0 73 73 65 72 74 28 20 28 70 6e 45 72 72 2d 3e 66  ssert( (pnErr->f
278f0 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c  lags & (MEM_Str|
27900 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 29 3b  MEM_Blob))==0 );
27910 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
27920 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 66 6f 72 28  pOp->p1];.  for(
27930 6a 3d 30 3b 20 6a 3c 6e 52 6f 6f 74 3b 20 6a 2b  j=0; j<nRoot; j+
27940 2b 29 7b 0a 20 20 20 20 61 52 6f 6f 74 5b 6a 5d  +){.    aRoot[j]
27950 20 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56   = (int)sqlite3V
27960 64 62 65 49 6e 74 56 61 6c 75 65 28 26 70 49 6e  dbeIntValue(&pIn
27970 31 5b 6a 5d 29 3b 0a 20 20 7d 0a 20 20 61 52 6f  1[j]);.  }.  aRo
27980 6f 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 61 73 73  ot[j] = 0;.  ass
27990 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c 64 62 2d  ert( pOp->p5<db-
279a0 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
279b0 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  ( (p->btreeMask 
279c0 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31 29 3c  & (((yDbMask)1)<
279d0 3c 70 4f 70 2d 3e 70 35 29 29 21 3d 30 20 29 3b  <pOp->p5))!=0 );
279e0 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 42 74  .  z = sqlite3Bt
279f0 72 65 65 49 6e 74 65 67 72 69 74 79 43 68 65 63  reeIntegrityChec
27a00 6b 28 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70  k(db->aDb[pOp->p
27a10 35 5d 2e 70 42 74 2c 20 61 52 6f 6f 74 2c 20 6e  5].pBt, aRoot, n
27a20 52 6f 6f 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Root,.          
27a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a40 20 20 20 20 20 20 20 28 69 6e 74 29 70 6e 45 72         (int)pnEr
27a50 72 2d 3e 75 2e 69 2c 20 26 6e 45 72 72 29 3b 0a  r->u.i, &nErr);.
27a60 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
27a70 64 62 2c 20 61 52 6f 6f 74 29 3b 0a 20 20 70 6e  db, aRoot);.  pn
27a80 45 72 72 2d 3e 75 2e 69 20 2d 3d 20 6e 45 72 72  Err->u.i -= nErr
27a90 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
27aa0 65 6d 53 65 74 4e 75 6c 6c 28 70 49 6e 31 29 3b  emSetNull(pIn1);
27ab0 0a 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 29  .  if( nErr==0 )
27ac0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 3d  {.    assert( z=
27ad0 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  =0 );.  }else if
27ae0 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  ( z==0 ){.    go
27af0 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c  to no_mem;.  }el
27b00 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
27b10 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 49 6e  dbeMemSetStr(pIn
27b20 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  1, z, -1, SQLITE
27b30 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33 5f 66  _UTF8, sqlite3_f
27b40 72 65 65 29 3b 0a 20 20 7d 0a 20 20 55 50 44 41  ree);.  }.  UPDA
27b50 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
27b60 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  pIn1);.  sqlite3
27b70 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69  VdbeChangeEncodi
27b80 6e 67 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69 6e  ng(pIn1, encodin
27b90 67 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  g);.  break;.}.#
27ba0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
27bb0 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
27bc0 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f  HECK */../* Opco
27bd0 64 65 3a 20 52 6f 77 53 65 74 41 64 64 20 50 31  de: RowSetAdd P1
27be0 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
27bf0 49 6e 73 65 72 74 20 74 68 65 20 69 6e 74 65 67  Insert the integ
27c00 65 72 20 76 61 6c 75 65 20 68 65 6c 64 20 62 79  er value held by
27c10 20 72 65 67 69 73 74 65 72 20 50 32 20 69 6e 74   register P2 int
27c20 6f 20 61 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65  o a boolean inde
27c30 78 0a 2a 2a 20 68 65 6c 64 20 69 6e 20 72 65 67  x.** held in reg
27c40 69 73 74 65 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20  ister P1..**.** 
27c50 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69  An assertion fai
27c60 6c 73 20 69 66 20 50 32 20 69 73 20 6e 6f 74 20  ls if P2 is not 
27c70 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 63  an integer..*/.c
27c80 61 73 65 20 4f 50 5f 52 6f 77 53 65 74 41 64 64  ase OP_RowSetAdd
27c90 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 69 6e 31  : {       /* in1
27ca0 2c 20 69 6e 32 20 2a 2f 0a 20 20 70 49 6e 31 20  , in2 */.  pIn1 
27cb0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
27cc0 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d  ;.  pIn2 = &aMem
27cd0 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73  [pOp->p2];.  ass
27ce0 65 72 74 28 20 28 70 49 6e 32 2d 3e 66 6c 61 67  ert( (pIn2->flag
27cf0 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  s & MEM_Int)!=0 
27d00 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  );.  if( (pIn1->
27d10 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
27d20 65 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  et)==0 ){.    sq
27d30 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 52  lite3VdbeMemSetR
27d40 6f 77 53 65 74 28 70 49 6e 31 29 3b 0a 20 20 20  owSet(pIn1);.   
27d50 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
27d60 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d  s & MEM_RowSet)=
27d70 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
27d80 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  ;.  }.  sqlite3R
27d90 6f 77 53 65 74 49 6e 73 65 72 74 28 70 49 6e 31  owSetInsert(pIn1
27da0 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20 70 49 6e  ->u.pRowSet, pIn
27db0 32 2d 3e 75 2e 69 29 3b 0a 20 20 62 72 65 61 6b  2->u.i);.  break
27dc0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
27dd0 52 6f 77 53 65 74 52 65 61 64 20 50 31 20 50 32  RowSetRead P1 P2
27de0 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 45 78   P3 * *.**.** Ex
27df0 74 72 61 63 74 20 74 68 65 20 73 6d 61 6c 6c 65  tract the smalle
27e00 73 74 20 76 61 6c 75 65 20 66 72 6f 6d 20 62 6f  st value from bo
27e10 6f 6c 65 61 6e 20 69 6e 64 65 78 20 50 31 20 61  olean index P1 a
27e20 6e 64 20 70 75 74 20 74 68 61 74 20 76 61 6c 75  nd put that valu
27e30 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74  e into.** regist
27e40 65 72 20 50 33 2e 20 20 4f 72 2c 20 69 66 20 62  er P3.  Or, if b
27e50 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20 50 31 20  oolean index P1 
27e60 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70  is initially emp
27e70 74 79 2c 20 6c 65 61 76 65 20 50 33 0a 2a 2a 20  ty, leave P3.** 
27e80 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 6a 75  unchanged and ju
27e90 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f  mp to instructio
27ea0 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  n P2..*/.case OP
27eb0 5f 52 6f 77 53 65 74 52 65 61 64 3a 20 7b 20 20  _RowSetRead: {  
27ec0 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
27ed0 31 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34  1, out3 */.  i64
27ee0 20 76 61 6c 3b 0a 20 20 43 48 45 43 4b 5f 46 4f   val;.  CHECK_FO
27ef0 52 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 70  R_INTERRUPT;.  p
27f00 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
27f10 3e 70 31 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e  >p1];.  if( (pIn
27f20 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  1->flags & MEM_R
27f30 6f 77 53 65 74 29 3d 3d 30 20 0a 20 20 20 7c 7c  owSet)==0 .   ||
27f40 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74 4e 65   sqlite3RowSetNe
27f50 78 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53  xt(pIn1->u.pRowS
27f60 65 74 2c 20 26 76 61 6c 29 3d 3d 30 0a 20 20 29  et, &val)==0.  )
27f70 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 62 6f 6f  {.    /* The boo
27f80 6c 65 61 6e 20 69 6e 64 65 78 20 69 73 20 65 6d  lean index is em
27f90 70 74 79 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  pty */.    sqlit
27fa0 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c  e3VdbeMemSetNull
27fb0 28 70 49 6e 31 29 3b 0a 20 20 20 20 70 63 20 3d  (pIn1);.    pc =
27fc0 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
27fd0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 20  }else{.    /* A 
27fe0 76 61 6c 75 65 20 77 61 73 20 70 75 6c 6c 65 64  value was pulled
27ff0 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
28000 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
28010 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 26 61  beMemSetInt64(&a
28020 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2c 20 76 61  Mem[pOp->p3], va
28030 6c 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  l);.  }.  break;
28040 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  .}../* Opcode: R
28050 6f 77 53 65 74 54 65 73 74 20 50 31 20 50 32 20  owSetTest P1 P2 
28060 50 33 20 50 34 0a 2a 2a 0a 2a 2a 20 52 65 67 69  P3 P4.**.** Regi
28070 73 74 65 72 20 50 33 20 69 73 20 61 73 73 75 6d  ster P3 is assum
28080 65 64 20 74 6f 20 68 6f 6c 64 20 61 20 36 34 2d  ed to hold a 64-
28090 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75  bit integer valu
280a0 65 2e 20 49 66 20 72 65 67 69 73 74 65 72 20 50  e. If register P
280b0 31 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20  1.** contains a 
280c0 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 61 6e  RowSet object an
280d0 64 20 74 68 61 74 20 52 6f 77 53 65 74 20 6f 62  d that RowSet ob
280e0 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ject contains.**
280f0 20 74 68 65 20 76 61 6c 75 65 20 68 65 6c 64 20   the value held 
28100 69 6e 20 50 33 2c 20 6a 75 6d 70 20 74 6f 20 72  in P3, jump to r
28110 65 67 69 73 74 65 72 20 50 32 2e 20 4f 74 68 65  egister P2. Othe
28120 72 77 69 73 65 2c 20 69 6e 73 65 72 74 20 74 68  rwise, insert th
28130 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69 6e 20  e.** integer in 
28140 50 33 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53  P3 into the RowS
28150 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 20  et and continue 
28160 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 78  on to the.** nex
28170 74 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  t opcode..**.** 
28180 54 68 65 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  The RowSet objec
28190 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 66  t is optimized f
281a0 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 72  or the case wher
281b0 65 20 73 75 63 63 65 73 73 69 76 65 20 73 65 74  e successive set
281c0 73 0a 2a 2a 20 6f 66 20 69 6e 74 65 67 65 72 73  s.** of integers
281d0 2c 20 77 68 65 72 65 20 65 61 63 68 20 73 65 74  , where each set
281e0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 75 70   contains no dup
281f0 6c 69 63 61 74 65 73 2e 20 45 61 63 68 20 73 65  licates. Each se
28200 74 0a 2a 2a 20 6f 66 20 76 61 6c 75 65 73 20 69  t.** of values i
28210 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
28220 61 20 75 6e 69 71 75 65 20 50 34 20 76 61 6c 75  a unique P4 valu
28230 65 2e 20 54 68 65 20 66 69 72 73 74 20 73 65 74  e. The first set
28240 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 50 34  .** must have P4
28250 3d 3d 30 2c 20 74 68 65 20 66 69 6e 61 6c 20 73  ==0, the final s
28260 65 74 20 50 34 3d 2d 31 2e 20 20 50 34 20 6d 75  et P4=-1.  P4 mu
28270 73 74 20 62 65 20 65 69 74 68 65 72 20 2d 31 20  st be either -1 
28280 6f 72 0a 2a 2a 20 6e 6f 6e 2d 6e 65 67 61 74 69  or.** non-negati
28290 76 65 2e 20 20 46 6f 72 20 6e 6f 6e 2d 6e 65 67  ve.  For non-neg
282a0 61 74 69 76 65 20 76 61 6c 75 65 73 20 6f 66 20  ative values of 
282b0 50 34 20 6f 6e 6c 79 20 74 68 65 20 6c 6f 77 65  P4 only the lowe
282c0 72 20 34 0a 2a 2a 20 62 69 74 73 20 61 72 65 20  r 4.** bits are 
282d0 73 69 67 6e 69 66 69 63 61 6e 74 2e 0a 2a 2a 0a  significant..**.
282e0 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 6f  ** This allows o
282f0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 3a 20 28 61  ptimizations: (a
28300 29 20 77 68 65 6e 20 50 34 3d 3d 30 20 74 68 65  ) when P4==0 the
28310 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
28320 20 74 65 73 74 0a 2a 2a 20 74 68 65 20 72 6f 77   test.** the row
28330 73 65 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 50  set object for P
28340 33 2c 20 61 73 20 69 74 20 69 73 20 67 75 61 72  3, as it is guar
28350 61 6e 74 65 65 64 20 6e 6f 74 20 74 6f 20 63 6f  anteed not to co
28360 6e 74 61 69 6e 20 69 74 2c 0a 2a 2a 20 28 62 29  ntain it,.** (b)
28370 20 77 68 65 6e 20 50 34 3d 3d 2d 31 20 74 68 65   when P4==-1 the
28380 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
28390 20 69 6e 73 65 72 74 20 74 68 65 20 76 61 6c 75   insert the valu
283a0 65 2c 20 61 73 20 69 74 20 77 69 6c 6c 0a 2a 2a  e, as it will.**
283b0 20 6e 65 76 65 72 20 62 65 20 74 65 73 74 65 64   never be tested
283c0 20 66 6f 72 2c 20 61 6e 64 20 28 63 29 20 77 68   for, and (c) wh
283d0 65 6e 20 61 20 76 61 6c 75 65 20 74 68 61 74 20  en a value that 
283e0 69 73 20 70 61 72 74 20 6f 66 20 73 65 74 20 58  is part of set X
283f0 20 69 73 0a 2a 2a 20 69 6e 73 65 72 74 65 64 2c   is.** inserted,
28400 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
28410 64 20 74 6f 20 73 65 61 72 63 68 20 74 6f 20 73  d to search to s
28420 65 65 20 69 66 20 74 68 65 20 73 61 6d 65 20 76  ee if the same v
28430 61 6c 75 65 20 77 61 73 0a 2a 2a 20 70 72 65 76  alue was.** prev
28440 69 6f 75 73 6c 79 20 69 6e 73 65 72 74 65 64 20  iously inserted 
28450 61 73 20 70 61 72 74 20 6f 66 20 73 65 74 20 58  as part of set X
28460 20 28 6f 6e 6c 79 20 69 66 20 69 74 20 77 61 73   (only if it was
28470 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 69   previously.** i
28480 6e 73 65 72 74 65 64 20 61 73 20 70 61 72 74 20  nserted as part 
28490 6f 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 65  of some other se
284a0 74 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  t)..*/.case OP_R
284b0 6f 77 53 65 74 54 65 73 74 3a 20 7b 20 20 20 20  owSetTest: {    
284c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284d0 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69   /* jump, in1, i
284e0 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 74  n3 */.  int iSet
284f0 3b 0a 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a  ;.  int exists;.
28500 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
28510 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 33  pOp->p1];.  pIn3
28520 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
28530 5d 3b 0a 20 20 69 53 65 74 20 3d 20 70 4f 70 2d  ];.  iSet = pOp-
28540 3e 70 34 2e 69 3b 0a 20 20 61 73 73 65 72 74 28  >p4.i;.  assert(
28550 20 70 49 6e 33 2d 3e 66 6c 61 67 73 26 4d 45 4d   pIn3->flags&MEM
28560 5f 49 6e 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  _Int );..  /* If
28570 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69   there is anythi
28580 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
28590 72 6f 77 73 65 74 20 6f 62 6a 65 63 74 20 69 6e  rowset object in
285a0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 50 31 2c   memory cell P1,
285b0 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20 69 74 20  .  ** delete it 
285c0 6e 6f 77 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  now and initiali
285d0 7a 65 20 50 31 20 77 69 74 68 20 61 6e 20 65 6d  ze P1 with an em
285e0 70 74 79 20 72 6f 77 73 65 74 0a 20 20 2a 2f 0a  pty rowset.  */.
285f0 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
28600 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29  gs & MEM_RowSet)
28610 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
28620 65 33 56 64 62 65 4d 65 6d 53 65 74 52 6f 77 53  e3VdbeMemSetRowS
28630 65 74 28 70 49 6e 31 29 3b 0a 20 20 20 20 69 66  et(pIn1);.    if
28640 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
28650 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20   MEM_RowSet)==0 
28660 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
28670 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f   }..  assert( pO
28680 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
28690 54 33 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  T32 );.  assert(
286a0 20 69 53 65 74 3d 3d 2d 31 20 7c 7c 20 69 53 65   iSet==-1 || iSe
286b0 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 53  t>=0 );.  if( iS
286c0 65 74 20 29 7b 0a 20 20 20 20 65 78 69 73 74 73  et ){.    exists
286d0 20 3d 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74   = sqlite3RowSet
286e0 54 65 73 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f  Test(pIn1->u.pRo
286f0 77 53 65 74 2c 20 0a 20 20 20 20 20 20 20 20 20  wSet, .         
28700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28710 20 20 20 20 20 20 28 75 38 29 28 69 53 65 74 3e        (u8)(iSet>
28720 3d 30 20 3f 20 69 53 65 74 20 26 20 30 78 66 20  =0 ? iSet & 0xf 
28730 3a 20 30 78 66 66 29 2c 0a 20 20 20 20 20 20 20  : 0xff),.       
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28750 20 20 20 20 20 20 20 20 70 49 6e 33 2d 3e 75 2e          pIn3->u.
28760 69 29 3b 0a 20 20 20 20 69 66 28 20 65 78 69 73  i);.    if( exis
28770 74 73 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d  ts ){.      pc =
28780 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
28790 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
287a0 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 65 74 3e  .  }.  if( iSet>
287b0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
287c0 33 52 6f 77 53 65 74 49 6e 73 65 72 74 28 70 49  3RowSetInsert(pI
287d0 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20 70  n1->u.pRowSet, p
287e0 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 7d 0a 20  In3->u.i);.  }. 
287f0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e   break;.}...#ifn
28800 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28810 54 52 49 47 47 45 52 0a 0a 2f 2a 20 4f 70 63 6f  TRIGGER../* Opco
28820 64 65 3a 20 50 72 6f 67 72 61 6d 20 50 31 20 50  de: Program P1 P
28830 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  2 P3 P4 *.**.** 
28840 45 78 65 63 75 74 65 20 74 68 65 20 74 72 69 67  Execute the trig
28850 67 65 72 20 70 72 6f 67 72 61 6d 20 70 61 73 73  ger program pass
28860 65 64 20 61 73 20 50 34 20 28 74 79 70 65 20 50  ed as P4 (type P
28870 34 5f 53 55 42 50 52 4f 47 52 41 4d 29 2e 20 0a  4_SUBPROGRAM). .
28880 2a 2a 0a 2a 2a 20 50 31 20 63 6f 6e 74 61 69 6e  **.** P1 contain
28890 73 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  s the address of
288a0 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
288b0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
288c0 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72 79 20  he first memory 
288d0 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61  .** cell in an a
288e0 72 72 61 79 20 6f 66 20 76 61 6c 75 65 73 20 75  rray of values u
288f0 73 65 64 20 61 73 20 61 72 67 75 6d 65 6e 74 73  sed as arguments
28900 20 74 6f 20 74 68 65 20 73 75 62 2d 70 72 6f 67   to the sub-prog
28910 72 61 6d 2e 20 50 32 20 0a 2a 2a 20 63 6f 6e 74  ram. P2 .** cont
28920 61 69 6e 73 20 74 68 65 20 61 64 64 72 65 73 73  ains the address
28930 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66 20 74   to jump to if t
28940 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 74  he sub-program t
28950 68 72 6f 77 73 20 61 6e 20 49 47 4e 4f 52 45 20  hrows an IGNORE 
28960 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 75 73  .** exception us
28970 69 6e 67 20 74 68 65 20 52 41 49 53 45 28 29 20  ing the RAISE() 
28980 66 75 6e 63 74 69 6f 6e 2e 20 52 65 67 69 73 74  function. Regist
28990 65 72 20 50 33 20 63 6f 6e 74 61 69 6e 73 20 74  er P3 contains t
289a0 68 65 20 61 64 64 72 65 73 73 20 0a 2a 2a 20 6f  he address .** o
289b0 66 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  f a memory cell 
289c0 69 6e 20 74 68 69 73 20 28 74 68 65 20 70 61 72  in this (the par
289d0 65 6e 74 29 20 56 4d 20 74 68 61 74 20 69 73 20  ent) VM that is 
289e0 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
289f0 20 74 68 65 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20   the .** memory 
28a00 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
28a10 73 75 62 2d 76 64 62 65 20 61 74 20 72 75 6e 74  sub-vdbe at runt
28a20 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  ime..**.** P4 is
28a30 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
28a40 65 20 56 4d 20 63 6f 6e 74 61 69 6e 69 6e 67 20  e VM containing 
28a50 74 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67  the trigger prog
28a60 72 61 6d 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ram..*/.case OP_
28a70 50 72 6f 67 72 61 6d 3a 20 7b 20 20 20 20 20 20  Program: {      
28a80 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69    /* jump */.  i
28a90 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20  nt nMem;        
28aa0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
28ab0 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 67 69 73   of memory regis
28ac0 74 65 72 73 20 66 6f 72 20 73 75 62 2d 70 72 6f  ters for sub-pro
28ad0 67 72 61 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  gram */.  int nB
28ae0 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
28af0 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 72 75    /* Bytes of ru
28b00 6e 74 69 6d 65 20 73 70 61 63 65 20 72 65 71 75  ntime space requ
28b10 69 72 65 64 20 66 6f 72 20 73 75 62 2d 70 72 6f  ired for sub-pro
28b20 67 72 61 6d 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  gram */.  Mem *p
28b30 52 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Rt;             
28b40 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f    /* Register to
28b50 20 61 6c 6c 6f 63 61 74 65 20 72 75 6e 74 69 6d   allocate runtim
28b60 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 4d 65 6d  e space */.  Mem
28b70 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   *pMem;         
28b80 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
28b90 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
28ba0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 2a 2f 0a  memory cells */.
28bb0 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 20 20 20 20    Mem *pEnd;    
28bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
28bd0 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  t memory cell in
28be0 20 6e 65 77 20 61 72 72 61 79 20 2a 2f 0a 20 20   new array */.  
28bf0 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
28c00 65 3b 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 76  e;      /* New v
28c10 64 62 65 20 66 72 61 6d 65 20 74 6f 20 65 78 65  dbe frame to exe
28c20 63 75 74 65 20 69 6e 20 2a 2f 0a 20 20 53 75 62  cute in */.  Sub
28c30 50 72 6f 67 72 61 6d 20 2a 70 50 72 6f 67 72 61  Program *pProgra
28c40 6d 3b 20 20 20 2f 2a 20 53 75 62 2d 70 72 6f 67  m;   /* Sub-prog
28c50 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20 2a  ram to execute *
28c60 2f 0a 20 20 76 6f 69 64 20 2a 74 3b 20 20 20 20  /.  void *t;    
28c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28c80 6f 6b 65 6e 20 69 64 65 6e 74 69 66 79 69 6e 67  oken identifying
28c90 20 74 72 69 67 67 65 72 20 2a 2f 0a 0a 20 20 70   trigger */..  p
28ca0 50 72 6f 67 72 61 6d 20 3d 20 70 4f 70 2d 3e 70  Program = pOp->p
28cb0 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 52  4.pProgram;.  pR
28cc0 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
28cd0 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  3];.  assert( pP
28ce0 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3e 30 20 29 3b  rogram->nOp>0 );
28cf0 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .  .  /* If the 
28d00 70 35 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  p5 flag is clear
28d10 2c 20 74 68 65 6e 20 72 65 63 75 72 73 69 76 65  , then recursive
28d20 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
28d30 72 69 67 67 65 72 73 20 69 73 20 0a 20 20 2a 2a  riggers is .  **
28d40 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 62 61   disabled for ba
28d50 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
28d60 69 6c 69 74 79 20 28 70 35 20 69 73 20 73 65 74  ility (p5 is set
28d70 20 69 66 20 74 68 69 73 20 73 75 62 2d 70 72 6f   if this sub-pro
28d80 67 72 61 6d 0a 20 20 2a 2a 20 69 73 20 72 65 61  gram.  ** is rea
28d90 6c 6c 79 20 61 20 74 72 69 67 67 65 72 2c 20 6e  lly a trigger, n
28da0 6f 74 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  ot a foreign key
28db0 20 61 63 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65   action, and the
28dc0 20 66 6c 61 67 20 73 65 74 0a 20 20 2a 2a 20 61   flag set.  ** a
28dd0 6e 64 20 63 6c 65 61 72 65 64 20 62 79 20 74 68  nd cleared by th
28de0 65 20 22 50 52 41 47 4d 41 20 72 65 63 75 72 73  e "PRAGMA recurs
28df0 69 76 65 5f 74 72 69 67 67 65 72 73 22 20 63 6f  ive_triggers" co
28e00 6d 6d 61 6e 64 20 69 73 20 63 6c 65 61 72 29 2e  mmand is clear).
28e10 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 74 20 69  .  ** .  ** It i
28e20 73 20 72 65 63 75 72 73 69 76 65 20 69 6e 76 6f  s recursive invo
28e30 63 61 74 69 6f 6e 20 6f 66 20 74 72 69 67 67 65  cation of trigge
28e40 72 73 2c 20 61 74 20 74 68 65 20 53 51 4c 20 6c  rs, at the SQL l
28e50 65 76 65 6c 2c 20 74 68 61 74 20 69 73 20 0a 20  evel, that is . 
28e60 20 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20 49 6e   ** disabled. In
28e70 20 73 6f 6d 65 20 63 61 73 65 73 20 61 20 73 69   some cases a si
28e80 6e 67 6c 65 20 74 72 69 67 67 65 72 20 6d 61 79  ngle trigger may
28e90 20 67 65 6e 65 72 61 74 65 20 6d 6f 72 65 20 74   generate more t
28ea0 68 61 6e 20 6f 6e 65 20 0a 20 20 2a 2a 20 53 75  han one .  ** Su
28eb0 62 50 72 6f 67 72 61 6d 20 28 69 66 20 74 68 65  bProgram (if the
28ec0 20 74 72 69 67 67 65 72 20 6d 61 79 20 62 65 20   trigger may be 
28ed0 65 78 65 63 75 74 65 64 20 77 69 74 68 20 6d 6f  executed with mo
28ee0 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 69 66 66  re than one diff
28ef0 65 72 65 6e 74 20 0a 20 20 2a 2a 20 4f 4e 20 43  erent .  ** ON C
28f00 4f 4e 46 4c 49 43 54 20 61 6c 67 6f 72 69 74 68  ONFLICT algorith
28f10 6d 29 2e 20 53 75 62 50 72 6f 67 72 61 6d 20 73  m). SubProgram s
28f20 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
28f30 61 74 65 64 20 77 69 74 68 20 61 0a 20 20 2a 2a  ated with a.  **
28f40 20 73 69 6e 67 6c 65 20 74 72 69 67 67 65 72 20   single trigger 
28f50 61 6c 6c 20 68 61 76 65 20 74 68 65 20 73 61 6d  all have the sam
28f60 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
28f70 53 75 62 50 72 6f 67 72 61 6d 2e 74 6f 6b 65 6e  SubProgram.token
28f80 20 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e   .  ** variable.
28f90 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e    */.  if( pOp->
28fa0 70 35 20 29 7b 0a 20 20 20 20 74 20 3d 20 70 50  p5 ){.    t = pP
28fb0 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 20  rogram->token;. 
28fc0 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d     for(pFrame=p-
28fd0 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 20  >pFrame; pFrame 
28fe0 26 26 20 70 46 72 61 6d 65 2d 3e 74 6f 6b 65 6e  && pFrame->token
28ff0 21 3d 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61  !=t; pFrame=pFra
29000 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  me->pParent);.  
29010 20 20 69 66 28 20 70 46 72 61 6d 65 20 29 20 62    if( pFrame ) b
29020 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  reak;.  }..  if(
29030 20 70 2d 3e 6e 46 72 61 6d 65 3e 3d 64 62 2d 3e   p->nFrame>=db->
29040 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
29050 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
29060 48 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  H] ){.    rc = S
29070 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
29080 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
29090 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  g(&p->zErrMsg, d
290a0 62 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 6c 65 76  b, "too many lev
290b0 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20 72  els of trigger r
290c0 65 63 75 72 73 69 6f 6e 22 29 3b 0a 20 20 20 20  ecursion");.    
290d0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
290e0 20 52 65 67 69 73 74 65 72 20 70 52 74 20 69 73   Register pRt is
290f0 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
29100 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72  he memory requir
29110 65 64 20 74 6f 20 73 61 76 65 20 74 68 65 20 73  ed to save the s
29120 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tate.  ** of the
29130 20 63 75 72 72 65 6e 74 20 70 72 6f 67 72 61 6d   current program
29140 2c 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79  , and the memory
29150 20 72 65 71 75 69 72 65 64 20 61 74 20 72 75 6e   required at run
29160 74 69 6d 65 20 74 6f 20 65 78 65 63 75 74 65 0a  time to execute.
29170 20 20 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72    ** the trigger
29180 20 70 72 6f 67 72 61 6d 2e 20 49 66 20 74 68 69   program. If thi
29190 73 20 74 72 69 67 67 65 72 20 68 61 73 20 62 65  s trigger has be
291a0 65 6e 20 66 69 72 65 64 20 62 65 66 6f 72 65 2c  en fired before,
291b0 20 74 68 65 6e 20 70 52 74 20 0a 20 20 2a 2a 20   then pRt .  ** 
291c0 69 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  is already alloc
291d0 61 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ated. Otherwise,
291e0 20 69 74 20 6d 75 73 74 20 62 65 20 69 6e 69 74   it must be init
291f0 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20 20 69  ialized.  */.  i
29200 66 28 20 28 70 52 74 2d 3e 66 6c 61 67 73 26 4d  f( (pRt->flags&M
29210 45 4d 5f 46 72 61 6d 65 29 3d 3d 30 20 29 7b 0a  EM_Frame)==0 ){.
29220 20 20 20 20 2f 2a 20 53 75 62 50 72 6f 67 72 61      /* SubProgra
29230 6d 2e 6e 4d 65 6d 20 69 73 20 73 65 74 20 74 6f  m.nMem is set to
29240 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
29250 65 6d 6f 72 79 20 63 65 6c 6c 73 20 75 73 65 64  emory cells used
29260 20 62 79 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   by the .    ** 
29270 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69  program stored i
29280 6e 20 53 75 62 50 72 6f 67 72 61 6d 2e 61 4f 70  n SubProgram.aOp
29290 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65  . As well as the
292a0 73 65 2c 20 6f 6e 65 20 6d 65 6d 6f 72 79 0a 20  se, one memory. 
292b0 20 20 20 2a 2a 20 63 65 6c 6c 20 69 73 20 72 65     ** cell is re
292c0 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
292d0 63 75 72 73 6f 72 20 75 73 65 64 20 62 79 20 74  cursor used by t
292e0 68 65 20 70 72 6f 67 72 61 6d 2e 20 53 65 74 20  he program. Set 
292f0 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
29300 69 61 62 6c 65 20 6e 4d 65 6d 20 28 61 6e 64 20  iable nMem (and 
29310 6c 61 74 65 72 2c 20 56 64 62 65 46 72 61 6d 65  later, VdbeFrame
29320 2e 6e 43 68 69 6c 64 4d 65 6d 29 20 74 6f 20 74  .nChildMem) to t
29330 68 69 73 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a  his value..    *
29340 2f 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 70 50 72  /.    nMem = pPr
29350 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20 2b 20 70 50  ogram->nMem + pP
29360 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b 0a 20 20  rogram->nCsr;.  
29370 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
29380 28 73 69 7a 65 6f 66 28 56 64 62 65 46 72 61 6d  (sizeof(VdbeFram
29390 65 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  e)).            
293a0 20 20 2b 20 6e 4d 65 6d 20 2a 20 73 69 7a 65 6f    + nMem * sizeo
293b0 66 28 4d 65 6d 29 0a 20 20 20 20 20 20 20 20 20  f(Mem).         
293c0 20 20 20 20 20 2b 20 70 50 72 6f 67 72 61 6d 2d       + pProgram-
293d0 3e 6e 43 73 72 20 2a 20 73 69 7a 65 6f 66 28 56  >nCsr * sizeof(V
293e0 64 62 65 43 75 72 73 6f 72 20 2a 29 0a 20 20 20  dbeCursor *).   
293f0 20 20 20 20 20 20 20 20 20 20 20 2b 20 70 50 72             + pPr
29400 6f 67 72 61 6d 2d 3e 6e 4f 6e 63 65 20 2a 20 73  ogram->nOnce * s
29410 69 7a 65 6f 66 28 75 38 29 3b 0a 20 20 20 20 70  izeof(u8);.    p
29420 46 72 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  Frame = sqlite3D
29430 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
29440 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
29450 21 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 20  !pFrame ){.     
29460 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
29470 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
29480 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 52  dbeMemRelease(pR
29490 74 29 3b 0a 20 20 20 20 70 52 74 2d 3e 66 6c 61  t);.    pRt->fla
294a0 67 73 20 3d 20 4d 45 4d 5f 46 72 61 6d 65 3b 0a  gs = MEM_Frame;.
294b0 20 20 20 20 70 52 74 2d 3e 75 2e 70 46 72 61 6d      pRt->u.pFram
294c0 65 20 3d 20 70 46 72 61 6d 65 3b 0a 0a 20 20 20  e = pFrame;..   
294d0 20 70 46 72 61 6d 65 2d 3e 76 20 3d 20 70 3b 0a   pFrame->v = p;.
294e0 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69      pFrame->nChi
294f0 6c 64 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20  ldMem = nMem;.  
29500 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64    pFrame->nChild
29510 43 73 72 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e  Csr = pProgram->
29520 6e 43 73 72 3b 0a 20 20 20 20 70 46 72 61 6d 65  nCsr;.    pFrame
29530 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 70  ->pc = pc;.    p
29540 46 72 61 6d 65 2d 3e 61 4d 65 6d 20 3d 20 70 2d  Frame->aMem = p-
29550 3e 61 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d  >aMem;.    pFram
29560 65 2d 3e 6e 4d 65 6d 20 3d 20 70 2d 3e 6e 4d 65  e->nMem = p->nMe
29570 6d 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 61  m;.    pFrame->a
29580 70 43 73 72 20 3d 20 70 2d 3e 61 70 43 73 72 3b  pCsr = p->apCsr;
29590 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43 75  .    pFrame->nCu
295a0 72 73 6f 72 20 3d 20 70 2d 3e 6e 43 75 72 73 6f  rsor = p->nCurso
295b0 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 61  r;.    pFrame->a
295c0 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20  Op = p->aOp;.   
295d0 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 20 3d 20 70   pFrame->nOp = p
295e0 2d 3e 6e 4f 70 3b 0a 20 20 20 20 70 46 72 61 6d  ->nOp;.    pFram
295f0 65 2d 3e 74 6f 6b 65 6e 20 3d 20 70 50 72 6f 67  e->token = pProg
29600 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  ram->token;.    
29610 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61  pFrame->aOnceFla
29620 67 20 3d 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67  g = p->aOnceFlag
29630 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 4f  ;.    pFrame->nO
29640 6e 63 65 46 6c 61 67 20 3d 20 70 2d 3e 6e 4f 6e  nceFlag = p->nOn
29650 63 65 46 6c 61 67 3b 0a 0a 20 20 20 20 70 45 6e  ceFlag;..    pEn
29660 64 20 3d 20 26 56 64 62 65 46 72 61 6d 65 4d 65  d = &VdbeFrameMe
29670 6d 28 70 46 72 61 6d 65 29 5b 70 46 72 61 6d 65  m(pFrame)[pFrame
29680 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20  ->nChildMem];.  
29690 20 20 66 6f 72 28 70 4d 65 6d 3d 56 64 62 65 46    for(pMem=VdbeF
296a0 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65 29 3b  rameMem(pFrame);
296b0 20 70 4d 65 6d 21 3d 70 45 6e 64 3b 20 70 4d 65   pMem!=pEnd; pMe
296c0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d  m++){.      pMem
296d0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
296e0 76 61 6c 69 64 3b 0a 20 20 20 20 20 20 70 4d 65  valid;.      pMe
296f0 6d 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  m->db = db;.    
29700 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
29710 46 72 61 6d 65 20 3d 20 70 52 74 2d 3e 75 2e 70  Frame = pRt->u.p
29720 46 72 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72  Frame;.    asser
29730 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65  t( pProgram->nMe
29740 6d 2b 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72  m+pProgram->nCsr
29750 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64  ==pFrame->nChild
29760 4d 65 6d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Mem );.    asser
29770 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73  t( pProgram->nCs
29780 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c  r==pFrame->nChil
29790 64 43 73 72 20 29 3b 0a 20 20 20 20 61 73 73 65  dCsr );.    asse
297a0 72 74 28 20 70 63 3d 3d 70 46 72 61 6d 65 2d 3e  rt( pc==pFrame->
297b0 70 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e  pc );.  }..  p->
297c0 6e 46 72 61 6d 65 2b 2b 3b 0a 20 20 70 46 72 61  nFrame++;.  pFra
297d0 6d 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 2d  me->pParent = p-
297e0 3e 70 46 72 61 6d 65 3b 0a 20 20 70 46 72 61 6d  >pFrame;.  pFram
297f0 65 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6c  e->lastRowid = l
29800 61 73 74 52 6f 77 69 64 3b 0a 20 20 70 46 72 61  astRowid;.  pFra
29810 6d 65 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 2d  me->nChange = p-
29820 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 70 2d 3e 6e  >nChange;.  p->n
29830 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d  Change = 0;.  p-
29840 3e 70 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65  >pFrame = pFrame
29850 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 4d  ;.  p->aMem = aM
29860 65 6d 20 3d 20 26 56 64 62 65 46 72 61 6d 65 4d  em = &VdbeFrameM
29870 65 6d 28 70 46 72 61 6d 65 29 5b 2d 31 5d 3b 0a  em(pFrame)[-1];.
29880 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61    p->nMem = pFra
29890 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 3b 0a 20  me->nChildMem;. 
298a0 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75   p->nCursor = (u
298b0 31 36 29 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c  16)pFrame->nChil
298c0 64 43 73 72 3b 0a 20 20 70 2d 3e 61 70 43 73 72  dCsr;.  p->apCsr
298d0 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
298e0 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 2b  *)&aMem[p->nMem+
298f0 31 5d 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 61  1];.  p->aOp = a
29900 4f 70 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 61  Op = pProgram->a
29910 4f 70 3b 0a 20 20 70 2d 3e 6e 4f 70 20 3d 20 70  Op;.  p->nOp = p
29920 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3b 0a 20 20  Program->nOp;.  
29930 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 28  p->aOnceFlag = (
29940 75 38 20 2a 29 26 70 2d 3e 61 70 43 73 72 5b 70  u8 *)&p->apCsr[p
29950 2d 3e 6e 43 75 72 73 6f 72 5d 3b 0a 20 20 70 2d  ->nCursor];.  p-
29960 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 50 72  >nOnceFlag = pPr
29970 6f 67 72 61 6d 2d 3e 6e 4f 6e 63 65 3b 0a 20 20  ogram->nOnce;.  
29980 70 63 20 3d 20 2d 31 3b 0a 20 20 6d 65 6d 73 65  pc = -1;.  memse
29990 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20  t(p->aOnceFlag, 
299a0 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29  0, p->nOnceFlag)
299b0 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  ;..  break;.}../
299c0 2a 20 4f 70 63 6f 64 65 3a 20 50 61 72 61 6d 20  * Opcode: Param 
299d0 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
299e0 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73  * This opcode is
299f0 20 6f 6e 6c 79 20 65 76 65 72 20 70 72 65 73 65   only ever prese
29a00 6e 74 20 69 6e 20 73 75 62 2d 70 72 6f 67 72 61  nt in sub-progra
29a10 6d 73 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68  ms called via th
29a20 65 20 0a 2a 2a 20 4f 50 5f 50 72 6f 67 72 61 6d  e .** OP_Program
29a30 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 43 6f   instruction. Co
29a40 70 79 20 61 20 76 61 6c 75 65 20 63 75 72 72 65  py a value curre
29a50 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61  ntly stored in a
29a60 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c   memory .** cell
29a70 20 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   of the calling 
29a80 28 70 61 72 65 6e 74 29 20 66 72 61 6d 65 20 74  (parent) frame t
29a90 6f 20 63 65 6c 6c 20 50 32 20 69 6e 20 74 68 65  o cell P2 in the
29aa0 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 73 20   current frames 
29ab0 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63  .** address spac
29ac0 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  e. This is used 
29ad0 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  by trigger progr
29ae0 61 6d 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  ams to access th
29af0 65 20 6e 65 77 2e 2a 20 0a 2a 2a 20 61 6e 64 20  e new.* .** and 
29b00 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 2e 0a 2a 2a  old.* values..**
29b10 0a 2a 2a 20 54 68 65 20 61 64 64 72 65 73 73 20  .** The address 
29b20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74  of the cell in t
29b30 68 65 20 70 61 72 65 6e 74 20 66 72 61 6d 65 20  he parent frame 
29b40 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
29b50 20 61 64 64 69 6e 67 0a 2a 2a 20 74 68 65 20 76   adding.** the v
29b60 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 61  alue of the P1 a
29b70 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 76  rgument to the v
29b80 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 61  alue of the P1 a
29b90 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 2a  rgument to the.*
29ba0 2a 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50 72 6f  * calling OP_Pro
29bb0 67 72 61 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e  gram instruction
29bc0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 61 72  ..*/.case OP_Par
29bd0 61 6d 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  am: {           
29be0 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61  /* out2-prerelea
29bf0 73 65 20 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d  se */.  VdbeFram
29c00 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 4d 65 6d  e *pFrame;.  Mem
29c10 20 2a 70 49 6e 3b 0a 20 20 70 46 72 61 6d 65 20   *pIn;.  pFrame 
29c20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 70  = p->pFrame;.  p
29c30 49 6e 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d  In = &pFrame->aM
29c40 65 6d 5b 70 4f 70 2d 3e 70 31 20 2b 20 70 46 72  em[pOp->p1 + pFr
29c50 61 6d 65 2d 3e 61 4f 70 5b 70 46 72 61 6d 65 2d  ame->aOp[pFrame-
29c60 3e 70 63 5d 2e 70 31 5d 3b 20 20 20 0a 20 20 73  >pc].p1];   .  s
29c70 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
29c80 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70  llowCopy(pOut, p
29c90 49 6e 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  In, MEM_Ephem);.
29ca0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 65 6e 64    break;.}..#end
29cb0 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
29cc0 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
29cd0 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  R */..#ifndef SQ
29ce0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
29cf0 4e 5f 4b 45 59 0a 2f 2a 20 4f 70 63 6f 64 65 3a  N_KEY./* Opcode:
29d00 20 46 6b 43 6f 75 6e 74 65 72 20 50 31 20 50 32   FkCounter P1 P2
29d10 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 63   * * *.**.** Inc
29d20 72 65 6d 65 6e 74 20 61 20 22 63 6f 6e 73 74 72  rement a "constr
29d30 61 69 6e 74 20 63 6f 75 6e 74 65 72 22 20 62 79  aint counter" by
29d40 20 50 32 20 28 50 32 20 6d 61 79 20 62 65 20 6e   P2 (P2 may be n
29d50 65 67 61 74 69 76 65 20 6f 72 20 70 6f 73 69 74  egative or posit
29d60 69 76 65 29 2e 0a 2a 2a 20 49 66 20 50 31 20 69  ive)..** If P1 i
29d70 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
29d80 64 61 74 61 62 61 73 65 20 63 6f 6e 73 74 72 61  database constra
29d90 69 6e 74 20 63 6f 75 6e 74 65 72 20 69 73 20 69  int counter is i
29da0 6e 63 72 65 6d 65 6e 74 65 64 20 0a 2a 2a 20 28  ncremented .** (
29db0 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
29dc0 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
29dd0 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ). Otherwise, if
29de0 20 50 31 20 69 73 20 7a 65 72 6f 2c 20 74 68 65   P1 is zero, the
29df0 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 63   .** statement c
29e00 6f 75 6e 74 65 72 20 69 73 20 69 6e 63 72 65 6d  ounter is increm
29e10 65 6e 74 65 64 20 28 69 6d 6d 65 64 69 61 74 65  ented (immediate
29e20 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
29e30 73 74 72 61 69 6e 74 73 29 2e 0a 2a 2f 0a 63 61  straints)..*/.ca
29e40 73 65 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 3a  se OP_FkCounter:
29e50 20 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31   {.  if( pOp->p1
29e60 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66   ){.    db->nDef
29e70 65 72 72 65 64 43 6f 6e 73 20 2b 3d 20 70 4f 70  erredCons += pOp
29e80 2d 3e 70 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->p2;.  }else{. 
29e90 20 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61     p->nFkConstra
29ea0 69 6e 74 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a  int += pOp->p2;.
29eb0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
29ec0 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6b 49 66 5a  /* Opcode: FkIfZ
29ed0 65 72 6f 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  ero P1 P2 * * *.
29ee0 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
29ef0 65 20 74 65 73 74 73 20 69 66 20 61 20 66 6f 72  e tests if a for
29f00 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
29f10 69 6e 74 2d 63 6f 75 6e 74 65 72 20 69 73 20 63  int-counter is c
29f20 75 72 72 65 6e 74 6c 79 20 7a 65 72 6f 2e 0a 2a  urrently zero..*
29f30 2a 20 49 66 20 73 6f 2c 20 6a 75 6d 70 20 74 6f  * If so, jump to
29f40 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e   instruction P2.
29f50 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
29f60 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
29f70 6e 65 78 74 20 0a 2a 2a 20 69 6e 73 74 72 75 63  next .** instruc
29f80 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  tion..**.** If P
29f90 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  1 is non-zero, t
29fa0 68 65 6e 20 74 68 65 20 6a 75 6d 70 20 69 73 20  hen the jump is 
29fb0 74 61 6b 65 6e 20 69 66 20 74 68 65 20 64 61 74  taken if the dat
29fc0 61 62 61 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  abase constraint
29fd0 2d 63 6f 75 6e 74 65 72 0a 2a 2a 20 69 73 20 7a  -counter.** is z
29fe0 65 72 6f 20 28 74 68 65 20 6f 6e 65 20 74 68 61  ero (the one tha
29ff0 74 20 63 6f 75 6e 74 73 20 64 65 66 65 72 72 65  t counts deferre
2a000 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f  d constraint vio
2a010 6c 61 74 69 6f 6e 73 29 2e 20 49 66 20 50 31 20  lations). If P1 
2a020 69 73 0a 2a 2a 20 7a 65 72 6f 2c 20 74 68 65 20  is.** zero, the 
2a030 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
2a040 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
2a050 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65  onstraint-counte
2a060 72 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 69 6d  r is zero.** (im
2a070 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
2a080 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  key constraint v
2a090 69 6f 6c 61 74 69 6f 6e 73 29 2e 0a 2a 2f 0a 63  iolations)..*/.c
2a0a0 61 73 65 20 4f 50 5f 46 6b 49 66 5a 65 72 6f 3a  ase OP_FkIfZero:
2a0b0 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75   {         /* ju
2a0c0 6d 70 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d  mp */.  if( pOp-
2a0d0 3e 70 31 20 29 7b 0a 20 20 20 20 69 66 28 20 64  >p1 ){.    if( d
2a0e0 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
2a0f0 3d 3d 30 20 29 20 70 63 20 3d 20 70 4f 70 2d 3e  ==0 ) pc = pOp->
2a100 70 32 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  p2-1;.  }else{. 
2a110 20 20 20 69 66 28 20 70 2d 3e 6e 46 6b 43 6f 6e     if( p->nFkCon
2a120 73 74 72 61 69 6e 74 3d 3d 30 20 29 20 70 63 20  straint==0 ) pc 
2a130 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d  = pOp->p2-1;.  }
2a140 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
2a150 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
2a160 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
2a170 4e 5f 4b 45 59 20 2a 2f 0a 0a 23 69 66 6e 64 65  N_KEY */..#ifnde
2a180 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2a190 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 2f 2a 20 4f  TOINCREMENT./* O
2a1a0 70 63 6f 64 65 3a 20 4d 65 6d 4d 61 78 20 50 31  pcode: MemMax P1
2a1b0 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
2a1c0 50 31 20 69 73 20 61 20 72 65 67 69 73 74 65 72  P1 is a register
2a1d0 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 66 72 61   in the root fra
2a1e0 6d 65 20 6f 66 20 74 68 69 73 20 56 4d 20 28 74  me of this VM (t
2a1f0 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 69 73  he root frame is
2a200 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72  .** different fr
2a210 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  om the current f
2a220 72 61 6d 65 20 69 66 20 74 68 69 73 20 69 6e 73  rame if this ins
2a230 74 72 75 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  truction is bein
2a240 67 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 77 69  g executed.** wi
2a250 74 68 69 6e 20 61 20 73 75 62 2d 70 72 6f 67 72  thin a sub-progr
2a260 61 6d 29 2e 20 53 65 74 20 74 68 65 20 76 61 6c  am). Set the val
2a270 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  ue of register P
2a280 31 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  1 to the maximum
2a290 20 6f 66 20 0a 2a 2a 20 69 74 73 20 63 75 72 72   of .** its curr
2a2a0 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 74 68  ent value and th
2a2b0 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
2a2c0 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68  ter P2..**.** Th
2a2d0 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  is instruction t
2a2e0 68 72 6f 77 73 20 61 6e 20 65 72 72 6f 72 20 69  hrows an error i
2a2f0 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
2a300 6c 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c  l is not initial
2a310 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72  ly.** an integer
2a320 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 65 6d  ..*/.case OP_Mem
2a330 4d 61 78 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  Max: {        /*
2a340 20 69 6e 32 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70   in2 */.  Mem *p
2a350 49 6e 31 3b 0a 20 20 56 64 62 65 46 72 61 6d 65  In1;.  VdbeFrame
2a360 20 2a 70 46 72 61 6d 65 3b 0a 20 20 69 66 28 20   *pFrame;.  if( 
2a370 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20  p->pFrame ){.   
2a380 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
2a390 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70  Frame; pFrame->p
2a3a0 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70  Parent; pFrame=p
2a3b0 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
2a3c0 0a 20 20 20 20 70 49 6e 31 20 3d 20 26 70 46 72  .    pIn1 = &pFr
2a3d0 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70  ame->aMem[pOp->p
2a3e0 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1];.  }else{.   
2a3f0 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
2a400 70 2d 3e 70 31 5d 3b 0a 20 20 7d 0a 20 20 61 73  p->p1];.  }.  as
2a410 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
2a420 28 70 49 6e 31 29 20 29 3b 0a 20 20 73 71 6c 69  (pIn1) );.  sqli
2a430 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65  te3VdbeMemIntege
2a440 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 70 49  rify(pIn1);.  pI
2a450 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n2 = &aMem[pOp->
2a460 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p2];.  sqlite3Vd
2a470 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28  beMemIntegerify(
2a480 70 49 6e 32 29 3b 0a 20 20 69 66 28 20 70 49 6e  pIn2);.  if( pIn
2a490 31 2d 3e 75 2e 69 3c 70 49 6e 32 2d 3e 75 2e 69  1->u.i<pIn2->u.i
2a4a0 29 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 75 2e 69  ){.    pIn1->u.i
2a4b0 20 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20   = pIn2->u.i;.  
2a4c0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  }.  break;.}.#en
2a4d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2a4e0 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
2a4f0 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20   */../* Opcode: 
2a500 49 66 50 6f 73 20 50 31 20 50 32 20 2a 20 2a 20  IfPos P1 P2 * * 
2a510 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 76  *.**.** If the v
2a520 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72  alue of register
2a530 20 50 31 20 69 73 20 31 20 6f 72 20 67 72 65 61   P1 is 1 or grea
2a540 74 65 72 2c 20 6a 75 6d 70 20 74 6f 20 50 32 2e  ter, jump to P2.
2a550 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c  .**.** It is ill
2a560 65 67 61 6c 20 74 6f 20 75 73 65 20 74 68 69 73  egal to use this
2a570 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 20   instruction on 
2a580 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  a register that 
2a590 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
2a5a0 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 20  ain an integer. 
2a5b0 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
2a5c0 75 6c 74 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  ult will result 
2a5d0 69 66 20 79 6f 75 20 74 72 79 2e 0a 2a 2f 0a 63  if you try..*/.c
2a5e0 61 73 65 20 4f 50 5f 49 66 50 6f 73 3a 20 7b 20  ase OP_IfPos: { 
2a5f0 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
2a600 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  in1 */.  pIn1 = 
2a610 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
2a620 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e    assert( pIn1->
2a630 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b  flags&MEM_Int );
2a640 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69  .  if( pIn1->u.i
2a650 3e 30 20 29 7b 0a 20 20 20 20 20 70 63 20 3d 20  >0 ){.     pc = 
2a660 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d  pOp->p2 - 1;.  }
2a670 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
2a680 4f 70 63 6f 64 65 3a 20 49 66 4e 65 67 20 50 31  Opcode: IfNeg P1
2a690 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
2a6a0 49 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  If the value of 
2a6b0 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 6c  register P1 is l
2a6c0 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 6a  ess than zero, j
2a6d0 75 6d 70 20 74 6f 20 50 32 2e 20 0a 2a 2a 0a 2a  ump to P2. .**.*
2a6e0 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
2a6f0 74 6f 20 75 73 65 20 74 68 69 73 20 69 6e 73 74  to use this inst
2a700 72 75 63 74 69 6f 6e 20 6f 6e 20 61 20 72 65 67  ruction on a reg
2a710 69 73 74 65 72 20 74 68 61 74 20 64 6f 65 73 0a  ister that does.
2a720 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
2a730 6e 20 69 6e 74 65 67 65 72 2e 20 20 41 6e 20 61  n integer.  An a
2a740 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77  ssertion fault w
2a750 69 6c 6c 20 72 65 73 75 6c 74 20 69 66 20 79 6f  ill result if yo
2a760 75 20 74 72 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f  u try..*/.case O
2a770 50 5f 49 66 4e 65 67 3a 20 7b 20 20 20 20 20 20  P_IfNeg: {      
2a780 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a    /* jump, in1 *
2a790 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
2a7a0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
2a7b0 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ert( pIn1->flags
2a7c0 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 69 66  &MEM_Int );.  if
2a7d0 28 20 70 49 6e 31 2d 3e 75 2e 69 3c 30 20 29 7b  ( pIn1->u.i<0 ){
2a7e0 0a 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e  .     pc = pOp->
2a7f0 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72  p2 - 1;.  }.  br
2a800 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
2a810 65 3a 20 49 66 5a 65 72 6f 20 50 31 20 50 32 20  e: IfZero P1 P2 
2a820 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  P3 * *.**.** The
2a830 20 72 65 67 69 73 74 65 72 20 50 31 20 6d 75 73   register P1 mus
2a840 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74  t contain an int
2a850 65 67 65 72 2e 20 20 41 64 64 20 6c 69 74 65 72  eger.  Add liter
2a860 61 6c 20 50 33 20 74 6f 20 74 68 65 0a 2a 2a 20  al P3 to the.** 
2a870 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
2a880 72 20 50 31 2e 20 20 49 66 20 74 68 65 20 72 65  r P1.  If the re
2a890 73 75 6c 74 20 69 73 20 65 78 61 63 74 6c 79 20  sult is exactly 
2a8a0 30 2c 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 0a  0, jump to P2. .
2a8b0 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  **.** It is ille
2a8c0 67 61 6c 20 74 6f 20 75 73 65 20 74 68 69 73 20  gal to use this 
2a8d0 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 20 61  instruction on a
2a8e0 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 64   register that d
2a8f0 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
2a900 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  in an integer.  
2a910 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75  An assertion fau
2a920 6c 74 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  lt will result i
2a930 66 20 79 6f 75 20 74 72 79 2e 0a 2a 2f 0a 63 61  f you try..*/.ca
2a940 73 65 20 4f 50 5f 49 66 5a 65 72 6f 3a 20 7b 20  se OP_IfZero: { 
2a950 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
2a960 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  in1 */.  pIn1 = 
2a970 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
2a980 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e    assert( pIn1->
2a990 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b  flags&MEM_Int );
2a9a0 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20 2b 3d 20  .  pIn1->u.i += 
2a9b0 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 70  pOp->p3;.  if( p
2a9c0 49 6e 31 2d 3e 75 2e 69 3d 3d 30 20 29 7b 0a 20  In1->u.i==0 ){. 
2a9d0 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
2a9e0 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61   - 1;.  }.  brea
2a9f0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
2aa00 20 41 67 67 53 74 65 70 20 2a 20 50 32 20 50 33   AggStep * P2 P3
2aa10 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 45 78 65   P4 P5.**.** Exe
2aa20 63 75 74 65 20 74 68 65 20 73 74 65 70 20 66 75  cute the step fu
2aa30 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 61 67  nction for an ag
2aa40 67 72 65 67 61 74 65 2e 20 20 54 68 65 0a 2a 2a  gregate.  The.**
2aa50 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 50 35   function has P5
2aa60 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 50 34   arguments.   P4
2aa70 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2aa80 20 74 68 65 20 46 75 6e 63 44 65 66 0a 2a 2a 20   the FuncDef.** 
2aa90 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 73  structure that s
2aaa0 70 65 63 69 66 69 65 73 20 74 68 65 20 66 75 6e  pecifies the fun
2aab0 63 74 69 6f 6e 2e 20 20 55 73 65 20 72 65 67 69  ction.  Use regi
2aac0 73 74 65 72 0a 2a 2a 20 50 33 20 61 73 20 74 68  ster.** P3 as th
2aad0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  e accumulator..*
2aae0 2a 0a 2a 2a 20 54 68 65 20 50 35 20 61 72 67 75  *.** The P5 argu
2aaf0 6d 65 6e 74 73 20 61 72 65 20 74 61 6b 65 6e 20  ments are taken 
2ab00 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50 32  from register P2
2ab10 20 61 6e 64 20 69 74 73 0a 2a 2a 20 73 75 63 63   and its.** succ
2ab20 65 73 73 6f 72 73 2e 0a 2a 2f 0a 63 61 73 65 20  essors..*/.case 
2ab30 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b 0a 20 20  OP_AggStep: {.  
2ab40 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  int n;.  int i;.
2ab50 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 4d    Mem *pMem;.  M
2ab60 65 6d 20 2a 70 52 65 63 3b 0a 20 20 73 71 6c 69  em *pRec;.  sqli
2ab70 74 65 33 5f 63 6f 6e 74 65 78 74 20 63 74 78 3b  te3_context ctx;
2ab80 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
2ab90 20 2a 2a 61 70 56 61 6c 3b 0a 0a 20 20 6e 20 3d   **apVal;..  n =
2aba0 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 61 73 73 65   pOp->p5;.  asse
2abb0 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 70 52  rt( n>=0 );.  pR
2abc0 65 63 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ec = &aMem[pOp->
2abd0 70 32 5d 3b 0a 20 20 61 70 56 61 6c 20 3d 20 70  p2];.  apVal = p
2abe0 2d 3e 61 70 41 72 67 3b 0a 20 20 61 73 73 65 72  ->apArg;.  asser
2abf0 74 28 20 61 70 56 61 6c 20 7c 7c 20 6e 3d 3d 30  t( apVal || n==0
2ac00 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
2ac10 3c 6e 3b 20 69 2b 2b 2c 20 70 52 65 63 2b 2b 29  <n; i++, pRec++)
2ac20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  {.    assert( me
2ac30 6d 49 73 56 61 6c 69 64 28 70 52 65 63 29 20 29  mIsValid(pRec) )
2ac40 3b 0a 20 20 20 20 61 70 56 61 6c 5b 69 5d 20 3d  ;.    apVal[i] =
2ac50 20 70 52 65 63 3b 0a 20 20 20 20 6d 65 6d 41 62   pRec;.    memAb
2ac60 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70  outToChange(p, p
2ac70 52 65 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Rec);.    sqlite
2ac80 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70  3VdbeMemStoreTyp
2ac90 65 28 70 52 65 63 29 3b 0a 20 20 7d 0a 20 20 63  e(pRec);.  }.  c
2aca0 74 78 2e 70 46 75 6e 63 20 3d 20 70 4f 70 2d 3e  tx.pFunc = pOp->
2acb0 70 34 2e 70 46 75 6e 63 3b 0a 20 20 61 73 73 65  p4.pFunc;.  asse
2acc0 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26  rt( pOp->p3>0 &&
2acd0 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65   pOp->p3<=p->nMe
2ace0 6d 20 29 3b 0a 20 20 63 74 78 2e 70 4d 65 6d 20  m );.  ctx.pMem 
2acf0 3d 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70  = pMem = &aMem[p
2ad00 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 4d 65 6d 2d  Op->p3];.  pMem-
2ad10 3e 6e 2b 2b 3b 0a 20 20 63 74 78 2e 73 2e 66 6c  >n++;.  ctx.s.fl
2ad20 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
2ad30 20 20 63 74 78 2e 73 2e 7a 20 3d 20 30 3b 0a 20    ctx.s.z = 0;. 
2ad40 20 63 74 78 2e 73 2e 7a 4d 61 6c 6c 6f 63 20 3d   ctx.s.zMalloc =
2ad50 20 30 3b 0a 20 20 63 74 78 2e 73 2e 78 44 65 6c   0;.  ctx.s.xDel
2ad60 20 3d 20 30 3b 0a 20 20 63 74 78 2e 73 2e 64 62   = 0;.  ctx.s.db
2ad70 20 3d 20 64 62 3b 0a 20 20 63 74 78 2e 69 73 45   = db;.  ctx.isE
2ad80 72 72 6f 72 20 3d 20 30 3b 0a 20 20 63 74 78 2e  rror = 0;.  ctx.
2ad90 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 63 74 78  pColl = 0;.  ctx
2ada0 2e 73 6b 69 70 46 6c 61 67 20 3d 20 30 3b 0a 20  .skipFlag = 0;. 
2adb0 20 69 66 28 20 63 74 78 2e 70 46 75 6e 63 2d 3e   if( ctx.pFunc->
2adc0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
2add0 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
2ade0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 3e      assert( pOp>
2adf0 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 61 73  p->aOp );.    as
2ae00 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 70 34  sert( pOp[-1].p4
2ae10 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51  type==P4_COLLSEQ
2ae20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2ae30 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
2ae40 4f 50 5f 43 6f 6c 6c 53 65 71 20 29 3b 0a 20 20  OP_CollSeq );.  
2ae50 20 20 63 74 78 2e 70 43 6f 6c 6c 20 3d 20 70 4f    ctx.pColl = pO
2ae60 70 5b 2d 31 5d 2e 70 34 2e 70 43 6f 6c 6c 3b 0a  p[-1].p4.pColl;.
2ae70 20 20 7d 0a 20 20 28 63 74 78 2e 70 46 75 6e 63    }.  (ctx.pFunc
2ae80 2d 3e 78 53 74 65 70 29 28 26 63 74 78 2c 20 6e  ->xStep)(&ctx, n
2ae90 2c 20 61 70 56 61 6c 29 3b 20 2f 2a 20 49 4d 50  , apVal); /* IMP
2aea0 3a 20 52 2d 32 34 35 30 35 2d 32 33 32 33 30 20  : R-24505-23230 
2aeb0 2a 2f 0a 20 20 69 66 28 20 63 74 78 2e 69 73 45  */.  if( ctx.isE
2aec0 72 72 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rror ){.    sqli
2aed0 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
2aee0 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25  >zErrMsg, db, "%
2aef0 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s", sqlite3_valu
2af00 65 5f 74 65 78 74 28 26 63 74 78 2e 73 29 29 3b  e_text(&ctx.s));
2af10 0a 20 20 20 20 72 63 20 3d 20 63 74 78 2e 69 73  .    rc = ctx.is
2af20 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  Error;.  }.  if(
2af30 20 63 74 78 2e 73 6b 69 70 46 6c 61 67 20 29 7b   ctx.skipFlag ){
2af40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
2af50 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
2af60 43 6f 6c 6c 53 65 71 20 29 3b 0a 20 20 20 20 69  CollSeq );.    i
2af70 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20   = pOp[-1].p1;. 
2af80 20 20 20 69 66 28 20 69 20 29 20 73 71 6c 69 74     if( i ) sqlit
2af90 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36  e3VdbeMemSetInt6
2afa0 34 28 26 61 4d 65 6d 5b 69 5d 2c 20 31 29 3b 0a  4(&aMem[i], 1);.
2afb0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64    }..  sqlite3Vd
2afc0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 74  beMemRelease(&ct
2afd0 78 2e 73 29 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a  x.s);..  break;.
2afe0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67  }../* Opcode: Ag
2aff0 67 46 69 6e 61 6c 20 50 31 20 50 32 20 2a 20 50  gFinal P1 P2 * P
2b000 34 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75 74  4 *.**.** Execut
2b010 65 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 72 20  e the finalizer 
2b020 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20  function for an 
2b030 61 67 67 72 65 67 61 74 65 2e 20 20 50 31 20 69  aggregate.  P1 i
2b040 73 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20  s.** the memory 
2b050 6c 6f 63 61 74 69 6f 6e 20 74 68 61 74 20 69 73  location that is
2b060 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
2b070 20 66 6f 72 20 74 68 65 20 61 67 67 72 65 67 61   for the aggrega
2b080 74 65 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73 20  te..**.** P2 is 
2b090 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  the number of ar
2b0a0 67 75 6d 65 6e 74 73 20 74 68 61 74 20 74 68 65  guments that the
2b0b0 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 74   step function t
2b0c0 61 6b 65 73 20 61 6e 64 0a 2a 2a 20 50 34 20 69  akes and.** P4 i
2b0d0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
2b0e0 68 65 20 46 75 6e 63 44 65 66 20 66 6f 72 20 74  he FuncDef for t
2b0f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  his function.  T
2b100 68 65 20 50 32 0a 2a 2a 20 61 72 67 75 6d 65 6e  he P2.** argumen
2b110 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79  t is not used by
2b120 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 20 20 49   this opcode.  I
2b130 74 20 69 73 20 6f 6e 6c 79 20 74 68 65 72 65 20  t is only there 
2b140 74 6f 20 64 69 73 61 6d 62 69 67 75 61 74 65 0a  to disambiguate.
2b150 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  ** functions tha
2b160 74 20 63 61 6e 20 74 61 6b 65 20 76 61 72 79 69  t can take varyi
2b170 6e 67 20 6e 75 6d 62 65 72 73 20 6f 66 20 61 72  ng numbers of ar
2b180 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 0a 2a 2a  guments.  The.**
2b190 20 50 34 20 61 72 67 75 6d 65 6e 74 20 69 73 20   P4 argument is 
2b1a0 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20  only needed for 
2b1b0 74 68 65 20 64 65 67 65 6e 65 72 61 74 65 20 63  the degenerate c
2b1c0 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 74 68 65  ase where.** the
2b1d0 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 77   step function w
2b1e0 61 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c  as not previousl
2b1f0 79 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 63 61 73  y called..*/.cas
2b200 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 3a 20 7b  e OP_AggFinal: {
2b210 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20  .  Mem *pMem;.  
2b220 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
2b230 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 70 2d  0 && pOp->p1<=p-
2b240 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 4d 65 6d 20  >nMem );.  pMem 
2b250 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
2b260 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d 65  ;.  assert( (pMe
2b270 6d 2d 3e 66 6c 61 67 73 20 26 20 7e 28 4d 45 4d  m->flags & ~(MEM
2b280 5f 4e 75 6c 6c 7c 4d 45 4d 5f 41 67 67 29 29 3d  _Null|MEM_Agg))=
2b290 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
2b2a0 69 74 65 33 56 64 62 65 4d 65 6d 46 69 6e 61 6c  ite3VdbeMemFinal
2b2b0 69 7a 65 28 70 4d 65 6d 2c 20 70 4f 70 2d 3e 70  ize(pMem, pOp->p
2b2c0 34 2e 70 46 75 6e 63 29 3b 0a 20 20 69 66 28 20  4.pFunc);.  if( 
2b2d0 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
2b2e0 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
2b2f0 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22  ErrMsg, db, "%s"
2b300 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
2b310 74 65 78 74 28 70 4d 65 6d 29 29 3b 0a 20 20 7d  text(pMem));.  }
2b320 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
2b330 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4d 65  angeEncoding(pMe
2b340 6d 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  m, encoding);.  
2b350 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
2b360 49 5a 45 28 70 4d 65 6d 29 3b 0a 20 20 69 66 28  IZE(pMem);.  if(
2b370 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54   sqlite3VdbeMemT
2b380 6f 6f 42 69 67 28 70 4d 65 6d 29 20 29 7b 0a 20  ooBig(pMem) ){. 
2b390 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b     goto too_big;
2b3a0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
2b3b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b3c0 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 4f 70 63 6f  OMIT_WAL./* Opco
2b3d0 64 65 3a 20 43 68 65 63 6b 70 6f 69 6e 74 20 50  de: Checkpoint P
2b3e0 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
2b3f0 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74  * Checkpoint dat
2b400 61 62 61 73 65 20 50 31 2e 20 54 68 69 73 20 69  abase P1. This i
2b410 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 50 31 20  s a no-op if P1 
2b420 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
2b430 20 69 6e 0a 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e   in.** WAL mode.
2b440 20 50 61 72 61 6d 65 74 65 72 20 50 32 20 69 73   Parameter P2 is
2b450 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43   one of SQLITE_C
2b460 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
2b470 45 2c 20 46 55 4c 4c 0a 2a 2a 20 6f 72 20 52 45  E, FULL.** or RE
2b480 53 54 41 52 54 2e 20 20 57 72 69 74 65 20 31 20  START.  Write 1 
2b490 6f 72 20 30 20 69 6e 74 6f 20 6d 65 6d 5b 50 33  or 0 into mem[P3
2b4a0 5d 20 69 66 20 74 68 65 20 63 68 65 63 6b 70 6f  ] if the checkpo
2b4b0 69 6e 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53  int returns.** S
2b4c0 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 6e 6f  QLITE_BUSY or no
2b4d0 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  t, respectively.
2b4e0 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
2b4f0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
2b500 68 65 0a 2a 2a 20 57 41 4c 20 61 66 74 65 72 20  he.** WAL after 
2b510 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
2b520 6e 74 6f 20 6d 65 6d 5b 50 33 2b 31 5d 20 61 6e  nto mem[P3+1] an
2b530 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
2b540 70 61 67 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20  pages.** in the 
2b550 57 41 4c 20 74 68 61 74 20 68 61 76 65 20 62 65  WAL that have be
2b560 65 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  en checkpointed 
2b570 61 66 74 65 72 20 74 68 65 20 63 68 65 63 6b 70  after the checkp
2b580 6f 69 6e 74 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65  oint.** complete
2b590 73 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b 32 5d  s into mem[P3+2]
2b5a0 2e 20 20 48 6f 77 65 76 65 72 20 6f 6e 20 61 6e  .  However on an
2b5b0 20 65 72 72 6f 72 2c 20 6d 65 6d 5b 50 33 2b 31   error, mem[P3+1
2b5c0 5d 20 61 6e 64 0a 2a 2a 20 6d 65 6d 5b 50 33 2b  ] and.** mem[P3+
2b5d0 32 5d 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  2] are initializ
2b5e0 65 64 20 74 6f 20 2d 31 2e 0a 2a 2f 0a 63 61 73  ed to -1..*/.cas
2b5f0 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a  e OP_Checkpoint:
2b600 20 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20   {.  int i;     
2b610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b620 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2b630 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 52  nter */.  int aR
2b640 65 73 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20  es[3];          
2b650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
2b660 75 6c 74 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  ults */.  Mem *p
2b670 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
2b680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
2b690 74 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  te results here 
2b6a0 2a 2f 0a 0a 20 20 61 52 65 73 5b 30 5d 20 3d 20  */..  aRes[0] = 
2b6b0 30 3b 0a 20 20 61 52 65 73 5b 31 5d 20 3d 20 61  0;.  aRes[1] = a
2b6c0 52 65 73 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 61  Res[2] = -1;.  a
2b6d0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d  ssert( pOp->p2==
2b6e0 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
2b6f0 54 5f 50 41 53 53 49 56 45 0a 20 20 20 20 20 20  T_PASSIVE.      
2b700 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c   || pOp->p2==SQL
2b710 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
2b720 55 4c 4c 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f  ULL.       || pO
2b730 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48  p->p2==SQLITE_CH
2b740 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54  ECKPOINT_RESTART
2b750 0a 20 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  .  );.  rc = sql
2b760 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64  ite3Checkpoint(d
2b770 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  b, pOp->p1, pOp-
2b780 3e 70 32 2c 20 26 61 52 65 73 5b 31 5d 2c 20 26  >p2, &aRes[1], &
2b790 61 52 65 73 5b 32 5d 29 3b 0a 20 20 69 66 28 20  aRes[2]);.  if( 
2b7a0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
2b7b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2b7c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 61 52 65 73 5b  TE_OK;.    aRes[
2b7d0 30 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f  0] = 1;.  }.  fo
2b7e0 72 28 69 3d 30 2c 20 70 4d 65 6d 20 3d 20 26 61  r(i=0, pMem = &a
2b7f0 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 20 69 3c  Mem[pOp->p3]; i<
2b800 33 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b  3; i++, pMem++){
2b810 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2b820 4d 65 6d 53 65 74 49 6e 74 36 34 28 70 4d 65 6d  MemSetInt64(pMem
2b830 2c 20 28 69 36 34 29 61 52 65 73 5b 69 5d 29 3b  , (i64)aRes[i]);
2b840 0a 20 20 7d 20 20 20 20 0a 20 20 62 72 65 61 6b  .  }    .  break
2b850 3b 0a 7d 3b 20 20 0a 23 65 6e 64 69 66 0a 0a 23  ;.};  .#endif..#
2b860 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b870 49 54 5f 50 52 41 47 4d 41 0a 2f 2a 20 4f 70 63  IT_PRAGMA./* Opc
2b880 6f 64 65 3a 20 4a 6f 75 72 6e 61 6c 4d 6f 64 65  ode: JournalMode
2b890 20 50 31 20 50 32 20 50 33 20 2a 20 50 35 0a 2a   P1 P2 P3 * P5.*
2b8a0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
2b8b0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6f 66 20  journal mode of 
2b8c0 64 61 74 61 62 61 73 65 20 50 31 20 74 6f 20 50  database P1 to P
2b8d0 33 2e 20 50 33 20 6d 75 73 74 20 62 65 20 6f 6e  3. P3 must be on
2b8e0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 50 41 47 45  e of the.** PAGE
2b8f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58  R_JOURNALMODE_XX
2b900 58 20 76 61 6c 75 65 73 2e 20 49 66 20 63 68 61  X values. If cha
2b910 6e 67 69 6e 67 20 62 65 74 77 65 65 6e 20 74 68  nging between th
2b920 65 20 76 61 72 69 6f 75 73 20 72 6f 6c 6c 62 61  e various rollba
2b930 63 6b 0a 2a 2a 20 6d 6f 64 65 73 20 28 64 65 6c  ck.** modes (del
2b940 65 74 65 2c 20 74 72 75 6e 63 61 74 65 2c 20 70  ete, truncate, p
2b950 65 72 73 69 73 74 2c 20 6f 66 66 20 61 6e 64 20  ersist, off and 
2b960 6d 65 6d 6f 72 79 29 2c 20 74 68 69 73 20 69 73  memory), this is
2b970 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 6f 70 65   a simple.** ope
2b980 72 61 74 69 6f 6e 2e 20 4e 6f 20 49 4f 20 69 73  ration. No IO is
2b990 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a   required..**.**
2b9a0 20 49 66 20 63 68 61 6e 67 69 6e 67 20 69 6e 74   If changing int
2b9b0 6f 20 6f 72 20 6f 75 74 20 6f 66 20 57 41 4c 20  o or out of WAL 
2b9c0 6d 6f 64 65 20 74 68 65 20 70 72 6f 63 65 64 75  mode the procedu
2b9d0 72 65 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c  re is more compl
2b9e0 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 72  icated..**.** Wr
2b9f0 69 74 65 20 61 20 73 74 72 69 6e 67 20 63 6f 6e  ite a string con
2ba00 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6e 61  taining the fina
2ba10 6c 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 74  l journal-mode t
2ba20 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  o register P2..*
2ba30 2f 0a 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61  /.case OP_Journa
2ba40 6c 4d 6f 64 65 3a 20 7b 20 20 20 20 2f 2a 20 6f  lMode: {    /* o
2ba50 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a  ut2-prerelease *
2ba60 2f 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 20  /.  Btree *pBt; 
2ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba80 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 6f 20      /* Btree to 
2ba90 63 68 61 6e 67 65 20 6a 6f 75 72 6e 61 6c 20 6d  change journal m
2baa0 6f 64 65 20 6f 66 20 2a 2f 0a 20 20 50 61 67 65  ode of */.  Page
2bab0 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20  r *pPager;      
2bac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2bad0 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  ager associated 
2bae0 77 69 74 68 20 70 42 74 20 2a 2f 0a 20 20 69 6e  with pBt */.  in
2baf0 74 20 65 4e 65 77 3b 20 20 20 20 20 20 20 20 20  t eNew;         
2bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bb10 20 4e 65 77 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64   New journal mod
2bb20 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 6c 64 3b  e */.  int eOld;
2bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6c         /* The ol
2bb50 64 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 2a  d journal mode *
2bb60 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2bb70 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
2bb80 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64      /* Name of d
2bb90 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
2bba0 20 70 50 61 67 65 72 20 2a 2f 0a 0a 20 20 65 4e   pPager */..  eN
2bbb0 65 77 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  ew = pOp->p3;.  
2bbc0 61 73 73 65 72 74 28 20 65 4e 65 77 3d 3d 50 41  assert( eNew==PA
2bbd0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2bbe0 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 7c  DELETE .       |
2bbf0 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f  | eNew==PAGER_JO
2bc00 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
2bc10 54 45 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e  TE .       || eN
2bc20 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ew==PAGER_JOURNA
2bc30 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 0a 20  LMODE_PERSIST . 
2bc40 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50        || eNew==P
2bc50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2bc60 5f 4f 46 46 0a 20 20 20 20 20 20 20 7c 7c 20 65  _OFF.       || e
2bc70 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  New==PAGER_JOURN
2bc80 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a 20 20  ALMODE_MEMORY.  
2bc90 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41       || eNew==PA
2bca0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2bcb0 57 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e  WAL.       || eN
2bcc0 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ew==PAGER_JOURNA
2bcd0 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 29 3b  LMODE_QUERY.  );
2bce0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2bcf0 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
2bd00 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 70  <db->nDb );..  p
2bd10 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70  Bt = db->aDb[pOp
2bd20 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 70 50 61  ->p1].pBt;.  pPa
2bd30 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
2bd40 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20  eePager(pBt);.  
2bd50 65 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 50 61  eOld = sqlite3Pa
2bd60 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64  gerGetJournalMod
2bd70 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
2bd80 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55   eNew==PAGER_JOU
2bd90 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20 29  RNALMODE_QUERY )
2bda0 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20   eNew = eOld;.  
2bdb0 69 66 28 20 21 73 71 6c 69 74 65 33 50 61 67 65  if( !sqlite3Page
2bdc0 72 4f 6b 54 6f 43 68 61 6e 67 65 4a 6f 75 72 6e  rOkToChangeJourn
2bdd0 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 20 29  alMode(pPager) )
2bde0 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 0a 23   eNew = eOld;..#
2bdf0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2be00 49 54 5f 57 41 4c 0a 20 20 7a 46 69 6c 65 6e 61  IT_WAL.  zFilena
2be10 6d 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  me = sqlite3Page
2be20 72 46 69 6c 65 6e 61 6d 65 28 70 50 61 67 65 72  rFilename(pPager
2be30 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  );..  /* Do not 
2be40 61 6c 6c 6f 77 20 61 20 74 72 61 6e 73 69 74 69  allow a transiti
2be50 6f 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  on to journal_mo
2be60 64 65 3d 57 41 4c 20 66 6f 72 20 61 20 64 61 74  de=WAL for a dat
2be70 61 62 61 73 65 0a 20 20 2a 2a 20 69 6e 20 74 65  abase.  ** in te
2be80 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20  mporary storage 
2be90 6f 72 20 69 66 20 74 68 65 20 56 46 53 20 64 6f  or if the VFS do
2bea0 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73  es not support s
2beb0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 0a 20 20  hared memory .  
2bec0 2a 2f 0a 20 20 69 66 28 20 65 4e 65 77 3d 3d 50  */.  if( eNew==P
2bed0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2bee0 5f 57 41 4c 0a 20 20 20 26 26 20 28 73 71 6c 69  _WAL.   && (sqli
2bef0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
2bf00 65 6e 61 6d 65 29 3d 3d 30 20 20 20 20 20 20 20  ename)==0       
2bf10 20 20 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65      /* Temp file
2bf20 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20 21 73   */.       || !s
2bf30 71 6c 69 74 65 33 50 61 67 65 72 57 61 6c 53 75  qlite3PagerWalSu
2bf40 70 70 6f 72 74 65 64 28 70 50 61 67 65 72 29 29  pported(pPager))
2bf50 20 20 20 2f 2a 20 4e 6f 20 73 68 61 72 65 64 2d     /* No shared-
2bf60 6d 65 6d 6f 72 79 20 73 75 70 70 6f 72 74 20 2a  memory support *
2bf70 2f 0a 20 20 29 7b 0a 20 20 20 20 65 4e 65 77 20  /.  ){.    eNew 
2bf80 3d 20 65 4f 6c 64 3b 0a 20 20 7d 0a 0a 20 20 69  = eOld;.  }..  i
2bf90 66 28 20 28 65 4e 65 77 21 3d 65 4f 6c 64 29 0a  f( (eNew!=eOld).
2bfa0 20 20 20 26 26 20 28 65 4f 6c 64 3d 3d 50 41 47     && (eOld==PAG
2bfb0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
2bfc0 41 4c 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45  AL || eNew==PAGE
2bfd0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
2bfe0 4c 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  L).  ){.    if( 
2bff0 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20  !db->autoCommit 
2c000 7c 7c 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62  || db->activeVdb
2c010 65 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20 20 20  eCnt>1 ){.      
2c020 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
2c030 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  R;.      sqlite3
2c040 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
2c050 72 72 4d 73 67 2c 20 64 62 2c 20 0a 20 20 20 20  rrMsg, db, .    
2c060 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68        "cannot ch
2c070 61 6e 67 65 20 25 73 20 77 61 6c 20 6d 6f 64 65  ange %s wal mode
2c080 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74   from within a t
2c090 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20 20  ransaction",.   
2c0a0 20 20 20 20 20 20 20 28 65 4e 65 77 3d 3d 50 41         (eNew==PA
2c0b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2c0c0 57 41 4c 20 3f 20 22 69 6e 74 6f 22 20 3a 20 22  WAL ? "into" : "
2c0d0 6f 75 74 20 6f 66 22 29 0a 20 20 20 20 20 20 29  out of").      )
2c0e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2c0f0 20 20 20 7d 65 6c 73 65 7b 0a 20 0a 20 20 20 20     }else{. .    
2c100 20 20 69 66 28 20 65 4f 6c 64 3d 3d 50 41 47 45    if( eOld==PAGE
2c110 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
2c120 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  L ){.        /* 
2c130 49 66 20 6c 65 61 76 69 6e 67 20 57 41 4c 20 6d  If leaving WAL m
2c140 6f 64 65 2c 20 63 6c 6f 73 65 20 74 68 65 20 6c  ode, close the l
2c150 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  og file. If succ
2c160 65 73 73 66 75 6c 2c 20 74 68 65 20 63 61 6c 6c  essful, the call
2c170 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 50  .        ** to P
2c180 61 67 65 72 43 6c 6f 73 65 57 61 6c 28 29 20 63  agerCloseWal() c
2c190 68 65 63 6b 70 6f 69 6e 74 73 20 61 6e 64 20 64  heckpoints and d
2c1a0 65 6c 65 74 65 73 20 74 68 65 20 77 72 69 74 65  eletes the write
2c1b0 2d 61 68 65 61 64 2d 6c 6f 67 20 0a 20 20 20 20  -ahead-log .    
2c1c0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 41 6e 20      ** file. An 
2c1d0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6d  EXCLUSIVE lock m
2c1e0 61 79 20 73 74 69 6c 6c 20 62 65 20 68 65 6c 64  ay still be held
2c1f0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2c200 20 66 69 6c 65 20 0a 20 20 20 20 20 20 20 20 2a   file .        *
2c210 2a 20 61 66 74 65 72 20 61 20 73 75 63 63 65 73  * after a succes
2c220 73 66 75 6c 20 72 65 74 75 72 6e 2e 20 0a 20 20  sful return. .  
2c230 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2c240 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2c250 65 72 43 6c 6f 73 65 57 61 6c 28 70 50 61 67 65  erCloseWal(pPage
2c260 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
2c270 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c280 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2c290 65 33 50 61 67 65 72 53 65 74 4a 6f 75 72 6e 61  e3PagerSetJourna
2c2a0 6c 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4e  lMode(pPager, eN
2c2b0 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ew);.        }. 
2c2c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
2c2d0 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  Old==PAGER_JOURN
2c2e0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
2c2f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6e  .        /* Cann
2c300 6f 74 20 74 72 61 6e 73 69 74 69 6f 6e 20 64 69  ot transition di
2c310 72 65 63 74 6c 79 20 66 72 6f 6d 20 4d 45 4d 4f  rectly from MEMO
2c320 52 59 20 74 6f 20 57 41 4c 2e 20 20 55 73 65 20  RY to WAL.  Use 
2c330 6d 6f 64 65 20 4f 46 46 0a 20 20 20 20 20 20 20  mode OFF.       
2c340 20 2a 2a 20 61 73 20 61 6e 20 69 6e 74 65 72 6d   ** as an interm
2c350 65 64 69 61 74 65 20 2a 2f 0a 20 20 20 20 20 20  ediate */.      
2c360 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
2c370 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61  tJournalMode(pPa
2c380 67 65 72 2c 20 50 41 47 45 52 5f 4a 4f 55 52 4e  ger, PAGER_JOURN
2c390 41 4c 4d 4f 44 45 5f 4f 46 46 29 3b 0a 20 20 20  ALMODE_OFF);.   
2c3a0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a     }.  .      /*
2c3b0 20 4f 70 65 6e 20 61 20 74 72 61 6e 73 61 63 74   Open a transact
2c3c0 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ion on the datab
2c3d0 61 73 65 20 66 69 6c 65 2e 20 52 65 67 61 72 64  ase file. Regard
2c3e0 6c 65 73 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  less of the jour
2c3f0 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64  nal.      ** mod
2c400 65 2c 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  e, this transact
2c410 69 6f 6e 20 61 6c 77 61 79 73 20 75 73 65 73 20  ion always uses 
2c420 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
2c430 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
2c440 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2c450 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
2c460 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20  (pBt)==0 );.    
2c470 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c480 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2c490 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2c4a0 53 65 74 56 65 72 73 69 6f 6e 28 70 42 74 2c 20  SetVersion(pBt, 
2c4b0 28 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55  (eNew==PAGER_JOU
2c4c0 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 3f 20 32  RNALMODE_WAL ? 2
2c4d0 20 3a 20 31 29 29 3b 0a 20 20 20 20 20 20 7d 0a   : 1));.      }.
2c4e0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2c4f0 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54   /* ifndef SQLIT
2c500 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 20  E_OMIT_WAL */.. 
2c510 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 65   if( rc ){.    e
2c520 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 7d 0a  New = eOld;.  }.
2c530 20 20 65 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    eNew = sqlite3
2c540 50 61 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d  PagerSetJournalM
2c550 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4e 65 77  ode(pPager, eNew
2c560 29 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d  );..  pOut = &aM
2c570 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70  em[pOp->p2];.  p
2c580 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
2c590 5f 53 74 72 7c 4d 45 4d 5f 53 74 61 74 69 63 7c  _Str|MEM_Static|
2c5a0 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74  MEM_Term;.  pOut
2c5b0 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ->z = (char *)sq
2c5c0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65  lite3JournalMode
2c5d0 6e 61 6d 65 28 65 4e 65 77 29 3b 0a 20 20 70 4f  name(eNew);.  pO
2c5e0 75 74 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  ut->n = sqlite3S
2c5f0 74 72 6c 65 6e 33 30 28 70 4f 75 74 2d 3e 7a 29  trlen30(pOut->z)
2c600 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20  ;.  pOut->enc = 
2c610 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 73  SQLITE_UTF8;.  s
2c620 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2c630 45 6e 63 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65  Encoding(pOut, e
2c640 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 62 72 65 61  ncoding);.  brea
2c650 6b 3b 0a 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  k;.};.#endif /* 
2c660 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47  SQLITE_OMIT_PRAG
2c670 4d 41 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  MA */..#if !defi
2c680 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2c690 56 41 43 55 55 4d 29 20 26 26 20 21 64 65 66 69  VACUUM) && !defi
2c6a0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2c6b0 41 54 54 41 43 48 29 0a 2f 2a 20 4f 70 63 6f 64  ATTACH)./* Opcod
2c6c0 65 3a 20 56 61 63 75 75 6d 20 2a 20 2a 20 2a 20  e: Vacuum * * * 
2c6d0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 56 61 63 75 75 6d  * *.**.** Vacuum
2c6e0 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61   the entire data
2c6f0 62 61 73 65 2e 20 20 54 68 69 73 20 6f 70 63 6f  base.  This opco
2c700 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20 6f 74  de will cause ot
2c710 68 65 72 20 76 69 72 74 75 61 6c 0a 2a 2a 20 6d  her virtual.** m
2c720 61 63 68 69 6e 65 73 20 74 6f 20 62 65 20 63 72  achines to be cr
2c730 65 61 74 65 64 20 61 6e 64 20 72 75 6e 2e 20 20  eated and run.  
2c740 49 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61  It may not be ca
2c750 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
2c760 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f  .** a transactio
2c770 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 61  n..*/.case OP_Va
2c780 63 75 75 6d 3a 20 7b 0a 20 20 72 63 20 3d 20 73  cuum: {.  rc = s
2c790 71 6c 69 74 65 33 52 75 6e 56 61 63 75 75 6d 28  qlite3RunVacuum(
2c7a0 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 29  &p->zErrMsg, db)
2c7b0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
2c7c0 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
2c7d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d(SQLITE_OMIT_AU
2c7e0 54 4f 56 41 43 55 55 4d 29 0a 2f 2a 20 4f 70 63  TOVACUUM)./* Opc
2c7f0 6f 64 65 3a 20 49 6e 63 72 56 61 63 75 75 6d 20  ode: IncrVacuum 
2c800 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
2c810 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
2c820 6c 65 20 73 74 65 70 20 6f 66 20 74 68 65 20 69  le step of the i
2c830 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
2c840 6d 20 70 72 6f 63 65 64 75 72 65 20 6f 6e 0a 2a  m procedure on.*
2c850 2a 20 74 68 65 20 50 31 20 64 61 74 61 62 61 73  * the P1 databas
2c860 65 2e 20 49 66 20 74 68 65 20 76 61 63 75 75 6d  e. If the vacuum
2c870 20 68 61 73 20 66 69 6e 69 73 68 65 64 2c 20 6a   has finished, j
2c880 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69  ump to instructi
2c890 6f 6e 0a 2a 2a 20 50 32 2e 20 4f 74 68 65 72 77  on.** P2. Otherw
2c8a0 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  ise, fall throug
2c8b0 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
2c8c0 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  struction..*/.ca
2c8d0 73 65 20 4f 50 5f 49 6e 63 72 56 61 63 75 75 6d  se OP_IncrVacuum
2c8e0 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
2c8f0 6d 70 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  mp */.  Btree *p
2c900 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Bt;..  assert( p
2c910 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
2c920 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  ->p1<db->nDb );.
2c930 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74    assert( (p->bt
2c940 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44 62  reeMask & (((yDb
2c950 4d 61 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e 70 31  Mask)1)<<pOp->p1
2c960 29 29 21 3d 30 20 29 3b 0a 20 20 70 42 74 20 3d  ))!=0 );.  pBt =
2c970 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31   db->aDb[pOp->p1
2c980 5d 2e 70 42 74 3b 0a 20 20 72 63 20 3d 20 73 71  ].pBt;.  rc = sq
2c990 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
2c9a0 63 75 75 6d 28 70 42 74 29 3b 0a 20 20 69 66 28  cuum(pBt);.  if(
2c9b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
2c9c0 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70   ){.    pc = pOp
2c9d0 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 72 63  ->p2 - 1;.    rc
2c9e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2c9f0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  }.  break;.}.#en
2ca00 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  dif../* Opcode: 
2ca10 45 78 70 69 72 65 20 50 31 20 2a 20 2a 20 2a 20  Expire P1 * * * 
2ca20 2a 0a 2a 2a 0a 2a 2a 20 43 61 75 73 65 20 70 72  *.**.** Cause pr
2ca30 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  ecompiled statem
2ca40 65 6e 74 73 20 74 6f 20 62 65 63 6f 6d 65 20 65  ents to become e
2ca50 78 70 69 72 65 64 2e 20 41 6e 20 65 78 70 69 72  xpired. An expir
2ca60 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ed statement.** 
2ca70 66 61 69 6c 73 20 77 69 74 68 20 61 6e 20 65 72  fails with an er
2ca80 72 6f 72 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  ror code of SQLI
2ca90 54 45 5f 53 43 48 45 4d 41 20 69 66 20 69 74 20  TE_SCHEMA if it 
2caa0 69 73 20 65 76 65 72 20 65 78 65 63 75 74 65 64  is ever executed
2cab0 20 0a 2a 2a 20 28 76 69 61 20 73 71 6c 69 74 65   .** (via sqlite
2cac0 33 5f 73 74 65 70 28 29 29 2e 0a 2a 2a 20 0a 2a  3_step())..** .*
2cad0 2a 20 49 66 20 50 31 20 69 73 20 30 2c 20 74 68  * If P1 is 0, th
2cae0 65 6e 20 61 6c 6c 20 53 51 4c 20 73 74 61 74 65  en all SQL state
2caf0 6d 65 6e 74 73 20 62 65 63 6f 6d 65 20 65 78 70  ments become exp
2cb00 69 72 65 64 2e 20 49 66 20 50 31 20 69 73 20 6e  ired. If P1 is n
2cb10 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20 74 68 65 6e  on-zero,.** then
2cb20 20 6f 6e 6c 79 20 74 68 65 20 63 75 72 72 65 6e   only the curren
2cb30 74 6c 79 20 65 78 65 63 75 74 69 6e 67 20 73 74  tly executing st
2cb40 61 74 65 6d 65 6e 74 20 69 73 20 61 66 66 65 63  atement is affec
2cb50 74 65 64 2e 20 0a 2a 2f 0a 63 61 73 65 20 4f 50  ted. .*/.case OP
2cb60 5f 45 78 70 69 72 65 3a 20 7b 0a 20 20 69 66 28  _Expire: {.  if(
2cb70 20 21 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20   !pOp->p1 ){.   
2cb80 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
2cb90 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
2cba0 28 64 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  (db);.  }else{. 
2cbb0 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
2cbc0 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  1;.  }.  break;.
2cbd0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
2cbe0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
2cbf0 43 48 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54  CHE./* Opcode: T
2cc00 61 62 6c 65 4c 6f 63 6b 20 50 31 20 50 32 20 50  ableLock P1 P2 P
2cc10 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 4f 62 74  3 P4 *.**.** Obt
2cc20 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20  ain a lock on a 
2cc30 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65  particular table
2cc40 2e 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69  . This instructi
2cc50 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
2cc60 77 68 65 6e 0a 2a 2a 20 74 68 65 20 73 68 61 72  when.** the shar
2cc70 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
2cc80 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 0a 2a 2a   is enabled. .**
2cc90 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69 6e  .** P1 is the in
2cca0 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
2ccb0 61 73 65 20 69 6e 20 73 71 6c 69 74 65 33 2e 61  ase in sqlite3.a
2ccc0 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74 61  Db[] of the data
2ccd0 62 61 73 65 0a 2a 2a 20 6f 6e 20 77 68 69 63 68  base.** on which
2cce0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 63 71   the lock is acq
2ccf0 75 69 72 65 64 2e 20 20 41 20 72 65 61 64 6c 6f  uired.  A readlo
2cd00 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2cd10 66 20 50 33 3d 3d 30 20 6f 72 0a 2a 2a 20 61 20  f P3==0 or.** a 
2cd20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 50 33  write lock if P3
2cd30 3d 3d 31 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 63 6f  ==1..**.** P2 co
2cd40 6e 74 61 69 6e 73 20 74 68 65 20 72 6f 6f 74 2d  ntains the root-
2cd50 70 61 67 65 20 6f 66 20 74 68 65 20 74 61 62 6c  page of the tabl
2cd60 65 20 74 6f 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  e to lock..**.**
2cd70 20 50 34 20 63 6f 6e 74 61 69 6e 73 20 61 20 70   P4 contains a p
2cd80 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 61  ointer to the na
2cd90 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
2cda0 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 20 54 68  being locked. Th
2cdb0 69 73 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 75 73  is is only.** us
2cdc0 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
2cdd0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2cde0 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  if the lock cann
2cdf0 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
2ce00 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 61 62 6c 65  */.case OP_Table
2ce10 4c 6f 63 6b 3a 20 7b 0a 20 20 75 38 20 69 73 57  Lock: {.  u8 isW
2ce20 72 69 74 65 4c 6f 63 6b 20 3d 20 28 75 38 29 70  riteLock = (u8)p
2ce30 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 69 73  Op->p3;.  if( is
2ce40 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 30 3d 3d  WriteLock || 0==
2ce50 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  (db->flags&SQLIT
2ce60 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
2ce70 64 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 31  d) ){.    int p1
2ce80 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 0a 20 20 20   = pOp->p1; .   
2ce90 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26   assert( p1>=0 &
2cea0 26 20 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  & p1<db->nDb );.
2ceb0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
2cec0 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79  btreeMask & (((y
2ced0 44 62 4d 61 73 6b 29 31 29 3c 3c 70 31 29 29 21  DbMask)1)<<p1))!
2cee0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2cef0 28 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 30  ( isWriteLock==0
2cf00 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d   || isWriteLock=
2cf10 3d 31 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =1 );.    rc = s
2cf20 71 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54  qlite3BtreeLockT
2cf30 61 62 6c 65 28 64 62 2d 3e 61 44 62 5b 70 31 5d  able(db->aDb[p1]
2cf40 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 32 2c 20 69  .pBt, pOp->p2, i
2cf50 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20  sWriteLock);.   
2cf60 20 69 66 28 20 28 72 63 26 30 78 46 46 29 3d 3d   if( (rc&0xFF)==
2cf70 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b  SQLITE_LOCKED ){
2cf80 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2cf90 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  r *z = pOp->p4.z
2cfa0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
2cfb0 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
2cfc0 72 4d 73 67 2c 20 64 62 2c 20 22 64 61 74 61 62  rMsg, db, "datab
2cfd0 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63  ase table is loc
2cfe0 6b 65 64 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ked: %s", z);.  
2cff0 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
2d000 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2d010 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
2d020 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
2d030 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2d040 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70  RTUALTABLE./* Op
2d050 63 6f 64 65 3a 20 56 42 65 67 69 6e 20 2a 20 2a  code: VBegin * *
2d060 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34   * P4 *.**.** P4
2d070 20 6d 61 79 20 62 65 20 61 20 70 6f 69 6e 74 65   may be a pointe
2d080 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
2d090 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e 20  vtab structure. 
2d0a0 49 66 20 73 6f 2c 20 63 61 6c 6c 20 74 68 65 20  If so, call the 
2d0b0 0a 2a 2a 20 78 42 65 67 69 6e 20 6d 65 74 68 6f  .** xBegin metho
2d0c0 64 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65  d for that table
2d0d0 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 2c 20 77 68  ..**.** Also, wh
2d0e0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 50 34 20  ether or not P4 
2d0f0 69 73 20 73 65 74 2c 20 63 68 65 63 6b 20 74 68  is set, check th
2d100 61 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 62  at this is not b
2d110 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
2d120 0a 2a 2a 20 77 69 74 68 69 6e 20 61 20 63 61 6c  .** within a cal
2d130 6c 62 61 63 6b 20 74 6f 20 61 20 76 69 72 74 75  lback to a virtu
2d140 61 6c 20 74 61 62 6c 65 20 78 53 79 6e 63 28 29  al table xSync()
2d150 20 6d 65 74 68 6f 64 2e 20 49 66 20 69 74 20 69   method. If it i
2d160 73 2c 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  s, the error.** 
2d170 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 73 65 74  code will be set
2d180 20 74 6f 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   to SQLITE_LOCKE
2d190 44 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 42  D..*/.case OP_VB
2d1a0 65 67 69 6e 3a 20 7b 0a 20 20 56 54 61 62 6c 65  egin: {.  VTable
2d1b0 20 2a 70 56 54 61 62 3b 0a 20 20 70 56 54 61 62   *pVTab;.  pVTab
2d1c0 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62   = pOp->p4.pVtab
2d1d0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2d1e0 56 74 61 62 42 65 67 69 6e 28 64 62 2c 20 70 56  VtabBegin(db, pV
2d1f0 54 61 62 29 3b 0a 20 20 69 66 28 20 70 56 54 61  Tab);.  if( pVTa
2d200 62 20 29 20 69 6d 70 6f 72 74 56 74 61 62 45 72  b ) importVtabEr
2d210 72 4d 73 67 28 70 2c 20 70 56 54 61 62 2d 3e 70  rMsg(p, pVTab->p
2d220 56 74 61 62 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  Vtab);.  break;.
2d230 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2d240 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2d250 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ABLE */..#ifndef
2d260 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2d270 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63  TUALTABLE./* Opc
2d280 6f 64 65 3a 20 56 43 72 65 61 74 65 20 50 31 20  ode: VCreate P1 
2d290 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50  * * P4 *.**.** P
2d2a0 34 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  4 is the name of
2d2b0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
2d2c0 20 69 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e   in database P1.
2d2d0 20 43 61 6c 6c 20 74 68 65 20 78 43 72 65 61 74   Call the xCreat
2d2e0 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 66 6f 72 20  e method.** for 
2d2f0 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63  that table..*/.c
2d300 61 73 65 20 4f 50 5f 56 43 72 65 61 74 65 3a 20  ase OP_VCreate: 
2d310 7b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  {.  rc = sqlite3
2d320 56 74 61 62 43 61 6c 6c 43 72 65 61 74 65 28 64  VtabCallCreate(d
2d330 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  b, pOp->p1, pOp-
2d340 3e 70 34 2e 7a 2c 20 26 70 2d 3e 7a 45 72 72 4d  >p4.z, &p->zErrM
2d350 73 67 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  sg);.  break;.}.
2d360 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2d370 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2d380 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  LE */..#ifndef S
2d390 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2d3a0 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64  ALTABLE./* Opcod
2d3b0 65 3a 20 56 44 65 73 74 72 6f 79 20 50 31 20 2a  e: VDestroy P1 *
2d3c0 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34   * P4 *.**.** P4
2d3d0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
2d3e0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
2d3f0 69 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e 20  in database P1. 
2d400 20 43 61 6c 6c 20 74 68 65 20 78 44 65 73 74 72   Call the xDestr
2d410 6f 79 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20  oy method.** of 
2d420 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63  that table..*/.c
2d430 61 73 65 20 4f 50 5f 56 44 65 73 74 72 6f 79 3a  ase OP_VDestroy:
2d440 20 7b 0a 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65   {.  p->inVtabMe
2d450 74 68 6f 64 20 3d 20 32 3b 0a 20 20 72 63 20 3d  thod = 2;.  rc =
2d460 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c   sqlite3VtabCall
2d470 44 65 73 74 72 6f 79 28 64 62 2c 20 70 4f 70 2d  Destroy(db, pOp-
2d480 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  >p1, pOp->p4.z);
2d490 0a 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68  .  p->inVtabMeth
2d4a0 6f 64 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b  od = 0;.  break;
2d4b0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2d4c0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2d4d0 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  TABLE */..#ifnde
2d4e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2d4f0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70  RTUALTABLE./* Op
2d500 63 6f 64 65 3a 20 56 4f 70 65 6e 20 50 31 20 2a  code: VOpen P1 *
2d510 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34   * P4 *.**.** P4
2d520 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2d530 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
2d540 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c 69   object, an sqli
2d550 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75  te3_vtab structu
2d560 72 65 2e 0a 2a 2a 20 50 31 20 69 73 20 61 20 63  re..** P1 is a c
2d570 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 54  ursor number.  T
2d580 68 69 73 20 6f 70 63 6f 64 65 20 6f 70 65 6e 73  his opcode opens
2d590 20 61 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65   a cursor to the
2d5a0 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c   virtual.** tabl
2d5b0 65 20 61 6e 64 20 73 74 6f 72 65 73 20 74 68 61  e and stores tha
2d5c0 74 20 63 75 72 73 6f 72 20 69 6e 20 50 31 2e 0a  t cursor in P1..
2d5d0 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 4f 70 65 6e  */.case OP_VOpen
2d5e0 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
2d5f0 20 2a 70 43 75 72 3b 0a 20 20 73 71 6c 69 74 65   *pCur;.  sqlite
2d600 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
2d610 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 73 71  VtabCursor;.  sq
2d620 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
2d630 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 6f 64  b;.  sqlite3_mod
2d640 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 0a 20  ule *pModule;.. 
2d650 20 70 43 75 72 20 3d 20 30 3b 0a 20 20 70 56 74   pCur = 0;.  pVt
2d660 61 62 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  abCursor = 0;.  
2d670 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e  pVtab = pOp->p4.
2d680 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20  pVtab->pVtab;.  
2d690 70 4d 6f 64 75 6c 65 20 3d 20 28 73 71 6c 69 74  pModule = (sqlit
2d6a0 65 33 5f 6d 6f 64 75 6c 65 20 2a 29 70 56 74 61  e3_module *)pVta
2d6b0 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 61 73  b->pModule;.  as
2d6c0 73 65 72 74 28 70 56 74 61 62 20 26 26 20 70 4d  sert(pVtab && pM
2d6d0 6f 64 75 6c 65 29 3b 0a 20 20 72 63 20 3d 20 70  odule);.  rc = p
2d6e0 4d 6f 64 75 6c 65 2d 3e 78 4f 70 65 6e 28 70 56  Module->xOpen(pV
2d6f0 74 61 62 2c 20 26 70 56 74 61 62 43 75 72 73 6f  tab, &pVtabCurso
2d700 72 29 3b 0a 20 20 69 6d 70 6f 72 74 56 74 61 62  r);.  importVtab
2d710 45 72 72 4d 73 67 28 70 2c 20 70 56 74 61 62 29  ErrMsg(p, pVtab)
2d720 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
2d730 4b 3d 3d 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20  K==rc ){.    /* 
2d740 49 6e 69 74 69 61 6c 69 7a 65 20 73 71 6c 69 74  Initialize sqlit
2d750 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62  e3_vtab_cursor b
2d760 61 73 65 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20  ase class */.   
2d770 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56   pVtabCursor->pV
2d780 74 61 62 20 3d 20 70 56 74 61 62 3b 0a 0a 20 20  tab = pVtab;..  
2d790 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 73 65 20    /* Initialise 
2d7a0 76 64 62 65 20 63 75 72 73 6f 72 20 6f 62 6a 65  vdbe cursor obje
2d7b0 63 74 20 2a 2f 0a 20 20 20 20 70 43 75 72 20 3d  ct */.    pCur =
2d7c0 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
2d7d0 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 2d  p, pOp->p1, 0, -
2d7e0 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  1, 0);.    if( p
2d7f0 43 75 72 20 29 7b 0a 20 20 20 20 20 20 70 43 75  Cur ){.      pCu
2d800 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 3d  r->pVtabCursor =
2d810 20 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20   pVtabCursor;.  
2d820 20 20 20 20 70 43 75 72 2d 3e 70 4d 6f 64 75 6c      pCur->pModul
2d830 65 20 3d 20 70 56 74 61 62 43 75 72 73 6f 72 2d  e = pVtabCursor-
2d840 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b  >pVtab->pModule;
2d850 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2d860 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
2d870 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4d  ed = 1;.      pM
2d880 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56  odule->xClose(pV
2d890 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  tabCursor);.    
2d8a0 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  }.  }.  break;.}
2d8b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2d8c0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2d8d0 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  BLE */..#ifndef 
2d8e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2d8f0 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f  UALTABLE./* Opco
2d900 64 65 3a 20 56 46 69 6c 74 65 72 20 50 31 20 50  de: VFilter P1 P
2d910 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  2 P3 P4 *.**.** 
2d920 50 31 20 69 73 20 61 20 63 75 72 73 6f 72 20 6f  P1 is a cursor o
2d930 70 65 6e 65 64 20 75 73 69 6e 67 20 56 4f 70 65  pened using VOpe
2d940 6e 2e 20 20 50 32 20 69 73 20 61 6e 20 61 64 64  n.  P2 is an add
2d950 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20  ress to jump to 
2d960 69 66 0a 2a 2a 20 74 68 65 20 66 69 6c 74 65 72  if.** the filter
2d970 65 64 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  ed result set is
2d980 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 50 34   empty..**.** P4
2d990 20 69 73 20 65 69 74 68 65 72 20 4e 55 4c 4c 20   is either NULL 
2d9a0 6f 72 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  or a string that
2d9b0 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 62   was generated b
2d9c0 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  y the xBestIndex
2d9d0 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  .** method of th
2d9e0 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 69  e module.  The i
2d9f0 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20 6f 66  nterpretation of
2da00 20 74 68 65 20 50 34 20 73 74 72 69 6e 67 20 69   the P4 string i
2da10 73 20 6c 65 66 74 0a 2a 2a 20 74 6f 20 74 68 65  s left.** to the
2da20 20 6d 6f 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e   module implemen
2da30 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  tation..**.** Th
2da40 69 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65  is opcode invoke
2da50 73 20 74 68 65 20 78 46 69 6c 74 65 72 20 6d 65  s the xFilter me
2da60 74 68 6f 64 20 6f 6e 20 74 68 65 20 76 69 72 74  thod on the virt
2da70 75 61 6c 20 74 61 62 6c 65 20 73 70 65 63 69 66  ual table specif
2da80 69 65 64 0a 2a 2a 20 62 79 20 50 31 2e 20 20 54  ied.** by P1.  T
2da90 68 65 20 69 6e 74 65 67 65 72 20 71 75 65 72 79  he integer query
2daa0 20 70 6c 61 6e 20 70 61 72 61 6d 65 74 65 72 20   plan parameter 
2dab0 74 6f 20 78 46 69 6c 74 65 72 20 69 73 20 73 74  to xFilter is st
2dac0 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
2dad0 0a 2a 2a 20 50 33 2e 20 52 65 67 69 73 74 65 72  .** P3. Register
2dae0 20 50 33 2b 31 20 73 74 6f 72 65 73 20 74 68 65   P3+1 stores the
2daf0 20 61 72 67 63 20 70 61 72 61 6d 65 74 65 72 20   argc parameter 
2db00 74 6f 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  to be passed to 
2db10 74 68 65 0a 2a 2a 20 78 46 69 6c 74 65 72 20 6d  the.** xFilter m
2db20 65 74 68 6f 64 2e 20 52 65 67 69 73 74 65 72 73  ethod. Registers
2db30 20 50 33 2b 32 2e 2e 50 33 2b 31 2b 61 72 67 63   P3+2..P3+1+argc
2db40 20 61 72 65 20 74 68 65 20 61 72 67 63 0a 2a 2a   are the argc.**
2db50 20 61 64 64 69 74 69 6f 6e 61 6c 20 70 61 72 61   additional para
2db60 6d 65 74 65 72 73 20 77 68 69 63 68 20 61 72 65  meters which are
2db70 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 78 46   passed to.** xF
2db80 69 6c 74 65 72 20 61 73 20 61 72 67 76 2e 20 52  ilter as argv. R
2db90 65 67 69 73 74 65 72 20 50 33 2b 32 20 62 65 63  egister P3+2 bec
2dba0 6f 6d 65 73 20 61 72 67 76 5b 30 5d 20 77 68 65  omes argv[0] whe
2dbb0 6e 20 70 61 73 73 65 64 20 74 6f 20 78 46 69 6c  n passed to xFil
2dbc0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d  ter..**.** A jum
2dbd0 70 20 69 73 20 6d 61 64 65 20 74 6f 20 50 32 20  p is made to P2 
2dbe0 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  if the result se
2dbf0 74 20 61 66 74 65 72 20 66 69 6c 74 65 72 69 6e  t after filterin
2dc00 67 20 77 6f 75 6c 64 20 62 65 20 65 6d 70 74 79  g would be empty
2dc10 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 46 69  ..*/.case OP_VFi
2dc20 6c 74 65 72 3a 20 7b 20 20 20 2f 2a 20 6a 75 6d  lter: {   /* jum
2dc30 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b  p */.  int nArg;
2dc40 0a 20 20 69 6e 74 20 69 51 75 65 72 79 3b 0a 20  .  int iQuery;. 
2dc50 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
2dc60 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a  odule *pModule;.
2dc70 20 20 4d 65 6d 20 2a 70 51 75 65 72 79 3b 0a 20    Mem *pQuery;. 
2dc80 20 4d 65 6d 20 2a 70 41 72 67 63 3b 0a 20 20 73   Mem *pArgc;.  s
2dc90 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
2dca0 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 3b  or *pVtabCursor;
2dcb0 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
2dcc0 2a 70 56 74 61 62 3b 0a 20 20 56 64 62 65 43 75  *pVtab;.  VdbeCu
2dcd0 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
2dce0 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 69 3b 0a  t res;.  int i;.
2dcf0 20 20 4d 65 6d 20 2a 2a 61 70 41 72 67 3b 0a 0a    Mem **apArg;..
2dd00 20 20 70 51 75 65 72 79 20 3d 20 26 61 4d 65 6d    pQuery = &aMem
2dd10 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 41 72  [pOp->p3];.  pAr
2dd20 67 63 20 3d 20 26 70 51 75 65 72 79 5b 31 5d 3b  gc = &pQuery[1];
2dd30 0a 20 20 70 43 75 72 20 3d 20 70 2d 3e 61 70 43  .  pCur = p->apC
2dd40 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
2dd50 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
2dd60 64 28 70 51 75 65 72 79 29 20 29 3b 0a 20 20 52  d(pQuery) );.  R
2dd70 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
2dd80 70 2d 3e 70 33 2c 20 70 51 75 65 72 79 29 3b 0a  p->p3, pQuery);.
2dd90 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2dda0 70 56 74 61 62 43 75 72 73 6f 72 20 29 3b 0a 20  pVtabCursor );. 
2ddb0 20 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70   pVtabCursor = p
2ddc0 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  Cur->pVtabCursor
2ddd0 3b 0a 20 20 70 56 74 61 62 20 3d 20 70 56 74 61  ;.  pVtab = pVta
2dde0 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a  bCursor->pVtab;.
2ddf0 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61    pModule = pVta
2de00 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 2f  b->pModule;..  /
2de10 2a 20 47 72 61 62 20 74 68 65 20 69 6e 64 65 78  * Grab the index
2de20 20 6e 75 6d 62 65 72 20 61 6e 64 20 61 72 67 63   number and argc
2de30 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
2de40 20 61 73 73 65 72 74 28 20 28 70 51 75 65 72 79   assert( (pQuery
2de50 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 29  ->flags&MEM_Int)
2de60 21 3d 30 20 26 26 20 70 41 72 67 63 2d 3e 66 6c  !=0 && pArgc->fl
2de70 61 67 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a  ags==MEM_Int );.
2de80 20 20 6e 41 72 67 20 3d 20 28 69 6e 74 29 70 41    nArg = (int)pA
2de90 72 67 63 2d 3e 75 2e 69 3b 0a 20 20 69 51 75 65  rgc->u.i;.  iQue
2dea0 72 79 20 3d 20 28 69 6e 74 29 70 51 75 65 72 79  ry = (int)pQuery
2deb0 2d 3e 75 2e 69 3b 0a 0a 20 20 2f 2a 20 49 6e 76  ->u.i;..  /* Inv
2dec0 6f 6b 65 20 74 68 65 20 78 46 69 6c 74 65 72 20  oke the xFilter 
2ded0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7b 0a 20 20  method */.  {.  
2dee0 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 61    res = 0;.    a
2def0 70 41 72 67 20 3d 20 70 2d 3e 61 70 41 72 67 3b  pArg = p->apArg;
2df00 0a 20 20 20 20 66 6f 72 28 69 20 3d 20 30 3b 20  .    for(i = 0; 
2df10 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
2df20 20 20 20 20 61 70 41 72 67 5b 69 5d 20 3d 20 26      apArg[i] = &
2df30 70 41 72 67 63 5b 69 2b 31 5d 3b 0a 20 20 20 20  pArgc[i+1];.    
2df40 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
2df50 53 74 6f 72 65 54 79 70 65 28 61 70 41 72 67 5b  StoreType(apArg[
2df60 69 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  i]);.    }..    
2df70 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
2df80 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 70 4d  = 1;.    rc = pM
2df90 6f 64 75 6c 65 2d 3e 78 46 69 6c 74 65 72 28 70  odule->xFilter(p
2dfa0 56 74 61 62 43 75 72 73 6f 72 2c 20 69 51 75 65  VtabCursor, iQue
2dfb0 72 79 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 6e  ry, pOp->p4.z, n
2dfc0 41 72 67 2c 20 61 70 41 72 67 29 3b 0a 20 20 20  Arg, apArg);.   
2dfd0 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
2dfe0 20 3d 20 30 3b 0a 20 20 20 20 69 6d 70 6f 72 74   = 0;.    import
2dff0 56 74 61 62 45 72 72 4d 73 67 28 70 2c 20 70 56  VtabErrMsg(p, pV
2e000 74 61 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tab);.    if( rc
2e010 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e020 20 20 20 20 20 72 65 73 20 3d 20 70 4d 6f 64 75       res = pModu
2e030 6c 65 2d 3e 78 45 6f 66 28 70 56 74 61 62 43 75  le->xEof(pVtabCu
2e040 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  rsor);.    }..  
2e050 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
2e060 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
2e070 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  - 1;.    }.  }. 
2e080 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d   pCur->nullRow =
2e090 20 30 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a   0;..  break;.}.
2e0a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2e0b0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2e0c0 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  LE */..#ifndef S
2e0d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2e0e0 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64  ALTABLE./* Opcod
2e0f0 65 3a 20 56 43 6f 6c 75 6d 6e 20 50 31 20 50 32  e: VColumn P1 P2
2e100 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 74   P3 * *.**.** St
2e110 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
2e120 20 74 68 65 20 50 32 2d 74 68 20 63 6f 6c 75 6d   the P2-th colum
2e130 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 6f 77 20  n of.** the row 
2e140 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 2d 74  of the virtual-t
2e150 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 0a 2a  able that the .*
2e160 2a 20 50 31 20 63 75 72 73 6f 72 20 69 73 20 70  * P1 cursor is p
2e170 6f 69 6e 74 69 6e 67 20 74 6f 20 69 6e 74 6f 20  ointing to into 
2e180 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2f 0a  register P3..*/.
2e190 63 61 73 65 20 4f 50 5f 56 43 6f 6c 75 6d 6e 3a  case OP_VColumn:
2e1a0 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61   {.  sqlite3_vta
2e1b0 62 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73  b *pVtab;.  cons
2e1c0 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
2e1d0 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d   *pModule;.  Mem
2e1e0 20 2a 70 44 65 73 74 3b 0a 20 20 73 71 6c 69 74   *pDest;.  sqlit
2e1f0 65 33 5f 63 6f 6e 74 65 78 74 20 73 43 6f 6e 74  e3_context sCont
2e200 65 78 74 3b 0a 0a 20 20 56 64 62 65 43 75 72 73  ext;..  VdbeCurs
2e210 6f 72 20 2a 70 43 75 72 20 3d 20 70 2d 3e 61 70  or *pCur = p->ap
2e220 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
2e230 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 56  assert( pCur->pV
2e240 74 61 62 43 75 72 73 6f 72 20 29 3b 0a 20 20 61  tabCursor );.  a
2e250 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30  ssert( pOp->p3>0
2e260 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e   && pOp->p3<=p->
2e270 6e 4d 65 6d 20 29 3b 0a 20 20 70 44 65 73 74 20  nMem );.  pDest 
2e280 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
2e290 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68  ;.  memAboutToCh
2e2a0 61 6e 67 65 28 70 2c 20 70 44 65 73 74 29 3b 0a  ange(p, pDest);.
2e2b0 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 75 6c 6c    if( pCur->null
2e2c0 52 6f 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Row ){.    sqlit
2e2d0 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c  e3VdbeMemSetNull
2e2e0 28 70 44 65 73 74 29 3b 0a 20 20 20 20 62 72 65  (pDest);.    bre
2e2f0 61 6b 3b 0a 20 20 7d 0a 20 20 70 56 74 61 62 20  ak;.  }.  pVtab 
2e300 3d 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72  = pCur->pVtabCur
2e310 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d  sor->pVtab;.  pM
2e320 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70  odule = pVtab->p
2e330 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65 72 74  Module;.  assert
2e340 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75  ( pModule->xColu
2e350 6d 6e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  mn );.  memset(&
2e360 73 43 6f 6e 74 65 78 74 2c 20 30 2c 20 73 69 7a  sContext, 0, siz
2e370 65 6f 66 28 73 43 6f 6e 74 65 78 74 29 29 3b 0a  eof(sContext));.
2e380 0a 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74  .  /* The output
2e390 20 63 65 6c 6c 20 6d 61 79 20 61 6c 72 65 61 64   cell may alread
2e3a0 79 20 68 61 76 65 20 61 20 62 75 66 66 65 72 20  y have a buffer 
2e3b0 61 6c 6c 6f 63 61 74 65 64 2e 20 4d 6f 76 65 0a  allocated. Move.
2e3c0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
2e3d0 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20 73 43 6f   contents to sCo
2e3e0 6e 74 65 78 74 2e 73 20 73 6f 20 69 6e 20 63 61  ntext.s so in ca
2e3f0 73 65 20 74 68 65 20 75 73 65 72 2d 66 75 6e 63  se the user-func
2e400 74 69 6f 6e 20 0a 20 20 2a 2a 20 63 61 6e 20 75  tion .  ** can u
2e410 73 65 20 74 68 65 20 61 6c 72 65 61 64 79 20 61  se the already a
2e420 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
2e430 69 6e 73 74 65 61 64 20 6f 66 20 61 6c 6c 6f 63  instead of alloc
2e440 61 74 69 6e 67 20 61 20 0a 20 20 2a 2a 20 6e 65  ating a .  ** ne
2e450 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  w one..  */.  sq
2e460 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65  lite3VdbeMemMove
2e470 28 26 73 43 6f 6e 74 65 78 74 2e 73 2c 20 70 44  (&sContext.s, pD
2e480 65 73 74 29 3b 0a 20 20 4d 65 6d 53 65 74 54 79  est);.  MemSetTy
2e490 70 65 46 6c 61 67 28 26 73 43 6f 6e 74 65 78 74  peFlag(&sContext
2e4a0 2e 73 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 0a  .s, MEM_Null);..
2e4b0 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e    rc = pModule->
2e4c0 78 43 6f 6c 75 6d 6e 28 70 43 75 72 2d 3e 70 56  xColumn(pCur->pV
2e4d0 74 61 62 43 75 72 73 6f 72 2c 20 26 73 43 6f 6e  tabCursor, &sCon
2e4e0 74 65 78 74 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a  text, pOp->p2);.
2e4f0 20 20 69 6d 70 6f 72 74 56 74 61 62 45 72 72 4d    importVtabErrM
2e500 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20  sg(p, pVtab);.  
2e510 69 66 28 20 73 43 6f 6e 74 65 78 74 2e 69 73 45  if( sContext.isE
2e520 72 72 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  rror ){.    rc =
2e530 20 73 43 6f 6e 74 65 78 74 2e 69 73 45 72 72 6f   sContext.isErro
2e540 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 70  r;.  }..  /* Cop
2e550 79 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  y the result of 
2e560 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  the function to 
2e570 74 68 65 20 50 33 20 72 65 67 69 73 74 65 72 2e  the P3 register.
2e580 20 57 65 0a 20 20 2a 2a 20 64 6f 20 74 68 69 73   We.  ** do this
2e590 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
2e5a0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e  hether or not an
2e5b0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
2e5c0 74 6f 20 65 6e 73 75 72 65 20 61 6e 79 0a 20 20  to ensure any.  
2e5d0 2a 2a 20 64 79 6e 61 6d 69 63 20 61 6c 6c 6f 63  ** dynamic alloc
2e5e0 61 74 69 6f 6e 20 69 6e 20 73 43 6f 6e 74 65 78  ation in sContex
2e5f0 74 2e 73 20 28 61 20 4d 65 6d 20 73 74 72 75 63  t.s (a Mem struc
2e600 74 29 20 69 73 20 20 72 65 6c 65 61 73 65 64 2e  t) is  released.
2e610 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
2e620 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e  dbeChangeEncodin
2e630 67 28 26 73 43 6f 6e 74 65 78 74 2e 73 2c 20 65  g(&sContext.s, e
2e640 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 73 71 6c 69  ncoding);.  sqli
2e650 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 70  te3VdbeMemMove(p
2e660 44 65 73 74 2c 20 26 73 43 6f 6e 74 65 78 74 2e  Dest, &sContext.
2e670 73 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54  s);.  REGISTER_T
2e680 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 44  RACE(pOp->p3, pD
2e690 65 73 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d  est);.  UPDATE_M
2e6a0 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 44 65 73  AX_BLOBSIZE(pDes
2e6b0 74 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  t);..  if( sqlit
2e6c0 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28  e3VdbeMemTooBig(
2e6d0 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 67 6f  pDest) ){.    go
2e6e0 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a  to too_big;.  }.
2e6f0 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
2e700 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2e710 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
2e720 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2e730 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2e740 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 4e  LE./* Opcode: VN
2e750 65 78 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  ext P1 P2 * * *.
2e760 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 76 69  **.** Advance vi
2e770 72 74 75 61 6c 20 74 61 62 6c 65 20 50 31 20 74  rtual table P1 t
2e780 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  o the next row i
2e790 6e 20 69 74 73 20 72 65 73 75 6c 74 20 73 65 74  n its result set
2e7a0 20 61 6e 64 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20   and.** jump to 
2e7b0 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 20  instruction P2. 
2e7c0 20 4f 72 2c 20 69 66 20 74 68 65 20 76 69 72 74   Or, if the virt
2e7d0 75 61 6c 20 74 61 62 6c 65 20 68 61 73 20 72 65  ual table has re
2e7e0 61 63 68 65 64 0a 2a 2a 20 74 68 65 20 65 6e 64  ached.** the end
2e7f0 20 6f 66 20 69 74 73 20 72 65 73 75 6c 74 20 73   of its result s
2e800 65 74 2c 20 74 68 65 6e 20 66 61 6c 6c 20 74 68  et, then fall th
2e810 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
2e820 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  t instruction..*
2e830 2f 0a 63 61 73 65 20 4f 50 5f 56 4e 65 78 74 3a  /.case OP_VNext:
2e840 20 7b 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a   {   /* jump */.
2e850 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
2e860 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73  pVtab;.  const s
2e870 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
2e880 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e 74 20 72 65  Module;.  int re
2e890 73 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  s;.  VdbeCursor 
2e8a0 2a 70 43 75 72 3b 0a 0a 20 20 72 65 73 20 3d 20  *pCur;..  res = 
2e8b0 30 3b 0a 20 20 70 43 75 72 20 3d 20 70 2d 3e 61  0;.  pCur = p->a
2e8c0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
2e8d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2e8e0 56 74 61 62 43 75 72 73 6f 72 20 29 3b 0a 20 20  VtabCursor );.  
2e8f0 69 66 28 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f  if( pCur->nullRo
2e900 77 20 29 7b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  w ){.    break;.
2e910 20 20 7d 0a 20 20 70 56 74 61 62 20 3d 20 70 43    }.  pVtab = pC
2e920 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 2d  ur->pVtabCursor-
2e930 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64 75 6c  >pVtab;.  pModul
2e940 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  e = pVtab->pModu
2e950 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d  le;.  assert( pM
2e960 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 20 29 3b 0a  odule->xNext );.
2e970 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  /* Invoke the
2e980 20 78 4e 65 78 74 28 29 20 6d 65 74 68 6f 64 20   xNext() method 
2e990 6f 66 20 74 68 65 20 6d 6f 64 75 6c 65 2e 20 54  of the module. T
2e9a0 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66  here is no way f
2e9b0 6f 72 20 74 68 65 0a 20 20 2a 2a 20 75 6e 64 65  or the.  ** unde
2e9c0 72 6c 79 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  rlying implement
2e9d0 61 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20  ation to return 
2e9e0 61 6e 20 65 72 72 6f 72 20 69 66 20 6f 6e 65 20  an error if one 
2e9f0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 20 20  occurs during.  
2ea00 2a 2a 20 78 4e 65 78 74 28 29 2e 20 49 6e 73 74  ** xNext(). Inst
2ea10 65 61 64 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  ead, if an error
2ea20 20 6f 63 63 75 72 73 2c 20 74 72 75 65 20 69 73   occurs, true is
2ea30 20 72 65 74 75 72 6e 65 64 20 28 69 6e 64 69 63   returned (indic
2ea40 61 74 69 6e 67 20 74 68 61 74 20 0a 20 20 2a 2a  ating that .  **
2ea50 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62   data is availab
2ea60 6c 65 29 20 61 6e 64 20 74 68 65 20 65 72 72 6f  le) and the erro
2ea70 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20  r code returned 
2ea80 77 68 65 6e 20 78 43 6f 6c 75 6d 6e 20 6f 72 0a  when xColumn or.
2ea90 20 20 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20    ** some other 
2eaa0 6d 65 74 68 6f 64 20 69 73 20 6e 65 78 74 20 69  method is next i
2eab0 6e 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20 73 61  nvoked on the sa
2eac0 76 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ve virtual table
2ead0 20 63 75 72 73 6f 72 2e 0a 20 20 2a 2f 0a 20 20   cursor..  */.  
2eae0 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
2eaf0 3d 20 31 3b 0a 20 20 72 63 20 3d 20 70 4d 6f 64  = 1;.  rc = pMod
2eb00 75 6c 65 2d 3e 78 4e 65 78 74 28 70 43 75 72 2d  ule->xNext(pCur-
2eb10 3e 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20  >pVtabCursor);. 
2eb20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
2eb30 20 3d 20 30 3b 0a 20 20 69 6d 70 6f 72 74 56 74   = 0;.  importVt
2eb40 61 62 45 72 72 4d 73 67 28 70 2c 20 70 56 74 61  abErrMsg(p, pVta
2eb50 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  b);.  if( rc==SQ
2eb60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
2eb70 65 73 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 45  es = pModule->xE
2eb80 6f 66 28 70 43 75 72 2d 3e 70 56 74 61 62 43 75  of(pCur->pVtabCu
2eb90 72 73 6f 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  rsor);.  }..  if
2eba0 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a  ( !res ){.    /*
2ebb0 20 49 66 20 74 68 65 72 65 20 69 73 20 64 61 74   If there is dat
2ebc0 61 2c 20 6a 75 6d 70 20 74 6f 20 50 32 20 2a 2f  a, jump to P2 */
2ebd0 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70  .    pc = pOp->p
2ebe0 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65  2 - 1;.  }.  bre
2ebf0 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ak;.}.#endif /* 
2ec00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2ec10 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
2ec20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2ec30 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
2ec40 20 4f 70 63 6f 64 65 3a 20 56 52 65 6e 61 6d 65   Opcode: VRename
2ec50 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a   P1 * * P4 *.**.
2ec60 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74  ** P4 is a point
2ec70 65 72 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20  er to a virtual 
2ec80 74 61 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e  table object, an
2ec90 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74   sqlite3_vtab st
2eca0 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 69 73  ructure..** This
2ecb0 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20   opcode invokes 
2ecc0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2ecd0 67 20 78 52 65 6e 61 6d 65 20 6d 65 74 68 6f 64  g xRename method
2ece0 2e 20 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69  . The value.** i
2ecf0 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  n register P1 is
2ed00 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 7a   passed as the z
2ed10 4e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f  Name argument to
2ed20 20 74 68 65 20 78 52 65 6e 61 6d 65 20 6d 65 74   the xRename met
2ed30 68 6f 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  hod..*/.case OP_
2ed40 56 52 65 6e 61 6d 65 3a 20 7b 0a 20 20 73 71 6c  VRename: {.  sql
2ed50 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
2ed60 3b 0a 20 20 4d 65 6d 20 2a 70 4e 61 6d 65 3b 0a  ;.  Mem *pName;.
2ed70 0a 20 20 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  .  pVtab = pOp->
2ed80 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b  p4.pVtab->pVtab;
2ed90 0a 20 20 70 4e 61 6d 65 20 3d 20 26 61 4d 65 6d  .  pName = &aMem
2eda0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
2edb0 65 72 74 28 20 70 56 74 61 62 2d 3e 70 4d 6f 64  ert( pVtab->pMod
2edc0 75 6c 65 2d 3e 78 52 65 6e 61 6d 65 20 29 3b 0a  ule->xRename );.
2edd0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
2ede0 61 6c 69 64 28 70 4e 61 6d 65 29 20 29 3b 0a 20  alid(pName) );. 
2edf0 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
2ee00 70 4f 70 2d 3e 70 31 2c 20 70 4e 61 6d 65 29 3b  pOp->p1, pName);
2ee10 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
2ee20 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
2ee30 72 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  r );.  testcase(
2ee40 20 70 4e 61 6d 65 2d 3e 65 6e 63 3d 3d 53 51 4c   pName->enc==SQL
2ee50 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 74 65  ITE_UTF8 );.  te
2ee60 73 74 63 61 73 65 28 20 70 4e 61 6d 65 2d 3e 65  stcase( pName->e
2ee70 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
2ee80 42 45 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  BE );.  testcase
2ee90 28 20 70 4e 61 6d 65 2d 3e 65 6e 63 3d 3d 53 51  ( pName->enc==SQ
2eea0 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 29 3b 0a  LITE_UTF16LE );.
2eeb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
2eec0 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67  beChangeEncoding
2eed0 28 70 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55  (pName, SQLITE_U
2eee0 54 46 38 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  TF8);.  if( rc==
2eef0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ef00 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f   rc = pVtab->pMo
2ef10 64 75 6c 65 2d 3e 78 52 65 6e 61 6d 65 28 70 56  dule->xRename(pV
2ef20 74 61 62 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a  tab, pName->z);.
2ef30 20 20 20 20 69 6d 70 6f 72 74 56 74 61 62 45 72      importVtabEr
2ef40 72 4d 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a  rMsg(p, pVtab);.
2ef50 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d      p->expired =
2ef60 20 30 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   0;.  }.  break;
2ef70 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
2ef80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2ef90 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f  IRTUALTABLE./* O
2efa0 70 63 6f 64 65 3a 20 56 55 70 64 61 74 65 20 50  pcode: VUpdate P
2efb0 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a  1 P2 P3 P4 *.**.
2efc0 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74  ** P4 is a point
2efd0 65 72 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20  er to a virtual 
2efe0 74 61 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e  table object, an
2eff0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74   sqlite3_vtab st
2f000 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 69 73  ructure..** This
2f010 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20   opcode invokes 
2f020 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2f030 67 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64  g xUpdate method
2f040 2e 20 50 32 20 76 61 6c 75 65 73 0a 2a 2a 20 61  . P2 values.** a
2f050 72 65 20 63 6f 6e 74 69 67 75 6f 75 73 20 6d 65  re contiguous me
2f060 6d 6f 72 79 20 63 65 6c 6c 73 20 73 74 61 72 74  mory cells start
2f070 69 6e 67 20 61 74 20 50 33 20 74 6f 20 70 61 73  ing at P3 to pas
2f080 73 20 74 6f 20 74 68 65 20 78 55 70 64 61 74 65  s to the xUpdate
2f090 20 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 2e   .** invocation.
2f0a0 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   The value in re
2f0b0 67 69 73 74 65 72 20 28 50 33 2b 50 32 2d 31 29  gister (P3+P2-1)
2f0c0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2f0d0 74 68 65 20 0a 2a 2a 20 70 32 74 68 20 65 6c 65  the .** p2th ele
2f0e0 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 72 67 76  ment of the argv
2f0f0 20 61 72 72 61 79 20 70 61 73 73 65 64 20 74 6f   array passed to
2f100 20 78 55 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20   xUpdate..**.** 
2f110 54 68 65 20 78 55 70 64 61 74 65 20 6d 65 74 68  The xUpdate meth
2f120 6f 64 20 77 69 6c 6c 20 64 6f 20 61 20 44 45 4c  od will do a DEL
2f130 45 54 45 20 6f 72 20 61 6e 20 49 4e 53 45 52 54  ETE or an INSERT
2f140 20 6f 72 20 62 6f 74 68 2e 0a 2a 2a 20 54 68 65   or both..** The
2f150 20 61 72 67 76 5b 30 5d 20 65 6c 65 6d 65 6e 74   argv[0] element
2f160 20 28 77 68 69 63 68 20 63 6f 72 72 65 73 70 6f   (which correspo
2f170 6e 64 73 20 74 6f 20 6d 65 6d 6f 72 79 20 63 65  nds to memory ce
2f180 6c 6c 20 50 33 29 0a 2a 2a 20 69 73 20 74 68 65  ll P3).** is the
2f190 20 72 6f 77 69 64 20 6f 66 20 61 20 72 6f 77 20   rowid of a row 
2f1a0 74 6f 20 64 65 6c 65 74 65 2e 20 20 49 66 20 61  to delete.  If a
2f1b0 72 67 76 5b 30 5d 20 69 73 20 4e 55 4c 4c 20 74  rgv[0] is NULL t
2f1c0 68 65 6e 20 6e 6f 20 0a 2a 2a 20 64 65 6c 65 74  hen no .** delet
2f1d0 69 6f 6e 20 6f 63 63 75 72 73 2e 20 20 54 68 65  ion occurs.  The
2f1e0 20 61 72 67 76 5b 31 5d 20 65 6c 65 6d 65 6e 74   argv[1] element
2f1f0 20 69 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66   is the rowid of
2f200 20 74 68 65 20 6e 65 77 20 0a 2a 2a 20 72 6f 77   the new .** row
2f210 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 4e  .  This can be N
2f220 55 4c 4c 20 74 6f 20 68 61 76 65 20 74 68 65 20  ULL to have the 
2f230 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73 65  virtual table se
2f240 6c 65 63 74 20 74 68 65 20 6e 65 77 20 0a 2a 2a  lect the new .**
2f250 20 72 6f 77 69 64 20 66 6f 72 20 69 74 73 65 6c   rowid for itsel
2f260 66 2e 20 20 54 68 65 20 73 75 62 73 65 71 75 65  f.  The subseque
2f270 6e 74 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  nt elements in t
2f280 68 65 20 61 72 72 61 79 20 61 72 65 20 0a 2a 2a  he array are .**
2f290 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 63   the values of c
2f2a0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6e 65  olumns in the ne
2f2b0 77 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  w row..**.** If 
2f2c0 50 32 3d 3d 31 20 74 68 65 6e 20 6e 6f 20 69 6e  P2==1 then no in
2f2d0 73 65 72 74 20 69 73 20 70 65 72 66 6f 72 6d 65  sert is performe
2f2e0 64 2e 20 20 61 72 67 76 5b 30 5d 20 69 73 20 74  d.  argv[0] is t
2f2f0 68 65 20 72 6f 77 69 64 20 6f 66 0a 2a 2a 20 61  he rowid of.** a
2f300 20 72 6f 77 20 74 6f 20 64 65 6c 65 74 65 2e 0a   row to delete..
2f310 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 62 6f  **.** P1 is a bo
2f320 6f 6c 65 61 6e 20 66 6c 61 67 2e 20 49 66 20 69  olean flag. If i
2f330 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
2f340 20 61 6e 64 20 74 68 65 20 78 55 70 64 61 74 65   and the xUpdate
2f350 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 73 75 63 63   call.** is succ
2f360 65 73 73 66 75 6c 2c 20 74 68 65 6e 20 74 68 65  essful, then the
2f370 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
2f380 62 79 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  by sqlite3_last_
2f390 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 0a  insert_rowid() .
2f3a0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
2f3b0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f   value of the ro
2f3c0 77 69 64 20 66 6f 72 20 74 68 65 20 72 6f 77 20  wid for the row 
2f3d0 6a 75 73 74 20 69 6e 73 65 72 74 65 64 2e 0a 2a  just inserted..*
2f3e0 2f 0a 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74  /.case OP_VUpdat
2f3f0 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  e: {.  sqlite3_v
2f400 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 73 71  tab *pVtab;.  sq
2f410 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
2f420 6f 64 75 6c 65 3b 0a 20 20 69 6e 74 20 6e 41 72  odule;.  int nAr
2f430 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  g;.  int i;.  sq
2f440 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64  lite_int64 rowid
2f450 3b 0a 20 20 4d 65 6d 20 2a 2a 61 70 41 72 67 3b  ;.  Mem **apArg;
2f460 0a 20 20 4d 65 6d 20 2a 70 58 3b 0a 0a 20 20 61  .  Mem *pX;..  a
2f470 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d  ssert( pOp->p2==
2f480 31 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d  1        || pOp-
2f490 3e 70 35 3d 3d 4f 45 5f 46 61 69 6c 20 20 20 7c  >p5==OE_Fail   |
2f4a0 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 52 6f  | pOp->p5==OE_Ro
2f4b0 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 7c  llback .       |
2f4c0 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 41 62  | pOp->p5==OE_Ab
2f4d0 6f 72 74 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d  ort || pOp->p5==
2f4e0 4f 45 5f 49 67 6e 6f 72 65 20 7c 7c 20 70 4f 70  OE_Ignore || pOp
2f4f0 2d 3e 70 35 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  ->p5==OE_Replace
2f500 0a 20 20 29 3b 0a 20 20 70 56 74 61 62 20 3d 20  .  );.  pVtab = 
2f510 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70  pOp->p4.pVtab->p
2f520 56 74 61 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20  Vtab;.  pModule 
2f530 3d 20 28 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  = (sqlite3_modul
2f540 65 20 2a 29 70 56 74 61 62 2d 3e 70 4d 6f 64 75  e *)pVtab->pModu
2f550 6c 65 3b 0a 20 20 6e 41 72 67 20 3d 20 70 4f 70  le;.  nArg = pOp
2f560 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p2;.  assert( 
2f570 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
2f580 56 54 41 42 20 29 3b 0a 20 20 69 66 28 20 41 4c  VTAB );.  if( AL
2f590 57 41 59 53 28 70 4d 6f 64 75 6c 65 2d 3e 78 55  WAYS(pModule->xU
2f5a0 70 64 61 74 65 29 20 29 7b 0a 20 20 20 20 75 38  pdate) ){.    u8
2f5b0 20 76 74 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 20   vtabOnConflict 
2f5c0 3d 20 64 62 2d 3e 76 74 61 62 4f 6e 43 6f 6e 66  = db->vtabOnConf
2f5d0 6c 69 63 74 3b 0a 20 20 20 20 61 70 41 72 67 20  lict;.    apArg 
2f5e0 3d 20 70 2d 3e 61 70 41 72 67 3b 0a 20 20 20 20  = p->apArg;.    
2f5f0 70 58 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  pX = &aMem[pOp->
2f600 70 33 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  p3];.    for(i=0
2f610 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
2f620 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
2f630 6d 49 73 56 61 6c 69 64 28 70 58 29 20 29 3b 0a  mIsValid(pX) );.
2f640 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f        memAboutTo
2f650 43 68 61 6e 67 65 28 70 2c 20 70 58 29 3b 0a 20  Change(p, pX);. 
2f660 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f670 4d 65 6d 53 74 6f 72 65 54 79 70 65 28 70 58 29  MemStoreType(pX)
2f680 3b 0a 20 20 20 20 20 20 61 70 41 72 67 5b 69 5d  ;.      apArg[i]
2f690 20 3d 20 70 58 3b 0a 20 20 20 20 20 20 70 58 2b   = pX;.      pX+
2f6a0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  +;.    }.    db-
2f6b0 3e 76 74 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 20  >vtabOnConflict 
2f6c0 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 20 20 72  = pOp->p5;.    r
2f6d0 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 55 70  c = pModule->xUp
2f6e0 64 61 74 65 28 70 56 74 61 62 2c 20 6e 41 72 67  date(pVtab, nArg
2f6f0 2c 20 61 70 41 72 67 2c 20 26 72 6f 77 69 64 29  , apArg, &rowid)
2f700 3b 0a 20 20 20 20 64 62 2d 3e 76 74 61 62 4f 6e  ;.    db->vtabOn
2f710 43 6f 6e 66 6c 69 63 74 20 3d 20 76 74 61 62 4f  Conflict = vtabO
2f720 6e 43 6f 6e 66 6c 69 63 74 3b 0a 20 20 20 20 69  nConflict;.    i
2f730 6d 70 6f 72 74 56 74 61 62 45 72 72 4d 73 67 28  mportVtabErrMsg(
2f740 70 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20 69  p, pVtab);.    i
2f750 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f760 20 26 26 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20   && pOp->p1 ){. 
2f770 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72       assert( nAr
2f780 67 3e 31 20 26 26 20 61 70 41 72 67 5b 30 5d 20  g>1 && apArg[0] 
2f790 26 26 20 28 61 70 41 72 67 5b 30 5d 2d 3e 66 6c  && (apArg[0]->fl
2f7a0 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 29 20 29 3b  ags&MEM_Null) );
2f7b0 0a 20 20 20 20 20 20 64 62 2d 3e 6c 61 73 74 52  .      db->lastR
2f7c0 6f 77 69 64 20 3d 20 6c 61 73 74 52 6f 77 69 64  owid = lastRowid
2f7d0 20 3d 20 72 6f 77 69 64 3b 0a 20 20 20 20 7d 0a   = rowid;.    }.
2f7e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f7f0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
2f800 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e   pOp->p4.pVtab->
2f810 62 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20  bConstraint ){. 
2f820 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35       if( pOp->p5
2f830 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20  ==OE_Ignore ){. 
2f840 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2f850 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  TE_OK;.      }el
2f860 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  se{.        p->e
2f870 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 28 28 70  rrorAction = ((p
2f880 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 52 65 70 6c 61  Op->p5==OE_Repla
2f890 63 65 29 20 3f 20 4f 45 5f 41 62 6f 72 74 20 3a  ce) ? OE_Abort :
2f8a0 20 70 4f 70 2d 3e 70 35 29 3b 0a 20 20 20 20 20   pOp->p5);.     
2f8b0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2f8c0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b      p->nChange++
2f8d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
2f8e0 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
2f8f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2f900 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
2f910 66 6e 64 65 66 20 20 53 51 4c 49 54 45 5f 4f 4d  fndef  SQLITE_OM
2f920 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
2f930 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61 67 65  ./* Opcode: Page
2f940 63 6f 75 6e 74 20 50 31 20 50 32 20 2a 20 2a 20  count P1 P2 * * 
2f950 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  *.**.** Write th
2f960 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72  e current number
2f970 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
2f980 61 62 61 73 65 20 50 31 20 74 6f 20 6d 65 6d 6f  abase P1 to memo
2f990 72 79 20 63 65 6c 6c 20 50 32 2e 0a 2a 2f 0a 63  ry cell P2..*/.c
2f9a0 61 73 65 20 4f 50 5f 50 61 67 65 63 6f 75 6e 74  ase OP_Pagecount
2f9b0 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
2f9c0 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73  * out2-prereleas
2f9d0 65 20 2a 2f 0a 20 20 70 4f 75 74 2d 3e 75 2e 69  e */.  pOut->u.i
2f9e0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c   = sqlite3BtreeL
2f9f0 61 73 74 50 61 67 65 28 64 62 2d 3e 61 44 62 5b  astPage(db->aDb[
2fa00 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 29 3b 0a 20  pOp->p1].pBt);. 
2fa10 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
2fa20 0a 0a 0a 23 69 66 6e 64 65 66 20 20 53 51 4c 49  ...#ifndef  SQLI
2fa30 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
2fa40 41 47 4d 41 53 0a 2f 2a 20 4f 70 63 6f 64 65 3a  AGMAS./* Opcode:
2fa50 20 4d 61 78 50 67 63 6e 74 20 50 31 20 50 32 20   MaxPgcnt P1 P2 
2fa60 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 72 79  P3 * *.**.** Try
2fa70 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
2fa80 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
2fa90 6f 72 20 64 61 74 61 62 61 73 65 20 50 31 20 74  or database P1 t
2faa0 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 50  o the value in P
2fab0 33 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 6c 65 74  3..** Do not let
2fac0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
2fad0 65 20 63 6f 75 6e 74 20 66 61 6c 6c 20 62 65 6c  e count fall bel
2fae0 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ow the current p
2faf0 61 67 65 20 63 6f 75 6e 74 20 61 6e 64 0a 2a 2a  age count and.**
2fb00 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
2fb10 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
2fb20 63 6f 75 6e 74 20 76 61 6c 75 65 20 69 66 20 50  count value if P
2fb30 33 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f 72  3==0..**.** Stor
2fb40 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  e the maximum pa
2fb50 67 65 20 63 6f 75 6e 74 20 61 66 74 65 72 20 74  ge count after t
2fb60 68 65 20 63 68 61 6e 67 65 20 69 6e 20 72 65 67  he change in reg
2fb70 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73  ister P2..*/.cas
2fb80 65 20 4f 50 5f 4d 61 78 50 67 63 6e 74 3a 20 7b  e OP_MaxPgcnt: {
2fb90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
2fba0 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a  ut2-prerelease *
2fbb0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
2fbc0 20 6e 65 77 4d 61 78 3b 0a 20 20 42 74 72 65 65   newMax;.  Btree
2fbd0 20 2a 70 42 74 3b 0a 0a 20 20 70 42 74 20 3d 20   *pBt;..  pBt = 
2fbe0 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d  db->aDb[pOp->p1]
2fbf0 2e 70 42 74 3b 0a 20 20 6e 65 77 4d 61 78 20 3d  .pBt;.  newMax =
2fc00 20 30 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   0;.  if( pOp->p
2fc10 33 20 29 7b 0a 20 20 20 20 6e 65 77 4d 61 78 20  3 ){.    newMax 
2fc20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  = sqlite3BtreeLa
2fc30 73 74 50 61 67 65 28 70 42 74 29 3b 0a 20 20 20  stPage(pBt);.   
2fc40 20 69 66 28 20 6e 65 77 4d 61 78 20 3c 20 28 75   if( newMax < (u
2fc50 6e 73 69 67 6e 65 64 29 70 4f 70 2d 3e 70 33 20  nsigned)pOp->p3 
2fc60 29 20 6e 65 77 4d 61 78 20 3d 20 28 75 6e 73 69  ) newMax = (unsi
2fc70 67 6e 65 64 29 70 4f 70 2d 3e 70 33 3b 0a 20 20  gned)pOp->p3;.  
2fc80 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  }.  pOut->u.i = 
2fc90 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
2fca0 61 67 65 43 6f 75 6e 74 28 70 42 74 2c 20 6e 65  ageCount(pBt, ne
2fcb0 77 4d 61 78 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  wMax);.  break;.
2fcc0 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
2fcd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
2fce0 52 41 43 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  RACE./* Opcode: 
2fcf0 54 72 61 63 65 20 2a 20 2a 20 2a 20 50 34 20 2a  Trace * * * P4 *
2fd00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 61 63 69 6e  .**.** If tracin
2fd10 67 20 69 73 20 65 6e 61 62 6c 65 64 20 28 62 79  g is enabled (by
2fd20 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 72 61   the sqlite3_tra
2fd30 63 65 28 29 29 20 69 6e 74 65 72 66 61 63 65 2c  ce()) interface,
2fd40 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 55 54 46   then.** the UTF
2fd50 2d 38 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69  -8 string contai
2fd60 6e 65 64 20 69 6e 20 50 34 20 69 73 20 65 6d 69  ned in P4 is emi
2fd70 74 74 65 64 20 6f 6e 20 74 68 65 20 74 72 61 63  tted on the trac
2fd80 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 63  e callback..*/.c
2fd90 61 73 65 20 4f 50 5f 54 72 61 63 65 3a 20 7b 0a  ase OP_Trace: {.
2fda0 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a    char *zTrace;.
2fdb0 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66    char *z;..  if
2fdc0 28 20 64 62 2d 3e 78 54 72 61 63 65 20 26 26 20  ( db->xTrace && 
2fdd0 28 7a 54 72 61 63 65 20 3d 20 28 70 4f 70 2d 3e  (zTrace = (pOp->
2fde0 70 34 2e 7a 20 3f 20 70 4f 70 2d 3e 70 34 2e 7a  p4.z ? pOp->p4.z
2fdf0 20 3a 20 70 2d 3e 7a 53 71 6c 29 29 21 3d 30 20   : p->zSql))!=0 
2fe00 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  ){.    z = sqlit
2fe10 65 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28  e3VdbeExpandSql(
2fe20 70 2c 20 7a 54 72 61 63 65 29 3b 0a 20 20 20 20  p, zTrace);.    
2fe30 64 62 2d 3e 78 54 72 61 63 65 28 64 62 2d 3e 70  db->xTrace(db->p
2fe40 54 72 61 63 65 41 72 67 2c 20 7a 29 3b 0a 20 20  TraceArg, z);.  
2fe50 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2fe60 64 62 2c 20 7a 29 3b 0a 20 20 7d 0a 23 69 66 64  db, z);.  }.#ifd
2fe70 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2fe80 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
2fe90 20 26 20 53 51 4c 49 54 45 5f 53 71 6c 54 72 61   & SQLITE_SqlTra
2fea0 63 65 29 21 3d 30 0a 20 20 20 26 26 20 28 7a 54  ce)!=0.   && (zT
2feb0 72 61 63 65 20 3d 20 28 70 4f 70 2d 3e 70 34 2e  race = (pOp->p4.
2fec0 7a 20 3f 20 70 4f 70 2d 3e 70 34 2e 7a 20 3a 20  z ? pOp->p4.z : 
2fed0 70 2d 3e 7a 53 71 6c 29 29 21 3d 30 0a 20 20 29  p->zSql))!=0.  )
2fee0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
2fef0 75 67 50 72 69 6e 74 66 28 22 53 51 4c 2d 74 72  ugPrintf("SQL-tr
2ff00 61 63 65 3a 20 25 73 5c 6e 22 2c 20 7a 54 72 61  ace: %s\n", zTra
2ff10 63 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  ce);.  }.#endif 
2ff20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
2ff30 2a 2f 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  */.  break;.}.#e
2ff40 6e 64 69 66 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ndif.../* Opcode
2ff50 3a 20 4e 6f 6f 70 20 2a 20 2a 20 2a 20 2a 20 2a  : Noop * * * * *
2ff60 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 68 69 6e  .**.** Do nothin
2ff70 67 2e 20 20 54 68 69 73 20 69 6e 73 74 72 75 63  g.  This instruc
2ff80 74 69 6f 6e 20 69 73 20 6f 66 74 65 6e 20 75 73  tion is often us
2ff90 65 66 75 6c 20 61 73 20 61 20 6a 75 6d 70 0a 2a  eful as a jump.*
2ffa0 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a  * destination..*
2ffb0 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 67 69  /./*.** The magi
2ffc0 63 20 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65  c Explain opcode
2ffd0 20 61 72 65 20 6f 6e 6c 79 20 69 6e 73 65 72 74   are only insert
2ffe0 65 64 20 77 68 65 6e 20 65 78 70 6c 61 69 6e 3d  ed when explain=
2fff0 3d 32 20 28 77 68 69 63 68 0a 2a 2a 20 69 73 20  =2 (which.** is 
30000 74 6f 20 73 61 79 20 77 68 65 6e 20 74 68 65 20  to say when the 
30010 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
30020 41 4e 20 73 79 6e 74 61 78 20 69 73 20 75 73 65  AN syntax is use
30030 64 2e 29 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  d.).** This opco
30040 64 65 20 72 65 63 6f 72 64 73 20 69 6e 66 6f 72  de records infor
30050 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
30060 6f 70 74 69 6d 69 7a 65 72 2e 20 20 49 74 20 69  optimizer.  It i
30070 73 20 74 68 65 0a 2a 2a 20 74 68 65 20 73 61 6d  s the.** the sam
30080 65 20 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54  e as a no-op.  T
30090 68 69 73 20 6f 70 63 6f 64 65 73 6e 65 76 65 72  his opcodesnever
300a0 20 61 70 70 65 61 72 73 20 69 6e 20 61 20 72 65   appears in a re
300b0 61 6c 20 56 4d 20 70 72 6f 67 72 61 6d 2e 0a 2a  al VM program..*
300c0 2f 0a 64 65 66 61 75 6c 74 3a 20 7b 20 20 20 20  /.default: {    
300d0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
300e0 20 72 65 61 6c 6c 79 20 4f 50 5f 4e 6f 6f 70 20   really OP_Noop 
300f0 61 6e 64 20 4f 50 5f 45 78 70 6c 61 69 6e 20 2a  and OP_Explain *
30100 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  /.  assert( pOp-
30110 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70  >opcode==OP_Noop
30120 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   || pOp->opcode=
30130 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20  =OP_Explain );. 
30140 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a   break;.}../****
30150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30190 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65  *********.** The
301a0 20 63 61 73 65 73 20 6f 66 20 74 68 65 20 73 77   cases of the sw
301b0 69 74 63 68 20 73 74 61 74 65 6d 65 6e 74 20 61  itch statement a
301c0 62 6f 76 65 20 74 68 69 73 20 6c 69 6e 65 20 73  bove this line s
301d0 68 6f 75 6c 64 20 61 6c 6c 20 62 65 20 69 6e 64  hould all be ind
301e0 65 6e 74 65 64 0a 2a 2a 20 62 79 20 36 20 73 70  ented.** by 6 sp
301f0 61 63 65 73 2e 20 20 42 75 74 20 74 68 65 20 6c  aces.  But the l
30200 65 66 74 2d 6d 6f 73 74 20 36 20 73 70 61 63 65  eft-most 6 space
30210 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6d 6f  s have been remo
30220 76 65 64 20 74 6f 20 69 6d 70 72 6f 76 65 20 74  ved to improve t
30230 68 65 0a 2a 2a 20 72 65 61 64 61 62 69 6c 69 74  he.** readabilit
30240 79 2e 20 20 46 72 6f 6d 20 74 68 69 73 20 70 6f  y.  From this po
30250 69 6e 74 20 6f 6e 20 64 6f 77 6e 2c 20 74 68 65  int on down, the
30260 20 6e 6f 72 6d 61 6c 20 69 6e 64 65 6e 74 61 74   normal indentat
30270 69 6f 6e 20 72 75 6c 65 73 20 61 72 65 0a 2a 2a  ion rules are.**
30280 20 72 65 73 74 6f 72 65 64 2e 0a 2a 2a 2a 2a 2a   restored..*****
30290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
302a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
302b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
302c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
302d0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 20 20 20 20 7d 0a  ********/.    }.
302e0 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
302f0 46 49 4c 45 0a 20 20 20 20 7b 0a 20 20 20 20 20  FILE.    {.     
30300 20 75 36 34 20 65 6c 61 70 73 65 64 20 3d 20 73   u64 elapsed = s
30310 71 6c 69 74 65 33 48 77 74 69 6d 65 28 29 20 2d  qlite3Hwtime() -
30320 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 70 4f   start;.      pO
30330 70 2d 3e 63 79 63 6c 65 73 20 2b 3d 20 65 6c 61  p->cycles += ela
30340 70 73 65 64 3b 0a 20 20 20 20 20 20 70 4f 70 2d  psed;.      pOp-
30350 3e 63 6e 74 2b 2b 3b 0a 23 69 66 20 30 0a 20 20  >cnt++;.#if 0.  
30360 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
30370 64 6f 75 74 2c 20 22 25 31 30 6c 6c 75 20 22 2c  dout, "%10llu ",
30380 20 65 6c 61 70 73 65 64 29 3b 0a 20 20 20 20 20   elapsed);.     
30390 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
303a0 69 6e 74 4f 70 28 73 74 64 6f 75 74 2c 20 6f 72  intOp(stdout, or
303b0 69 67 50 63 2c 20 26 61 4f 70 5b 6f 72 69 67 50  igPc, &aOp[origP
303c0 63 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  c]);.#endif.    
303d0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
303e0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
303f0 6f 64 65 20 61 64 64 73 20 6e 6f 74 68 69 6e 67  ode adds nothing
30400 20 74 6f 20 74 68 65 20 61 63 74 75 61 6c 20 66   to the actual f
30410 75 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20 20 20  unctionality.   
30420 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f 67 72   ** of the progr
30430 61 6d 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  am.  It is only 
30440 68 65 72 65 20 66 6f 72 20 74 65 73 74 69 6e 67  here for testing
30450 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 2e 0a   and debugging..
30460 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74      ** On the ot
30470 68 65 72 20 68 61 6e 64 2c 20 69 74 20 64 6f 65  her hand, it doe
30480 73 20 62 75 72 6e 20 43 50 55 20 63 79 63 6c 65  s burn CPU cycle
30490 73 20 65 76 65 72 79 20 74 69 6d 65 20 74 68 72  s every time thr
304a0 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 68 65 20  ough.    ** the 
304b0 65 76 61 6c 75 61 74 6f 72 20 6c 6f 6f 70 2e 20  evaluator loop. 
304c0 20 53 6f 20 77 65 20 63 61 6e 20 6c 65 61 76 65   So we can leave
304d0 20 69 74 20 6f 75 74 20 77 68 65 6e 20 4e 44 45   it out when NDE
304e0 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
304f0 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e      */.#ifndef N
30500 44 45 42 55 47 0a 20 20 20 20 61 73 73 65 72 74  DEBUG.    assert
30510 28 20 70 63 3e 3d 2d 31 20 26 26 20 70 63 3c 70  ( pc>=-1 && pc<p
30520 2d 3e 6e 4f 70 20 29 3b 0a 0a 23 69 66 64 65 66  ->nOp );..#ifdef
30530 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
30540 20 20 69 66 28 20 70 2d 3e 74 72 61 63 65 20 29    if( p->trace )
30550 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  {.      if( rc!=
30560 30 20 29 20 66 70 72 69 6e 74 66 28 70 2d 3e 74  0 ) fprintf(p->t
30570 72 61 63 65 2c 22 72 63 3d 25 64 5c 6e 22 2c 72  race,"rc=%d\n",r
30580 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  c);.      if( pO
30590 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 28 4f 50  p->opflags & (OP
305a0 46 4c 47 5f 4f 55 54 32 5f 50 52 45 52 45 4c 45  FLG_OUT2_PRERELE
305b0 41 53 45 7c 4f 50 46 4c 47 5f 4f 55 54 32 29 20  ASE|OPFLG_OUT2) 
305c0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 67 69 73  ){.        regis
305d0 74 65 72 54 72 61 63 65 28 70 2d 3e 74 72 61 63  terTrace(p->trac
305e0 65 2c 20 70 4f 70 2d 3e 70 32 2c 20 26 61 4d 65  e, pOp->p2, &aMe
305f0 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b 0a 20 20 20  m[pOp->p2]);.   
30600 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
30610 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50  Op->opflags & OP
30620 46 4c 47 5f 4f 55 54 33 20 29 7b 0a 20 20 20 20  FLG_OUT3 ){.    
30630 20 20 20 20 72 65 67 69 73 74 65 72 54 72 61 63      registerTrac
30640 65 28 70 2d 3e 74 72 61 63 65 2c 20 70 4f 70 2d  e(p->trace, pOp-
30650 3e 70 33 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  >p3, &aMem[pOp->
30660 70 33 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  p3]);.      }.  
30670 20 20 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53    }.#endif  /* S
30680 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 23  QLITE_DEBUG */.#
30690 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47  endif  /* NDEBUG
306a0 20 2a 2f 0a 20 20 7d 20 20 2f 2a 20 54 68 65 20   */.  }  /* The 
306b0 65 6e 64 20 6f 66 20 74 68 65 20 66 6f 72 28 3b  end of the for(;
306c0 3b 29 20 6c 6f 6f 70 20 74 68 65 20 6c 6f 6f 70  ;) loop the loop
306d0 73 20 74 68 72 6f 75 67 68 20 6f 70 63 6f 64 65  s through opcode
306e0 73 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 77 65  s */..  /* If we
306f0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
30700 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
30710 20 65 78 65 63 75 74 69 6f 6e 20 69 73 20 66 69   execution is fi
30720 6e 69 73 68 65 64 20 77 69 74 68 0a 20 20 2a 2a  nished with.  **
30730 20 61 6e 20 65 72 72 6f 72 20 6f 66 20 73 6f 6d   an error of som
30740 65 20 6b 69 6e 64 2e 0a 20 20 2a 2f 0a 76 64 62  e kind..  */.vdb
30750 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3a 0a 20 20  e_error_halt:.  
30760 61 73 73 65 72 74 28 20 72 63 20 29 3b 0a 20 20  assert( rc );.  
30770 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 74 65  p->rc = rc;.  te
30780 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
30790 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
307a0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
307b0 5f 6c 6f 67 28 72 63 2c 20 22 73 74 61 74 65 6d  _log(rc, "statem
307c0 65 6e 74 20 61 62 6f 72 74 73 20 61 74 20 25 64  ent aborts at %d
307d0 3a 20 5b 25 73 5d 20 25 73 22 2c 20 0a 20 20 20  : [%s] %s", .   
307e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
307f0 70 63 2c 20 70 2d 3e 7a 53 71 6c 2c 20 70 2d 3e  pc, p->zSql, p->
30800 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
30810 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a  te3VdbeHalt(p);.
30820 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30830 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 20 64  _IOERR_NOMEM ) d
30840 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
30850 3d 20 31 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49  = 1;.  rc = SQLI
30860 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  TE_ERROR;.  if( 
30870 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75  resetSchemaOnFau
30880 6c 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  lt>0 ){.    sqli
30890 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
308a0 53 63 68 65 6d 61 28 64 62 2c 20 72 65 73 65 74  Schema(db, reset
308b0 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 2d 31 29  SchemaOnFault-1)
308c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
308d0 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
308e0 20 6f 75 74 20 6f 66 20 74 68 69 73 20 70 72 6f   out of this pro
308f0 63 65 64 75 72 65 2e 20 20 57 65 20 68 61 76 65  cedure.  We have
30900 20 74 6f 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65   to.  ** release
30910 20 74 68 65 20 6d 75 74 65 78 65 73 20 6f 6e 20   the mutexes on 
30920 62 74 72 65 65 73 20 74 68 61 74 20 77 65 72 65  btrees that were
30930 20 61 63 71 75 69 72 65 64 20 61 74 20 74 68 65   acquired at the
30940 0a 20 20 2a 2a 20 74 6f 70 2e 20 2a 2f 0a 76 64  .  ** top. */.vd
30950 62 65 5f 72 65 74 75 72 6e 3a 0a 20 20 64 62 2d  be_return:.  db-
30960 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6c 61 73  >lastRowid = las
30970 74 52 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74 65  tRowid;.  sqlite
30980 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
30990 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
309a0 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
309b0 66 20 61 20 73 74 72 69 6e 67 20 6f 72 20 62 6c  f a string or bl
309c0 6f 62 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53  ob larger than S
309d0 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
309e0 0a 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74  .  ** is encount
309f0 65 72 65 64 2e 0a 20 20 2a 2f 0a 74 6f 6f 5f 62  ered..  */.too_b
30a00 69 67 3a 0a 20 20 73 71 6c 69 74 65 33 53 65 74  ig:.  sqlite3Set
30a10 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
30a20 73 67 2c 20 64 62 2c 20 22 73 74 72 69 6e 67 20  sg, db, "string 
30a30 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22  or blob too big"
30a40 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  );.  rc = SQLITE
30a50 5f 54 4f 4f 42 49 47 3b 0a 20 20 67 6f 74 6f 20  _TOOBIG;.  goto 
30a60 76 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b  vdbe_error_halt;
30a70 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68  ..  /* Jump to h
30a80 65 72 65 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ere if a malloc(
30a90 29 20 66 61 69 6c 73 2e 0a 20 20 2a 2f 0a 6e 6f  ) fails..  */.no
30aa0 5f 6d 65 6d 3a 0a 20 20 64 62 2d 3e 6d 61 6c 6c  _mem:.  db->mall
30ab0 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
30ac0 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
30ad0 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
30ae0 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
30af0 22 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54  ");.  rc = SQLIT
30b00 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 67 6f 74 6f 20  E_NOMEM;.  goto 
30b10 76 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b  vdbe_error_halt;
30b20 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68  ..  /* Jump to h
30b30 65 72 65 20 66 6f 72 20 61 6e 79 20 6f 74 68 65  ere for any othe
30b40 72 20 6b 69 6e 64 20 6f 66 20 66 61 74 61 6c 20  r kind of fatal 
30b50 65 72 72 6f 72 2e 20 20 54 68 65 20 22 72 63 22  error.  The "rc"
30b60 20 76 61 72 69 61 62 6c 65 0a 20 20 2a 2a 20 73   variable.  ** s
30b70 68 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  hould hold the e
30b80 72 72 6f 72 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  rror number..  *
30b90 2f 0a 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  /.abort_due_to_e
30ba0 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20  rror:.  assert( 
30bb0 70 2d 3e 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b  p->zErrMsg==0 );
30bc0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
30bd0 63 46 61 69 6c 65 64 20 29 20 72 63 20 3d 20 53  cFailed ) rc = S
30be0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69  QLITE_NOMEM;.  i
30bf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  f( rc!=SQLITE_IO
30c00 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
30c10 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
30c20 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  g(&p->zErrMsg, d
30c30 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  b, "%s", sqlite3
30c40 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 7d  ErrStr(rc));.  }
30c50 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 65 72 72  .  goto vdbe_err
30c60 6f 72 5f 68 61 6c 74 3b 0a 0a 20 20 2f 2a 20 4a  or_halt;..  /* J
30c70 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 74  ump to here if t
30c80 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  he sqlite3_inter
30c90 72 75 70 74 28 29 20 41 50 49 20 73 65 74 73 20  rupt() API sets 
30ca0 74 68 65 20 69 6e 74 65 72 72 75 70 74 0a 20 20  the interrupt.  
30cb0 2a 2a 20 66 6c 61 67 2e 0a 20 20 2a 2f 0a 61 62  ** flag..  */.ab
30cc0 6f 72 74 5f 64 75 65 5f 74 6f 5f 69 6e 74 65 72  ort_due_to_inter
30cd0 72 75 70 74 3a 0a 20 20 61 73 73 65 72 74 28 20  rupt:.  assert( 
30ce0 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
30cf0 70 74 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 53  pted );.  rc = S
30d00 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b  QLITE_INTERRUPT;
30d10 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  .  p->rc = rc;. 
30d20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
30d30 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  g(&p->zErrMsg, d
30d40 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  b, "%s", sqlite3
30d50 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 67  ErrStr(rc));.  g
30d60 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68  oto vdbe_error_h
30d70 61 6c 74 3b 0a 7d 0a                             alt;.}.