/ Hex Artifact Content
Login

Artifact f678101139d174e92eec1cb21201646ee3ee3383:


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 20 64 65 66 69 6e 65 20 69 73 53 6f 72 74  .# define isSort
1670: 65 72 28 78 29 20 28 28 78 29 2d 3e 70 53 6f 72  er(x) ((x)->pSor
1680: 74 65 72 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 41  ter!=0)../*.** A
1690: 72 67 75 6d 65 6e 74 20 70 4d 65 6d 20 70 6f 69  rgument pMem poi
16a0: 6e 74 73 20 61 74 20 61 20 72 65 67 69 73 74 65  nts at a registe
16b0: 72 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 70  r that will be p
16c0: 61 73 73 65 64 20 74 6f 20 61 0a 2a 2a 20 75 73  assed to a.** us
16d0: 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
16e0: 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 65 64 20  ion or returned 
16f0: 74 6f 20 74 68 65 20 75 73 65 72 20 61 73 20 74  to the user as t
1700: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 71  he result of a q
1710: 75 65 72 79 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  uery..** This ro
1720: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 70  utine sets the p
1730: 4d 65 6d 2d 3e 74 79 70 65 20 76 61 72 69 61 62  Mem->type variab
1740: 6c 65 20 75 73 65 64 20 62 79 20 74 68 65 20 73  le used by the s
1750: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 2a 28 29  qlite3_value_*()
1760: 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 2e 0a 2a   .** routines..*
1770: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
1780: 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28 4d  beMemStoreType(M
1790: 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e 74  em *pMem){.  int
17a0: 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66   flags = pMem->f
17b0: 6c 61 67 73 3b 0a 20 20 69 66 28 20 66 6c 61 67  lags;.  if( flag
17c0: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
17d0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
17e0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20   SQLITE_NULL;.  
17f0: 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 66 6c 61  }.  else if( fla
1800: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
1810: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
1820: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
1830: 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20  .  }.  else if( 
1840: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
1850: 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   ){.    pMem->ty
1860: 70 65 20 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  pe = SQLITE_FLOA
1870: 54 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  T;.  }.  else if
1880: 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ( flags & MEM_St
1890: 72 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  r ){.    pMem->t
18a0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
18b0: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
18c0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
18d0: 49 54 45 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 7d 0a  ITE_BLOB;.  }.}.
18e0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
18f0: 56 64 62 65 43 75 72 73 6f 72 20 6e 75 6d 62 65  VdbeCursor numbe
1900: 72 20 69 43 75 72 2e 20 20 52 65 74 75 72 6e 20  r iCur.  Return 
1910: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e  a pointer to it.
1920: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a    Return NULL.**
1930: 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
1940: 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  f memory..*/.sta
1950: 74 69 63 20 56 64 62 65 43 75 72 73 6f 72 20 2a  tic VdbeCursor *
1960: 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 0a  allocateCursor(.
1970: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
1980: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
1990: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a  irtual machine *
19a0: 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
19b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
19c0: 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 56 64  ex of the new Vd
19d0: 62 65 43 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e  beCursor */.  in
19e0: 74 20 6e 46 69 65 6c 64 2c 20 20 20 20 20 20 20  t nField,       
19f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a00: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 74   fields in the t
1a10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
1a20: 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20  .  int iDb,     
1a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1a40: 62 61 73 65 20 74 68 65 20 63 75 72 73 6f 72 20  base the cursor 
1a50: 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 6f 72 20 2d  belongs to, or -
1a60: 31 20 2a 2f 0a 20 20 69 6e 74 20 69 73 42 74 72  1 */.  int isBtr
1a70: 65 65 43 75 72 73 6f 72 20 20 20 20 20 2f 2a 20  eeCursor     /* 
1a80: 54 72 75 65 20 66 6f 72 20 42 2d 54 72 65 65 2e  True for B-Tree.
1a90: 20 20 46 61 6c 73 65 20 66 6f 72 20 70 73 65 75    False for pseu
1aa0: 64 6f 2d 74 61 62 6c 65 20 6f 72 20 76 74 61 62  do-table or vtab
1ab0: 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 46 69 6e 64   */.){.  /* Find
1ac0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
1ad0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
1ae0: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
1af0: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 0a 20  blob of memory. 
1b00: 20 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72   ** required for
1b10: 20 74 68 69 73 20 56 64 62 65 43 75 72 73 6f 72   this VdbeCursor
1b20: 20 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69   structure. It i
1b30: 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20  s convenient to 
1b40: 75 73 65 20 61 20 0a 20 20 2a 2a 20 76 64 62 65  use a .  ** vdbe
1b50: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   memory cell to 
1b60: 6d 61 6e 61 67 65 20 74 68 65 20 6d 65 6d 6f 72  manage the memor
1b70: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 65 71  y allocation req
1b80: 75 69 72 65 64 20 66 6f 72 20 61 0a 20 20 2a 2a  uired for a.  **
1b90: 20 56 64 62 65 43 75 72 73 6f 72 20 73 74 72 75   VdbeCursor stru
1ba0: 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 66 6f  cture for the fo
1bb0: 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a  llowing reasons:
1bc0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 53  .  **.  **   * S
1bd0: 6f 6d 65 74 69 6d 65 73 20 63 75 72 73 6f 72 20  ometimes cursor 
1be0: 6e 75 6d 62 65 72 73 20 61 72 65 20 75 73 65 64  numbers are used
1bf0: 20 66 6f 72 20 61 20 63 6f 75 70 6c 65 20 6f 66   for a couple of
1c00: 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20   different.  ** 
1c10: 20 20 20 20 70 75 72 70 6f 73 65 73 20 69 6e 20      purposes in 
1c20: 61 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20  a vdbe program. 
1c30: 54 68 65 20 64 69 66 66 65 72 65 6e 74 20 75 73  The different us
1c40: 65 73 20 6d 69 67 68 74 20 72 65 71 75 69 72 65  es might require
1c50: 0a 20 20 2a 2a 20 20 20 20 20 64 69 66 66 65 72  .  **     differ
1c60: 65 6e 74 20 73 69 7a 65 64 20 61 6c 6c 6f 63 61  ent sized alloca
1c70: 74 69 6f 6e 73 2e 20 4d 65 6d 6f 72 79 20 63 65  tions. Memory ce
1c80: 6c 6c 73 20 70 72 6f 76 69 64 65 20 67 72 6f 77  lls provide grow
1c90: 61 62 6c 65 0a 20 20 2a 2a 20 20 20 20 20 61 6c  able.  **     al
1ca0: 6c 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a  locations..  **.
1cb0: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 75 73    **   * When us
1cc0: 69 6e 67 20 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ing ENABLE_MEMOR
1cd0: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 2c 20 6d 65  Y_MANAGEMENT, me
1ce0: 6d 6f 72 79 20 63 65 6c 6c 20 62 75 66 66 65 72  mory cell buffer
1cf0: 73 20 63 61 6e 0a 20 20 2a 2a 20 20 20 20 20 62  s can.  **     b
1d00: 65 20 66 72 65 65 64 20 6c 61 7a 69 6c 79 20 76  e freed lazily v
1d10: 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 5f 72  ia the sqlite3_r
1d20: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20  elease_memory() 
1d30: 41 50 49 2e 20 54 68 69 73 0a 20 20 2a 2a 20 20  API. This.  **  
1d40: 20 20 20 6d 69 6e 69 6d 69 7a 65 73 20 74 68 65     minimizes the
1d50: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 6c 6c 6f   number of mallo
1d60: 63 20 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 20  c calls made by 
1d70: 74 68 65 20 73 79 73 74 65 6d 2e 0a 20 20 2a 2a  the system..  **
1d80: 0a 20 20 2a 2a 20 4d 65 6d 6f 72 79 20 63 65 6c  .  ** Memory cel
1d90: 6c 73 20 66 6f 72 20 63 75 72 73 6f 72 73 20 61  ls for cursors a
1da0: 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  re allocated at 
1db0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 61  the top of the a
1dc0: 64 64 72 65 73 73 0a 20 20 2a 2a 20 73 70 61 63  ddress.  ** spac
1dd0: 65 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28  e. Memory cell (
1de0: 70 2d 3e 6e 4d 65 6d 29 20 63 6f 72 72 65 73 70  p->nMem) corresp
1df0: 6f 6e 64 73 20 74 6f 20 63 75 72 73 6f 72 20 30  onds to cursor 0
1e00: 2e 20 53 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a  . Space for.  **
1e10: 20 63 75 72 73 6f 72 20 31 20 69 73 20 6d 61 6e   cursor 1 is man
1e20: 61 67 65 64 20 62 79 20 6d 65 6d 6f 72 79 20 63  aged by memory c
1e30: 65 6c 6c 20 28 70 2d 3e 6e 4d 65 6d 2d 31 29 2c  ell (p->nMem-1),
1e40: 20 65 74 63 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d   etc..  */.  Mem
1e50: 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65   *pMem = &p->aMe
1e60: 6d 5b 70 2d 3e 6e 4d 65 6d 2d 69 43 75 72 5d 3b  m[p->nMem-iCur];
1e70: 0a 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ..  int nByte;. 
1e80: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78   VdbeCursor *pCx
1e90: 20 3d 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20   = 0;.  nByte = 
1ea0: 0a 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69  .      ROUND8(si
1eb0: 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 29  zeof(VdbeCursor)
1ec0: 29 20 2b 20 0a 20 20 20 20 20 20 28 69 73 42 74  ) + .      (isBt
1ed0: 72 65 65 43 75 72 73 6f 72 3f 73 71 6c 69 74 65  reeCursor?sqlite
1ee0: 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
1ef0: 28 29 3a 30 29 20 2b 20 0a 20 20 20 20 20 20 32  ():0) + .      2
1f00: 2a 6e 46 69 65 6c 64 2a 73 69 7a 65 6f 66 28 75  *nField*sizeof(u
1f10: 33 32 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  32);..  assert( 
1f20: 69 43 75 72 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  iCur<p->nCursor 
1f30: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  );.  if( p->apCs
1f40: 72 5b 69 43 75 72 5d 20 29 7b 0a 20 20 20 20 73  r[iCur] ){.    s
1f50: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
1f60: 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43 73 72  rsor(p, p->apCsr
1f70: 5b 69 43 75 72 5d 29 3b 0a 20 20 20 20 70 2d 3e  [iCur]);.    p->
1f80: 61 70 43 73 72 5b 69 43 75 72 5d 20 3d 20 30 3b  apCsr[iCur] = 0;
1f90: 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
1fa0: 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62  E_OK==sqlite3Vdb
1fb0: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 6e  eMemGrow(pMem, n
1fc0: 42 79 74 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  Byte, 0) ){.    
1fd0: 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20 3d  p->apCsr[iCur] =
1fe0: 20 70 43 78 20 3d 20 28 56 64 62 65 43 75 72 73   pCx = (VdbeCurs
1ff0: 6f 72 2a 29 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20  or*)pMem->z;.   
2000: 20 6d 65 6d 73 65 74 28 70 43 78 2c 20 30 2c 20   memset(pCx, 0, 
2010: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
2020: 72 29 29 3b 0a 20 20 20 20 70 43 78 2d 3e 69 44  r));.    pCx->iD
2030: 62 20 3d 20 69 44 62 3b 0a 20 20 20 20 70 43 78  b = iDb;.    pCx
2040: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
2050: 64 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 65 6c  d;.    if( nFiel
2060: 64 20 29 7b 0a 20 20 20 20 20 20 70 43 78 2d 3e  d ){.      pCx->
2070: 61 54 79 70 65 20 3d 20 28 75 33 32 20 2a 29 26  aType = (u32 *)&
2080: 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38 28 73  pMem->z[ROUND8(s
2090: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
20a0: 29 29 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ))];.    }.    i
20b0: 66 28 20 69 73 42 74 72 65 65 43 75 72 73 6f 72  f( isBtreeCursor
20c0: 20 29 7b 0a 20 20 20 20 20 20 70 43 78 2d 3e 70   ){.      pCx->p
20d0: 43 75 72 73 6f 72 20 3d 20 28 42 74 43 75 72 73  Cursor = (BtCurs
20e0: 6f 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20 26  or*).          &
20f0: 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38 28 73  pMem->z[ROUND8(s
2100: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
2110: 29 29 2b 32 2a 6e 46 69 65 6c 64 2a 73 69 7a 65  ))+2*nField*size
2120: 6f 66 28 75 33 32 29 5d 3b 0a 20 20 20 20 20 20  of(u32)];.      
2130: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
2140: 6f 72 5a 65 72 6f 28 70 43 78 2d 3e 70 43 75 72  orZero(pCx->pCur
2150: 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  sor);.    }.  }.
2160: 20 20 72 65 74 75 72 6e 20 70 43 78 3b 0a 7d 0a    return pCx;.}.
2170: 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 63 6f  ./*.** Try to co
2180: 6e 76 65 72 74 20 61 20 76 61 6c 75 65 20 69 6e  nvert a value in
2190: 74 6f 20 61 20 6e 75 6d 65 72 69 63 20 72 65 70  to a numeric rep
21a0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 66 20 77  resentation if w
21b0: 65 20 63 61 6e 0a 2a 2a 20 64 6f 20 73 6f 20 77  e can.** do so w
21c0: 69 74 68 6f 75 74 20 6c 6f 73 73 20 6f 66 20 69  ithout loss of i
21d0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 6e 20  nformation.  In 
21e0: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
21f0: 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 6f  the string.** lo
2200: 6f 6b 73 20 6c 69 6b 65 20 61 20 6e 75 6d 62 65  oks like a numbe
2210: 72 2c 20 63 6f 6e 76 65 72 74 20 69 74 20 69 6e  r, convert it in
2220: 74 6f 20 61 20 6e 75 6d 62 65 72 2e 20 20 49 66  to a number.  If
2230: 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20   it does not.** 
2240: 6c 6f 6f 6b 20 6c 69 6b 65 20 61 20 6e 75 6d 62  look like a numb
2250: 65 72 2c 20 6c 65 61 76 65 20 69 74 20 61 6c 6f  er, leave it alo
2260: 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ne..*/.static vo
2270: 69 64 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41  id applyNumericA
2280: 66 66 69 6e 69 74 79 28 4d 65 6d 20 2a 70 52 65  ffinity(Mem *pRe
2290: 63 29 7b 0a 20 20 69 66 28 20 28 70 52 65 63 2d  c){.  if( (pRec-
22a0: 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65  >flags & (MEM_Re
22b0: 61 6c 7c 4d 45 4d 5f 49 6e 74 29 29 3d 3d 30 20  al|MEM_Int))==0 
22c0: 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 56  ){.    double rV
22d0: 61 6c 75 65 3b 0a 20 20 20 20 69 36 34 20 69 56  alue;.    i64 iV
22e0: 61 6c 75 65 3b 0a 20 20 20 20 75 38 20 65 6e 63  alue;.    u8 enc
22f0: 20 3d 20 70 52 65 63 2d 3e 65 6e 63 3b 0a 20 20   = pRec->enc;.  
2300: 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66 6c 61    if( (pRec->fla
2310: 67 73 26 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29  gs&MEM_Str)==0 )
2320: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28   return;.    if(
2330: 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 52 65   sqlite3AtoF(pRe
2340: 63 2d 3e 7a 2c 20 26 72 56 61 6c 75 65 2c 20 70  c->z, &rValue, p
2350: 52 65 63 2d 3e 6e 2c 20 65 6e 63 29 3d 3d 30 20  Rec->n, enc)==0 
2360: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
2370: 28 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69  ( 0==sqlite3Atoi
2380: 36 34 28 70 52 65 63 2d 3e 7a 2c 20 26 69 56 61  64(pRec->z, &iVa
2390: 6c 75 65 2c 20 70 52 65 63 2d 3e 6e 2c 20 65 6e  lue, pRec->n, en
23a0: 63 29 20 29 7b 0a 20 20 20 20 20 20 70 52 65 63  c) ){.      pRec
23b0: 2d 3e 75 2e 69 20 3d 20 69 56 61 6c 75 65 3b 0a  ->u.i = iValue;.
23c0: 20 20 20 20 20 20 70 52 65 63 2d 3e 66 6c 61 67        pRec->flag
23d0: 73 20 7c 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  s |= MEM_Int;.  
23e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
23f0: 52 65 63 2d 3e 72 20 3d 20 72 56 61 6c 75 65 3b  Rec->r = rValue;
2400: 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 66 6c 61  .      pRec->fla
2410: 67 73 20 7c 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a  gs |= MEM_Real;.
2420: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
2430: 2a 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 69 73  ** Processing is
2440: 20 64 65 74 65 72 6d 69 6e 65 20 62 79 20 74 68   determine by th
2450: 65 20 61 66 66 69 6e 69 74 79 20 70 61 72 61 6d  e affinity param
2460: 65 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  eter:.**.** SQLI
2470: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3a 0a  TE_AFF_INTEGER:.
2480: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  ** SQLITE_AFF_RE
2490: 41 4c 3a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  AL:.** SQLITE_AF
24a0: 46 5f 4e 55 4d 45 52 49 43 3a 0a 2a 2a 20 20 20  F_NUMERIC:.**   
24b0: 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20   Try to convert 
24c0: 70 52 65 63 20 74 6f 20 61 6e 20 69 6e 74 65 67  pRec to an integ
24d0: 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  er representatio
24e0: 6e 20 6f 72 20 61 20 0a 2a 2a 20 20 20 20 66 6c  n or a .**    fl
24f0: 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 72 65 70  oating-point rep
2500: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 66 20 61  resentation if a
2510: 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73  n integer repres
2520: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 69  entation.**    i
2530: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
2540: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 69   Note that the i
2550: 6e 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74  nteger represent
2560: 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 20 20 20 61  ation is.**    a
2570: 6c 77 61 79 73 20 70 72 65 66 65 72 72 65 64 2c  lways preferred,
2580: 20 65 76 65 6e 20 69 66 20 74 68 65 20 61 66 66   even if the aff
2590: 69 6e 69 74 79 20 69 73 20 52 45 41 4c 2c 20 62  inity is REAL, b
25a0: 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 61 6e 20  ecause.**    an 
25b0: 69 6e 74 65 67 65 72 20 72 65 70 72 65 73 65 6e  integer represen
25c0: 74 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 73  tation is more s
25d0: 70 61 63 65 20 65 66 66 69 63 69 65 6e 74 20 6f  pace efficient o
25e0: 6e 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 53 51  n disk..**.** SQ
25f0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 2a  LITE_AFF_TEXT:.*
2600: 2a 20 20 20 20 43 6f 6e 76 65 72 74 20 70 52 65  *    Convert pRe
2610: 63 20 74 6f 20 61 20 74 65 78 74 20 72 65 70 72  c to a text repr
2620: 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  esentation..**.*
2630: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
2640: 45 3a 0a 2a 2a 20 20 20 20 4e 6f 2d 6f 70 2e 20  E:.**    No-op. 
2650: 20 70 52 65 63 20 69 73 20 75 6e 63 68 61 6e 67   pRec is unchang
2660: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
2670: 69 64 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79  id applyAffinity
2680: 28 0a 20 20 4d 65 6d 20 2a 70 52 65 63 2c 20 20  (.  Mem *pRec,  
2690: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
26a0: 61 6c 75 65 20 74 6f 20 61 70 70 6c 79 20 61 66  alue to apply af
26b0: 66 69 6e 69 74 79 20 74 6f 20 2a 2f 0a 20 20 63  finity to */.  c
26c0: 68 61 72 20 61 66 66 69 6e 69 74 79 2c 20 20 20  har affinity,   
26d0: 20 20 20 2f 2a 20 54 68 65 20 61 66 66 69 6e 69     /* The affini
26e0: 74 79 20 74 6f 20 62 65 20 61 70 70 6c 69 65 64  ty to be applied
26f0: 20 2a 2f 0a 20 20 75 38 20 65 6e 63 20 20 20 20   */.  u8 enc    
2700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2710: 20 74 68 69 73 20 74 65 78 74 20 65 6e 63 6f 64   this text encod
2720: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ing */.){.  if( 
2730: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
2740: 5f 41 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20  _AFF_TEXT ){.   
2750: 20 2f 2a 20 4f 6e 6c 79 20 61 74 74 65 6d 70 74   /* Only attempt
2760: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
2770: 74 6f 20 54 45 58 54 20 69 66 20 74 68 65 72 65  to TEXT if there
2780: 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6f   is an integer o
2790: 72 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 72 65  r real.    ** re
27a0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 28 62 6c  presentation (bl
27b0: 6f 62 20 61 6e 64 20 4e 55 4c 4c 20 64 6f 20 6e  ob and NULL do n
27c0: 6f 74 20 67 65 74 20 63 6f 6e 76 65 72 74 65 64  ot get converted
27d0: 29 20 62 75 74 20 6e 6f 20 73 74 72 69 6e 67 0a  ) but no string.
27e0: 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74      ** represent
27f0: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
2800: 20 20 69 66 28 20 30 3d 3d 28 70 52 65 63 2d 3e    if( 0==(pRec->
2810: 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 20 26  flags&MEM_Str) &
2820: 26 20 28 70 52 65 63 2d 3e 66 6c 61 67 73 26 28  & (pRec->flags&(
2830: 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74  MEM_Real|MEM_Int
2840: 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  )) ){.      sqli
2850: 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67  te3VdbeMemString
2860: 69 66 79 28 70 52 65 63 2c 20 65 6e 63 29 3b 0a  ify(pRec, enc);.
2870: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 63 2d 3e      }.    pRec->
2880: 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 52  flags &= ~(MEM_R
2890: 65 61 6c 7c 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20  eal|MEM_Int);.  
28a0: 7d 65 6c 73 65 20 69 66 28 20 61 66 66 69 6e 69  }else if( affini
28b0: 74 79 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ty!=SQLITE_AFF_N
28c0: 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ONE ){.    asser
28d0: 74 28 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  t( affinity==SQL
28e0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
28f0: 7c 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  || affinity==SQL
2900: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20  ITE_AFF_REAL.   
2910: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 61 66 66            || aff
2920: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
2930: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
2940: 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66   applyNumericAff
2950: 69 6e 69 74 79 28 70 52 65 63 29 3b 0a 20 20 20  inity(pRec);.   
2960: 20 69 66 28 20 70 52 65 63 2d 3e 66 6c 61 67 73   if( pRec->flags
2970: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
2980: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2990: 49 6e 74 65 67 65 72 41 66 66 69 6e 69 74 79 28  IntegerAffinity(
29a0: 70 52 65 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pRec);.    }.  }
29b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
29c0: 20 63 6f 6e 76 65 72 74 20 74 68 65 20 74 79 70   convert the typ
29d0: 65 20 6f 66 20 61 20 66 75 6e 63 74 69 6f 6e 20  e of a function 
29e0: 61 72 67 75 6d 65 6e 74 20 6f 72 20 61 20 72 65  argument or a re
29f0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69  sult column.** i
2a00: 6e 74 6f 20 61 20 6e 75 6d 65 72 69 63 20 72 65  nto a numeric re
2a10: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 55  presentation.  U
2a20: 73 65 20 65 69 74 68 65 72 20 49 4e 54 45 47 45  se either INTEGE
2a30: 52 20 6f 72 20 52 45 41 4c 20 77 68 69 63 68 65  R or REAL whiche
2a40: 76 65 72 0a 2a 2a 20 69 73 20 61 70 70 72 6f 70  ver.** is approp
2a50: 72 69 61 74 65 2e 20 20 42 75 74 20 6f 6e 6c 79  riate.  But only
2a60: 20 64 6f 20 74 68 65 20 63 6f 6e 76 65 72 73 69   do the conversi
2a70: 6f 6e 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  on if it is poss
2a80: 69 62 6c 65 20 77 69 74 68 6f 75 74 0a 2a 2a 20  ible without.** 
2a90: 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72 6d 61 74  loss of informat
2aa0: 69 6f 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ion and return t
2ab0: 68 65 20 72 65 76 69 73 65 64 20 74 79 70 65 20  he revised type 
2ac0: 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  of the argument.
2ad0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
2ae0: 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79  value_numeric_ty
2af0: 70 65 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  pe(sqlite3_value
2b00: 20 2a 70 56 61 6c 29 7b 0a 20 20 4d 65 6d 20 2a   *pVal){.  Mem *
2b10: 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 70 56 61  pMem = (Mem*)pVa
2b20: 6c 3b 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 74  l;.  if( pMem->t
2b30: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype==SQLITE_TEXT
2b40: 20 29 7b 0a 20 20 20 20 61 70 70 6c 79 4e 75 6d   ){.    applyNum
2b50: 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 4d 65  ericAffinity(pMe
2b60: 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  m);.    sqlite3V
2b70: 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28  dbeMemStoreType(
2b80: 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pMem);.  }.  ret
2b90: 75 72 6e 20 70 4d 65 6d 2d 3e 74 79 70 65 3b 0a  urn pMem->type;.
2ba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6f 72 74 65  }../*.** Exporte
2bb0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 61 70 70  d version of app
2bc0: 6c 79 41 66 66 69 6e 69 74 79 28 29 2e 20 54 68  lyAffinity(). Th
2bd0: 69 73 20 6f 6e 65 20 77 6f 72 6b 73 20 6f 6e 20  is one works on 
2be0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20  sqlite3_value*, 
2bf0: 0a 2a 2a 20 6e 6f 74 20 74 68 65 20 69 6e 74 65  .** not the inte
2c00: 72 6e 61 6c 20 4d 65 6d 2a 20 74 79 70 65 2e 0a  rnal Mem* type..
2c10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2c20: 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74  alueApplyAffinit
2c30: 79 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  y(.  sqlite3_val
2c40: 75 65 20 2a 70 56 61 6c 2c 20 0a 20 20 75 38 20  ue *pVal, .  u8 
2c50: 61 66 66 69 6e 69 74 79 2c 20 0a 20 20 75 38 20  affinity, .  u8 
2c60: 65 6e 63 0a 29 7b 0a 20 20 61 70 70 6c 79 41 66  enc.){.  applyAf
2c70: 66 69 6e 69 74 79 28 28 4d 65 6d 20 2a 29 70 56  finity((Mem *)pV
2c80: 61 6c 2c 20 61 66 66 69 6e 69 74 79 2c 20 65 6e  al, affinity, en
2c90: 63 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  c);.}..#ifdef SQ
2ca0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
2cb0: 20 57 72 69 74 65 20 61 20 6e 69 63 65 20 73 74   Write a nice st
2cc0: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
2cd0: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  ion of the conte
2ce0: 6e 74 73 20 6f 66 20 63 65 6c 6c 20 70 4d 65 6d  nts of cell pMem
2cf0: 0a 2a 2a 20 69 6e 74 6f 20 62 75 66 66 65 72 20  .** into buffer 
2d00: 7a 42 75 66 2c 20 6c 65 6e 67 74 68 20 6e 42 75  zBuf, length nBu
2d10: 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  f..*/.void sqlit
2d20: 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79 50  e3VdbeMemPrettyP
2d30: 72 69 6e 74 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  rint(Mem *pMem, 
2d40: 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 63  char *zBuf){.  c
2d50: 68 61 72 20 2a 7a 43 73 72 20 3d 20 7a 42 75 66  har *zCsr = zBuf
2d60: 3b 0a 20 20 69 6e 74 20 66 20 3d 20 70 4d 65 6d  ;.  int f = pMem
2d70: 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20 73 74 61 74  ->flags;..  stat
2d80: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
2d90: 6f 6e 73 74 20 65 6e 63 6e 61 6d 65 73 5b 5d 20  onst encnames[] 
2da0: 3d 20 7b 22 28 58 29 22 2c 20 22 28 38 29 22 2c  = {"(X)", "(8)",
2db0: 20 22 28 31 36 4c 45 29 22 2c 20 22 28 31 36 42   "(16LE)", "(16B
2dc0: 45 29 22 7d 3b 0a 0a 20 20 69 66 28 20 66 26 4d  E)"};..  if( f&M
2dd0: 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 69  EM_Blob ){.    i
2de0: 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 63  nt i;.    char c
2df0: 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d 45  ;.    if( f & ME
2e00: 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 63  M_Dyn ){.      c
2e10: 20 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20 61 73   = 'z';.      as
2e20: 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f  sert( (f & (MEM_
2e30: 53 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68 65 6d  Static|MEM_Ephem
2e40: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c  ))==0 );.    }el
2e50: 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 53  se if( f & MEM_S
2e60: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 63  tatic ){.      c
2e70: 20 3d 20 27 74 27 3b 0a 20 20 20 20 20 20 61 73   = 't';.      as
2e80: 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f  sert( (f & (MEM_
2e90: 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d  Dyn|MEM_Ephem))=
2ea0: 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  =0 );.    }else 
2eb0: 69 66 28 20 66 20 26 20 4d 45 4d 5f 45 70 68 65  if( f & MEM_Ephe
2ec0: 6d 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 27  m ){.      c = '
2ed0: 65 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e';.      assert
2ee0: 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74  ( (f & (MEM_Stat
2ef0: 69 63 7c 4d 45 4d 5f 44 79 6e 29 29 3d 3d 30 20  ic|MEM_Dyn))==0 
2f00: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2f10: 20 20 20 20 63 20 3d 20 27 73 27 3b 0a 20 20 20      c = 's';.   
2f20: 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
2f30: 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43  snprintf(100, zC
2f40: 73 72 2c 20 22 25 63 22 2c 20 63 29 3b 0a 20 20  sr, "%c", c);.  
2f50: 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65    zCsr += sqlite
2f60: 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b  3Strlen30(zCsr);
2f70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2f80: 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72 2c  rintf(100, zCsr,
2f90: 20 22 25 64 5b 22 2c 20 70 4d 65 6d 2d 3e 6e 29   "%d[", pMem->n)
2fa0: 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71  ;.    zCsr += sq
2fb0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
2fc0: 73 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  sr);.    for(i=0
2fd0: 3b 20 69 3c 31 36 20 26 26 20 69 3c 70 4d 65 6d  ; i<16 && i<pMem
2fe0: 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ->n; i++){.     
2ff0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
3000: 66 28 31 30 30 2c 20 7a 43 73 72 2c 20 22 25 30  f(100, zCsr, "%0
3010: 32 58 22 2c 20 28 28 69 6e 74 29 70 4d 65 6d 2d  2X", ((int)pMem-
3020: 3e 7a 5b 69 5d 20 26 20 30 78 46 46 29 29 3b 0a  >z[i] & 0xFF));.
3030: 20 20 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71        zCsr += sq
3040: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
3050: 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  sr);.    }.    f
3060: 6f 72 28 69 3d 30 3b 20 69 3c 31 36 20 26 26 20  or(i=0; i<16 && 
3070: 69 3c 70 4d 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b  i<pMem->n; i++){
3080: 0a 20 20 20 20 20 20 63 68 61 72 20 7a 20 3d 20  .      char z = 
3090: 70 4d 65 6d 2d 3e 7a 5b 69 5d 3b 0a 20 20 20 20  pMem->z[i];.    
30a0: 20 20 69 66 28 20 7a 3c 33 32 20 7c 7c 20 7a 3e    if( z<32 || z>
30b0: 31 32 36 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20  126 ) *zCsr++ = 
30c0: 27 2e 27 3b 0a 20 20 20 20 20 20 65 6c 73 65 20  '.';.      else 
30d0: 2a 7a 43 73 72 2b 2b 20 3d 20 7a 3b 0a 20 20 20  *zCsr++ = z;.   
30e0: 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
30f0: 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43  snprintf(100, zC
3100: 73 72 2c 20 22 5d 25 73 22 2c 20 65 6e 63 6e 61  sr, "]%s", encna
3110: 6d 65 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d 29 3b  mes[pMem->enc]);
3120: 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c  .    zCsr += sql
3130: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73  ite3Strlen30(zCs
3140: 72 29 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20  r);.    if( f & 
3150: 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
3160: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
3170: 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 22 2b 25  tf(100, zCsr,"+%
3180: 64 7a 22 2c 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  dz",pMem->u.nZer
3190: 6f 29 3b 0a 20 20 20 20 20 20 7a 43 73 72 20 2b  o);.      zCsr +
31a0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
31b0: 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20  0(zCsr);.    }. 
31c0: 20 20 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b     *zCsr = '\0';
31d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26  .  }else if( f &
31e0: 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
31f0: 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20 20 20 7a 42  int j, k;.    zB
3200: 75 66 5b 30 5d 20 3d 20 27 20 27 3b 0a 20 20 20  uf[0] = ' ';.   
3210: 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 44 79 6e   if( f & MEM_Dyn
3220: 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31   ){.      zBuf[1
3230: 5d 20 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20 61  ] = 'z';.      a
3240: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
3250: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68 65  _Static|MEM_Ephe
3260: 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65  m))==0 );.    }e
3270: 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f  lse if( f & MEM_
3280: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
3290: 7a 42 75 66 5b 31 5d 20 3d 20 27 74 27 3b 0a 20  zBuf[1] = 't';. 
32a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 66 20       assert( (f 
32b0: 26 20 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45  & (MEM_Dyn|MEM_E
32c0: 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20  phem))==0 );.   
32d0: 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d   }else if( f & M
32e0: 45 4d 5f 45 70 68 65 6d 20 29 7b 0a 20 20 20 20  EM_Ephem ){.    
32f0: 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 65 27 3b    zBuf[1] = 'e';
3300: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
3310: 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c  f & (MEM_Static|
3320: 4d 45 4d 5f 44 79 6e 29 29 3d 3d 30 20 29 3b 0a  MEM_Dyn))==0 );.
3330: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3340: 20 7a 42 75 66 5b 31 5d 20 3d 20 27 73 27 3b 0a   zBuf[1] = 's';.
3350: 20 20 20 20 7d 0a 20 20 20 20 6b 20 3d 20 32 3b      }.    k = 2;
3360: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
3370: 72 69 6e 74 66 28 31 30 30 2c 20 26 7a 42 75 66  rintf(100, &zBuf
3380: 5b 6b 5d 2c 20 22 25 64 22 2c 20 70 4d 65 6d 2d  [k], "%d", pMem-
3390: 3e 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  >n);.    k += sq
33a0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
33b0: 42 75 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a 42 75  Buf[k]);.    zBu
33c0: 66 5b 6b 2b 2b 5d 20 3d 20 27 5b 27 3b 0a 20 20  f[k++] = '[';.  
33d0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31 35 20    for(j=0; j<15 
33e0: 26 26 20 6a 3c 70 4d 65 6d 2d 3e 6e 3b 20 6a 2b  && j<pMem->n; j+
33f0: 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 63 20 3d  +){.      u8 c =
3400: 20 70 4d 65 6d 2d 3e 7a 5b 6a 5d 3b 0a 20 20 20   pMem->z[j];.   
3410: 20 20 20 69 66 28 20 63 3e 3d 30 78 32 30 20 26     if( c>=0x20 &
3420: 26 20 63 3c 30 78 37 66 20 29 7b 0a 20 20 20 20  & c<0x7f ){.    
3430: 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20      zBuf[k++] = 
3440: 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  c;.      }else{.
3450: 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6b 2b 2b          zBuf[k++
3460: 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20 7d  ] = '.';.      }
3470: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b  .    }.    zBuf[
3480: 6b 2b 2b 5d 20 3d 20 27 5d 27 3b 0a 20 20 20 20  k++] = ']';.    
3490: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
34a0: 28 31 30 30 2c 26 7a 42 75 66 5b 6b 5d 2c 20 65  (100,&zBuf[k], e
34b0: 6e 63 6e 61 6d 65 73 5b 70 4d 65 6d 2d 3e 65 6e  ncnames[pMem->en
34c0: 63 5d 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  c]);.    k += sq
34d0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
34e0: 42 75 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a 42 75  Buf[k]);.    zBu
34f0: 66 5b 6b 2b 2b 5d 20 3d 20 30 3b 0a 20 20 7d 0a  f[k++] = 0;.  }.
3500: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
3510: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
3520: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 76 61  .** Print the va
3530: 6c 75 65 20 6f 66 20 61 20 72 65 67 69 73 74 65  lue of a registe
3540: 72 20 66 6f 72 20 74 72 61 63 69 6e 67 20 70 75  r for tracing pu
3550: 72 70 6f 73 65 73 3a 0a 2a 2f 0a 73 74 61 74 69  rposes:.*/.stati
3560: 63 20 76 6f 69 64 20 6d 65 6d 54 72 61 63 65 50  c void memTraceP
3570: 72 69 6e 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20  rint(FILE *out, 
3580: 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  Mem *p){.  if( p
3590: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
35a0: 76 61 6c 69 64 20 29 7b 0a 20 20 20 20 66 70 72  valid ){.    fpr
35b0: 69 6e 74 66 28 6f 75 74 2c 20 22 20 75 6e 64 65  intf(out, " unde
35c0: 66 69 6e 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65  fined");.  }else
35d0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
35e0: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
35f0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 4e  fprintf(out, " N
3600: 55 4c 4c 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ULL");.  }else i
3610: 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 28  f( (p->flags & (
3620: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 53 74 72 29  MEM_Int|MEM_Str)
3630: 29 3d 3d 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f  )==(MEM_Int|MEM_
3640: 53 74 72 29 20 29 7b 0a 20 20 20 20 66 70 72 69  Str) ){.    fpri
3650: 6e 74 66 28 6f 75 74 2c 20 22 20 73 69 3a 25 6c  ntf(out, " si:%l
3660: 6c 64 22 2c 20 70 2d 3e 75 2e 69 29 3b 0a 20 20  ld", p->u.i);.  
3670: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61  }else if( p->fla
3680: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
3690: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
36a0: 20 22 20 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75   " i:%lld", p->u
36b0: 2e 69 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  .i);.#ifndef SQL
36c0: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
36d0: 47 5f 50 4f 49 4e 54 0a 20 20 7d 65 6c 73 65 20  G_POINT.  }else 
36e0: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  if( p->flags & M
36f0: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 66  EM_Real ){.    f
3700: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 72 3a  printf(out, " r:
3710: 25 67 22 2c 20 70 2d 3e 72 29 3b 0a 23 65 6e 64  %g", p->r);.#end
3720: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  if.  }else if( p
3730: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
3740: 77 53 65 74 20 29 7b 0a 20 20 20 20 66 70 72 69  wSet ){.    fpri
3750: 6e 74 66 28 6f 75 74 2c 20 22 20 28 72 6f 77 73  ntf(out, " (rows
3760: 65 74 29 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  et)");.  }else{.
3770: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30      char zBuf[20
3780: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0];.    sqlite3V
3790: 64 62 65 4d 65 6d 50 72 65 74 74 79 50 72 69 6e  dbeMemPrettyPrin
37a0: 74 28 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20  t(p, zBuf);.    
37b0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 22  fprintf(out, " "
37c0: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
37d0: 75 74 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b  ut, "%s", zBuf);
37e0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
37f0: 69 64 20 72 65 67 69 73 74 65 72 54 72 61 63 65  id registerTrace
3800: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e 74 20  (FILE *out, int 
3810: 69 52 65 67 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20  iReg, Mem *p){. 
3820: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 52   fprintf(out, "R
3830: 45 47 5b 25 64 5d 20 3d 20 22 2c 20 69 52 65 67  EG[%d] = ", iReg
3840: 29 3b 0a 20 20 6d 65 6d 54 72 61 63 65 50 72 69  );.  memTracePri
3850: 6e 74 28 6f 75 74 2c 20 70 29 3b 0a 20 20 66 70  nt(out, p);.  fp
3860: 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
3870: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
3880: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
3890: 23 20 20 64 65 66 69 6e 65 20 52 45 47 49 53 54  #  define REGIST
38a0: 45 52 5f 54 52 41 43 45 28 52 2c 4d 29 20 69 66  ER_TRACE(R,M) if
38b0: 28 70 2d 3e 74 72 61 63 65 29 72 65 67 69 73 74  (p->trace)regist
38c0: 65 72 54 72 61 63 65 28 70 2d 3e 74 72 61 63 65  erTrace(p->trace
38d0: 2c 52 2c 4d 29 0a 23 65 6c 73 65 0a 23 20 20 64  ,R,M).#else.#  d
38e0: 65 66 69 6e 65 20 52 45 47 49 53 54 45 52 5f 54  efine REGISTER_T
38f0: 52 41 43 45 28 52 2c 4d 29 0a 23 65 6e 64 69 66  RACE(R,M).#endif
3900: 0a 0a 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  ...#ifdef VDBE_P
3910: 52 4f 46 49 4c 45 0a 0a 2f 2a 20 0a 2a 2a 20 68  ROFILE../* .** h
3920: 77 74 69 6d 65 2e 68 20 63 6f 6e 74 61 69 6e 73  wtime.h contains
3930: 20 69 6e 6c 69 6e 65 20 61 73 73 65 6d 62 6c 65   inline assemble
3940: 72 20 63 6f 64 65 20 66 6f 72 20 69 6d 70 6c 65  r code for imple
3950: 6d 65 6e 74 69 6e 67 20 0a 2a 2a 20 68 69 67 68  menting .** high
3960: 2d 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 69 6d  -performance tim
3970: 69 6e 67 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f  ing routines..*/
3980: 0a 23 69 6e 63 6c 75 64 65 20 22 68 77 74 69 6d  .#include "hwtim
3990: 65 2e 68 22 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a  e.h"..#endif../*
39a0: 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 46 4f  .** The CHECK_FO
39b0: 52 5f 49 4e 54 45 52 52 55 50 54 20 6d 61 63 72  R_INTERRUPT macr
39c0: 6f 20 64 65 66 69 6e 65 64 20 68 65 72 65 20 6c  o defined here l
39d0: 6f 6f 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ooks to see if t
39e0: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e  he.** sqlite3_in
39f0: 74 65 72 72 75 70 74 28 29 20 72 6f 75 74 69 6e  terrupt() routin
3a00: 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  e has been calle
3a10: 64 2e 20 20 49 66 20 69 74 20 68 61 73 20 62 65  d.  If it has be
3a20: 65 6e 2c 20 74 68 65 6e 0a 2a 2a 20 70 72 6f 63  en, then.** proc
3a30: 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 56 44  essing of the VD
3a40: 42 45 20 70 72 6f 67 72 61 6d 20 69 73 20 69 6e  BE program is in
3a50: 74 65 72 72 75 70 74 65 64 2e 0a 2a 2a 0a 2a 2a  terrupted..**.**
3a60: 20 54 68 69 73 20 6d 61 63 72 6f 20 61 64 64 65   This macro adde
3a70: 64 20 74 6f 20 65 76 65 72 79 20 69 6e 73 74 72  d to every instr
3a80: 75 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73  uction that does
3a90: 20 61 20 6a 75 6d 70 20 69 6e 20 6f 72 64 65 72   a jump in order
3aa0: 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
3ab0: 20 61 20 6c 6f 6f 70 2e 20 20 54 68 69 73 20 74   a loop.  This t
3ac0: 65 73 74 20 75 73 65 64 20 74 6f 20 62 65 20 6f  est used to be o
3ad0: 6e 20 65 76 65 72 79 20 73 69 6e 67 6c 65 20 69  n every single i
3ae0: 6e 73 74 72 75 63 74 69 6f 6e 2c 0a 2a 2a 20 62  nstruction,.** b
3af0: 75 74 20 74 68 61 74 20 6d 65 61 6e 74 20 77 65  ut that meant we
3b00: 20 6d 6f 72 65 20 74 65 73 74 69 6e 67 20 74 68   more testing th
3b10: 61 6e 20 77 65 20 6e 65 65 64 65 64 2e 20 20 42  an we needed.  B
3b20: 79 20 6f 6e 6c 79 20 74 65 73 74 69 6e 67 20 74  y only testing t
3b30: 68 65 0a 2a 2a 20 66 6c 61 67 20 6f 6e 20 6a 75  he.** flag on ju
3b40: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2c  mp instructions,
3b50: 20 77 65 20 67 65 74 20 61 20 28 73 6d 61 6c 6c   we get a (small
3b60: 29 20 73 70 65 65 64 20 69 6d 70 72 6f 76 65 6d  ) speed improvem
3b70: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
3b80: 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52 52  CHECK_FOR_INTERR
3b90: 55 50 54 20 5c 0a 20 20 20 69 66 28 20 64 62 2d  UPT \.   if( db-
3ba0: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
3bb0: 64 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  d ) goto abort_d
3bc0: 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70 74 3b  ue_to_interrupt;
3bd0: 0a 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ...#ifndef NDEBU
3be0: 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  G./*.** This fun
3bf0: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
3c00: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
3c10: 20 61 6e 20 61 73 73 65 72 74 28 29 20 65 78 70   an assert() exp
3c20: 72 65 73 73 69 6f 6e 2e 20 49 74 0a 2a 2a 20 63  ression. It.** c
3c30: 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73  hecks that the s
3c40: 71 6c 69 74 65 33 2e 6e 54 72 61 6e 73 61 63 74  qlite3.nTransact
3c50: 69 6f 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20  ion variable is 
3c60: 63 6f 72 72 65 63 74 6c 79 20 73 65 74 20 74 6f  correctly set to
3c70: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
3c80: 66 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f  f non-transactio
3c90: 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 63 75 72  n savepoints cur
3ca0: 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 0a 2a  rently in the .*
3cb0: 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  * linked list st
3cc0: 61 72 74 69 6e 67 20 61 74 20 73 71 6c 69 74 65  arting at sqlite
3cd0: 33 2e 70 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a  3.pSavepoint..**
3ce0: 20 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a   .** Usage:.**.*
3cf0: 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 63 68  *     assert( ch
3d00: 65 63 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e  eckSavepointCoun
3d10: 74 28 64 62 29 20 29 3b 0a 2a 2f 0a 73 74 61 74  t(db) );.*/.stat
3d20: 69 63 20 69 6e 74 20 63 68 65 63 6b 53 61 76 65  ic int checkSave
3d30: 70 6f 69 6e 74 43 6f 75 6e 74 28 73 71 6c 69 74  pointCount(sqlit
3d40: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6e  e3 *db){.  int n
3d50: 20 3d 20 30 3b 0a 20 20 53 61 76 65 70 6f 69 6e   = 0;.  Savepoin
3d60: 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 64 62  t *p;.  for(p=db
3d70: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 20 70 3b  ->pSavepoint; p;
3d80: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 20 6e 2b 2b   p=p->pNext) n++
3d90: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 28  ;.  assert( n==(
3da0: 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b  db->nSavepoint +
3db0: 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69   db->isTransacti
3dc0: 6f 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a  onSavepoint) );.
3dd0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
3de0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  ndif../*.** Tran
3df0: 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61  sfer error messa
3e00: 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20  ge text from an 
3e10: 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72  sqlite3_vtab.zEr
3e20: 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
3e30: 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
3e40: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
3e50: 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74  ite3_malloc) int
3e60: 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67  o a Vdbe.zErrMsg
3e70: 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
3e80: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
3e90: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
3ea0: 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 73 74  DbMalloc)..*/.st
3eb0: 61 74 69 63 20 76 6f 69 64 20 69 6d 70 6f 72 74  atic void import
3ec0: 56 74 61 62 45 72 72 4d 73 67 28 56 64 62 65 20  VtabErrMsg(Vdbe 
3ed0: 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  *p, sqlite3_vtab
3ee0: 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71 6c 69   *pVtab){.  sqli
3ef0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
3f00: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
3f10: 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
3f20: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
3f30: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
3f40: 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  (db, pVtab->zErr
3f50: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Msg);.  sqlite3_
3f60: 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72  free(pVtab->zErr
3f70: 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a  Msg);.  pVtab->z
3f80: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a 0a 0a  ErrMsg = 0;.}...
3f90: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 73  /*.** Execute as
3fa0: 20 6d 75 63 68 20 6f 66 20 61 20 56 44 42 45 20   much of a VDBE 
3fb0: 70 72 6f 67 72 61 6d 20 61 73 20 77 65 20 63 61  program as we ca
3fc0: 6e 20 74 68 65 6e 20 72 65 74 75 72 6e 2e 0a 2a  n then return..*
3fd0: 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  *.** sqlite3Vdbe
3fe0: 4d 61 6b 65 52 65 61 64 79 28 29 20 6d 75 73 74  MakeReady() must
3ff0: 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
4000: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
4010: 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 63 6c  n order to.** cl
4020: 6f 73 65 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ose the program 
4030: 77 69 74 68 20 61 20 66 69 6e 61 6c 20 4f 50 5f  with a final OP_
4040: 48 61 6c 74 20 61 6e 64 20 74 6f 20 73 65 74 20  Halt and to set 
4050: 75 70 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73  up the callbacks
4060: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 72 72 6f  .** and the erro
4070: 72 20 6d 65 73 73 61 67 65 20 70 6f 69 6e 74 65  r message pointe
4080: 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 65 76 65  r..**.** Wheneve
4090: 72 20 61 20 72 6f 77 20 6f 72 20 72 65 73 75 6c  r a row or resul
40a0: 74 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61  t data is availa
40b0: 62 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ble, this routin
40c0: 65 20 77 69 6c 6c 20 65 69 74 68 65 72 0a 2a 2a  e will either.**
40d0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 65 73 75   invoke the resu
40e0: 6c 74 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  lt callback (if 
40f0: 74 68 65 72 65 20 69 73 20 6f 6e 65 29 20 6f 72  there is one) or
4100: 20 72 65 74 75 72 6e 20 77 69 74 68 0a 2a 2a 20   return with.** 
4110: 53 51 4c 49 54 45 5f 52 4f 57 2e 0a 2a 2a 0a 2a  SQLITE_ROW..**.*
4120: 2a 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20  * If an attempt 
4130: 69 73 20 6d 61 64 65 20 74 6f 20 6f 70 65 6e 20  is made to open 
4140: 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62 61 73  a locked databas
4150: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
4160: 74 69 6e 65 0a 2a 2a 20 77 69 6c 6c 20 65 69 74  tine.** will eit
4170: 68 65 72 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  her invoke the b
4180: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  usy callback (if
4190: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 29 20 6f   there is one) o
41a0: 72 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 72 65 74  r it will.** ret
41b0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
41c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
41d0: 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
41e0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77  ror message is w
41f0: 72 69 74 74 65 6e 20 74 6f 20 6d 65 6d 6f 72 79  ritten to memory
4200: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
4210: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
4220: 28 29 20 61 6e 64 20 70 2d 3e 7a 45 72 72 4d 73  () and p->zErrMs
4230: 67 20 69 73 20 6d 61 64 65 20 74 6f 20 70 6f 69  g is made to poi
4240: 6e 74 20 74 6f 20 74 68 61 74 20 6d 65 6d 6f 72  nt to that memor
4250: 79 2e 0a 2a 2a 20 54 68 65 20 65 72 72 6f 72 20  y..** The error 
4260: 63 6f 64 65 20 69 73 20 73 74 6f 72 65 64 20 69  code is stored i
4270: 6e 20 70 2d 3e 72 63 20 61 6e 64 20 74 68 69 73  n p->rc and this
4280: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
4290: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a   SQLITE_ERROR..*
42a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c  *.** If the call
42b0: 62 61 63 6b 20 65 76 65 72 20 72 65 74 75 72 6e  back ever return
42c0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
42d0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 65 78 69   the program exi
42e0: 74 73 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ts.** immediatel
42f0: 79 2e 20 20 54 68 65 72 65 20 77 69 6c 6c 20 62  y.  There will b
4300: 65 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61  e no error messa
4310: 67 65 20 62 75 74 20 74 68 65 20 70 2d 3e 72 63  ge but the p->rc
4320: 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 73 65 74   field is.** set
4330: 20 74 6f 20 53 51 4c 49 54 45 5f 41 42 4f 52 54   to SQLITE_ABORT
4340: 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
4350: 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 53 51  e will return SQ
4360: 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a  LITE_ERROR..**.*
4370: 2a 20 41 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  * A memory alloc
4380: 61 74 69 6f 6e 20 65 72 72 6f 72 20 63 61 75 73  ation error caus
4390: 65 73 20 70 2d 3e 72 63 20 74 6f 20 62 65 20 73  es p->rc to be s
43a0: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d  et to SQLITE_NOM
43b0: 45 4d 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 72  EM and this.** r
43c0: 6f 75 74 69 6e 65 20 74 6f 20 72 65 74 75 72 6e  outine to return
43d0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a   SQLITE_ERROR..*
43e0: 2a 0a 2a 2a 20 4f 74 68 65 72 20 66 61 74 61 6c  *.** Other fatal
43f0: 20 65 72 72 6f 72 73 20 72 65 74 75 72 6e 20 53   errors return S
4400: 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a  QLITE_ERROR..**.
4410: 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
4420: 75 74 69 6e 65 20 68 61 73 20 66 69 6e 69 73 68  utine has finish
4430: 65 64 2c 20 73 71 6c 69 74 65 33 56 64 62 65 46  ed, sqlite3VdbeF
4440: 69 6e 61 6c 69 7a 65 28 29 20 73 68 6f 75 6c 64  inalize() should
4450: 20 62 65 0a 2a 2a 20 75 73 65 64 20 74 6f 20 63   be.** used to c
4460: 6c 65 61 6e 20 75 70 20 74 68 65 20 6d 65 73 73  lean up the mess
4470: 20 74 68 61 74 20 77 61 73 20 6c 65 66 74 20 62   that was left b
4480: 65 68 69 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ehind..*/.int sq
4490: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 0a 20  lite3VdbeExec(. 
44a0: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20   Vdbe *p        
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
44c0: 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20  he VDBE */.){.  
44d0: 69 6e 74 20 70 63 3d 30 3b 20 20 20 20 20 20 20  int pc=0;       
44e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
44f0: 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  e program counte
4500: 72 20 2a 2f 0a 20 20 4f 70 20 2a 61 4f 70 20 3d  r */.  Op *aOp =
4510: 20 70 2d 3e 61 4f 70 3b 20 20 20 20 20 20 20 20   p->aOp;        
4520: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 2d 3e    /* Copy of p->
4530: 61 4f 70 20 2a 2f 0a 20 20 4f 70 20 2a 70 4f 70  aOp */.  Op *pOp
4540: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4550: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
4560: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
4570: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
4580: 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  ;        /* Valu
4590: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
45a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
45b0: 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 54  ->db;       /* T
45c0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
45d0: 20 75 38 20 72 65 73 65 74 53 63 68 65 6d 61 4f   u8 resetSchemaO
45e0: 6e 46 61 75 6c 74 20 3d 20 30 3b 20 2f 2a 20 52  nFault = 0; /* R
45f0: 65 73 65 74 20 73 63 68 65 6d 61 20 61 66 74 65  eset schema afte
4600: 72 20 61 6e 20 65 72 72 6f 72 20 69 66 20 70 6f  r an error if po
4610: 73 69 74 69 76 65 20 2a 2f 0a 20 20 75 38 20 65  sitive */.  u8 e
4620: 6e 63 6f 64 69 6e 67 20 3d 20 45 4e 43 28 64 62  ncoding = ENC(db
4630: 29 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  );     /* The da
4640: 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20  tabase encoding 
4650: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
4660: 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f  E_OMIT_PROGRESS_
4670: 43 41 4c 4c 42 41 43 4b 0a 20 20 69 6e 74 20 63  CALLBACK.  int c
4680: 68 65 63 6b 50 72 6f 67 72 65 73 73 3b 20 20 20  heckProgress;   
4690: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
46a0: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
46b0: 63 6b 73 20 61 72 65 20 65 6e 61 62 6c 65 64 20  cks are enabled 
46c0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 6f 67 72 65  */.  int nProgre
46d0: 73 73 4f 70 73 20 3d 20 30 3b 20 20 20 20 20 20  ssOps = 0;      
46e0: 2f 2a 20 4f 70 63 6f 64 65 73 20 65 78 65 63 75  /* Opcodes execu
46f0: 74 65 64 20 73 69 6e 63 65 20 70 72 6f 67 72 65  ted since progre
4700: 73 73 20 63 61 6c 6c 62 61 63 6b 2e 20 2a 2f 0a  ss callback. */.
4710: 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 69 43 6f  #endif.  int iCo
4720: 6d 70 61 72 65 20 3d 20 30 3b 20 20 20 20 20 20  mpare = 0;      
4730: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
4740: 20 6c 61 73 74 20 4f 50 5f 43 6f 6d 70 61 72 65   last OP_Compare
4750: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
4760: 75 6e 73 69 67 6e 65 64 20 6e 56 6d 53 74 65 70  unsigned nVmStep
4770: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75   = 0;      /* Nu
4780: 6d 62 65 72 20 6f 66 20 76 69 72 74 75 61 6c 20  mber of virtual 
4790: 6d 61 63 68 69 6e 65 20 73 74 65 70 73 20 2a 2f  machine steps */
47a0: 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 70  .  Mem *aMem = p
47b0: 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a  ->aMem;       /*
47c0: 20 43 6f 70 79 20 6f 66 20 70 2d 3e 61 4d 65 6d   Copy of p->aMem
47d0: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 31 20   */.  Mem *pIn1 
47e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
47f0: 20 2f 2a 20 31 73 74 20 69 6e 70 75 74 20 6f 70   /* 1st input op
4800: 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a  erand */.  Mem *
4810: 70 49 6e 32 20 3d 20 30 3b 20 20 20 20 20 20 20  pIn2 = 0;       
4820: 20 20 20 20 20 20 2f 2a 20 32 6e 64 20 69 6e 70        /* 2nd inp
4830: 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ut operand */.  
4840: 4d 65 6d 20 2a 70 49 6e 33 20 3d 20 30 3b 20 20  Mem *pIn3 = 0;  
4850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 72             /* 3r
4860: 64 20 69 6e 70 75 74 20 6f 70 65 72 61 6e 64 20  d input operand 
4870: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4f 75 74 20 3d  */.  Mem *pOut =
4880: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
4890: 2f 2a 20 4f 75 74 70 75 74 20 6f 70 65 72 61 6e  /* Output operan
48a0: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72  d */.  int *aPer
48b0: 6d 75 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  mute = 0;       
48c0: 20 20 2f 2a 20 50 65 72 6d 75 74 61 74 69 6f 6e    /* Permutation
48d0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20   of columns for 
48e0: 4f 50 5f 43 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  OP_Compare */.  
48f0: 69 36 34 20 6c 61 73 74 52 6f 77 69 64 20 3d 20  i64 lastRowid = 
4900: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 20 20  db->lastRowid;  
4910: 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
4920: 66 20 74 68 65 20 6c 61 73 74 20 69 6e 73 65 72  f the last inser
4930: 74 20 52 4f 57 49 44 20 2a 2f 0a 23 69 66 64 65  t ROWID */.#ifde
4940: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
4950: 20 75 36 34 20 73 74 61 72 74 3b 20 20 20 20 20   u64 start;     
4960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4970: 50 55 20 63 6c 6f 63 6b 20 63 6f 75 6e 74 20 61  PU clock count a
4980: 74 20 73 74 61 72 74 20 6f 66 20 6f 70 63 6f 64  t start of opcod
4990: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 50  e */.  int origP
49a0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
49b0: 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75    /* Program cou
49c0: 6e 74 65 72 20 61 74 20 73 74 61 72 74 20 6f 66  nter at start of
49d0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 23 65 6e 64 69   opcode */.#endi
49e0: 66 0a 20 20 2f 2a 2a 2a 20 49 4e 53 45 52 54 20  f.  /*** INSERT 
49f0: 53 54 41 43 4b 20 55 4e 49 4f 4e 20 48 45 52 45  STACK UNION HERE
4a00: 20 2a 2a 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28   ***/..  assert(
4a10: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
4a20: 4d 41 47 49 43 5f 52 55 4e 20 29 3b 20 20 2f 2a  MAGIC_RUN );  /*
4a30: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
4a40: 76 65 72 69 66 69 65 73 20 74 68 69 73 20 2a 2f  verifies this */
4a50: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  .  sqlite3VdbeEn
4a60: 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ter(p);.  if( p-
4a70: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  >rc==SQLITE_NOME
4a80: 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  M ){.    /* This
4a90: 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61   happens if a ma
4aa0: 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20  lloc() inside a 
4ab0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
4ac0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72  column_text() or
4ad0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
4ae0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20  column_text16() 
4af0: 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20  failed.  */.    
4b00: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
4b10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
4b20: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
4b30: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
4b40: 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Y );.  assert( p
4b50: 2d 3e 6e 6f 49 4f 3d 3d 30 20 7c 7c 20 70 2d 3e  ->noIO==0 || p->
4b60: 72 65 61 64 4f 6e 6c 79 21 3d 30 20 29 3b 0a 20  readOnly!=0 );. 
4b70: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
4b80: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  OK;.  assert( p-
4b90: 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 29 3b 0a 20  >explain==0 );. 
4ba0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
4bb0: 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61   0;.  db->busyHa
4bc0: 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b  ndler.nBusy = 0;
4bd0: 0a 20 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54  .  CHECK_FOR_INT
4be0: 45 52 52 55 50 54 3b 0a 20 20 73 71 6c 69 74 65  ERRUPT;.  sqlite
4bf0: 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28  3VdbeIOTraceSql(
4c00: 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p);.#ifndef SQLI
4c10: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
4c20: 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 63 68 65 63  _CALLBACK.  chec
4c30: 6b 50 72 6f 67 72 65 73 73 20 3d 20 64 62 2d 3e  kProgress = db->
4c40: 78 50 72 6f 67 72 65 73 73 21 3d 30 3b 0a 23 65  xProgress!=0;.#e
4c50: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
4c60: 54 45 5f 44 45 42 55 47 0a 20 20 73 71 6c 69 74  TE_DEBUG.  sqlit
4c70: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
4c80: 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 70 2d 3e  loc();.  if( p->
4c90: 70 63 3d 3d 30 20 20 26 26 20 28 70 2d 3e 64 62  pc==0  && (p->db
4ca0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
4cb0: 5f 56 64 62 65 4c 69 73 74 69 6e 67 29 21 3d 30  _VdbeListing)!=0
4cc0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4cd0: 20 20 20 70 72 69 6e 74 66 28 22 56 44 42 45 20     printf("VDBE 
4ce0: 50 72 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67 3a  Program Listing:
4cf0: 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  \n");.    sqlite
4d00: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 70 29  3VdbePrintSql(p)
4d10: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
4d20: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
4d30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4d40: 50 72 69 6e 74 4f 70 28 73 74 64 6f 75 74 2c 20  PrintOp(stdout, 
4d50: 69 2c 20 26 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  i, &aOp[i]);.   
4d60: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
4d70: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
4d80: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28  );.#endif.  for(
4d90: 70 63 3d 70 2d 3e 70 63 3b 20 72 63 3d 3d 53 51  pc=p->pc; rc==SQ
4da0: 4c 49 54 45 5f 4f 4b 3b 20 70 63 2b 2b 29 7b 0a  LITE_OK; pc++){.
4db0: 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d      assert( pc>=
4dc0: 30 20 26 26 20 70 63 3c 70 2d 3e 6e 4f 70 20 29  0 && pc<p->nOp )
4dd0: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
4de0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
4df0: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 23 69 66 64 65 66  o no_mem;.#ifdef
4e00: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
4e10: 20 20 6f 72 69 67 50 63 20 3d 20 70 63 3b 0a 20    origPc = pc;. 
4e20: 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
4e30: 65 33 48 77 74 69 6d 65 28 29 3b 0a 23 65 6e 64  e3Hwtime();.#end
4e40: 69 66 0a 20 20 20 20 6e 56 6d 53 74 65 70 2b 2b  if.    nVmStep++
4e50: 3b 0a 20 20 20 20 70 4f 70 20 3d 20 26 61 4f 70  ;.    pOp = &aOp
4e60: 5b 70 63 5d 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e  [pc];..    /* On
4e70: 6c 79 20 61 6c 6c 6f 77 20 74 72 61 63 69 6e 67  ly allow tracing
4e80: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
4e90: 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20 20   is defined..   
4ea0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
4eb0: 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20  E_DEBUG.    if( 
4ec0: 70 2d 3e 74 72 61 63 65 20 29 7b 0a 20 20 20 20  p->trace ){.    
4ed0: 20 20 69 66 28 20 70 63 3d 3d 30 20 29 7b 0a 20    if( pc==0 ){. 
4ee0: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 56         printf("V
4ef0: 44 42 45 20 45 78 65 63 75 74 69 6f 6e 20 54 72  DBE Execution Tr
4f00: 61 63 65 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ace:\n");.      
4f10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
4f20: 6e 74 53 71 6c 28 70 29 3b 0a 20 20 20 20 20 20  ntSql(p);.      
4f30: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
4f40: 64 62 65 50 72 69 6e 74 4f 70 28 70 2d 3e 74 72  dbePrintOp(p->tr
4f50: 61 63 65 2c 20 70 63 2c 20 70 4f 70 29 3b 0a 20  ace, pc, pOp);. 
4f60: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
4f70: 20 20 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b    ..    /* Check
4f80: 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
4f90: 65 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  ed to simulate a
4fa0: 6e 20 69 6e 74 65 72 72 75 70 74 2e 20 20 54 68  n interrupt.  Th
4fb0: 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 0a  is only happens.
4fc0: 20 20 20 20 2a 2a 20 69 66 20 77 65 20 68 61 76      ** if we hav
4fd0: 65 20 61 20 73 70 65 63 69 61 6c 20 74 65 73 74  e a special test
4fe0: 20 62 75 69 6c 64 2e 0a 20 20 20 20 2a 2f 0a 23   build..    */.#
4ff0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
5000: 54 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  T.    if( sqlite
5010: 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e  3_interrupt_coun
5020: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  t>0 ){.      sql
5030: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63  ite3_interrupt_c
5040: 6f 75 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 69 66  ount--;.      if
5050: 28 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  ( sqlite3_interr
5060: 75 70 74 5f 63 6f 75 6e 74 3d 3d 30 20 29 7b 0a  upt_count==0 ){.
5070: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5080: 69 6e 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20  interrupt(db);. 
5090: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
50a0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
50b0: 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
50c0: 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 2f  S_CALLBACK.    /
50d0: 2a 20 43 61 6c 6c 20 74 68 65 20 70 72 6f 67 72  * Call the progr
50e0: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  ess callback if 
50f0: 69 74 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  it is configured
5100: 20 61 6e 64 20 74 68 65 20 72 65 71 75 69 72 65   and the require
5110: 64 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2a 20  d number.    ** 
5120: 6f 66 20 56 44 42 45 20 6f 70 73 20 68 61 76 65  of VDBE ops have
5130: 20 62 65 65 6e 20 65 78 65 63 75 74 65 64 20 28   been executed (
5140: 65 69 74 68 65 72 20 73 69 6e 63 65 20 74 68 69  either since thi
5150: 73 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 0a  s invocation of.
5160: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64      ** sqlite3Vd
5170: 62 65 45 78 65 63 28 29 20 6f 72 20 73 69 6e 63  beExec() or sinc
5180: 65 20 6c 61 73 74 20 74 69 6d 65 20 74 68 65 20  e last time the 
5190: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
51a0: 6b 20 77 61 73 20 63 61 6c 6c 65 64 29 2e 0a 20  k was called).. 
51b0: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 70 72 6f     ** If the pro
51c0: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 72  gress callback r
51d0: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
51e0: 20 65 78 69 74 20 74 68 65 20 76 69 72 74 75 61   exit the virtua
51f0: 6c 20 6d 61 63 68 69 6e 65 20 77 69 74 68 0a 20  l machine with. 
5200: 20 20 20 2a 2a 20 61 20 72 65 74 75 72 6e 20 63     ** a return c
5210: 6f 64 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ode SQLITE_ABORT
5220: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
5230: 20 63 68 65 63 6b 50 72 6f 67 72 65 73 73 20 29   checkProgress )
5240: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
5250: 6e 50 72 6f 67 72 65 73 73 4f 70 73 3d 3d 6e 50  nProgressOps==nP
5260: 72 6f 67 72 65 73 73 4f 70 73 20 29 7b 0a 20 20  rogressOps ){.  
5270: 20 20 20 20 20 20 69 6e 74 20 70 72 63 3b 0a 20        int prc;. 
5280: 20 20 20 20 20 20 20 70 72 63 20 3d 20 64 62 2d         prc = db-
5290: 3e 78 50 72 6f 67 72 65 73 73 28 64 62 2d 3e 70  >xProgress(db->p
52a0: 50 72 6f 67 72 65 73 73 41 72 67 29 3b 0a 20 20  ProgressArg);.  
52b0: 20 20 20 20 20 20 69 66 28 20 70 72 63 21 3d 30        if( prc!=0
52c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
52d0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
52e0: 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  UPT;.          g
52f0: 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68  oto vdbe_error_h
5300: 61 6c 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  alt;.        }. 
5310: 20 20 20 20 20 20 20 6e 50 72 6f 67 72 65 73 73         nProgress
5320: 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Ops = 0;.      }
5330: 0a 20 20 20 20 20 20 6e 50 72 6f 67 72 65 73 73  .      nProgress
5340: 4f 70 73 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e  Ops++;.    }.#en
5350: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 4f 6e 20 61  dif..    /* On a
5360: 6e 79 20 6f 70 63 6f 64 65 20 77 69 74 68 20 74  ny opcode with t
5370: 68 65 20 22 6f 75 74 32 2d 70 72 65 72 65 6c 65  he "out2-prerele
5380: 61 73 65 22 20 74 61 67 2c 20 66 72 65 65 20 61  ase" tag, free a
5390: 6e 79 0a 20 20 20 20 2a 2a 20 65 78 74 65 72 6e  ny.    ** extern
53a0: 61 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f  al allocations o
53b0: 75 74 20 6f 66 20 6d 65 6d 5b 70 32 5d 20 61 6e  ut of mem[p2] an
53c0: 64 20 73 65 74 20 6d 65 6d 5b 70 32 5d 20 74 6f  d set mem[p2] to
53d0: 20 62 65 0a 20 20 20 20 2a 2a 20 61 6e 20 75 6e   be.    ** an un
53e0: 64 65 66 69 6e 65 64 20 69 6e 74 65 67 65 72 2e  defined integer.
53f0: 20 20 4f 70 63 6f 64 65 73 20 77 69 6c 6c 20 65    Opcodes will e
5400: 69 74 68 65 72 20 66 69 6c 6c 20 69 6e 20 74 68  ither fill in th
5410: 65 20 69 6e 74 65 67 65 72 0a 20 20 20 20 2a 2a  e integer.    **
5420: 20 76 61 6c 75 65 20 6f 72 20 63 6f 6e 76 65 72   value or conver
5430: 74 20 6d 65 6d 5b 70 32 5d 20 74 6f 20 61 20 64  t mem[p2] to a d
5440: 69 66 66 65 72 65 6e 74 20 74 79 70 65 2e 0a 20  ifferent type.. 
5450: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
5460: 28 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 3d 3d  ( pOp->opflags==
5470: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
5480: 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64  perty[pOp->opcod
5490: 65 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  e] );.    if( pO
54a0: 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46  p->opflags & OPF
54b0: 4c 47 5f 4f 55 54 32 5f 50 52 45 52 45 4c 45 41  LG_OUT2_PRERELEA
54c0: 53 45 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  SE ){.      asse
54d0: 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b  rt( pOp->p2>0 );
54e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
54f0: 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d 20  Op->p2<=p->nMem 
5500: 29 3b 0a 20 20 20 20 20 20 70 4f 75 74 20 3d 20  );.      pOut = 
5510: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
5520: 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f        memAboutTo
5530: 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b  Change(p, pOut);
5540: 0a 20 20 20 20 20 20 56 64 62 65 4d 65 6d 52 65  .      VdbeMemRe
5550: 6c 65 61 73 65 28 70 4f 75 74 29 3b 0a 20 20 20  lease(pOut);.   
5560: 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d     pOut->flags =
5570: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 7d 0a   MEM_Int;.    }.
5580: 0a 20 20 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  .    /* Sanity c
5590: 68 65 63 6b 69 6e 67 20 6f 6e 20 6f 74 68 65 72  hecking on other
55a0: 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 23 69 66   operands */.#if
55b0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
55c0: 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f  .    if( (pOp->o
55d0: 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 49  pflags & OPFLG_I
55e0: 4e 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  N1)!=0 ){.      
55f0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
5600: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
5610: 74 28 20 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e  t( pOp->p1<=p->n
5620: 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Mem );.      ass
5630: 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
5640: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20  &aMem[pOp->p1]) 
5650: 29 3b 0a 20 20 20 20 20 20 52 45 47 49 53 54 45  );.      REGISTE
5660: 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c  R_TRACE(pOp->p1,
5670: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29   &aMem[pOp->p1])
5680: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5690: 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20  (pOp->opflags & 
56a0: 4f 50 46 4c 47 5f 49 4e 32 29 21 3d 30 20 29 7b  OPFLG_IN2)!=0 ){
56b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
56c0: 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20  Op->p2>0 );.    
56d0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
56e0: 32 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  2<=p->nMem );.  
56f0: 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
5700: 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70  sValid(&aMem[pOp
5710: 2d 3e 70 32 5d 29 20 29 3b 0a 20 20 20 20 20 20  ->p2]) );.      
5720: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
5730: 4f 70 2d 3e 70 32 2c 20 26 61 4d 65 6d 5b 70 4f  Op->p2, &aMem[pO
5740: 70 2d 3e 70 32 5d 29 3b 0a 20 20 20 20 7d 0a 20  p->p2]);.    }. 
5750: 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66     if( (pOp->opf
5760: 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 49 4e 33  lags & OPFLG_IN3
5770: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  )!=0 ){.      as
5780: 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20  sert( pOp->p3>0 
5790: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
57a0: 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65   pOp->p3<=p->nMe
57b0: 6d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  m );.      asser
57c0: 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61  t( memIsValid(&a
57d0: 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20 29 3b  Mem[pOp->p3]) );
57e0: 0a 20 20 20 20 20 20 52 45 47 49 53 54 45 52 5f  .      REGISTER_
57f0: 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 26  TRACE(pOp->p3, &
5800: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a  aMem[pOp->p3]);.
5810: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
5820: 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50  Op->opflags & OP
5830: 46 4c 47 5f 4f 55 54 32 29 21 3d 30 20 29 7b 0a  FLG_OUT2)!=0 ){.
5840: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
5850: 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20 20  p->p2>0 );.     
5860: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
5870: 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20  <=p->nMem );.   
5880: 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61     memAboutToCha
5890: 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70  nge(p, &aMem[pOp
58a0: 2d 3e 70 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ->p2]);.    }.  
58b0: 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c    if( (pOp->opfl
58c0: 61 67 73 20 26 20 4f 50 46 4c 47 5f 4f 55 54 33  ags & OPFLG_OUT3
58d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  )!=0 ){.      as
58e0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20  sert( pOp->p3>0 
58f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
5900: 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65   pOp->p3<=p->nMe
5910: 6d 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62  m );.      memAb
5920: 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 26  outToChange(p, &
5930: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a  aMem[pOp->p3]);.
5940: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a      }.#endif.  .
5950: 20 20 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d      switch( pOp-
5960: 3e 6f 70 63 6f 64 65 20 29 7b 0a 0a 2f 2a 2a 2a  >opcode ){../***
5970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 57 68  **********.** Wh
59c0: 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 61 20  at follows is a 
59d0: 6d 61 73 73 69 76 65 20 73 77 69 74 63 68 20 73  massive switch s
59e0: 74 61 74 65 6d 65 6e 74 20 77 68 65 72 65 20 65  tatement where e
59f0: 61 63 68 20 63 61 73 65 20 69 6d 70 6c 65 6d 65  ach case impleme
5a00: 6e 74 73 20 61 0a 2a 2a 20 73 65 70 61 72 61 74  nts a.** separat
5a10: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e  e instruction in
5a20: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
5a30: 68 69 6e 65 2e 20 20 49 66 20 77 65 20 66 6f 6c  hine.  If we fol
5a40: 6c 6f 77 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a  low the usual.**
5a50: 20 69 6e 64 65 6e 74 61 74 69 6f 6e 20 63 6f 6e   indentation con
5a60: 76 65 6e 74 69 6f 6e 73 2c 20 65 61 63 68 20 63  ventions, each c
5a70: 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ase should be in
5a80: 64 65 6e 74 65 64 20 62 79 20 36 20 73 70 61 63  dented by 6 spac
5a90: 65 73 2e 20 20 42 75 74 0a 2a 2a 20 74 68 61 74  es.  But.** that
5aa0: 20 69 73 20 61 20 6c 6f 74 20 6f 66 20 77 61 73   is a lot of was
5ab0: 74 65 64 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ted space on the
5ac0: 20 6c 65 66 74 20 6d 61 72 67 69 6e 2e 20 20 53   left margin.  S
5ad0: 6f 20 74 68 65 20 63 6f 64 65 20 77 69 74 68 69  o the code withi
5ae0: 6e 0a 2a 2a 20 74 68 65 20 73 77 69 74 63 68 20  n.** the switch 
5af0: 73 74 61 74 65 6d 65 6e 74 20 77 69 6c 6c 20 62  statement will b
5b00: 72 65 61 6b 20 77 69 74 68 20 63 6f 6e 76 65 6e  reak with conven
5b10: 74 69 6f 6e 20 61 6e 64 20 62 65 20 66 6c 75 73  tion and be flus
5b20: 68 2d 6c 65 66 74 2e 20 41 6e 6f 74 68 65 72 0a  h-left. Another.
5b30: 2a 2a 20 62 69 67 20 63 6f 6d 6d 65 6e 74 20 28  ** big comment (
5b40: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 69 73 20  similar to this 
5b50: 6f 6e 65 29 20 77 69 6c 6c 20 6d 61 72 6b 20 74  one) will mark t
5b60: 68 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  he point in the 
5b70: 63 6f 64 65 20 77 68 65 72 65 0a 2a 2a 20 77 65  code where.** we
5b80: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
5b90: 20 74 6f 20 6e 6f 72 6d 61 6c 20 69 6e 64 65 6e   to normal inden
5ba0: 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  tation..**.** Th
5bb0: 65 20 66 6f 72 6d 61 74 74 69 6e 67 20 6f 66 20  e formatting of 
5bc0: 65 61 63 68 20 63 61 73 65 20 69 73 20 69 6d 70  each case is imp
5bd0: 6f 72 74 61 6e 74 2e 20 20 54 68 65 20 6d 61 6b  ortant.  The mak
5be0: 65 66 69 6c 65 20 66 6f 72 20 53 51 4c 69 74 65  efile for SQLite
5bf0: 0a 2a 2a 20 67 65 6e 65 72 61 74 65 73 20 74 77  .** generates tw
5c00: 6f 20 43 20 66 69 6c 65 73 20 22 6f 70 63 6f 64  o C files "opcod
5c10: 65 73 2e 68 22 20 61 6e 64 20 22 6f 70 63 6f 64  es.h" and "opcod
5c20: 65 73 2e 63 22 20 62 79 20 73 63 61 6e 6e 69 6e  es.c" by scannin
5c30: 67 20 74 68 69 73 0a 2a 2a 20 66 69 6c 65 20 6c  g this.** file l
5c40: 6f 6f 6b 69 6e 67 20 66 6f 72 20 6c 69 6e 65 73  ooking for lines
5c50: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
5c60: 20 22 63 61 73 65 20 4f 50 5f 22 2e 20 20 54 68   "case OP_".  Th
5c70: 65 20 6f 70 63 6f 64 65 73 2e 68 20 66 69 6c 65  e opcodes.h file
5c80: 73 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 66 69 6c  s.** will be fil
5c90: 6c 65 64 20 77 69 74 68 20 23 64 65 66 69 6e 65  led with #define
5ca0: 73 20 74 68 61 74 20 67 69 76 65 20 75 6e 69 71  s that give uniq
5cb0: 75 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  ue integer value
5cc0: 73 20 74 6f 20 65 61 63 68 0a 2a 2a 20 6f 70 63  s to each.** opc
5cd0: 6f 64 65 20 61 6e 64 20 74 68 65 20 6f 70 63 6f  ode and the opco
5ce0: 64 65 73 2e 63 20 66 69 6c 65 20 69 73 20 66 69  des.c file is fi
5cf0: 6c 6c 65 64 20 77 69 74 68 20 61 6e 20 61 72 72  lled with an arr
5d00: 61 79 20 6f 66 20 73 74 72 69 6e 67 73 20 77 68  ay of strings wh
5d10: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 74 72 69  ere.** each stri
5d20: 6e 67 20 69 73 20 74 68 65 20 73 79 6d 62 6f 6c  ng is the symbol
5d30: 69 63 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ic name for the 
5d40: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6f 70  corresponding op
5d50: 63 6f 64 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a  code.  If the.**
5d60: 20 63 61 73 65 20 73 74 61 74 65 6d 65 6e 74 20   case statement 
5d70: 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  is followed by a
5d80: 20 63 6f 6d 6d 65 6e 74 20 6f 66 20 74 68 65 20   comment of the 
5d90: 66 6f 72 6d 20 22 2f 23 20 73 61 6d 65 20 61 73  form "/# same as
5da0: 20 2e 2e 2e 20 23 2f 22 0a 2a 2a 20 74 68 61 74   ... #/".** that
5db0: 20 63 6f 6d 6d 65 6e 74 20 69 73 20 75 73 65 64   comment is used
5dc0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
5dd0: 65 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c  e particular val
5de0: 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  ue of the opcode
5df0: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 20 6b 65  ..**.** Other ke
5e00: 79 77 6f 72 64 73 20 69 6e 20 74 68 65 20 63 6f  ywords in the co
5e10: 6d 6d 65 6e 74 20 74 68 61 74 20 66 6f 6c 6c 6f  mment that follo
5e20: 77 73 20 65 61 63 68 20 63 61 73 65 20 61 72 65  ws each case are
5e30: 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e 73   used to.** cons
5e40: 74 72 75 63 74 20 74 68 65 20 4f 50 46 4c 47 5f  truct the OPFLG_
5e50: 49 4e 49 54 49 41 4c 49 5a 45 52 20 76 61 6c 75  INITIALIZER valu
5e60: 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a  e that initializ
5e70: 65 73 20 6f 70 63 6f 64 65 50 72 6f 70 65 72 74  es opcodePropert
5e80: 79 5b 5d 2e 0a 2a 2a 20 4b 65 79 77 6f 72 64 73  y[]..** Keywords
5e90: 20 69 6e 63 6c 75 64 65 3a 20 69 6e 31 2c 20 69   include: in1, i
5ea0: 6e 32 2c 20 69 6e 33 2c 20 6f 75 74 32 5f 70 72  n2, in3, out2_pr
5eb0: 65 72 65 6c 65 61 73 65 2c 20 6f 75 74 32 2c 20  erelease, out2, 
5ec0: 6f 75 74 33 2e 20 20 53 65 65 0a 2a 2a 20 74 68  out3.  See.** th
5ed0: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
5ee0: 73 63 72 69 70 74 20 66 6f 72 20 61 64 64 69 74  script for addit
5ef0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
5f00: 6e 2e 0a 2a 2a 0a 2a 2a 20 44 6f 63 75 6d 65 6e  n..**.** Documen
5f10: 74 61 74 69 6f 6e 20 61 62 6f 75 74 20 56 44 42  tation about VDB
5f20: 45 20 6f 70 63 6f 64 65 73 20 69 73 20 67 65 6e  E opcodes is gen
5f30: 65 72 61 74 65 64 20 62 79 20 73 63 61 6e 6e 69  erated by scanni
5f40: 6e 67 20 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20  ng this file.** 
5f50: 66 6f 72 20 6c 69 6e 65 73 20 6f 66 20 74 68 61  for lines of tha
5f60: 74 20 63 6f 6e 74 61 69 6e 20 22 4f 70 63 6f 64  t contain "Opcod
5f70: 65 3a 22 2e 20 20 54 68 61 74 20 6c 69 6e 65 20  e:".  That line 
5f80: 61 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  and all subseque
5f90: 6e 74 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 6c 69  nt.** comment li
5fa0: 6e 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20  nes are used in 
5fb0: 74 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f  the generation o
5fc0: 66 20 74 68 65 20 6f 70 63 6f 64 65 2e 68 74 6d  f the opcode.htm
5fd0: 6c 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 0a  l documentation.
5fe0: 2a 2a 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  ** file..**.** S
5ff0: 55 4d 4d 41 52 59 3a 0a 2a 2a 0a 2a 2a 20 20 20  UMMARY:.**.**   
6000: 20 20 46 6f 72 6d 61 74 74 69 6e 67 20 69 73 20    Formatting is 
6010: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 63 72  important to scr
6020: 69 70 74 73 20 74 68 61 74 20 73 63 61 6e 20 74  ipts that scan t
6030: 68 69 73 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  his file..**    
6040: 20 44 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20   Do not deviate 
6050: 66 72 6f 6d 20 74 68 65 20 66 6f 72 6d 61 74 74  from the formatt
6060: 69 6e 67 20 73 74 79 6c 65 20 63 75 72 72 65 6e  ing style curren
6070: 74 6c 79 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  tly in use..**.*
6080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
60d0: 2a 20 4f 70 63 6f 64 65 3a 20 20 47 6f 74 6f 20  * Opcode:  Goto 
60e0: 2a 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  * P2 * * *.**.**
60f0: 20 41 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61   An unconditiona
6100: 6c 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73  l jump to addres
6110: 73 20 50 32 2e 0a 2a 2a 20 54 68 65 20 6e 65 78  s P2..** The nex
6120: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 78  t instruction ex
6130: 65 63 75 74 65 64 20 77 69 6c 6c 20 62 65 20 0a  ecuted will be .
6140: 2a 2a 20 74 68 65 20 6f 6e 65 20 61 74 20 69 6e  ** the one at in
6150: 64 65 78 20 50 32 20 66 72 6f 6d 20 74 68 65 20  dex P2 from the 
6160: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
6170: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  the program..*/.
6180: 63 61 73 65 20 4f 50 5f 47 6f 74 6f 3a 20 7b 20  case OP_Goto: { 
6190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
61a0: 75 6d 70 20 2a 2f 0a 20 20 43 48 45 43 4b 5f 46  ump */.  CHECK_F
61b0: 4f 52 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20  OR_INTERRUPT;.  
61c0: 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
61d0: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
61e0: 20 4f 70 63 6f 64 65 3a 20 20 47 6f 73 75 62 20   Opcode:  Gosub 
61f0: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
6200: 2a 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72  * Write the curr
6210: 65 6e 74 20 61 64 64 72 65 73 73 20 6f 6e 74 6f  ent address onto
6220: 20 72 65 67 69 73 74 65 72 20 50 31 0a 2a 2a 20   register P1.** 
6230: 61 6e 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  and then jump to
6240: 20 61 64 64 72 65 73 73 20 50 32 2e 0a 2a 2f 0a   address P2..*/.
6250: 63 61 73 65 20 4f 50 5f 47 6f 73 75 62 3a 20 7b  case OP_Gosub: {
6260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
6270: 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ump */.  assert(
6280: 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f   pOp->p1>0 && pO
6290: 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 4d 65 6d 20 29  p->p1<=p->nMem )
62a0: 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ;.  pIn1 = &aMem
62b0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
62c0: 65 72 74 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67  ert( (pIn1->flag
62d0: 73 20 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d 30 20  s & MEM_Dyn)==0 
62e0: 29 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43  );.  memAboutToC
62f0: 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a  hange(p, pIn1);.
6300: 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20    pIn1->flags = 
6310: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 70 49 6e 31 2d  MEM_Int;.  pIn1-
6320: 3e 75 2e 69 20 3d 20 70 63 3b 0a 20 20 52 45 47  >u.i = pc;.  REG
6330: 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
6340: 3e 70 31 2c 20 70 49 6e 31 29 3b 0a 20 20 70 63  >p1, pIn1);.  pc
6350: 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
6360: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
6370: 70 63 6f 64 65 3a 20 20 52 65 74 75 72 6e 20 50  pcode:  Return P
6380: 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  1 * * * *.**.** 
6390: 4a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74  Jump to the next
63a0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 66 74   instruction aft
63b0: 65 72 20 74 68 65 20 61 64 64 72 65 73 73 20 69  er the address i
63c0: 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a  n register P1..*
63d0: 2f 0a 63 61 73 65 20 4f 50 5f 52 65 74 75 72 6e  /.case OP_Return
63e0: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  : {           /*
63f0: 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
6400: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
6410: 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d  .  assert( pIn1-
6420: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
6430: 20 29 3b 0a 20 20 70 63 20 3d 20 28 69 6e 74 29   );.  pc = (int)
6440: 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 62 72 65  pIn1->u.i;.  bre
6450: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
6460: 3a 20 20 59 69 65 6c 64 20 50 31 20 2a 20 2a 20  :  Yield P1 * * 
6470: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 77 61 70 20 74  * *.**.** Swap t
6480: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74  he program count
6490: 65 72 20 77 69 74 68 20 74 68 65 20 76 61 6c 75  er with the valu
64a0: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
64b0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 59 69 65  ..*/.case OP_Yie
64c0: 6c 64 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ld: {           
64d0: 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 69 6e 74   /* in1 */.  int
64e0: 20 70 63 44 65 73 74 3b 0a 20 20 70 49 6e 31 20   pcDest;.  pIn1 
64f0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
6500: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 6e  ;.  assert( (pIn
6510: 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  1->flags & MEM_D
6520: 79 6e 29 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31  yn)==0 );.  pIn1
6530: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
6540: 74 3b 0a 20 20 70 63 44 65 73 74 20 3d 20 28 69  t;.  pcDest = (i
6550: 6e 74 29 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20  nt)pIn1->u.i;.  
6560: 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 70 63 3b 0a  pIn1->u.i = pc;.
6570: 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
6580: 28 70 4f 70 2d 3e 70 31 2c 20 70 49 6e 31 29 3b  (pOp->p1, pIn1);
6590: 0a 20 20 70 63 20 3d 20 70 63 44 65 73 74 3b 0a  .  pc = pcDest;.
65a0: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
65b0: 70 63 6f 64 65 3a 20 20 48 61 6c 74 49 66 4e 75  pcode:  HaltIfNu
65c0: 6c 6c 20 20 50 31 20 50 32 20 50 33 20 50 34 20  ll  P1 P2 P3 P4 
65d0: 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  *.**.** Check th
65e0: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
65f0: 74 65 72 20 50 33 2e 20 20 49 66 20 69 74 20 69  ter P3.  If it i
6600: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 48 61 6c 74  s NULL then Halt
6610: 20 75 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65   using.** parame
6620: 74 65 72 20 50 31 2c 20 50 32 2c 20 61 6e 64 20  ter P1, P2, and 
6630: 50 34 20 61 73 20 69 66 20 74 68 69 73 20 77 65  P4 as if this we
6640: 72 65 20 61 20 48 61 6c 74 20 69 6e 73 74 72 75  re a Halt instru
6650: 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 0a 2a  ction.  If the.*
6660: 2a 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  * value in regis
6670: 74 65 72 20 50 33 20 69 73 20 6e 6f 74 20 4e 55  ter P3 is not NU
6680: 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  LL, then this ro
6690: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
66a0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 48 61 6c  ..*/.case OP_Hal
66b0: 74 49 66 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20  tIfNull: {      
66c0: 2f 2a 20 69 6e 33 20 2a 2f 0a 20 20 70 49 6e 33  /* in3 */.  pIn3
66d0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
66e0: 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 33 2d 3e  ];.  if( (pIn3->
66f0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
6700: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
6710: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
6720: 69 6e 74 6f 20 4f 50 5f 48 61 6c 74 20 2a 2f 0a  into OP_Halt */.
6730: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 48  }../* Opcode:  H
6740: 61 6c 74 20 50 31 20 50 32 20 2a 20 50 34 20 2a  alt P1 P2 * P4 *
6750: 0a 2a 2a 0a 2a 2a 20 45 78 69 74 20 69 6d 6d 65  .**.** Exit imme
6760: 64 69 61 74 65 6c 79 2e 20 20 41 6c 6c 20 6f 70  diately.  All op
6770: 65 6e 20 63 75 72 73 6f 72 73 2c 20 65 74 63 20  en cursors, etc 
6780: 61 72 65 20 63 6c 6f 73 65 64 0a 2a 2a 20 61 75  are closed.** au
6790: 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2a 0a  tomatically..**.
67a0: 2a 2a 20 50 31 20 69 73 20 74 68 65 20 72 65 73  ** P1 is the res
67b0: 75 6c 74 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ult code returne
67c0: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 65 78 65  d by sqlite3_exe
67d0: 63 28 29 2c 20 73 71 6c 69 74 65 33 5f 72 65 73  c(), sqlite3_res
67e0: 65 74 28 29 2c 0a 2a 2a 20 6f 72 20 73 71 6c 69  et(),.** or sqli
67f0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 2e 20  te3_finalize(). 
6800: 20 46 6f 72 20 61 20 6e 6f 72 6d 61 6c 20 68 61   For a normal ha
6810: 6c 74 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20  lt, this should 
6820: 62 65 20 53 51 4c 49 54 45 5f 4f 4b 20 28 30 29  be SQLITE_OK (0)
6830: 2e 0a 2a 2a 20 46 6f 72 20 65 72 72 6f 72 73 2c  ..** For errors,
6840: 20 69 74 20 63 61 6e 20 62 65 20 73 6f 6d 65 20   it can be some 
6850: 6f 74 68 65 72 20 76 61 6c 75 65 2e 20 20 49 66  other value.  If
6860: 20 50 31 21 3d 30 20 74 68 65 6e 20 50 32 20 77   P1!=0 then P2 w
6870: 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a  ill determine.**
6880: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
6890: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
68a0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
68b0: 69 6f 6e 2e 20 20 44 6f 20 6e 6f 74 20 72 6f 6c  ion.  Do not rol
68c0: 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 50 32 3d 3d  lback.** if P2==
68d0: 4f 45 5f 46 61 69 6c 2e 20 44 6f 20 74 68 65 20  OE_Fail. Do the 
68e0: 72 6f 6c 6c 62 61 63 6b 20 69 66 20 50 32 3d 3d  rollback if P2==
68f0: 4f 45 5f 52 6f 6c 6c 62 61 63 6b 2e 20 20 49 66  OE_Rollback.  If
6900: 20 50 32 3d 3d 4f 45 5f 41 62 6f 72 74 2c 0a 2a   P2==OE_Abort,.*
6910: 2a 20 74 68 65 6e 20 62 61 63 6b 20 6f 75 74 20  * then back out 
6920: 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 68 61 74  all changes that
6930: 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 64   have occurred d
6940: 75 72 69 6e 67 20 74 68 69 73 20 65 78 65 63 75  uring this execu
6950: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56  tion of the.** V
6960: 44 42 45 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  DBE, but do not 
6970: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
6980: 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  nsaction. .**.**
6990: 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20 6e 75   If P4 is not nu
69a0: 6c 6c 20 74 68 65 6e 20 69 74 20 69 73 20 61 6e  ll then it is an
69b0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
69c0: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tring..**.** The
69d0: 72 65 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64  re is an implied
69e0: 20 22 48 61 6c 74 20 30 20 30 20 30 22 20 69 6e   "Halt 0 0 0" in
69f0: 73 74 72 75 63 74 69 6f 6e 20 69 6e 73 65 72 74  struction insert
6a00: 65 64 20 61 74 20 74 68 65 20 76 65 72 79 20 65  ed at the very e
6a10: 6e 64 20 6f 66 0a 2a 2a 20 65 76 65 72 79 20 70  nd of.** every p
6a20: 72 6f 67 72 61 6d 2e 20 20 53 6f 20 61 20 6a 75  rogram.  So a ju
6a30: 6d 70 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  mp past the last
6a40: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20   instruction of 
6a50: 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 69  the program.** i
6a60: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 65 78  s the same as ex
6a70: 65 63 75 74 69 6e 67 20 48 61 6c 74 2e 0a 2a 2f  ecuting Halt..*/
6a80: 0a 63 61 73 65 20 4f 50 5f 48 61 6c 74 3a 20 7b  .case OP_Halt: {
6a90: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d  .  if( pOp->p1==
6aa0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
6ab0: 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a  pFrame ){.    /*
6ac0: 20 48 61 6c 74 20 74 68 65 20 73 75 62 2d 70 72   Halt the sub-pr
6ad0: 6f 67 72 61 6d 2e 20 52 65 74 75 72 6e 20 63 6f  ogram. Return co
6ae0: 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 70 61 72  ntrol to the par
6af0: 65 6e 74 20 66 72 61 6d 65 2e 20 2a 2f 0a 20 20  ent frame. */.  
6b00: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72    VdbeFrame *pFr
6b10: 61 6d 65 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b  ame = p->pFrame;
6b20: 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d  .    p->pFrame =
6b30: 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74   pFrame->pParent
6b40: 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 2d  ;.    p->nFrame-
6b50: 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  -;.    sqlite3Vd
6b60: 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
6b70: 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20   p->nChange);.  
6b80: 20 20 70 63 20 3d 20 73 71 6c 69 74 65 33 56 64    pc = sqlite3Vd
6b90: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70  beFrameRestore(p
6ba0: 46 72 61 6d 65 29 3b 0a 20 20 20 20 6c 61 73 74  Frame);.    last
6bb0: 52 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61 73 74  Rowid = db->last
6bc0: 52 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20 70  Rowid;.    if( p
6bd0: 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 49 67 6e 6f 72  Op->p2==OE_Ignor
6be0: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  e ){.      /* In
6bf0: 73 74 72 75 63 74 69 6f 6e 20 70 63 20 69 73 20  struction pc is 
6c00: 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 74  the OP_Program t
6c10: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 65 20  hat invoked the 
6c20: 73 75 62 2d 70 72 6f 67 72 61 6d 20 0a 20 20 20  sub-program .   
6c30: 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20     ** currently 
6c40: 62 65 69 6e 67 20 68 61 6c 74 65 64 2e 20 49 66  being halted. If
6c50: 20 74 68 65 20 70 32 20 69 6e 73 74 72 75 63 74   the p2 instruct
6c60: 69 6f 6e 20 6f 66 20 74 68 69 73 20 4f 50 5f 48  ion of this OP_H
6c70: 61 6c 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73  alt.      ** ins
6c80: 74 72 75 63 74 69 6f 6e 20 69 73 20 73 65 74 20  truction is set 
6c90: 74 6f 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 74 68  to OE_Ignore, th
6ca0: 65 6e 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  en the sub-progr
6cb0: 61 6d 20 69 73 20 74 68 72 6f 77 69 6e 67 0a 20  am is throwing. 
6cc0: 20 20 20 20 20 2a 2a 20 61 6e 20 49 47 4e 4f 52       ** an IGNOR
6cd0: 45 20 65 78 63 65 70 74 69 6f 6e 2e 20 49 6e 20  E exception. In 
6ce0: 74 68 69 73 20 63 61 73 65 20 6a 75 6d 70 20 74  this case jump t
6cf0: 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 73 70  o the address sp
6d00: 65 63 69 66 69 65 64 0a 20 20 20 20 20 20 2a 2a  ecified.      **
6d10: 20 61 73 20 74 68 65 20 70 32 20 6f 66 20 74 68   as the p2 of th
6d20: 65 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50 72 6f  e calling OP_Pro
6d30: 67 72 61 6d 2e 20 20 2a 2f 0a 20 20 20 20 20 20  gram.  */.      
6d40: 70 63 20 3d 20 70 2d 3e 61 4f 70 5b 70 63 5d 2e  pc = p->aOp[pc].
6d50: 70 32 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p2-1;.    }.    
6d60: 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20  aOp = p->aOp;.  
6d70: 20 20 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d    aMem = p->aMem
6d80: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
6d90: 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 70 4f 70 2d  ..  p->rc = pOp-
6da0: 3e 70 31 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  >p1;.  p->errorA
6db0: 63 74 69 6f 6e 20 3d 20 28 75 38 29 70 4f 70 2d  ction = (u8)pOp-
6dc0: 3e 70 32 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 70  >p2;.  p->pc = p
6dd0: 63 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34  c;.  if( pOp->p4
6de0: 2e 7a 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  .z ){.    assert
6df0: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
6e00: 4f 4b 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  OK );.    sqlite
6e10: 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
6e20: 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22  ErrMsg, db, "%s"
6e30: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
6e40: 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
6e50: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
6e60: 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 20 20 73  xLog!=0 );.    s
6e70: 71 6c 69 74 65 33 5f 6c 6f 67 28 70 4f 70 2d 3e  qlite3_log(pOp->
6e80: 70 31 2c 20 22 61 62 6f 72 74 20 61 74 20 25 64  p1, "abort at %d
6e90: 20 69 6e 20 5b 25 73 5d 3a 20 25 73 22 2c 20 70   in [%s]: %s", p
6ea0: 63 2c 20 70 2d 3e 7a 53 71 6c 2c 20 70 4f 70 2d  c, p->zSql, pOp-
6eb0: 3e 70 34 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65 20  >p4.z);.  }else 
6ec0: 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20  if( p->rc ){.   
6ed0: 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
6ee0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
6ef0: 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 20 20 73 71  Log!=0 );.    sq
6f00: 6c 69 74 65 33 5f 6c 6f 67 28 70 4f 70 2d 3e 70  lite3_log(pOp->p
6f10: 31 2c 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66  1, "constraint f
6f20: 61 69 6c 65 64 20 61 74 20 25 64 20 69 6e 20 5b  ailed at %d in [
6f30: 25 73 5d 22 2c 20 70 63 2c 20 70 2d 3e 7a 53 71  %s]", pc, p->zSq
6f40: 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  l);.  }.  rc = s
6f50: 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
6f60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
6f70: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
6f80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
6f90: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f   rc==SQLITE_ERRO
6fa0: 52 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  R );.  if( rc==S
6fb0: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
6fc0: 20 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53    p->rc = rc = S
6fd0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
6fe0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
6ff0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
7000: 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d  | (p->rc&0xff)==
7010: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
7020: 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
7030: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
7040: 7c 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43  | db->nDeferredC
7050: 6f 6e 73 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  ons>0 );.    rc 
7060: 3d 20 70 2d 3e 72 63 20 3f 20 53 51 4c 49 54 45  = p->rc ? SQLITE
7070: 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f  _ERROR : SQLITE_
7080: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f  DONE;.  }.  goto
7090: 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a   vdbe_return;.}.
70a0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65  ./* Opcode: Inte
70b0: 67 65 72 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  ger P1 P2 * * *.
70c0: 2a 2a 0a 2a 2a 20 54 68 65 20 33 32 2d 62 69 74  **.** The 32-bit
70d0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 50   integer value P
70e0: 31 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  1 is written int
70f0: 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  o register P2..*
7100: 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65 67 65  /.case OP_Intege
7110: 72 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20  r: {         /* 
7120: 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20  out2-prerelease 
7130: 2a 2f 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  */.  pOut->u.i =
7140: 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 62 72 65 61   pOp->p1;.  brea
7150: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
7160: 20 49 6e 74 36 34 20 2a 20 50 32 20 2a 20 50 34   Int64 * P2 * P4
7170: 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61   *.**.** P4 is a
7180: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 36 34   pointer to a 64
7190: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
71a0: 75 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 61  ue..** Write tha
71b0: 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67  t value into reg
71c0: 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73  ister P2..*/.cas
71d0: 65 20 4f 50 5f 49 6e 74 36 34 3a 20 7b 20 20 20  e OP_Int64: {   
71e0: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
71f0: 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
7200: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e  assert( pOp->p4.
7210: 70 49 36 34 21 3d 30 20 29 3b 0a 20 20 70 4f 75  pI64!=0 );.  pOu
7220: 74 2d 3e 75 2e 69 20 3d 20 2a 70 4f 70 2d 3e 70  t->u.i = *pOp->p
7230: 34 2e 70 49 36 34 3b 0a 20 20 62 72 65 61 6b 3b  4.pI64;.  break;
7240: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
7250: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
7260: 5f 50 4f 49 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65  _POINT./* Opcode
7270: 3a 20 52 65 61 6c 20 2a 20 50 32 20 2a 20 50 34  : Real * P2 * P4
7280: 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61   *.**.** P4 is a
7290: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 36 34   pointer to a 64
72a0: 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
72b0: 69 6e 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 57 72  int value..** Wr
72c0: 69 74 65 20 74 68 61 74 20 76 61 6c 75 65 20 69  ite that value i
72d0: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e  nto register P2.
72e0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61 6c  .*/.case OP_Real
72f0: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
7300: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 46 4c 4f  * same as TK_FLO
7310: 41 54 2c 20 6f 75 74 32 2d 70 72 65 72 65 6c 65  AT, out2-prerele
7320: 61 73 65 20 2a 2f 0a 20 20 70 4f 75 74 2d 3e 66  ase */.  pOut->f
7330: 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b  lags = MEM_Real;
7340: 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
7350: 74 65 33 49 73 4e 61 4e 28 2a 70 4f 70 2d 3e 70  te3IsNaN(*pOp->p
7360: 34 2e 70 52 65 61 6c 29 20 29 3b 0a 20 20 70 4f  4.pReal) );.  pO
7370: 75 74 2d 3e 72 20 3d 20 2a 70 4f 70 2d 3e 70 34  ut->r = *pOp->p4
7380: 2e 70 52 65 61 6c 3b 0a 20 20 62 72 65 61 6b 3b  .pReal;.  break;
7390: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70  .}.#endif../* Op
73a0: 63 6f 64 65 3a 20 53 74 72 69 6e 67 38 20 2a 20  code: String8 * 
73b0: 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  P2 * P4 *.**.** 
73c0: 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e  P4 points to a n
73d0: 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul terminated UT
73e0: 46 2d 38 20 73 74 72 69 6e 67 2e 20 54 68 69 73  F-8 string. This
73f0: 20 6f 70 63 6f 64 65 20 69 73 20 74 72 61 6e 73   opcode is trans
7400: 66 6f 72 6d 65 64 20 0a 2a 2a 20 69 6e 74 6f 20  formed .** into 
7410: 61 6e 20 4f 50 5f 53 74 72 69 6e 67 20 62 65 66  an OP_String bef
7420: 6f 72 65 20 69 74 20 69 73 20 65 78 65 63 75 74  ore it is execut
7430: 65 64 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ed for the first
7440: 20 74 69 6d 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f   time..*/.case O
7450: 50 5f 53 74 72 69 6e 67 38 3a 20 7b 20 20 20 20  P_String8: {    
7460: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
7470: 54 4b 5f 53 54 52 49 4e 47 2c 20 6f 75 74 32 2d  TK_STRING, out2-
7480: 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
7490: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e  assert( pOp->p4.
74a0: 7a 21 3d 30 20 29 3b 0a 20 20 70 4f 70 2d 3e 6f  z!=0 );.  pOp->o
74b0: 70 63 6f 64 65 20 3d 20 4f 50 5f 53 74 72 69 6e  pcode = OP_Strin
74c0: 67 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 73  g;.  pOp->p1 = s
74d0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
74e0: 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 0a 23 69 66 6e  Op->p4.z);..#ifn
74f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7500: 55 54 46 31 36 0a 20 20 69 66 28 20 65 6e 63 6f  UTF16.  if( enco
7510: 64 69 6e 67 21 3d 53 51 4c 49 54 45 5f 55 54 46  ding!=SQLITE_UTF
7520: 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  8 ){.    rc = sq
7530: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
7540: 74 72 28 70 4f 75 74 2c 20 70 4f 70 2d 3e 70 34  tr(pOut, pOp->p4
7550: 2e 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  .z, -1, SQLITE_U
7560: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
7570: 49 43 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  IC);.    if( rc=
7580: 3d 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 29  =SQLITE_TOOBIG )
7590: 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20   goto too_big;. 
75a0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
75b0: 21 3d 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  !=sqlite3VdbeCha
75c0: 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4f 75 74  ngeEncoding(pOut
75d0: 2c 20 65 6e 63 6f 64 69 6e 67 29 20 29 20 67 6f  , encoding) ) go
75e0: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 61  to no_mem;.    a
75f0: 73 73 65 72 74 28 20 70 4f 75 74 2d 3e 7a 4d 61  ssert( pOut->zMa
7600: 6c 6c 6f 63 3d 3d 70 4f 75 74 2d 3e 7a 20 29 3b  lloc==pOut->z );
7610: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 75  .    assert( pOu
7620: 74 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  t->flags & MEM_D
7630: 79 6e 20 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  yn );.    pOut->
7640: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
7650: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20   pOut->flags |= 
7660: 4d 45 4d 5f 53 74 61 74 69 63 3b 0a 20 20 20 20  MEM_Static;.    
7670: 70 4f 75 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pOut->flags &= ~
7680: 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20 20 69 66 28  MEM_Dyn;.    if(
7690: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
76a0: 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20  _DYNAMIC ){.    
76b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
76c0: 64 62 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  db, pOp->p4.z);.
76d0: 20 20 20 20 7d 0a 20 20 20 20 70 4f 70 2d 3e 70      }.    pOp->p
76e0: 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d  4type = P4_DYNAM
76f0: 49 43 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e  IC;.    pOp->p4.
7700: 7a 20 3d 20 70 4f 75 74 2d 3e 7a 3b 0a 20 20 20  z = pOut->z;.   
7710: 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 75 74 2d   pOp->p1 = pOut-
7720: 3e 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  >n;.  }.#endif. 
7730: 20 69 66 28 20 70 4f 70 2d 3e 70 31 3e 64 62 2d   if( pOp->p1>db-
7740: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7750: 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a  IMIT_LENGTH] ){.
7760: 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67      goto too_big
7770: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 61 6c 6c 20  ;.  }.  /* Fall 
7780: 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
7790: 65 78 74 20 63 61 73 65 2c 20 4f 50 5f 53 74 72  ext case, OP_Str
77a0: 69 6e 67 20 2a 2f 0a 7d 0a 20 20 0a 2f 2a 20 4f  ing */.}.  ./* O
77b0: 70 63 6f 64 65 3a 20 53 74 72 69 6e 67 20 50 31  pcode: String P1
77c0: 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a   P2 * P4 *.**.**
77d0: 20 54 68 65 20 73 74 72 69 6e 67 20 76 61 6c 75   The string valu
77e0: 65 20 50 34 20 6f 66 20 6c 65 6e 67 74 68 20 50  e P4 of length P
77f0: 31 20 28 62 79 74 65 73 29 20 69 73 20 73 74 6f  1 (bytes) is sto
7800: 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
7810: 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  P2..*/.case OP_S
7820: 74 72 69 6e 67 3a 20 7b 20 20 20 20 20 20 20 20  tring: {        
7830: 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c    /* out2-prerel
7840: 65 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ease */.  assert
7850: 28 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  ( pOp->p4.z!=0 )
7860: 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20  ;.  pOut->flags 
7870: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74  = MEM_Str|MEM_St
7880: 61 74 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  atic|MEM_Term;. 
7890: 20 70 4f 75 74 2d 3e 7a 20 3d 20 70 4f 70 2d 3e   pOut->z = pOp->
78a0: 70 34 2e 7a 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20  p4.z;.  pOut->n 
78b0: 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 4f 75  = pOp->p1;.  pOu
78c0: 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e  t->enc = encodin
78d0: 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  g;.  UPDATE_MAX_
78e0: 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a  BLOBSIZE(pOut);.
78f0: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
7900: 70 63 6f 64 65 3a 20 4e 75 6c 6c 20 50 31 20 50  pcode: Null P1 P
7910: 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57  2 P3 * *.**.** W
7920: 72 69 74 65 20 61 20 4e 55 4c 4c 20 69 6e 74 6f  rite a NULL into
7930: 20 72 65 67 69 73 74 65 72 73 20 50 32 2e 20 20   registers P2.  
7940: 49 66 20 50 33 20 67 72 65 61 74 65 72 20 74 68  If P3 greater th
7950: 61 6e 20 50 32 2c 20 74 68 65 6e 20 61 6c 73 6f  an P2, then also
7960: 20 77 72 69 74 65 0a 2a 2a 20 4e 55 4c 4c 20 69   write.** NULL i
7970: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 33 20  nto register P3 
7980: 61 6e 64 20 65 76 65 72 79 20 72 65 67 69 73 74  and every regist
7990: 65 72 20 69 6e 20 62 65 74 77 65 65 6e 20 50 32  er in between P2
79a0: 20 61 6e 64 20 50 33 2e 20 20 49 66 20 50 33 0a   and P3.  If P3.
79b0: 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
79c0: 50 32 20 28 74 79 70 69 63 61 6c 6c 79 20 50 33  P2 (typically P3
79d0: 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 20 6f   is zero) then o
79e0: 6e 6c 79 20 72 65 67 69 73 74 65 72 20 50 32 20  nly register P2 
79f0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 4e 55 4c  is.** set to NUL
7a00: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  L..**.** If the 
7a10: 50 31 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  P1 value is non-
7a20: 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6c 73 6f 20  zero, then also 
7a30: 73 65 74 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61  set the MEM_Clea
7a40: 72 65 64 20 66 6c 61 67 20 73 6f 20 74 68 61 74  red flag so that
7a50: 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  .** NULL values 
7a60: 77 69 6c 6c 20 6e 6f 74 20 63 6f 6d 70 61 72 65  will not compare
7a70: 20 65 71 75 61 6c 20 65 76 65 6e 20 69 66 20 53   equal even if S
7a80: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20  QLITE_NULLEQ is 
7a90: 73 65 74 20 6f 6e 0a 2a 2a 20 4f 50 5f 4e 65 20  set on.** OP_Ne 
7aa0: 6f 72 20 4f 50 5f 45 71 2e 0a 2a 2f 0a 63 61 73  or OP_Eq..*/.cas
7ab0: 65 20 4f 50 5f 4e 75 6c 6c 3a 20 7b 20 20 20 20  e OP_Null: {    
7ac0: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70         /* out2-p
7ad0: 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  rerelease */.  i
7ae0: 6e 74 20 63 6e 74 3b 0a 20 20 75 31 36 20 6e 75  nt cnt;.  u16 nu
7af0: 6c 6c 46 6c 61 67 3b 0a 20 20 63 6e 74 20 3d 20  llFlag;.  cnt = 
7b00: 70 4f 70 2d 3e 70 33 2d 70 4f 70 2d 3e 70 32 3b  pOp->p3-pOp->p2;
7b10: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
7b20: 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  p3<=p->nMem );. 
7b30: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 6e   pOut->flags = n
7b40: 75 6c 6c 46 6c 61 67 20 3d 20 70 4f 70 2d 3e 70  ullFlag = pOp->p
7b50: 31 20 3f 20 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45  1 ? (MEM_Null|ME
7b60: 4d 5f 43 6c 65 61 72 65 64 29 20 3a 20 4d 45 4d  M_Cleared) : MEM
7b70: 5f 4e 75 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20  _Null;.  while( 
7b80: 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 70 4f 75  cnt>0 ){.    pOu
7b90: 74 2b 2b 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75  t++;.    memAbou
7ba0: 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75  tToChange(p, pOu
7bb0: 74 29 3b 0a 20 20 20 20 56 64 62 65 4d 65 6d 52  t);.    VdbeMemR
7bc0: 65 6c 65 61 73 65 28 70 4f 75 74 29 3b 0a 20 20  elease(pOut);.  
7bd0: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
7be0: 6e 75 6c 6c 46 6c 61 67 3b 0a 20 20 20 20 63 6e  nullFlag;.    cn
7bf0: 74 2d 2d 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  t--;.  }.  break
7c00: 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ;.}.../* Opcode:
7c10: 20 42 6c 6f 62 20 50 31 20 50 32 20 2a 20 50 34   Blob P1 P2 * P4
7c20: 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74 73  .**.** P4 points
7c30: 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 64 61   to a blob of da
7c40: 74 61 20 50 31 20 62 79 74 65 73 20 6c 6f 6e 67  ta P1 bytes long
7c50: 2e 20 20 53 74 6f 72 65 20 74 68 69 73 0a 2a 2a  .  Store this.**
7c60: 20 62 6c 6f 62 20 69 6e 20 72 65 67 69 73 74 65   blob in registe
7c70: 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  r P2..*/.case OP
7c80: 5f 42 6c 6f 62 3a 20 7b 20 20 20 20 20 20 20 20  _Blob: {        
7c90: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
7ca0: 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
7cb0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 20  assert( pOp->p1 
7cc0: 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  <= SQLITE_MAX_LE
7cd0: 4e 47 54 48 20 29 3b 0a 20 20 73 71 6c 69 74 65  NGTH );.  sqlite
7ce0: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
7cf0: 4f 75 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20  Out, pOp->p4.z, 
7d00: 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 30 29 3b 0a  pOp->p1, 0, 0);.
7d10: 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e    pOut->enc = en
7d20: 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41 54 45  coding;.  UPDATE
7d30: 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f  _MAX_BLOBSIZE(pO
7d40: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
7d50: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 61 72 69  ./* Opcode: Vari
7d60: 61 62 6c 65 20 50 31 20 50 32 20 2a 20 50 34 20  able P1 P2 * P4 
7d70: 2a 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  *.**.** Transfer
7d80: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 62   the values of b
7d90: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 50  ound parameter P
7da0: 31 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  1 into register 
7db0: 50 32 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  P2.**.** If the 
7dc0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 61 6d  parameter is nam
7dd0: 65 64 2c 20 74 68 65 6e 20 69 74 73 20 6e 61 6d  ed, then its nam
7de0: 65 20 61 70 70 65 61 72 73 20 69 6e 20 50 34 20  e appears in P4 
7df0: 61 6e 64 20 50 33 3d 3d 31 2e 0a 2a 2a 20 54 68  and P3==1..** Th
7e00: 65 20 50 34 20 76 61 6c 75 65 20 69 73 20 75 73  e P4 value is us
7e10: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 62 69  ed by sqlite3_bi
7e20: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
7e30: 65 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  e()..*/.case OP_
7e40: 56 61 72 69 61 62 6c 65 3a 20 7b 20 20 20 20 20  Variable: {     
7e50: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70         /* out2-p
7e60: 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 4d  rerelease */.  M
7e70: 65 6d 20 2a 70 56 61 72 3b 20 20 20 20 20 20 20  em *pVar;       
7e80: 2f 2a 20 56 61 6c 75 65 20 62 65 69 6e 67 20 74  /* Value being t
7e90: 72 61 6e 73 66 65 72 72 65 64 20 2a 2f 0a 0a 20  ransferred */.. 
7ea0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
7eb0: 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 70  >0 && pOp->p1<=p
7ec0: 2d 3e 6e 56 61 72 20 29 3b 0a 20 20 61 73 73 65  ->nVar );.  asse
7ed0: 72 74 28 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 30  rt( pOp->p4.z==0
7ee0: 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 70   || pOp->p4.z==p
7ef0: 2d 3e 61 7a 56 61 72 5b 70 4f 70 2d 3e 70 31 2d  ->azVar[pOp->p1-
7f00: 31 5d 20 29 3b 0a 20 20 70 56 61 72 20 3d 20 26  1] );.  pVar = &
7f10: 70 2d 3e 61 56 61 72 5b 70 4f 70 2d 3e 70 31 20  p->aVar[pOp->p1 
7f20: 2d 20 31 5d 3b 0a 20 20 69 66 28 20 73 71 6c 69  - 1];.  if( sqli
7f30: 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67  te3VdbeMemTooBig
7f40: 28 70 56 61 72 29 20 29 7b 0a 20 20 20 20 67 6f  (pVar) ){.    go
7f50: 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a  to too_big;.  }.
7f60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
7f70: 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74  ShallowCopy(pOut
7f80: 2c 20 70 56 61 72 2c 20 4d 45 4d 5f 53 74 61 74  , pVar, MEM_Stat
7f90: 69 63 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  ic);.  UPDATE_MA
7fa0: 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29  X_BLOBSIZE(pOut)
7fb0: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
7fc0: 20 4f 70 63 6f 64 65 3a 20 4d 6f 76 65 20 50 31   Opcode: Move P1
7fd0: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
7fe0: 20 4d 6f 76 65 20 74 68 65 20 76 61 6c 75 65 73   Move the values
7ff0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
8000: 2e 50 31 2b 50 33 20 6f 76 65 72 20 69 6e 74 6f  .P1+P3 over into
8010: 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 50 32  .** registers P2
8020: 2e 2e 50 32 2b 50 33 2e 20 20 52 65 67 69 73 74  ..P2+P3.  Regist
8030: 65 72 73 20 50 31 2e 2e 50 31 2b 50 33 20 61 72  ers P1..P1+P3 ar
8040: 65 0a 2a 2a 20 6c 65 66 74 20 68 6f 6c 64 69 6e  e.** left holdin
8050: 67 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73  g a NULL.  It is
8060: 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 72 65   an error for re
8070: 67 69 73 74 65 72 20 72 61 6e 67 65 73 0a 2a 2a  gister ranges.**
8080: 20 50 31 2e 2e 50 31 2b 50 33 20 61 6e 64 20 50   P1..P1+P3 and P
8090: 32 2e 2e 50 32 2b 50 33 20 74 6f 20 6f 76 65 72  2..P2+P3 to over
80a0: 6c 61 70 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  lap..*/.case OP_
80b0: 4d 6f 76 65 3a 20 7b 0a 20 20 63 68 61 72 20 2a  Move: {.  char *
80c0: 7a 4d 61 6c 6c 6f 63 3b 20 20 20 2f 2a 20 48 6f  zMalloc;   /* Ho
80d0: 6c 64 69 6e 67 20 76 61 72 69 61 62 6c 65 20 66  lding variable f
80e0: 6f 72 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  or allocated mem
80f0: 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ory */.  int n; 
8100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8110: 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73  ber of registers
8120: 20 6c 65 66 74 20 74 6f 20 63 6f 70 79 20 2a 2f   left to copy */
8130: 0a 20 20 69 6e 74 20 70 31 3b 20 20 20 20 20 20  .  int p1;      
8140: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
8150: 74 6f 20 63 6f 70 79 20 66 72 6f 6d 20 2a 2f 0a  to copy from */.
8160: 20 20 69 6e 74 20 70 32 3b 20 20 20 20 20 20 20    int p2;       
8170: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
8180: 6f 20 63 6f 70 79 20 74 6f 20 2a 2f 0a 0a 20 20  o copy to */..  
8190: 6e 20 3d 20 70 4f 70 2d 3e 70 33 20 2b 20 31 3b  n = pOp->p3 + 1;
81a0: 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b  .  p1 = pOp->p1;
81b0: 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b  .  p2 = pOp->p2;
81c0: 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 26  .  assert( n>0 &
81d0: 26 20 70 31 3e 30 20 26 26 20 70 32 3e 30 20 29  & p1>0 && p2>0 )
81e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 2b 6e  ;.  assert( p1+n
81f0: 3c 3d 70 32 20 7c 7c 20 70 32 2b 6e 3c 3d 70 31  <=p2 || p2+n<=p1
8200: 20 29 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61   );..  pIn1 = &a
8210: 4d 65 6d 5b 70 31 5d 3b 0a 20 20 70 4f 75 74 20  Mem[p1];.  pOut 
8220: 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20 77  = &aMem[p2];.  w
8230: 68 69 6c 65 28 20 6e 2d 2d 20 29 7b 0a 20 20 20  hile( n-- ){.   
8240: 20 61 73 73 65 72 74 28 20 70 4f 75 74 3c 3d 26   assert( pOut<=&
8250: 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 5d 20 29 3b  aMem[p->nMem] );
8260: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
8270: 31 3c 3d 26 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d  1<=&aMem[p->nMem
8280: 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ] );.    assert(
8290: 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e 31   memIsValid(pIn1
82a0: 29 20 29 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75  ) );.    memAbou
82b0: 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75  tToChange(p, pOu
82c0: 74 29 3b 0a 20 20 20 20 7a 4d 61 6c 6c 6f 63 20  t);.    zMalloc 
82d0: 3d 20 70 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 3b  = pOut->zMalloc;
82e0: 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 4d 61 6c 6c  .    pOut->zMall
82f0: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  oc = 0;.    sqli
8300: 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 70  te3VdbeMemMove(p
8310: 4f 75 74 2c 20 70 49 6e 31 29 3b 0a 23 69 66 64  Out, pIn1);.#ifd
8320: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8330: 20 20 20 20 69 66 28 20 70 4f 75 74 2d 3e 70 53      if( pOut->pS
8340: 63 6f 70 79 46 72 6f 6d 3e 3d 26 61 4d 65 6d 5b  copyFrom>=&aMem[
8350: 70 31 5d 20 26 26 20 70 4f 75 74 2d 3e 70 53 63  p1] && pOut->pSc
8360: 6f 70 79 46 72 6f 6d 3c 26 61 4d 65 6d 5b 70 31  opyFrom<&aMem[p1
8370: 2b 70 4f 70 2d 3e 70 33 5d 20 29 7b 0a 20 20 20  +pOp->p3] ){.   
8380: 20 20 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46     pOut->pScopyF
8390: 72 6f 6d 20 2b 3d 20 70 31 20 2d 20 70 4f 70 2d  rom += p1 - pOp-
83a0: 3e 70 32 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  >p2;.    }.#endi
83b0: 66 0a 20 20 20 20 70 49 6e 31 2d 3e 7a 4d 61 6c  f.    pIn1->zMal
83c0: 6c 6f 63 20 3d 20 7a 4d 61 6c 6c 6f 63 3b 0a 20  loc = zMalloc;. 
83d0: 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
83e0: 45 28 70 32 2b 2b 2c 20 70 4f 75 74 29 3b 0a 20  E(p2++, pOut);. 
83f0: 20 20 20 70 49 6e 31 2b 2b 3b 0a 20 20 20 20 70     pIn1++;.    p
8400: 4f 75 74 2b 2b 3b 0a 20 20 7d 0a 20 20 62 72 65  Out++;.  }.  bre
8410: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
8420: 3a 20 43 6f 70 79 20 50 31 20 50 32 20 50 33 20  : Copy P1 P2 P3 
8430: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 61  * *.**.** Make a
8440: 20 63 6f 70 79 20 6f 66 20 72 65 67 69 73 74 65   copy of registe
8450: 72 73 20 50 31 2e 2e 50 31 2b 50 33 20 69 6e 74  rs P1..P1+P3 int
8460: 6f 20 72 65 67 69 73 74 65 72 73 20 50 32 2e 2e  o registers P2..
8470: 50 32 2b 50 33 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  P2+P3..**.** Thi
8480: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6d 61  s instruction ma
8490: 6b 65 73 20 61 20 64 65 65 70 20 63 6f 70 79 20  kes a deep copy 
84a0: 6f 66 20 74 68 65 20 76 61 6c 75 65 2e 20 20 41  of the value.  A
84b0: 20 64 75 70 6c 69 63 61 74 65 0a 2a 2a 20 69 73   duplicate.** is
84c0: 20 6d 61 64 65 20 6f 66 20 61 6e 79 20 73 74 72   made of any str
84d0: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 63 6f 6e 73  ing or blob cons
84e0: 74 61 6e 74 2e 20 20 53 65 65 20 61 6c 73 6f 20  tant.  See also 
84f0: 4f 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 63 61 73  OP_SCopy..*/.cas
8500: 65 20 4f 50 5f 43 6f 70 79 3a 20 7b 0a 20 20 69  e OP_Copy: {.  i
8510: 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70 4f 70  nt n;..  n = pOp
8520: 2d 3e 70 33 3b 0a 20 20 70 49 6e 31 20 3d 20 26  ->p3;.  pIn1 = &
8530: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
8540: 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
8550: 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74  p->p2];.  assert
8560: 28 20 70 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a  ( pOut!=pIn1 );.
8570: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
8580: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
8590: 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74  ShallowCopy(pOut
85a0: 2c 20 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65  , pIn1, MEM_Ephe
85b0: 6d 29 3b 0a 20 20 20 20 44 65 65 70 68 65 6d 65  m);.    Deepheme
85c0: 72 61 6c 69 7a 65 28 70 4f 75 74 29 3b 0a 23 69  ralize(pOut);.#i
85d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
85e0: 47 0a 20 20 20 20 70 4f 75 74 2d 3e 70 53 63 6f  G.    pOut->pSco
85f0: 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64  pyFrom = 0;.#end
8600: 69 66 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  if.    REGISTER_
8610: 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2b 70 4f  TRACE(pOp->p2+pO
8620: 70 2d 3e 70 33 2d 6e 2c 20 70 4f 75 74 29 3b 0a  p->p3-n, pOut);.
8630: 20 20 20 20 69 66 28 20 28 6e 2d 2d 29 3d 3d 30      if( (n--)==0
8640: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4f   ) break;.    pO
8650: 75 74 2b 2b 3b 0a 20 20 20 20 70 49 6e 31 2b 2b  ut++;.    pIn1++
8660: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
8670: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 43 6f  ../* Opcode: SCo
8680: 70 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  py P1 P2 * * *.*
8690: 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 73 68 61 6c  *.** Make a shal
86a0: 6c 6f 77 20 63 6f 70 79 20 6f 66 20 72 65 67 69  low copy of regi
86b0: 73 74 65 72 20 50 31 20 69 6e 74 6f 20 72 65 67  ster P1 into reg
86c0: 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  ister P2..**.** 
86d0: 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  This instruction
86e0: 20 6d 61 6b 65 73 20 61 20 73 68 61 6c 6c 6f 77   makes a shallow
86f0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 76 61 6c   copy of the val
8700: 75 65 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75  ue.  If the valu
8710: 65 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67  e.** is a string
8720: 20 6f 72 20 62 6c 6f 62 2c 20 74 68 65 6e 20 74   or blob, then t
8730: 68 65 20 63 6f 70 79 20 69 73 20 6f 6e 6c 79 20  he copy is only 
8740: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
8750: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 61 6e 64  .** original and
8760: 20 68 65 6e 63 65 20 69 66 20 74 68 65 20 6f 72   hence if the or
8770: 69 67 69 6e 61 6c 20 63 68 61 6e 67 65 73 20 73  iginal changes s
8780: 6f 20 77 69 6c 6c 20 74 68 65 20 63 6f 70 79 2e  o will the copy.
8790: 0a 2a 2a 20 57 6f 72 73 65 2c 20 69 66 20 74 68  .** Worse, if th
87a0: 65 20 6f 72 69 67 69 6e 61 6c 20 69 73 20 64 65  e original is de
87b0: 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 20 63  allocated, the c
87c0: 6f 70 79 20 62 65 63 6f 6d 65 73 20 69 6e 76 61  opy becomes inva
87d0: 6c 69 64 2e 0a 2a 2a 20 54 68 75 73 20 74 68 65  lid..** Thus the
87e0: 20 70 72 6f 67 72 61 6d 20 6d 75 73 74 20 67 75   program must gu
87f0: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
8800: 20 6f 72 69 67 69 6e 61 6c 20 77 69 6c 6c 20 6e   original will n
8810: 6f 74 20 63 68 61 6e 67 65 0a 2a 2a 20 64 75 72  ot change.** dur
8820: 69 6e 67 20 74 68 65 20 6c 69 66 65 74 69 6d 65  ing the lifetime
8830: 20 6f 66 20 74 68 65 20 63 6f 70 79 2e 20 20 55   of the copy.  U
8840: 73 65 20 4f 50 5f 43 6f 70 79 20 74 6f 20 6d 61  se OP_Copy to ma
8850: 6b 65 20 61 20 63 6f 6d 70 6c 65 74 65 0a 2a 2a  ke a complete.**
8860: 20 63 6f 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f   copy..*/.case O
8870: 50 5f 53 43 6f 70 79 3a 20 7b 20 20 20 20 20 20  P_SCopy: {      
8880: 20 20 20 20 20 20 2f 2a 20 69 6e 31 2c 20 6f 75        /* in1, ou
8890: 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  t2 */.  pIn1 = &
88a0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
88b0: 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
88c0: 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74  p->p2];.  assert
88d0: 28 20 70 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a  ( pOut!=pIn1 );.
88e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
88f0: 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74  ShallowCopy(pOut
8900: 2c 20 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65  , pIn1, MEM_Ephe
8910: 6d 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m);.#ifdef SQLIT
8920: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 4f  E_DEBUG.  if( pO
8930: 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3d 3d  ut->pScopyFrom==
8940: 30 20 29 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79  0 ) pOut->pScopy
8950: 46 72 6f 6d 20 3d 20 70 49 6e 31 3b 0a 23 65 6e  From = pIn1;.#en
8960: 64 69 66 0a 20 20 52 45 47 49 53 54 45 52 5f 54  dif.  REGISTER_T
8970: 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f  RACE(pOp->p2, pO
8980: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
8990: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 75  ./* Opcode: Resu
89a0: 6c 74 52 6f 77 20 50 31 20 50 32 20 2a 20 2a 20  ltRow P1 P2 * * 
89b0: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69  *.**.** The regi
89c0: 73 74 65 72 73 20 50 31 20 74 68 72 6f 75 67 68  sters P1 through
89d0: 20 50 31 2b 50 32 2d 31 20 63 6f 6e 74 61 69 6e   P1+P2-1 contain
89e0: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
89f0: 0a 2a 2a 20 72 65 73 75 6c 74 73 2e 20 54 68 69  .** results. Thi
8a00: 73 20 6f 70 63 6f 64 65 20 63 61 75 73 65 73 20  s opcode causes 
8a10: 74 68 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  the sqlite3_step
8a20: 28 29 20 63 61 6c 6c 20 74 6f 20 74 65 72 6d 69  () call to termi
8a30: 6e 61 74 65 0a 2a 2a 20 77 69 74 68 20 61 6e 20  nate.** with an 
8a40: 53 51 4c 49 54 45 5f 52 4f 57 20 72 65 74 75 72  SQLITE_ROW retur
8a50: 6e 20 63 6f 64 65 20 61 6e 64 20 69 74 20 73 65  n code and it se
8a60: 74 73 20 75 70 20 74 68 65 20 73 71 6c 69 74 65  ts up the sqlite
8a70: 33 5f 73 74 6d 74 0a 2a 2a 20 73 74 72 75 63 74  3_stmt.** struct
8a80: 75 72 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61  ure to provide a
8a90: 63 63 65 73 73 20 74 6f 20 74 68 65 20 74 6f 70  ccess to the top
8aa0: 20 50 31 20 76 61 6c 75 65 73 20 61 73 20 74 68   P1 values as th
8ab0: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 6f 77 2e  e result.** row.
8ac0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 75  .*/.case OP_Resu
8ad0: 6c 74 52 6f 77 3a 20 7b 0a 20 20 4d 65 6d 20 2a  ltRow: {.  Mem *
8ae0: 70 4d 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pMem;.  int i;. 
8af0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 73   assert( p->nRes
8b00: 43 6f 6c 75 6d 6e 3d 3d 70 4f 70 2d 3e 70 32 20  Column==pOp->p2 
8b10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
8b20: 2d 3e 70 31 3e 30 20 29 3b 0a 20 20 61 73 73 65  ->p1>0 );.  asse
8b30: 72 74 28 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d  rt( pOp->p1+pOp-
8b40: 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29  >p2<=p->nMem+1 )
8b50: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
8b60: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 76 69  statement has vi
8b70: 6f 6c 61 74 65 64 20 69 6d 6d 65 64 69 61 74 65  olated immediate
8b80: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
8b90: 73 74 72 61 69 6e 74 73 2c 20 64 6f 0a 20 20 2a  straints, do.  *
8ba0: 2a 20 6e 6f 74 20 72 65 74 75 72 6e 20 74 68 65  * not return the
8bb0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
8bc0: 6d 6f 64 69 66 69 65 64 2e 20 41 6e 64 20 64 6f  modified. And do
8bd0: 20 6e 6f 74 20 52 45 4c 45 41 53 45 20 74 68 65   not RELEASE the
8be0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
8bf0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20  transaction. It 
8c00: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
8c10: 65 64 20 62 61 63 6b 2e 20 20 2a 2f 0a 20 20 69  ed back.  */.  i
8c20: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
8c30: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
8c40: 68 65 63 6b 46 6b 28 70 2c 20 30 29 29 20 29 7b  heckFk(p, 0)) ){
8c50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
8c60: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6f  >flags&SQLITE_Co
8c70: 75 6e 74 52 6f 77 73 20 29 3b 0a 20 20 20 20 61  untRows );.    a
8c80: 73 73 65 72 74 28 20 70 2d 3e 75 73 65 73 53 74  ssert( p->usesSt
8c90: 6d 74 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  mtJournal );.   
8ca0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
8cb0: 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
8cc0: 43 6f 75 6e 74 52 6f 77 73 20 66 6c 61 67 20 69  CountRows flag i
8cd0: 73 20 73 65 74 20 69 6e 20 73 71 6c 69 74 65 33  s set in sqlite3
8ce0: 2e 66 6c 61 67 73 20 6d 61 73 6b 2c 20 74 68 65  .flags mask, the
8cf0: 6e 20 0a 20 20 2a 2a 20 44 4d 4c 20 73 74 61 74  n .  ** DML stat
8d00: 65 6d 65 6e 74 73 20 69 6e 76 6f 6b 65 20 74 68  ements invoke th
8d10: 69 73 20 6f 70 63 6f 64 65 20 74 6f 20 72 65 74  is opcode to ret
8d20: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
8d30: 66 20 72 6f 77 73 20 0a 20 20 2a 2a 20 6d 6f 64  f rows .  ** mod
8d40: 69 66 69 65 64 20 74 6f 20 74 68 65 20 75 73 65  ified to the use
8d50: 72 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 6f  r. This is the o
8d60: 6e 6c 79 20 77 61 79 20 74 68 61 74 20 61 20 56  nly way that a V
8d70: 4d 20 74 68 61 74 0a 20 20 2a 2a 20 6f 70 65 6e  M that.  ** open
8d80: 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  s a statement tr
8d90: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 69 6e  ansaction may in
8da0: 76 6f 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65  voke this opcode
8db0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63  ..  **.  ** In c
8dc0: 61 73 65 20 74 68 69 73 20 69 73 20 73 75 63 68  ase this is such
8dd0: 20 61 20 73 74 61 74 65 6d 65 6e 74 2c 20 63 6c   a statement, cl
8de0: 6f 73 65 20 61 6e 79 20 73 74 61 74 65 6d 65 6e  ose any statemen
8df0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  t transaction.  
8e00: 2a 2a 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69  ** opened by thi
8e10: 73 20 56 4d 20 62 65 66 6f 72 65 20 72 65 74 75  s VM before retu
8e20: 72 6e 69 6e 67 20 63 6f 6e 74 72 6f 6c 20 74 6f  rning control to
8e30: 20 74 68 65 20 75 73 65 72 2e 20 54 68 69 73 20   the user. This 
8e40: 69 73 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72  is to.  ** ensur
8e50: 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
8e60: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  -transactions ar
8e70: 65 20 61 6c 77 61 79 73 20 6e 65 73 74 65 64 2c  e always nested,
8e80: 20 6e 6f 74 20 6f 76 65 72 6c 61 70 70 69 6e 67   not overlapping
8e90: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70  ..  ** If the op
8ea0: 65 6e 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  en statement-tra
8eb0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20  nsaction is not 
8ec0: 63 6c 6f 73 65 64 20 68 65 72 65 2c 20 74 68 65  closed here, the
8ed0: 6e 20 74 68 65 20 75 73 65 72 0a 20 20 2a 2a 20  n the user.  ** 
8ee0: 6d 61 79 20 73 74 65 70 20 61 6e 6f 74 68 65 72  may step another
8ef0: 20 56 4d 20 74 68 61 74 20 6f 70 65 6e 73 20 69   VM that opens i
8f00: 74 73 20 6f 77 6e 20 73 74 61 74 65 6d 65 6e 74  ts own statement
8f10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
8f20: 69 73 0a 20 20 2a 2a 20 6d 61 79 20 6c 65 61 64  is.  ** may lead
8f30: 20 74 6f 20 6f 76 65 72 6c 61 70 70 69 6e 67 20   to overlapping 
8f40: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
8f50: 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ctions..  **.  *
8f60: 2a 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * The statement 
8f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
8f80: 65 76 65 72 20 61 20 74 6f 70 2d 6c 65 76 65 6c  ever a top-level
8f90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 48   transaction.  H
8fa0: 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 52 45  ence.  ** the RE
8fb0: 4c 45 41 53 45 20 63 61 6c 6c 20 62 65 6c 6f 77  LEASE call below
8fc0: 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e   can never fail.
8fd0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
8fe0: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30  p->iStatement==0
8ff0: 20 7c 7c 20 64 62 2d 3e 66 6c 61 67 73 26 53 51   || db->flags&SQ
9000: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29  LITE_CountRows )
9010: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
9020: 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
9030: 6e 74 28 70 2c 20 53 41 56 45 50 4f 49 4e 54 5f  nt(p, SAVEPOINT_
9040: 52 45 4c 45 41 53 45 29 3b 0a 20 20 69 66 28 20  RELEASE);.  if( 
9050: 4e 45 56 45 52 28 72 63 21 3d 53 51 4c 49 54 45  NEVER(rc!=SQLITE
9060: 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 62 72 65 61  _OK) ){.    brea
9070: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 76  k;.  }..  /* Inv
9080: 61 6c 69 64 61 74 65 20 61 6c 6c 20 65 70 68 65  alidate all ephe
9090: 6d 65 72 61 6c 20 63 75 72 73 6f 72 20 72 6f 77  meral cursor row
90a0: 20 63 61 63 68 65 73 20 2a 2f 0a 20 20 70 2d 3e   caches */.  p->
90b0: 63 61 63 68 65 43 74 72 20 3d 20 28 70 2d 3e 63  cacheCtr = (p->c
90c0: 61 63 68 65 43 74 72 20 2b 20 32 29 7c 31 3b 0a  acheCtr + 2)|1;.
90d0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
90e0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
90f0: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 61  he current row a
9100: 72 65 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  re \000 terminat
9110: 65 64 0a 20 20 2a 2a 20 61 6e 64 20 68 61 76 65  ed.  ** and have
9120: 20 61 6e 20 61 73 73 69 67 6e 65 64 20 74 79 70   an assigned typ
9130: 65 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  e.  The results 
9140: 61 72 65 20 64 65 2d 65 70 68 65 6d 65 72 61 6c  are de-ephemeral
9150: 69 7a 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 73  ized as.  ** a s
9160: 69 64 65 20 65 66 66 65 63 74 2e 0a 20 20 2a 2f  ide effect..  */
9170: 0a 20 20 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65  .  pMem = p->pRe
9180: 73 75 6c 74 53 65 74 20 3d 20 26 61 4d 65 6d 5b  sultSet = &aMem[
9190: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 66 6f 72 28  pOp->p1];.  for(
91a0: 69 3d 30 3b 20 69 3c 70 4f 70 2d 3e 70 32 3b 20  i=0; i<pOp->p2; 
91b0: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
91c0: 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 70 4d  ( memIsValid(&pM
91d0: 65 6d 5b 69 5d 29 20 29 3b 0a 20 20 20 20 44 65  em[i]) );.    De
91e0: 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 26 70 4d  ephemeralize(&pM
91f0: 65 6d 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65  em[i]);.    asse
9200: 72 74 28 20 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61  rt( (pMem[i].fla
9210: 67 73 20 26 20 4d 45 4d 5f 45 70 68 65 6d 29 3d  gs & MEM_Ephem)=
9220: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =0.            |
9230: 7c 20 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73  | (pMem[i].flags
9240: 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f   & (MEM_Str|MEM_
9250: 42 6c 6f 62 29 29 3d 3d 30 20 29 3b 0a 20 20 20  Blob))==0 );.   
9260: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e   sqlite3VdbeMemN
9270: 75 6c 54 65 72 6d 69 6e 61 74 65 28 26 70 4d 65  ulTerminate(&pMe
9280: 6d 5b 69 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74  m[i]);.    sqlit
9290: 65 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79  e3VdbeMemStoreTy
92a0: 70 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20  pe(&pMem[i]);.  
92b0: 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
92c0: 28 70 4f 70 2d 3e 70 31 2b 69 2c 20 26 70 4d 65  (pOp->p1+i, &pMe
92d0: 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  m[i]);.  }.  if(
92e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
92f0: 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  d ) goto no_mem;
9300: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 53 51  ..  /* Return SQ
9310: 4c 49 54 45 5f 52 4f 57 0a 20 20 2a 2f 0a 20 20  LITE_ROW.  */.  
9320: 70 2d 3e 70 63 20 3d 20 70 63 20 2b 20 31 3b 0a  p->pc = pc + 1;.
9330: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
9340: 57 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 72  W;.  goto vdbe_r
9350: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  eturn;.}../* Opc
9360: 6f 64 65 3a 20 43 6f 6e 63 61 74 20 50 31 20 50  ode: Concat P1 P
9370: 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41  2 P3 * *.**.** A
9380: 64 64 20 74 68 65 20 74 65 78 74 20 69 6e 20 72  dd the text in r
9390: 65 67 69 73 74 65 72 20 50 31 20 6f 6e 74 6f 20  egister P1 onto 
93a0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74  the end of the t
93b0: 65 78 74 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74  ext in.** regist
93c0: 65 72 20 50 32 20 61 6e 64 20 73 74 6f 72 65 20  er P2 and store 
93d0: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65  the result in re
93e0: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66  gister P3..** If
93f0: 20 65 69 74 68 65 72 20 74 68 65 20 50 31 20 6f   either the P1 o
9400: 72 20 50 32 20 74 65 78 74 20 61 72 65 20 4e 55  r P2 text are NU
9410: 4c 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 4e 55  LL then store NU
9420: 4c 4c 20 69 6e 20 50 33 2e 0a 2a 2a 0a 2a 2a 20  LL in P3..**.** 
9430: 20 20 50 33 20 3d 20 50 32 20 7c 7c 20 50 31 0a    P3 = P2 || P1.
9440: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  **.** It is ille
9450: 67 61 6c 20 66 6f 72 20 50 31 20 61 6e 64 20 50  gal for P1 and P
9460: 33 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  3 to be the same
9470: 20 72 65 67 69 73 74 65 72 2e 20 53 6f 6d 65 74   register. Somet
9480: 69 6d 65 73 2c 0a 2a 2a 20 69 66 20 50 33 20 69  imes,.** if P3 i
9490: 73 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73  s the same regis
94a0: 74 65 72 20 61 73 20 50 32 2c 20 74 68 65 20 69  ter as P2, the i
94b0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
94c0: 20 61 62 6c 65 0a 2a 2a 20 74 6f 20 61 76 6f 69   able.** to avoi
94d0: 64 20 61 20 6d 65 6d 63 70 79 28 29 2e 0a 2a 2f  d a memcpy()..*/
94e0: 0a 63 61 73 65 20 4f 50 5f 43 6f 6e 63 61 74 3a  .case OP_Concat:
94f0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {           /* 
9500: 73 61 6d 65 20 61 73 20 54 4b 5f 43 4f 4e 43 41  same as TK_CONCA
9510: 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  T, in1, in2, out
9520: 33 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74 65  3 */.  i64 nByte
9530: 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  ;..  pIn1 = &aMe
9540: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49  m[pOp->p1];.  pI
9550: 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n2 = &aMem[pOp->
9560: 70 32 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61  p2];.  pOut = &a
9570: 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
9580: 61 73 73 65 72 74 28 20 70 49 6e 31 21 3d 70 4f  assert( pIn1!=pO
9590: 75 74 20 29 3b 0a 20 20 69 66 28 20 28 70 49 6e  ut );.  if( (pIn
95a0: 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d  1->flags | pIn2-
95b0: 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 4e 75  >flags) & MEM_Nu
95c0: 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ll ){.    sqlite
95d0: 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
95e0: 70 4f 75 74 29 3b 0a 20 20 20 20 62 72 65 61 6b  pOut);.    break
95f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 61  ;.  }.  if( Expa
9600: 6e 64 42 6c 6f 62 28 70 49 6e 31 29 20 7c 7c 20  ndBlob(pIn1) || 
9610: 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29  ExpandBlob(pIn2)
9620: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
9630: 20 20 53 74 72 69 6e 67 69 66 79 28 70 49 6e 31    Stringify(pIn1
9640: 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 53  , encoding);.  S
9650: 74 72 69 6e 67 69 66 79 28 70 49 6e 32 2c 20 65  tringify(pIn2, e
9660: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 6e 42 79 74  ncoding);.  nByt
9670: 65 20 3d 20 70 49 6e 31 2d 3e 6e 20 2b 20 70 49  e = pIn1->n + pI
9680: 6e 32 2d 3e 6e 3b 0a 20 20 69 66 28 20 6e 42 79  n2->n;.  if( nBy
9690: 74 65 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  te>db->aLimit[SQ
96a0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
96b0: 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  H] ){.    goto t
96c0: 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 4d 65  oo_big;.  }.  Me
96d0: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
96e0: 74 2c 20 4d 45 4d 5f 53 74 72 29 3b 0a 20 20 69  t, MEM_Str);.  i
96f0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
9700: 6d 47 72 6f 77 28 70 4f 75 74 2c 20 28 69 6e 74  mGrow(pOut, (int
9710: 29 6e 42 79 74 65 2b 32 2c 20 70 4f 75 74 3d 3d  )nByte+2, pOut==
9720: 70 49 6e 32 29 20 29 7b 0a 20 20 20 20 67 6f 74  pIn2) ){.    got
9730: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20  o no_mem;.  }.  
9740: 69 66 28 20 70 4f 75 74 21 3d 70 49 6e 32 20 29  if( pOut!=pIn2 )
9750: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75  {.    memcpy(pOu
9760: 74 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 7a 2c 20 70  t->z, pIn2->z, p
9770: 49 6e 32 2d 3e 6e 29 3b 0a 20 20 7d 0a 20 20 6d  In2->n);.  }.  m
9780: 65 6d 63 70 79 28 26 70 4f 75 74 2d 3e 7a 5b 70  emcpy(&pOut->z[p
9790: 49 6e 32 2d 3e 6e 5d 2c 20 70 49 6e 31 2d 3e 7a  In2->n], pIn1->z
97a0: 2c 20 70 49 6e 31 2d 3e 6e 29 3b 0a 20 20 70 4f  , pIn1->n);.  pO
97b0: 75 74 2d 3e 7a 5b 6e 42 79 74 65 5d 20 3d 20 30  ut->z[nByte] = 0
97c0: 3b 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74  ;.  pOut->z[nByt
97d0: 65 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 4f 75 74  e+1] = 0;.  pOut
97e0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54  ->flags |= MEM_T
97f0: 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d  erm;.  pOut->n =
9800: 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a 20 20 70   (int)nByte;.  p
9810: 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64  Out->enc = encod
9820: 69 6e 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  ing;.  UPDATE_MA
9830: 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29  X_BLOBSIZE(pOut)
9840: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
9850: 20 4f 70 63 6f 64 65 3a 20 41 64 64 20 50 31 20   Opcode: Add P1 
9860: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
9870: 41 64 64 20 74 68 65 20 76 61 6c 75 65 20 69 6e  Add the value in
9880: 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20   register P1 to 
9890: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
98a0: 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20  ister P2.** and 
98b0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
98c0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
98d0: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e  .** If either in
98e0: 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  put is NULL, the
98f0: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
9900: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d  .*/./* Opcode: M
9910: 75 6c 74 69 70 6c 79 20 50 31 20 50 32 20 50 33  ultiply P1 P2 P3
9920: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4d 75   * *.**.**.** Mu
9930: 6c 74 69 70 6c 79 20 74 68 65 20 76 61 6c 75 65  ltiply the value
9940: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
9950: 62 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  by the value in 
9960: 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61  register P2.** a
9970: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
9980: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ult in register 
9990: 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  P3..** If either
99a0: 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20   input is NULL, 
99b0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
99c0: 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  LL..*/./* Opcode
99d0: 3a 20 53 75 62 74 72 61 63 74 20 50 31 20 50 32  : Subtract P1 P2
99e0: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 75   P3 * *.**.** Su
99f0: 62 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  btract the value
9a00: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
9a10: 66 72 6f 6d 20 74 68 65 20 76 61 6c 75 65 20 69  from the value i
9a20: 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a  n register P2.**
9a30: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
9a40: 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65  esult in registe
9a50: 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68  r P3..** If eith
9a60: 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c  er input is NULL
9a70: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
9a80: 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  NULL..*/./* Opco
9a90: 64 65 3a 20 44 69 76 69 64 65 20 50 31 20 50 32  de: Divide P1 P2
9aa0: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 69   P3 * *.**.** Di
9ab0: 76 69 64 65 20 74 68 65 20 76 61 6c 75 65 20 69  vide the value i
9ac0: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 62 79  n register P1 by
9ad0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
9ae0: 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64  gister P2.** and
9af0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
9b00: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  t in register P3
9b10: 20 28 50 33 3d 50 32 2f 50 31 29 2e 20 49 66 20   (P3=P2/P1). If 
9b20: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 0a 2a 2a  the value in .**
9b30: 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20   register P1 is 
9b40: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 72  zero, then the r
9b50: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 49  esult is NULL. I
9b60: 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69  f either input i
9b70: 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20  s .** NULL, the 
9b80: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
9b90: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  */./* Opcode: Re
9ba0: 6d 61 69 6e 64 65 72 20 50 31 20 50 32 20 50 33  mainder P1 P2 P3
9bb0: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75   * *.**.** Compu
9bc0: 74 65 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  te the remainder
9bd0: 20 61 66 74 65 72 20 69 6e 74 65 67 65 72 20 64   after integer d
9be0: 69 76 69 73 69 6f 6e 20 6f 66 20 74 68 65 20 76  ivision of the v
9bf0: 61 6c 75 65 20 69 6e 0a 2a 2a 20 72 65 67 69 73  alue in.** regis
9c00: 74 65 72 20 50 31 20 62 79 20 74 68 65 20 76 61  ter P1 by the va
9c10: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
9c20: 50 32 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  P2 and store the
9c30: 20 72 65 73 75 6c 74 20 69 6e 20 50 33 2e 20 0a   result in P3. .
9c40: 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  ** If the value 
9c50: 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 20 69  in register P2 i
9c60: 73 20 7a 65 72 6f 20 74 68 65 20 72 65 73 75 6c  s zero the resul
9c70: 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 66  t is NULL..** If
9c80: 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
9c90: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
9ca0: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
9cb0: 63 61 73 65 20 4f 50 5f 41 64 64 3a 20 20 20 20  case OP_Add:    
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9cd0: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 50 4c 55  * same as TK_PLU
9ce0: 53 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  S, in1, in2, out
9cf0: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 75 62  3 */.case OP_Sub
9d00: 74 72 61 63 74 3a 20 20 20 20 20 20 20 20 20 20  tract:          
9d10: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
9d20: 4b 5f 4d 49 4e 55 53 2c 20 69 6e 31 2c 20 69 6e  K_MINUS, in1, in
9d30: 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
9d40: 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20  OP_Multiply:    
9d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
9d60: 65 20 61 73 20 54 4b 5f 53 54 41 52 2c 20 69 6e  e as TK_STAR, in
9d70: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
9d80: 63 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20  case OP_Divide: 
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9da0: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 4c 41  * same as TK_SLA
9db0: 53 48 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  SH, in1, in2, ou
9dc0: 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65  t3 */.case OP_Re
9dd0: 6d 61 69 6e 64 65 72 3a 20 7b 20 20 20 20 20 20  mainder: {      
9de0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
9df0: 54 4b 5f 52 45 4d 2c 20 69 6e 31 2c 20 69 6e 32  TK_REM, in1, in2
9e00: 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 63 68 61 72  , out3 */.  char
9e10: 20 62 49 6e 74 69 6e 74 3b 20 20 20 2f 2a 20 53   bIntint;   /* S
9e20: 74 61 72 74 65 64 20 6f 75 74 20 61 73 20 74 77  tarted out as tw
9e30: 6f 20 69 6e 74 65 67 65 72 20 6f 70 65 72 61 6e  o integer operan
9e40: 64 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ds */.  int flag
9e50: 73 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69  s;      /* Combi
9e60: 6e 65 64 20 4d 45 4d 5f 2a 20 66 6c 61 67 73 20  ned MEM_* flags 
9e70: 66 72 6f 6d 20 62 6f 74 68 20 69 6e 70 75 74 73  from both inputs
9e80: 20 2a 2f 0a 20 20 69 36 34 20 69 41 3b 20 20 20   */.  i64 iA;   
9e90: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
9ea0: 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74 20 6f   value of left o
9eb0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 36 34 20  perand */.  i64 
9ec0: 69 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  iB;         /* I
9ed0: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 6f 66 20  nteger value of 
9ee0: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f  right operand */
9ef0: 0a 20 20 64 6f 75 62 6c 65 20 72 41 3b 20 20 20  .  double rA;   
9f00: 20 20 20 2f 2a 20 52 65 61 6c 20 76 61 6c 75 65     /* Real value
9f10: 20 6f 66 20 6c 65 66 74 20 6f 70 65 72 61 6e 64   of left operand
9f20: 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 42 3b   */.  double rB;
9f30: 20 20 20 20 20 20 2f 2a 20 52 65 61 6c 20 76 61        /* Real va
9f40: 6c 75 65 20 6f 66 20 72 69 67 68 74 20 6f 70 65  lue of right ope
9f50: 72 61 6e 64 20 2a 2f 0a 0a 20 20 70 49 6e 31 20  rand */..  pIn1 
9f60: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
9f70: 3b 0a 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63  ;.  applyNumeric
9f80: 41 66 66 69 6e 69 74 79 28 70 49 6e 31 29 3b 0a  Affinity(pIn1);.
9f90: 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70    pIn2 = &aMem[p
9fa0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 70 70 6c 79  Op->p2];.  apply
9fb0: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
9fc0: 70 49 6e 32 29 3b 0a 20 20 70 4f 75 74 20 3d 20  pIn2);.  pOut = 
9fd0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
9fe0: 20 20 66 6c 61 67 73 20 3d 20 70 49 6e 31 2d 3e    flags = pIn1->
9ff0: 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e 66 6c  flags | pIn2->fl
a000: 61 67 73 3b 0a 20 20 69 66 28 20 28 66 6c 61 67  ags;.  if( (flag
a010: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30  s & MEM_Null)!=0
a020: 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74   ) goto arithmet
a030: 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c  ic_result_is_nul
a040: 6c 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  l;.  if( (pIn1->
a050: 66 6c 61 67 73 20 26 20 70 49 6e 32 2d 3e 66 6c  flags & pIn2->fl
a060: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d  ags & MEM_Int)==
a070: 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 69  MEM_Int ){.    i
a080: 41 20 3d 20 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20  A = pIn1->u.i;. 
a090: 20 20 20 69 42 20 3d 20 70 49 6e 32 2d 3e 75 2e     iB = pIn2->u.
a0a0: 69 3b 0a 20 20 20 20 62 49 6e 74 69 6e 74 20 3d  i;.    bIntint =
a0b0: 20 31 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20   1;.    switch( 
a0c0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20  pOp->opcode ){. 
a0d0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 64 64       case OP_Add
a0e0: 3a 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  :       if( sqli
a0f0: 74 65 33 41 64 64 49 6e 74 36 34 28 26 69 42 2c  te3AddInt64(&iB,
a100: 69 41 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61  iA) ) goto fp_ma
a110: 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  th;  break;.    
a120: 20 20 63 61 73 65 20 4f 50 5f 53 75 62 74 72 61    case OP_Subtra
a130: 63 74 3a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ct:  if( sqlite3
a140: 53 75 62 49 6e 74 36 34 28 26 69 42 2c 69 41 29  SubInt64(&iB,iA)
a150: 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b   ) goto fp_math;
a160: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a170: 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a  ase OP_Multiply:
a180: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 75 6c    if( sqlite3Mul
a190: 49 6e 74 36 34 28 26 69 42 2c 69 41 29 20 29 20  Int64(&iB,iA) ) 
a1a0: 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 20 20 62  goto fp_math;  b
a1b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a1c0: 20 4f 50 5f 44 69 76 69 64 65 3a 20 7b 0a 20 20   OP_Divide: {.  
a1d0: 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d 30 20        if( iA==0 
a1e0: 29 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69  ) goto arithmeti
a1f0: 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c  c_result_is_null
a200: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41  ;.        if( iA
a210: 3d 3d 2d 31 20 26 26 20 69 42 3d 3d 53 4d 41 4c  ==-1 && iB==SMAL
a220: 4c 45 53 54 5f 49 4e 54 36 34 20 29 20 67 6f 74  LEST_INT64 ) got
a230: 6f 20 66 70 5f 6d 61 74 68 3b 0a 20 20 20 20 20  o fp_math;.     
a240: 20 20 20 69 42 20 2f 3d 20 69 41 3b 0a 20 20 20     iB /= iA;.   
a250: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a260: 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c    }.      defaul
a270: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t: {.        if(
a280: 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72   iA==0 ) goto ar
a290: 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f  ithmetic_result_
a2a0: 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20  is_null;.       
a2b0: 20 69 66 28 20 69 41 3d 3d 2d 31 20 29 20 69 41   if( iA==-1 ) iA
a2c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 42   = 1;.        iB
a2d0: 20 25 3d 20 69 41 3b 0a 20 20 20 20 20 20 20 20   %= iA;.        
a2e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
a2f0: 20 20 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 75     }.    pOut->u
a300: 2e 69 20 3d 20 69 42 3b 0a 20 20 20 20 4d 65 6d  .i = iB;.    Mem
a310: 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
a320: 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 65  , MEM_Int);.  }e
a330: 6c 73 65 7b 0a 20 20 20 20 62 49 6e 74 69 6e 74  lse{.    bIntint
a340: 20 3d 20 30 3b 0a 66 70 5f 6d 61 74 68 3a 0a 20   = 0;.fp_math:. 
a350: 20 20 20 72 41 20 3d 20 73 71 6c 69 74 65 33 56     rA = sqlite3V
a360: 64 62 65 52 65 61 6c 56 61 6c 75 65 28 70 49 6e  dbeRealValue(pIn
a370: 31 29 3b 0a 20 20 20 20 72 42 20 3d 20 73 71 6c  1);.    rB = sql
a380: 69 74 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75  ite3VdbeRealValu
a390: 65 28 70 49 6e 32 29 3b 0a 20 20 20 20 73 77 69  e(pIn2);.    swi
a3a0: 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  tch( pOp->opcode
a3b0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
a3c0: 50 5f 41 64 64 3a 20 20 20 20 20 20 20 20 20 72  P_Add:         r
a3d0: 42 20 2b 3d 20 72 41 3b 20 20 20 20 20 20 20 62  B += rA;       b
a3e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a3f0: 20 4f 50 5f 53 75 62 74 72 61 63 74 3a 20 20 20   OP_Subtract:   
a400: 20 72 42 20 2d 3d 20 72 41 3b 20 20 20 20 20 20   rB -= rA;      
a410: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a420: 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20  se OP_Multiply: 
a430: 20 20 20 72 42 20 2a 3d 20 72 41 3b 20 20 20 20     rB *= rA;    
a440: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a450: 63 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20  case OP_Divide: 
a460: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 28 64 6f  {.        /* (do
a470: 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f  uble)0 In case o
a480: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
a490: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20  OATING_POINT... 
a4a0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  */.        if( r
a4b0: 41 3d 3d 28 64 6f 75 62 6c 65 29 30 20 29 20 67  A==(double)0 ) g
a4c0: 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72  oto arithmetic_r
a4d0: 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20  esult_is_null;. 
a4e0: 20 20 20 20 20 20 20 72 42 20 2f 3d 20 72 41 3b         rB /= rA;
a4f0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
a500: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65        }.      de
a510: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
a520: 20 69 41 20 3d 20 28 69 36 34 29 72 41 3b 0a 20   iA = (i64)rA;. 
a530: 20 20 20 20 20 20 20 69 42 20 3d 20 28 69 36 34         iB = (i64
a540: 29 72 42 3b 0a 20 20 20 20 20 20 20 20 69 66 28  )rB;.        if(
a550: 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72   iA==0 ) goto ar
a560: 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f  ithmetic_result_
a570: 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20  is_null;.       
a580: 20 69 66 28 20 69 41 3d 3d 2d 31 20 29 20 69 41   if( iA==-1 ) iA
a590: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 42   = 1;.        rB
a5a0: 20 3d 20 28 64 6f 75 62 6c 65 29 28 69 42 20 25   = (double)(iB %
a5b0: 20 69 41 29 3b 0a 20 20 20 20 20 20 20 20 62 72   iA);.        br
a5c0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
a5d0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
a5e0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
a5f0: 4f 49 4e 54 0a 20 20 20 20 70 4f 75 74 2d 3e 75  OINT.    pOut->u
a600: 2e 69 20 3d 20 72 42 3b 0a 20 20 20 20 4d 65 6d  .i = rB;.    Mem
a610: 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
a620: 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 23 65 6c 73  , MEM_Int);.#els
a630: 65 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  e.    if( sqlite
a640: 33 49 73 4e 61 4e 28 72 42 29 20 29 7b 0a 20 20  3IsNaN(rB) ){.  
a650: 20 20 20 20 67 6f 74 6f 20 61 72 69 74 68 6d 65      goto arithme
a660: 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75  tic_result_is_nu
a670: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f  ll;.    }.    pO
a680: 75 74 2d 3e 72 20 3d 20 72 42 3b 0a 20 20 20 20  ut->r = rB;.    
a690: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
a6a0: 4f 75 74 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b 0a  Out, MEM_Real);.
a6b0: 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
a6c0: 20 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20 26 26   MEM_Real)==0 &&
a6d0: 20 21 62 49 6e 74 69 6e 74 20 29 7b 0a 20 20 20   !bIntint ){.   
a6e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e     sqlite3VdbeIn
a6f0: 74 65 67 65 72 41 66 66 69 6e 69 74 79 28 70 4f  tegerAffinity(pO
a700: 75 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ut);.    }.#endi
a710: 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  f.  }.  break;..
a720: 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c  arithmetic_resul
a730: 74 5f 69 73 5f 6e 75 6c 6c 3a 0a 20 20 73 71 6c  t_is_null:.  sql
a740: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
a750: 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61  ll(pOut);.  brea
a760: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
a770: 20 43 6f 6c 6c 53 65 71 20 50 31 20 2a 20 2a 20   CollSeq P1 * * 
a780: 50 34 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61  P4.**.** P4 is a
a790: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 43 6f   pointer to a Co
a7a0: 6c 6c 53 65 71 20 73 74 72 75 63 74 2e 20 49 66  llSeq struct. If
a7b0: 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
a7c0: 6f 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f  o a user functio
a7d0: 6e 0a 2a 2a 20 6f 72 20 61 67 67 72 65 67 61 74  n.** or aggregat
a7e0: 65 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 47  e calls sqlite3G
a7f0: 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 29 2c  etFuncCollSeq(),
a800: 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20   this collation 
a810: 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 0a 2a 2a  sequence will.**
a820: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68   be returned. Th
a830: 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74 68  is is used by th
a840: 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29  e built-in min()
a850: 2c 20 6d 61 78 28 29 20 61 6e 64 20 6e 75 6c 6c  , max() and null
a860: 69 66 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  if().** function
a870: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 31 20 69  s..**.** If P1 i
a880: 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
a890: 20 69 74 20 69 73 20 61 20 72 65 67 69 73 74 65   it is a registe
a8a0: 72 20 74 68 61 74 20 61 20 73 75 62 73 65 71 75  r that a subsequ
a8b0: 65 6e 74 20 6d 69 6e 28 29 20 6f 72 0a 2a 2a 20  ent min() or.** 
a8c0: 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65 20  max() aggregate 
a8d0: 77 69 6c 6c 20 73 65 74 20 74 6f 20 31 20 69 66  will set to 1 if
a8e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
a8f0: 20 69 73 20 6e 6f 74 20 74 68 65 20 6d 69 6e 69   is not the mini
a900: 6d 75 6d 20 6f 72 0a 2a 2a 20 6d 61 78 69 6d 75  mum or.** maximu
a910: 6d 2e 20 20 54 68 65 20 50 31 20 72 65 67 69 73  m.  The P1 regis
a920: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
a930: 65 64 20 74 6f 20 30 20 62 79 20 74 68 69 73 20  ed to 0 by this 
a940: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  instruction..**.
a950: 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65  ** The interface
a960: 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70   used by the imp
a970: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
a980: 68 65 20 61 66 6f 72 65 6d 65 6e 74 69 6f 6e 65  he aforementione
a990: 64 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74  d functions.** t
a9a0: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 63  o retrieve the c
a9b0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
a9c0: 65 20 73 65 74 20 62 79 20 74 68 69 73 20 6f 70  e set by this op
a9d0: 63 6f 64 65 20 69 73 20 6e 6f 74 20 61 76 61 69  code is not avai
a9e0: 6c 61 62 6c 65 0a 2a 2a 20 70 75 62 6c 69 63 6c  lable.** publicl
a9f0: 79 2c 20 6f 6e 6c 79 20 74 6f 20 75 73 65 72 20  y, only to user 
aa00: 66 75 6e 63 74 69 6f 6e 73 20 64 65 66 69 6e 65  functions define
aa10: 64 20 69 6e 20 66 75 6e 63 2e 63 2e 0a 2a 2f 0a  d in func.c..*/.
aa20: 63 61 73 65 20 4f 50 5f 43 6f 6c 6c 53 65 71 3a  case OP_CollSeq:
aa30: 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70   {.  assert( pOp
aa40: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c  ->p4type==P4_COL
aa50: 4c 53 45 51 20 29 3b 0a 20 20 69 66 28 20 70 4f  LSEQ );.  if( pO
aa60: 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 73 71 6c  p->p1 ){.    sql
aa70: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e  ite3VdbeMemSetIn
aa80: 74 36 34 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t64(&aMem[pOp->p
aa90: 31 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 62 72  1], 0);.  }.  br
aaa0: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
aab0: 65 3a 20 46 75 6e 63 74 69 6f 6e 20 50 31 20 50  e: Function P1 P
aac0: 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
aad0: 20 49 6e 76 6f 6b 65 20 61 20 75 73 65 72 20 66   Invoke a user f
aae0: 75 6e 63 74 69 6f 6e 20 28 50 34 20 69 73 20 61  unction (P4 is a
aaf0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 46 75   pointer to a Fu
ab00: 6e 63 74 69 6f 6e 20 73 74 72 75 63 74 75 72 65  nction structure
ab10: 20 74 68 61 74 0a 2a 2a 20 64 65 66 69 6e 65 73   that.** defines
ab20: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 29 20 77   the function) w
ab30: 69 74 68 20 50 35 20 61 72 67 75 6d 65 6e 74 73  ith P5 arguments
ab40: 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69   taken from regi
ab50: 73 74 65 72 20 50 32 20 61 6e 64 0a 2a 2a 20 73  ster P2 and.** s
ab60: 75 63 63 65 73 73 6f 72 73 2e 20 20 54 68 65 20  uccessors.  The 
ab70: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75  result of the fu
ab80: 6e 63 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64  nction is stored
ab90: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
aba0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 33 20  .** Register P3 
abb0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 6e 65 20  must not be one 
abc0: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
abd0: 69 6e 70 75 74 73 2e 0a 2a 2a 0a 2a 2a 20 50 31  inputs..**.** P1
abe0: 20 69 73 20 61 20 33 32 2d 62 69 74 20 62 69 74   is a 32-bit bit
abf0: 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20  mask indicating 
ac00: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 65  whether or not e
ac10: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ach argument to 
ac20: 74 68 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  the .** function
ac30: 20 77 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20   was determined 
ac40: 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 61  to be constant a
ac50: 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2e 20  t compile time. 
ac60: 49 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  If the first.** 
ac70: 61 72 67 75 6d 65 6e 74 20 77 61 73 20 63 6f 6e  argument was con
ac80: 73 74 61 6e 74 20 74 68 65 6e 20 62 69 74 20 30  stant then bit 0
ac90: 20 6f 66 20 50 31 20 69 73 20 73 65 74 2e 20 54   of P1 is set. T
aca0: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 64  his is used to d
acb0: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74  etermine.** whet
acc0: 68 65 72 20 6d 65 74 61 20 64 61 74 61 20 61 73  her meta data as
acd0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
ace0: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 61 72  user function ar
acf0: 67 75 6d 65 6e 74 20 75 73 69 6e 67 20 74 68 65  gument using the
ad00: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 65 74 5f  .** sqlite3_set_
ad10: 61 75 78 64 61 74 61 28 29 20 41 50 49 20 6d 61  auxdata() API ma
ad20: 79 20 62 65 20 73 61 66 65 6c 79 20 72 65 74 61  y be safely reta
ad30: 69 6e 65 64 20 75 6e 74 69 6c 20 74 68 65 20 6e  ined until the n
ad40: 65 78 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f  ext.** invocatio
ad50: 6e 20 6f 66 20 74 68 69 73 20 6f 70 63 6f 64 65  n of this opcode
ad60: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
ad70: 3a 20 41 67 67 53 74 65 70 20 61 6e 64 20 41 67  : AggStep and Ag
ad80: 67 46 69 6e 61 6c 0a 2a 2f 0a 63 61 73 65 20 4f  gFinal.*/.case O
ad90: 50 5f 46 75 6e 63 74 69 6f 6e 3a 20 7b 0a 20 20  P_Function: {.  
ada0: 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 70 41  int i;.  Mem *pA
adb0: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  rg;.  sqlite3_co
adc0: 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 73 71 6c  ntext ctx;.  sql
add0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
ade0: 61 6c 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  al;.  int n;..  
adf0: 6e 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 61  n = pOp->p5;.  a
ae00: 70 56 61 6c 20 3d 20 70 2d 3e 61 70 41 72 67 3b  pVal = p->apArg;
ae10: 0a 20 20 61 73 73 65 72 74 28 20 61 70 56 61 6c  .  assert( apVal
ae20: 20 7c 7c 20 6e 3d 3d 30 20 29 3b 0a 20 20 61 73   || n==0 );.  as
ae30: 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20  sert( pOp->p3>0 
ae40: 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e  && pOp->p3<=p->n
ae50: 4d 65 6d 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20  Mem );.  pOut = 
ae60: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
ae70: 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
ae80: 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 0a 20 20  ge(p, pOut);..  
ae90: 61 73 73 65 72 74 28 20 6e 3d 3d 30 20 7c 7c 20  assert( n==0 || 
aea0: 28 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f  (pOp->p2>0 && pO
aeb0: 70 2d 3e 70 32 2b 6e 3c 3d 70 2d 3e 6e 4d 65 6d  p->p2+n<=p->nMem
aec0: 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  +1) );.  assert(
aed0: 20 70 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e 70 32   pOp->p3<pOp->p2
aee0: 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70 4f 70   || pOp->p3>=pOp
aef0: 2d 3e 70 32 2b 6e 20 29 3b 0a 20 20 70 41 72 67  ->p2+n );.  pArg
af00: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
af10: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
af20: 6e 3b 20 69 2b 2b 2c 20 70 41 72 67 2b 2b 29 7b  n; i++, pArg++){
af30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d  .    assert( mem
af40: 49 73 56 61 6c 69 64 28 70 41 72 67 29 20 29 3b  IsValid(pArg) );
af50: 0a 20 20 20 20 61 70 56 61 6c 5b 69 5d 20 3d 20  .    apVal[i] = 
af60: 70 41 72 67 3b 0a 20 20 20 20 44 65 65 70 68 65  pArg;.    Deephe
af70: 6d 65 72 61 6c 69 7a 65 28 70 41 72 67 29 3b 0a  meralize(pArg);.
af80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
af90: 65 6d 53 74 6f 72 65 54 79 70 65 28 70 41 72 67  emStoreType(pArg
afa0: 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  );.    REGISTER_
afb0: 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2b 69 2c  TRACE(pOp->p2+i,
afc0: 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 20 61   pArg);.  }..  a
afd0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79  ssert( pOp->p4ty
afe0: 70 65 3d 3d 50 34 5f 46 55 4e 43 44 45 46 20 7c  pe==P4_FUNCDEF |
aff0: 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  | pOp->p4type==P
b000: 34 5f 56 44 42 45 46 55 4e 43 20 29 3b 0a 20 20  4_VDBEFUNC );.  
b010: 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  if( pOp->p4type=
b020: 3d 50 34 5f 46 55 4e 43 44 45 46 20 29 7b 0a 20  =P4_FUNCDEF ){. 
b030: 20 20 20 63 74 78 2e 70 46 75 6e 63 20 3d 20 70     ctx.pFunc = p
b040: 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20  Op->p4.pFunc;.  
b050: 20 20 63 74 78 2e 70 56 64 62 65 46 75 6e 63 20    ctx.pVdbeFunc 
b060: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
b070: 20 20 63 74 78 2e 70 56 64 62 65 46 75 6e 63 20    ctx.pVdbeFunc 
b080: 3d 20 28 56 64 62 65 46 75 6e 63 2a 29 70 4f 70  = (VdbeFunc*)pOp
b090: 2d 3e 70 34 2e 70 56 64 62 65 46 75 6e 63 3b 0a  ->p4.pVdbeFunc;.
b0a0: 20 20 20 20 63 74 78 2e 70 46 75 6e 63 20 3d 20      ctx.pFunc = 
b0b0: 63 74 78 2e 70 56 64 62 65 46 75 6e 63 2d 3e 70  ctx.pVdbeFunc->p
b0c0: 46 75 6e 63 3b 0a 20 20 7d 0a 0a 20 20 63 74 78  Func;.  }..  ctx
b0d0: 2e 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  .s.flags = MEM_N
b0e0: 75 6c 6c 3b 0a 20 20 63 74 78 2e 73 2e 64 62 20  ull;.  ctx.s.db 
b0f0: 3d 20 64 62 3b 0a 20 20 63 74 78 2e 73 2e 78 44  = db;.  ctx.s.xD
b100: 65 6c 20 3d 20 30 3b 0a 20 20 63 74 78 2e 73 2e  el = 0;.  ctx.s.
b110: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 0a 20 20  zMalloc = 0;..  
b120: 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 63 65  /* The output ce
b130: 6c 6c 20 6d 61 79 20 61 6c 72 65 61 64 79 20 68  ll may already h
b140: 61 76 65 20 61 20 62 75 66 66 65 72 20 61 6c 6c  ave a buffer all
b150: 6f 63 61 74 65 64 2e 20 4d 6f 76 65 0a 20 20 2a  ocated. Move.  *
b160: 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f  * the pointer to
b170: 20 63 74 78 2e 73 20 73 6f 20 69 6e 20 63 61 73   ctx.s so in cas
b180: 65 20 74 68 65 20 75 73 65 72 2d 66 75 6e 63 74  e the user-funct
b190: 69 6f 6e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a  ion can use.  **
b1a0: 20 74 68 65 20 61 6c 72 65 61 64 79 20 61 6c 6c   the already all
b1b0: 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 69 6e  ocated buffer in
b1c0: 73 74 65 61 64 20 6f 66 20 61 6c 6c 6f 63 61 74  stead of allocat
b1d0: 69 6e 67 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20  ing a new one.. 
b1e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
b1f0: 65 4d 65 6d 4d 6f 76 65 28 26 63 74 78 2e 73 2c  eMemMove(&ctx.s,
b200: 20 70 4f 75 74 29 3b 0a 20 20 4d 65 6d 53 65 74   pOut);.  MemSet
b210: 54 79 70 65 46 6c 61 67 28 26 63 74 78 2e 73 2c  TypeFlag(&ctx.s,
b220: 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 0a 20 20 63   MEM_Null);..  c
b230: 74 78 2e 69 73 45 72 72 6f 72 20 3d 20 30 3b 0a  tx.isError = 0;.
b240: 20 20 69 66 28 20 63 74 78 2e 70 46 75 6e 63 2d    if( ctx.pFunc-
b250: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
b260: 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
b270: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
b280: 3e 61 4f 70 20 29 3b 0a 20 20 20 20 61 73 73 65  >aOp );.    asse
b290: 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 70 34 74 79  rt( pOp[-1].p4ty
b2a0: 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51 20 29  pe==P4_COLLSEQ )
b2b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
b2c0: 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50  p[-1].opcode==OP
b2d0: 5f 43 6f 6c 6c 53 65 71 20 29 3b 0a 20 20 20 20  _CollSeq );.    
b2e0: 63 74 78 2e 70 43 6f 6c 6c 20 3d 20 70 4f 70 5b  ctx.pColl = pOp[
b2f0: 2d 31 5d 2e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20  -1].p4.pColl;.  
b300: 7d 0a 20 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69  }.  db->lastRowi
b310: 64 20 3d 20 6c 61 73 74 52 6f 77 69 64 3b 0a 20  d = lastRowid;. 
b320: 20 28 2a 63 74 78 2e 70 46 75 6e 63 2d 3e 78 46   (*ctx.pFunc->xF
b330: 75 6e 63 29 28 26 63 74 78 2c 20 6e 2c 20 61 70  unc)(&ctx, n, ap
b340: 56 61 6c 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  Val); /* IMP: R-
b350: 32 34 35 30 35 2d 32 33 32 33 30 20 2a 2f 0a 20  24505-23230 */. 
b360: 20 6c 61 73 74 52 6f 77 69 64 20 3d 20 64 62 2d   lastRowid = db-
b370: 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 0a 20 20 2f  >lastRowid;..  /
b380: 2a 20 49 66 20 61 6e 79 20 61 75 78 69 6c 69 61  * If any auxilia
b390: 72 79 20 64 61 74 61 20 66 75 6e 63 74 69 6f 6e  ry data function
b3a0: 73 20 68 61 76 65 20 62 65 65 6e 20 63 61 6c 6c  s have been call
b3b0: 65 64 20 62 79 20 74 68 69 73 20 75 73 65 72 20  ed by this user 
b3c0: 66 75 6e 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 69  function,.  ** i
b3d0: 6d 6d 65 64 69 61 74 65 6c 79 20 63 61 6c 6c 20  mmediately call 
b3e0: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
b3f0: 6f 72 20 61 6e 79 20 6e 6f 6e 2d 73 74 61 74 69  or any non-stati
b400: 63 20 76 61 6c 75 65 73 2e 0a 20 20 2a 2f 0a 20  c values..  */. 
b410: 20 69 66 28 20 63 74 78 2e 70 56 64 62 65 46 75   if( ctx.pVdbeFu
b420: 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nc ){.    sqlite
b430: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
b440: 74 61 28 63 74 78 2e 70 56 64 62 65 46 75 6e 63  ta(ctx.pVdbeFunc
b450: 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20  , pOp->p1);.    
b460: 70 4f 70 2d 3e 70 34 2e 70 56 64 62 65 46 75 6e  pOp->p4.pVdbeFun
b470: 63 20 3d 20 63 74 78 2e 70 56 64 62 65 46 75 6e  c = ctx.pVdbeFun
b480: 63 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  c;.    pOp->p4ty
b490: 70 65 20 3d 20 50 34 5f 56 44 42 45 46 55 4e 43  pe = P4_VDBEFUNC
b4a0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 64 62 2d  ;.  }..  if( db-
b4b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
b4c0: 0a 20 20 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f  .    /* Even tho
b4d0: 75 67 68 20 61 20 6d 61 6c 6c 6f 63 28 29 20 68  ugh a malloc() h
b4e0: 61 73 20 66 61 69 6c 65 64 2c 20 74 68 65 20 69  as failed, the i
b4f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
b500: 20 74 68 65 0a 20 20 20 20 2a 2a 20 75 73 65 72   the.    ** user
b510: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 68 61   function may ha
b520: 76 65 20 63 61 6c 6c 65 64 20 61 6e 20 73 71 6c  ve called an sql
b530: 69 74 65 33 5f 72 65 73 75 6c 74 5f 58 58 58 28  ite3_result_XXX(
b540: 29 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2a  ) function.    *
b550: 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 20 76 61  * to return a va
b560: 6c 75 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  lue. The followi
b570: 6e 67 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 73  ng call releases
b580: 20 61 6e 79 20 72 65 73 6f 75 72 63 65 73 0a 20   any resources. 
b590: 20 20 20 2a 2a 20 61 73 73 6f 63 69 61 74 65 64     ** associated
b5a0: 20 77 69 74 68 20 73 75 63 68 20 61 20 76 61 6c   with such a val
b5b0: 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ue..    */.    s
b5c0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
b5d0: 65 61 73 65 28 26 63 74 78 2e 73 29 3b 0a 20 20  ease(&ctx.s);.  
b5e0: 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
b5f0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
b600: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65  function returne
b610: 64 20 61 6e 20 65 72 72 6f 72 2c 20 74 68 72 6f  d an error, thro
b620: 77 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 2a  w an exception *
b630: 2f 0a 20 20 69 66 28 20 63 74 78 2e 69 73 45 72  /.  if( ctx.isEr
b640: 72 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ror ){.    sqlit
b650: 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
b660: 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73  zErrMsg, db, "%s
b670: 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ", sqlite3_value
b680: 5f 74 65 78 74 28 26 63 74 78 2e 73 29 29 3b 0a  _text(&ctx.s));.
b690: 20 20 20 20 72 63 20 3d 20 63 74 78 2e 69 73 45      rc = ctx.isE
b6a0: 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rror;.  }..  /* 
b6b0: 43 6f 70 79 20 74 68 65 20 72 65 73 75 6c 74 20  Copy the result 
b6c0: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
b6d0: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 33  into register P3
b6e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
b6f0: 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28  eChangeEncoding(
b700: 26 63 74 78 2e 73 2c 20 65 6e 63 6f 64 69 6e 67  &ctx.s, encoding
b710: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
b720: 4d 65 6d 4d 6f 76 65 28 70 4f 75 74 2c 20 26 63  MemMove(pOut, &c
b730: 74 78 2e 73 29 3b 0a 20 20 69 66 28 20 73 71 6c  tx.s);.  if( sql
b740: 69 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69  ite3VdbeMemTooBi
b750: 67 28 70 4f 75 74 29 20 29 7b 0a 20 20 20 20 67  g(pOut) ){.    g
b760: 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
b770: 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 20 54 68 65  ..#if 0.  /* The
b780: 20 61 70 70 2d 64 65 66 69 6e 65 64 20 66 75 6e   app-defined fun
b790: 63 74 69 6f 6e 20 68 61 73 20 64 6f 6e 65 20 73  ction has done s
b7a0: 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 61 73  omething that as
b7b0: 20 63 61 75 73 65 64 20 74 68 69 73 0a 20 20 2a   caused this.  *
b7c0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65  * statement to e
b7d0: 78 70 69 72 65 2e 20 20 28 50 65 72 68 61 70 73  xpire.  (Perhaps
b7e0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61   the function ca
b7f0: 6c 6c 65 64 20 73 71 6c 69 74 65 33 5f 65 78 65  lled sqlite3_exe
b800: 63 28 29 0a 20 20 2a 2a 20 77 69 74 68 20 61 20  c().  ** with a 
b810: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
b820: 74 65 6d 65 6e 74 2e 29 0a 20 20 2a 2f 0a 20 20  tement.).  */.  
b830: 69 66 28 20 70 2d 3e 65 78 70 69 72 65 64 20 29  if( p->expired )
b840: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f   rc = SQLITE_ABO
b850: 52 54 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 52 45  RT;.#endif..  RE
b860: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
b870: 2d 3e 70 33 2c 20 70 4f 75 74 29 3b 0a 20 20 55  ->p3, pOut);.  U
b880: 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49  PDATE_MAX_BLOBSI
b890: 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61  ZE(pOut);.  brea
b8a0: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
b8b0: 20 42 69 74 41 6e 64 20 50 31 20 50 32 20 50 33   BitAnd P1 P2 P3
b8c0: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20   * *.**.** Take 
b8d0: 74 68 65 20 62 69 74 2d 77 69 73 65 20 41 4e 44  the bit-wise AND
b8e0: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69   of the values i
b8f0: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 61 6e  n register P1 an
b900: 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f 72  d P2 and.** stor
b910: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
b920: 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20  register P3..** 
b930: 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20  If either input 
b940: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
b950: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
b960: 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69 74 4f 72  /* Opcode: BitOr
b970: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
b980: 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 62 69 74  .** Take the bit
b990: 2d 77 69 73 65 20 4f 52 20 6f 66 20 74 68 65 20  -wise OR of the 
b9a0: 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74  values in regist
b9b0: 65 72 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64  er P1 and P2 and
b9c0: 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65  .** store the re
b9d0: 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72  sult in register
b9e0: 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65   P3..** If eithe
b9f0: 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c  r input is NULL,
ba00: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
ba10: 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ULL..*/./* Opcod
ba20: 65 3a 20 53 68 69 66 74 4c 65 66 74 20 50 31 20  e: ShiftLeft P1 
ba30: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
ba40: 53 68 69 66 74 20 74 68 65 20 69 6e 74 65 67 65  Shift the intege
ba50: 72 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  r value in regis
ba60: 74 65 72 20 50 32 20 74 6f 20 74 68 65 20 6c 65  ter P2 to the le
ba70: 66 74 20 62 79 20 74 68 65 0a 2a 2a 20 6e 75 6d  ft by the.** num
ba80: 62 65 72 20 6f 66 20 62 69 74 73 20 73 70 65 63  ber of bits spec
ba90: 69 66 69 65 64 20 62 79 20 74 68 65 20 69 6e 74  ified by the int
baa0: 65 67 65 72 20 69 6e 20 72 65 67 69 73 74 65 72  eger in register
bab0: 20 50 31 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68   P1..** Store th
bac0: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
bad0: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
bae0: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
baf0: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
bb00: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f  is NULL..*/./* O
bb10: 70 63 6f 64 65 3a 20 53 68 69 66 74 52 69 67 68  pcode: ShiftRigh
bb20: 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  t P1 P2 P3 * *.*
bb30: 2a 0a 2a 2a 20 53 68 69 66 74 20 74 68 65 20 69  *.** Shift the i
bb40: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69 6e 20  nteger value in 
bb50: 72 65 67 69 73 74 65 72 20 50 32 20 74 6f 20 74  register P2 to t
bb60: 68 65 20 72 69 67 68 74 20 62 79 20 74 68 65 0a  he right by the.
bb70: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  ** number of bit
bb80: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
bb90: 68 65 20 69 6e 74 65 67 65 72 20 69 6e 20 72 65  he integer in re
bba0: 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20 53 74  gister P1..** St
bbb0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
bbc0: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
bbd0: 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75  * If either inpu
bbe0: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  t is NULL, the r
bbf0: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
bc00: 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74 41 6e 64  /.case OP_BitAnd
bc10: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
bc20: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
bc30: 42 49 54 41 4e 44 2c 20 69 6e 31 2c 20 69 6e 32  BITAND, in1, in2
bc40: 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f  , out3 */.case O
bc50: 50 5f 42 69 74 4f 72 3a 20 20 20 20 20 20 20 20  P_BitOr:        
bc60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
bc70: 65 20 61 73 20 54 4b 5f 42 49 54 4f 52 2c 20 69  e as TK_BITOR, i
bc80: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
bc90: 0a 63 61 73 65 20 4f 50 5f 53 68 69 66 74 4c 65  .case OP_ShiftLe
bca0: 66 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ft:             
bcb0: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c   /* same as TK_L
bcc0: 53 48 49 46 54 2c 20 69 6e 31 2c 20 69 6e 32 2c  SHIFT, in1, in2,
bcd0: 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50   out3 */.case OP
bce0: 5f 53 68 69 66 74 52 69 67 68 74 3a 20 7b 20 20  _ShiftRight: {  
bcf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
bd00: 20 61 73 20 54 4b 5f 52 53 48 49 46 54 2c 20 69   as TK_RSHIFT, i
bd10: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
bd20: 0a 20 20 69 36 34 20 69 41 3b 0a 20 20 75 36 34  .  i64 iA;.  u64
bd30: 20 75 41 3b 0a 20 20 69 36 34 20 69 42 3b 0a 20   uA;.  i64 iB;. 
bd40: 20 75 38 20 6f 70 3b 0a 0a 20 20 70 49 6e 31 20   u8 op;..  pIn1 
bd50: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
bd60: 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d  ;.  pIn2 = &aMem
bd70: 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75  [pOp->p2];.  pOu
bd80: 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
bd90: 33 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d  3];.  if( (pIn1-
bda0: 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e 66  >flags | pIn2->f
bdb0: 6c 61 67 73 29 20 26 20 4d 45 4d 5f 4e 75 6c 6c  lags) & MEM_Null
bdc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
bdd0: 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f  dbeMemSetNull(pO
bde0: 75 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ut);.    break;.
bdf0: 20 20 7d 0a 20 20 69 41 20 3d 20 73 71 6c 69 74    }.  iA = sqlit
be00: 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70  e3VdbeIntValue(p
be10: 49 6e 32 29 3b 0a 20 20 69 42 20 3d 20 73 71 6c  In2);.  iB = sql
be20: 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65  ite3VdbeIntValue
be30: 28 70 49 6e 31 29 3b 0a 20 20 6f 70 20 3d 20 70  (pIn1);.  op = p
be40: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 69 66  Op->opcode;.  if
be50: 28 20 6f 70 3d 3d 4f 50 5f 42 69 74 41 6e 64 20  ( op==OP_BitAnd 
be60: 29 7b 0a 20 20 20 20 69 41 20 26 3d 20 69 42 3b  ){.    iA &= iB;
be70: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
be80: 3d 4f 50 5f 42 69 74 4f 72 20 29 7b 0a 20 20 20  =OP_BitOr ){.   
be90: 20 69 41 20 7c 3d 20 69 42 3b 0a 20 20 7d 65 6c   iA |= iB;.  }el
bea0: 73 65 20 69 66 28 20 69 42 21 3d 30 20 29 7b 0a  se if( iB!=0 ){.
beb0: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
bec0: 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 7c 7c  OP_ShiftRight ||
bed0: 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66   op==OP_ShiftLef
bee0: 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  t );..    /* If 
bef0: 73 68 69 66 74 69 6e 67 20 62 79 20 61 20 6e 65  shifting by a ne
bf00: 67 61 74 69 76 65 20 61 6d 6f 75 6e 74 2c 20 73  gative amount, s
bf10: 68 69 66 74 20 69 6e 20 74 68 65 20 6f 74 68 65  hift in the othe
bf20: 72 20 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20  r direction */. 
bf30: 20 20 20 69 66 28 20 69 42 3c 30 20 29 7b 0a 20     if( iB<0 ){. 
bf40: 20 20 20 20 20 61 73 73 65 72 74 28 20 4f 50 5f       assert( OP_
bf50: 53 68 69 66 74 52 69 67 68 74 3d 3d 4f 50 5f 53  ShiftRight==OP_S
bf60: 68 69 66 74 4c 65 66 74 2b 31 20 29 3b 0a 20 20  hiftLeft+1 );.  
bf70: 20 20 20 20 6f 70 20 3d 20 32 2a 4f 50 5f 53 68      op = 2*OP_Sh
bf80: 69 66 74 4c 65 66 74 20 2b 20 31 20 2d 20 6f 70  iftLeft + 1 - op
bf90: 3b 0a 20 20 20 20 20 20 69 42 20 3d 20 69 42 3e  ;.      iB = iB>
bfa0: 28 2d 36 34 29 20 3f 20 2d 69 42 20 3a 20 36 34  (-64) ? -iB : 64
bfb0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
bfc0: 20 69 42 3e 3d 36 34 20 29 7b 0a 20 20 20 20 20   iB>=64 ){.     
bfd0: 20 69 41 20 3d 20 28 69 41 3e 3d 30 20 7c 7c 20   iA = (iA>=0 || 
bfe0: 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  op==OP_ShiftLeft
bff0: 29 20 3f 20 30 20 3a 20 2d 31 3b 0a 20 20 20 20  ) ? 0 : -1;.    
c000: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
c010: 63 70 79 28 26 75 41 2c 20 26 69 41 2c 20 73 69  cpy(&uA, &iA, si
c020: 7a 65 6f 66 28 75 41 29 29 3b 0a 20 20 20 20 20  zeof(uA));.     
c030: 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 53 68 69 66   if( op==OP_Shif
c040: 74 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  tLeft ){.       
c050: 20 75 41 20 3c 3c 3d 20 69 42 3b 0a 20 20 20 20   uA <<= iB;.    
c060: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c070: 20 75 41 20 3e 3e 3d 20 69 42 3b 0a 20 20 20 20   uA >>= iB;.    
c080: 20 20 20 20 2f 2a 20 53 69 67 6e 2d 65 78 74 65      /* Sign-exte
c090: 6e 64 20 6f 6e 20 61 20 72 69 67 68 74 20 73 68  nd on a right sh
c0a0: 69 66 74 20 6f 66 20 61 20 6e 65 67 61 74 69 76  ift of a negativ
c0b0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
c0c0: 20 20 20 20 69 66 28 20 69 41 3c 30 20 29 20 75      if( iA<0 ) u
c0d0: 41 20 7c 3d 20 28 28 28 28 75 36 34 29 30 78 66  A |= ((((u64)0xf
c0e0: 66 66 66 66 66 66 66 29 3c 3c 33 32 29 7c 30 78  fffffff)<<32)|0x
c0f0: 66 66 66 66 66 66 66 66 29 20 3c 3c 20 28 36 34  ffffffff) << (64
c100: 2d 69 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  -iB);.      }.  
c110: 20 20 20 20 6d 65 6d 63 70 79 28 26 69 41 2c 20      memcpy(&iA, 
c120: 26 75 41 2c 20 73 69 7a 65 6f 66 28 69 41 29 29  &uA, sizeof(iA))
c130: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4f  ;.    }.  }.  pO
c140: 75 74 2d 3e 75 2e 69 20 3d 20 69 41 3b 0a 20 20  ut->u.i = iA;.  
c150: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
c160: 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20  Out, MEM_Int);. 
c170: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
c180: 63 6f 64 65 3a 20 41 64 64 49 6d 6d 20 20 50 31  code: AddImm  P1
c190: 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 0a 2a 2a   P2 * * *.** .**
c1a0: 20 41 64 64 20 74 68 65 20 63 6f 6e 73 74 61 6e   Add the constan
c1b0: 74 20 50 32 20 74 6f 20 74 68 65 20 76 61 6c 75  t P2 to the valu
c1c0: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
c1d0: 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20  ..** The result 
c1e0: 69 73 20 61 6c 77 61 79 73 20 61 6e 20 69 6e 74  is always an int
c1f0: 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 66  eger..**.** To f
c200: 6f 72 63 65 20 61 6e 79 20 72 65 67 69 73 74 65  orce any registe
c210: 72 20 74 6f 20 62 65 20 61 6e 20 69 6e 74 65 67  r to be an integ
c220: 65 72 2c 20 6a 75 73 74 20 61 64 64 20 30 2e 0a  er, just add 0..
c230: 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 64 64 49 6d  */.case OP_AddIm
c240: 6d 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  m: {            
c250: 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31  /* in1 */.  pIn1
c260: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
c270: 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43  ];.  memAboutToC
c280: 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a  hange(p, pIn1);.
c290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
c2a0: 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 31 29  Integerify(pIn1)
c2b0: 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20 2b 3d  ;.  pIn1->u.i +=
c2c0: 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 62 72 65 61   pOp->p2;.  brea
c2d0: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
c2e0: 20 4d 75 73 74 42 65 49 6e 74 20 50 31 20 50 32   MustBeInt P1 P2
c2f0: 20 2a 20 2a 20 2a 0a 2a 2a 20 0a 2a 2a 20 46 6f   * * *.** .** Fo
c300: 72 63 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  rce the value in
c310: 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20   register P1 to 
c320: 62 65 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  be an integer.  
c330: 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  If the value.** 
c340: 69 6e 20 50 31 20 69 73 20 6e 6f 74 20 61 6e 20  in P1 is not an 
c350: 69 6e 74 65 67 65 72 20 61 6e 64 20 63 61 6e 6e  integer and cann
c360: 6f 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ot be converted 
c370: 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 0a  into an integer.
c380: 2a 2a 20 77 69 74 68 6f 75 74 20 64 61 74 61 20  ** without data 
c390: 6c 6f 73 73 2c 20 74 68 65 6e 20 6a 75 6d 70 20  loss, then jump 
c3a0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50  immediately to P
c3b0: 32 2c 20 6f 72 20 69 66 20 50 32 3d 3d 30 0a 2a  2, or if P2==0.*
c3c0: 2a 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49 54  * raise an SQLIT
c3d0: 45 5f 4d 49 53 4d 41 54 43 48 20 65 78 63 65 70  E_MISMATCH excep
c3e0: 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  tion..*/.case OP
c3f0: 5f 4d 75 73 74 42 65 49 6e 74 3a 20 7b 20 20 20  _MustBeInt: {   
c400: 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
c410: 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  , in1 */.  pIn1 
c420: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
c430: 3b 0a 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74  ;.  applyAffinit
c440: 79 28 70 49 6e 31 2c 20 53 51 4c 49 54 45 5f 41  y(pIn1, SQLITE_A
c450: 46 46 5f 4e 55 4d 45 52 49 43 2c 20 65 6e 63 6f  FF_NUMERIC, enco
c460: 64 69 6e 67 29 3b 0a 20 20 69 66 28 20 28 70 49  ding);.  if( (pI
c470: 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
c480: 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Int)==0 ){.    i
c490: 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 7b  f( pOp->p2==0 ){
c4a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
c4b0: 54 45 5f 4d 49 53 4d 41 54 43 48 3b 0a 20 20 20  TE_MISMATCH;.   
c4c0: 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
c4d0: 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
c4e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 63 20  }else{.      pc 
c4f0: 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
c500: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
c510: 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
c520: 28 70 49 6e 31 2c 20 4d 45 4d 5f 49 6e 74 29 3b  (pIn1, MEM_Int);
c530: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
c540: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c550: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
c560: 49 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  INT./* Opcode: R
c570: 65 61 6c 41 66 66 69 6e 69 74 79 20 50 31 20 2a  ealAffinity P1 *
c580: 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20   * * *.**.** If 
c590: 72 65 67 69 73 74 65 72 20 50 31 20 68 6f 6c 64  register P1 hold
c5a0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  s an integer con
c5b0: 76 65 72 74 20 69 74 20 74 6f 20 61 20 72 65 61  vert it to a rea
c5c0: 6c 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  l value..**.** T
c5d0: 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 75 73  his opcode is us
c5e0: 65 64 20 77 68 65 6e 20 65 78 74 72 61 63 74 69  ed when extracti
c5f0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
c600: 72 6f 6d 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61  rom a column tha
c610: 74 0a 2a 2a 20 68 61 73 20 52 45 41 4c 20 61 66  t.** has REAL af
c620: 66 69 6e 69 74 79 2e 20 20 53 75 63 68 20 63 6f  finity.  Such co
c630: 6c 75 6d 6e 20 76 61 6c 75 65 73 20 6d 61 79 20  lumn values may 
c640: 73 74 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20  still be stored 
c650: 61 73 0a 2a 2a 20 69 6e 74 65 67 65 72 73 2c 20  as.** integers, 
c660: 66 6f 72 20 73 70 61 63 65 20 65 66 66 69 63 69  for space effici
c670: 65 6e 63 79 2c 20 62 75 74 20 61 66 74 65 72 20  ency, but after 
c680: 65 78 74 72 61 63 74 69 6f 6e 20 77 65 20 77 61  extraction we wa
c690: 6e 74 20 74 68 65 6d 0a 2a 2a 20 74 6f 20 68 61  nt them.** to ha
c6a0: 76 65 20 6f 6e 6c 79 20 61 20 72 65 61 6c 20 76  ve only a real v
c6b0: 61 6c 75 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  alue..*/.case OP
c6c0: 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 3a 20 7b  _RealAffinity: {
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6e0: 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49    /* in1 */.  pI
c6f0: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
c700: 70 31 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d  p1];.  if( pIn1-
c710: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
c720: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
c730: 64 62 65 4d 65 6d 52 65 61 6c 69 66 79 28 70 49  dbeMemRealify(pI
c740: 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  n1);.  }.  break
c750: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
c760: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c770: 43 41 53 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  CAST./* Opcode: 
c780: 54 6f 54 65 78 74 20 50 31 20 2a 20 2a 20 2a 20  ToText P1 * * * 
c790: 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20 74 68  *.**.** Force th
c7a0: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
c7b0: 74 65 72 20 50 31 20 74 6f 20 62 65 20 74 65 78  ter P1 to be tex
c7c0: 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c  t..** If the val
c7d0: 75 65 20 69 73 20 6e 75 6d 65 72 69 63 2c 20 63  ue is numeric, c
c7e0: 6f 6e 76 65 72 74 20 69 74 20 74 6f 20 61 20 73  onvert it to a s
c7f0: 74 72 69 6e 67 20 75 73 69 6e 67 20 74 68 65 0a  tring using the.
c800: 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66  ** equivalent of
c810: 20 70 72 69 6e 74 66 28 29 2e 20 20 42 6c 6f 62   printf().  Blob
c820: 20 76 61 6c 75 65 73 20 61 72 65 20 75 6e 63 68   values are unch
c830: 61 6e 67 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65  anged and.** are
c840: 20 61 66 74 65 72 77 61 72 64 73 20 73 69 6d 70   afterwards simp
c850: 6c 79 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  ly interpreted a
c860: 73 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 41 20  s text..**.** A 
c870: 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f  NULL value is no
c880: 74 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 69  t changed by thi
c890: 73 20 72 6f 75 74 69 6e 65 2e 20 20 49 74 20 72  s routine.  It r
c8a0: 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  emains NULL..*/.
c8b0: 63 61 73 65 20 4f 50 5f 54 6f 54 65 78 74 3a 20  case OP_ToText: 
c8c0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
c8d0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
c8e0: 5f 54 4f 5f 54 45 58 54 2c 20 69 6e 31 20 2a 2f  _TO_TEXT, in1 */
c8f0: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
c900: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 6d 65 6d 41  pOp->p1];.  memA
c910: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
c920: 70 49 6e 31 29 3b 0a 20 20 69 66 28 20 70 49 6e  pIn1);.  if( pIn
c930: 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  1->flags & MEM_N
c940: 75 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 61  ull ) break;.  a
c950: 73 73 65 72 74 28 20 4d 45 4d 5f 53 74 72 3d 3d  ssert( MEM_Str==
c960: 28 4d 45 4d 5f 42 6c 6f 62 3e 3e 33 29 20 29 3b  (MEM_Blob>>3) );
c970: 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c  .  pIn1->flags |
c980: 3d 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d  = (pIn1->flags&M
c990: 45 4d 5f 42 6c 6f 62 29 3e 3e 33 3b 0a 20 20 61  EM_Blob)>>3;.  a
c9a0: 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e  pplyAffinity(pIn
c9b0: 31 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  1, SQLITE_AFF_TE
c9c0: 58 54 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  XT, encoding);. 
c9d0: 20 72 63 20 3d 20 45 78 70 61 6e 64 42 6c 6f 62   rc = ExpandBlob
c9e0: 28 70 49 6e 31 29 3b 0a 20 20 61 73 73 65 72 74  (pIn1);.  assert
c9f0: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20  ( pIn1->flags & 
ca00: 4d 45 4d 5f 53 74 72 20 7c 7c 20 64 62 2d 3e 6d  MEM_Str || db->m
ca10: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
ca20: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 3d 20   pIn1->flags &= 
ca30: 7e 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65  ~(MEM_Int|MEM_Re
ca40: 61 6c 7c 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f  al|MEM_Blob|MEM_
ca50: 5a 65 72 6f 29 3b 0a 20 20 55 50 44 41 54 45 5f  Zero);.  UPDATE_
ca60: 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e  MAX_BLOBSIZE(pIn
ca70: 31 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  1);.  break;.}..
ca80: 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 6f 42 6c 6f  /* Opcode: ToBlo
ca90: 62 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  b P1 * * * *.**.
caa0: 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c  ** Force the val
cab0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
cac0: 31 20 74 6f 20 62 65 20 61 20 42 4c 4f 42 2e 0a  1 to be a BLOB..
cad0: 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  ** If the value 
cae0: 69 73 20 6e 75 6d 65 72 69 63 2c 20 63 6f 6e 76  is numeric, conv
caf0: 65 72 74 20 69 74 20 74 6f 20 61 20 73 74 72 69  ert it to a stri
cb00: 6e 67 20 66 69 72 73 74 2e 0a 2a 2a 20 53 74 72  ng first..** Str
cb10: 69 6e 67 73 20 61 72 65 20 73 69 6d 70 6c 79 20  ings are simply 
cb20: 72 65 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  reinterpreted as
cb30: 20 62 6c 6f 62 73 20 77 69 74 68 20 6e 6f 20 63   blobs with no c
cb40: 68 61 6e 67 65 0a 2a 2a 20 74 6f 20 74 68 65 20  hange.** to the 
cb50: 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 2e  underlying data.
cb60: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76 61  .**.** A NULL va
cb70: 6c 75 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  lue is not chang
cb80: 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
cb90: 6e 65 2e 20 20 49 74 20 72 65 6d 61 69 6e 73 20  ne.  It remains 
cba0: 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  NULL..*/.case OP
cbb0: 5f 54 6f 42 6c 6f 62 3a 20 7b 20 20 20 20 20 20  _ToBlob: {      
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
cbd0: 61 6d 65 20 61 73 20 54 4b 5f 54 4f 5f 42 4c 4f  ame as TK_TO_BLO
cbe0: 42 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31  B, in1 */.  pIn1
cbf0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
cc00: 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66  ];.  if( pIn1->f
cc10: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
cc20: 29 20 62 72 65 61 6b 3b 0a 20 20 69 66 28 20 28  ) break;.  if( (
cc30: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
cc40: 4d 5f 42 6c 6f 62 29 3d 3d 30 20 29 7b 0a 20 20  M_Blob)==0 ){.  
cc50: 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28    applyAffinity(
cc60: 70 49 6e 31 2c 20 53 51 4c 49 54 45 5f 41 46 46  pIn1, SQLITE_AFF
cc70: 5f 54 45 58 54 2c 20 65 6e 63 6f 64 69 6e 67 29  _TEXT, encoding)
cc80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
cc90: 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
cca0: 53 74 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Str || db->mallo
ccb0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 4d  cFailed );.    M
ccc0: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 49  emSetTypeFlag(pI
ccd0: 6e 31 2c 20 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 20  n1, MEM_Blob);. 
cce0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 31   }else{.    pIn1
ccf0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d  ->flags &= ~(MEM
cd00: 5f 54 79 70 65 4d 61 73 6b 26 7e 4d 45 4d 5f 42  _TypeMask&~MEM_B
cd10: 6c 6f 62 29 3b 0a 20 20 7d 0a 20 20 55 50 44 41  lob);.  }.  UPDA
cd20: 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
cd30: 70 49 6e 31 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  pIn1);.  break;.
cd40: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 6f  }../* Opcode: To
cd50: 4e 75 6d 65 72 69 63 20 50 31 20 2a 20 2a 20 2a  Numeric P1 * * *
cd60: 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20 74   *.**.** Force t
cd70: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
cd80: 73 74 65 72 20 50 31 20 74 6f 20 62 65 20 6e 75  ster P1 to be nu
cd90: 6d 65 72 69 63 20 28 65 69 74 68 65 72 20 61 6e  meric (either an
cda0: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6f 72 20 61  .** integer or a
cdb0: 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20   floating-point 
cdc0: 6e 75 6d 62 65 72 2e 29 0a 2a 2a 20 49 66 20 74  number.).** If t
cdd0: 68 65 20 76 61 6c 75 65 20 69 73 20 74 65 78 74  he value is text
cde0: 20 6f 72 20 62 6c 6f 62 2c 20 74 72 79 20 74 6f   or blob, try to
cdf0: 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f 20 61   convert it to a
ce00: 6e 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 65  n using the.** e
ce10: 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 61 74 6f  quivalent of ato
ce20: 69 28 29 20 6f 72 20 61 74 6f 66 28 29 20 61 6e  i() or atof() an
ce30: 64 20 73 74 6f 72 65 20 30 20 69 66 20 6e 6f 20  d store 0 if no 
ce40: 73 75 63 68 20 63 6f 6e 76 65 72 73 69 6f 6e 20  such conversion 
ce50: 0a 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 2e  .** is possible.
ce60: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76 61  .**.** A NULL va
ce70: 6c 75 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  lue is not chang
ce80: 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
ce90: 6e 65 2e 20 20 49 74 20 72 65 6d 61 69 6e 73 20  ne.  It remains 
cea0: 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  NULL..*/.case OP
ceb0: 5f 54 6f 4e 75 6d 65 72 69 63 3a 20 7b 20 20 20  _ToNumeric: {   
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ced0: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 54 4f 5f  * same as TK_TO_
cee0: 4e 55 4d 45 52 49 43 2c 20 69 6e 31 20 2a 2f 0a  NUMERIC, in1 */.
cef0: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
cf00: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 73 71 6c 69 74  Op->p1];.  sqlit
cf10: 65 33 56 64 62 65 4d 65 6d 4e 75 6d 65 72 69 66  e3VdbeMemNumerif
cf20: 79 28 70 49 6e 31 29 3b 0a 20 20 62 72 65 61 6b  y(pIn1);.  break
cf30: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
cf40: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a  LITE_OMIT_CAST *
cf50: 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 6f  /../* Opcode: To
cf60: 49 6e 74 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a  Int P1 * * * *.*
cf70: 2a 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76  *.** Force the v
cf80: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
cf90: 20 50 31 20 74 6f 20 62 65 20 61 6e 20 69 6e 74   P1 to be an int
cfa0: 65 67 65 72 2e 20 20 49 66 0a 2a 2a 20 54 68 65  eger.  If.** The
cfb0: 20 76 61 6c 75 65 20 69 73 20 63 75 72 72 65 6e   value is curren
cfc0: 74 6c 79 20 61 20 72 65 61 6c 20 6e 75 6d 62 65  tly a real numbe
cfd0: 72 2c 20 64 72 6f 70 20 69 74 73 20 66 72 61 63  r, drop its frac
cfe0: 74 69 6f 6e 61 6c 20 70 61 72 74 2e 0a 2a 2a 20  tional part..** 
cff0: 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  If the value is 
d000: 74 65 78 74 20 6f 72 20 62 6c 6f 62 2c 20 74 72  text or blob, tr
d010: 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 69 74 20  y to convert it 
d020: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 75 73  to an integer us
d030: 69 6e 67 20 74 68 65 0a 2a 2a 20 65 71 75 69 76  ing the.** equiv
d040: 61 6c 65 6e 74 20 6f 66 20 61 74 6f 69 28 29 20  alent of atoi() 
d050: 61 6e 64 20 73 74 6f 72 65 20 30 20 69 66 20 6e  and store 0 if n
d060: 6f 20 73 75 63 68 20 63 6f 6e 76 65 72 73 69 6f  o such conversio
d070: 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  n is possible..*
d080: 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75  *.** A NULL valu
d090: 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
d0a0: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
d0b0: 2e 20 20 49 74 20 72 65 6d 61 69 6e 73 20 4e 55  .  It remains NU
d0c0: 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54  LL..*/.case OP_T
d0d0: 6f 49 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20  oInt: {         
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 49 4e 54 2c 20 69   as TK_TO_INT, i
d100: 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
d110: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
d120: 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
d130: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30  s & MEM_Null)==0
d140: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
d150: 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79  dbeMemIntegerify
d160: 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72  (pIn1);.  }.  br
d170: 65 61 6b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  eak;.}..#if !def
d180: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
d190: 5f 43 41 53 54 29 20 26 26 20 21 64 65 66 69 6e  _CAST) && !defin
d1a0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
d1b0: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 2f  LOATING_POINT)./
d1c0: 2a 20 4f 70 63 6f 64 65 3a 20 54 6f 52 65 61 6c  * Opcode: ToReal
d1d0: 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
d1e0: 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75  * Force the valu
d1f0: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
d200: 20 74 6f 20 62 65 20 61 20 66 6c 6f 61 74 69 6e   to be a floatin
d210: 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 0a  g point number..
d220: 2a 2a 20 49 66 20 54 68 65 20 76 61 6c 75 65 20  ** If The value 
d230: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20  is currently an 
d240: 69 6e 74 65 67 65 72 2c 20 63 6f 6e 76 65 72 74  integer, convert
d250: 20 69 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 76   it..** If the v
d260: 61 6c 75 65 20 69 73 20 74 65 78 74 20 6f 72 20  alue is text or 
d270: 62 6c 6f 62 2c 20 74 72 79 20 74 6f 20 63 6f 6e  blob, try to con
d280: 76 65 72 74 20 69 74 20 74 6f 20 61 6e 20 69 6e  vert it to an in
d290: 74 65 67 65 72 20 75 73 69 6e 67 20 74 68 65 0a  teger using the.
d2a0: 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66  ** equivalent of
d2b0: 20 61 74 6f 69 28 29 20 61 6e 64 20 73 74 6f 72   atoi() and stor
d2c0: 65 20 30 2e 30 20 69 66 20 6e 6f 20 73 75 63 68  e 0.0 if no such
d2d0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 70   conversion is p
d2e0: 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  ossible..**.** A
d2f0: 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e   NULL value is n
d300: 6f 74 20 63 68 61 6e 67 65 64 20 62 79 20 74 68  ot changed by th
d310: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 49 74 20  is routine.  It 
d320: 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f  remains NULL..*/
d330: 0a 63 61 73 65 20 4f 50 5f 54 6f 52 65 61 6c 3a  .case OP_ToReal:
d340: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
d350: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
d360: 4b 5f 54 4f 5f 52 45 41 4c 2c 20 69 6e 31 20 2a  K_TO_REAL, in1 *
d370: 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
d380: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 6d 65 6d  [pOp->p1];.  mem
d390: 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
d3a0: 20 70 49 6e 31 29 3b 0a 20 20 69 66 28 20 28 70   pIn1);.  if( (p
d3b0: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
d3c0: 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  _Null)==0 ){.   
d3d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
d3e0: 65 61 6c 69 66 79 28 70 49 6e 31 29 3b 0a 20 20  ealify(pIn1);.  
d3f0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  }.  break;.}.#en
d400: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
d410: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
d420: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
d430: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
d440: 4e 47 5f 50 4f 49 4e 54 29 20 2a 2f 0a 0a 2f 2a  NG_POINT) */../*
d450: 20 4f 70 63 6f 64 65 3a 20 4c 74 20 50 31 20 50   Opcode: Lt P1 P
d460: 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
d470: 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c   Compare the val
d480: 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  ues in register 
d490: 50 31 20 61 6e 64 20 50 33 2e 20 20 49 66 20 72  P1 and P3.  If r
d4a0: 65 67 28 50 33 29 3c 72 65 67 28 50 31 29 20 74  eg(P3)<reg(P1) t
d4b0: 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 61  hen.** jump to a
d4c0: 64 64 72 65 73 73 20 50 32 2e 20 20 0a 2a 2a 0a  ddress P2.  .**.
d4d0: 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45  ** If the SQLITE
d4e0: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 62 69 74 20  _JUMPIFNULL bit 
d4f0: 6f 66 20 50 35 20 69 73 20 73 65 74 20 61 6e 64  of P5 is set and
d500: 20 65 69 74 68 65 72 20 72 65 67 28 50 31 29 20   either reg(P1) 
d510: 6f 72 0a 2a 2a 20 72 65 67 28 50 33 29 20 69 73  or.** reg(P3) is
d520: 20 4e 55 4c 4c 20 74 68 65 6e 20 74 61 6b 65 20   NULL then take 
d530: 74 68 65 20 6a 75 6d 70 2e 20 20 49 66 20 74 68  the jump.  If th
d540: 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  e SQLITE_JUMPIFN
d550: 55 4c 4c 20 0a 2a 2a 20 62 69 74 20 69 73 20 63  ULL .** bit is c
d560: 6c 65 61 72 20 74 68 65 6e 20 66 61 6c 6c 20 74  lear then fall t
d570: 68 72 6f 75 67 68 20 69 66 20 65 69 74 68 65 72  hrough if either
d580: 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c   operand is NULL
d590: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
d5a0: 54 45 5f 41 46 46 5f 4d 41 53 4b 20 70 6f 72 74  TE_AFF_MASK port
d5b0: 69 6f 6e 20 6f 66 20 50 35 20 6d 75 73 74 20 62  ion of P5 must b
d5c0: 65 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68  e an affinity ch
d5d0: 61 72 61 63 74 65 72 20 2d 0a 2a 2a 20 53 51 4c  aracter -.** SQL
d5e0: 49 54 45 5f 41 46 46 5f 54 45 58 54 2c 20 53 51  ITE_AFF_TEXT, SQ
d5f0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
d600: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  , and so forth. 
d610: 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  An attempt is ma
d620: 64 65 20 0a 2a 2a 20 74 6f 20 63 6f 65 72 63 65  de .** to coerce
d630: 20 62 6f 74 68 20 69 6e 70 75 74 73 20 61 63 63   both inputs acc
d640: 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 61  ording to this a
d650: 66 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20 74  ffinity before t
d660: 68 65 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e  he.** comparison
d670: 20 69 73 20 6d 61 64 65 2e 20 49 66 20 74 68 65   is made. If the
d680: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b   SQLITE_AFF_MASK
d690: 20 69 73 20 30 78 30 30 2c 20 74 68 65 6e 20 6e   is 0x00, then n
d6a0: 75 6d 65 72 69 63 0a 2a 2a 20 61 66 66 69 6e 69  umeric.** affini
d6b0: 74 79 20 69 73 20 75 73 65 64 2e 20 4e 6f 74 65  ty is used. Note
d6c0: 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69   that the affini
d6d0: 74 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61  ty conversions a
d6e0: 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 62 61 63  re stored.** bac
d6f0: 6b 20 69 6e 74 6f 20 74 68 65 20 69 6e 70 75 74  k into the input
d700: 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61 6e   registers P1 an
d710: 64 20 50 33 2e 20 20 53 6f 20 74 68 69 73 20 6f  d P3.  So this o
d720: 70 63 6f 64 65 20 63 61 6e 20 63 61 75 73 65 0a  pcode can cause.
d730: 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 20 63 68  ** persistent ch
d740: 61 6e 67 65 73 20 74 6f 20 72 65 67 69 73 74 65  anges to registe
d750: 72 73 20 50 31 20 61 6e 64 20 50 33 2e 0a 2a 2a  rs P1 and P3..**
d760: 0a 2a 2a 20 4f 6e 63 65 20 61 6e 79 20 63 6f 6e  .** Once any con
d770: 76 65 72 73 69 6f 6e 73 20 68 61 76 65 20 74 61  versions have ta
d780: 6b 65 6e 20 70 6c 61 63 65 2c 20 61 6e 64 20 6e  ken place, and n
d790: 65 69 74 68 65 72 20 76 61 6c 75 65 20 69 73 20  either value is 
d7a0: 4e 55 4c 4c 2c 20 0a 2a 2a 20 74 68 65 20 76 61  NULL, .** the va
d7b0: 6c 75 65 73 20 61 72 65 20 63 6f 6d 70 61 72 65  lues are compare
d7c0: 64 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65  d. If both value
d7d0: 73 20 61 72 65 20 62 6c 6f 62 73 20 74 68 65 6e  s are blobs then
d7e0: 20 6d 65 6d 63 6d 70 28 29 20 69 73 0a 2a 2a 20   memcmp() is.** 
d7f0: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
d800: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
d810: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
d820: 20 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73    If both values
d830: 0a 2a 2a 20 61 72 65 20 74 65 78 74 2c 20 74 68  .** are text, th
d840: 65 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  en the appropria
d850: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  te collating fun
d860: 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
d870: 69 6e 0a 2a 2a 20 50 34 20 69 73 20 20 75 73 65  in.** P4 is  use
d880: 64 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70  d to do the comp
d890: 61 72 69 73 6f 6e 2e 20 20 49 66 20 50 34 20 69  arison.  If P4 i
d8a0: 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  s not specified 
d8b0: 74 68 65 6e 0a 2a 2a 20 6d 65 6d 63 6d 70 28 29  then.** memcmp()
d8c0: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   is used to comp
d8d0: 61 72 65 20 74 65 78 74 20 73 74 72 69 6e 67 2e  are text string.
d8e0: 20 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73    If both values
d8f0: 20 61 72 65 0a 2a 2a 20 6e 75 6d 65 72 69 63 2c   are.** numeric,
d900: 20 74 68 65 6e 20 61 20 6e 75 6d 65 72 69 63 20   then a numeric 
d910: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 75 73  comparison is us
d920: 65 64 2e 20 49 66 20 74 68 65 20 74 77 6f 20 76  ed. If the two v
d930: 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 6f 66 20  alues.** are of 
d940: 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 2c  different types,
d950: 20 74 68 65 6e 20 6e 75 6d 62 65 72 73 20 61 72   then numbers ar
d960: 65 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 65 73  e considered les
d970: 73 20 74 68 61 6e 0a 2a 2a 20 73 74 72 69 6e 67  s than.** string
d980: 73 20 61 6e 64 20 73 74 72 69 6e 67 73 20 61 72  s and strings ar
d990: 65 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 65 73  e considered les
d9a0: 73 20 74 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2a  s than blobs..**
d9b0: 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54  .** If the SQLIT
d9c0: 45 5f 53 54 4f 52 45 50 32 20 62 69 74 20 6f 66  E_STOREP2 bit of
d9d0: 20 50 35 20 69 73 20 73 65 74 2c 20 74 68 65 6e   P5 is set, then
d9e0: 20 64 6f 20 6e 6f 74 20 6a 75 6d 70 2e 20 20 49   do not jump.  I
d9f0: 6e 73 74 65 61 64 2c 0a 2a 2a 20 73 74 6f 72 65  nstead,.** store
da00: 20 61 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c   a boolean resul
da10: 74 20 28 65 69 74 68 65 72 20 30 2c 20 6f 72 20  t (either 0, or 
da20: 31 2c 20 6f 72 20 4e 55 4c 4c 29 20 69 6e 20 72  1, or NULL) in r
da30: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
da40: 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
da50: 4e 55 4c 4c 45 51 20 62 69 74 20 69 73 20 73 65  NULLEQ bit is se
da60: 74 20 69 6e 20 50 35 2c 20 74 68 65 6e 20 4e 55  t in P5, then NU
da70: 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  LL values are co
da80: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 65 71 75 61  nsidered.** equa
da90: 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72  l to one another
daa0: 2c 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20  , provided that 
dab0: 74 68 65 79 20 64 6f 20 6e 6f 74 20 68 61 76 65  they do not have
dac0: 20 74 68 65 69 72 20 4d 45 4d 5f 43 6c 65 61 72   their MEM_Clear
dad0: 65 64 0a 2a 2a 20 62 69 74 20 73 65 74 2e 0a 2a  ed.** bit set..*
dae0: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 20  /./* Opcode: Ne 
daf0: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
db00: 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
db10: 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 4c 74  just like the Lt
db20: 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20 74   opcode except t
db30: 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20  hat the jump is 
db40: 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20  taken if.** the 
db50: 6f 70 65 72 61 6e 64 73 20 69 6e 20 72 65 67 69  operands in regi
db60: 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 33 20  sters P1 and P3 
db70: 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 2e 20 20  are not equal.  
db80: 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64  See the Lt opcod
db90: 65 20 66 6f 72 0a 2a 2a 20 61 64 64 69 74 69 6f  e for.** additio
dba0: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
dbb0: 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
dbc0: 5f 4e 55 4c 4c 45 51 20 69 73 20 73 65 74 20 69  _NULLEQ is set i
dbd0: 6e 20 50 35 20 74 68 65 6e 20 74 68 65 20 72 65  n P5 then the re
dbe0: 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73  sult of comparis
dbf0: 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65 69 74  on is always eit
dc00: 68 65 72 0a 2a 2a 20 74 72 75 65 20 6f 72 20 66  her.** true or f
dc10: 61 6c 73 65 20 61 6e 64 20 69 73 20 6e 65 76 65  alse and is neve
dc20: 72 20 4e 55 4c 4c 2e 20 20 49 66 20 62 6f 74 68  r NULL.  If both
dc30: 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 4e 55   operands are NU
dc40: 4c 4c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  LL then the resu
dc50: 6c 74 0a 2a 2a 20 6f 66 20 63 6f 6d 70 61 72 69  lt.** of compari
dc60: 73 6f 6e 20 69 73 20 66 61 6c 73 65 2e 20 20 49  son is false.  I
dc70: 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64  f either operand
dc80: 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68   is NULL then th
dc90: 65 20 72 65 73 75 6c 74 20 69 73 20 74 72 75 65  e result is true
dca0: 2e 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20  ..** If neither 
dcb0: 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20  operand is NULL 
dcc0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68  the result is th
dcd0: 65 20 73 61 6d 65 20 61 73 20 69 74 20 77 6f 75  e same as it wou
dce0: 6c 64 20 62 65 20 69 66 0a 2a 2a 20 74 68 65 20  ld be if.** the 
dcf0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 66 6c  SQLITE_NULLEQ fl
dd00: 61 67 20 77 65 72 65 20 6f 6d 69 74 74 65 64 20  ag were omitted 
dd10: 66 72 6f 6d 20 50 35 2e 0a 2a 2f 0a 2f 2a 20 4f  from P5..*/./* O
dd20: 70 63 6f 64 65 3a 20 45 71 20 50 31 20 50 32 20  pcode: Eq P1 P2 
dd30: 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54  P3 P4 P5.**.** T
dd40: 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
dd50: 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64  ike the Lt opcod
dd60: 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  e except that th
dd70: 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20  e jump is taken 
dd80: 69 66 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 6e  if.** the operan
dd90: 64 73 20 69 6e 20 72 65 67 69 73 74 65 72 73 20  ds in registers 
dda0: 50 31 20 61 6e 64 20 50 33 20 61 72 65 20 65 71  P1 and P3 are eq
ddb0: 75 61 6c 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20  ual..** See the 
ddc0: 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 64  Lt opcode for ad
ddd0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
dde0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  tion..**.** If S
ddf0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20  QLITE_NULLEQ is 
de00: 73 65 74 20 69 6e 20 50 35 20 74 68 65 6e 20 74  set in P5 then t
de10: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d  he result of com
de20: 70 61 72 69 73 6f 6e 20 69 73 20 61 6c 77 61 79  parison is alway
de30: 73 20 65 69 74 68 65 72 0a 2a 2a 20 74 72 75 65  s either.** true
de40: 20 6f 72 20 66 61 6c 73 65 20 61 6e 64 20 69 73   or false and is
de50: 20 6e 65 76 65 72 20 4e 55 4c 4c 2e 20 20 49 66   never NULL.  If
de60: 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61   both operands a
de70: 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65  re NULL then the
de80: 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 66 20 63 6f   result.** of co
de90: 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 72 75 65  mparison is true
dea0: 2e 20 20 49 66 20 65 69 74 68 65 72 20 6f 70 65  .  If either ope
deb0: 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74 68 65  rand is NULL the
dec0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
ded0: 66 61 6c 73 65 2e 0a 2a 2a 20 49 66 20 6e 65 69  false..** If nei
dee0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
def0: 4e 55 4c 4c 20 74 68 65 20 72 65 73 75 6c 74 20  NULL the result 
df00: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 69  is the same as i
df10: 74 20 77 6f 75 6c 64 20 62 65 20 69 66 0a 2a 2a  t would be if.**
df20: 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c   the SQLITE_NULL
df30: 45 51 20 66 6c 61 67 20 77 65 72 65 20 6f 6d 69  EQ flag were omi
df40: 74 74 65 64 20 66 72 6f 6d 20 50 35 2e 0a 2a 2f  tted from P5..*/
df50: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 65 20 50  ./* Opcode: Le P
df60: 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
df70: 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a  .** This works j
df80: 75 73 74 20 6c 69 6b 65 20 74 68 65 20 4c 74 20  ust like the Lt 
df90: 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20 74 68  opcode except th
dfa0: 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74  at the jump is t
dfb0: 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63  aken if.** the c
dfc0: 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74  ontent of regist
dfd0: 65 72 20 50 33 20 69 73 20 6c 65 73 73 20 74 68  er P3 is less th
dfe0: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
dff0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a  he content of.**
e000: 20 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 53   register P1.  S
e010: 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65  ee the Lt opcode
e020: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
e030: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
e040: 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 74 20 50 31  /* Opcode: Gt P1
e050: 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a   P2 P3 P4 P5.**.
e060: 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75  ** This works ju
e070: 73 74 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f  st like the Lt o
e080: 70 63 6f 64 65 20 65 78 63 65 70 74 20 74 68 61  pcode except tha
e090: 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61  t the jump is ta
e0a0: 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ken if.** the co
e0b0: 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65  ntent of registe
e0c0: 72 20 50 33 20 69 73 20 67 72 65 61 74 65 72 20  r P3 is greater 
e0d0: 74 68 61 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  than the content
e0e0: 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65 72 20   of.** register 
e0f0: 50 31 2e 20 20 53 65 65 20 74 68 65 20 4c 74 20  P1.  See the Lt 
e100: 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74  opcode for addit
e110: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
e120: 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  n..*/./* Opcode:
e130: 20 47 65 20 50 31 20 50 32 20 50 33 20 50 34 20   Ge P1 P2 P3 P4 
e140: 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  P5.**.** This wo
e150: 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68  rks just like th
e160: 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65  e Lt opcode exce
e170: 70 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70  pt that the jump
e180: 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20   is taken if.** 
e190: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72  the content of r
e1a0: 65 67 69 73 74 65 72 20 50 33 20 69 73 20 67 72  egister P3 is gr
e1b0: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
e1c0: 75 61 6c 20 74 6f 20 74 68 65 20 63 6f 6e 74 65  ual to the conte
e1d0: 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65  nt of.** registe
e1e0: 72 20 50 31 2e 20 20 53 65 65 20 74 68 65 20 4c  r P1.  See the L
e1f0: 74 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 64  t opcode for add
e200: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
e210: 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ion..*/.case OP_
e220: 45 71 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq:             
e230: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
e240: 45 51 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69  EQ, jump, in1, i
e250: 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65  n3 */.case OP_Ne
e260: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
e270: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4e 45  /* same as TK_NE
e280: 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33  , jump, in1, in3
e290: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 74 3a 20   */.case OP_Lt: 
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e2b0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c 54 2c 20   same as TK_LT, 
e2c0: 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a  jump, in1, in3 *
e2d0: 2f 0a 63 61 73 65 20 4f 50 5f 4c 65 3a 20 20 20  /.case OP_Le:   
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
e2f0: 61 6d 65 20 61 73 20 54 4b 5f 4c 45 2c 20 6a 75  ame as TK_LE, ju
e300: 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a  mp, in1, in3 */.
e310: 63 61 73 65 20 4f 50 5f 47 74 3a 20 20 20 20 20  case OP_Gt:     
e320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
e330: 65 20 61 73 20 54 4b 5f 47 54 2c 20 6a 75 6d 70  e as TK_GT, jump
e340: 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61  , in1, in3 */.ca
e350: 73 65 20 4f 50 5f 47 65 3a 20 7b 20 20 20 20 20  se OP_Ge: {     
e360: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
e370: 61 73 20 54 4b 5f 47 45 2c 20 6a 75 6d 70 2c 20  as TK_GE, jump, 
e380: 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e  in1, in3 */.  in
e390: 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
e3a0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 74    /* Result of t
e3b0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  he comparison of
e3c0: 20 70 49 6e 31 20 61 67 61 69 6e 73 74 20 70 49   pIn1 against pI
e3d0: 6e 33 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66  n3 */.  char aff
e3e0: 69 6e 69 74 79 3b 20 20 20 20 20 20 2f 2a 20 41  inity;      /* A
e3f0: 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 66  ffinity to use f
e400: 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f  or comparison */
e410: 0a 20 20 75 31 36 20 66 6c 61 67 73 31 3b 20 20  .  u16 flags1;  
e420: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
e430: 66 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  f initial value 
e440: 6f 66 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 2a  of pIn1->flags *
e450: 2f 0a 20 20 75 31 36 20 66 6c 61 67 73 33 3b 20  /.  u16 flags3; 
e460: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
e470: 6f 66 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  of initial value
e480: 20 6f 66 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20   of pIn3->flags 
e490: 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d  */..  pIn1 = &aM
e4a0: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70  em[pOp->p1];.  p
e4b0: 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In3 = &aMem[pOp-
e4c0: 3e 70 33 5d 3b 0a 20 20 66 6c 61 67 73 31 20 3d  >p3];.  flags1 =
e4d0: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 3b 0a 20 20   pIn1->flags;.  
e4e0: 66 6c 61 67 73 33 20 3d 20 70 49 6e 33 2d 3e 66  flags3 = pIn3->f
e4f0: 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 66 6c 61  lags;.  if( (fla
e500: 67 73 31 20 7c 20 66 6c 61 67 73 33 29 26 4d 45  gs1 | flags3)&ME
e510: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2f 2a  M_Null ){.    /*
e520: 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 70 65   One or both ope
e530: 72 61 6e 64 73 20 61 72 65 20 4e 55 4c 4c 20 2a  rands are NULL *
e540: 2f 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  /.    if( pOp->p
e550: 35 20 26 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  5 & SQLITE_NULLE
e560: 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  Q ){.      /* If
e570: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69   SQLITE_NULLEQ i
e580: 73 20 73 65 74 20 28 77 68 69 63 68 20 77 69 6c  s set (which wil
e590: 6c 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  l only happen if
e5a0: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73   the operator is
e5b0: 0a 20 20 20 20 20 20 2a 2a 20 4f 50 5f 45 71 20  .      ** OP_Eq 
e5c0: 6f 72 20 4f 50 5f 4e 65 29 20 74 68 65 6e 20 74  or OP_Ne) then t
e5d0: 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 6f 72 20  ake the jump or 
e5e0: 6e 6f 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  not depending on
e5f0: 20 77 68 65 74 68 65 72 0a 20 20 20 20 20 20 2a   whether.      *
e600: 2a 20 6f 72 20 6e 6f 74 20 62 6f 74 68 20 6f 70  * or not both op
e610: 65 72 61 6e 64 73 20 61 72 65 20 6e 75 6c 6c 2e  erands are null.
e620: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e630: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
e640: 6f 64 65 3d 3d 4f 50 5f 45 71 20 7c 7c 20 70 4f  ode==OP_Eq || pO
e650: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65  p->opcode==OP_Ne
e660: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
e670: 28 20 28 66 6c 61 67 73 31 20 26 20 4d 45 4d 5f  ( (flags1 & MEM_
e680: 43 6c 65 61 72 65 64 29 3d 3d 30 20 29 3b 0a 20  Cleared)==0 );. 
e690: 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 31       if( (flags1
e6a0: 26 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 0a 20 20  &MEM_Null)!=0.  
e6b0: 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 33 26       && (flags3&
e6c0: 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 0a 20 20 20  MEM_Null)!=0.   
e6d0: 20 20 20 20 26 26 20 28 66 6c 61 67 73 33 26 4d      && (flags3&M
e6e0: 45 4d 5f 43 6c 65 61 72 65 64 29 3d 3d 30 0a 20  EM_Cleared)==0. 
e6f0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
e700: 72 65 73 20 3d 20 30 3b 20 20 2f 2a 20 52 65 73  res = 0;  /* Res
e710: 75 6c 74 73 20 61 72 65 20 65 71 75 61 6c 20 2a  ults are equal *
e720: 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
e730: 20 20 20 20 20 20 20 72 65 73 20 3d 20 31 3b 20         res = 1; 
e740: 20 2f 2a 20 52 65 73 75 6c 74 73 20 61 72 65 20   /* Results are 
e750: 6e 6f 74 20 65 71 75 61 6c 20 2a 2f 0a 20 20 20  not equal */.   
e760: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
e770: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
e780: 4e 55 4c 4c 45 51 20 69 73 20 63 6c 65 61 72 20  NULLEQ is clear 
e790: 61 6e 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  and at least one
e7a0: 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c   operand is NULL
e7b0: 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
e7c0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c  the result is al
e7d0: 77 61 79 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  ways NULL..     
e7e0: 20 2a 2a 20 54 68 65 20 6a 75 6d 70 20 69 73 20   ** The jump is 
e7f0: 74 61 6b 65 6e 20 69 66 20 74 68 65 20 53 51 4c  taken if the SQL
e800: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 62  ITE_JUMPIFNULL b
e810: 69 74 20 69 73 20 73 65 74 2e 0a 20 20 20 20 20  it is set..     
e820: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f   */.      if( pO
e830: 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53  p->p5 & SQLITE_S
e840: 54 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 20 20  TOREP2 ){.      
e850: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
e860: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 20 20 20  Op->p2];.       
e870: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
e880: 70 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  pOut, MEM_Null);
e890: 0a 20 20 20 20 20 20 20 20 52 45 47 49 53 54 45  .        REGISTE
e8a0: 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c  R_TRACE(pOp->p2,
e8b0: 20 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65   pOut);.      }e
e8c0: 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 70 35 20  lse if( pOp->p5 
e8d0: 26 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  & SQLITE_JUMPIFN
e8e0: 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ULL ){.        p
e8f0: 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20  c = pOp->p2-1;. 
e900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
e910: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ak;.    }.  }els
e920: 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  e{.    /* Neithe
e930: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
e940: 4c 2e 20 20 44 6f 20 61 20 63 6f 6d 70 61 72 69  L.  Do a compari
e950: 73 6f 6e 2e 20 2a 2f 0a 20 20 20 20 61 66 66 69  son. */.    affi
e960: 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 35 20 26  nity = pOp->p5 &
e970: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b   SQLITE_AFF_MASK
e980: 3b 0a 20 20 20 20 69 66 28 20 61 66 66 69 6e 69  ;.    if( affini
e990: 74 79 20 29 7b 0a 20 20 20 20 20 20 61 70 70 6c  ty ){.      appl
e9a0: 79 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 20  yAffinity(pIn1, 
e9b0: 61 66 66 69 6e 69 74 79 2c 20 65 6e 63 6f 64 69  affinity, encodi
e9c0: 6e 67 29 3b 0a 20 20 20 20 20 20 61 70 70 6c 79  ng);.      apply
e9d0: 41 66 66 69 6e 69 74 79 28 70 49 6e 33 2c 20 61  Affinity(pIn3, a
e9e0: 66 66 69 6e 69 74 79 2c 20 65 6e 63 6f 64 69 6e  ffinity, encodin
e9f0: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  g);.      if( db
ea00: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
ea10: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
ea20: 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
ea30: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
ea40: 5f 43 4f 4c 4c 53 45 51 20 7c 7c 20 70 4f 70 2d  _COLLSEQ || pOp-
ea50: 3e 70 34 2e 70 43 6f 6c 6c 3d 3d 30 20 29 3b 0a  >p4.pColl==0 );.
ea60: 20 20 20 20 45 78 70 61 6e 64 42 6c 6f 62 28 70      ExpandBlob(p
ea70: 49 6e 31 29 3b 0a 20 20 20 20 45 78 70 61 6e 64  In1);.    Expand
ea80: 42 6c 6f 62 28 70 49 6e 33 29 3b 0a 20 20 20 20  Blob(pIn3);.    
ea90: 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  res = sqlite3Mem
eaa0: 43 6f 6d 70 61 72 65 28 70 49 6e 33 2c 20 70 49  Compare(pIn3, pI
eab0: 6e 31 2c 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c  n1, pOp->p4.pCol
eac0: 6c 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  l);.  }.  switch
ead0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b  ( pOp->opcode ){
eae0: 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 45 71 3a  .    case OP_Eq:
eaf0: 20 20 20 20 72 65 73 20 3d 20 72 65 73 3d 3d 30      res = res==0
eb00: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
eb10: 20 63 61 73 65 20 4f 50 5f 4e 65 3a 20 20 20 20   case OP_Ne:    
eb20: 72 65 73 20 3d 20 72 65 73 21 3d 30 3b 20 20 20  res = res!=0;   
eb30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
eb40: 65 20 4f 50 5f 4c 74 3a 20 20 20 20 72 65 73 20  e OP_Lt:    res 
eb50: 3d 20 72 65 73 3c 30 3b 20 20 20 20 20 20 62 72  = res<0;      br
eb60: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50  eak;.    case OP
eb70: 5f 4c 65 3a 20 20 20 20 72 65 73 20 3d 20 72 65  _Le:    res = re
eb80: 73 3c 3d 30 3b 20 20 20 20 20 62 72 65 61 6b 3b  s<=0;     break;
eb90: 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 47 74 3a  .    case OP_Gt:
eba0: 20 20 20 20 72 65 73 20 3d 20 72 65 73 3e 30 3b      res = res>0;
ebb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ebc0: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
ebd0: 72 65 73 20 3d 20 72 65 73 3e 3d 30 3b 20 20 20  res = res>=0;   
ebe0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
ebf0: 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51  if( pOp->p5 & SQ
ec00: 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a  LITE_STOREP2 ){.
ec10: 20 20 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d      pOut = &aMem
ec20: 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 6d  [pOp->p2];.    m
ec30: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
ec40: 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 4d 65  p, pOut);.    Me
ec50: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
ec60: 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 20  t, MEM_Int);.   
ec70: 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 65 73   pOut->u.i = res
ec80: 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54  ;.    REGISTER_T
ec90: 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f  RACE(pOp->p2, pO
eca0: 75 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ut);.  }else if(
ecb0: 20 72 65 73 20 29 7b 0a 20 20 20 20 70 63 20 3d   res ){.    pc =
ecc0: 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d 0a   pOp->p2-1;.  }.
ecd0: 0a 20 20 2f 2a 20 55 6e 64 6f 20 61 6e 79 20 63  .  /* Undo any c
ece0: 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 61  hanges made by a
ecf0: 70 70 6c 79 41 66 66 69 6e 69 74 79 28 29 20 74  pplyAffinity() t
ed00: 6f 20 74 68 65 20 69 6e 70 75 74 20 72 65 67 69  o the input regi
ed10: 73 74 65 72 73 2e 20 2a 2f 0a 20 20 70 49 6e 31  sters. */.  pIn1
ed20: 2d 3e 66 6c 61 67 73 20 3d 20 28 70 49 6e 31 2d  ->flags = (pIn1-
ed30: 3e 66 6c 61 67 73 26 7e 4d 45 4d 5f 54 79 70 65  >flags&~MEM_Type
ed40: 4d 61 73 6b 29 20 7c 20 28 66 6c 61 67 73 31 26  Mask) | (flags1&
ed50: 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 3b 0a 20  MEM_TypeMask);. 
ed60: 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 3d 20 28   pIn3->flags = (
ed70: 70 49 6e 33 2d 3e 66 6c 61 67 73 26 7e 4d 45 4d  pIn3->flags&~MEM
ed80: 5f 54 79 70 65 4d 61 73 6b 29 20 7c 20 28 66 6c  _TypeMask) | (fl
ed90: 61 67 73 33 26 4d 45 4d 5f 54 79 70 65 4d 61 73  ags3&MEM_TypeMas
eda0: 6b 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  k);.  break;.}..
edb0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 65 72 6d 75  /* Opcode: Permu
edc0: 74 61 74 69 6f 6e 20 2a 20 2a 20 2a 20 50 34 20  tation * * * P4 
edd0: 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  *.**.** Set the 
ede0: 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
edf0: 20 62 79 20 74 68 65 20 4f 50 5f 43 6f 6d 70 61   by the OP_Compa
ee00: 72 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62  re operator to b
ee10: 65 20 74 68 65 20 61 72 72 61 79 0a 2a 2a 20 6f  e the array.** o
ee20: 66 20 69 6e 74 65 67 65 72 73 20 69 6e 20 50 34  f integers in P4
ee30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 6d  ..**.** The perm
ee40: 75 74 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  utation is only 
ee50: 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20  valid until the 
ee60: 6e 65 78 74 20 4f 50 5f 43 6f 6d 70 61 72 65 20  next OP_Compare 
ee70: 74 68 61 74 20 68 61 73 0a 2a 2a 20 74 68 65 20  that has.** the 
ee80: 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 20 62  OPFLAG_PERMUTE b
ee90: 69 74 20 73 65 74 20 69 6e 20 50 35 2e 20 54 79  it set in P5. Ty
eea0: 70 69 63 61 6c 6c 79 20 74 68 65 20 4f 50 5f 50  pically the OP_P
eeb0: 65 72 6d 75 74 61 74 69 6f 6e 20 73 68 6f 75 6c  ermutation shoul
eec0: 64 20 0a 2a 2a 20 6f 63 63 75 72 20 69 6d 6d 65  d .** occur imme
eed0: 64 69 61 74 65 6c 79 20 70 72 69 6f 72 20 74 6f  diately prior to
eee0: 20 74 68 65 20 4f 50 5f 43 6f 6d 70 61 72 65 2e   the OP_Compare.
eef0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 65 72 6d  .*/.case OP_Perm
ef00: 75 74 61 74 69 6f 6e 3a 20 7b 0a 20 20 61 73 73  utation: {.  ass
ef10: 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
ef20: 3d 3d 50 34 5f 49 4e 54 41 52 52 41 59 20 29 3b  ==P4_INTARRAY );
ef30: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
ef40: 70 34 2e 61 69 20 29 3b 0a 20 20 61 50 65 72 6d  p4.ai );.  aPerm
ef50: 75 74 65 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69  ute = pOp->p4.ai
ef60: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
ef70: 20 4f 70 63 6f 64 65 3a 20 43 6f 6d 70 61 72 65   Opcode: Compare
ef80: 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
ef90: 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  **.** Compare tw
efa0: 6f 20 76 65 63 74 6f 72 73 20 6f 66 20 72 65 67  o vectors of reg
efb0: 69 73 74 65 72 73 20 69 6e 20 72 65 67 28 50 31  isters in reg(P1
efc0: 29 2e 2e 72 65 67 28 50 31 2b 50 33 2d 31 29 20  )..reg(P1+P3-1) 
efd0: 28 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 76 65  (call this.** ve
efe0: 63 74 6f 72 20 22 41 22 29 20 61 6e 64 20 69 6e  ctor "A") and in
eff0: 20 72 65 67 28 50 32 29 2e 2e 72 65 67 28 50 32   reg(P2)..reg(P2
f000: 2b 50 33 2d 31 29 20 28 22 42 22 29 2e 20 20 53  +P3-1) ("B").  S
f010: 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f  ave the result o
f020: 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69  f.** the compari
f030: 73 6f 6e 20 66 6f 72 20 75 73 65 20 62 79 20 74  son for use by t
f040: 68 65 20 6e 65 78 74 20 4f 50 5f 4a 75 6d 70 20  he next OP_Jump 
f050: 69 6e 73 74 72 75 63 74 2e 0a 2a 2a 0a 2a 2a 20  instruct..**.** 
f060: 49 66 20 50 35 20 68 61 73 20 74 68 65 20 4f 50  If P5 has the OP
f070: 46 4c 41 47 5f 50 45 52 4d 55 54 45 20 62 69 74  FLAG_PERMUTE bit
f080: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 6f   set, then the o
f090: 72 64 65 72 20 6f 66 20 63 6f 6d 70 61 72 69 73  rder of comparis
f0a0: 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 72 6d 69  on is.** determi
f0b0: 6e 65 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20  ned by the most 
f0c0: 72 65 63 65 6e 74 20 4f 50 5f 50 65 72 6d 75 74  recent OP_Permut
f0d0: 61 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  ation operator. 
f0e0: 20 49 66 20 74 68 65 0a 2a 2a 20 4f 50 46 4c 41   If the.** OPFLA
f0f0: 47 5f 50 45 52 4d 55 54 45 20 62 69 74 20 69 73  G_PERMUTE bit is
f100: 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 72 65 67   clear, then reg
f110: 69 73 74 65 72 20 61 72 65 20 63 6f 6d 70 61 72  ister are compar
f120: 65 64 20 69 6e 20 73 65 71 75 65 6e 74 69 61 6c  ed in sequential
f130: 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a  .** order..**.**
f140: 20 50 34 20 69 73 20 61 20 4b 65 79 49 6e 66 6f   P4 is a KeyInfo
f150: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
f160: 64 65 66 69 6e 65 73 20 63 6f 6c 6c 61 74 69 6e  defines collatin
f170: 67 20 73 65 71 75 65 6e 63 65 73 20 61 6e 64 20  g sequences and 
f180: 73 6f 72 74 0a 2a 2a 20 6f 72 64 65 72 73 20 66  sort.** orders f
f190: 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  or the compariso
f1a0: 6e 2e 20 20 54 68 65 20 70 65 72 6d 75 74 61 74  n.  The permutat
f1b0: 69 6f 6e 20 61 70 70 6c 69 65 73 20 74 6f 20 72  ion applies to r
f1c0: 65 67 69 73 74 65 72 73 0a 2a 2a 20 6f 6e 6c 79  egisters.** only
f1d0: 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 65  .  The KeyInfo e
f1e0: 6c 65 6d 65 6e 74 73 20 61 72 65 20 75 73 65 64  lements are used
f1f0: 20 73 65 71 75 65 6e 74 69 61 6c 6c 79 2e 0a 2a   sequentially..*
f200: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61 72 69  *.** The compari
f210: 73 6f 6e 20 69 73 20 61 20 73 6f 72 74 20 63 6f  son is a sort co
f220: 6d 70 61 72 69 73 6f 6e 2c 20 73 6f 20 4e 55 4c  mparison, so NUL
f230: 4c 73 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c  Ls compare equal
f240: 2c 0a 2a 2a 20 4e 55 4c 4c 73 20 61 72 65 20 6c  ,.** NULLs are l
f250: 65 73 73 20 74 68 61 6e 20 6e 75 6d 62 65 72 73  ess than numbers
f260: 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 6c 65  , numbers are le
f270: 73 73 20 74 68 61 6e 20 73 74 72 69 6e 67 73 2c  ss than strings,
f280: 0a 2a 2a 20 61 6e 64 20 73 74 72 69 6e 67 73 20  .** and strings 
f290: 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 62 6c  are less than bl
f2a0: 6f 62 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  obs..*/.case OP_
f2b0: 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 69 6e 74  Compare: {.  int
f2c0: 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   n;.  int i;.  i
f2d0: 6e 74 20 70 31 3b 0a 20 20 69 6e 74 20 70 32 3b  nt p1;.  int p2;
f2e0: 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f  .  const KeyInfo
f2f0: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e   *pKeyInfo;.  in
f300: 74 20 69 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71  t idx;.  CollSeq
f310: 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 43   *pColl;    /* C
f320: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
f330: 65 20 74 6f 20 75 73 65 20 6f 6e 20 74 68 69 73  e to use on this
f340: 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 62   term */.  int b
f350: 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Rev;          /*
f360: 20 54 72 75 65 20 66 6f 72 20 44 45 53 43 45 4e   True for DESCEN
f370: 44 49 4e 47 20 73 6f 72 74 20 6f 72 64 65 72 20  DING sort order 
f380: 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4f 70 2d 3e  */..  if( (pOp->
f390: 70 35 20 26 20 4f 50 46 4c 41 47 5f 50 45 52 4d  p5 & OPFLAG_PERM
f3a0: 55 54 45 29 3d 3d 30 20 29 20 61 50 65 72 6d 75  UTE)==0 ) aPermu
f3b0: 74 65 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 70 4f  te = 0;.  n = pO
f3c0: 70 2d 3e 70 33 3b 0a 20 20 70 4b 65 79 49 6e 66  p->p3;.  pKeyInf
f3d0: 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  o = pOp->p4.pKey
f3e0: 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20  Info;.  assert( 
f3f0: 6e 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  n>0 );.  assert(
f400: 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 0a   pKeyInfo!=0 );.
f410: 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a    p1 = pOp->p1;.
f420: 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a    p2 = pOp->p2;.
f430: 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
f440: 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20  .  if( aPermute 
f450: 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6d 78  ){.    int k, mx
f460: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d   = 0;.    for(k=
f470: 30 3b 20 6b 3c 6e 3b 20 6b 2b 2b 29 20 69 66 28  0; k<n; k++) if(
f480: 20 61 50 65 72 6d 75 74 65 5b 6b 5d 3e 6d 78 20   aPermute[k]>mx 
f490: 29 20 6d 78 20 3d 20 61 50 65 72 6d 75 74 65 5b  ) mx = aPermute[
f4a0: 6b 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  k];.    assert( 
f4b0: 70 31 3e 30 20 26 26 20 70 31 2b 6d 78 3c 3d 70  p1>0 && p1+mx<=p
f4c0: 2d 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 20 20 20 20  ->nMem+1 );.    
f4d0: 61 73 73 65 72 74 28 20 70 32 3e 30 20 26 26 20  assert( p2>0 && 
f4e0: 70 32 2b 6d 78 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31  p2+mx<=p->nMem+1
f4f0: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
f500: 20 61 73 73 65 72 74 28 20 70 31 3e 30 20 26 26   assert( p1>0 &&
f510: 20 70 31 2b 6e 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31   p1+n<=p->nMem+1
f520: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f530: 70 32 3e 30 20 26 26 20 70 32 2b 6e 3c 3d 70 2d  p2>0 && p2+n<=p-
f540: 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 20 20 7d 0a 23  >nMem+1 );.  }.#
f550: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
f560: 44 45 42 55 47 20 2a 2f 0a 20 20 66 6f 72 28 69  DEBUG */.  for(i
f570: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
f580: 20 20 20 69 64 78 20 3d 20 61 50 65 72 6d 75 74     idx = aPermut
f590: 65 20 3f 20 61 50 65 72 6d 75 74 65 5b 69 5d 20  e ? aPermute[i] 
f5a0: 3a 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28  : i;.    assert(
f5b0: 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65   memIsValid(&aMe
f5c0: 6d 5b 70 31 2b 69 64 78 5d 29 20 29 3b 0a 20 20  m[p1+idx]) );.  
f5d0: 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
f5e0: 61 6c 69 64 28 26 61 4d 65 6d 5b 70 32 2b 69 64  alid(&aMem[p2+id
f5f0: 78 5d 29 20 29 3b 0a 20 20 20 20 52 45 47 49 53  x]) );.    REGIS
f600: 54 45 52 5f 54 52 41 43 45 28 70 31 2b 69 64 78  TER_TRACE(p1+idx
f610: 2c 20 26 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 29  , &aMem[p1+idx])
f620: 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54  ;.    REGISTER_T
f630: 52 41 43 45 28 70 32 2b 69 64 78 2c 20 26 61 4d  RACE(p2+idx, &aM
f640: 65 6d 5b 70 32 2b 69 64 78 5d 29 3b 0a 20 20 20  em[p2+idx]);.   
f650: 20 61 73 73 65 72 74 28 20 69 3c 70 4b 65 79 49   assert( i<pKeyI
f660: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 20  nfo->nField );. 
f670: 20 20 20 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49     pColl = pKeyI
f680: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 3b 0a 20  nfo->aColl[i];. 
f690: 20 20 20 62 52 65 76 20 3d 20 70 4b 65 79 49 6e     bRev = pKeyIn
f6a0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
f6b0: 5d 3b 0a 20 20 20 20 69 43 6f 6d 70 61 72 65 20  ];.    iCompare 
f6c0: 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
f6d0: 61 72 65 28 26 61 4d 65 6d 5b 70 31 2b 69 64 78  are(&aMem[p1+idx
f6e0: 5d 2c 20 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d  ], &aMem[p2+idx]
f6f0: 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69 66  , pColl);.    if
f700: 28 20 69 43 6f 6d 70 61 72 65 20 29 7b 0a 20 20  ( iCompare ){.  
f710: 20 20 20 20 69 66 28 20 62 52 65 76 20 29 20 69      if( bRev ) i
f720: 43 6f 6d 70 61 72 65 20 3d 20 2d 69 43 6f 6d 70  Compare = -iComp
f730: 61 72 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  are;.      break
f740: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 50  ;.    }.  }.  aP
f750: 65 72 6d 75 74 65 20 3d 20 30 3b 0a 20 20 62 72  ermute = 0;.  br
f760: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
f770: 65 3a 20 4a 75 6d 70 20 50 31 20 50 32 20 50 33  e: Jump P1 P2 P3
f780: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20   * *.**.** Jump 
f790: 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  to the instructi
f7a0: 6f 6e 20 61 74 20 61 64 64 72 65 73 73 20 50 31  on at address P1
f7b0: 2c 20 50 32 2c 20 6f 72 20 50 33 20 64 65 70 65  , P2, or P3 depe
f7c0: 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
f7d0: 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 6f 73 74 20  .** in the most 
f7e0: 72 65 63 65 6e 74 20 4f 50 5f 43 6f 6d 70 61 72  recent OP_Compar
f7f0: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  e instruction th
f800: 65 20 50 31 20 76 65 63 74 6f 72 20 77 61 73 20  e P1 vector was 
f810: 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 65 71 75  less than.** equ
f820: 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
f830: 72 20 74 68 61 6e 20 74 68 65 20 50 32 20 76 65  r than the P2 ve
f840: 63 74 6f 72 2c 20 72 65 73 70 65 63 74 69 76 65  ctor, respective
f850: 6c 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4a  ly..*/.case OP_J
f860: 75 6d 70 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ump: {          
f870: 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
f880: 69 66 28 20 69 43 6f 6d 70 61 72 65 3c 30 20 29  if( iCompare<0 )
f890: 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e  {.    pc = pOp->
f8a0: 70 31 20 2d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  p1 - 1;.  }else 
f8b0: 69 66 28 20 69 43 6f 6d 70 61 72 65 3d 3d 30 20  if( iCompare==0 
f8c0: 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  ){.    pc = pOp-
f8d0: 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 65 6c 73 65  >p2 - 1;.  }else
f8e0: 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e  {.    pc = pOp->
f8f0: 70 33 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72  p3 - 1;.  }.  br
f900: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
f910: 65 3a 20 41 6e 64 20 50 31 20 50 32 20 50 33 20  e: And P1 P2 P3 
f920: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74  * *.**.** Take t
f930: 68 65 20 6c 6f 67 69 63 61 6c 20 41 4e 44 20 6f  he logical AND o
f940: 66 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20  f the values in 
f950: 72 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64  registers P1 and
f960: 20 50 32 20 61 6e 64 0a 2a 2a 20 77 72 69 74 65   P2 and.** write
f970: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 74 6f   the result into
f980: 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
f990: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 50 31  .** If either P1
f9a0: 20 6f 72 20 50 32 20 69 73 20 30 20 28 66 61 6c   or P2 is 0 (fal
f9b0: 73 65 29 20 74 68 65 6e 20 74 68 65 20 72 65 73  se) then the res
f9c0: 75 6c 74 20 69 73 20 30 20 65 76 65 6e 20 69 66  ult is 0 even if
f9d0: 0a 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 69 6e  .** the other in
f9e0: 70 75 74 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20  put is NULL.  A 
f9f0: 4e 55 4c 4c 20 61 6e 64 20 74 72 75 65 20 6f 72  NULL and true or
fa00: 20 74 77 6f 20 4e 55 4c 4c 73 20 67 69 76 65 0a   two NULLs give.
fa10: 2a 2a 20 61 20 4e 55 4c 4c 20 6f 75 74 70 75 74  ** a NULL output
fa20: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
fa30: 4f 72 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  Or P1 P2 P3 * *.
fa40: 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 6c  **.** Take the l
fa50: 6f 67 69 63 61 6c 20 4f 52 20 6f 66 20 74 68 65  ogical OR of the
fa60: 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73   values in regis
fa70: 74 65 72 20 50 31 20 61 6e 64 20 50 32 20 61 6e  ter P1 and P2 an
fa80: 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 61  d.** store the a
fa90: 6e 73 77 65 72 20 69 6e 20 72 65 67 69 73 74 65  nswer in registe
faa0: 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  r P3..**.** If e
fab0: 69 74 68 65 72 20 50 31 20 6f 72 20 50 32 20 69  ither P1 or P2 i
fac0: 73 20 6e 6f 6e 7a 65 72 6f 20 28 74 72 75 65 29  s nonzero (true)
fad0: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
fae0: 20 69 73 20 31 20 28 74 72 75 65 29 0a 2a 2a 20   is 1 (true).** 
faf0: 65 76 65 6e 20 69 66 20 74 68 65 20 6f 74 68 65  even if the othe
fb00: 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e  r input is NULL.
fb10: 20 20 41 20 4e 55 4c 4c 20 61 6e 64 20 66 61 6c    A NULL and fal
fb20: 73 65 20 6f 72 20 74 77 6f 20 4e 55 4c 4c 73 0a  se or two NULLs.
fb30: 2a 2a 20 67 69 76 65 20 61 20 4e 55 4c 4c 20 6f  ** give a NULL o
fb40: 75 74 70 75 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f  utput..*/.case O
fb50: 50 5f 41 6e 64 3a 20 20 20 20 20 20 20 20 20 20  P_And:          
fb60: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
fb70: 4b 5f 41 4e 44 2c 20 69 6e 31 2c 20 69 6e 32 2c  K_AND, in1, in2,
fb80: 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50   out3 */.case OP
fb90: 5f 4f 72 3a 20 7b 20 20 20 20 20 20 20 20 20 20  _Or: {          
fba0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
fbb0: 5f 4f 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  _OR, in1, in2, o
fbc0: 75 74 33 20 2a 2f 0a 20 20 69 6e 74 20 76 31 3b  ut3 */.  int v1;
fbd0: 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72      /* Left oper
fbe0: 61 6e 64 3a 20 20 30 3d 3d 46 41 4c 53 45 2c 20  and:  0==FALSE, 
fbf0: 31 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e  1==TRUE, 2==UNKN
fc00: 4f 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  OWN or NULL */. 
fc10: 20 69 6e 74 20 76 32 3b 20 20 20 20 2f 2a 20 52   int v2;    /* R
fc20: 69 67 68 74 20 6f 70 65 72 61 6e 64 3a 20 30 3d  ight operand: 0=
fc30: 3d 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c  =FALSE, 1==TRUE,
fc40: 20 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e   2==UNKNOWN or N
fc50: 55 4c 4c 20 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d  ULL */..  pIn1 =
fc60: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
fc70: 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61  .  if( pIn1->fla
fc80: 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  gs & MEM_Null ){
fc90: 0a 20 20 20 20 76 31 20 3d 20 32 3b 0a 20 20 7d  .    v1 = 2;.  }
fca0: 65 6c 73 65 7b 0a 20 20 20 20 76 31 20 3d 20 73  else{.    v1 = s
fcb0: 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c  qlite3VdbeIntVal
fcc0: 75 65 28 70 49 6e 31 29 21 3d 30 3b 0a 20 20 7d  ue(pIn1)!=0;.  }
fcd0: 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b  .  pIn2 = &aMem[
fce0: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69 66 28 20  pOp->p2];.  if( 
fcf0: 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn2->flags & ME
fd00: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 76 32  M_Null ){.    v2
fd10: 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 2;.  }else{. 
fd20: 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56     v2 = sqlite3V
fd30: 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 32  dbeIntValue(pIn2
fd40: 29 21 3d 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  )!=0;.  }.  if( 
fd50: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
fd60: 41 6e 64 20 29 7b 0a 20 20 20 20 73 74 61 74 69  And ){.    stati
fd70: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
fd80: 20 63 68 61 72 20 61 6e 64 5f 6c 6f 67 69 63 5b   char and_logic[
fd90: 5d 20 3d 20 7b 20 30 2c 20 30 2c 20 30 2c 20 30  ] = { 0, 0, 0, 0
fda0: 2c 20 31 2c 20 32 2c 20 30 2c 20 32 2c 20 32 20  , 1, 2, 0, 2, 2 
fdb0: 7d 3b 0a 20 20 20 20 76 31 20 3d 20 61 6e 64 5f  };.    v1 = and_
fdc0: 6c 6f 67 69 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a  logic[v1*3+v2];.
fdd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61    }else{.    sta
fde0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
fdf0: 65 64 20 63 68 61 72 20 6f 72 5f 6c 6f 67 69 63  ed char or_logic
fe00: 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20  [] = { 0, 1, 2, 
fe10: 31 2c 20 31 2c 20 31 2c 20 32 2c 20 31 2c 20 32  1, 1, 1, 2, 1, 2
fe20: 20 7d 3b 0a 20 20 20 20 76 31 20 3d 20 6f 72 5f   };.    v1 = or_
fe30: 6c 6f 67 69 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a  logic[v1*3+v2];.
fe40: 20 20 7d 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d    }.  pOut = &aM
fe50: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69  em[pOp->p3];.  i
fe60: 66 28 20 76 31 3d 3d 32 20 29 7b 0a 20 20 20 20  f( v1==2 ){.    
fe70: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
fe80: 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  Out, MEM_Null);.
fe90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4f 75    }else{.    pOu
fea0: 74 2d 3e 75 2e 69 20 3d 20 76 31 3b 0a 20 20 20  t->u.i = v1;.   
feb0: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
fec0: 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a  pOut, MEM_Int);.
fed0: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
fee0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 20 50  /* Opcode: Not P
fef0: 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
ff00: 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 76   Interpret the v
ff10: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
ff20: 20 50 31 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e   P1 as a boolean
ff30: 20 76 61 6c 75 65 2e 20 20 53 74 6f 72 65 20 74   value.  Store t
ff40: 68 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 63 6f  he.** boolean co
ff50: 6d 70 6c 65 6d 65 6e 74 20 69 6e 20 72 65 67 69  mplement in regi
ff60: 73 74 65 72 20 50 32 2e 20 20 49 66 20 74 68 65  ster P2.  If the
ff70: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
ff80: 65 72 20 50 31 20 69 73 20 0a 2a 2a 20 4e 55 4c  er P1 is .** NUL
ff90: 4c 2c 20 74 68 65 6e 20 61 20 4e 55 4c 4c 20 69  L, then a NULL i
ffa0: 73 20 73 74 6f 72 65 64 20 69 6e 20 50 32 2e 0a  s stored in P2..
ffb0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 3a 20  */.case OP_Not: 
ffc0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
ffd0: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4e   /* same as TK_N
ffe0: 4f 54 2c 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f  OT, in1, out2 */
fff0: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
10000 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74  pOp->p1];.  pOut
10010 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
10020 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66  ];.  if( pIn1->f
10030 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
10040 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
10050 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75  beMemSetNull(pOu
10060 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
10070 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
10080 65 74 49 6e 74 36 34 28 70 4f 75 74 2c 20 21 73  etInt64(pOut, !s
10090 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c  qlite3VdbeIntVal
100a0 75 65 28 70 49 6e 31 29 29 3b 0a 20 20 7d 0a 20  ue(pIn1));.  }. 
100b0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
100c0 63 6f 64 65 3a 20 42 69 74 4e 6f 74 20 50 31 20  code: BitNot P1 
100d0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49  P2 * * *.**.** I
100e0 6e 74 65 72 70 72 65 74 20 74 68 65 20 63 6f 6e  nterpret the con
100f0 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72  tent of register
10100 20 50 31 20 61 73 20 61 6e 20 69 6e 74 65 67 65   P1 as an intege
10110 72 2e 20 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a  r.  Store the.**
10120 20 6f 6e 65 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   ones-complement
10130 20 6f 66 20 74 68 65 20 50 31 20 76 61 6c 75 65   of the P1 value
10140 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
10150 32 2e 20 20 49 66 20 50 31 20 68 6f 6c 64 73 0a  2.  If P1 holds.
10160 2a 2a 20 61 20 4e 55 4c 4c 20 74 68 65 6e 20 73  ** a NULL then s
10170 74 6f 72 65 20 61 20 4e 55 4c 4c 20 69 6e 20 50  tore a NULL in P
10180 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69  2..*/.case OP_Bi
10190 74 4e 6f 74 3a 20 7b 20 20 20 20 20 20 20 20 20  tNot: {         
101a0 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
101b0 4b 5f 42 49 54 4e 4f 54 2c 20 69 6e 31 2c 20 6f  K_BITNOT, in1, o
101c0 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  ut2 */.  pIn1 = 
101d0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
101e0 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
101f0 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69 66 28 20 70  Op->p2];.  if( p
10200 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
10210 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c  _Null ){.    sql
10220 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
10230 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73  ll(pOut);.  }els
10240 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
10250 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 70 4f  beMemSetInt64(pO
10260 75 74 2c 20 7e 73 71 6c 69 74 65 33 56 64 62 65  ut, ~sqlite3Vdbe
10270 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 29 3b  IntValue(pIn1));
10280 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
10290 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 6e 63 65  ./* Opcode: Once
102a0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
102b0 2a 2a 20 43 68 65 63 6b 20 69 66 20 4f 50 5f 4f  ** Check if OP_O
102c0 6e 63 65 20 66 6c 61 67 20 50 31 20 69 73 20 73  nce flag P1 is s
102d0 65 74 2e 20 49 66 20 73 6f 2c 20 6a 75 6d 70 20  et. If so, jump 
102e0 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50  to instruction P
102f0 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  2. Otherwise,.**
10300 20 73 65 74 20 74 68 65 20 66 6c 61 67 20 61 6e   set the flag an
10310 64 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  d fall through t
10320 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
10330 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  uction..*/.case 
10340 4f 50 5f 4f 6e 63 65 3a 20 7b 20 20 20 20 20 20  OP_Once: {      
10350 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
10360 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  /.  assert( pOp-
10370 3e 70 31 3c 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67  >p1<p->nOnceFlag
10380 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e   );.  if( p->aOn
10390 63 65 46 6c 61 67 5b 70 4f 70 2d 3e 70 31 5d 20  ceFlag[pOp->p1] 
103a0 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  ){.    pc = pOp-
103b0 3e 70 32 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  >p2-1;.  }else{.
103c0 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67      p->aOnceFlag
103d0 5b 70 4f 70 2d 3e 70 31 5d 20 3d 20 31 3b 0a 20  [pOp->p1] = 1;. 
103e0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
103f0 2a 20 4f 70 63 6f 64 65 3a 20 49 66 20 50 31 20  * Opcode: If P1 
10400 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
10410 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68  Jump to P2 if th
10420 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
10430 74 65 72 20 50 31 20 69 73 20 74 72 75 65 2e 20  ter P1 is true. 
10440 20 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 73   The value.** is
10450 20 63 6f 6e 73 69 64 65 72 65 64 20 74 72 75 65   considered true
10460 20 69 66 20 69 74 20 69 73 20 6e 75 6d 65 72 69   if it is numeri
10470 63 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  c and non-zero. 
10480 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a   If the value.**
10490 20 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c 20 74   in P1 is NULL t
104a0 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  hen take the jum
104b0 70 20 69 66 20 50 33 20 69 73 20 6e 6f 6e 2d 7a  p if P3 is non-z
104c0 65 72 6f 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ero..*/./* Opcod
104d0 65 3a 20 49 66 4e 6f 74 20 50 31 20 50 32 20 50  e: IfNot P1 P2 P
104e0 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70  3 * *.**.** Jump
104f0 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 76 61   to P2 if the va
10500 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
10510 50 31 20 69 73 20 46 61 6c 73 65 2e 20 20 54 68  P1 is False.  Th
10520 65 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 63 6f  e value.** is co
10530 6e 73 69 64 65 72 65 64 20 66 61 6c 73 65 20 69  nsidered false i
10540 66 20 69 74 20 68 61 73 20 61 20 6e 75 6d 65 72  f it has a numer
10550 69 63 20 76 61 6c 75 65 20 6f 66 20 7a 65 72 6f  ic value of zero
10560 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a  .  If the value.
10570 2a 2a 20 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c  ** in P1 is NULL
10580 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a   then take the j
10590 75 6d 70 20 69 66 20 50 33 20 69 73 20 7a 65 72  ump if P3 is zer
105a0 6f 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66  o..*/.case OP_If
105b0 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
105c0 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a    /* jump, in1 *
105d0 2f 0a 63 61 73 65 20 4f 50 5f 49 66 4e 6f 74 3a  /.case OP_IfNot:
105e0 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {            /*
105f0 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20   jump, in1 */.  
10600 69 6e 74 20 63 3b 0a 20 20 70 49 6e 31 20 3d 20  int c;.  pIn1 = 
10610 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
10620 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67    if( pIn1->flag
10630 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
10640 20 20 20 20 63 20 3d 20 70 4f 70 2d 3e 70 33 3b      c = pOp->p3;
10650 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66  .  }else{.#ifdef
10660 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
10670 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
10680 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49  c = sqlite3VdbeI
10690 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 21 3d 30  ntValue(pIn1)!=0
106a0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 20 3d 20  ;.#else.    c = 
106b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56  sqlite3VdbeRealV
106c0 61 6c 75 65 28 70 49 6e 31 29 21 3d 30 2e 30 3b  alue(pIn1)!=0.0;
106d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
106e0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
106f0 49 66 4e 6f 74 20 29 20 63 20 3d 20 21 63 3b 0a  IfNot ) c = !c;.
10700 20 20 7d 0a 20 20 69 66 28 20 63 20 29 7b 0a 20    }.  if( c ){. 
10710 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 2d     pc = pOp->p2-
10720 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  1;.  }.  break;.
10730 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 73  }../* Opcode: Is
10740 4e 75 6c 6c 20 50 31 20 50 32 20 2a 20 2a 20 2a  Null P1 P2 * * *
10750 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50  .**.** Jump to P
10760 32 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  2 if the value i
10770 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  n register P1 is
10780 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f   NULL..*/.case O
10790 50 5f 49 73 4e 75 6c 6c 3a 20 7b 20 20 20 20 20  P_IsNull: {     
107a0 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
107b0 73 20 54 4b 5f 49 53 4e 55 4c 4c 2c 20 6a 75 6d  s TK_ISNULL, jum
107c0 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31  p, in1 */.  pIn1
107d0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
107e0 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  ];.  if( (pIn1->
107f0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
10800 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 63 20 3d  )!=0 ){.    pc =
10810 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
10820 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
10830 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 4e 75 6c 6c   Opcode: NotNull
10840 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
10850 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66  ** Jump to P2 if
10860 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
10870 67 69 73 74 65 72 20 50 31 20 69 73 20 6e 6f 74  gister P1 is not
10880 20 4e 55 4c 4c 2e 20 20 0a 2a 2f 0a 63 61 73 65   NULL.  .*/.case
10890 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3a 20 7b 20 20   OP_NotNull: {  
108a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
108b0 65 20 61 73 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c  e as TK_NOTNULL,
108c0 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20   jump, in1 */.  
108d0 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
108e0 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 28 70 49  ->p1];.  if( (pI
108f0 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
10900 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Null)==0 ){.    
10910 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
10920 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
10930 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6c  ../* Opcode: Col
10940 75 6d 6e 20 50 31 20 50 32 20 50 33 20 50 34 20  umn P1 P2 P3 P4 
10950 50 35 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  P5.**.** Interpr
10960 65 74 20 74 68 65 20 64 61 74 61 20 74 68 61 74  et the data that
10970 20 63 75 72 73 6f 72 20 50 31 20 70 6f 69 6e 74   cursor P1 point
10980 73 20 74 6f 20 61 73 20 61 20 73 74 72 75 63 74  s to as a struct
10990 75 72 65 20 62 75 69 6c 74 20 75 73 69 6e 67 0a  ure built using.
109a0 2a 2a 20 74 68 65 20 4d 61 6b 65 52 65 63 6f 72  ** the MakeRecor
109b0 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  d instruction.  
109c0 28 53 65 65 20 74 68 65 20 4d 61 6b 65 52 65 63  (See the MakeRec
109d0 6f 72 64 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  ord opcode for a
109e0 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e 66  dditional.** inf
109f0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
10a00 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65  he format of the
10a10 20 64 61 74 61 2e 29 20 20 45 78 74 72 61 63 74   data.)  Extract
10a20 20 74 68 65 20 50 32 2d 74 68 20 63 6f 6c 75 6d   the P2-th colum
10a30 6e 0a 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 72  n.** from this r
10a40 65 63 6f 72 64 2e 20 20 49 66 20 74 68 65 72 65  ecord.  If there
10a50 20 61 72 65 20 6c 65 73 73 20 74 68 61 74 20 28   are less that (
10a60 50 32 2b 31 29 20 0a 2a 2a 20 76 61 6c 75 65 73  P2+1) .** values
10a70 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 2c 20   in the record, 
10a80 65 78 74 72 61 63 74 20 61 20 4e 55 4c 4c 2e 0a  extract a NULL..
10a90 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
10aa0 65 78 74 72 61 63 74 65 64 20 69 73 20 73 74 6f  extracted is sto
10ab0 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
10ac0 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  P3..**.** If the
10ad0 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
10ae0 20 66 65 77 65 72 20 74 68 61 6e 20 50 32 20 66   fewer than P2 f
10af0 69 65 6c 64 73 2c 20 74 68 65 6e 20 65 78 74 72  ields, then extr
10b00 61 63 74 20 61 20 4e 55 4c 4c 2e 20 20 4f 72 2c  act a NULL.  Or,
10b10 0a 2a 2a 20 69 66 20 74 68 65 20 50 34 20 61 72  .** if the P4 ar
10b20 67 75 6d 65 6e 74 20 69 73 20 61 20 50 34 5f 4d  gument is a P4_M
10b30 45 4d 20 75 73 65 20 74 68 65 20 76 61 6c 75 65  EM use the value
10b40 20 6f 66 20 74 68 65 20 50 34 20 61 72 67 75 6d   of the P4 argum
10b50 65 6e 74 20 61 73 0a 2a 2a 20 74 68 65 20 72 65  ent as.** the re
10b60 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  sult..**.** If t
10b70 68 65 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43  he OPFLAG_CLEARC
10b80 41 43 48 45 20 62 69 74 20 69 73 20 73 65 74 20  ACHE bit is set 
10b90 6f 6e 20 50 35 20 61 6e 64 20 50 31 20 69 73 20  on P5 and P1 is 
10ba0 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 63  a pseudo-table c
10bb0 75 72 73 6f 72 2c 0a 2a 2a 20 74 68 65 6e 20 74  ursor,.** then t
10bc0 68 65 20 63 61 63 68 65 20 6f 66 20 74 68 65 20  he cache of the 
10bd0 63 75 72 73 6f 72 20 69 73 20 72 65 73 65 74 20  cursor is reset 
10be0 70 72 69 6f 72 20 74 6f 20 65 78 74 72 61 63 74  prior to extract
10bf0 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a  ing the column..
10c00 2a 2a 20 54 68 65 20 66 69 72 73 74 20 4f 50 5f  ** The first OP_
10c10 43 6f 6c 75 6d 6e 20 61 67 61 69 6e 73 74 20 61  Column against a
10c20 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 61 66   pseudo-table af
10c30 74 65 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ter the value of
10c40 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   the content.** 
10c50 72 65 67 69 73 74 65 72 20 68 61 73 20 63 68 61  register has cha
10c60 6e 67 65 64 20 73 68 6f 75 6c 64 20 68 61 76 65  nged should have
10c70 20 74 68 69 73 20 62 69 74 20 73 65 74 2e 0a 2a   this bit set..*
10c80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c  *.** If the OPFL
10c90 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 61 6e 64  AG_LENGTHARG and
10ca0 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
10cb0 47 20 62 69 74 73 20 61 72 65 20 73 65 74 20 6f  G bits are set o
10cc0 6e 20 50 35 20 77 68 65 6e 0a 2a 2a 20 74 68 65  n P5 when.** the
10cd0 20 72 65 73 75 6c 74 20 69 73 20 67 75 61 72 61   result is guara
10ce0 6e 74 65 65 64 20 74 6f 20 6f 6e 6c 79 20 62 65  nteed to only be
10cf0 20 75 73 65 64 20 61 73 20 74 68 65 20 61 72 67   used as the arg
10d00 75 6d 65 6e 74 20 6f 66 20 61 20 6c 65 6e 67 74  ument of a lengt
10d10 68 28 29 0a 2a 2a 20 6f 72 20 74 79 70 65 6f 66  h().** or typeof
10d20 28 29 20 66 75 6e 63 74 69 6f 6e 2c 20 72 65 73  () function, res
10d30 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20  pectively.  The 
10d40 6c 6f 61 64 69 6e 67 20 6f 66 20 6c 61 72 67 65  loading of large
10d50 20 62 6c 6f 62 73 20 63 61 6e 20 62 65 0a 2a 2a   blobs can be.**
10d60 20 73 6b 69 70 70 65 64 20 66 6f 72 20 6c 65 6e   skipped for len
10d70 67 74 68 28 29 20 61 6e 64 20 61 6c 6c 20 63 6f  gth() and all co
10d80 6e 74 65 6e 74 20 6c 6f 61 64 69 6e 67 20 63 61  ntent loading ca
10d90 6e 20 62 65 20 73 6b 69 70 70 65 64 20 66 6f 72  n be skipped for
10da0 20 74 79 70 65 6f 66 28 29 2e 0a 2a 2f 0a 63 61   typeof()..*/.ca
10db0 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a  se OP_Column: {.
10dc0 20 20 75 33 32 20 70 61 79 6c 6f 61 64 53 69 7a    u32 payloadSiz
10dd0 65 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  e;   /* Number o
10de0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 72  f bytes in the r
10df0 65 63 6f 72 64 20 2a 2f 0a 20 20 69 36 34 20 70  ecord */.  i64 p
10e00 61 79 6c 6f 61 64 53 69 7a 65 36 34 3b 20 2f 2a  ayloadSize64; /*
10e10 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
10e20 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a   in the record *
10e30 2f 0a 20 20 69 6e 74 20 70 31 3b 20 20 20 20 20  /.  int p1;     
10e40 20 20 20 20 20 20 20 2f 2a 20 50 31 20 76 61 6c         /* P1 val
10e50 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  ue of the opcode
10e60 20 2a 2f 0a 20 20 69 6e 74 20 70 32 3b 20 20 20   */.  int p2;   
10e70 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6c 75           /* colu
10e80 6d 6e 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 74  mn number to ret
10e90 72 69 65 76 65 20 2a 2f 0a 20 20 56 64 62 65 43  rieve */.  VdbeC
10ea0 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 20 2f 2a  ursor *pC;    /*
10eb0 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
10ec0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 65 63   */.  char *zRec
10ed0 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ;        /* Poin
10ee0 74 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  ter to complete 
10ef0 72 65 63 6f 72 64 2d 64 61 74 61 20 2a 2f 0a 20  record-data */. 
10f00 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72   BtCursor *pCrsr
10f10 3b 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65  ;   /* The BTree
10f20 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 75 33 32   cursor */.  u32
10f30 20 2a 61 54 79 70 65 3b 20 20 20 20 20 20 20 20   *aType;        
10f40 2f 2a 20 61 54 79 70 65 5b 69 5d 20 68 6f 6c 64  /* aType[i] hold
10f50 73 20 74 68 65 20 6e 75 6d 65 72 69 63 20 74 79  s the numeric ty
10f60 70 65 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63  pe of the i-th c
10f70 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 75 33 32 20 2a  olumn */.  u32 *
10f80 61 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a  aOffset;      /*
10f90 20 61 4f 66 66 73 65 74 5b 69 5d 20 69 73 20 6f   aOffset[i] is o
10fa0 66 66 73 65 74 20 74 6f 20 73 74 61 72 74 20 6f  ffset to start o
10fb0 66 20 64 61 74 61 20 66 6f 72 20 69 2d 74 68 20  f data for i-th 
10fc0 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
10fd0 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20 2f  nField;        /
10fe0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  * number of fiel
10ff0 64 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ds in the record
11000 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 20   */.  int len;  
11010 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11020 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 65  length of the se
11030 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 66 6f  rialized data fo
11040 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  r the column */.
11050 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
11060 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
11070 6e 74 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  nter */.  char *
11080 7a 44 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  zData;       /* 
11090 50 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f  Part of the reco
110a0 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64  rd being decoded
110b0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 44 65 73 74   */.  Mem *pDest
110c0 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ;        /* Wher
110d0 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 65  e to write the e
110e0 78 74 72 61 63 74 65 64 20 76 61 6c 75 65 20 2a  xtracted value *
110f0 2f 0a 20 20 4d 65 6d 20 73 4d 65 6d 3b 20 20 20  /.  Mem sMem;   
11100 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 74         /* For st
11110 6f 72 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  oring the record
11120 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a   being decoded *
11130 2f 0a 20 20 75 38 20 2a 7a 49 64 78 3b 20 20 20  /.  u8 *zIdx;   
11140 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
11150 69 6e 74 6f 20 68 65 61 64 65 72 20 2a 2f 0a 20  into header */. 
11160 20 75 38 20 2a 7a 45 6e 64 48 64 72 3b 20 20 20   u8 *zEndHdr;   
11170 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
11180 6f 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74  o first byte aft
11190 65 72 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  er the header */
111a0 0a 20 20 75 33 32 20 6f 66 66 73 65 74 3b 20 20  .  u32 offset;  
111b0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
111c0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 2a 2f  into the data */
111d0 0a 20 20 75 33 32 20 73 7a 46 69 65 6c 64 3b 20  .  u32 szField; 
111e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
111f0 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
11200 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 66 69 65  content of a fie
11210 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 48 64  ld */.  int szHd
11220 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  r;         /* Si
11230 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
11240 20 73 69 7a 65 20 66 69 65 6c 64 20 61 74 20 73   size field at s
11250 74 61 72 74 20 6f 66 20 72 65 63 6f 72 64 20 2a  tart of record *
11260 2f 0a 20 20 69 6e 74 20 61 76 61 69 6c 3b 20 20  /.  int avail;  
11270 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11280 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
11290 69 6c 61 62 6c 65 20 64 61 74 61 20 2a 2f 0a 20  ilable data */. 
112a0 20 75 33 32 20 74 3b 20 20 20 20 20 20 20 20 20   u32 t;         
112b0 20 20 20 20 2f 2a 20 41 20 74 79 70 65 20 63 6f      /* A type co
112c0 64 65 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f  de from the reco
112d0 72 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 4d  rd header */.  M
112e0 65 6d 20 2a 70 52 65 67 3b 20 20 20 20 20 20 20  em *pReg;       
112f0 20 20 2f 2a 20 50 73 65 75 64 6f 54 61 62 6c 65    /* PseudoTable
11300 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 20   input register 
11310 2a 2f 0a 0a 0a 20 20 70 31 20 3d 20 70 4f 70 2d  */...  p1 = pOp-
11320 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d  >p1;.  p2 = pOp-
11330 3e 70 32 3b 0a 20 20 70 43 20 3d 20 30 3b 0a 20  >p2;.  pC = 0;. 
11340 20 6d 65 6d 73 65 74 28 26 73 4d 65 6d 2c 20 30   memset(&sMem, 0
11350 2c 20 73 69 7a 65 6f 66 28 73 4d 65 6d 29 29 3b  , sizeof(sMem));
11360 0a 20 20 61 73 73 65 72 74 28 20 70 31 3c 70 2d  .  assert( p1<p-
11370 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73  >nCursor );.  as
11380 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20  sert( pOp->p3>0 
11390 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e  && pOp->p3<=p->n
113a0 4d 65 6d 20 29 3b 0a 20 20 70 44 65 73 74 20 3d  Mem );.  pDest =
113b0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
113c0 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61  .  memAboutToCha
113d0 6e 67 65 28 70 2c 20 70 44 65 73 74 29 3b 0a 20  nge(p, pDest);. 
113e0 20 7a 52 65 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a   zRec = 0;..  /*
113f0 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 74 73   This block sets
11400 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 70 61   the variable pa
11410 79 6c 6f 61 64 53 69 7a 65 20 74 6f 20 62 65 20  yloadSize to be 
11420 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
11430 20 6f 66 0a 20 20 2a 2a 20 62 79 74 65 73 20 69   of.  ** bytes i
11440 6e 20 74 68 65 20 72 65 63 6f 72 64 2e 0a 20 20  n the record..  
11450 2a 2a 0a 20 20 2a 2a 20 7a 52 65 63 20 69 73 20  **.  ** zRec is 
11460 73 65 74 20 74 6f 20 62 65 20 74 68 65 20 63 6f  set to be the co
11470 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
11480 68 65 20 72 65 63 6f 72 64 20 69 66 20 69 74 20  he record if it 
11490 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20  is available..  
114a0 2a 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  ** The complete 
114b0 72 65 63 6f 72 64 20 74 65 78 74 20 69 73 20 61  record text is a
114c0 6c 77 61 79 73 20 61 76 61 69 6c 61 62 6c 65 20  lways available 
114d0 66 6f 72 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  for pseudo-table
114e0 73 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65  s.  ** If the re
114f0 63 6f 72 64 20 69 73 20 73 74 6f 72 65 64 20 69  cord is stored i
11500 6e 20 61 20 63 75 72 73 6f 72 2c 20 74 68 65 20  n a cursor, the 
11510 63 6f 6d 70 6c 65 74 65 20 72 65 63 6f 72 64 20  complete record 
11520 74 65 78 74 0a 20 20 2a 2a 20 6d 69 67 68 74 20  text.  ** might 
11530 62 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  be available in 
11540 74 68 65 20 20 70 43 2d 3e 61 52 6f 77 20 63 61  the  pC->aRow ca
11550 63 68 65 2e 20 20 4f 72 20 69 74 20 6d 69 67 68  che.  Or it migh
11560 74 20 6e 6f 74 20 62 65 2e 0a 20 20 2a 2a 20 49  t not be..  ** I
11570 66 20 74 68 65 20 64 61 74 61 20 69 73 20 75 6e  f the data is un
11580 61 76 61 69 6c 61 62 6c 65 2c 20 20 7a 52 65 63  available,  zRec
11590 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
115a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 61 6c  .  **.  ** We al
115b0 73 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6e  so compute the n
115c0 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
115d0 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 2e 20   in the record. 
115e0 20 46 6f 72 20 63 75 72 73 6f 72 73 2c 0a 20 20   For cursors,.  
115f0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
11600 20 63 6f 6c 75 6d 6e 73 20 69 73 20 73 74 6f 72   columns is stor
11610 65 64 20 69 6e 20 74 68 65 20 56 64 62 65 43 75  ed in the VdbeCu
11620 72 73 6f 72 2e 6e 46 69 65 6c 64 20 65 6c 65 6d  rsor.nField elem
11630 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 20 3d  ent..  */.  pC =
11640 20 70 2d 3e 61 70 43 73 72 5b 70 31 5d 3b 0a 20   p->apCsr[p1];. 
11650 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
11660 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
11670 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
11680 4c 45 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  LE.  assert( pC-
11690 3e 70 56 74 61 62 43 75 72 73 6f 72 3d 3d 30 20  >pVtabCursor==0 
116a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 43 72 73  );.#endif.  pCrs
116b0 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b  r = pC->pCursor;
116c0 0a 20 20 69 66 28 20 70 43 72 73 72 21 3d 30 20  .  if( pCrsr!=0 
116d0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ){.    /* The re
116e0 63 6f 72 64 20 69 73 20 73 74 6f 72 65 64 20 69  cord is stored i
116f0 6e 20 61 20 42 2d 54 72 65 65 20 2a 2f 0a 20 20  n a B-Tree */.  
11700 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
11710 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70  beCursorMoveto(p
11720 43 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  C);.    if( rc )
11730 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
11740 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69 66  to_error;.    if
11750 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b  ( pC->nullRow ){
11760 0a 20 20 20 20 20 20 70 61 79 6c 6f 61 64 53 69  .      payloadSi
11770 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ze = 0;.    }els
11780 65 20 69 66 28 20 70 43 2d 3e 63 61 63 68 65 53  e if( pC->cacheS
11790 74 61 74 75 73 3d 3d 70 2d 3e 63 61 63 68 65 43  tatus==p->cacheC
117a0 74 72 20 29 7b 0a 20 20 20 20 20 20 70 61 79 6c  tr ){.      payl
117b0 6f 61 64 53 69 7a 65 20 3d 20 70 43 2d 3e 70 61  oadSize = pC->pa
117c0 79 6c 6f 61 64 53 69 7a 65 3b 0a 20 20 20 20 20  yloadSize;.     
117d0 20 7a 52 65 63 20 3d 20 28 63 68 61 72 2a 29 70   zRec = (char*)p
117e0 43 2d 3e 61 52 6f 77 3b 0a 20 20 20 20 7d 65 6c  C->aRow;.    }el
117f0 73 65 20 69 66 28 20 70 43 2d 3e 69 73 49 6e 64  se if( pC->isInd
11800 65 78 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ex ){.      asse
11810 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
11820 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
11830 72 73 72 29 20 29 3b 0a 20 20 20 20 20 20 56 56  rsr) );.      VV
11840 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c  A_ONLY(rc =) sql
11850 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
11860 28 70 43 72 73 72 2c 20 26 70 61 79 6c 6f 61 64  (pCrsr, &payload
11870 53 69 7a 65 36 34 29 3b 0a 20 20 20 20 20 20 61  Size64);.      a
11880 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
11890 45 5f 4f 4b 20 29 3b 20 20 20 2f 2a 20 54 72 75  E_OK );   /* Tru
118a0 65 20 62 65 63 61 75 73 65 20 6f 66 20 43 75 72  e because of Cur
118b0 73 6f 72 4d 6f 76 65 74 6f 28 29 20 63 61 6c 6c  sorMoveto() call
118c0 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20   above */.      
118d0 2f 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  /* sqlite3BtreeP
118e0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 75 73  arseCellPtr() us
118f0 65 73 20 67 65 74 56 61 72 69 6e 74 33 32 28 29  es getVarint32()
11900 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 0a   to extract the.
11910 20 20 20 20 20 20 2a 2a 20 70 61 79 6c 6f 61 64        ** payload
11920 20 73 69 7a 65 2c 20 73 6f 20 69 74 20 69 73 20   size, so it is 
11930 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 70  impossible for p
11940 61 79 6c 6f 61 64 53 69 7a 65 36 34 20 74 6f 20  ayloadSize64 to 
11950 62 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67  be.      ** larg
11960 65 72 20 74 68 61 6e 20 33 32 20 62 69 74 73 2e  er than 32 bits.
11970 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
11980 28 20 28 70 61 79 6c 6f 61 64 53 69 7a 65 36 34  ( (payloadSize64
11990 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33   & SQLITE_MAX_U3
119a0 32 29 3d 3d 28 75 36 34 29 70 61 79 6c 6f 61 64  2)==(u64)payload
119b0 53 69 7a 65 36 34 20 29 3b 0a 20 20 20 20 20 20  Size64 );.      
119c0 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 28 75  payloadSize = (u
119d0 33 32 29 70 61 79 6c 6f 61 64 53 69 7a 65 36 34  32)payloadSize64
119e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
119f0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
11a00 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
11a10 61 6c 69 64 28 70 43 72 73 72 29 20 29 3b 0a 20  alid(pCrsr) );. 
11a20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63       VVA_ONLY(rc
11a30 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65 65   =) sqlite3Btree
11a40 44 61 74 61 53 69 7a 65 28 70 43 72 73 72 2c 20  DataSize(pCrsr, 
11a50 26 70 61 79 6c 6f 61 64 53 69 7a 65 29 3b 0a 20  &payloadSize);. 
11a60 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
11a70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
11a80 2f 2a 20 44 61 74 61 53 69 7a 65 28 29 20 63 61  /* DataSize() ca
11a90 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 20  nnot fail */.   
11aa0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 41   }.  }else if( A
11ab0 4c 57 41 59 53 28 70 43 2d 3e 70 73 65 75 64 6f  LWAYS(pC->pseudo
11ac0 54 61 62 6c 65 52 65 67 3e 30 29 20 29 7b 0a 20  TableReg>0) ){. 
11ad0 20 20 20 70 52 65 67 20 3d 20 26 61 4d 65 6d 5b     pReg = &aMem[
11ae0 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52  pC->pseudoTableR
11af0 65 67 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 2d  eg];.    if( pC-
11b00 3e 6d 75 6c 74 69 50 73 65 75 64 6f 20 29 7b 0a  >multiPseudo ){.
11b10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11b20 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
11b30 70 44 65 73 74 2c 20 70 52 65 67 2b 70 32 2c 20  pDest, pReg+p2, 
11b40 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20  MEM_Ephem);.    
11b50 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65    Deephemeralize
11b60 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 67  (pDest);.      g
11b70 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75  oto op_column_ou
11b80 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  t;.    }.    ass
11b90 65 72 74 28 20 70 52 65 67 2d 3e 66 6c 61 67 73  ert( pReg->flags
11ba0 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20   & MEM_Blob );. 
11bb0 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
11bc0 56 61 6c 69 64 28 70 52 65 67 29 20 29 3b 0a 20  Valid(pReg) );. 
11bd0 20 20 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d     payloadSize =
11be0 20 70 52 65 67 2d 3e 6e 3b 0a 20 20 20 20 7a 52   pReg->n;.    zR
11bf0 65 63 20 3d 20 70 52 65 67 2d 3e 7a 3b 0a 20 20  ec = pReg->z;.  
11c00 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
11c10 73 20 3d 20 28 70 4f 70 2d 3e 70 35 26 4f 50 46  s = (pOp->p5&OPF
11c20 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29 20  LAG_CLEARCACHE) 
11c30 3f 20 43 41 43 48 45 5f 53 54 41 4c 45 20 3a 20  ? CACHE_STALE : 
11c40 70 2d 3e 63 61 63 68 65 43 74 72 3b 0a 20 20 20  p->cacheCtr;.   
11c50 20 61 73 73 65 72 74 28 20 70 61 79 6c 6f 61 64   assert( payload
11c60 53 69 7a 65 3d 3d 30 20 7c 7c 20 7a 52 65 63 21  Size==0 || zRec!
11c70 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
11c80 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 74     /* Consider t
11c90 68 65 20 72 6f 77 20 74 6f 20 62 65 20 4e 55 4c  he row to be NUL
11ca0 4c 20 2a 2f 0a 20 20 20 20 70 61 79 6c 6f 61 64  L */.    payload
11cb0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Size = 0;.  }.. 
11cc0 20 2f 2a 20 49 66 20 70 61 79 6c 6f 61 64 53 69   /* If payloadSi
11cd0 7a 65 20 69 73 20 30 2c 20 74 68 65 6e 20 6a 75  ze is 0, then ju
11ce0 73 74 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c 2e  st store a NULL.
11cf0 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65    This can happe
11d00 6e 20 62 65 63 61 75 73 65 20 6f 66 0a 20 20 2a  n because of.  *
11d10 2a 20 6e 75 6c 6c 52 6f 77 20 6f 72 20 62 65 63  * nullRow or bec
11d20 61 75 73 65 20 6f 66 20 61 20 63 6f 72 72 75 70  ause of a corrup
11d30 74 20 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20  t database. */. 
11d40 20 69 66 28 20 70 61 79 6c 6f 61 64 53 69 7a 65   if( payloadSize
11d50 3d 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 53 65  ==0 ){.    MemSe
11d60 74 54 79 70 65 46 6c 61 67 28 70 44 65 73 74 2c  tTypeFlag(pDest,
11d70 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20   MEM_Null);.    
11d80 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f  goto op_column_o
11d90 75 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ut;.  }.  assert
11da0 28 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ( db->aLimit[SQL
11db0 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
11dc0 5d 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 61  ]>=0 );.  if( pa
11dd0 79 6c 6f 61 64 53 69 7a 65 20 3e 20 28 75 33 32  yloadSize > (u32
11de0 29 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  )db->aLimit[SQLI
11df0 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
11e00 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f   ){.    goto too
11e10 5f 62 69 67 3b 0a 20 20 7d 0a 0a 20 20 6e 46 69  _big;.  }..  nFi
11e20 65 6c 64 20 3d 20 70 43 2d 3e 6e 46 69 65 6c 64  eld = pC->nField
11e30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 32 3c 6e  ;.  assert( p2<n
11e40 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 52  Field );..  /* R
11e50 65 61 64 20 61 6e 64 20 70 61 72 73 65 20 74 68  ead and parse th
11e60 65 20 74 61 62 6c 65 20 68 65 61 64 65 72 2e 20  e table header. 
11e70 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
11e80 74 73 20 6f 66 20 74 68 65 20 70 61 72 73 65 0a  ts of the parse.
11e90 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 72 65    ** into the re
11ea0 63 6f 72 64 20 68 65 61 64 65 72 20 63 61 63 68  cord header cach
11eb0 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
11ec0 63 75 72 73 6f 72 2e 0a 20 20 2a 2f 0a 20 20 61  cursor..  */.  a
11ed0 54 79 70 65 20 3d 20 70 43 2d 3e 61 54 79 70 65  Type = pC->aType
11ee0 3b 0a 20 20 69 66 28 20 70 43 2d 3e 63 61 63 68  ;.  if( pC->cach
11ef0 65 53 74 61 74 75 73 3d 3d 70 2d 3e 63 61 63 68  eStatus==p->cach
11f00 65 43 74 72 20 29 7b 0a 20 20 20 20 61 4f 66 66  eCtr ){.    aOff
11f10 73 65 74 20 3d 20 70 43 2d 3e 61 4f 66 66 73 65  set = pC->aOffse
11f20 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
11f30 61 73 73 65 72 74 28 61 54 79 70 65 29 3b 0a 20  assert(aType);. 
11f40 20 20 20 61 76 61 69 6c 20 3d 20 30 3b 0a 20 20     avail = 0;.  
11f50 20 20 70 43 2d 3e 61 4f 66 66 73 65 74 20 3d 20    pC->aOffset = 
11f60 61 4f 66 66 73 65 74 20 3d 20 26 61 54 79 70 65  aOffset = &aType
11f70 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 70 43  [nField];.    pC
11f80 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20  ->payloadSize = 
11f90 70 61 79 6c 6f 61 64 53 69 7a 65 3b 0a 20 20 20  payloadSize;.   
11fa0 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
11fb0 20 3d 20 70 2d 3e 63 61 63 68 65 43 74 72 3b 0a   = p->cacheCtr;.
11fc0 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
11fd0 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65  ut how many byte
11fe0 73 20 61 72 65 20 69 6e 20 74 68 65 20 68 65 61  s are in the hea
11ff0 64 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  der */.    if( z
12000 52 65 63 20 29 7b 0a 20 20 20 20 20 20 7a 44 61  Rec ){.      zDa
12010 74 61 20 3d 20 7a 52 65 63 3b 0a 20 20 20 20 7d  ta = zRec;.    }
12020 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
12030 70 43 2d 3e 69 73 49 6e 64 65 78 20 29 7b 0a 20  pC->isIndex ){. 
12040 20 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 28         zData = (
12050 63 68 61 72 2a 29 73 71 6c 69 74 65 33 42 74 72  char*)sqlite3Btr
12060 65 65 4b 65 79 46 65 74 63 68 28 70 43 72 73 72  eeKeyFetch(pCrsr
12070 2c 20 26 61 76 61 69 6c 29 3b 0a 20 20 20 20 20  , &avail);.     
12080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12090 7a 44 61 74 61 20 3d 20 28 63 68 61 72 2a 29 73  zData = (char*)s
120a0 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
120b0 65 74 63 68 28 70 43 72 73 72 2c 20 26 61 76 61  etch(pCrsr, &ava
120c0 69 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  il);.      }.   
120d0 20 20 20 2f 2a 20 49 66 20 4b 65 79 46 65 74 63     /* If KeyFetc
120e0 68 28 29 2f 44 61 74 61 46 65 74 63 68 28 29 20  h()/DataFetch() 
120f0 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 74  managed to get t
12100 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
12110 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 65  d,.      ** save
12120 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 20   the payload in 
12130 74 68 65 20 70 43 2d 3e 61 52 6f 77 20 63 61 63  the pC->aRow cac
12140 68 65 2e 20 20 54 68 61 74 20 77 69 6c 6c 20 73  he.  That will s
12150 61 76 65 20 75 73 20 66 72 6f 6d 0a 20 20 20 20  ave us from.    
12160 20 20 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 6d    ** having to m
12170 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  ake additional c
12180 61 6c 6c 73 20 74 6f 20 66 65 74 63 68 20 74 68  alls to fetch th
12190 65 20 63 6f 6e 74 65 6e 74 20 70 6f 72 74 69 6f  e content portio
121a0 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  n of.      ** th
121b0 65 20 72 65 63 6f 72 64 2e 0a 20 20 20 20 20 20  e record..      
121c0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
121d0 20 61 76 61 69 6c 3e 3d 30 20 29 3b 0a 20 20 20   avail>=0 );.   
121e0 20 20 20 69 66 28 20 70 61 79 6c 6f 61 64 53 69     if( payloadSi
121f0 7a 65 20 3c 3d 20 28 75 33 32 29 61 76 61 69 6c  ze <= (u32)avail
12200 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 63   ){.        zRec
12210 20 3d 20 7a 44 61 74 61 3b 0a 20 20 20 20 20 20   = zData;.      
12220 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20 28 75 38    pC->aRow = (u8
12230 2a 29 7a 44 61 74 61 3b 0a 20 20 20 20 20 20 7d  *)zData;.      }
12240 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
12250 2d 3e 61 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  ->aRow = 0;.    
12260 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a    }.    }.    /*
12270 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
12280 73 73 65 72 74 20 69 73 20 74 72 75 65 20 69 6e  ssert is true in
12290 20 61 6c 6c 20 63 61 73 65 73 20 65 78 63 65 70   all cases excep
122a0 74 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  t when.    ** th
122b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
122c0 68 61 73 20 62 65 65 6e 20 63 6f 72 72 75 70 74  has been corrupt
122d0 65 64 20 65 78 74 65 72 6e 61 6c 6c 79 2e 0a 20  ed externally.. 
122e0 20 20 20 2a 2a 20 20 20 20 61 73 73 65 72 74 28     **    assert(
122f0 20 7a 52 65 63 21 3d 30 20 7c 7c 20 61 76 61 69   zRec!=0 || avai
12300 6c 3e 3d 70 61 79 6c 6f 61 64 53 69 7a 65 20 7c  l>=payloadSize |
12310 7c 20 61 76 61 69 6c 3e 3d 39 20 29 3b 20 2a 2f  | avail>=9 ); */
12320 0a 20 20 20 20 73 7a 48 64 72 20 3d 20 67 65 74  .    szHdr = get
12330 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 7a 44  Varint32((u8*)zD
12340 61 74 61 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20  ata, offset);.. 
12350 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
12360 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
12370 73 65 20 68 61 73 20 6e 6f 74 20 67 69 76 65 6e  se has not given
12380 20 75 73 20 61 6e 20 6f 76 65 72 73 69 7a 65 20   us an oversize 
12390 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2a 20 44  header..    ** D
123a0 6f 20 74 68 69 73 20 6e 6f 77 20 74 6f 20 61 76  o this now to av
123b0 6f 69 64 20 61 6e 20 6f 76 65 72 73 69 7a 65 20  oid an oversize 
123c0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
123d0 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  n..    **.    **
123e0 20 54 79 70 65 20 65 6e 74 72 69 65 73 20 63 61   Type entries ca
123f0 6e 20 62 65 20 62 65 74 77 65 65 6e 20 31 20 61  n be between 1 a
12400 6e 64 20 35 20 62 79 74 65 73 20 65 61 63 68 2e  nd 5 bytes each.
12410 20 20 42 75 74 20 34 20 61 6e 64 20 35 20 62 79    But 4 and 5 by
12420 74 65 0a 20 20 20 20 2a 2a 20 74 79 70 65 73 20  te.    ** types 
12430 75 73 65 20 73 6f 20 6d 75 63 68 20 64 61 74 61  use so much data
12440 20 73 70 61 63 65 20 74 68 61 74 20 74 68 65 72   space that ther
12450 65 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 34 30  e can only be 40
12460 39 36 20 61 6e 64 20 33 32 20 6f 66 0a 20 20 20  96 and 32 of.   
12470 20 2a 2a 20 74 68 65 6d 2c 20 72 65 73 70 65 63   ** them, respec
12480 74 69 76 65 6c 79 2e 20 20 53 6f 20 74 68 65 20  tively.  So the 
12490 6d 61 78 69 6d 75 6d 20 68 65 61 64 65 72 20 6c  maximum header l
124a0 65 6e 67 74 68 20 72 65 73 75 6c 74 73 20 66 72  ength results fr
124b0 6f 6d 20 61 0a 20 20 20 20 2a 2a 20 33 2d 62 79  om a.    ** 3-by
124c0 74 65 20 74 79 70 65 20 66 6f 72 20 65 61 63 68  te type for each
124d0 20 6f 66 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   of the maximum 
124e0 6f 66 20 33 32 37 36 38 20 63 6f 6c 75 6d 6e 73  of 32768 columns
124f0 20 70 6c 75 73 20 74 68 72 65 65 0a 20 20 20 20   plus three.    
12500 2a 2a 20 65 78 74 72 61 20 62 79 74 65 73 20 66  ** extra bytes f
12510 6f 72 20 74 68 65 20 68 65 61 64 65 72 20 6c 65  or the header le
12520 6e 67 74 68 20 69 74 73 65 6c 66 2e 20 20 33 32  ngth itself.  32
12530 37 36 38 2a 33 20 2b 20 33 20 3d 20 39 38 33 30  768*3 + 3 = 9830
12540 37 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  7..    */.    if
12550 28 20 6f 66 66 73 65 74 20 3e 20 39 38 33 30 37  ( offset > 98307
12560 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
12570 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
12580 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f  PT;.      goto o
12590 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20  p_column_out;.  
125a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
125b0 75 74 65 20 69 6e 20 6c 65 6e 20 74 68 65 20 6e  ute in len the n
125c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
125d0 66 20 64 61 74 61 20 77 65 20 6e 65 65 64 20 74  f data we need t
125e0 6f 20 72 65 61 64 20 69 6e 20 6f 72 64 65 72 0a  o read in order.
125f0 20 20 20 20 2a 2a 20 74 6f 20 67 65 74 20 6e 46      ** to get nF
12600 69 65 6c 64 20 74 79 70 65 20 76 61 6c 75 65 73  ield type values
12610 2e 20 20 6f 66 66 73 65 74 20 69 73 20 61 6e 20  .  offset is an 
12620 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  upper bound on t
12630 68 69 73 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  his.  But.    **
12640 20 6e 46 69 65 6c 64 20 6d 69 67 68 74 20 62 65   nField might be
12650 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 6c   significantly l
12660 65 73 73 20 74 68 61 6e 20 74 68 65 20 74 72 75  ess than the tru
12670 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
12680 6d 6e 73 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  mns.    ** in th
12690 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 69 6e 20  e table, and in 
126a0 74 68 61 74 20 63 61 73 65 2c 20 35 2a 6e 46 69  that case, 5*nFi
126b0 65 6c 64 2b 33 20 6d 69 67 68 74 20 62 65 20 73  eld+3 might be s
126c0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 66 66 73  maller than offs
126d0 65 74 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 61  et..    ** We wa
126e0 6e 74 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 6c  nt to minimize l
126f0 65 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6c  en in order to l
12700 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66  imit the size of
12710 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20   the memory.    
12720 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 65  ** allocation, e
12730 73 70 65 63 69 61 6c 6c 79 20 69 66 20 61 20 63  specially if a c
12740 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
12750 66 69 6c 65 20 68 61 73 20 63 61 75 73 65 64 20  file has caused 
12760 6f 66 66 73 65 74 0a 20 20 20 20 2a 2a 20 74 6f  offset.    ** to
12770 20 62 65 20 6f 76 65 72 73 69 7a 65 64 2e 20 4f   be oversized. O
12780 66 66 73 65 74 20 69 73 20 6c 69 6d 69 74 65 64  ffset is limited
12790 20 74 6f 20 39 38 33 30 37 20 61 62 6f 76 65 2e   to 98307 above.
127a0 20 20 42 75 74 20 39 38 33 30 37 20 6d 69 67 68    But 98307 migh
127b0 74 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 65  t.    ** still e
127c0 78 63 65 65 64 20 52 6f 62 73 6f 6e 20 6d 65 6d  xceed Robson mem
127d0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6c  ory allocation l
127e0 69 6d 69 74 73 20 6f 6e 20 73 6f 6d 65 20 63 6f  imits on some co
127f0 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 0a 20 20  nfigurations..  
12800 20 20 2a 2a 20 4f 6e 20 73 79 73 74 65 6d 73 20    ** On systems 
12810 74 68 61 74 20 63 61 6e 6e 6f 74 20 74 6f 6c 65  that cannot tole
12820 72 61 74 65 20 6c 61 72 67 65 20 6d 65 6d 6f 72  rate large memor
12830 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2c 20 6e  y allocations, n
12840 46 69 65 6c 64 2a 35 2b 33 0a 20 20 20 20 2a 2a  Field*5+3.    **
12850 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 62 65 20   will likely be 
12860 6d 75 63 68 20 73 6d 61 6c 6c 65 72 20 73 69 6e  much smaller sin
12870 63 65 20 6e 46 69 65 6c 64 20 77 69 6c 6c 20 6c  ce nField will l
12880 69 6b 65 6c 79 20 62 65 20 6c 65 73 73 20 74 68  ikely be less th
12890 61 6e 0a 20 20 20 20 2a 2a 20 32 30 20 6f 72 20  an.    ** 20 or 
128a0 73 6f 2e 20 20 54 68 69 73 20 69 6e 73 75 72 65  so.  This insure
128b0 73 20 74 68 61 74 20 52 6f 62 73 6f 6e 20 6d 65  s that Robson me
128c0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
128d0 6c 69 6d 69 74 73 20 61 72 65 0a 20 20 20 20 2a  limits are.    *
128e0 2a 20 6e 6f 74 20 65 78 63 65 65 64 65 64 20 65  * not exceeded e
128f0 76 65 6e 20 66 6f 72 20 63 6f 72 72 75 70 74 20  ven for corrupt 
12900 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a  database files..
12910 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d      */.    len =
12920 20 6e 46 69 65 6c 64 2a 35 20 2b 20 33 3b 0a 20   nField*5 + 3;. 
12930 20 20 20 69 66 28 20 6c 65 6e 20 3e 20 28 69 6e     if( len > (in
12940 74 29 6f 66 66 73 65 74 20 29 20 6c 65 6e 20 3d  t)offset ) len =
12950 20 28 69 6e 74 29 6f 66 66 73 65 74 3b 0a 0a 20   (int)offset;.. 
12960 20 20 20 2f 2a 20 54 68 65 20 4b 65 79 46 65 74     /* The KeyFet
12970 63 68 28 29 20 6f 72 20 44 61 74 61 46 65 74 63  ch() or DataFetc
12980 68 28 29 20 61 62 6f 76 65 20 61 72 65 20 66 61  h() above are fa
12990 73 74 20 61 6e 64 20 77 69 6c 6c 20 67 65 74 20  st and will get 
129a0 74 68 65 20 65 6e 74 69 72 65 0a 20 20 20 20 2a  the entire.    *
129b0 2a 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20  * record header 
129c0 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 2e 20 20  in most cases.  
129d0 42 75 74 20 74 68 65 79 20 77 69 6c 6c 20 66 61  But they will fa
129e0 69 6c 20 74 6f 20 67 65 74 20 74 68 65 20 63 6f  il to get the co
129f0 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 72 65  mplete.    ** re
12a00 63 6f 72 64 20 68 65 61 64 65 72 20 69 66 20 74  cord header if t
12a10 68 65 20 72 65 63 6f 72 64 20 68 65 61 64 65 72  he record header
12a20 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 6f 6e   does not fit on
12a30 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 0a 20   a single page. 
12a40 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 42 2d 54     ** in the B-T
12a50 72 65 65 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ree.  When that 
12a60 68 61 70 70 65 6e 73 2c 20 75 73 65 20 73 71 6c  happens, use sql
12a70 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
12a80 74 72 65 65 28 29 20 74 6f 0a 20 20 20 20 2a 2a  tree() to.    **
12a90 20 61 63 71 75 69 72 65 20 74 68 65 20 63 6f 6d   acquire the com
12aa0 70 6c 65 74 65 20 68 65 61 64 65 72 20 74 65 78  plete header tex
12ab0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
12ac0 28 20 21 7a 52 65 63 20 26 26 20 61 76 61 69 6c  ( !zRec && avail
12ad0 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 20 20 73 4d  <len ){.      sM
12ae0 65 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  em.flags = 0;.  
12af0 20 20 20 20 73 4d 65 6d 2e 64 62 20 3d 20 30 3b      sMem.db = 0;
12b00 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12b10 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
12b20 72 65 65 28 70 43 72 73 72 2c 20 30 2c 20 6c 65  ree(pCrsr, 0, le
12b30 6e 2c 20 70 43 2d 3e 69 73 49 6e 64 65 78 2c 20  n, pC->isIndex, 
12b40 26 73 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66  &sMem);.      if
12b50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12b60 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
12b70 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20  op_column_out;. 
12b80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 44 61       }.      zDa
12b90 74 61 20 3d 20 73 4d 65 6d 2e 7a 3b 0a 20 20 20  ta = sMem.z;.   
12ba0 20 7d 0a 20 20 20 20 7a 45 6e 64 48 64 72 20 3d   }.    zEndHdr =
12bb0 20 28 75 38 20 2a 29 26 7a 44 61 74 61 5b 6c 65   (u8 *)&zData[le
12bc0 6e 5d 3b 0a 20 20 20 20 7a 49 64 78 20 3d 20 28  n];.    zIdx = (
12bd0 75 38 20 2a 29 26 7a 44 61 74 61 5b 73 7a 48 64  u8 *)&zData[szHd
12be0 72 5d 3b 0a 0a 20 20 20 20 2f 2a 20 53 63 61 6e  r];..    /* Scan
12bf0 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
12c00 75 73 65 20 69 74 20 74 6f 20 66 69 6c 6c 20 69  use it to fill i
12c10 6e 20 74 68 65 20 61 54 79 70 65 5b 5d 20 61 6e  n the aType[] an
12c20 64 20 61 4f 66 66 73 65 74 5b 5d 0a 20 20 20 20  d aOffset[].    
12c30 2a 2a 20 61 72 72 61 79 73 2e 20 20 61 54 79 70  ** arrays.  aTyp
12c40 65 5b 69 5d 20 77 69 6c 6c 20 63 6f 6e 74 61 69  e[i] will contai
12c50 6e 20 74 68 65 20 74 79 70 65 20 69 6e 74 65 67  n the type integ
12c60 65 72 20 66 6f 72 20 74 68 65 20 69 2d 74 68 0a  er for the i-th.
12c70 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 61 6e      ** column an
12c80 64 20 61 4f 66 66 73 65 74 5b 69 5d 20 77 69 6c  d aOffset[i] wil
12c90 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6f 66  l contain the of
12ca0 66 73 65 74 20 66 72 6f 6d 20 74 68 65 20 62 65  fset from the be
12cb0 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f  ginning.    ** o
12cc0 66 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20  f the record to 
12cd0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
12ce0 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 69 2d   data for the i-
12cf0 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f  th column.    */
12d00 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
12d10 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  nField; i++){.  
12d20 20 20 20 20 69 66 28 20 7a 49 64 78 3c 7a 45 6e      if( zIdx<zEn
12d30 64 48 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  dHdr ){.        
12d40 61 4f 66 66 73 65 74 5b 69 5d 20 3d 20 6f 66 66  aOffset[i] = off
12d50 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  set;.        if(
12d60 20 7a 49 64 78 5b 30 5d 3c 30 78 38 30 20 29 7b   zIdx[0]<0x80 ){
12d70 0a 20 20 20 20 20 20 20 20 20 20 74 20 3d 20 7a  .          t = z
12d80 49 64 78 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  Idx[0];.        
12d90 20 20 7a 49 64 78 2b 2b 3b 0a 20 20 20 20 20 20    zIdx++;.      
12da0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12db0 20 20 20 7a 49 64 78 20 2b 3d 20 73 71 6c 69 74     zIdx += sqlit
12dc0 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 7a 49  e3GetVarint32(zI
12dd0 64 78 2c 20 26 74 29 3b 0a 20 20 20 20 20 20 20  dx, &t);.       
12de0 20 7d 0a 20 20 20 20 20 20 20 20 61 54 79 70 65   }.        aType
12df0 5b 69 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 20  [i] = t;.       
12e00 20 73 7a 46 69 65 6c 64 20 3d 20 73 71 6c 69 74   szField = sqlit
12e10 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
12e20 4c 65 6e 28 74 29 3b 0a 20 20 20 20 20 20 20 20  Len(t);.        
12e30 6f 66 66 73 65 74 20 2b 3d 20 73 7a 46 69 65 6c  offset += szFiel
12e40 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  d;.        if( o
12e50 66 66 73 65 74 3c 73 7a 46 69 65 6c 64 20 29 7b  ffset<szField ){
12e60 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 66 66    /* True if off
12e70 73 65 74 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f  set overflows */
12e80 0a 20 20 20 20 20 20 20 20 20 20 7a 49 64 78 20  .          zIdx 
12e90 3d 20 26 7a 45 6e 64 48 64 72 5b 31 5d 3b 20 20  = &zEndHdr[1];  
12ea0 2f 2a 20 46 6f 72 63 65 73 20 53 51 4c 49 54 45  /* Forces SQLITE
12eb0 5f 43 4f 52 52 55 50 54 20 72 65 74 75 72 6e 20  _CORRUPT return 
12ec0 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20  below */.       
12ed0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12ee0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
12ef0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69  .        /* If i
12f00 20 69 73 20 6c 65 73 73 20 74 68 61 74 20 6e 46   is less that nF
12f10 69 65 6c 64 2c 20 74 68 65 6e 20 74 68 65 72 65  ield, then there
12f20 20 61 72 65 20 66 65 77 65 72 20 66 69 65 6c 64   are fewer field
12f30 73 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20  s in this.      
12f40 20 20 2a 2a 20 72 65 63 6f 72 64 20 74 68 61 6e    ** record than
12f50 20 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20 69   SetNumColumns i
12f60 6e 64 69 63 61 74 65 64 20 74 68 65 72 65 20 61  ndicated there a
12f70 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  re columns in th
12f80 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  e.        ** tab
12f90 6c 65 2e 20 53 65 74 20 74 68 65 20 6f 66 66 73  le. Set the offs
12fa0 65 74 20 66 6f 72 20 61 6e 79 20 65 78 74 72 61  et for any extra
12fb0 20 63 6f 6c 75 6d 6e 73 20 6e 6f 74 20 70 72 65   columns not pre
12fc0 73 65 6e 74 20 69 6e 0a 20 20 20 20 20 20 20 20  sent in.        
12fd0 2a 2a 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f  ** the record to
12fe0 20 30 2e 20 54 68 69 73 20 74 65 6c 6c 73 20 63   0. This tells c
12ff0 6f 64 65 20 62 65 6c 6f 77 20 74 6f 20 73 74 6f  ode below to sto
13000 72 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  re the default v
13010 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  alue.        ** 
13020 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  for the column i
13030 6e 73 74 65 61 64 20 6f 66 20 64 65 73 65 72 69  nstead of deseri
13040 61 6c 69 7a 69 6e 67 20 61 20 76 61 6c 75 65 20  alizing a value 
13050 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 2e  from the record.
13060 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
13070 20 20 20 20 61 4f 66 66 73 65 74 5b 69 5d 20 3d      aOffset[i] =
13080 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
13090 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
130a0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 73 4d 65  eMemRelease(&sMe
130b0 6d 29 3b 0a 20 20 20 20 73 4d 65 6d 2e 66 6c 61  m);.    sMem.fla
130c0 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 0a  gs = MEM_Null;..
130d0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76      /* If we hav
130e0 65 20 72 65 61 64 20 6d 6f 72 65 20 68 65 61 64  e read more head
130f0 65 72 20 64 61 74 61 20 74 68 61 6e 20 77 61 73  er data than was
13100 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
13110 65 20 68 65 61 64 65 72 2c 0a 20 20 20 20 2a 2a  e header,.    **
13120 20 6f 72 20 69 66 20 74 68 65 20 65 6e 64 20 6f   or if the end o
13130 66 20 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64  f the last field
13140 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 70   appears to be p
13150 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
13160 68 65 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64  he.    ** record
13170 2c 20 6f 72 20 69 66 20 74 68 65 20 65 6e 64 20  , or if the end 
13180 6f 66 20 74 68 65 20 6c 61 73 74 20 66 69 65 6c  of the last fiel
13190 64 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  d appears to be 
131a0 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64 0a 20  before the end. 
131b0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 65 63     ** of the rec
131c0 6f 72 64 20 28 77 68 65 6e 20 61 6c 6c 20 66 69  ord (when all fi
131d0 65 6c 64 73 20 70 72 65 73 65 6e 74 29 2c 20 74  elds present), t
131e0 68 65 6e 20 77 65 20 6d 75 73 74 20 62 65 20 64  hen we must be d
131f0 65 61 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 77  ealing .    ** w
13200 69 74 68 20 61 20 63 6f 72 72 75 70 74 20 64 61  ith a corrupt da
13210 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
13220 20 20 20 69 66 28 20 28 7a 49 64 78 20 3e 20 7a     if( (zIdx > z
13230 45 6e 64 48 64 72 29 20 7c 7c 20 28 6f 66 66 73  EndHdr) || (offs
13240 65 74 20 3e 20 70 61 79 6c 6f 61 64 53 69 7a 65  et > payloadSize
13250 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 7a  ).         || (z
13260 49 64 78 3d 3d 7a 45 6e 64 48 64 72 20 26 26 20  Idx==zEndHdr && 
13270 6f 66 66 73 65 74 21 3d 70 61 79 6c 6f 61 64 53  offset!=payloadS
13280 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ize) ){.      rc
13290 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
132a0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
132b0 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74  to op_column_out
132c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
132d0 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e  * Get the column
132e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 49 66   information. If
132f0 20 61 4f 66 66 73 65 74 5b 70 32 5d 20 69 73 20   aOffset[p2] is 
13300 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 0a  non-zero, then .
13310 20 20 2a 2a 20 64 65 73 65 72 69 61 6c 69 7a 65    ** deserialize
13320 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
13330 74 68 65 20 72 65 63 6f 72 64 2e 20 49 66 20 61  the record. If a
13340 4f 66 66 73 65 74 5b 70 32 5d 20 69 73 20 7a 65  Offset[p2] is ze
13350 72 6f 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  ro,.  ** then th
13360 65 72 65 20 61 72 65 20 6e 6f 74 20 65 6e 6f 75  ere are not enou
13370 67 68 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  gh fields in the
13380 20 72 65 63 6f 72 64 20 74 6f 20 73 61 74 69 73   record to satis
13390 66 79 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75  fy the.  ** requ
133a0 65 73 74 2e 20 20 49 6e 20 74 68 69 73 20 63 61  est.  In this ca
133b0 73 65 2c 20 73 65 74 20 74 68 65 20 76 61 6c 75  se, set the valu
133c0 65 20 4e 55 4c 4c 20 6f 72 20 74 6f 20 50 34 20  e NULL or to P4 
133d0 69 66 20 50 34 20 69 73 0a 20 20 2a 2a 20 61 20  if P4 is.  ** a 
133e0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d  pointer to a Mem
133f0 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   object..  */.  
13400 69 66 28 20 61 4f 66 66 73 65 74 5b 70 32 5d 20  if( aOffset[p2] 
13410 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
13420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
13430 20 20 20 20 69 66 28 20 7a 52 65 63 20 29 7b 0a      if( zRec ){.
13440 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
13450 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
13460 20 77 68 65 72 65 20 74 68 65 20 77 68 6f 6c 65   where the whole
13470 20 72 6f 77 20 66 69 74 73 20 6f 6e 20 61 20 73   row fits on a s
13480 69 6e 67 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20  ingle page */.  
13490 20 20 20 20 56 64 62 65 4d 65 6d 52 65 6c 65 61      VdbeMemRelea
134a0 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  se(pDest);.     
134b0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
134c0 61 6c 47 65 74 28 28 75 38 20 2a 29 26 7a 52 65  alGet((u8 *)&zRe
134d0 63 5b 61 4f 66 66 73 65 74 5b 70 32 5d 5d 2c 20  c[aOffset[p2]], 
134e0 61 54 79 70 65 5b 70 32 5d 2c 20 70 44 65 73 74  aType[p2], pDest
134f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13500 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
13510 63 68 20 68 61 70 70 65 6e 73 20 6f 6e 6c 79 20  ch happens only 
13520 77 68 65 6e 20 74 68 65 20 72 6f 77 20 6f 76 65  when the row ove
13530 72 66 6c 6f 77 73 20 6f 6e 74 6f 20 6d 75 6c 74  rflows onto mult
13540 69 70 6c 65 20 70 61 67 65 73 20 2a 2f 0a 20 20  iple pages */.  
13550 20 20 20 20 74 20 3d 20 61 54 79 70 65 5b 70 32      t = aType[p2
13560 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f  ];.      if( (pO
13570 70 2d 3e 70 35 20 26 20 28 4f 50 46 4c 41 47 5f  p->p5 & (OPFLAG_
13580 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47  LENGTHARG|OPFLAG
13590 5f 54 59 50 45 4f 46 41 52 47 29 29 21 3d 30 0a  _TYPEOFARG))!=0.
135a0 20 20 20 20 20 20 20 26 26 20 28 28 74 3e 3d 31         && ((t>=1
135b0 32 20 26 26 20 28 74 26 31 29 3d 3d 30 29 20 7c  2 && (t&1)==0) |
135c0 7c 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46  | (pOp->p5 & OPF
135d0 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 21 3d  LAG_TYPEOFARG)!=
135e0 30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  0).      ){.    
135f0 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 69      /* Content i
13600 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72  s irrelevant for
13610 20 74 68 65 20 74 79 70 65 6f 66 28 29 20 66 75   the typeof() fu
13620 6e 63 74 69 6f 6e 20 61 6e 64 20 66 6f 72 0a 20  nction and for. 
13630 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65         ** the le
13640 6e 67 74 68 28 58 29 20 66 75 6e 63 74 69 6f 6e  ngth(X) function
13650 20 69 66 20 58 20 69 73 20 61 20 62 6c 6f 62 2e   if X is a blob.
13660 20 20 53 6f 20 77 65 20 6d 69 67 68 74 20 61 73    So we might as
13670 20 77 65 6c 6c 20 75 73 65 0a 20 20 20 20 20 20   well use.      
13680 20 20 2a 2a 20 62 6f 67 75 73 20 63 6f 6e 74 65    ** bogus conte
13690 6e 74 20 72 61 74 68 65 72 20 74 68 61 6e 20 72  nt rather than r
136a0 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66  eading content f
136b0 72 6f 6d 20 64 69 73 6b 2e 20 20 4e 55 4c 4c 20  rom disk.  NULL 
136c0 77 6f 72 6b 73 0a 20 20 20 20 20 20 20 20 2a 2a  works.        **
136d0 20 66 6f 72 20 74 65 78 74 20 61 6e 64 20 62 6c   for text and bl
136e0 6f 62 20 61 6e 64 20 77 68 61 74 65 76 65 72 20  ob and whatever 
136f0 69 73 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  is in the payloa
13700 64 53 69 7a 65 36 34 20 76 61 72 69 61 62 6c 65  dSize64 variable
13710 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  .        ** will
13720 20 77 6f 72 6b 20 66 6f 72 20 65 76 65 72 79 74   work for everyt
13730 68 69 6e 67 20 65 6c 73 65 2e 20 2a 2f 0a 20 20  hing else. */.  
13740 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 74 3c        zData = t<
13750 31 32 20 3f 20 28 63 68 61 72 2a 29 26 70 61 79  12 ? (char*)&pay
13760 6c 6f 61 64 53 69 7a 65 36 34 20 3a 20 30 3b 0a  loadSize64 : 0;.
13770 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13780 20 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74       len = sqlit
13790 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
137a0 4c 65 6e 28 74 29 3b 0a 20 20 20 20 20 20 20 20  Len(t);.        
137b0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f  sqlite3VdbeMemMo
137c0 76 65 28 26 73 4d 65 6d 2c 20 70 44 65 73 74 29  ve(&sMem, pDest)
137d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
137e0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
137f0 6d 42 74 72 65 65 28 70 43 72 73 72 2c 20 61 4f  mBtree(pCrsr, aO
13800 66 66 73 65 74 5b 70 32 5d 2c 20 6c 65 6e 2c 20  ffset[p2], len, 
13810 20 70 43 2d 3e 69 73 49 6e 64 65 78 2c 0a 20 20   pC->isIndex,.  
13820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13840 20 20 20 26 73 4d 65 6d 29 3b 0a 20 20 20 20 20     &sMem);.     
13850 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13860 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13870 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e    goto op_column
13880 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
13890 20 20 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20          zData = 
138a0 73 4d 65 6d 2e 7a 3b 0a 20 20 20 20 20 20 7d 0a  sMem.z;.      }.
138b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
138c0 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
138d0 7a 44 61 74 61 2c 20 74 2c 20 70 44 65 73 74 29  zData, t, pDest)
138e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73  ;.    }.    pDes
138f0 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e  t->enc = encodin
13900 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
13910 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  if( pOp->p4type=
13920 3d 50 34 5f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  =P4_MEM ){.     
13930 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
13940 68 61 6c 6c 6f 77 43 6f 70 79 28 70 44 65 73 74  hallowCopy(pDest
13950 2c 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 2c 20  , pOp->p4.pMem, 
13960 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20 20  MEM_Static);.   
13970 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65   }else{.      Me
13980 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 44 65  mSetTypeFlag(pDe
13990 73 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  st, MEM_Null);. 
139a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
139b0 66 20 77 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  f we dynamically
139c0 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
139d0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 64 61 74   to hold the dat
139e0 61 20 28 69 6e 20 74 68 65 0a 20 20 2a 2a 20 73  a (in the.  ** s
139f0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
13a00 6d 42 74 72 65 65 28 29 20 63 61 6c 6c 20 61 62  mBtree() call ab
13a10 6f 76 65 29 20 74 68 65 6e 20 74 72 61 6e 73 66  ove) then transf
13a20 65 72 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 74 68  er control of th
13a30 61 74 0a 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61  at.  ** dynamica
13a40 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 70  lly allocated sp
13a50 61 63 65 20 6f 76 65 72 20 74 6f 20 74 68 65 20  ace over to the 
13a60 70 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  pDest structure.
13a70 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 65 76 65  .  ** This preve
13a80 6e 74 73 20 61 20 6d 65 6d 6f 72 79 20 63 6f 70  nts a memory cop
13a90 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 4d  y..  */.  if( sM
13aa0 65 6d 2e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20  em.zMalloc ){.  
13ab0 20 20 61 73 73 65 72 74 28 20 73 4d 65 6d 2e 7a    assert( sMem.z
13ac0 3d 3d 73 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63 20 29  ==sMem.zMalloc )
13ad0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 28  ;.    assert( !(
13ae0 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 26 20 4d  pDest->flags & M
13af0 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 20 20 61  EM_Dyn) );.    a
13b00 73 73 65 72 74 28 20 21 28 70 44 65 73 74 2d 3e  ssert( !(pDest->
13b10 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 42 6c 6f  flags & (MEM_Blo
13b20 62 7c 4d 45 4d 5f 53 74 72 29 29 20 7c 7c 20 70  b|MEM_Str)) || p
13b30 44 65 73 74 2d 3e 7a 3d 3d 73 4d 65 6d 2e 7a 20  Dest->z==sMem.z 
13b40 29 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 66 6c  );.    pDest->fl
13b50 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 45 70 68  ags &= ~(MEM_Eph
13b60 65 6d 7c 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a  em|MEM_Static);.
13b70 20 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73      pDest->flags
13b80 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20   |= MEM_Term;.  
13b90 20 20 70 44 65 73 74 2d 3e 7a 20 3d 20 73 4d 65    pDest->z = sMe
13ba0 6d 2e 7a 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e  m.z;.    pDest->
13bb0 7a 4d 61 6c 6c 6f 63 20 3d 20 73 4d 65 6d 2e 7a  zMalloc = sMem.z
13bc0 4d 61 6c 6c 6f 63 3b 0a 20 20 7d 0a 0a 20 20 72  Malloc;.  }..  r
13bd0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
13be0 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c 65 28  emMakeWriteable(
13bf0 70 44 65 73 74 29 3b 0a 0a 6f 70 5f 63 6f 6c 75  pDest);..op_colu
13c00 6d 6e 5f 6f 75 74 3a 0a 20 20 55 50 44 41 54 45  mn_out:.  UPDATE
13c10 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 44  _MAX_BLOBSIZE(pD
13c20 65 73 74 29 3b 0a 20 20 52 45 47 49 53 54 45 52  est);.  REGISTER
13c30 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20  _TRACE(pOp->p3, 
13c40 70 44 65 73 74 29 3b 0a 20 20 62 72 65 61 6b 3b  pDest);.  break;
13c50 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41  .}../* Opcode: A
13c60 66 66 69 6e 69 74 79 20 50 31 20 50 32 20 2a 20  ffinity P1 P2 * 
13c70 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 41 70 70 6c 79  P4 *.**.** Apply
13c80 20 61 66 66 69 6e 69 74 69 65 73 20 74 6f 20 61   affinities to a
13c90 20 72 61 6e 67 65 20 6f 66 20 50 32 20 72 65 67   range of P2 reg
13ca0 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
13cb0 77 69 74 68 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 50  with P1..**.** P
13cc0 34 20 69 73 20 61 20 73 74 72 69 6e 67 20 74 68  4 is a string th
13cd0 61 74 20 69 73 20 50 32 20 63 68 61 72 61 63 74  at is P2 charact
13ce0 65 72 73 20 6c 6f 6e 67 2e 20 54 68 65 20 6e 74  ers long. The nt
13cf0 68 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  h character of t
13d00 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 64  he.** string ind
13d10 69 63 61 74 65 73 20 74 68 65 20 63 6f 6c 75 6d  icates the colum
13d20 6e 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  n affinity that 
13d30 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
13d40 6f 72 20 74 68 65 20 6e 74 68 0a 2a 2a 20 6d 65  or the nth.** me
13d50 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74 68 65  mory cell in the
13d60 20 72 61 6e 67 65 2e 0a 2a 2f 0a 63 61 73 65 20   range..*/.case 
13d70 4f 50 5f 41 66 66 69 6e 69 74 79 3a 20 7b 0a 20  OP_Affinity: {. 
13d80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 66   const char *zAf
13d90 66 69 6e 69 74 79 3b 20 20 20 2f 2a 20 54 68 65  finity;   /* The
13da0 20 61 66 66 69 6e 69 74 79 20 74 6f 20 62 65 20   affinity to be 
13db0 61 70 70 6c 69 65 64 20 2a 2f 0a 20 20 63 68 61  applied */.  cha
13dc0 72 20 63 41 66 66 3b 20 20 20 20 20 20 20 20 20  r cAff;         
13dd0 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
13de0 65 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 61  e character of a
13df0 66 66 69 6e 69 74 79 20 2a 2f 0a 0a 20 20 7a 41  ffinity */..  zA
13e00 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70  ffinity = pOp->p
13e10 34 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  4.z;.  assert( z
13e20 41 66 66 69 6e 69 74 79 21 3d 30 20 29 3b 0a 20  Affinity!=0 );. 
13e30 20 61 73 73 65 72 74 28 20 7a 41 66 66 69 6e 69   assert( zAffini
13e40 74 79 5b 70 4f 70 2d 3e 70 32 5d 3d 3d 30 20 29  ty[pOp->p2]==0 )
13e50 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ;.  pIn1 = &aMem
13e60 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 77 68 69  [pOp->p1];.  whi
13e70 6c 65 28 20 28 63 41 66 66 20 3d 20 2a 28 7a 41  le( (cAff = *(zA
13e80 66 66 69 6e 69 74 79 2b 2b 29 29 21 3d 30 20 29  ffinity++))!=0 )
13e90 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
13ea0 6e 31 20 3c 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70  n1 <= &p->aMem[p
13eb0 2d 3e 6e 4d 65 6d 5d 20 29 3b 0a 20 20 20 20 61  ->nMem] );.    a
13ec0 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
13ed0 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 20 20 45  d(pIn1) );.    E
13ee0 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31 29 3b  xpandBlob(pIn1);
13ef0 0a 20 20 20 20 61 70 70 6c 79 41 66 66 69 6e 69  .    applyAffini
13f00 74 79 28 70 49 6e 31 2c 20 63 41 66 66 2c 20 65  ty(pIn1, cAff, e
13f10 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 70 49  ncoding);.    pI
13f20 6e 31 2b 2b 3b 0a 20 20 7d 0a 20 20 62 72 65 61  n1++;.  }.  brea
13f30 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
13f40 20 4d 61 6b 65 52 65 63 6f 72 64 20 50 31 20 50   MakeRecord P1 P
13f50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  2 P3 P4 *.**.** 
13f60 43 6f 6e 76 65 72 74 20 50 32 20 72 65 67 69 73  Convert P2 regis
13f70 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 77  ters beginning w
13f80 69 74 68 20 50 31 20 69 6e 74 6f 20 74 68 65 20  ith P1 into the 
13f90 5b 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 5d 0a  [record format].
13fa0 2a 2a 20 75 73 65 20 61 73 20 61 20 64 61 74 61  ** use as a data
13fb0 20 72 65 63 6f 72 64 20 69 6e 20 61 20 64 61 74   record in a dat
13fc0 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61  abase table or a
13fd0 73 20 61 20 6b 65 79 0a 2a 2a 20 69 6e 20 61 6e  s a key.** in an
13fe0 20 69 6e 64 65 78 2e 20 20 54 68 65 20 4f 50 5f   index.  The OP_
13ff0 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 63 61  Column opcode ca
14000 6e 20 64 65 63 6f 64 65 20 74 68 65 20 72 65 63  n decode the rec
14010 6f 72 64 20 6c 61 74 65 72 2e 0a 2a 2a 0a 2a 2a  ord later..**.**
14020 20 50 34 20 6d 61 79 20 62 65 20 61 20 73 74 72   P4 may be a str
14030 69 6e 67 20 74 68 61 74 20 69 73 20 50 32 20 63  ing that is P2 c
14040 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20  haracters long. 
14050 20 54 68 65 20 6e 74 68 20 63 68 61 72 61 63 74   The nth charact
14060 65 72 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 72  er of the.** str
14070 69 6e 67 20 69 6e 64 69 63 61 74 65 73 20 74 68  ing indicates th
14080 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  e column affinit
14090 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  y that should be
140a0 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 6e 74   used for the nt
140b0 68 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  h.** field of th
140c0 65 20 69 6e 64 65 78 20 6b 65 79 2e 0a 2a 2a 0a  e index key..**.
140d0 2a 2a 20 54 68 65 20 6d 61 70 70 69 6e 67 20 66  ** The mapping f
140e0 72 6f 6d 20 63 68 61 72 61 63 74 65 72 20 74 6f  rom character to
140f0 20 61 66 66 69 6e 69 74 79 20 69 73 20 67 69 76   affinity is giv
14100 65 6e 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  en by the SQLITE
14110 5f 41 46 46 5f 0a 2a 2a 20 6d 61 63 72 6f 73 20  _AFF_.** macros 
14120 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
14130 65 49 6e 74 2e 68 2e 0a 2a 2a 0a 2a 2a 20 49 66  eInt.h..**.** If
14140 20 50 34 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e   P4 is NULL then
14150 20 61 6c 6c 20 69 6e 64 65 78 20 66 69 65 6c 64   all index field
14160 73 20 68 61 76 65 20 74 68 65 20 61 66 66 69 6e  s have the affin
14170 69 74 79 20 4e 4f 4e 45 2e 0a 2a 2f 0a 63 61 73  ity NONE..*/.cas
14180 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 3a  e OP_MakeRecord:
14190 20 7b 0a 20 20 75 38 20 2a 7a 4e 65 77 52 65 63   {.  u8 *zNewRec
141a0 6f 72 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  ord;        /* A
141b0 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
141c0 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65  the data for the
141d0 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
141e0 20 4d 65 6d 20 2a 70 52 65 63 3b 20 20 20 20 20   Mem *pRec;     
141f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
14200 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 75  ew record */.  u
14210 36 34 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20  64 nData;       
14220 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14230 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
14240 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20   space */.  int 
14250 6e 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  nHdr;           
14260 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14270 62 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20  bytes of header 
14280 73 70 61 63 65 20 2a 2f 0a 20 20 69 36 34 20 6e  space */.  i64 n
14290 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
142a0 20 20 2f 2a 20 44 61 74 61 20 73 70 61 63 65 20    /* Data space 
142b0 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 69  required for thi
142c0 73 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  s record */.  in
142d0 74 20 6e 5a 65 72 6f 3b 20 20 20 20 20 20 20 20  t nZero;        
142e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
142f0 66 20 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  f zero bytes at 
14300 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
14310 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
14320 56 61 72 69 6e 74 3b 20 20 20 20 20 20 20 20 20  Varint;         
14330 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
14340 79 74 65 73 20 69 6e 20 61 20 76 61 72 69 6e 74  ytes in a varint
14350 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c   */.  u32 serial
14360 5f 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20  _type;       /* 
14370 54 79 70 65 20 66 69 65 6c 64 20 2a 2f 0a 20 20  Type field */.  
14380 4d 65 6d 20 2a 70 44 61 74 61 30 3b 20 20 20 20  Mem *pData0;    
14390 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
143a0 66 69 65 6c 64 20 74 6f 20 62 65 20 63 6f 6d 62  field to be comb
143b0 69 6e 65 64 20 69 6e 74 6f 20 74 68 65 20 72 65  ined into the re
143c0 63 6f 72 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  cord */.  Mem *p
143d0 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
143e0 20 2f 2a 20 4c 61 73 74 20 66 69 65 6c 64 20 6f   /* Last field o
143f0 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  f the record */.
14400 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20    int nField;   
14410 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14420 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
14430 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
14440 63 68 61 72 20 2a 7a 41 66 66 69 6e 69 74 79 3b  char *zAffinity;
14450 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 66         /* The af
14460 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f  finity string fo
14470 72 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  r the record */.
14480 20 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61    int file_forma
14490 74 3b 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65  t;       /* File
144a0 20 66 6f 72 6d 61 74 20 74 6f 20 75 73 65 20 66   format to use f
144b0 6f 72 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  or encoding */. 
144c0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
144d0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
144e0 20 75 73 65 64 20 69 6e 20 7a 4e 65 77 52 65 63   used in zNewRec
144f0 6f 72 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6c  ord[] */.  int l
14500 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
14510 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 61    /* Length of a
14520 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 2f 2a 20   field */..  /* 
14530 41 73 73 75 6d 69 6e 67 20 74 68 65 20 72 65 63  Assuming the rec
14540 6f 72 64 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66  ord contains N f
14550 69 65 6c 64 73 2c 20 74 68 65 20 72 65 63 6f 72  ields, the recor
14560 64 20 66 6f 72 6d 61 74 20 6c 6f 6f 6b 73 0a 20  d format looks. 
14570 20 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20   ** like this:. 
14580 20 2a 2a 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d   **.  ** -------
14590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145d0 2d 0a 20 20 2a 2a 20 7c 20 68 64 72 2d 73 69 7a  -.  ** | hdr-siz
145e0 65 20 7c 20 74 79 70 65 20 30 20 7c 20 74 79 70  e | type 0 | typ
145f0 65 20 31 20 7c 20 2e 2e 2e 20 7c 20 74 79 70 65  e 1 | ... | type
14600 20 4e 2d 31 20 7c 20 64 61 74 61 30 20 7c 20 2e   N-1 | data0 | .
14610 2e 2e 20 7c 20 64 61 74 61 20 4e 2d 31 20 7c 20  .. | data N-1 | 
14620 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .  ** ----------
14630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
14670 20 2a 2a 0a 20 20 2a 2a 20 44 61 74 61 28 30 29   **.  ** Data(0)
14680 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72   is taken from r
14690 65 67 69 73 74 65 72 20 50 31 2e 20 20 44 61 74  egister P1.  Dat
146a0 61 28 31 29 20 63 6f 6d 65 73 20 66 72 6f 6d 20  a(1) comes from 
146b0 72 65 67 69 73 74 65 72 20 50 31 2b 31 0a 20 20  register P1+1.  
146c0 2a 2a 20 61 6e 64 20 73 6f 20 66 72 6f 74 68 2e  ** and so froth.
146d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 63 68 20  .  **.  ** Each 
146e0 74 79 70 65 20 66 69 65 6c 64 20 69 73 20 61 20  type field is a 
146f0 76 61 72 69 6e 74 20 72 65 70 72 65 73 65 6e 74  varint represent
14700 69 6e 67 20 74 68 65 20 73 65 72 69 61 6c 20 74  ing the serial t
14710 79 70 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a  ype of the .  **
14720 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64   corresponding d
14730 61 74 61 20 65 6c 65 6d 65 6e 74 20 28 73 65 65  ata element (see
14740 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
14750 61 6c 54 79 70 65 28 29 29 2e 20 54 68 65 0a 20  alType()). The. 
14760 20 2a 2a 20 68 64 72 2d 73 69 7a 65 20 66 69 65   ** hdr-size fie
14770 6c 64 20 69 73 20 61 6c 73 6f 20 61 20 76 61 72  ld is also a var
14780 69 6e 74 20 77 68 69 63 68 20 69 73 20 74 68 65  int which is the
14790 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 74 68 65   offset from the
147a0 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20   beginning.  ** 
147b0 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f  of the record to
147c0 20 64 61 74 61 30 2e 0a 20 20 2a 2f 0a 20 20 6e   data0..  */.  n
147d0 44 61 74 61 20 3d 20 30 3b 20 20 20 20 20 20 20  Data = 0;       
147e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
147f0 79 74 65 73 20 6f 66 20 64 61 74 61 20 73 70 61  ytes of data spa
14800 63 65 20 2a 2f 0a 20 20 6e 48 64 72 20 3d 20 30  ce */.  nHdr = 0
14810 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
14820 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
14830 20 68 65 61 64 65 72 20 73 70 61 63 65 20 2a 2f   header space */
14840 0a 20 20 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20  .  nZero = 0;   
14850 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14860 6f 66 20 7a 65 72 6f 20 62 79 74 65 73 20 61 74  of zero bytes at
14870 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
14880 72 65 63 6f 72 64 20 2a 2f 0a 20 20 6e 46 69 65  record */.  nFie
14890 6c 64 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  ld = pOp->p1;.  
148a0 7a 41 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d  zAffinity = pOp-
148b0 3e 70 34 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28  >p4.z;.  assert(
148c0 20 6e 46 69 65 6c 64 3e 30 20 26 26 20 70 4f 70   nField>0 && pOp
148d0 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p2>0 && pOp->p
148e0 32 2b 6e 46 69 65 6c 64 3c 3d 70 2d 3e 6e 4d 65  2+nField<=p->nMe
148f0 6d 2b 31 20 29 3b 0a 20 20 70 44 61 74 61 30 20  m+1 );.  pData0 
14900 3d 20 26 61 4d 65 6d 5b 6e 46 69 65 6c 64 5d 3b  = &aMem[nField];
14910 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d  .  nField = pOp-
14920 3e 70 32 3b 0a 20 20 70 4c 61 73 74 20 3d 20 26  >p2;.  pLast = &
14930 70 44 61 74 61 30 5b 6e 46 69 65 6c 64 2d 31 5d  pData0[nField-1]
14940 3b 0a 20 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20  ;.  file_format 
14950 3d 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c  = p->minWriteFil
14960 65 46 6f 72 6d 61 74 3b 0a 0a 20 20 2f 2a 20 49  eFormat;..  /* I
14970 64 65 6e 74 69 66 79 20 74 68 65 20 6f 75 74 70  dentify the outp
14980 75 74 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ut register */. 
14990 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
149a0 3c 70 4f 70 2d 3e 70 31 20 7c 7c 20 70 4f 70 2d  <pOp->p1 || pOp-
149b0 3e 70 33 3e 3d 70 4f 70 2d 3e 70 31 2b 70 4f 70  >p3>=pOp->p1+pOp
149c0 2d 3e 70 32 20 29 3b 0a 20 20 70 4f 75 74 20 3d  ->p2 );.  pOut =
149d0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
149e0 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61  .  memAboutToCha
149f0 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 0a 20  nge(p, pOut);.. 
14a00 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
14a10 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 74 68   the elements th
14a20 61 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75 70 20  at will make up 
14a30 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 66 69  the record to fi
14a40 67 75 72 65 0a 20 20 2a 2a 20 6f 75 74 20 68 6f  gure.  ** out ho
14a50 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
14a60 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65  required for the
14a70 20 6e 65 77 20 72 65 63 6f 72 64 2e 0a 20 20 2a   new record..  *
14a80 2f 0a 20 20 66 6f 72 28 70 52 65 63 3d 70 44 61  /.  for(pRec=pDa
14a90 74 61 30 3b 20 70 52 65 63 3c 3d 70 4c 61 73 74  ta0; pRec<=pLast
14aa0 3b 20 70 52 65 63 2b 2b 29 7b 0a 20 20 20 20 61  ; pRec++){.    a
14ab0 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
14ac0 64 28 70 52 65 63 29 20 29 3b 0a 20 20 20 20 69  d(pRec) );.    i
14ad0 66 28 20 7a 41 66 66 69 6e 69 74 79 20 29 7b 0a  f( zAffinity ){.
14ae0 20 20 20 20 20 20 61 70 70 6c 79 41 66 66 69 6e        applyAffin
14af0 69 74 79 28 70 52 65 63 2c 20 7a 41 66 66 69 6e  ity(pRec, zAffin
14b00 69 74 79 5b 70 52 65 63 2d 70 44 61 74 61 30 5d  ity[pRec-pData0]
14b10 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20  , encoding);.   
14b20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 65 63 2d   }.    if( pRec-
14b30 3e 66 6c 61 67 73 26 4d 45 4d 5f 5a 65 72 6f 20  >flags&MEM_Zero 
14b40 26 26 20 70 52 65 63 2d 3e 6e 3e 30 20 29 7b 0a  && pRec->n>0 ){.
14b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14b60 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28 70  eMemExpandBlob(p
14b70 52 65 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Rec);.    }.    
14b80 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71  serial_type = sq
14b90 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
14ba0 79 70 65 28 70 52 65 63 2c 20 66 69 6c 65 5f 66  ype(pRec, file_f
14bb0 6f 72 6d 61 74 29 3b 0a 20 20 20 20 6c 65 6e 20  ormat);.    len 
14bc0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
14bd0 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
14be0 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 6e 44 61  l_type);.    nDa
14bf0 74 61 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 6e  ta += len;.    n
14c00 48 64 72 20 2b 3d 20 73 71 6c 69 74 65 33 56 61  Hdr += sqlite3Va
14c10 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74  rintLen(serial_t
14c20 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52  ype);.    if( pR
14c30 65 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ec->flags & MEM_
14c40 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Zero ){.      /*
14c50 20 4f 6e 6c 79 20 70 75 72 65 20 7a 65 72 6f 2d   Only pure zero-
14c60 66 69 6c 6c 65 64 20 42 4c 4f 42 73 20 63 61 6e  filled BLOBs can
14c70 20 62 65 20 69 6e 70 75 74 20 74 6f 20 74 68 69   be input to thi
14c80 73 20 4f 70 63 6f 64 65 2e 0a 20 20 20 20 20 20  s Opcode..      
14c90 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 61 6c 6c  ** We do not all
14ca0 6f 77 20 62 6c 6f 62 73 20 77 69 74 68 20 61 20  ow blobs with a 
14cb0 70 72 65 66 69 78 20 61 6e 64 20 61 20 7a 65 72  prefix and a zer
14cc0 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 2a  o-filled tail. *
14cd0 2f 0a 20 20 20 20 20 20 6e 5a 65 72 6f 20 2b 3d  /.      nZero +=
14ce0 20 70 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   pRec->u.nZero;.
14cf0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65      }else if( le
14d00 6e 20 29 7b 0a 20 20 20 20 20 20 6e 5a 65 72 6f  n ){.      nZero
14d10 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
14d20 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 69 6e  .  /* Add the in
14d30 69 74 69 61 6c 20 68 65 61 64 65 72 20 76 61 72  itial header var
14d40 69 6e 74 20 61 6e 64 20 74 6f 74 61 6c 20 74 68  int and total th
14d50 65 20 73 69 7a 65 20 2a 2f 0a 20 20 6e 48 64 72  e size */.  nHdr
14d60 20 2b 3d 20 6e 56 61 72 69 6e 74 20 3d 20 73 71   += nVarint = sq
14d70 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 6e  lite3VarintLen(n
14d80 48 64 72 29 3b 0a 20 20 69 66 28 20 6e 56 61 72  Hdr);.  if( nVar
14d90 69 6e 74 3c 73 71 6c 69 74 65 33 56 61 72 69 6e  int<sqlite3Varin
14da0 74 4c 65 6e 28 6e 48 64 72 29 20 29 7b 0a 20 20  tLen(nHdr) ){.  
14db0 20 20 6e 48 64 72 2b 2b 3b 0a 20 20 7d 0a 20 20    nHdr++;.  }.  
14dc0 6e 42 79 74 65 20 3d 20 6e 48 64 72 2b 6e 44 61  nByte = nHdr+nDa
14dd0 74 61 2d 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20  ta-nZero;.  if( 
14de0 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69 6d 69 74  nByte>db->aLimit
14df0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
14e00 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74  NGTH] ){.    got
14e10 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a  o too_big;.  }..
14e20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
14e30 68 65 20 6f 75 74 70 75 74 20 72 65 67 69 73 74  he output regist
14e40 65 72 20 68 61 73 20 61 20 62 75 66 66 65 72 20  er has a buffer 
14e50 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
14e60 73 74 6f 72 65 20 0a 20 20 2a 2a 20 74 68 65 20  store .  ** the 
14e70 6e 65 77 20 72 65 63 6f 72 64 2e 20 54 68 65 20  new record. The 
14e80 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  output register 
14e90 28 70 4f 70 2d 3e 70 33 29 20 69 73 20 6e 6f 74  (pOp->p3) is not
14ea0 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 2a 2a   allowed to.  **
14eb0 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   be one of the i
14ec0 6e 70 75 74 20 72 65 67 69 73 74 65 72 73 20 28  nput registers (
14ed0 62 65 63 61 75 73 65 20 74 68 65 20 66 6f 6c 6c  because the foll
14ee0 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 0a 20 20  owing call to.  
14ef0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ** sqlite3VdbeMe
14f00 6d 47 72 6f 77 28 29 20 63 6f 75 6c 64 20 63 6c  mGrow() could cl
14f10 6f 62 62 65 72 20 74 68 65 20 76 61 6c 75 65 20  obber the value 
14f20 62 65 66 6f 72 65 20 69 74 20 69 73 20 75 73 65  before it is use
14f30 64 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  d)..  */.  if( s
14f40 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
14f50 77 28 70 4f 75 74 2c 20 28 69 6e 74 29 6e 42 79  w(pOut, (int)nBy
14f60 74 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 67 6f  te, 0) ){.    go
14f70 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20  to no_mem;.  }. 
14f80 20 7a 4e 65 77 52 65 63 6f 72 64 20 3d 20 28 75   zNewRecord = (u
14f90 38 20 2a 29 70 4f 75 74 2d 3e 7a 3b 0a 0a 20 20  8 *)pOut->z;..  
14fa0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 63  /* Write the rec
14fb0 6f 72 64 20 2a 2f 0a 20 20 69 20 3d 20 70 75 74  ord */.  i = put
14fc0 56 61 72 69 6e 74 33 32 28 7a 4e 65 77 52 65 63  Varint32(zNewRec
14fd0 6f 72 64 2c 20 6e 48 64 72 29 3b 0a 20 20 66 6f  ord, nHdr);.  fo
14fe0 72 28 70 52 65 63 3d 70 44 61 74 61 30 3b 20 70  r(pRec=pData0; p
14ff0 52 65 63 3c 3d 70 4c 61 73 74 3b 20 70 52 65 63  Rec<=pLast; pRec
15000 2b 2b 29 7b 0a 20 20 20 20 73 65 72 69 61 6c 5f  ++){.    serial_
15010 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64  type = sqlite3Vd
15020 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 52 65  beSerialType(pRe
15030 63 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b  c, file_format);
15040 0a 20 20 20 20 69 20 2b 3d 20 70 75 74 56 61 72  .    i += putVar
15050 69 6e 74 33 32 28 26 7a 4e 65 77 52 65 63 6f 72  int32(&zNewRecor
15060 64 5b 69 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  d[i], serial_typ
15070 65 29 3b 20 20 20 20 20 20 2f 2a 20 73 65 72 69  e);      /* seri
15080 61 6c 20 74 79 70 65 20 2a 2f 0a 20 20 7d 0a 20  al type */.  }. 
15090 20 66 6f 72 28 70 52 65 63 3d 70 44 61 74 61 30   for(pRec=pData0
150a0 3b 20 70 52 65 63 3c 3d 70 4c 61 73 74 3b 20 70  ; pRec<=pLast; p
150b0 52 65 63 2b 2b 29 7b 20 20 2f 2a 20 73 65 72 69  Rec++){  /* seri
150c0 61 6c 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 69  al data */.    i
150d0 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
150e0 65 72 69 61 6c 50 75 74 28 26 7a 4e 65 77 52 65  erialPut(&zNewRe
150f0 63 6f 72 64 5b 69 5d 2c 20 28 69 6e 74 29 28 6e  cord[i], (int)(n
15100 42 79 74 65 2d 69 29 2c 20 70 52 65 63 2c 66 69  Byte-i), pRec,fi
15110 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 7d 0a  le_format);.  }.
15120 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 42 79    assert( i==nBy
15130 74 65 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  te );..  assert(
15140 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f   pOp->p3>0 && pO
15150 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29  p->p3<=p->nMem )
15160 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 28 69  ;.  pOut->n = (i
15170 6e 74 29 6e 42 79 74 65 3b 0a 20 20 70 4f 75 74  nt)nByte;.  pOut
15180 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c  ->flags = MEM_Bl
15190 6f 62 20 7c 20 4d 45 4d 5f 44 79 6e 3b 0a 20 20  ob | MEM_Dyn;.  
151a0 70 4f 75 74 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a  pOut->xDel = 0;.
151b0 20 20 69 66 28 20 6e 5a 65 72 6f 20 29 7b 0a 20    if( nZero ){. 
151c0 20 20 20 70 4f 75 74 2d 3e 75 2e 6e 5a 65 72 6f     pOut->u.nZero
151d0 20 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4f   = nZero;.    pO
151e0 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ut->flags |= MEM
151f0 5f 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 70 4f 75  _Zero;.  }.  pOu
15200 74 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  t->enc = SQLITE_
15210 55 54 46 38 3b 20 20 2f 2a 20 49 6e 20 63 61 73  UTF8;  /* In cas
15220 65 20 74 68 65 20 62 6c 6f 62 20 69 73 20 65 76  e the blob is ev
15230 65 72 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  er converted to 
15240 74 65 78 74 20 2a 2f 0a 20 20 52 45 47 49 53 54  text */.  REGIST
15250 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
15260 2c 20 70 4f 75 74 29 3b 0a 20 20 55 50 44 41 54  , pOut);.  UPDAT
15270 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70  E_MAX_BLOBSIZE(p
15280 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  Out);.  break;.}
15290 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 75  ../* Opcode: Cou
152a0 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  nt P1 P2 * * *.*
152b0 2a 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 6e  *.** Store the n
152c0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
152d0 20 28 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c   (an integer val
152e0 75 65 29 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ue) in the table
152f0 20 6f 72 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 70   or index .** op
15300 65 6e 65 64 20 62 79 20 63 75 72 73 6f 72 20 50  ened by cursor P
15310 31 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  1 in register P2
15320 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
15330 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
15340 4e 54 0a 63 61 73 65 20 4f 50 5f 43 6f 75 6e 74  NT.case OP_Count
15350 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  : {         /* o
15360 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a  ut2-prerelease *
15370 2f 0a 20 20 69 36 34 20 6e 45 6e 74 72 79 3b 0a  /.  i64 nEntry;.
15380 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
15390 72 3b 0a 0a 20 20 70 43 72 73 72 20 3d 20 70 2d  r;..  pCrsr = p-
153a0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d  >apCsr[pOp->p1]-
153b0 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20  >pCursor;.  if( 
153c0 41 4c 57 41 59 53 28 70 43 72 73 72 29 20 29 7b  ALWAYS(pCrsr) ){
153d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
153e0 33 42 74 72 65 65 43 6f 75 6e 74 28 70 43 72 73  3BtreeCount(pCrs
153f0 72 2c 20 26 6e 45 6e 74 72 79 29 3b 0a 20 20 7d  r, &nEntry);.  }
15400 65 6c 73 65 7b 0a 20 20 20 20 6e 45 6e 74 72 79  else{.    nEntry
15410 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4f 75 74   = 0;.  }.  pOut
15420 2d 3e 75 2e 69 20 3d 20 6e 45 6e 74 72 79 3b 0a  ->u.i = nEntry;.
15430 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
15440 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 61  f../* Opcode: Sa
15450 76 65 70 6f 69 6e 74 20 50 31 20 2a 20 2a 20 50  vepoint P1 * * P
15460 34 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 2c 20  4 *.**.** Open, 
15470 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
15480 61 63 6b 20 74 68 65 20 73 61 76 65 70 6f 69 6e  ack the savepoin
15490 74 20 6e 61 6d 65 64 20 62 79 20 70 61 72 61 6d  t named by param
154a0 65 74 65 72 20 50 34 2c 20 64 65 70 65 6e 64 69  eter P4, dependi
154b0 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 76 61 6c  ng.** on the val
154c0 75 65 20 6f 66 20 50 31 2e 20 54 6f 20 6f 70 65  ue of P1. To ope
154d0 6e 20 61 20 6e 65 77 20 73 61 76 65 70 6f 69 6e  n a new savepoin
154e0 74 2c 20 50 31 3d 3d 30 2e 20 54 6f 20 72 65 6c  t, P1==0. To rel
154f0 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20 61 6e  ease (commit) an
15500 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 73 61 76  .** existing sav
15510 65 70 6f 69 6e 74 2c 20 50 31 3d 3d 31 2c 20 6f  epoint, P1==1, o
15520 72 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  r to rollback an
15530 20 65 78 69 73 74 69 6e 67 20 73 61 76 65 70 6f   existing savepo
15540 69 6e 74 20 50 31 3d 3d 32 2e 0a 2a 2f 0a 63 61  int P1==2..*/.ca
15550 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a  se OP_Savepoint:
15560 20 7b 0a 20 20 69 6e 74 20 70 31 3b 20 20 20 20   {.  int p1;    
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
15590 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
155a0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
155b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155c0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 61 76 65   /* Name of save
155d0 70 6f 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  point */.  int n
155e0 4e 61 6d 65 3b 0a 20 20 53 61 76 65 70 6f 69 6e  Name;.  Savepoin
155f0 74 20 2a 70 4e 65 77 3b 0a 20 20 53 61 76 65 70  t *pNew;.  Savep
15600 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
15610 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70  ;.  Savepoint *p
15620 54 6d 70 3b 0a 20 20 69 6e 74 20 69 53 61 76 65  Tmp;.  int iSave
15630 70 6f 69 6e 74 3b 0a 20 20 69 6e 74 20 69 69 3b  point;.  int ii;
15640 0a 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31  ..  p1 = pOp->p1
15650 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 70 4f 70 2d  ;.  zName = pOp-
15660 3e 70 34 2e 7a 3b 0a 0a 20 20 2f 2a 20 41 73 73  >p4.z;..  /* Ass
15670 65 72 74 20 74 68 61 74 20 74 68 65 20 70 31 20  ert that the p1 
15680 70 61 72 61 6d 65 74 65 72 20 69 73 20 76 61 6c  parameter is val
15690 69 64 2e 20 41 6c 73 6f 20 74 68 61 74 20 69 66  id. Also that if
156a0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65   there is no ope
156b0 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  n.  ** transacti
156c0 6f 6e 2c 20 74 68 65 6e 20 74 68 65 72 65 20 63  on, then there c
156d0 61 6e 6e 6f 74 20 62 65 20 61 6e 79 20 73 61 76  annot be any sav
156e0 65 70 6f 69 6e 74 73 2e 20 0a 20 20 2a 2f 0a 20  epoints. .  */. 
156f0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 53 61   assert( db->pSa
15700 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 64 62  vepoint==0 || db
15710 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20  ->autoCommit==0 
15720 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 3d  );.  assert( p1=
15730 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e  =SAVEPOINT_BEGIN
15740 7c 7c 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ||p1==SAVEPOINT_
15750 52 45 4c 45 41 53 45 7c 7c 70 31 3d 3d 53 41 56  RELEASE||p1==SAV
15760 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
15770 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
15780 3e 70 53 61 76 65 70 6f 69 6e 74 20 7c 7c 20 64  >pSavepoint || d
15790 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  b->isTransaction
157a0 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 3b 0a  Savepoint==0 );.
157b0 20 20 61 73 73 65 72 74 28 20 63 68 65 63 6b 53    assert( checkS
157c0 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28 64 62  avepointCount(db
157d0 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 31 3d 3d  ) );..  if( p1==
157e0 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20  SAVEPOINT_BEGIN 
157f0 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 77  ){.    if( db->w
15800 72 69 74 65 56 64 62 65 43 6e 74 3e 30 20 29 7b  riteVdbeCnt>0 ){
15810 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20  .      /* A new 
15820 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 6e 6f 74  savepoint cannot
15830 20 62 65 20 63 72 65 61 74 65 64 20 69 66 20 74   be created if t
15840 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
15850 77 72 69 74 65 20 0a 20 20 20 20 20 20 2a 2a 20  write .      ** 
15860 73 74 61 74 65 6d 65 6e 74 73 20 28 69 2e 65 2e  statements (i.e.
15870 20 6f 70 65 6e 20 72 65 61 64 2f 77 72 69 74 65   open read/write
15880 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
15890 62 20 68 61 6e 64 6c 65 73 29 2e 0a 20 20 20 20  b handles)..    
158a0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
158b0 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
158c0 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 63 61  zErrMsg, db, "ca
158d0 6e 6e 6f 74 20 6f 70 65 6e 20 73 61 76 65 70 6f  nnot open savepo
158e0 69 6e 74 20 2d 20 22 0a 20 20 20 20 20 20 20 20  int - ".        
158f0 22 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20  "SQL statements 
15900 69 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20  in progress");. 
15910 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15920 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65  _BUSY;.    }else
15930 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20  {.      nName = 
15940 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
15950 7a 4e 61 6d 65 29 3b 0a 0a 23 69 66 6e 64 65 66  zName);..#ifndef
15960 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
15970 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
15980 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  /* This call is 
15990 4f 6b 20 65 76 65 6e 20 69 66 20 74 68 69 73 20  Ok even if this 
159a0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74  savepoint is act
159b0 75 61 6c 6c 79 20 61 20 74 72 61 6e 73 61 63 74  ually a transact
159c0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 73 61 76  ion.      ** sav
159d0 65 70 6f 69 6e 74 20 28 61 6e 64 20 74 68 65 72  epoint (and ther
159e0 65 66 6f 72 65 20 73 68 6f 75 6c 64 20 6e 6f 74  efore should not
159f0 20 70 72 6f 6d 70 74 20 78 53 61 76 65 70 6f 69   prompt xSavepoi
15a00 6e 74 28 29 29 20 63 61 6c 6c 62 61 63 6b 73 2e  nt()) callbacks.
15a10 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
15a20 73 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  s is a transacti
15a30 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 62 65 69  on savepoint bei
15a40 6e 67 20 6f 70 65 6e 65 64 2c 20 69 74 20 69 73  ng opened, it is
15a50 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 20 20   guaranteed.    
15a60 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 64 62    ** that the db
15a70 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61  ->aVTrans[] arra
15a80 79 20 69 73 20 65 6d 70 74 79 2e 20 20 2a 2f 0a  y is empty.  */.
15a90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
15aa0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20  ->autoCommit==0 
15ab0 7c 7c 20 64 62 2d 3e 6e 56 54 72 61 6e 73 3d 3d  || db->nVTrans==
15ac0 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
15ad0 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
15ae0 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
15af0 4e 54 5f 42 45 47 49 4e 2c 0a 20 20 20 20 20 20  NT_BEGIN,.      
15b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b10 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53            db->nS
15b20 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61  tatement+db->nSa
15b30 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
15b40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15b50 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  K ) goto abort_d
15b60 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23 65 6e  ue_to_error;.#en
15b70 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72  dif..      /* Cr
15b80 65 61 74 65 20 61 20 6e 65 77 20 73 61 76 65 70  eate a new savep
15b90 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 2e 20  oint structure. 
15ba0 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  */.      pNew = 
15bb0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
15bc0 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 61  aw(db, sizeof(Sa
15bd0 76 65 70 6f 69 6e 74 29 2b 6e 4e 61 6d 65 2b 31  vepoint)+nName+1
15be0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
15bf0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  w ){.        pNe
15c00 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  w->zName = (char
15c10 20 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20   *)&pNew[1];.   
15c20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77       memcpy(pNew
15c30 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ->zName, zName, 
15c40 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 0a 20  nName+1);.    . 
15c50 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
15c60 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 74 72  re is no open tr
15c70 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
15c80 6d 61 72 6b 20 74 68 69 73 20 61 73 20 61 20 73  mark this as a s
15c90 70 65 63 69 61 6c 0a 20 20 20 20 20 20 20 20 2a  pecial.        *
15ca0 2a 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  * "transaction s
15cb0 61 76 65 70 6f 69 6e 74 22 2e 20 2a 2f 0a 20 20  avepoint". */.  
15cc0 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75        if( db->au
15cd0 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
15ce0 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
15cf0 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  mmit = 0;.      
15d00 20 20 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61      db->isTransa
15d10 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
15d20 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
15d30 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  e{.          db-
15d40 3e 6e 53 61 76 65 70 6f 69 6e 74 2b 2b 3b 0a 20  >nSavepoint++;. 
15d50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20         }.    .  
15d60 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68        /* Link th
15d70 65 20 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20  e new savepoint 
15d80 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
15d90 65 20 68 61 6e 64 6c 65 27 73 20 6c 69 73 74 2e  e handle's list.
15da0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
15db0 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 53  ->pNext = db->pS
15dc0 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20  avepoint;.      
15dd0 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74    db->pSavepoint
15de0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
15df0 20 70 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65 64   pNew->nDeferred
15e00 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65  Cons = db->nDefe
15e10 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20  rredCons;.      
15e20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
15e30 0a 20 20 20 20 69 53 61 76 65 70 6f 69 6e 74 20  .    iSavepoint 
15e40 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  = 0;..    /* Fin
15e50 64 20 74 68 65 20 6e 61 6d 65 64 20 73 61 76 65  d the named save
15e60 70 6f 69 6e 74 2e 20 49 66 20 74 68 65 72 65 20  point. If there 
15e70 69 73 20 6e 6f 20 73 75 63 68 20 73 61 76 65 70  is no such savep
15e80 6f 69 6e 74 2c 20 74 68 65 6e 20 61 6e 0a 20 20  oint, then an.  
15e90 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 69 73    ** an error is
15ea0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
15eb0 20 75 73 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66   user.  */.    f
15ec0 6f 72 28 0a 20 20 20 20 20 20 70 53 61 76 65 70  or(.      pSavep
15ed0 6f 69 6e 74 20 3d 20 64 62 2d 3e 70 53 61 76 65  oint = db->pSave
15ee0 70 6f 69 6e 74 3b 20 0a 20 20 20 20 20 20 70 53  point; .      pS
15ef0 61 76 65 70 6f 69 6e 74 20 26 26 20 73 71 6c 69  avepoint && sqli
15f00 74 65 33 53 74 72 49 43 6d 70 28 70 53 61 76 65  te3StrICmp(pSave
15f10 70 6f 69 6e 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  point->zName, zN
15f20 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 53 61 76  ame);.      pSav
15f30 65 70 6f 69 6e 74 20 3d 20 70 53 61 76 65 70 6f  epoint = pSavepo
15f40 69 6e 74 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29  int->pNext.    )
15f50 7b 0a 20 20 20 20 20 20 69 53 61 76 65 70 6f 69  {.      iSavepoi
15f60 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
15f70 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20  if( !pSavepoint 
15f80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15f90 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
15fa0 72 72 4d 73 67 2c 20 64 62 2c 20 22 6e 6f 20 73  rrMsg, db, "no s
15fb0 75 63 68 20 73 61 76 65 70 6f 69 6e 74 3a 20 25  uch savepoint: %
15fc0 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
15fd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
15fe0 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
15ff0 66 28 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65  f( db->writeVdbe
16000 43 6e 74 3e 30 20 26 26 20 70 31 3d 3d 53 41 56  Cnt>0 && p1==SAV
16010 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29  EPOINT_RELEASE )
16020 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
16030 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
16040 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74   release (commit
16050 29 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 66  ) a savepoint if
16060 20 74 68 65 72 65 20 61 72 65 20 0a 20 20 20 20   there are .    
16070 20 20 2a 2a 20 61 63 74 69 76 65 20 77 72 69 74    ** active writ
16080 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  e statements..  
16090 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
160a0 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
160b0 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 0a  ->zErrMsg, db, .
160c0 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
160d0 72 65 6c 65 61 73 65 20 73 61 76 65 70 6f 69 6e  release savepoin
160e0 74 20 2d 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  t - SQL statemen
160f0 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73 22 0a  ts in progress".
16100 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
16110 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
16120 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20  .    }else{..   
16130 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20     /* Determine 
16140 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
16150 68 69 73 20 69 73 20 61 20 74 72 61 6e 73 61 63  his is a transac
16160 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 2e 20  tion savepoint. 
16170 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 2a 2a 20  If so,.      ** 
16180 61 6e 64 20 74 68 69 73 20 69 73 20 61 20 52 45  and this is a RE
16190 4c 45 41 53 45 20 63 6f 6d 6d 61 6e 64 2c 20 74  LEASE command, t
161a0 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
161b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20  transaction .   
161c0 20 20 20 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74     ** is committ
161d0 65 64 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ed. .      */.  
161e0 20 20 20 20 69 6e 74 20 69 73 54 72 61 6e 73 61      int isTransa
161f0 63 74 69 6f 6e 20 3d 20 70 53 61 76 65 70 6f 69  ction = pSavepoi
16200 6e 74 2d 3e 70 4e 65 78 74 3d 3d 30 20 26 26 20  nt->pNext==0 && 
16210 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f  db->isTransactio
16220 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  nSavepoint;.    
16230 20 20 69 66 28 20 69 73 54 72 61 6e 73 61 63 74    if( isTransact
16240 69 6f 6e 20 26 26 20 70 31 3d 3d 53 41 56 45 50  ion && p1==SAVEP
16250 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a  OINT_RELEASE ){.
16260 20 20 20 20 20 20 20 20 69 66 28 20 28 72 63 20          if( (rc 
16270 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
16280 63 6b 46 6b 28 70 2c 20 31 29 29 21 3d 53 51 4c  ckFk(p, 1))!=SQL
16290 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
162a0 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65      goto vdbe_re
162b0 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
162c0 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
162d0 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
162e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
162f0 64 62 65 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49  dbeHalt(p)==SQLI
16300 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
16310 20 20 20 20 20 70 2d 3e 70 63 20 3d 20 70 63 3b       p->pc = pc;
16320 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  .          db->a
16330 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20  utoCommit = 0;. 
16340 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
16350 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
16360 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  Y;.          got
16370 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20  o vdbe_return;. 
16380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16390 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69   db->isTransacti
163a0 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  onSavepoint = 0;
163b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 2d  .        rc = p-
163c0 3e 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >rc;.      }else
163d0 7b 0a 20 20 20 20 20 20 20 20 69 53 61 76 65 70  {.        iSavep
163e0 6f 69 6e 74 20 3d 20 64 62 2d 3e 6e 53 61 76 65  oint = db->nSave
163f0 70 6f 69 6e 74 20 2d 20 69 53 61 76 65 70 6f 69  point - iSavepoi
16400 6e 74 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  nt - 1;.        
16410 69 66 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e  if( p1==SAVEPOIN
16420 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
16430 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30          for(ii=0
16440 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69  ; ii<db->nDb; ii
16450 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
16460 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
16470 70 41 6c 6c 43 75 72 73 6f 72 73 28 64 62 2d 3e  pAllCursors(db->
16480 61 44 62 5b 69 69 5d 2e 70 42 74 2c 20 53 51 4c  aDb[ii].pBt, SQL
16490 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20  ITE_ABORT);.    
164a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
164b0 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69  }.        for(ii
164c0 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20  =0; ii<db->nDb; 
164d0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ii++){.         
164e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
164f0 65 65 53 61 76 65 70 6f 69 6e 74 28 64 62 2d 3e  eeSavepoint(db->
16500 61 44 62 5b 69 69 5d 2e 70 42 74 2c 20 70 31 2c  aDb[ii].pBt, p1,
16510 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
16520 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
16530 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16540 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62           goto ab
16550 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
16560 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16580 69 66 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e  if( p1==SAVEPOIN
16590 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20 28 64  T_ROLLBACK && (d
165a0 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
165b0 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21 3d  InternChanges)!=
165c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
165d0 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
165e0 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
165f0 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  b);.          sq
16600 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
16610 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
16620 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
16630 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d  db->flags = (db-
16640 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f  >flags | SQLITE_
16650 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a  InternChanges);.
16660 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16670 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65  }.  .      /* Re
16680 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
16690 68 65 72 20 74 68 69 73 20 69 73 20 61 20 52 45  her this is a RE
166a0 4c 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43  LEASE or ROLLBAC
166b0 4b 2c 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 0a  K, destroy all .
166c0 20 20 20 20 20 20 2a 2a 20 73 61 76 65 70 6f 69        ** savepoi
166d0 6e 74 73 20 6e 65 73 74 65 64 20 69 6e 73 69 64  nts nested insid
166e0 65 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  e of the savepoi
166f0 6e 74 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65  nt being operate
16700 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 77  d on. */.      w
16710 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70  hile( db->pSavep
16720 6f 69 6e 74 21 3d 70 53 61 76 65 70 6f 69 6e 74  oint!=pSavepoint
16730 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 6d 70   ){.        pTmp
16740 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
16750 74 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 70  t;.        db->p
16760 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70  Savepoint = pTmp
16770 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
16780 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16790 62 2c 20 70 54 6d 70 29 3b 0a 20 20 20 20 20 20  b, pTmp);.      
167a0 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74    db->nSavepoint
167b0 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  --;.      }..   
167c0 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 61     /* If it is a
167d0 20 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 64   RELEASE, then d
167e0 65 73 74 72 6f 79 20 74 68 65 20 73 61 76 65 70  estroy the savep
167f0 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70 65 72 61  oint being opera
16800 74 65 64 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a  ted on .      **
16810 20 74 6f 6f 2e 20 49 66 20 69 74 20 69 73 20 61   too. If it is a
16820 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 2c 20 74 68   ROLLBACK TO, th
16830 65 6e 20 73 65 74 20 74 68 65 20 6e 75 6d 62 65  en set the numbe
16840 72 20 6f 66 20 64 65 66 65 72 72 65 64 20 0a 20  r of deferred . 
16850 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
16860 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 70 72  nt violations pr
16870 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
16880 61 62 61 73 65 20 74 6f 20 74 68 65 20 76 61 6c  abase to the val
16890 75 65 20 73 74 6f 72 65 64 0a 20 20 20 20 20 20  ue stored.      
168a0 2a 2a 20 77 68 65 6e 20 74 68 65 20 73 61 76 65  ** when the save
168b0 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74 65  point was create
168c0 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
168d0 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   p1==SAVEPOINT_R
168e0 45 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20  ELEASE ){.      
168f0 20 20 61 73 73 65 72 74 28 20 70 53 61 76 65 70    assert( pSavep
16900 6f 69 6e 74 3d 3d 64 62 2d 3e 70 53 61 76 65 70  oint==db->pSavep
16910 6f 69 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20  oint );.        
16920 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
16930 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65   pSavepoint->pNe
16940 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  xt;.        sqli
16950 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
16960 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
16970 20 20 20 69 66 28 20 21 69 73 54 72 61 6e 73 61     if( !isTransa
16980 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
16990 20 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e     db->nSavepoin
169a0 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t--;.        }. 
169b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
169c0 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
169d0 64 43 6f 6e 73 20 3d 20 70 53 61 76 65 70 6f 69  dCons = pSavepoi
169e0 6e 74 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  nt->nDeferredCon
169f0 73 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  s;.      }..    
16a00 20 20 69 66 28 20 21 69 73 54 72 61 6e 73 61 63    if( !isTransac
16a10 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  tion ){.        
16a20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
16a30 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 70 31  Savepoint(db, p1
16a40 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
16a50 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
16a60 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
16a70 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
16a80 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
16a90 7d 0a 20 20 7d 0a 0a 20 20 62 72 65 61 6b 3b 0a  }.  }..  break;.
16aa0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 75  }../* Opcode: Au
16ab0 74 6f 43 6f 6d 6d 69 74 20 50 31 20 50 32 20 2a  toCommit P1 P2 *
16ac0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74   * *.**.** Set t
16ad0 68 65 20 64 61 74 61 62 61 73 65 20 61 75 74 6f  he database auto
16ae0 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 74 6f 20  -commit flag to 
16af0 50 31 20 28 31 20 6f 72 20 30 29 2e 20 49 66 20  P1 (1 or 0). If 
16b00 50 32 20 69 73 20 74 72 75 65 2c 20 72 6f 6c 6c  P2 is true, roll
16b10 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 75 72  .** back any cur
16b20 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 62 74  rently active bt
16b30 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ree transactions
16b40 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  . If there are a
16b50 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 56 4d 73  ny active.** VMs
16b60 20 28 61 70 61 72 74 20 66 72 6f 6d 20 74 68 69   (apart from thi
16b70 73 20 6f 6e 65 29 2c 20 74 68 65 6e 20 61 20 52  s one), then a R
16b80 4f 4c 4c 42 41 43 4b 20 66 61 69 6c 73 2e 20 20  OLLBACK fails.  
16b90 41 20 43 4f 4d 4d 49 54 20 66 61 69 6c 73 20 69  A COMMIT fails i
16ba0 66 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 61  f.** there are a
16bb0 63 74 69 76 65 20 77 72 69 74 69 6e 67 20 56 4d  ctive writing VM
16bc0 73 20 6f 72 20 61 63 74 69 76 65 20 56 4d 73 20  s or active VMs 
16bd0 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20  that use shared 
16be0 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  cache..**.** Thi
16bf0 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 61  s instruction ca
16c00 75 73 65 73 20 74 68 65 20 56 4d 20 74 6f 20 68  uses the VM to h
16c10 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  alt..*/.case OP_
16c20 41 75 74 6f 43 6f 6d 6d 69 74 3a 20 7b 0a 20 20  AutoCommit: {.  
16c30 69 6e 74 20 64 65 73 69 72 65 64 41 75 74 6f 43  int desiredAutoC
16c40 6f 6d 6d 69 74 3b 0a 20 20 69 6e 74 20 69 52 6f  ommit;.  int iRo
16c50 6c 6c 62 61 63 6b 3b 0a 20 20 69 6e 74 20 74 75  llback;.  int tu
16c60 72 6e 4f 6e 41 43 3b 0a 0a 20 20 64 65 73 69 72  rnOnAC;..  desir
16c70 65 64 41 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 70  edAutoCommit = p
16c80 4f 70 2d 3e 70 31 3b 0a 20 20 69 52 6f 6c 6c 62  Op->p1;.  iRollb
16c90 61 63 6b 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  ack = pOp->p2;. 
16ca0 20 74 75 72 6e 4f 6e 41 43 20 3d 20 64 65 73 69   turnOnAC = desi
16cb0 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 20 26 26  redAutoCommit &&
16cc0 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   !db->autoCommit
16cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65 73 69  ;.  assert( desi
16ce0 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31  redAutoCommit==1
16cf0 20 7c 7c 20 64 65 73 69 72 65 64 41 75 74 6f 43   || desiredAutoC
16d00 6f 6d 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61 73  ommit==0 );.  as
16d10 73 65 72 74 28 20 64 65 73 69 72 65 64 41 75 74  sert( desiredAut
16d20 6f 43 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 69 52  oCommit==1 || iR
16d30 6f 6c 6c 62 61 63 6b 3d 3d 30 20 29 3b 0a 20 20  ollback==0 );.  
16d40 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63 74 69  assert( db->acti
16d50 76 65 56 64 62 65 43 6e 74 3e 30 20 29 3b 20 20  veVdbeCnt>0 );  
16d60 2f 2a 20 41 74 20 6c 65 61 73 74 20 74 68 69 73  /* At least this
16d70 20 6f 6e 65 20 56 4d 20 69 73 20 61 63 74 69 76   one VM is activ
16d80 65 20 2a 2f 0a 0a 23 69 66 20 30 0a 20 20 69 66  e */..#if 0.  if
16d90 28 20 74 75 72 6e 4f 6e 41 43 20 26 26 20 69 52  ( turnOnAC && iR
16da0 6f 6c 6c 62 61 63 6b 20 26 26 20 64 62 2d 3e 61  ollback && db->a
16db0 63 74 69 76 65 56 64 62 65 43 6e 74 3e 31 20 29  ctiveVdbeCnt>1 )
16dc0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
16dd0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6d 70   instruction imp
16de0 6c 65 6d 65 6e 74 73 20 61 20 52 4f 4c 4c 42 41  lements a ROLLBA
16df0 43 4b 20 61 6e 64 20 6f 74 68 65 72 20 56 4d 73  CK and other VMs
16e00 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 74 69 6c   are.    ** stil
16e10 6c 20 72 75 6e 6e 69 6e 67 2c 20 61 6e 64 20 61  l running, and a
16e20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
16e30 61 63 74 69 76 65 2c 20 72 65 74 75 72 6e 20 61  active, return a
16e40 6e 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74 69  n error indicati
16e50 6e 67 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  ng.    ** that t
16e60 68 65 20 6f 74 68 65 72 20 56 4d 73 20 6d 75 73  he other VMs mus
16e70 74 20 63 6f 6d 70 6c 65 74 65 20 66 69 72 73 74  t complete first
16e80 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  . .    */.    sq
16e90 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
16ea0 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
16eb0 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b  "cannot rollback
16ec0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2d 20 22   transaction - "
16ed0 0a 20 20 20 20 20 20 20 20 22 53 51 4c 20 73 74  .        "SQL st
16ee0 61 74 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67  atements in prog
16ef0 72 65 73 73 22 29 3b 0a 20 20 20 20 72 63 20 3d  ress");.    rc =
16f00 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
16f10 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 69  }else.#endif.  i
16f20 66 28 20 74 75 72 6e 4f 6e 41 43 20 26 26 20 21  f( turnOnAC && !
16f30 69 52 6f 6c 6c 62 61 63 6b 20 26 26 20 64 62 2d  iRollback && db-
16f40 3e 77 72 69 74 65 56 64 62 65 43 6e 74 3e 30 20  >writeVdbeCnt>0 
16f50 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ){.    /* If thi
16f60 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6d  s instruction im
16f70 70 6c 65 6d 65 6e 74 73 20 61 20 43 4f 4d 4d 49  plements a COMMI
16f80 54 20 61 6e 64 20 6f 74 68 65 72 20 56 4d 73 20  T and other VMs 
16f90 61 72 65 20 77 72 69 74 69 6e 67 0a 20 20 20 20  are writing.    
16fa0 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  ** return an err
16fb0 6f 72 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  or indicating th
16fc0 61 74 20 74 68 65 20 6f 74 68 65 72 20 56 4d 73  at the other VMs
16fd0 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 66   must complete f
16fe0 69 72 73 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  irst. .    */.  
16ff0 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
17000 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
17010 64 62 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d  db, "cannot comm
17020 69 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2d  it transaction -
17030 20 22 0a 20 20 20 20 20 20 20 20 22 53 51 4c 20   ".        "SQL 
17040 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70 72  statements in pr
17050 6f 67 72 65 73 73 22 29 3b 0a 20 20 20 20 72 63  ogress");.    rc
17060 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
17070 20 20 7d 65 6c 73 65 20 69 66 28 20 64 65 73 69    }else if( desi
17080 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 21 3d 64  redAutoCommit!=d
17090 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
170a0 0a 20 20 20 20 69 66 28 20 69 52 6f 6c 6c 62 61  .    if( iRollba
170b0 63 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ck ){.      asse
170c0 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f 43  rt( desiredAutoC
170d0 6f 6d 6d 69 74 3d 3d 31 20 29 3b 0a 20 20 20 20  ommit==1 );.    
170e0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
170f0 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
17100 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
17110 0a 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43  .      db->autoC
17120 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d  ommit = 1;.    }
17130 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 73  else if( (rc = s
17140 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
17150 6b 28 70 2c 20 31 29 29 21 3d 53 51 4c 49 54 45  k(p, 1))!=SQLITE
17160 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
17170 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20  o vdbe_return;. 
17180 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17190 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
171a0 20 28 75 38 29 64 65 73 69 72 65 64 41 75 74 6f   (u8)desiredAuto
171b0 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20 20 69 66  Commit;.      if
171c0 28 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  ( sqlite3VdbeHal
171d0 74 28 70 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53  t(p)==SQLITE_BUS
171e0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  Y ){.        p->
171f0 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 20  pc = pc;.       
17200 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
17210 3d 20 28 75 38 29 28 31 2d 64 65 73 69 72 65 64  = (u8)(1-desired
17220 41 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a 20 20 20  AutoCommit);.   
17230 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 20       p->rc = rc 
17240 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
17250 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62 65         goto vdbe
17260 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d  _return;.      }
17270 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
17280 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  t( db->nStatemen
17290 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  t==0 );.    sqli
172a0 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
172b0 74 73 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20  ts(db);.    if( 
172c0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
172d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
172e0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
172f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
17300 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
17310 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 76      }.    goto v
17320 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 7d 65  dbe_return;.  }e
17330 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
17340 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
17350 72 72 4d 73 67 2c 20 64 62 2c 0a 20 20 20 20 20  rrMsg, db,.     
17360 20 20 20 28 21 64 65 73 69 72 65 64 41 75 74 6f     (!desiredAuto
17370 43 6f 6d 6d 69 74 29 3f 22 63 61 6e 6e 6f 74 20  Commit)?"cannot 
17380 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
17390 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 74 72 61  ion within a tra
173a0 6e 73 61 63 74 69 6f 6e 22 3a 28 0a 20 20 20 20  nsaction":(.    
173b0 20 20 20 20 28 69 52 6f 6c 6c 62 61 63 6b 29 3f      (iRollback)?
173c0 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b  "cannot rollback
173d0 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f   - no transactio
173e0 6e 20 69 73 20 61 63 74 69 76 65 22 3a 0a 20 20  n is active":.  
173f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17400 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20   "cannot commit 
17410 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e  - no transaction
17420 20 69 73 20 61 63 74 69 76 65 22 29 29 3b 0a 20   is active"));. 
17430 20 20 20 20 20 20 20 20 0a 20 20 20 20 72 63 20          .    rc 
17440 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
17450 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
17460 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 72 61 6e 73  /* Opcode: Trans
17470 61 63 74 69 6f 6e 20 50 31 20 50 32 20 2a 20 2a  action P1 P2 * *
17480 20 2a 0a 2a 2a 0a 2a 2a 20 42 65 67 69 6e 20 61   *.**.** Begin a
17490 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54   transaction.  T
174a0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 65  he transaction e
174b0 6e 64 73 20 77 68 65 6e 20 61 20 43 6f 6d 6d 69  nds when a Commi
174c0 74 20 6f 72 20 52 6f 6c 6c 62 61 63 6b 0a 2a 2a  t or Rollback.**
174d0 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75   opcode is encou
174e0 6e 74 65 72 65 64 2e 20 20 44 65 70 65 6e 64 69  ntered.  Dependi
174f0 6e 67 20 6f 6e 20 74 68 65 20 4f 4e 20 43 4f 4e  ng on the ON CON
17500 46 4c 49 43 54 20 73 65 74 74 69 6e 67 2c 20 74  FLICT setting, t
17510 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  he.** transactio
17520 6e 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20  n might also be 
17530 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 66 20 61  rolled back if a
17540 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
17550 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 31  ntered..**.** P1
17560 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
17570 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17580 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 68 65 20  le on which the 
17590 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a  transaction is.*
175a0 2a 20 73 74 61 72 74 65 64 2e 20 20 49 6e 64 65  * started.  Inde
175b0 78 20 30 20 69 73 20 74 68 65 20 6d 61 69 6e 20  x 0 is the main 
175c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
175d0 64 20 69 6e 64 65 78 20 31 20 69 73 20 74 68 65  d index 1 is the
175e0 0a 2a 2a 20 66 69 6c 65 20 75 73 65 64 20 66 6f  .** file used fo
175f0 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  r temporary tabl
17600 65 73 2e 20 20 49 6e 64 69 63 65 73 20 6f 66 20  es.  Indices of 
17610 32 20 6f 72 20 6d 6f 72 65 20 61 72 65 20 75 73  2 or more are us
17620 65 64 20 66 6f 72 0a 2a 2a 20 61 74 74 61 63 68  ed for.** attach
17630 65 64 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a  ed databases..**
17640 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 6e 6f 6e  .** If P2 is non
17650 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 77 72  -zero, then a wr
17660 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
17670 69 73 20 73 74 61 72 74 65 64 2e 20 20 41 20 52  is started.  A R
17680 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 0a  ESERVED lock is.
17690 2a 2a 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  ** obtained on t
176a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
176b0 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72   when a write-tr
176c0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
176d0 72 74 65 64 2e 20 20 4e 6f 0a 2a 2a 20 6f 74 68  rted.  No.** oth
176e0 65 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 73  er process can s
176f0 74 61 72 74 20 61 6e 6f 74 68 65 72 20 77 72 69  tart another wri
17700 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  te transaction w
17710 68 69 6c 65 20 74 68 69 73 20 74 72 61 6e 73 61  hile this transa
17720 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e 64 65  ction is.** unde
17730 72 77 61 79 2e 20 20 53 74 61 72 74 69 6e 67 20  rway.  Starting 
17740 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
17750 69 6f 6e 20 61 6c 73 6f 20 63 72 65 61 74 65 73  ion also creates
17760 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
17770 6e 61 6c 2e 20 41 0a 2a 2a 20 77 72 69 74 65 20  nal. A.** write 
17780 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
17790 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
177a0 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 63  re any changes c
177b0 61 6e 20 62 65 20 6d 61 64 65 20 74 6f 20 74 68  an be made to th
177c0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20  e.** database.  
177d0 49 66 20 50 32 20 69 73 20 67 72 65 61 74 65 72  If P2 is greater
177e0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
177f0 6f 20 32 20 74 68 65 6e 20 61 6e 20 45 58 43 4c  o 2 then an EXCL
17800 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 0a 2a 2a  USIVE lock is.**
17810 20 61 6c 73 6f 20 6f 62 74 61 69 6e 65 64 20 6f   also obtained o
17820 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
17830 2a 20 49 66 20 61 20 77 72 69 74 65 2d 74 72 61  * If a write-tra
17840 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
17850 74 65 64 20 61 6e 64 20 74 68 65 20 56 64 62 65  ted and the Vdbe
17860 2e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  .usesStmtJournal
17870 20 66 6c 61 67 20 69 73 0a 2a 2a 20 74 72 75 65   flag is.** true
17880 20 28 74 68 69 73 20 66 6c 61 67 20 69 73 20 73   (this flag is s
17890 65 74 20 69 66 20 74 68 65 20 56 64 62 65 20 6d  et if the Vdbe m
178a0 61 79 20 6d 6f 64 69 66 79 20 6d 6f 72 65 20 74  ay modify more t
178b0 68 61 6e 20 6f 6e 65 20 72 6f 77 20 61 6e 64 20  han one row and 
178c0 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20  may.** throw an 
178d0 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f 6e 29  ABORT exception)
178e0 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  , a statement tr
178f0 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 61 6c  ansaction may al
17900 73 6f 20 62 65 20 6f 70 65 6e 65 64 2e 0a 2a 2a  so be opened..**
17910 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c   More specifical
17920 6c 79 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ly, a statement 
17930 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
17940 70 65 6e 65 64 20 69 66 66 20 74 68 65 20 64 61  pened iff the da
17950 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
17960 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
17970 79 20 6e 6f 74 20 69 6e 20 61 75 74 6f 63 6f 6d  y not in autocom
17980 6d 69 74 20 6d 6f 64 65 2c 20 6f 72 20 69 66 20  mit mode, or if 
17990 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 0a  there are other.
179a0 2a 2a 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  ** active statem
179b0 65 6e 74 73 2e 20 41 20 73 74 61 74 65 6d 65 6e  ents. A statemen
179c0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c  t transaction al
179d0 6c 6f 77 73 20 74 68 65 20 63 68 61 6e 67 65 73  lows the changes
179e0 20 6d 61 64 65 20 62 79 20 74 68 69 73 0a 2a 2a   made by this.**
179f0 20 56 44 42 45 20 74 6f 20 62 65 20 72 6f 6c 6c   VDBE to be roll
17a00 65 64 20 62 61 63 6b 20 61 66 74 65 72 20 61 6e  ed back after an
17a10 20 65 72 72 6f 72 20 77 69 74 68 6f 75 74 20 68   error without h
17a20 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 62 61  aving to roll ba
17a30 63 6b 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65  ck the.** entire
17a40 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
17a50 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 65 6e 63   no error is enc
17a60 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 20 73 74  ountered, the st
17a70 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
17a80 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 61 75 74 6f  ion.** will auto
17a90 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69 74  matically commit
17aa0 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 68   when the VDBE h
17ab0 61 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  alts..**.** If P
17ac0 32 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  2 is zero, then 
17ad0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f  a read-lock is o
17ae0 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64  btained on the d
17af0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
17b00 0a 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63  .case OP_Transac
17b10 74 69 6f 6e 3a 20 7b 0a 20 20 42 74 72 65 65 20  tion: {.  Btree 
17b20 2a 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pBt;..  assert(
17b30 20 70 2d 3e 6e 6f 49 4f 3d 3d 30 20 29 3b 0a 20   p->noIO==0 );. 
17b40 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64   assert( p->read
17b50 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e  Only==0 || pOp->
17b60 70 32 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  p2==0 );.  asser
17b70 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
17b80 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62   pOp->p1<db->nDb
17b90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
17ba0 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28  ->btreeMask & ((
17bb0 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70  (yDbMask)1)<<pOp
17bc0 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a 20 20 70  ->p1))!=0 );.  p
17bd0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70  Bt = db->aDb[pOp
17be0 2d 3e 70 31 5d 2e 70 42 74 3b 0a 0a 20 20 69 66  ->p1].pBt;..  if
17bf0 28 20 70 42 74 20 29 7b 0a 20 20 20 20 72 63 20  ( pBt ){.    rc 
17c00 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
17c10 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 70 4f  ginTrans(pBt, pO
17c20 70 2d 3e 70 32 29 3b 0a 20 20 20 20 69 66 28 20  p->p2);.    if( 
17c30 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
17c40 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 63 20 3d  ){.      p->pc =
17c50 20 70 63 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63   pc;.      p->rc
17c60 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42   = rc = SQLITE_B
17c70 55 53 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  USY;.      goto 
17c80 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20  vdbe_return;.   
17c90 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
17ca0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17cb0 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
17cc0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  _to_error;.    }
17cd0 0a 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  ..    if( pOp->p
17ce0 32 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  2 && p->usesStmt
17cf0 4a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 20 26 26  Journal .     &&
17d00 20 28 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   (db->autoCommit
17d10 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 63 74 69 76  ==0 || db->activ
17d20 65 56 64 62 65 43 6e 74 3e 31 29 20 0a 20 20 20  eVdbeCnt>1) .   
17d30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
17d40 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
17d50 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 3b 0a  InTrans(pBt) );.
17d60 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 53 74        if( p->iSt
17d70 61 74 65 6d 65 6e 74 3d 3d 30 20 29 7b 0a 20 20  atement==0 ){.  
17d80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
17d90 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 3d 30 20  ->nStatement>=0 
17da0 26 26 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  && db->nSavepoin
17db0 74 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t>=0 );.        
17dc0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 2b  db->nStatement++
17dd0 3b 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 53  ; .        p->iS
17de0 74 61 74 65 6d 65 6e 74 20 3d 20 64 62 2d 3e 6e  tatement = db->n
17df0 53 61 76 65 70 6f 69 6e 74 20 2b 20 64 62 2d 3e  Savepoint + db->
17e00 6e 53 74 61 74 65 6d 65 6e 74 3b 0a 20 20 20 20  nStatement;.    
17e10 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20    }..      rc = 
17e20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
17e30 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
17e40 4e 54 5f 42 45 47 49 4e 2c 20 70 2d 3e 69 53 74  NT_BEGIN, p->iSt
17e50 61 74 65 6d 65 6e 74 2d 31 29 3b 0a 20 20 20 20  atement-1);.    
17e60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17e70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
17e80 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
17e90 42 65 67 69 6e 53 74 6d 74 28 70 42 74 2c 20 70  BeginStmt(pBt, p
17ea0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  ->iStatement);. 
17eb0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
17ec0 20 53 74 6f 72 65 20 74 68 65 20 63 75 72 72 65   Store the curre
17ed0 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  nt value of the 
17ee0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73  database handles
17ef0 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
17f00 61 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  aint.      ** co
17f10 75 6e 74 65 72 2e 20 49 66 20 74 68 65 20 73 74  unter. If the st
17f20 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
17f30 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ion needs to be 
17f40 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 0a 20 20 20  rolled back,.   
17f50 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
17f60 6f 66 20 74 68 69 73 20 63 6f 75 6e 74 65 72 20  of this counter 
17f70 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
17f80 6f 72 65 64 20 74 6f 6f 2e 20 20 2a 2f 0a 20 20  ored too.  */.  
17f90 20 20 20 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43      p->nStmtDefC
17fa0 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72  ons = db->nDefer
17fb0 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20  redCons;.    }. 
17fc0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
17fd0 2a 20 4f 70 63 6f 64 65 3a 20 52 65 61 64 43 6f  * Opcode: ReadCo
17fe0 6f 6b 69 65 20 50 31 20 50 32 20 50 33 20 2a 20  okie P1 P2 P3 * 
17ff0 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 63 6f 6f  *.**.** Read coo
18000 6b 69 65 20 6e 75 6d 62 65 72 20 50 33 20 66 72  kie number P3 fr
18010 6f 6d 20 64 61 74 61 62 61 73 65 20 50 31 20 61  om database P1 a
18020 6e 64 20 77 72 69 74 65 20 69 74 20 69 6e 74 6f  nd write it into
18030 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
18040 20 50 33 3d 3d 31 20 69 73 20 74 68 65 20 73 63   P3==1 is the sc
18050 68 65 6d 61 20 76 65 72 73 69 6f 6e 2e 20 20 50  hema version.  P
18060 33 3d 3d 32 20 69 73 20 74 68 65 20 64 61 74 61  3==2 is the data
18070 62 61 73 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  base format..** 
18080 50 33 3d 3d 33 20 69 73 20 74 68 65 20 72 65 63  P3==3 is the rec
18090 6f 6d 6d 65 6e 64 65 64 20 70 61 67 65 72 20 63  ommended pager c
180a0 61 63 68 65 20 73 69 7a 65 2c 20 61 6e 64 20 73  ache size, and s
180b0 6f 20 66 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20  o forth.  P1==0 
180c0 69 73 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64  is.** the main d
180d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
180e0 20 50 31 3d 3d 31 20 69 73 20 74 68 65 20 64 61   P1==1 is the da
180f0 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
18100 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d   to store.** tem
18110 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 2a  porary tables..*
18120 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
18130 62 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  be a read-lock o
18140 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
18150 65 69 74 68 65 72 20 61 20 74 72 61 6e 73 61 63  either a transac
18160 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20  tion.** must be 
18170 73 74 61 72 74 65 64 20 6f 72 20 74 68 65 72 65  started or there
18180 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
18190 20 63 75 72 73 6f 72 29 20 62 65 66 6f 72 65 0a   cursor) before.
181a0 2a 2a 20 65 78 65 63 75 74 69 6e 67 20 74 68 69  ** executing thi
181b0 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  s instruction..*
181c0 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61 64 43 6f  /.case OP_ReadCo
181d0 6f 6b 69 65 3a 20 7b 20 20 20 20 20 20 20 20 20  okie: {         
181e0 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72        /* out2-pr
181f0 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e  erelease */.  in
18200 74 20 69 4d 65 74 61 3b 0a 20 20 69 6e 74 20 69  t iMeta;.  int i
18210 44 62 3b 0a 20 20 69 6e 74 20 69 43 6f 6f 6b 69  Db;.  int iCooki
18220 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  e;..  assert( p-
18230 3e 6e 6f 49 4f 3d 3d 30 20 29 3b 0a 20 20 69 44  >noIO==0 );.  iD
18240 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69  b = pOp->p1;.  i
18250 43 6f 6f 6b 69 65 20 3d 20 70 4f 70 2d 3e 70 33  Cookie = pOp->p3
18260 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
18270 3e 70 33 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52  >p3<SQLITE_N_BTR
18280 45 45 5f 4d 45 54 41 20 29 3b 0a 20 20 61 73 73  EE_META );.  ass
18290 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
182a0 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
182b0 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
182c0 69 44 62 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 20  iDb].pBt!=0 );. 
182d0 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74 72   assert( (p->btr
182e0 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44 62 4d  eeMask & (((yDbM
182f0 61 73 6b 29 31 29 3c 3c 69 44 62 29 29 21 3d 30  ask)1)<<iDb))!=0
18300 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74   );..  sqlite3Bt
18310 72 65 65 47 65 74 4d 65 74 61 28 64 62 2d 3e 61  reeGetMeta(db->a
18320 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20 69 43 6f  Db[iDb].pBt, iCo
18330 6f 6b 69 65 2c 20 28 75 33 32 20 2a 29 26 69 4d  okie, (u32 *)&iM
18340 65 74 61 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e  eta);.  pOut->u.
18350 69 20 3d 20 69 4d 65 74 61 3b 0a 20 20 62 72 65  i = iMeta;.  bre
18360 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
18370 3a 20 53 65 74 43 6f 6f 6b 69 65 20 50 31 20 50  : SetCookie P1 P
18380 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57  2 P3 * *.**.** W
18390 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
183a0 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20   of register P3 
183b0 28 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20  (interpreted as 
183c0 61 6e 20 69 6e 74 65 67 65 72 29 0a 2a 2a 20 69  an integer).** i
183d0 6e 74 6f 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65  nto cookie numbe
183e0 72 20 50 32 20 6f 66 20 64 61 74 61 62 61 73 65  r P2 of database
183f0 20 50 31 2e 20 20 50 32 3d 3d 31 20 69 73 20 74   P1.  P2==1 is t
18400 68 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f  he schema versio
18410 6e 2e 20 20 0a 2a 2a 20 50 32 3d 3d 32 20 69 73  n.  .** P2==2 is
18420 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f   the database fo
18430 72 6d 61 74 2e 20 50 32 3d 3d 33 20 69 73 20 74  rmat. P2==3 is t
18440 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70  he recommended p
18450 61 67 65 72 20 63 61 63 68 65 20 0a 2a 2a 20 73  ager cache .** s
18460 69 7a 65 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ize, and so fort
18470 68 2e 20 20 50 31 3d 3d 30 20 69 73 20 74 68 65  h.  P1==0 is the
18480 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
18490 69 6c 65 20 61 6e 64 20 50 31 3d 3d 31 20 69 73  ile and P1==1 is
184a0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
184b0 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20 73  e file used to s
184c0 74 6f 72 65 20 74 65 6d 70 6f 72 61 72 79 20 74  tore temporary t
184d0 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  ables..**.** A t
184e0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
184f0 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
18500 65 20 65 78 65 63 75 74 69 6e 67 20 74 68 69 73  e executing this
18510 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65   opcode..*/.case
18520 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 3a 20 7b   OP_SetCookie: {
18530 20 20 20 20 20 20 20 2f 2a 20 69 6e 33 20 2a 2f         /* in3 */
18540 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 61 73  .  Db *pDb;.  as
18550 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 53 51  sert( pOp->p2<SQ
18560 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54  LITE_N_BTREE_MET
18570 41 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  A );.  assert( p
18580 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
18590 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  ->p1<db->nDb );.
185a0 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74    assert( (p->bt
185b0 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44 62  reeMask & (((yDb
185c0 4d 61 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e 70 31  Mask)1)<<pOp->p1
185d0 29 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))!=0 );.  asser
185e0 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  t( p->readOnly==
185f0 30 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62  0 );.  pDb = &db
18600 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  ->aDb[pOp->p1];.
18610 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
18620 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
18630 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
18640 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 70 4f  MutexHeld(db, pO
18650 70 2d 3e 70 31 2c 20 30 29 20 29 3b 0a 20 20 70  p->p1, 0) );.  p
18660 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In3 = &aMem[pOp-
18670 3e 70 33 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56  >p3];.  sqlite3V
18680 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79  dbeMemIntegerify
18690 28 70 49 6e 33 29 3b 0a 20 20 2f 2a 20 53 65 65  (pIn3);.  /* See
186a0 20 6e 6f 74 65 20 61 62 6f 75 74 20 69 6e 64 65   note about inde
186b0 78 20 73 68 69 66 74 69 6e 67 20 6f 6e 20 4f 50  x shifting on OP
186c0 5f 52 65 61 64 43 6f 6f 6b 69 65 20 2a 2f 0a 20  _ReadCookie */. 
186d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
186e0 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 44 62  eeUpdateMeta(pDb
186f0 2d 3e 70 42 74 2c 20 70 4f 70 2d 3e 70 32 2c 20  ->pBt, pOp->p2, 
18700 28 69 6e 74 29 70 49 6e 33 2d 3e 75 2e 69 29 3b  (int)pIn3->u.i);
18710 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d  .  if( pOp->p2==
18720 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52  BTREE_SCHEMA_VER
18730 53 49 4f 4e 20 29 7b 0a 20 20 20 20 2f 2a 20 57  SION ){.    /* W
18740 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63  hen the schema c
18750 6f 6f 6b 69 65 20 63 68 61 6e 67 65 73 2c 20 72  ookie changes, r
18760 65 63 6f 72 64 20 74 68 65 20 6e 65 77 20 63 6f  ecord the new co
18770 6f 6b 69 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20  okie internally 
18780 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 70 53 63 68  */.    pDb->pSch
18790 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
187a0 69 65 20 3d 20 28 69 6e 74 29 70 49 6e 33 2d 3e  ie = (int)pIn3->
187b0 75 2e 69 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  u.i;.    db->fla
187c0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
187d0 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 65  ernChanges;.  }e
187e0 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d  lse if( pOp->p2=
187f0 3d 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d  =BTREE_FILE_FORM
18800 41 54 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63  AT ){.    /* Rec
18810 6f 72 64 20 63 68 61 6e 67 65 73 20 69 6e 20 74  ord changes in t
18820 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 2a  he file format *
18830 2f 0a 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65  /.    pDb->pSche
18840 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20  ma->file_format 
18850 3d 20 28 75 38 29 70 49 6e 33 2d 3e 75 2e 69 3b  = (u8)pIn3->u.i;
18860 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e  .  }.  if( pOp->
18870 70 31 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20  p1==1 ){.    /* 
18880 49 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  Invalidate all p
18890 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
188a0 74 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ts whenever the 
188b0 54 45 4d 50 20 64 61 74 61 62 61 73 65 0a 20 20  TEMP database.  
188c0 20 20 2a 2a 20 73 63 68 65 6d 61 20 69 73 20 63    ** schema is c
188d0 68 61 6e 67 65 64 2e 20 20 54 69 63 6b 65 74 20  hanged.  Ticket 
188e0 23 31 36 34 34 20 2a 2f 0a 20 20 20 20 73 71 6c  #1644 */.    sql
188f0 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
18900 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
18910 3b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  ;.    p->expired
18920 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 62 72 65 61   = 0;.  }.  brea
18930 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
18940 20 56 65 72 69 66 79 43 6f 6f 6b 69 65 20 50 31   VerifyCookie P1
18950 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
18960 20 43 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65   Check the value
18970 20 6f 66 20 67 6c 6f 62 61 6c 20 64 61 74 61 62   of global datab
18980 61 73 65 20 70 61 72 61 6d 65 74 65 72 20 6e 75  ase parameter nu
18990 6d 62 65 72 20 30 20 28 74 68 65 0a 2a 2a 20 73  mber 0 (the.** s
189a0 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 29 20 61  chema version) a
189b0 6e 64 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20  nd make sure it 
189c0 69 73 20 65 71 75 61 6c 20 74 6f 20 50 32 20 61  is equal to P2 a
189d0 6e 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 67  nd that the.** g
189e0 65 6e 65 72 61 74 69 6f 6e 20 63 6f 75 6e 74 65  eneration counte
189f0 72 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 73  r on the local s
18a00 63 68 65 6d 61 20 70 61 72 73 65 20 65 71 75 61  chema parse equa
18a10 6c 73 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 50 31 20  ls P3..**.** P1 
18a20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
18a30 6e 75 6d 62 65 72 20 77 68 69 63 68 20 69 73 20  number which is 
18a40 30 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  0 for the main d
18a50 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
18a60 61 6e 64 20 31 20 66 6f 72 20 74 68 65 20 66 69  and 1 for the fi
18a70 6c 65 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f  le holding tempo
18a80 72 61 72 79 20 74 61 62 6c 65 73 20 61 6e 64 20  rary tables and 
18a90 73 6f 6d 65 20 68 69 67 68 65 72 20 6e 75 6d 62  some higher numb
18aa0 65 72 0a 2a 2a 20 66 6f 72 20 61 75 78 69 6c 69  er.** for auxili
18ab0 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ary databases..*
18ac0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20  *.** The cookie 
18ad0 63 68 61 6e 67 65 73 20 69 74 73 20 76 61 6c 75  changes its valu
18ae0 65 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 64  e whenever the d
18af0 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 63  atabase schema c
18b00 68 61 6e 67 65 73 2e 0a 2a 2a 20 54 68 69 73 20  hanges..** This 
18b10 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 75 73 65  operation is use
18b20 64 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e  d to detect when
18b30 20 74 68 61 74 20 74 68 65 20 63 6f 6f 6b 69 65   that the cookie
18b40 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20   has changed.** 
18b50 61 6e 64 20 74 68 61 74 20 74 68 65 20 63 75 72  and that the cur
18b60 72 65 6e 74 20 70 72 6f 63 65 73 73 20 6e 65 65  rent process nee
18b70 64 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65  ds to reread the
18b80 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 45   schema..**.** E
18b90 69 74 68 65 72 20 61 20 74 72 61 6e 73 61 63 74  ither a transact
18ba0 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 68 61 76  ion needs to hav
18bb0 65 20 62 65 65 6e 20 73 74 61 72 74 65 64 20 6f  e been started o
18bc0 72 20 61 6e 20 4f 50 5f 4f 70 65 6e 20 6e 65 65  r an OP_Open nee
18bd0 64 73 0a 2a 2a 20 74 6f 20 62 65 20 65 78 65 63  ds.** to be exec
18be0 75 74 65 64 20 28 74 6f 20 65 73 74 61 62 6c 69  uted (to establi
18bf0 73 68 20 61 20 72 65 61 64 20 6c 6f 63 6b 29 20  sh a read lock) 
18c00 62 65 66 6f 72 65 20 74 68 69 73 20 6f 70 63 6f  before this opco
18c10 64 65 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64  de is.** invoked
18c20 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 65 72  ..*/.case OP_Ver
18c30 69 66 79 43 6f 6f 6b 69 65 3a 20 7b 0a 20 20 69  ifyCookie: {.  i
18c40 6e 74 20 69 4d 65 74 61 3b 0a 20 20 69 6e 74 20  nt iMeta;.  int 
18c50 69 47 65 6e 3b 0a 20 20 42 74 72 65 65 20 2a 70  iGen;.  Btree *p
18c60 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Bt;..  assert( p
18c70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
18c80 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  ->p1<db->nDb );.
18c90 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74    assert( (p->bt
18ca0 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44 62  reeMask & (((yDb
18cb0 4d 61 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e 70 31  Mask)1)<<pOp->p1
18cc0 29 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))!=0 );.  asser
18cd0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
18ce0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 70 4f  MutexHeld(db, pO
18cf0 70 2d 3e 70 31 2c 20 30 29 20 29 3b 0a 20 20 61  p->p1, 0) );.  a
18d00 73 73 65 72 74 28 20 70 2d 3e 6e 6f 49 4f 3d 3d  ssert( p->noIO==
18d10 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 64 62 2d  0 );.  pBt = db-
18d20 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42  >aDb[pOp->p1].pB
18d30 74 3b 0a 20 20 69 66 28 20 70 42 74 20 29 7b 0a  t;.  if( pBt ){.
18d40 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
18d50 47 65 74 4d 65 74 61 28 70 42 74 2c 20 42 54 52  GetMeta(pBt, BTR
18d60 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f  EE_SCHEMA_VERSIO
18d70 4e 2c 20 28 75 33 32 20 2a 29 26 69 4d 65 74 61  N, (u32 *)&iMeta
18d80 29 3b 0a 20 20 20 20 69 47 65 6e 20 3d 20 64 62  );.    iGen = db
18d90 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70  ->aDb[pOp->p1].p
18da0 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61 74  Schema->iGenerat
18db0 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ion;.  }else{.  
18dc0 20 20 69 47 65 6e 20 3d 20 69 4d 65 74 61 20 3d    iGen = iMeta =
18dd0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 4d   0;.  }.  if( iM
18de0 65 74 61 21 3d 70 4f 70 2d 3e 70 32 20 7c 7c 20  eta!=pOp->p2 || 
18df0 69 47 65 6e 21 3d 70 4f 70 2d 3e 70 33 20 29 7b  iGen!=pOp->p3 ){
18e00 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
18e10 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
18e20 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  g);.    p->zErrM
18e30 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  sg = sqlite3DbSt
18e40 72 44 75 70 28 64 62 2c 20 22 64 61 74 61 62 61  rDup(db, "databa
18e50 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63 68  se schema has ch
18e60 61 6e 67 65 64 22 29 3b 0a 20 20 20 20 2f 2a 20  anged");.    /* 
18e70 49 66 20 74 68 65 20 73 63 68 65 6d 61 2d 63 6f  If the schema-co
18e80 6f 6b 69 65 20 66 72 6f 6d 20 74 68 65 20 64 61  okie from the da
18e90 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 74 63  tabase file matc
18ea0 68 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 0a  hes the cookie .
18eb0 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 77 69      ** stored wi
18ec0 74 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  th the in-memory
18ed0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
18ee0 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2c 20 64  of the schema, d
18ef0 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 65 6c  o.    ** not rel
18f00 6f 61 64 20 74 68 65 20 73 63 68 65 6d 61 20 66  oad the schema f
18f10 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
18f20 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
18f30 20 20 2a 2a 20 49 66 20 76 69 72 74 75 61 6c 2d    ** If virtual-
18f40 74 61 62 6c 65 73 20 61 72 65 20 69 6e 20 75 73  tables are in us
18f50 65 2c 20 74 68 69 73 20 69 73 20 6e 6f 74 20 6a  e, this is not j
18f60 75 73 74 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74  ust an optimizat
18f70 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 4f 66 74 65  ion..    ** Ofte
18f80 6e 2c 20 76 2d 74 61 62 6c 65 73 20 73 74 6f 72  n, v-tables stor
18f90 65 20 74 68 65 69 72 20 64 61 74 61 20 69 6e 20  e their data in 
18fa0 6f 74 68 65 72 20 53 51 4c 69 74 65 20 74 61 62  other SQLite tab
18fb0 6c 65 73 2c 20 77 68 69 63 68 0a 20 20 20 20 2a  les, which.    *
18fc0 2a 20 61 72 65 20 71 75 65 72 69 65 64 20 66 72  * are queried fr
18fd0 6f 6d 20 77 69 74 68 69 6e 20 78 4e 65 78 74 28  om within xNext(
18fe0 29 20 61 6e 64 20 6f 74 68 65 72 20 76 2d 74 61  ) and other v-ta
18ff0 62 6c 65 20 6d 65 74 68 6f 64 73 20 75 73 69 6e  ble methods usin
19000 67 0a 20 20 20 20 2a 2a 20 70 72 65 70 61 72 65  g.    ** prepare
19010 64 20 71 75 65 72 69 65 73 2e 20 49 66 20 73 75  d queries. If su
19020 63 68 20 61 20 71 75 65 72 79 20 69 73 20 6f 75  ch a query is ou
19030 74 2d 6f 66 2d 64 61 74 65 2c 20 77 65 20 64 6f  t-of-date, we do
19040 20 6e 6f 74 20 77 61 6e 74 20 74 6f 0a 20 20 20   not want to.   
19050 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68 65 20   ** discard the 
19060 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2c  database schema,
19070 20 61 73 20 74 68 65 20 75 73 65 72 20 63 6f 64   as the user cod
19080 65 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  e implementing t
19090 68 65 0a 20 20 20 20 2a 2a 20 76 2d 74 61 62 6c  he.    ** v-tabl
190a0 65 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20  e would have to 
190b0 62 65 20 72 65 61 64 79 20 66 6f 72 20 74 68 65  be ready for the
190c0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74   sqlite3_vtab st
190d0 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 0a 20  ructure itself. 
190e0 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61     ** to be inva
190f0 6c 69 64 61 74 65 64 20 77 68 65 6e 65 76 65 72  lidated whenever
19100 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
19110 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  is called from w
19120 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 61 20  ithin .    ** a 
19130 76 2d 74 61 62 6c 65 20 6d 65 74 68 6f 64 2e 0a  v-table method..
19140 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64      */.    if( d
19150 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e  b->aDb[pOp->p1].
19160 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f  pSchema->schema_
19170 63 6f 6f 6b 69 65 21 3d 69 4d 65 74 61 20 29 7b  cookie!=iMeta ){
19180 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
19190 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 64 62 2c  setOneSchema(db,
191a0 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20 7d   pOp->p1);.    }
191b0 0a 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  ..    p->expired
191c0 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 1;.    rc = S
191d0 51 4c 49 54 45 5f 53 43 48 45 4d 41 3b 0a 20 20  QLITE_SCHEMA;.  
191e0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
191f0 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 52 65 61   Opcode: OpenRea
19200 64 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  d P1 P2 P3 P4 P5
19210 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65  .**.** Open a re
19220 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 66  ad-only cursor f
19230 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
19240 74 61 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74  table whose root
19250 20 70 61 67 65 20 69 73 0a 2a 2a 20 50 32 20 69   page is.** P2 i
19260 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
19270 65 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  e.  The database
19280 20 66 69 6c 65 20 69 73 20 64 65 74 65 72 6d 69   file is determi
19290 6e 65 64 20 62 79 20 50 33 2e 20 0a 2a 2a 20 50  ned by P3. .** P
192a0 33 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 20 6d  3==0 means the m
192b0 61 69 6e 20 64 61 74 61 62 61 73 65 2c 20 50 33  ain database, P3
192c0 3d 3d 31 20 6d 65 61 6e 73 20 74 68 65 20 64 61  ==1 means the da
192d0 74 61 62 61 73 65 20 75 73 65 64 20 66 6f 72 20  tabase used for 
192e0 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61  .** temporary ta
192f0 62 6c 65 73 2c 20 61 6e 64 20 50 33 3e 31 20 6d  bles, and P3>1 m
19300 65 61 6e 73 20 75 73 65 64 20 74 68 65 20 63 6f  eans used the co
19310 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 74 74 61  rresponding atta
19320 63 68 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65  ched.** database
19330 2e 20 20 47 69 76 65 20 74 68 65 20 6e 65 77 20  .  Give the new 
19340 63 75 72 73 6f 72 20 61 6e 20 69 64 65 6e 74 69  cursor an identi
19350 66 69 65 72 20 6f 66 20 50 31 2e 20 20 54 68 65  fier of P1.  The
19360 20 50 31 0a 2a 2a 20 76 61 6c 75 65 73 20 6e 65   P1.** values ne
19370 65 64 20 6e 6f 74 20 62 65 20 63 6f 6e 74 69 67  ed not be contig
19380 75 6f 75 73 20 62 75 74 20 61 6c 6c 20 50 31 20  uous but all P1 
19390 76 61 6c 75 65 73 20 73 68 6f 75 6c 64 20 62 65  values should be
193a0 20 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73 2e   small integers.
193b0 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72  .** It is an err
193c0 6f 72 20 66 6f 72 20 50 31 20 74 6f 20 62 65 20  or for P1 to be 
193d0 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
193e0 49 66 20 50 35 21 3d 30 20 74 68 65 6e 20 75 73  If P5!=0 then us
193f0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
19400 20 72 65 67 69 73 74 65 72 20 50 32 20 61 73 20   register P2 as 
19410 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 6e  the root page, n
19420 6f 74 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  ot.** the value 
19430 6f 66 20 50 32 20 69 74 73 65 6c 66 2e 0a 2a 2a  of P2 itself..**
19440 0a 2a 2a 20 54 68 65 72 65 20 77 69 6c 6c 20 62  .** There will b
19450 65 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  e a read lock on
19460 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
19470 65 6e 65 76 65 72 20 74 68 65 72 65 20 69 73 20  enever there is 
19480 61 6e 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f  an.** open curso
19490 72 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  r.  If the datab
194a0 61 73 65 20 77 61 73 20 75 6e 6c 6f 63 6b 65 64  ase was unlocked
194b0 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 69   prior to this i
194c0 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 74 68  nstruction.** th
194d0 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  en a read lock i
194e0 73 20 61 63 71 75 69 72 65 64 20 61 73 20 70 61  s acquired as pa
194f0 72 74 20 6f 66 20 74 68 69 73 20 69 6e 73 74 72  rt of this instr
19500 75 63 74 69 6f 6e 2e 20 20 41 20 72 65 61 64 0a  uction.  A read.
19510 2a 2a 20 6c 6f 63 6b 20 61 6c 6c 6f 77 73 20 6f  ** lock allows o
19520 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 74  ther processes t
19530 6f 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62  o read the datab
19540 61 73 65 20 62 75 74 20 70 72 6f 68 69 62 69 74  ase but prohibit
19550 73 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 70  s.** any other p
19560 72 6f 63 65 73 73 20 66 72 6f 6d 20 6d 6f 64 69  rocess from modi
19570 66 79 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  fying the databa
19580 73 65 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  se.  The read lo
19590 63 6b 20 69 73 0a 2a 2a 20 72 65 6c 65 61 73 65  ck is.** release
195a0 64 20 77 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f  d when all curso
195b0 72 73 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 20  rs are closed.  
195c0 49 66 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  If this instruct
195d0 69 6f 6e 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20  ion attempts.** 
195e0 74 6f 20 67 65 74 20 61 20 72 65 61 64 20 6c 6f  to get a read lo
195f0 63 6b 20 62 75 74 20 66 61 69 6c 73 2c 20 74 68  ck but fails, th
19600 65 20 73 63 72 69 70 74 20 74 65 72 6d 69 6e 61  e script termina
19610 74 65 73 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53  tes with an.** S
19620 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
19630 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   code..**.** The
19640 20 50 34 20 76 61 6c 75 65 20 6d 61 79 20 62 65   P4 value may be
19650 20 65 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67   either an integ
19660 65 72 20 28 50 34 5f 49 4e 54 33 32 29 20 6f 72  er (P4_INT32) or
19670 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a   a pointer to.**
19680 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
19690 74 75 72 65 20 28 50 34 5f 4b 45 59 49 4e 46 4f  ture (P4_KEYINFO
196a0 29 2e 20 49 66 20 69 74 20 69 73 20 61 20 70 6f  ). If it is a po
196b0 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
196c0 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  fo .** structure
196d0 2c 20 74 68 65 6e 20 73 61 69 64 20 73 74 72 75  , then said stru
196e0 63 74 75 72 65 20 64 65 66 69 6e 65 73 20 74 68  cture defines th
196f0 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 63 6f  e content and co
19700 6c 6c 61 74 69 6e 67 20 0a 2a 2a 20 73 65 71 75  llating .** sequ
19710 65 6e 63 65 20 6f 66 20 74 68 65 20 69 6e 64 65  ence of the inde
19720 78 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 2e 20  x being opened. 
19730 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 50 34  Otherwise, if P4
19740 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 0a   is an integer .
19750 2a 2a 20 76 61 6c 75 65 2c 20 69 74 20 69 73 20  ** value, it is 
19760 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
19770 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
19780 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
19790 20 53 65 65 20 61 6c 73 6f 20 4f 70 65 6e 57 72   See also OpenWr
197a0 69 74 65 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ite..*/./* Opcod
197b0 65 3a 20 4f 70 65 6e 57 72 69 74 65 20 50 31 20  e: OpenWrite P1 
197c0 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
197d0 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2f 77 72  * Open a read/wr
197e0 69 74 65 20 63 75 72 73 6f 72 20 6e 61 6d 65 64  ite cursor named
197f0 20 50 31 20 6f 6e 20 74 68 65 20 74 61 62 6c 65   P1 on the table
19800 20 6f 72 20 69 6e 64 65 78 20 77 68 6f 73 65 20   or index whose 
19810 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20  root.** page is 
19820 50 32 2e 20 20 4f 72 20 69 66 20 50 35 21 3d 30  P2.  Or if P5!=0
19830 20 75 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74   use the content
19840 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 32 20   of register P2 
19850 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 72  to find the.** r
19860 6f 6f 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  oot page..**.** 
19870 54 68 65 20 50 34 20 76 61 6c 75 65 20 6d 61 79  The P4 value may
19880 20 62 65 20 65 69 74 68 65 72 20 61 6e 20 69 6e   be either an in
19890 74 65 67 65 72 20 28 50 34 5f 49 4e 54 33 32 29  teger (P4_INT32)
198a0 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   or a pointer to
198b0 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  .** a KeyInfo st
198c0 72 75 63 74 75 72 65 20 28 50 34 5f 4b 45 59 49  ructure (P4_KEYI
198d0 4e 46 4f 29 2e 20 49 66 20 69 74 20 69 73 20 61  NFO). If it is a
198e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65   pointer to a Ke
198f0 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
19900 75 72 65 2c 20 74 68 65 6e 20 73 61 69 64 20 73  ure, then said s
19910 74 72 75 63 74 75 72 65 20 64 65 66 69 6e 65 73  tructure defines
19920 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64   the content and
19930 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a 2a 20 73   collating .** s
19940 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65 20 69  equence of the i
19950 6e 64 65 78 20 62 65 69 6e 67 20 6f 70 65 6e 65  ndex being opene
19960 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
19970 20 50 34 20 69 73 20 61 6e 20 69 6e 74 65 67 65   P4 is an intege
19980 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20 69 74 20  r .** value, it 
19990 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
199a0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
199b0 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 6f 72  in the table, or
199c0 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 61 72 67 65   to the.** large
199d0 73 74 20 69 6e 64 65 78 20 6f 66 20 61 6e 79 20  st index of any 
199e0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
199f0 62 6c 65 20 74 68 61 74 20 69 73 20 61 63 74 75  ble that is actu
19a00 61 6c 6c 79 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  ally used..**.**
19a10 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   This instructio
19a20 6e 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  n works just lik
19a30 65 20 4f 70 65 6e 52 65 61 64 20 65 78 63 65 70  e OpenRead excep
19a40 74 20 74 68 61 74 20 69 74 20 6f 70 65 6e 73 20  t that it opens 
19a50 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 6e  the cursor.** in
19a60 20 72 65 61 64 2f 77 72 69 74 65 20 6d 6f 64 65   read/write mode
19a70 2e 20 20 46 6f 72 20 61 20 67 69 76 65 6e 20 74  .  For a given t
19a80 61 62 6c 65 2c 20 74 68 65 72 65 20 63 61 6e 20  able, there can 
19a90 62 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72  be one or more r
19aa0 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73  ead-only.** curs
19ab0 6f 72 73 20 6f 72 20 61 20 73 69 6e 67 6c 65 20  ors or a single 
19ac0 72 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f  read/write curso
19ad0 72 20 62 75 74 20 6e 6f 74 20 62 6f 74 68 2e 0a  r but not both..
19ae0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 4f  **.** See also O
19af0 70 65 6e 52 65 61 64 2e 0a 2a 2f 0a 63 61 73 65  penRead..*/.case
19b00 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3a 0a 63 61   OP_OpenRead:.ca
19b10 73 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3a  se OP_OpenWrite:
19b20 20 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b   {.  int nField;
19b30 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
19b40 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 70 32 3b 0a  Info;.  int p2;.
19b50 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74    int iDb;.  int
19b60 20 77 72 46 6c 61 67 3b 0a 20 20 42 74 72 65 65   wrFlag;.  Btree
19b70 20 2a 70 58 3b 0a 20 20 56 64 62 65 43 75 72 73   *pX;.  VdbeCurs
19b80 6f 72 20 2a 70 43 75 72 3b 0a 20 20 44 62 20 2a  or *pCur;.  Db *
19b90 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
19ba0 28 70 4f 70 2d 3e 70 35 26 28 4f 50 46 4c 41 47  (pOp->p5&(OPFLAG
19bb0 5f 50 32 49 53 52 45 47 7c 4f 50 46 4c 41 47 5f  _P2ISREG|OPFLAG_
19bc0 42 55 4c 4b 43 53 52 29 29 3d 3d 70 4f 70 2d 3e  BULKCSR))==pOp->
19bd0 70 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p5 );.  assert( 
19be0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
19bf0 4f 70 65 6e 57 72 69 74 65 20 7c 7c 20 70 4f 70  OpenWrite || pOp
19c00 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ->p5==0 );.  ass
19c10 65 72 74 28 20 70 2d 3e 6e 6f 49 4f 3d 3d 30 20  ert( p->noIO==0 
19c20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
19c30 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65  ->opcode==OP_Ope
19c40 6e 52 65 61 64 20 7c 7c 20 70 2d 3e 72 65 61 64  nRead || p->read
19c50 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  Only==0 );..  if
19c60 28 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a  ( p->expired ){.
19c70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19c80 41 42 4f 52 54 3b 0a 20 20 20 20 62 72 65 61 6b  ABORT;.    break
19c90 3b 0a 20 20 7d 0a 0a 20 20 6e 46 69 65 6c 64 20  ;.  }..  nField 
19ca0 3d 20 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20  = 0;.  pKeyInfo 
19cb0 3d 20 30 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d  = 0;.  p2 = pOp-
19cc0 3e 70 32 3b 0a 20 20 69 44 62 20 3d 20 70 4f 70  >p2;.  iDb = pOp
19cd0 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p3;.  assert( 
19ce0 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
19cf0 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
19d00 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  t( (p->btreeMask
19d10 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31 29   & (((yDbMask)1)
19d20 3c 3c 69 44 62 29 29 21 3d 30 20 29 3b 0a 20 20  <<iDb))!=0 );.  
19d30 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
19d40 44 62 5d 3b 0a 20 20 70 58 20 3d 20 70 44 62 2d  Db];.  pX = pDb-
19d50 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
19d60 70 58 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  pX!=0 );.  if( p
19d70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f  Op->opcode==OP_O
19d80 70 65 6e 57 72 69 74 65 20 29 7b 0a 20 20 20 20  penWrite ){.    
19d90 77 72 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20  wrFlag = 1;.    
19da0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
19db0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
19dc0 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
19dd0 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
19de0 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20  ma->file_format 
19df0 3c 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c  < p->minWriteFil
19e00 65 46 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20 20  eFormat ){.     
19e10 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65   p->minWriteFile
19e20 46 6f 72 6d 61 74 20 3d 20 70 44 62 2d 3e 70 53  Format = pDb->pS
19e30 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
19e40 61 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  at;.    }.  }els
19e50 65 7b 0a 20 20 20 20 77 72 46 6c 61 67 20 3d 20  e{.    wrFlag = 
19e60 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70  0;.  }.  if( pOp
19e70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 50 32  ->p5 & OPFLAG_P2
19e80 49 53 52 45 47 20 29 7b 0a 20 20 20 20 61 73 73  ISREG ){.    ass
19e90 65 72 74 28 20 70 32 3e 30 20 29 3b 0a 20 20 20  ert( p2>0 );.   
19ea0 20 61 73 73 65 72 74 28 20 70 32 3c 3d 70 2d 3e   assert( p2<=p->
19eb0 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 70 49 6e 32  nMem );.    pIn2
19ec0 20 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20   = &aMem[p2];.  
19ed0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
19ee0 61 6c 69 64 28 70 49 6e 32 29 20 29 3b 0a 20 20  alid(pIn2) );.  
19ef0 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 32 2d    assert( (pIn2-
19f00 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
19f10 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  )!=0 );.    sqli
19f20 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65  te3VdbeMemIntege
19f30 72 69 66 79 28 70 49 6e 32 29 3b 0a 20 20 20 20  rify(pIn2);.    
19f40 70 32 20 3d 20 28 69 6e 74 29 70 49 6e 32 2d 3e  p2 = (int)pIn2->
19f50 75 2e 69 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  u.i;.    /* The 
19f60 70 32 20 76 61 6c 75 65 20 61 6c 77 61 79 73 20  p2 value always 
19f70 63 6f 6d 65 73 20 66 72 6f 6d 20 61 20 70 72 69  comes from a pri
19f80 6f 72 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  or OP_CreateTabl
19f90 65 20 6f 70 63 6f 64 65 20 61 6e 64 0a 20 20 20  e opcode and.   
19fa0 20 2a 2a 20 74 68 61 74 20 6f 70 63 6f 64 65 20   ** that opcode 
19fb0 77 69 6c 6c 20 61 6c 77 61 79 73 20 73 65 74 20  will always set 
19fc0 74 68 65 20 70 32 20 76 61 6c 75 65 20 74 6f 20  the p2 value to 
19fd0 32 20 6f 72 20 6d 6f 72 65 20 6f 72 20 65 6c 73  2 or more or els
19fe0 65 20 66 61 69 6c 2e 0a 20 20 20 20 2a 2a 20 49  e fail..    ** I
19ff0 66 20 74 68 65 72 65 20 77 65 72 65 20 61 20 66  f there were a f
1a000 61 69 6c 75 72 65 2c 20 74 68 65 20 70 72 65 70  ailure, the prep
1a010 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77  ared statement w
1a020 6f 75 6c 64 20 68 61 76 65 20 68 61 6c 74 65 64  ould have halted
1a030 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 72  .    ** before r
1a040 65 61 63 68 69 6e 67 20 74 68 69 73 20 69 6e 73  eaching this ins
1a050 74 72 75 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  truction. */.   
1a060 20 69 66 28 20 4e 45 56 45 52 28 70 32 3c 32 29   if( NEVER(p2<2)
1a070 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20   ) {.      rc = 
1a080 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1a090 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
1a0a0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
1a0b0 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  or;.    }.  }.  
1a0c0 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  if( pOp->p4type=
1a0d0 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20  =P4_KEYINFO ){. 
1a0e0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f     pKeyInfo = pO
1a0f0 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
1a100 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e      pKeyInfo->en
1a110 63 20 3d 20 45 4e 43 28 70 2d 3e 64 62 29 3b 0a  c = ENC(p->db);.
1a120 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65      nField = pKe
1a130 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 3b  yInfo->nField+1;
1a140 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70  .  }else if( pOp
1a150 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54  ->p4type==P4_INT
1a160 33 32 20 29 7b 0a 20 20 20 20 6e 46 69 65 6c 64  32 ){.    nField
1a170 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20   = pOp->p4.i;.  
1a180 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  }.  assert( pOp-
1a190 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 70 43 75 72  >p1>=0 );.  pCur
1a1a0 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f   = allocateCurso
1a1b0 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 6e 46  r(p, pOp->p1, nF
1a1c0 69 65 6c 64 2c 20 69 44 62 2c 20 31 29 3b 0a 20  ield, iDb, 1);. 
1a1d0 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20 67   if( pCur==0 ) g
1a1e0 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43  oto no_mem;.  pC
1a1f0 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b  ur->nullRow = 1;
1a200 0a 20 20 70 43 75 72 2d 3e 69 73 4f 72 64 65 72  .  pCur->isOrder
1a210 65 64 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73  ed = 1;.  rc = s
1a220 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1a230 72 28 70 58 2c 20 70 32 2c 20 77 72 46 6c 61 67  r(pX, p2, wrFlag
1a240 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
1a250 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 70 43  ->pCursor);.  pC
1a260 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
1a270 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72  KeyInfo;.  asser
1a280 74 28 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53  t( OPFLAG_BULKCS
1a290 52 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41  R==BTREE_BULKLOA
1a2a0 44 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  D );.  sqlite3Bt
1a2b0 72 65 65 43 75 72 73 6f 72 48 69 6e 74 73 28 70  reeCursorHints(p
1a2c0 43 75 72 2d 3e 70 43 75 72 73 6f 72 2c 20 28 70  Cur->pCursor, (p
1a2d0 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
1a2e0 42 55 4c 4b 43 53 52 29 29 3b 0a 0a 20 20 2f 2a  BULKCSR));..  /*
1a2f0 20 53 69 6e 63 65 20 69 74 20 70 65 72 66 6f 72   Since it perfor
1a300 6d 73 20 6e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  ms no memory all
1a310 6f 63 61 74 69 6f 6e 20 6f 72 20 49 4f 2c 20 74  ocation or IO, t
1a320 68 65 20 6f 6e 6c 79 20 76 61 6c 75 65 20 74 68  he only value th
1a330 61 74 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 42  at.  ** sqlite3B
1a340 74 72 65 65 43 75 72 73 6f 72 28 29 20 6d 61 79  treeCursor() may
1a350 20 72 65 74 75 72 6e 20 69 73 20 53 51 4c 49 54   return is SQLIT
1a360 45 5f 4f 4b 2e 20 2a 2f 0a 20 20 61 73 73 65 72  E_OK. */.  asser
1a370 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
1a380 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
1a390 65 20 56 64 62 65 43 75 72 73 6f 72 2e 69 73 54  e VdbeCursor.isT
1a3a0 61 62 6c 65 20 61 6e 64 20 69 73 49 6e 64 65 78  able and isIndex
1a3b0 20 76 61 72 69 61 62 6c 65 73 2e 20 50 72 65 76   variables. Prev
1a3c0 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66  ious versions of
1a3d0 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 75 73 65  .  ** SQLite use
1a3e0 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
1a3f0 65 20 72 6f 6f 74 2d 70 61 67 65 20 66 6c 61 67  e root-page flag
1a400 73 20 77 65 72 65 20 73 61 6e 65 20 61 74 20 74  s were sane at t
1a410 68 69 73 20 70 6f 69 6e 74 0a 20 20 2a 2a 20 61  his point.  ** a
1a420 6e 64 20 72 65 70 6f 72 74 20 64 61 74 61 62 61  nd report databa
1a430 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66  se corruption if
1a440 20 74 68 65 79 20 77 65 72 65 20 6e 6f 74 2c 20   they were not, 
1a450 62 75 74 20 74 68 69 73 20 63 68 65 63 6b 20 68  but this check h
1a460 61 73 0a 20 20 2a 2a 20 73 69 6e 63 65 20 6d 6f  as.  ** since mo
1a470 76 65 64 20 69 6e 74 6f 20 74 68 65 20 62 74 72  ved into the btr
1a480 65 65 20 6c 61 79 65 72 2e 20 20 2a 2f 20 20 0a  ee layer.  */  .
1a490 20 20 70 43 75 72 2d 3e 69 73 54 61 62 6c 65 20    pCur->isTable 
1a4a0 3d 20 70 4f 70 2d 3e 70 34 74 79 70 65 21 3d 50  = pOp->p4type!=P
1a4b0 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 70 43 75  4_KEYINFO;.  pCu
1a4c0 72 2d 3e 69 73 49 6e 64 65 78 20 3d 20 21 70 43  r->isIndex = !pC
1a4d0 75 72 2d 3e 69 73 54 61 62 6c 65 3b 0a 20 20 62  ur->isTable;.  b
1a4e0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
1a4f0 64 65 3a 20 4f 70 65 6e 45 70 68 65 6d 65 72 61  de: OpenEphemera
1a500 6c 20 50 31 20 50 32 20 2a 20 50 34 20 50 35 0a  l P1 P2 * P4 P5.
1a510 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  **.** Open a new
1a520 20 63 75 72 73 6f 72 20 50 31 20 74 6f 20 61 20   cursor P1 to a 
1a530 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 2e  transient table.
1a540 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69  .** The cursor i
1a550 73 20 61 6c 77 61 79 73 20 6f 70 65 6e 65 64 20  s always opened 
1a560 72 65 61 64 2f 77 72 69 74 65 20 65 76 65 6e 20  read/write even 
1a570 69 66 20 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20  if .** the main 
1a580 64 61 74 61 62 61 73 65 20 69 73 20 72 65 61 64  database is read
1a590 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 65 70 68 65  -only.  The ephe
1a5a0 6d 65 72 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 69  meral.** table i
1a5b0 73 20 64 65 6c 65 74 65 64 20 61 75 74 6f 6d 61  s deleted automa
1a5c0 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
1a5d0 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65   cursor is close
1a5e0 64 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73 20 74  d..**.** P2 is t
1a5f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
1a600 75 6d 6e 73 20 69 6e 20 74 68 65 20 65 70 68 65  umns in the ephe
1a610 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20  meral table..** 
1a620 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  The cursor point
1a630 73 20 74 6f 20 61 20 42 54 72 65 65 20 74 61 62  s to a BTree tab
1a640 6c 65 20 69 66 20 50 34 3d 3d 30 20 61 6e 64 20  le if P4==0 and 
1a650 74 6f 20 61 20 42 54 72 65 65 20 69 6e 64 65 78  to a BTree index
1a660 0a 2a 2a 20 69 66 20 50 34 20 69 73 20 6e 6f 74  .** if P4 is not
1a670 20 30 2e 20 20 49 66 20 50 34 20 69 73 20 6e 6f   0.  If P4 is no
1a680 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74  t NULL, it point
1a690 73 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73  s to a KeyInfo s
1a6a0 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74  tructure.** that
1a6b0 20 64 65 66 69 6e 65 73 20 74 68 65 20 66 6f 72   defines the for
1a6c0 6d 61 74 20 6f 66 20 6b 65 79 73 20 69 6e 20 74  mat of keys in t
1a6d0 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  he index..**.** 
1a6e0 54 68 69 73 20 6f 70 63 6f 64 65 20 77 61 73 20  This opcode was 
1a6f0 6f 6e 63 65 20 63 61 6c 6c 65 64 20 4f 70 65 6e  once called Open
1a700 54 65 6d 70 2e 20 20 42 75 74 20 74 68 61 74 20  Temp.  But that 
1a710 63 72 65 61 74 65 64 0a 2a 2a 20 63 6f 6e 66 75  created.** confu
1a720 73 69 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65  sion because the
1a730 20 74 65 72 6d 20 22 74 65 6d 70 20 74 61 62 6c   term "temp tabl
1a740 65 22 2c 20 6d 69 67 68 74 20 72 65 66 65 72 20  e", might refer 
1a750 65 69 74 68 65 72 0a 2a 2a 20 74 6f 20 61 20 54  either.** to a T
1a760 45 4d 50 20 74 61 62 6c 65 20 61 74 20 74 68 65  EMP table at the
1a770 20 53 51 4c 20 6c 65 76 65 6c 2c 20 6f 72 20 74   SQL level, or t
1a780 6f 20 61 20 74 61 62 6c 65 20 6f 70 65 6e 65 64  o a table opened
1a790 20 62 79 0a 2a 2a 20 74 68 69 73 20 6f 70 63 6f   by.** this opco
1a7a0 64 65 2e 20 20 54 68 65 6e 20 74 68 69 73 20 6f  de.  Then this o
1a7b0 70 63 6f 64 65 20 77 61 73 20 63 61 6c 6c 20 4f  pcode was call O
1a7c0 70 65 6e 56 69 72 74 75 61 6c 2e 20 20 42 75 74  penVirtual.  But
1a7d0 0a 2a 2a 20 74 68 61 74 20 63 72 65 61 74 65 64  .** that created
1a7e0 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20   confusion with 
1a7f0 74 68 65 20 77 68 6f 6c 65 20 76 69 72 74 75 61  the whole virtua
1a800 6c 2d 74 61 62 6c 65 20 69 64 65 61 2e 0a 2a 2a  l-table idea..**
1a810 0a 2a 2a 20 54 68 65 20 50 35 20 70 61 72 61 6d  .** The P5 param
1a820 65 74 65 72 20 63 61 6e 20 62 65 20 61 20 6d 61  eter can be a ma
1a830 73 6b 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f  sk of the BTREE_
1a840 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 0a  * flags defined.
1a850 2a 2a 20 69 6e 20 62 74 72 65 65 2e 68 2e 20 20  ** in btree.h.  
1a860 54 68 65 73 65 20 66 6c 61 67 73 20 63 6f 6e 74  These flags cont
1a870 72 6f 6c 20 61 73 70 65 63 74 73 20 6f 66 20 74  rol aspects of t
1a880 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 0a  he operation of.
1a890 2a 2a 20 74 68 65 20 62 74 72 65 65 2e 20 20 54  ** the btree.  T
1a8a0 68 65 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f  he BTREE_OMIT_JO
1a8b0 55 52 4e 41 4c 20 61 6e 64 20 42 54 52 45 45 5f  URNAL and BTREE_
1a8c0 53 49 4e 47 4c 45 20 66 6c 61 67 73 20 61 72 65  SINGLE flags are
1a8d0 0a 2a 2a 20 61 64 64 65 64 20 61 75 74 6f 6d 61  .** added automa
1a8e0 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 2f 2a 20 4f  tically..*/./* O
1a8f0 70 63 6f 64 65 3a 20 4f 70 65 6e 41 75 74 6f 69  pcode: OpenAutoi
1a900 6e 64 65 78 20 50 31 20 50 32 20 2a 20 50 34 20  ndex P1 P2 * P4 
1a910 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  *.**.** This opc
1a920 6f 64 65 20 77 6f 72 6b 73 20 74 68 65 20 73 61  ode works the sa
1a930 6d 65 20 61 73 20 4f 50 5f 4f 70 65 6e 45 70 68  me as OP_OpenEph
1a940 65 6d 65 72 61 6c 2e 20 20 49 74 20 68 61 73 20  emeral.  It has 
1a950 61 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 6e  a.** different n
1a960 61 6d 65 20 74 6f 20 64 69 73 74 69 6e 67 75 69  ame to distingui
1a970 73 68 20 69 74 73 20 75 73 65 2e 20 20 54 61 62  sh its use.  Tab
1a980 6c 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e  les created usin
1a990 67 0a 2a 2a 20 62 79 20 74 68 69 73 20 6f 70 63  g.** by this opc
1a9a0 6f 64 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ode will be used
1a9b0 20 66 6f 72 20 61 75 74 6f 6d 61 74 69 63 61 6c   for automatical
1a9c0 6c 79 20 63 72 65 61 74 65 64 20 74 72 61 6e 73  ly created trans
1a9d0 69 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 65 73 20  ient.** indices 
1a9e0 69 6e 20 6a 6f 69 6e 73 2e 0a 2a 2f 0a 63 61 73  in joins..*/.cas
1a9f0 65 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64  e OP_OpenAutoind
1aa00 65 78 3a 20 0a 63 61 73 65 20 4f 50 5f 4f 70 65  ex: .case OP_Ope
1aa10 6e 45 70 68 65 6d 65 72 61 6c 3a 20 7b 0a 20 20  nEphemeral: {.  
1aa20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b  VdbeCursor *pCx;
1aa30 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1aa40 69 6e 74 20 76 66 73 46 6c 61 67 73 20 3d 20 0a  int vfsFlags = .
1aa50 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1aa60 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20  N_READWRITE |.  
1aa70 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1aa80 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 53  CREATE |.      S
1aa90 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1aaa0 53 49 56 45 20 7c 0a 20 20 20 20 20 20 53 51 4c  SIVE |.      SQL
1aab0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
1aac0 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 53  NCLOSE |.      S
1aad0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
1aae0 49 45 4e 54 5f 44 42 3b 0a 0a 20 20 61 73 73 65  IENT_DB;..  asse
1aaf0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29  rt( pOp->p1>=0 )
1ab00 3b 0a 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61  ;.  pCx = alloca
1ab10 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d  teCursor(p, pOp-
1ab20 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d 31  >p1, pOp->p2, -1
1ab30 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 78 3d  , 1);.  if( pCx=
1ab40 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
1ab50 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c 52 6f 77  ;.  pCx->nullRow
1ab60 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 1;.  rc = sql
1ab70 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62  ite3BtreeOpen(db
1ab80 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20 26  ->pVfs, 0, db, &
1ab90 70 43 78 2d 3e 70 42 74 2c 20 0a 20 20 20 20 20  pCx->pBt, .     
1aba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abb0 20 20 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f     BTREE_OMIT_JO
1abc0 55 52 4e 41 4c 20 7c 20 42 54 52 45 45 5f 53 49  URNAL | BTREE_SI
1abd0 4e 47 4c 45 20 7c 20 70 4f 70 2d 3e 70 35 2c 20  NGLE | pOp->p5, 
1abe0 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 69 66 28  vfsFlags);.  if(
1abf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ac00 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1ac10 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
1ac20 73 28 70 43 78 2d 3e 70 42 74 2c 20 31 29 3b 0a  s(pCx->pBt, 1);.
1ac30 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1ac40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
1ac50 2a 20 49 66 20 61 20 74 72 61 6e 73 69 65 6e 74  * If a transient
1ac60 20 69 6e 64 65 78 20 69 73 20 72 65 71 75 69 72   index is requir
1ac70 65 64 2c 20 63 72 65 61 74 65 20 69 74 20 62 79  ed, create it by
1ac80 20 63 61 6c 6c 69 6e 67 0a 20 20 20 20 2a 2a 20   calling.    ** 
1ac90 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
1aca0 74 65 54 61 62 6c 65 28 29 20 77 69 74 68 20 74  teTable() with t
1acb0 68 65 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59  he BTREE_BLOBKEY
1acc0 20 66 6c 61 67 20 62 65 66 6f 72 65 0a 20 20 20   flag before.   
1acd0 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 69 74 2e 20   ** opening it. 
1ace0 49 66 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  If a transient t
1acf0 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
1ad00 2c 20 6a 75 73 74 20 75 73 65 20 74 68 65 0a 20  , just use the. 
1ad10 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61     ** automatica
1ad20 6c 6c 79 20 63 72 65 61 74 65 64 20 74 61 62 6c  lly created tabl
1ad30 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
1ad40 20 31 20 28 61 6e 20 42 4c 4f 42 5f 49 4e 54 4b   1 (an BLOB_INTK
1ad50 45 59 20 74 61 62 6c 65 29 2e 0a 20 20 20 20 2a  EY table)..    *
1ad60 2f 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  /.    if( pOp->p
1ad70 34 2e 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  4.pKeyInfo ){.  
1ad80 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20      int pgno;.  
1ad90 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
1ada0 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49  >p4type==P4_KEYI
1adb0 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20 72 63 20  NFO );.      rc 
1adc0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72  = sqlite3BtreeCr
1add0 65 61 74 65 54 61 62 6c 65 28 70 43 78 2d 3e 70  eateTable(pCx->p
1ade0 42 74 2c 20 26 70 67 6e 6f 2c 20 42 54 52 45 45  Bt, &pgno, BTREE
1adf0 5f 42 4c 4f 42 4b 45 59 20 7c 20 70 4f 70 2d 3e  _BLOBKEY | pOp->
1ae00 70 35 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20  p5); .      if( 
1ae10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ae20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1ae30 20 70 67 6e 6f 3d 3d 4d 41 53 54 45 52 5f 52 4f   pgno==MASTER_RO
1ae40 4f 54 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  OT+1 );.        
1ae50 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1ae60 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 42 74  eCursor(pCx->pBt
1ae70 2c 20 70 67 6e 6f 2c 20 31 2c 20 0a 20 20 20 20  , pgno, 1, .    
1ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae90 20 20 20 20 20 20 20 20 20 20 20 20 28 4b 65 79              (Key
1aea0 49 6e 66 6f 2a 29 70 4f 70 2d 3e 70 34 2e 7a 2c  Info*)pOp->p4.z,
1aeb0 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a   pCx->pCursor);.
1aec0 20 20 20 20 20 20 20 20 70 43 78 2d 3e 70 4b 65          pCx->pKe
1aed0 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e  yInfo = pOp->p4.
1aee0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pKeyInfo;.      
1aef0 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d    pCx->pKeyInfo-
1af00 3e 65 6e 63 20 3d 20 45 4e 43 28 70 2d 3e 64 62  >enc = ENC(p->db
1af10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1af20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20   pCx->isTable = 
1af30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1af40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1af50 42 74 72 65 65 43 75 72 73 6f 72 28 70 43 78 2d  BtreeCursor(pCx-
1af60 3e 70 42 74 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  >pBt, MASTER_ROO
1af70 54 2c 20 31 2c 20 30 2c 20 70 43 78 2d 3e 70 43  T, 1, 0, pCx->pC
1af80 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 43  ursor);.      pC
1af90 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20 31 3b 0a  x->isTable = 1;.
1afa0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 78 2d      }.  }.  pCx-
1afb0 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 70 4f  >isOrdered = (pO
1afc0 70 2d 3e 70 35 21 3d 42 54 52 45 45 5f 55 4e 4f  p->p5!=BTREE_UNO
1afd0 52 44 45 52 45 44 29 3b 0a 20 20 70 43 78 2d 3e  RDERED);.  pCx->
1afe0 69 73 49 6e 64 65 78 20 3d 20 21 70 43 78 2d 3e  isIndex = !pCx->
1aff0 69 73 54 61 62 6c 65 3b 0a 20 20 62 72 65 61 6b  isTable;.  break
1b000 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1b010 53 6f 72 74 65 72 4f 70 65 6e 20 50 31 20 50 32  SorterOpen P1 P2
1b020 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68   * P4 *.**.** Th
1b030 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20  is opcode works 
1b040 6c 69 6b 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65  like OP_OpenEphe
1b050 6d 65 72 61 6c 20 65 78 63 65 70 74 20 74 68 61  meral except tha
1b060 74 20 69 74 20 6f 70 65 6e 73 0a 2a 2a 20 61 20  t it opens.** a 
1b070 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
1b080 74 68 61 74 20 69 73 20 73 70 65 63 69 66 69 63  that is specific
1b090 61 6c 6c 79 20 64 65 73 69 67 6e 65 64 20 74 6f  ally designed to
1b0a0 20 73 6f 72 74 20 6c 61 72 67 65 0a 2a 2a 20 74   sort large.** t
1b0b0 61 62 6c 65 73 20 75 73 69 6e 67 20 61 6e 20 65  ables using an e
1b0c0 78 74 65 72 6e 61 6c 20 6d 65 72 67 65 2d 73 6f  xternal merge-so
1b0d0 72 74 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2f  rt algorithm..*/
1b0e0 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4f  .case OP_SorterO
1b0f0 70 65 6e 3a 20 7b 0a 20 20 56 64 62 65 43 75 72  pen: {.  VdbeCur
1b100 73 6f 72 20 2a 70 43 78 3b 0a 0a 20 20 70 43 78  sor *pCx;..  pCx
1b110 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f   = allocateCurso
1b120 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  r(p, pOp->p1, pO
1b130 70 2d 3e 70 32 2c 20 2d 31 2c 20 31 29 3b 0a 20  p->p2, -1, 1);. 
1b140 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20 67 6f   if( pCx==0 ) go
1b150 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78  to no_mem;.  pCx
1b160 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70  ->pKeyInfo = pOp
1b170 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
1b180 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e   pCx->pKeyInfo->
1b190 65 6e 63 20 3d 20 45 4e 43 28 70 2d 3e 64 62 29  enc = ENC(p->db)
1b1a0 3b 0a 20 20 70 43 78 2d 3e 69 73 53 6f 72 74 65  ;.  pCx->isSorte
1b1b0 72 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  r = 1;.  rc = sq
1b1c0 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 49  lite3VdbeSorterI
1b1d0 6e 69 74 28 64 62 2c 20 70 43 78 29 3b 0a 20 20  nit(db, pCx);.  
1b1e0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
1b1f0 6f 64 65 3a 20 4f 70 65 6e 50 73 65 75 64 6f 20  ode: OpenPseudo 
1b200 50 31 20 50 32 20 50 33 20 2a 20 50 35 0a 2a 2a  P1 P2 P3 * P5.**
1b210 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 63  .** Open a new c
1b220 75 72 73 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  ursor that point
1b230 73 20 74 6f 20 61 20 66 61 6b 65 20 74 61 62 6c  s to a fake tabl
1b240 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1b250 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f 77 20  a single.** row 
1b260 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 6f  of data.  The co
1b270 6e 74 65 6e 74 20 6f 66 20 74 68 61 74 20 6f 6e  ntent of that on
1b280 65 20 72 6f 77 20 69 6e 20 74 68 65 20 63 6f 6e  e row in the con
1b290 74 65 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a  tent of memory.*
1b2a0 2a 20 72 65 67 69 73 74 65 72 20 50 32 20 77 68  * register P2 wh
1b2b0 65 6e 20 50 35 3d 3d 30 2e 20 20 49 6e 20 6f 74  en P5==0.  In ot
1b2c0 68 65 72 20 77 6f 72 64 73 2c 20 63 75 72 73 6f  her words, curso
1b2d0 72 20 50 31 20 62 65 63 6f 6d 65 73 20 61 6e 20  r P1 becomes an 
1b2e0 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 0a 2a  alias for the .*
1b2f0 2a 20 4d 45 4d 5f 42 6c 6f 62 20 63 6f 6e 74 65  * MEM_Blob conte
1b300 6e 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  nt contained in 
1b310 72 65 67 69 73 74 65 72 20 50 32 2e 20 20 57 68  register P2.  Wh
1b320 65 6e 20 50 35 3d 3d 31 2c 20 74 68 65 6e 20 74  en P5==1, then t
1b330 68 65 0a 2a 2a 20 72 6f 77 20 69 73 20 72 65 70  he.** row is rep
1b340 72 65 73 65 6e 74 65 64 20 62 79 20 50 33 20 63  resented by P3 c
1b350 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
1b360 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 77  ters beginning w
1b370 69 74 68 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 41 20  ith P2..**.** A 
1b380 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 63 72 65  pseudo-table cre
1b390 61 74 65 64 20 62 79 20 74 68 69 73 20 6f 70 63  ated by this opc
1b3a0 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 68  ode is used to h
1b3b0 6f 6c 64 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  old a single.** 
1b3c0 72 6f 77 20 6f 75 74 70 75 74 20 66 72 6f 6d 20  row output from 
1b3d0 74 68 65 20 73 6f 72 74 65 72 20 73 6f 20 74 68  the sorter so th
1b3e0 61 74 20 74 68 65 20 72 6f 77 20 63 61 6e 20 62  at the row can b
1b3f0 65 20 64 65 63 6f 6d 70 6f 73 65 64 20 69 6e 74  e decomposed int
1b400 6f 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  o.** individual 
1b410 63 6f 6c 75 6d 6e 73 20 75 73 69 6e 67 20 74 68  columns using th
1b420 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f  e OP_Column opco
1b430 64 65 2e 20 20 54 68 65 20 4f 50 5f 43 6f 6c 75  de.  The OP_Colu
1b440 6d 6e 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20  mn opcode.** is 
1b450 74 68 65 20 6f 6e 6c 79 20 63 75 72 73 6f 72 20  the only cursor 
1b460 6f 70 63 6f 64 65 20 74 68 61 74 20 77 6f 72 6b  opcode that work
1b470 73 20 77 69 74 68 20 61 20 70 73 65 75 64 6f 2d  s with a pseudo-
1b480 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 50 33 20  table..**.** P3 
1b490 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1b4a0 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 72   fields in the r
1b4b0 65 63 6f 72 64 73 20 74 68 61 74 20 77 69 6c 6c  ecords that will
1b4c0 20 62 65 20 73 74 6f 72 65 64 20 62 79 0a 2a 2a   be stored by.**
1b4d0 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c   the pseudo-tabl
1b4e0 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70  e..*/.case OP_Op
1b4f0 65 6e 50 73 65 75 64 6f 3a 20 7b 0a 20 20 56 64  enPseudo: {.  Vd
1b500 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 0a  beCursor *pCx;..
1b510 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1b520 31 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20 3d 20  1>=0 );.  pCx = 
1b530 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70  allocateCursor(p
1b540 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
1b550 70 33 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 69 66  p3, -1, 0);.  if
1b560 28 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20  ( pCx==0 ) goto 
1b570 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e  no_mem;.  pCx->n
1b580 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43  ullRow = 1;.  pC
1b590 78 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65  x->pseudoTableRe
1b5a0 67 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 70  g = pOp->p2;.  p
1b5b0 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20 31 3b  Cx->isTable = 1;
1b5c0 0a 20 20 70 43 78 2d 3e 69 73 49 6e 64 65 78 20  .  pCx->isIndex 
1b5d0 3d 20 30 3b 0a 20 20 70 43 78 2d 3e 6d 75 6c 74  = 0;.  pCx->mult
1b5e0 69 50 73 65 75 64 6f 20 3d 20 70 4f 70 2d 3e 70  iPseudo = pOp->p
1b5f0 35 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  5;.  break;.}../
1b600 2a 20 4f 70 63 6f 64 65 3a 20 43 6c 6f 73 65 20  * Opcode: Close 
1b610 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  P1 * * * *.**.**
1b620 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20   Close a cursor 
1b630 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65  previously opene
1b640 64 20 61 73 20 50 31 2e 20 20 49 66 20 50 31 20  d as P1.  If P1 
1b650 69 73 20 6e 6f 74 0a 2a 2a 20 63 75 72 72 65 6e  is not.** curren
1b660 74 6c 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 69  tly open, this i
1b670 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 20  nstruction is a 
1b680 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63 61 73 65 20 4f  no-op..*/.case O
1b690 50 5f 43 6c 6f 73 65 3a 20 7b 0a 20 20 61 73 73  P_Close: {.  ass
1b6a0 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
1b6b0 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
1b6c0 75 72 73 6f 72 20 29 3b 0a 20 20 73 71 6c 69 74  ursor );.  sqlit
1b6d0 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
1b6e0 28 70 2c 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  (p, p->apCsr[pOp
1b6f0 2d 3e 70 31 5d 29 3b 0a 20 20 70 2d 3e 61 70 43  ->p1]);.  p->apC
1b700 73 72 5b 70 4f 70 2d 3e 70 31 5d 20 3d 20 30 3b  sr[pOp->p1] = 0;
1b710 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
1b720 4f 70 63 6f 64 65 3a 20 53 65 65 6b 47 65 20 50  Opcode: SeekGe P
1b730 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a  1 P2 P3 P4 *.**.
1b740 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31 20  ** If cursor P1 
1b750 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c  refers to an SQL
1b760 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74   table (B-Tree t
1b770 68 61 74 20 75 73 65 73 20 69 6e 74 65 67 65 72  hat uses integer
1b780 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20   keys), .** use 
1b790 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
1b7a0 69 73 74 65 72 20 50 33 20 61 73 20 74 68 65 20  ister P3 as the 
1b7b0 6b 65 79 2e 20 20 49 66 20 63 75 72 73 6f 72 20  key.  If cursor 
1b7c0 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f  P1 refers .** to
1b7d0 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74   an SQL index, t
1b7e0 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66 69  hen P3 is the fi
1b7f0 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20  rst in an array 
1b800 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20  of P4 registers 
1b810 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73 65  .** that are use
1b820 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64  d as an unpacked
1b830 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a   index key. .**.
1b840 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75  ** Reposition cu
1b850 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20  rsor P1 so that 
1b860 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
1b870 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72 79  e smallest entry
1b880 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72 65   that .** is gre
1b890 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
1b8a0 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61  al to the key va
1b8b0 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72  lue. If there ar
1b8c0 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a 2a 2a  e no records .**
1b8d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
1b8e0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65   equal to the ke
1b8f0 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74 20  y and P2 is not 
1b900 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20  zero, then jump 
1b910 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  to P2..**.** See
1b920 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f   also: Found, No
1b930 74 46 6f 75 6e 64 2c 20 44 69 73 74 69 6e 63 74  tFound, Distinct
1b940 2c 20 53 65 65 6b 4c 74 2c 20 53 65 65 6b 47 74  , SeekLt, SeekGt
1b950 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f  , SeekLe.*/./* O
1b960 70 63 6f 64 65 3a 20 53 65 65 6b 47 74 20 50 31  pcode: SeekGt P1
1b970 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a   P2 P3 P4 *.**.*
1b980 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72  * If cursor P1 r
1b990 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20  efers to an SQL 
1b9a0 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68  table (B-Tree th
1b9b0 61 74 20 75 73 65 73 20 69 6e 74 65 67 65 72 20  at uses integer 
1b9c0 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74  keys), .** use t
1b9d0 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
1b9e0 73 74 65 72 20 50 33 20 61 73 20 61 20 6b 65 79  ster P3 as a key
1b9f0 2e 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72  . If cursor P1 r
1ba00 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20  efers .** to an 
1ba10 53 51 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20  SQL index, then 
1ba20 50 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20  P3 is the first 
1ba30 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 50  in an array of P
1ba40 34 20 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20  4 registers .** 
1ba50 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73  that are used as
1ba60 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64   an unpacked ind
1ba70 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52  ex key. .**.** R
1ba80 65 70 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f 72  eposition cursor
1ba90 20 50 31 20 73 6f 20 74 68 61 74 20 20 69 74 20   P1 so that  it 
1baa0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d  points to the sm
1bab0 61 6c 6c 65 73 74 20 65 6e 74 72 79 20 74 68 61  allest entry tha
1bac0 74 20 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  t .** is greater
1bad0 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61   than the key va
1bae0 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72  lue. If there ar
1baf0 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 67 72 65  e no records gre
1bb00 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 74 68  ater than .** th
1bb10 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20  e key and P2 is 
1bb20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a  not zero, then j
1bb30 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a  ump to P2..**.**
1bb40 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64   See also: Found
1bb50 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73 74  , NotFound, Dist
1bb60 69 6e 63 74 2c 20 53 65 65 6b 4c 74 2c 20 53 65  inct, SeekLt, Se
1bb70 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a  ekGe, SeekLe.*/.
1bb80 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c  /* Opcode: SeekL
1bb90 74 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 20  t P1 P2 P3 P4 * 
1bba0 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  .**.** If cursor
1bbb0 20 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e   P1 refers to an
1bbc0 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72   SQL table (B-Tr
1bbd0 65 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74  ee that uses int
1bbe0 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20  eger keys), .** 
1bbf0 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  use the value in
1bc00 20 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20   register P3 as 
1bc10 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72  a key. If cursor
1bc20 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74   P1 refers .** t
1bc30 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20  o an SQL index, 
1bc40 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66  then P3 is the f
1bc50 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
1bc60 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73   of P4 registers
1bc70 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73   .** that are us
1bc80 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65  ed as an unpacke
1bc90 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a  d index key. .**
1bca0 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63  .** Reposition c
1bcb0 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
1bcc0 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74    it points to t
1bcd0 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79  he largest entry
1bce0 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 6c 65 73   that .** is les
1bcf0 73 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76  s than the key v
1bd00 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61  alue. If there a
1bd10 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 6c 65  re no records le
1bd20 73 73 20 74 68 61 6e 20 0a 2a 2a 20 74 68 65 20  ss than .** the 
1bd30 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f  key and P2 is no
1bd40 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d  t zero, then jum
1bd50 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53  p to P2..**.** S
1bd60 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20  ee also: Found, 
1bd70 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73 74 69 6e  NotFound, Distin
1bd80 63 74 2c 20 53 65 65 6b 47 74 2c 20 53 65 65 6b  ct, SeekGt, Seek
1bd90 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a  Ge, SeekLe.*/./*
1bda0 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c 65 20   Opcode: SeekLe 
1bdb0 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a  P1 P2 P3 P4 *.**
1bdc0 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31  .** If cursor P1
1bdd0 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51   refers to an SQ
1bde0 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20  L table (B-Tree 
1bdf0 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67 65  that uses intege
1be00 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65  r keys), .** use
1be10 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
1be20 67 69 73 74 65 72 20 50 33 20 61 73 20 61 20 6b  gister P3 as a k
1be30 65 79 2e 20 49 66 20 63 75 72 73 6f 72 20 50 31  ey. If cursor P1
1be40 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61   refers .** to a
1be50 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68 65  n SQL index, the
1be60 6e 20 50 33 20 69 73 20 74 68 65 20 66 69 72 73  n P3 is the firs
1be70 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  t in an array of
1be80 20 50 34 20 72 65 67 69 73 74 65 72 73 20 0a 2a   P4 registers .*
1be90 2a 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  * that are used 
1bea0 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69  as an unpacked i
1beb0 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a  ndex key. .**.**
1bec0 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72 73   Reposition curs
1bed0 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 69 74  or P1 so that it
1bee0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
1bef0 61 72 67 65 73 74 20 65 6e 74 72 79 20 74 68 61  argest entry tha
1bf00 74 20 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68  t .** is less th
1bf10 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
1bf20 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66  he key value. If
1bf30 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65   there are no re
1bf40 63 6f 72 64 73 20 0a 2a 2a 20 6c 65 73 73 20 74  cords .** less t
1bf50 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1bf60 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69  the key and P2 i
1bf70 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
1bf80 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a   jump to P2..**.
1bf90 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
1bfa0 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69  nd, NotFound, Di
1bfb0 73 74 69 6e 63 74 2c 20 53 65 65 6b 47 74 2c 20  stinct, SeekGt, 
1bfc0 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c 74 0a 2a  SeekGe, SeekLt.*
1bfd0 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 4c 74  /.case OP_SeekLt
1bfe0 3a 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d  :         /* jum
1bff0 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  p, in3 */.case O
1c000 50 5f 53 65 65 6b 4c 65 3a 20 20 20 20 20 20 20  P_SeekLe:       
1c010 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
1c020 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 47 65  /.case OP_SeekGe
1c030 3a 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d  :         /* jum
1c040 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  p, in3 */.case O
1c050 50 5f 53 65 65 6b 47 74 3a 20 7b 20 20 20 20 20  P_SeekGt: {     
1c060 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
1c070 2f 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69  /.  int res;.  i
1c080 6e 74 20 6f 63 3b 0a 20 20 56 64 62 65 43 75 72  nt oc;.  VdbeCur
1c090 73 6f 72 20 2a 70 43 3b 0a 20 20 55 6e 70 61 63  sor *pC;.  Unpac
1c0a0 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a 20 20 69  kedRecord r;.  i
1c0b0 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 36 34  nt nField;.  i64
1c0c0 20 69 4b 65 79 3b 20 20 20 20 20 20 2f 2a 20 54   iKey;      /* T
1c0d0 68 65 20 72 6f 77 69 64 20 77 65 20 61 72 65 20  he rowid we are 
1c0e0 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 0a 20  to seek to */.. 
1c0f0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
1c100 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
1c110 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61  ->nCursor );.  a
1c120 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 21 3d  ssert( pOp->p2!=
1c130 30 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  0 );.  pC = p->a
1c140 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
1c150 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
1c160 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
1c170 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67 3d 3d  pseudoTableReg==
1c180 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f  0 );.  assert( O
1c190 50 5f 53 65 65 6b 4c 65 20 3d 3d 20 4f 50 5f 53  P_SeekLe == OP_S
1c1a0 65 65 6b 4c 74 2b 31 20 29 3b 0a 20 20 61 73 73  eekLt+1 );.  ass
1c1b0 65 72 74 28 20 4f 50 5f 53 65 65 6b 47 65 20 3d  ert( OP_SeekGe =
1c1c0 3d 20 4f 50 5f 53 65 65 6b 4c 74 2b 32 20 29 3b  = OP_SeekLt+2 );
1c1d0 0a 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65  .  assert( OP_Se
1c1e0 65 6b 47 74 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c  ekGt == OP_SeekL
1c1f0 74 2b 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t+3 );.  assert(
1c200 20 70 43 2d 3e 69 73 4f 72 64 65 72 65 64 20 29   pC->isOrdered )
1c210 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
1c220 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 29 20 29  C->pCursor!=0) )
1c230 7b 0a 20 20 20 20 6f 63 20 3d 20 70 4f 70 2d 3e  {.    oc = pOp->
1c240 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70 43 2d 3e  opcode;.    pC->
1c250 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 20  nullRow = 0;.   
1c260 20 69 66 28 20 70 43 2d 3e 69 73 54 61 62 6c 65   if( pC->isTable
1c270 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
1c280 20 69 6e 70 75 74 20 76 61 6c 75 65 20 69 6e 20   input value in 
1c290 50 33 20 6d 69 67 68 74 20 62 65 20 6f 66 20 61  P3 might be of a
1c2a0 6e 79 20 74 79 70 65 3a 20 69 6e 74 65 67 65 72  ny type: integer
1c2b0 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e 67 2c 0a  , real, string,.
1c2c0 20 20 20 20 20 20 2a 2a 20 62 6c 6f 62 2c 20 6f        ** blob, o
1c2d0 72 20 4e 55 4c 4c 2e 20 20 42 75 74 20 69 74 20  r NULL.  But it 
1c2e0 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6e 20 69  needs to be an i
1c2f0 6e 74 65 67 65 72 20 62 65 66 6f 72 65 20 77 65  nteger before we
1c300 20 63 61 6e 20 64 6f 0a 20 20 20 20 20 20 2a 2a   can do.      **
1c310 20 74 68 65 20 73 65 65 6b 2c 20 73 6f 20 63 6f   the seek, so co
1c320 76 65 72 74 20 69 74 2e 20 2a 2f 0a 20 20 20 20  vert it. */.    
1c330 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
1c340 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20 61  Op->p3];.      a
1c350 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e  pplyNumericAffin
1c360 69 74 79 28 70 49 6e 33 29 3b 0a 20 20 20 20 20  ity(pIn3);.     
1c370 20 69 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56   iKey = sqlite3V
1c380 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 33  dbeIntValue(pIn3
1c390 29 3b 0a 20 20 20 20 20 20 70 43 2d 3e 72 6f 77  );.      pC->row
1c3a0 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 0a  idIsValid = 0;..
1c3b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1c3c0 50 33 20 76 61 6c 75 65 20 63 6f 75 6c 64 20 6e  P3 value could n
1c3d0 6f 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ot be converted 
1c3e0 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  into an integer 
1c3f0 77 69 74 68 6f 75 74 0a 20 20 20 20 20 20 2a 2a  without.      **
1c400 20 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72 6d 61   loss of informa
1c410 74 69 6f 6e 2c 20 74 68 65 6e 20 73 70 65 63 69  tion, then speci
1c420 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  al processing is
1c430 20 72 65 71 75 69 72 65 64 2e 2e 2e 20 2a 2f 0a   required... */.
1c440 20 20 20 20 20 20 69 66 28 20 28 70 49 6e 33 2d        if( (pIn3-
1c450 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
1c460 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1c470 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73  if( (pIn3->flags
1c480 20 26 20 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20   & MEM_Real)==0 
1c490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1c4a0 49 66 20 74 68 65 20 50 33 20 76 61 6c 75 65 20  If the P3 value 
1c4b0 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72  cannot be conver
1c4c0 74 65 64 20 69 6e 74 6f 20 61 6e 79 20 6b 69 6e  ted into any kin
1c4d0 64 20 6f 66 20 61 20 6e 75 6d 62 65 72 2c 0a 20  d of a number,. 
1c4e0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e           ** then
1c4f0 20 74 68 65 20 73 65 65 6b 20 69 73 20 6e 6f 74   the seek is not
1c500 20 70 6f 73 73 69 62 6c 65 2c 20 73 6f 20 6a 75   possible, so ju
1c510 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20 20 20 20  mp to P2 */.    
1c520 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e        pc = pOp->
1c530 70 32 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  p2 - 1;.        
1c540 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1c550 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66   }.        /* If
1c560 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
1c570 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 50  oint, then the P
1c580 33 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20  3 value must be 
1c590 61 20 66 6c 6f 61 74 69 6e 67 0a 20 20 20 20 20  a floating.     
1c5a0 20 20 20 2a 2a 20 70 6f 69 6e 74 20 6e 75 6d 62     ** point numb
1c5b0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  er. */.        a
1c5c0 73 73 65 72 74 28 20 28 70 49 6e 33 2d 3e 66 6c  ssert( (pIn3->fl
1c5d0 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21  ags & MEM_Real)!
1c5e0 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  =0 );..        i
1c5f0 66 28 20 69 4b 65 79 3d 3d 53 4d 41 4c 4c 45 53  f( iKey==SMALLES
1c600 54 5f 49 4e 54 36 34 20 26 26 20 28 70 49 6e 33  T_INT64 && (pIn3
1c610 2d 3e 72 3c 28 64 6f 75 62 6c 65 29 69 4b 65 79  ->r<(double)iKey
1c620 20 7c 7c 20 70 49 6e 33 2d 3e 72 3e 30 29 20 29   || pIn3->r>0) )
1c630 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
1c640 68 65 20 50 33 20 76 61 6c 75 65 20 69 73 20 74  he P3 value is t
1c650 6f 6f 20 6c 61 72 67 65 20 69 6e 20 6d 61 67 6e  oo large in magn
1c660 69 74 75 64 65 20 74 6f 20 62 65 20 65 78 70 72  itude to be expr
1c670 65 73 73 65 64 20 61 73 20 61 6e 0a 20 20 20 20  essed as an.    
1c680 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72        ** integer
1c690 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1c6a0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
1c6b0 20 20 69 66 28 20 70 49 6e 33 2d 3e 72 3c 30 20    if( pIn3->r<0 
1c6c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
1c6d0 66 28 20 6f 63 3e 3d 4f 50 5f 53 65 65 6b 47 65  f( oc>=OP_SeekGe
1c6e0 20 29 7b 20 20 61 73 73 65 72 74 28 20 6f 63 3d   ){  assert( oc=
1c6f0 3d 4f 50 5f 53 65 65 6b 47 65 20 7c 7c 20 6f 63  =OP_SeekGe || oc
1c700 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20  ==OP_SeekGt );. 
1c710 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
1c720 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  = sqlite3BtreeFi
1c730 72 73 74 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c  rst(pC->pCursor,
1c740 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20   &res);.        
1c750 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1c760 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
1c770 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
1c780 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  r;.            }
1c790 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1c7a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
1c7b0 28 20 6f 63 3c 3d 4f 50 5f 53 65 65 6b 4c 65 20  ( oc<=OP_SeekLe 
1c7c0 29 7b 20 20 61 73 73 65 72 74 28 20 6f 63 3d 3d  ){  assert( oc==
1c7d0 4f 50 5f 53 65 65 6b 4c 74 20 7c 7c 20 6f 63 3d  OP_SeekLt || oc=
1c7e0 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20  =OP_SeekLe );.  
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1c800 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
1c810 74 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26  t(pC->pCursor, &
1c820 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  res);.          
1c830 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c840 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f  TE_OK ) goto abo
1c850 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
1c860 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1c870 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c880 20 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a       if( res ){.
1c890 20 20 20 20 20 20 20 20 20 20 20 20 70 63 20 3d              pc =
1c8a0 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
1c8b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c8c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c8d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 63 3d     }else if( oc=
1c8e0 3d 4f 50 5f 53 65 65 6b 4c 74 20 7c 7c 20 6f 63  =OP_SeekLt || oc
1c8f0 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 7b 0a 20  ==OP_SeekGe ){. 
1c900 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
1c910 74 68 65 20 63 65 69 6c 69 6e 67 28 29 20 66 75  the ceiling() fu
1c920 6e 63 74 69 6f 6e 20 74 6f 20 63 6f 6e 76 65 72  nction to conver
1c930 74 20 72 65 61 6c 2d 3e 69 6e 74 20 2a 2f 0a 20  t real->int */. 
1c940 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e           if( pIn
1c950 33 2d 3e 72 20 3e 20 28 64 6f 75 62 6c 65 29 69  3->r > (double)i
1c960 4b 65 79 20 29 20 69 4b 65 79 2b 2b 3b 0a 20 20  Key ) iKey++;.  
1c970 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c980 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
1c990 65 20 66 6c 6f 6f 72 28 29 20 66 75 6e 63 74 69  e floor() functi
1c9a0 6f 6e 20 74 6f 20 63 6f 6e 76 65 72 74 20 72 65  on to convert re
1c9b0 61 6c 2d 3e 69 6e 74 20 2a 2f 0a 20 20 20 20 20  al->int */.     
1c9c0 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 3d       assert( oc=
1c9d0 3d 4f 50 5f 53 65 65 6b 4c 65 20 7c 7c 20 6f 63  =OP_SeekLe || oc
1c9e0 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20  ==OP_SeekGt );. 
1c9f0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e           if( pIn
1ca00 33 2d 3e 72 20 3c 20 28 64 6f 75 62 6c 65 29 69  3->r < (double)i
1ca10 4b 65 79 20 29 20 69 4b 65 79 2d 2d 3b 0a 20 20  Key ) iKey--;.  
1ca20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
1ca30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1ca40 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
1ca50 70 61 63 6b 65 64 28 70 43 2d 3e 70 43 75 72 73  packed(pC->pCurs
1ca60 6f 72 2c 20 30 2c 20 28 75 36 34 29 69 4b 65 79  or, 0, (u64)iKey
1ca70 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  , 0, &res);.    
1ca80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ca90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1caa0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1cab0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a  _error;.      }.
1cac0 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
1cad0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e   ){.        pC->
1cae0 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 31  rowidIsValid = 1
1caf0 3b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 6c 61  ;.        pC->la
1cb00 73 74 52 6f 77 69 64 20 3d 20 69 4b 65 79 3b 0a  stRowid = iKey;.
1cb10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1cb20 65 7b 0a 20 20 20 20 20 20 6e 46 69 65 6c 64 20  e{.      nField 
1cb30 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20  = pOp->p4.i;.   
1cb40 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
1cb50 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32  p4type==P4_INT32
1cb60 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1cb70 28 20 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20  ( nField>0 );.  
1cb80 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d      r.pKeyInfo =
1cb90 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20   pC->pKeyInfo;. 
1cba0 20 20 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20       r.nField = 
1cbb0 28 75 31 36 29 6e 46 69 65 6c 64 3b 0a 0a 20 20  (u16)nField;..  
1cbc0 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
1cbd0 6c 69 6e 65 20 6f 66 20 63 6f 64 65 20 63 6f 6d  line of code com
1cbe0 70 75 74 65 73 20 61 73 20 66 6f 6c 6c 6f 77 73  putes as follows
1cbf0 2c 20 6f 6e 6c 79 20 66 61 73 74 65 72 3a 0a 20  , only faster:. 
1cc00 20 20 20 20 20 2a 2a 20 20 20 69 66 28 20 6f 63       **   if( oc
1cc10 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 7c 7c 20 6f  ==OP_SeekGt || o
1cc20 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 7b 0a  c==OP_SeekLe ){.
1cc30 20 20 20 20 20 20 2a 2a 20 20 20 20 20 72 2e 66        **     r.f
1cc40 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f  lags = UNPACKED_
1cc50 49 4e 43 52 4b 45 59 3b 0a 20 20 20 20 20 20 2a  INCRKEY;.      *
1cc60 2a 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20  *   }else{.     
1cc70 20 2a 2a 20 20 20 20 20 72 2e 66 6c 61 67 73 20   **     r.flags 
1cc80 3d 20 30 3b 0a 20 20 20 20 20 20 2a 2a 20 20 20  = 0;.      **   
1cc90 7d 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  }.      */.     
1cca0 20 72 2e 66 6c 61 67 73 20 3d 20 28 75 38 29 28   r.flags = (u8)(
1ccb0 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59  UNPACKED_INCRKEY
1ccc0 20 2a 20 28 31 20 26 20 28 6f 63 20 2d 20 4f 50   * (1 & (oc - OP
1ccd0 5f 53 65 65 6b 4c 74 29 29 29 3b 0a 20 20 20 20  _SeekLt)));.    
1cce0 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50    assert( oc!=OP
1ccf0 5f 53 65 65 6b 47 74 20 7c 7c 20 72 2e 66 6c 61  _SeekGt || r.fla
1cd00 67 73 3d 3d 55 4e 50 41 43 4b 45 44 5f 49 4e 43  gs==UNPACKED_INC
1cd10 52 4b 45 59 20 29 3b 0a 20 20 20 20 20 20 61 73  RKEY );.      as
1cd20 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65  sert( oc!=OP_See
1cd30 6b 4c 65 20 7c 7c 20 72 2e 66 6c 61 67 73 3d 3d  kLe || r.flags==
1cd40 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59  UNPACKED_INCRKEY
1cd50 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1cd60 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 47 65 20  ( oc!=OP_SeekGe 
1cd70 7c 7c 20 72 2e 66 6c 61 67 73 3d 3d 30 20 29 3b  || r.flags==0 );
1cd80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
1cd90 63 21 3d 4f 50 5f 53 65 65 6b 4c 74 20 7c 7c 20  c!=OP_SeekLt || 
1cda0 72 2e 66 6c 61 67 73 3d 3d 30 20 29 3b 0a 0a 20  r.flags==0 );.. 
1cdb0 20 20 20 20 20 72 2e 61 4d 65 6d 20 3d 20 26 61       r.aMem = &a
1cdc0 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 23 69  Mem[pOp->p3];.#i
1cdd0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1cde0 47 0a 20 20 20 20 20 20 7b 20 69 6e 74 20 69 3b  G.      { int i;
1cdf0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 2e 6e 46   for(i=0; i<r.nF
1ce00 69 65 6c 64 3b 20 69 2b 2b 29 20 61 73 73 65 72  ield; i++) asser
1ce10 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 72  t( memIsValid(&r
1ce20 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23  .aMem[i]) ); }.#
1ce30 65 6e 64 69 66 0a 20 20 20 20 20 20 45 78 70 61  endif.      Expa
1ce40 6e 64 42 6c 6f 62 28 72 2e 61 4d 65 6d 29 3b 0a  ndBlob(r.aMem);.
1ce50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ce60 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
1ce70 61 63 6b 65 64 28 70 43 2d 3e 70 43 75 72 73 6f  acked(pC->pCurso
1ce80 72 2c 20 26 72 2c 20 30 2c 20 30 2c 20 26 72 65  r, &r, 0, 0, &re
1ce90 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
1cea0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ceb0 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72         goto abor
1cec0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
1ced0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
1cee0 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d  ->rowidIsValid =
1cef0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43   0;.    }.    pC
1cf00 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
1cf10 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61   = 0;.    pC->ca
1cf20 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
1cf30 45 5f 53 54 41 4c 45 3b 0a 23 69 66 64 65 66 20  E_STALE;.#ifdef 
1cf40 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
1cf50 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
1cf60 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  ount++;.#endif. 
1cf70 20 20 20 69 66 28 20 6f 63 3e 3d 4f 50 5f 53 65     if( oc>=OP_Se
1cf80 65 6b 47 65 20 29 7b 20 20 61 73 73 65 72 74 28  ekGe ){  assert(
1cf90 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 7c   oc==OP_SeekGe |
1cfa0 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 74 20  | oc==OP_SeekGt 
1cfb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  );.      if( res
1cfc0 3c 30 20 7c 7c 20 28 72 65 73 3d 3d 30 20 26 26  <0 || (res==0 &&
1cfd0 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 74 29 20   oc==OP_SeekGt) 
1cfe0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1cff0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
1d000 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72  (pC->pCursor, &r
1d010 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
1d020 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d030 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
1d040 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
1d050 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c    pC->rowidIsVal
1d060 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  id = 0;.      }e
1d070 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73  lse{.        res
1d080 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1d090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1d0a0 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65  ssert( oc==OP_Se
1d0b0 65 6b 4c 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53  ekLt || oc==OP_S
1d0c0 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 20 20 69  eekLe );.      i
1d0d0 66 28 20 72 65 73 3e 30 20 7c 7c 20 28 72 65 73  f( res>0 || (res
1d0e0 3d 3d 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53 65  ==0 && oc==OP_Se
1d0f0 65 6b 4c 74 29 20 29 7b 0a 20 20 20 20 20 20 20  ekLt) ){.       
1d100 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1d110 65 65 50 72 65 76 69 6f 75 73 28 70 43 2d 3e 70  eePrevious(pC->p
1d120 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20  Cursor, &res);. 
1d130 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1d140 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1d150 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
1d160 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e  or;.        pC->
1d170 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30  rowidIsValid = 0
1d180 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1d190 20 20 20 20 20 20 20 2f 2a 20 72 65 73 20 6d 69         /* res mi
1d1a0 67 68 74 20 62 65 20 6e 65 67 61 74 69 76 65 20  ght be negative 
1d1b0 62 65 63 61 75 73 65 20 74 68 65 20 74 61 62 6c  because the tabl
1d1c0 65 20 69 73 20 65 6d 70 74 79 2e 20 20 43 68 65  e is empty.  Che
1d1d0 63 6b 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  ck to.        **
1d1e0 20 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20   see if this is 
1d1f0 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 20 20  the case..      
1d200 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73    */.        res
1d210 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 45   = sqlite3BtreeE
1d220 6f 66 28 70 43 2d 3e 70 43 75 72 73 6f 72 29 3b  of(pC->pCursor);
1d230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d240 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
1d250 70 32 3e 30 20 29 3b 0a 20 20 20 20 69 66 28 20  p2>0 );.    if( 
1d260 72 65 73 20 29 7b 0a 20 20 20 20 20 20 70 63 20  res ){.      pc 
1d270 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
1d280 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1d290 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
1d2a0 73 20 77 68 65 6e 20 61 74 74 65 6d 70 74 69 6e  s when attemptin
1d2b0 67 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 73 71  g to open the sq
1d2c0 6c 69 74 65 33 5f 6d 61 73 74 65 72 20 74 61 62  lite3_master tab
1d2d0 6c 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 72 65  le.    ** for re
1d2e0 61 64 20 61 63 63 65 73 73 20 72 65 74 75 72 6e  ad access return
1d2f0 73 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 2e 20  s SQLITE_EMPTY. 
1d300 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 77  In this case alw
1d310 61 79 73 0a 20 20 20 20 2a 2a 20 74 61 6b 65 20  ays.    ** take 
1d320 74 68 65 20 6a 75 6d 70 20 28 73 69 6e 63 65 20  the jump (since 
1d330 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63  there are no rec
1d340 6f 72 64 73 20 69 6e 20 74 68 65 20 74 61 62 6c  ords in the tabl
1d350 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  e)..    */.    p
1d360 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
1d370 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
1d380 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b  ./* Opcode: Seek
1d390 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
1d3a0 2a 2a 20 50 31 20 69 73 20 61 6e 20 6f 70 65 6e  ** P1 is an open
1d3b0 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 61 6e   table cursor an
1d3c0 64 20 50 32 20 69 73 20 61 20 72 6f 77 69 64 20  d P2 is a rowid 
1d3d0 69 6e 74 65 67 65 72 2e 20 20 41 72 72 61 6e 67  integer.  Arrang
1d3e0 65 0a 2a 2a 20 66 6f 72 20 50 31 20 74 6f 20 6d  e.** for P1 to m
1d3f0 6f 76 65 20 73 6f 20 74 68 61 74 20 69 74 20 70  ove so that it p
1d400 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 6f 77  oints to the row
1d410 69 64 20 67 69 76 65 6e 20 62 79 20 50 32 2e 0a  id given by P2..
1d420 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 63  **.** This is ac
1d430 74 75 61 6c 6c 79 20 61 20 64 65 66 65 72 72 65  tually a deferre
1d440 64 20 73 65 65 6b 2e 20 20 4e 6f 74 68 69 6e 67  d seek.  Nothing
1d450 20 61 63 74 75 61 6c 6c 79 20 68 61 70 70 65 6e   actually happen
1d460 73 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 63  s until.** the c
1d470 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 74 6f  ursor is used to
1d480 20 72 65 61 64 20 61 20 72 65 63 6f 72 64 2e 20   read a record. 
1d490 20 54 68 61 74 20 77 61 79 2c 20 69 66 20 6e 6f   That way, if no
1d4a0 20 72 65 61 64 73 0a 2a 2a 20 6f 63 63 75 72 2c   reads.** occur,
1d4b0 20 6e 6f 20 75 6e 6e 65 63 65 73 73 61 72 79 20   no unnecessary 
1d4c0 49 2f 4f 20 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a  I/O happens..*/.
1d4d0 63 61 73 65 20 4f 50 5f 53 65 65 6b 3a 20 7b 20  case OP_Seek: { 
1d4e0 20 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56     /* in2 */.  V
1d4f0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 0a  dbeCursor *pC;..
1d500 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1d510 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
1d520 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
1d530 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
1d540 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
1d550 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( pC!=0 );.  if(
1d560 20 41 4c 57 41 59 53 28 70 43 2d 3e 70 43 75 72   ALWAYS(pC->pCur
1d570 73 6f 72 21 3d 30 29 20 29 7b 0a 20 20 20 20 61  sor!=0) ){.    a
1d580 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62  ssert( pC->isTab
1d590 6c 65 20 29 3b 0a 20 20 20 20 70 43 2d 3e 6e 75  le );.    pC->nu
1d5a0 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70  llRow = 0;.    p
1d5b0 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In2 = &aMem[pOp-
1d5c0 3e 70 32 5d 3b 0a 20 20 20 20 70 43 2d 3e 6d 6f  >p2];.    pC->mo
1d5d0 76 65 74 6f 54 61 72 67 65 74 20 3d 20 73 71 6c  vetoTarget = sql
1d5e0 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65  ite3VdbeIntValue
1d5f0 28 70 49 6e 32 29 3b 0a 20 20 20 20 70 43 2d 3e  (pIn2);.    pC->
1d600 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30  rowidIsValid = 0
1d610 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72  ;.    pC->deferr
1d620 65 64 4d 6f 76 65 74 6f 20 3d 20 31 3b 0a 20 20  edMoveto = 1;.  
1d630 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 20 20 0a  }.  break;.}.  .
1d640 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6f 75 6e  ./* Opcode: Foun
1d650 64 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  d P1 P2 P3 P4 *.
1d660 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d 3d 30 20 74  **.** If P4==0 t
1d670 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33 20  hen register P3 
1d680 68 6f 6c 64 73 20 61 20 62 6c 6f 62 20 63 6f 6e  holds a blob con
1d690 73 74 72 75 63 74 65 64 20 62 79 20 4d 61 6b 65  structed by Make
1d6a0 52 65 63 6f 72 64 2e 20 20 49 66 0a 2a 2a 20 50  Record.  If.** P
1d6b0 34 3e 30 20 74 68 65 6e 20 72 65 67 69 73 74 65  4>0 then registe
1d6c0 72 20 50 33 20 69 73 20 74 68 65 20 66 69 72 73  r P3 is the firs
1d6d0 74 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72  t of P4 register
1d6e0 73 20 74 68 61 74 20 66 6f 72 6d 20 61 6e 20 75  s that form an u
1d6f0 6e 70 61 63 6b 65 64 0a 2a 2a 20 72 65 63 6f 72  npacked.** recor
1d700 64 2e 0a 2a 2a 0a 2a 2a 20 43 75 72 73 6f 72 20  d..**.** Cursor 
1d710 50 31 20 69 73 20 6f 6e 20 61 6e 20 69 6e 64 65  P1 is on an inde
1d720 78 20 62 74 72 65 65 2e 20 20 49 66 20 74 68 65  x btree.  If the
1d730 20 72 65 63 6f 72 64 20 69 64 65 6e 74 69 66 69   record identifi
1d740 65 64 20 62 79 20 50 33 20 61 6e 64 20 50 34 0a  ed by P3 and P4.
1d750 2a 2a 20 69 73 20 61 20 70 72 65 66 69 78 20 6f  ** is a prefix o
1d760 66 20 61 6e 79 20 65 6e 74 72 79 20 69 6e 20 50  f any entry in P
1d770 31 20 74 68 65 6e 20 61 20 6a 75 6d 70 20 69 73  1 then a jump is
1d780 20 6d 61 64 65 20 74 6f 20 50 32 20 61 6e 64 0a   made to P2 and.
1d790 2a 2a 20 50 31 20 69 73 20 6c 65 66 74 20 70 6f  ** P1 is left po
1d7a0 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6d 61  inting at the ma
1d7b0 74 63 68 69 6e 67 20 65 6e 74 72 79 2e 0a 2a 2f  tching entry..*/
1d7c0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 46  ./* Opcode: NotF
1d7d0 6f 75 6e 64 20 50 31 20 50 32 20 50 33 20 50 34  ound P1 P2 P3 P4
1d7e0 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d 3d   *.**.** If P4==
1d7f0 30 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20  0 then register 
1d800 50 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f 62 20  P3 holds a blob 
1d810 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 4d  constructed by M
1d820 61 6b 65 52 65 63 6f 72 64 2e 20 20 49 66 0a 2a  akeRecord.  If.*
1d830 2a 20 50 34 3e 30 20 74 68 65 6e 20 72 65 67 69  * P4>0 then regi
1d840 73 74 65 72 20 50 33 20 69 73 20 74 68 65 20 66  ster P3 is the f
1d850 69 72 73 74 20 6f 66 20 50 34 20 72 65 67 69 73  irst of P4 regis
1d860 74 65 72 73 20 74 68 61 74 20 66 6f 72 6d 20 61  ters that form a
1d870 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 72 65  n unpacked.** re
1d880 63 6f 72 64 2e 0a 2a 2a 20 0a 2a 2a 20 43 75 72  cord..** .** Cur
1d890 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61 6e 20  sor P1 is on an 
1d8a0 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20 49 66  index btree.  If
1d8b0 20 74 68 65 20 72 65 63 6f 72 64 20 69 64 65 6e   the record iden
1d8c0 74 69 66 69 65 64 20 62 79 20 50 33 20 61 6e 64  tified by P3 and
1d8d0 20 50 34 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68   P4.** is not th
1d8e0 65 20 70 72 65 66 69 78 20 6f 66 20 61 6e 79 20  e prefix of any 
1d8f0 65 6e 74 72 79 20 69 6e 20 50 31 20 74 68 65 6e  entry in P1 then
1d900 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20   a jump is made 
1d910 74 6f 20 50 32 2e 20 20 49 66 20 50 31 20 0a 2a  to P2.  If P1 .*
1d920 2a 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61  * does contain a
1d930 6e 20 65 6e 74 72 79 20 77 68 6f 73 65 20 70 72  n entry whose pr
1d940 65 66 69 78 20 6d 61 74 63 68 65 73 20 74 68 65  efix matches the
1d950 20 50 33 2f 50 34 20 72 65 63 6f 72 64 20 74 68   P3/P4 record th
1d960 65 6e 20 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 66 61  en control.** fa
1d970 6c 6c 73 20 74 68 72 6f 75 67 68 20 74 6f 20 74  lls through to t
1d980 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
1d990 69 6f 6e 20 61 6e 64 20 50 31 20 69 73 20 6c 65  ion and P1 is le
1d9a0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  ft pointing at t
1d9b0 68 65 0a 2a 2a 20 6d 61 74 63 68 69 6e 67 20 65  he.** matching e
1d9c0 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ntry..**.** See 
1d9d0 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74  also: Found, Not
1d9e0 45 78 69 73 74 73 2c 20 49 73 55 6e 69 71 75 65  Exists, IsUnique
1d9f0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 46  .*/.case OP_NotF
1da00 6f 75 6e 64 3a 20 20 20 20 20 20 20 2f 2a 20 6a  ound:       /* j
1da10 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65  ump, in3 */.case
1da20 20 4f 50 5f 46 6f 75 6e 64 3a 20 7b 20 20 20 20   OP_Found: {    
1da30 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33      /* jump, in3
1da40 20 2a 2f 0a 20 20 69 6e 74 20 61 6c 72 65 61 64   */.  int alread
1da50 79 45 78 69 73 74 73 3b 0a 20 20 56 64 62 65 43  yExists;.  VdbeC
1da60 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e 74  ursor *pC;.  int
1da70 20 72 65 73 3b 0a 20 20 63 68 61 72 20 2a 70 46   res;.  char *pF
1da80 72 65 65 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  ree;.  UnpackedR
1da90 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 0a  ecord *pIdxKey;.
1daa0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1dab0 20 72 3b 0a 20 20 63 68 61 72 20 61 54 65 6d 70   r;.  char aTemp
1dac0 52 65 63 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  Rec[ROUND8(sizeo
1dad0 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
1dae0 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29  )) + sizeof(Mem)
1daf0 2a 33 20 2b 20 37 5d 3b 0a 0a 23 69 66 64 65 66  *3 + 7];..#ifdef
1db00 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
1db10 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75  qlite3_found_cou
1db20 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
1db30 61 6c 72 65 61 64 79 45 78 69 73 74 73 20 3d 20  alreadyExists = 
1db40 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  0;.  assert( pOp
1db50 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
1db60 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
1db70 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1db80 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32  p4type==P4_INT32
1db90 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
1dba0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
1dbb0 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
1dbc0 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b  .  pIn3 = &aMem[
1dbd0 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20  pOp->p3];.  if( 
1dbe0 41 4c 57 41 59 53 28 70 43 2d 3e 70 43 75 72 73  ALWAYS(pC->pCurs
1dbf0 6f 72 21 3d 30 29 20 29 7b 0a 0a 20 20 20 20 61  or!=0) ){..    a
1dc00 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62  ssert( pC->isTab
1dc10 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  le==0 );.    if(
1dc20 20 70 4f 70 2d 3e 70 34 2e 69 3e 30 20 29 7b 0a   pOp->p4.i>0 ){.
1dc30 20 20 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f        r.pKeyInfo
1dc40 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b   = pC->pKeyInfo;
1dc50 0a 20 20 20 20 20 20 72 2e 6e 46 69 65 6c 64 20  .      r.nField 
1dc60 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 34 2e 69  = (u16)pOp->p4.i
1dc70 3b 0a 20 20 20 20 20 20 72 2e 61 4d 65 6d 20 3d  ;.      r.aMem =
1dc80 20 70 49 6e 33 3b 0a 23 69 66 64 65 66 20 53 51   pIn3;.#ifdef SQ
1dc90 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
1dca0 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d   { int i; for(i=
1dcb0 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69  0; i<r.nField; i
1dcc0 2b 2b 29 20 61 73 73 65 72 74 28 20 6d 65 6d 49  ++) assert( memI
1dcd0 73 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69  sValid(&r.aMem[i
1dce0 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20  ]) ); }.#endif. 
1dcf0 20 20 20 20 20 72 2e 66 6c 61 67 73 20 3d 20 55       r.flags = U
1dd00 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d  NPACKED_PREFIX_M
1dd10 41 54 43 48 3b 0a 20 20 20 20 20 20 70 49 64 78  ATCH;.      pIdx
1dd20 4b 65 79 20 3d 20 26 72 3b 0a 20 20 20 20 7d 65  Key = &r;.    }e
1dd30 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 64 78 4b  lse{.      pIdxK
1dd40 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
1dd50 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
1dd60 6f 72 64 28 0a 20 20 20 20 20 20 20 20 20 20 70  ord(.          p
1dd70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 54 65  C->pKeyInfo, aTe
1dd80 6d 70 52 65 63 2c 20 73 69 7a 65 6f 66 28 61 54  mpRec, sizeof(aT
1dd90 65 6d 70 52 65 63 29 2c 20 26 70 46 72 65 65 0a  empRec), &pFree.
1dda0 20 20 20 20 20 20 29 3b 20 0a 20 20 20 20 20 20        ); .      
1ddb0 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29  if( pIdxKey==0 )
1ddc0 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
1ddd0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 33      assert( pIn3
1dde0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
1ddf0 6f 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ob );.      asse
1de00 72 74 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73  rt( (pIn3->flags
1de10 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20   & MEM_Zero)==0 
1de20 29 3b 20 20 2f 2a 20 7a 65 72 6f 62 6c 6f 62 73  );  /* zeroblobs
1de30 20 61 6c 72 65 61 64 79 20 65 78 70 61 6e 64 65   already expande
1de40 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  d */.      sqlit
1de50 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
1de60 63 6b 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c  ck(pC->pKeyInfo,
1de70 20 70 49 6e 33 2d 3e 6e 2c 20 70 49 6e 33 2d 3e   pIn3->n, pIn3->
1de80 7a 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  z, pIdxKey);.   
1de90 20 20 20 70 49 64 78 4b 65 79 2d 3e 66 6c 61 67     pIdxKey->flag
1dea0 73 20 7c 3d 20 55 4e 50 41 43 4b 45 44 5f 50 52  s |= UNPACKED_PR
1deb0 45 46 49 58 5f 4d 41 54 43 48 3b 0a 20 20 20 20  EFIX_MATCH;.    
1dec0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
1ded0 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
1dee0 61 63 6b 65 64 28 70 43 2d 3e 70 43 75 72 73 6f  acked(pC->pCurso
1def0 72 2c 20 70 49 64 78 4b 65 79 2c 20 30 2c 20 30  r, pIdxKey, 0, 0
1df00 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
1df10 20 70 4f 70 2d 3e 70 34 2e 69 3d 3d 30 20 29 7b   pOp->p4.i==0 ){
1df20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
1df30 46 72 65 65 28 64 62 2c 20 70 46 72 65 65 29 3b  Free(db, pFree);
1df40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1df50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1df60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1df70 20 7d 0a 20 20 20 20 61 6c 72 65 61 64 79 45 78   }.    alreadyEx
1df80 69 73 74 73 20 3d 20 28 72 65 73 3d 3d 30 29 3b  ists = (res==0);
1df90 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65  .    pC->deferre
1dfa0 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20  dMoveto = 0;.   
1dfb0 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
1dfc0 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
1dfd0 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f    }.  if( pOp->o
1dfe0 70 63 6f 64 65 3d 3d 4f 50 5f 46 6f 75 6e 64 20  pcode==OP_Found 
1dff0 29 7b 0a 20 20 20 20 69 66 28 20 61 6c 72 65 61  ){.    if( alrea
1e000 64 79 45 78 69 73 74 73 20 29 20 70 63 20 3d 20  dyExists ) pc = 
1e010 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d  pOp->p2 - 1;.  }
1e020 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 21 61  else{.    if( !a
1e030 6c 72 65 61 64 79 45 78 69 73 74 73 20 29 20 70  lreadyExists ) p
1e040 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
1e050 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
1e060 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 73 55 6e  ./* Opcode: IsUn
1e070 69 71 75 65 20 50 31 20 50 32 20 50 33 20 50 34  ique P1 P2 P3 P4
1e080 20 2a 0a 2a 2a 0a 2a 2a 20 43 75 72 73 6f 72 20   *.**.** Cursor 
1e090 50 31 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 6e  P1 is open on an
1e0a0 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2d 20   index b-tree - 
1e0b0 74 68 61 74 20 69 73 20 74 6f 20 73 61 79 2c 20  that is to say, 
1e0c0 61 20 62 74 72 65 65 20 77 68 69 63 68 0a 2a 2a  a btree which.**
1e0d0 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 77 68 65   no data and whe
1e0e0 72 65 20 74 68 65 20 6b 65 79 20 61 72 65 20 72  re the key are r
1e0f0 65 63 6f 72 64 73 20 67 65 6e 65 72 61 74 65 64  ecords generated
1e100 20 62 79 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   by OP_MakeRecor
1e110 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6c 69  d with.** the li
1e120 73 74 20 66 69 65 6c 64 20 62 65 69 6e 67 20 74  st field being t
1e130 68 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44  he integer ROWID
1e140 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74 68   of the entry th
1e150 61 74 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  at the index.** 
1e160 65 6e 74 72 79 20 72 65 66 65 72 73 20 74 6f 2e  entry refers to.
1e170 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 33 20 72 65  .**.** The P3 re
1e180 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 73 20  gister contains 
1e190 61 6e 20 69 6e 74 65 67 65 72 20 72 65 63 6f 72  an integer recor
1e1a0 64 20 6e 75 6d 62 65 72 2e 20 43 61 6c 6c 20 74  d number. Call t
1e1b0 68 69 73 20 72 65 63 6f 72 64 20 0a 2a 2a 20 6e  his record .** n
1e1c0 75 6d 62 65 72 20 52 2e 20 52 65 67 69 73 74 65  umber R. Registe
1e1d0 72 20 50 34 20 69 73 20 74 68 65 20 66 69 72 73  r P4 is the firs
1e1e0 74 20 69 6e 20 61 20 73 65 74 20 6f 66 20 4e 20  t in a set of N 
1e1f0 63 6f 6e 74 69 67 75 6f 75 73 20 72 65 67 69 73  contiguous regis
1e200 74 65 72 73 0a 2a 2a 20 74 68 61 74 20 6d 61 6b  ters.** that mak
1e210 65 20 75 70 20 61 6e 20 75 6e 70 61 63 6b 65 64  e up an unpacked
1e220 20 69 6e 64 65 78 20 6b 65 79 20 74 68 61 74 20   index key that 
1e230 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
1e240 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 20 54   cursor P1..** T
1e250 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 20 63 61  he value of N ca
1e260 6e 20 62 65 20 69 6e 66 65 72 72 65 64 20 66 72  n be inferred fr
1e270 6f 6d 20 74 68 65 20 63 75 72 73 6f 72 2e 20 4e  om the cursor. N
1e280 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 72 6f   includes the ro
1e290 77 69 64 0a 2a 2a 20 76 61 6c 75 65 20 61 70 70  wid.** value app
1e2a0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64  ended to the end
1e2b0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65   of the index re
1e2c0 63 6f 72 64 2e 20 54 68 69 73 20 72 6f 77 69 64  cord. This rowid
1e2d0 20 76 61 6c 75 65 20 6d 61 79 0a 2a 2a 20 6f 72   value may.** or
1e2e0 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20   may not be the 
1e2f0 73 61 6d 65 20 61 73 20 52 2e 0a 2a 2a 0a 2a 2a  same as R..**.**
1e300 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 4e   If any of the N
1e310 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e   registers begin
1e320 6e 69 6e 67 20 77 69 74 68 20 72 65 67 69 73 74  ning with regist
1e330 65 72 20 50 34 20 63 6f 6e 74 61 69 6e 73 20 61  er P4 contains a
1e340 20 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 75 65 2c 20   NULL.** value, 
1e350 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
1e360 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 4f 74   to P2..**.** Ot
1e370 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 69 6e  herwise, this in
1e380 73 74 72 75 63 74 69 6f 6e 20 63 68 65 63 6b 73  struction checks
1e390 20 69 66 20 63 75 72 73 6f 72 20 50 31 20 63 6f   if cursor P1 co
1e3a0 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74 72 79 0a  ntains an entry.
1e3b0 2a 2a 20 77 68 65 72 65 20 74 68 65 20 66 69 72  ** where the fir
1e3c0 73 74 20 28 4e 2d 31 29 20 66 69 65 6c 64 73 20  st (N-1) fields 
1e3d0 6d 61 74 63 68 20 62 75 74 20 74 68 65 20 72 6f  match but the ro
1e3e0 77 69 64 20 76 61 6c 75 65 20 61 74 20 74 68 65  wid value at the
1e3f0 20 65 6e 64 0a 2a 2a 20 6f 66 20 74 68 65 20 69   end.** of the i
1e400 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 6e 6f  ndex entry is no
1e410 74 20 52 2e 20 49 66 20 74 68 65 72 65 20 69 73  t R. If there is
1e420 20 6e 6f 20 73 75 63 68 20 65 6e 74 72 79 2c 20   no such entry, 
1e430 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 2a 2a  control jumps.**
1e440 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   to instruction 
1e450 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  P2. Otherwise, t
1e460 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
1e470 63 6f 6e 66 6c 69 63 74 69 6e 67 20 69 6e 64 65  conflicting inde
1e480 78 0a 2a 2a 20 65 6e 74 72 79 20 69 73 20 63 6f  x.** entry is co
1e490 70 69 65 64 20 74 6f 20 72 65 67 69 73 74 65 72  pied to register
1e4a0 20 50 33 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20   P3 and control 
1e4b0 66 61 6c 6c 73 20 74 68 72 6f 75 67 68 20 74 6f  falls through to
1e4c0 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 73   the next.** ins
1e4d0 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
1e4e0 53 65 65 20 61 6c 73 6f 3a 20 4e 6f 74 46 6f 75  See also: NotFou
1e4f0 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73 2c 20 46  nd, NotExists, F
1e500 6f 75 6e 64 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ound.*/.case OP_
1e510 49 73 55 6e 69 71 75 65 3a 20 7b 20 20 20 20 20  IsUnique: {     
1e520 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20     /* jump, in3 
1e530 2a 2f 0a 20 20 75 31 36 20 69 69 3b 0a 20 20 56  */.  u16 ii;.  V
1e540 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a  dbeCursor *pCx;.
1e550 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
1e560 72 3b 0a 20 20 75 31 36 20 6e 46 69 65 6c 64 3b  r;.  u16 nField;
1e570 0a 20 20 4d 65 6d 20 2a 61 4d 78 3b 0a 20 20 55  .  Mem *aMx;.  U
1e580 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72 3b  npackedRecord r;
1e590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5a0 20 20 2f 2a 20 42 2d 54 72 65 65 20 69 6e 64 65    /* B-Tree inde
1e5b0 78 20 73 65 61 72 63 68 20 6b 65 79 20 2a 2f 0a  x search key */.
1e5c0 20 20 69 36 34 20 52 3b 20 20 20 20 20 20 20 20    i64 R;        
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5e0 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 73 74       /* Rowid st
1e5f0 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
1e600 20 50 33 20 2a 2f 0a 0a 20 20 70 49 6e 33 20 3d   P3 */..  pIn3 =
1e610 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
1e620 0a 20 20 61 4d 78 20 3d 20 26 61 4d 65 6d 5b 70  .  aMx = &aMem[p
1e630 4f 70 2d 3e 70 34 2e 69 5d 3b 0a 20 20 2f 2a 20  Op->p4.i];.  /* 
1e640 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
1e650 76 61 6c 75 65 73 20 6f 66 20 70 61 72 61 6d 65  values of parame
1e660 74 65 72 73 20 50 31 20 61 6e 64 20 50 34 20 61  ters P1 and P4 a
1e670 72 65 20 69 6e 20 72 61 6e 67 65 2e 20 2a 2f 0a  re in range. */.
1e680 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1e690 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20  4type==P4_INT32 
1e6a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
1e6b0 2d 3e 70 34 2e 69 3e 30 20 26 26 20 70 4f 70 2d  ->p4.i>0 && pOp-
1e6c0 3e 70 34 2e 69 3c 3d 70 2d 3e 6e 4d 65 6d 20 29  >p4.i<=p->nMem )
1e6d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1e6e0 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
1e6f0 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
1e700 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 69  .  /* Find the i
1e710 6e 64 65 78 20 63 75 72 73 6f 72 2e 20 2a 2f 0a  ndex cursor. */.
1e720 20 20 70 43 78 20 3d 20 70 2d 3e 61 70 43 73 72    pCx = p->apCsr
1e730 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
1e740 65 72 74 28 20 70 43 78 2d 3e 64 65 66 65 72 72  ert( pCx->deferr
1e750 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20  edMoveto==0 );. 
1e760 20 70 43 78 2d 3e 73 65 65 6b 52 65 73 75 6c 74   pCx->seekResult
1e770 20 3d 20 30 3b 0a 20 20 70 43 78 2d 3e 63 61 63   = 0;.  pCx->cac
1e780 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
1e790 5f 53 54 41 4c 45 3b 0a 20 20 70 43 72 73 72 20  _STALE;.  pCrsr 
1e7a0 3d 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pCx->pCursor;.
1e7b0 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  /* If any of 
1e7c0 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 4e  the values are N
1e7d0 55 4c 4c 2c 20 74 61 6b 65 20 74 68 65 20 6a 75  ULL, take the ju
1e7e0 6d 70 2e 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20  mp. */.  nField 
1e7f0 3d 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d  = pCx->pKeyInfo-
1e800 3e 6e 46 69 65 6c 64 3b 0a 20 20 66 6f 72 28 69  >nField;.  for(i
1e810 69 3d 30 3b 20 69 69 3c 6e 46 69 65 6c 64 3b 20  i=0; ii<nField; 
1e820 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61  ii++){.    if( a
1e830 4d 78 5b 69 69 5d 2e 66 6c 61 67 73 20 26 20 4d  Mx[ii].flags & M
1e840 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  EM_Null ){.     
1e850 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
1e860 31 3b 0a 20 20 20 20 20 20 70 43 72 73 72 20 3d  1;.      pCrsr =
1e870 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
1e880 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
1e890 65 72 74 28 20 28 61 4d 78 5b 6e 46 69 65 6c 64  ert( (aMx[nField
1e8a0 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ].flags & MEM_Nu
1e8b0 6c 6c 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ll)==0 );..  if(
1e8c0 20 70 43 72 73 72 21 3d 30 20 29 7b 0a 20 20 20   pCrsr!=0 ){.   
1e8d0 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
1e8e0 20 69 6e 64 65 78 20 73 65 61 72 63 68 20 6b 65   index search ke
1e8f0 79 2e 20 2a 2f 0a 20 20 20 20 72 2e 70 4b 65 79  y. */.    r.pKey
1e900 49 6e 66 6f 20 3d 20 70 43 78 2d 3e 70 4b 65 79  Info = pCx->pKey
1e910 49 6e 66 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65  Info;.    r.nFie
1e920 6c 64 20 3d 20 6e 46 69 65 6c 64 20 2b 20 31 3b  ld = nField + 1;
1e930 0a 20 20 20 20 72 2e 66 6c 61 67 73 20 3d 20 55  .    r.flags = U
1e940 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53  NPACKED_PREFIX_S
1e950 45 41 52 43 48 3b 0a 20 20 20 20 72 2e 61 4d 65  EARCH;.    r.aMe
1e960 6d 20 3d 20 61 4d 78 3b 0a 23 69 66 64 65 66 20  m = aMx;.#ifdef 
1e970 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
1e980 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d   { int i; for(i=
1e990 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69  0; i<r.nField; i
1e9a0 2b 2b 29 20 61 73 73 65 72 74 28 20 6d 65 6d 49  ++) assert( memI
1e9b0 73 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69  sValid(&r.aMem[i
1e9c0 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a  ]) ); }.#endif..
1e9d0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
1e9e0 68 65 20 76 61 6c 75 65 20 6f 66 20 52 20 66 72  he value of R fr
1e9f0 6f 6d 20 72 65 67 69 73 74 65 72 20 50 33 2e 20  om register P3. 
1ea00 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
1ea10 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28  beMemIntegerify(
1ea20 70 49 6e 33 29 3b 0a 20 20 20 20 52 20 3d 20 70  pIn3);.    R = p
1ea30 49 6e 33 2d 3e 75 2e 69 3b 0a 0a 20 20 20 20 2f  In3->u.i;..    /
1ea40 2a 20 53 65 61 72 63 68 20 74 68 65 20 42 2d 54  * Search the B-T
1ea50 72 65 65 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f  ree index. If no
1ea60 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 65 63   conflicting rec
1ea70 6f 72 64 20 69 73 20 66 6f 75 6e 64 2c 20 6a 75  ord is found, ju
1ea80 6d 70 0a 20 20 20 20 2a 2a 20 74 6f 20 50 32 2e  mp.    ** to P2.
1ea90 20 4f 74 68 65 72 77 69 73 65 2c 20 63 6f 70 79   Otherwise, copy
1eaa0 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
1eab0 65 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 65  e conflicting re
1eac0 63 6f 72 64 20 74 6f 0a 20 20 20 20 2a 2a 20 72  cord to.    ** r
1ead0 65 67 69 73 74 65 72 20 50 33 20 61 6e 64 20 66  egister P3 and f
1eae0 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
1eaf0 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
1eb00 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20  ion.  */.    rc 
1eb10 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
1eb20 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 72  vetoUnpacked(pCr
1eb30 73 72 2c 20 26 72 2c 20 30 2c 20 30 2c 20 26 70  sr, &r, 0, 0, &p
1eb40 43 78 2d 3e 73 65 65 6b 52 65 73 75 6c 74 29 3b  Cx->seekResult);
1eb50 0a 20 20 20 20 69 66 28 20 28 72 2e 66 6c 61 67  .    if( (r.flag
1eb60 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45  s & UNPACKED_PRE
1eb70 46 49 58 5f 53 45 41 52 43 48 29 20 7c 7c 20 72  FIX_SEARCH) || r
1eb80 2e 72 6f 77 69 64 3d 3d 52 20 29 7b 0a 20 20 20  .rowid==R ){.   
1eb90 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
1eba0 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  - 1;.    }else{.
1ebb0 20 20 20 20 20 20 70 49 6e 33 2d 3e 75 2e 69 20        pIn3->u.i 
1ebc0 3d 20 72 2e 72 6f 77 69 64 3b 0a 20 20 20 20 7d  = r.rowid;.    }
1ebd0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
1ebe0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 45  ./* Opcode: NotE
1ebf0 78 69 73 74 73 20 50 31 20 50 32 20 50 33 20 2a  xists P1 P2 P3 *
1ec00 20 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65   *.**.** Use the
1ec10 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69   content of regi
1ec20 73 74 65 72 20 50 33 20 61 73 20 61 6e 20 69 6e  ster P3 as an in
1ec30 74 65 67 65 72 20 6b 65 79 2e 20 20 49 66 20 61  teger key.  If a
1ec40 20 72 65 63 6f 72 64 20 0a 2a 2a 20 77 69 74 68   record .** with
1ec50 20 74 68 61 74 20 6b 65 79 20 64 6f 65 73 20 6e   that key does n
1ec60 6f 74 20 65 78 69 73 74 20 69 6e 20 74 61 62 6c  ot exist in tabl
1ec70 65 20 6f 66 20 50 31 2c 20 74 68 65 6e 20 6a 75  e of P1, then ju
1ec80 6d 70 20 74 6f 20 50 32 2e 20 0a 2a 2a 20 49 66  mp to P2. .** If
1ec90 20 74 68 65 20 72 65 63 6f 72 64 20 64 6f 65 73   the record does
1eca0 20 65 78 69 73 74 2c 20 74 68 65 6e 20 66 61 6c   exist, then fal
1ecb0 6c 20 74 68 72 6f 75 67 68 2e 20 20 54 68 65 20  l through.  The 
1ecc0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 0a  cursor is left .
1ecd0 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ** pointing to t
1ece0 68 65 20 72 65 63 6f 72 64 20 69 66 20 69 74 20  he record if it 
1ecf0 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  exists..**.** Th
1ed00 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
1ed10 77 65 65 6e 20 74 68 69 73 20 6f 70 65 72 61 74  ween this operat
1ed20 69 6f 6e 20 61 6e 64 20 4e 6f 74 46 6f 75 6e 64  ion and NotFound
1ed30 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a   is that this.**
1ed40 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 73 75 6d   operation assum
1ed50 65 73 20 74 68 65 20 6b 65 79 20 69 73 20 61 6e  es the key is an
1ed60 20 69 6e 74 65 67 65 72 20 61 6e 64 20 74 68 61   integer and tha
1ed70 74 20 50 31 20 69 73 20 61 20 74 61 62 6c 65 20  t P1 is a table 
1ed80 77 68 65 72 65 61 73 0a 2a 2a 20 4e 6f 74 46 6f  whereas.** NotFo
1ed90 75 6e 64 20 61 73 73 75 6d 65 73 20 6b 65 79 20  und assumes key 
1eda0 69 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72  is a blob constr
1edb0 75 63 74 65 64 20 66 72 6f 6d 20 4d 61 6b 65 52  ucted from MakeR
1edc0 65 63 6f 72 64 20 61 6e 64 0a 2a 2a 20 50 31 20  ecord and.** P1 
1edd0 69 73 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2a 0a  is an index..**.
1ede0 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
1edf0 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 49 73  nd, NotFound, Is
1ee00 55 6e 69 71 75 65 0a 2a 2f 0a 63 61 73 65 20 4f  Unique.*/.case O
1ee10 50 5f 4e 6f 74 45 78 69 73 74 73 3a 20 7b 20 20  P_NotExists: {  
1ee20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69        /* jump, i
1ee30 6e 33 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  n3 */.  VdbeCurs
1ee40 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73  or *pC;.  BtCurs
1ee50 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74  or *pCrsr;.  int
1ee60 20 72 65 73 3b 0a 20 20 75 36 34 20 69 4b 65 79   res;.  u64 iKey
1ee70 3b 0a 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65  ;..  pIn3 = &aMe
1ee80 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73  m[pOp->p3];.  as
1ee90 73 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67  sert( pIn3->flag
1eea0 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  s & MEM_Int );. 
1eeb0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
1eec0 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
1eed0 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
1eee0 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
1eef0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
1ef00 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
1ef10 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20  rt( pC->isTable 
1ef20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
1ef30 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67 3d  >pseudoTableReg=
1ef40 3d 30 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20  =0 );.  pCrsr = 
1ef50 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  pC->pCursor;.  i
1ef60 66 28 20 41 4c 57 41 59 53 28 70 43 72 73 72 21  f( ALWAYS(pCrsr!
1ef70 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  =0) ){.    res =
1ef80 20 30 3b 0a 20 20 20 20 69 4b 65 79 20 3d 20 70   0;.    iKey = p
1ef90 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 20 20 72 63  In3->u.i;.    rc
1efa0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
1efb0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
1efc0 72 73 72 2c 20 30 2c 20 69 4b 65 79 2c 20 30 2c  rsr, 0, iKey, 0,
1efd0 20 26 72 65 73 29 3b 0a 20 20 20 20 70 43 2d 3e   &res);.    pC->
1efe0 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 49 6e 33  lastRowid = pIn3
1eff0 2d 3e 75 2e 69 3b 0a 20 20 20 20 70 43 2d 3e 72  ->u.i;.    pC->r
1f000 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 72 65  owidIsValid = re
1f010 73 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 20 20 70  s==0 ?1:0;.    p
1f020 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a  C->nullRow = 0;.
1f030 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61      pC->cacheSta
1f040 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
1f050 45 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72  E;.    pC->defer
1f060 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
1f070 20 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 7b     if( res!=0 ){
1f080 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  .      pc = pOp-
1f090 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20 20 61  >p2 - 1;.      a
1f0a0 73 73 65 72 74 28 20 70 43 2d 3e 72 6f 77 69 64  ssert( pC->rowid
1f0b0 49 73 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20  IsValid==0 );.  
1f0c0 20 20 7d 0a 20 20 20 20 70 43 2d 3e 73 65 65 6b    }.    pC->seek
1f0d0 52 65 73 75 6c 74 20 3d 20 72 65 73 3b 0a 20 20  Result = res;.  
1f0e0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
1f0f0 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
1f100 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70  an attempt to op
1f110 65 6e 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  en a read cursor
1f120 20 6f 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   on the .    ** 
1f130 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
1f140 62 6c 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ble returns SQLI
1f150 54 45 5f 45 4d 50 54 59 2e 0a 20 20 20 20 2a 2f  TE_EMPTY..    */
1f160 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70  .    pc = pOp->p
1f170 32 20 2d 20 31 3b 0a 20 20 20 20 61 73 73 65 72  2 - 1;.    asser
1f180 74 28 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61  t( pC->rowidIsVa
1f190 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20 70 43  lid==0 );.    pC
1f1a0 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 30  ->seekResult = 0
1f1b0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
1f1c0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 71  ../* Opcode: Seq
1f1d0 75 65 6e 63 65 20 50 31 20 50 32 20 2a 20 2a 20  uence P1 P2 * * 
1f1e0 2a 0a 2a 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  *.**.** Find the
1f1f0 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   next available 
1f200 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20  sequence number 
1f210 66 6f 72 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a  for cursor P1..*
1f220 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 71 75  * Write the sequ
1f230 65 6e 63 65 20 6e 75 6d 62 65 72 20 69 6e 74 6f  ence number into
1f240 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
1f250 20 54 68 65 20 73 65 71 75 65 6e 63 65 20 6e 75   The sequence nu
1f260 6d 62 65 72 20 6f 6e 20 74 68 65 20 63 75 72 73  mber on the curs
1f270 6f 72 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  or is incremente
1f280 64 20 61 66 74 65 72 20 74 68 69 73 0a 2a 2a 20  d after this.** 
1f290 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a  instruction.  .*
1f2a0 2f 0a 63 61 73 65 20 4f 50 5f 53 65 71 75 65 6e  /.case OP_Sequen
1f2b0 63 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ce: {           
1f2c0 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61  /* out2-prerelea
1f2d0 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
1f2e0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
1f2f0 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
1f300 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
1f310 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 21  >apCsr[pOp->p1]!
1f320 3d 30 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e  =0 );.  pOut->u.
1f330 69 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  i = p->apCsr[pOp
1f340 2d 3e 70 31 5d 2d 3e 73 65 71 43 6f 75 6e 74 2b  ->p1]->seqCount+
1f350 2b 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a  +;.  break;.}...
1f360 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 77 52 6f  /* Opcode: NewRo
1f370 77 69 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a  wid P1 P2 P3 * *
1f380 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61 20 6e 65 77  .**.** Get a new
1f390 20 69 6e 74 65 67 65 72 20 72 65 63 6f 72 64 20   integer record 
1f3a0 6e 75 6d 62 65 72 20 28 61 2e 6b 2e 61 20 22 72  number (a.k.a "r
1f3b0 6f 77 69 64 22 29 20 75 73 65 64 20 61 73 20 74  owid") used as t
1f3c0 68 65 20 6b 65 79 20 74 6f 20 61 20 74 61 62 6c  he key to a tabl
1f3d0 65 2e 0a 2a 2a 20 54 68 65 20 72 65 63 6f 72 64  e..** The record
1f3e0 20 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 70   number is not p
1f3f0 72 65 76 69 6f 75 73 6c 79 20 75 73 65 64 20 61  reviously used a
1f400 73 20 61 20 6b 65 79 20 69 6e 20 74 68 65 20 64  s a key in the d
1f410 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65  atabase.** table
1f420 20 74 68 61 74 20 63 75 72 73 6f 72 20 50 31 20   that cursor P1 
1f430 70 6f 69 6e 74 73 20 74 6f 2e 20 20 54 68 65 20  points to.  The 
1f440 6e 65 77 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  new record numbe
1f450 72 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  r is written.** 
1f460 77 72 69 74 74 65 6e 20 74 6f 20 72 65 67 69 73  written to regis
1f470 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66  ter P2..**.** If
1f480 20 50 33 3e 30 20 74 68 65 6e 20 50 33 20 69 73   P3>0 then P3 is
1f490 20 61 20 72 65 67 69 73 74 65 72 20 69 6e 20 74   a register in t
1f4a0 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 6f 66  he root frame of
1f4b0 20 74 68 69 73 20 56 44 42 45 20 74 68 61 74 20   this VDBE that 
1f4c0 68 6f 6c 64 73 20 0a 2a 2a 20 74 68 65 20 6c 61  holds .** the la
1f4d0 72 67 65 73 74 20 70 72 65 76 69 6f 75 73 6c 79  rgest previously
1f4e0 20 67 65 6e 65 72 61 74 65 64 20 72 65 63 6f 72   generated recor
1f4f0 64 20 6e 75 6d 62 65 72 2e 20 4e 6f 20 6e 65 77  d number. No new
1f500 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 73 20   record numbers 
1f510 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 74  are.** allowed t
1f520 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 74  o be less than t
1f530 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 20  his value. When 
1f540 74 68 69 73 20 76 61 6c 75 65 20 72 65 61 63 68  this value reach
1f550 65 73 20 69 74 73 20 6d 61 78 69 6d 75 6d 2c 20  es its maximum, 
1f560 0a 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f 46 55  .** an SQLITE_FU
1f570 4c 4c 20 65 72 72 6f 72 20 69 73 20 67 65 6e 65  LL error is gene
1f580 72 61 74 65 64 2e 20 54 68 65 20 50 33 20 72 65  rated. The P3 re
1f590 67 69 73 74 65 72 20 69 73 20 75 70 64 61 74 65  gister is update
1f5a0 64 20 77 69 74 68 20 74 68 65 20 27 0a 2a 2a 20  d with the '.** 
1f5b0 67 65 6e 65 72 61 74 65 64 20 72 65 63 6f 72 64  generated record
1f5c0 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 50 33   number. This P3
1f5d0 20 6d 65 63 68 61 6e 69 73 6d 20 69 73 20 75 73   mechanism is us
1f5e0 65 64 20 74 6f 20 68 65 6c 70 20 69 6d 70 6c 65  ed to help imple
1f5f0 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 41 55 54 4f  ment the.** AUTO
1f600 49 4e 43 52 45 4d 45 4e 54 20 66 65 61 74 75 72  INCREMENT featur
1f610 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65  e..*/.case OP_Ne
1f620 77 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20  wRowid: {       
1f630 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72      /* out2-prer
1f640 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 36 34 20  elease */.  i64 
1f650 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1f660 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f     /* The new ro
1f670 77 69 64 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  wid */.  VdbeCur
1f680 73 6f 72 20 2a 70 43 3b 20 20 20 20 20 20 20 20  sor *pC;        
1f690 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 61 62  /* Cursor of tab
1f6a0 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65  le to get the ne
1f6b0 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74  w rowid */.  int
1f6c0 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20   res;           
1f6d0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
1f6e0 20 61 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65   an sqlite3Btree
1f6f0 4c 61 73 74 28 29 20 2a 2f 0a 20 20 69 6e 74 20  Last() */.  int 
1f700 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
1f710 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 74 6f     /* Counter to
1f720 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65   limit the numbe
1f730 72 20 6f 66 20 73 65 61 72 63 68 65 73 20 2a 2f  r of searches */
1f740 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 20 20 20  .  Mem *pMem;   
1f750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
1f760 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6c 61  ister holding la
1f770 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f 72 20  rgest rowid for 
1f780 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 2a 2f  AUTOINCREMENT */
1f790 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46  .  VdbeFrame *pF
1f7a0 72 61 6d 65 3b 20 20 20 20 20 2f 2a 20 52 6f 6f  rame;     /* Roo
1f7b0 74 20 66 72 61 6d 65 20 6f 66 20 56 44 42 45 20  t frame of VDBE 
1f7c0 2a 2f 0a 0a 20 20 76 20 3d 20 30 3b 0a 20 20 72  */..  v = 0;.  r
1f7d0 65 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  es = 0;.  assert
1f7e0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
1f7f0 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
1f800 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
1f810 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
1f820 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
1f830 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  );.  if( NEVER(p
1f840 43 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 29 20 29  C->pCursor==0) )
1f850 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 7a 65 72  {.    /* The zer
1f860 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  o initialization
1f870 20 61 62 6f 76 65 20 69 73 20 61 6c 6c 20 74 68   above is all th
1f880 61 74 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a  at is needed */.
1f890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1f8a0 54 68 65 20 6e 65 78 74 20 72 6f 77 69 64 20 6f  The next rowid o
1f8b0 72 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  r record number 
1f8c0 28 64 69 66 66 65 72 65 6e 74 20 74 65 72 6d 73  (different terms
1f8d0 20 66 6f 72 20 74 68 65 20 73 61 6d 65 0a 20 20   for the same.  
1f8e0 20 20 2a 2a 20 74 68 69 6e 67 29 20 69 73 20 6f    ** thing) is o
1f8f0 62 74 61 69 6e 65 64 20 69 6e 20 61 20 74 77 6f  btained in a two
1f900 2d 73 74 65 70 20 61 6c 67 6f 72 69 74 68 6d 2e  -step algorithm.
1f910 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
1f920 69 72 73 74 20 77 65 20 61 74 74 65 6d 70 74 20  irst we attempt 
1f930 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67  to find the larg
1f940 65 73 74 20 65 78 69 73 74 69 6e 67 20 72 6f 77  est existing row
1f950 69 64 20 61 6e 64 20 61 64 64 20 6f 6e 65 0a 20  id and add one. 
1f960 20 20 20 2a 2a 20 74 6f 20 74 68 61 74 2e 20 20     ** to that.  
1f970 42 75 74 20 69 66 20 74 68 65 20 6c 61 72 67 65  But if the large
1f980 73 74 20 65 78 69 73 74 69 6e 67 20 72 6f 77 69  st existing rowi
1f990 64 20 69 73 20 61 6c 72 65 61 64 79 20 74 68 65  d is already the
1f9a0 20 6d 61 78 69 6d 75 6d 0a 20 20 20 20 2a 2a 20   maximum.    ** 
1f9b0 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
1f9c0 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 61 6c  , we have to fal
1f9d0 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
1f9e0 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 70   second.    ** p
1f9f0 72 6f 62 61 62 69 6c 69 73 74 69 63 20 61 6c 67  robabilistic alg
1fa00 6f 72 69 74 68 6d 0a 20 20 20 20 2a 2a 0a 20 20  orithm.    **.  
1fa10 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
1fa20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 74 6f 20  algorithm is to 
1fa30 73 65 6c 65 63 74 20 61 20 72 6f 77 69 64 20 61  select a rowid a
1fa40 74 20 72 61 6e 64 6f 6d 20 61 6e 64 20 73 65 65  t random and see
1fa50 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20 61 6c   if.    ** it al
1fa60 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 20  ready exists in 
1fa70 74 68 65 20 74 61 62 6c 65 2e 20 20 49 66 20 69  the table.  If i
1fa80 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
1fa90 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a  , we have.    **
1faa0 20 73 75 63 63 65 65 64 65 64 2e 20 20 49 66 20   succeeded.  If 
1fab0 74 68 65 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64  the random rowid
1fac0 20 64 6f 65 73 20 65 78 69 73 74 2c 20 77 65 20   does exist, we 
1fad0 73 65 6c 65 63 74 20 61 20 6e 65 77 20 6f 6e 65  select a new one
1fae0 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 72 79 20  .    ** and try 
1faf0 61 67 61 69 6e 2c 20 75 70 20 74 6f 20 31 30 30  again, up to 100
1fb00 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   times..    */. 
1fb10 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
1fb20 73 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 64 65  sTable );..#ifde
1fb30 66 20 53 51 4c 49 54 45 5f 33 32 42 49 54 5f 52  f SQLITE_32BIT_R
1fb40 4f 57 49 44 0a 23 20 20 20 64 65 66 69 6e 65 20  OWID.#   define 
1fb50 4d 41 58 5f 52 4f 57 49 44 20 30 78 37 66 66 66  MAX_ROWID 0x7fff
1fb60 66 66 66 66 0a 23 65 6c 73 65 0a 20 20 20 20 2f  ffff.#else.    /
1fb70 2a 20 53 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73  * Some compilers
1fb80 20 63 6f 6d 70 6c 61 69 6e 20 61 62 6f 75 74 20   complain about 
1fb90 63 6f 6e 73 74 61 6e 74 73 20 6f 66 20 74 68 65  constants of the
1fba0 20 66 6f 72 6d 20 30 78 37 66 66 66 66 66 66 66   form 0x7fffffff
1fbb0 66 66 66 66 66 66 66 66 2e 0a 20 20 20 20 2a 2a  ffffffff..    **
1fbc0 20 4f 74 68 65 72 73 20 63 6f 6d 70 6c 61 69 6e   Others complain
1fbd0 20 61 62 6f 75 74 20 30 78 37 66 66 66 66 66 66   about 0x7ffffff
1fbe0 66 66 66 66 66 66 66 66 66 66 4c 4c 2e 20 20 54  ffffffffffLL.  T
1fbf0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
1fc00 72 6f 20 73 65 65 6d 73 0a 20 20 20 20 2a 2a 20  ro seems.    ** 
1fc10 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 63  to provide the c
1fc20 6f 6e 73 74 61 6e 74 20 77 68 69 6c 65 20 6d 61  onstant while ma
1fc30 6b 69 6e 67 20 61 6c 6c 20 63 6f 6d 70 69 6c 65  king all compile
1fc40 72 73 20 68 61 70 70 79 2e 0a 20 20 20 20 2a 2f  rs happy..    */
1fc50 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f  .#   define MAX_
1fc60 52 4f 57 49 44 20 20 28 69 36 34 29 28 20 28 28  ROWID  (i64)( ((
1fc70 28 75 36 34 29 30 78 37 66 66 66 66 66 66 66 29  (u64)0x7fffffff)
1fc80 3c 3c 33 32 29 20 7c 20 28 75 36 34 29 30 78 66  <<32) | (u64)0xf
1fc90 66 66 66 66 66 66 66 20 29 0a 23 65 6e 64 69 66  fffffff ).#endif
1fca0 0a 0a 20 20 20 20 69 66 28 20 21 70 43 2d 3e 75  ..    if( !pC->u
1fcb0 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 29 7b  seRandomRowid ){
1fcc0 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74  .      v = sqlit
1fcd0 65 33 42 74 72 65 65 47 65 74 43 61 63 68 65 64  e3BtreeGetCached
1fce0 52 6f 77 69 64 28 70 43 2d 3e 70 43 75 72 73 6f  Rowid(pC->pCurso
1fcf0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76 3d  r);.      if( v=
1fd00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1fd10 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c   = sqlite3BtreeL
1fd20 61 73 74 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c  ast(pC->pCursor,
1fd30 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20   &res);.        
1fd40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fd50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
1fd60 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1fd70 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  _error;.        
1fd80 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  }.        if( re
1fd90 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 76  s ){.          v
1fda0 20 3d 20 31 3b 20 20 20 2f 2a 20 49 4d 50 3a 20   = 1;   /* IMP: 
1fdb0 52 2d 36 31 39 31 34 2d 34 38 30 37 34 20 2a 2f  R-61914-48074 */
1fdc0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1fdd0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1fde0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
1fdf0 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 2d 3e  rsorIsValid(pC->
1fe00 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20  pCursor) );.    
1fe10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1fe20 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
1fe30 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 76 29 3b  C->pCursor, &v);
1fe40 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1fe50 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
1fe60 20 29 3b 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20   );   /* Cannot 
1fe70 66 61 69 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 42  fail following B
1fe80 74 72 65 65 4c 61 73 74 28 29 20 2a 2f 0a 20 20  treeLast() */.  
1fe90 20 20 20 20 20 20 20 20 69 66 28 20 76 3e 3d 4d          if( v>=M
1fea0 41 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  AX_ROWID ){.    
1feb0 20 20 20 20 20 20 20 20 70 43 2d 3e 75 73 65 52          pC->useR
1fec0 61 6e 64 6f 6d 52 6f 77 69 64 20 3d 20 31 3b 0a  andomRowid = 1;.
1fed0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1fee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2b 2b  .            v++
1fef0 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 39  ;   /* IMP: R-29
1ff00 35 33 38 2d 33 34 39 38 37 20 2a 2f 0a 20 20 20  538-34987 */.   
1ff10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ff20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 23 69 66 6e   }.      }..#ifn
1ff30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ff40 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
1ff50 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 20      if( pOp->p3 
1ff60 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 73  ){.        /* As
1ff70 73 65 72 74 20 74 68 61 74 20 50 33 20 69 73 20  sert that P3 is 
1ff80 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 63  a valid memory c
1ff90 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ell. */.        
1ffa0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
1ffb0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
1ffc0 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20   p->pFrame ){.  
1ffd0 20 20 20 20 20 20 20 20 66 6f 72 28 70 46 72 61          for(pFra
1ffe0 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46  me=p->pFrame; pF
1fff0 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70  rame->pParent; p
20000 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50  Frame=pFrame->pP
20010 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  arent);.        
20020 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
20030 20 50 33 20 69 73 20 61 20 76 61 6c 69 64 20 6d   P3 is a valid m
20040 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20  emory cell. */. 
20050 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
20060 20 70 4f 70 2d 3e 70 33 3c 3d 70 46 72 61 6d 65   pOp->p3<=pFrame
20070 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20  ->nMem );.      
20080 20 20 20 20 70 4d 65 6d 20 3d 20 26 70 46 72 61      pMem = &pFra
20090 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33  me->aMem[pOp->p3
200a0 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ];.        }else
200b0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
200c0 73 73 65 72 74 20 74 68 61 74 20 50 33 20 69 73  ssert that P3 is
200d0 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20   a valid memory 
200e0 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20  cell. */.       
200f0 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
20100 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  p3<=p->nMem );. 
20110 20 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20           pMem = 
20120 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
20130 20 20 20 20 20 20 20 20 20 20 6d 65 6d 41 62 6f            memAbo
20140 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4d  utToChange(p, pM
20150 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  em);.        }. 
20160 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d         assert( m
20170 65 6d 49 73 56 61 6c 69 64 28 70 4d 65 6d 29 20  emIsValid(pMem) 
20180 29 3b 0a 0a 20 20 20 20 20 20 20 20 52 45 47 49  );..        REGI
20190 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
201a0 70 33 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20  p3, pMem);.     
201b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
201c0 6d 49 6e 74 65 67 65 72 69 66 79 28 70 4d 65 6d  mIntegerify(pMem
201d0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
201e0 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
201f0 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b  & MEM_Int)!=0 );
20200 20 20 2f 2a 20 6d 65 6d 28 50 33 29 20 68 6f 6c    /* mem(P3) hol
20210 64 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f  ds an integer */
20220 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
20230 6d 2d 3e 75 2e 69 3d 3d 4d 41 58 5f 52 4f 57 49  m->u.i==MAX_ROWI
20240 44 20 7c 7c 20 70 43 2d 3e 75 73 65 52 61 6e 64  D || pC->useRand
20250 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  omRowid ){.     
20260 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
20270 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50 3a  _FULL;   /* IMP:
20280 20 52 2d 31 32 32 37 35 2d 36 31 33 33 38 20 2a   R-12275-61338 *
20290 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
202a0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
202b0 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ror;.        }. 
202c0 20 20 20 20 20 20 20 69 66 28 20 76 3c 70 4d 65         if( v<pMe
202d0 6d 2d 3e 75 2e 69 2b 31 20 29 7b 0a 20 20 20 20  m->u.i+1 ){.    
202e0 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e        v = pMem->
202f0 75 2e 69 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  u.i + 1;.       
20300 20 7d 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d   }.        pMem-
20310 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 20 20 20 20  >u.i = v;.      
20320 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
20330 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
20340 61 63 68 65 64 52 6f 77 69 64 28 70 43 2d 3e 70  achedRowid(pC->p
20350 43 75 72 73 6f 72 2c 20 76 3c 4d 41 58 5f 52 4f  Cursor, v<MAX_RO
20360 57 49 44 20 3f 20 76 2b 31 20 3a 20 30 29 3b 0a  WID ? v+1 : 0);.
20370 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
20380 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64  ->useRandomRowid
20390 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 4d 50   ){.      /* IMP
203a0 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
203b0 52 2d 30 37 36 37 37 2d 34 31 38 38 31 20 49 66  R-07677-41881 If
203c0 20 74 68 65 20 6c 61 72 67 65 73 74 20 52 4f 57   the largest ROW
203d0 49 44 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  ID is equal to t
203e0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67  he.      ** larg
203f0 65 73 74 20 70 6f 73 73 69 62 6c 65 20 69 6e 74  est possible int
20400 65 67 65 72 20 28 39 32 32 33 33 37 32 30 33 36  eger (9223372036
20410 38 35 34 37 37 35 38 30 37 29 20 74 68 65 6e 20  854775807) then 
20420 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
20430 20 20 20 2a 2a 20 65 6e 67 69 6e 65 20 73 74 61     ** engine sta
20440 72 74 73 20 70 69 63 6b 69 6e 67 20 70 6f 73 69  rts picking posi
20450 74 69 76 65 20 63 61 6e 64 69 64 61 74 65 20 52  tive candidate R
20460 4f 57 49 44 73 20 61 74 20 72 61 6e 64 6f 6d 20  OWIDs at random 
20470 75 6e 74 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69  until.      ** i
20480 74 20 66 69 6e 64 73 20 6f 6e 65 20 74 68 61 74  t finds one that
20490 20 69 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73   is not previous
204a0 6c 79 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20  ly used. */.    
204b0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
204c0 33 3d 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20 63  3==0 );  /* We c
204d0 61 6e 6e 6f 74 20 62 65 20 69 6e 20 72 61 6e 64  annot be in rand
204e0 6f 6d 20 72 6f 77 69 64 20 6d 6f 64 65 20 69 66  om rowid mode if
204f0 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20   this is.       
20500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20510 20 20 20 20 20 20 2a 2a 20 61 6e 20 41 55 54 4f        ** an AUTO
20520 49 4e 43 52 45 4d 45 4e 54 20 74 61 62 6c 65 2e  INCREMENT table.
20530 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 20   */.      /* on 
20540 74 68 65 20 66 69 72 73 74 20 61 74 74 65 6d 70  the first attemp
20550 74 2c 20 73 69 6d 70 6c 79 20 64 6f 20 6f 6e 65  t, simply do one
20560 20 6d 6f 72 65 20 74 68 61 6e 20 70 72 65 76 69   more than previ
20570 6f 75 73 20 2a 2f 0a 20 20 20 20 20 20 76 20 3d  ous */.      v =
20580 20 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 20 20   lastRowid;.    
20590 20 20 76 20 26 3d 20 28 4d 41 58 5f 52 4f 57 49    v &= (MAX_ROWI
205a0 44 3e 3e 31 29 3b 20 2f 2a 20 65 6e 73 75 72 65  D>>1); /* ensure
205b0 20 64 6f 65 73 6e 27 74 20 67 6f 20 6e 65 67 61   doesn't go nega
205c0 74 69 76 65 20 2a 2f 0a 20 20 20 20 20 20 76 2b  tive */.      v+
205d0 2b 3b 20 2f 2a 20 65 6e 73 75 72 65 20 6e 6f 6e  +; /* ensure non
205e0 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 63  -zero */.      c
205f0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68  nt = 0;.      wh
20600 69 6c 65 28 20 20 20 28 28 72 63 20 3d 20 73 71  ile(   ((rc = sq
20610 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
20620 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 70 43 75  Unpacked(pC->pCu
20630 72 73 6f 72 2c 20 30 2c 20 28 75 36 34 29 76 2c  rsor, 0, (u64)v,
20640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20670 20 20 30 2c 20 26 72 65 73 29 29 3d 3d 53 51 4c    0, &res))==SQL
20680 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20 20 20  ITE_OK).        
20690 20 20 20 20 26 26 20 28 72 65 73 3d 3d 30 29 0a      && (res==0).
206a0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
206b0 2b 2b 63 6e 74 3c 31 30 30 29 29 7b 0a 20 20 20  ++cnt<100)){.   
206c0 20 20 20 20 20 2f 2a 20 63 6f 6c 6c 69 73 69 6f       /* collisio
206d0 6e 20 2d 20 74 72 79 20 61 6e 6f 74 68 65 72 20  n - try another 
206e0 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20 2a 2f 0a  random rowid */.
206f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
20700 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
20710 66 28 76 29 2c 20 26 76 29 3b 0a 20 20 20 20 20  f(v), &v);.     
20720 20 20 20 69 66 28 20 63 6e 74 3c 35 20 29 7b 0a     if( cnt<5 ){.
20730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72 79            /* try
20740 20 22 73 6d 61 6c 6c 22 20 72 61 6e 64 6f 6d 20   "small" random 
20750 72 6f 77 69 64 73 20 66 6f 72 20 74 68 65 20 69  rowids for the i
20760 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 73 20  nitial attempts 
20770 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 20 26  */.          v &
20780 3d 20 30 78 66 66 66 66 66 66 3b 0a 20 20 20 20  = 0xffffff;.    
20790 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
207a0 20 20 20 20 20 76 20 26 3d 20 28 4d 41 58 5f 52       v &= (MAX_R
207b0 4f 57 49 44 3e 3e 31 29 3b 20 2f 2a 20 65 6e 73  OWID>>1); /* ens
207c0 75 72 65 20 64 6f 65 73 6e 27 74 20 67 6f 20 6e  ure doesn't go n
207d0 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 20 20 20  egative */.     
207e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 76 2b 2b     }.        v++
207f0 3b 20 2f 2a 20 65 6e 73 75 72 65 20 6e 6f 6e 2d  ; /* ensure non-
20800 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  zero */.      }.
20810 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
20820 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 3d 3d  LITE_OK && res==
20830 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
20840 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 20 20  = SQLITE_FULL;  
20850 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 38 32 31 39   /* IMP: R-38219
20860 2d 35 33 30 30 32 20 2a 2f 0a 20 20 20 20 20 20  -53002 */.      
20870 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
20880 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
20890 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
208a0 20 76 3e 30 20 29 3b 20 20 2f 2a 20 45 56 3a 20   v>0 );  /* EV: 
208b0 52 2d 34 30 38 31 32 2d 30 33 35 37 30 20 2a 2f  R-40812-03570 */
208c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e 72  .    }.    pC->r
208d0 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b  owidIsValid = 0;
208e0 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65  .    pC->deferre
208f0 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20  dMoveto = 0;.   
20900 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
20910 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
20920 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20    }.  pOut->u.i 
20930 3d 20 76 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  = v;.  break;.}.
20940 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 73 65  ./* Opcode: Inse
20950 72 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50  rt P1 P2 P3 P4 P
20960 35 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  5.**.** Write an
20970 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
20980 74 61 62 6c 65 20 6f 66 20 63 75 72 73 6f 72 20  table of cursor 
20990 50 31 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  P1.  A new entry
209a0 20 69 73 0a 2a 2a 20 63 72 65 61 74 65 64 20 69   is.** created i
209b0 66 20 69 74 20 64 6f 65 73 6e 27 74 20 61 6c 72  f it doesn't alr
209c0 65 61 64 79 20 65 78 69 73 74 20 6f 72 20 74 68  eady exist or th
209d0 65 20 64 61 74 61 20 66 6f 72 20 61 6e 20 65 78  e data for an ex
209e0 69 73 74 69 6e 67 0a 2a 2a 20 65 6e 74 72 79 20  isting.** entry 
209f0 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  is overwritten. 
20a00 20 54 68 65 20 64 61 74 61 20 69 73 20 74 68 65   The data is the
20a10 20 76 61 6c 75 65 20 4d 45 4d 5f 42 6c 6f 62 20   value MEM_Blob 
20a20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
20a30 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 32 2e  er.** number P2.
20a40 20 54 68 65 20 6b 65 79 20 69 73 20 73 74 6f 72   The key is stor
20a50 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
20a60 33 2e 20 54 68 65 20 6b 65 79 20 6d 75 73 74 0a  3. The key must.
20a70 2a 2a 20 62 65 20 61 20 4d 45 4d 5f 49 6e 74 2e  ** be a MEM_Int.
20a80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50  .**.** If the OP
20a90 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 66 6c 61  FLAG_NCHANGE fla
20aa0 67 20 6f 66 20 50 35 20 69 73 20 73 65 74 2c 20  g of P5 is set, 
20ab0 74 68 65 6e 20 74 68 65 20 72 6f 77 20 63 68 61  then the row cha
20ac0 6e 67 65 20 63 6f 75 6e 74 20 69 73 0a 2a 2a 20  nge count is.** 
20ad0 69 6e 63 72 65 6d 65 6e 74 65 64 20 28 6f 74 68  incremented (oth
20ae0 65 72 77 69 73 65 20 6e 6f 74 29 2e 20 20 49 66  erwise not).  If
20af0 20 74 68 65 20 4f 50 46 4c 41 47 5f 4c 41 53 54   the OPFLAG_LAST
20b00 52 4f 57 49 44 20 66 6c 61 67 20 6f 66 20 50 35  ROWID flag of P5
20b10 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 6e   is set,.** then
20b20 20 72 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64   rowid is stored
20b30 20 66 6f 72 20 73 75 62 73 65 71 75 65 6e 74 20   for subsequent 
20b40 72 65 74 75 72 6e 20 62 79 20 74 68 65 0a 2a 2a  return by the.**
20b50 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
20b60 73 65 72 74 5f 72 6f 77 69 64 28 29 20 66 75 6e  sert_rowid() fun
20b70 63 74 69 6f 6e 20 28 6f 74 68 65 72 77 69 73 65  ction (otherwise
20b80 20 69 74 20 69 73 20 75 6e 6d 6f 64 69 66 69 65   it is unmodifie
20b90 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  d)..**.** If the
20ba0 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
20bb0 45 53 55 4c 54 20 66 6c 61 67 20 6f 66 20 50 35  ESULT flag of P5
20bc0 20 69 73 20 73 65 74 20 61 6e 64 20 69 66 20 74   is set and if t
20bd0 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
20be0 74 68 65 20 6c 61 73 74 20 73 65 65 6b 20 6f 70  the last seek op
20bf0 65 72 61 74 69 6f 6e 20 28 4f 50 5f 4e 6f 74 45  eration (OP_NotE
20c00 78 69 73 74 73 29 20 77 61 73 20 61 20 73 75 63  xists) was a suc
20c10 63 65 73 73 2c 20 74 68 65 6e 20 74 68 69 73 0a  cess, then this.
20c20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c  ** operation wil
20c30 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  l not attempt to
20c40 20 66 69 6e 64 20 74 68 65 20 61 70 70 72 6f 70   find the approp
20c50 72 69 61 74 65 20 72 6f 77 20 62 65 66 6f 72 65  riate row before
20c60 20 64 6f 69 6e 67 0a 2a 2a 20 74 68 65 20 69 6e   doing.** the in
20c70 73 65 72 74 20 62 75 74 20 77 69 6c 6c 20 69 6e  sert but will in
20c80 73 74 65 61 64 20 6f 76 65 72 77 72 69 74 65 20  stead overwrite 
20c90 74 68 65 20 72 6f 77 20 74 68 61 74 20 74 68 65  the row that the
20ca0 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 75   cursor is.** cu
20cb0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
20cc0 20 74 6f 2e 20 20 50 72 65 73 75 6d 61 62 6c 79   to.  Presumably
20cd0 2c 20 74 68 65 20 70 72 69 6f 72 20 4f 50 5f 4e  , the prior OP_N
20ce0 6f 74 45 78 69 73 74 73 20 6f 70 63 6f 64 65 0a  otExists opcode.
20cf0 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  ** has already p
20d00 6f 73 69 74 69 6f 6e 65 64 20 74 68 65 20 63 75  ositioned the cu
20d10 72 73 6f 72 20 63 6f 72 72 65 63 74 6c 79 2e 20  rsor correctly. 
20d20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
20d30 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 74 68 61 74  mization.** that
20d40 20 62 6f 6f 73 74 73 20 70 65 72 66 6f 72 6d 61   boosts performa
20d50 6e 63 65 20 62 79 20 61 76 6f 69 64 69 6e 67 20  nce by avoiding 
20d60 72 65 64 75 6e 64 61 6e 74 20 73 65 65 6b 73 2e  redundant seeks.
20d70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50  .**.** If the OP
20d80 46 4c 41 47 5f 49 53 55 50 44 41 54 45 20 66 6c  FLAG_ISUPDATE fl
20d90 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
20da0 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 70  this opcode is p
20db0 61 72 74 20 6f 66 20 61 6e 0a 2a 2a 20 55 50 44  art of an.** UPD
20dc0 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ATE operation.  
20dd0 4f 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68  Otherwise (if th
20de0 65 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 29  e flag is clear)
20df0 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63 6f 64   then this opcod
20e00 65 0a 2a 2a 20 69 73 20 70 61 72 74 20 6f 66 20  e.** is part of 
20e10 61 6e 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  an INSERT operat
20e20 69 6f 6e 2e 20 20 54 68 65 20 64 69 66 66 65 72  ion.  The differ
20e30 65 6e 63 65 20 69 73 20 6f 6e 6c 79 20 69 6d 70  ence is only imp
20e40 6f 72 74 61 6e 74 20 74 6f 0a 2a 2a 20 74 68 65  ortant to.** the
20e50 20 75 70 64 61 74 65 20 68 6f 6f 6b 2e 0a 2a 2a   update hook..**
20e60 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 50 34  .** Parameter P4
20e70 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 20   may point to a 
20e80 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
20e90 67 20 74 68 65 20 74 61 62 6c 65 2d 6e 61 6d 65  g the table-name
20ea0 2c 20 6f 72 0a 2a 2a 20 6d 61 79 20 62 65 20 4e  , or.** may be N
20eb0 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ULL. If it is no
20ec0 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
20ed0 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 0a 2a 2a   update-hook .**
20ee0 20 28 73 71 6c 69 74 65 33 2e 78 55 70 64 61 74   (sqlite3.xUpdat
20ef0 65 43 61 6c 6c 62 61 63 6b 29 20 69 73 20 69 6e  eCallback) is in
20f00 76 6f 6b 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  voked following 
20f10 61 20 73 75 63 63 65 73 73 66 75 6c 20 69 6e 73  a successful ins
20f20 65 72 74 2e 0a 2a 2a 0a 2a 2a 20 28 57 41 52 4e  ert..**.** (WARN
20f30 49 4e 47 2f 54 4f 44 4f 3a 20 49 66 20 50 31 20  ING/TODO: If P1 
20f40 69 73 20 61 20 70 73 65 75 64 6f 2d 63 75 72 73  is a pseudo-curs
20f50 6f 72 20 61 6e 64 20 50 32 20 69 73 20 64 79 6e  or and P2 is dyn
20f60 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f  amically.** allo
20f70 63 61 74 65 64 2c 20 74 68 65 6e 20 6f 77 6e 65  cated, then owne
20f80 72 73 68 69 70 20 6f 66 20 50 32 20 69 73 20 74  rship of P2 is t
20f90 72 61 6e 73 66 65 72 72 65 64 20 74 6f 20 74 68  ransferred to th
20fa0 65 20 70 73 65 75 64 6f 2d 63 75 72 73 6f 72 0a  e pseudo-cursor.
20fb0 2a 2a 20 61 6e 64 20 72 65 67 69 73 74 65 72 20  ** and register 
20fc0 50 32 20 62 65 63 6f 6d 65 73 20 65 70 68 65 6d  P2 becomes ephem
20fd0 65 72 61 6c 2e 20 20 49 66 20 74 68 65 20 63 75  eral.  If the cu
20fe0 72 73 6f 72 20 69 73 20 63 68 61 6e 67 65 64 2c  rsor is changed,
20ff0 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
21000 20 72 65 67 69 73 74 65 72 20 50 32 20 77 69 6c   register P2 wil
21010 6c 20 74 68 65 6e 20 63 68 61 6e 67 65 2e 20 20  l then change.  
21020 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 64  Make sure this d
21030 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 61 75 73 65  oes not.** cause
21040 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 29 0a   any problems.).
21050 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72  **.** This instr
21060 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b  uction only work
21070 73 20 6f 6e 20 74 61 62 6c 65 73 2e 20 20 54 68  s on tables.  Th
21080 65 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e 73  e equivalent ins
21090 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  truction.** for 
210a0 69 6e 64 69 63 65 73 20 69 73 20 4f 50 5f 49 64  indices is OP_Id
210b0 78 49 6e 73 65 72 74 2e 0a 2a 2f 0a 2f 2a 20 4f  xInsert..*/./* O
210c0 70 63 6f 64 65 3a 20 49 6e 73 65 72 74 49 6e 74  pcode: InsertInt
210d0 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
210e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
210f0 20 65 78 61 63 74 6c 79 20 6c 69 6b 65 20 4f 50   exactly like OP
21100 5f 49 6e 73 65 72 74 20 65 78 63 65 70 74 20 74  _Insert except t
21110 68 61 74 20 74 68 65 20 6b 65 79 20 69 73 20 74  hat the key is t
21120 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 76 61  he.** integer va
21130 6c 75 65 20 50 33 2c 20 6e 6f 74 20 74 68 65 20  lue P3, not the 
21140 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
21150 65 67 65 72 20 73 74 6f 72 65 64 20 69 6e 20 72  eger stored in r
21160 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2f 0a 63  egister P3..*/.c
21170 61 73 65 20 4f 50 5f 49 6e 73 65 72 74 3a 20 0a  ase OP_Insert: .
21180 63 61 73 65 20 4f 50 5f 49 6e 73 65 72 74 49 6e  case OP_InsertIn
21190 74 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 44 61 74  t: {.  Mem *pDat
211a0 61 3b 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 20  a;       /* MEM 
211b0 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 64 61 74  cell holding dat
211c0 61 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64  a for the record
211d0 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20   to be inserted 
211e0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4b 65 79 3b 20  */.  Mem *pKey; 
211f0 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 20 63 65         /* MEM ce
21200 6c 6c 20 68 6f 6c 64 69 6e 67 20 6b 65 79 20 20  ll holding key  
21210 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 2a  for the record *
21220 2f 0a 20 20 69 36 34 20 69 4b 65 79 3b 20 20 20  /.  i64 iKey;   
21230 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74        /* The int
21240 65 67 65 72 20 52 4f 57 49 44 20 6f 72 20 6b 65  eger ROWID or ke
21250 79 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64  y for the record
21260 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20   to be inserted 
21270 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
21280 2a 70 43 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72  *pC;   /* Cursor
21290 20 74 6f 20 74 61 62 6c 65 20 69 6e 74 6f 20 77   to table into w
212a0 68 69 63 68 20 69 6e 73 65 72 74 20 69 73 20 77  hich insert is w
212b0 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
212c0 6e 5a 65 72 6f 3b 20 20 20 20 20 20 20 20 2f 2a  nZero;        /*
212d0 20 4e 75 6d 62 65 72 20 6f 66 20 7a 65 72 6f 2d   Number of zero-
212e0 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
212f0 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b 52 65 73  */.  int seekRes
21300 75 6c 74 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74  ult;   /* Result
21310 20 6f 66 20 70 72 69 6f 72 20 73 65 65 6b 20 6f   of prior seek o
21320 72 20 30 20 69 66 20 6e 6f 20 55 53 45 53 45 45  r 0 if no USESEE
21330 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 2a 2f 0a  KRESULT flag */.
21340 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
21350 62 3b 20 20 2f 2a 20 64 61 74 61 62 61 73 65 20  b;  /* database 
21360 6e 61 6d 65 20 2d 20 75 73 65 64 20 62 79 20 74  name - used by t
21370 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 20 2a  he update hook *
21380 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
21390 7a 54 62 6c 3b 20 2f 2a 20 54 61 62 6c 65 20 6e  zTbl; /* Table n
213a0 61 6d 65 20 2d 20 75 73 65 64 20 62 79 20 74 68  ame - used by th
213b0 65 20 6f 70 64 61 74 65 20 68 6f 6f 6b 20 2a 2f  e opdate hook */
213c0 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
213d0 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 66       /* Opcode f
213e0 6f 72 20 75 70 64 61 74 65 20 68 6f 6f 6b 3a 20  or update hook: 
213f0 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 6f 72  SQLITE_UPDATE or
21400 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 2a   SQLITE_INSERT *
21410 2f 0a 0a 20 20 70 44 61 74 61 20 3d 20 26 61 4d  /..  pData = &aM
21420 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61  em[pOp->p2];.  a
21430 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
21440 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
21450 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73  nCursor );.  ass
21460 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
21470 70 44 61 74 61 29 20 29 3b 0a 20 20 70 43 20 3d  pData) );.  pC =
21480 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
21490 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
214a0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
214b0 20 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20   pC->pCursor!=0 
214c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
214d0 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67 3d  >pseudoTableReg=
214e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
214f0 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20  pC->isTable );. 
21500 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
21510 70 4f 70 2d 3e 70 32 2c 20 70 44 61 74 61 29 3b  pOp->p2, pData);
21520 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ..  if( pOp->opc
21530 6f 64 65 3d 3d 4f 50 5f 49 6e 73 65 72 74 20 29  ode==OP_Insert )
21540 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 26 61 4d  {.    pKey = &aM
21550 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20  em[pOp->p3];.   
21560 20 61 73 73 65 72 74 28 20 70 4b 65 79 2d 3e 66   assert( pKey->f
21570 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
21580 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
21590 6d 49 73 56 61 6c 69 64 28 70 4b 65 79 29 20 29  mIsValid(pKey) )
215a0 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54  ;.    REGISTER_T
215b0 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4b  RACE(pOp->p3, pK
215c0 65 79 29 3b 0a 20 20 20 20 69 4b 65 79 20 3d 20  ey);.    iKey = 
215d0 70 4b 65 79 2d 3e 75 2e 69 3b 0a 20 20 7d 65 6c  pKey->u.i;.  }el
215e0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
215f0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
21600 49 6e 73 65 72 74 49 6e 74 20 29 3b 0a 20 20 20  InsertInt );.   
21610 20 69 4b 65 79 20 3d 20 70 4f 70 2d 3e 70 33 3b   iKey = pOp->p3;
21620 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 70 2d  .  }..  if( pOp-
21630 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48  >p5 & OPFLAG_NCH
21640 41 4e 47 45 20 29 20 70 2d 3e 6e 43 68 61 6e 67  ANGE ) p->nChang
21650 65 2b 2b 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  e++;.  if( pOp->
21660 70 35 20 26 20 4f 50 46 4c 41 47 5f 4c 41 53 54  p5 & OPFLAG_LAST
21670 52 4f 57 49 44 20 29 20 64 62 2d 3e 6c 61 73 74  ROWID ) db->last
21680 52 6f 77 69 64 20 3d 20 6c 61 73 74 52 6f 77 69  Rowid = lastRowi
21690 64 20 3d 20 69 4b 65 79 3b 0a 20 20 69 66 28 20  d = iKey;.  if( 
216a0 70 44 61 74 61 2d 3e 66 6c 61 67 73 20 26 20 4d  pData->flags & M
216b0 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70  EM_Null ){.    p
216c0 44 61 74 61 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20  Data->z = 0;.   
216d0 20 70 44 61 74 61 2d 3e 6e 20 3d 20 30 3b 0a 20   pData->n = 0;. 
216e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
216f0 72 74 28 20 70 44 61 74 61 2d 3e 66 6c 61 67 73  rt( pData->flags
21700 20 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d   & (MEM_Blob|MEM
21710 5f 53 74 72 29 20 29 3b 0a 20 20 7d 0a 20 20 73  _Str) );.  }.  s
21720 65 65 6b 52 65 73 75 6c 74 20 3d 20 28 28 70 4f  eekResult = ((pO
21730 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 55  p->p5 & OPFLAG_U
21740 53 45 53 45 45 4b 52 45 53 55 4c 54 29 20 3f 20  SESEEKRESULT) ? 
21750 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3a  pC->seekResult :
21760 20 30 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61   0);.  if( pData
21770 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
21780 72 6f 20 29 7b 0a 20 20 20 20 6e 5a 65 72 6f 20  ro ){.    nZero 
21790 3d 20 70 44 61 74 61 2d 3e 75 2e 6e 5a 65 72 6f  = pData->u.nZero
217a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
217b0 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Zero = 0;.  }.  
217c0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
217d0 61 63 68 65 64 52 6f 77 69 64 28 70 43 2d 3e 70  achedRowid(pC->p
217e0 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 72 63  Cursor, 0);.  rc
217f0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
21800 6e 73 65 72 74 28 70 43 2d 3e 70 43 75 72 73 6f  nsert(pC->pCurso
21810 72 2c 20 30 2c 20 69 4b 65 79 2c 0a 20 20 20 20  r, 0, iKey,.    
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21830 20 20 20 20 20 20 70 44 61 74 61 2d 3e 7a 2c 20        pData->z, 
21840 70 44 61 74 61 2d 3e 6e 2c 20 6e 5a 65 72 6f 2c  pData->n, nZero,
21850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21860 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
21870 70 35 20 26 20 4f 50 46 4c 41 47 5f 41 50 50 45  p5 & OPFLAG_APPE
21880 4e 44 2c 20 73 65 65 6b 52 65 73 75 6c 74 0a 20  ND, seekResult. 
21890 20 29 3b 0a 20 20 70 43 2d 3e 72 6f 77 69 64 49   );.  pC->rowidI
218a0 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 70 43  sValid = 0;.  pC
218b0 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
218c0 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68   = 0;.  pC->cach
218d0 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
218e0 53 54 41 4c 45 3b 0a 0a 20 20 2f 2a 20 49 6e 76  STALE;..  /* Inv
218f0 6f 6b 65 20 74 68 65 20 75 70 64 61 74 65 2d 68  oke the update-h
21900 6f 6f 6b 20 69 66 20 72 65 71 75 69 72 65 64 2e  ook if required.
21910 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
21920 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 78  LITE_OK && db->x
21930 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26  UpdateCallback &
21940 26 20 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20  & pOp->p4.z ){. 
21950 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62     zDb = db->aDb
21960 5b 70 43 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  [pC->iDb].zName;
21970 0a 20 20 20 20 7a 54 62 6c 20 3d 20 70 4f 70 2d  .    zTbl = pOp-
21980 3e 70 34 2e 7a 3b 0a 20 20 20 20 6f 70 20 3d 20  >p4.z;.    op = 
21990 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c  ((pOp->p5 & OPFL
219a0 41 47 5f 49 53 55 50 44 41 54 45 29 20 3f 20 53  AG_ISUPDATE) ? S
219b0 51 4c 49 54 45 5f 55 50 44 41 54 45 20 3a 20 53  QLITE_UPDATE : S
219c0 51 4c 49 54 45 5f 49 4e 53 45 52 54 29 3b 0a 20  QLITE_INSERT);. 
219d0 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
219e0 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 64 62  sTable );.    db
219f0 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63  ->xUpdateCallbac
21a00 6b 28 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67  k(db->pUpdateArg
21a10 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c  , op, zDb, zTbl,
21a20 20 69 4b 65 79 29 3b 0a 20 20 20 20 61 73 73 65   iKey);.    asse
21a30 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29  rt( pC->iDb>=0 )
21a40 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
21a50 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65 6c  ../* Opcode: Del
21a60 65 74 65 20 50 31 20 50 32 20 2a 20 50 34 20 2a  ete P1 P2 * P4 *
21a70 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  .**.** Delete th
21a80 65 20 72 65 63 6f 72 64 20 61 74 20 77 68 69 63  e record at whic
21a90 68 20 74 68 65 20 50 31 20 63 75 72 73 6f 72 20  h the P1 cursor 
21aa0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
21ab0 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
21ac0 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20   cursor will be 
21ad0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
21ae0 20 65 69 74 68 65 72 20 74 68 65 20 6e 65 78 74   either the next
21af0 20 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73   or the previous
21b00 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e 20 74 68  .** record in th
21b10 65 20 74 61 62 6c 65 2e 20 49 66 20 69 74 20 69  e table. If it i
21b20 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
21b30 61 74 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f  at the next reco
21b40 72 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  rd, then.** the 
21b50 6e 65 78 74 20 4e 65 78 74 20 69 6e 73 74 72 75  next Next instru
21b60 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 20  ction will be a 
21b70 6e 6f 2d 6f 70 2e 20 20 48 65 6e 63 65 20 69 74  no-op.  Hence it
21b80 20 69 73 20 4f 4b 20 74 6f 20 64 65 6c 65 74 65   is OK to delete
21b90 0a 2a 2a 20 61 20 72 65 63 6f 72 64 20 66 72 6f  .** a record fro
21ba0 6d 20 77 69 74 68 69 6e 20 61 6e 20 4e 65 78 74  m within an Next
21bb0 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   loop..**.** If 
21bc0 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  the OPFLAG_NCHAN
21bd0 47 45 20 66 6c 61 67 20 6f 66 20 50 32 20 69 73  GE flag of P2 is
21be0 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72   set, then the r
21bf0 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20  ow change count 
21c00 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65  is.** incremente
21c10 64 20 28 6f 74 68 65 72 77 69 73 65 20 6e 6f 74  d (otherwise not
21c20 29 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 6d 75 73 74  )..**.** P1 must
21c30 20 6e 6f 74 20 62 65 20 70 73 65 75 64 6f 2d 74   not be pseudo-t
21c40 61 62 6c 65 2e 20 20 49 74 20 68 61 73 20 74 6f  able.  It has to
21c50 20 62 65 20 61 20 72 65 61 6c 20 74 61 62 6c 65   be a real table
21c60 20 77 69 74 68 0a 2a 2a 20 6d 75 6c 74 69 70 6c   with.** multipl
21c70 65 20 72 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  e rows..**.** If
21c80 20 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c   P4 is not NULL,
21c90 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
21ca0 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
21cb0 65 20 74 68 61 74 20 50 31 20 69 73 0a 2a 2a 20  e that P1 is.** 
21cc0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
21cd0 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 20 77 69  e update hook wi
21ce0 6c 6c 20 62 65 20 69 6e 76 6f 6b 65 64 2c 20 69  ll be invoked, i
21cf0 66 20 69 74 20 65 78 69 73 74 73 2e 0a 2a 2a 20  f it exists..** 
21d00 49 66 20 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c  If P4 is not NUL
21d10 4c 20 74 68 65 6e 20 74 68 65 20 50 31 20 63 75  L then the P1 cu
21d20 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62  rsor must have b
21d30 65 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 0a 2a  een positioned.*
21d40 2a 20 75 73 69 6e 67 20 4f 50 5f 4e 6f 74 46 6f  * using OP_NotFo
21d50 75 6e 64 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  und prior to inv
21d60 6f 6b 69 6e 67 20 74 68 69 73 20 6f 70 63 6f 64  oking this opcod
21d70 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65  e..*/.case OP_De
21d80 6c 65 74 65 3a 20 7b 0a 20 20 69 36 34 20 69 4b  lete: {.  i64 iK
21d90 65 79 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  ey;.  VdbeCursor
21da0 20 2a 70 43 3b 0a 0a 20 20 69 4b 65 79 20 3d 20   *pC;..  iKey = 
21db0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  0;.  assert( pOp
21dc0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
21dd0 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
21de0 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
21df0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
21e00 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
21e10 61 73 73 65 72 74 28 20 70 43 2d 3e 70 43 75 72  assert( pC->pCur
21e20 73 6f 72 21 3d 30 20 29 3b 20 20 2f 2a 20 4f 6e  sor!=0 );  /* On
21e30 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 72 65 61  ly valid for rea
21e40 6c 20 74 61 62 6c 65 73 2c 20 6e 6f 20 70 73 65  l tables, no pse
21e50 75 64 6f 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20  udotables */..  
21e60 2f 2a 20 49 66 20 74 68 65 20 75 70 64 61 74 65  /* If the update
21e70 2d 68 6f 6f 6b 20 77 69 6c 6c 20 62 65 20 69 6e  -hook will be in
21e80 76 6f 6b 65 64 2c 20 73 65 74 20 69 4b 65 79 20  voked, set iKey 
21e90 74 6f 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  to the rowid of 
21ea0 74 68 65 0a 20 20 2a 2a 20 72 6f 77 20 62 65 69  the.  ** row bei
21eb0 6e 67 20 64 65 6c 65 74 65 64 2e 0a 20 20 2a 2f  ng deleted..  */
21ec0 0a 20 20 69 66 28 20 64 62 2d 3e 78 55 70 64 61  .  if( db->xUpda
21ed0 74 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 70 4f  teCallback && pO
21ee0 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20 20 61  p->p4.z ){.    a
21ef0 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62  ssert( pC->isTab
21f00 6c 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  le );.    assert
21f10 28 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c  ( pC->rowidIsVal
21f20 69 64 20 29 3b 20 20 2f 2a 20 6c 61 73 74 52 6f  id );  /* lastRo
21f30 77 69 64 20 73 65 74 20 62 79 20 70 72 65 76 69  wid set by previ
21f40 6f 75 73 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20  ous OP_NotFound 
21f50 2a 2f 0a 20 20 20 20 69 4b 65 79 20 3d 20 70 43  */.    iKey = pC
21f60 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 7d  ->lastRowid;.  }
21f70 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 50 5f 44 65  ..  /* The OP_De
21f80 6c 65 74 65 20 6f 70 63 6f 64 65 20 61 6c 77 61  lete opcode alwa
21f90 79 73 20 66 6f 6c 6c 6f 77 73 20 61 6e 20 4f 50  ys follows an OP
21fa0 5f 4e 6f 74 45 78 69 73 74 73 20 6f 72 20 4f 50  _NotExists or OP
21fb0 5f 4c 61 73 74 20 6f 72 0a 20 20 2a 2a 20 4f 50  _Last or.  ** OP
21fc0 5f 43 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 73  _Column on the s
21fd0 61 6d 65 20 74 61 62 6c 65 20 77 69 74 68 6f 75  ame table withou
21fe0 74 20 61 6e 79 20 69 6e 74 65 72 76 65 6e 69 6e  t any intervenin
21ff0 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61  g operations tha
22000 74 0a 20 20 2a 2a 20 6d 69 67 68 74 20 6d 6f 76  t.  ** might mov
22010 65 20 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20  e or invalidate 
22020 74 68 65 20 63 75 72 73 6f 72 2e 20 20 48 65 6e  the cursor.  Hen
22030 63 65 20 63 75 72 73 6f 72 20 70 43 20 69 73 20  ce cursor pC is 
22040 61 6c 77 61 79 73 20 70 6f 69 6e 74 69 6e 67 0a  always pointing.
22050 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 6f 77 20    ** to the row 
22060 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 61 6e  to be deleted an
22070 64 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  d the sqlite3Vdb
22080 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29 20  eCursorMoveto() 
22090 6f 70 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 62  operation.  ** b
220a0 65 6c 6f 77 20 69 73 20 61 6c 77 61 79 73 20 61  elow is always a
220b0 20 6e 6f 2d 6f 70 20 61 6e 64 20 63 61 6e 6e 6f   no-op and canno
220c0 74 20 66 61 69 6c 2e 20 20 57 65 20 77 69 6c 6c  t fail.  We will
220d0 20 72 75 6e 20 69 74 20 61 6e 79 68 6f 77 2c 20   run it anyhow, 
220e0 74 68 6f 75 67 68 2c 0a 20 20 2a 2a 20 74 6f 20  though,.  ** to 
220f0 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 66 75  guard against fu
22100 74 75 72 65 20 63 68 61 6e 67 65 73 20 74 6f 20  ture changes to 
22110 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
22120 6f 72 2e 0a 20 20 2a 2a 2f 0a 20 20 61 73 73 65  or..  **/.  asse
22130 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64  rt( pC->deferred
22140 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 72  Moveto==0 );.  r
22150 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
22160 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b  ursorMoveto(pC);
22170 0a 20 20 69 66 28 20 4e 45 56 45 52 28 72 63 21  .  if( NEVER(rc!
22180 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 20 67 6f  =SQLITE_OK) ) go
22190 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
221a0 65 72 72 6f 72 3b 0a 0a 20 20 73 71 6c 69 74 65  error;..  sqlite
221b0 33 42 74 72 65 65 53 65 74 43 61 63 68 65 64 52  3BtreeSetCachedR
221c0 6f 77 69 64 28 70 43 2d 3e 70 43 75 72 73 6f 72  owid(pC->pCursor
221d0 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
221e0 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
221f0 70 43 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20  pC->pCursor);.  
22200 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
22210 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 0a  = CACHE_STALE;..
22220 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
22230 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72  update-hook if r
22240 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
22250 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22260 26 26 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61  && db->xUpdateCa
22270 6c 6c 62 61 63 6b 20 26 26 20 70 4f 70 2d 3e 70  llback && pOp->p
22280 34 2e 7a 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  4.z ){.    const
22290 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
222a0 3e 61 44 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a 4e  >aDb[pC->iDb].zN
222b0 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
222c0 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 4f 70 2d  har *zTbl = pOp-
222d0 3e 70 34 2e 7a 3b 0a 20 20 20 20 64 62 2d 3e 78  >p4.z;.    db->x
222e0 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64  UpdateCallback(d
222f0 62 2d 3e 70 55 70 64 61 74 65 41 72 67 2c 20 53  b->pUpdateArg, S
22300 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 44  QLITE_DELETE, zD
22310 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 29 3b 0a  b, zTbl, iKey);.
22320 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
22330 69 44 62 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  iDb>=0 );.  }.  
22340 69 66 28 20 70 4f 70 2d 3e 70 32 20 26 20 4f 50  if( pOp->p2 & OP
22350 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29 20 70  FLAG_NCHANGE ) p
22360 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 62  ->nChange++;.  b
22370 72 65 61 6b 3b 0a 7d 0a 2f 2a 20 4f 70 63 6f 64  reak;.}./* Opcod
22380 65 3a 20 52 65 73 65 74 43 6f 75 6e 74 20 2a 20  e: ResetCount * 
22390 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68  * * * *.**.** Th
223a0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
223b0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 69 73  hange counter is
223c0 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 64   copied to the d
223d0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
223e0 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  * change counter
223f0 20 28 72 65 74 75 72 6e 65 64 20 62 79 20 73 75   (returned by su
22400 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
22410 6f 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  o sqlite3_change
22420 73 28 29 29 2e 0a 2a 2a 20 54 68 65 6e 20 74 68  s())..** Then th
22430 65 20 56 4d 73 20 69 6e 74 65 72 6e 61 6c 20 63  e VMs internal c
22440 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 72 65  hange counter re
22450 73 65 74 73 20 74 6f 20 30 2e 0a 2a 2a 20 54 68  sets to 0..** Th
22460 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74 72  is is used by tr
22470 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a  igger programs..
22480 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 65 74  */.case OP_Reset
22490 43 6f 75 6e 74 3a 20 7b 0a 20 20 73 71 6c 69 74  Count: {.  sqlit
224a0 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
224b0 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
224c0 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
224d0 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   0;.  break;.}..
224e0 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65  /* Opcode: Sorte
224f0 72 43 6f 6d 70 61 72 65 20 50 31 20 50 32 20 50  rCompare P1 P2 P
22500 33 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20  3.**.** P1 is a 
22510 73 6f 72 74 65 72 20 63 75 72 73 6f 72 2e 20 54  sorter cursor. T
22520 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
22530 63 6f 6d 70 61 72 65 73 20 74 68 65 20 72 65 63  compares the rec
22540 6f 72 64 20 62 6c 6f 62 20 69 6e 20 0a 2a 2a 20  ord blob in .** 
22550 72 65 67 69 73 74 65 72 20 50 33 20 77 69 74 68  register P3 with
22560 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
22570 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f  the sorter curso
22580 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
22590 74 73 20 74 6f 2e 0a 2a 2a 20 49 66 2c 20 65 78  ts to..** If, ex
225a0 63 6c 75 64 69 6e 67 20 74 68 65 20 72 6f 77 69  cluding the rowi
225b0 64 20 66 69 65 6c 64 73 20 61 74 20 74 68 65 20  d fields at the 
225c0 65 6e 64 2c 20 74 68 65 20 74 77 6f 20 72 65 63  end, the two rec
225d0 6f 72 64 73 20 61 72 65 20 61 20 6d 61 74 63 68  ords are a match
225e0 2c 0a 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67  ,.** fall throug
225f0 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
22600 73 74 72 75 63 74 69 6f 6e 2e 20 4f 74 68 65 72  struction. Other
22610 77 69 73 65 2c 20 6a 75 6d 70 20 74 6f 20 69 6e  wise, jump to in
22620 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 0a 2a 2f  struction P2..*/
22630 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 43  .case OP_SorterC
22640 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 56 64 62 65  ompare: {.  Vdbe
22650 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e  Cursor *pC;.  in
22660 74 20 72 65 73 3b 0a 0a 20 20 70 43 20 3d 20 70  t res;..  pC = p
22670 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
22680 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 6f  ;.  assert( isSo
22690 72 74 65 72 28 70 43 29 20 29 3b 0a 20 20 70 49  rter(pC) );.  pI
226a0 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n3 = &aMem[pOp->
226b0 70 33 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  p3];.  rc = sqli
226c0 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6f 6d  te3VdbeSorterCom
226d0 70 61 72 65 28 70 43 2c 20 70 49 6e 33 2c 20 26  pare(pC, pIn3, &
226e0 72 65 73 29 3b 0a 20 20 69 66 28 20 72 65 73 20  res);.  if( res 
226f0 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  ){.    pc = pOp-
22700 3e 70 32 2d 31 3b 0a 20 20 7d 0a 20 20 62 72 65  >p2-1;.  }.  bre
22710 61 6b 3b 0a 7d 3b 0a 0a 2f 2a 20 4f 70 63 6f 64  ak;.};../* Opcod
22720 65 3a 20 53 6f 72 74 65 72 44 61 74 61 20 50 31  e: SorterData P1
22730 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
22740 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67 69 73  Write into regis
22750 74 65 72 20 50 32 20 74 68 65 20 63 75 72 72 65  ter P2 the curre
22760 6e 74 20 73 6f 72 74 65 72 20 64 61 74 61 20 66  nt sorter data f
22770 6f 72 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72  or sorter cursor
22780 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P1..*/.case OP_
22790 53 6f 72 74 65 72 44 61 74 61 3a 20 7b 0a 20 20  SorterData: {.  
227a0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
227b0 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
227c0 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 43 20 3d  pOp->p2];.  pC =
227d0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
227e0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
227f0 2d 3e 69 73 53 6f 72 74 65 72 20 29 3b 0a 20 20  ->isSorter );.  
22800 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
22810 53 6f 72 74 65 72 52 6f 77 6b 65 79 28 70 43 2c  SorterRowkey(pC,
22820 20 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b   pOut);.  break;
22830 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  .}../* Opcode: R
22840 6f 77 44 61 74 61 20 50 31 20 50 32 20 2a 20 2a  owData P1 P2 * *
22850 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69   *.**.** Write i
22860 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 20  nto register P2 
22870 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 6f 77  the complete row
22880 20 64 61 74 61 20 66 6f 72 20 63 75 72 73 6f 72   data for cursor
22890 20 50 31 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73   P1..** There is
228a0 20 6e 6f 20 69 6e 74 65 72 70 72 65 74 61 74 69   no interpretati
228b0 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 2e 20  on of the data. 
228c0 20 0a 2a 2a 20 49 74 20 69 73 20 6a 75 73 74 20   .** It is just 
228d0 63 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68 65 20  copied onto the 
228e0 50 32 20 72 65 67 69 73 74 65 72 20 65 78 61 63  P2 register exac
228f0 74 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20 69 73  tly as .** it is
22900 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61   found in the da
22910 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
22920 2a 2a 20 49 66 20 74 68 65 20 50 31 20 63 75 72  ** If the P1 cur
22930 73 6f 72 20 6d 75 73 74 20 62 65 20 70 6f 69 6e  sor must be poin
22940 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20  ting to a valid 
22950 72 6f 77 20 28 6e 6f 74 20 61 20 4e 55 4c 4c 20  row (not a NULL 
22960 72 6f 77 29 0a 2a 2a 20 6f 66 20 61 20 72 65 61  row).** of a rea
22970 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70  l table, not a p
22980 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a  seudo-table..*/.
22990 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 4b 65  /* Opcode: RowKe
229a0 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  y P1 P2 * * *.**
229b0 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 72  .** Write into r
229c0 65 67 69 73 74 65 72 20 50 32 20 74 68 65 20 63  egister P2 the c
229d0 6f 6d 70 6c 65 74 65 20 72 6f 77 20 6b 65 79 20  omplete row key 
229e0 66 6f 72 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a  for cursor P1..*
229f0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 69 6e  * There is no in
22a00 74 65 72 70 72 65 74 61 74 69 6f 6e 20 6f 66 20  terpretation of 
22a10 74 68 65 20 64 61 74 61 2e 20 20 0a 2a 2a 20 54  the data.  .** T
22a20 68 65 20 6b 65 79 20 69 73 20 63 6f 70 69 65 64  he key is copied
22a30 20 6f 6e 74 6f 20 74 68 65 20 50 33 20 72 65 67   onto the P3 reg
22a40 69 73 74 65 72 20 65 78 61 63 74 6c 79 20 61 73  ister exactly as
22a50 20 0a 2a 2a 20 69 74 20 69 73 20 66 6f 75 6e 64   .** it is found
22a60 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
22a70 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
22a80 74 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75  the P1 cursor mu
22a90 73 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  st be pointing t
22aa0 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 20 28 6e  o a valid row (n
22ab0 6f 74 20 61 20 4e 55 4c 4c 20 72 6f 77 29 0a 2a  ot a NULL row).*
22ac0 2a 20 6f 66 20 61 20 72 65 61 6c 20 74 61 62 6c  * of a real tabl
22ad0 65 2c 20 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d  e, not a pseudo-
22ae0 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  table..*/.case O
22af0 50 5f 52 6f 77 4b 65 79 3a 0a 63 61 73 65 20 4f  P_RowKey:.case O
22b00 50 5f 52 6f 77 44 61 74 61 3a 20 7b 0a 20 20 56  P_RowData: {.  V
22b10 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
22b20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72   BtCursor *pCrsr
22b30 3b 0a 20 20 75 33 32 20 6e 3b 0a 20 20 69 36 34  ;.  u32 n;.  i64
22b40 20 6e 36 34 3b 0a 0a 20 20 70 4f 75 74 20 3d 20   n64;..  pOut = 
22b50 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
22b60 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
22b70 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 0a 20 20  ge(p, pOut);..  
22b80 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 52 6f 77  /* Note that Row
22b90 4b 65 79 20 61 6e 64 20 52 6f 77 44 61 74 61 20  Key and RowData 
22ba0 61 72 65 20 72 65 61 6c 6c 79 20 65 78 61 63 74  are really exact
22bb0 6c 79 20 74 68 65 20 73 61 6d 65 20 69 6e 73 74  ly the same inst
22bc0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 61 73 73  ruction */.  ass
22bd0 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
22be0 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
22bf0 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20  ursor );.  pC = 
22c00 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
22c10 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  ];.  assert( pC-
22c20 3e 69 73 53 6f 72 74 65 72 3d 3d 30 20 29 3b 0a  >isSorter==0 );.
22c30 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73    assert( pC->is
22c40 54 61 62 6c 65 20 7c 7c 20 70 4f 70 2d 3e 6f 70  Table || pOp->op
22c50 63 6f 64 65 21 3d 4f 50 5f 52 6f 77 44 61 74 61  code!=OP_RowData
22c60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
22c70 2d 3e 69 73 49 6e 64 65 78 20 7c 7c 20 70 4f 70  ->isIndex || pOp
22c80 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
22c90 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
22ca0 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
22cb0 65 72 74 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77  ert( pC->nullRow
22cc0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
22cd0 20 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65   pC->pseudoTable
22ce0 52 65 67 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Reg==0 );.  asse
22cf0 72 74 28 20 70 43 2d 3e 70 43 75 72 73 6f 72 21  rt( pC->pCursor!
22d00 3d 30 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20  =0 );.  pCrsr = 
22d10 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 61  pC->pCursor;.  a
22d20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
22d30 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
22d40 28 70 43 72 73 72 29 20 29 3b 0a 0a 20 20 2f 2a  (pCrsr) );..  /*
22d50 20 54 68 65 20 4f 50 5f 52 6f 77 4b 65 79 20 61   The OP_RowKey a
22d60 6e 64 20 4f 50 5f 52 6f 77 44 61 74 61 20 6f 70  nd OP_RowData op
22d70 63 6f 64 65 73 20 61 6c 77 61 79 73 20 66 6f 6c  codes always fol
22d80 6c 6f 77 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  low OP_NotExists
22d90 20 6f 72 0a 20 20 2a 2a 20 4f 50 5f 52 65 77 69   or.  ** OP_Rewi
22da0 6e 64 2f 4f 70 5f 4e 65 78 74 20 77 69 74 68 20  nd/Op_Next with 
22db0 6e 6f 20 69 6e 74 65 72 76 65 6e 69 6e 67 20 69  no intervening i
22dc0 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74  nstructions that
22dd0 20 6d 69 67 68 74 20 69 6e 76 61 6c 69 64 61 74   might invalidat
22de0 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  e.  ** the curso
22df0 72 2e 20 20 48 65 6e 63 65 20 74 68 65 20 66 6f  r.  Hence the fo
22e00 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 56  llowing sqlite3V
22e10 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
22e20 29 20 63 61 6c 6c 20 69 73 20 61 6c 77 61 79 73  ) call is always
22e30 0a 20 20 2a 2a 20 61 20 6e 6f 2d 6f 70 20 61 6e  .  ** a no-op an
22e40 64 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  d can never fail
22e50 2e 20 20 42 75 74 20 77 65 20 6c 65 61 76 65 20  .  But we leave 
22e60 69 74 20 69 6e 20 70 6c 61 63 65 20 61 73 20 61  it in place as a
22e70 20 73 61 66 65 74 79 2e 0a 20 20 2a 2f 0a 20 20   safety..  */.  
22e80 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65  assert( pC->defe
22e90 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
22ea0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
22eb0 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
22ec0 70 43 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  pC);.  if( NEVER
22ed0 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc!=SQLITE_OK) 
22ee0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
22ef0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 69 66  _to_error;..  if
22f00 28 20 70 43 2d 3e 69 73 49 6e 64 65 78 20 29 7b  ( pC->isIndex ){
22f10 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43  .    assert( !pC
22f20 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20  ->isTable );.   
22f30 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20   VVA_ONLY(rc =) 
22f40 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
22f50 69 7a 65 28 70 43 72 73 72 2c 20 26 6e 36 34 29  ize(pCrsr, &n64)
22f60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
22f70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
22f80 20 20 2f 2a 20 54 72 75 65 20 62 65 63 61 75 73    /* True becaus
22f90 65 20 6f 66 20 43 75 72 73 6f 72 4d 6f 76 65 74  e of CursorMovet
22fa0 6f 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 20 2a  o() call above *
22fb0 2f 0a 20 20 20 20 69 66 28 20 6e 36 34 3e 64 62  /.    if( n64>db
22fc0 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
22fd0 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b  LIMIT_LENGTH] ){
22fe0 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f  .      goto too_
22ff0 62 69 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  big;.    }.    n
23000 20 3d 20 28 75 33 32 29 6e 36 34 3b 0a 20 20 7d   = (u32)n64;.  }
23010 65 6c 73 65 7b 0a 20 20 20 20 56 56 41 5f 4f 4e  else{.    VVA_ON
23020 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33  LY(rc =) sqlite3
23030 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 70 43  BtreeDataSize(pC
23040 72 73 72 2c 20 26 6e 29 3b 0a 20 20 20 20 61 73  rsr, &n);.    as
23050 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
23060 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 44 61 74  _OK );    /* Dat
23070 61 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66  aSize() cannot f
23080 61 69 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ail */.    if( n
23090 3e 28 75 33 32 29 64 62 2d 3e 61 4c 69 6d 69 74  >(u32)db->aLimit
230a0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
230b0 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 20 20 67  NGTH] ){.      g
230c0 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20  oto too_big;.   
230d0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c   }.  }.  if( sql
230e0 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
230f0 70 4f 75 74 2c 20 6e 2c 20 30 29 20 29 7b 0a 20  pOut, n, 0) ){. 
23100 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
23110 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20    }.  pOut->n = 
23120 6e 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46  n;.  MemSetTypeF
23130 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 42 6c  lag(pOut, MEM_Bl
23140 6f 62 29 3b 0a 20 20 69 66 28 20 70 43 2d 3e 69  ob);.  if( pC->i
23150 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 72 63  sIndex ){.    rc
23160 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
23170 65 79 28 70 43 72 73 72 2c 20 30 2c 20 6e 2c 20  ey(pCrsr, 0, n, 
23180 70 4f 75 74 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73  pOut->z);.  }els
23190 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
231a0 74 65 33 42 74 72 65 65 44 61 74 61 28 70 43 72  te3BtreeData(pCr
231b0 73 72 2c 20 30 2c 20 6e 2c 20 70 4f 75 74 2d 3e  sr, 0, n, pOut->
231c0 7a 29 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e  z);.  }.  pOut->
231d0 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
231e0 38 3b 20 20 2f 2a 20 49 6e 20 63 61 73 65 20 74  8;  /* In case t
231f0 68 65 20 62 6c 6f 62 20 69 73 20 65 76 65 72 20  he blob is ever 
23200 63 61 73 74 20 74 6f 20 74 65 78 74 20 2a 2f 0a  cast to text */.
23210 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
23220 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62  BSIZE(pOut);.  b
23230 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
23240 64 65 3a 20 52 6f 77 69 64 20 50 31 20 50 32 20  de: Rowid P1 P2 
23250 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 74 6f 72  * * *.**.** Stor
23260 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
23270 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
23280 68 20 69 73 20 74 68 65 20 6b 65 79 20 6f 66 20  h is the key of 
23290 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
232a0 74 68 61 74 0a 2a 2a 20 50 31 20 69 73 20 63 75  that.** P1 is cu
232b0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f  rrently point to
232c0 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 63 61 6e 20 62  ..**.** P1 can b
232d0 65 20 65 69 74 68 65 72 20 61 6e 20 6f 72 64 69  e either an ordi
232e0 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 61 20  nary table or a 
232f0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
23300 54 68 65 72 65 20 75 73 65 64 20 74 6f 0a 2a 2a  There used to.**
23310 20 62 65 20 61 20 73 65 70 61 72 61 74 65 20 4f   be a separate O
23320 50 5f 56 52 6f 77 69 64 20 6f 70 63 6f 64 65 20  P_VRowid opcode 
23330 66 6f 72 20 75 73 65 20 77 69 74 68 20 76 69 72  for use with vir
23340 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 62 75 74  tual tables, but
23350 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 20 6f 70 63   this.** one opc
23360 6f 64 65 20 6e 6f 77 20 77 6f 72 6b 73 20 66 6f  ode now works fo
23370 72 20 62 6f 74 68 20 74 61 62 6c 65 20 74 79 70  r both table typ
23380 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  es..*/.case OP_R
23390 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20 20 20  owid: {         
233a0 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
233b0 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
233c0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
233d0 20 20 69 36 34 20 76 3b 0a 20 20 73 71 6c 69 74    i64 v;.  sqlit
233e0 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a  e3_vtab *pVtab;.
233f0 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
23400 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b  module *pModule;
23410 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
23420 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
23430 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
23440 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
23450 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
23460 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
23470 73 73 65 72 74 28 20 70 43 2d 3e 70 73 65 75 64  ssert( pC->pseud
23480 6f 54 61 62 6c 65 52 65 67 3d 3d 30 20 7c 7c 20  oTableReg==0 || 
23490 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 3b 0a 20  pC->nullRow );. 
234a0 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77   if( pC->nullRow
234b0 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c   ){.    pOut->fl
234c0 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
234d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 65 6c      break;.  }el
234e0 73 65 20 69 66 28 20 70 43 2d 3e 64 65 66 65 72  se if( pC->defer
234f0 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20  redMoveto ){.   
23500 20 76 20 3d 20 70 43 2d 3e 6d 6f 76 65 74 6f 54   v = pC->movetoT
23510 61 72 67 65 74 3b 0a 23 69 66 6e 64 65 66 20 53  arget;.#ifndef S
23520 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
23530 41 4c 54 41 42 4c 45 0a 20 20 7d 65 6c 73 65 20  ALTABLE.  }else 
23540 69 66 28 20 70 43 2d 3e 70 56 74 61 62 43 75 72  if( pC->pVtabCur
23550 73 6f 72 20 29 7b 0a 20 20 20 20 70 56 74 61 62  sor ){.    pVtab
23560 20 3d 20 70 43 2d 3e 70 56 74 61 62 43 75 72 73   = pC->pVtabCurs
23570 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 70  or->pVtab;.    p
23580 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e  Module = pVtab->
23590 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 61 73 73  pModule;.    ass
235a0 65 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 52  ert( pModule->xR
235b0 6f 77 69 64 20 29 3b 0a 20 20 20 20 72 63 20 3d  owid );.    rc =
235c0 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 6f 77 69 64   pModule->xRowid
235d0 28 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  (pC->pVtabCursor
235e0 2c 20 26 76 29 3b 0a 20 20 20 20 69 6d 70 6f 72  , &v);.    impor
235f0 74 56 74 61 62 45 72 72 4d 73 67 28 70 2c 20 70  tVtabErrMsg(p, p
23600 56 74 61 62 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  Vtab);.#endif /*
23610 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
23620 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 20 20 7d  TUALTABLE */.  }
23630 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
23640 28 20 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30  ( pC->pCursor!=0
23650 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
23660 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
23670 76 65 74 6f 28 70 43 29 3b 0a 20 20 20 20 69 66  veto(pC);.    if
23680 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
23690 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
236a0 20 20 20 20 69 66 28 20 70 43 2d 3e 72 6f 77 69      if( pC->rowi
236b0 64 49 73 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  dIsValid ){.    
236c0 20 20 76 20 3d 20 70 43 2d 3e 6c 61 73 74 52 6f    v = pC->lastRo
236d0 77 69 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  wid;.    }else{.
236e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
236f0 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
23700 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 76 29 3b  C->pCursor, &v);
23710 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
23720 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
23730 20 2f 2a 20 41 6c 77 61 79 73 20 73 6f 20 62 65   /* Always so be
23740 63 61 75 73 65 20 6f 66 20 43 75 72 73 6f 72 4d  cause of CursorM
23750 6f 76 65 74 6f 28 29 20 61 62 6f 76 65 20 2a 2f  oveto() above */
23760 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4f 75  .    }.  }.  pOu
23770 74 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 62 72  t->u.i = v;.  br
23780 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
23790 65 3a 20 4e 75 6c 6c 52 6f 77 20 50 31 20 2a 20  e: NullRow P1 * 
237a0 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65  * * *.**.** Move
237b0 20 74 68 65 20 63 75 72 73 6f 72 20 50 31 20 74   the cursor P1 t
237c0 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 2e 20 20 41  o a null row.  A
237d0 6e 79 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 65  ny OP_Column ope
237e0 72 61 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  rations.** that 
237f0 6f 63 63 75 72 20 77 68 69 6c 65 20 74 68 65 20  occur while the 
23800 63 75 72 73 6f 72 20 69 73 20 6f 6e 20 74 68 65  cursor is on the
23810 20 6e 75 6c 6c 20 72 6f 77 20 77 69 6c 6c 20 61   null row will a
23820 6c 77 61 79 73 0a 2a 2a 20 77 72 69 74 65 20 61  lways.** write a
23830 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f   NULL..*/.case O
23840 50 5f 4e 75 6c 6c 52 6f 77 3a 20 7b 0a 20 20 56  P_NullRow: {.  V
23850 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 0a  dbeCursor *pC;..
23860 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
23870 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
23880 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
23890 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
238a0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
238b0 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70 43 2d  ( pC!=0 );.  pC-
238c0 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
238d0 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64  pC->rowidIsValid
238e0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
238f0 70 43 2d 3e 70 43 75 72 73 6f 72 20 7c 7c 20 70  pC->pCursor || p
23900 43 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29  C->pVtabCursor )
23910 3b 0a 20 20 69 66 28 20 70 43 2d 3e 70 43 75 72  ;.  if( pC->pCur
23920 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
23930 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
23940 6f 72 28 70 43 2d 3e 70 43 75 72 73 6f 72 29 3b  or(pC->pCursor);
23950 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
23960 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 61 73 74  ./* Opcode: Last
23970 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
23980 2a 2a 20 54 68 65 20 6e 65 78 74 20 75 73 65 20  ** The next use 
23990 6f 66 20 74 68 65 20 52 6f 77 69 64 20 6f 72 20  of the Rowid or 
239a0 43 6f 6c 75 6d 6e 20 6f 72 20 4e 65 78 74 20 69  Column or Next i
239b0 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72 20 50  nstruction for P
239c0 31 20 0a 2a 2a 20 77 69 6c 6c 20 72 65 66 65 72  1 .** will refer
239d0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
239e0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
239f0 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  se table or inde
23a00 78 2e 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62  x..** If the tab
23a10 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20 65  le or index is e
23a20 6d 70 74 79 20 61 6e 64 20 50 32 3e 30 2c 20 74  mpty and P2>0, t
23a30 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  hen jump immedia
23a40 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 20 49  tely to P2..** I
23a50 66 20 50 32 20 69 73 20 30 20 6f 72 20 69 66 20  f P2 is 0 or if 
23a60 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
23a70 65 78 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c  ex is not empty,
23a80 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a   fall through.**
23a90 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
23aa0 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  g instruction..*
23ab0 2f 0a 63 61 73 65 20 4f 50 5f 4c 61 73 74 3a 20  /.case OP_Last: 
23ac0 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
23ad0 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
23ae0 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
23af0 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72   *pCrsr;.  int r
23b00 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  es;..  assert( p
23b10 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
23b20 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
23b30 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
23b40 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
23b50 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
23b60 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 70 43    pCrsr = pC->pC
23b70 75 72 73 6f 72 3b 0a 20 20 72 65 73 20 3d 20 30  ursor;.  res = 0
23b80 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
23b90 43 72 73 72 21 3d 30 29 20 29 7b 0a 20 20 20 20  Crsr!=0) ){.    
23ba0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
23bb0 65 4c 61 73 74 28 70 43 72 73 72 2c 20 26 72 65  eLast(pCrsr, &re
23bc0 73 29 3b 0a 20 20 7d 0a 20 20 70 43 2d 3e 6e 75  s);.  }.  pC->nu
23bd0 6c 6c 52 6f 77 20 3d 20 28 75 38 29 72 65 73 3b  llRow = (u8)res;
23be0 0a 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d  .  pC->deferredM
23bf0 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43 2d  oveto = 0;.  pC-
23c00 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20  >rowidIsValid = 
23c10 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74  0;.  pC->cacheSt
23c20 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
23c30 4c 45 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70  LE;.  if( pOp->p
23c40 32 3e 30 20 26 26 20 72 65 73 20 29 7b 0a 20 20  2>0 && res ){.  
23c50 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
23c60 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   1;.  }.  break;
23c70 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  .}.../* Opcode: 
23c80 53 6f 72 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  Sort P1 P2 * * *
23c90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
23ca0 64 65 20 64 6f 65 73 20 65 78 61 63 74 6c 79 20  de does exactly 
23cb0 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61  the same thing a
23cc0 73 20 4f 50 5f 52 65 77 69 6e 64 20 65 78 63 65  s OP_Rewind exce
23cd0 70 74 20 74 68 61 74 0a 2a 2a 20 69 74 20 69 6e  pt that.** it in
23ce0 63 72 65 6d 65 6e 74 73 20 61 6e 20 75 6e 64 6f  crements an undo
23cf0 63 75 6d 65 6e 74 65 64 20 67 6c 6f 62 61 6c 20  cumented global 
23d00 76 61 72 69 61 62 6c 65 20 75 73 65 64 20 66 6f  variable used fo
23d10 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  r testing..**.**
23d20 20 53 6f 72 74 69 6e 67 20 69 73 20 61 63 63 6f   Sorting is acco
23d30 6d 70 6c 69 73 68 65 64 20 62 79 20 77 72 69 74  mplished by writ
23d40 69 6e 67 20 72 65 63 6f 72 64 73 20 69 6e 74 6f  ing records into
23d50 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
23d60 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 77 69 6e 64  ,.** then rewind
23d70 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 61  ing that index a
23d80 6e 64 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61  nd playing it ba
23d90 63 6b 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e  ck from beginnin
23da0 67 20 74 6f 0a 2a 2a 20 65 6e 64 2e 20 20 57 65  g to.** end.  We
23db0 20 75 73 65 20 74 68 65 20 4f 50 5f 53 6f 72 74   use the OP_Sort
23dc0 20 6f 70 63 6f 64 65 20 69 6e 73 74 65 61 64 20   opcode instead 
23dd0 6f 66 20 4f 50 5f 52 65 77 69 6e 64 20 74 6f 20  of OP_Rewind to 
23de0 64 6f 20 74 68 65 0a 2a 2a 20 72 65 77 69 6e 64  do the.** rewind
23df0 69 6e 67 20 73 6f 20 74 68 61 74 20 74 68 65 20  ing so that the 
23e00 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
23e10 77 69 6c 6c 20 62 65 20 69 6e 63 72 65 6d 65 6e  will be incremen
23e20 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 67 72 65  ted and.** regre
23e30 73 73 69 6f 6e 20 74 65 73 74 73 20 63 61 6e 20  ssion tests can 
23e40 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
23e50 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6f 70 74  r or not the opt
23e60 69 6d 69 7a 65 72 20 69 73 0a 2a 2a 20 63 6f 72  imizer is.** cor
23e70 72 65 63 74 6c 79 20 6f 70 74 69 6d 69 7a 69 6e  rectly optimizin
23e80 67 20 6f 75 74 20 73 6f 72 74 73 2e 0a 2a 2f 0a  g out sorts..*/.
23e90 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 53 6f  case OP_SorterSo
23ea0 72 74 3a 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a  rt:    /* jump *
23eb0 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 3a 20  /.case OP_Sort: 
23ec0 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
23ed0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
23ee0 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
23ef0 5f 73 6f 72 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  _sort_count++;. 
23f00 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
23f10 63 6f 75 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a  count--;.#endif.
23f20 20 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51    p->aCounter[SQ
23f30 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
23f40 53 4f 52 54 2d 31 5d 2b 2b 3b 0a 20 20 2f 2a 20  SORT-1]++;.  /* 
23f50 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74  Fall through int
23f60 6f 20 4f 50 5f 52 65 77 69 6e 64 20 2a 2f 0a 7d  o OP_Rewind */.}
23f70 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 77 69  ./* Opcode: Rewi
23f80 6e 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  nd P1 P2 * * *.*
23f90 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 75 73  *.** The next us
23fa0 65 20 6f 66 20 74 68 65 20 52 6f 77 69 64 20 6f  e of the Rowid o
23fb0 72 20 43 6f 6c 75 6d 6e 20 6f 72 20 4e 65 78 74  r Column or Next
23fc0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
23fd0 20 50 31 20 0a 2a 2a 20 77 69 6c 6c 20 72 65 66   P1 .** will ref
23fe0 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  er to the first 
23ff0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
24000 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69  abase table or i
24010 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ndex..** If the 
24020 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
24030 73 20 65 6d 70 74 79 20 61 6e 64 20 50 32 3e 30  s empty and P2>0
24040 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65  , then jump imme
24050 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a  diately to P2..*
24060 2a 20 49 66 20 50 32 20 69 73 20 30 20 6f 72 20  * If P2 is 0 or 
24070 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  if the table or 
24080 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 65 6d 70  index is not emp
24090 74 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  ty, fall through
240a0 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  .** to the follo
240b0 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e  wing instruction
240c0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 77  ..*/.case OP_Rew
240d0 69 6e 64 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  ind: {        /*
240e0 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43   jump */.  VdbeC
240f0 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43  ursor *pC;.  BtC
24100 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20  ursor *pCrsr;.  
24110 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65  int res;..  asse
24120 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
24130 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
24140 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
24150 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
24160 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
24170 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
24180 43 2d 3e 69 73 53 6f 72 74 65 72 3d 3d 28 70 4f  C->isSorter==(pO
24190 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f  p->opcode==OP_So
241a0 72 74 65 72 53 6f 72 74 29 20 29 3b 0a 20 20 72  rterSort) );.  r
241b0 65 73 20 3d 20 31 3b 0a 20 20 69 66 28 20 69 73  es = 1;.  if( is
241c0 53 6f 72 74 65 72 28 70 43 29 20 29 7b 0a 20 20  Sorter(pC) ){.  
241d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
241e0 62 65 53 6f 72 74 65 72 52 65 77 69 6e 64 28 64  beSorterRewind(d
241f0 62 2c 20 70 43 2c 20 26 72 65 73 29 3b 0a 20 20  b, pC, &res);.  
24200 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 72 73 72  }else{.    pCrsr
24210 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a   = pC->pCursor;.
24220 20 20 20 20 61 73 73 65 72 74 28 20 70 43 72 73      assert( pCrs
24230 72 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  r );.    rc = sq
24240 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
24250 70 43 72 73 72 2c 20 26 72 65 73 29 3b 0a 20 20  pCrsr, &res);.  
24260 20 20 70 43 2d 3e 61 74 46 69 72 73 74 20 3d 20    pC->atFirst = 
24270 72 65 73 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 20  res==0 ?1:0;.   
24280 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
24290 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d  eto = 0;.    pC-
242a0 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
242b0 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20  ACHE_STALE;.    
242c0 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64  pC->rowidIsValid
242d0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 2d 3e   = 0;.  }.  pC->
242e0 6e 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29 72 65  nullRow = (u8)re
242f0 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  s;.  assert( pOp
24300 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p2>0 && pOp->p
24310 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66  2<p->nOp );.  if
24320 28 20 72 65 73 20 29 7b 0a 20 20 20 20 70 63 20  ( res ){.    pc 
24330 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
24340 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
24350 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 78 74 20 50  * Opcode: Next P
24360 31 20 50 32 20 2a 20 50 34 20 50 35 0a 2a 2a 0a  1 P2 * P4 P5.**.
24370 2a 2a 20 41 64 76 61 6e 63 65 20 63 75 72 73 6f  ** Advance curso
24380 72 20 50 31 20 73 6f 20 74 68 61 74 20 69 74 20  r P1 so that it 
24390 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 65  points to the ne
243a0 78 74 20 6b 65 79 2f 64 61 74 61 20 70 61 69 72  xt key/data pair
243b0 20 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62 6c 65   in its.** table
243c0 20 6f 72 20 69 6e 64 65 78 2e 20 20 49 66 20 74   or index.  If t
243d0 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
243e0 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69 72 73   key/value pairs
243f0 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
24400 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c  gh.** to the fol
24410 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69  lowing instructi
24420 6f 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  on.  But if the 
24430 63 75 72 73 6f 72 20 61 64 76 61 6e 63 65 20 77  cursor advance w
24440 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  as successful,.*
24450 2a 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  * jump immediate
24460 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  ly to P2..**.** 
24470 54 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75  The P1 cursor mu
24480 73 74 20 62 65 20 66 6f 72 20 61 20 72 65 61 6c  st be for a real
24490 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73   table, not a ps
244a0 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  eudo-table..**.*
244b0 2a 20 50 34 20 69 73 20 61 6c 77 61 79 73 20 6f  * P4 is always o
244c0 66 20 74 79 70 65 20 50 34 5f 41 44 56 41 4e 43  f type P4_ADVANC
244d0 45 2e 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  E. The function 
244e0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74  pointer points t
244f0 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  o.** sqlite3Btre
24500 65 4e 65 78 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  eNext()..**.** I
24510 66 20 50 35 20 69 73 20 70 6f 73 69 74 69 76 65  f P5 is positive
24520 20 61 6e 64 20 74 68 65 20 6a 75 6d 70 20 69 73   and the jump is
24530 20 74 61 6b 65 6e 2c 20 74 68 65 6e 20 65 76 65   taken, then eve
24540 6e 74 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 6e 75  nt counter.** nu
24550 6d 62 65 72 20 50 35 2d 31 20 69 6e 20 74 68 65  mber P5-1 in the
24560 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
24570 65 6e 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ent is increment
24580 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ed..**.** See al
24590 73 6f 3a 20 50 72 65 76 0a 2a 2f 0a 2f 2a 20 4f  so: Prev.*/./* O
245a0 70 63 6f 64 65 3a 20 50 72 65 76 20 50 31 20 50  pcode: Prev P1 P
245b0 32 20 2a 20 2a 20 50 35 0a 2a 2a 0a 2a 2a 20 42  2 * * P5.**.** B
245c0 61 63 6b 20 75 70 20 63 75 72 73 6f 72 20 50 31  ack up cursor P1
245d0 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
245e0 74 73 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ts to the previo
245f0 75 73 20 6b 65 79 2f 64 61 74 61 20 70 61 69 72  us key/data pair
24600 20 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62 6c 65   in its.** table
24610 20 6f 72 20 69 6e 64 65 78 2e 20 20 49 66 20 74   or index.  If t
24620 68 65 72 65 20 69 73 20 6e 6f 20 70 72 65 76 69  here is no previ
24630 6f 75 73 20 6b 65 79 2f 76 61 6c 75 65 20 70 61  ous key/value pa
24640 69 72 73 20 74 68 65 6e 20 66 61 6c 6c 20 74 68  irs then fall th
24650 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20  rough.** to the 
24660 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75  following instru
24670 63 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 20 74  ction.  But if t
24680 68 65 20 63 75 72 73 6f 72 20 62 61 63 6b 75 70  he cursor backup
24690 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c   was successful,
246a0 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  .** jump immedia
246b0 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a  tely to P2..**.*
246c0 2a 20 54 68 65 20 50 31 20 63 75 72 73 6f 72 20  * The P1 cursor 
246d0 6d 75 73 74 20 62 65 20 66 6f 72 20 61 20 72 65  must be for a re
246e0 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  al table, not a 
246f0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a  pseudo-table..**
24700 0a 2a 2a 20 50 34 20 69 73 20 61 6c 77 61 79 73  .** P4 is always
24710 20 6f 66 20 74 79 70 65 20 50 34 5f 41 44 56 41   of type P4_ADVA
24720 4e 43 45 2e 20 54 68 65 20 66 75 6e 63 74 69 6f  NCE. The functio
24730 6e 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  n pointer points
24740 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74   to.** sqlite3Bt
24750 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e 0a 2a  reePrevious()..*
24760 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 70 6f  *.** If P5 is po
24770 73 69 74 69 76 65 20 61 6e 64 20 74 68 65 20 6a  sitive and the j
24780 75 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20 74 68  ump is taken, th
24790 65 6e 20 65 76 65 6e 74 20 63 6f 75 6e 74 65 72  en event counter
247a0 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 35 2d 31 20  .** number P5-1 
247b0 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
247c0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 69 6e 63  statement is inc
247d0 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 63 61 73  remented..*/.cas
247e0 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a  e OP_SorterNext:
247f0 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63      /* jump */.c
24800 61 73 65 20 4f 50 5f 50 72 65 76 3a 20 20 20 20  ase OP_Prev:    
24810 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
24820 0a 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 20 7b  .case OP_Next: {
24830 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
24840 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
24850 2a 70 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  *pC;.  int res;.
24860 0a 20 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54  .  CHECK_FOR_INT
24870 45 52 52 55 50 54 3b 0a 20 20 61 73 73 65 72 74  ERRUPT;.  assert
24880 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
24890 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
248a0 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  or );.  assert( 
248b0 70 4f 70 2d 3e 70 35 3c 3d 41 72 72 61 79 53 69  pOp->p5<=ArraySi
248c0 7a 65 28 70 2d 3e 61 43 6f 75 6e 74 65 72 29 20  ze(p->aCounter) 
248d0 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
248e0 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69  sr[pOp->p1];.  i
248f0 66 28 20 70 43 3d 3d 30 20 29 7b 0a 20 20 20 20  f( pC==0 ){.    
24900 62 72 65 61 6b 3b 20 20 2f 2a 20 53 65 65 20 74  break;  /* See t
24910 69 63 6b 65 74 20 23 32 32 37 33 20 2a 2f 0a 20  icket #2273 */. 
24920 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d   }.  assert( pC-
24930 3e 69 73 53 6f 72 74 65 72 3d 3d 28 70 4f 70 2d  >isSorter==(pOp-
24940 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74  >opcode==OP_Sort
24950 65 72 4e 65 78 74 29 20 29 3b 0a 20 20 69 66 28  erNext) );.  if(
24960 20 69 73 53 6f 72 74 65 72 28 70 43 29 20 29 7b   isSorter(pC) ){
24970 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
24980 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72  ->opcode==OP_Sor
24990 74 65 72 4e 65 78 74 20 29 3b 0a 20 20 20 20 72  terNext );.    r
249a0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  c = sqlite3VdbeS
249b0 6f 72 74 65 72 4e 65 78 74 28 64 62 2c 20 70 43  orterNext(db, pC
249c0 2c 20 26 72 65 73 29 3b 0a 20 20 7d 65 6c 73 65  , &res);.  }else
249d0 7b 0a 20 20 20 20 72 65 73 20 3d 20 31 3b 0a 20  {.    res = 1;. 
249e0 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64     assert( pC->d
249f0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30  eferredMoveto==0
24a00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
24a10 70 43 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  pC->pCursor );. 
24a20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
24a30 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 20  opcode!=OP_Next 
24a40 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61  || pOp->p4.xAdva
24a50 6e 63 65 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  nce==sqlite3Btre
24a60 65 4e 65 78 74 20 29 3b 0a 20 20 20 20 61 73 73  eNext );.    ass
24a70 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
24a80 21 3d 4f 50 5f 50 72 65 76 20 7c 7c 20 70 4f 70  !=OP_Prev || pOp
24a90 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d 73  ->p4.xAdvance==s
24aa0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
24ab0 6f 75 73 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ous );.    rc = 
24ac0 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
24ad0 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72  (pC->pCursor, &r
24ae0 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 2d 3e 6e  es);.  }.  pC->n
24af0 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29 72 65 73  ullRow = (u8)res
24b00 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61  ;.  pC->cacheSta
24b10 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
24b20 45 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  E;.  if( res==0 
24b30 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  ){.    pc = pOp-
24b40 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 69 66 28  >p2 - 1;.    if(
24b50 20 70 4f 70 2d 3e 70 35 20 29 20 70 2d 3e 61 43   pOp->p5 ) p->aC
24b60 6f 75 6e 74 65 72 5b 70 4f 70 2d 3e 70 35 2d 31  ounter[pOp->p5-1
24b70 5d 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ]++;.#ifdef SQLI
24b80 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69  TE_TEST.    sqli
24b90 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
24ba0 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  ++;.#endif.  }. 
24bb0 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69   pC->rowidIsVali
24bc0 64 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a  d = 0;.  break;.
24bd0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64  }../* Opcode: Id
24be0 78 49 6e 73 65 72 74 20 50 31 20 50 32 20 50 33  xInsert P1 P2 P3
24bf0 20 2a 20 50 35 0a 2a 2a 0a 2a 2a 20 52 65 67 69   * P5.**.** Regi
24c00 73 74 65 72 20 50 32 20 68 6f 6c 64 73 20 61 6e  ster P2 holds an
24c10 20 53 51 4c 20 69 6e 64 65 78 20 6b 65 79 20 6d   SQL index key m
24c20 61 64 65 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a  ade using the.**
24c30 20 4d 61 6b 65 52 65 63 6f 72 64 20 69 6e 73 74   MakeRecord inst
24c40 72 75 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20  ructions.  This 
24c50 6f 70 63 6f 64 65 20 77 72 69 74 65 73 20 74 68  opcode writes th
24c60 61 74 20 6b 65 79 0a 2a 2a 20 69 6e 74 6f 20 74  at key.** into t
24c70 68 65 20 69 6e 64 65 78 20 50 31 2e 20 20 44 61  he index P1.  Da
24c80 74 61 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ta for the entry
24c90 20 69 73 20 6e 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50   is nil..**.** P
24ca0 33 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74  3 is a flag that
24cb0 20 70 72 6f 76 69 64 65 73 20 61 20 68 69 6e 74   provides a hint
24cc0 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20 6c   to the b-tree l
24cd0 61 79 65 72 20 74 68 61 74 20 74 68 69 73 0a 2a  ayer that this.*
24ce0 2a 20 69 6e 73 65 72 74 20 69 73 20 6c 69 6b 65  * insert is like
24cf0 6c 79 20 74 6f 20 62 65 20 61 6e 20 61 70 70 65  ly to be an appe
24d00 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  nd..**.** This i
24d10 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20  nstruction only 
24d20 77 6f 72 6b 73 20 66 6f 72 20 69 6e 64 69 63 65  works for indice
24d30 73 2e 20 20 54 68 65 20 65 71 75 69 76 61 6c 65  s.  The equivale
24d40 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  nt instruction.*
24d50 2a 20 66 6f 72 20 74 61 62 6c 65 73 20 69 73 20  * for tables is 
24d60 4f 50 5f 49 6e 73 65 72 74 2e 0a 2a 2f 0a 63 61  OP_Insert..*/.ca
24d70 73 65 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  se OP_SorterInse
24d80 72 74 3a 20 20 20 20 20 20 20 2f 2a 20 69 6e 32  rt:       /* in2
24d90 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 49   */.case OP_IdxI
24da0 6e 73 65 72 74 3a 20 7b 20 20 20 20 20 20 20 20  nsert: {        
24db0 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56 64 62 65  /* in2 */.  Vdbe
24dc0 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74  Cursor *pC;.  Bt
24dd0 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20  Cursor *pCrsr;. 
24de0 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 63 6f 6e   int nKey;.  con
24df0 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 0a  st char *zKey;..
24e00 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
24e10 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
24e20 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
24e30 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
24e40 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
24e50 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
24e60 65 72 74 28 20 70 43 2d 3e 69 73 53 6f 72 74 65  ert( pC->isSorte
24e70 72 3d 3d 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  r==(pOp->opcode=
24e80 3d 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74  =OP_SorterInsert
24e90 29 20 29 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61  ) );.  pIn2 = &a
24ea0 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
24eb0 61 73 73 65 72 74 28 20 70 49 6e 32 2d 3e 66 6c  assert( pIn2->fl
24ec0 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
24ed0 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e  ;.  pCrsr = pC->
24ee0 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 41  pCursor;.  if( A
24ef0 4c 57 41 59 53 28 70 43 72 73 72 21 3d 30 29 20  LWAYS(pCrsr!=0) 
24f00 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
24f10 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b  C->isTable==0 );
24f20 0a 20 20 20 20 72 63 20 3d 20 45 78 70 61 6e 64  .    rc = Expand
24f30 42 6c 6f 62 28 70 49 6e 32 29 3b 0a 20 20 20 20  Blob(pIn2);.    
24f40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24f50 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
24f60 73 53 6f 72 74 65 72 28 70 43 29 20 29 7b 0a 20  sSorter(pC) ){. 
24f70 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
24f80 74 65 33 56 64 62 65 53 6f 72 74 65 72 57 72 69  te3VdbeSorterWri
24f90 74 65 28 64 62 2c 20 70 43 2c 20 70 49 6e 32 29  te(db, pC, pIn2)
24fa0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
24fb0 20 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 49         nKey = pI
24fc0 6e 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7a  n2->n;.        z
24fd0 4b 65 79 20 3d 20 70 49 6e 32 2d 3e 7a 3b 0a 20  Key = pIn2->z;. 
24fe0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
24ff0 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 70  te3BtreeInsert(p
25000 43 72 73 72 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79  Crsr, zKey, nKey
25010 2c 20 22 22 2c 20 30 2c 20 30 2c 20 70 4f 70 2d  , "", 0, 0, pOp-
25020 3e 70 33 2c 20 0a 20 20 20 20 20 20 20 20 20 20  >p3, .          
25030 20 20 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50    ((pOp->p5 & OP
25040 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
25050 4c 54 29 20 3f 20 70 43 2d 3e 73 65 65 6b 52 65  LT) ? pC->seekRe
25060 73 75 6c 74 20 3a 20 30 29 0a 20 20 20 20 20 20  sult : 0).      
25070 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
25080 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66   assert( pC->def
25090 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29  erredMoveto==0 )
250a0 3b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 63 61  ;.        pC->ca
250b0 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
250c0 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20 7d  E_STALE;.      }
250d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
250e0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
250f0 3a 20 49 64 78 44 65 6c 65 74 65 20 50 31 20 50  : IdxDelete P1 P
25100 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  2 P3 * *.**.** T
25110 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 50 33  he content of P3
25120 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
25130 69 6e 67 20 61 74 20 72 65 67 69 73 74 65 72 20  ing at register 
25140 50 32 20 66 6f 72 6d 0a 2a 2a 20 61 6e 20 75 6e  P2 form.** an un
25150 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
25160 2e 20 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65  . This opcode re
25170 6d 6f 76 65 73 20 74 68 61 74 20 65 6e 74 72 79  moves that entry
25180 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 69 6e   from the .** in
25190 64 65 78 20 6f 70 65 6e 65 64 20 62 79 20 63 75  dex opened by cu
251a0 72 73 6f 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65  rsor P1..*/.case
251b0 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 3a 20 7b   OP_IdxDelete: {
251c0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
251d0 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  C;.  BtCursor *p
251e0 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b  Crsr;.  int res;
251f0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
25200 64 20 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  d r;..  assert( 
25210 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 61  pOp->p3>0 );.  a
25220 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30  ssert( pOp->p2>0
25230 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d   && pOp->p2+pOp-
25240 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29  >p3<=p->nMem+1 )
25250 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
25260 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
25270 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
25280 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
25290 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
252a0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70  rt( pC!=0 );.  p
252b0 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73  Crsr = pC->pCurs
252c0 6f 72 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  or;.  if( ALWAYS
252d0 28 70 43 72 73 72 21 3d 30 29 20 29 7b 0a 20 20  (pCrsr!=0) ){.  
252e0 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70    r.pKeyInfo = p
252f0 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  C->pKeyInfo;.   
25300 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36   r.nField = (u16
25310 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 72 2e  )pOp->p3;.    r.
25320 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 72  flags = 0;.    r
25330 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f  .aMem = &aMem[pO
25340 70 2d 3e 70 32 5d 3b 0a 23 69 66 64 65 66 20 53  p->p2];.#ifdef S
25350 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
25360 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30  { int i; for(i=0
25370 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b  ; i<r.nField; i+
25380 2b 29 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73  +) assert( memIs
25390 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d  Valid(&r.aMem[i]
253a0 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20  ) ); }.#endif.  
253b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
253c0 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
253d0 64 28 70 43 72 73 72 2c 20 26 72 2c 20 30 2c 20  d(pCrsr, &r, 0, 
253e0 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66  0, &res);.    if
253f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25400 26 26 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  && res==0 ){.   
25410 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
25420 74 72 65 65 44 65 6c 65 74 65 28 70 43 72 73 72  treeDelete(pCrsr
25430 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
25440 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65  ert( pC->deferre
25450 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20  dMoveto==0 );.  
25460 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
25470 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
25480 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
25490 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 52  ./* Opcode: IdxR
254a0 6f 77 69 64 20 50 31 20 50 32 20 2a 20 2a 20 2a  owid P1 P2 * * *
254b0 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74  .**.** Write int
254c0 6f 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e  o register P2 an
254d0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
254e0 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  s the last entry
254f0 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 61   in the record a
25500 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20  t.** the end of 
25510 74 68 65 20 69 6e 64 65 78 20 6b 65 79 20 70 6f  the index key po
25520 69 6e 74 65 64 20 74 6f 20 62 79 20 63 75 72 73  inted to by curs
25530 6f 72 20 50 31 2e 20 20 54 68 69 73 20 69 6e 74  or P1.  This int
25540 65 67 65 72 20 73 68 6f 75 6c 64 20 62 65 0a 2a  eger should be.*
25550 2a 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  * the rowid of t
25560 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 74  he table entry t
25570 6f 20 77 68 69 63 68 20 74 68 69 73 20 69 6e 64  o which this ind
25580 65 78 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 2e  ex entry points.
25590 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
255a0 20 52 6f 77 69 64 2c 20 4d 61 6b 65 52 65 63 6f   Rowid, MakeReco
255b0 72 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  rd..*/.case OP_I
255c0 64 78 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20  dxRowid: {      
255d0 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
255e0 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
255f0 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
25600 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
25610 43 3b 0a 20 20 69 36 34 20 72 6f 77 69 64 3b 0a  C;.  i64 rowid;.
25620 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
25630 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
25640 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
25650 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
25660 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
25670 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70 43  t( pC!=0 );.  pC
25680 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  rsr = pC->pCurso
25690 72 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  r;.  pOut->flags
256a0 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 69   = MEM_Null;.  i
256b0 66 28 20 41 4c 57 41 59 53 28 70 43 72 73 72 21  f( ALWAYS(pCrsr!
256c0 3d 30 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =0) ){.    rc = 
256d0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
256e0 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 20  rMoveto(pC);.   
256f0 20 69 66 28 20 4e 45 56 45 52 28 72 63 29 20 29   if( NEVER(rc) )
25700 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
25710 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 61 73  to_error;.    as
25720 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72  sert( pC->deferr
25730 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20  edMoveto==0 );. 
25740 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
25750 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  sTable==0 );.   
25760 20 69 66 28 20 21 70 43 2d 3e 6e 75 6c 6c 52 6f   if( !pC->nullRo
25770 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  w ){.      rc = 
25780 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
25790 77 69 64 28 64 62 2c 20 70 43 72 73 72 2c 20 26  wid(db, pCrsr, &
257a0 72 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66  rowid);.      if
257b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
257c0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
257d0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
257e0 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
257f0 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 6f    pOut->u.i = ro
25800 77 69 64 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  wid;.      pOut-
25810 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
25820 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
25830 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
25840 65 3a 20 49 64 78 47 45 20 50 31 20 50 32 20 50  e: IdxGE P1 P2 P
25850 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68  3 P4 P5.**.** Th
25860 65 20 50 34 20 72 65 67 69 73 74 65 72 20 76 61  e P4 register va
25870 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77  lues beginning w
25880 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e 20 75  ith P3 form an u
25890 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a  npacked index .*
258a0 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69 74 73  * key that omits
258b0 20 74 68 65 20 52 4f 57 49 44 2e 20 20 43 6f 6d   the ROWID.  Com
258c0 70 61 72 65 20 74 68 69 73 20 6b 65 79 20 76 61  pare this key va
258d0 6c 75 65 20 61 67 61 69 6e 73 74 20 74 68 65 20  lue against the 
258e0 69 6e 64 65 78 20 0a 2a 2a 20 74 68 61 74 20 50  index .** that P
258f0 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  1 is currently p
25900 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f  ointing to, igno
25910 72 69 6e 67 20 74 68 65 20 52 4f 57 49 44 20 6f  ring the ROWID o
25920 6e 20 74 68 65 20 50 31 20 69 6e 64 65 78 2e 0a  n the P1 index..
25930 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20  **.** If the P1 
25940 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 67  index entry is g
25950 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
25960 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20  qual to the key 
25970 76 61 6c 75 65 0a 2a 2a 20 74 68 65 6e 20 6a 75  value.** then ju
25980 6d 70 20 74 6f 20 50 32 2e 20 20 4f 74 68 65 72  mp to P2.  Other
25990 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67  wise fall throug
259a0 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
259b0 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
259c0 20 49 66 20 50 35 20 69 73 20 6e 6f 6e 2d 7a 65   If P5 is non-ze
259d0 72 6f 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20  ro then the key 
259e0 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73  value is increas
259f0 65 64 20 62 79 20 61 6e 20 65 70 73 69 6c 6f 6e  ed by an epsilon
25a00 20 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68   .** prior to th
25a10 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  e comparison.  T
25a20 68 69 73 20 6d 61 6b 65 20 74 68 65 20 6f 70 63  his make the opc
25a30 6f 64 65 20 77 6f 72 6b 20 6c 69 6b 65 20 49 64  ode work like Id
25a40 78 47 54 20 65 78 63 65 70 74 0a 2a 2a 20 74 68  xGT except.** th
25a50 61 74 20 69 66 20 74 68 65 20 6b 65 79 20 66 72  at if the key fr
25a60 6f 6d 20 72 65 67 69 73 74 65 72 20 50 33 20 69  om register P3 i
25a70 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
25a80 65 20 6b 65 79 20 69 6e 20 74 68 65 20 63 75 72  e key in the cur
25a90 73 6f 72 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75  sor,.** the resu
25aa0 6c 74 20 69 73 20 66 61 6c 73 65 20 77 68 65 72  lt is false wher
25ab0 65 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20  eas it would be 
25ac0 74 72 75 65 20 77 69 74 68 20 49 64 78 47 54 2e  true with IdxGT.
25ad0 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .*/./* Opcode: I
25ae0 64 78 4c 54 20 50 31 20 50 32 20 50 33 20 50 34  dxLT P1 P2 P3 P4
25af0 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34   P5.**.** The P4
25b00 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 73   register values
25b10 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
25b20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63  P3 form an unpac
25b30 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b 65  ked index .** ke
25b40 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65  y that omits the
25b50 20 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72 65   ROWID.  Compare
25b60 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20   this key value 
25b70 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65  against the inde
25b80 78 20 0a 2a 2a 20 74 68 61 74 20 50 31 20 69 73  x .** that P1 is
25b90 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
25ba0 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67  ing to, ignoring
25bb0 20 74 68 65 20 52 4f 57 49 44 20 6f 6e 20 74 68   the ROWID on th
25bc0 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  e P1 index..**.*
25bd0 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e 64 65  * If the P1 inde
25be0 78 20 65 6e 74 72 79 20 69 73 20 6c 65 73 73 20  x entry is less 
25bf0 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61 6c  than the key val
25c00 75 65 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ue then jump to 
25c10 50 32 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  P2..** Otherwise
25c20 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
25c30 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
25c40 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
25c50 50 35 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  P5 is non-zero t
25c60 68 65 6e 20 74 68 65 20 6b 65 79 20 76 61 6c 75  hen the key valu
25c70 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 62  e is increased b
25c80 79 20 61 6e 20 65 70 73 69 6c 6f 6e 20 70 72 69  y an epsilon pri
25c90 6f 72 20 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f  or .** to the co
25ca0 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 69 73 20  mparison.  This 
25cb0 6d 61 6b 65 73 20 74 68 65 20 6f 70 63 6f 64 65  makes the opcode
25cc0 20 77 6f 72 6b 20 6c 69 6b 65 20 49 64 78 4c 45   work like IdxLE
25cd0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78  ..*/.case OP_Idx
25ce0 4c 54 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  LT:          /* 
25cf0 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  jump */.case OP_
25d00 49 64 78 47 45 3a 20 7b 20 20 20 20 20 20 20 20  IdxGE: {        
25d10 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62  /* jump */.  Vdb
25d20 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69  eCursor *pC;.  i
25d30 6e 74 20 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b  nt res;.  Unpack
25d40 65 64 52 65 63 6f 72 64 20 72 3b 0a 0a 20 20 61  edRecord r;..  a
25d50 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
25d60 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
25d70 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
25d80 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
25d90 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
25da0 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
25db0 28 20 70 43 2d 3e 69 73 4f 72 64 65 72 65 64 20  ( pC->isOrdered 
25dc0 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
25dd0 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 29 20  pC->pCursor!=0) 
25de0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
25df0 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
25e00 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  o==0 );.    asse
25e10 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c  rt( pOp->p5==0 |
25e20 7c 20 70 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b 0a  | pOp->p5==1 );.
25e30 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
25e40 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
25e50 32 20 29 3b 0a 20 20 20 20 72 2e 70 4b 65 79 49  2 );.    r.pKeyI
25e60 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e  nfo = pC->pKeyIn
25e70 66 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64  fo;.    r.nField
25e80 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 34 2e   = (u16)pOp->p4.
25e90 69 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  i;.    if( pOp->
25ea0 70 35 20 29 7b 0a 20 20 20 20 20 20 72 2e 66 6c  p5 ){.      r.fl
25eb0 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 49  ags = UNPACKED_I
25ec0 4e 43 52 4b 45 59 20 7c 20 55 4e 50 41 43 4b 45  NCRKEY | UNPACKE
25ed0 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 3b 0a  D_PREFIX_MATCH;.
25ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25ef0 20 72 2e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43   r.flags = UNPAC
25f00 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48  KED_PREFIX_MATCH
25f10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 2e 61 4d  ;.    }.    r.aM
25f20 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  em = &aMem[pOp->
25f30 70 33 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  p3];.#ifdef SQLI
25f40 54 45 5f 44 45 42 55 47 0a 20 20 20 20 7b 20 69  TE_DEBUG.    { i
25f50 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69  nt i; for(i=0; i
25f60 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20  <r.nField; i++) 
25f70 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
25f80 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29  id(&r.aMem[i]) )
25f90 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  ; }.#endif.    r
25fa0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49  c = sqlite3VdbeI
25fb0 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 70 43 2c  dxKeyCompare(pC,
25fc0 20 26 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20   &r, &res);.    
25fd0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
25fe0 3d 4f 50 5f 49 64 78 4c 54 20 29 7b 0a 20 20 20  =OP_IdxLT ){.   
25ff0 20 20 20 72 65 73 20 3d 20 2d 72 65 73 3b 0a 20     res = -res;. 
26000 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26010 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
26020 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b  ode==OP_IdxGE );
26030 0a 20 20 20 20 20 20 72 65 73 2b 2b 3b 0a 20 20  .      res++;.  
26040 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 3e    }.    if( res>
26050 30 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20  0 ){.      pc = 
26060 70 4f 70 2d 3e 70 32 20 2d 20 31 20 3b 0a 20 20  pOp->p2 - 1 ;.  
26070 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
26080 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  .}../* Opcode: D
26090 65 73 74 72 6f 79 20 50 31 20 50 32 20 50 33 20  estroy P1 P2 P3 
260a0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65  * *.**.** Delete
260b0 20 61 6e 20 65 6e 74 69 72 65 20 64 61 74 61 62   an entire datab
260c0 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ase table or ind
260d0 65 78 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61  ex whose root pa
260e0 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
260f0 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 67 69  se.** file is gi
26100 76 65 6e 20 62 79 20 50 31 2e 0a 2a 2a 0a 2a 2a  ven by P1..**.**
26110 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
26120 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 69 6e   destroyed is in
26130 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
26140 73 65 20 66 69 6c 65 20 69 66 20 50 33 3d 3d 30  se file if P3==0
26150 2e 20 20 49 66 0a 2a 2a 20 50 33 3d 3d 31 20 74  .  If.** P3==1 t
26160 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f  hen the table to
26170 20 62 65 20 63 6c 65 61 72 20 69 73 20 69 6e 20   be clear is in 
26180 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
26190 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74  tabase file.** t
261a0 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  hat is used to s
261b0 74 6f 72 65 20 74 61 62 6c 65 73 20 63 72 65 61  tore tables crea
261c0 74 65 20 75 73 69 6e 67 20 43 52 45 41 54 45 20  te using CREATE 
261d0 54 45 4d 50 4f 52 41 52 59 20 54 41 42 4c 45 2e  TEMPORARY TABLE.
261e0 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41  .**.** If AUTOVA
261f0 43 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20  CUUM is enabled 
26200 74 68 65 6e 20 69 74 20 69 73 20 70 6f 73 73 69  then it is possi
26210 62 6c 65 20 74 68 61 74 20 61 6e 6f 74 68 65 72  ble that another
26220 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 6d 69   root page.** mi
26230 67 68 74 20 62 65 20 6d 6f 76 65 64 20 69 6e 74  ght be moved int
26240 6f 20 74 68 65 20 6e 65 77 6c 79 20 64 65 6c 65  o the newly dele
26250 74 65 64 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ted root page in
26260 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 61   order to keep a
26270 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73  ll.** root pages
26280 20 63 6f 6e 74 69 67 75 6f 75 73 20 61 74 20 74   contiguous at t
26290 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
262a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
262b0 68 65 20 66 6f 72 6d 65 72 0a 2a 2a 20 76 61 6c  he former.** val
262c0 75 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 70  ue of the root p
262d0 61 67 65 20 74 68 61 74 20 6d 6f 76 65 64 20 2d  age that moved -
262e0 20 69 74 73 20 76 61 6c 75 65 20 62 65 66 6f 72   its value befor
262f0 65 20 74 68 65 20 6d 6f 76 65 20 6f 63 63 75 72  e the move occur
26300 72 65 64 20 2d 0a 2a 2a 20 69 73 20 73 74 6f 72  red -.** is stor
26310 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
26320 32 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20 0a  2.  If no page .
26330 2a 2a 20 6d 6f 76 65 6d 65 6e 74 20 77 61 73 20  ** movement was 
26340 72 65 71 75 69 72 65 64 20 28 62 65 63 61 75 73  required (becaus
26350 65 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  e the table bein
26360 67 20 64 72 6f 70 70 65 64 20 77 61 73 20 61 6c  g dropped was al
26370 72 65 61 64 79 20 0a 2a 2a 20 74 68 65 20 6c 61  ready .** the la
26380 73 74 20 6f 6e 65 20 69 6e 20 74 68 65 20 64 61  st one in the da
26390 74 61 62 61 73 65 29 20 74 68 65 6e 20 61 20 7a  tabase) then a z
263a0 65 72 6f 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ero is stored in
263b0 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
263c0 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69   If AUTOVACUUM i
263d0 73 20 64 69 73 61 62 6c 65 64 20 74 68 65 6e 20  s disabled then 
263e0 61 20 7a 65 72 6f 20 69 73 20 73 74 6f 72 65 64  a zero is stored
263f0 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
26400 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
26410 20 43 6c 65 61 72 0a 2a 2f 0a 63 61 73 65 20 4f   Clear.*/.case O
26420 50 5f 44 65 73 74 72 6f 79 3a 20 7b 20 20 20 20  P_Destroy: {    
26430 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65   /* out2-prerele
26440 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 6f  ase */.  int iMo
26450 76 65 64 3b 0a 20 20 69 6e 74 20 69 43 6e 74 3b  ved;.  int iCnt;
26460 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65 3b 0a  .  Vdbe *pVdbe;.
26470 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73    int iDb;..  as
26480 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c  sert( p->readOnl
26490 79 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20  y==0 );.#ifndef 
264a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
264b0 55 41 4c 54 41 42 4c 45 0a 20 20 69 43 6e 74 20  UALTABLE.  iCnt 
264c0 3d 20 30 3b 0a 20 20 66 6f 72 28 70 56 64 62 65  = 0;.  for(pVdbe
264d0 3d 64 62 2d 3e 70 56 64 62 65 3b 20 70 56 64 62  =db->pVdbe; pVdb
264e0 65 3b 20 70 56 64 62 65 20 3d 20 70 56 64 62 65  e; pVdbe = pVdbe
264f0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
26500 28 20 70 56 64 62 65 2d 3e 6d 61 67 69 63 3d 3d  ( pVdbe->magic==
26510 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26  VDBE_MAGIC_RUN &
26520 26 20 70 56 64 62 65 2d 3e 69 6e 56 74 61 62 4d  & pVdbe->inVtabM
26530 65 74 68 6f 64 3c 32 20 26 26 20 70 56 64 62 65  ethod<2 && pVdbe
26540 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ->pc>=0 ){.     
26550 20 69 43 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20   iCnt++;.    }. 
26560 20 7d 0a 23 65 6c 73 65 0a 20 20 69 43 6e 74 20   }.#else.  iCnt 
26570 3d 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  = db->activeVdbe
26580 43 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4f  Cnt;.#endif.  pO
26590 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ut->flags = MEM_
265a0 4e 75 6c 6c 3b 0a 20 20 69 66 28 20 69 43 6e 74  Null;.  if( iCnt
265b0 3e 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  >1 ){.    rc = S
265c0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
265d0 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
265e0 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 7d   = OE_Abort;.  }
265f0 65 6c 73 65 7b 0a 20 20 20 20 69 44 62 20 3d 20  else{.    iDb = 
26600 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 61 73 73  pOp->p3;.    ass
26610 65 72 74 28 20 69 43 6e 74 3d 3d 31 20 29 3b 0a  ert( iCnt==1 );.
26620 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
26630 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79  btreeMask & (((y
26640 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62 29 29  DbMask)1)<<iDb))
26650 21 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  !=0 );.    rc = 
26660 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
26670 54 61 62 6c 65 28 64 62 2d 3e 61 44 62 5b 69 44  Table(db->aDb[iD
26680 62 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 31 2c  b].pBt, pOp->p1,
26690 20 26 69 4d 6f 76 65 64 29 3b 0a 20 20 20 20 70   &iMoved);.    p
266a0 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
266b0 5f 49 6e 74 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  _Int;.    pOut->
266c0 75 2e 69 20 3d 20 69 4d 6f 76 65 64 3b 0a 23 69  u.i = iMoved;.#i
266d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
266e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
266f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26700 4f 4b 20 26 26 20 69 4d 6f 76 65 64 21 3d 30 20  OK && iMoved!=0 
26710 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
26720 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 64 62  RootPageMoved(db
26730 2c 20 69 44 62 2c 20 69 4d 6f 76 65 64 2c 20 70  , iDb, iMoved, p
26740 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20 20 20 2f  Op->p1);.      /
26750 2a 20 41 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79  * All OP_Destroy
26760 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75   operations occu
26770 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74  r on the same bt
26780 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ree */.      ass
26790 65 72 74 28 20 72 65 73 65 74 53 63 68 65 6d 61  ert( resetSchema
267a0 4f 6e 46 61 75 6c 74 3d 3d 30 20 7c 7c 20 72 65  OnFault==0 || re
267b0 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74  setSchemaOnFault
267c0 3d 3d 69 44 62 2b 31 20 29 3b 0a 20 20 20 20 20  ==iDb+1 );.     
267d0 20 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61   resetSchemaOnFa
267e0 75 6c 74 20 3d 20 69 44 62 2b 31 3b 0a 20 20 20  ult = iDb+1;.   
267f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
26800 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
26810 6f 64 65 3a 20 43 6c 65 61 72 20 50 31 20 50 32  ode: Clear P1 P2
26820 20 50 33 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65   P3.**.** Delete
26830 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 73 20 6f 66   all contents of
26840 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61   the database ta
26850 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68 6f  ble or index who
26860 73 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20  se root page.** 
26870 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
26880 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79  file is given by
26890 20 50 31 2e 20 20 42 75 74 2c 20 75 6e 6c 69 6b   P1.  But, unlik
268a0 65 20 44 65 73 74 72 6f 79 2c 20 64 6f 20 6e 6f  e Destroy, do no
268b0 74 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  t.** remove the 
268c0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 66  table or index f
268d0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
268e0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
268f0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c 65   table being cle
26900 61 72 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69  ar is in the mai
26910 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
26920 69 66 20 50 32 3d 3d 30 2e 20 20 49 66 0a 2a 2a  if P2==0.  If.**
26930 20 50 32 3d 3d 31 20 74 68 65 6e 20 74 68 65 20   P2==1 then the 
26940 74 61 62 6c 65 20 74 6f 20 62 65 20 63 6c 65 61  table to be clea
26950 72 20 69 73 20 69 6e 20 74 68 65 20 61 75 78 69  r is in the auxi
26960 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66  liary database f
26970 69 6c 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 75  ile.** that is u
26980 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 61 62  sed to store tab
26990 6c 65 73 20 63 72 65 61 74 65 20 75 73 69 6e 67  les create using
269a0 20 43 52 45 41 54 45 20 54 45 4d 50 4f 52 41 52   CREATE TEMPORAR
269b0 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 49  Y TABLE..**.** I
269c0 66 20 74 68 65 20 50 33 20 76 61 6c 75 65 20 69  f the P3 value i
269d0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
269e0 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72   the table refer
269f0 72 65 64 20 74 6f 20 6d 75 73 74 20 62 65 20 61  red to must be a
26a00 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 74 61 62 6c  n.** intkey tabl
26a10 65 20 28 61 6e 20 53 51 4c 20 74 61 62 6c 65 2c  e (an SQL table,
26a20 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78 29 2e 20   not an index). 
26a30 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
26a40 20 72 6f 77 20 63 68 61 6e 67 65 20 0a 2a 2a 20   row change .** 
26a50 63 6f 75 6e 74 20 69 73 20 69 6e 63 72 65 6d 65  count is increme
26a60 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  nted by the numb
26a70 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
26a80 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c  e table being cl
26a90 65 61 72 65 64 2e 20 0a 2a 2a 20 49 66 20 50 33  eared. .** If P3
26aa0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
26ab0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
26ac0 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
26ad0 72 65 67 69 73 74 65 72 20 50 33 20 69 73 0a 2a  register P3 is.*
26ae0 2a 20 61 6c 73 6f 20 69 6e 63 72 65 6d 65 6e 74  * also increment
26af0 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
26b00 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
26b10 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c 65 61  table being clea
26b20 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  red..**.** See a
26b30 6c 73 6f 3a 20 44 65 73 74 72 6f 79 0a 2a 2f 0a  lso: Destroy.*/.
26b40 63 61 73 65 20 4f 50 5f 43 6c 65 61 72 3a 20 7b  case OP_Clear: {
26b50 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 3b 0a  .  int nChange;.
26b60 20 0a 20 20 6e 43 68 61 6e 67 65 20 3d 20 30 3b   .  nChange = 0;
26b70 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65  .  assert( p->re
26b80 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61  adOnly==0 );.  a
26b90 73 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65  ssert( (p->btree
26ba0 4d 61 73 6b 20 26 20 28 28 28 79 44 62 4d 61 73  Mask & (((yDbMas
26bb0 6b 29 31 29 3c 3c 70 4f 70 2d 3e 70 32 29 29 21  k)1)<<pOp->p2))!
26bc0 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
26bd0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
26be0 62 6c 65 28 0a 20 20 20 20 20 20 64 62 2d 3e 61  ble(.      db->a
26bf0 44 62 5b 70 4f 70 2d 3e 70 32 5d 2e 70 42 74 2c  Db[pOp->p2].pBt,
26c00 20 70 4f 70 2d 3e 70 31 2c 20 28 70 4f 70 2d 3e   pOp->p1, (pOp->
26c10 70 33 20 3f 20 26 6e 43 68 61 6e 67 65 20 3a 20  p3 ? &nChange : 
26c20 30 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4f  0).  );.  if( pO
26c30 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20 70 2d 3e  p->p3 ){.    p->
26c40 6e 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e  nChange += nChan
26c50 67 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  ge;.    if( pOp-
26c60 3e 70 33 3e 30 20 29 7b 0a 20 20 20 20 20 20 61  >p3>0 ){.      a
26c70 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
26c80 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  d(&aMem[pOp->p3]
26c90 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62  ) );.      memAb
26ca0 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 26  outToChange(p, &
26cb0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a  aMem[pOp->p3]);.
26cc0 20 20 20 20 20 20 61 4d 65 6d 5b 70 4f 70 2d 3e        aMem[pOp->
26cd0 70 33 5d 2e 75 2e 69 20 2b 3d 20 6e 43 68 61 6e  p3].u.i += nChan
26ce0 67 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ge;.    }.  }.  
26cf0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
26d00 6f 64 65 3a 20 43 72 65 61 74 65 54 61 62 6c 65  ode: CreateTable
26d10 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
26d20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
26d30 77 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d  w table in the m
26d40 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
26d50 65 20 69 66 20 50 31 3d 3d 30 20 6f 72 20 69 6e  e if P1==0 or in
26d60 20 74 68 65 0a 2a 2a 20 61 75 78 69 6c 69 61 72   the.** auxiliar
26d70 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
26d80 69 66 20 50 31 3d 3d 31 20 6f 72 20 69 6e 20 61  if P1==1 or in a
26d90 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  n attached datab
26da0 61 73 65 20 69 66 0a 2a 2a 20 50 31 3e 31 2e 20  ase if.** P1>1. 
26db0 20 57 72 69 74 65 20 74 68 65 20 72 6f 6f 74 20   Write the root 
26dc0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
26dd0 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 74  he new table int
26de0 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 32  o.** register P2
26df0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
26e00 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 61 20  rence between a 
26e10 74 61 62 6c 65 20 61 6e 64 20 61 6e 20 69 6e 64  table and an ind
26e20 65 78 20 69 73 20 74 68 69 73 3a 20 20 41 20 74  ex is this:  A t
26e30 61 62 6c 65 20 6d 75 73 74 0a 2a 2a 20 68 61 76  able must.** hav
26e40 65 20 61 20 34 2d 62 79 74 65 20 69 6e 74 65 67  e a 4-byte integ
26e50 65 72 20 6b 65 79 20 61 6e 64 20 63 61 6e 20 68  er key and can h
26e60 61 76 65 20 61 72 62 69 74 72 61 72 79 20 64 61  ave arbitrary da
26e70 74 61 2e 20 20 41 6e 20 69 6e 64 65 78 0a 2a 2a  ta.  An index.**
26e80 20 68 61 73 20 61 6e 20 61 72 62 69 74 72 61 72   has an arbitrar
26e90 79 20 6b 65 79 20 62 75 74 20 6e 6f 20 64 61 74  y key but no dat
26ea0 61 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  a..**.** See als
26eb0 6f 3a 20 43 72 65 61 74 65 49 6e 64 65 78 0a 2a  o: CreateIndex.*
26ec0 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 72 65  /./* Opcode: Cre
26ed0 61 74 65 49 6e 64 65 78 20 50 31 20 50 32 20 2a  ateIndex P1 P2 *
26ee0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63   * *.**.** Alloc
26ef0 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20  ate a new index 
26f00 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
26f10 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d  base file if P1=
26f20 3d 30 20 6f 72 20 69 6e 20 74 68 65 0a 2a 2a 20  =0 or in the.** 
26f30 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
26f40 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 31  se file if P1==1
26f50 20 6f 72 20 69 6e 20 61 6e 20 61 74 74 61 63 68   or in an attach
26f60 65 64 20 64 61 74 61 62 61 73 65 20 69 66 0a 2a  ed database if.*
26f70 2a 20 50 31 3e 31 2e 20 20 57 72 69 74 65 20 74  * P1>1.  Write t
26f80 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
26f90 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ber of the new t
26fa0 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67  able into.** reg
26fb0 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  ister P2..**.** 
26fc0 53 65 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  See documentatio
26fd0 6e 20 6f 6e 20 4f 50 5f 43 72 65 61 74 65 54 61  n on OP_CreateTa
26fe0 62 6c 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ble for addition
26ff0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
27000 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 72 65 61 74  */.case OP_Creat
27010 65 49 6e 64 65 78 3a 20 20 20 20 20 20 20 20 20  eIndex:         
27020 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65     /* out2-prere
27030 6c 65 61 73 65 20 2a 2f 0a 63 61 73 65 20 4f 50  lease */.case OP
27040 5f 43 72 65 61 74 65 54 61 62 6c 65 3a 20 7b 20  _CreateTable: { 
27050 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
27060 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20  -prerelease */. 
27070 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 69 6e 74   int pgno;.  int
27080 20 66 6c 61 67 73 3b 0a 20 20 44 62 20 2a 70 44   flags;.  Db *pD
27090 62 3b 0a 0a 20 20 70 67 6e 6f 20 3d 20 30 3b 0a  b;..  pgno = 0;.
270a0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
270b0 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
270c0 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
270d0 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61  ert( (p->btreeMa
270e0 73 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29  sk & (((yDbMask)
270f0 31 29 3c 3c 70 4f 70 2d 3e 70 31 29 29 21 3d 30  1)<<pOp->p1))!=0
27100 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
27110 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
27120 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
27130 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
27140 65 72 74 28 20 70 44 62 2d 3e 70 42 74 21 3d 30  ert( pDb->pBt!=0
27150 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f   );.  if( pOp->o
27160 70 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65  pcode==OP_Create
27170 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
27180 66 6c 61 67 73 20 3d 20 42 54 52 45 45 5f 49 4e  flags = BTREE_IN
27190 54 4b 45 59 3b 20 2a 2f 0a 20 20 20 20 66 6c 61  TKEY; */.    fla
271a0 67 73 20 3d 20 42 54 52 45 45 5f 49 4e 54 4b 45  gs = BTREE_INTKE
271b0 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
271c0 66 6c 61 67 73 20 3d 20 42 54 52 45 45 5f 42 4c  flags = BTREE_BL
271d0 4f 42 4b 45 59 3b 0a 20 20 7d 0a 20 20 72 63 20  OBKEY;.  }.  rc 
271e0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72  = sqlite3BtreeCr
271f0 65 61 74 65 54 61 62 6c 65 28 70 44 62 2d 3e 70  eateTable(pDb->p
27200 42 74 2c 20 26 70 67 6e 6f 2c 20 66 6c 61 67 73  Bt, &pgno, flags
27210 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  );.  pOut->u.i =
27220 20 70 67 6e 6f 3b 0a 20 20 62 72 65 61 6b 3b 0a   pgno;.  break;.
27230 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61  }../* Opcode: Pa
27240 72 73 65 53 63 68 65 6d 61 20 50 31 20 2a 20 2a  rseSchema P1 * *
27250 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64   P4 *.**.** Read
27260 20 61 6e 64 20 70 61 72 73 65 20 61 6c 6c 20 65   and parse all e
27270 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20  ntries from the 
27280 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
27290 62 6c 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ble of database 
272a0 50 31 0a 2a 2a 20 74 68 61 74 20 6d 61 74 63 68  P1.** that match
272b0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
272c0 65 20 50 34 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69  e P4. .**.** Thi
272d0 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73  s opcode invokes
272e0 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 63   the parser to c
272f0 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
27300 75 61 6c 20 6d 61 63 68 69 6e 65 2c 0a 2a 2a 20  ual machine,.** 
27310 74 68 65 6e 20 72 75 6e 73 20 74 68 65 20 6e 65  then runs the ne
27320 77 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  w virtual machin
27330 65 2e 20 20 49 74 20 69 73 20 74 68 75 73 20 61  e.  It is thus a
27340 20 72 65 2d 65 6e 74 72 61 6e 74 20 6f 70 63 6f   re-entrant opco
27350 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50  de..*/.case OP_P
27360 61 72 73 65 53 63 68 65 6d 61 3a 20 7b 0a 20 20  arseSchema: {.  
27370 69 6e 74 20 69 44 62 3b 0a 20 20 63 6f 6e 73 74  int iDb;.  const
27380 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 3b 0a   char *zMaster;.
27390 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
273a0 49 6e 69 74 44 61 74 61 20 69 6e 69 74 44 61 74  InitData initDat
273b0 61 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 70 72 65  a;..  /* Any pre
273c0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
273d0 74 68 61 74 20 69 6e 76 6f 6b 65 73 20 74 68 69  that invokes thi
273e0 73 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 68 6f  s opcode will ho
273f0 6c 64 20 6d 75 74 65 78 65 73 0a 20 20 2a 2a 20  ld mutexes.  ** 
27400 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 2e 20  on every btree. 
27410 20 54 68 69 73 20 69 73 20 61 20 70 72 65 72 65   This is a prere
27420 71 75 69 73 69 74 65 20 66 6f 72 20 69 6e 76 6f  quisite for invo
27430 6b 69 6e 67 20 0a 20 20 2a 2a 20 73 71 6c 69 74  king .  ** sqlit
27440 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b 28 29  e3InitCallback()
27450 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
27460 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
27470 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e  (iDb=0; iDb<db->
27480 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20  nDb; iDb++){.   
27490 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 31 20   assert( iDb==1 
274a0 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  || sqlite3BtreeH
274b0 6f 6c 64 73 4d 75 74 65 78 28 64 62 2d 3e 61 44  oldsMutex(db->aD
274c0 62 5b 69 44 62 5d 2e 70 42 74 29 20 29 3b 0a 20  b[iDb].pBt) );. 
274d0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 44 62   }.#endif..  iDb
274e0 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 61 73   = pOp->p1;.  as
274f0 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
27500 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
27510 20 61 73 73 65 72 74 28 20 44 62 48 61 73 50 72   assert( DbHasPr
27520 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
27530 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
27540 20 29 3b 0a 20 20 2f 2a 20 55 73 65 64 20 74 6f   );.  /* Used to
27550 20 62 65 20 61 20 63 6f 6e 64 69 74 69 6f 6e 61   be a conditiona
27560 6c 20 2a 2f 20 7b 0a 20 20 20 20 7a 4d 61 73 74  l */ {.    zMast
27570 65 72 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  er = SCHEMA_TABL
27580 45 28 69 44 62 29 3b 0a 20 20 20 20 69 6e 69 74  E(iDb);.    init
27590 44 61 74 61 2e 64 62 20 3d 20 64 62 3b 0a 20 20  Data.db = db;.  
275a0 20 20 69 6e 69 74 44 61 74 61 2e 69 44 62 20 3d    initData.iDb =
275b0 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 69 6e   pOp->p1;.    in
275c0 69 74 44 61 74 61 2e 70 7a 45 72 72 4d 73 67 20  itData.pzErrMsg 
275d0 3d 20 26 70 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20  = &p->zErrMsg;. 
275e0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
275f0 33 4d 50 72 69 6e 74 66 28 64 62 2c 0a 20 20 20  3MPrintf(db,.   
27600 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
27610 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c 20  , rootpage, sql 
27620 46 52 4f 4d 20 27 25 71 27 2e 25 73 20 57 48 45  FROM '%q'.%s WHE
27630 52 45 20 25 73 20 4f 52 44 45 52 20 42 59 20 72  RE %s ORDER BY r
27640 6f 77 69 64 22 2c 0a 20 20 20 20 20 20 20 64 62  owid",.       db
27650 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
27660 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4f 70 2d 3e  , zMaster, pOp->
27670 70 34 2e 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a  p4.z);.    if( z
27680 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
27690 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
276a0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
276b0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
276c0 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a  init.busy==0 );.
276d0 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62        db->init.b
276e0 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  usy = 1;.      i
276f0 6e 69 74 44 61 74 61 2e 72 63 20 3d 20 53 51 4c  nitData.rc = SQL
27700 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 61 73  ITE_OK;.      as
27710 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
27720 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
27730 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
27740 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 73 71 6c  ec(db, zSql, sql
27750 69 74 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b  ite3InitCallback
27760 2c 20 26 69 6e 69 74 44 61 74 61 2c 20 30 29 3b  , &initData, 0);
27770 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
27780 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
27790 69 6e 69 74 44 61 74 61 2e 72 63 3b 0a 20 20 20  initData.rc;.   
277a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
277b0 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  (db, zSql);.    
277c0 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20    db->init.busy 
277d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
277e0 20 69 66 28 20 72 63 20 29 20 73 71 6c 69 74 65   if( rc ) sqlite
277f0 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73  3ResetAllSchemas
27800 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29  OfConnection(db)
27810 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
27820 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
27830 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
27840 0a 20 20 62 72 65 61 6b 3b 20 20 0a 7d 0a 0a 23  .  break;  .}..#
27850 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
27860 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 29  TE_OMIT_ANALYZE)
27870 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 6f 61 64  ./* Opcode: Load
27880 41 6e 61 6c 79 73 69 73 20 50 31 20 2a 20 2a 20  Analysis P1 * * 
27890 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 74  * *.**.** Read t
278a0 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
278b0 74 61 62 6c 65 20 66 6f 72 20 64 61 74 61 62 61  table for databa
278c0 73 65 20 50 31 20 61 6e 64 20 6c 6f 61 64 20 74  se P1 and load t
278d0 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66  he content.** of
278e0 20 74 68 61 74 20 74 61 62 6c 65 20 69 6e 74 6f   that table into
278f0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 69 6e   the internal in
27900 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 2e 20  dex hash table. 
27910 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
27920 0a 2a 2a 20 74 68 65 20 61 6e 61 6c 79 73 69 73  .** the analysis
27930 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e   to be used when
27940 20 70 72 65 70 61 72 69 6e 67 20 61 6c 6c 20 73   preparing all s
27950 75 62 73 65 71 75 65 6e 74 20 71 75 65 72 69 65  ubsequent querie
27960 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 6f  s..*/.case OP_Lo
27970 61 64 41 6e 61 6c 79 73 69 73 3a 20 7b 0a 20 20  adAnalysis: {.  
27980 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
27990 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62  =0 && pOp->p1<db
279a0 2d 3e 6e 44 62 20 29 3b 0a 20 20 72 63 20 3d 20  ->nDb );.  rc = 
279b0 73 71 6c 69 74 65 33 41 6e 61 6c 79 73 69 73 4c  sqlite3AnalysisL
279c0 6f 61 64 28 64 62 2c 20 70 4f 70 2d 3e 70 31 29  oad(db, pOp->p1)
279d0 3b 0a 20 20 62 72 65 61 6b 3b 20 20 0a 7d 0a 23  ;.  break;  .}.#
279e0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
279f0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e  d(SQLITE_OMIT_AN
27a00 41 4c 59 5a 45 29 20 2a 2f 0a 0a 2f 2a 20 4f 70  ALYZE) */../* Op
27a10 63 6f 64 65 3a 20 44 72 6f 70 54 61 62 6c 65 20  code: DropTable 
27a20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
27a30 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 74  * Remove the int
27a40 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79  ernal (in-memory
27a50 29 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  ) data structure
27a60 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 0a  s that describe.
27a70 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
27a80 65 64 20 50 34 20 69 6e 20 64 61 74 61 62 61 73  ed P4 in databas
27a90 65 20 50 31 2e 20 20 54 68 69 73 20 69 73 20 63  e P1.  This is c
27aa0 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 74 61  alled after a ta
27ab0 62 6c 65 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65  ble.** is droppe
27ac0 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  d in order to ke
27ad0 65 70 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ep the internal 
27ae0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
27af0 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20  f the.** schema 
27b00 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20  consistent with 
27b10 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e  what is on disk.
27b20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70  .*/.case OP_Drop
27b30 54 61 62 6c 65 3a 20 7b 0a 20 20 73 71 6c 69 74  Table: {.  sqlit
27b40 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
27b50 65 54 61 62 6c 65 28 64 62 2c 20 70 4f 70 2d 3e  eTable(db, pOp->
27b60 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  p1, pOp->p4.z);.
27b70 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
27b80 70 63 6f 64 65 3a 20 44 72 6f 70 49 6e 64 65 78  pcode: DropIndex
27b90 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a   P1 * * P4 *.**.
27ba0 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e  ** Remove the in
27bb0 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72  ternal (in-memor
27bc0 79 29 20 64 61 74 61 20 73 74 72 75 63 74 75 72  y) data structur
27bd0 65 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  es that describe
27be0 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6e 61  .** the index na
27bf0 6d 65 64 20 50 34 20 69 6e 20 64 61 74 61 62 61  med P4 in databa
27c00 73 65 20 50 31 2e 20 20 54 68 69 73 20 69 73 20  se P1.  This is 
27c10 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20  called after an 
27c20 69 6e 64 65 78 0a 2a 2a 20 69 73 20 64 72 6f 70  index.** is drop
27c30 70 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ped in order to 
27c40 6b 65 65 70 20 74 68 65 20 69 6e 74 65 72 6e 61  keep the interna
27c50 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  l representation
27c60 20 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d   of the.** schem
27c70 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74  a consistent wit
27c80 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73  h what is on dis
27c90 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72  k..*/.case OP_Dr
27ca0 6f 70 49 6e 64 65 78 3a 20 7b 0a 20 20 73 71 6c  opIndex: {.  sql
27cb0 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
27cc0 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 4f 70  eteIndex(db, pOp
27cd0 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  ->p1, pOp->p4.z)
27ce0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
27cf0 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70 54 72 69   Opcode: DropTri
27d00 67 67 65 72 20 50 31 20 2a 20 2a 20 50 34 20 2a  gger P1 * * P4 *
27d10 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  .**.** Remove th
27d20 65 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d  e internal (in-m
27d30 65 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72 75  emory) data stru
27d40 63 74 75 72 65 73 20 74 68 61 74 20 64 65 73 63  ctures that desc
27d50 72 69 62 65 0a 2a 2a 20 74 68 65 20 74 72 69 67  ribe.** the trig
27d60 67 65 72 20 6e 61 6d 65 64 20 50 34 20 69 6e 20  ger named P4 in 
27d70 64 61 74 61 62 61 73 65 20 50 31 2e 20 20 54 68  database P1.  Th
27d80 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  is is called aft
27d90 65 72 20 61 20 74 72 69 67 67 65 72 0a 2a 2a 20  er a trigger.** 
27da0 69 73 20 64 72 6f 70 70 65 64 20 69 6e 20 6f 72  is dropped in or
27db0 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
27dc0 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65  internal represe
27dd0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  ntation of the.*
27de0 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73 69 73 74  * schema consist
27df0 65 6e 74 20 77 69 74 68 20 77 68 61 74 20 69 73  ent with what is
27e00 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73   on disk..*/.cas
27e10 65 20 4f 50 5f 44 72 6f 70 54 72 69 67 67 65 72  e OP_DropTrigger
27e20 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c  : {.  sqlite3Unl
27e30 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 72 69 67  inkAndDeleteTrig
27e40 67 65 72 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c  ger(db, pOp->p1,
27e50 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62   pOp->p4.z);.  b
27e60 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  reak;.}...#ifnde
27e70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
27e80 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
27e90 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67 72 69   Opcode: Integri
27ea0 74 79 43 6b 20 50 31 20 50 32 20 50 33 20 2a 20  tyCk P1 P2 P3 * 
27eb0 50 35 0a 2a 2a 0a 2a 2a 20 44 6f 20 61 6e 20 61  P5.**.** Do an a
27ec0 6e 61 6c 79 73 69 73 20 6f 66 20 74 68 65 20 63  nalysis of the c
27ed0 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61  urrently open da
27ee0 74 61 62 61 73 65 2e 20 20 53 74 6f 72 65 20 69  tabase.  Store i
27ef0 6e 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31  n.** register P1
27f00 20 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20   the text of an 
27f10 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 64 65  error message de
27f20 73 63 72 69 62 69 6e 67 20 61 6e 79 20 70 72 6f  scribing any pro
27f30 62 6c 65 6d 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20  blems..** If no 
27f40 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75  problems are fou
27f50 6e 64 2c 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c  nd, store a NULL
27f60 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
27f70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69 73  .**.** The regis
27f80 74 65 72 20 50 33 20 63 6f 6e 74 61 69 6e 73 20  ter P3 contains 
27f90 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
27fa0 65 72 20 6f 66 20 61 6c 6c 6f 77 65 64 20 65 72  er of allowed er
27fb0 72 6f 72 73 2e 0a 2a 2a 20 41 74 20 6d 6f 73 74  rors..** At most
27fc0 20 72 65 67 28 50 33 29 20 65 72 72 6f 72 73 20   reg(P3) errors 
27fd0 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64  will be reported
27fe0 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f  ..** In other wo
27ff0 72 64 73 2c 20 74 68 65 20 61 6e 61 6c 79 73 69  rds, the analysi
28000 73 20 73 74 6f 70 73 20 61 73 20 73 6f 6f 6e 20  s stops as soon 
28010 61 73 20 72 65 67 28 50 31 29 20 65 72 72 6f 72  as reg(P1) error
28020 73 20 61 72 65 20 0a 2a 2a 20 73 65 65 6e 2e 20  s are .** seen. 
28030 20 52 65 67 28 50 31 29 20 69 73 20 75 70 64 61   Reg(P1) is upda
28040 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ted with the num
28050 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 72 65  ber of errors re
28060 6d 61 69 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  maining..**.** T
28070 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
28080 62 65 72 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c  bers of all tabl
28090 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
280a0 73 65 20 61 72 65 20 69 6e 74 65 67 65 72 0a 2a  se are integer.*
280b0 2a 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 28  * stored in reg(
280c0 50 31 29 2c 20 72 65 67 28 50 31 2b 31 29 2c 20  P1), reg(P1+1), 
280d0 72 65 67 28 50 31 2b 32 29 2c 20 2e 2e 2e 2e 20  reg(P1+2), .... 
280e0 20 54 68 65 72 65 20 61 72 65 20 50 32 20 74 61   There are P2 ta
280f0 62 6c 65 73 0a 2a 2a 20 74 6f 74 61 6c 2e 0a 2a  bles.** total..*
28100 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 6e 6f  *.** If P5 is no
28110 74 20 7a 65 72 6f 2c 20 74 68 65 20 63 68 65 63  t zero, the chec
28120 6b 20 69 73 20 64 6f 6e 65 20 6f 6e 20 74 68 65  k is done on the
28130 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
28140 61 73 65 0a 2a 2a 20 66 69 6c 65 2c 20 6e 6f 74  ase.** file, not
28150 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
28160 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
28170 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 75 73  his opcode is us
28180 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
28190 74 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68  the integrity_ch
281a0 65 63 6b 20 70 72 61 67 6d 61 2e 0a 2a 2f 0a 63  eck pragma..*/.c
281b0 61 73 65 20 4f 50 5f 49 6e 74 65 67 72 69 74 79  ase OP_Integrity
281c0 43 6b 3a 20 7b 0a 20 20 69 6e 74 20 6e 52 6f 6f  Ck: {.  int nRoo
281d0 74 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  t;      /* Numbe
281e0 72 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 63  r of tables to c
281f0 68 65 63 6b 2e 20 20 28 4e 75 6d 62 65 72 20 6f  heck.  (Number o
28200 66 20 72 6f 6f 74 20 70 61 67 65 73 2e 29 20 2a  f root pages.) *
28210 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 20  /.  int *aRoot; 
28220 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
28230 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 73  rootpage numbers
28240 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 62   for tables to b
28250 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69  e checked */.  i
28260 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 2f  nt j;          /
28270 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
28280 2f 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20  /.  int nErr;   
28290 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
282a0 20 65 72 72 6f 72 73 20 72 65 70 6f 72 74 65 64   errors reported
282b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
282c0 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
282d0 20 74 68 65 20 65 72 72 6f 72 20 72 65 70 6f 72   the error repor
282e0 74 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 6e 45 72  t */.  Mem *pnEr
282f0 72 3b 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74  r;     /* Regist
28300 65 72 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b  er keeping track
28310 20 6f 66 20 65 72 72 6f 72 73 20 72 65 6d 61 69   of errors remai
28320 6e 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ning */..  asser
28330 74 28 20 70 2d 3e 6e 6f 49 4f 3d 3d 30 20 29 3b  t( p->noIO==0 );
28340 0a 20 20 6e 52 6f 6f 74 20 3d 20 70 4f 70 2d 3e  .  nRoot = pOp->
28350 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52  p2;.  assert( nR
28360 6f 6f 74 3e 30 20 29 3b 0a 20 20 61 52 6f 6f 74  oot>0 );.  aRoot
28370 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
28380 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
28390 28 69 6e 74 29 2a 28 6e 52 6f 6f 74 2b 31 29 20  (int)*(nRoot+1) 
283a0 29 3b 0a 20 20 69 66 28 20 61 52 6f 6f 74 3d 3d  );.  if( aRoot==
283b0 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
283c0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
283d0 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c  p3>0 && pOp->p3<
283e0 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 6e  =p->nMem );.  pn
283f0 45 72 72 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Err = &aMem[pOp-
28400 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p3];.  assert( 
28410 28 70 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26 20  (pnErr->flags & 
28420 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20  MEM_Int)!=0 );. 
28430 20 61 73 73 65 72 74 28 20 28 70 6e 45 72 72 2d   assert( (pnErr-
28440 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74  >flags & (MEM_St
28450 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20  r|MEM_Blob))==0 
28460 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  );.  pIn1 = &aMe
28470 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 66 6f  m[pOp->p1];.  fo
28480 72 28 6a 3d 30 3b 20 6a 3c 6e 52 6f 6f 74 3b 20  r(j=0; j<nRoot; 
28490 6a 2b 2b 29 7b 0a 20 20 20 20 61 52 6f 6f 74 5b  j++){.    aRoot[
284a0 6a 5d 20 3d 20 28 69 6e 74 29 73 71 6c 69 74 65  j] = (int)sqlite
284b0 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 26 70  3VdbeIntValue(&p
284c0 49 6e 31 5b 6a 5d 29 3b 0a 20 20 7d 0a 20 20 61  In1[j]);.  }.  a
284d0 52 6f 6f 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 61  Root[j] = 0;.  a
284e0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c 64  ssert( pOp->p5<d
284f0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
28500 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73  rt( (p->btreeMas
28510 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31  k & (((yDbMask)1
28520 29 3c 3c 70 4f 70 2d 3e 70 35 29 29 21 3d 30 20  )<<pOp->p5))!=0 
28530 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  );.  z = sqlite3
28540 42 74 72 65 65 49 6e 74 65 67 72 69 74 79 43 68  BtreeIntegrityCh
28550 65 63 6b 28 64 62 2d 3e 61 44 62 5b 70 4f 70 2d  eck(db->aDb[pOp-
28560 3e 70 35 5d 2e 70 42 74 2c 20 61 52 6f 6f 74 2c  >p5].pBt, aRoot,
28570 20 6e 52 6f 6f 74 2c 0a 20 20 20 20 20 20 20 20   nRoot,.        
28580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28590 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 6e           (int)pn
285a0 45 72 72 2d 3e 75 2e 69 2c 20 26 6e 45 72 72 29  Err->u.i, &nErr)
285b0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
285c0 65 28 64 62 2c 20 61 52 6f 6f 74 29 3b 0a 20 20  e(db, aRoot);.  
285d0 70 6e 45 72 72 2d 3e 75 2e 69 20 2d 3d 20 6e 45  pnErr->u.i -= nE
285e0 72 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  rr;.  sqlite3Vdb
285f0 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 49 6e 31  eMemSetNull(pIn1
28600 29 3b 0a 20 20 69 66 28 20 6e 45 72 72 3d 3d 30  );.  if( nErr==0
28610 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
28620 7a 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 20  z==0 );.  }else 
28630 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
28640 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
28650 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
28660 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
28670 49 6e 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49  In1, z, -1, SQLI
28680 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33  TE_UTF8, sqlite3
28690 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 20 20 55 50  _free);.  }.  UP
286a0 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
286b0 45 28 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69 74  E(pIn1);.  sqlit
286c0 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f  e3VdbeChangeEnco
286d0 64 69 6e 67 28 70 49 6e 31 2c 20 65 6e 63 6f 64  ding(pIn1, encod
286e0 69 6e 67 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  ing);.  break;.}
286f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
28700 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
28710 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 20 4f 70  _CHECK */../* Op
28720 63 6f 64 65 3a 20 52 6f 77 53 65 74 41 64 64 20  code: RowSetAdd 
28730 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
28740 2a 20 49 6e 73 65 72 74 20 74 68 65 20 69 6e 74  * Insert the int
28750 65 67 65 72 20 76 61 6c 75 65 20 68 65 6c 64 20  eger value held 
28760 62 79 20 72 65 67 69 73 74 65 72 20 50 32 20 69  by register P2 i
28770 6e 74 6f 20 61 20 62 6f 6f 6c 65 61 6e 20 69 6e  nto a boolean in
28780 64 65 78 0a 2a 2a 20 68 65 6c 64 20 69 6e 20 72  dex.** held in r
28790 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 0a 2a  egister P1..**.*
287a0 2a 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66  * An assertion f
287b0 61 69 6c 73 20 69 66 20 50 32 20 69 73 20 6e 6f  ails if P2 is no
287c0 74 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  t an integer..*/
287d0 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65 74 41  .case OP_RowSetA
287e0 64 64 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 69  dd: {       /* i
287f0 6e 31 2c 20 69 6e 32 20 2a 2f 0a 20 20 70 49 6e  n1, in2 */.  pIn
28800 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
28810 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d  1];.  pIn2 = &aM
28820 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61  em[pOp->p2];.  a
28830 73 73 65 72 74 28 20 28 70 49 6e 32 2d 3e 66 6c  ssert( (pIn2->fl
28840 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d  ags & MEM_Int)!=
28850 30 20 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31  0 );.  if( (pIn1
28860 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
28870 77 53 65 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  wSet)==0 ){.    
28880 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
28890 74 52 6f 77 53 65 74 28 70 49 6e 31 29 3b 0a 20  tRowSet(pIn1);. 
288a0 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c     if( (pIn1->fl
288b0 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
288c0 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  )==0 ) goto no_m
288d0 65 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  em;.  }.  sqlite
288e0 33 52 6f 77 53 65 74 49 6e 73 65 72 74 28 70 49  3RowSetInsert(pI
288f0 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20 70  n1->u.pRowSet, p
28900 49 6e 32 2d 3e 75 2e 69 29 3b 0a 20 20 62 72 65  In2->u.i);.  bre
28910 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
28920 3a 20 52 6f 77 53 65 74 52 65 61 64 20 50 31 20  : RowSetRead P1 
28930 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
28940 45 78 74 72 61 63 74 20 74 68 65 20 73 6d 61 6c  Extract the smal
28950 6c 65 73 74 20 76 61 6c 75 65 20 66 72 6f 6d 20  lest value from 
28960 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20 50 31  boolean index P1
28970 20 61 6e 64 20 70 75 74 20 74 68 61 74 20 76 61   and put that va
28980 6c 75 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69  lue into.** regi
28990 73 74 65 72 20 50 33 2e 20 20 4f 72 2c 20 69 66  ster P3.  Or, if
289a0 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20 50   boolean index P
289b0 31 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 65  1 is initially e
289c0 6d 70 74 79 2c 20 6c 65 61 76 65 20 50 33 0a 2a  mpty, leave P3.*
289d0 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  * unchanged and 
289e0 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74  jump to instruct
289f0 69 6f 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20  ion P2..*/.case 
28a00 4f 50 5f 52 6f 77 53 65 74 52 65 61 64 3a 20 7b  OP_RowSetRead: {
28a10 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
28a20 69 6e 31 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69  in1, out3 */.  i
28a30 36 34 20 76 61 6c 3b 0a 20 20 43 48 45 43 4b 5f  64 val;.  CHECK_
28a40 46 4f 52 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20  FOR_INTERRUPT;. 
28a50 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
28a60 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 28 70  p->p1];.  if( (p
28a70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
28a80 5f 52 6f 77 53 65 74 29 3d 3d 30 20 0a 20 20 20  _RowSet)==0 .   
28a90 7c 7c 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74  || sqlite3RowSet
28aa0 4e 65 78 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f  Next(pIn1->u.pRo
28ab0 77 53 65 74 2c 20 26 76 61 6c 29 3d 3d 30 0a 20  wSet, &val)==0. 
28ac0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 62   ){.    /* The b
28ad0 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20 69 73 20  oolean index is 
28ae0 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 73 71 6c  empty */.    sql
28af0 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
28b00 6c 6c 28 70 49 6e 31 29 3b 0a 20 20 20 20 70 63  ll(pIn1);.    pc
28b10 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
28b20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
28b30 41 20 76 61 6c 75 65 20 77 61 73 20 70 75 6c 6c  A value was pull
28b40 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ed from the inde
28b50 78 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  x */.    sqlite3
28b60 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28  VdbeMemSetInt64(
28b70 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2c 20  &aMem[pOp->p3], 
28b80 76 61 6c 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  val);.  }.  brea
28b90 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
28ba0 20 52 6f 77 53 65 74 54 65 73 74 20 50 31 20 50   RowSetTest P1 P
28bb0 32 20 50 33 20 50 34 0a 2a 2a 0a 2a 2a 20 52 65  2 P3 P4.**.** Re
28bc0 67 69 73 74 65 72 20 50 33 20 69 73 20 61 73 73  gister P3 is ass
28bd0 75 6d 65 64 20 74 6f 20 68 6f 6c 64 20 61 20 36  umed to hold a 6
28be0 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61  4-bit integer va
28bf0 6c 75 65 2e 20 49 66 20 72 65 67 69 73 74 65 72  lue. If register
28c00 20 50 31 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   P1.** contains 
28c10 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20  a RowSet object 
28c20 61 6e 64 20 74 68 61 74 20 52 6f 77 53 65 74 20  and that RowSet 
28c30 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 0a  object contains.
28c40 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 68 65 6c  ** the value hel
28c50 64 20 69 6e 20 50 33 2c 20 6a 75 6d 70 20 74 6f  d in P3, jump to
28c60 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 4f 74   register P2. Ot
28c70 68 65 72 77 69 73 65 2c 20 69 6e 73 65 72 74 20  herwise, insert 
28c80 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69  the.** integer i
28c90 6e 20 50 33 20 69 6e 74 6f 20 74 68 65 20 52 6f  n P3 into the Ro
28ca0 77 53 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  wSet and continu
28cb0 65 20 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6e  e on to the.** n
28cc0 65 78 74 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  ext opcode..**.*
28cd0 2a 20 54 68 65 20 52 6f 77 53 65 74 20 6f 62 6a  * The RowSet obj
28ce0 65 63 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ect is optimized
28cf0 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68   for the case wh
28d00 65 72 65 20 73 75 63 63 65 73 73 69 76 65 20 73  ere successive s
28d10 65 74 73 0a 2a 2a 20 6f 66 20 69 6e 74 65 67 65  ets.** of intege
28d20 72 73 2c 20 77 68 65 72 65 20 65 61 63 68 20 73  rs, where each s
28d30 65 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  et contains no d
28d40 75 70 6c 69 63 61 74 65 73 2e 20 45 61 63 68 20  uplicates. Each 
28d50 73 65 74 0a 2a 2a 20 6f 66 20 76 61 6c 75 65 73  set.** of values
28d60 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62   is identified b
28d70 79 20 61 20 75 6e 69 71 75 65 20 50 34 20 76 61  y a unique P4 va
28d80 6c 75 65 2e 20 54 68 65 20 66 69 72 73 74 20 73  lue. The first s
28d90 65 74 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20  et.** must have 
28da0 50 34 3d 3d 30 2c 20 74 68 65 20 66 69 6e 61 6c  P4==0, the final
28db0 20 73 65 74 20 50 34 3d 2d 31 2e 20 20 50 34 20   set P4=-1.  P4 
28dc0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 2d  must be either -
28dd0 31 20 6f 72 0a 2a 2a 20 6e 6f 6e 2d 6e 65 67 61  1 or.** non-nega
28de0 74 69 76 65 2e 20 20 46 6f 72 20 6e 6f 6e 2d 6e  tive.  For non-n
28df0 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20 6f  egative values o
28e00 66 20 50 34 20 6f 6e 6c 79 20 74 68 65 20 6c 6f  f P4 only the lo
28e10 77 65 72 20 34 0a 2a 2a 20 62 69 74 73 20 61 72  wer 4.** bits ar
28e20 65 20 73 69 67 6e 69 66 69 63 61 6e 74 2e 0a 2a  e significant..*
28e30 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73  *.** This allows
28e40 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 3a 20   optimizations: 
28e50 28 61 29 20 77 68 65 6e 20 50 34 3d 3d 30 20 74  (a) when P4==0 t
28e60 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
28e70 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 65 20 72  to test.** the r
28e80 6f 77 73 65 74 20 6f 62 6a 65 63 74 20 66 6f 72  owset object for
28e90 20 50 33 2c 20 61 73 20 69 74 20 69 73 20 67 75   P3, as it is gu
28ea0 61 72 61 6e 74 65 65 64 20 6e 6f 74 20 74 6f 20  aranteed not to 
28eb0 63 6f 6e 74 61 69 6e 20 69 74 2c 0a 2a 2a 20 28  contain it,.** (
28ec0 62 29 20 77 68 65 6e 20 50 34 3d 3d 2d 31 20 74  b) when P4==-1 t
28ed0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
28ee0 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 76 61  to insert the va
28ef0 6c 75 65 2c 20 61 73 20 69 74 20 77 69 6c 6c 0a  lue, as it will.
28f00 2a 2a 20 6e 65 76 65 72 20 62 65 20 74 65 73 74  ** never be test
28f10 65 64 20 66 6f 72 2c 20 61 6e 64 20 28 63 29 20  ed for, and (c) 
28f20 77 68 65 6e 20 61 20 76 61 6c 75 65 20 74 68 61  when a value tha
28f30 74 20 69 73 20 70 61 72 74 20 6f 66 20 73 65 74  t is part of set
28f40 20 58 20 69 73 0a 2a 2a 20 69 6e 73 65 72 74 65   X is.** inserte
28f50 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  d, there is no n
28f60 65 65 64 20 74 6f 20 73 65 61 72 63 68 20 74 6f  eed to search to
28f70 20 73 65 65 20 69 66 20 74 68 65 20 73 61 6d 65   see if the same
28f80 20 76 61 6c 75 65 20 77 61 73 0a 2a 2a 20 70 72   value was.** pr
28f90 65 76 69 6f 75 73 6c 79 20 69 6e 73 65 72 74 65  eviously inserte
28fa0 64 20 61 73 20 70 61 72 74 20 6f 66 20 73 65 74  d as part of set
28fb0 20 58 20 28 6f 6e 6c 79 20 69 66 20 69 74 20 77   X (only if it w
28fc0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  as previously.**
28fd0 20 69 6e 73 65 72 74 65 64 20 61 73 20 70 61 72   inserted as par
28fe0 74 20 6f 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  t of some other 
28ff0 73 65 74 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  set)..*/.case OP
29000 5f 52 6f 77 53 65 74 54 65 73 74 3a 20 7b 20 20  _RowSetTest: {  
29010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29020 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 2c     /* jump, in1,
29030 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 69 53   in3 */.  int iS
29040 65 74 3b 0a 20 20 69 6e 74 20 65 78 69 73 74 73  et;.  int exists
29050 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  ;..  pIn1 = &aMe
29060 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49  m[pOp->p1];.  pI
29070 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n3 = &aMem[pOp->
29080 70 33 5d 3b 0a 20 20 69 53 65 74 20 3d 20 70 4f  p3];.  iSet = pO
29090 70 2d 3e 70 34 2e 69 3b 0a 20 20 61 73 73 65 72  p->p4.i;.  asser
290a0 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 26 4d  t( pIn3->flags&M
290b0 45 4d 5f 49 6e 74 20 29 3b 0a 0a 20 20 2f 2a 20  EM_Int );..  /* 
290c0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74  If there is anyt
290d0 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
290e0 61 20 72 6f 77 73 65 74 20 6f 62 6a 65 63 74 20  a rowset object 
290f0 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 50  in memory cell P
29100 31 2c 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20 69  1,.  ** delete i
29110 74 20 6e 6f 77 20 61 6e 64 20 69 6e 69 74 69 61  t now and initia
29120 6c 69 7a 65 20 50 31 20 77 69 74 68 20 61 6e 20  lize P1 with an 
29130 65 6d 70 74 79 20 72 6f 77 73 65 74 0a 20 20 2a  empty rowset.  *
29140 2f 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66  /.  if( (pIn1->f
29150 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
29160 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  t)==0 ){.    sql
29170 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 52 6f  ite3VdbeMemSetRo
29180 77 53 65 74 28 70 49 6e 31 29 3b 0a 20 20 20 20  wSet(pIn1);.    
29190 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
291a0 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d   & MEM_RowSet)==
291b0 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
291c0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
291d0 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
291e0 49 4e 54 33 32 20 29 3b 0a 20 20 61 73 73 65 72  INT32 );.  asser
291f0 74 28 20 69 53 65 74 3d 3d 2d 31 20 7c 7c 20 69  t( iSet==-1 || i
29200 53 65 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  Set>=0 );.  if( 
29210 69 53 65 74 20 29 7b 0a 20 20 20 20 65 78 69 73  iSet ){.    exis
29220 74 73 20 3d 20 73 71 6c 69 74 65 33 52 6f 77 53  ts = sqlite3RowS
29230 65 74 54 65 73 74 28 70 49 6e 31 2d 3e 75 2e 70  etTest(pIn1->u.p
29240 52 6f 77 53 65 74 2c 20 0a 20 20 20 20 20 20 20  RowSet, .       
29250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29260 20 20 20 20 20 20 20 20 28 75 38 29 28 69 53 65          (u8)(iSe
29270 74 3e 3d 30 20 3f 20 69 53 65 74 20 26 20 30 78  t>=0 ? iSet & 0x
29280 66 20 3a 20 30 78 66 66 29 2c 0a 20 20 20 20 20  f : 0xff),.     
29290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292a0 20 20 20 20 20 20 20 20 20 20 70 49 6e 33 2d 3e            pIn3->
292b0 75 2e 69 29 3b 0a 20 20 20 20 69 66 28 20 65 78  u.i);.    if( ex
292c0 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 70 63  ists ){.      pc
292d0 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
292e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
292f0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 65   }.  }.  if( iSe
29300 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t>=0 ){.    sqli
29310 74 65 33 52 6f 77 53 65 74 49 6e 73 65 72 74 28  te3RowSetInsert(
29320 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c  pIn1->u.pRowSet,
29330 20 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 7d   pIn3->u.i);.  }
29340 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69  .  break;.}...#i
29350 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29360 54 5f 54 52 49 47 47 45 52 0a 0a 2f 2a 20 4f 70  T_TRIGGER../* Op
29370 63 6f 64 65 3a 20 50 72 6f 67 72 61 6d 20 50 31  code: Program P1
29380 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a   P2 P3 P4 *.**.*
29390 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 74 72  * Execute the tr
293a0 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 70 61  igger program pa
293b0 73 73 65 64 20 61 73 20 50 34 20 28 74 79 70 65  ssed as P4 (type
293c0 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 29 2e   P4_SUBPROGRAM).
293d0 20 0a 2a 2a 0a 2a 2a 20 50 31 20 63 6f 6e 74 61   .**.** P1 conta
293e0 69 6e 73 20 74 68 65 20 61 64 64 72 65 73 73 20  ins the address 
293f0 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  of the memory ce
29400 6c 6c 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ll that contains
29410 20 74 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72   the first memor
29420 79 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 61 6e  y .** cell in an
29430 20 61 72 72 61 79 20 6f 66 20 76 61 6c 75 65 73   array of values
29440 20 75 73 65 64 20 61 73 20 61 72 67 75 6d 65 6e   used as argumen
29450 74 73 20 74 6f 20 74 68 65 20 73 75 62 2d 70 72  ts to the sub-pr
29460 6f 67 72 61 6d 2e 20 50 32 20 0a 2a 2a 20 63 6f  ogram. P2 .** co
29470 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64 72 65  ntains the addre
29480 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66  ss to jump to if
29490 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d   the sub-program
294a0 20 74 68 72 6f 77 73 20 61 6e 20 49 47 4e 4f 52   throws an IGNOR
294b0 45 20 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20  E .** exception 
294c0 75 73 69 6e 67 20 74 68 65 20 52 41 49 53 45 28  using the RAISE(
294d0 29 20 66 75 6e 63 74 69 6f 6e 2e 20 52 65 67 69  ) function. Regi
294e0 73 74 65 72 20 50 33 20 63 6f 6e 74 61 69 6e 73  ster P3 contains
294f0 20 74 68 65 20 61 64 64 72 65 73 73 20 0a 2a 2a   the address .**
29500 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   of a memory cel
29510 6c 20 69 6e 20 74 68 69 73 20 28 74 68 65 20 70  l in this (the p
29520 61 72 65 6e 74 29 20 56 4d 20 74 68 61 74 20 69  arent) VM that i
29530 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
29540 74 65 20 74 68 65 20 0a 2a 2a 20 6d 65 6d 6f 72  te the .** memor
29550 79 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  y required by th
29560 65 20 73 75 62 2d 76 64 62 65 20 61 74 20 72 75  e sub-vdbe at ru
29570 6e 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 50 34 20  ntime..**.** P4 
29580 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
29590 74 68 65 20 56 4d 20 63 6f 6e 74 61 69 6e 69 6e  the VM containin
295a0 67 20 74 68 65 20 74 72 69 67 67 65 72 20 70 72  g the trigger pr
295b0 6f 67 72 61 6d 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ogram..*/.case O
295c0 50 5f 50 72 6f 67 72 61 6d 3a 20 7b 20 20 20 20  P_Program: {    
295d0 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20      /* jump */. 
295e0 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20   int nMem;      
295f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
29600 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 67  er of memory reg
29610 69 73 74 65 72 73 20 66 6f 72 20 73 75 62 2d 70  isters for sub-p
29620 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 69 6e 74 20  rogram */.  int 
29630 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
29640 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
29650 72 75 6e 74 69 6d 65 20 73 70 61 63 65 20 72 65  runtime space re
29660 71 75 69 72 65 64 20 66 6f 72 20 73 75 62 2d 70  quired for sub-p
29670 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 4d 65 6d 20  rogram */.  Mem 
29680 2a 70 52 74 3b 20 20 20 20 20 20 20 20 20 20 20  *pRt;           
29690 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
296a0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 72 75 6e 74  to allocate runt
296b0 69 6d 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 4d  ime space */.  M
296c0 65 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20  em *pMem;       
296d0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
296e0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
296f0 68 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 2a  h memory cells *
29700 2f 0a 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 20 20  /.  Mem *pEnd;  
29710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
29720 61 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ast memory cell 
29730 69 6e 20 6e 65 77 20 61 72 72 61 79 20 2a 2f 0a  in new array */.
29740 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72    VdbeFrame *pFr
29750 61 6d 65 3b 20 20 20 20 20 20 2f 2a 20 4e 65 77  ame;      /* New
29760 20 76 64 62 65 20 66 72 61 6d 65 20 74 6f 20 65   vdbe frame to e
29770 78 65 63 75 74 65 20 69 6e 20 2a 2f 0a 20 20 53  xecute in */.  S
29780 75 62 50 72 6f 67 72 61 6d 20 2a 70 50 72 6f 67  ubProgram *pProg
29790 72 61 6d 3b 20 20 20 2f 2a 20 53 75 62 2d 70 72  ram;   /* Sub-pr
297a0 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65  ogram to execute
297b0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 74 3b 20 20   */.  void *t;  
297c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
297d0 20 54 6f 6b 65 6e 20 69 64 65 6e 74 69 66 79 69   Token identifyi
297e0 6e 67 20 74 72 69 67 67 65 72 20 2a 2f 0a 0a 20  ng trigger */.. 
297f0 20 70 50 72 6f 67 72 61 6d 20 3d 20 70 4f 70 2d   pProgram = pOp-
29800 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  >p4.pProgram;.  
29810 70 52 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  pRt = &aMem[pOp-
29820 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p3];.  assert( 
29830 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3e 30 20  pProgram->nOp>0 
29840 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68  );.  .  /* If th
29850 65 20 70 35 20 66 6c 61 67 20 69 73 20 63 6c 65  e p5 flag is cle
29860 61 72 2c 20 74 68 65 6e 20 72 65 63 75 72 73 69  ar, then recursi
29870 76 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  ve invocation of
29880 20 74 72 69 67 67 65 72 73 20 69 73 20 0a 20 20   triggers is .  
29890 2a 2a 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20  ** disabled for 
298a0 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
298b0 69 62 69 6c 69 74 79 20 28 70 35 20 69 73 20 73  ibility (p5 is s
298c0 65 74 20 69 66 20 74 68 69 73 20 73 75 62 2d 70  et if this sub-p
298d0 72 6f 67 72 61 6d 0a 20 20 2a 2a 20 69 73 20 72  rogram.  ** is r
298e0 65 61 6c 6c 79 20 61 20 74 72 69 67 67 65 72 2c  eally a trigger,
298f0 20 6e 6f 74 20 61 20 66 6f 72 65 69 67 6e 20 6b   not a foreign k
29900 65 79 20 61 63 74 69 6f 6e 2c 20 61 6e 64 20 74  ey action, and t
29910 68 65 20 66 6c 61 67 20 73 65 74 0a 20 20 2a 2a  he flag set.  **
29920 20 61 6e 64 20 63 6c 65 61 72 65 64 20 62 79 20   and cleared by 
29930 74 68 65 20 22 50 52 41 47 4d 41 20 72 65 63 75  the "PRAGMA recu
29940 72 73 69 76 65 5f 74 72 69 67 67 65 72 73 22 20  rsive_triggers" 
29950 63 6f 6d 6d 61 6e 64 20 69 73 20 63 6c 65 61 72  command is clear
29960 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 74  )..  ** .  ** It
29970 20 69 73 20 72 65 63 75 72 73 69 76 65 20 69 6e   is recursive in
29980 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 72 69 67  vocation of trig
29990 67 65 72 73 2c 20 61 74 20 74 68 65 20 53 51 4c  gers, at the SQL
299a0 20 6c 65 76 65 6c 2c 20 74 68 61 74 20 69 73 20   level, that is 
299b0 0a 20 20 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20  .  ** disabled. 
299c0 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 61 20  In some cases a 
299d0 73 69 6e 67 6c 65 20 74 72 69 67 67 65 72 20 6d  single trigger m
299e0 61 79 20 67 65 6e 65 72 61 74 65 20 6d 6f 72 65  ay generate more
299f0 20 74 68 61 6e 20 6f 6e 65 20 0a 20 20 2a 2a 20   than one .  ** 
29a00 53 75 62 50 72 6f 67 72 61 6d 20 28 69 66 20 74  SubProgram (if t
29a10 68 65 20 74 72 69 67 67 65 72 20 6d 61 79 20 62  he trigger may b
29a20 65 20 65 78 65 63 75 74 65 64 20 77 69 74 68 20  e executed with 
29a30 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 69  more than one di
29a40 66 66 65 72 65 6e 74 20 0a 20 20 2a 2a 20 4f 4e  fferent .  ** ON
29a50 20 43 4f 4e 46 4c 49 43 54 20 61 6c 67 6f 72 69   CONFLICT algori
29a60 74 68 6d 29 2e 20 53 75 62 50 72 6f 67 72 61 6d  thm). SubProgram
29a70 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
29a80 63 69 61 74 65 64 20 77 69 74 68 20 61 0a 20 20  ciated with a.  
29a90 2a 2a 20 73 69 6e 67 6c 65 20 74 72 69 67 67 65  ** single trigge
29aa0 72 20 61 6c 6c 20 68 61 76 65 20 74 68 65 20 73  r all have the s
29ab0 61 6d 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ame value for th
29ac0 65 20 53 75 62 50 72 6f 67 72 61 6d 2e 74 6f 6b  e SubProgram.tok
29ad0 65 6e 20 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  en .  ** variabl
29ae0 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70  e.  */.  if( pOp
29af0 2d 3e 70 35 20 29 7b 0a 20 20 20 20 74 20 3d 20  ->p5 ){.    t = 
29b00 70 50 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b  pProgram->token;
29b10 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d  .    for(pFrame=
29b20 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d  p->pFrame; pFram
29b30 65 20 26 26 20 70 46 72 61 6d 65 2d 3e 74 6f 6b  e && pFrame->tok
29b40 65 6e 21 3d 74 3b 20 70 46 72 61 6d 65 3d 70 46  en!=t; pFrame=pF
29b50 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  rame->pParent);.
29b60 20 20 20 20 69 66 28 20 70 46 72 61 6d 65 20 29      if( pFrame )
29b70 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69   break;.  }..  i
29b80 66 28 20 70 2d 3e 6e 46 72 61 6d 65 3e 3d 64 62  f( p->nFrame>=db
29b90 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
29ba0 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
29bb0 50 54 48 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d  PTH] ){.    rc =
29bc0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
29bd0 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
29be0 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
29bf0 20 64 62 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 6c   db, "too many l
29c00 65 76 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72  evels of trigger
29c10 20 72 65 63 75 72 73 69 6f 6e 22 29 3b 0a 20 20   recursion");.  
29c20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
29c30 2f 2a 20 52 65 67 69 73 74 65 72 20 70 52 74 20  /* Register pRt 
29c40 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
29c50 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75   the memory requ
29c60 69 72 65 64 20 74 6f 20 73 61 76 65 20 74 68 65  ired to save the
29c70 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74   state.  ** of t
29c80 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 67 72  he current progr
29c90 61 6d 2c 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f  am, and the memo
29ca0 72 79 20 72 65 71 75 69 72 65 64 20 61 74 20 72  ry required at r
29cb0 75 6e 74 69 6d 65 20 74 6f 20 65 78 65 63 75 74  untime to execut
29cc0 65 0a 20 20 2a 2a 20 74 68 65 20 74 72 69 67 67  e.  ** the trigg
29cd0 65 72 20 70 72 6f 67 72 61 6d 2e 20 49 66 20 74  er program. If t
29ce0 68 69 73 20 74 72 69 67 67 65 72 20 68 61 73 20  his trigger has 
29cf0 62 65 65 6e 20 66 69 72 65 64 20 62 65 66 6f 72  been fired befor
29d00 65 2c 20 74 68 65 6e 20 70 52 74 20 0a 20 20 2a  e, then pRt .  *
29d10 2a 20 69 73 20 61 6c 72 65 61 64 79 20 61 6c 6c  * is already all
29d20 6f 63 61 74 65 64 2e 20 4f 74 68 65 72 77 69 73  ocated. Otherwis
29d30 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 69 6e  e, it must be in
29d40 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20  itialized.  */. 
29d50 20 69 66 28 20 28 70 52 74 2d 3e 66 6c 61 67 73   if( (pRt->flags
29d60 26 4d 45 4d 5f 46 72 61 6d 65 29 3d 3d 30 20 29  &MEM_Frame)==0 )
29d70 7b 0a 20 20 20 20 2f 2a 20 53 75 62 50 72 6f 67  {.    /* SubProg
29d80 72 61 6d 2e 6e 4d 65 6d 20 69 73 20 73 65 74 20  ram.nMem is set 
29d90 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
29da0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 75 73   memory cells us
29db0 65 64 20 62 79 20 74 68 65 20 0a 20 20 20 20 2a  ed by the .    *
29dc0 2a 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64  * program stored
29dd0 20 69 6e 20 53 75 62 50 72 6f 67 72 61 6d 2e 61   in SubProgram.a
29de0 4f 70 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 74  Op. As well as t
29df0 68 65 73 65 2c 20 6f 6e 65 20 6d 65 6d 6f 72 79  hese, one memory
29e00 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 69 73 20  .    ** cell is 
29e10 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
29e20 68 20 63 75 72 73 6f 72 20 75 73 65 64 20 62 79  h cursor used by
29e30 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 53 65   the program. Se
29e40 74 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76  t local.    ** v
29e50 61 72 69 61 62 6c 65 20 6e 4d 65 6d 20 28 61 6e  ariable nMem (an
29e60 64 20 6c 61 74 65 72 2c 20 56 64 62 65 46 72 61  d later, VdbeFra
29e70 6d 65 2e 6e 43 68 69 6c 64 4d 65 6d 29 20 74 6f  me.nChildMem) to
29e80 20 74 68 69 73 20 76 61 6c 75 65 2e 0a 20 20 20   this value..   
29e90 20 2a 2f 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 70   */.    nMem = p
29ea0 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20 2b 20  Program->nMem + 
29eb0 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b 0a  pProgram->nCsr;.
29ec0 20 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e      nByte = ROUN
29ed0 44 38 28 73 69 7a 65 6f 66 28 56 64 62 65 46 72  D8(sizeof(VdbeFr
29ee0 61 6d 65 29 29 0a 20 20 20 20 20 20 20 20 20 20  ame)).          
29ef0 20 20 20 20 2b 20 6e 4d 65 6d 20 2a 20 73 69 7a      + nMem * siz
29f00 65 6f 66 28 4d 65 6d 29 0a 20 20 20 20 20 20 20  eof(Mem).       
29f10 20 20 20 20 20 20 20 2b 20 70 50 72 6f 67 72 61         + pProgra
29f20 6d 2d 3e 6e 43 73 72 20 2a 20 73 69 7a 65 6f 66  m->nCsr * sizeof
29f30 28 56 64 62 65 43 75 72 73 6f 72 20 2a 29 0a 20  (VdbeCursor *). 
29f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 70               + p
29f50 50 72 6f 67 72 61 6d 2d 3e 6e 4f 6e 63 65 20 2a  Program->nOnce *
29f60 20 73 69 7a 65 6f 66 28 75 38 29 3b 0a 20 20 20   sizeof(u8);.   
29f70 20 70 46 72 61 6d 65 20 3d 20 73 71 6c 69 74 65   pFrame = sqlite
29f80 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
29f90 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
29fa0 28 20 21 70 46 72 61 6d 65 20 29 7b 0a 20 20 20  ( !pFrame ){.   
29fb0 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
29fc0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
29fd0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
29fe0 70 52 74 29 3b 0a 20 20 20 20 70 52 74 2d 3e 66  pRt);.    pRt->f
29ff0 6c 61 67 73 20 3d 20 4d 45 4d 5f 46 72 61 6d 65  lags = MEM_Frame
2a000 3b 0a 20 20 20 20 70 52 74 2d 3e 75 2e 70 46 72  ;.    pRt->u.pFr
2a010 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a 0a 20  ame = pFrame;.. 
2a020 20 20 20 70 46 72 61 6d 65 2d 3e 76 20 3d 20 70     pFrame->v = p
2a030 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43  ;.    pFrame->nC
2a040 68 69 6c 64 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a  hildMem = nMem;.
2a050 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69      pFrame->nChi
2a060 6c 64 43 73 72 20 3d 20 70 50 72 6f 67 72 61 6d  ldCsr = pProgram
2a070 2d 3e 6e 43 73 72 3b 0a 20 20 20 20 70 46 72 61  ->nCsr;.    pFra
2a080 6d 65 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20 20  me->pc = pc;.   
2a090 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 20 3d 20   pFrame->aMem = 
2a0a0 70 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 70 46 72  p->aMem;.    pFr
2a0b0 61 6d 65 2d 3e 6e 4d 65 6d 20 3d 20 70 2d 3e 6e  ame->nMem = p->n
2a0c0 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d  Mem;.    pFrame-
2a0d0 3e 61 70 43 73 72 20 3d 20 70 2d 3e 61 70 43 73  >apCsr = p->apCs
2a0e0 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e  r;.    pFrame->n
2a0f0 43 75 72 73 6f 72 20 3d 20 70 2d 3e 6e 43 75 72  Cursor = p->nCur
2a100 73 6f 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d  sor;.    pFrame-
2a110 3e 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20  >aOp = p->aOp;. 
2a120 20 20 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 20 3d     pFrame->nOp =
2a130 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 70 46 72   p->nOp;.    pFr
2a140 61 6d 65 2d 3e 74 6f 6b 65 6e 20 3d 20 70 50 72  ame->token = pPr
2a150 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  ogram->token;.  
2a160 20 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46    pFrame->aOnceF
2a170 6c 61 67 20 3d 20 70 2d 3e 61 4f 6e 63 65 46 6c  lag = p->aOnceFl
2a180 61 67 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e  ag;.    pFrame->
2a190 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 2d 3e 6e  nOnceFlag = p->n
2a1a0 4f 6e 63 65 46 6c 61 67 3b 0a 0a 20 20 20 20 70  OnceFlag;..    p
2a1b0 45 6e 64 20 3d 20 26 56 64 62 65 46 72 61 6d 65  End = &VdbeFrame
2a1c0 4d 65 6d 28 70 46 72 61 6d 65 29 5b 70 46 72 61  Mem(pFrame)[pFra
2a1d0 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a  me->nChildMem];.
2a1e0 20 20 20 20 66 6f 72 28 70 4d 65 6d 3d 56 64 62      for(pMem=Vdb
2a1f0 65 46 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65  eFrameMem(pFrame
2a200 29 3b 20 70 4d 65 6d 21 3d 70 45 6e 64 3b 20 70  ); pMem!=pEnd; p
2a210 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4d  Mem++){.      pM
2a220 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
2a230 49 6e 76 61 6c 69 64 3b 0a 20 20 20 20 20 20 70  Invalid;.      p
2a240 4d 65 6d 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  Mem->db = db;.  
2a250 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2a260 20 70 46 72 61 6d 65 20 3d 20 70 52 74 2d 3e 75   pFrame = pRt->u
2a270 2e 70 46 72 61 6d 65 3b 0a 20 20 20 20 61 73 73  .pFrame;.    ass
2a280 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e  ert( pProgram->n
2a290 4d 65 6d 2b 70 50 72 6f 67 72 61 6d 2d 3e 6e 43  Mem+pProgram->nC
2a2a0 73 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68 69  sr==pFrame->nChi
2a2b0 6c 64 4d 65 6d 20 29 3b 0a 20 20 20 20 61 73 73  ldMem );.    ass
2a2c0 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e  ert( pProgram->n
2a2d0 43 73 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68  Csr==pFrame->nCh
2a2e0 69 6c 64 43 73 72 20 29 3b 0a 20 20 20 20 61 73  ildCsr );.    as
2a2f0 73 65 72 74 28 20 70 63 3d 3d 70 46 72 61 6d 65  sert( pc==pFrame
2a300 2d 3e 70 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 70  ->pc );.  }..  p
2a310 2d 3e 6e 46 72 61 6d 65 2b 2b 3b 0a 20 20 70 46  ->nFrame++;.  pF
2a320 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  rame->pParent = 
2a330 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 70 46 72  p->pFrame;.  pFr
2a340 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d  ame->lastRowid =
2a350 20 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 70 46   lastRowid;.  pF
2a360 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  rame->nChange = 
2a370 70 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 70 2d  p->nChange;.  p-
2a380 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
2a390 70 2d 3e 70 46 72 61 6d 65 20 3d 20 70 46 72 61  p->pFrame = pFra
2a3a0 6d 65 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20  me;.  p->aMem = 
2a3b0 61 4d 65 6d 20 3d 20 26 56 64 62 65 46 72 61 6d  aMem = &VdbeFram
2a3c0 65 4d 65 6d 28 70 46 72 61 6d 65 29 5b 2d 31 5d  eMem(pFrame)[-1]
2a3d0 3b 0a 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 70 46  ;.  p->nMem = pF
2a3e0 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 3b  rame->nChildMem;
2a3f0 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  .  p->nCursor = 
2a400 28 75 31 36 29 70 46 72 61 6d 65 2d 3e 6e 43 68  (u16)pFrame->nCh
2a410 69 6c 64 43 73 72 3b 0a 20 20 70 2d 3e 61 70 43  ildCsr;.  p->apC
2a420 73 72 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72  sr = (VdbeCursor
2a430 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 4d 65   **)&aMem[p->nMe
2a440 6d 2b 31 5d 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d  m+1];.  p->aOp =
2a450 20 61 4f 70 20 3d 20 70 50 72 6f 67 72 61 6d 2d   aOp = pProgram-
2a460 3e 61 4f 70 3b 0a 20 20 70 2d 3e 6e 4f 70 20 3d  >aOp;.  p->nOp =
2a470 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3b 0a   pProgram->nOp;.
2a480 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d    p->aOnceFlag =
2a490 20 28 75 38 20 2a 29 26 70 2d 3e 61 70 43 73 72   (u8 *)&p->apCsr
2a4a0 5b 70 2d 3e 6e 43 75 72 73 6f 72 5d 3b 0a 20 20  [p->nCursor];.  
2a4b0 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70  p->nOnceFlag = p
2a4c0 50 72 6f 67 72 61 6d 2d 3e 6e 4f 6e 63 65 3b 0a  Program->nOnce;.
2a4d0 20 20 70 63 20 3d 20 2d 31 3b 0a 20 20 6d 65 6d    pc = -1;.  mem
2a4e0 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67  set(p->aOnceFlag
2a4f0 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61  , 0, p->nOnceFla
2a500 67 29 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  g);..  break;.}.
2a510 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61 72 61  ./* Opcode: Para
2a520 6d 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  m P1 P2 * * *.**
2a530 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
2a540 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 70 72 65  is only ever pre
2a550 73 65 6e 74 20 69 6e 20 73 75 62 2d 70 72 6f 67  sent in sub-prog
2a560 72 61 6d 73 20 63 61 6c 6c 65 64 20 76 69 61 20  rams called via 
2a570 74 68 65 20 0a 2a 2a 20 4f 50 5f 50 72 6f 67 72  the .** OP_Progr
2a580 61 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  am instruction. 
2a590 43 6f 70 79 20 61 20 76 61 6c 75 65 20 63 75 72  Copy a value cur
2a5a0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
2a5b0 20 61 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65   a memory .** ce
2a5c0 6c 6c 20 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e  ll of the callin
2a5d0 67 20 28 70 61 72 65 6e 74 29 20 66 72 61 6d 65  g (parent) frame
2a5e0 20 74 6f 20 63 65 6c 6c 20 50 32 20 69 6e 20 74   to cell P2 in t
2a5f0 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65  he current frame
2a600 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  s .** address sp
2a610 61 63 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ace. This is use
2a620 64 20 62 79 20 74 72 69 67 67 65 72 20 70 72 6f  d by trigger pro
2a630 67 72 61 6d 73 20 74 6f 20 61 63 63 65 73 73 20  grams to access 
2a640 74 68 65 20 6e 65 77 2e 2a 20 0a 2a 2a 20 61 6e  the new.* .** an
2a650 64 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 2e 0a  d old.* values..
2a660 2a 2a 0a 2a 2a 20 54 68 65 20 61 64 64 72 65 73  **.** The addres
2a670 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 6e  s of the cell in
2a680 20 74 68 65 20 70 61 72 65 6e 74 20 66 72 61 6d   the parent fram
2a690 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
2a6a0 62 79 20 61 64 64 69 6e 67 0a 2a 2a 20 74 68 65  by adding.** the
2a6b0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31   value of the P1
2a6c0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
2a6d0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31   value of the P1
2a6e0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
2a6f0 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50  .** calling OP_P
2a700 72 6f 67 72 61 6d 20 69 6e 73 74 72 75 63 74 69  rogram instructi
2a710 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50  on..*/.case OP_P
2a720 61 72 61 6d 3a 20 7b 20 20 20 20 20 20 20 20 20  aram: {         
2a730 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c    /* out2-prerel
2a740 65 61 73 65 20 2a 2f 0a 20 20 56 64 62 65 46 72  ease */.  VdbeFr
2a750 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 4d  ame *pFrame;.  M
2a760 65 6d 20 2a 70 49 6e 3b 0a 20 20 70 46 72 61 6d  em *pIn;.  pFram
2a770 65 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20  e = p->pFrame;. 
2a780 20 70 49 6e 20 3d 20 26 70 46 72 61 6d 65 2d 3e   pIn = &pFrame->
2a790 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 20 2b 20 70  aMem[pOp->p1 + p
2a7a0 46 72 61 6d 65 2d 3e 61 4f 70 5b 70 46 72 61 6d  Frame->aOp[pFram
2a7b0 65 2d 3e 70 63 5d 2e 70 31 5d 3b 20 20 20 0a 20  e->pc].p1];   . 
2a7c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
2a7d0 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c  hallowCopy(pOut,
2a7e0 20 70 49 6e 2c 20 4d 45 4d 5f 45 70 68 65 6d 29   pIn, MEM_Ephem)
2a7f0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 65  ;.  break;.}..#e
2a800 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
2a810 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
2a820 47 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  GER */..#ifndef 
2a830 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
2a840 49 47 4e 5f 4b 45 59 0a 2f 2a 20 4f 70 63 6f 64  IGN_KEY./* Opcod
2a850 65 3a 20 46 6b 43 6f 75 6e 74 65 72 20 50 31 20  e: FkCounter P1 
2a860 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49  P2 * * *.**.** I
2a870 6e 63 72 65 6d 65 6e 74 20 61 20 22 63 6f 6e 73  ncrement a "cons
2a880 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 22 20  traint counter" 
2a890 62 79 20 50 32 20 28 50 32 20 6d 61 79 20 62 65  by P2 (P2 may be
2a8a0 20 6e 65 67 61 74 69 76 65 20 6f 72 20 70 6f 73   negative or pos
2a8b0 69 74 69 76 65 29 2e 0a 2a 2a 20 49 66 20 50 31  itive)..** If P1
2a8c0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2a8d0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 73 74  e database const
2a8e0 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 69 73  raint counter is
2a8f0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 0a 2a 2a   incremented .**
2a900 20 28 64 65 66 65 72 72 65 64 20 66 6f 72 65 69   (deferred forei
2a910 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
2a920 74 73 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ts). Otherwise, 
2a930 69 66 20 50 31 20 69 73 20 7a 65 72 6f 2c 20 74  if P1 is zero, t
2a940 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  he .** statement
2a950 20 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 63 72   counter is incr
2a960 65 6d 65 6e 74 65 64 20 28 69 6d 6d 65 64 69 61  emented (immedia
2a970 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  te foreign key c
2a980 6f 6e 73 74 72 61 69 6e 74 73 29 2e 0a 2a 2f 0a  onstraints)..*/.
2a990 63 61 73 65 20 4f 50 5f 46 6b 43 6f 75 6e 74 65  case OP_FkCounte
2a9a0 72 3a 20 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  r: {.  if( pOp->
2a9b0 70 31 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44  p1 ){.    db->nD
2a9c0 65 66 65 72 72 65 64 43 6f 6e 73 20 2b 3d 20 70  eferredCons += p
2a9d0 4f 70 2d 3e 70 32 3b 0a 20 20 7d 65 6c 73 65 7b  Op->p2;.  }else{
2a9e0 0a 20 20 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74  .    p->nFkConst
2a9f0 72 61 69 6e 74 20 2b 3d 20 70 4f 70 2d 3e 70 32  raint += pOp->p2
2aa00 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
2aa10 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6b 49  ../* Opcode: FkI
2aa20 66 5a 65 72 6f 20 50 31 20 50 32 20 2a 20 2a 20  fZero P1 P2 * * 
2aa30 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  *.**.** This opc
2aa40 6f 64 65 20 74 65 73 74 73 20 69 66 20 61 20 66  ode tests if a f
2aa50 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
2aa60 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72 20 69 73  raint-counter is
2aa70 20 63 75 72 72 65 6e 74 6c 79 20 7a 65 72 6f 2e   currently zero.
2aa80 0a 2a 2a 20 49 66 20 73 6f 2c 20 6a 75 6d 70 20  .** If so, jump 
2aa90 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50  to instruction P
2aaa0 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  2. Otherwise, fa
2aab0 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
2aac0 65 20 6e 65 78 74 20 0a 2a 2a 20 69 6e 73 74 72  e next .** instr
2aad0 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  uction..**.** If
2aae0 20 50 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   P1 is non-zero,
2aaf0 20 74 68 65 6e 20 74 68 65 20 6a 75 6d 70 20 69   then the jump i
2ab00 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20 64  s taken if the d
2ab10 61 74 61 62 61 73 65 20 63 6f 6e 73 74 72 61 69  atabase constrai
2ab20 6e 74 2d 63 6f 75 6e 74 65 72 0a 2a 2a 20 69 73  nt-counter.** is
2ab30 20 7a 65 72 6f 20 28 74 68 65 20 6f 6e 65 20 74   zero (the one t
2ab40 68 61 74 20 63 6f 75 6e 74 73 20 64 65 66 65 72  hat counts defer
2ab50 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  red constraint v
2ab60 69 6f 6c 61 74 69 6f 6e 73 29 2e 20 49 66 20 50  iolations). If P
2ab70 31 20 69 73 0a 2a 2a 20 7a 65 72 6f 2c 20 74 68  1 is.** zero, th
2ab80 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20  e jump is taken 
2ab90 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
2aba0 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e   constraint-coun
2abb0 74 65 72 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28  ter is zero.** (
2abc0 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
2abd0 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
2abe0 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e 0a 2a 2f   violations)..*/
2abf0 0a 63 61 73 65 20 4f 50 5f 46 6b 49 66 5a 65 72  .case OP_FkIfZer
2ac00 6f 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20  o: {         /* 
2ac10 6a 75 6d 70 20 2a 2f 0a 20 20 69 66 28 20 70 4f  jump */.  if( pO
2ac20 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 69 66 28  p->p1 ){.    if(
2ac30 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
2ac40 6e 73 3d 3d 30 20 29 20 70 63 20 3d 20 70 4f 70  ns==0 ) pc = pOp
2ac50 2d 3e 70 32 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  ->p2-1;.  }else{
2ac60 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 46 6b 43  .    if( p->nFkC
2ac70 6f 6e 73 74 72 61 69 6e 74 3d 3d 30 20 29 20 70  onstraint==0 ) p
2ac80 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20  c = pOp->p2-1;. 
2ac90 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65   }.  break;.}.#e
2aca0 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
2acb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
2acc0 49 47 4e 5f 4b 45 59 20 2a 2f 0a 0a 23 69 66 6e  IGN_KEY */..#ifn
2acd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ace0 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 2f 2a  AUTOINCREMENT./*
2acf0 20 4f 70 63 6f 64 65 3a 20 4d 65 6d 4d 61 78 20   Opcode: MemMax 
2ad00 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
2ad10 2a 20 50 31 20 69 73 20 61 20 72 65 67 69 73 74  * P1 is a regist
2ad20 65 72 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 66  er in the root f
2ad30 72 61 6d 65 20 6f 66 20 74 68 69 73 20 56 4d 20  rame of this VM 
2ad40 28 74 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20  (the root frame 
2ad50 69 73 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  is.** different 
2ad60 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
2ad70 20 66 72 61 6d 65 20 69 66 20 74 68 69 73 20 69   frame if this i
2ad80 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 62 65  nstruction is be
2ad90 69 6e 67 20 65 78 65 63 75 74 65 64 0a 2a 2a 20  ing executed.** 
2ada0 77 69 74 68 69 6e 20 61 20 73 75 62 2d 70 72 6f  within a sub-pro
2adb0 67 72 61 6d 29 2e 20 53 65 74 20 74 68 65 20 76  gram). Set the v
2adc0 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72  alue of register
2add0 20 50 31 20 74 6f 20 74 68 65 20 6d 61 78 69 6d   P1 to the maxim
2ade0 75 6d 20 6f 66 20 0a 2a 2a 20 69 74 73 20 63 75  um of .** its cu
2adf0 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20  rrent value and 
2ae00 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
2ae10 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  ister P2..**.** 
2ae20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  This instruction
2ae30 20 74 68 72 6f 77 73 20 61 6e 20 65 72 72 6f 72   throws an error
2ae40 20 69 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   if the memory c
2ae50 65 6c 6c 20 69 73 20 6e 6f 74 20 69 6e 69 74 69  ell is not initi
2ae60 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67  ally.** an integ
2ae70 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d  er..*/.case OP_M
2ae80 65 6d 4d 61 78 3a 20 7b 20 20 20 20 20 20 20 20  emMax: {        
2ae90 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 4d 65 6d 20  /* in2 */.  Mem 
2aea0 2a 70 49 6e 31 3b 0a 20 20 56 64 62 65 46 72 61  *pIn1;.  VdbeFra
2aeb0 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 69 66  me *pFrame;.  if
2aec0 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20  ( p->pFrame ){. 
2aed0 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d     for(pFrame=p-
2aee0 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d  >pFrame; pFrame-
2aef0 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65  >pParent; pFrame
2af00 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74  =pFrame->pParent
2af10 29 3b 0a 20 20 20 20 70 49 6e 31 20 3d 20 26 70  );.    pIn1 = &p
2af20 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d  Frame->aMem[pOp-
2af30 3e 70 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  >p1];.  }else{. 
2af40 20 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b     pIn1 = &aMem[
2af50 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 7d 0a 20 20  pOp->p1];.  }.  
2af60 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
2af70 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 73 71  id(pIn1) );.  sq
2af80 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65  lite3VdbeMemInte
2af90 67 65 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20  gerify(pIn1);.  
2afa0 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn2 = &aMem[pOp
2afb0 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33  ->p2];.  sqlite3
2afc0 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66  VdbeMemIntegerif
2afd0 79 28 70 49 6e 32 29 3b 0a 20 20 69 66 28 20 70  y(pIn2);.  if( p
2afe0 49 6e 31 2d 3e 75 2e 69 3c 70 49 6e 32 2d 3e 75  In1->u.i<pIn2->u
2aff0 2e 69 29 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 75  .i){.    pIn1->u
2b000 2e 69 20 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b 0a  .i = pIn2->u.i;.
2b010 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23    }.  break;.}.#
2b020 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2b030 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
2b040 4e 54 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65  NT */../* Opcode
2b050 3a 20 49 66 50 6f 73 20 50 31 20 50 32 20 2a 20  : IfPos P1 P2 * 
2b060 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  * *.**.** If the
2b070 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74   value of regist
2b080 65 72 20 50 31 20 69 73 20 31 20 6f 72 20 67 72  er P1 is 1 or gr
2b090 65 61 74 65 72 2c 20 6a 75 6d 70 20 74 6f 20 50  eater, jump to P
2b0a0 32 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  2..**.** It is i
2b0b0 6c 6c 65 67 61 6c 20 74 6f 20 75 73 65 20 74 68  llegal to use th
2b0c0 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f  is instruction o
2b0d0 6e 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61  n a register tha
2b0e0 74 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  t does.** not co
2b0f0 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72  ntain an integer
2b100 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
2b110 66 61 75 6c 74 20 77 69 6c 6c 20 72 65 73 75 6c  fault will resul
2b120 74 20 69 66 20 79 6f 75 20 74 72 79 2e 0a 2a 2f  t if you try..*/
2b130 0a 63 61 73 65 20 4f 50 5f 49 66 50 6f 73 3a 20  .case OP_IfPos: 
2b140 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
2b150 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  , in1 */.  pIn1 
2b160 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
2b170 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31  ;.  assert( pIn1
2b180 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ->flags&MEM_Int 
2b190 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75  );.  if( pIn1->u
2b1a0 2e 69 3e 30 20 29 7b 0a 20 20 20 20 20 70 63 20  .i>0 ){.     pc 
2b1b0 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
2b1c0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
2b1d0 2a 20 4f 70 63 6f 64 65 3a 20 49 66 4e 65 67 20  * Opcode: IfNeg 
2b1e0 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
2b1f0 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 6f  * If the value o
2b200 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  f register P1 is
2b210 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
2b220 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 0a 2a 2a   jump to P2. .**
2b230 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
2b240 6c 20 74 6f 20 75 73 65 20 74 68 69 73 20 69 6e  l to use this in
2b250 73 74 72 75 63 74 69 6f 6e 20 6f 6e 20 61 20 72  struction on a r
2b260 65 67 69 73 74 65 72 20 74 68 61 74 20 64 6f 65  egister that doe
2b270 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  s.** not contain
2b280 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 41 6e   an integer.  An
2b290 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74   assertion fault
2b2a0 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 66 20   will result if 
2b2b0 79 6f 75 20 74 72 79 2e 0a 2a 2f 0a 63 61 73 65  you try..*/.case
2b2c0 20 4f 50 5f 49 66 4e 65 67 3a 20 7b 20 20 20 20   OP_IfNeg: {    
2b2d0 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31      /* jump, in1
2b2e0 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
2b2f0 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  em[pOp->p1];.  a
2b300 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61  ssert( pIn1->fla
2b310 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20  gs&MEM_Int );.  
2b320 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3c 30 20  if( pIn1->u.i<0 
2b330 29 7b 0a 20 20 20 20 20 70 63 20 3d 20 70 4f 70  ){.     pc = pOp
2b340 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  ->p2 - 1;.  }.  
2b350 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
2b360 6f 64 65 3a 20 49 66 5a 65 72 6f 20 50 31 20 50  ode: IfZero P1 P
2b370 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  2 P3 * *.**.** T
2b380 68 65 20 72 65 67 69 73 74 65 72 20 50 31 20 6d  he register P1 m
2b390 75 73 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69  ust contain an i
2b3a0 6e 74 65 67 65 72 2e 20 20 41 64 64 20 6c 69 74  nteger.  Add lit
2b3b0 65 72 61 6c 20 50 33 20 74 6f 20 74 68 65 0a 2a  eral P3 to the.*
2b3c0 2a 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  * value in regis
2b3d0 74 65 72 20 50 31 2e 20 20 49 66 20 74 68 65 20  ter P1.  If the 
2b3e0 72 65 73 75 6c 74 20 69 73 20 65 78 61 63 74 6c  result is exactl
2b3f0 79 20 30 2c 20 6a 75 6d 70 20 74 6f 20 50 32 2e  y 0, jump to P2.
2b400 20 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c   .**.** It is il
2b410 6c 65 67 61 6c 20 74 6f 20 75 73 65 20 74 68 69  legal to use thi
2b420 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e  s instruction on
2b430 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
2b440 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
2b450 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e  tain an integer.
2b460 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66    An assertion f
2b470 61 75 6c 74 20 77 69 6c 6c 20 72 65 73 75 6c 74  ault will result
2b480 20 69 66 20 79 6f 75 20 74 72 79 2e 0a 2a 2f 0a   if you try..*/.
2b490 63 61 73 65 20 4f 50 5f 49 66 5a 65 72 6f 3a 20  case OP_IfZero: 
2b4a0 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
2b4b0 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  , in1 */.  pIn1 
2b4c0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
2b4d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31  ;.  assert( pIn1
2b4e0 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ->flags&MEM_Int 
2b4f0 29 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20 2b  );.  pIn1->u.i +
2b500 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28  = pOp->p3;.  if(
2b510 20 70 49 6e 31 2d 3e 75 2e 69 3d 3d 30 20 29 7b   pIn1->u.i==0 ){
2b520 0a 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e  .     pc = pOp->
2b530 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72  p2 - 1;.  }.  br
2b540 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
2b550 65 3a 20 41 67 67 53 74 65 70 20 2a 20 50 32 20  e: AggStep * P2 
2b560 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 45  P3 P4 P5.**.** E
2b570 78 65 63 75 74 65 20 74 68 65 20 73 74 65 70 20  xecute the step 
2b580 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20  function for an 
2b590 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 65 0a  aggregate.  The.
2b5a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
2b5b0 50 35 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 20  P5 arguments.   
2b5c0 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P4 is a pointer 
2b5d0 74 6f 20 74 68 65 20 46 75 6e 63 44 65 66 0a 2a  to the FuncDef.*
2b5e0 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  * structure that
2b5f0 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 66   specifies the f
2b600 75 6e 63 74 69 6f 6e 2e 20 20 55 73 65 20 72 65  unction.  Use re
2b610 67 69 73 74 65 72 0a 2a 2a 20 50 33 20 61 73 20  gister.** P3 as 
2b620 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  the accumulator.
2b630 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 61 72  .**.** The P5 ar
2b640 67 75 6d 65 6e 74 73 20 61 72 65 20 74 61 6b 65  guments are take
2b650 6e 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20  n from register 
2b660 50 32 20 61 6e 64 20 69 74 73 0a 2a 2a 20 73 75  P2 and its.** su
2b670 63 63 65 73 73 6f 72 73 2e 0a 2a 2f 0a 63 61 73  ccessors..*/.cas
2b680 65 20 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b 0a  e OP_AggStep: {.
2b690 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69    int n;.  int i
2b6a0 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20  ;.  Mem *pMem;. 
2b6b0 20 4d 65 6d 20 2a 70 52 65 63 3b 0a 20 20 73 71   Mem *pRec;.  sq
2b6c0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 63 74  lite3_context ct
2b6d0 78 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  x;.  sqlite3_val
2b6e0 75 65 20 2a 2a 61 70 56 61 6c 3b 0a 0a 20 20 6e  ue **apVal;..  n
2b6f0 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 61 73   = pOp->p5;.  as
2b700 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20  sert( n>=0 );.  
2b710 70 52 65 63 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pRec = &aMem[pOp
2b720 2d 3e 70 32 5d 3b 0a 20 20 61 70 56 61 6c 20 3d  ->p2];.  apVal =
2b730 20 70 2d 3e 61 70 41 72 67 3b 0a 20 20 61 73 73   p->apArg;.  ass
2b740 65 72 74 28 20 61 70 56 61 6c 20 7c 7c 20 6e 3d  ert( apVal || n=
2b750 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  =0 );.  for(i=0;
2b760 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 52 65 63 2b   i<n; i++, pRec+
2b770 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
2b780 6d 65 6d 49 73 56 61 6c 69 64 28 70 52 65 63 29  memIsValid(pRec)
2b790 20 29 3b 0a 20 20 20 20 61 70 56 61 6c 5b 69 5d   );.    apVal[i]
2b7a0 20 3d 20 70 52 65 63 3b 0a 20 20 20 20 6d 65 6d   = pRec;.    mem
2b7b0 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
2b7c0 20 70 52 65 63 29 3b 0a 20 20 20 20 73 71 6c 69   pRec);.    sqli
2b7d0 74 65 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54  te3VdbeMemStoreT
2b7e0 79 70 65 28 70 52 65 63 29 3b 0a 20 20 7d 0a 20  ype(pRec);.  }. 
2b7f0 20 63 74 78 2e 70 46 75 6e 63 20 3d 20 70 4f 70   ctx.pFunc = pOp
2b800 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 61 73  ->p4.pFunc;.  as
2b810 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20  sert( pOp->p3>0 
2b820 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e  && pOp->p3<=p->n
2b830 4d 65 6d 20 29 3b 0a 20 20 63 74 78 2e 70 4d 65  Mem );.  ctx.pMe
2b840 6d 20 3d 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d  m = pMem = &aMem
2b850 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 4d 65  [pOp->p3];.  pMe
2b860 6d 2d 3e 6e 2b 2b 3b 0a 20 20 63 74 78 2e 73 2e  m->n++;.  ctx.s.
2b870 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
2b880 3b 0a 20 20 63 74 78 2e 73 2e 7a 20 3d 20 30 3b  ;.  ctx.s.z = 0;
2b890 0a 20 20 63 74 78 2e 73 2e 7a 4d 61 6c 6c 6f 63  .  ctx.s.zMalloc
2b8a0 20 3d 20 30 3b 0a 20 20 63 74 78 2e 73 2e 78 44   = 0;.  ctx.s.xD
2b8b0 65 6c 20 3d 20 30 3b 0a 20 20 63 74 78 2e 73 2e  el = 0;.  ctx.s.
2b8c0 64 62 20 3d 20 64 62 3b 0a 20 20 63 74 78 2e 69  db = db;.  ctx.i
2b8d0 73 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 63 74  sError = 0;.  ct
2b8e0 78 2e 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 63  x.pColl = 0;.  c
2b8f0 74 78 2e 73 6b 69 70 46 6c 61 67 20 3d 20 30 3b  tx.skipFlag = 0;
2b900 0a 20 20 69 66 28 20 63 74 78 2e 70 46 75 6e 63  .  if( ctx.pFunc
2b910 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2b920 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
2b930 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  {.    assert( pO
2b940 70 3e 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20  p>p->aOp );.    
2b950 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
2b960 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53  p4type==P4_COLLS
2b970 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
2b980 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65  ( pOp[-1].opcode
2b990 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71 20 29 3b 0a  ==OP_CollSeq );.
2b9a0 20 20 20 20 63 74 78 2e 70 43 6f 6c 6c 20 3d 20      ctx.pColl = 
2b9b0 70 4f 70 5b 2d 31 5d 2e 70 34 2e 70 43 6f 6c 6c  pOp[-1].p4.pColl
2b9c0 3b 0a 20 20 7d 0a 20 20 28 63 74 78 2e 70 46 75  ;.  }.  (ctx.pFu
2b9d0 6e 63 2d 3e 78 53 74 65 70 29 28 26 63 74 78 2c  nc->xStep)(&ctx,
2b9e0 20 6e 2c 20 61 70 56 61 6c 29 3b 20 2f 2a 20 49   n, apVal); /* I
2b9f0 4d 50 3a 20 52 2d 32 34 35 30 35 2d 32 33 32 33  MP: R-24505-2323
2ba00 30 20 2a 2f 0a 20 20 69 66 28 20 63 74 78 2e 69  0 */.  if( ctx.i
2ba10 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 73 71  sError ){.    sq
2ba20 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
2ba30 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
2ba40 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61  "%s", sqlite3_va
2ba50 6c 75 65 5f 74 65 78 74 28 26 63 74 78 2e 73 29  lue_text(&ctx.s)
2ba60 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 74 78 2e  );.    rc = ctx.
2ba70 69 73 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69  isError;.  }.  i
2ba80 66 28 20 63 74 78 2e 73 6b 69 70 46 6c 61 67 20  f( ctx.skipFlag 
2ba90 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2baa0 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f  Op[-1].opcode==O
2bab0 50 5f 43 6f 6c 6c 53 65 71 20 29 3b 0a 20 20 20  P_CollSeq );.   
2bac0 20 69 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   i = pOp[-1].p1;
2bad0 0a 20 20 20 20 69 66 28 20 69 20 29 20 73 71 6c  .    if( i ) sql
2bae0 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e  ite3VdbeMemSetIn
2baf0 74 36 34 28 26 61 4d 65 6d 5b 69 5d 2c 20 31 29  t64(&aMem[i], 1)
2bb00 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
2bb10 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
2bb20 63 74 78 2e 73 29 3b 0a 0a 20 20 62 72 65 61 6b  ctx.s);..  break
2bb30 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
2bb40 41 67 67 46 69 6e 61 6c 20 50 31 20 50 32 20 2a  AggFinal P1 P2 *
2bb50 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 65 63   P4 *.**.** Exec
2bb60 75 74 65 20 74 68 65 20 66 69 6e 61 6c 69 7a 65  ute the finalize
2bb70 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  r function for a
2bb80 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 50 31  n aggregate.  P1
2bb90 20 69 73 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72   is.** the memor
2bba0 79 20 6c 6f 63 61 74 69 6f 6e 20 74 68 61 74 20  y location that 
2bbb0 69 73 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  is the accumulat
2bbc0 6f 72 20 66 6f 72 20 74 68 65 20 61 67 67 72 65  or for the aggre
2bbd0 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69  gate..**.** P2 i
2bbe0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2bbf0 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20 74  arguments that t
2bc00 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e  he step function
2bc10 20 74 61 6b 65 73 20 61 6e 64 0a 2a 2a 20 50 34   takes and.** P4
2bc20 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2bc30 20 74 68 65 20 46 75 6e 63 44 65 66 20 66 6f 72   the FuncDef for
2bc40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
2bc50 20 54 68 65 20 50 32 0a 2a 2a 20 61 72 67 75 6d   The P2.** argum
2bc60 65 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20  ent is not used 
2bc70 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 20  by this opcode. 
2bc80 20 49 74 20 69 73 20 6f 6e 6c 79 20 74 68 65 72   It is only ther
2bc90 65 20 74 6f 20 64 69 73 61 6d 62 69 67 75 61 74  e to disambiguat
2bca0 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 74  e.** functions t
2bcb0 68 61 74 20 63 61 6e 20 74 61 6b 65 20 76 61 72  hat can take var
2bcc0 79 69 6e 67 20 6e 75 6d 62 65 72 73 20 6f 66 20  ying numbers of 
2bcd0 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 0a  arguments.  The.
2bce0 2a 2a 20 50 34 20 61 72 67 75 6d 65 6e 74 20 69  ** P4 argument i
2bcf0 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f  s only needed fo
2bd00 72 20 74 68 65 20 64 65 67 65 6e 65 72 61 74 65  r the degenerate
2bd10 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 74   case where.** t
2bd20 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e  he step function
2bd30 20 77 61 73 20 6e 6f 74 20 70 72 65 76 69 6f 75   was not previou
2bd40 73 6c 79 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 63  sly called..*/.c
2bd50 61 73 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 3a  ase OP_AggFinal:
2bd60 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a   {.  Mem *pMem;.
2bd70 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2bd80 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d  1>0 && pOp->p1<=
2bd90 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 4d 65  p->nMem );.  pMe
2bda0 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  m = &aMem[pOp->p
2bdb0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  1];.  assert( (p
2bdc0 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 7e 28 4d  Mem->flags & ~(M
2bdd0 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 41 67 67 29  EM_Null|MEM_Agg)
2bde0 29 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  )==0 );.  rc = s
2bdf0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 69 6e  qlite3VdbeMemFin
2be00 61 6c 69 7a 65 28 70 4d 65 6d 2c 20 70 4f 70 2d  alize(pMem, pOp-
2be10 3e 70 34 2e 70 46 75 6e 63 29 3b 0a 20 20 69 66  >p4.pFunc);.  if
2be20 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( rc ){.    sqli
2be30 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
2be40 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25  >zErrMsg, db, "%
2be50 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s", sqlite3_valu
2be60 65 5f 74 65 78 74 28 70 4d 65 6d 29 29 3b 0a 20  e_text(pMem));. 
2be70 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
2be80 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70  ChangeEncoding(p
2be90 4d 65 6d 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  Mem, encoding);.
2bea0 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
2beb0 42 53 49 5a 45 28 70 4d 65 6d 29 3b 0a 20 20 69  BSIZE(pMem);.  i
2bec0 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
2bed0 6d 54 6f 6f 42 69 67 28 70 4d 65 6d 29 20 29 7b  mTooBig(pMem) ){
2bee0 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69  .    goto too_bi
2bef0 67 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  g;.  }.  break;.
2bf00 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
2bf10 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 4f 70  E_OMIT_WAL./* Op
2bf20 63 6f 64 65 3a 20 43 68 65 63 6b 70 6f 69 6e 74  code: Checkpoint
2bf30 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
2bf40 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64  .** Checkpoint d
2bf50 61 74 61 62 61 73 65 20 50 31 2e 20 54 68 69 73  atabase P1. This
2bf60 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 50   is a no-op if P
2bf70 31 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  1 is not current
2bf80 6c 79 20 69 6e 0a 2a 2a 20 57 41 4c 20 6d 6f 64  ly in.** WAL mod
2bf90 65 2e 20 50 61 72 61 6d 65 74 65 72 20 50 32 20  e. Parameter P2 
2bfa0 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  is one of SQLITE
2bfb0 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
2bfc0 49 56 45 2c 20 46 55 4c 4c 0a 2a 2a 20 6f 72 20  IVE, FULL.** or 
2bfd0 52 45 53 54 41 52 54 2e 20 20 57 72 69 74 65 20  RESTART.  Write 
2bfe0 31 20 6f 72 20 30 20 69 6e 74 6f 20 6d 65 6d 5b  1 or 0 into mem[
2bff0 50 33 5d 20 69 66 20 74 68 65 20 63 68 65 63 6b  P3] if the check
2c000 70 6f 69 6e 74 20 72 65 74 75 72 6e 73 0a 2a 2a  point returns.**
2c010 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20   SQLITE_BUSY or 
2c020 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c  not, respectivel
2c030 79 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  y.  Write the nu
2c040 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
2c050 20 74 68 65 0a 2a 2a 20 57 41 4c 20 61 66 74 65   the.** WAL afte
2c060 72 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  r the checkpoint
2c070 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b 31 5d 20   into mem[P3+1] 
2c080 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
2c090 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 20 74 68  f pages.** in th
2c0a0 65 20 57 41 4c 20 74 68 61 74 20 68 61 76 65 20  e WAL that have 
2c0b0 62 65 65 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65  been checkpointe
2c0c0 64 20 61 66 74 65 72 20 74 68 65 20 63 68 65 63  d after the chec
2c0d0 6b 70 6f 69 6e 74 0a 2a 2a 20 63 6f 6d 70 6c 65  kpoint.** comple
2c0e0 74 65 73 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b  tes into mem[P3+
2c0f0 32 5d 2e 20 20 48 6f 77 65 76 65 72 20 6f 6e 20  2].  However on 
2c100 61 6e 20 65 72 72 6f 72 2c 20 6d 65 6d 5b 50 33  an error, mem[P3
2c110 2b 31 5d 20 61 6e 64 0a 2a 2a 20 6d 65 6d 5b 50  +1] and.** mem[P
2c120 33 2b 32 5d 20 61 72 65 20 69 6e 69 74 69 61 6c  3+2] are initial
2c130 69 7a 65 64 20 74 6f 20 2d 31 2e 0a 2a 2f 0a 63  ized to -1..*/.c
2c140 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e  ase OP_Checkpoin
2c150 74 3a 20 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  t: {.  int i;   
2c160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c170 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2c180 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
2c190 61 52 65 73 5b 33 5d 3b 20 20 20 20 20 20 20 20  aRes[3];        
2c1a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2c1b0 65 73 75 6c 74 73 20 2a 2f 0a 20 20 4d 65 6d 20  esults */.  Mem 
2c1c0 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  *pMem;          
2c1d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2c1e0 72 69 74 65 20 72 65 73 75 6c 74 73 20 68 65 72  rite results her
2c1f0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
2c200 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
2c210 3b 0a 20 20 61 52 65 73 5b 30 5d 20 3d 20 30 3b  ;.  aRes[0] = 0;
2c220 0a 20 20 61 52 65 73 5b 31 5d 20 3d 20 61 52 65  .  aRes[1] = aRe
2c230 73 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 61 73 73  s[2] = -1;.  ass
2c240 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51  ert( pOp->p2==SQ
2c250 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
2c260 50 41 53 53 49 56 45 0a 20 20 20 20 20 20 20 7c  PASSIVE.       |
2c270 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54  | pOp->p2==SQLIT
2c280 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c  E_CHECKPOINT_FUL
2c290 4c 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d  L.       || pOp-
2c2a0 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43  >p2==SQLITE_CHEC
2c2b0 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 0a 20  KPOINT_RESTART. 
2c2c0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
2c2d0 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  e3Checkpoint(db,
2c2e0 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
2c2f0 32 2c 20 26 61 52 65 73 5b 31 5d 2c 20 26 61 52  2, &aRes[1], &aR
2c300 65 73 5b 32 5d 29 3b 0a 20 20 69 66 28 20 72 63  es[2]);.  if( rc
2c310 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
2c320 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2c330 5f 4f 4b 3b 0a 20 20 20 20 61 52 65 73 5b 30 5d  _OK;.    aRes[0]
2c340 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   = 1;.  }.  for(
2c350 69 3d 30 2c 20 70 4d 65 6d 20 3d 20 26 61 4d 65  i=0, pMem = &aMe
2c360 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 20 69 3c 33 3b  m[pOp->p3]; i<3;
2c370 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20   i++, pMem++){. 
2c380 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
2c390 6d 53 65 74 49 6e 74 36 34 28 70 4d 65 6d 2c 20  mSetInt64(pMem, 
2c3a0 28 69 36 34 29 61 52 65 73 5b 69 5d 29 3b 0a 20  (i64)aRes[i]);. 
2c3b0 20 7d 20 20 20 20 0a 20 20 62 72 65 61 6b 3b 0a   }    .  break;.
2c3c0 7d 3b 20 20 0a 23 65 6e 64 69 66 0a 0a 23 69 66  };  .#endif..#if
2c3d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2c3e0 5f 50 52 41 47 4d 41 0a 2f 2a 20 4f 70 63 6f 64  _PRAGMA./* Opcod
2c3f0 65 3a 20 4a 6f 75 72 6e 61 6c 4d 6f 64 65 20 50  e: JournalMode P
2c400 31 20 50 32 20 50 33 20 2a 20 50 35 0a 2a 2a 0a  1 P2 P3 * P5.**.
2c410 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6a 6f  ** Change the jo
2c420 75 72 6e 61 6c 20 6d 6f 64 65 20 6f 66 20 64 61  urnal mode of da
2c430 74 61 62 61 73 65 20 50 31 20 74 6f 20 50 33 2e  tabase P1 to P3.
2c440 20 50 33 20 6d 75 73 74 20 62 65 20 6f 6e 65 20   P3 must be one 
2c450 6f 66 20 74 68 65 0a 2a 2a 20 50 41 47 45 52 5f  of the.** PAGER_
2c460 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20  JOURNALMODE_XXX 
2c470 76 61 6c 75 65 73 2e 20 49 66 20 63 68 61 6e 67  values. If chang
2c480 69 6e 67 20 62 65 74 77 65 65 6e 20 74 68 65 20  ing between the 
2c490 76 61 72 69 6f 75 73 20 72 6f 6c 6c 62 61 63 6b  various rollback
2c4a0 0a 2a 2a 20 6d 6f 64 65 73 20 28 64 65 6c 65 74  .** modes (delet
2c4b0 65 2c 20 74 72 75 6e 63 61 74 65 2c 20 70 65 72  e, truncate, per
2c4c0 73 69 73 74 2c 20 6f 66 66 20 61 6e 64 20 6d 65  sist, off and me
2c4d0 6d 6f 72 79 29 2c 20 74 68 69 73 20 69 73 20 61  mory), this is a
2c4e0 20 73 69 6d 70 6c 65 0a 2a 2a 20 6f 70 65 72 61   simple.** opera
2c4f0 74 69 6f 6e 2e 20 4e 6f 20 49 4f 20 69 73 20 72  tion. No IO is r
2c500 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  equired..**.** I
2c510 66 20 63 68 61 6e 67 69 6e 67 20 69 6e 74 6f 20  f changing into 
2c520 6f 72 20 6f 75 74 20 6f 66 20 57 41 4c 20 6d 6f  or out of WAL mo
2c530 64 65 20 74 68 65 20 70 72 6f 63 65 64 75 72 65  de the procedure
2c540 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63   is more complic
2c550 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ated..**.** Writ
2c560 65 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  e a string conta
2c570 69 6e 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20  ining the final 
2c580 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 74 6f 20  journal-mode to 
2c590 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a  register P2..*/.
2c5a0 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d  case OP_JournalM
2c5b0 6f 64 65 3a 20 7b 20 20 20 20 2f 2a 20 6f 75 74  ode: {    /* out
2c5c0 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a  2-prerelease */.
2c5d0 20 20 42 74 72 65 65 20 2a 70 42 74 3b 20 20 20    Btree *pBt;   
2c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5f0 20 20 2f 2a 20 42 74 72 65 65 20 74 6f 20 63 68    /* Btree to ch
2c600 61 6e 67 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64  ange journal mod
2c610 65 20 6f 66 20 2a 2f 0a 20 20 50 61 67 65 72 20  e of */.  Pager 
2c620 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
2c630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2c640 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
2c650 74 68 20 70 42 74 20 2a 2f 0a 20 20 69 6e 74 20  th pBt */.  int 
2c660 65 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  eNew;           
2c670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2c680 65 77 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20  ew journal mode 
2c690 2a 2f 0a 20 20 69 6e 74 20 65 4f 6c 64 3b 20 20  */.  int eOld;  
2c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6b0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6c 64 20       /* The old 
2c6c0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a  journal mode */.
2c6d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c6e0 4d 49 54 5f 57 41 4c 0a 20 20 63 6f 6e 73 74 20  MIT_WAL.  const 
2c6f0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
2c700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
2c710 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  e of database fi
2c720 6c 65 20 66 6f 72 20 70 50 61 67 65 72 20 2a 2f  le for pPager */
2c730 0a 23 65 6e 64 69 66 0a 0a 20 20 65 4e 65 77 20  .#endif..  eNew 
2c740 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73  = pOp->p3;.  ass
2c750 65 72 74 28 20 65 4e 65 77 3d 3d 50 41 47 45 52  ert( eNew==PAGER
2c760 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
2c770 45 54 45 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  ETE .       || e
2c780 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  New==PAGER_JOURN
2c790 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
2c7a0 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d  .       || eNew=
2c7b0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2c7c0 44 45 5f 50 45 52 53 49 53 54 20 0a 20 20 20 20  DE_PERSIST .    
2c7d0 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45     || eNew==PAGE
2c7e0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2c7f0 46 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77  F.       || eNew
2c800 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2c810 4f 44 45 5f 4d 45 4d 4f 52 59 0a 20 20 20 20 20  ODE_MEMORY.     
2c820 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52    || eNew==PAGER
2c830 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2c840 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d  .       || eNew=
2c850 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2c860 44 45 5f 51 55 45 52 59 0a 20 20 29 3b 0a 20 20  DE_QUERY.  );.  
2c870 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
2c880 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62  =0 && pOp->p1<db
2c890 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
2c8a0 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  t( p->readOnly==
2c8b0 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20 64 62  0 );..  pBt = db
2c8c0 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70  ->aDb[pOp->p1].p
2c8d0 42 74 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 73  Bt;.  pPager = s
2c8e0 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
2c8f0 28 70 42 74 29 3b 0a 20 20 65 4f 6c 64 20 3d 20  (pBt);.  eOld = 
2c900 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 4a  sqlite3PagerGetJ
2c910 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65  ournalMode(pPage
2c920 72 29 3b 0a 20 20 69 66 28 20 65 4e 65 77 3d 3d  r);.  if( eNew==
2c930 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2c940 45 5f 51 55 45 52 59 20 29 20 65 4e 65 77 20 3d  E_QUERY ) eNew =
2c950 20 65 4f 6c 64 3b 0a 20 20 69 66 28 20 21 73 71   eOld;.  if( !sq
2c960 6c 69 74 65 33 50 61 67 65 72 4f 6b 54 6f 43 68  lite3PagerOkToCh
2c970 61 6e 67 65 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  angeJournalMode(
2c980 70 50 61 67 65 72 29 20 29 20 65 4e 65 77 20 3d  pPager) ) eNew =
2c990 20 65 4f 6c 64 3b 0a 0a 23 69 66 6e 64 65 66 20   eOld;..#ifndef 
2c9a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2c9b0 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71    zFilename = sq
2c9c0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
2c9d0 6d 65 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 0a  me(pPager, 1);..
2c9e0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
2c9f0 77 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 20 74  w a transition t
2ca00 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 57  o journal_mode=W
2ca10 41 4c 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  AL for a databas
2ca20 65 0a 20 20 2a 2a 20 69 6e 20 74 65 6d 70 6f 72  e.  ** in tempor
2ca30 61 72 79 20 73 74 6f 72 61 67 65 20 6f 72 20 69  ary storage or i
2ca40 66 20 74 68 65 20 56 46 53 20 64 6f 65 73 20 6e  f the VFS does n
2ca50 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  ot support share
2ca60 64 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2f 0a 20  d memory .  */. 
2ca70 20 69 66 28 20 65 4e 65 77 3d 3d 50 41 47 45 52   if( eNew==PAGER
2ca80 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2ca90 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 53  .   && (sqlite3S
2caa0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
2cab0 65 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  e)==0           
2cac0 2f 2a 20 54 65 6d 70 20 66 69 6c 65 20 2a 2f 0a  /* Temp file */.
2cad0 20 20 20 20 20 20 20 7c 7c 20 21 73 71 6c 69 74         || !sqlit
2cae0 65 33 50 61 67 65 72 57 61 6c 53 75 70 70 6f 72  e3PagerWalSuppor
2caf0 74 65 64 28 70 50 61 67 65 72 29 29 20 20 20 2f  ted(pPager))   /
2cb00 2a 20 4e 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f  * No shared-memo
2cb10 72 79 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20  ry support */.  
2cb20 29 7b 0a 20 20 20 20 65 4e 65 77 20 3d 20 65 4f  ){.    eNew = eO
2cb30 6c 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 28  ld;.  }..  if( (
2cb40 65 4e 65 77 21 3d 65 4f 6c 64 29 0a 20 20 20 26  eNew!=eOld).   &
2cb50 26 20 28 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a  & (eOld==PAGER_J
2cb60 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 7c  OURNALMODE_WAL |
2cb70 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f  | eNew==PAGER_JO
2cb80 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20  URNALMODE_WAL). 
2cb90 20 29 7b 0a 20 20 20 20 69 66 28 20 21 64 62 2d   ){.    if( !db-
2cba0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 7c 7c 20 64  >autoCommit || d
2cbb0 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
2cbc0 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >1 ){.      rc =
2cbd0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2cbe0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53       sqlite3SetS
2cbf0 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
2cc00 67 2c 20 64 62 2c 20 0a 20 20 20 20 20 20 20 20  g, db, .        
2cc10 20 20 22 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65    "cannot change
2cc20 20 25 73 20 77 61 6c 20 6d 6f 64 65 20 66 72 6f   %s wal mode fro
2cc30 6d 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  m within a trans
2cc40 61 63 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20  action",.       
2cc50 20 20 20 28 65 4e 65 77 3d 3d 50 41 47 45 52 5f     (eNew==PAGER_
2cc60 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
2cc70 3f 20 22 69 6e 74 6f 22 20 3a 20 22 6f 75 74 20  ? "into" : "out 
2cc80 6f 66 22 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  of").      );.  
2cc90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2cca0 65 6c 73 65 7b 0a 20 0a 20 20 20 20 20 20 69 66  else{. .      if
2ccb0 28 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f  ( eOld==PAGER_JO
2ccc0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b  URNALMODE_WAL ){
2ccd0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6c  .        /* If l
2cce0 65 61 76 69 6e 67 20 57 41 4c 20 6d 6f 64 65 2c  eaving WAL mode,
2ccf0 20 63 6c 6f 73 65 20 74 68 65 20 6c 6f 67 20 66   close the log f
2cd00 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66  ile. If successf
2cd10 75 6c 2c 20 74 68 65 20 63 61 6c 6c 0a 20 20 20  ul, the call.   
2cd20 20 20 20 20 20 2a 2a 20 74 6f 20 50 61 67 65 72       ** to Pager
2cd30 43 6c 6f 73 65 57 61 6c 28 29 20 63 68 65 63 6b  CloseWal() check
2cd40 70 6f 69 6e 74 73 20 61 6e 64 20 64 65 6c 65 74  points and delet
2cd50 65 73 20 74 68 65 20 77 72 69 74 65 2d 61 68 65  es the write-ahe
2cd60 61 64 2d 6c 6f 67 20 0a 20 20 20 20 20 20 20 20  ad-log .        
2cd70 2a 2a 20 66 69 6c 65 2e 20 41 6e 20 45 58 43 4c  ** file. An EXCL
2cd80 55 53 49 56 45 20 6c 6f 63 6b 20 6d 61 79 20 73  USIVE lock may s
2cd90 74 69 6c 6c 20 62 65 20 68 65 6c 64 20 6f 6e 20  till be held on 
2cda0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2cdb0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 66  e .        ** af
2cdc0 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75 6c  ter a successful
2cdd0 20 72 65 74 75 72 6e 2e 20 0a 20 20 20 20 20 20   return. .      
2cde0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
2cdf0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  = sqlite3PagerCl
2ce00 6f 73 65 57 61 6c 28 70 50 61 67 65 72 29 3b 0a  oseWal(pPager);.
2ce10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2ce20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ce30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
2ce40 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64  gerSetJournalMod
2ce50 65 28 70 50 61 67 65 72 2c 20 65 4e 65 77 29 3b  e(pPager, eNew);
2ce60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ce70 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 6c 64 3d   }else if( eOld=
2ce80 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2ce90 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
2cea0 20 20 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 74       /* Cannot t
2ceb0 72 61 6e 73 69 74 69 6f 6e 20 64 69 72 65 63 74  ransition direct
2cec0 6c 79 20 66 72 6f 6d 20 4d 45 4d 4f 52 59 20 74  ly from MEMORY t
2ced0 6f 20 57 41 4c 2e 20 20 55 73 65 20 6d 6f 64 65  o WAL.  Use mode
2cee0 20 4f 46 46 0a 20 20 20 20 20 20 20 20 2a 2a 20   OFF.        ** 
2cef0 61 73 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61  as an intermedia
2cf00 74 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  te */.        sq
2cf10 6c 69 74 65 33 50 61 67 65 72 53 65 74 4a 6f 75  lite3PagerSetJou
2cf20 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 2c  rnalMode(pPager,
2cf30 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2cf40 44 45 5f 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d  DE_OFF);.      }
2cf50 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65  .  .      /* Ope
2cf60 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
2cf70 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2cf80 66 69 6c 65 2e 20 52 65 67 61 72 64 6c 65 73 73  file. Regardless
2cf90 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
2cfa0 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74        ** mode, t
2cfb0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
2cfc0 61 6c 77 61 79 73 20 75 73 65 73 20 61 20 72 6f  always uses a ro
2cfd0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
2cfe0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
2cff0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2d000 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
2d010 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
2d020 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d030 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2d040 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 56  sqlite3BtreeSetV
2d050 65 72 73 69 6f 6e 28 70 42 74 2c 20 28 65 4e 65  ersion(pBt, (eNe
2d060 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  w==PAGER_JOURNAL
2d070 4d 4f 44 45 5f 57 41 4c 20 3f 20 32 20 3a 20 31  MODE_WAL ? 2 : 1
2d080 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
2d090 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
2d0a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d0b0 49 54 5f 57 41 4c 20 2a 2f 0a 0a 20 20 69 66 28  IT_WAL */..  if(
2d0c0 20 72 63 20 29 7b 0a 20 20 20 20 65 4e 65 77 20   rc ){.    eNew 
2d0d0 3d 20 65 4f 6c 64 3b 0a 20 20 7d 0a 20 20 65 4e  = eOld;.  }.  eN
2d0e0 65 77 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ew = sqlite3Page
2d0f0 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  rSetJournalMode(
2d100 70 50 61 67 65 72 2c 20 65 4e 65 77 29 3b 0a 0a  pPager, eNew);..
2d110 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
2d120 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75 74 2d  Op->p2];.  pOut-
2d130 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
2d140 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f  |MEM_Static|MEM_
2d150 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e 7a 20  Term;.  pOut->z 
2d160 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
2d170 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e 61 6d 65  3JournalModename
2d180 28 65 4e 65 77 29 3b 0a 20 20 70 4f 75 74 2d 3e  (eNew);.  pOut->
2d190 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
2d1a0 6e 33 30 28 70 4f 75 74 2d 3e 7a 29 3b 0a 20 20  n30(pOut->z);.  
2d1b0 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pOut->enc = SQLI
2d1c0 54 45 5f 55 54 46 38 3b 0a 20 20 73 71 6c 69 74  TE_UTF8;.  sqlit
2d1d0 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f  e3VdbeChangeEnco
2d1e0 64 69 6e 67 28 70 4f 75 74 2c 20 65 6e 63 6f 64  ding(pOut, encod
2d1f0 69 6e 67 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  ing);.  break;.}
2d200 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
2d210 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 20 2a  TE_OMIT_PRAGMA *
2d220 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
2d230 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
2d240 55 4d 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UM) && !defined(
2d250 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54 41  SQLITE_OMIT_ATTA
2d260 43 48 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56  CH)./* Opcode: V
2d270 61 63 75 75 6d 20 2a 20 2a 20 2a 20 2a 20 2a 0a  acuum * * * * *.
2d280 2a 2a 0a 2a 2a 20 56 61 63 75 75 6d 20 74 68 65  **.** Vacuum the
2d290 20 65 6e 74 69 72 65 20 64 61 74 61 62 61 73 65   entire database
2d2a0 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77  .  This opcode w
2d2b0 69 6c 6c 20 63 61 75 73 65 20 6f 74 68 65 72 20  ill cause other 
2d2c0 76 69 72 74 75 61 6c 0a 2a 2a 20 6d 61 63 68 69  virtual.** machi
2d2d0 6e 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65  nes to be create
2d2e0 64 20 61 6e 64 20 72 75 6e 2e 20 20 49 74 20 6d  d and run.  It m
2d2f0 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ay not be called
2d300 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20   from within.** 
2d310 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
2d320 2f 0a 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d  /.case OP_Vacuum
2d330 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  : {.  assert( p-
2d340 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
2d350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 75    rc = sqlite3Ru
2d360 6e 56 61 63 75 75 6d 28 26 70 2d 3e 7a 45 72 72  nVacuum(&p->zErr
2d370 4d 73 67 2c 20 64 62 29 3b 0a 20 20 62 72 65 61  Msg, db);.  brea
2d380 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  k;.}.#endif..#if
2d390 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2d3a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2d3b0 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 63  )./* Opcode: Inc
2d3c0 72 56 61 63 75 75 6d 20 50 31 20 50 32 20 2a 20  rVacuum P1 P2 * 
2d3d0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 65 72 66 6f 72  * *.**.** Perfor
2d3e0 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20  m a single step 
2d3f0 6f 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  of the increment
2d400 61 6c 20 76 61 63 75 75 6d 20 70 72 6f 63 65 64  al vacuum proced
2d410 75 72 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 50 31  ure on.** the P1
2d420 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
2d430 65 20 76 61 63 75 75 6d 20 68 61 73 20 66 69 6e  e vacuum has fin
2d440 69 73 68 65 64 2c 20 6a 75 6d 70 20 74 6f 20 69  ished, jump to i
2d450 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 50 32  nstruction.** P2
2d460 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c  . Otherwise, fal
2d470 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
2d480 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
2d490 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  n..*/.case OP_In
2d4a0 63 72 56 61 63 75 75 6d 3a 20 7b 20 20 20 20 20  crVacuum: {     
2d4b0 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
2d4c0 42 74 72 65 65 20 2a 70 42 74 3b 0a 0a 20 20 61  Btree *pBt;..  a
2d4d0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
2d4e0 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d  0 && pOp->p1<db-
2d4f0 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
2d500 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  ( (p->btreeMask 
2d510 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31 29 3c  & (((yDbMask)1)<
2d520 3c 70 4f 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b  <pOp->p1))!=0 );
2d530 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65  .  assert( p->re
2d540 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 70  adOnly==0 );.  p
2d550 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70  Bt = db->aDb[pOp
2d560 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 72 63 20  ->p1].pBt;.  rc 
2d570 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
2d580 63 72 56 61 63 75 75 6d 28 70 42 74 29 3b 0a 20  crVacuum(pBt);. 
2d590 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d5a0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 70 63 20 3d  DONE ){.    pc =
2d5b0 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
2d5c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2d5d0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
2d5e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f  .#endif../* Opco
2d5f0 64 65 3a 20 45 78 70 69 72 65 20 50 31 20 2a 20  de: Expire P1 * 
2d600 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 61 75 73  * * *.**.** Caus
2d610 65 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74  e precompiled st
2d620 61 74 65 6d 65 6e 74 73 20 74 6f 20 62 65 63 6f  atements to beco
2d630 6d 65 20 65 78 70 69 72 65 64 2e 20 41 6e 20 65  me expired. An e
2d640 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
2d650 0a 2a 2a 20 66 61 69 6c 73 20 77 69 74 68 20 61  .** fails with a
2d660 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 66 20  n error code of 
2d670 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 69 66  SQLITE_SCHEMA if
2d680 20 69 74 20 69 73 20 65 76 65 72 20 65 78 65 63   it is ever exec
2d690 75 74 65 64 20 0a 2a 2a 20 28 76 69 61 20 73 71  uted .** (via sq
2d6a0 6c 69 74 65 33 5f 73 74 65 70 28 29 29 2e 0a 2a  lite3_step())..*
2d6b0 2a 20 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 30  * .** If P1 is 0
2d6c0 2c 20 74 68 65 6e 20 61 6c 6c 20 53 51 4c 20 73  , then all SQL s
2d6d0 74 61 74 65 6d 65 6e 74 73 20 62 65 63 6f 6d 65  tatements become
2d6e0 20 65 78 70 69 72 65 64 2e 20 49 66 20 50 31 20   expired. If P1 
2d6f0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20  is non-zero,.** 
2d700 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 63 75  then only the cu
2d710 72 72 65 6e 74 6c 79 20 65 78 65 63 75 74 69 6e  rrently executin
2d720 67 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61  g statement is a
2d730 66 66 65 63 74 65 64 2e 20 0a 2a 2f 0a 63 61 73  ffected. .*/.cas
2d740 65 20 4f 50 5f 45 78 70 69 72 65 3a 20 7b 0a 20  e OP_Expire: {. 
2d750 20 69 66 28 20 21 70 4f 70 2d 3e 70 31 20 29 7b   if( !pOp->p1 ){
2d760 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
2d770 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
2d780 65 6e 74 73 28 64 62 29 3b 0a 20 20 7d 65 6c 73  ents(db);.  }els
2d790 65 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  e{.    p->expire
2d7a0 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65  d = 1;.  }.  bre
2d7b0 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ak;.}..#ifndef S
2d7c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2d7d0 44 5f 43 41 43 48 45 0a 2f 2a 20 4f 70 63 6f 64  D_CACHE./* Opcod
2d7e0 65 3a 20 54 61 62 6c 65 4c 6f 63 6b 20 50 31 20  e: TableLock P1 
2d7f0 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  P2 P3 P4 *.**.**
2d800 20 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   Obtain a lock o
2d810 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74  n a particular t
2d820 61 62 6c 65 2e 20 54 68 69 73 20 69 6e 73 74 72  able. This instr
2d830 75 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  uction is only u
2d840 73 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  sed when.** the 
2d850 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61  shared-cache fea
2d860 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  ture is enabled.
2d870 20 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68   .**.** P1 is th
2d880 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64  e index of the d
2d890 61 74 61 62 61 73 65 20 69 6e 20 73 71 6c 69 74  atabase in sqlit
2d8a0 65 33 2e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20  e3.aDb[] of the 
2d8b0 64 61 74 61 62 61 73 65 0a 2a 2a 20 6f 6e 20 77  database.** on w
2d8c0 68 69 63 68 20 74 68 65 20 6c 6f 63 6b 20 69 73  hich the lock is
2d8d0 20 61 63 71 75 69 72 65 64 2e 20 20 41 20 72 65   acquired.  A re
2d8e0 61 64 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  adlock is obtain
2d8f0 65 64 20 69 66 20 50 33 3d 3d 30 20 6f 72 0a 2a  ed if P3==0 or.*
2d900 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 69  * a write lock i
2d910 66 20 50 33 3d 3d 31 2e 0a 2a 2a 0a 2a 2a 20 50  f P3==1..**.** P
2d920 32 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  2 contains the r
2d930 6f 6f 74 2d 70 61 67 65 20 6f 66 20 74 68 65 20  oot-page of the 
2d940 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 2e 0a 2a  table to lock..*
2d950 2a 0a 2a 2a 20 50 34 20 63 6f 6e 74 61 69 6e 73  *.** P4 contains
2d960 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2d970 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
2d980 62 6c 65 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64  ble being locked
2d990 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 0a 2a  . This is only.*
2d9a0 2a 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  * used to genera
2d9b0 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
2d9c0 61 67 65 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  age if the lock 
2d9d0 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
2d9e0 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54  ed..*/.case OP_T
2d9f0 61 62 6c 65 4c 6f 63 6b 3a 20 7b 0a 20 20 75 38  ableLock: {.  u8
2da00 20 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28   isWriteLock = (
2da10 75 38 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66  u8)pOp->p3;.  if
2da20 28 20 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c  ( isWriteLock ||
2da30 20 30 3d 3d 28 64 62 2d 3e 66 6c 61 67 73 26 53   0==(db->flags&S
2da40 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2da50 69 74 74 65 64 29 20 29 7b 0a 20 20 20 20 69 6e  itted) ){.    in
2da60 74 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 20  t p1 = pOp->p1; 
2da70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e  .    assert( p1>
2da80 3d 30 20 26 26 20 70 31 3c 64 62 2d 3e 6e 44 62  =0 && p1<db->nDb
2da90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2daa0 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20  (p->btreeMask & 
2dab0 28 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70  (((yDbMask)1)<<p
2dac0 31 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  1))!=0 );.    as
2dad0 73 65 72 74 28 20 69 73 57 72 69 74 65 4c 6f 63  sert( isWriteLoc
2dae0 6b 3d 3d 30 20 7c 7c 20 69 73 57 72 69 74 65 4c  k==0 || isWriteL
2daf0 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 72 63  ock==1 );.    rc
2db00 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c   = sqlite3BtreeL
2db10 6f 63 6b 54 61 62 6c 65 28 64 62 2d 3e 61 44 62  ockTable(db->aDb
2db20 5b 70 31 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70  [p1].pBt, pOp->p
2db30 32 2c 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b  2, isWriteLock);
2db40 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78 46  .    if( (rc&0xF
2db50 46 29 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  F)==SQLITE_LOCKE
2db60 44 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  D ){.      const
2db70 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e   char *z = pOp->
2db80 70 34 2e 7a 3b 0a 20 20 20 20 20 20 73 71 6c 69  p4.z;.      sqli
2db90 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
2dba0 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 64  >zErrMsg, db, "d
2dbb0 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73  atabase table is
2dbc0 20 6c 6f 63 6b 65 64 3a 20 25 73 22 2c 20 7a 29   locked: %s", z)
2dbd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
2dbe0 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
2dbf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
2dc00 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2dc10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2dc20 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
2dc30 2a 20 4f 70 63 6f 64 65 3a 20 56 42 65 67 69 6e  * Opcode: VBegin
2dc40 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a   * * * P4 *.**.*
2dc50 2a 20 50 34 20 6d 61 79 20 62 65 20 61 20 70 6f  * P4 may be a po
2dc60 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
2dc70 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75  te3_vtab structu
2dc80 72 65 2e 20 49 66 20 73 6f 2c 20 63 61 6c 6c 20  re. If so, call 
2dc90 74 68 65 20 0a 2a 2a 20 78 42 65 67 69 6e 20 6d  the .** xBegin m
2dca0 65 74 68 6f 64 20 66 6f 72 20 74 68 61 74 20 74  ethod for that t
2dcb0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  able..**.** Also
2dcc0 2c 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  , whether or not
2dcd0 20 50 34 20 69 73 20 73 65 74 2c 20 63 68 65 63   P4 is set, chec
2dce0 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20 6e  k that this is n
2dcf0 6f 74 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  ot being called 
2dd00 66 72 6f 6d 0a 2a 2a 20 77 69 74 68 69 6e 20 61  from.** within a
2dd10 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 20 76   callback to a v
2dd20 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78 53 79  irtual table xSy
2dd30 6e 63 28 29 20 6d 65 74 68 6f 64 2e 20 49 66 20  nc() method. If 
2dd40 69 74 20 69 73 2c 20 74 68 65 20 65 72 72 6f 72  it is, the error
2dd50 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 62 65  .** code will be
2dd60 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4c   set to SQLITE_L
2dd70 4f 43 4b 45 44 2e 0a 2a 2f 0a 63 61 73 65 20 4f  OCKED..*/.case O
2dd80 50 5f 56 42 65 67 69 6e 3a 20 7b 0a 20 20 56 54  P_VBegin: {.  VT
2dd90 61 62 6c 65 20 2a 70 56 54 61 62 3b 0a 20 20 70  able *pVTab;.  p
2dda0 56 54 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  VTab = pOp->p4.p
2ddb0 56 74 61 62 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Vtab;.  rc = sql
2ddc0 69 74 65 33 56 74 61 62 42 65 67 69 6e 28 64 62  ite3VtabBegin(db
2ddd0 2c 20 70 56 54 61 62 29 3b 0a 20 20 69 66 28 20  , pVTab);.  if( 
2dde0 70 56 54 61 62 20 29 20 69 6d 70 6f 72 74 56 74  pVTab ) importVt
2ddf0 61 62 45 72 72 4d 73 67 28 70 2c 20 70 56 54 61  abErrMsg(p, pVTa
2de00 62 2d 3e 70 56 74 61 62 29 3b 0a 20 20 62 72 65  b->pVtab);.  bre
2de10 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ak;.}.#endif /* 
2de20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2de30 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
2de40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2de50 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
2de60 20 4f 70 63 6f 64 65 3a 20 56 43 72 65 61 74 65   Opcode: VCreate
2de70 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a   P1 * * P4 *.**.
2de80 2a 2a 20 50 34 20 69 73 20 74 68 65 20 6e 61 6d  ** P4 is the nam
2de90 65 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74  e of a virtual t
2dea0 61 62 6c 65 20 69 6e 20 64 61 74 61 62 61 73 65  able in database
2deb0 20 50 31 2e 20 43 61 6c 6c 20 74 68 65 20 78 43   P1. Call the xC
2dec0 72 65 61 74 65 20 6d 65 74 68 6f 64 0a 2a 2a 20  reate method.** 
2ded0 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  for that table..
2dee0 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 43 72 65 61  */.case OP_VCrea
2def0 74 65 3a 20 7b 0a 20 20 72 63 20 3d 20 73 71 6c  te: {.  rc = sql
2df00 69 74 65 33 56 74 61 62 43 61 6c 6c 43 72 65 61  ite3VtabCallCrea
2df10 74 65 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20  te(db, pOp->p1, 
2df20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 26 70 2d 3e 7a  pOp->p4.z, &p->z
2df30 45 72 72 4d 73 67 29 3b 0a 20 20 62 72 65 61 6b  ErrMsg);.  break
2df40 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2df50 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2df60 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64  LTABLE */..#ifnd
2df70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2df80 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f  IRTUALTABLE./* O
2df90 70 63 6f 64 65 3a 20 56 44 65 73 74 72 6f 79 20  pcode: VDestroy 
2dfa0 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
2dfb0 2a 20 50 34 20 69 73 20 74 68 65 20 6e 61 6d 65  * P4 is the name
2dfc0 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61   of a virtual ta
2dfd0 62 6c 65 20 69 6e 20 64 61 74 61 62 61 73 65 20  ble in database 
2dfe0 50 31 2e 20 20 43 61 6c 6c 20 74 68 65 20 78 44  P1.  Call the xD
2dff0 65 73 74 72 6f 79 20 6d 65 74 68 6f 64 0a 2a 2a  estroy method.**
2e000 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 2e 0a   of that table..
2e010 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 44 65 73 74  */.case OP_VDest
2e020 72 6f 79 3a 20 7b 0a 20 20 70 2d 3e 69 6e 56 74  roy: {.  p->inVt
2e030 61 62 4d 65 74 68 6f 64 20 3d 20 32 3b 0a 20 20  abMethod = 2;.  
2e040 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
2e050 43 61 6c 6c 44 65 73 74 72 6f 79 28 64 62 2c 20  CallDestroy(db, 
2e060 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34  pOp->p1, pOp->p4
2e070 2e 7a 29 3b 0a 20 20 70 2d 3e 69 6e 56 74 61 62  .z);.  p->inVtab
2e080 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 62 72  Method = 0;.  br
2e090 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
2e0a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2e0b0 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
2e0c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2e0d0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
2e0e0 2a 20 4f 70 63 6f 64 65 3a 20 56 4f 70 65 6e 20  * Opcode: VOpen 
2e0f0 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
2e100 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65  * P4 is a pointe
2e110 72 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74  r to a virtual t
2e120 61 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20  able object, an 
2e130 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72  sqlite3_vtab str
2e140 75 63 74 75 72 65 2e 0a 2a 2a 20 50 31 20 69 73  ucture..** P1 is
2e150 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72   a cursor number
2e160 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6f  .  This opcode o
2e170 70 65 6e 73 20 61 20 63 75 72 73 6f 72 20 74 6f  pens a cursor to
2e180 20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20   the virtual.** 
2e190 74 61 62 6c 65 20 61 6e 64 20 73 74 6f 72 65 73  table and stores
2e1a0 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 6e 20   that cursor in 
2e1b0 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56  P1..*/.case OP_V
2e1c0 4f 70 65 6e 3a 20 7b 0a 20 20 56 64 62 65 43 75  Open: {.  VdbeCu
2e1d0 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 73 71  rsor *pCur;.  sq
2e1e0 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
2e1f0 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  r *pVtabCursor;.
2e200 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
2e210 70 56 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  pVtab;.  sqlite3
2e220 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
2e230 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
2e240 6e 6f 49 4f 3d 3d 30 20 29 3b 0a 20 20 70 43 75  noIO==0 );.  pCu
2e250 72 20 3d 20 30 3b 0a 20 20 70 56 74 61 62 43 75  r = 0;.  pVtabCu
2e260 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 56 74 61  rsor = 0;.  pVta
2e270 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61  b = pOp->p4.pVta
2e280 62 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64  b->pVtab;.  pMod
2e290 75 6c 65 20 3d 20 28 73 71 6c 69 74 65 33 5f 6d  ule = (sqlite3_m
2e2a0 6f 64 75 6c 65 20 2a 29 70 56 74 61 62 2d 3e 70  odule *)pVtab->p
2e2b0 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65 72 74  Module;.  assert
2e2c0 28 70 56 74 61 62 20 26 26 20 70 4d 6f 64 75 6c  (pVtab && pModul
2e2d0 65 29 3b 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75  e);.  rc = pModu
2e2e0 6c 65 2d 3e 78 4f 70 65 6e 28 70 56 74 61 62 2c  le->xOpen(pVtab,
2e2f0 20 26 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a   &pVtabCursor);.
2e300 20 20 69 6d 70 6f 72 74 56 74 61 62 45 72 72 4d    importVtabErrM
2e310 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20  sg(p, pVtab);.  
2e320 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72  if( SQLITE_OK==r
2e330 63 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  c ){.    /* Init
2e340 69 61 6c 69 7a 65 20 73 71 6c 69 74 65 33 5f 76  ialize sqlite3_v
2e350 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65 20  tab_cursor base 
2e360 63 6c 61 73 73 20 2a 2f 0a 20 20 20 20 70 56 74  class */.    pVt
2e370 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 20  abCursor->pVtab 
2e380 3d 20 70 56 74 61 62 3b 0a 0a 20 20 20 20 2f 2a  = pVtab;..    /*
2e390 20 49 6e 69 74 69 61 6c 69 7a 65 20 76 64 62 65   Initialize vdbe
2e3a0 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a   cursor object *
2e3b0 2f 0a 20 20 20 20 70 43 75 72 20 3d 20 61 6c 6c  /.    pCur = all
2e3c0 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70  ocateCursor(p, p
2e3d0 4f 70 2d 3e 70 31 2c 20 30 2c 20 2d 31 2c 20 30  Op->p1, 0, -1, 0
2e3e0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 20  );.    if( pCur 
2e3f0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ){.      pCur->p
2e400 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 56 74  VtabCursor = pVt
2e410 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  abCursor;.      
2e420 70 43 75 72 2d 3e 70 4d 6f 64 75 6c 65 20 3d 20  pCur->pModule = 
2e430 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
2e440 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  ab->pModule;.   
2e450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
2e460 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
2e470 20 31 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c   1;.      pModul
2e480 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43  e->xClose(pVtabC
2e490 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
2e4a0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  }.  break;.}.#en
2e4b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2e4c0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
2e4d0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
2e4e0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2e4f0 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ABLE./* Opcode: 
2e500 56 46 69 6c 74 65 72 20 50 31 20 50 32 20 50 33  VFilter P1 P2 P3
2e510 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 31 20 69   P4 *.**.** P1 i
2e520 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65  s a cursor opene
2e530 64 20 75 73 69 6e 67 20 56 4f 70 65 6e 2e 20 20  d using VOpen.  
2e540 50 32 20 69 73 20 61 6e 20 61 64 64 72 65 73 73  P2 is an address
2e550 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66 0a 2a   to jump to if.*
2e560 2a 20 74 68 65 20 66 69 6c 74 65 72 65 64 20 72  * the filtered r
2e570 65 73 75 6c 74 20 73 65 74 20 69 73 20 65 6d 70  esult set is emp
2e580 74 79 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20  ty..**.** P4 is 
2e590 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61  either NULL or a
2e5a0 20 73 74 72 69 6e 67 20 74 68 61 74 20 77 61 73   string that was
2e5b0 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
2e5c0 65 20 78 42 65 73 74 49 6e 64 65 78 0a 2a 2a 20  e xBestIndex.** 
2e5d0 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 6d 6f  method of the mo
2e5e0 64 75 6c 65 2e 20 20 54 68 65 20 69 6e 74 65 72  dule.  The inter
2e5f0 70 72 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  pretation of the
2e600 20 50 34 20 73 74 72 69 6e 67 20 69 73 20 6c 65   P4 string is le
2e610 66 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6d 6f 64  ft.** to the mod
2e620 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ule implementati
2e630 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  on..**.** This o
2e640 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68  pcode invokes th
2e650 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64  e xFilter method
2e660 20 6f 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   on the virtual 
2e670 74 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 0a  table specified.
2e680 2a 2a 20 62 79 20 50 31 2e 20 20 54 68 65 20 69  ** by P1.  The i
2e690 6e 74 65 67 65 72 20 71 75 65 72 79 20 70 6c 61  nteger query pla
2e6a0 6e 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 78  n parameter to x
2e6b0 46 69 6c 74 65 72 20 69 73 20 73 74 6f 72 65 64  Filter is stored
2e6c0 20 69 6e 20 72 65 67 69 73 74 65 72 0a 2a 2a 20   in register.** 
2e6d0 50 33 2e 20 52 65 67 69 73 74 65 72 20 50 33 2b  P3. Register P3+
2e6e0 31 20 73 74 6f 72 65 73 20 74 68 65 20 61 72 67  1 stores the arg
2e6f0 63 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 62  c parameter to b
2e700 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 0a  e passed to the.
2e710 2a 2a 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f  ** xFilter metho
2e720 64 2e 20 52 65 67 69 73 74 65 72 73 20 50 33 2b  d. Registers P3+
2e730 32 2e 2e 50 33 2b 31 2b 61 72 67 63 20 61 72 65  2..P3+1+argc are
2e740 20 74 68 65 20 61 72 67 63 0a 2a 2a 20 61 64 64   the argc.** add
2e750 69 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65  itional paramete
2e760 72 73 20 77 68 69 63 68 20 61 72 65 20 70 61 73  rs which are pas
2e770 73 65 64 20 74 6f 0a 2a 2a 20 78 46 69 6c 74 65  sed to.** xFilte
2e780 72 20 61 73 20 61 72 67 76 2e 20 52 65 67 69 73  r as argv. Regis
2e790 74 65 72 20 50 33 2b 32 20 62 65 63 6f 6d 65 73  ter P3+2 becomes
2e7a0 20 61 72 67 76 5b 30 5d 20 77 68 65 6e 20 70 61   argv[0] when pa
2e7b0 73 73 65 64 20 74 6f 20 78 46 69 6c 74 65 72 2e  ssed to xFilter.
2e7c0 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 69 73  .**.** A jump is
2e7d0 20 6d 61 64 65 20 74 6f 20 50 32 20 69 66 20 74   made to P2 if t
2e7e0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 66  he result set af
2e7f0 74 65 72 20 66 69 6c 74 65 72 69 6e 67 20 77 6f  ter filtering wo
2e800 75 6c 64 20 62 65 20 65 6d 70 74 79 2e 0a 2a 2f  uld be empty..*/
2e810 0a 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72  .case OP_VFilter
2e820 3a 20 7b 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f  : {   /* jump */
2e830 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69  .  int nArg;.  i
2e840 6e 74 20 69 51 75 65 72 79 3b 0a 20 20 63 6f 6e  nt iQuery;.  con
2e850 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
2e860 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 4d 65  e *pModule;.  Me
2e870 6d 20 2a 70 51 75 65 72 79 3b 0a 20 20 4d 65 6d  m *pQuery;.  Mem
2e880 20 2a 70 41 72 67 63 3b 0a 20 20 73 71 6c 69 74   *pArgc;.  sqlit
2e890 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
2e8a0 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 73  pVtabCursor;.  s
2e8b0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
2e8c0 61 62 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  ab;.  VdbeCursor
2e8d0 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 65   *pCur;.  int re
2e8e0 73 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65  s;.  int i;.  Me
2e8f0 6d 20 2a 2a 61 70 41 72 67 3b 0a 0a 20 20 70 51  m **apArg;..  pQ
2e900 75 65 72 79 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  uery = &aMem[pOp
2e910 2d 3e 70 33 5d 3b 0a 20 20 70 41 72 67 63 20 3d  ->p3];.  pArgc =
2e920 20 26 70 51 75 65 72 79 5b 31 5d 3b 0a 20 20 70   &pQuery[1];.  p
2e930 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70  Cur = p->apCsr[p
2e940 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
2e950 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 51  t( memIsValid(pQ
2e960 75 65 72 79 29 20 29 3b 0a 20 20 52 45 47 49 53  uery) );.  REGIS
2e970 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
2e980 33 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 61 73  3, pQuery);.  as
2e990 73 65 72 74 28 20 70 43 75 72 2d 3e 70 56 74 61  sert( pCur->pVta
2e9a0 62 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 56 74  bCursor );.  pVt
2e9b0 61 62 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d  abCursor = pCur-
2e9c0 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  >pVtabCursor;.  
2e9d0 70 56 74 61 62 20 3d 20 70 56 74 61 62 43 75 72  pVtab = pVtabCur
2e9e0 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d  sor->pVtab;.  pM
2e9f0 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70  odule = pVtab->p
2ea00 4d 6f 64 75 6c 65 3b 0a 0a 20 20 2f 2a 20 47 72  Module;..  /* Gr
2ea10 61 62 20 74 68 65 20 69 6e 64 65 78 20 6e 75 6d  ab the index num
2ea20 62 65 72 20 61 6e 64 20 61 72 67 63 20 70 61 72  ber and argc par
2ea30 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73  ameters */.  ass
2ea40 65 72 74 28 20 28 70 51 75 65 72 79 2d 3e 66 6c  ert( (pQuery->fl
2ea50 61 67 73 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  ags&MEM_Int)!=0 
2ea60 26 26 20 70 41 72 67 63 2d 3e 66 6c 61 67 73 3d  && pArgc->flags=
2ea70 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 6e 41  =MEM_Int );.  nA
2ea80 72 67 20 3d 20 28 69 6e 74 29 70 41 72 67 63 2d  rg = (int)pArgc-
2ea90 3e 75 2e 69 3b 0a 20 20 69 51 75 65 72 79 20 3d  >u.i;.  iQuery =
2eaa0 20 28 69 6e 74 29 70 51 75 65 72 79 2d 3e 75 2e   (int)pQuery->u.
2eab0 69 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  i;..  /* Invoke 
2eac0 74 68 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68  the xFilter meth
2ead0 6f 64 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 72 65  od */.  {.    re
2eae0 73 20 3d 20 30 3b 0a 20 20 20 20 61 70 41 72 67  s = 0;.    apArg
2eaf0 20 3d 20 70 2d 3e 61 70 41 72 67 3b 0a 20 20 20   = p->apArg;.   
2eb00 20 66 6f 72 28 69 20 3d 20 30 3b 20 69 3c 6e 41   for(i = 0; i<nA
2eb10 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
2eb20 61 70 41 72 67 5b 69 5d 20 3d 20 26 70 41 72 67  apArg[i] = &pArg
2eb30 63 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 73 71  c[i+1];.      sq
2eb40 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f 72  lite3VdbeMemStor
2eb50 65 54 79 70 65 28 61 70 41 72 67 5b 69 5d 29 3b  eType(apArg[i]);
2eb60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 69  .    }..    p->i
2eb70 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b  nVtabMethod = 1;
2eb80 0a 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c  .    rc = pModul
2eb90 65 2d 3e 78 46 69 6c 74 65 72 28 70 56 74 61 62  e->xFilter(pVtab
2eba0 43 75 72 73 6f 72 2c 20 69 51 75 65 72 79 2c 20  Cursor, iQuery, 
2ebb0 70 4f 70 2d 3e 70 34 2e 7a 2c 20 6e 41 72 67 2c  pOp->p4.z, nArg,
2ebc0 20 61 70 41 72 67 29 3b 0a 20 20 20 20 70 2d 3e   apArg);.    p->
2ebd0 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30  inVtabMethod = 0
2ebe0 3b 0a 20 20 20 20 69 6d 70 6f 72 74 56 74 61 62  ;.    importVtab
2ebf0 45 72 72 4d 73 67 28 70 2c 20 70 56 74 61 62 29  ErrMsg(p, pVtab)
2ec00 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2ec10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ec20 20 72 65 73 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e   res = pModule->
2ec30 78 45 6f 66 28 70 56 74 61 62 43 75 72 73 6f 72  xEof(pVtabCursor
2ec40 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
2ec50 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 70  ( res ){.      p
2ec60 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
2ec70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75  .    }.  }.  pCu
2ec80 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a  r->nullRow = 0;.
2ec90 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
2eca0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2ecb0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
2ecc0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2ecd0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2ece0 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56  BLE./* Opcode: V
2ecf0 43 6f 6c 75 6d 6e 20 50 31 20 50 32 20 50 33 20  Column P1 P2 P3 
2ed00 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20  * *.**.** Store 
2ed10 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2ed20 20 50 32 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66   P2-th column of
2ed30 0a 2a 2a 20 74 68 65 20 72 6f 77 20 6f 66 20 74  .** the row of t
2ed40 68 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65  he virtual-table
2ed50 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 50 31   that the .** P1
2ed60 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
2ed70 69 6e 67 20 74 6f 20 69 6e 74 6f 20 72 65 67 69  ing to into regi
2ed80 73 74 65 72 20 50 33 2e 0a 2a 2f 0a 63 61 73 65  ster P3..*/.case
2ed90 20 4f 50 5f 56 43 6f 6c 75 6d 6e 3a 20 7b 0a 20   OP_VColumn: {. 
2eda0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
2edb0 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71  Vtab;.  const sq
2edc0 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
2edd0 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d 20 2a 70 44  odule;.  Mem *pD
2ede0 65 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63  est;.  sqlite3_c
2edf0 6f 6e 74 65 78 74 20 73 43 6f 6e 74 65 78 74 3b  ontext sContext;
2ee00 0a 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  ..  VdbeCursor *
2ee10 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b  pCur = p->apCsr[
2ee20 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
2ee30 72 74 28 20 70 43 75 72 2d 3e 70 56 74 61 62 43  rt( pCur->pVtabC
2ee40 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72  ursor );.  asser
2ee50 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20  t( pOp->p3>0 && 
2ee60 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p3<=p->nMem
2ee70 20 29 3b 0a 20 20 70 44 65 73 74 20 3d 20 26 61   );.  pDest = &a
2ee80 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
2ee90 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
2eea0 28 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 69 66  (p, pDest);.  if
2eeb0 28 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20  ( pCur->nullRow 
2eec0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
2eed0 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 44 65  beMemSetNull(pDe
2eee0 73 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  st);.    break;.
2eef0 20 20 7d 0a 20 20 70 56 74 61 62 20 3d 20 70 43    }.  pVtab = pC
2ef00 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 2d  ur->pVtabCursor-
2ef10 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64 75 6c  >pVtab;.  pModul
2ef20 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  e = pVtab->pModu
2ef30 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d  le;.  assert( pM
2ef40 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d 6e 20 29  odule->xColumn )
2ef50 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 43 6f 6e  ;.  memset(&sCon
2ef60 74 65 78 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  text, 0, sizeof(
2ef70 73 43 6f 6e 74 65 78 74 29 29 3b 0a 0a 20 20 2f  sContext));..  /
2ef80 2a 20 54 68 65 20 6f 75 74 70 75 74 20 63 65 6c  * The output cel
2ef90 6c 20 6d 61 79 20 61 6c 72 65 61 64 79 20 68 61  l may already ha
2efa0 76 65 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  ve a buffer allo
2efb0 63 61 74 65 64 2e 20 4d 6f 76 65 0a 20 20 2a 2a  cated. Move.  **
2efc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
2efd0 74 65 6e 74 73 20 74 6f 20 73 43 6f 6e 74 65 78  tents to sContex
2efe0 74 2e 73 20 73 6f 20 69 6e 20 63 61 73 65 20 74  t.s so in case t
2eff0 68 65 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e  he user-function
2f000 20 0a 20 20 2a 2a 20 63 61 6e 20 75 73 65 20 74   .  ** can use t
2f010 68 65 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  he already alloc
2f020 61 74 65 64 20 62 75 66 66 65 72 20 69 6e 73 74  ated buffer inst
2f030 65 61 64 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6e  ead of allocatin
2f040 67 20 61 20 0a 20 20 2a 2a 20 6e 65 77 20 6f 6e  g a .  ** new on
2f050 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
2f060 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 26 73 43  3VdbeMemMove(&sC
2f070 6f 6e 74 65 78 74 2e 73 2c 20 70 44 65 73 74 29  ontext.s, pDest)
2f080 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c  ;.  MemSetTypeFl
2f090 61 67 28 26 73 43 6f 6e 74 65 78 74 2e 73 2c 20  ag(&sContext.s, 
2f0a0 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 0a 20 20 72 63  MEM_Null);..  rc
2f0b0 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c   = pModule->xCol
2f0c0 75 6d 6e 28 70 43 75 72 2d 3e 70 56 74 61 62 43  umn(pCur->pVtabC
2f0d0 75 72 73 6f 72 2c 20 26 73 43 6f 6e 74 65 78 74  ursor, &sContext
2f0e0 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 69 6d  , pOp->p2);.  im
2f0f0 70 6f 72 74 56 74 61 62 45 72 72 4d 73 67 28 70  portVtabErrMsg(p
2f100 2c 20 70 56 74 61 62 29 3b 0a 20 20 69 66 28 20  , pVtab);.  if( 
2f110 73 43 6f 6e 74 65 78 74 2e 69 73 45 72 72 6f 72  sContext.isError
2f120 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 43 6f   ){.    rc = sCo
2f130 6e 74 65 78 74 2e 69 73 45 72 72 6f 72 3b 0a 20  ntext.isError;. 
2f140 20 7d 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68   }..  /* Copy th
2f150 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
2f160 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  function to the 
2f170 50 33 20 72 65 67 69 73 74 65 72 2e 20 57 65 0a  P3 register. We.
2f180 20 20 2a 2a 20 64 6f 20 74 68 69 73 20 72 65 67    ** do this reg
2f190 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
2f1a0 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72  er or not an err
2f1b0 6f 72 20 6f 63 63 75 72 72 65 64 20 74 6f 20 65  or occurred to e
2f1c0 6e 73 75 72 65 20 61 6e 79 0a 20 20 2a 2a 20 64  nsure any.  ** d
2f1d0 79 6e 61 6d 69 63 20 61 6c 6c 6f 63 61 74 69 6f  ynamic allocatio
2f1e0 6e 20 69 6e 20 73 43 6f 6e 74 65 78 74 2e 73 20  n in sContext.s 
2f1f0 28 61 20 4d 65 6d 20 73 74 72 75 63 74 29 20 69  (a Mem struct) i
2f200 73 20 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  s  released..  *
2f210 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  /.  sqlite3VdbeC
2f220 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 26 73  hangeEncoding(&s
2f230 43 6f 6e 74 65 78 74 2e 73 2c 20 65 6e 63 6f 64  Context.s, encod
2f240 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ing);.  sqlite3V
2f250 64 62 65 4d 65 6d 4d 6f 76 65 28 70 44 65 73 74  dbeMemMove(pDest
2f260 2c 20 26 73 43 6f 6e 74 65 78 74 2e 73 29 3b 0a  , &sContext.s);.
2f270 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
2f280 28 70 4f 70 2d 3e 70 33 2c 20 70 44 65 73 74 29  (pOp->p3, pDest)
2f290 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
2f2a0 4c 4f 42 53 49 5a 45 28 70 44 65 73 74 29 3b 0a  LOBSIZE(pDest);.
2f2b0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  .  if( sqlite3Vd
2f2c0 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 44 65 73  beMemTooBig(pDes
2f2d0 74 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  t) ){.    goto t
2f2e0 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 62 72  oo_big;.  }.  br
2f2f0 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
2f300 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2f310 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
2f320 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f330 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
2f340 2a 20 4f 70 63 6f 64 65 3a 20 56 4e 65 78 74 20  * Opcode: VNext 
2f350 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
2f360 2a 20 41 64 76 61 6e 63 65 20 76 69 72 74 75 61  * Advance virtua
2f370 6c 20 74 61 62 6c 65 20 50 31 20 74 6f 20 74 68  l table P1 to th
2f380 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 69 74  e next row in it
2f390 73 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  s result set and
2f3a0 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74  .** jump to inst
2f3b0 72 75 63 74 69 6f 6e 20 50 32 2e 20 20 4f 72 2c  ruction P2.  Or,
2f3c0 20 69 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   if the virtual 
2f3d0 74 61 62 6c 65 20 68 61 73 20 72 65 61 63 68 65  table has reache
2f3e0 64 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20  d.** the end of 
2f3f0 69 74 73 20 72 65 73 75 6c 74 20 73 65 74 2c 20  its result set, 
2f400 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67  then fall throug
2f410 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
2f420 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  struction..*/.ca
2f430 73 65 20 4f 50 5f 56 4e 65 78 74 3a 20 7b 20 20  se OP_VNext: {  
2f440 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 73 71   /* jump */.  sq
2f450 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
2f460 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  b;.  const sqlit
2f470 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
2f480 6c 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  le;.  int res;. 
2f490 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75   VdbeCursor *pCu
2f4a0 72 3b 0a 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20  r;..  res = 0;. 
2f4b0 20 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72   pCur = p->apCsr
2f4c0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
2f4d0 65 72 74 28 20 70 43 75 72 2d 3e 70 56 74 61 62  ert( pCur->pVtab
2f4e0 43 75 72 73 6f 72 20 29 3b 0a 20 20 69 66 28 20  Cursor );.  if( 
2f4f0 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b  pCur->nullRow ){
2f500 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
2f510 20 20 70 56 74 61 62 20 3d 20 70 43 75 72 2d 3e    pVtab = pCur->
2f520 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
2f530 61 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20  ab;.  pModule = 
2f540 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
2f550 20 20 61 73 73 65 72 74 28 20 70 4d 6f 64 75 6c    assert( pModul
2f560 65 2d 3e 78 4e 65 78 74 20 29 3b 0a 0a 20 20 2f  e->xNext );..  /
2f570 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 4e 65  * Invoke the xNe
2f580 78 74 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74  xt() method of t
2f590 68 65 20 6d 6f 64 75 6c 65 2e 20 54 68 65 72 65  he module. There
2f5a0 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 74   is no way for t
2f5b0 68 65 0a 20 20 2a 2a 20 75 6e 64 65 72 6c 79 69  he.  ** underlyi
2f5c0 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
2f5d0 6e 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  n to return an e
2f5e0 72 72 6f 72 20 69 66 20 6f 6e 65 20 6f 63 63 75  rror if one occu
2f5f0 72 73 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 78  rs during.  ** x
2f600 4e 65 78 74 28 29 2e 20 49 6e 73 74 65 61 64 2c  Next(). Instead,
2f610 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
2f620 75 72 73 2c 20 74 72 75 65 20 69 73 20 72 65 74  urs, true is ret
2f630 75 72 6e 65 64 20 28 69 6e 64 69 63 61 74 69 6e  urned (indicatin
2f640 67 20 74 68 61 74 20 0a 20 20 2a 2a 20 64 61 74  g that .  ** dat
2f650 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 29 20  a is available) 
2f660 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
2f670 64 65 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e  de returned when
2f680 20 78 43 6f 6c 75 6d 6e 20 6f 72 0a 20 20 2a 2a   xColumn or.  **
2f690 20 73 6f 6d 65 20 6f 74 68 65 72 20 6d 65 74 68   some other meth
2f6a0 6f 64 20 69 73 20 6e 65 78 74 20 69 6e 76 6f 6b  od is next invok
2f6b0 65 64 20 6f 6e 20 74 68 65 20 73 61 76 65 20 76  ed on the save v
2f6c0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72  irtual table cur
2f6d0 73 6f 72 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69  sor..  */.  p->i
2f6e0 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b  nVtabMethod = 1;
2f6f0 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d  .  rc = pModule-
2f700 3e 78 4e 65 78 74 28 70 43 75 72 2d 3e 70 56 74  >xNext(pCur->pVt
2f710 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 70 2d 3e  abCursor);.  p->
2f720 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30  inVtabMethod = 0
2f730 3b 0a 20 20 69 6d 70 6f 72 74 56 74 61 62 45 72  ;.  importVtabEr
2f740 72 4d 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a  rMsg(p, pVtab);.
2f750 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f760 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  _OK ){.    res =
2f770 20 70 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66 28 70   pModule->xEof(p
2f780 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  Cur->pVtabCursor
2f790 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 72  );.  }..  if( !r
2f7a0 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  es ){.    /* If 
2f7b0 74 68 65 72 65 20 69 73 20 64 61 74 61 2c 20 6a  there is data, j
2f7c0 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20 20 20  ump to P2 */.   
2f7d0 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
2f7e0 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  1;.  }.  break;.
2f7f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2f800 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2f810 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ABLE */..#ifndef
2f820 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2f830 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63  TUALTABLE./* Opc
2f840 6f 64 65 3a 20 56 52 65 6e 61 6d 65 20 50 31 20  ode: VRename P1 
2f850 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50  * * P4 *.**.** P
2f860 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
2f870 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  o a virtual tabl
2f880 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c  e object, an sql
2f890 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74  ite3_vtab struct
2f8a0 75 72 65 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ure..** This opc
2f8b0 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ode invokes the 
2f8c0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 78 52  corresponding xR
2f8d0 65 6e 61 6d 65 20 6d 65 74 68 6f 64 2e 20 54 68  ename method. Th
2f8e0 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 72 65  e value.** in re
2f8f0 67 69 73 74 65 72 20 50 31 20 69 73 20 70 61 73  gister P1 is pas
2f900 73 65 64 20 61 73 20 74 68 65 20 7a 4e 61 6d 65  sed as the zName
2f910 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
2f920 20 78 52 65 6e 61 6d 65 20 6d 65 74 68 6f 64 2e   xRename method.
2f930 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 52 65 6e  .*/.case OP_VRen
2f940 61 6d 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33  ame: {.  sqlite3
2f950 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20  _vtab *pVtab;.  
2f960 4d 65 6d 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 70  Mem *pName;..  p
2f970 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Vtab = pOp->p4.p
2f980 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 70  Vtab->pVtab;.  p
2f990 4e 61 6d 65 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  Name = &aMem[pOp
2f9a0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2f9b0 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d   pVtab->pModule-
2f9c0 3e 78 52 65 6e 61 6d 65 20 29 3b 0a 20 20 61 73  >xRename );.  as
2f9d0 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
2f9e0 28 70 4e 61 6d 65 29 20 29 3b 0a 20 20 61 73 73  (pName) );.  ass
2f9f0 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  ert( p->readOnly
2fa00 3d 3d 30 20 29 3b 0a 20 20 52 45 47 49 53 54 45  ==0 );.  REGISTE
2fa10 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c  R_TRACE(pOp->p1,
2fa20 20 70 4e 61 6d 65 29 3b 0a 20 20 61 73 73 65 72   pName);.  asser
2fa30 74 28 20 70 4e 61 6d 65 2d 3e 66 6c 61 67 73 20  t( pName->flags 
2fa40 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 74  & MEM_Str );.  t
2fa50 65 73 74 63 61 73 65 28 20 70 4e 61 6d 65 2d 3e  estcase( pName->
2fa60 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc==SQLITE_UTF8
2fa70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2fa80 70 4e 61 6d 65 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pName->enc==SQLI
2fa90 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20  TE_UTF16BE );.  
2faa0 74 65 73 74 63 61 73 65 28 20 70 4e 61 6d 65 2d  testcase( pName-
2fab0 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
2fac0 31 36 4c 45 20 29 3b 0a 20 20 72 63 20 3d 20 73  16LE );.  rc = s
2fad0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2fae0 45 6e 63 6f 64 69 6e 67 28 70 4e 61 6d 65 2c 20  Encoding(pName, 
2faf0 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
2fb00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fb10 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 56  K ){.    rc = pV
2fb20 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 52  tab->pModule->xR
2fb30 65 6e 61 6d 65 28 70 56 74 61 62 2c 20 70 4e 61  ename(pVtab, pNa
2fb40 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 69 6d 70 6f  me->z);.    impo
2fb50 72 74 56 74 61 62 45 72 72 4d 73 67 28 70 2c 20  rtVtabErrMsg(p, 
2fb60 70 56 74 61 62 29 3b 0a 20 20 20 20 70 2d 3e 65  pVtab);.    p->e
2fb70 78 70 69 72 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  xpired = 0;.  }.
2fb80 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
2fb90 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
2fba0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2fbb0 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56  BLE./* Opcode: V
2fbc0 55 70 64 61 74 65 20 50 31 20 50 32 20 50 33 20  Update P1 P2 P3 
2fbd0 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  P4 *.**.** P4 is
2fbe0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2fbf0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62  virtual table ob
2fc00 6a 65 63 74 2c 20 61 6e 20 73 71 6c 69 74 65 33  ject, an sqlite3
2fc10 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e  _vtab structure.
2fc20 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
2fc30 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 72 72  invokes the corr
2fc40 65 73 70 6f 6e 64 69 6e 67 20 78 55 70 64 61 74  esponding xUpdat
2fc50 65 20 6d 65 74 68 6f 64 2e 20 50 32 20 76 61 6c  e method. P2 val
2fc60 75 65 73 0a 2a 2a 20 61 72 65 20 63 6f 6e 74 69  ues.** are conti
2fc70 67 75 6f 75 73 20 6d 65 6d 6f 72 79 20 63 65 6c  guous memory cel
2fc80 6c 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 50  ls starting at P
2fc90 33 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65  3 to pass to the
2fca0 20 78 55 70 64 61 74 65 20 0a 2a 2a 20 69 6e 76   xUpdate .** inv
2fcb0 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c  ocation. The val
2fcc0 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 28  ue in register (
2fcd0 50 33 2b 50 32 2d 31 29 20 63 6f 72 72 65 73 70  P3+P2-1) corresp
2fce0 6f 6e 64 73 20 74 6f 20 74 68 65 20 0a 2a 2a 20  onds to the .** 
2fcf0 70 32 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20  p2th element of 
2fd00 74 68 65 20 61 72 67 76 20 61 72 72 61 79 20 70  the argv array p
2fd10 61 73 73 65 64 20 74 6f 20 78 55 70 64 61 74 65  assed to xUpdate
2fd20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 55 70 64  ..**.** The xUpd
2fd30 61 74 65 20 6d 65 74 68 6f 64 20 77 69 6c 6c 20  ate method will 
2fd40 64 6f 20 61 20 44 45 4c 45 54 45 20 6f 72 20 61  do a DELETE or a
2fd50 6e 20 49 4e 53 45 52 54 20 6f 72 20 62 6f 74 68  n INSERT or both
2fd60 2e 0a 2a 2a 20 54 68 65 20 61 72 67 76 5b 30 5d  ..** The argv[0]
2fd70 20 65 6c 65 6d 65 6e 74 20 28 77 68 69 63 68 20   element (which 
2fd80 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 6d  corresponds to m
2fd90 65 6d 6f 72 79 20 63 65 6c 6c 20 50 33 29 0a 2a  emory cell P3).*
2fda0 2a 20 69 73 20 74 68 65 20 72 6f 77 69 64 20 6f  * is the rowid o
2fdb0 66 20 61 20 72 6f 77 20 74 6f 20 64 65 6c 65 74  f a row to delet
2fdc0 65 2e 20 20 49 66 20 61 72 67 76 5b 30 5d 20 69  e.  If argv[0] i
2fdd0 73 20 4e 55 4c 4c 20 74 68 65 6e 20 6e 6f 20 0a  s NULL then no .
2fde0 2a 2a 20 64 65 6c 65 74 69 6f 6e 20 6f 63 63 75  ** deletion occu
2fdf0 72 73 2e 20 20 54 68 65 20 61 72 67 76 5b 31 5d  rs.  The argv[1]
2fe00 20 65 6c 65 6d 65 6e 74 20 69 73 20 74 68 65 20   element is the 
2fe10 72 6f 77 69 64 20 6f 66 20 74 68 65 20 6e 65 77  rowid of the new
2fe20 20 0a 2a 2a 20 72 6f 77 2e 20 20 54 68 69 73 20   .** row.  This 
2fe30 63 61 6e 20 62 65 20 4e 55 4c 4c 20 74 6f 20 68  can be NULL to h
2fe40 61 76 65 20 74 68 65 20 76 69 72 74 75 61 6c 20  ave the virtual 
2fe50 74 61 62 6c 65 20 73 65 6c 65 63 74 20 74 68 65  table select the
2fe60 20 6e 65 77 20 0a 2a 2a 20 72 6f 77 69 64 20 66   new .** rowid f
2fe70 6f 72 20 69 74 73 65 6c 66 2e 20 20 54 68 65 20  or itself.  The 
2fe80 73 75 62 73 65 71 75 65 6e 74 20 65 6c 65 6d 65  subsequent eleme
2fe90 6e 74 73 20 69 6e 20 74 68 65 20 61 72 72 61 79  nts in the array
2fea0 20 61 72 65 20 0a 2a 2a 20 74 68 65 20 76 61 6c   are .** the val
2feb0 75 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ues of columns i
2fec0 6e 20 74 68 65 20 6e 65 77 20 72 6f 77 2e 0a 2a  n the new row..*
2fed0 2a 0a 2a 2a 20 49 66 20 50 32 3d 3d 31 20 74 68  *.** If P2==1 th
2fee0 65 6e 20 6e 6f 20 69 6e 73 65 72 74 20 69 73 20  en no insert is 
2fef0 70 65 72 66 6f 72 6d 65 64 2e 20 20 61 72 67 76  performed.  argv
2ff00 5b 30 5d 20 69 73 20 74 68 65 20 72 6f 77 69 64  [0] is the rowid
2ff10 20 6f 66 0a 2a 2a 20 61 20 72 6f 77 20 74 6f 20   of.** a row to 
2ff20 64 65 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 50 31  delete..**.** P1
2ff30 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20 66 6c   is a boolean fl
2ff40 61 67 2e 20 49 66 20 69 74 20 69 73 20 73 65 74  ag. If it is set
2ff50 20 74 6f 20 74 72 75 65 20 61 6e 64 20 74 68 65   to true and the
2ff60 20 78 55 70 64 61 74 65 20 63 61 6c 6c 0a 2a 2a   xUpdate call.**
2ff70 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
2ff80 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
2ff90 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2ffa0 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
2ffb0 6f 77 69 64 28 29 20 0a 2a 2a 20 69 73 20 73 65  owid() .** is se
2ffc0 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f  t to the value o
2ffd0 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  f the rowid for 
2ffe0 74 68 65 20 72 6f 77 20 6a 75 73 74 20 69 6e 73  the row just ins
2fff0 65 72 74 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f  erted..*/.case O
30000 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 73  P_VUpdate: {.  s
30010 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
30020 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 6f  ab;.  sqlite3_mo
30030 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20  dule *pModule;. 
30040 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74   int nArg;.  int
30050 20 69 3b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74   i;.  sqlite_int
30060 36 34 20 72 6f 77 69 64 3b 0a 20 20 4d 65 6d 20  64 rowid;.  Mem 
30070 2a 2a 61 70 41 72 67 3b 0a 20 20 4d 65 6d 20 2a  **apArg;.  Mem *
30080 70 58 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  pX;..  assert( p
30090 4f 70 2d 3e 70 32 3d 3d 31 20 20 20 20 20 20 20  Op->p2==1       
300a0 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f   || pOp->p5==OE_
300b0 46 61 69 6c 20 20 20 7c 7c 20 70 4f 70 2d 3e 70  Fail   || pOp->p
300c0 35 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a  5==OE_Rollback .
300d0 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70         || pOp->p
300e0 35 3d 3d 4f 45 5f 41 62 6f 72 74 20 7c 7c 20 70  5==OE_Abort || p
300f0 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 49 67 6e 6f 72  Op->p5==OE_Ignor
30100 65 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45  e || pOp->p5==OE
30110 5f 52 65 70 6c 61 63 65 0a 20 20 29 3b 0a 20 20  _Replace.  );.  
30120 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f  assert( p->readO
30130 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 70 56 74 61  nly==0 );.  pVta
30140 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61  b = pOp->p4.pVta
30150 62 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64  b->pVtab;.  pMod
30160 75 6c 65 20 3d 20 28 73 71 6c 69 74 65 33 5f 6d  ule = (sqlite3_m
30170 6f 64 75 6c 65 20 2a 29 70 56 74 61 62 2d 3e 70  odule *)pVtab->p
30180 4d 6f 64 75 6c 65 3b 0a 20 20 6e 41 72 67 20 3d  Module;.  nArg =
30190 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65   pOp->p2;.  asse
301a0 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
301b0 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 69 66  =P4_VTAB );.  if
301c0 28 20 41 4c 57 41 59 53 28 70 4d 6f 64 75 6c 65  ( ALWAYS(pModule
301d0 2d 3e 78 55 70 64 61 74 65 29 20 29 7b 0a 20 20  ->xUpdate) ){.  
301e0 20 20 75 38 20 76 74 61 62 4f 6e 43 6f 6e 66 6c    u8 vtabOnConfl
301f0 69 63 74 20 3d 20 64 62 2d 3e 76 74 61 62 4f 6e  ict = db->vtabOn
30200 43 6f 6e 66 6c 69 63 74 3b 0a 20 20 20 20 61 70  Conflict;.    ap
30210 41 72 67 20 3d 20 70 2d 3e 61 70 41 72 67 3b 0a  Arg = p->apArg;.
30220 20 20 20 20 70 58 20 3d 20 26 61 4d 65 6d 5b 70      pX = &aMem[p
30230 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 66 6f 72  Op->p3];.    for
30240 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
30250 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
30260 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 58 29  ( memIsValid(pX)
30270 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62 6f   );.      memAbo
30280 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 58  utToChange(p, pX
30290 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
302a0 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65  VdbeMemStoreType
302b0 28 70 58 29 3b 0a 20 20 20 20 20 20 61 70 41 72  (pX);.      apAr
302c0 67 5b 69 5d 20 3d 20 70 58 3b 0a 20 20 20 20 20  g[i] = pX;.     
302d0 20 70 58 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20   pX++;.    }.   
302e0 20 64 62 2d 3e 76 74 61 62 4f 6e 43 6f 6e 66 6c   db->vtabOnConfl
302f0 69 63 74 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20  ict = pOp->p5;. 
30300 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d     rc = pModule-
30310 3e 78 55 70 64 61 74 65 28 70 56 74 61 62 2c 20  >xUpdate(pVtab, 
30320 6e 41 72 67 2c 20 61 70 41 72 67 2c 20 26 72 6f  nArg, apArg, &ro
30330 77 69 64 29 3b 0a 20 20 20 20 64 62 2d 3e 76 74  wid);.    db->vt
30340 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 20 3d 20 76  abOnConflict = v
30350 74 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 3b 0a 20  tabOnConflict;. 
30360 20 20 20 69 6d 70 6f 72 74 56 74 61 62 45 72 72     importVtabErr
30370 4d 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20  Msg(p, pVtab);. 
30380 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30390 45 5f 4f 4b 20 26 26 20 70 4f 70 2d 3e 70 31 20  E_OK && pOp->p1 
303a0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
303b0 20 6e 41 72 67 3e 31 20 26 26 20 61 70 41 72 67   nArg>1 && apArg
303c0 5b 30 5d 20 26 26 20 28 61 70 41 72 67 5b 30 5d  [0] && (apArg[0]
303d0 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  ->flags&MEM_Null
303e0 29 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c  ) );.      db->l
303f0 61 73 74 52 6f 77 69 64 20 3d 20 6c 61 73 74 52  astRowid = lastR
30400 6f 77 69 64 20 3d 20 72 6f 77 69 64 3b 0a 20 20  owid = rowid;.  
30410 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 26    }.    if( (rc&
30420 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
30430 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d  NSTRAINT && pOp-
30440 3e 70 34 2e 70 56 74 61 62 2d 3e 62 43 6f 6e 73  >p4.pVtab->bCons
30450 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20  traint ){.      
30460 69 66 28 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f  if( pOp->p5==OE_
30470 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20  Ignore ){.      
30480 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
30490 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
304a0 20 20 20 20 20 20 20 70 2d 3e 65 72 72 6f 72 41         p->errorA
304b0 63 74 69 6f 6e 20 3d 20 28 28 70 4f 70 2d 3e 70  ction = ((pOp->p
304c0 35 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 20 3f  5==OE_Replace) ?
304d0 20 4f 45 5f 41 62 6f 72 74 20 3a 20 70 4f 70 2d   OE_Abort : pOp-
304e0 3e 70 35 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >p5);.      }.  
304f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
30500 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 20  ->nChange++;.   
30510 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
30520 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
30530 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
30540 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ABLE */..#ifndef
30550 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41    SQLITE_OMIT_PA
30560 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f 2a 20 4f  GER_PRAGMAS./* O
30570 70 63 6f 64 65 3a 20 50 61 67 65 63 6f 75 6e 74  pcode: Pagecount
30580 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
30590 2a 2a 20 57 72 69 74 65 20 74 68 65 20 63 75 72  ** Write the cur
305a0 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70  rent number of p
305b0 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
305c0 20 50 31 20 74 6f 20 6d 65 6d 6f 72 79 20 63 65   P1 to memory ce
305d0 6c 6c 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ll P2..*/.case O
305e0 50 5f 50 61 67 65 63 6f 75 6e 74 3a 20 7b 20 20  P_Pagecount: {  
305f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
30600 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a  2-prerelease */.
30610 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 73 71    pOut->u.i = sq
30620 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61  lite3BtreeLastPa
30630 67 65 28 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e  ge(db->aDb[pOp->
30640 70 31 5d 2e 70 42 74 29 3b 0a 20 20 62 72 65 61  p1].pBt);.  brea
30650 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  k;.}.#endif...#i
30660 66 6e 64 65 66 20 20 53 51 4c 49 54 45 5f 4f 4d  fndef  SQLITE_OM
30670 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
30680 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 61 78 50  ./* Opcode: MaxP
30690 67 63 6e 74 20 50 31 20 50 32 20 50 33 20 2a 20  gcnt P1 P2 P3 * 
306a0 2a 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 73  *.**.** Try to s
306b0 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  et the maximum p
306c0 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 64 61  age count for da
306d0 74 61 62 61 73 65 20 50 31 20 74 6f 20 74 68 65  tabase P1 to the
306e0 20 76 61 6c 75 65 20 69 6e 20 50 33 2e 0a 2a 2a   value in P3..**
306f0 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20   Do not let the 
30700 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
30710 6e 74 20 66 61 6c 6c 20 62 65 6c 6f 77 20 74 68  nt fall below th
30720 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
30730 6f 75 6e 74 20 61 6e 64 0a 2a 2a 20 64 6f 20 6e  ount and.** do n
30740 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 6d 61  ot change the ma
30750 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
30760 20 76 61 6c 75 65 20 69 66 20 50 33 3d 3d 30 2e   value if P3==0.
30770 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65  .**.** Store the
30780 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
30790 75 6e 74 20 61 66 74 65 72 20 74 68 65 20 63 68  unt after the ch
307a0 61 6e 67 65 20 69 6e 20 72 65 67 69 73 74 65 72  ange in register
307b0 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
307c0 4d 61 78 50 67 63 6e 74 3a 20 7b 20 20 20 20 20  MaxPgcnt: {     
307d0 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70         /* out2-p
307e0 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 75  rerelease */.  u
307f0 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 4d  nsigned int newM
30800 61 78 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  ax;.  Btree *pBt
30810 3b 0a 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61  ;..  pBt = db->a
30820 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b  Db[pOp->p1].pBt;
30830 0a 20 20 6e 65 77 4d 61 78 20 3d 20 30 3b 0a 20  .  newMax = 0;. 
30840 20 69 66 28 20 70 4f 70 2d 3e 70 33 20 29 7b 0a   if( pOp->p3 ){.
30850 20 20 20 20 6e 65 77 4d 61 78 20 3d 20 73 71 6c      newMax = sql
30860 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67  ite3BtreeLastPag
30870 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  e(pBt);.    if( 
30880 6e 65 77 4d 61 78 20 3c 20 28 75 6e 73 69 67 6e  newMax < (unsign
30890 65 64 29 70 4f 70 2d 3e 70 33 20 29 20 6e 65 77  ed)pOp->p3 ) new
308a0 4d 61 78 20 3d 20 28 75 6e 73 69 67 6e 65 64 29  Max = (unsigned)
308b0 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 0a 20 20 70  pOp->p3;.  }.  p
308c0 4f 75 74 2d 3e 75 2e 69 20 3d 20 73 71 6c 69 74  Out->u.i = sqlit
308d0 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
308e0 75 6e 74 28 70 42 74 2c 20 6e 65 77 4d 61 78 29  unt(pBt, newMax)
308f0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
30900 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  dif...#ifndef SQ
30910 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
30920 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 72 61 63 65  /* Opcode: Trace
30930 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a   * * * P4 *.**.*
30940 2a 20 49 66 20 74 72 61 63 69 6e 67 20 69 73 20  * If tracing is 
30950 65 6e 61 62 6c 65 64 20 28 62 79 20 74 68 65 20  enabled (by the 
30960 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29 29  sqlite3_trace())
30970 20 69 6e 74 65 72 66 61 63 65 2c 20 74 68 65 6e   interface, then
30980 0a 2a 2a 20 74 68 65 20 55 54 46 2d 38 20 73 74  .** the UTF-8 st
30990 72 69 6e 67 20 63 6f 6e 74 61 69 6e 65 64 20 69  ring contained i
309a0 6e 20 50 34 20 69 73 20 65 6d 69 74 74 65 64 20  n P4 is emitted 
309b0 6f 6e 20 74 68 65 20 74 72 61 63 65 20 63 61 6c  on the trace cal
309c0 6c 62 61 63 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f  lback..*/.case O
309d0 50 5f 54 72 61 63 65 3a 20 7b 0a 20 20 63 68 61  P_Trace: {.  cha
309e0 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 63 68 61  r *zTrace;.  cha
309f0 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 64 62 2d  r *z;..  if( db-
30a00 3e 78 54 72 61 63 65 0a 20 20 20 26 26 20 21 70  >xTrace.   && !p
30a10 2d 3e 64 6f 69 6e 67 52 65 72 75 6e 0a 20 20 20  ->doingRerun.   
30a20 26 26 20 28 7a 54 72 61 63 65 20 3d 20 28 70 4f  && (zTrace = (pO
30a30 70 2d 3e 70 34 2e 7a 20 3f 20 70 4f 70 2d 3e 70  p->p4.z ? pOp->p
30a40 34 2e 7a 20 3a 20 70 2d 3e 7a 53 71 6c 29 29 21  4.z : p->zSql))!
30a50 3d 30 0a 20 20 29 7b 0a 20 20 20 20 7a 20 3d 20  =0.  ){.    z = 
30a60 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e  sqlite3VdbeExpan
30a70 64 53 71 6c 28 70 2c 20 7a 54 72 61 63 65 29 3b  dSql(p, zTrace);
30a80 0a 20 20 20 20 64 62 2d 3e 78 54 72 61 63 65 28  .    db->xTrace(
30a90 64 62 2d 3e 70 54 72 61 63 65 41 72 67 2c 20 7a  db->pTraceArg, z
30aa0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
30ab0 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 7d  Free(db, z);.  }
30ac0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
30ad0 45 42 55 47 0a 20 20 69 66 28 20 28 64 62 2d 3e  EBUG.  if( (db->
30ae0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
30af0 71 6c 54 72 61 63 65 29 21 3d 30 0a 20 20 20 26  qlTrace)!=0.   &
30b00 26 20 28 7a 54 72 61 63 65 20 3d 20 28 70 4f 70  & (zTrace = (pOp
30b10 2d 3e 70 34 2e 7a 20 3f 20 70 4f 70 2d 3e 70 34  ->p4.z ? pOp->p4
30b20 2e 7a 20 3a 20 70 2d 3e 7a 53 71 6c 29 29 21 3d  .z : p->zSql))!=
30b30 30 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  0.  ){.    sqlit
30b40 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53  e3DebugPrintf("S
30b50 51 4c 2d 74 72 61 63 65 3a 20 25 73 5c 6e 22 2c  QL-trace: %s\n",
30b60 20 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a 23 65   zTrace);.  }.#e
30b70 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
30b80 45 42 55 47 20 2a 2f 0a 20 20 62 72 65 61 6b 3b  EBUG */.  break;
30b90 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 4f  .}.#endif.../* O
30ba0 70 63 6f 64 65 3a 20 4e 6f 6f 70 20 2a 20 2a 20  pcode: Noop * * 
30bb0 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e  * * *.**.** Do n
30bc0 6f 74 68 69 6e 67 2e 20 20 54 68 69 73 20 69 6e  othing.  This in
30bd0 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6f 66 74  struction is oft
30be0 65 6e 20 75 73 65 66 75 6c 20 61 73 20 61 20 6a  en useful as a j
30bf0 75 6d 70 0a 2a 2a 20 64 65 73 74 69 6e 61 74 69  ump.** destinati
30c00 6f 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65  on..*/./*.** The
30c10 20 6d 61 67 69 63 20 45 78 70 6c 61 69 6e 20 6f   magic Explain o
30c20 70 63 6f 64 65 20 61 72 65 20 6f 6e 6c 79 20 69  pcode are only i
30c30 6e 73 65 72 74 65 64 20 77 68 65 6e 20 65 78 70  nserted when exp
30c40 6c 61 69 6e 3d 3d 32 20 28 77 68 69 63 68 0a 2a  lain==2 (which.*
30c50 2a 20 69 73 20 74 6f 20 73 61 79 20 77 68 65 6e  * is to say when
30c60 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45   the EXPLAIN QUE
30c70 52 59 20 50 4c 41 4e 20 73 79 6e 74 61 78 20 69  RY PLAN syntax i
30c80 73 20 75 73 65 64 2e 29 0a 2a 2a 20 54 68 69 73  s used.).** This
30c90 20 6f 70 63 6f 64 65 20 72 65 63 6f 72 64 73 20   opcode records 
30ca0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
30cb0 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20   the optimizer. 
30cc0 20 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 74 68   It is the.** th
30cd0 65 20 73 61 6d 65 20 61 73 20 61 20 6e 6f 2d 6f  e same as a no-o
30ce0 70 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65 73  p.  This opcodes
30cf0 6e 65 76 65 72 20 61 70 70 65 61 72 73 20 69 6e  never appears in
30d00 20 61 20 72 65 61 6c 20 56 4d 20 70 72 6f 67 72   a real VM progr
30d10 61 6d 2e 0a 2a 2f 0a 64 65 66 61 75 6c 74 3a 20  am..*/.default: 
30d20 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  {          /* Th
30d30 69 73 20 69 73 20 72 65 61 6c 6c 79 20 4f 50 5f  is is really OP_
30d40 4e 6f 6f 70 20 61 6e 64 20 4f 50 5f 45 78 70 6c  Noop and OP_Expl
30d50 61 69 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ain */.  assert(
30d60 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
30d70 5f 4e 6f 6f 70 20 7c 7c 20 70 4f 70 2d 3e 6f 70  _Noop || pOp->op
30d80 63 6f 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69 6e  code==OP_Explain
30d90 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   );.  break;.}..
30da0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
30db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
30df0 2a 20 54 68 65 20 63 61 73 65 73 20 6f 66 20 74  * The cases of t
30e00 68 65 20 73 77 69 74 63 68 20 73 74 61 74 65 6d  he switch statem
30e10 65 6e 74 20 61 62 6f 76 65 20 74 68 69 73 20 6c  ent above this l
30e20 69 6e 65 20 73 68 6f 75 6c 64 20 61 6c 6c 20 62  ine should all b
30e30 65 20 69 6e 64 65 6e 74 65 64 0a 2a 2a 20 62 79  e indented.** by
30e40 20 36 20 73 70 61 63 65 73 2e 20 20 42 75 74 20   6 spaces.  But 
30e50 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 36 20  the left-most 6 
30e60 73 70 61 63 65 73 20 68 61 76 65 20 62 65 65 6e  spaces have been
30e70 20 72 65 6d 6f 76 65 64 20 74 6f 20 69 6d 70 72   removed to impr
30e80 6f 76 65 20 74 68 65 0a 2a 2a 20 72 65 61 64 61  ove the.** reada
30e90 62 69 6c 69 74 79 2e 20 20 46 72 6f 6d 20 74 68  bility.  From th
30ea0 69 73 20 70 6f 69 6e 74 20 6f 6e 20 64 6f 77 6e  is point on down
30eb0 2c 20 74 68 65 20 6e 6f 72 6d 61 6c 20 69 6e 64  , the normal ind
30ec0 65 6e 74 61 74 69 6f 6e 20 72 75 6c 65 73 20 61  entation rules a
30ed0 72 65 0a 2a 2a 20 72 65 73 74 6f 72 65 64 2e 0a  re.** restored..
30ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 20  *************/. 
30f30 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 56 44 42     }..#ifdef VDB
30f40 45 5f 50 52 4f 46 49 4c 45 0a 20 20 20 20 7b 0a  E_PROFILE.    {.
30f50 20 20 20 20 20 20 75 36 34 20 65 6c 61 70 73 65        u64 elapse
30f60 64 20 3d 20 73 71 6c 69 74 65 33 48 77 74 69 6d  d = sqlite3Hwtim
30f70 65 28 29 20 2d 20 73 74 61 72 74 3b 0a 20 20 20  e() - start;.   
30f80 20 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 2b     pOp->cycles +
30f90 3d 20 65 6c 61 70 73 65 64 3b 0a 20 20 20 20 20  = elapsed;.     
30fa0 20 70 4f 70 2d 3e 63 6e 74 2b 2b 3b 0a 23 69 66   pOp->cnt++;.#if
30fb0 20 30 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e   0.        fprin
30fc0 74 66 28 73 74 64 6f 75 74 2c 20 22 25 31 30 6c  tf(stdout, "%10l
30fd0 6c 75 20 22 2c 20 65 6c 61 70 73 65 64 29 3b 0a  lu ", elapsed);.
30fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30ff0 64 62 65 50 72 69 6e 74 4f 70 28 73 74 64 6f 75  dbePrintOp(stdou
31000 74 2c 20 6f 72 69 67 50 63 2c 20 26 61 4f 70 5b  t, origPc, &aOp[
31010 6f 72 69 67 50 63 5d 29 3b 0a 23 65 6e 64 69 66  origPc]);.#endif
31020 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
31030 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
31040 69 6e 67 20 63 6f 64 65 20 61 64 64 73 20 6e 6f  ing code adds no
31050 74 68 69 6e 67 20 74 6f 20 74 68 65 20 61 63 74  thing to the act
31060 75 61 6c 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  ual functionalit
31070 79 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  y.    ** of the 
31080 70 72 6f 67 72 61 6d 2e 20 20 49 74 20 69 73 20  program.  It is 
31090 6f 6e 6c 79 20 68 65 72 65 20 66 6f 72 20 74 65  only here for te
310a0 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
310b0 69 6e 67 2e 0a 20 20 20 20 2a 2a 20 4f 6e 20 74  ing..    ** On t
310c0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
310d0 74 20 64 6f 65 73 20 62 75 72 6e 20 43 50 55 20  t does burn CPU 
310e0 63 79 63 6c 65 73 20 65 76 65 72 79 20 74 69 6d  cycles every tim
310f0 65 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a  e through.    **
31100 20 74 68 65 20 65 76 61 6c 75 61 74 6f 72 20 6c   the evaluator l
31110 6f 6f 70 2e 20 20 53 6f 20 77 65 20 63 61 6e 20  oop.  So we can 
31120 6c 65 61 76 65 20 69 74 20 6f 75 74 20 77 68 65  leave it out whe
31130 6e 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69  n NDEBUG is defi
31140 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  ned..    */.#ifn
31150 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 61  def NDEBUG.    a
31160 73 73 65 72 74 28 20 70 63 3e 3d 2d 31 20 26 26  ssert( pc>=-1 &&
31170 20 70 63 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 0a 23   pc<p->nOp );..#
31180 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
31190 55 47 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 72  UG.    if( p->tr
311a0 61 63 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ace ){.      if(
311b0 20 72 63 21 3d 30 20 29 20 66 70 72 69 6e 74 66   rc!=0 ) fprintf
311c0 28 70 2d 3e 74 72 61 63 65 2c 22 72 63 3d 25 64  (p->trace,"rc=%d
311d0 5c 6e 22 2c 72 63 29 3b 0a 20 20 20 20 20 20 69  \n",rc);.      i
311e0 66 28 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20  f( pOp->opflags 
311f0 26 20 28 4f 50 46 4c 47 5f 4f 55 54 32 5f 50 52  & (OPFLG_OUT2_PR
31200 45 52 45 4c 45 41 53 45 7c 4f 50 46 4c 47 5f 4f  ERELEASE|OPFLG_O
31210 55 54 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  UT2) ){.        
31220 72 65 67 69 73 74 65 72 54 72 61 63 65 28 70 2d  registerTrace(p-
31230 3e 74 72 61 63 65 2c 20 70 4f 70 2d 3e 70 32 2c  >trace, pOp->p2,
31240 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29   &aMem[pOp->p2])
31250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31260 69 66 28 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73  if( pOp->opflags
31270 20 26 20 4f 50 46 4c 47 5f 4f 55 54 33 20 29 7b   & OPFLG_OUT3 ){
31280 0a 20 20 20 20 20 20 20 20 72 65 67 69 73 74 65  .        registe
31290 72 54 72 61 63 65 28 70 2d 3e 74 72 61 63 65 2c  rTrace(p->trace,
312a0 20 70 4f 70 2d 3e 70 33 2c 20 26 61 4d 65 6d 5b   pOp->p3, &aMem[
312b0 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 20  pOp->p3]);.     
312c0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20   }.    }.#endif 
312d0 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
312e0 20 2a 2f 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e   */.#endif  /* N
312f0 44 45 42 55 47 20 2a 2f 0a 20 20 7d 20 20 2f 2a  DEBUG */.  }  /*
31300 20 54 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   The end of the 
31310 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 20 74 68 65  for(;;) loop the
31320 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 6f   loops through o
31330 70 63 6f 64 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20  pcodes */..  /* 
31340 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
31350 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
31360 20 74 68 61 74 20 65 78 65 63 75 74 69 6f 6e 20   that execution 
31370 69 73 20 66 69 6e 69 73 68 65 64 20 77 69 74 68  is finished with
31380 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  .  ** an error o
31390 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 0a 20 20 2a  f some kind..  *
313a0 2f 0a 76 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c  /.vdbe_error_hal
313b0 74 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 20  t:.  assert( rc 
313c0 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b  );.  p->rc = rc;
313d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
313e0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
313f0 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71  .xLog!=0 );.  sq
31400 6c 69 74 65 33 5f 6c 6f 67 28 72 63 2c 20 22 73  lite3_log(rc, "s
31410 74 61 74 65 6d 65 6e 74 20 61 62 6f 72 74 73 20  tatement aborts 
31420 61 74 20 25 64 3a 20 5b 25 73 5d 20 25 73 22 2c  at %d: [%s] %s",
31430 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
31440 20 20 20 20 20 70 63 2c 20 70 2d 3e 7a 53 71 6c       pc, p->zSql
31450 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
31460 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
31470 28 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  (p);.  if( rc==S
31480 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31490 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  M ) db->mallocFa
314a0 69 6c 65 64 20 3d 20 31 3b 0a 20 20 72 63 20 3d  iled = 1;.  rc =
314b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
314c0 20 69 66 28 20 72 65 73 65 74 53 63 68 65 6d 61   if( resetSchema
314d0 4f 6e 46 61 75 6c 74 3e 30 20 29 7b 0a 20 20 20  OnFault>0 ){.   
314e0 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65   sqlite3ResetOne
314f0 53 63 68 65 6d 61 28 64 62 2c 20 72 65 73 65 74  Schema(db, reset
31500 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 2d 31 29  SchemaOnFault-1)
31510 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
31520 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
31530 20 6f 75 74 20 6f 66 20 74 68 69 73 20 70 72 6f   out of this pro
31540 63 65 64 75 72 65 2e 20 20 57 65 20 68 61 76 65  cedure.  We have
31550 20 74 6f 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65   to.  ** release
31560 20 74 68 65 20 6d 75 74 65 78 65 73 20 6f 6e 20   the mutexes on 
31570 62 74 72 65 65 73 20 74 68 61 74 20 77 65 72 65  btrees that were
31580 20 61 63 71 75 69 72 65 64 20 61 74 20 74 68 65   acquired at the
31590 0a 20 20 2a 2a 20 74 6f 70 2e 20 2a 2f 0a 76 64  .  ** top. */.vd
315a0 62 65 5f 72 65 74 75 72 6e 3a 0a 20 20 64 62 2d  be_return:.  db-
315b0 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6c 61 73  >lastRowid = las
315c0 74 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 61 43 6f  tRowid;.  p->aCo
315d0 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53 54 4d  unter[SQLITE_STM
315e0 54 53 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 2d  TSTATUS_VM_STEP-
315f0 31 5d 20 2b 3d 20 28 69 6e 74 29 6e 56 6d 53 74  1] += (int)nVmSt
31600 65 70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ep;.  sqlite3Vdb
31610 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
31620 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75  urn rc;..  /* Ju
31630 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 61 20  mp to here if a 
31640 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6c  string or blob l
31650 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49 54  arger than SQLIT
31660 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 20 20 2a  E_MAX_LENGTH.  *
31670 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
31680 2e 0a 20 20 2a 2f 0a 74 6f 6f 5f 62 69 67 3a 0a  ..  */.too_big:.
31690 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
316a0 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
316b0 64 62 2c 20 22 73 74 72 69 6e 67 20 6f 72 20 62  db, "string or b
316c0 6c 6f 62 20 74 6f 6f 20 62 69 67 22 29 3b 0a 20  lob too big");. 
316d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 54 4f 4f   rc = SQLITE_TOO
316e0 42 49 47 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65  BIG;.  goto vdbe
316f0 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 0a 20 20  _error_halt;..  
31700 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
31710 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
31720 69 6c 73 2e 0a 20 20 2a 2f 0a 6e 6f 5f 6d 65 6d  ils..  */.no_mem
31730 3a 0a 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  :.  db->mallocFa
31740 69 6c 65 64 20 3d 20 31 3b 0a 20 20 73 71 6c 69  iled = 1;.  sqli
31750 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
31760 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 6f  >zErrMsg, db, "o
31770 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a  ut of memory");.
31780 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
31790 4d 45 4d 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65  MEM;.  goto vdbe
317a0 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 0a 20 20  _error_halt;..  
317b0 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
317c0 66 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 6b 69  for any other ki
317d0 6e 64 20 6f 66 20 66 61 74 61 6c 20 65 72 72 6f  nd of fatal erro
317e0 72 2e 20 20 54 68 65 20 22 72 63 22 20 76 61 72  r.  The "rc" var
317f0 69 61 62 6c 65 0a 20 20 2a 2a 20 73 68 6f 75 6c  iable.  ** shoul
31800 64 20 68 6f 6c 64 20 74 68 65 20 65 72 72 6f 72  d hold the error
31810 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 61 62   number..  */.ab
31820 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
31830 3a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a  :.  assert( p->z
31840 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 20 20 69  ErrMsg==0 );.  i
31850 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
31860 6c 65 64 20 29 20 72 63 20 3d 20 53 51 4c 49 54  led ) rc = SQLIT
31870 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 72  E_NOMEM;.  if( r
31880 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
31890 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c  NOMEM ){.    sql
318a0 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
318b0 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
318c0 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
318d0 74 72 28 72 63 29 29 3b 0a 20 20 7d 0a 20 20 67  tr(rc));.  }.  g
318e0 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68  oto vdbe_error_h
318f0 61 6c 74 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  alt;..  /* Jump 
31900 74 6f 20 68 65 72 65 20 69 66 20 74 68 65 20 73  to here if the s
31910 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
31920 28 29 20 41 50 49 20 73 65 74 73 20 74 68 65 20  () API sets the 
31930 69 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a 20 66  interrupt.  ** f
31940 6c 61 67 2e 0a 20 20 2a 2f 0a 61 62 6f 72 74 5f  lag..  */.abort_
31950 64 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70 74  due_to_interrupt
31960 3a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  :.  assert( db->
31970 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
31980 20 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54   );.  rc = SQLIT
31990 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 70  E_INTERRUPT;.  p
319a0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 73 71 6c  ->rc = rc;.  sql
319b0 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
319c0 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
319d0 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
319e0 74 72 28 72 63 29 29 3b 0a 20 20 67 6f 74 6f 20  tr(rc));.  goto 
319f0 76 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b  vdbe_error_halt;
31a00 0a 7d 0a                                         .}.