/ Hex Artifact Content
Login

Artifact 9c6251931bc32ca8824dd7b89e06eba358a4a536:


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: 69 73 20 6d 61 63 72 6f 20 65 76 61 6c 75 61 74  is macro evaluat
1040: 65 73 20 74 6f 20 74 72 75 65 20 69 66 20 65 69  es to true if ei
1050: 74 68 65 72 20 74 68 65 20 75 70 64 61 74 65 20  ther the update 
1060: 68 6f 6f 6b 20 6f 72 20 74 68 65 20 70 72 65 75  hook or the preu
1070: 70 64 61 74 65 0a 2a 2a 20 68 6f 6f 6b 20 61 72  pdate.** hook ar
1080: 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 64 61  e enabled for da
1090: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 20 44  tabase connect D
10a0: 42 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  B..*/.#ifdef SQL
10b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
10c0: 44 41 54 45 5f 48 4f 4f 4b 0a 23 20 64 65 66 69  DATE_HOOK.# defi
10d0: 6e 65 20 48 41 53 5f 55 50 44 41 54 45 5f 48 4f  ne HAS_UPDATE_HO
10e0: 4f 4b 28 44 42 29 20 20 20 28 28 44 42 29 2d 3e  OK(DB)   ((DB)->
10f0: 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61  xPreUpdateCallba
1100: 63 6b 7c 7c 28 44 42 29 2d 3e 78 55 70 64 61 74  ck||(DB)->xUpdat
1110: 65 43 61 6c 6c 62 61 63 6b 29 0a 23 65 6c 73 65  eCallback).#else
1120: 0a 23 20 64 65 66 69 6e 65 20 48 41 53 5f 55 50  .# define HAS_UP
1130: 44 41 54 45 5f 48 4f 4f 4b 28 44 42 29 20 20 28  DATE_HOOK(DB)  (
1140: 28 44 42 29 2d 3e 78 55 70 64 61 74 65 43 61 6c  (DB)->xUpdateCal
1150: 6c 62 61 63 6b 29 0a 23 65 6e 64 69 66 0a 0a 2f  lback).#endif../
1160: 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c  *.** The next gl
1170: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
1180: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63   incremented eac
1190: 68 20 74 79 70 65 20 74 68 65 20 4f 50 5f 46 6f  h type the OP_Fo
11a0: 75 6e 64 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73  und opcode.** is
11b0: 20 65 78 65 63 75 74 65 64 2e 20 54 68 69 73 20   executed. This 
11c0: 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
11d0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
11e0: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 2a  he foreign key.*
11f0: 2a 20 6f 70 65 72 61 74 69 6f 6e 20 69 6d 70 6c  * operation impl
1200: 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 4f 50  emented using OP
1210: 5f 46 6b 49 73 5a 65 72 6f 20 69 73 20 77 6f 72  _FkIsZero is wor
1220: 6b 69 6e 67 2e 20 54 68 69 73 20 76 61 72 69 61  king. This varia
1230: 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75  ble.** has no fu
1240: 6e 63 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  nction other tha
1250: 6e 20 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79  n to help verify
1260: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
1270: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  ration of the.**
1280: 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66   library..*/.#if
1290: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
12a0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e  int sqlite3_foun
12b0: 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  d_count = 0;.#en
12c0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  dif../*.** Test 
12d0: 61 20 72 65 67 69 73 74 65 72 20 74 6f 20 73 65  a register to se
12e0: 65 20 69 66 20 69 74 20 65 78 63 65 65 64 73 20  e if it exceeds 
12f0: 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69  the current maxi
1300: 6d 75 6d 20 62 6c 6f 62 20 73 69 7a 65 2e 0a 2a  mum blob size..*
1310: 2a 20 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65  * If it does, re
1320: 63 6f 72 64 20 74 68 65 20 6e 65 77 20 6d 61 78  cord the new max
1330: 69 6d 75 6d 20 62 6c 6f 62 20 73 69 7a 65 2e 0a  imum blob size..
1340: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
1350: 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 21  QLITE_TEST) && !
1360: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1370: 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54  MIT_BUILTIN_TEST
1380: 29 0a 23 20 64 65 66 69 6e 65 20 55 50 44 41 54  ).# define UPDAT
1390: 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 50  E_MAX_BLOBSIZE(P
13a0: 29 20 20 75 70 64 61 74 65 4d 61 78 42 6c 6f 62  )  updateMaxBlob
13b0: 73 69 7a 65 28 50 29 0a 23 65 6c 73 65 0a 23 20  size(P).#else.# 
13c0: 64 65 66 69 6e 65 20 55 50 44 41 54 45 5f 4d 41  define UPDATE_MA
13d0: 58 5f 42 4c 4f 42 53 49 5a 45 28 50 29 0a 23 65  X_BLOBSIZE(P).#e
13e0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ndif../*.** Conv
13f0: 65 72 74 20 74 68 65 20 67 69 76 65 6e 20 72 65  ert the given re
1400: 67 69 73 74 65 72 20 69 6e 74 6f 20 61 20 73 74  gister into a st
1410: 72 69 6e 67 20 69 66 20 69 74 20 69 73 6e 27 74  ring if it isn't
1420: 20 6f 6e 65 0a 2a 2a 20 61 6c 72 65 61 64 79 2e   one.** already.
1430: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
1440: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   if a malloc() f
1450: 61 69 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ails..*/.#define
1460: 20 53 74 72 69 6e 67 69 66 79 28 50 2c 20 65 6e   Stringify(P, en
1470: 63 29 20 5c 0a 20 20 20 69 66 28 28 28 50 29 2d  c) \.   if(((P)-
1480: 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c  >flags&(MEM_Str|
1490: 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26  MEM_Blob))==0 &&
14a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
14b0: 74 72 69 6e 67 69 66 79 28 50 2c 65 6e 63 29 29  tringify(P,enc))
14c0: 20 5c 0a 20 20 20 20 20 7b 20 67 6f 74 6f 20 6e   \.     { goto n
14d0: 6f 5f 6d 65 6d 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20  o_mem; }../*.** 
14e0: 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72  An ephemeral str
14f0: 69 6e 67 20 76 61 6c 75 65 20 28 73 69 67 6e 69  ing value (signi
1500: 66 69 65 64 20 62 79 20 74 68 65 20 4d 45 4d 5f  fied by the MEM_
1510: 45 70 68 65 6d 20 66 6c 61 67 29 20 63 6f 6e 74  Ephem flag) cont
1520: 61 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  ains.** a pointe
1530: 72 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c  r to a dynamical
1540: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 74 72  ly allocated str
1550: 69 6e 67 20 77 68 65 72 65 20 73 6f 6d 65 20 6f  ing where some o
1560: 74 68 65 72 20 65 6e 74 69 74 79 0a 2a 2a 20 69  ther entity.** i
1570: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1580: 72 20 64 65 61 6c 6c 6f 63 61 74 69 6e 67 20 74  r deallocating t
1590: 68 61 74 20 73 74 72 69 6e 67 2e 20 20 42 65 63  hat string.  Bec
15a0: 61 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65  ause the registe
15b0: 72 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 63 6f  r.** does not co
15c0: 6e 74 72 6f 6c 20 74 68 65 20 73 74 72 69 6e 67  ntrol the string
15d0: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 65  , it might be de
15e0: 6c 65 74 65 64 20 77 69 74 68 6f 75 74 20 74 68  leted without th
15f0: 65 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6b 6e  e register.** kn
1600: 6f 77 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  owing it..**.** 
1610: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e  This routine con
1620: 76 65 72 74 73 20 61 6e 20 65 70 68 65 6d 65 72  verts an ephemer
1630: 61 6c 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61  al string into a
1640: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
1650: 6f 63 61 74 65 64 0a 2a 2a 20 73 74 72 69 6e 67  ocated.** string
1660: 20 74 68 61 74 20 74 68 65 20 72 65 67 69 73 74   that the regist
1670: 65 72 20 69 74 73 65 6c 66 20 63 6f 6e 74 72 6f  er itself contro
1680: 6c 73 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ls.  In other wo
1690: 72 64 73 2c 20 69 74 0a 2a 2a 20 63 6f 6e 76 65  rds, it.** conve
16a0: 72 74 73 20 61 6e 20 4d 45 4d 5f 45 70 68 65 6d  rts an MEM_Ephem
16b0: 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 6e 20   string into an 
16c0: 4d 45 4d 5f 44 79 6e 20 73 74 72 69 6e 67 2e 0a  MEM_Dyn string..
16d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 44 65 65 70 68  */.#define Deeph
16e0: 65 6d 65 72 61 6c 69 7a 65 28 50 29 20 5c 0a 20  emeralize(P) \. 
16f0: 20 20 69 66 28 20 28 28 50 29 2d 3e 66 6c 61 67    if( ((P)->flag
1700: 73 26 4d 45 4d 5f 45 70 68 65 6d 29 21 3d 30 20  s&MEM_Ephem)!=0 
1710: 5c 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  \.       && sqli
1720: 74 65 33 56 64 62 65 4d 65 6d 4d 61 6b 65 57 72  te3VdbeMemMakeWr
1730: 69 74 65 61 62 6c 65 28 50 29 20 29 7b 20 67 6f  iteable(P) ){ go
1740: 74 6f 20 6e 6f 5f 6d 65 6d 3b 7d 0a 0a 2f 2a 20  to no_mem;}../* 
1750: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
1760: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
1770: 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ened using the O
1780: 50 5f 4f 70 65 6e 53 6f 72 74 65 72 20 6f 70 63  P_OpenSorter opc
1790: 6f 64 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53  ode. */.#ifdef S
17a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 52 47 45  QLITE_OMIT_MERGE
17b0: 5f 53 4f 52 54 0a 23 20 64 65 66 69 6e 65 20 69  _SORT.# define i
17c0: 73 53 6f 72 74 65 72 28 78 29 20 30 0a 23 65 6c  sSorter(x) 0.#el
17d0: 73 65 0a 23 20 64 65 66 69 6e 65 20 69 73 53 6f  se.# define isSo
17e0: 72 74 65 72 28 78 29 20 28 28 78 29 2d 3e 70 53  rter(x) ((x)->pS
17f0: 6f 72 74 65 72 21 3d 30 29 0a 23 65 6e 64 69 66  orter!=0).#endif
1800: 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
1810: 20 70 4d 65 6d 20 70 6f 69 6e 74 73 20 61 74 20   pMem points at 
1820: 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  a register that 
1830: 77 69 6c 6c 20 62 65 20 70 61 73 73 65 64 20 74  will be passed t
1840: 6f 20 61 0a 2a 2a 20 75 73 65 72 2d 64 65 66 69  o a.** user-defi
1850: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20  ned function or 
1860: 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
1870: 75 73 65 72 20 61 73 20 74 68 65 20 72 65 73 75  user as the resu
1880: 6c 74 20 6f 66 20 61 20 71 75 65 72 79 2e 0a 2a  lt of a query..*
1890: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
18a0: 65 74 73 20 74 68 65 20 70 4d 65 6d 2d 3e 74 79  ets the pMem->ty
18b0: 70 65 20 76 61 72 69 61 62 6c 65 20 75 73 65 64  pe variable used
18c0: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
18d0: 76 61 6c 75 65 5f 2a 28 29 20 0a 2a 2a 20 72 6f  value_*() .** ro
18e0: 75 74 69 6e 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  utines..*/.void 
18f0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74  sqlite3VdbeMemSt
1900: 6f 72 65 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65  oreType(Mem *pMe
1910: 6d 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  m){.  int flags 
1920: 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20  = pMem->flags;. 
1930: 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
1940: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4d 65  _Null ){.    pMe
1950: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
1960: 5f 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 65 6c 73  _NULL;.  }.  els
1970: 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45  e if( flags & ME
1980: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 70 4d 65  M_Int ){.    pMe
1990: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
19a0: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 7d 0a 20 20  _INTEGER;.  }.  
19b0: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
19c0: 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
19d0: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
19e0: 4c 49 54 45 5f 46 4c 4f 41 54 3b 0a 20 20 7d 0a  LITE_FLOAT;.  }.
19f0: 20 20 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73    else if( flags
1a00: 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20   & MEM_Str ){.  
1a10: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
1a20: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 7d 65  QLITE_TEXT;.  }e
1a30: 6c 73 65 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  lse{.    pMem->t
1a40: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ype = SQLITE_BLO
1a50: 42 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  B;.  }.}../*.** 
1a60: 41 6c 6c 6f 63 61 74 65 20 56 64 62 65 43 75 72  Allocate VdbeCur
1a70: 73 6f 72 20 6e 75 6d 62 65 72 20 69 43 75 72 2e  sor number iCur.
1a80: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
1a90: 65 72 20 74 6f 20 69 74 2e 20 20 52 65 74 75 72  er to it.  Retur
1aa0: 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 77 65 20  n NULL.** if we 
1ab0: 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
1ac0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 56 64 62  y..*/.static Vdb
1ad0: 65 43 75 72 73 6f 72 20 2a 61 6c 6c 6f 63 61 74  eCursor *allocat
1ae0: 65 43 75 72 73 6f 72 28 0a 20 20 56 64 62 65 20  eCursor(.  Vdbe 
1af0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1b00: 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
1b10: 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  machine */.  int
1b20: 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
1b30: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1b40: 68 65 20 6e 65 77 20 56 64 62 65 43 75 72 73 6f  he new VdbeCurso
1b50: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c  r */.  int nFiel
1b60: 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
1b70: 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  Number of fields
1b80: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
1b90: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
1ba0: 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  iDb,            
1bb0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 68    /* Database th
1bc0: 65 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73  e cursor belongs
1bd0: 20 74 6f 2c 20 6f 72 20 2d 31 20 2a 2f 0a 20 20   to, or -1 */.  
1be0: 69 6e 74 20 69 73 42 74 72 65 65 43 75 72 73 6f  int isBtreeCurso
1bf0: 72 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f  r     /* True fo
1c00: 72 20 42 2d 54 72 65 65 2e 20 20 46 61 6c 73 65  r B-Tree.  False
1c10: 20 66 6f 72 20 70 73 65 75 64 6f 2d 74 61 62 6c   for pseudo-tabl
1c20: 65 20 6f 72 20 76 74 61 62 20 2a 2f 0a 29 7b 0a  e or vtab */.){.
1c30: 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6d 65    /* Find the me
1c40: 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 77  mory cell that w
1c50: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73  ill be used to s
1c60: 74 6f 72 65 20 74 68 65 20 62 6c 6f 62 20 6f 66  tore the blob of
1c70: 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71   memory.  ** req
1c80: 75 69 72 65 64 20 66 6f 72 20 74 68 69 73 20 56  uired for this V
1c90: 64 62 65 43 75 72 73 6f 72 20 73 74 72 75 63 74  dbeCursor struct
1ca0: 75 72 65 2e 20 49 74 20 69 73 20 63 6f 6e 76 65  ure. It is conve
1cb0: 6e 69 65 6e 74 20 74 6f 20 75 73 65 20 61 20 0a  nient to use a .
1cc0: 20 20 2a 2a 20 76 64 62 65 20 6d 65 6d 6f 72 79    ** vdbe memory
1cd0: 20 63 65 6c 6c 20 74 6f 20 6d 61 6e 61 67 65 20   cell to manage 
1ce0: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
1cf0: 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66  ation required f
1d00: 6f 72 20 61 0a 20 20 2a 2a 20 56 64 62 65 43 75  or a.  ** VdbeCu
1d10: 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 20 66  rsor structure f
1d20: 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  or the following
1d30: 20 72 65 61 73 6f 6e 73 3a 0a 20 20 2a 2a 0a 20   reasons:.  **. 
1d40: 20 2a 2a 20 20 20 2a 20 53 6f 6d 65 74 69 6d 65   **   * Sometime
1d50: 73 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  s cursor numbers
1d60: 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 61 20   are used for a 
1d70: 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72  couple of differ
1d80: 65 6e 74 0a 20 20 2a 2a 20 20 20 20 20 70 75 72  ent.  **     pur
1d90: 70 6f 73 65 73 20 69 6e 20 61 20 76 64 62 65 20  poses in a vdbe 
1da0: 70 72 6f 67 72 61 6d 2e 20 54 68 65 20 64 69 66  program. The dif
1db0: 66 65 72 65 6e 74 20 75 73 65 73 20 6d 69 67 68  ferent uses migh
1dc0: 74 20 72 65 71 75 69 72 65 0a 20 20 2a 2a 20 20  t require.  **  
1dd0: 20 20 20 64 69 66 66 65 72 65 6e 74 20 73 69 7a     different siz
1de0: 65 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20  ed allocations. 
1df0: 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 70 72 6f  Memory cells pro
1e00: 76 69 64 65 20 67 72 6f 77 61 62 6c 65 0a 20 20  vide growable.  
1e10: 2a 2a 20 20 20 20 20 61 6c 6c 6f 63 61 74 69 6f  **     allocatio
1e20: 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ns..  **.  **   
1e30: 2a 20 57 68 65 6e 20 75 73 69 6e 67 20 45 4e 41  * When using ENA
1e40: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
1e50: 45 4d 45 4e 54 2c 20 6d 65 6d 6f 72 79 20 63 65  EMENT, memory ce
1e60: 6c 6c 20 62 75 66 66 65 72 73 20 63 61 6e 0a 20  ll buffers can. 
1e70: 20 2a 2a 20 20 20 20 20 62 65 20 66 72 65 65 64   **     be freed
1e80: 20 6c 61 7a 69 6c 79 20 76 69 61 20 74 68 65 20   lazily via the 
1e90: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
1ea0: 6d 65 6d 6f 72 79 28 29 20 41 50 49 2e 20 54 68  memory() API. Th
1eb0: 69 73 0a 20 20 2a 2a 20 20 20 20 20 6d 69 6e 69  is.  **     mini
1ec0: 6d 69 7a 65 73 20 74 68 65 20 6e 75 6d 62 65 72  mizes the number
1ed0: 20 6f 66 20 6d 61 6c 6c 6f 63 20 63 61 6c 6c 73   of malloc calls
1ee0: 20 6d 61 64 65 20 62 79 20 74 68 65 20 73 79 73   made by the sys
1ef0: 74 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  tem..  **.  ** M
1f00: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
1f10: 63 75 72 73 6f 72 73 20 61 72 65 20 61 6c 6c 6f  cursors are allo
1f20: 63 61 74 65 64 20 61 74 20 74 68 65 20 74 6f 70  cated at the top
1f30: 20 6f 66 20 74 68 65 20 61 64 64 72 65 73 73 0a   of the address.
1f40: 20 20 2a 2a 20 73 70 61 63 65 2e 20 4d 65 6d 6f    ** space. Memo
1f50: 72 79 20 63 65 6c 6c 20 28 70 2d 3e 6e 4d 65 6d  ry cell (p->nMem
1f60: 29 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  ) corresponds to
1f70: 20 63 75 72 73 6f 72 20 30 2e 20 53 70 61 63 65   cursor 0. Space
1f80: 20 66 6f 72 0a 20 20 2a 2a 20 63 75 72 73 6f 72   for.  ** cursor
1f90: 20 31 20 69 73 20 6d 61 6e 61 67 65 64 20 62 79   1 is managed by
1fa0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 70 2d   memory cell (p-
1fb0: 3e 6e 4d 65 6d 2d 31 29 2c 20 65 74 63 2e 0a 20  >nMem-1), etc.. 
1fc0: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
1fd0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 2d 3e 6e 4d  = &p->aMem[p->nM
1fe0: 65 6d 2d 69 43 75 72 5d 3b 0a 0a 20 20 69 6e 74  em-iCur];..  int
1ff0: 20 6e 42 79 74 65 3b 0a 20 20 56 64 62 65 43 75   nByte;.  VdbeCu
2000: 72 73 6f 72 20 2a 70 43 78 20 3d 20 30 3b 0a 20  rsor *pCx = 0;. 
2010: 20 6e 42 79 74 65 20 3d 20 0a 20 20 20 20 20 20   nByte = .      
2020: 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 56 64  ROUND8(sizeof(Vd
2030: 62 65 43 75 72 73 6f 72 29 29 20 2b 20 0a 20 20  beCursor)) + .  
2040: 20 20 20 20 28 69 73 42 74 72 65 65 43 75 72 73      (isBtreeCurs
2050: 6f 72 3f 73 71 6c 69 74 65 33 42 74 72 65 65 43  or?sqlite3BtreeC
2060: 75 72 73 6f 72 53 69 7a 65 28 29 3a 30 29 20 2b  ursorSize():0) +
2070: 20 0a 20 20 20 20 20 20 32 2a 6e 46 69 65 6c 64   .      2*nField
2080: 2a 73 69 7a 65 6f 66 28 75 33 32 29 3b 0a 0a 20  *sizeof(u32);.. 
2090: 20 61 73 73 65 72 74 28 20 69 43 75 72 3c 70 2d   assert( iCur<p-
20a0: 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 69 66  >nCursor );.  if
20b0: 28 20 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d  ( p->apCsr[iCur]
20c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
20d0: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c  dbeFreeCursor(p,
20e0: 20 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 29   p->apCsr[iCur])
20f0: 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69  ;.    p->apCsr[i
2100: 43 75 72 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Cur] = 0;.  }.  
2110: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73  if( SQLITE_OK==s
2120: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
2130: 77 28 70 4d 65 6d 2c 20 6e 42 79 74 65 2c 20 30  w(pMem, nByte, 0
2140: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 61 70 43 73  ) ){.    p->apCs
2150: 72 5b 69 43 75 72 5d 20 3d 20 70 43 78 20 3d 20  r[iCur] = pCx = 
2160: 28 56 64 62 65 43 75 72 73 6f 72 2a 29 70 4d 65  (VdbeCursor*)pMe
2170: 6d 2d 3e 7a 3b 0a 20 20 20 20 6d 65 6d 73 65 74  m->z;.    memset
2180: 28 70 43 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (pCx, 0, sizeof(
2190: 56 64 62 65 43 75 72 73 6f 72 29 29 3b 0a 20 20  VdbeCursor));.  
21a0: 20 20 70 43 78 2d 3e 69 44 62 20 3d 20 69 44 62    pCx->iDb = iDb
21b0: 3b 0a 20 20 20 20 70 43 78 2d 3e 6e 46 69 65 6c  ;.    pCx->nFiel
21c0: 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20  d = nField;.    
21d0: 69 66 28 20 6e 46 69 65 6c 64 20 29 7b 0a 20 20  if( nField ){.  
21e0: 20 20 20 20 70 43 78 2d 3e 61 54 79 70 65 20 3d      pCx->aType =
21f0: 20 28 75 33 32 20 2a 29 26 70 4d 65 6d 2d 3e 7a   (u32 *)&pMem->z
2200: 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 56  [ROUND8(sizeof(V
2210: 64 62 65 43 75 72 73 6f 72 29 29 5d 3b 0a 20 20  dbeCursor))];.  
2220: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 42 74    }.    if( isBt
2230: 72 65 65 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  reeCursor ){.   
2240: 20 20 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20     pCx->pCursor 
2250: 3d 20 28 42 74 43 75 72 73 6f 72 2a 29 0a 20 20  = (BtCursor*).  
2260: 20 20 20 20 20 20 20 20 26 70 4d 65 6d 2d 3e 7a          &pMem->z
2270: 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 56  [ROUND8(sizeof(V
2280: 64 62 65 43 75 72 73 6f 72 29 29 2b 32 2a 6e 46  dbeCursor))+2*nF
2290: 69 65 6c 64 2a 73 69 7a 65 6f 66 28 75 33 32 29  ield*sizeof(u32)
22a0: 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
22b0: 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
22c0: 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20  pCx->pCursor);. 
22d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
22e0: 6e 20 70 43 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n pCx;.}../*.** 
22f0: 54 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 61  Try to convert a
2300: 20 76 61 6c 75 65 20 69 6e 74 6f 20 61 20 6e 75   value into a nu
2310: 6d 65 72 69 63 20 72 65 70 72 65 73 65 6e 74 61  meric representa
2320: 74 69 6f 6e 20 69 66 20 77 65 20 63 61 6e 0a 2a  tion if we can.*
2330: 2a 20 64 6f 20 73 6f 20 77 69 74 68 6f 75 74 20  * do so without 
2340: 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72 6d 61 74  loss of informat
2350: 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ion.  In other w
2360: 6f 72 64 73 2c 20 69 66 20 74 68 65 20 73 74 72  ords, if the str
2370: 69 6e 67 0a 2a 2a 20 6c 6f 6f 6b 73 20 6c 69 6b  ing.** looks lik
2380: 65 20 61 20 6e 75 6d 62 65 72 2c 20 63 6f 6e 76  e a number, conv
2390: 65 72 74 20 69 74 20 69 6e 74 6f 20 61 20 6e 75  ert it into a nu
23a0: 6d 62 65 72 2e 20 20 49 66 20 69 74 20 64 6f 65  mber.  If it doe
23b0: 73 20 6e 6f 74 0a 2a 2a 20 6c 6f 6f 6b 20 6c 69  s not.** look li
23c0: 6b 65 20 61 20 6e 75 6d 62 65 72 2c 20 6c 65 61  ke a number, lea
23d0: 76 65 20 69 74 20 61 6c 6f 6e 65 2e 0a 2a 2f 0a  ve it alone..*/.
23e0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 6c  static void appl
23f0: 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  yNumericAffinity
2400: 28 4d 65 6d 20 2a 70 52 65 63 29 7b 0a 20 20 69  (Mem *pRec){.  i
2410: 66 28 20 28 70 52 65 63 2d 3e 66 6c 61 67 73 20  f( (pRec->flags 
2420: 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  & (MEM_Real|MEM_
2430: 49 6e 74 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Int))==0 ){.    
2440: 64 6f 75 62 6c 65 20 72 56 61 6c 75 65 3b 0a 20  double rValue;. 
2450: 20 20 20 69 36 34 20 69 56 61 6c 75 65 3b 0a 20     i64 iValue;. 
2460: 20 20 20 75 38 20 65 6e 63 20 3d 20 70 52 65 63     u8 enc = pRec
2470: 2d 3e 65 6e 63 3b 0a 20 20 20 20 69 66 28 20 28  ->enc;.    if( (
2480: 70 52 65 63 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pRec->flags&MEM_
2490: 53 74 72 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Str)==0 ) return
24a0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
24b0: 33 41 74 6f 46 28 70 52 65 63 2d 3e 7a 2c 20 26  3AtoF(pRec->z, &
24c0: 72 56 61 6c 75 65 2c 20 70 52 65 63 2d 3e 6e 2c  rValue, pRec->n,
24d0: 20 65 6e 63 29 3d 3d 30 20 29 20 72 65 74 75 72   enc)==0 ) retur
24e0: 6e 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71  n;.    if( 0==sq
24f0: 6c 69 74 65 33 41 74 6f 69 36 34 28 70 52 65 63  lite3Atoi64(pRec
2500: 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 2c 20 70 52  ->z, &iValue, pR
2510: 65 63 2d 3e 6e 2c 20 65 6e 63 29 20 29 7b 0a 20  ec->n, enc) ){. 
2520: 20 20 20 20 20 70 52 65 63 2d 3e 75 2e 69 20 3d       pRec->u.i =
2530: 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 70   iValue;.      p
2540: 52 65 63 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45  Rec->flags |= ME
2550: 4d 5f 49 6e 74 3b 0a 20 20 20 20 7d 65 6c 73 65  M_Int;.    }else
2560: 7b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 72 20  {.      pRec->r 
2570: 3d 20 72 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  = rValue;.      
2580: 70 52 65 63 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pRec->flags |= M
2590: 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 7d 0a 20  EM_Real;.    }. 
25a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63   }.}../*.** Proc
25b0: 65 73 73 69 6e 67 20 69 73 20 64 65 74 65 72 6d  essing is determ
25c0: 69 6e 65 20 62 79 20 74 68 65 20 61 66 66 69 6e  ine by the affin
25d0: 69 74 79 20 70 61 72 61 6d 65 74 65 72 3a 0a 2a  ity parameter:.*
25e0: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  *.** SQLITE_AFF_
25f0: 49 4e 54 45 47 45 52 3a 0a 2a 2a 20 53 51 4c 49  INTEGER:.** SQLI
2600: 54 45 5f 41 46 46 5f 52 45 41 4c 3a 0a 2a 2a 20  TE_AFF_REAL:.** 
2610: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
2620: 49 43 3a 0a 2a 2a 20 20 20 20 54 72 79 20 74 6f  IC:.**    Try to
2630: 20 63 6f 6e 76 65 72 74 20 70 52 65 63 20 74 6f   convert pRec to
2640: 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72   an integer repr
2650: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 61 20  esentation or a 
2660: 0a 2a 2a 20 20 20 20 66 6c 6f 61 74 69 6e 67 2d  .**    floating-
2670: 70 6f 69 6e 74 20 72 65 70 72 65 73 65 6e 74 61  point representa
2680: 74 69 6f 6e 20 69 66 20 61 6e 20 69 6e 74 65 67  tion if an integ
2690: 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  er representatio
26a0: 6e 0a 2a 2a 20 20 20 20 69 73 20 6e 6f 74 20 70  n.**    is not p
26b0: 6f 73 73 69 62 6c 65 2e 20 20 4e 6f 74 65 20 74  ossible.  Note t
26c0: 68 61 74 20 74 68 65 20 69 6e 74 65 67 65 72 20  hat the integer 
26d0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
26e0: 73 0a 2a 2a 20 20 20 20 61 6c 77 61 79 73 20 70  s.**    always p
26f0: 72 65 66 65 72 72 65 64 2c 20 65 76 65 6e 20 69  referred, even i
2700: 66 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 69  f the affinity i
2710: 73 20 52 45 41 4c 2c 20 62 65 63 61 75 73 65 0a  s REAL, because.
2720: 2a 2a 20 20 20 20 61 6e 20 69 6e 74 65 67 65 72  **    an integer
2730: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2740: 69 73 20 6d 6f 72 65 20 73 70 61 63 65 20 65 66  is more space ef
2750: 66 69 63 69 65 6e 74 20 6f 6e 20 64 69 73 6b 2e  ficient on disk.
2760: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  .**.** SQLITE_AF
2770: 46 5f 54 45 58 54 3a 0a 2a 2a 20 20 20 20 43 6f  F_TEXT:.**    Co
2780: 6e 76 65 72 74 20 70 52 65 63 20 74 6f 20 61 20  nvert pRec to a 
2790: 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
27a0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ion..**.** SQLIT
27b0: 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 2a 2a 20 20  E_AFF_NONE:.**  
27c0: 20 20 4e 6f 2d 6f 70 2e 20 20 70 52 65 63 20 69    No-op.  pRec i
27d0: 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  s unchanged..*/.
27e0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 6c  static void appl
27f0: 79 41 66 66 69 6e 69 74 79 28 0a 20 20 4d 65 6d  yAffinity(.  Mem
2800: 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20 20 20   *pRec,         
2810: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 74 6f   /* The value to
2820: 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20   apply affinity 
2830: 74 6f 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66  to */.  char aff
2840: 69 6e 69 74 79 2c 20 20 20 20 20 20 2f 2a 20 54  inity,      /* T
2850: 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 62  he affinity to b
2860: 65 20 61 70 70 6c 69 65 64 20 2a 2f 0a 20 20 75  e applied */.  u
2870: 38 20 65 6e 63 20 20 20 20 20 20 20 20 20 20 20  8 enc           
2880: 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 74     /* Use this t
2890: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a  ext encoding */.
28a0: 29 7b 0a 20 20 69 66 28 20 61 66 66 69 6e 69 74  ){.  if( affinit
28b0: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  y==SQLITE_AFF_TE
28c0: 58 54 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c  XT ){.    /* Onl
28d0: 79 20 61 74 74 65 6d 70 74 20 74 68 65 20 63 6f  y attempt the co
28e0: 6e 76 65 72 73 69 6f 6e 20 74 6f 20 54 45 58 54  nversion to TEXT
28f0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
2900: 69 6e 74 65 67 65 72 20 6f 72 20 72 65 61 6c 0a  integer or real.
2910: 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74      ** represent
2920: 61 74 69 6f 6e 20 28 62 6c 6f 62 20 61 6e 64 20  ation (blob and 
2930: 4e 55 4c 4c 20 64 6f 20 6e 6f 74 20 67 65 74 20  NULL do not get 
2940: 63 6f 6e 76 65 72 74 65 64 29 20 62 75 74 20 6e  converted) but n
2950: 6f 20 73 74 72 69 6e 67 0a 20 20 20 20 2a 2a 20  o string.    ** 
2960: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a  representation..
2970: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30      */.    if( 0
2980: 3d 3d 28 70 52 65 63 2d 3e 66 6c 61 67 73 26 4d  ==(pRec->flags&M
2990: 45 4d 5f 53 74 72 29 20 26 26 20 28 70 52 65 63  EM_Str) && (pRec
29a0: 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 52 65 61  ->flags&(MEM_Rea
29b0: 6c 7c 4d 45 4d 5f 49 6e 74 29 29 20 29 7b 0a 20  l|MEM_Int)) ){. 
29c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29d0: 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 70 52 65  MemStringify(pRe
29e0: 63 2c 20 65 6e 63 29 3b 0a 20 20 20 20 7d 0a 20  c, enc);.    }. 
29f0: 20 20 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 26     pRec->flags &
2a00: 3d 20 7e 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d  = ~(MEM_Real|MEM
2a10: 5f 49 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  _Int);.  }else i
2a20: 66 28 20 61 66 66 69 6e 69 74 79 21 3d 53 51 4c  f( affinity!=SQL
2a30: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
2a40: 20 20 20 20 61 73 73 65 72 74 28 20 61 66 66 69      assert( affi
2a50: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
2a60: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 69  _INTEGER || affi
2a70: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
2a80: 5f 52 45 41 4c 0a 20 20 20 20 20 20 20 20 20 20  _REAL.          
2a90: 20 20 20 7c 7c 20 61 66 66 69 6e 69 74 79 3d 3d     || affinity==
2aa0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
2ab0: 49 43 20 29 3b 0a 20 20 20 20 61 70 70 6c 79 4e  IC );.    applyN
2ac0: 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 70  umericAffinity(p
2ad0: 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20 70 52  Rec);.    if( pR
2ae0: 65 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ec->flags & MEM_
2af0: 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Real ){.      sq
2b00: 6c 69 74 65 33 56 64 62 65 49 6e 74 65 67 65 72  lite3VdbeInteger
2b10: 41 66 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a  Affinity(pRec);.
2b20: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
2b30: 2a 2a 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72  ** Try to conver
2b40: 74 20 74 68 65 20 74 79 70 65 20 6f 66 20 61 20  t the type of a 
2b50: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
2b60: 74 20 6f 72 20 61 20 72 65 73 75 6c 74 20 63 6f  t or a result co
2b70: 6c 75 6d 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e  lumn.** into a n
2b80: 75 6d 65 72 69 63 20 72 65 70 72 65 73 65 6e 74  umeric represent
2b90: 61 74 69 6f 6e 2e 20 20 55 73 65 20 65 69 74 68  ation.  Use eith
2ba0: 65 72 20 49 4e 54 45 47 45 52 20 6f 72 20 52 45  er INTEGER or RE
2bb0: 41 4c 20 77 68 69 63 68 65 76 65 72 0a 2a 2a 20  AL whichever.** 
2bc0: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  is appropriate. 
2bd0: 20 42 75 74 20 6f 6e 6c 79 20 64 6f 20 74 68 65   But only do the
2be0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 66 20 69   conversion if i
2bf0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 77 69  t is possible wi
2c00: 74 68 6f 75 74 0a 2a 2a 20 6c 6f 73 73 20 6f 66  thout.** loss of
2c10: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64   information and
2c20: 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 76 69   return the revi
2c30: 73 65 64 20 74 79 70 65 20 6f 66 20 74 68 65 20  sed type of the 
2c40: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
2c50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e   sqlite3_value_n
2c60: 75 6d 65 72 69 63 5f 74 79 70 65 28 73 71 6c 69  umeric_type(sqli
2c70: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29  te3_value *pVal)
2c80: 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  {.  Mem *pMem = 
2c90: 28 4d 65 6d 2a 29 70 56 61 6c 3b 0a 20 20 69 66  (Mem*)pVal;.  if
2ca0: 28 20 70 4d 65 6d 2d 3e 74 79 70 65 3d 3d 53 51  ( pMem->type==SQ
2cb0: 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20  LITE_TEXT ){.   
2cc0: 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66   applyNumericAff
2cd0: 69 6e 69 74 79 28 70 4d 65 6d 29 3b 0a 20 20 20  inity(pMem);.   
2ce0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
2cf0: 74 6f 72 65 54 79 70 65 28 70 4d 65 6d 29 3b 0a  toreType(pMem);.
2d00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4d 65    }.  return pMe
2d10: 6d 2d 3e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  m->type;.}../*.*
2d20: 2a 20 45 78 70 6f 72 74 65 64 20 76 65 72 73 69  * Exported versi
2d30: 6f 6e 20 6f 66 20 61 70 70 6c 79 41 66 66 69 6e  on of applyAffin
2d40: 69 74 79 28 29 2e 20 54 68 69 73 20 6f 6e 65 20  ity(). This one 
2d50: 77 6f 72 6b 73 20 6f 6e 20 73 71 6c 69 74 65 33  works on sqlite3
2d60: 5f 76 61 6c 75 65 2a 2c 20 0a 2a 2a 20 6e 6f 74  _value*, .** not
2d70: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 4d 65   the internal Me
2d80: 6d 2a 20 74 79 70 65 2e 0a 2a 2f 0a 76 6f 69 64  m* type..*/.void
2d90: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70   sqlite3ValueApp
2da0: 6c 79 41 66 66 69 6e 69 74 79 28 0a 20 20 73 71  lyAffinity(.  sq
2db0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
2dc0: 6c 2c 20 0a 20 20 75 38 20 61 66 66 69 6e 69 74  l, .  u8 affinit
2dd0: 79 2c 20 0a 20 20 75 38 20 65 6e 63 0a 29 7b 0a  y, .  u8 enc.){.
2de0: 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28    applyAffinity(
2df0: 28 4d 65 6d 20 2a 29 70 56 61 6c 2c 20 61 66 66  (Mem *)pVal, aff
2e00: 69 6e 69 74 79 2c 20 65 6e 63 29 3b 0a 7d 0a 0a  inity, enc);.}..
2e10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2e20: 42 55 47 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  BUG./*.** Write 
2e30: 61 20 6e 69 63 65 20 73 74 72 69 6e 67 20 72 65  a nice string re
2e40: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
2e50: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2e60: 63 65 6c 6c 20 70 4d 65 6d 0a 2a 2a 20 69 6e 74  cell pMem.** int
2e70: 6f 20 62 75 66 66 65 72 20 7a 42 75 66 2c 20 6c  o buffer zBuf, l
2e80: 65 6e 67 74 68 20 6e 42 75 66 2e 0a 2a 2f 0a 76  ength nBuf..*/.v
2e90: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
2ea0: 65 6d 50 72 65 74 74 79 50 72 69 6e 74 28 4d 65  emPrettyPrint(Me
2eb0: 6d 20 2a 70 4d 65 6d 2c 20 63 68 61 72 20 2a 7a  m *pMem, char *z
2ec0: 42 75 66 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43  Buf){.  char *zC
2ed0: 73 72 20 3d 20 7a 42 75 66 3b 0a 20 20 69 6e 74  sr = zBuf;.  int
2ee0: 20 66 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   f = pMem->flags
2ef0: 3b 0a 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ;..  static cons
2f00: 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 65 6e  t char *const en
2f10: 63 6e 61 6d 65 73 5b 5d 20 3d 20 7b 22 28 58 29  cnames[] = {"(X)
2f20: 22 2c 20 22 28 38 29 22 2c 20 22 28 31 36 4c 45  ", "(8)", "(16LE
2f30: 29 22 2c 20 22 28 31 36 42 45 29 22 7d 3b 0a 0a  )", "(16BE)"};..
2f40: 20 20 69 66 28 20 66 26 4d 45 4d 5f 42 6c 6f 62    if( f&MEM_Blob
2f50: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
2f60: 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 69     char c;.    i
2f70: 66 28 20 66 20 26 20 4d 45 4d 5f 44 79 6e 20 29  f( f & MEM_Dyn )
2f80: 7b 0a 20 20 20 20 20 20 63 20 3d 20 27 7a 27 3b  {.      c = 'z';
2f90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
2fa0: 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c  f & (MEM_Static|
2fb0: 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20 29  MEM_Ephem))==0 )
2fc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2fd0: 66 20 26 20 4d 45 4d 5f 53 74 61 74 69 63 20 29  f & MEM_Static )
2fe0: 7b 0a 20 20 20 20 20 20 63 20 3d 20 27 74 27 3b  {.      c = 't';
2ff0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
3000: 66 20 26 20 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  f & (MEM_Dyn|MEM
3010: 5f 45 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20  _Ephem))==0 );. 
3020: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26     }else if( f &
3030: 20 4d 45 4d 5f 45 70 68 65 6d 20 29 7b 0a 20 20   MEM_Ephem ){.  
3040: 20 20 20 20 63 20 3d 20 27 65 27 3b 0a 20 20 20      c = 'e';.   
3050: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20     assert( (f & 
3060: 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f  (MEM_Static|MEM_
3070: 44 79 6e 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Dyn))==0 );.    
3080: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 20 3d  }else{.      c =
3090: 20 27 73 27 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   's';.    }..   
30a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
30b0: 66 28 31 30 30 2c 20 7a 43 73 72 2c 20 22 25 63  f(100, zCsr, "%c
30c0: 22 2c 20 63 29 3b 0a 20 20 20 20 7a 43 73 72 20  ", c);.    zCsr 
30d0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
30e0: 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 73 71  30(zCsr);.    sq
30f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
3100: 30 30 2c 20 7a 43 73 72 2c 20 22 25 64 5b 22 2c  00, zCsr, "%d[",
3110: 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7a   pMem->n);.    z
3120: 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  Csr += sqlite3St
3130: 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20  rlen30(zCsr);.  
3140: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 36 20    for(i=0; i<16 
3150: 26 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b 20 69 2b  && i<pMem->n; i+
3160: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
3170: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20  3_snprintf(100, 
3180: 7a 43 73 72 2c 20 22 25 30 32 58 22 2c 20 28 28  zCsr, "%02X", ((
3190: 69 6e 74 29 70 4d 65 6d 2d 3e 7a 5b 69 5d 20 26  int)pMem->z[i] &
31a0: 20 30 78 46 46 29 29 3b 0a 20 20 20 20 20 20 7a   0xFF));.      z
31b0: 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  Csr += sqlite3St
31c0: 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20  rlen30(zCsr);.  
31d0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
31e0: 20 69 3c 31 36 20 26 26 20 69 3c 70 4d 65 6d 2d   i<16 && i<pMem-
31f0: 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  >n; i++){.      
3200: 63 68 61 72 20 7a 20 3d 20 70 4d 65 6d 2d 3e 7a  char z = pMem->z
3210: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [i];.      if( z
3220: 3c 33 32 20 7c 7c 20 7a 3e 31 32 36 20 29 20 2a  <32 || z>126 ) *
3230: 7a 43 73 72 2b 2b 20 3d 20 27 2e 27 3b 0a 20 20  zCsr++ = '.';.  
3240: 20 20 20 20 65 6c 73 65 20 2a 7a 43 73 72 2b 2b      else *zCsr++
3250: 20 3d 20 7a 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = z;.    }..   
3260: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
3270: 66 28 31 30 30 2c 20 7a 43 73 72 2c 20 22 5d 25  f(100, zCsr, "]%
3280: 73 22 2c 20 65 6e 63 6e 61 6d 65 73 5b 70 4d 65  s", encnames[pMe
3290: 6d 2d 3e 65 6e 63 5d 29 3b 0a 20 20 20 20 7a 43  m->enc]);.    zC
32a0: 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  sr += sqlite3Str
32b0: 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20 20  len30(zCsr);.   
32c0: 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 5a 65 72   if( f & MEM_Zer
32d0: 6f 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  o ){.      sqlit
32e0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c  e3_snprintf(100,
32f0: 20 7a 43 73 72 2c 22 2b 25 64 7a 22 2c 70 4d 65   zCsr,"+%dz",pMe
3300: 6d 2d 3e 75 2e 6e 5a 65 72 6f 29 3b 0a 20 20 20  m->u.nZero);.   
3310: 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74     zCsr += sqlit
3320: 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29  e3Strlen30(zCsr)
3330: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 43 73  ;.    }.    *zCs
3340: 72 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c 73  r = '\0';.  }els
3350: 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 53 74  e if( f & MEM_St
3360: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20  r ){.    int j, 
3370: 6b 3b 0a 20 20 20 20 7a 42 75 66 5b 30 5d 20 3d  k;.    zBuf[0] =
3380: 20 27 20 27 3b 0a 20 20 20 20 69 66 28 20 66 20   ' ';.    if( f 
3390: 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20  & MEM_Dyn ){.   
33a0: 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 7a 27     zBuf[1] = 'z'
33b0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
33c0: 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69 63  (f & (MEM_Static
33d0: 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20  |MEM_Ephem))==0 
33e0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
33f0: 20 66 20 26 20 4d 45 4d 5f 53 74 61 74 69 63 20   f & MEM_Static 
3400: 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d  ){.      zBuf[1]
3410: 20 3d 20 27 74 27 3b 0a 20 20 20 20 20 20 61 73   = 't';.      as
3420: 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f  sert( (f & (MEM_
3430: 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d  Dyn|MEM_Ephem))=
3440: 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  =0 );.    }else 
3450: 69 66 28 20 66 20 26 20 4d 45 4d 5f 45 70 68 65  if( f & MEM_Ephe
3460: 6d 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b  m ){.      zBuf[
3470: 31 5d 20 3d 20 27 65 27 3b 0a 20 20 20 20 20 20  1] = 'e';.      
3480: 61 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45  assert( (f & (ME
3490: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 44 79 6e  M_Static|MEM_Dyn
34a0: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c  ))==0 );.    }el
34b0: 73 65 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31  se{.      zBuf[1
34c0: 5d 20 3d 20 27 73 27 3b 0a 20 20 20 20 7d 0a 20  ] = 's';.    }. 
34d0: 20 20 20 6b 20 3d 20 32 3b 0a 20 20 20 20 73 71     k = 2;.    sq
34e0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
34f0: 30 30 2c 20 26 7a 42 75 66 5b 6b 5d 2c 20 22 25  00, &zBuf[k], "%
3500: 64 22 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20  d", pMem->n);.  
3510: 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    k += sqlite3St
3520: 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b 6b 5d 29  rlen30(&zBuf[k])
3530: 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20  ;.    zBuf[k++] 
3540: 3d 20 27 5b 27 3b 0a 20 20 20 20 66 6f 72 28 6a  = '[';.    for(j
3550: 3d 30 3b 20 6a 3c 31 35 20 26 26 20 6a 3c 70 4d  =0; j<15 && j<pM
3560: 65 6d 2d 3e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  em->n; j++){.   
3570: 20 20 20 75 38 20 63 20 3d 20 70 4d 65 6d 2d 3e     u8 c = pMem->
3580: 7a 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  z[j];.      if( 
3590: 63 3e 3d 30 78 32 30 20 26 26 20 63 3c 30 78 37  c>=0x20 && c<0x7
35a0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 75  f ){.        zBu
35b0: 66 5b 6b 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  f[k++] = c;.    
35c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35d0: 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27 2e 27   zBuf[k++] = '.'
35e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
35f0: 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20      zBuf[k++] = 
3600: 27 5d 27 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ']';.    sqlite3
3610: 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 26 7a  _snprintf(100,&z
3620: 42 75 66 5b 6b 5d 2c 20 65 6e 63 6e 61 6d 65 73  Buf[k], encnames
3630: 5b 70 4d 65 6d 2d 3e 65 6e 63 5d 29 3b 0a 20 20  [pMem->enc]);.  
3640: 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    k += sqlite3St
3650: 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b 6b 5d 29  rlen30(&zBuf[k])
3660: 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20  ;.    zBuf[k++] 
3670: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  = 0;.  }.}.#endi
3680: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
3690: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69  _DEBUG./*.** Pri
36a0: 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nt the value of 
36b0: 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  a register for t
36c0: 72 61 63 69 6e 67 20 70 75 72 70 6f 73 65 73 3a  racing purposes:
36d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
36e0: 6d 65 6d 54 72 61 63 65 50 72 69 6e 74 28 46 49  memTracePrint(FI
36f0: 4c 45 20 2a 6f 75 74 2c 20 4d 65 6d 20 2a 70 29  LE *out, Mem *p)
3700: 7b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  {.  if( p->flags
3710: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
3720: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
3730: 22 20 4e 55 4c 4c 22 29 3b 0a 20 20 7d 65 6c 73  " NULL");.  }els
3740: 65 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20  e if( (p->flags 
3750: 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 53  & (MEM_Int|MEM_S
3760: 74 72 29 29 3d 3d 28 4d 45 4d 5f 49 6e 74 7c 4d  tr))==(MEM_Int|M
3770: 45 4d 5f 53 74 72 29 20 29 7b 0a 20 20 20 20 66  EM_Str) ){.    f
3780: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 73 69  printf(out, " si
3790: 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e 69 29 3b  :%lld", p->u.i);
37a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
37b0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
37c0: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
37d0: 75 74 2c 20 22 20 69 3a 25 6c 6c 64 22 2c 20 70  ut, " i:%lld", p
37e0: 2d 3e 75 2e 69 29 3b 0a 23 69 66 6e 64 65 66 20  ->u.i);.#ifndef 
37f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
3800: 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 7d 65 6c  TING_POINT.  }el
3810: 73 65 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20  se if( p->flags 
3820: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
3830: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
3840: 20 72 3a 25 67 22 2c 20 70 2d 3e 72 29 3b 0a 23   r:%g", p->r);.#
3850: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66  endif.  }else if
3860: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
3870: 5f 52 6f 77 53 65 74 20 29 7b 0a 20 20 20 20 66  _RowSet ){.    f
3880: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 28 72  printf(out, " (r
3890: 6f 77 73 65 74 29 22 29 3b 0a 20 20 7d 65 6c 73  owset)");.  }els
38a0: 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  e{.    char zBuf
38b0: 5b 32 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  [200];.    sqlit
38c0: 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79 50  e3VdbeMemPrettyP
38d0: 72 69 6e 74 28 70 2c 20 7a 42 75 66 29 3b 0a 20  rint(p, zBuf);. 
38e0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
38f0: 22 20 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  " ");.    fprint
3900: 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 42 75  f(out, "%s", zBu
3910: 66 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  f);.  }.}.static
3920: 20 76 6f 69 64 20 72 65 67 69 73 74 65 72 54 72   void registerTr
3930: 61 63 65 28 46 49 4c 45 20 2a 6f 75 74 2c 20 69  ace(FILE *out, i
3940: 6e 74 20 69 52 65 67 2c 20 4d 65 6d 20 2a 70 29  nt iReg, Mem *p)
3950: 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  {.  fprintf(out,
3960: 20 22 52 45 47 5b 25 64 5d 20 3d 20 22 2c 20 69   "REG[%d] = ", i
3970: 52 65 67 29 3b 0a 20 20 6d 65 6d 54 72 61 63 65  Reg);.  memTrace
3980: 50 72 69 6e 74 28 6f 75 74 2c 20 70 29 3b 0a 20  Print(out, p);. 
3990: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
39a0: 6e 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  n");.}.#endif..#
39b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
39c0: 55 47 0a 23 20 20 64 65 66 69 6e 65 20 52 45 47  UG.#  define REG
39d0: 49 53 54 45 52 5f 54 52 41 43 45 28 52 2c 4d 29  ISTER_TRACE(R,M)
39e0: 20 69 66 28 70 2d 3e 74 72 61 63 65 29 72 65 67   if(p->trace)reg
39f0: 69 73 74 65 72 54 72 61 63 65 28 70 2d 3e 74 72  isterTrace(p->tr
3a00: 61 63 65 2c 52 2c 4d 29 0a 23 65 6c 73 65 0a 23  ace,R,M).#else.#
3a10: 20 20 64 65 66 69 6e 65 20 52 45 47 49 53 54 45    define REGISTE
3a20: 52 5f 54 52 41 43 45 28 52 2c 4d 29 0a 23 65 6e  R_TRACE(R,M).#en
3a30: 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 56 44 42  dif...#ifdef VDB
3a40: 45 5f 50 52 4f 46 49 4c 45 0a 0a 2f 2a 20 0a 2a  E_PROFILE../* .*
3a50: 2a 20 68 77 74 69 6d 65 2e 68 20 63 6f 6e 74 61  * hwtime.h conta
3a60: 69 6e 73 20 69 6e 6c 69 6e 65 20 61 73 73 65 6d  ins inline assem
3a70: 62 6c 65 72 20 63 6f 64 65 20 66 6f 72 20 69 6d  bler code for im
3a80: 70 6c 65 6d 65 6e 74 69 6e 67 20 0a 2a 2a 20 68  plementing .** h
3a90: 69 67 68 2d 70 65 72 66 6f 72 6d 61 6e 63 65 20  igh-performance 
3aa0: 74 69 6d 69 6e 67 20 72 6f 75 74 69 6e 65 73 2e  timing routines.
3ab0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 68 77  .*/.#include "hw
3ac0: 74 69 6d 65 2e 68 22 0a 0a 23 65 6e 64 69 66 0a  time.h"..#endif.
3ad0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
3ae0: 5f 46 4f 52 5f 49 4e 54 45 52 52 55 50 54 20 6d  _FOR_INTERRUPT m
3af0: 61 63 72 6f 20 64 65 66 69 6e 65 64 20 68 65 72  acro defined her
3b00: 65 20 6c 6f 6f 6b 73 20 74 6f 20 73 65 65 20 69  e looks to see i
3b10: 66 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  f the.** sqlite3
3b20: 5f 69 6e 74 65 72 72 75 70 74 28 29 20 72 6f 75  _interrupt() rou
3b30: 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61  tine has been ca
3b40: 6c 6c 65 64 2e 20 20 49 66 20 69 74 20 68 61 73  lled.  If it has
3b50: 20 62 65 65 6e 2c 20 74 68 65 6e 0a 2a 2a 20 70   been, then.** p
3b60: 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65  rocessing of the
3b70: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 69 73   VDBE program is
3b80: 20 69 6e 74 65 72 72 75 70 74 65 64 2e 0a 2a 2a   interrupted..**
3b90: 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 61  .** This macro a
3ba0: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 69 6e  dded to every in
3bb0: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 64  struction that d
3bc0: 6f 65 73 20 61 20 6a 75 6d 70 20 69 6e 20 6f 72  oes a jump in or
3bd0: 64 65 72 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  der to.** implem
3be0: 65 6e 74 20 61 20 6c 6f 6f 70 2e 20 20 54 68 69  ent a loop.  Thi
3bf0: 73 20 74 65 73 74 20 75 73 65 64 20 74 6f 20 62  s test used to b
3c00: 65 20 6f 6e 20 65 76 65 72 79 20 73 69 6e 67 6c  e on every singl
3c10: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 0a 2a  e instruction,.*
3c20: 2a 20 62 75 74 20 74 68 61 74 20 6d 65 61 6e 74  * but that meant
3c30: 20 77 65 20 6d 6f 72 65 20 74 65 73 74 69 6e 67   we more testing
3c40: 20 74 68 61 6e 20 77 65 20 6e 65 65 64 65 64 2e   than we needed.
3c50: 20 20 42 79 20 6f 6e 6c 79 20 74 65 73 74 69 6e    By only testin
3c60: 67 20 74 68 65 0a 2a 2a 20 66 6c 61 67 20 6f 6e  g the.** flag on
3c70: 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   jump instructio
3c80: 6e 73 2c 20 77 65 20 67 65 74 20 61 20 28 73 6d  ns, we get a (sm
3c90: 61 6c 6c 29 20 73 70 65 65 64 20 69 6d 70 72 6f  all) speed impro
3ca0: 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  vement..*/.#defi
3cb0: 6e 65 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54  ne CHECK_FOR_INT
3cc0: 45 52 52 55 50 54 20 5c 0a 20 20 20 69 66 28 20  ERRUPT \.   if( 
3cd0: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
3ce0: 70 74 65 64 20 29 20 67 6f 74 6f 20 61 62 6f 72  pted ) goto abor
3cf0: 74 5f 64 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75  t_due_to_interru
3d00: 70 74 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 4e 44  pt;...#ifndef ND
3d10: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EBUG./*.** This 
3d20: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
3d30: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
3d40: 68 69 6e 20 61 6e 20 61 73 73 65 72 74 28 29 20  hin an assert() 
3d50: 65 78 70 72 65 73 73 69 6f 6e 2e 20 49 74 0a 2a  expression. It.*
3d60: 2a 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68  * checks that th
3d70: 65 20 73 71 6c 69 74 65 33 2e 6e 54 72 61 6e 73  e sqlite3.nTrans
3d80: 61 63 74 69 6f 6e 20 76 61 72 69 61 62 6c 65 20  action variable 
3d90: 69 73 20 63 6f 72 72 65 63 74 6c 79 20 73 65 74  is correctly set
3da0: 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   to.** the numbe
3db0: 72 20 6f 66 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  r of non-transac
3dc0: 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  tion savepoints 
3dd0: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
3de0: 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
3df0: 20 73 74 61 72 74 69 6e 67 20 61 74 20 73 71 6c   starting at sql
3e00: 69 74 65 33 2e 70 53 61 76 65 70 6f 69 6e 74 2e  ite3.pSavepoint.
3e10: 0a 2a 2a 20 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a  .** .** Usage:.*
3e20: 2a 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  *.**     assert(
3e30: 20 63 68 65 63 6b 53 61 76 65 70 6f 69 6e 74 43   checkSavepointC
3e40: 6f 75 6e 74 28 64 62 29 20 29 3b 0a 2a 2f 0a 73  ount(db) );.*/.s
3e50: 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 53  tatic int checkS
3e60: 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28 73 71  avepointCount(sq
3e70: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
3e80: 74 20 6e 20 3d 20 30 3b 0a 20 20 53 61 76 65 70  t n = 0;.  Savep
3e90: 6f 69 6e 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70  oint *p;.  for(p
3ea0: 3d 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b  =db->pSavepoint;
3eb0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 20   p; p=p->pNext) 
3ec0: 6e 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  n++;.  assert( n
3ed0: 3d 3d 28 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  ==(db->nSavepoin
3ee0: 74 20 2b 20 64 62 2d 3e 69 73 54 72 61 6e 73 61  t + db->isTransa
3ef0: 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 29 20  ctionSavepoint) 
3f00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
3f10: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
3f20: 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65  ransfer error me
3f30: 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20  ssage text from 
3f40: 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e  an sqlite3_vtab.
3f50: 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74  zErrMsg (text st
3f60: 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  ored.** in memor
3f70: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
3f80: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
3f90: 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72  into a Vdbe.zErr
3fa0: 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64  Msg (text stored
3fb0: 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  .** in memory ob
3fc0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
3fd0: 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f  te3DbMalloc)..*/
3fe0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6d 70  .static void imp
3ff0: 6f 72 74 56 74 61 62 45 72 72 4d 73 67 28 56 64  ortVtabErrMsg(Vd
4000: 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76  be *p, sqlite3_v
4010: 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73  tab *pVtab){.  s
4020: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
4030: 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  db;.  sqlite3DbF
4040: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
4050: 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
4060: 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  g = sqlite3DbStr
4070: 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a  Dup(db, pVtab->z
4080: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
4090: 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
40a0: 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62  ErrMsg);.  pVtab
40b0: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d  ->zErrMsg = 0;.}
40c0: 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  .../*.** Execute
40d0: 20 61 73 20 6d 75 63 68 20 6f 66 20 61 20 56 44   as much of a VD
40e0: 42 45 20 70 72 6f 67 72 61 6d 20 61 73 20 77 65  BE program as we
40f0: 20 63 61 6e 20 74 68 65 6e 20 72 65 74 75 72 6e   can then return
4100: 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  ..**.** sqlite3V
4110: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 6d  dbeMakeReady() m
4120: 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
4130: 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
4140: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a  e in order to.**
4150: 20 63 6c 6f 73 65 20 74 68 65 20 70 72 6f 67 72   close the progr
4160: 61 6d 20 77 69 74 68 20 61 20 66 69 6e 61 6c 20  am with a final 
4170: 4f 50 5f 48 61 6c 74 20 61 6e 64 20 74 6f 20 73  OP_Halt and to s
4180: 65 74 20 75 70 20 74 68 65 20 63 61 6c 6c 62 61  et up the callba
4190: 63 6b 73 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65  cks.** and the e
41a0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 70 6f 69  rror message poi
41b0: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  nter..**.** When
41c0: 65 76 65 72 20 61 20 72 6f 77 20 6f 72 20 72 65  ever a row or re
41d0: 73 75 6c 74 20 64 61 74 61 20 69 73 20 61 76 61  sult data is ava
41e0: 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 72 6f 75  ilable, this rou
41f0: 74 69 6e 65 20 77 69 6c 6c 20 65 69 74 68 65 72  tine will either
4200: 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 72  .** invoke the r
4210: 65 73 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20 28  esult callback (
4220: 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 29  if there is one)
4230: 20 6f 72 20 72 65 74 75 72 6e 20 77 69 74 68 0a   or return with.
4240: 2a 2a 20 53 51 4c 49 54 45 5f 52 4f 57 2e 0a 2a  ** SQLITE_ROW..*
4250: 2a 0a 2a 2a 20 49 66 20 61 6e 20 61 74 74 65 6d  *.** If an attem
4260: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 70  pt is made to op
4270: 65 6e 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61  en a locked data
4280: 62 61 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20  base, then this 
4290: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 69 6c 6c 20  routine.** will 
42a0: 65 69 74 68 65 72 20 69 6e 76 6f 6b 65 20 74 68  either invoke th
42b0: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
42c0: 28 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65  (if there is one
42d0: 29 20 6f 72 20 69 74 20 77 69 6c 6c 0a 2a 2a 20  ) or it will.** 
42e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
42f0: 53 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  SY..**.** If an 
4300: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
4310: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
4320: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6d 65 6d  s written to mem
4330: 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20  ory obtained.** 
4340: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
4350: 6c 6f 63 28 29 20 61 6e 64 20 70 2d 3e 7a 45 72  loc() and p->zEr
4360: 72 4d 73 67 20 69 73 20 6d 61 64 65 20 74 6f 20  rMsg is made to 
4370: 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 6d 65  point to that me
4380: 6d 6f 72 79 2e 0a 2a 2a 20 54 68 65 20 65 72 72  mory..** The err
4390: 6f 72 20 63 6f 64 65 20 69 73 20 73 74 6f 72 65  or code is store
43a0: 64 20 69 6e 20 70 2d 3e 72 63 20 61 6e 64 20 74  d in p->rc and t
43b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
43c0: 72 6e 73 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  rns SQLITE_ERROR
43d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
43e0: 61 6c 6c 62 61 63 6b 20 65 76 65 72 20 72 65 74  allback ever ret
43f0: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
4400: 68 65 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 20  hen the program 
4410: 65 78 69 74 73 0a 2a 2a 20 69 6d 6d 65 64 69 61  exits.** immedia
4420: 74 65 6c 79 2e 20 20 54 68 65 72 65 20 77 69 6c  tely.  There wil
4430: 6c 20 62 65 20 6e 6f 20 65 72 72 6f 72 20 6d 65  l be no error me
4440: 73 73 61 67 65 20 62 75 74 20 74 68 65 20 70 2d  ssage but the p-
4450: 3e 72 63 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20  >rc field is.** 
4460: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 42  set to SQLITE_AB
4470: 4f 52 54 20 61 6e 64 20 74 68 69 73 20 72 6f 75  ORT and this rou
4480: 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
4490: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a   SQLITE_ERROR..*
44a0: 2a 0a 2a 2a 20 41 20 6d 65 6d 6f 72 79 20 61 6c  *.** A memory al
44b0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 63  location error c
44c0: 61 75 73 65 73 20 70 2d 3e 72 63 20 74 6f 20 62  auses p->rc to b
44d0: 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  e set to SQLITE_
44e0: 4e 4f 4d 45 4d 20 61 6e 64 20 74 68 69 73 0a 2a  NOMEM and this.*
44f0: 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 74  * routine to ret
4500: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
4510: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 20 66 61  ..**.** Other fa
4520: 74 61 6c 20 65 72 72 6f 72 73 20 72 65 74 75 72  tal errors retur
4530: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
4540: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  **.** After this
4550: 20 72 6f 75 74 69 6e 65 20 68 61 73 20 66 69 6e   routine has fin
4560: 69 73 68 65 64 2c 20 73 71 6c 69 74 65 33 56 64  ished, sqlite3Vd
4570: 62 65 46 69 6e 61 6c 69 7a 65 28 29 20 73 68 6f  beFinalize() sho
4580: 75 6c 64 20 62 65 0a 2a 2a 20 75 73 65 64 20 74  uld be.** used t
4590: 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 6d  o clean up the m
45a0: 65 73 73 20 74 68 61 74 20 77 61 73 20 6c 65 66  ess that was lef
45b0: 74 20 62 65 68 69 6e 64 2e 0a 2a 2f 0a 69 6e 74  t behind..*/.int
45c0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
45d0: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20  (.  Vdbe *p     
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
45f0: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
4600: 0a 20 20 69 6e 74 20 70 63 3d 30 3b 20 20 20 20  .  int pc=0;    
4610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4620: 20 54 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75   The program cou
4630: 6e 74 65 72 20 2a 2f 0a 20 20 4f 70 20 2a 61 4f  nter */.  Op *aO
4640: 70 20 3d 20 70 2d 3e 61 4f 70 3b 20 20 20 20 20  p = p->aOp;     
4650: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
4660: 70 2d 3e 61 4f 70 20 2a 2f 0a 20 20 4f 70 20 2a  p->aOp */.  Op *
4670: 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  pOp;            
4680: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4690: 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  t operation */. 
46a0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
46b0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  _OK;        /* V
46c0: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
46d0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
46e0: 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f  = p->db;       /
46f0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a  * The database *
4700: 2f 0a 20 20 75 38 20 72 65 73 65 74 53 63 68 65  /.  u8 resetSche
4710: 6d 61 4f 6e 46 61 75 6c 74 20 3d 20 30 3b 20 2f  maOnFault = 0; /
4720: 2a 20 52 65 73 65 74 20 73 63 68 65 6d 61 20 61  * Reset schema a
4730: 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69 66  fter an error if
4740: 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 75   positive */.  u
4750: 38 20 65 6e 63 6f 64 69 6e 67 20 3d 20 45 4e 43  8 encoding = ENC
4760: 28 64 62 29 3b 20 20 20 20 20 2f 2a 20 54 68 65  (db);     /* The
4770: 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69   database encodi
4780: 6e 67 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ng */.#ifndef SQ
4790: 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
47a0: 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 69 6e  SS_CALLBACK.  in
47b0: 74 20 63 68 65 63 6b 50 72 6f 67 72 65 73 73 3b  t checkProgress;
47c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
47d0: 20 69 66 20 70 72 6f 67 72 65 73 73 20 63 61 6c   if progress cal
47e0: 6c 62 61 63 6b 73 20 61 72 65 20 65 6e 61 62 6c  lbacks are enabl
47f0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 6f  ed */.  int nPro
4800: 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 20 20 20  gressOps = 0;   
4810: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 73 20 65 78     /* Opcodes ex
4820: 65 63 75 74 65 64 20 73 69 6e 63 65 20 70 72 6f  ecuted since pro
4830: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 2e 20  gress callback. 
4840: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 4d 65 6d 20  */.#endif.  Mem 
4850: 2a 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b  *aMem = p->aMem;
4860: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
4870: 66 20 70 2d 3e 61 4d 65 6d 20 2a 2f 0a 20 20 4d  f p->aMem */.  M
4880: 65 6d 20 2a 70 49 6e 31 20 3d 20 30 3b 20 20 20  em *pIn1 = 0;   
4890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 73 74            /* 1st
48a0: 20 69 6e 70 75 74 20 6f 70 65 72 61 6e 64 20 2a   input operand *
48b0: 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 32 20 3d 20  /.  Mem *pIn2 = 
48c0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
48d0: 2a 20 32 6e 64 20 69 6e 70 75 74 20 6f 70 65 72  * 2nd input oper
48e0: 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49  and */.  Mem *pI
48f0: 6e 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  n3 = 0;         
4900: 20 20 20 20 2f 2a 20 33 72 64 20 69 6e 70 75 74      /* 3rd input
4910: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65   operand */.  Me
4920: 6d 20 2a 70 4f 75 74 20 3d 20 30 3b 20 20 20 20  m *pOut = 0;    
4930: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
4940: 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ut operand */.  
4950: 69 6e 74 20 69 43 6f 6d 70 61 72 65 20 3d 20 30  int iCompare = 0
4960: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
4970: 73 75 6c 74 20 6f 66 20 6c 61 73 74 20 4f 50 5f  sult of last OP_
4980: 43 6f 6d 70 61 72 65 20 6f 70 65 72 61 74 69 6f  Compare operatio
4990: 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72  n */.  int *aPer
49a0: 6d 75 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  mute = 0;       
49b0: 20 20 2f 2a 20 50 65 72 6d 75 74 61 74 69 6f 6e    /* Permutation
49c0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20   of columns for 
49d0: 4f 50 5f 43 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  OP_Compare */.  
49e0: 69 36 34 20 6c 61 73 74 52 6f 77 69 64 20 3d 20  i64 lastRowid = 
49f0: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 20 20  db->lastRowid;  
4a00: 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
4a10: 66 20 74 68 65 20 6c 61 73 74 20 69 6e 73 65 72  f the last inser
4a20: 74 20 52 4f 57 49 44 20 2a 2f 0a 23 69 66 64 65  t ROWID */.#ifde
4a30: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
4a40: 20 75 36 34 20 73 74 61 72 74 3b 20 20 20 20 20   u64 start;     
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4a60: 50 55 20 63 6c 6f 63 6b 20 63 6f 75 6e 74 20 61  PU clock count a
4a70: 74 20 73 74 61 72 74 20 6f 66 20 6f 70 63 6f 64  t start of opcod
4a80: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 50  e */.  int origP
4a90: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
4aa0: 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75    /* Program cou
4ab0: 6e 74 65 72 20 61 74 20 73 74 61 72 74 20 6f 66  nter at start of
4ac0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 23 65 6e 64 69   opcode */.#endi
4ad0: 66 0a 20 20 2f 2a 2a 2a 20 49 4e 53 45 52 54 20  f.  /*** INSERT 
4ae0: 53 54 41 43 4b 20 55 4e 49 4f 4e 20 48 45 52 45  STACK UNION HERE
4af0: 20 2a 2a 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28   ***/..  assert(
4b00: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
4b10: 4d 41 47 49 43 5f 52 55 4e 20 29 3b 20 20 2f 2a  MAGIC_RUN );  /*
4b20: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
4b30: 76 65 72 69 66 69 65 73 20 74 68 69 73 20 2a 2f  verifies this */
4b40: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  .  sqlite3VdbeEn
4b50: 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ter(p);.  if( p-
4b60: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  >rc==SQLITE_NOME
4b70: 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  M ){.    /* This
4b80: 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61   happens if a ma
4b90: 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20  lloc() inside a 
4ba0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
4bb0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72  column_text() or
4bc0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
4bd0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20  column_text16() 
4be0: 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20  failed.  */.    
4bf0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
4c00: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
4c10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
4c20: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
4c30: 59 20 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  Y );.  p->rc = S
4c40: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
4c50: 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  rt( p->explain==
4c60: 30 20 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c  0 );.  p->pResul
4c70: 74 53 65 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  tSet = 0;.  db->
4c80: 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73  busyHandler.nBus
4c90: 79 20 3d 20 30 3b 0a 20 20 43 48 45 43 4b 5f 46  y = 0;.  CHECK_F
4ca0: 4f 52 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20  OR_INTERRUPT;.  
4cb0: 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61  sqlite3VdbeIOTra
4cc0: 63 65 53 71 6c 28 70 29 3b 0a 23 69 66 6e 64 65  ceSql(p);.#ifnde
4cd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
4ce0: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
4cf0: 20 20 63 68 65 63 6b 50 72 6f 67 72 65 73 73 20    checkProgress 
4d00: 3d 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 21  = db->xProgress!
4d10: 3d 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  =0;.#endif.#ifde
4d20: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
4d30: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
4d40: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 69  ignMalloc();.  i
4d50: 66 28 20 70 2d 3e 70 63 3d 3d 30 20 20 26 26 20  f( p->pc==0  && 
4d60: 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  (p->db->flags & 
4d70: 53 51 4c 49 54 45 5f 56 64 62 65 4c 69 73 74 69  SQLITE_VdbeListi
4d80: 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ng)!=0 ){.    in
4d90: 74 20 69 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  t i;.    printf(
4da0: 22 56 44 42 45 20 50 72 6f 67 72 61 6d 20 4c 69  "VDBE Program Li
4db0: 73 74 69 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20 20  sting:\n");.    
4dc0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
4dd0: 53 71 6c 28 70 29 3b 0a 20 20 20 20 66 6f 72 28  Sql(p);.    for(
4de0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
4df0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
4e00: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 73 74  e3VdbePrintOp(st
4e10: 64 6f 75 74 2c 20 69 2c 20 26 61 4f 70 5b 69 5d  dout, i, &aOp[i]
4e20: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
4e30: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
4e40: 61 6c 6c 6f 63 28 29 3b 0a 23 65 6e 64 69 66 0a  alloc();.#endif.
4e50: 20 20 66 6f 72 28 70 63 3d 70 2d 3e 70 63 3b 20    for(pc=p->pc; 
4e60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70  rc==SQLITE_OK; p
4e70: 63 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  c++){.    assert
4e80: 28 20 70 63 3e 3d 30 20 26 26 20 70 63 3c 70 2d  ( pc>=0 && pc<p-
4e90: 3e 6e 4f 70 20 29 3b 0a 20 20 20 20 69 66 28 20  >nOp );.    if( 
4ea0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4eb0: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
4ec0: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
4ed0: 49 4c 45 0a 20 20 20 20 6f 72 69 67 50 63 20 3d  ILE.    origPc =
4ee0: 20 70 63 3b 0a 20 20 20 20 73 74 61 72 74 20 3d   pc;.    start =
4ef0: 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28 29   sqlite3Hwtime()
4f00: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4f 70  ;.#endif.    pOp
4f10: 20 3d 20 26 61 4f 70 5b 70 63 5d 3b 0a 0a 20 20   = &aOp[pc];..  
4f20: 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20    /* Only allow 
4f30: 74 72 61 63 69 6e 67 20 69 66 20 53 51 4c 49 54  tracing if SQLIT
4f40: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
4f50: 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65  ed..    */.#ifde
4f60: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
4f70: 20 20 20 69 66 28 20 70 2d 3e 74 72 61 63 65 20     if( p->trace 
4f80: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3d  ){.      if( pc=
4f90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  =0 ){.        pr
4fa0: 69 6e 74 66 28 22 56 44 42 45 20 45 78 65 63 75  intf("VDBE Execu
4fb0: 74 69 6f 6e 20 54 72 61 63 65 3a 5c 6e 22 29 3b  tion Trace:\n");
4fc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4fd0: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 70 29 3b  VdbePrintSql(p);
4fe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
4ff0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
5000: 70 28 70 2d 3e 74 72 61 63 65 2c 20 70 63 2c 20  p(p->trace, pc, 
5010: 70 4f 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pOp);.    }.#end
5020: 69 66 0a 20 20 20 20 20 20 0a 0a 20 20 20 20 2f  if.      ..    /
5030: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
5040: 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 69 6d  f we need to sim
5050: 75 6c 61 74 65 20 61 6e 20 69 6e 74 65 72 72 75  ulate an interru
5060: 70 74 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 68  pt.  This only h
5070: 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 69 66  appens.    ** if
5080: 20 77 65 20 68 61 76 65 20 61 20 73 70 65 63 69   we have a speci
5090: 61 6c 20 74 65 73 74 20 62 75 69 6c 64 2e 0a 20  al test build.. 
50a0: 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
50b0: 49 54 45 5f 54 45 53 54 0a 20 20 20 20 69 66 28  ITE_TEST.    if(
50c0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
50d0: 70 74 5f 63 6f 75 6e 74 3e 30 20 29 7b 0a 20 20  pt_count>0 ){.  
50e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65      sqlite3_inte
50f0: 72 72 75 70 74 5f 63 6f 75 6e 74 2d 2d 3b 0a 20  rrupt_count--;. 
5100: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
5110: 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
5120: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
5130: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
5140: 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  (db);.      }.  
5150: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e    }.#endif..#ifn
5160: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5170: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
5180: 4b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68  K.    /* Call th
5190: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
51a0: 61 63 6b 20 69 66 20 69 74 20 69 73 20 63 6f 6e  ack if it is con
51b0: 66 69 67 75 72 65 64 20 61 6e 64 20 74 68 65 20  figured and the 
51c0: 72 65 71 75 69 72 65 64 20 6e 75 6d 62 65 72 0a  required number.
51d0: 20 20 20 20 2a 2a 20 6f 66 20 56 44 42 45 20 6f      ** of VDBE o
51e0: 70 73 20 68 61 76 65 20 62 65 65 6e 20 65 78 65  ps have been exe
51f0: 63 75 74 65 64 20 28 65 69 74 68 65 72 20 73 69  cuted (either si
5200: 6e 63 65 20 74 68 69 73 20 69 6e 76 6f 63 61 74  nce this invocat
5210: 69 6f 6e 20 6f 66 0a 20 20 20 20 2a 2a 20 73 71  ion of.    ** sq
5220: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 20  lite3VdbeExec() 
5230: 6f 72 20 73 69 6e 63 65 20 6c 61 73 74 20 74 69  or since last ti
5240: 6d 65 20 74 68 65 20 70 72 6f 67 72 65 73 73 20  me the progress 
5250: 63 61 6c 6c 62 61 63 6b 20 77 61 73 20 63 61 6c  callback was cal
5260: 6c 65 64 29 2e 0a 20 20 20 20 2a 2a 20 49 66 20  led)..    ** If 
5270: 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  the progress cal
5280: 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f  lback returns no
5290: 6e 2d 7a 65 72 6f 2c 20 65 78 69 74 20 74 68 65  n-zero, exit the
52a0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
52b0: 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 61 20 72   with.    ** a r
52c0: 65 74 75 72 6e 20 63 6f 64 65 20 53 51 4c 49 54  eturn code SQLIT
52d0: 45 5f 41 42 4f 52 54 2e 0a 20 20 20 20 2a 2f 0a  E_ABORT..    */.
52e0: 20 20 20 20 69 66 28 20 63 68 65 63 6b 50 72 6f      if( checkPro
52f0: 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 69  gress ){.      i
5300: 66 28 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73  f( db->nProgress
5310: 4f 70 73 3d 3d 6e 50 72 6f 67 72 65 73 73 4f 70  Ops==nProgressOp
5320: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  s ){.        int
5330: 20 70 72 63 3b 0a 20 20 20 20 20 20 20 20 70 72   prc;.        pr
5340: 63 20 3d 20 64 62 2d 3e 78 50 72 6f 67 72 65 73  c = db->xProgres
5350: 73 28 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41  s(db->pProgressA
5360: 72 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rg);.        if(
5370: 20 70 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20   prc!=0 ){.     
5380: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5390: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
53a0: 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f        goto vdbe_
53b0: 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 20 20 20 20  error_halt;.    
53c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 50      }.        nP
53d0: 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a  rogressOps = 0;.
53e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 50        }.      nP
53f0: 72 6f 67 72 65 73 73 4f 70 73 2b 2b 3b 0a 20 20  rogressOps++;.  
5400: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
5410: 2f 2a 20 4f 6e 20 61 6e 79 20 6f 70 63 6f 64 65  /* On any opcode
5420: 20 77 69 74 68 20 74 68 65 20 22 6f 75 74 32 2d   with the "out2-
5430: 70 72 65 72 65 6c 61 73 65 22 20 74 61 67 2c 20  prerelase" tag, 
5440: 66 72 65 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20  free any.    ** 
5450: 65 78 74 65 72 6e 61 6c 20 61 6c 6c 6f 63 61 74  external allocat
5460: 69 6f 6e 73 20 6f 75 74 20 6f 66 20 6d 65 6d 5b  ions out of mem[
5470: 70 32 5d 20 61 6e 64 20 73 65 74 20 6d 65 6d 5b  p2] and set mem[
5480: 70 32 5d 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  p2] to be.    **
5490: 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   an undefined in
54a0: 74 65 67 65 72 2e 20 20 4f 70 63 6f 64 65 73 20  teger.  Opcodes 
54b0: 77 69 6c 6c 20 65 69 74 68 65 72 20 66 69 6c 6c  will either fill
54c0: 20 69 6e 20 74 68 65 20 69 6e 74 65 67 65 72 0a   in the integer.
54d0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 72 20      ** value or 
54e0: 63 6f 6e 76 65 72 74 20 6d 65 6d 5b 70 32 5d 20  convert mem[p2] 
54f0: 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 74  to a different t
5500: 79 70 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ype..    */.    
5510: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 66  assert( pOp->opf
5520: 6c 61 67 73 3d 3d 73 71 6c 69 74 65 33 4f 70 63  lags==sqlite3Opc
5530: 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d  odeProperty[pOp-
5540: 3e 6f 70 63 6f 64 65 5d 20 29 3b 0a 20 20 20 20  >opcode] );.    
5550: 69 66 28 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73  if( pOp->opflags
5560: 20 26 20 4f 50 46 4c 47 5f 4f 55 54 32 5f 50 52   & OPFLG_OUT2_PR
5570: 45 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20 20  ERELEASE ){.    
5580: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
5590: 32 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  2>0 );.      ass
55a0: 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 70 2d  ert( pOp->p2<=p-
55b0: 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20 70  >nMem );.      p
55c0: 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
55d0: 3e 70 32 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 41  >p2];.      memA
55e0: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
55f0: 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 56 64 62  pOut);.      Vdb
5600: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4f 75 74  eMemRelease(pOut
5610: 29 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 66  );.      pOut->f
5620: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
5630: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 61      }..    /* Sa
5640: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
5650: 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 73 20   other operands 
5660: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
5670: 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 28  _DEBUG.    if( (
5680: 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f  pOp->opflags & O
5690: 50 46 4c 47 5f 49 4e 31 29 21 3d 30 20 29 7b 0a  PFLG_IN1)!=0 ){.
56a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
56b0: 70 2d 3e 70 31 3e 30 20 29 3b 0a 20 20 20 20 20  p->p1>0 );.     
56c0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
56d0: 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20  <=p->nMem );.   
56e0: 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
56f0: 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d  Valid(&aMem[pOp-
5700: 3e 70 31 5d 29 20 29 3b 0a 20 20 20 20 20 20 52  >p1]) );.      R
5710: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
5720: 70 2d 3e 70 31 2c 20 26 61 4d 65 6d 5b 70 4f 70  p->p1, &aMem[pOp
5730: 2d 3e 70 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ->p1]);.    }.  
5740: 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c    if( (pOp->opfl
5750: 61 67 73 20 26 20 4f 50 46 4c 47 5f 49 4e 32 29  ags & OPFLG_IN2)
5760: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
5770: 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29  ert( pOp->p2>0 )
5780: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
5790: 70 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p2<=p->nMem
57a0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
57b0: 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d  ( memIsValid(&aM
57c0: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 20 29 3b 0a  em[pOp->p2]) );.
57d0: 20 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54        REGISTER_T
57e0: 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 26 61  RACE(pOp->p2, &a
57f0: 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b 0a 20  Mem[pOp->p2]);. 
5800: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 4f     }.    if( (pO
5810: 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46  p->opflags & OPF
5820: 4c 47 5f 49 4e 33 29 21 3d 30 20 29 7b 0a 20 20  LG_IN3)!=0 ){.  
5830: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
5840: 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  >p3>0 );.      a
5850: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d  ssert( pOp->p3<=
5860: 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20  p->nMem );.     
5870: 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
5880: 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  lid(&aMem[pOp->p
5890: 33 5d 29 20 29 3b 0a 20 20 20 20 20 20 52 45 47  3]) );.      REG
58a0: 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
58b0: 3e 70 33 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  >p3, &aMem[pOp->
58c0: 70 33 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p3]);.    }.    
58d0: 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67  if( (pOp->opflag
58e0: 73 20 26 20 4f 50 46 4c 47 5f 4f 55 54 32 29 21  s & OPFLG_OUT2)!
58f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
5900: 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b  rt( pOp->p2>0 );
5910: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
5920: 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d 20  Op->p2<=p->nMem 
5930: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62 6f 75  );.      memAbou
5940: 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 26 61 4d  tToChange(p, &aM
5950: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b 0a 20 20  em[pOp->p2]);.  
5960: 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 4f 70    }.    if( (pOp
5970: 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c  ->opflags & OPFL
5980: 47 5f 4f 55 54 33 29 21 3d 30 20 29 7b 0a 20 20  G_OUT3)!=0 ){.  
5990: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
59a0: 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  >p3>0 );.      a
59b0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d  ssert( pOp->p3<=
59c0: 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20  p->nMem );.     
59d0: 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
59e0: 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  e(p, &aMem[pOp->
59f0: 70 33 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  p3]);.    }.#end
5a00: 69 66 0a 20 20 0a 20 20 20 20 73 77 69 74 63 68  if.  .    switch
5a10: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b  ( pOp->opcode ){
5a20: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
5a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a70: 0a 2a 2a 20 57 68 61 74 20 66 6f 6c 6c 6f 77 73  .** What follows
5a80: 20 69 73 20 61 20 6d 61 73 73 69 76 65 20 73 77   is a massive sw
5a90: 69 74 63 68 20 73 74 61 74 65 6d 65 6e 74 20 77  itch statement w
5aa0: 68 65 72 65 20 65 61 63 68 20 63 61 73 65 20 69  here each case i
5ab0: 6d 70 6c 65 6d 65 6e 74 73 20 61 0a 2a 2a 20 73  mplements a.** s
5ac0: 65 70 61 72 61 74 65 20 69 6e 73 74 72 75 63 74  eparate instruct
5ad0: 69 6f 6e 20 69 6e 20 74 68 65 20 76 69 72 74 75  ion in the virtu
5ae0: 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 49 66 20  al machine.  If 
5af0: 77 65 20 66 6f 6c 6c 6f 77 20 74 68 65 20 75 73  we follow the us
5b00: 75 61 6c 0a 2a 2a 20 69 6e 64 65 6e 74 61 74 69  ual.** indentati
5b10: 6f 6e 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2c 20  on conventions, 
5b20: 65 61 63 68 20 63 61 73 65 20 73 68 6f 75 6c 64  each case should
5b30: 20 62 65 20 69 6e 64 65 6e 74 65 64 20 62 79 20   be indented by 
5b40: 36 20 73 70 61 63 65 73 2e 20 20 42 75 74 0a 2a  6 spaces.  But.*
5b50: 2a 20 74 68 61 74 20 69 73 20 61 20 6c 6f 74 20  * that is a lot 
5b60: 6f 66 20 77 61 73 74 65 64 20 73 70 61 63 65 20  of wasted space 
5b70: 6f 6e 20 74 68 65 20 6c 65 66 74 20 6d 61 72 67  on the left marg
5b80: 69 6e 2e 20 20 53 6f 20 74 68 65 20 63 6f 64 65  in.  So the code
5b90: 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 73   within.** the s
5ba0: 77 69 74 63 68 20 73 74 61 74 65 6d 65 6e 74 20  witch statement 
5bb0: 77 69 6c 6c 20 62 72 65 61 6b 20 77 69 74 68 20  will break with 
5bc0: 63 6f 6e 76 65 6e 74 69 6f 6e 20 61 6e 64 20 62  convention and b
5bd0: 65 20 66 6c 75 73 68 2d 6c 65 66 74 2e 20 41 6e  e flush-left. An
5be0: 6f 74 68 65 72 0a 2a 2a 20 62 69 67 20 63 6f 6d  other.** big com
5bf0: 6d 65 6e 74 20 28 73 69 6d 69 6c 61 72 20 74 6f  ment (similar to
5c00: 20 74 68 69 73 20 6f 6e 65 29 20 77 69 6c 6c 20   this one) will 
5c10: 6d 61 72 6b 20 74 68 65 20 70 6f 69 6e 74 20 69  mark the point i
5c20: 6e 20 74 68 65 20 63 6f 64 65 20 77 68 65 72 65  n the code where
5c30: 0a 2a 2a 20 77 65 20 74 72 61 6e 73 69 74 69 6f  .** we transitio
5c40: 6e 20 62 61 63 6b 20 74 6f 20 6e 6f 72 6d 61 6c  n back to normal
5c50: 20 69 6e 64 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a   indentation..**
5c60: 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 74 69  .** The formatti
5c70: 6e 67 20 6f 66 20 65 61 63 68 20 63 61 73 65 20  ng of each case 
5c80: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54  is important.  T
5c90: 68 65 20 6d 61 6b 65 66 69 6c 65 20 66 6f 72 20  he makefile for 
5ca0: 53 51 4c 69 74 65 0a 2a 2a 20 67 65 6e 65 72 61  SQLite.** genera
5cb0: 74 65 73 20 74 77 6f 20 43 20 66 69 6c 65 73 20  tes two C files 
5cc0: 22 6f 70 63 6f 64 65 73 2e 68 22 20 61 6e 64 20  "opcodes.h" and 
5cd0: 22 6f 70 63 6f 64 65 73 2e 63 22 20 62 79 20 73  "opcodes.c" by s
5ce0: 63 61 6e 6e 69 6e 67 20 74 68 69 73 0a 2a 2a 20  canning this.** 
5cf0: 66 69 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  file looking for
5d00: 20 6c 69 6e 65 73 20 74 68 61 74 20 62 65 67 69   lines that begi
5d10: 6e 20 77 69 74 68 20 22 63 61 73 65 20 4f 50 5f  n with "case OP_
5d20: 22 2e 20 20 54 68 65 20 6f 70 63 6f 64 65 73 2e  ".  The opcodes.
5d30: 68 20 66 69 6c 65 73 0a 2a 2a 20 77 69 6c 6c 20  h files.** will 
5d40: 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 23  be filled with #
5d50: 64 65 66 69 6e 65 73 20 74 68 61 74 20 67 69 76  defines that giv
5d60: 65 20 75 6e 69 71 75 65 20 69 6e 74 65 67 65 72  e unique integer
5d70: 20 76 61 6c 75 65 73 20 74 6f 20 65 61 63 68 0a   values to each.
5d80: 2a 2a 20 6f 70 63 6f 64 65 20 61 6e 64 20 74 68  ** opcode and th
5d90: 65 20 6f 70 63 6f 64 65 73 2e 63 20 66 69 6c 65  e opcodes.c file
5da0: 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
5db0: 61 6e 20 61 72 72 61 79 20 6f 66 20 73 74 72 69  an array of stri
5dc0: 6e 67 73 20 77 68 65 72 65 0a 2a 2a 20 65 61 63  ngs where.** eac
5dd0: 68 20 73 74 72 69 6e 67 20 69 73 20 74 68 65 20  h string is the 
5de0: 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 66 6f  symbolic name fo
5df0: 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  r the correspond
5e00: 69 6e 67 20 6f 70 63 6f 64 65 2e 20 20 49 66 20  ing opcode.  If 
5e10: 74 68 65 0a 2a 2a 20 63 61 73 65 20 73 74 61 74  the.** case stat
5e20: 65 6d 65 6e 74 20 69 73 20 66 6f 6c 6c 6f 77 65  ement is followe
5e30: 64 20 62 79 20 61 20 63 6f 6d 6d 65 6e 74 20 6f  d by a comment o
5e40: 66 20 74 68 65 20 66 6f 72 6d 20 22 2f 23 20 73  f the form "/# s
5e50: 61 6d 65 20 61 73 20 2e 2e 2e 20 23 2f 22 0a 2a  ame as ... #/".*
5e60: 2a 20 74 68 61 74 20 63 6f 6d 6d 65 6e 74 20 69  * that comment i
5e70: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
5e80: 69 6e 65 20 74 68 65 20 70 61 72 74 69 63 75 6c  ine the particul
5e90: 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ar value of the 
5ea0: 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74  opcode..**.** Ot
5eb0: 68 65 72 20 6b 65 79 77 6f 72 64 73 20 69 6e 20  her keywords in 
5ec0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 68 61 74  the comment that
5ed0: 20 66 6f 6c 6c 6f 77 73 20 65 61 63 68 20 63 61   follows each ca
5ee0: 73 65 20 61 72 65 20 75 73 65 64 20 74 6f 0a 2a  se are used to.*
5ef0: 2a 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * construct the 
5f00: 4f 50 46 4c 47 5f 49 4e 49 54 49 41 4c 49 5a 45  OPFLG_INITIALIZE
5f10: 52 20 76 61 6c 75 65 20 74 68 61 74 20 69 6e 69  R value that ini
5f20: 74 69 61 6c 69 7a 65 73 20 6f 70 63 6f 64 65 50  tializes opcodeP
5f30: 72 6f 70 65 72 74 79 5b 5d 2e 0a 2a 2a 20 4b 65  roperty[]..** Ke
5f40: 79 77 6f 72 64 73 20 69 6e 63 6c 75 64 65 3a 20  ywords include: 
5f50: 69 6e 31 2c 20 69 6e 32 2c 20 69 6e 33 2c 20 6f  in1, in2, in3, o
5f60: 75 74 32 5f 70 72 65 72 65 6c 65 61 73 65 2c 20  ut2_prerelease, 
5f70: 6f 75 74 32 2c 20 6f 75 74 33 2e 20 20 53 65 65  out2, out3.  See
5f80: 0a 2a 2a 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65  .** the mkopcode
5f90: 68 2e 61 77 6b 20 73 63 72 69 70 74 20 66 6f 72  h.awk script for
5fa0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
5fb0: 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44  rmation..**.** D
5fc0: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 61 62 6f  ocumentation abo
5fd0: 75 74 20 56 44 42 45 20 6f 70 63 6f 64 65 73 20  ut VDBE opcodes 
5fe0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
5ff0: 73 63 61 6e 6e 69 6e 67 20 74 68 69 73 20 66 69  scanning this fi
6000: 6c 65 0a 2a 2a 20 66 6f 72 20 6c 69 6e 65 73 20  le.** for lines 
6010: 6f 66 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20  of that contain 
6020: 22 4f 70 63 6f 64 65 3a 22 2e 20 20 54 68 61 74  "Opcode:".  That
6030: 20 6c 69 6e 65 20 61 6e 64 20 61 6c 6c 20 73 75   line and all su
6040: 62 73 65 71 75 65 6e 74 0a 2a 2a 20 63 6f 6d 6d  bsequent.** comm
6050: 65 6e 74 20 6c 69 6e 65 73 20 61 72 65 20 75 73  ent lines are us
6060: 65 64 20 69 6e 20 74 68 65 20 67 65 6e 65 72 61  ed in the genera
6070: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 63 6f  tion of the opco
6080: 64 65 2e 68 74 6d 6c 20 64 6f 63 75 6d 65 6e 74  de.html document
6090: 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2e 0a 2a  ation.** file..*
60a0: 2a 0a 2a 2a 20 53 55 4d 4d 41 52 59 3a 0a 2a 2a  *.** SUMMARY:.**
60b0: 0a 2a 2a 20 20 20 20 20 46 6f 72 6d 61 74 74 69  .**     Formatti
60c0: 6e 67 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  ng is important 
60d0: 74 6f 20 73 63 72 69 70 74 73 20 74 68 61 74 20  to scripts that 
60e0: 73 63 61 6e 20 74 68 69 73 20 66 69 6c 65 2e 0a  scan this file..
60f0: 2a 2a 20 20 20 20 20 44 6f 20 6e 6f 74 20 64 65  **     Do not de
6100: 76 69 61 74 65 20 66 72 6f 6d 20 74 68 65 20 66  viate from the f
6110: 6f 72 6d 61 74 74 69 6e 67 20 73 74 79 6c 65 20  ormatting style 
6120: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
6130: 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
6140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6180: 2a 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  **/../* Opcode: 
6190: 20 47 6f 74 6f 20 2a 20 50 32 20 2a 20 2a 20 2a   Goto * P2 * * *
61a0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 75 6e 63 6f 6e 64  .**.** An uncond
61b0: 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20  itional jump to 
61c0: 61 64 64 72 65 73 73 20 50 32 2e 0a 2a 2a 20 54  address P2..** T
61d0: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
61e0: 69 6f 6e 20 65 78 65 63 75 74 65 64 20 77 69 6c  ion executed wil
61f0: 6c 20 62 65 20 0a 2a 2a 20 74 68 65 20 6f 6e 65  l be .** the one
6200: 20 61 74 20 69 6e 64 65 78 20 50 32 20 66 72 6f   at index P2 fro
6210: 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
6220: 6f 66 0a 2a 2a 20 74 68 65 20 70 72 6f 67 72 61  of.** the progra
6230: 6d 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 6f  m..*/.case OP_Go
6240: 74 6f 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  to: {           
6250: 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 43    /* jump */.  C
6260: 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52 52 55  HECK_FOR_INTERRU
6270: 50 54 3b 0a 20 20 70 63 20 3d 20 70 4f 70 2d 3e  PT;.  pc = pOp->
6280: 70 32 20 2d 20 31 3b 0a 20 20 62 72 65 61 6b 3b  p2 - 1;.  break;
6290: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20  .}../* Opcode:  
62a0: 47 6f 73 75 62 20 50 31 20 50 32 20 2a 20 2a 20  Gosub P1 P2 * * 
62b0: 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  *.**.** Write th
62c0: 65 20 63 75 72 72 65 6e 74 20 61 64 64 72 65 73  e current addres
62d0: 73 20 6f 6e 74 6f 20 72 65 67 69 73 74 65 72 20  s onto register 
62e0: 50 31 0a 2a 2a 20 61 6e 64 20 74 68 65 6e 20 6a  P1.** and then j
62f0: 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73 20 50  ump to address P
6300: 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 6f  2..*/.case OP_Go
6310: 73 75 62 3a 20 7b 20 20 20 20 20 20 20 20 20 20  sub: {          
6320: 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 61    /* jump */.  a
6330: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30  ssert( pOp->p1>0
6340: 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e   && pOp->p1<=p->
6350: 6e 4d 65 6d 20 29 3b 0a 20 20 70 49 6e 31 20 3d  nMem );.  pIn1 =
6360: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
6370: 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 31  .  assert( (pIn1
6380: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79  ->flags & MEM_Dy
6390: 6e 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 41 62  n)==0 );.  memAb
63a0: 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70  outToChange(p, p
63b0: 49 6e 31 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c  In1);.  pIn1->fl
63c0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
63d0: 20 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 70 63 3b   pIn1->u.i = pc;
63e0: 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
63f0: 45 28 70 4f 70 2d 3e 70 31 2c 20 70 49 6e 31 29  E(pOp->p1, pIn1)
6400: 3b 0a 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32  ;.  pc = pOp->p2
6410: 20 2d 20 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d   - 1;.  break;.}
6420: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 52 65  ../* Opcode:  Re
6430: 74 75 72 6e 20 50 31 20 2a 20 2a 20 2a 20 2a 0a  turn P1 * * * *.
6440: 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68  **.** Jump to th
6450: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
6460: 6f 6e 20 61 66 74 65 72 20 74 68 65 20 61 64 64  on after the add
6470: 72 65 73 73 20 69 6e 20 72 65 67 69 73 74 65 72  ress in register
6480: 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P1..*/.case OP_
6490: 52 65 74 75 72 6e 3a 20 7b 20 20 20 20 20 20 20  Return: {       
64a0: 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20      /* in1 */.  
64b0: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
64c0: 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
64d0: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn1->flags & M
64e0: 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 70 63 20 3d  EM_Int );.  pc =
64f0: 20 28 69 6e 74 29 70 49 6e 31 2d 3e 75 2e 69 3b   (int)pIn1->u.i;
6500: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
6510: 4f 70 63 6f 64 65 3a 20 20 59 69 65 6c 64 20 50  Opcode:  Yield P
6520: 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  1 * * * *.**.** 
6530: 53 77 61 70 20 74 68 65 20 70 72 6f 67 72 61 6d  Swap the program
6540: 20 63 6f 75 6e 74 65 72 20 77 69 74 68 20 74 68   counter with th
6550: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
6560: 74 65 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20  ter P1..*/.case 
6570: 4f 50 5f 59 69 65 6c 64 3a 20 7b 20 20 20 20 20  OP_Yield: {     
6580: 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f         /* in1 */
6590: 0a 20 20 69 6e 74 20 70 63 44 65 73 74 3b 0a 20  .  int pcDest;. 
65a0: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
65b0: 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
65c0: 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
65d0: 20 4d 45 4d 5f 44 79 6e 29 3d 3d 30 20 29 3b 0a   MEM_Dyn)==0 );.
65e0: 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20    pIn1->flags = 
65f0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 70 63 44 65 73  MEM_Int;.  pcDes
6600: 74 20 3d 20 28 69 6e 74 29 70 49 6e 31 2d 3e 75  t = (int)pIn1->u
6610: 2e 69 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20  .i;.  pIn1->u.i 
6620: 3d 20 70 63 3b 0a 20 20 52 45 47 49 53 54 45 52  = pc;.  REGISTER
6630: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20  _TRACE(pOp->p1, 
6640: 70 49 6e 31 29 3b 0a 20 20 70 63 20 3d 20 70 63  pIn1);.  pc = pc
6650: 44 65 73 74 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  Dest;.  break;.}
6660: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 48 61  ../* Opcode:  Ha
6670: 6c 74 49 66 4e 75 6c 6c 20 20 50 31 20 50 32 20  ltIfNull  P1 P2 
6680: 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 43 68  P3 P4 *.**.** Ch
6690: 65 63 6b 20 74 68 65 20 76 61 6c 75 65 20 69 6e  eck the value in
66a0: 20 72 65 67 69 73 74 65 72 20 50 33 2e 20 20 49   register P3.  I
66b0: 66 20 69 74 20 69 73 20 4e 55 4c 4c 20 74 68 65  f it is NULL the
66c0: 6e 20 48 61 6c 74 20 75 73 69 6e 67 0a 2a 2a 20  n Halt using.** 
66d0: 70 61 72 61 6d 65 74 65 72 20 50 31 2c 20 50 32  parameter P1, P2
66e0: 2c 20 61 6e 64 20 50 34 20 61 73 20 69 66 20 74  , and P4 as if t
66f0: 68 69 73 20 77 65 72 65 20 61 20 48 61 6c 74 20  his were a Halt 
6700: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66  instruction.  If
6710: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69 6e   the.** value in
6720: 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20   register P3 is 
6730: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
6740: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
6750: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63 61 73 65 20   no-op..*/.case 
6760: 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 3a 20 7b  OP_HaltIfNull: {
6770: 20 20 20 20 20 20 2f 2a 20 69 6e 33 20 2a 2f 0a        /* in3 */.
6780: 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
6790: 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 28  Op->p3];.  if( (
67a0: 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
67b0: 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 20 62 72 65  M_Null)==0 ) bre
67c0: 61 6b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68  ak;.  /* Fall th
67d0: 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 48 61  rough into OP_Ha
67e0: 6c 74 20 2a 2f 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  lt */.}../* Opco
67f0: 64 65 3a 20 20 48 61 6c 74 20 50 31 20 50 32 20  de:  Halt P1 P2 
6800: 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 69  * P4 *.**.** Exi
6810: 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20  t immediately.  
6820: 41 6c 6c 20 6f 70 65 6e 20 63 75 72 73 6f 72 73  All open cursors
6830: 2c 20 65 74 63 20 61 72 65 20 63 6c 6f 73 65 64  , etc are closed
6840: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
6850: 79 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74  y..**.** P1 is t
6860: 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20 72  he result code r
6870: 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
6880: 65 33 5f 65 78 65 63 28 29 2c 20 73 71 6c 69 74  e3_exec(), sqlit
6890: 65 33 5f 72 65 73 65 74 28 29 2c 0a 2a 2a 20 6f  e3_reset(),.** o
68a0: 72 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  r sqlite3_finali
68b0: 7a 65 28 29 2e 20 20 46 6f 72 20 61 20 6e 6f 72  ze().  For a nor
68c0: 6d 61 6c 20 68 61 6c 74 2c 20 74 68 69 73 20 73  mal halt, this s
68d0: 68 6f 75 6c 64 20 62 65 20 53 51 4c 49 54 45 5f  hould be SQLITE_
68e0: 4f 4b 20 28 30 29 2e 0a 2a 2a 20 46 6f 72 20 65  OK (0)..** For e
68f0: 72 72 6f 72 73 2c 20 69 74 20 63 61 6e 20 62 65  rrors, it can be
6900: 20 73 6f 6d 65 20 6f 74 68 65 72 20 76 61 6c 75   some other valu
6910: 65 2e 20 20 49 66 20 50 31 21 3d 30 20 74 68 65  e.  If P1!=0 the
6920: 6e 20 50 32 20 77 69 6c 6c 20 64 65 74 65 72 6d  n P2 will determ
6930: 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  ine.** whether o
6940: 72 20 6e 6f 74 20 74 6f 20 72 6f 6c 6c 62 61 63  r not to rollbac
6950: 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  k the current tr
6960: 61 6e 73 61 63 74 69 6f 6e 2e 20 20 44 6f 20 6e  ansaction.  Do n
6970: 6f 74 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69  ot rollback.** i
6980: 66 20 50 32 3d 3d 4f 45 5f 46 61 69 6c 2e 20 44  f P2==OE_Fail. D
6990: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69  o the rollback i
69a0: 66 20 50 32 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  f P2==OE_Rollbac
69b0: 6b 2e 20 20 49 66 20 50 32 3d 3d 4f 45 5f 41 62  k.  If P2==OE_Ab
69c0: 6f 72 74 2c 0a 2a 2a 20 74 68 65 6e 20 62 61 63  ort,.** then bac
69d0: 6b 20 6f 75 74 20 61 6c 6c 20 63 68 61 6e 67 65  k out all change
69e0: 73 20 74 68 61 74 20 68 61 76 65 20 6f 63 63 75  s that have occu
69f0: 72 72 65 64 20 64 75 72 69 6e 67 20 74 68 69 73  rred during this
6a00: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
6a10: 65 0a 2a 2a 20 56 44 42 45 2c 20 62 75 74 20 64  e.** VDBE, but d
6a20: 6f 20 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 74  o not rollback t
6a30: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
6a40: 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73 20  .**.** If P4 is 
6a50: 6e 6f 74 20 6e 75 6c 6c 20 74 68 65 6e 20 69 74  not null then it
6a60: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73   is an error mes
6a70: 73 61 67 65 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  sage string..**.
6a80: 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6e 20 69  ** There is an i
6a90: 6d 70 6c 69 65 64 20 22 48 61 6c 74 20 30 20 30  mplied "Halt 0 0
6aa0: 20 30 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   0" instruction 
6ab0: 69 6e 73 65 72 74 65 64 20 61 74 20 74 68 65 20  inserted at the 
6ac0: 76 65 72 79 20 65 6e 64 20 6f 66 0a 2a 2a 20 65  very end of.** e
6ad0: 76 65 72 79 20 70 72 6f 67 72 61 6d 2e 20 20 53  very program.  S
6ae0: 6f 20 61 20 6a 75 6d 70 20 70 61 73 74 20 74 68  o a jump past th
6af0: 65 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74 69  e last instructi
6b00: 6f 6e 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  on of the progra
6b10: 6d 0a 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65  m.** is the same
6b20: 20 61 73 20 65 78 65 63 75 74 69 6e 67 20 48 61   as executing Ha
6b30: 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 48  lt..*/.case OP_H
6b40: 61 6c 74 3a 20 7b 0a 20 20 69 66 28 20 70 4f 70  alt: {.  if( pOp
6b50: 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->p1==SQLITE_OK 
6b60: 26 26 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a  && p->pFrame ){.
6b70: 20 20 20 20 2f 2a 20 48 61 6c 74 20 74 68 65 20      /* Halt the 
6b80: 73 75 62 2d 70 72 6f 67 72 61 6d 2e 20 52 65 74  sub-program. Ret
6b90: 75 72 6e 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74  urn control to t
6ba0: 68 65 20 70 61 72 65 6e 74 20 66 72 61 6d 65 2e  he parent frame.
6bb0: 20 2a 2f 0a 20 20 20 20 56 64 62 65 46 72 61 6d   */.    VdbeFram
6bc0: 65 20 2a 70 46 72 61 6d 65 20 3d 20 70 2d 3e 70  e *pFrame = p->p
6bd0: 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 46  Frame;.    p->pF
6be0: 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 2d 3e 70  rame = pFrame->p
6bf0: 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 2d 3e 6e  Parent;.    p->n
6c00: 46 72 61 6d 65 2d 2d 3b 0a 20 20 20 20 73 71 6c  Frame--;.    sql
6c10: 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
6c20: 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
6c30: 65 29 3b 0a 20 20 20 20 70 63 20 3d 20 73 71 6c  e);.    pc = sql
6c40: 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73  ite3VdbeFrameRes
6c50: 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20  tore(pFrame);.  
6c60: 20 20 6c 61 73 74 52 6f 77 69 64 20 3d 20 64 62    lastRowid = db
6c70: 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 20  ->lastRowid;.   
6c80: 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45   if( pOp->p2==OE
6c90: 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
6ca0: 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20   /* Instruction 
6cb0: 70 63 20 69 73 20 74 68 65 20 4f 50 5f 50 72 6f  pc is the OP_Pro
6cc0: 67 72 61 6d 20 74 68 61 74 20 69 6e 76 6f 6b 65  gram that invoke
6cd0: 64 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61  d the sub-progra
6ce0: 6d 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72  m .      ** curr
6cf0: 65 6e 74 6c 79 20 62 65 69 6e 67 20 68 61 6c 74  ently being halt
6d00: 65 64 2e 20 49 66 20 74 68 65 20 70 32 20 69 6e  ed. If the p2 in
6d10: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 69  struction of thi
6d20: 73 20 4f 50 5f 48 61 6c 74 0a 20 20 20 20 20 20  s OP_Halt.      
6d30: 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ** instruction i
6d40: 73 20 73 65 74 20 74 6f 20 4f 45 5f 49 67 6e 6f  s set to OE_Igno
6d50: 72 65 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62  re, then the sub
6d60: 2d 70 72 6f 67 72 61 6d 20 69 73 20 74 68 72 6f  -program is thro
6d70: 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 6e  wing.      ** an
6d80: 20 49 47 4e 4f 52 45 20 65 78 63 65 70 74 69 6f   IGNORE exceptio
6d90: 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  n. In this case 
6da0: 6a 75 6d 70 20 74 6f 20 74 68 65 20 61 64 64 72  jump to the addr
6db0: 65 73 73 20 73 70 65 63 69 66 69 65 64 0a 20 20  ess specified.  
6dc0: 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 70 32      ** as the p2
6dd0: 20 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   of the calling 
6de0: 4f 50 5f 50 72 6f 67 72 61 6d 2e 20 20 2a 2f 0a  OP_Program.  */.
6df0: 20 20 20 20 20 20 70 63 20 3d 20 70 2d 3e 61 4f        pc = p->aO
6e00: 70 5b 70 63 5d 2e 70 32 2d 31 3b 0a 20 20 20 20  p[pc].p2-1;.    
6e10: 7d 0a 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61  }.    aOp = p->a
6e20: 4f 70 3b 0a 20 20 20 20 61 4d 65 6d 20 3d 20 70  Op;.    aMem = p
6e30: 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 62 72 65 61  ->aMem;.    brea
6e40: 6b 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20  k;.  }..  p->rc 
6e50: 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 2d 3e  = pOp->p1;.  p->
6e60: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 28 75  errorAction = (u
6e70: 38 29 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 2d 3e  8)pOp->p2;.  p->
6e80: 70 63 20 3d 20 70 63 3b 0a 20 20 69 66 28 20 70  pc = pc;.  if( p
6e90: 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20 20  Op->p4.z ){.    
6ea0: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
6eb0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
6ec0: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
6ed0: 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
6ee0: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%s", pOp->p4.
6ef0: 7a 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  z);.    testcase
6f00: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
6f10: 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
6f20: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
6f30: 28 70 4f 70 2d 3e 70 31 2c 20 22 61 62 6f 72 74  (pOp->p1, "abort
6f40: 20 61 74 20 25 64 20 69 6e 20 5b 25 73 5d 3a 20   at %d in [%s]: 
6f50: 25 73 22 2c 20 70 63 2c 20 70 2d 3e 7a 53 71 6c  %s", pc, p->zSql
6f60: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
6f70: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
6f80: 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ){.    testcase(
6f90: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
6fa0: 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
6fb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
6fc0: 70 4f 70 2d 3e 70 31 2c 20 22 63 6f 6e 73 74 72  pOp->p1, "constr
6fd0: 61 69 6e 74 20 66 61 69 6c 65 64 20 61 74 20 25  aint failed at %
6fe0: 64 20 69 6e 20 5b 25 73 5d 22 2c 20 70 63 2c 20  d in [%s]", pc, 
6ff0: 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20  p->zSql);.  }.  
7000: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
7010: 48 61 6c 74 28 70 29 3b 0a 20 20 61 73 73 65 72  Halt(p);.  asser
7020: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  t( rc==SQLITE_BU
7030: 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  SY || rc==SQLITE
7040: 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
7050: 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28  E_ERROR );.  if(
7060: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
7070: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
7080: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
7090: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
70a0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
70b0: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
70c0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
70d0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
70e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
70f0: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
7100: 6e 73 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  ns>0 );.    rc =
7110: 20 70 2d 3e 72 63 20 3f 20 53 51 4c 49 54 45 5f   p->rc ? SQLITE_
7120: 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44  ERROR : SQLITE_D
7130: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20  ONE;.  }.  goto 
7140: 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a  vdbe_return;.}..
7150: 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67  /* Opcode: Integ
7160: 65 72 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  er P1 P2 * * *.*
7170: 2a 0a 2a 2a 20 54 68 65 20 33 32 2d 62 69 74 20  *.** The 32-bit 
7180: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 50 31  integer value P1
7190: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
71a0: 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f   register P2..*/
71b0: 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65 67 65 72  .case OP_Integer
71c0: 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  : {         /* o
71d0: 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a  ut2-prerelease *
71e0: 2f 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  /.  pOut->u.i = 
71f0: 70 4f 70 2d 3e 70 31 3b 0a 20 20 62 72 65 61 6b  pOp->p1;.  break
7200: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
7210: 49 6e 74 36 34 20 2a 20 50 32 20 2a 20 50 34 20  Int64 * P2 * P4 
7220: 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20  *.**.** P4 is a 
7230: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 36 34 2d  pointer to a 64-
7240: 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75  bit integer valu
7250: 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 61 74  e..** Write that
7260: 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67 69   value into regi
7270: 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  ster P2..*/.case
7280: 20 4f 50 5f 49 6e 74 36 34 3a 20 7b 20 20 20 20   OP_Int64: {    
7290: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70         /* out2-p
72a0: 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 61  rerelease */.  a
72b0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 70  ssert( pOp->p4.p
72c0: 49 36 34 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74  I64!=0 );.  pOut
72d0: 2d 3e 75 2e 69 20 3d 20 2a 70 4f 70 2d 3e 70 34  ->u.i = *pOp->p4
72e0: 2e 70 49 36 34 3b 0a 20 20 62 72 65 61 6b 3b 0a  .pI64;.  break;.
72f0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7300: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
7310: 50 4f 49 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a  POINT./* Opcode:
7320: 20 52 65 61 6c 20 2a 20 50 32 20 2a 20 50 34 20   Real * P2 * P4 
7330: 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20  *.**.** P4 is a 
7340: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 36 34 2d  pointer to a 64-
7350: 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  bit floating poi
7360: 6e 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 57 72 69  nt value..** Wri
7370: 74 65 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e  te that value in
7380: 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
7390: 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61 6c 3a  */.case OP_Real:
73a0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {            /*
73b0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 46 4c 4f 41   same as TK_FLOA
73c0: 54 2c 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61  T, out2-prerelea
73d0: 73 65 20 2a 2f 0a 20 20 70 4f 75 74 2d 3e 66 6c  se */.  pOut->fl
73e0: 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ags = MEM_Real;.
73f0: 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
7400: 65 33 49 73 4e 61 4e 28 2a 70 4f 70 2d 3e 70 34  e3IsNaN(*pOp->p4
7410: 2e 70 52 65 61 6c 29 20 29 3b 0a 20 20 70 4f 75  .pReal) );.  pOu
7420: 74 2d 3e 72 20 3d 20 2a 70 4f 70 2d 3e 70 34 2e  t->r = *pOp->p4.
7430: 70 52 65 61 6c 3b 0a 20 20 62 72 65 61 6b 3b 0a  pReal;.  break;.
7440: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63  }.#endif../* Opc
7450: 6f 64 65 3a 20 53 74 72 69 6e 67 38 20 2a 20 50  ode: String8 * P
7460: 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50  2 * P4 *.**.** P
7470: 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75  4 points to a nu
7480: 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l terminated UTF
7490: 2d 38 20 73 74 72 69 6e 67 2e 20 54 68 69 73 20  -8 string. This 
74a0: 6f 70 63 6f 64 65 20 69 73 20 74 72 61 6e 73 66  opcode is transf
74b0: 6f 72 6d 65 64 20 0a 2a 2a 20 69 6e 74 6f 20 61  ormed .** into a
74c0: 6e 20 4f 50 5f 53 74 72 69 6e 67 20 62 65 66 6f  n OP_String befo
74d0: 72 65 20 69 74 20 69 73 20 65 78 65 63 75 74 65  re it is execute
74e0: 64 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  d for the first 
74f0: 74 69 6d 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  time..*/.case OP
7500: 5f 53 74 72 69 6e 67 38 3a 20 7b 20 20 20 20 20  _String8: {     
7510: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
7520: 4b 5f 53 54 52 49 4e 47 2c 20 6f 75 74 32 2d 70  K_STRING, out2-p
7530: 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 61  rerelease */.  a
7540: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 7a  ssert( pOp->p4.z
7550: 21 3d 30 20 29 3b 0a 20 20 70 4f 70 2d 3e 6f 70  !=0 );.  pOp->op
7560: 63 6f 64 65 20 3d 20 4f 50 5f 53 74 72 69 6e 67  code = OP_String
7570: 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 73 71  ;.  pOp->p1 = sq
7580: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4f  lite3Strlen30(pO
7590: 70 2d 3e 70 34 2e 7a 29 3b 0a 0a 23 69 66 6e 64  p->p4.z);..#ifnd
75a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
75b0: 54 46 31 36 0a 20 20 69 66 28 20 65 6e 63 6f 64  TF16.  if( encod
75c0: 69 6e 67 21 3d 53 51 4c 49 54 45 5f 55 54 46 38  ing!=SQLITE_UTF8
75d0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
75e0: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
75f0: 72 28 70 4f 75 74 2c 20 70 4f 70 2d 3e 70 34 2e  r(pOut, pOp->p4.
7600: 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  z, -1, SQLITE_UT
7610: 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
7620: 43 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  C);.    if( rc==
7630: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 29 20  SQLITE_TOOBIG ) 
7640: 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20  goto too_big;.  
7650: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
7660: 3d 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e  =sqlite3VdbeChan
7670: 67 65 45 6e 63 6f 64 69 6e 67 28 70 4f 75 74 2c  geEncoding(pOut,
7680: 20 65 6e 63 6f 64 69 6e 67 29 20 29 20 67 6f 74   encoding) ) got
7690: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 61 73  o no_mem;.    as
76a0: 73 65 72 74 28 20 70 4f 75 74 2d 3e 7a 4d 61 6c  sert( pOut->zMal
76b0: 6c 6f 63 3d 3d 70 4f 75 74 2d 3e 7a 20 29 3b 0a  loc==pOut->z );.
76c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 75 74      assert( pOut
76d0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79  ->flags & MEM_Dy
76e0: 6e 20 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a  n );.    pOut->z
76f0: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
7700: 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pOut->flags |= M
7710: 45 4d 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 70  EM_Static;.    p
7720: 4f 75 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 4d  Out->flags &= ~M
7730: 45 4d 5f 44 79 6e 3b 0a 20 20 20 20 69 66 28 20  EM_Dyn;.    if( 
7740: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
7750: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
7760: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7770: 62 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  b, pOp->p4.z);. 
7780: 20 20 20 7d 0a 20 20 20 20 70 4f 70 2d 3e 70 34     }.    pOp->p4
7790: 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49  type = P4_DYNAMI
77a0: 43 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  C;.    pOp->p4.z
77b0: 20 3d 20 70 4f 75 74 2d 3e 7a 3b 0a 20 20 20 20   = pOut->z;.    
77c0: 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 75 74 2d 3e  pOp->p1 = pOut->
77d0: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  n;.  }.#endif.  
77e0: 69 66 28 20 70 4f 70 2d 3e 70 31 3e 64 62 2d 3e  if( pOp->p1>db->
77f0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7800: 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20  MIT_LENGTH] ){. 
7810: 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b     goto too_big;
7820: 0a 20 20 7d 0a 20 20 2f 2a 20 46 61 6c 6c 20 74  .  }.  /* Fall t
7830: 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
7840: 78 74 20 63 61 73 65 2c 20 4f 50 5f 53 74 72 69  xt case, OP_Stri
7850: 6e 67 20 2a 2f 0a 7d 0a 20 20 0a 2f 2a 20 4f 70  ng */.}.  ./* Op
7860: 63 6f 64 65 3a 20 53 74 72 69 6e 67 20 50 31 20  code: String P1 
7870: 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  P2 * P4 *.**.** 
7880: 54 68 65 20 73 74 72 69 6e 67 20 76 61 6c 75 65  The string value
7890: 20 50 34 20 6f 66 20 6c 65 6e 67 74 68 20 50 31   P4 of length P1
78a0: 20 28 62 79 74 65 73 29 20 69 73 20 73 74 6f 72   (bytes) is stor
78b0: 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
78c0: 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 74  2..*/.case OP_St
78d0: 72 69 6e 67 3a 20 7b 20 20 20 20 20 20 20 20 20  ring: {         
78e0: 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65   /* out2-prerele
78f0: 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ase */.  assert(
7900: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b   pOp->p4.z!=0 );
7910: 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d  .  pOut->flags =
7920: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74 61   MEM_Str|MEM_Sta
7930: 74 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  tic|MEM_Term;.  
7940: 70 4f 75 74 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 70  pOut->z = pOp->p
7950: 34 2e 7a 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d  4.z;.  pOut->n =
7960: 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 4f 75 74   pOp->p1;.  pOut
7970: 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67  ->enc = encoding
7980: 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
7990: 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20  LOBSIZE(pOut);. 
79a0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
79b0: 63 6f 64 65 3a 20 4e 75 6c 6c 20 2a 20 50 32 20  code: Null * P2 
79c0: 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69  P3 * *.**.** Wri
79d0: 74 65 20 61 20 4e 55 4c 4c 20 69 6e 74 6f 20 72  te a NULL into r
79e0: 65 67 69 73 74 65 72 73 20 50 32 2e 20 20 49 66  egisters P2.  If
79f0: 20 50 33 20 67 72 65 61 74 65 72 20 74 68 61 6e   P3 greater than
7a00: 20 50 32 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77   P2, then also w
7a10: 72 69 74 65 0a 2a 2a 20 4e 55 4c 4c 20 69 6e 74  rite.** NULL int
7a20: 6f 20 72 65 67 69 73 74 65 72 20 50 33 20 61 6e  o register P3 an
7a30: 64 20 65 76 65 72 20 72 65 67 69 73 74 65 72 20  d ever register 
7a40: 69 6e 20 62 65 74 77 65 65 6e 20 50 32 20 61 6e  in between P2 an
7a50: 64 20 50 33 2e 20 20 49 66 20 50 33 0a 2a 2a 20  d P3.  If P3.** 
7a60: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 50 32 20  is less than P2 
7a70: 28 74 79 70 69 63 61 6c 6c 79 20 50 33 20 69 73  (typically P3 is
7a80: 20 7a 65 72 6f 29 20 74 68 65 6e 20 6f 6e 6c 79   zero) then only
7a90: 20 72 65 67 69 73 74 65 72 20 50 32 20 69 73 0a   register P2 is.
7aa0: 2a 2a 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a  ** set to NULL.*
7ab0: 2f 0a 63 61 73 65 20 4f 50 5f 4e 75 6c 6c 3a 20  /.case OP_Null: 
7ac0: 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  {           /* o
7ad0: 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a  ut2-prerelease *
7ae0: 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 63  /.  int cnt;.  c
7af0: 6e 74 20 3d 20 70 4f 70 2d 3e 70 33 2d 70 4f 70  nt = pOp->p3-pOp
7b00: 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p2;.  assert( 
7b10: 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p3<=p->nMem
7b20: 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67   );.  pOut->flag
7b30: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
7b40: 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 29 7b 0a  while( cnt>0 ){.
7b50: 20 20 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 20 20      pOut++;.    
7b60: 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
7b70: 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 56  (p, pOut);.    V
7b80: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4f  dbeMemRelease(pO
7b90: 75 74 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66  ut);.    pOut->f
7ba0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
7bb0: 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 7d 0a  .    cnt--;.  }.
7bc0: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20    break;.}.../* 
7bd0: 4f 70 63 6f 64 65 3a 20 42 6c 6f 62 20 50 31 20  Opcode: Blob P1 
7be0: 50 32 20 2a 20 50 34 0a 2a 2a 0a 2a 2a 20 50 34  P2 * P4.**.** P4
7bf0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 6c 6f   points to a blo
7c00: 62 20 6f 66 20 64 61 74 61 20 50 31 20 62 79 74  b of data P1 byt
7c10: 65 73 20 6c 6f 6e 67 2e 20 20 53 74 6f 72 65 20  es long.  Store 
7c20: 74 68 69 73 0a 2a 2a 20 62 6c 6f 62 20 69 6e 20  this.** blob in 
7c30: 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a  register P2..*/.
7c40: 63 61 73 65 20 4f 50 5f 42 6c 6f 62 3a 20 7b 20  case OP_Blob: { 
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7c60: 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73  * out2-prereleas
7c70: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  e */.  assert( p
7c80: 4f 70 2d 3e 70 31 20 3c 3d 20 53 51 4c 49 54 45  Op->p1 <= SQLITE
7c90: 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  _MAX_LENGTH );. 
7ca0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
7cb0: 65 74 53 74 72 28 70 4f 75 74 2c 20 70 4f 70 2d  etStr(pOut, pOp-
7cc0: 3e 70 34 2e 7a 2c 20 70 4f 70 2d 3e 70 31 2c 20  >p4.z, pOp->p1, 
7cd0: 30 2c 20 30 29 3b 0a 20 20 70 4f 75 74 2d 3e 65  0, 0);.  pOut->e
7ce0: 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20  nc = encoding;. 
7cf0: 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42   UPDATE_MAX_BLOB
7d00: 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72  SIZE(pOut);.  br
7d10: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
7d20: 65 3a 20 56 61 72 69 61 62 6c 65 20 50 31 20 50  e: Variable P1 P
7d30: 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54  2 * P4 *.**.** T
7d40: 72 61 6e 73 66 65 72 20 74 68 65 20 76 61 6c 75  ransfer the valu
7d50: 65 73 20 6f 66 20 62 6f 75 6e 64 20 70 61 72 61  es of bound para
7d60: 6d 65 74 65 72 20 50 31 20 69 6e 74 6f 20 72 65  meter P1 into re
7d70: 67 69 73 74 65 72 20 50 32 0a 2a 2a 0a 2a 2a 20  gister P2.**.** 
7d80: 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
7d90: 20 69 73 20 6e 61 6d 65 64 2c 20 74 68 65 6e 20   is named, then 
7da0: 69 74 73 20 6e 61 6d 65 20 61 70 70 65 61 72 73  its name appears
7db0: 20 69 6e 20 50 34 20 61 6e 64 20 50 33 3d 3d 31   in P4 and P3==1
7dc0: 2e 0a 2a 2a 20 54 68 65 20 50 34 20 76 61 6c 75  ..** The P4 valu
7dd0: 65 20 69 73 20 75 73 65 64 20 62 79 20 73 71 6c  e is used by sql
7de0: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
7df0: 74 65 72 5f 6e 61 6d 65 28 29 2e 0a 2a 2f 0a 63  ter_name()..*/.c
7e00: 61 73 65 20 4f 50 5f 56 61 72 69 61 62 6c 65 3a  ase OP_Variable:
7e10: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {            /*
7e20: 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65   out2-prerelease
7e30: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 56 61 72 3b   */.  Mem *pVar;
7e40: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
7e50: 62 65 69 6e 67 20 74 72 61 6e 73 66 65 72 72 65  being transferre
7e60: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
7e70: 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70  pOp->p1>0 && pOp
7e80: 2d 3e 70 31 3c 3d 70 2d 3e 6e 56 61 72 20 29 3b  ->p1<=p->nVar );
7e90: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
7ea0: 70 34 2e 7a 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e  p4.z==0 || pOp->
7eb0: 70 34 2e 7a 3d 3d 70 2d 3e 61 7a 56 61 72 5b 70  p4.z==p->azVar[p
7ec0: 4f 70 2d 3e 70 31 2d 31 5d 20 29 3b 0a 20 20 70  Op->p1-1] );.  p
7ed0: 56 61 72 20 3d 20 26 70 2d 3e 61 56 61 72 5b 70  Var = &p->aVar[p
7ee0: 4f 70 2d 3e 70 31 20 2d 20 31 5d 3b 0a 20 20 69  Op->p1 - 1];.  i
7ef0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
7f00: 6d 54 6f 6f 42 69 67 28 70 56 61 72 29 20 29 7b  mTooBig(pVar) ){
7f10: 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69  .    goto too_bi
7f20: 67 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  g;.  }.  sqlite3
7f30: 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
7f40: 70 79 28 70 4f 75 74 2c 20 70 56 61 72 2c 20 4d  py(pOut, pVar, M
7f50: 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20 55 50  EM_Static);.  UP
7f60: 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
7f70: 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b  E(pOut);.  break
7f80: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
7f90: 4d 6f 76 65 20 50 31 20 50 32 20 50 33 20 2a 20  Move P1 P2 P3 * 
7fa0: 2a 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  *.**.** Move the
7fb0: 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73   values in regis
7fc0: 74 65 72 20 50 31 2e 2e 50 31 2b 50 33 2d 31 20  ter P1..P1+P3-1 
7fd0: 6f 76 65 72 20 69 6e 74 6f 0a 2a 2a 20 72 65 67  over into.** reg
7fe0: 69 73 74 65 72 73 20 50 32 2e 2e 50 32 2b 50 33  isters P2..P2+P3
7ff0: 2d 31 2e 20 20 52 65 67 69 73 74 65 72 73 20 50  -1.  Registers P
8000: 31 2e 2e 50 31 2b 50 31 2d 31 20 61 72 65 0a 2a  1..P1+P1-1 are.*
8010: 2a 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61  * left holding a
8020: 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 20 61 6e   NULL.  It is an
8030: 20 65 72 72 6f 72 20 66 6f 72 20 72 65 67 69 73   error for regis
8040: 74 65 72 20 72 61 6e 67 65 73 0a 2a 2a 20 50 31  ter ranges.** P1
8050: 2e 2e 50 31 2b 50 33 2d 31 20 61 6e 64 20 50 32  ..P1+P3-1 and P2
8060: 2e 2e 50 32 2b 50 33 2d 31 20 74 6f 20 6f 76 65  ..P2+P3-1 to ove
8070: 72 6c 61 70 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  rlap..*/.case OP
8080: 5f 4d 6f 76 65 3a 20 7b 0a 20 20 63 68 61 72 20  _Move: {.  char 
8090: 2a 7a 4d 61 6c 6c 6f 63 3b 20 20 20 2f 2a 20 48  *zMalloc;   /* H
80a0: 6f 6c 64 69 6e 67 20 76 61 72 69 61 62 6c 65 20  olding variable 
80b0: 66 6f 72 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  for allocated me
80c0: 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  mory */.  int n;
80d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
80e0: 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72  mber of register
80f0: 73 20 6c 65 66 74 20 74 6f 20 63 6f 70 79 20 2a  s left to copy *
8100: 2f 0a 20 20 69 6e 74 20 70 31 3b 20 20 20 20 20  /.  int p1;     
8110: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
8120: 20 74 6f 20 63 6f 70 79 20 66 72 6f 6d 20 2a 2f   to copy from */
8130: 0a 20 20 69 6e 74 20 70 32 3b 20 20 20 20 20 20  .  int p2;      
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 74 6f 20 2a 2f 0a 0a 20  to copy to */.. 
8160: 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20   n = pOp->p3;.  
8170: 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  p1 = pOp->p1;.  
8180: 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  p2 = pOp->p2;.  
8190: 61 73 73 65 72 74 28 20 6e 3e 30 20 26 26 20 70  assert( n>0 && p
81a0: 31 3e 30 20 26 26 20 70 32 3e 30 20 29 3b 0a 20  1>0 && p2>0 );. 
81b0: 20 61 73 73 65 72 74 28 20 70 31 2b 6e 3c 3d 70   assert( p1+n<=p
81c0: 32 20 7c 7c 20 70 32 2b 6e 3c 3d 70 31 20 29 3b  2 || p2+n<=p1 );
81d0: 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ..  pIn1 = &aMem
81e0: 5b 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26  [p1];.  pOut = &
81f0: 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20 77 68 69 6c  aMem[p2];.  whil
8200: 65 28 20 6e 2d 2d 20 29 7b 0a 20 20 20 20 61 73  e( n-- ){.    as
8210: 73 65 72 74 28 20 70 4f 75 74 3c 3d 26 61 4d 65  sert( pOut<=&aMe
8220: 6d 5b 70 2d 3e 6e 4d 65 6d 5d 20 29 3b 0a 20 20  m[p->nMem] );.  
8230: 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 3c 3d    assert( pIn1<=
8240: 26 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 5d 20 29  &aMem[p->nMem] )
8250: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
8260: 6d 49 73 56 61 6c 69 64 28 70 49 6e 31 29 20 29  mIsValid(pIn1) )
8270: 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f  ;.    memAboutTo
8280: 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b  Change(p, pOut);
8290: 0a 20 20 20 20 7a 4d 61 6c 6c 6f 63 20 3d 20 70  .    zMalloc = p
82a0: 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20  Out->zMalloc;.  
82b0: 20 20 70 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 20    pOut->zMalloc 
82c0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
82d0: 56 64 62 65 4d 65 6d 4d 6f 76 65 28 70 4f 75 74  VdbeMemMove(pOut
82e0: 2c 20 70 49 6e 31 29 3b 0a 23 69 66 64 65 66 20  , pIn1);.#ifdef 
82f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
8300: 20 69 66 28 20 70 4f 75 74 2d 3e 70 53 63 6f 70   if( pOut->pScop
8310: 79 46 72 6f 6d 3e 3d 26 61 4d 65 6d 5b 70 31 5d  yFrom>=&aMem[p1]
8320: 20 26 26 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79   && pOut->pScopy
8330: 46 72 6f 6d 3c 26 61 4d 65 6d 5b 70 31 2b 70 4f  From<&aMem[p1+pO
8340: 70 2d 3e 70 33 5d 20 29 7b 0a 20 20 20 20 20 20  p->p3] ){.      
8350: 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d  pOut->pScopyFrom
8360: 20 2b 3d 20 70 31 20 2d 20 70 4f 70 2d 3e 70 32   += p1 - pOp->p2
8370: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8380: 20 20 20 70 49 6e 31 2d 3e 7a 4d 61 6c 6c 6f 63     pIn1->zMalloc
8390: 20 3d 20 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20   = zMalloc;.    
83a0: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
83b0: 32 2b 2b 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20  2++, pOut);.    
83c0: 70 49 6e 31 2b 2b 3b 0a 20 20 20 20 70 4f 75 74  pIn1++;.    pOut
83d0: 2b 2b 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  ++;.  }.  break;
83e0: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  .}../* Opcode: C
83f0: 6f 70 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  opy P1 P2 * * *.
8400: 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70  **.** Make a cop
8410: 79 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 31  y of register P1
8420: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
8430: 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  2..**.** This in
8440: 73 74 72 75 63 74 69 6f 6e 20 6d 61 6b 65 73 20  struction makes 
8450: 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74  a deep copy of t
8460: 68 65 20 76 61 6c 75 65 2e 20 20 41 20 64 75 70  he value.  A dup
8470: 6c 69 63 61 74 65 0a 2a 2a 20 69 73 20 6d 61 64  licate.** is mad
8480: 65 20 6f 66 20 61 6e 79 20 73 74 72 69 6e 67 20  e of any string 
8490: 6f 72 20 62 6c 6f 62 20 63 6f 6e 73 74 61 6e 74  or blob constant
84a0: 2e 20 20 53 65 65 20 61 6c 73 6f 20 4f 50 5f 53  .  See also OP_S
84b0: 43 6f 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  Copy..*/.case OP
84c0: 5f 43 6f 70 79 3a 20 7b 20 20 20 20 20 20 20 20  _Copy: {        
84d0: 20 20 20 20 20 2f 2a 20 69 6e 31 2c 20 6f 75 74       /* in1, out
84e0: 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61  2 */.  pIn1 = &a
84f0: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
8500: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
8510: 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p2];.  assert(
8520: 20 70 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a 20   pOut!=pIn1 );. 
8530: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
8540: 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c  hallowCopy(pOut,
8550: 20 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65 6d   pIn1, MEM_Ephem
8560: 29 3b 0a 20 20 44 65 65 70 68 65 6d 65 72 61 6c  );.  Deephemeral
8570: 69 7a 65 28 70 4f 75 74 29 3b 0a 20 20 52 45 47  ize(pOut);.  REG
8580: 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
8590: 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20 62 72  >p2, pOut);.  br
85a0: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
85b0: 65 3a 20 53 43 6f 70 79 20 50 31 20 50 32 20 2a  e: SCopy P1 P2 *
85c0: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20   * *.**.** Make 
85d0: 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f  a shallow copy o
85e0: 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69 6e  f register P1 in
85f0: 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
8600: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72  **.** This instr
8610: 75 63 74 69 6f 6e 20 6d 61 6b 65 73 20 61 20 73  uction makes a s
8620: 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74  hallow copy of t
8630: 68 65 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68  he value.  If th
8640: 65 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 61 20  e value.** is a 
8650: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 2c 20  string or blob, 
8660: 74 68 65 6e 20 74 68 65 20 63 6f 70 79 20 69 73  then the copy is
8670: 20 6f 6e 6c 79 20 61 20 70 6f 69 6e 74 65 72 20   only a pointer 
8680: 74 6f 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  to the.** origin
8690: 61 6c 20 61 6e 64 20 68 65 6e 63 65 20 69 66 20  al and hence if 
86a0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 68 61  the original cha
86b0: 6e 67 65 73 20 73 6f 20 77 69 6c 6c 20 74 68 65  nges so will the
86c0: 20 63 6f 70 79 2e 0a 2a 2a 20 57 6f 72 73 65 2c   copy..** Worse,
86d0: 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   if the original
86e0: 20 69 73 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c   is deallocated,
86f0: 20 74 68 65 20 63 6f 70 79 20 62 65 63 6f 6d 65   the copy become
8700: 73 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 20 54 68  s invalid..** Th
8710: 75 73 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6d  us the program m
8720: 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
8730: 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
8740: 77 69 6c 6c 20 6e 6f 74 20 63 68 61 6e 67 65 0a  will not change.
8750: 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 6c 69  ** during the li
8760: 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f  fetime of the co
8770: 70 79 2e 20 20 55 73 65 20 4f 50 5f 43 6f 70 79  py.  Use OP_Copy
8780: 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 6d 70 6c   to make a compl
8790: 65 74 65 0a 2a 2a 20 63 6f 70 79 2e 0a 2a 2f 0a  ete.** copy..*/.
87a0: 63 61 73 65 20 4f 50 5f 53 43 6f 70 79 3a 20 7b  case OP_SCopy: {
87b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
87c0: 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49  n1, out2 */.  pI
87d0: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
87e0: 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61  p1];.  pOut = &a
87f0: 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
8800: 61 73 73 65 72 74 28 20 70 4f 75 74 21 3d 70 49  assert( pOut!=pI
8810: 6e 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  n1 );.  sqlite3V
8820: 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70  dbeMemShallowCop
8830: 79 28 70 4f 75 74 2c 20 70 49 6e 31 2c 20 4d 45  y(pOut, pIn1, ME
8840: 4d 5f 45 70 68 65 6d 29 3b 0a 23 69 66 64 65 66  M_Ephem);.#ifdef
8850: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
8860: 69 66 28 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79  if( pOut->pScopy
8870: 46 72 6f 6d 3d 3d 30 20 29 20 70 4f 75 74 2d 3e  From==0 ) pOut->
8880: 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 70 49 6e  pScopyFrom = pIn
8890: 31 3b 0a 23 65 6e 64 69 66 0a 20 20 52 45 47 49  1;.#endif.  REGI
88a0: 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
88b0: 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20 62 72 65  p2, pOut);.  bre
88c0: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
88d0: 3a 20 52 65 73 75 6c 74 52 6f 77 20 50 31 20 50  : ResultRow P1 P
88e0: 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68  2 * * *.**.** Th
88f0: 65 20 72 65 67 69 73 74 65 72 73 20 50 31 20 74  e registers P1 t
8900: 68 72 6f 75 67 68 20 50 31 2b 50 32 2d 31 20 63  hrough P1+P2-1 c
8910: 6f 6e 74 61 69 6e 20 61 20 73 69 6e 67 6c 65 20  ontain a single 
8920: 72 6f 77 20 6f 66 0a 2a 2a 20 72 65 73 75 6c 74  row of.** result
8930: 73 2e 20 54 68 69 73 20 6f 70 63 6f 64 65 20 63  s. This opcode c
8940: 61 75 73 65 73 20 74 68 65 20 73 71 6c 69 74 65  auses the sqlite
8950: 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 20 74 6f  3_step() call to
8960: 20 74 65 72 6d 69 6e 61 74 65 0a 2a 2a 20 77 69   terminate.** wi
8970: 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 52 4f 57  th an SQLITE_ROW
8980: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64   return code and
8990: 20 69 74 20 73 65 74 73 20 75 70 20 74 68 65 20   it sets up the 
89a0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 0a 2a 2a 20  sqlite3_stmt.** 
89b0: 73 74 72 75 63 74 75 72 65 20 74 6f 20 70 72 6f  structure to pro
89c0: 76 69 64 65 20 61 63 63 65 73 73 20 74 6f 20 74  vide access to t
89d0: 68 65 20 74 6f 70 20 50 31 20 76 61 6c 75 65 73  he top P1 values
89e0: 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a   as the result.*
89f0: 2a 20 72 6f 77 2e 0a 2a 2f 0a 63 61 73 65 20 4f  * row..*/.case O
8a00: 50 5f 52 65 73 75 6c 74 52 6f 77 3a 20 7b 0a 20  P_ResultRow: {. 
8a10: 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e   Mem *pMem;.  in
8a20: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t i;.  assert( p
8a30: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 3d 3d 70 4f  ->nResColumn==pO
8a40: 70 2d 3e 70 32 20 29 3b 0a 20 20 61 73 73 65 72  p->p2 );.  asser
8a50: 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a  t( pOp->p1>0 );.
8a60: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
8a70: 31 2b 70 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d  1+pOp->p2<=p->nM
8a80: 65 6d 2b 31 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  em+1 );..  /* If
8a90: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
8aa0: 68 61 73 20 76 69 6f 6c 61 74 65 64 20 69 6d 6d  has violated imm
8ab0: 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
8ac0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ey constraints, 
8ad0: 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 74 75  do.  ** not retu
8ae0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
8af0: 20 72 6f 77 73 20 6d 6f 64 69 66 69 65 64 2e 20   rows modified. 
8b00: 41 6e 64 20 64 6f 20 6e 6f 74 20 52 45 4c 45 41  And do not RELEA
8b10: 53 45 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  SE the statement
8b20: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
8b30: 6e 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62  n. It needs to b
8b40: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
8b50: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
8b60: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
8b70: 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
8b80: 30 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  0)) ){.    asser
8b90: 74 28 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  t( db->flags&SQL
8ba0: 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 3b  ITE_CountRows );
8bb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8bc0: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
8bd0: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
8be0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53  }..  /* If the S
8bf0: 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20  QLITE_CountRows 
8c00: 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 73  flag is set in s
8c10: 71 6c 69 74 65 33 2e 66 6c 61 67 73 20 6d 61 73  qlite3.flags mas
8c20: 6b 2c 20 74 68 65 6e 20 0a 20 20 2a 2a 20 44 4d  k, then .  ** DM
8c30: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76  L statements inv
8c40: 6f 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65 20  oke this opcode 
8c50: 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  to return the nu
8c60: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 20 20  mber of rows .  
8c70: 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 74  ** modified to t
8c80: 68 65 20 75 73 65 72 2e 20 54 68 69 73 20 69 73  he user. This is
8c90: 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68   the only way th
8ca0: 61 74 20 61 20 56 4d 20 74 68 61 74 0a 20 20 2a  at a VM that.  *
8cb0: 2a 20 6f 70 65 6e 73 20 61 20 73 74 61 74 65 6d  * opens a statem
8cc0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
8cd0: 6d 61 79 20 69 6e 76 6f 6b 65 20 74 68 69 73 20  may invoke this 
8ce0: 6f 70 63 6f 64 65 2e 0a 20 20 2a 2a 0a 20 20 2a  opcode..  **.  *
8cf0: 2a 20 49 6e 20 63 61 73 65 20 74 68 69 73 20 69  * In case this i
8d00: 73 20 73 75 63 68 20 61 20 73 74 61 74 65 6d 65  s such a stateme
8d10: 6e 74 2c 20 63 6c 6f 73 65 20 61 6e 79 20 73 74  nt, close any st
8d20: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
8d30: 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 65 64 20  ion.  ** opened 
8d40: 62 79 20 74 68 69 73 20 56 4d 20 62 65 66 6f 72  by this VM befor
8d50: 65 20 72 65 74 75 72 6e 69 6e 67 20 63 6f 6e 74  e returning cont
8d60: 72 6f 6c 20 74 6f 20 74 68 65 20 75 73 65 72 2e  rol to the user.
8d70: 20 54 68 69 73 20 69 73 20 74 6f 0a 20 20 2a 2a   This is to.  **
8d80: 20 65 6e 73 75 72 65 20 74 68 61 74 20 73 74 61   ensure that sta
8d90: 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
8da0: 6f 6e 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e  ons are always n
8db0: 65 73 74 65 64 2c 20 6e 6f 74 20 6f 76 65 72 6c  ested, not overl
8dc0: 61 70 70 69 6e 67 2e 0a 20 20 2a 2a 20 49 66 20  apping..  ** If 
8dd0: 74 68 65 20 6f 70 65 6e 20 73 74 61 74 65 6d 65  the open stateme
8de0: 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt-transaction i
8df0: 73 20 6e 6f 74 20 63 6c 6f 73 65 64 20 68 65 72  s not closed her
8e00: 65 2c 20 74 68 65 6e 20 74 68 65 20 75 73 65 72  e, then the user
8e10: 0a 20 20 2a 2a 20 6d 61 79 20 73 74 65 70 20 61  .  ** may step a
8e20: 6e 6f 74 68 65 72 20 56 4d 20 74 68 61 74 20 6f  nother VM that o
8e30: 70 65 6e 73 20 69 74 73 20 6f 77 6e 20 73 74 61  pens its own sta
8e40: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
8e50: 6f 6e 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6d 61  on. This.  ** ma
8e60: 79 20 6c 65 61 64 20 74 6f 20 6f 76 65 72 6c 61  y lead to overla
8e70: 70 70 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20  pping statement 
8e80: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20  transactions..  
8e90: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 74  **.  ** The stat
8ea0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
8eb0: 6e 20 69 73 20 6e 65 76 65 72 20 61 20 74 6f 70  n is never a top
8ec0: 2d 6c 65 76 65 6c 20 74 72 61 6e 73 61 63 74 69  -level transacti
8ed0: 6f 6e 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20  on.  Hence.  ** 
8ee0: 74 68 65 20 52 45 4c 45 41 53 45 20 63 61 6c 6c  the RELEASE call
8ef0: 20 62 65 6c 6f 77 20 63 61 6e 20 6e 65 76 65 72   below can never
8f00: 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73   fail..  */.  as
8f10: 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d  sert( p->iStatem
8f20: 65 6e 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 66 6c  ent==0 || db->fl
8f30: 61 67 73 26 53 51 4c 49 54 45 5f 43 6f 75 6e 74  ags&SQLITE_Count
8f40: 52 6f 77 73 20 29 3b 0a 20 20 72 63 20 3d 20 73  Rows );.  rc = s
8f50: 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
8f60: 74 61 74 65 6d 65 6e 74 28 70 2c 20 53 41 56 45  tatement(p, SAVE
8f70: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a  POINT_RELEASE);.
8f80: 20 20 69 66 28 20 4e 45 56 45 52 28 72 63 21 3d    if( NEVER(rc!=
8f90: 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20  SQLITE_OK) ){.  
8fa0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
8fb0: 2f 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 61 6c  /* Invalidate al
8fc0: 6c 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73  l ephemeral curs
8fd0: 6f 72 20 72 6f 77 20 63 61 63 68 65 73 20 2a 2f  or row caches */
8fe0: 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d  .  p->cacheCtr =
8ff0: 20 28 70 2d 3e 63 61 63 68 65 43 74 72 20 2b 20   (p->cacheCtr + 
9000: 32 29 7c 31 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  2)|1;..  /* Make
9010: 20 73 75 72 65 20 74 68 65 20 72 65 73 75 6c 74   sure the result
9020: 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  s of the current
9030: 20 72 6f 77 20 61 72 65 20 5c 30 30 30 20 74 65   row are \000 te
9040: 72 6d 69 6e 61 74 65 64 0a 20 20 2a 2a 20 61 6e  rminated.  ** an
9050: 64 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e  d have an assign
9060: 65 64 20 74 79 70 65 2e 20 20 54 68 65 20 72 65  ed type.  The re
9070: 73 75 6c 74 73 20 61 72 65 20 64 65 2d 65 70 68  sults are de-eph
9080: 65 6d 65 72 61 6c 69 7a 65 64 20 61 73 0a 20 20  emeralized as.  
9090: 2a 2a 20 61 20 73 69 64 65 20 65 66 66 65 63 74  ** a side effect
90a0: 2e 0a 20 20 2a 2f 0a 20 20 70 4d 65 6d 20 3d 20  ..  */.  pMem = 
90b0: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
90c0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
90d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 70    for(i=0; i<pOp
90e0: 2d 3e 70 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ->p2; i++){.    
90f0: 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
9100: 69 64 28 26 70 4d 65 6d 5b 69 5d 29 20 29 3b 0a  id(&pMem[i]) );.
9110: 20 20 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69      Deephemerali
9120: 7a 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20  ze(&pMem[i]);.  
9130: 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 5b    assert( (pMem[
9140: 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 45  i].flags & MEM_E
9150: 70 68 65 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20  phem)==0.       
9160: 20 20 20 20 20 7c 7c 20 28 70 4d 65 6d 5b 69 5d       || (pMem[i]
9170: 2e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74  .flags & (MEM_St
9180: 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20  r|MEM_Blob))==0 
9190: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
91a0: 62 65 4d 65 6d 4e 75 6c 54 65 72 6d 69 6e 61 74  beMemNulTerminat
91b0: 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 20  e(&pMem[i]);.   
91c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
91d0: 74 6f 72 65 54 79 70 65 28 26 70 4d 65 6d 5b 69  toreType(&pMem[i
91e0: 5d 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52  ]);.    REGISTER
91f0: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2b 69  _TRACE(pOp->p1+i
9200: 2c 20 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 7d  , &pMem[i]);.  }
9210: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
9220: 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 6e  cFailed ) goto n
9230: 6f 5f 6d 65 6d 3b 0a 0a 20 20 2f 2a 20 52 65 74  o_mem;..  /* Ret
9240: 75 72 6e 20 53 51 4c 49 54 45 5f 52 4f 57 0a 20  urn SQLITE_ROW. 
9250: 20 2a 2f 0a 20 20 70 2d 3e 70 63 20 3d 20 70 63   */.  p->pc = pc
9260: 20 2b 20 31 3b 0a 20 20 72 63 20 3d 20 53 51 4c   + 1;.  rc = SQL
9270: 49 54 45 5f 52 4f 57 3b 0a 20 20 67 6f 74 6f 20  ITE_ROW;.  goto 
9280: 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a  vdbe_return;.}..
9290: 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6e 63 61  /* Opcode: Conca
92a0: 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  t P1 P2 P3 * *.*
92b0: 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 74 65 78  *.** Add the tex
92c0: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  t in register P1
92d0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
92e0: 20 74 68 65 20 74 65 78 74 20 69 6e 0a 2a 2a 20   the text in.** 
92f0: 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 64 20  register P2 and 
9300: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
9310: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
9320: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 74 68  .** If either th
9330: 65 20 50 31 20 6f 72 20 50 32 20 74 65 78 74 20  e P1 or P2 text 
9340: 61 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20 73 74  are NULL then st
9350: 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 50 33 2e 0a  ore NULL in P3..
9360: 2a 2a 0a 2a 2a 20 20 20 50 33 20 3d 20 50 32 20  **.**   P3 = P2 
9370: 7c 7c 20 50 31 0a 2a 2a 0a 2a 2a 20 49 74 20 69  || P1.**.** It i
9380: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 50 31  s illegal for P1
9390: 20 61 6e 64 20 50 33 20 74 6f 20 62 65 20 74 68   and P3 to be th
93a0: 65 20 73 61 6d 65 20 72 65 67 69 73 74 65 72 2e  e same register.
93b0: 20 53 6f 6d 65 74 69 6d 65 73 2c 0a 2a 2a 20 69   Sometimes,.** i
93c0: 66 20 50 33 20 69 73 20 74 68 65 20 73 61 6d 65  f P3 is the same
93d0: 20 72 65 67 69 73 74 65 72 20 61 73 20 50 32 2c   register as P2,
93e0: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
93f0: 69 6f 6e 20 69 73 20 61 62 6c 65 0a 2a 2a 20 74  ion is able.** t
9400: 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 63 70 79  o avoid a memcpy
9410: 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  ()..*/.case OP_C
9420: 6f 6e 63 61 74 3a 20 7b 20 20 20 20 20 20 20 20  oncat: {        
9430: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
9440: 5f 43 4f 4e 43 41 54 2c 20 69 6e 31 2c 20 69 6e  _CONCAT, in1, in
9450: 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34  2, out3 */.  i64
9460: 20 6e 42 79 74 65 3b 0a 0a 20 20 70 49 6e 31 20   nByte;..  pIn1 
9470: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
9480: 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d  ;.  pIn2 = &aMem
9490: 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75  [pOp->p2];.  pOu
94a0: 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
94b0: 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  3];.  assert( pI
94c0: 6e 31 21 3d 70 4f 75 74 20 29 3b 0a 20 20 69 66  n1!=pOut );.  if
94d0: 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c  ( (pIn1->flags |
94e0: 20 70 49 6e 32 2d 3e 66 6c 61 67 73 29 20 26 20   pIn2->flags) & 
94f0: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
9500: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
9510: 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20  tNull(pOut);.   
9520: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
9530: 28 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e  ( ExpandBlob(pIn
9540: 31 29 20 7c 7c 20 45 78 70 61 6e 64 42 6c 6f 62  1) || ExpandBlob
9550: 28 70 49 6e 32 29 20 29 20 67 6f 74 6f 20 6e 6f  (pIn2) ) goto no
9560: 5f 6d 65 6d 3b 0a 20 20 53 74 72 69 6e 67 69 66  _mem;.  Stringif
9570: 79 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69 6e 67  y(pIn1, encoding
9580: 29 3b 0a 20 20 53 74 72 69 6e 67 69 66 79 28 70  );.  Stringify(p
9590: 49 6e 32 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  In2, encoding);.
95a0: 20 20 6e 42 79 74 65 20 3d 20 70 49 6e 31 2d 3e    nByte = pIn1->
95b0: 6e 20 2b 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 69  n + pIn2->n;.  i
95c0: 66 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69  f( nByte>db->aLi
95d0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
95e0: 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20  _LENGTH] ){.    
95f0: 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20  goto too_big;.  
9600: 7d 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c  }.  MemSetTypeFl
9610: 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 53 74 72  ag(pOut, MEM_Str
9620: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
9630: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4f 75 74  VdbeMemGrow(pOut
9640: 2c 20 28 69 6e 74 29 6e 42 79 74 65 2b 32 2c 20  , (int)nByte+2, 
9650: 70 4f 75 74 3d 3d 70 49 6e 32 29 20 29 7b 0a 20  pOut==pIn2) ){. 
9660: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
9670: 20 20 7d 0a 20 20 69 66 28 20 70 4f 75 74 21 3d    }.  if( pOut!=
9680: 70 49 6e 32 20 29 7b 0a 20 20 20 20 6d 65 6d 63  pIn2 ){.    memc
9690: 70 79 28 70 4f 75 74 2d 3e 7a 2c 20 70 49 6e 32  py(pOut->z, pIn2
96a0: 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 6e 29 3b 0a 20  ->z, pIn2->n);. 
96b0: 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70 4f 75   }.  memcpy(&pOu
96c0: 74 2d 3e 7a 5b 70 49 6e 32 2d 3e 6e 5d 2c 20 70  t->z[pIn2->n], p
96d0: 49 6e 31 2d 3e 7a 2c 20 70 49 6e 31 2d 3e 6e 29  In1->z, pIn1->n)
96e0: 3b 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74  ;.  pOut->z[nByt
96f0: 65 5d 20 3d 20 30 3b 0a 20 20 70 4f 75 74 2d 3e  e] = 0;.  pOut->
9700: 7a 5b 6e 42 79 74 65 2b 31 5d 20 3d 20 30 3b 0a  z[nByte+1] = 0;.
9710: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d    pOut->flags |=
9720: 20 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75   MEM_Term;.  pOu
9730: 74 2d 3e 6e 20 3d 20 28 69 6e 74 29 6e 42 79 74  t->n = (int)nByt
9740: 65 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d  e;.  pOut->enc =
9750: 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44   encoding;.  UPD
9760: 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
9770: 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b  (pOut);.  break;
9780: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41  .}../* Opcode: A
9790: 64 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  dd P1 P2 P3 * *.
97a0: 2a 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 76 61  **.** Add the va
97b0: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
97c0: 50 31 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  P1 to the value 
97d0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a  in register P2.*
97e0: 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
97f0: 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74  result in regist
9800: 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74  er P3..** If eit
9810: 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c  her input is NUL
9820: 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  L, the result is
9830: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63   NULL..*/./* Opc
9840: 6f 64 65 3a 20 4d 75 6c 74 69 70 6c 79 20 50 31  ode: Multiply P1
9850: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
9860: 0a 2a 2a 20 4d 75 6c 74 69 70 6c 79 20 74 68 65  .** Multiply the
9870: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
9880: 65 72 20 50 31 20 62 79 20 74 68 65 20 76 61 6c  er P1 by the val
9890: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
98a0: 32 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74  2.** and store t
98b0: 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  he result in reg
98c0: 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20  ister P3..** If 
98d0: 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20  either input is 
98e0: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74  NULL, the result
98f0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20   is NULL..*/./* 
9900: 4f 70 63 6f 64 65 3a 20 53 75 62 74 72 61 63 74  Opcode: Subtract
9910: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
9920: 0a 2a 2a 20 53 75 62 74 72 61 63 74 20 74 68 65  .** Subtract the
9930: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
9940: 65 72 20 50 31 20 66 72 6f 6d 20 74 68 65 20 76  er P1 from the v
9950: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
9960: 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65   P2.** and store
9970: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72   the result in r
9980: 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49  egister P3..** I
9990: 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69  f either input i
99a0: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75  s NULL, the resu
99b0: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f  lt is NULL..*/./
99c0: 2a 20 4f 70 63 6f 64 65 3a 20 44 69 76 69 64 65  * Opcode: Divide
99d0: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
99e0: 0a 2a 2a 20 44 69 76 69 64 65 20 74 68 65 20 76  .** Divide the v
99f0: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
9a00: 20 50 31 20 62 79 20 74 68 65 20 76 61 6c 75 65   P1 by the value
9a10: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a   in register P2.
9a20: 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
9a30: 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73   result in regis
9a40: 74 65 72 20 50 33 20 28 50 33 3d 50 32 2f 50 31  ter P3 (P3=P2/P1
9a50: 29 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  ). If the value 
9a60: 69 6e 20 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  in .** register 
9a70: 50 31 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  P1 is zero, then
9a80: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
9a90: 55 4c 4c 2e 20 49 66 20 65 69 74 68 65 72 20 69  ULL. If either i
9aa0: 6e 70 75 74 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c  nput is .** NULL
9ab0: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
9ac0: 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  NULL..*/./* Opco
9ad0: 64 65 3a 20 52 65 6d 61 69 6e 64 65 72 20 50 31  de: Remainder P1
9ae0: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
9af0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 72 65 6d   Compute the rem
9b00: 61 69 6e 64 65 72 20 61 66 74 65 72 20 69 6e 74  ainder after int
9b10: 65 67 65 72 20 64 69 76 69 73 69 6f 6e 20 6f 66  eger division of
9b20: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 0a 2a 2a   the value in.**
9b30: 20 72 65 67 69 73 74 65 72 20 50 31 20 62 79 20   register P1 by 
9b40: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
9b50: 69 73 74 65 72 20 50 32 20 61 6e 64 20 73 74 6f  ister P2 and sto
9b60: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
9b70: 20 50 33 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20   P3. .** If the 
9b80: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
9b90: 72 20 50 32 20 69 73 20 7a 65 72 6f 20 74 68 65  r P2 is zero the
9ba0: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
9bb0: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 70  .** If either op
9bc0: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c 20 74  erand is NULL, t
9bd0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
9be0: 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 64  L..*/.case OP_Ad
9bf0: 64 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d:              
9c00: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
9c10: 54 4b 5f 50 4c 55 53 2c 20 69 6e 31 2c 20 69 6e  TK_PLUS, in1, in
9c20: 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
9c30: 4f 50 5f 53 75 62 74 72 61 63 74 3a 20 20 20 20  OP_Subtract:    
9c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
9c50: 65 20 61 73 20 54 4b 5f 4d 49 4e 55 53 2c 20 69  e as TK_MINUS, i
9c60: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
9c70: 0a 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c  .case OP_Multipl
9c80: 79 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y:              
9c90: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 54  /* same as TK_ST
9ca0: 41 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  AR, in1, in2, ou
9cb0: 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 69  t3 */.case OP_Di
9cc0: 76 69 64 65 3a 20 20 20 20 20 20 20 20 20 20 20  vide:           
9cd0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
9ce0: 54 4b 5f 53 4c 41 53 48 2c 20 69 6e 31 2c 20 69  TK_SLASH, in1, i
9cf0: 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65  n2, out3 */.case
9d00: 20 4f 50 5f 52 65 6d 61 69 6e 64 65 72 3a 20 7b   OP_Remainder: {
9d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
9d20: 6d 65 20 61 73 20 54 4b 5f 52 45 4d 2c 20 69 6e  me as TK_REM, in
9d30: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
9d40: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
9d50: 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 4d 45    /* Combined ME
9d60: 4d 5f 2a 20 66 6c 61 67 73 20 66 72 6f 6d 20 62  M_* flags from b
9d70: 6f 74 68 20 69 6e 70 75 74 73 20 2a 2f 0a 20 20  oth inputs */.  
9d80: 69 36 34 20 69 41 3b 20 20 20 20 20 20 20 20 20  i64 iA;         
9d90: 2f 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65  /* Integer value
9da0: 20 6f 66 20 6c 65 66 74 20 6f 70 65 72 61 6e 64   of left operand
9db0: 20 2a 2f 0a 20 20 69 36 34 20 69 42 3b 20 20 20   */.  i64 iB;   
9dc0: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
9dd0: 20 76 61 6c 75 65 20 6f 66 20 72 69 67 68 74 20   value of right 
9de0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f 75  operand */.  dou
9df0: 62 6c 65 20 72 41 3b 20 20 20 20 20 20 2f 2a 20  ble rA;      /* 
9e00: 52 65 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 65  Real value of le
9e10: 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ft operand */.  
9e20: 64 6f 75 62 6c 65 20 72 42 3b 20 20 20 20 20 20  double rB;      
9e30: 2f 2a 20 52 65 61 6c 20 76 61 6c 75 65 20 6f 66  /* Real value of
9e40: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   right operand *
9e50: 2f 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  /..  pIn1 = &aMe
9e60: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 70  m[pOp->p1];.  ap
9e70: 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  plyNumericAffini
9e80: 74 79 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e 32  ty(pIn1);.  pIn2
9e90: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
9ea0: 5d 3b 0a 20 20 61 70 70 6c 79 4e 75 6d 65 72 69  ];.  applyNumeri
9eb0: 63 41 66 66 69 6e 69 74 79 28 70 49 6e 32 29 3b  cAffinity(pIn2);
9ec0: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
9ed0: 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 66 6c 61 67  pOp->p3];.  flag
9ee0: 73 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  s = pIn1->flags 
9ef0: 7c 20 70 49 6e 32 2d 3e 66 6c 61 67 73 3b 0a 20  | pIn2->flags;. 
9f00: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45   if( (flags & ME
9f10: 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29 20 67 6f 74  M_Null)!=0 ) got
9f20: 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73  o arithmetic_res
9f30: 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 69  ult_is_null;.  i
9f40: 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
9f50: 26 20 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20  & pIn2->flags & 
9f60: 4d 45 4d 5f 49 6e 74 29 3d 3d 4d 45 4d 5f 49 6e  MEM_Int)==MEM_In
9f70: 74 20 29 7b 0a 20 20 20 20 69 41 20 3d 20 70 49  t ){.    iA = pI
9f80: 6e 31 2d 3e 75 2e 69 3b 0a 20 20 20 20 69 42 20  n1->u.i;.    iB 
9f90: 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20  = pIn2->u.i;.   
9fa0: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70   switch( pOp->op
9fb0: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61  code ){.      ca
9fc0: 73 65 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20  se OP_Add:      
9fd0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 64 64 49   if( sqlite3AddI
9fe0: 6e 74 36 34 28 26 69 42 2c 69 41 29 20 29 20 67  nt64(&iB,iA) ) g
9ff0: 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 20 20 62 72  oto fp_math;  br
a000: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a010: 4f 50 5f 53 75 62 74 72 61 63 74 3a 20 20 69 66  OP_Subtract:  if
a020: 28 20 73 71 6c 69 74 65 33 53 75 62 49 6e 74 36  ( sqlite3SubInt6
a030: 34 28 26 69 42 2c 69 41 29 20 29 20 67 6f 74 6f  4(&iB,iA) ) goto
a040: 20 66 70 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b   fp_math;  break
a050: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  ;.      case OP_
a060: 4d 75 6c 74 69 70 6c 79 3a 20 20 69 66 28 20 73  Multiply:  if( s
a070: 71 6c 69 74 65 33 4d 75 6c 49 6e 74 36 34 28 26  qlite3MulInt64(&
a080: 69 42 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 70  iB,iA) ) goto fp
a090: 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20  _math;  break;. 
a0a0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 44 69 76       case OP_Div
a0b0: 69 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ide: {.        i
a0c0: 66 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20  f( iA==0 ) goto 
a0d0: 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c  arithmetic_resul
a0e0: 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20  t_is_null;.     
a0f0: 20 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 26 26     if( iA==-1 &&
a100: 20 69 42 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e   iB==SMALLEST_IN
a110: 54 36 34 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61  T64 ) goto fp_ma
a120: 74 68 3b 0a 20 20 20 20 20 20 20 20 69 42 20 2f  th;.        iB /
a130: 3d 20 69 41 3b 0a 20 20 20 20 20 20 20 20 62 72  = iA;.        br
a140: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
a150: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
a160: 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d 30 20        if( iA==0 
a170: 29 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69  ) goto arithmeti
a180: 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c  c_result_is_null
a190: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41  ;.        if( iA
a1a0: 3d 3d 2d 31 20 29 20 69 41 20 3d 20 31 3b 0a 20  ==-1 ) iA = 1;. 
a1b0: 20 20 20 20 20 20 20 69 42 20 25 3d 20 69 41 3b         iB %= iA;
a1c0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
a1d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a1e0: 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 42    pOut->u.i = iB
a1f0: 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65  ;.    MemSetType
a200: 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49  Flag(pOut, MEM_I
a210: 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 66 70  nt);.  }else{.fp
a220: 5f 6d 61 74 68 3a 0a 20 20 20 20 72 41 20 3d 20  _math:.    rA = 
a230: 73 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56  sqlite3VdbeRealV
a240: 61 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 20 20  alue(pIn1);.    
a250: 72 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rB = sqlite3Vdbe
a260: 52 65 61 6c 56 61 6c 75 65 28 70 49 6e 32 29 3b  RealValue(pIn2);
a270: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 4f 70  .    switch( pOp
a280: 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20  ->opcode ){.    
a290: 20 20 63 61 73 65 20 4f 50 5f 41 64 64 3a 20 20    case OP_Add:  
a2a0: 20 20 20 20 20 20 20 72 42 20 2b 3d 20 72 41 3b         rB += rA;
a2b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a2c0: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 75 62 74      case OP_Subt
a2d0: 72 61 63 74 3a 20 20 20 20 72 42 20 2d 3d 20 72  ract:    rB -= r
a2e0: 41 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  A;       break;.
a2f0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4d 75        case OP_Mu
a300: 6c 74 69 70 6c 79 3a 20 20 20 20 72 42 20 2a 3d  ltiply:    rB *=
a310: 20 72 41 3b 20 20 20 20 20 20 20 62 72 65 61 6b   rA;       break
a320: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  ;.      case OP_
a330: 44 69 76 69 64 65 3a 20 7b 0a 20 20 20 20 20 20  Divide: {.      
a340: 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49    /* (double)0 I
a350: 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45  n case of SQLITE
a360: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
a370: 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20  OINT... */.     
a380: 20 20 20 69 66 28 20 72 41 3d 3d 28 64 6f 75 62     if( rA==(doub
a390: 6c 65 29 30 20 29 20 67 6f 74 6f 20 61 72 69 74  le)0 ) goto arit
a3a0: 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73  hmetic_result_is
a3b0: 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 72  _null;.        r
a3c0: 42 20 2f 3d 20 72 41 3b 0a 20 20 20 20 20 20 20  B /= rA;.       
a3d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
a3e0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
a3f0: 0a 20 20 20 20 20 20 20 20 69 41 20 3d 20 28 69  .        iA = (i
a400: 36 34 29 72 41 3b 0a 20 20 20 20 20 20 20 20 69  64)rA;.        i
a410: 42 20 3d 20 28 69 36 34 29 72 42 3b 0a 20 20 20  B = (i64)rB;.   
a420: 20 20 20 20 20 69 66 28 20 69 41 3d 3d 30 20 29       if( iA==0 )
a430: 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63   goto arithmetic
a440: 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b  _result_is_null;
a450: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d  .        if( iA=
a460: 3d 2d 31 20 29 20 69 41 20 3d 20 31 3b 0a 20 20  =-1 ) iA = 1;.  
a470: 20 20 20 20 20 20 72 42 20 3d 20 28 64 6f 75 62        rB = (doub
a480: 6c 65 29 28 69 42 20 25 20 69 41 29 3b 0a 20 20  le)(iB % iA);.  
a490: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a4a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65     }.    }.#ifde
a4b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
a4c0: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
a4d0: 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 42 3b   pOut->u.i = rB;
a4e0: 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46  .    MemSetTypeF
a4f0: 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e  lag(pOut, MEM_In
a500: 74 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66  t);.#else.    if
a510: 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 72  ( sqlite3IsNaN(r
a520: 42 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  B) ){.      goto
a530: 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75   arithmetic_resu
a540: 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20  lt_is_null;.    
a550: 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 72 20 3d 20  }.    pOut->r = 
a560: 72 42 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79  rB;.    MemSetTy
a570: 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d  peFlag(pOut, MEM
a580: 5f 52 65 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  _Real);.    if( 
a590: 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  (flags & MEM_Rea
a5a0: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  l)==0 ){.      s
a5b0: 71 6c 69 74 65 33 56 64 62 65 49 6e 74 65 67 65  qlite3VdbeIntege
a5c0: 72 41 66 66 69 6e 69 74 79 28 70 4f 75 74 29 3b  rAffinity(pOut);
a5d0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
a5e0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 61 72 69 74  }.  break;..arit
a5f0: 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73  hmetic_result_is
a600: 5f 6e 75 6c 6c 3a 0a 20 20 73 71 6c 69 74 65 33  _null:.  sqlite3
a610: 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70  VdbeMemSetNull(p
a620: 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  Out);.  break;.}
a630: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6c  ../* Opcode: Col
a640: 6c 53 65 71 20 50 31 20 2a 20 2a 20 50 34 0a 2a  lSeq P1 * * P4.*
a650: 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69  *.** P4 is a poi
a660: 6e 74 65 72 20 74 6f 20 61 20 43 6f 6c 6c 53 65  nter to a CollSe
a670: 71 20 73 74 72 75 63 74 2e 20 49 66 20 74 68 65  q struct. If the
a680: 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 20   next call to a 
a690: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  user function.**
a6a0: 20 6f 72 20 61 67 67 72 65 67 61 74 65 20 63 61   or aggregate ca
a6b0: 6c 6c 73 20 73 71 6c 69 74 65 33 47 65 74 46 75  lls sqlite3GetFu
a6c0: 6e 63 43 6f 6c 6c 53 65 71 28 29 2c 20 74 68 69  ncCollSeq(), thi
a6d0: 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  s collation sequ
a6e0: 65 6e 63 65 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  ence will.** be 
a6f0: 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 69  returned. This i
a700: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 75  s used by the bu
a710: 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 2c 20 6d 61  ilt-in min(), ma
a720: 78 28 29 20 61 6e 64 20 6e 75 6c 6c 69 66 28 29  x() and nullif()
a730: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  .** functions..*
a740: 2a 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 6f  *.** If P1 is no
a750: 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  t zero, then it 
a760: 69 73 20 61 20 72 65 67 69 73 74 65 72 20 74 68  is a register th
a770: 61 74 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  at a subsequent 
a780: 6d 69 6e 28 29 20 6f 72 0a 2a 2a 20 6d 61 78 28  min() or.** max(
a790: 29 20 61 67 67 72 65 67 61 74 65 20 77 69 6c 6c  ) aggregate will
a7a0: 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
a7b0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
a7c0: 6e 6f 74 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20  not the minimum 
a7d0: 6f 72 0a 2a 2a 20 6d 61 78 69 6d 75 6d 2e 20 20  or.** maximum.  
a7e0: 54 68 65 20 50 31 20 72 65 67 69 73 74 65 72 20  The P1 register 
a7f0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
a800: 6f 20 30 20 62 79 20 74 68 69 73 20 69 6e 73 74  o 0 by this inst
a810: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ruction..**.** T
a820: 68 65 20 69 6e 74 65 72 66 61 63 65 20 75 73 65  he interface use
a830: 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65  d by the impleme
a840: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 61  ntation of the a
a850: 66 6f 72 65 6d 65 6e 74 69 6f 6e 65 64 20 66 75  forementioned fu
a860: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 6f 20 72 65  nctions.** to re
a870: 74 72 69 65 76 65 20 74 68 65 20 63 6f 6c 6c 61  trieve the colla
a880: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 73 65  tion sequence se
a890: 74 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65  t by this opcode
a8a0: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
a8b0: 65 0a 2a 2a 20 70 75 62 6c 69 63 6c 79 2c 20 6f  e.** publicly, o
a8c0: 6e 6c 79 20 74 6f 20 75 73 65 72 20 66 75 6e 63  nly to user func
a8d0: 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20 69 6e  tions defined in
a8e0: 20 66 75 6e 63 2e 63 2e 0a 2a 2f 0a 63 61 73 65   func.c..*/.case
a8f0: 20 4f 50 5f 43 6f 6c 6c 53 65 71 3a 20 7b 0a 20   OP_CollSeq: {. 
a900: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
a910: 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51  type==P4_COLLSEQ
a920: 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   );.  if( pOp->p
a930: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
a940: 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28  VdbeMemSetInt64(
a950: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 2c 20  &aMem[pOp->p1], 
a960: 30 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  0);.  }.  break;
a970: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46  .}../* Opcode: F
a980: 75 6e 63 74 69 6f 6e 20 50 31 20 50 32 20 50 33  unction P1 P2 P3
a990: 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 49 6e 76   P4 P5.**.** Inv
a9a0: 6f 6b 65 20 61 20 75 73 65 72 20 66 75 6e 63 74  oke a user funct
a9b0: 69 6f 6e 20 28 50 34 20 69 73 20 61 20 70 6f 69  ion (P4 is a poi
a9c0: 6e 74 65 72 20 74 6f 20 61 20 46 75 6e 63 74 69  nter to a Functi
a9d0: 6f 6e 20 73 74 72 75 63 74 75 72 65 20 74 68 61  on structure tha
a9e0: 74 0a 2a 2a 20 64 65 66 69 6e 65 73 20 74 68 65  t.** defines the
a9f0: 20 66 75 6e 63 74 69 6f 6e 29 20 77 69 74 68 20   function) with 
aa00: 50 35 20 61 72 67 75 6d 65 6e 74 73 20 74 61 6b  P5 arguments tak
aa10: 65 6e 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  en from register
aa20: 20 50 32 20 61 6e 64 0a 2a 2a 20 73 75 63 63 65   P2 and.** succe
aa30: 73 73 6f 72 73 2e 20 20 54 68 65 20 72 65 73 75  ssors.  The resu
aa40: 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  lt of the functi
aa50: 6f 6e 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  on is stored in 
aa60: 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20  register P3..** 
aa70: 52 65 67 69 73 74 65 72 20 50 33 20 6d 75 73 74  Register P3 must
aa80: 20 6e 6f 74 20 62 65 20 6f 6e 65 20 6f 66 20 74   not be one of t
aa90: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 70 75  he function inpu
aaa0: 74 73 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20  ts..**.** P1 is 
aab0: 61 20 33 32 2d 62 69 74 20 62 69 74 6d 61 73 6b  a 32-bit bitmask
aac0: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 65 74   indicating whet
aad0: 68 65 72 20 6f 72 20 6e 6f 74 20 65 61 63 68 20  her or not each 
aae0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
aaf0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  .** function was
ab00: 20 64 65 74 65 72 6d 69 6e 65 64 20 74 6f 20 62   determined to b
ab10: 65 20 63 6f 6e 73 74 61 6e 74 20 61 74 20 63 6f  e constant at co
ab20: 6d 70 69 6c 65 20 74 69 6d 65 2e 20 49 66 20 74  mpile time. If t
ab30: 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
ab40: 6d 65 6e 74 20 77 61 73 20 63 6f 6e 73 74 61 6e  ment was constan
ab50: 74 20 74 68 65 6e 20 62 69 74 20 30 20 6f 66 20  t then bit 0 of 
ab60: 50 31 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  P1 is set. This 
ab70: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
ab80: 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20  mine.** whether 
ab90: 6d 65 74 61 20 64 61 74 61 20 61 73 73 6f 63 69  meta data associ
aba0: 61 74 65 64 20 77 69 74 68 20 61 20 75 73 65 72  ated with a user
abb0: 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
abc0: 6e 74 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20  nt using the.** 
abd0: 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 78 64  sqlite3_set_auxd
abe0: 61 74 61 28 29 20 41 50 49 20 6d 61 79 20 62 65  ata() API may be
abf0: 20 73 61 66 65 6c 79 20 72 65 74 61 69 6e 65 64   safely retained
ac00: 20 75 6e 74 69 6c 20 74 68 65 20 6e 65 78 74 0a   until the next.
ac10: 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  ** invocation of
ac20: 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a   this opcode..**
ac30: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 41 67  .** See also: Ag
ac40: 67 53 74 65 70 20 61 6e 64 20 41 67 67 46 69 6e  gStep and AggFin
ac50: 61 6c 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 75  al.*/.case OP_Fu
ac60: 6e 63 74 69 6f 6e 3a 20 7b 0a 20 20 69 6e 74 20  nction: {.  int 
ac70: 69 3b 0a 20 20 4d 65 6d 20 2a 70 41 72 67 3b 0a  i;.  Mem *pArg;.
ac80: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
ac90: 74 20 63 74 78 3b 0a 20 20 73 71 6c 69 74 65 33  t ctx;.  sqlite3
aca0: 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 3b 0a  _value **apVal;.
acb0: 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d 20    int n;..  n = 
acc0: 70 4f 70 2d 3e 70 35 3b 0a 20 20 61 70 56 61 6c  pOp->p5;.  apVal
acd0: 20 3d 20 70 2d 3e 61 70 41 72 67 3b 0a 20 20 61   = p->apArg;.  a
ace0: 73 73 65 72 74 28 20 61 70 56 61 6c 20 7c 7c 20  ssert( apVal || 
acf0: 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
ad00: 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70  ( pOp->p3>0 && p
ad10: 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20  Op->p3<=p->nMem 
ad20: 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65  );.  pOut = &aMe
ad30: 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65  m[pOp->p3];.  me
ad40: 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
ad50: 2c 20 70 4f 75 74 29 3b 0a 0a 20 20 61 73 73 65  , pOut);..  asse
ad60: 72 74 28 20 6e 3d 3d 30 20 7c 7c 20 28 70 4f 70  rt( n==0 || (pOp
ad70: 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p2>0 && pOp->p
ad80: 32 2b 6e 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 29 20  2+n<=p->nMem+1) 
ad90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
ada0: 2d 3e 70 33 3c 70 4f 70 2d 3e 70 32 20 7c 7c 20  ->p3<pOp->p2 || 
adb0: 70 4f 70 2d 3e 70 33 3e 3d 70 4f 70 2d 3e 70 32  pOp->p3>=pOp->p2
adc0: 2b 6e 20 29 3b 0a 20 20 70 41 72 67 20 3d 20 26  +n );.  pArg = &
add0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
ade0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
adf0: 2b 2b 2c 20 70 41 72 67 2b 2b 29 7b 0a 20 20 20  ++, pArg++){.   
ae00: 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
ae10: 6c 69 64 28 70 41 72 67 29 20 29 3b 0a 20 20 20  lid(pArg) );.   
ae20: 20 61 70 56 61 6c 5b 69 5d 20 3d 20 70 41 72 67   apVal[i] = pArg
ae30: 3b 0a 20 20 20 20 44 65 65 70 68 65 6d 65 72 61  ;.    Deephemera
ae40: 6c 69 7a 65 28 70 41 72 67 29 3b 0a 20 20 20 20  lize(pArg);.    
ae50: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74  sqlite3VdbeMemSt
ae60: 6f 72 65 54 79 70 65 28 70 41 72 67 29 3b 0a 20  oreType(pArg);. 
ae70: 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
ae80: 45 28 70 4f 70 2d 3e 70 32 2b 69 2c 20 70 41 72  E(pOp->p2+i, pAr
ae90: 67 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  g);.  }..  asser
aea0: 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
aeb0: 50 34 5f 46 55 4e 43 44 45 46 20 7c 7c 20 70 4f  P4_FUNCDEF || pO
aec0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 56 44  p->p4type==P4_VD
aed0: 42 45 46 55 4e 43 20 29 3b 0a 20 20 69 66 28 20  BEFUNC );.  if( 
aee0: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
aef0: 46 55 4e 43 44 45 46 20 29 7b 0a 20 20 20 20 63  FUNCDEF ){.    c
af00: 74 78 2e 70 46 75 6e 63 20 3d 20 70 4f 70 2d 3e  tx.pFunc = pOp->
af10: 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 63 74  p4.pFunc;.    ct
af20: 78 2e 70 56 64 62 65 46 75 6e 63 20 3d 20 30 3b  x.pVdbeFunc = 0;
af30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 74  .  }else{.    ct
af40: 78 2e 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56  x.pVdbeFunc = (V
af50: 64 62 65 46 75 6e 63 2a 29 70 4f 70 2d 3e 70 34  dbeFunc*)pOp->p4
af60: 2e 70 56 64 62 65 46 75 6e 63 3b 0a 20 20 20 20  .pVdbeFunc;.    
af70: 63 74 78 2e 70 46 75 6e 63 20 3d 20 63 74 78 2e  ctx.pFunc = ctx.
af80: 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63  pVdbeFunc->pFunc
af90: 3b 0a 20 20 7d 0a 0a 20 20 63 74 78 2e 73 2e 66  ;.  }..  ctx.s.f
afa0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
afb0: 0a 20 20 63 74 78 2e 73 2e 64 62 20 3d 20 64 62  .  ctx.s.db = db
afc0: 3b 0a 20 20 63 74 78 2e 73 2e 78 44 65 6c 20 3d  ;.  ctx.s.xDel =
afd0: 20 30 3b 0a 20 20 63 74 78 2e 73 2e 7a 4d 61 6c   0;.  ctx.s.zMal
afe0: 6c 6f 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  loc = 0;..  /* T
aff0: 68 65 20 6f 75 74 70 75 74 20 63 65 6c 6c 20 6d  he output cell m
b000: 61 79 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ay already have 
b010: 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  a buffer allocat
b020: 65 64 2e 20 4d 6f 76 65 0a 20 20 2a 2a 20 74 68  ed. Move.  ** th
b030: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 63 74 78  e pointer to ctx
b040: 2e 73 20 73 6f 20 69 6e 20 63 61 73 65 20 74 68  .s so in case th
b050: 65 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20  e user-function 
b060: 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65  can use.  ** the
b070: 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74   already allocat
b080: 65 64 20 62 75 66 66 65 72 20 69 6e 73 74 65 61  ed buffer instea
b090: 64 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6e 67 20  d of allocating 
b0a0: 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
b0b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
b0c0: 4d 6f 76 65 28 26 63 74 78 2e 73 2c 20 70 4f 75  Move(&ctx.s, pOu
b0d0: 74 29 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65  t);.  MemSetType
b0e0: 46 6c 61 67 28 26 63 74 78 2e 73 2c 20 4d 45 4d  Flag(&ctx.s, MEM
b0f0: 5f 4e 75 6c 6c 29 3b 0a 0a 20 20 63 74 78 2e 69  _Null);..  ctx.i
b100: 73 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 69 66  sError = 0;.  if
b110: 28 20 63 74 78 2e 70 46 75 6e 63 2d 3e 66 6c 61  ( ctx.pFunc->fla
b120: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
b130: 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
b140: 20 61 73 73 65 72 74 28 20 70 4f 70 3e 61 4f 70   assert( pOp>aOp
b150: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
b160: 70 4f 70 5b 2d 31 5d 2e 70 34 74 79 70 65 3d 3d  pOp[-1].p4type==
b170: 50 34 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20  P4_COLLSEQ );.  
b180: 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31    assert( pOp[-1
b190: 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c  ].opcode==OP_Col
b1a0: 6c 53 65 71 20 29 3b 0a 20 20 20 20 63 74 78 2e  lSeq );.    ctx.
b1b0: 70 43 6f 6c 6c 20 3d 20 70 4f 70 5b 2d 31 5d 2e  pColl = pOp[-1].
b1c0: 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20  p4.pColl;.  }.  
b1d0: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
b1e0: 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 28 2a 63  lastRowid;.  (*c
b1f0: 74 78 2e 70 46 75 6e 63 2d 3e 78 46 75 6e 63 29  tx.pFunc->xFunc)
b200: 28 26 63 74 78 2c 20 6e 2c 20 61 70 56 61 6c 29  (&ctx, n, apVal)
b210: 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 34 35 30  ; /* IMP: R-2450
b220: 35 2d 32 33 32 33 30 20 2a 2f 0a 20 20 6c 61 73  5-23230 */.  las
b230: 74 52 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61 73  tRowid = db->las
b240: 74 52 6f 77 69 64 3b 0a 0a 20 20 2f 2a 20 49 66  tRowid;..  /* If
b250: 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64   any auxiliary d
b260: 61 74 61 20 66 75 6e 63 74 69 6f 6e 73 20 68 61  ata functions ha
b270: 76 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 62  ve been called b
b280: 79 20 74 68 69 73 20 75 73 65 72 20 66 75 6e 63  y this user func
b290: 74 69 6f 6e 2c 0a 20 20 2a 2a 20 69 6d 6d 65 64  tion,.  ** immed
b2a0: 69 61 74 65 6c 79 20 63 61 6c 6c 20 74 68 65 20  iately call the 
b2b0: 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61  destructor for a
b2c0: 6e 79 20 6e 6f 6e 2d 73 74 61 74 69 63 20 76 61  ny non-static va
b2d0: 6c 75 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lues..  */.  if(
b2e0: 20 63 74 78 2e 70 56 64 62 65 46 75 6e 63 20 29   ctx.pVdbeFunc )
b2f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
b300: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 63  eDeleteAuxData(c
b310: 74 78 2e 70 56 64 62 65 46 75 6e 63 2c 20 70 4f  tx.pVdbeFunc, pO
b320: 70 2d 3e 70 31 29 3b 0a 20 20 20 20 70 4f 70 2d  p->p1);.    pOp-
b330: 3e 70 34 2e 70 56 64 62 65 46 75 6e 63 20 3d 20  >p4.pVdbeFunc = 
b340: 63 74 78 2e 70 56 64 62 65 46 75 6e 63 3b 0a 20  ctx.pVdbeFunc;. 
b350: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
b360: 20 50 34 5f 56 44 42 45 46 55 4e 43 3b 0a 20 20   P4_VDBEFUNC;.  
b370: 7d 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  }..  if( db->mal
b380: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
b390: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
b3a0: 61 20 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 66  a malloc() has f
b3b0: 61 69 6c 65 64 2c 20 74 68 65 20 69 6d 70 6c 65  ailed, the imple
b3c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
b3d0: 0a 20 20 20 20 2a 2a 20 75 73 65 72 20 66 75 6e  .    ** user fun
b3e0: 63 74 69 6f 6e 20 6d 61 79 20 68 61 76 65 20 63  ction may have c
b3f0: 61 6c 6c 65 64 20 61 6e 20 73 71 6c 69 74 65 33  alled an sqlite3
b400: 5f 72 65 73 75 6c 74 5f 58 58 58 28 29 20 66 75  _result_XXX() fu
b410: 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 6f  nction.    ** to
b420: 20 72 65 74 75 72 6e 20 61 20 76 61 6c 75 65 2e   return a value.
b430: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
b440: 61 6c 6c 20 72 65 6c 65 61 73 65 73 20 61 6e 79  all releases any
b450: 20 72 65 73 6f 75 72 63 65 73 0a 20 20 20 20 2a   resources.    *
b460: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
b470: 68 20 73 75 63 68 20 61 20 76 61 6c 75 65 2e 0a  h such a value..
b480: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
b490: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
b4a0: 28 26 63 74 78 2e 73 29 3b 0a 20 20 20 20 67 6f  (&ctx.s);.    go
b4b0: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 0a  to no_mem;.  }..
b4c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 75 6e 63    /* If the func
b4d0: 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e  tion returned an
b4e0: 20 65 72 72 6f 72 2c 20 74 68 72 6f 77 20 61 6e   error, throw an
b4f0: 20 65 78 63 65 70 74 69 6f 6e 20 2a 2f 0a 20 20   exception */.  
b500: 69 66 28 20 63 74 78 2e 69 73 45 72 72 6f 72 20  if( ctx.isError 
b510: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
b520: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
b530: 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73  Msg, db, "%s", s
b540: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
b550: 74 28 26 63 74 78 2e 73 29 29 3b 0a 20 20 20 20  t(&ctx.s));.    
b560: 72 63 20 3d 20 63 74 78 2e 69 73 45 72 72 6f 72  rc = ctx.isError
b570: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 70 79  ;.  }..  /* Copy
b580: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
b590: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 74 6f  he function into
b5a0: 20 72 65 67 69 73 74 65 72 20 50 33 20 2a 2f 0a   register P3 */.
b5b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
b5c0: 6e 67 65 45 6e 63 6f 64 69 6e 67 28 26 63 74 78  ngeEncoding(&ctx
b5d0: 2e 73 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  .s, encoding);. 
b5e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d   sqlite3VdbeMemM
b5f0: 6f 76 65 28 70 4f 75 74 2c 20 26 63 74 78 2e 73  ove(pOut, &ctx.s
b600: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
b610: 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 4f  VdbeMemTooBig(pO
b620: 75 74 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ut) ){.    goto 
b630: 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a 23 69  too_big;.  }..#i
b640: 66 20 30 0a 20 20 2f 2a 20 54 68 65 20 61 70 70  f 0.  /* The app
b650: 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
b660: 6e 20 68 61 73 20 64 6f 6e 65 20 73 6f 6d 65 74  n has done somet
b670: 68 69 6e 67 20 74 68 61 74 20 61 73 20 63 61 75  hing that as cau
b680: 73 65 64 20 74 68 69 73 0a 20 20 2a 2a 20 73 74  sed this.  ** st
b690: 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 70 69 72  atement to expir
b6a0: 65 2e 20 20 28 50 65 72 68 61 70 73 20 74 68 65  e.  (Perhaps the
b6b0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
b6c0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a   sqlite3_exec().
b6d0: 20 20 2a 2a 20 77 69 74 68 20 61 20 43 52 45 41    ** with a CREA
b6e0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
b6f0: 6e 74 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nt.).  */.  if( 
b700: 70 2d 3e 65 78 70 69 72 65 64 20 29 20 72 63 20  p->expired ) rc 
b710: 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  = SQLITE_ABORT;.
b720: 23 65 6e 64 69 66 0a 0a 20 20 52 45 47 49 53 54  #endif..  REGIST
b730: 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
b740: 2c 20 70 4f 75 74 29 3b 0a 20 20 55 50 44 41 54  , pOut);.  UPDAT
b750: 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70  E_MAX_BLOBSIZE(p
b760: 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  Out);.  break;.}
b770: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69 74  ../* Opcode: Bit
b780: 41 6e 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a  And P1 P2 P3 * *
b790: 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20  .**.** Take the 
b7a0: 62 69 74 2d 77 69 73 65 20 41 4e 44 20 6f 66 20  bit-wise AND of 
b7b0: 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65  the values in re
b7c0: 67 69 73 74 65 72 20 50 31 20 61 6e 64 20 50 32  gister P1 and P2
b7d0: 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68   and.** store th
b7e0: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
b7f0: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
b800: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
b810: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
b820: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f  is NULL..*/./* O
b830: 70 63 6f 64 65 3a 20 42 69 74 4f 72 20 50 31 20  pcode: BitOr P1 
b840: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
b850: 54 61 6b 65 20 74 68 65 20 62 69 74 2d 77 69 73  Take the bit-wis
b860: 65 20 4f 52 20 6f 66 20 74 68 65 20 76 61 6c 75  e OR of the valu
b870: 65 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  es in register P
b880: 31 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20  1 and P2 and.** 
b890: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
b8a0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
b8b0: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e  .** If either in
b8c0: 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  put is NULL, the
b8d0: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
b8e0: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .*/./* Opcode: S
b8f0: 68 69 66 74 4c 65 66 74 20 50 31 20 50 32 20 50  hiftLeft P1 P2 P
b900: 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 68 69 66  3 * *.**.** Shif
b910: 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  t the integer va
b920: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
b930: 50 32 20 74 6f 20 74 68 65 20 6c 65 66 74 20 62  P2 to the left b
b940: 79 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  y the.** number 
b950: 6f 66 20 62 69 74 73 20 73 70 65 63 69 66 69 65  of bits specifie
b960: 64 20 62 79 20 74 68 65 20 69 6e 74 65 67 65 72  d by the integer
b970: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
b980: 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65  .** Store the re
b990: 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72  sult in register
b9a0: 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65   P3..** If eithe
b9b0: 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c  r input is NULL,
b9c0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
b9d0: 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ULL..*/./* Opcod
b9e0: 65 3a 20 53 68 69 66 74 52 69 67 68 74 20 50 31  e: ShiftRight P1
b9f0: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
ba00: 20 53 68 69 66 74 20 74 68 65 20 69 6e 74 65 67   Shift the integ
ba10: 65 72 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  er value in regi
ba20: 73 74 65 72 20 50 32 20 74 6f 20 74 68 65 20 72  ster P2 to the r
ba30: 69 67 68 74 20 62 79 20 74 68 65 0a 2a 2a 20 6e  ight by the.** n
ba40: 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 73 70  umber of bits sp
ba50: 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20 69  ecified by the i
ba60: 6e 74 65 67 65 72 20 69 6e 20 72 65 67 69 73 74  nteger in regist
ba70: 65 72 20 50 31 2e 0a 2a 2a 20 53 74 6f 72 65 20  er P1..** Store 
ba80: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65  the result in re
ba90: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66  gister P3..** If
baa0: 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73   either input is
bab0: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c   NULL, the resul
bac0: 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61  t is NULL..*/.ca
bad0: 73 65 20 4f 50 5f 42 69 74 41 6e 64 3a 20 20 20  se OP_BitAnd:   
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
baf0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 41   same as TK_BITA
bb00: 4e 44 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  ND, in1, in2, ou
bb10: 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69  t3 */.case OP_Bi
bb20: 74 4f 72 3a 20 20 20 20 20 20 20 20 20 20 20 20  tOr:            
bb30: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
bb40: 20 54 4b 5f 42 49 54 4f 52 2c 20 69 6e 31 2c 20   TK_BITOR, in1, 
bb50: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73  in2, out3 */.cas
bb60: 65 20 4f 50 5f 53 68 69 66 74 4c 65 66 74 3a 20  e OP_ShiftLeft: 
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bb80: 73 61 6d 65 20 61 73 20 54 4b 5f 4c 53 48 49 46  same as TK_LSHIF
bb90: 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  T, in1, in2, out
bba0: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 68 69  3 */.case OP_Shi
bbb0: 66 74 52 69 67 68 74 3a 20 7b 20 20 20 20 20 20  ftRight: {      
bbc0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
bbd0: 54 4b 5f 52 53 48 49 46 54 2c 20 69 6e 31 2c 20  TK_RSHIFT, in1, 
bbe0: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69  in2, out3 */.  i
bbf0: 36 34 20 69 41 3b 0a 20 20 75 36 34 20 75 41 3b  64 iA;.  u64 uA;
bc00: 0a 20 20 69 36 34 20 69 42 3b 0a 20 20 75 38 20  .  i64 iB;.  u8 
bc10: 6f 70 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61  op;..  pIn1 = &a
bc20: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
bc30: 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn2 = &aMem[pOp
bc40: 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75 74 20 3d 20  ->p2];.  pOut = 
bc50: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
bc60: 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
bc70: 67 73 20 7c 20 70 49 6e 32 2d 3e 66 6c 61 67 73  gs | pIn2->flags
bc80: 29 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ) & MEM_Null ){.
bc90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
bca0: 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b  emSetNull(pOut);
bcb0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
bcc0: 20 20 69 41 20 3d 20 73 71 6c 69 74 65 33 56 64    iA = sqlite3Vd
bcd0: 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 32 29  beIntValue(pIn2)
bce0: 3b 0a 20 20 69 42 20 3d 20 73 71 6c 69 74 65 33  ;.  iB = sqlite3
bcf0: 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e  VdbeIntValue(pIn
bd00: 31 29 3b 0a 20 20 6f 70 20 3d 20 70 4f 70 2d 3e  1);.  op = pOp->
bd10: 6f 70 63 6f 64 65 3b 0a 20 20 69 66 28 20 6f 70  opcode;.  if( op
bd20: 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 7b 0a 20  ==OP_BitAnd ){. 
bd30: 20 20 20 69 41 20 26 3d 20 69 42 3b 0a 20 20 7d     iA &= iB;.  }
bd40: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 4f 50 5f  else if( op==OP_
bd50: 42 69 74 4f 72 20 29 7b 0a 20 20 20 20 69 41 20  BitOr ){.    iA 
bd60: 7c 3d 20 69 42 3b 0a 20 20 7d 65 6c 73 65 20 69  |= iB;.  }else i
bd70: 66 28 20 69 42 21 3d 30 20 29 7b 0a 20 20 20 20  f( iB!=0 ){.    
bd80: 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 53  assert( op==OP_S
bd90: 68 69 66 74 52 69 67 68 74 20 7c 7c 20 6f 70 3d  hiftRight || op=
bda0: 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b  =OP_ShiftLeft );
bdb0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 68 69 66  ..    /* If shif
bdc0: 74 69 6e 67 20 62 79 20 61 20 6e 65 67 61 74 69  ting by a negati
bdd0: 76 65 20 61 6d 6f 75 6e 74 2c 20 73 68 69 66 74  ve amount, shift
bde0: 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 69   in the other di
bdf0: 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  rection */.    i
be00: 66 28 20 69 42 3c 30 20 29 7b 0a 20 20 20 20 20  f( iB<0 ){.     
be10: 20 61 73 73 65 72 74 28 20 4f 50 5f 53 68 69 66   assert( OP_Shif
be20: 74 52 69 67 68 74 3d 3d 4f 50 5f 53 68 69 66 74  tRight==OP_Shift
be30: 4c 65 66 74 2b 31 20 29 3b 0a 20 20 20 20 20 20  Left+1 );.      
be40: 6f 70 20 3d 20 32 2a 4f 50 5f 53 68 69 66 74 4c  op = 2*OP_ShiftL
be50: 65 66 74 20 2b 20 31 20 2d 20 6f 70 3b 0a 20 20  eft + 1 - op;.  
be60: 20 20 20 20 69 42 20 3d 20 69 42 3e 28 2d 36 34      iB = iB>(-64
be70: 29 20 3f 20 2d 69 42 20 3a 20 36 34 3b 0a 20 20  ) ? -iB : 64;.  
be80: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 42 3e    }..    if( iB>
be90: 3d 36 34 20 29 7b 0a 20 20 20 20 20 20 69 41 20  =64 ){.      iA 
bea0: 3d 20 28 69 41 3e 3d 30 20 7c 7c 20 6f 70 3d 3d  = (iA>=0 || op==
beb0: 4f 50 5f 53 68 69 66 74 4c 65 66 74 29 20 3f 20  OP_ShiftLeft) ? 
bec0: 30 20 3a 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  0 : -1;.    }els
bed0: 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  e{.      memcpy(
bee0: 26 75 41 2c 20 26 69 41 2c 20 73 69 7a 65 6f 66  &uA, &iA, sizeof
bef0: 28 75 41 29 29 3b 0a 20 20 20 20 20 20 69 66 28  (uA));.      if(
bf00: 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66   op==OP_ShiftLef
bf10: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 75 41 20  t ){.        uA 
bf20: 3c 3c 3d 20 69 42 3b 0a 20 20 20 20 20 20 7d 65  <<= iB;.      }e
bf30: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 41 20  lse{.        uA 
bf40: 3e 3e 3d 20 69 42 3b 0a 20 20 20 20 20 20 20 20  >>= iB;.        
bf50: 2f 2a 20 53 69 67 6e 2d 65 78 74 65 6e 64 20 6f  /* Sign-extend o
bf60: 6e 20 61 20 72 69 67 68 74 20 73 68 69 66 74 20  n a right shift 
bf70: 6f 66 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  of a negative nu
bf80: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  mber */.        
bf90: 69 66 28 20 69 41 3c 30 20 29 20 75 41 20 7c 3d  if( iA<0 ) uA |=
bfa0: 20 28 28 28 28 75 36 34 29 30 78 66 66 66 66 66   ((((u64)0xfffff
bfb0: 66 66 66 29 3c 3c 33 32 29 7c 30 78 66 66 66 66  fff)<<32)|0xffff
bfc0: 66 66 66 66 29 20 3c 3c 20 28 36 34 2d 69 42 29  ffff) << (64-iB)
bfd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bfe0: 6d 65 6d 63 70 79 28 26 69 41 2c 20 26 75 41 2c  memcpy(&iA, &uA,
bff0: 20 73 69 7a 65 6f 66 28 69 41 29 29 3b 0a 20 20   sizeof(iA));.  
c000: 20 20 7d 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e    }.  }.  pOut->
c010: 75 2e 69 20 3d 20 69 41 3b 0a 20 20 4d 65 6d 53  u.i = iA;.  MemS
c020: 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c  etTypeFlag(pOut,
c030: 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62 72 65   MEM_Int);.  bre
c040: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
c050: 3a 20 41 64 64 49 6d 6d 20 20 50 31 20 50 32 20  : AddImm  P1 P2 
c060: 2a 20 2a 20 2a 0a 2a 2a 20 0a 2a 2a 20 41 64 64  * * *.** .** Add
c070: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 50 32   the constant P2
c080: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e   to the value in
c090: 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a   register P1..**
c0a0: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   The result is a
c0b0: 6c 77 61 79 73 20 61 6e 20 69 6e 74 65 67 65 72  lways an integer
c0c0: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 66 6f 72 63 65  ..**.** To force
c0d0: 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 74 6f   any register to
c0e0: 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 2c 20   be an integer, 
c0f0: 6a 75 73 74 20 61 64 64 20 30 2e 0a 2a 2f 0a 63  just add 0..*/.c
c100: 61 73 65 20 4f 50 5f 41 64 64 49 6d 6d 3a 20 7b  ase OP_AddImm: {
c110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
c120: 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
c130: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
c140: 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
c150: 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20 20 73 71  e(p, pIn1);.  sq
c160: 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65  lite3VdbeMemInte
c170: 67 65 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20  gerify(pIn1);.  
c180: 70 49 6e 31 2d 3e 75 2e 69 20 2b 3d 20 70 4f 70  pIn1->u.i += pOp
c190: 2d 3e 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  ->p2;.  break;.}
c1a0: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 75 73  ../* Opcode: Mus
c1b0: 74 42 65 49 6e 74 20 50 31 20 50 32 20 2a 20 2a  tBeInt P1 P2 * *
c1c0: 20 2a 0a 2a 2a 20 0a 2a 2a 20 46 6f 72 63 65 20   *.** .** Force 
c1d0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
c1e0: 69 73 74 65 72 20 50 31 20 74 6f 20 62 65 20 61  ister P1 to be a
c1f0: 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20 74  n integer.  If t
c200: 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50  he value.** in P
c210: 31 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  1 is not an inte
c220: 67 65 72 20 61 6e 64 20 63 61 6e 6e 6f 74 20 62  ger and cannot b
c230: 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
c240: 20 61 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20 77   an integer.** w
c250: 69 74 68 6f 75 74 20 64 61 74 61 20 6c 6f 73 73  ithout data loss
c260: 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65  , then jump imme
c270: 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2c 20 6f  diately to P2, o
c280: 72 20 69 66 20 50 32 3d 3d 30 0a 2a 2a 20 72 61  r if P2==0.** ra
c290: 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49  ise an SQLITE_MI
c2a0: 53 4d 41 54 43 48 20 65 78 63 65 70 74 69 6f 6e  SMATCH exception
c2b0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 75 73  ..*/.case OP_Mus
c2c0: 74 42 65 49 6e 74 3a 20 7b 20 20 20 20 20 20 20  tBeInt: {       
c2d0: 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
c2e0: 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61  1 */.  pIn1 = &a
c2f0: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
c300: 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49  applyAffinity(pI
c310: 6e 31 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  n1, SQLITE_AFF_N
c320: 55 4d 45 52 49 43 2c 20 65 6e 63 6f 64 69 6e 67  UMERIC, encoding
c330: 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  );.  if( (pIn1->
c340: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
c350: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
c360: 4f 70 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20 20 20  Op->p2==0 ){.   
c370: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d     rc = SQLITE_M
c380: 49 53 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 67  ISMATCH;.      g
c390: 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
c3a0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73  _error;.    }els
c3b0: 65 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f  e{.      pc = pO
c3c0: 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 7d  p->p2 - 1;.    }
c3d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4d 65  .  }else{.    Me
c3e0: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 49 6e  mSetTypeFlag(pIn
c3f0: 31 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d  1, MEM_Int);.  }
c400: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66  .  break;.}..#if
c410: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c420: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
c430: 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 61 6c 41  /* Opcode: RealA
c440: 66 66 69 6e 69 74 79 20 50 31 20 2a 20 2a 20 2a  ffinity P1 * * *
c450: 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 69   *.**.** If regi
c460: 73 74 65 72 20 50 31 20 68 6f 6c 64 73 20 61 6e  ster P1 holds an
c470: 20 69 6e 74 65 67 65 72 20 63 6f 6e 76 65 72 74   integer convert
c480: 20 69 74 20 74 6f 20 61 20 72 65 61 6c 20 76 61   it to a real va
c490: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
c4a0: 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 77  opcode is used w
c4b0: 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69  hen extracting i
c4c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
c4d0: 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a  a column that.**
c4e0: 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69   has REAL affini
c4f0: 74 79 2e 20 20 53 75 63 68 20 63 6f 6c 75 6d 6e  ty.  Such column
c500: 20 76 61 6c 75 65 73 20 6d 61 79 20 73 74 69 6c   values may stil
c510: 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a  l be stored as.*
c520: 2a 20 69 6e 74 65 67 65 72 73 2c 20 66 6f 72 20  * integers, for 
c530: 73 70 61 63 65 20 65 66 66 69 63 69 65 6e 63 79  space efficiency
c540: 2c 20 62 75 74 20 61 66 74 65 72 20 65 78 74 72  , but after extr
c550: 61 63 74 69 6f 6e 20 77 65 20 77 61 6e 74 20 74  action we want t
c560: 68 65 6d 0a 2a 2a 20 74 6f 20 68 61 76 65 20 6f  hem.** to have o
c570: 6e 6c 79 20 61 20 72 65 61 6c 20 76 61 6c 75 65  nly a real value
c580: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61  ..*/.case OP_Rea
c590: 6c 41 66 66 69 6e 69 74 79 3a 20 7b 20 20 20 20  lAffinity: {    
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c5b0: 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
c5c0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
c5d0: 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61  .  if( pIn1->fla
c5e0: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
c5f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
c600: 65 6d 52 65 61 6c 69 66 79 28 70 49 6e 31 29 3b  emRealify(pIn1);
c610: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
c620: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
c630: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
c640: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 6f 54 65  ./* Opcode: ToTe
c650: 78 74 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  xt P1 * * * *.**
c660: 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61  .** Force the va
c670: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
c680: 50 31 20 74 6f 20 62 65 20 74 65 78 74 2e 0a 2a  P1 to be text..*
c690: 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69  * If the value i
c6a0: 73 20 6e 75 6d 65 72 69 63 2c 20 63 6f 6e 76 65  s numeric, conve
c6b0: 72 74 20 69 74 20 74 6f 20 61 20 73 74 72 69 6e  rt it to a strin
c6c0: 67 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 65  g using the.** e
c6d0: 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 70 72 69  quivalent of pri
c6e0: 6e 74 66 28 29 2e 20 20 42 6c 6f 62 20 76 61 6c  ntf().  Blob val
c6f0: 75 65 73 20 61 72 65 20 75 6e 63 68 61 6e 67 65  ues are unchange
c700: 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 61 66 74  d and.** are aft
c710: 65 72 77 61 72 64 73 20 73 69 6d 70 6c 79 20 69  erwards simply i
c720: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 74 65  nterpreted as te
c730: 78 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c  xt..**.** A NULL
c740: 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 63 68   value is not ch
c750: 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 72 6f  anged by this ro
c760: 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d 61 69  utine.  It remai
c770: 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65  ns NULL..*/.case
c780: 20 4f 50 5f 54 6f 54 65 78 74 3a 20 7b 20 20 20   OP_ToText: {   
c790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c7a0: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 54 4f 5f  * same as TK_TO_
c7b0: 54 45 58 54 2c 20 69 6e 31 20 2a 2f 0a 20 20 70  TEXT, in1 */.  p
c7c0: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
c7d0: 3e 70 31 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74  >p1];.  memAbout
c7e0: 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31  ToChange(p, pIn1
c7f0: 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66  );.  if( pIn1->f
c800: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
c810: 29 20 62 72 65 61 6b 3b 0a 20 20 61 73 73 65 72  ) break;.  asser
c820: 74 28 20 4d 45 4d 5f 53 74 72 3d 3d 28 4d 45 4d  t( MEM_Str==(MEM
c830: 5f 42 6c 6f 62 3e 3e 33 29 20 29 3b 0a 20 20 70  _Blob>>3) );.  p
c840: 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70  In1->flags |= (p
c850: 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42  In1->flags&MEM_B
c860: 6c 6f 62 29 3e 3e 33 3b 0a 20 20 61 70 70 6c 79  lob)>>3;.  apply
c870: 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 53  Affinity(pIn1, S
c880: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 2c 20  QLITE_AFF_TEXT, 
c890: 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 72 63 20  encoding);.  rc 
c8a0: 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e  = ExpandBlob(pIn
c8b0: 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  1);.  assert( pI
c8c0: 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
c8d0: 53 74 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Str || db->mallo
c8e0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 70 49 6e  cFailed );.  pIn
c8f0: 31 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45  1->flags &= ~(ME
c900: 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d  M_Int|MEM_Real|M
c910: 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 5a 65 72 6f  EM_Blob|MEM_Zero
c920: 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  );.  UPDATE_MAX_
c930: 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31 29 3b 0a  BLOBSIZE(pIn1);.
c940: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
c950: 70 63 6f 64 65 3a 20 54 6f 42 6c 6f 62 20 50 31  pcode: ToBlob P1
c960: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46   * * * *.**.** F
c970: 6f 72 63 65 20 74 68 65 20 76 61 6c 75 65 20 69  orce the value i
c980: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f  n register P1 to
c990: 20 62 65 20 61 20 42 4c 4f 42 2e 0a 2a 2a 20 49   be a BLOB..** I
c9a0: 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 6e  f the value is n
c9b0: 75 6d 65 72 69 63 2c 20 63 6f 6e 76 65 72 74 20  umeric, convert 
c9c0: 69 74 20 74 6f 20 61 20 73 74 72 69 6e 67 20 66  it to a string f
c9d0: 69 72 73 74 2e 0a 2a 2a 20 53 74 72 69 6e 67 73  irst..** Strings
c9e0: 20 61 72 65 20 73 69 6d 70 6c 79 20 72 65 69 6e   are simply rein
c9f0: 74 65 72 70 72 65 74 65 64 20 61 73 20 62 6c 6f  terpreted as blo
ca00: 62 73 20 77 69 74 68 20 6e 6f 20 63 68 61 6e 67  bs with no chang
ca10: 65 0a 2a 2a 20 74 6f 20 74 68 65 20 75 6e 64 65  e.** to the unde
ca20: 72 6c 79 69 6e 67 20 64 61 74 61 2e 0a 2a 2a 0a  rlying data..**.
ca30: 2a 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20  ** A NULL value 
ca40: 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 62  is not changed b
ca50: 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  y this routine. 
ca60: 20 49 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c   It remains NULL
ca70: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f 42  ..*/.case OP_ToB
ca80: 6c 6f 62 3a 20 7b 20 20 20 20 20 20 20 20 20 20  lob: {          
ca90: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
caa0: 61 73 20 54 4b 5f 54 4f 5f 42 4c 4f 42 2c 20 69  as TK_TO_BLOB, i
cab0: 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
cac0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
cad0: 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73   if( pIn1->flags
cae0: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 20 62 72   & MEM_Null ) br
caf0: 65 61 6b 3b 0a 20 20 69 66 28 20 28 70 49 6e 31  eak;.  if( (pIn1
cb00: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
cb10: 6f 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 70  ob)==0 ){.    ap
cb20: 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e 31  plyAffinity(pIn1
cb30: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  , SQLITE_AFF_TEX
cb40: 54 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  T, encoding);.  
cb50: 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e    assert( pIn1->
cb60: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
cb70: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
cb80: 6c 65 64 20 29 3b 0a 20 20 20 20 4d 65 6d 53 65  led );.    MemSe
cb90: 74 54 79 70 65 46 6c 61 67 28 70 49 6e 31 2c 20  tTypeFlag(pIn1, 
cba0: 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 20 20 7d 65 6c  MEM_Blob);.  }el
cbb0: 73 65 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 66 6c  se{.    pIn1->fl
cbc0: 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 54 79 70  ags &= ~(MEM_Typ
cbd0: 65 4d 61 73 6b 26 7e 4d 45 4d 5f 42 6c 6f 62 29  eMask&~MEM_Blob)
cbe0: 3b 0a 20 20 7d 0a 20 20 55 50 44 41 54 45 5f 4d  ;.  }.  UPDATE_M
cbf0: 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31  AX_BLOBSIZE(pIn1
cc00: 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
cc10: 2a 20 4f 70 63 6f 64 65 3a 20 54 6f 4e 75 6d 65  * Opcode: ToNume
cc20: 72 69 63 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a  ric P1 * * * *.*
cc30: 2a 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76  *.** Force the v
cc40: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
cc50: 20 50 31 20 74 6f 20 62 65 20 6e 75 6d 65 72 69   P1 to be numeri
cc60: 63 20 28 65 69 74 68 65 72 20 61 6e 0a 2a 2a 20  c (either an.** 
cc70: 69 6e 74 65 67 65 72 20 6f 72 20 61 20 66 6c 6f  integer or a flo
cc80: 61 74 69 6e 67 2d 70 6f 69 6e 74 20 6e 75 6d 62  ating-point numb
cc90: 65 72 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 76  er.).** If the v
cca0: 61 6c 75 65 20 69 73 20 74 65 78 74 20 6f 72 20  alue is text or 
ccb0: 62 6c 6f 62 2c 20 74 72 79 20 74 6f 20 63 6f 6e  blob, try to con
ccc0: 76 65 72 74 20 69 74 20 74 6f 20 61 6e 20 75 73  vert it to an us
ccd0: 69 6e 67 20 74 68 65 0a 2a 2a 20 65 71 75 69 76  ing the.** equiv
cce0: 61 6c 65 6e 74 20 6f 66 20 61 74 6f 69 28 29 20  alent of atoi() 
ccf0: 6f 72 20 61 74 6f 66 28 29 20 61 6e 64 20 73 74  or atof() and st
cd00: 6f 72 65 20 30 20 69 66 20 6e 6f 20 73 75 63 68  ore 0 if no such
cd10: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 0a 2a 2a 20   conversion .** 
cd20: 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a  is possible..**.
cd30: 2a 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20  ** A NULL value 
cd40: 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 62  is not changed b
cd50: 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  y this routine. 
cd60: 20 49 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c   It remains NULL
cd70: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f 4e  ..*/.case OP_ToN
cd80: 75 6d 65 72 69 63 3a 20 7b 20 20 20 20 20 20 20  umeric: {       
cd90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
cda0: 6d 65 20 61 73 20 54 4b 5f 54 4f 5f 4e 55 4d 45  me as TK_TO_NUME
cdb0: 52 49 43 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49  RIC, in1 */.  pI
cdc0: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
cdd0: 70 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p1];.  sqlite3Vd
cde0: 62 65 4d 65 6d 4e 75 6d 65 72 69 66 79 28 70 49  beMemNumerify(pI
cdf0: 6e 31 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  n1);.  break;.}.
ce00: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
ce10: 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 0a 2f  _OMIT_CAST */../
ce20: 2a 20 4f 70 63 6f 64 65 3a 20 54 6f 49 6e 74 20  * Opcode: ToInt 
ce30: 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  P1 * * * *.**.**
ce40: 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75 65   Force the value
ce50: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
ce60: 74 6f 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  to be an integer
ce70: 2e 20 20 49 66 0a 2a 2a 20 54 68 65 20 76 61 6c  .  If.** The val
ce80: 75 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ue is currently 
ce90: 61 20 72 65 61 6c 20 6e 75 6d 62 65 72 2c 20 64  a real number, d
cea0: 72 6f 70 20 69 74 73 20 66 72 61 63 74 69 6f 6e  rop its fraction
ceb0: 61 6c 20 70 61 72 74 2e 0a 2a 2a 20 49 66 20 74  al part..** If t
cec0: 68 65 20 76 61 6c 75 65 20 69 73 20 74 65 78 74  he value is text
ced0: 20 6f 72 20 62 6c 6f 62 2c 20 74 72 79 20 74 6f   or blob, try to
cee0: 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f 20 61   convert it to a
cef0: 6e 20 69 6e 74 65 67 65 72 20 75 73 69 6e 67 20  n integer using 
cf00: 74 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e  the.** equivalen
cf10: 74 20 6f 66 20 61 74 6f 69 28 29 20 61 6e 64 20  t of atoi() and 
cf20: 73 74 6f 72 65 20 30 20 69 66 20 6e 6f 20 73 75  store 0 if no su
cf30: 63 68 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73  ch conversion is
cf40: 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a   possible..**.**
cf50: 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73   A NULL value is
cf60: 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 62 79 20   not changed by 
cf70: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 49  this routine.  I
cf80: 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a  t remains NULL..
cf90: 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f 49 6e 74  */.case OP_ToInt
cfa0: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
cfb0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
cfc0: 54 4b 5f 54 4f 5f 49 4e 54 2c 20 69 6e 31 20 2a  TK_TO_INT, in1 *
cfd0: 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
cfe0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28  [pOp->p1];.  if(
cff0: 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
d000: 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a  MEM_Null)==0 ){.
d010: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
d020: 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e  emIntegerify(pIn
d030: 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  1);.  }.  break;
d040: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
d050: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53  (SQLITE_OMIT_CAS
d060: 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  T) && !defined(S
d070: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
d080: 49 4e 47 5f 50 4f 49 4e 54 29 0a 2f 2a 20 4f 70  ING_POINT)./* Op
d090: 63 6f 64 65 3a 20 54 6f 52 65 61 6c 20 50 31 20  code: ToReal P1 
d0a0: 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f  * * * *.**.** Fo
d0b0: 72 63 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  rce the value in
d0c0: 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20   register P1 to 
d0d0: 62 65 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f  be a floating po
d0e0: 69 6e 74 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 49  int number..** I
d0f0: 66 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 63  f The value is c
d100: 75 72 72 65 6e 74 6c 79 20 61 6e 20 69 6e 74 65  urrently an inte
d110: 67 65 72 2c 20 63 6f 6e 76 65 72 74 20 69 74 2e  ger, convert it.
d120: 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65  .** If the value
d130: 20 69 73 20 74 65 78 74 20 6f 72 20 62 6c 6f 62   is text or blob
d140: 2c 20 74 72 79 20 74 6f 20 63 6f 6e 76 65 72 74  , try to convert
d150: 20 69 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65   it to an intege
d160: 72 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 65  r using the.** e
d170: 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 61 74 6f  quivalent of ato
d180: 69 28 29 20 61 6e 64 20 73 74 6f 72 65 20 30 2e  i() and store 0.
d190: 30 20 69 66 20 6e 6f 20 73 75 63 68 20 63 6f 6e  0 if no such con
d1a0: 76 65 72 73 69 6f 6e 20 69 73 20 70 6f 73 73 69  version is possi
d1b0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  ble..**.** A NUL
d1c0: 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 63  L value is not c
d1d0: 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 72  hanged by this r
d1e0: 6f 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d 61  outine.  It rema
d1f0: 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73  ins NULL..*/.cas
d200: 65 20 4f 50 5f 54 6f 52 65 61 6c 3a 20 7b 20 20  e OP_ToReal: {  
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d220: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 54 4f  /* same as TK_TO
d230: 5f 52 45 41 4c 2c 20 69 6e 31 20 2a 2f 0a 20 20  _REAL, in1 */.  
d240: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
d250: 2d 3e 70 31 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75  ->p1];.  memAbou
d260: 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 49 6e  tToChange(p, pIn
d270: 31 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d  1);.  if( (pIn1-
d280: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
d290: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  l)==0 ){.    sql
d2a0: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 61 6c 69  ite3VdbeMemReali
d2b0: 66 79 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20  fy(pIn1);.  }.  
d2c0: 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
d2d0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
d2e0: 54 45 5f 4f 4d 49 54 5f 43 41 53 54 29 20 26 26  TE_OMIT_CAST) &&
d2f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d300: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
d310: 4f 49 4e 54 29 20 2a 2f 0a 0a 2f 2a 20 4f 70 63  OINT) */../* Opc
d320: 6f 64 65 3a 20 4c 74 20 50 31 20 50 32 20 50 33  ode: Lt P1 P2 P3
d330: 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 43 6f 6d   P4 P5.**.** Com
d340: 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20  pare the values 
d350: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 61  in register P1 a
d360: 6e 64 20 50 33 2e 20 20 49 66 20 72 65 67 28 50  nd P3.  If reg(P
d370: 33 29 3c 72 65 67 28 50 31 29 20 74 68 65 6e 0a  3)<reg(P1) then.
d380: 2a 2a 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65  ** jump to addre
d390: 73 73 20 50 32 2e 20 20 0a 2a 2a 0a 2a 2a 20 49  ss P2.  .**.** I
d3a0: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d  f the SQLITE_JUM
d3b0: 50 49 46 4e 55 4c 4c 20 62 69 74 20 6f 66 20 50  PIFNULL bit of P
d3c0: 35 20 69 73 20 73 65 74 20 61 6e 64 20 65 69 74  5 is set and eit
d3d0: 68 65 72 20 72 65 67 28 50 31 29 20 6f 72 0a 2a  her reg(P1) or.*
d3e0: 2a 20 72 65 67 28 50 33 29 20 69 73 20 4e 55 4c  * reg(P3) is NUL
d3f0: 4c 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20  L then take the 
d400: 6a 75 6d 70 2e 20 20 49 66 20 74 68 65 20 53 51  jump.  If the SQ
d410: 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
d420: 0a 2a 2a 20 62 69 74 20 69 73 20 63 6c 65 61 72  .** bit is clear
d430: 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
d440: 67 68 20 69 66 20 65 69 74 68 65 72 20 6f 70 65  gh if either ope
d450: 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  rand is NULL..**
d460: 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 41  .** The SQLITE_A
d470: 46 46 5f 4d 41 53 4b 20 70 6f 72 74 69 6f 6e 20  FF_MASK portion 
d480: 6f 66 20 50 35 20 6d 75 73 74 20 62 65 20 61 6e  of P5 must be an
d490: 20 61 66 66 69 6e 69 74 79 20 63 68 61 72 61 63   affinity charac
d4a0: 74 65 72 20 2d 0a 2a 2a 20 53 51 4c 49 54 45 5f  ter -.** SQLITE_
d4b0: 41 46 46 5f 54 45 58 54 2c 20 53 51 4c 49 54 45  AFF_TEXT, SQLITE
d4c0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 2c 20 61 6e  _AFF_INTEGER, an
d4d0: 64 20 73 6f 20 66 6f 72 74 68 2e 20 41 6e 20 61  d so forth. An a
d4e0: 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 0a  ttempt is made .
d4f0: 2a 2a 20 74 6f 20 63 6f 65 72 63 65 20 62 6f 74  ** to coerce bot
d500: 68 20 69 6e 70 75 74 73 20 61 63 63 6f 72 64 69  h inputs accordi
d510: 6e 67 20 74 6f 20 74 68 69 73 20 61 66 66 69 6e  ng to this affin
d520: 69 74 79 20 62 65 66 6f 72 65 20 74 68 65 0a 2a  ity before the.*
d530: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  * comparison is 
d540: 6d 61 64 65 2e 20 49 66 20 74 68 65 20 53 51 4c  made. If the SQL
d550: 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 69 73 20  ITE_AFF_MASK is 
d560: 30 78 30 30 2c 20 74 68 65 6e 20 6e 75 6d 65 72  0x00, then numer
d570: 69 63 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 69  ic.** affinity i
d580: 73 20 75 73 65 64 2e 20 4e 6f 74 65 20 74 68 61  s used. Note tha
d590: 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  t the affinity c
d5a0: 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 73  onversions are s
d5b0: 74 6f 72 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  tored.** back in
d5c0: 74 6f 20 74 68 65 20 69 6e 70 75 74 20 72 65 67  to the input reg
d5d0: 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 33  isters P1 and P3
d5e0: 2e 20 20 53 6f 20 74 68 69 73 20 6f 70 63 6f 64  .  So this opcod
d5f0: 65 20 63 61 6e 20 63 61 75 73 65 0a 2a 2a 20 70  e can cause.** p
d600: 65 72 73 69 73 74 65 6e 74 20 63 68 61 6e 67 65  ersistent change
d610: 73 20 74 6f 20 72 65 67 69 73 74 65 72 73 20 50  s to registers P
d620: 31 20 61 6e 64 20 50 33 2e 0a 2a 2a 0a 2a 2a 20  1 and P3..**.** 
d630: 4f 6e 63 65 20 61 6e 79 20 63 6f 6e 76 65 72 73  Once any convers
d640: 69 6f 6e 73 20 68 61 76 65 20 74 61 6b 65 6e 20  ions have taken 
d650: 70 6c 61 63 65 2c 20 61 6e 64 20 6e 65 69 74 68  place, and neith
d660: 65 72 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  er value is NULL
d670: 2c 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73  , .** the values
d680: 20 61 72 65 20 63 6f 6d 70 61 72 65 64 2e 20 49   are compared. I
d690: 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72  f both values ar
d6a0: 65 20 62 6c 6f 62 73 20 74 68 65 6e 20 6d 65 6d  e blobs then mem
d6b0: 63 6d 70 28 29 20 69 73 0a 2a 2a 20 75 73 65 64  cmp() is.** used
d6c0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
d6d0: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
d6e0: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66   comparison.  If
d6f0: 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 2a 2a 20   both values.** 
d700: 61 72 65 20 74 65 78 74 2c 20 74 68 65 6e 20 74  are text, then t
d710: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
d720: 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
d730: 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 0a 2a  n specified in.*
d740: 2a 20 50 34 20 69 73 20 20 75 73 65 64 20 74 6f  * P4 is  used to
d750: 20 64 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   do the comparis
d760: 6f 6e 2e 20 20 49 66 20 50 34 20 69 73 20 6e 6f  on.  If P4 is no
d770: 74 20 73 70 65 63 69 66 69 65 64 20 74 68 65 6e  t specified then
d780: 0a 2a 2a 20 6d 65 6d 63 6d 70 28 29 20 69 73 20  .** memcmp() is 
d790: 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  used to compare 
d7a0: 74 65 78 74 20 73 74 72 69 6e 67 2e 20 20 49 66  text string.  If
d7b0: 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65   both values are
d7c0: 0a 2a 2a 20 6e 75 6d 65 72 69 63 2c 20 74 68 65  .** numeric, the
d7d0: 6e 20 61 20 6e 75 6d 65 72 69 63 20 63 6f 6d 70  n a numeric comp
d7e0: 61 72 69 73 6f 6e 20 69 73 20 75 73 65 64 2e 20  arison is used. 
d7f0: 49 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65  If the two value
d800: 73 0a 2a 2a 20 61 72 65 20 6f 66 20 64 69 66 66  s.** are of diff
d810: 65 72 65 6e 74 20 74 79 70 65 73 2c 20 74 68 65  erent types, the
d820: 6e 20 6e 75 6d 62 65 72 73 20 61 72 65 20 63 6f  n numbers are co
d830: 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20 74 68  nsidered less th
d840: 61 6e 0a 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e  an.** strings an
d850: 64 20 73 74 72 69 6e 67 73 20 61 72 65 20 63 6f  d strings are co
d860: 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20 74 68  nsidered less th
d870: 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2a 0a 2a 2a 20  an blobs..**.** 
d880: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 54  If the SQLITE_ST
d890: 4f 52 45 50 32 20 62 69 74 20 6f 66 20 50 35 20  OREP2 bit of P5 
d8a0: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 64 6f 20  is set, then do 
d8b0: 6e 6f 74 20 6a 75 6d 70 2e 20 20 49 6e 73 74 65  not jump.  Inste
d8c0: 61 64 2c 0a 2a 2a 20 73 74 6f 72 65 20 61 20 62  ad,.** store a b
d8d0: 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 28 65  oolean result (e
d8e0: 69 74 68 65 72 20 30 2c 20 6f 72 20 31 2c 20 6f  ither 0, or 1, o
d8f0: 72 20 4e 55 4c 4c 29 20 69 6e 20 72 65 67 69 73  r NULL) in regis
d900: 74 65 72 20 50 32 2e 0a 2a 2f 0a 2f 2a 20 4f 70  ter P2..*/./* Op
d910: 63 6f 64 65 3a 20 4e 65 20 50 31 20 50 32 20 50  code: Ne P1 P2 P
d920: 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68  3 P4 P5.**.** Th
d930: 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  is works just li
d940: 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65  ke the Lt opcode
d950: 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
d960: 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69   jump is taken i
d970: 66 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 6e 64  f.** the operand
d980: 73 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 50  s in registers P
d990: 31 20 61 6e 64 20 50 33 20 61 72 65 20 6e 6f 74  1 and P3 are not
d9a0: 20 65 71 75 61 6c 2e 20 20 53 65 65 20 74 68 65   equal.  See the
d9b0: 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 0a 2a   Lt opcode for.*
d9c0: 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  * additional inf
d9d0: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ormation..**.** 
d9e0: 49 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  If SQLITE_NULLEQ
d9f0: 20 69 73 20 73 65 74 20 69 6e 20 50 35 20 74 68   is set in P5 th
da00: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
da10: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61   comparison is a
da20: 6c 77 61 79 73 20 65 69 74 68 65 72 0a 2a 2a 20  lways either.** 
da30: 74 72 75 65 20 6f 72 20 66 61 6c 73 65 20 61 6e  true or false an
da40: 64 20 69 73 20 6e 65 76 65 72 20 4e 55 4c 4c 2e  d is never NULL.
da50: 20 20 49 66 20 62 6f 74 68 20 6f 70 65 72 61 6e    If both operan
da60: 64 73 20 61 72 65 20 4e 55 4c 4c 20 74 68 65 6e  ds are NULL then
da70: 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f   the result.** o
da80: 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  f comparison is 
da90: 66 61 6c 73 65 2e 20 20 49 66 20 65 69 74 68 65  false.  If eithe
daa0: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
dab0: 4c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  L then the resul
dac0: 74 20 69 73 20 74 72 75 65 2e 0a 2a 2a 20 49 66  t is true..** If
dad0: 20 6e 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64   neither operand
dae0: 20 69 73 20 4e 55 4c 4c 20 74 68 65 20 72 65 73   is NULL the res
daf0: 75 6c 74 20 69 73 20 74 68 65 20 73 61 6d 65 20  ult is the same 
db00: 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69  as it would be i
db10: 66 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  f.** the SQLITE_
db20: 4e 55 4c 4c 45 51 20 66 6c 61 67 20 77 65 72 65  NULLEQ flag were
db30: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 50 35   omitted from P5
db40: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
db50: 45 71 20 50 31 20 50 32 20 50 33 20 50 34 20 50  Eq P1 P2 P3 P4 P
db60: 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  5.**.** This wor
db70: 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65  ks just like the
db80: 20 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70   Lt opcode excep
db90: 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20  t that the jump 
dba0: 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74  is taken if.** t
dbb0: 68 65 20 6f 70 65 72 61 6e 64 73 20 69 6e 20 72  he operands in r
dbc0: 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20  egisters P1 and 
dbd0: 50 33 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a  P3 are equal..**
dbe0: 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f   See the Lt opco
dbf0: 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  de for additiona
dc00: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
dc10: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4e  *.** If SQLITE_N
dc20: 55 4c 4c 45 51 20 69 73 20 73 65 74 20 69 6e 20  ULLEQ is set in 
dc30: 50 35 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  P5 then the resu
dc40: 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  lt of comparison
dc50: 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65   is always eithe
dc60: 72 0a 2a 2a 20 74 72 75 65 20 6f 72 20 66 61 6c  r.** true or fal
dc70: 73 65 20 61 6e 64 20 69 73 20 6e 65 76 65 72 20  se and is never 
dc80: 4e 55 4c 4c 2e 20 20 49 66 20 62 6f 74 68 20 6f  NULL.  If both o
dc90: 70 65 72 61 6e 64 73 20 61 72 65 20 4e 55 4c 4c  perands are NULL
dca0: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
dcb0: 0a 2a 2a 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  .** of compariso
dcc0: 6e 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 65  n is true.  If e
dcd0: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
dce0: 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72   NULL then the r
dcf0: 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65 2e 0a  esult is false..
dd00: 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 6f 70  ** If neither op
dd10: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74 68  erand is NULL th
dd20: 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20  e result is the 
dd30: 73 61 6d 65 20 61 73 20 69 74 20 77 6f 75 6c 64  same as it would
dd40: 20 62 65 20 69 66 0a 2a 2a 20 74 68 65 20 53 51   be if.** the SQ
dd50: 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 66 6c 61 67  LITE_NULLEQ flag
dd60: 20 77 65 72 65 20 6f 6d 69 74 74 65 64 20 66 72   were omitted fr
dd70: 6f 6d 20 50 35 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  om P5..*/./* Opc
dd80: 6f 64 65 3a 20 4c 65 20 50 31 20 50 32 20 50 33  ode: Le P1 P2 P3
dd90: 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69   P4 P5.**.** Thi
dda0: 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  s works just lik
ddb0: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20  e the Lt opcode 
ddc0: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
ddd0: 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
dde0: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
ddf0: 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20 69  of register P3 i
de00: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
de10: 71 75 61 6c 20 74 6f 20 74 68 65 20 63 6f 6e 74  qual to the cont
de20: 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74  ent of.** regist
de30: 65 72 20 50 31 2e 20 20 53 65 65 20 74 68 65 20  er P1.  See the 
de40: 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 64  Lt opcode for ad
de50: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
de60: 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  tion..*/./* Opco
de70: 64 65 3a 20 47 74 20 50 31 20 50 32 20 50 33 20  de: Gt P1 P2 P3 
de80: 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73  P4 P5.**.** This
de90: 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
dea0: 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65   the Lt opcode e
deb0: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6a  xcept that the j
dec0: 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a  ump is taken if.
ded0: 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ** the content o
dee0: 66 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73  f register P3 is
def0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
df00: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20  e content of.** 
df10: 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 53 65  register P1.  Se
df20: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20  e the Lt opcode 
df30: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
df40: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f  nformation..*/./
df50: 2a 20 4f 70 63 6f 64 65 3a 20 47 65 20 50 31 20  * Opcode: Ge P1 
df60: 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
df70: 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
df80: 74 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70  t like the Lt op
df90: 63 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74  code except that
dfa0: 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
dfb0: 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e  en if.** the con
dfc0: 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72  tent of register
dfd0: 20 50 33 20 69 73 20 67 72 65 61 74 65 72 20 74   P3 is greater t
dfe0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
dff0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a  the content of.*
e000: 2a 20 72 65 67 69 73 74 65 72 20 50 31 2e 20 20  * register P1.  
e010: 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64  See the Lt opcod
e020: 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
e030: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
e040: 0a 63 61 73 65 20 4f 50 5f 45 71 3a 20 20 20 20  .case OP_Eq:    
e050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
e060: 6d 65 20 61 73 20 54 4b 5f 45 51 2c 20 6a 75 6d  me as TK_EQ, jum
e070: 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63  p, in1, in3 */.c
e080: 61 73 65 20 4f 50 5f 4e 65 3a 20 20 20 20 20 20  ase OP_Ne:      
e090: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
e0a0: 20 61 73 20 54 4b 5f 4e 45 2c 20 6a 75 6d 70 2c   as TK_NE, jump,
e0b0: 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73   in1, in3 */.cas
e0c0: 65 20 4f 50 5f 4c 74 3a 20 20 20 20 20 20 20 20  e OP_Lt:        
e0d0: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
e0e0: 73 20 54 4b 5f 4c 54 2c 20 6a 75 6d 70 2c 20 69  s TK_LT, jump, i
e0f0: 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20  n1, in3 */.case 
e100: 4f 50 5f 4c 65 3a 20 20 20 20 20 20 20 20 20 20  OP_Le:          
e110: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
e120: 54 4b 5f 4c 45 2c 20 6a 75 6d 70 2c 20 69 6e 31  TK_LE, jump, in1
e130: 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
e140: 5f 47 74 3a 20 20 20 20 20 20 20 20 20 20 20 20  _Gt:            
e150: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
e160: 5f 47 54 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20  _GT, jump, in1, 
e170: 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 47  in3 */.case OP_G
e180: 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  e: {            
e190: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 47   /* same as TK_G
e1a0: 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e  E, jump, in1, in
e1b0: 33 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20  3 */.  int res; 
e1c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
e1d0: 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d 70  sult of the comp
e1e0: 61 72 69 73 6f 6e 20 6f 66 20 70 49 6e 31 20 61  arison of pIn1 a
e1f0: 67 61 69 6e 73 74 20 70 49 6e 33 20 2a 2f 0a 20  gainst pIn3 */. 
e200: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20   char affinity; 
e210: 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
e220: 20 74 6f 20 75 73 65 20 66 6f 72 20 63 6f 6d 70   to use for comp
e230: 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 75 31 36 20  arison */.  u16 
e240: 66 6c 61 67 73 31 3b 20 20 20 20 20 20 20 20 20  flags1;         
e250: 2f 2a 20 43 6f 70 79 20 6f 66 20 69 6e 69 74 69  /* Copy of initi
e260: 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 49 6e 31  al value of pIn1
e270: 2d 3e 66 6c 61 67 73 20 2a 2f 0a 20 20 75 31 36  ->flags */.  u16
e280: 20 66 6c 61 67 73 33 3b 20 20 20 20 20 20 20 20   flags3;        
e290: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 6e 69 74   /* Copy of init
e2a0: 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 49 6e  ial value of pIn
e2b0: 33 2d 3e 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 70  3->flags */..  p
e2c0: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
e2d0: 3e 70 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20 26  >p1];.  pIn3 = &
e2e0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
e2f0: 20 66 6c 61 67 73 31 20 3d 20 70 49 6e 31 2d 3e   flags1 = pIn1->
e300: 66 6c 61 67 73 3b 0a 20 20 66 6c 61 67 73 33 20  flags;.  flags3 
e310: 3d 20 70 49 6e 33 2d 3e 66 6c 61 67 73 3b 0a 20  = pIn3->flags;. 
e320: 20 69 66 28 20 28 66 6c 61 67 73 31 20 7c 20 66   if( (flags1 | f
e330: 6c 61 67 73 33 29 26 4d 45 4d 5f 4e 75 6c 6c 20  lags3)&MEM_Null 
e340: 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72  ){.    /* One or
e350: 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61   both operands a
e360: 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 69  re NULL */.    i
e370: 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  f( pOp->p5 & SQL
e380: 49 54 45 5f 4e 55 4c 4c 45 51 20 29 7b 0a 20 20  ITE_NULLEQ ){.  
e390: 20 20 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45      /* If SQLITE
e3a0: 5f 4e 55 4c 4c 45 51 20 69 73 20 73 65 74 20 28  _NULLEQ is set (
e3b0: 77 68 69 63 68 20 77 69 6c 6c 20 6f 6e 6c 79 20  which will only 
e3c0: 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6f 70  happen if the op
e3d0: 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20 20 20  erator is.      
e3e0: 2a 2a 20 4f 50 5f 45 71 20 6f 72 20 4f 50 5f 4e  ** OP_Eq or OP_N
e3f0: 65 29 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65  e) then take the
e400: 20 6a 75 6d 70 20 6f 72 20 6e 6f 74 20 64 65 70   jump or not dep
e410: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
e420: 72 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 6e 6f  r.      ** or no
e430: 74 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20  t both operands 
e440: 61 72 65 20 6e 75 6c 6c 2e 0a 20 20 20 20 20 20  are null..      
e450: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
e460: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
e470: 5f 45 71 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f  _Eq || pOp->opco
e480: 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20  de==OP_Ne );.   
e490: 20 20 20 72 65 73 20 3d 20 28 66 6c 61 67 73 31     res = (flags1
e4a0: 20 26 20 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f   & flags3 & MEM_
e4b0: 4e 75 6c 6c 29 3d 3d 30 3b 0a 20 20 20 20 7d 65  Null)==0;.    }e
e4c0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 51  lse{.      /* SQ
e4d0: 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 63  LITE_NULLEQ is c
e4e0: 6c 65 61 72 20 61 6e 64 20 61 74 20 6c 65 61 73  lear and at leas
e4f0: 74 20 6f 6e 65 20 6f 70 65 72 61 6e 64 20 69 73  t one operand is
e500: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 2a 2a 20   NULL,.      ** 
e510: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
e520: 69 73 20 61 6c 77 61 79 73 20 4e 55 4c 4c 2e 0a  is always NULL..
e530: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 6d        ** The jum
e540: 70 20 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68  p is taken if th
e550: 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  e SQLITE_JUMPIFN
e560: 55 4c 4c 20 62 69 74 20 69 73 20 73 65 74 2e 0a  ULL bit is set..
e570: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
e580: 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  f( pOp->p5 & SQL
e590: 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20  ITE_STOREP2 ){. 
e5a0: 20 20 20 20 20 20 20 70 4f 75 74 20 3d 20 26 61         pOut = &a
e5b0: 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
e5c0: 20 20 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65        MemSetType
e5d0: 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 4e  Flag(pOut, MEM_N
e5e0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 52 45  ull);.        RE
e5f0: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
e600: 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20 20  ->p2, pOut);.   
e610: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
e620: 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4a 55  ->p5 & SQLITE_JU
e630: 4d 50 49 46 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  MPIFNULL ){.    
e640: 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
e650: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
e660: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e670: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e   }else{.    /* N
e680: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
e690: 73 20 4e 55 4c 4c 2e 20 20 44 6f 20 61 20 63 6f  s NULL.  Do a co
e6a0: 6d 70 61 72 69 73 6f 6e 2e 20 2a 2f 0a 20 20 20  mparison. */.   
e6b0: 20 61 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d   affinity = pOp-
e6c0: 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 41 46 46  >p5 & SQLITE_AFF
e6d0: 5f 4d 41 53 4b 3b 0a 20 20 20 20 69 66 28 20 61  _MASK;.    if( a
e6e0: 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
e6f0: 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70   applyAffinity(p
e700: 49 6e 31 2c 20 61 66 66 69 6e 69 74 79 2c 20 65  In1, affinity, e
e710: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 20 20  ncoding);.      
e720: 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49  applyAffinity(pI
e730: 6e 33 2c 20 61 66 66 69 6e 69 74 79 2c 20 65 6e  n3, affinity, en
e740: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 69  coding);.      i
e750: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
e760: 6c 65 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  led ) goto no_me
e770: 6d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  m;.    }..    as
e780: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
e790: 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51 20 7c 7c  e==P4_COLLSEQ ||
e7a0: 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3d 3d   pOp->p4.pColl==
e7b0: 30 20 29 3b 0a 20 20 20 20 45 78 70 61 6e 64 42  0 );.    ExpandB
e7c0: 6c 6f 62 28 70 49 6e 31 29 3b 0a 20 20 20 20 45  lob(pIn1);.    E
e7d0: 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 33 29 3b  xpandBlob(pIn3);
e7e0: 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74  .    res = sqlit
e7f0: 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 49 6e  e3MemCompare(pIn
e800: 33 2c 20 70 49 6e 31 2c 20 70 4f 70 2d 3e 70 34  3, pIn1, pOp->p4
e810: 2e 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73  .pColl);.  }.  s
e820: 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f  witch( pOp->opco
e830: 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4f  de ){.    case O
e840: 50 5f 45 71 3a 20 20 20 20 72 65 73 20 3d 20 72  P_Eq:    res = r
e850: 65 73 3d 3d 30 3b 20 20 20 20 20 62 72 65 61 6b  es==0;     break
e860: 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65  ;.    case OP_Ne
e870: 3a 20 20 20 20 72 65 73 20 3d 20 72 65 73 21 3d  :    res = res!=
e880: 30 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  0;     break;.  
e890: 20 20 63 61 73 65 20 4f 50 5f 4c 74 3a 20 20 20    case OP_Lt:   
e8a0: 20 72 65 73 20 3d 20 72 65 73 3c 30 3b 20 20 20   res = res<0;   
e8b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
e8c0: 73 65 20 4f 50 5f 4c 65 3a 20 20 20 20 72 65 73  se OP_Le:    res
e8d0: 20 3d 20 72 65 73 3c 3d 30 3b 20 20 20 20 20 62   = res<=0;     b
e8e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f  reak;.    case O
e8f0: 50 5f 47 74 3a 20 20 20 20 72 65 73 20 3d 20 72  P_Gt:    res = r
e900: 65 73 3e 30 3b 20 20 20 20 20 20 62 72 65 61 6b  es>0;      break
e910: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
e920: 20 20 20 20 20 72 65 73 20 3d 20 72 65 73 3e 3d       res = res>=
e930: 30 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  0;     break;.  
e940: 7d 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35  }..  if( pOp->p5
e950: 20 26 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50   & SQLITE_STOREP
e960: 32 20 29 7b 0a 20 20 20 20 70 4f 75 74 20 3d 20  2 ){.    pOut = 
e970: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
e980: 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68      memAboutToCh
e990: 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20  ange(p, pOut);. 
e9a0: 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61     MemSetTypeFla
e9b0: 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29  g(pOut, MEM_Int)
e9c0: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20  ;.    pOut->u.i 
e9d0: 3d 20 72 65 73 3b 0a 20 20 20 20 52 45 47 49 53  = res;.    REGIS
e9e0: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
e9f0: 32 2c 20 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73  2, pOut);.  }els
ea00: 65 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20  e if( res ){.   
ea10: 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b   pc = pOp->p2-1;
ea20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 64 6f 20  .  }..  /* Undo 
ea30: 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65  any changes made
ea40: 20 62 79 20 61 70 70 6c 79 41 66 66 69 6e 69 74   by applyAffinit
ea50: 79 28 29 20 74 6f 20 74 68 65 20 69 6e 70 75 74  y() to the input
ea60: 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a 20   registers. */. 
ea70: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 28   pIn1->flags = (
ea80: 70 49 6e 31 2d 3e 66 6c 61 67 73 26 7e 4d 45 4d  pIn1->flags&~MEM
ea90: 5f 54 79 70 65 4d 61 73 6b 29 20 7c 20 28 66 6c  _TypeMask) | (fl
eaa0: 61 67 73 31 26 4d 45 4d 5f 54 79 70 65 4d 61 73  ags1&MEM_TypeMas
eab0: 6b 29 3b 0a 20 20 70 49 6e 33 2d 3e 66 6c 61 67  k);.  pIn3->flag
eac0: 73 20 3d 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73  s = (pIn3->flags
ead0: 26 7e 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 20  &~MEM_TypeMask) 
eae0: 7c 20 28 66 6c 61 67 73 33 26 4d 45 4d 5f 54 79  | (flags3&MEM_Ty
eaf0: 70 65 4d 61 73 6b 29 3b 0a 20 20 62 72 65 61 6b  peMask);.  break
eb00: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
eb10: 50 65 72 6d 75 74 61 74 69 6f 6e 20 2a 20 2a 20  Permutation * * 
eb20: 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74  * P4 *.**.** Set
eb30: 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   the permutation
eb40: 20 75 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f   used by the OP_
eb50: 43 6f 6d 70 61 72 65 20 6f 70 65 72 61 74 6f 72  Compare operator
eb60: 20 74 6f 20 62 65 20 74 68 65 20 61 72 72 61 79   to be the array
eb70: 0a 2a 2a 20 6f 66 20 69 6e 74 65 67 65 72 73 20  .** of integers 
eb80: 69 6e 20 50 34 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  in P4..**.** The
eb90: 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 69 73 20   permutation is 
eba0: 6f 6e 6c 79 20 76 61 6c 69 64 20 75 6e 74 69 6c  only valid until
ebb0: 20 74 68 65 20 6e 65 78 74 20 4f 50 5f 50 65 72   the next OP_Per
ebc0: 6d 75 74 61 74 69 6f 6e 2c 20 4f 50 5f 43 6f 6d  mutation, OP_Com
ebd0: 70 61 72 65 2c 0a 2a 2a 20 4f 50 5f 48 61 6c 74  pare,.** OP_Halt
ebe0: 2c 20 6f 72 20 4f 50 5f 52 65 73 75 6c 74 52 6f  , or OP_ResultRo
ebf0: 77 2e 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68  w.  Typically th
ec00: 65 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  e OP_Permutation
ec10: 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 0a 2a 2a   should occur.**
ec20: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 70 72 69   immediately pri
ec30: 6f 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6d  or to the OP_Com
ec40: 70 61 72 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  pare..*/.case OP
ec50: 5f 50 65 72 6d 75 74 61 74 69 6f 6e 3a 20 7b 0a  _Permutation: {.
ec60: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
ec70: 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 41 52 52  4type==P4_INTARR
ec80: 41 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AY );.  assert( 
ec90: 70 4f 70 2d 3e 70 34 2e 61 69 20 29 3b 0a 20 20  pOp->p4.ai );.  
eca0: 61 50 65 72 6d 75 74 65 20 3d 20 70 4f 70 2d 3e  aPermute = pOp->
ecb0: 70 34 2e 61 69 3b 0a 20 20 62 72 65 61 6b 3b 0a  p4.ai;.  break;.
ecc0: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f  }../* Opcode: Co
ecd0: 6d 70 61 72 65 20 50 31 20 50 32 20 50 33 20 50  mpare P1 P2 P3 P
ece0: 34 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72  4 *.**.** Compar
ecf0: 65 20 74 77 6f 20 76 65 63 74 6f 72 73 20 6f 66  e two vectors of
ed00: 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 72 65   registers in re
ed10: 67 28 50 31 29 2e 2e 72 65 67 28 50 31 2b 50 33  g(P1)..reg(P1+P3
ed20: 2d 31 29 20 28 63 61 6c 6c 20 74 68 69 73 0a 2a  -1) (call this.*
ed30: 2a 20 76 65 63 74 6f 72 20 22 41 22 29 20 61 6e  * vector "A") an
ed40: 64 20 69 6e 20 72 65 67 28 50 32 29 2e 2e 72 65  d in reg(P2)..re
ed50: 67 28 50 32 2b 50 33 2d 31 29 20 28 22 42 22 29  g(P2+P3-1) ("B")
ed60: 2e 20 20 53 61 76 65 20 74 68 65 20 72 65 73 75  .  Save the resu
ed70: 6c 74 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6d  lt of.** the com
ed80: 70 61 72 69 73 6f 6e 20 66 6f 72 20 75 73 65 20  parison for use 
ed90: 62 79 20 74 68 65 20 6e 65 78 74 20 4f 50 5f 4a  by the next OP_J
eda0: 75 6d 70 20 69 6e 73 74 72 75 63 74 2e 0a 2a 2a  ump instruct..**
edb0: 0a 2a 2a 20 50 34 20 69 73 20 61 20 4b 65 79 49  .** P4 is a KeyI
edc0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
edd0: 61 74 20 64 65 66 69 6e 65 73 20 63 6f 6c 6c 61  at defines colla
ede0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61  ting sequences a
edf0: 6e 64 20 73 6f 72 74 0a 2a 2a 20 6f 72 64 65 72  nd sort.** order
ee00: 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72  s for the compar
ee10: 69 73 6f 6e 2e 20 20 54 68 65 20 70 65 72 6d 75  ison.  The permu
ee20: 74 61 74 69 6f 6e 20 61 70 70 6c 69 65 73 20 74  tation applies t
ee30: 6f 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 6f  o registers.** o
ee40: 6e 6c 79 2e 20 20 54 68 65 20 4b 65 79 49 6e 66  nly.  The KeyInf
ee50: 6f 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 75  o elements are u
ee60: 73 65 64 20 73 65 71 75 65 6e 74 69 61 6c 6c 79  sed sequentially
ee70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70  ..**.** The comp
ee80: 61 72 69 73 6f 6e 20 69 73 20 61 20 73 6f 72 74  arison is a sort
ee90: 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 73 6f 20   comparison, so 
eea0: 4e 55 4c 4c 73 20 63 6f 6d 70 61 72 65 20 65 71  NULLs compare eq
eeb0: 75 61 6c 2c 0a 2a 2a 20 4e 55 4c 4c 73 20 61 72  ual,.** NULLs ar
eec0: 65 20 6c 65 73 73 20 74 68 61 6e 20 6e 75 6d 62  e less than numb
eed0: 65 72 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65  ers, numbers are
eee0: 20 6c 65 73 73 20 74 68 61 6e 20 73 74 72 69 6e   less than strin
eef0: 67 73 2c 0a 2a 2a 20 61 6e 64 20 73 74 72 69 6e  gs,.** and strin
ef00: 67 73 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e  gs are less than
ef10: 20 62 6c 6f 62 73 2e 0a 2a 2f 0a 63 61 73 65 20   blobs..*/.case 
ef20: 4f 50 5f 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20  OP_Compare: {.  
ef30: 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  int n;.  int i;.
ef40: 20 20 69 6e 74 20 70 31 3b 0a 20 20 69 6e 74 20    int p1;.  int 
ef50: 70 32 3b 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49  p2;.  const KeyI
ef60: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
ef70: 20 69 6e 74 20 69 64 78 3b 0a 20 20 43 6f 6c 6c   int idx;.  Coll
ef80: 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f  Seq *pColl;    /
ef90: 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
efa0: 65 6e 63 65 20 74 6f 20 75 73 65 20 6f 6e 20 74  ence to use on t
efb0: 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  his term */.  in
efc0: 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20  t bRev;         
efd0: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 44 45 53   /* True for DES
efe0: 43 45 4e 44 49 4e 47 20 73 6f 72 74 20 6f 72 64  CENDING sort ord
eff0: 65 72 20 2a 2f 0a 0a 20 20 6e 20 3d 20 70 4f 70  er */..  n = pOp
f000: 2d 3e 70 33 3b 0a 20 20 70 4b 65 79 49 6e 66 6f  ->p3;.  pKeyInfo
f010: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
f020: 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  nfo;.  assert( n
f030: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
f040: 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 0a 20  pKeyInfo!=0 );. 
f050: 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20   p1 = pOp->p1;. 
f060: 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 23   p2 = pOp->p2;.#
f070: 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
f080: 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29    if( aPermute )
f090: 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6d 78 20  {.    int k, mx 
f0a0: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30  = 0;.    for(k=0
f0b0: 3b 20 6b 3c 6e 3b 20 6b 2b 2b 29 20 69 66 28 20  ; k<n; k++) if( 
f0c0: 61 50 65 72 6d 75 74 65 5b 6b 5d 3e 6d 78 20 29  aPermute[k]>mx )
f0d0: 20 6d 78 20 3d 20 61 50 65 72 6d 75 74 65 5b 6b   mx = aPermute[k
f0e0: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
f0f0: 31 3e 30 20 26 26 20 70 31 2b 6d 78 3c 3d 70 2d  1>0 && p1+mx<=p-
f100: 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 20 20 20 20 61  >nMem+1 );.    a
f110: 73 73 65 72 74 28 20 70 32 3e 30 20 26 26 20 70  ssert( p2>0 && p
f120: 32 2b 6d 78 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20  2+mx<=p->nMem+1 
f130: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f140: 61 73 73 65 72 74 28 20 70 31 3e 30 20 26 26 20  assert( p1>0 && 
f150: 70 31 2b 6e 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20  p1+n<=p->nMem+1 
f160: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
f170: 32 3e 30 20 26 26 20 70 32 2b 6e 3c 3d 70 2d 3e  2>0 && p2+n<=p->
f180: 6e 4d 65 6d 2b 31 20 29 3b 0a 20 20 7d 0a 23 65  nMem+1 );.  }.#e
f190: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
f1a0: 45 42 55 47 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  EBUG */.  for(i=
f1b0: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
f1c0: 20 20 69 64 78 20 3d 20 61 50 65 72 6d 75 74 65    idx = aPermute
f1d0: 20 3f 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3a   ? aPermute[i] :
f1e0: 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
f1f0: 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d  memIsValid(&aMem
f200: 5b 70 31 2b 69 64 78 5d 29 20 29 3b 0a 20 20 20  [p1+idx]) );.   
f210: 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
f220: 6c 69 64 28 26 61 4d 65 6d 5b 70 32 2b 69 64 78  lid(&aMem[p2+idx
f230: 5d 29 20 29 3b 0a 20 20 20 20 52 45 47 49 53 54  ]) );.    REGIST
f240: 45 52 5f 54 52 41 43 45 28 70 31 2b 69 64 78 2c  ER_TRACE(p1+idx,
f250: 20 26 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 29 3b   &aMem[p1+idx]);
f260: 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52  .    REGISTER_TR
f270: 41 43 45 28 70 32 2b 69 64 78 2c 20 26 61 4d 65  ACE(p2+idx, &aMe
f280: 6d 5b 70 32 2b 69 64 78 5d 29 3b 0a 20 20 20 20  m[p2+idx]);.    
f290: 61 73 73 65 72 74 28 20 69 3c 70 4b 65 79 49 6e  assert( i<pKeyIn
f2a0: 66 6f 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 20 20  fo->nField );.  
f2b0: 20 20 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e    pColl = pKeyIn
f2c0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  fo->aColl[i];.  
f2d0: 20 20 62 52 65 76 20 3d 20 70 4b 65 79 49 6e 66    bRev = pKeyInf
f2e0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
f2f0: 3b 0a 20 20 20 20 69 43 6f 6d 70 61 72 65 20 3d  ;.    iCompare =
f300: 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
f310: 72 65 28 26 61 4d 65 6d 5b 70 31 2b 69 64 78 5d  re(&aMem[p1+idx]
f320: 2c 20 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d 2c  , &aMem[p2+idx],
f330: 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pColl);.    if(
f340: 20 69 43 6f 6d 70 61 72 65 20 29 7b 0a 20 20 20   iCompare ){.   
f350: 20 20 20 69 66 28 20 62 52 65 76 20 29 20 69 43     if( bRev ) iC
f360: 6f 6d 70 61 72 65 20 3d 20 2d 69 43 6f 6d 70 61  ompare = -iCompa
f370: 72 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  re;.      break;
f380: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 50 65  .    }.  }.  aPe
f390: 72 6d 75 74 65 20 3d 20 30 3b 0a 20 20 62 72 65  rmute = 0;.  bre
f3a0: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
f3b0: 3a 20 4a 75 6d 70 20 50 31 20 50 32 20 50 33 20  : Jump P1 P2 P3 
f3c0: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74  * *.**.** Jump t
f3d0: 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  o the instructio
f3e0: 6e 20 61 74 20 61 64 64 72 65 73 73 20 50 31 2c  n at address P1,
f3f0: 20 50 32 2c 20 6f 72 20 50 33 20 64 65 70 65 6e   P2, or P3 depen
f400: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 0a  ding on whether.
f410: 2a 2a 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72  ** in the most r
f420: 65 63 65 6e 74 20 4f 50 5f 43 6f 6d 70 61 72 65  ecent OP_Compare
f430: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 65   instruction the
f440: 20 50 31 20 76 65 63 74 6f 72 20 77 61 73 20 6c   P1 vector was l
f450: 65 73 73 20 74 68 61 6e 0a 2a 2a 20 65 71 75 61  ess than.** equa
f460: 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
f470: 20 74 68 61 6e 20 74 68 65 20 50 32 20 76 65 63   than the P2 vec
f480: 74 6f 72 2c 20 72 65 73 70 65 63 74 69 76 65 6c  tor, respectivel
f490: 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4a 75  y..*/.case OP_Ju
f4a0: 6d 70 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  mp: {           
f4b0: 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69    /* jump */.  i
f4c0: 66 28 20 69 43 6f 6d 70 61 72 65 3c 30 20 29 7b  f( iCompare<0 ){
f4d0: 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70  .    pc = pOp->p
f4e0: 31 20 2d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  1 - 1;.  }else i
f4f0: 66 28 20 69 43 6f 6d 70 61 72 65 3d 3d 30 20 29  f( iCompare==0 )
f500: 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e  {.    pc = pOp->
f510: 70 32 20 2d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  p2 - 1;.  }else{
f520: 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70  .    pc = pOp->p
f530: 33 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65  3 - 1;.  }.  bre
f540: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
f550: 3a 20 41 6e 64 20 50 31 20 50 32 20 50 33 20 2a  : And P1 P2 P3 *
f560: 20 2a 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68   *.**.** Take th
f570: 65 20 6c 6f 67 69 63 61 6c 20 41 4e 44 20 6f 66  e logical AND of
f580: 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72   the values in r
f590: 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20  egisters P1 and 
f5a0: 50 32 20 61 6e 64 0a 2a 2a 20 77 72 69 74 65 20  P2 and.** write 
f5b0: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 74 6f 20  the result into 
f5c0: 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a  register P3..**.
f5d0: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 50 31 20  ** If either P1 
f5e0: 6f 72 20 50 32 20 69 73 20 30 20 28 66 61 6c 73  or P2 is 0 (fals
f5f0: 65 29 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  e) then the resu
f600: 6c 74 20 69 73 20 30 20 65 76 65 6e 20 69 66 0a  lt is 0 even if.
f610: 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 69 6e 70  ** the other inp
f620: 75 74 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20 4e  ut is NULL.  A N
f630: 55 4c 4c 20 61 6e 64 20 74 72 75 65 20 6f 72 20  ULL and true or 
f640: 74 77 6f 20 4e 55 4c 4c 73 20 67 69 76 65 0a 2a  two NULLs give.*
f650: 2a 20 61 20 4e 55 4c 4c 20 6f 75 74 70 75 74 2e  * a NULL output.
f660: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .*/./* Opcode: O
f670: 72 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  r P1 P2 P3 * *.*
f680: 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 6c 6f  *.** Take the lo
f690: 67 69 63 61 6c 20 4f 52 20 6f 66 20 74 68 65 20  gical OR of the 
f6a0: 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74  values in regist
f6b0: 65 72 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64  er P1 and P2 and
f6c0: 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 61 6e  .** store the an
f6d0: 73 77 65 72 20 69 6e 20 72 65 67 69 73 74 65 72  swer in register
f6e0: 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69   P3..**.** If ei
f6f0: 74 68 65 72 20 50 31 20 6f 72 20 50 32 20 69 73  ther P1 or P2 is
f700: 20 6e 6f 6e 7a 65 72 6f 20 28 74 72 75 65 29 20   nonzero (true) 
f710: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
f720: 69 73 20 31 20 28 74 72 75 65 29 0a 2a 2a 20 65  is 1 (true).** e
f730: 76 65 6e 20 69 66 20 74 68 65 20 6f 74 68 65 72  ven if the other
f740: 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e 20   input is NULL. 
f750: 20 41 20 4e 55 4c 4c 20 61 6e 64 20 66 61 6c 73   A NULL and fals
f760: 65 20 6f 72 20 74 77 6f 20 4e 55 4c 4c 73 0a 2a  e or two NULLs.*
f770: 2a 20 67 69 76 65 20 61 20 4e 55 4c 4c 20 6f 75  * give a NULL ou
f780: 74 70 75 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  tput..*/.case OP
f790: 5f 41 6e 64 3a 20 20 20 20 20 20 20 20 20 20 20  _And:           
f7a0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
f7b0: 5f 41 4e 44 2c 20 69 6e 31 2c 20 69 6e 32 2c 20  _AND, in1, in2, 
f7c0: 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  out3 */.case OP_
f7d0: 4f 72 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  Or: {           
f7e0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
f7f0: 4f 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  OR, in1, in2, ou
f800: 74 33 20 2a 2f 0a 20 20 69 6e 74 20 76 31 3b 20  t3 */.  int v1; 
f810: 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61     /* Left opera
f820: 6e 64 3a 20 20 30 3d 3d 46 41 4c 53 45 2c 20 31  nd:  0==FALSE, 1
f830: 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e 4f  ==TRUE, 2==UNKNO
f840: 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  WN or NULL */.  
f850: 69 6e 74 20 76 32 3b 20 20 20 20 2f 2a 20 52 69  int v2;    /* Ri
f860: 67 68 74 20 6f 70 65 72 61 6e 64 3a 20 30 3d 3d  ght operand: 0==
f870: 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c 20  FALSE, 1==TRUE, 
f880: 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e 55  2==UNKNOWN or NU
f890: 4c 4c 20 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d 20  LL */..  pIn1 = 
f8a0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
f8b0: 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67    if( pIn1->flag
f8c0: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
f8d0: 20 20 20 20 76 31 20 3d 20 32 3b 0a 20 20 7d 65      v1 = 2;.  }e
f8e0: 6c 73 65 7b 0a 20 20 20 20 76 31 20 3d 20 73 71  lse{.    v1 = sq
f8f0: 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
f900: 65 28 70 49 6e 31 29 21 3d 30 3b 0a 20 20 7d 0a  e(pIn1)!=0;.  }.
f910: 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70    pIn2 = &aMem[p
f920: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69 66 28 20 70  Op->p2];.  if( p
f930: 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In2->flags & MEM
f940: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 76 32 20  _Null ){.    v2 
f950: 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 2;.  }else{.  
f960: 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 64    v2 = sqlite3Vd
f970: 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 32 29  beIntValue(pIn2)
f980: 21 3d 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  !=0;.  }.  if( p
f990: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41  Op->opcode==OP_A
f9a0: 6e 64 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  nd ){.    static
f9b0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
f9c0: 63 68 61 72 20 61 6e 64 5f 6c 6f 67 69 63 5b 5d  char and_logic[]
f9d0: 20 3d 20 7b 20 30 2c 20 30 2c 20 30 2c 20 30 2c   = { 0, 0, 0, 0,
f9e0: 20 31 2c 20 32 2c 20 30 2c 20 32 2c 20 32 20 7d   1, 2, 0, 2, 2 }
f9f0: 3b 0a 20 20 20 20 76 31 20 3d 20 61 6e 64 5f 6c  ;.    v1 = and_l
fa00: 6f 67 69 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a 20  ogic[v1*3+v2];. 
fa10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74   }else{.    stat
fa20: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
fa30: 64 20 63 68 61 72 20 6f 72 5f 6c 6f 67 69 63 5b  d char or_logic[
fa40: 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 31  ] = { 0, 1, 2, 1
fa50: 2c 20 31 2c 20 31 2c 20 32 2c 20 31 2c 20 32 20  , 1, 1, 2, 1, 2 
fa60: 7d 3b 0a 20 20 20 20 76 31 20 3d 20 6f 72 5f 6c  };.    v1 = or_l
fa70: 6f 67 69 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a 20  ogic[v1*3+v2];. 
fa80: 20 7d 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65   }.  pOut = &aMe
fa90: 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66  m[pOp->p3];.  if
faa0: 28 20 76 31 3d 3d 32 20 29 7b 0a 20 20 20 20 4d  ( v1==2 ){.    M
fab0: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
fac0: 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  ut, MEM_Null);. 
fad0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4f 75 74   }else{.    pOut
fae0: 2d 3e 75 2e 69 20 3d 20 76 31 3b 0a 20 20 20 20  ->u.i = v1;.    
faf0: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
fb00: 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20  Out, MEM_Int);. 
fb10: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
fb20: 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 20 50 31  * Opcode: Not P1
fb30: 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
fb40: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 76 61  Interpret the va
fb50: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
fb60: 50 31 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20  P1 as a boolean 
fb70: 76 61 6c 75 65 2e 20 20 53 74 6f 72 65 20 74 68  value.  Store th
fb80: 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 63 6f 6d  e.** boolean com
fb90: 70 6c 65 6d 65 6e 74 20 69 6e 20 72 65 67 69 73  plement in regis
fba0: 74 65 72 20 50 32 2e 20 20 49 66 20 74 68 65 20  ter P2.  If the 
fbb0: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
fbc0: 72 20 50 31 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c  r P1 is .** NULL
fbd0: 2c 20 74 68 65 6e 20 61 20 4e 55 4c 4c 20 69 73  , then a NULL is
fbe0: 20 73 74 6f 72 65 64 20 69 6e 20 50 32 2e 0a 2a   stored in P2..*
fbf0: 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 3a 20 7b  /.case OP_Not: {
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc10: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4e 4f  /* same as TK_NO
fc20: 54 2c 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a  T, in1, out2 */.
fc30: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
fc40: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20  Op->p1];.  pOut 
fc50: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
fc60: 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c  ;.  if( pIn1->fl
fc70: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
fc80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
fc90: 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74  eMemSetNull(pOut
fca0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
fcb0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
fcc0: 74 49 6e 74 36 34 28 70 4f 75 74 2c 20 21 73 71  tInt64(pOut, !sq
fcd0: 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
fce0: 65 28 70 49 6e 31 29 29 3b 0a 20 20 7d 0a 20 20  e(pIn1));.  }.  
fcf0: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
fd00: 6f 64 65 3a 20 42 69 74 4e 6f 74 20 50 31 20 50  ode: BitNot P1 P
fd10: 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e  2 * * *.**.** In
fd20: 74 65 72 70 72 65 74 20 74 68 65 20 63 6f 6e 74  terpret the cont
fd30: 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20  ent of register 
fd40: 50 31 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  P1 as an integer
fd50: 2e 20 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20  .  Store the.** 
fd60: 6f 6e 65 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  ones-complement 
fd70: 6f 66 20 74 68 65 20 50 31 20 76 61 6c 75 65 20  of the P1 value 
fd80: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  into register P2
fd90: 2e 20 20 49 66 20 50 31 20 68 6f 6c 64 73 0a 2a  .  If P1 holds.*
fda0: 2a 20 61 20 4e 55 4c 4c 20 74 68 65 6e 20 73 74  * a NULL then st
fdb0: 6f 72 65 20 61 20 4e 55 4c 4c 20 69 6e 20 50 32  ore a NULL in P2
fdc0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74  ..*/.case OP_Bit
fdd0: 4e 6f 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20  Not: {          
fde0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
fdf0: 5f 42 49 54 4e 4f 54 2c 20 69 6e 31 2c 20 6f 75  _BITNOT, in1, ou
fe00: 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  t2 */.  pIn1 = &
fe10: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
fe20: 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
fe30: 70 2d 3e 70 32 5d 3b 0a 20 20 69 66 28 20 70 49  p->p2];.  if( pI
fe40: 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
fe50: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  Null ){.    sqli
fe60: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c  te3VdbeMemSetNul
fe70: 6c 28 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  l(pOut);.  }else
fe80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
fe90: 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 70 4f 75  eMemSetInt64(pOu
fea0: 74 2c 20 7e 73 71 6c 69 74 65 33 56 64 62 65 49  t, ~sqlite3VdbeI
feb0: 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 29 3b 0a  ntValue(pIn1));.
fec0: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
fed0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 6e 63 65 20  /* Opcode: Once 
fee0: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
fef0: 2a 20 43 68 65 63 6b 20 69 66 20 4f 50 5f 4f 6e  * Check if OP_On
ff00: 63 65 20 66 6c 61 67 20 50 31 20 69 73 20 73 65  ce flag P1 is se
ff10: 74 2e 20 49 66 20 73 6f 2c 20 6a 75 6d 70 20 74  t. If so, jump t
ff20: 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32  o instruction P2
ff30: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
ff40: 73 65 74 20 74 68 65 20 66 6c 61 67 20 61 6e 64  set the flag and
ff50: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
ff60: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
ff70: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  ction..**.** See
ff80: 20 61 6c 73 6f 3a 20 4a 75 6d 70 4f 6e 63 65 0a   also: JumpOnce.
ff90: 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 6e 63 65 3a  */.case OP_Once:
ffa0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   {             /
ffb0: 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65  * jump */.  asse
ffc0: 72 74 28 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e  rt( pOp->p1<p->n
ffd0: 4f 6e 63 65 46 6c 61 67 20 29 3b 0a 20 20 69 66  OnceFlag );.  if
ffe0: 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b 70  ( p->aOnceFlag[p
fff0: 4f 70 2d 3e 70 31 5d 20 29 7b 0a 20 20 20 20 70  Op->p1] ){.    p
10000 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20  c = pOp->p2-1;. 
10010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 61   }else{.    p->a
10020 4f 6e 63 65 46 6c 61 67 5b 70 4f 70 2d 3e 70 31  OnceFlag[pOp->p1
10030 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65  ] = 1;.  }.  bre
10040 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
10050 3a 20 49 66 20 50 31 20 50 32 20 50 33 20 2a 20  : If P1 P2 P3 * 
10060 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20  *.**.** Jump to 
10070 50 32 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  P2 if the value 
10080 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69  in register P1 i
10090 73 20 74 72 75 65 2e 20 20 54 68 65 20 76 61 6c  s true.  The val
100a0 75 65 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  ue.** is conside
100b0 72 65 64 20 74 72 75 65 20 69 66 20 69 74 20 69  red true if it i
100c0 73 20 6e 75 6d 65 72 69 63 20 61 6e 64 20 6e 6f  s numeric and no
100d0 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 74 68 65 20  n-zero.  If the 
100e0 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20 69  value.** in P1 i
100f0 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 61 6b 65  s NULL then take
10100 20 74 68 65 20 6a 75 6d 70 20 69 66 20 50 33 20   the jump if P3 
10110 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  is non-zero..*/.
10120 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 4e 6f 74  /* Opcode: IfNot
10130 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
10140 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69  .** Jump to P2 i
10150 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  f the value in r
10160 65 67 69 73 74 65 72 20 50 31 20 69 73 20 46 61  egister P1 is Fa
10170 6c 73 65 2e 20 20 54 68 65 20 76 61 6c 75 65 0a  lse.  The value.
10180 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
10190 20 66 61 6c 73 65 20 69 66 20 69 74 20 68 61 73   false if it has
101a0 20 61 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65   a numeric value
101b0 20 6f 66 20 7a 65 72 6f 2e 20 20 49 66 20 74 68   of zero.  If th
101c0 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31  e value.** in P1
101d0 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 61   is NULL then ta
101e0 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 50  ke the jump if P
101f0 33 20 69 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 63 61  3 is zero..*/.ca
10200 73 65 20 4f 50 5f 49 66 3a 20 20 20 20 20 20 20  se OP_If:       
10210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d            /* jum
10220 70 2c 20 69 6e 31 20 2a 2f 0a 63 61 73 65 20 4f  p, in1 */.case O
10230 50 5f 49 66 4e 6f 74 3a 20 7b 20 20 20 20 20 20  P_IfNot: {      
10240 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69        /* jump, i
10250 6e 31 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 0a 20  n1 */.  int c;. 
10260 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
10270 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70 49  p->p1];.  if( pI
10280 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
10290 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 63 20 3d 20  Null ){.    c = 
102a0 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 65 6c 73 65  pOp->p3;.  }else
102b0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
102c0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
102d0 49 4e 54 0a 20 20 20 20 63 20 3d 20 73 71 6c 69  INT.    c = sqli
102e0 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28  te3VdbeIntValue(
102f0 70 49 6e 31 29 21 3d 30 3b 0a 23 65 6c 73 65 0a  pIn1)!=0;.#else.
10300 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
10310 64 62 65 52 65 61 6c 56 61 6c 75 65 28 70 49 6e  dbeRealValue(pIn
10320 31 29 21 3d 30 2e 30 3b 0a 23 65 6e 64 69 66 0a  1)!=0.0;.#endif.
10330 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
10340 6f 64 65 3d 3d 4f 50 5f 49 66 4e 6f 74 20 29 20  ode==OP_IfNot ) 
10350 63 20 3d 20 21 63 3b 0a 20 20 7d 0a 20 20 69 66  c = !c;.  }.  if
10360 28 20 63 20 29 7b 0a 20 20 20 20 70 63 20 3d 20  ( c ){.    pc = 
10370 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d 0a 20  pOp->p2-1;.  }. 
10380 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
10390 63 6f 64 65 3a 20 49 73 4e 75 6c 6c 20 50 31 20  code: IsNull P1 
103a0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a  P2 * * *.**.** J
103b0 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65  ump to P2 if the
103c0 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
103d0 65 72 20 50 31 20 69 73 20 4e 55 4c 4c 2e 0a 2a  er P1 is NULL..*
103e0 2f 0a 63 61 73 65 20 4f 50 5f 49 73 4e 75 6c 6c  /.case OP_IsNull
103f0 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
10400 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 49 53 4e  * same as TK_ISN
10410 55 4c 4c 2c 20 6a 75 6d 70 2c 20 69 6e 31 20 2a  ULL, jump, in1 *
10420 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
10430 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28  [pOp->p1];.  if(
10440 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
10450 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29 7b 0a  MEM_Null)!=0 ){.
10460 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
10470 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61   - 1;.  }.  brea
10480 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
10490 20 4e 6f 74 4e 75 6c 6c 20 50 31 20 50 32 20 2a   NotNull P1 P2 *
104a0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20   * *.**.** Jump 
104b0 74 6f 20 50 32 20 69 66 20 74 68 65 20 76 61 6c  to P2 if the val
104c0 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
104d0 31 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 20  1 is not NULL.  
104e0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 4e  .*/.case OP_NotN
104f0 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ull: {          
10500 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
10510 4e 4f 54 4e 55 4c 4c 2c 20 6a 75 6d 70 2c 20 69  NOTNULL, jump, i
10520 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
10530 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
10540 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
10550 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30  s & MEM_Null)==0
10560 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70   ){.    pc = pOp
10570 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  ->p2 - 1;.  }.  
10580 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
10590 6f 64 65 3a 20 43 6f 6c 75 6d 6e 20 50 31 20 50  ode: Column P1 P
105a0 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
105b0 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 64   Interpret the d
105c0 61 74 61 20 74 68 61 74 20 63 75 72 73 6f 72 20  ata that cursor 
105d0 50 31 20 70 6f 69 6e 74 73 20 74 6f 20 61 73 20  P1 points to as 
105e0 61 20 73 74 72 75 63 74 75 72 65 20 62 75 69 6c  a structure buil
105f0 74 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 4d  t using.** the M
10600 61 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75  akeRecord instru
10610 63 74 69 6f 6e 2e 20 20 28 53 65 65 20 74 68 65  ction.  (See the
10620 20 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f   MakeRecord opco
10630 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  de for additiona
10640 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
10650 20 61 62 6f 75 74 20 74 68 65 20 66 6f 72 6d 61   about the forma
10660 74 20 6f 66 20 74 68 65 20 64 61 74 61 2e 29 20  t of the data.) 
10670 20 45 78 74 72 61 63 74 20 74 68 65 20 50 32 2d   Extract the P2-
10680 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 66 72 6f  th column.** fro
10690 6d 20 74 68 69 73 20 72 65 63 6f 72 64 2e 20 20  m this record.  
106a0 49 66 20 74 68 65 72 65 20 61 72 65 20 6c 65 73  If there are les
106b0 73 20 74 68 61 74 20 28 50 32 2b 31 29 20 0a 2a  s that (P2+1) .*
106c0 2a 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  * values in the 
106d0 72 65 63 6f 72 64 2c 20 65 78 74 72 61 63 74 20  record, extract 
106e0 61 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  a NULL..**.** Th
106f0 65 20 76 61 6c 75 65 20 65 78 74 72 61 63 74 65  e value extracte
10700 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72  d is stored in r
10710 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a  egister P3..**.*
10720 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
10730 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74  contains fewer t
10740 68 61 6e 20 50 32 20 66 69 65 6c 64 73 2c 20 74  han P2 fields, t
10750 68 65 6e 20 65 78 74 72 61 63 74 20 61 20 4e 55  hen extract a NU
10760 4c 4c 2e 20 20 4f 72 2c 0a 2a 2a 20 69 66 20 74  LL.  Or,.** if t
10770 68 65 20 50 34 20 61 72 67 75 6d 65 6e 74 20 69  he P4 argument i
10780 73 20 61 20 50 34 5f 4d 45 4d 20 75 73 65 20 74  s a P4_MEM use t
10790 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
107a0 50 34 20 61 72 67 75 6d 65 6e 74 20 61 73 0a 2a  P4 argument as.*
107b0 2a 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  * the result..**
107c0 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41  .** If the OPFLA
107d0 47 5f 43 4c 45 41 52 43 41 43 48 45 20 62 69 74  G_CLEARCACHE bit
107e0 20 69 73 20 73 65 74 20 6f 6e 20 50 35 20 61 6e   is set on P5 an
107f0 64 20 50 31 20 69 73 20 61 20 70 73 65 75 64 6f  d P1 is a pseudo
10800 2d 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 0a 2a  -table cursor,.*
10810 2a 20 74 68 65 6e 20 74 68 65 20 63 61 63 68 65  * then the cache
10820 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   of the cursor i
10830 73 20 72 65 73 65 74 20 70 72 69 6f 72 20 74 6f  s reset prior to
10840 20 65 78 74 72 61 63 74 69 6e 67 20 74 68 65 20   extracting the 
10850 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65 20 66  column..** The f
10860 69 72 73 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61  irst OP_Column a
10870 67 61 69 6e 73 74 20 61 20 70 73 65 75 64 6f 2d  gainst a pseudo-
10880 74 61 62 6c 65 20 61 66 74 65 72 20 74 68 65 20  table after the 
10890 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6e  value of the con
108a0 74 65 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72  tent.** register
108b0 20 68 61 73 20 63 68 61 6e 67 65 64 20 73 68 6f   has changed sho
108c0 75 6c 64 20 68 61 76 65 20 74 68 69 73 20 62 69  uld have this bi
108d0 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  t set..**.** If 
108e0 74 68 65 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54  the OPFLAG_LENGT
108f0 48 41 52 47 20 61 6e 64 20 4f 50 46 4c 41 47 5f  HARG and OPFLAG_
10900 54 59 50 45 4f 46 41 52 47 20 62 69 74 73 20 61  TYPEOFARG bits a
10910 72 65 20 73 65 74 20 6f 6e 20 50 35 20 77 68 65  re set on P5 whe
10920 6e 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  n.** the result 
10930 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
10940 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 61 73   only be used as
10950 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 6f 66   the argument of
10960 20 61 20 6c 65 6e 67 74 68 28 29 0a 2a 2a 20 6f   a length().** o
10970 72 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74  r typeof() funct
10980 69 6f 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ion, respectivel
10990 79 2e 20 20 54 68 65 20 6c 6f 61 64 69 6e 67 20  y.  The loading 
109a0 6f 66 20 6c 61 72 67 65 20 62 6c 6f 62 73 20 63  of large blobs c
109b0 61 6e 20 62 65 0a 2a 2a 20 73 6b 69 70 70 65 64  an be.** skipped
109c0 20 66 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e   for length() an
109d0 64 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 6c 6f  d all content lo
109e0 61 64 69 6e 67 20 63 61 6e 20 62 65 20 73 6b 69  ading can be ski
109f0 70 70 65 64 20 66 6f 72 20 74 79 70 65 6f 66 28  pped for typeof(
10a00 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f  )..*/.case OP_Co
10a10 6c 75 6d 6e 3a 20 7b 0a 20 20 75 33 32 20 70 61  lumn: {.  u32 pa
10a20 79 6c 6f 61 64 53 69 7a 65 3b 20 20 20 2f 2a 20  yloadSize;   /* 
10a30 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
10a40 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  in the record */
10a50 0a 20 20 69 36 34 20 70 61 79 6c 6f 61 64 53 69  .  i64 payloadSi
10a60 7a 65 36 34 3b 20 2f 2a 20 4e 75 6d 62 65 72 20  ze64; /* Number 
10a70 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
10a80 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
10a90 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  p1;            /
10aa0 2a 20 50 31 20 76 61 6c 75 65 20 6f 66 20 74 68  * P1 value of th
10ab0 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  e opcode */.  in
10ac0 74 20 70 32 3b 20 20 20 20 20 20 20 20 20 20 20  t p2;           
10ad0 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* column numbe
10ae0 72 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f  r to retrieve */
10af0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
10b00 43 3b 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42  C;    /* The VDB
10b10 45 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 68  E cursor */.  ch
10b20 61 72 20 2a 7a 52 65 63 3b 20 20 20 20 20 20 20  ar *zRec;       
10b30 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
10b40 6f 6d 70 6c 65 74 65 20 72 65 63 6f 72 64 2d 64  omplete record-d
10b50 61 74 61 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ata */.  BtCurso
10b60 72 20 2a 70 43 72 73 72 3b 20 20 20 2f 2a 20 54  r *pCrsr;   /* T
10b70 68 65 20 42 54 72 65 65 20 63 75 72 73 6f 72 20  he BTree cursor 
10b80 2a 2f 0a 20 20 75 33 32 20 2a 61 54 79 70 65 3b  */.  u32 *aType;
10b90 20 20 20 20 20 20 20 20 2f 2a 20 61 54 79 70 65          /* aType
10ba0 5b 69 5d 20 68 6f 6c 64 73 20 74 68 65 20 6e 75  [i] holds the nu
10bb0 6d 65 72 69 63 20 74 79 70 65 20 6f 66 20 74 68  meric type of th
10bc0 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 2a 2f  e i-th column */
10bd0 0a 20 20 75 33 32 20 2a 61 4f 66 66 73 65 74 3b  .  u32 *aOffset;
10be0 20 20 20 20 20 20 2f 2a 20 61 4f 66 66 73 65 74        /* aOffset
10bf0 5b 69 5d 20 69 73 20 6f 66 66 73 65 74 20 74 6f  [i] is offset to
10c00 20 73 74 61 72 74 20 6f 66 20 64 61 74 61 20 66   start of data f
10c10 6f 72 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 2a  or i-th column *
10c20 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20  /.  int nField; 
10c30 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72         /* number
10c40 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74 68   of fields in th
10c50 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  e record */.  in
10c60 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  t len;          
10c70 20 2f 2a 20 54 68 65 20 6c 65 6e 67 74 68 20 6f   /* The length o
10c80 66 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64  f the serialized
10c90 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 63 6f   data for the co
10ca0 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  lumn */.  int i;
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10cc0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
10cd0 20 20 63 68 61 72 20 2a 7a 44 61 74 61 3b 20 20    char *zData;  
10ce0 20 20 20 20 20 2f 2a 20 50 61 72 74 20 6f 66 20       /* Part of 
10cf0 74 68 65 20 72 65 63 6f 72 64 20 62 65 69 6e 67  the record being
10d00 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 4d 65   decoded */.  Me
10d10 6d 20 2a 70 44 65 73 74 3b 20 20 20 20 20 20 20  m *pDest;       
10d20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
10d30 74 65 20 74 68 65 20 65 78 74 72 61 63 74 65 64  te the extracted
10d40 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20   value */.  Mem 
10d50 73 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  sMem;          /
10d60 2a 20 46 6f 72 20 73 74 6f 72 69 6e 67 20 74 68  * For storing th
10d70 65 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64  e record being d
10d80 65 63 6f 64 65 64 20 2a 2f 0a 20 20 75 38 20 2a  ecoded */.  u8 *
10d90 7a 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f  zIdx;          /
10da0 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 68 65 61  * Index into hea
10db0 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 45 6e  der */.  u8 *zEn
10dc0 64 48 64 72 3b 20 20 20 20 20 20 20 2f 2a 20 50  dHdr;       /* P
10dd0 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20  ointer to first 
10de0 62 79 74 65 20 61 66 74 65 72 20 74 68 65 20 68  byte after the h
10df0 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6f  eader */.  u32 o
10e00 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
10e10 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65   Offset into the
10e20 20 64 61 74 61 20 2a 2f 0a 20 20 75 33 32 20 73   data */.  u32 s
10e30 7a 46 69 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a  zField;       /*
10e40 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
10e50 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
10e60 6f 66 20 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20  of a field */.  
10e70 69 6e 74 20 73 7a 48 64 72 3b 20 20 20 20 20 20  int szHdr;      
10e80 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
10e90 65 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 69  e header size fi
10ea0 65 6c 64 20 61 74 20 73 74 61 72 74 20 6f 66 20  eld at start of 
10eb0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
10ec0 61 76 61 69 6c 3b 20 20 20 20 20 20 20 20 20 2f  avail;         /
10ed0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
10ee0 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 64  s of available d
10ef0 61 74 61 20 2a 2f 0a 20 20 75 33 32 20 74 3b 20  ata */.  u32 t; 
10f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
10f10 20 74 79 70 65 20 63 6f 64 65 20 66 72 6f 6d 20   type code from 
10f20 74 68 65 20 72 65 63 6f 72 64 20 68 65 61 64 65  the record heade
10f30 72 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 65 67  r */.  Mem *pReg
10f40 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 73 65  ;         /* Pse
10f50 75 64 6f 54 61 62 6c 65 20 69 6e 70 75 74 20 72  udoTable input r
10f60 65 67 69 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 70  egister */...  p
10f70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70  1 = pOp->p1;.  p
10f80 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 70  2 = pOp->p2;.  p
10f90 43 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  C = 0;.  memset(
10fa0 26 73 4d 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &sMem, 0, sizeof
10fb0 28 73 4d 65 6d 29 29 3b 0a 20 20 61 73 73 65 72  (sMem));.  asser
10fc0 74 28 20 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  t( p1<p->nCursor
10fd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
10fe0 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e  p->p3>0 && pOp->
10ff0 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  p3<=p->nMem );. 
11000 20 70 44 65 73 74 20 3d 20 26 61 4d 65 6d 5b 70   pDest = &aMem[p
11010 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41 62  Op->p3];.  memAb
11020 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70  outToChange(p, p
11030 44 65 73 74 29 3b 0a 20 20 7a 52 65 63 20 3d 20  Dest);.  zRec = 
11040 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c  0;..  /* This bl
11050 6f 63 6b 20 73 65 74 73 20 74 68 65 20 76 61 72  ock sets the var
11060 69 61 62 6c 65 20 70 61 79 6c 6f 61 64 53 69 7a  iable payloadSiz
11070 65 20 74 6f 20 62 65 20 74 68 65 20 74 6f 74 61  e to be the tota
11080 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  l number of.  **
11090 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 72 65   bytes in the re
110a0 63 6f 72 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  cord..  **.  ** 
110b0 7a 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 62  zRec is set to b
110c0 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  e the complete t
110d0 65 78 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  ext of the recor
110e0 64 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c  d if it is avail
110f0 61 62 6c 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  able..  ** The c
11100 6f 6d 70 6c 65 74 65 20 72 65 63 6f 72 64 20 74  omplete record t
11110 65 78 74 20 69 73 20 61 6c 77 61 79 73 20 61 76  ext is always av
11120 61 69 6c 61 62 6c 65 20 66 6f 72 20 70 73 65 75  ailable for pseu
11130 64 6f 2d 74 61 62 6c 65 73 0a 20 20 2a 2a 20 49  do-tables.  ** I
11140 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
11150 73 74 6f 72 65 64 20 69 6e 20 61 20 63 75 72 73  stored in a curs
11160 6f 72 2c 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  or, the complete
11170 20 72 65 63 6f 72 64 20 74 65 78 74 0a 20 20 2a   record text.  *
11180 2a 20 6d 69 67 68 74 20 62 65 20 61 76 61 69 6c  * might be avail
11190 61 62 6c 65 20 69 6e 20 74 68 65 20 20 70 43 2d  able in the  pC-
111a0 3e 61 52 6f 77 20 63 61 63 68 65 2e 20 20 4f 72  >aRow cache.  Or
111b0 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 62 65   it might not be
111c0 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 64 61  ..  ** If the da
111d0 74 61 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c  ta is unavailabl
111e0 65 2c 20 20 7a 52 65 63 20 69 73 20 73 65 74 20  e,  zRec is set 
111f0 74 6f 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20  to NULL..  **.  
11200 2a 2a 20 57 65 20 61 6c 73 6f 20 63 6f 6d 70 75  ** We also compu
11210 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
11220 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
11230 72 65 63 6f 72 64 2e 20 20 46 6f 72 20 63 75 72  record.  For cur
11240 73 6f 72 73 2c 0a 20 20 2a 2a 20 74 68 65 20 6e  sors,.  ** the n
11250 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
11260 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
11270 65 20 56 64 62 65 43 75 72 73 6f 72 2e 6e 46 69  e VdbeCursor.nFi
11280 65 6c 64 20 65 6c 65 6d 65 6e 74 2e 0a 20 20 2a  eld element..  *
11290 2f 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  /.  pC = p->apCs
112a0 72 5b 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  r[p1];.  assert(
112b0 20 70 43 21 3d 30 20 29 3b 0a 23 69 66 6e 64 65   pC!=0 );.#ifnde
112c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
112d0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 61 73 73  RTUALTABLE.  ass
112e0 65 72 74 28 20 70 43 2d 3e 70 56 74 61 62 43 75  ert( pC->pVtabCu
112f0 72 73 6f 72 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  rsor==0 );.#endi
11300 66 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e  f.  pCrsr = pC->
11310 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
11320 43 72 73 72 21 3d 30 20 29 7b 0a 20 20 20 20 2f  Crsr!=0 ){.    /
11330 2a 20 54 68 65 20 72 65 63 6f 72 64 20 69 73 20  * The record is 
11340 73 74 6f 72 65 64 20 69 6e 20 61 20 42 2d 54 72  stored in a B-Tr
11350 65 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  ee */.    rc = s
11360 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
11370 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 20 20  Moveto(pC);.    
11380 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
11390 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
113a0 3b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 6e 75  ;.    if( pC->nu
113b0 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70  llRow ){.      p
113c0 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 30 3b 0a  ayloadSize = 0;.
113d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43      }else if( pC
113e0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 3d 3d 70  ->cacheStatus==p
113f0 2d 3e 63 61 63 68 65 43 74 72 20 29 7b 0a 20 20  ->cacheCtr ){.  
11400 20 20 20 20 70 61 79 6c 6f 61 64 53 69 7a 65 20      payloadSize 
11410 3d 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a  = pC->payloadSiz
11420 65 3b 0a 20 20 20 20 20 20 7a 52 65 63 20 3d 20  e;.      zRec = 
11430 28 63 68 61 72 2a 29 70 43 2d 3e 61 52 6f 77 3b  (char*)pC->aRow;
11440 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
11450 43 2d 3e 69 73 49 6e 64 65 78 20 29 7b 0a 20 20  C->isIndex ){.  
11460 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
11470 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
11480 56 61 6c 69 64 28 70 43 72 73 72 29 20 29 3b 0a  Valid(pCrsr) );.
11490 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 72        VVA_ONLY(r
114a0 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65  c =) sqlite3Btre
114b0 65 4b 65 79 53 69 7a 65 28 70 43 72 73 72 2c 20  eKeySize(pCrsr, 
114c0 26 70 61 79 6c 6f 61 64 53 69 7a 65 36 34 29 3b  &payloadSize64);
114d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
114e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
114f0 20 20 2f 2a 20 54 72 75 65 20 62 65 63 61 75 73    /* True becaus
11500 65 20 6f 66 20 43 75 72 73 6f 72 4d 6f 76 65 74  e of CursorMovet
11510 6f 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 20 2a  o() call above *
11520 2f 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  /.      /* sqlit
11530 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
11540 50 74 72 28 29 20 75 73 65 73 20 67 65 74 56 61  Ptr() uses getVa
11550 72 69 6e 74 33 32 28 29 20 74 6f 20 65 78 74 72  rint32() to extr
11560 61 63 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  act the.      **
11570 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 2c 20 73   payload size, s
11580 6f 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62  o it is impossib
11590 6c 65 20 66 6f 72 20 70 61 79 6c 6f 61 64 53 69  le for payloadSi
115a0 7a 65 36 34 20 74 6f 20 62 65 0a 20 20 20 20 20  ze64 to be.     
115b0 20 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20   ** larger than 
115c0 33 32 20 62 69 74 73 2e 20 2a 2f 0a 20 20 20 20  32 bits. */.    
115d0 20 20 61 73 73 65 72 74 28 20 28 70 61 79 6c 6f    assert( (paylo
115e0 61 64 53 69 7a 65 36 34 20 26 20 53 51 4c 49 54  adSize64 & SQLIT
115f0 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34  E_MAX_U32)==(u64
11600 29 70 61 79 6c 6f 61 64 53 69 7a 65 36 34 20 29  )payloadSize64 )
11610 3b 0a 20 20 20 20 20 20 70 61 79 6c 6f 61 64 53  ;.      payloadS
11620 69 7a 65 20 3d 20 28 75 33 32 29 70 61 79 6c 6f  ize = (u32)paylo
11630 61 64 53 69 7a 65 36 34 3b 0a 20 20 20 20 7d 65  adSize64;.    }e
11640 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
11650 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
11660 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 72  ursorIsValid(pCr
11670 73 72 29 20 29 3b 0a 20 20 20 20 20 20 56 56 41  sr) );.      VVA
11680 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69  _ONLY(rc =) sqli
11690 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
116a0 28 70 43 72 73 72 2c 20 26 70 61 79 6c 6f 61 64  (pCrsr, &payload
116b0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73  Size);.      ass
116c0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
116d0 4f 4b 20 29 3b 20 20 20 2f 2a 20 44 61 74 61 53  OK );   /* DataS
116e0 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61 69  ize() cannot fai
116f0 6c 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  l */.    }.  }el
11700 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 43  se if( ALWAYS(pC
11710 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67  ->pseudoTableReg
11720 3e 30 29 20 29 7b 0a 20 20 20 20 70 52 65 67 20  >0) ){.    pReg 
11730 3d 20 26 61 4d 65 6d 5b 70 43 2d 3e 70 73 65 75  = &aMem[pC->pseu
11740 64 6f 54 61 62 6c 65 52 65 67 5d 3b 0a 20 20 20  doTableReg];.   
11750 20 61 73 73 65 72 74 28 20 70 52 65 67 2d 3e 66   assert( pReg->f
11760 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
11770 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
11780 65 6d 49 73 56 61 6c 69 64 28 70 52 65 67 29 20  emIsValid(pReg) 
11790 29 3b 0a 20 20 20 20 70 61 79 6c 6f 61 64 53 69  );.    payloadSi
117a0 7a 65 20 3d 20 70 52 65 67 2d 3e 6e 3b 0a 20 20  ze = pReg->n;.  
117b0 20 20 7a 52 65 63 20 3d 20 70 52 65 67 2d 3e 7a    zRec = pReg->z
117c0 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53  ;.    pC->cacheS
117d0 74 61 74 75 73 20 3d 20 28 70 4f 70 2d 3e 70 35  tatus = (pOp->p5
117e0 26 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43  &OPFLAG_CLEARCAC
117f0 48 45 29 20 3f 20 43 41 43 48 45 5f 53 54 41 4c  HE) ? CACHE_STAL
11800 45 20 3a 20 70 2d 3e 63 61 63 68 65 43 74 72 3b  E : p->cacheCtr;
11810 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 79  .    assert( pay
11820 6c 6f 61 64 53 69 7a 65 3d 3d 30 20 7c 7c 20 7a  loadSize==0 || z
11830 52 65 63 21 3d 30 20 29 3b 0a 20 20 7d 65 6c 73  Rec!=0 );.  }els
11840 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64  e{.    /* Consid
11850 65 72 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65  er the row to be
11860 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 70 61 79   NULL */.    pay
11870 6c 6f 61 64 53 69 7a 65 20 3d 20 30 3b 0a 20 20  loadSize = 0;.  
11880 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 61 79 6c 6f  }..  /* If paylo
11890 61 64 53 69 7a 65 20 69 73 20 30 2c 20 74 68 65  adSize is 0, the
118a0 6e 20 6a 75 73 74 20 73 74 6f 72 65 20 61 20 4e  n just store a N
118b0 55 4c 4c 2e 20 20 54 68 69 73 20 63 61 6e 20 68  ULL.  This can h
118c0 61 70 70 65 6e 20 62 65 63 61 75 73 65 20 6f 66  appen because of
118d0 0a 20 20 2a 2a 20 6e 75 6c 6c 52 6f 77 20 6f 72  .  ** nullRow or
118e0 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 63 6f   because of a co
118f0 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e 20  rrupt database. 
11900 2a 2f 0a 20 20 69 66 28 20 70 61 79 6c 6f 61 64  */.  if( payload
11910 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 4d  Size==0 ){.    M
11920 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 44  emSetTypeFlag(pD
11930 65 73 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  est, MEM_Null);.
11940 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75      goto op_colu
11950 6d 6e 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 61 73  mn_out;.  }.  as
11960 73 65 72 74 28 20 64 62 2d 3e 61 4c 69 6d 69 74  sert( db->aLimit
11970 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
11980 4e 47 54 48 5d 3e 3d 30 20 29 3b 0a 20 20 69 66  NGTH]>=0 );.  if
11990 28 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 3e 20  ( payloadSize > 
119a0 28 75 33 32 29 64 62 2d 3e 61 4c 69 6d 69 74 5b  (u32)db->aLimit[
119b0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
119c0 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f  GTH] ){.    goto
119d0 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a 20   too_big;.  }.. 
119e0 20 6e 46 69 65 6c 64 20 3d 20 70 43 2d 3e 6e 46   nField = pC->nF
119f0 69 65 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20  ield;.  assert( 
11a00 70 32 3c 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20  p2<nField );..  
11a10 2f 2a 20 52 65 61 64 20 61 6e 64 20 70 61 72 73  /* Read and pars
11a20 65 20 74 68 65 20 74 61 62 6c 65 20 68 65 61 64  e the table head
11a30 65 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72  er.  Store the r
11a40 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 70 61  esults of the pa
11a50 72 73 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  rse.  ** into th
11a60 65 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20  e record header 
11a70 63 61 63 68 65 20 66 69 65 6c 64 73 20 6f 66 20  cache fields of 
11a80 74 68 65 20 63 75 72 73 6f 72 2e 0a 20 20 2a 2f  the cursor..  */
11a90 0a 20 20 61 54 79 70 65 20 3d 20 70 43 2d 3e 61  .  aType = pC->a
11aa0 54 79 70 65 3b 0a 20 20 69 66 28 20 70 43 2d 3e  Type;.  if( pC->
11ab0 63 61 63 68 65 53 74 61 74 75 73 3d 3d 70 2d 3e  cacheStatus==p->
11ac0 63 61 63 68 65 43 74 72 20 29 7b 0a 20 20 20 20  cacheCtr ){.    
11ad0 61 4f 66 66 73 65 74 20 3d 20 70 43 2d 3e 61 4f  aOffset = pC->aO
11ae0 66 66 73 65 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ffset;.  }else{.
11af0 20 20 20 20 61 73 73 65 72 74 28 61 54 79 70 65      assert(aType
11b00 29 3b 0a 20 20 20 20 61 76 61 69 6c 20 3d 20 30  );.    avail = 0
11b10 3b 0a 20 20 20 20 70 43 2d 3e 61 4f 66 66 73 65  ;.    pC->aOffse
11b20 74 20 3d 20 61 4f 66 66 73 65 74 20 3d 20 26 61  t = aOffset = &a
11b30 54 79 70 65 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20  Type[nField];.  
11b40 20 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a    pC->payloadSiz
11b50 65 20 3d 20 70 61 79 6c 6f 61 64 53 69 7a 65 3b  e = payloadSize;
11b60 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74  .    pC->cacheSt
11b70 61 74 75 73 20 3d 20 70 2d 3e 63 61 63 68 65 43  atus = p->cacheC
11b80 74 72 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75  tr;..    /* Figu
11b90 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
11ba0 62 79 74 65 73 20 61 72 65 20 69 6e 20 74 68 65  bytes are in the
11bb0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 69   header */.    i
11bc0 66 28 20 7a 52 65 63 20 29 7b 0a 20 20 20 20 20  f( zRec ){.     
11bd0 20 7a 44 61 74 61 20 3d 20 7a 52 65 63 3b 0a 20   zData = zRec;. 
11be0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11bf0 69 66 28 20 70 43 2d 3e 69 73 49 6e 64 65 78 20  if( pC->isIndex 
11c00 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 61 74 61  ){.        zData
11c10 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
11c20 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 70  3BtreeKeyFetch(p
11c30 43 72 73 72 2c 20 26 61 76 61 69 6c 29 3b 0a 20  Crsr, &avail);. 
11c40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11c50 20 20 20 20 7a 44 61 74 61 20 3d 20 28 63 68 61      zData = (cha
11c60 72 2a 29 73 71 6c 69 74 65 33 42 74 72 65 65 44  r*)sqlite3BtreeD
11c70 61 74 61 46 65 74 63 68 28 70 43 72 73 72 2c 20  ataFetch(pCrsr, 
11c80 26 61 76 61 69 6c 29 3b 0a 20 20 20 20 20 20 7d  &avail);.      }
11c90 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 4b 65 79  .      /* If Key
11ca0 46 65 74 63 68 28 29 2f 44 61 74 61 46 65 74 63  Fetch()/DataFetc
11cb0 68 28 29 20 6d 61 6e 61 67 65 64 20 74 6f 20 67  h() managed to g
11cc0 65 74 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  et the entire pa
11cd0 79 6c 6f 61 64 2c 0a 20 20 20 20 20 20 2a 2a 20  yload,.      ** 
11ce0 73 61 76 65 20 74 68 65 20 70 61 79 6c 6f 61 64  save the payload
11cf0 20 69 6e 20 74 68 65 20 70 43 2d 3e 61 52 6f 77   in the pC->aRow
11d00 20 63 61 63 68 65 2e 20 20 54 68 61 74 20 77 69   cache.  That wi
11d10 6c 6c 20 73 61 76 65 20 75 73 20 66 72 6f 6d 0a  ll save us from.
11d20 20 20 20 20 20 20 2a 2a 20 68 61 76 69 6e 67 20        ** having 
11d30 74 6f 20 6d 61 6b 65 20 61 64 64 69 74 69 6f 6e  to make addition
11d40 61 6c 20 63 61 6c 6c 73 20 74 6f 20 66 65 74 63  al calls to fetc
11d50 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 70 6f  h the content po
11d60 72 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a  rtion of.      *
11d70 2a 20 74 68 65 20 72 65 63 6f 72 64 2e 0a 20 20  * the record..  
11d80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
11d90 65 72 74 28 20 61 76 61 69 6c 3e 3d 30 20 29 3b  ert( avail>=0 );
11da0 0a 20 20 20 20 20 20 69 66 28 20 70 61 79 6c 6f  .      if( paylo
11db0 61 64 53 69 7a 65 20 3c 3d 20 28 75 33 32 29 61  adSize <= (u32)a
11dc0 76 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  vail ){.        
11dd0 7a 52 65 63 20 3d 20 7a 44 61 74 61 3b 0a 20 20  zRec = zData;.  
11de0 20 20 20 20 20 20 70 43 2d 3e 61 52 6f 77 20 3d        pC->aRow =
11df0 20 28 75 38 2a 29 7a 44 61 74 61 3b 0a 20 20 20   (u8*)zData;.   
11e00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11e10 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20 30 3b 0a    pC->aRow = 0;.
11e20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11e30 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
11e40 6e 67 20 61 73 73 65 72 74 20 69 73 20 74 72 75  ng assert is tru
11e50 65 20 69 6e 20 61 6c 6c 20 63 61 73 65 73 20 65  e in all cases e
11e60 78 63 65 70 74 20 77 68 65 6e 0a 20 20 20 20 2a  xcept when.    *
11e70 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
11e80 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f 72  ile has been cor
11e90 72 75 70 74 65 64 20 65 78 74 65 72 6e 61 6c 6c  rupted externall
11ea0 79 2e 0a 20 20 20 20 2a 2a 20 20 20 20 61 73 73  y..    **    ass
11eb0 65 72 74 28 20 7a 52 65 63 21 3d 30 20 7c 7c 20  ert( zRec!=0 || 
11ec0 61 76 61 69 6c 3e 3d 70 61 79 6c 6f 61 64 53 69  avail>=payloadSi
11ed0 7a 65 20 7c 7c 20 61 76 61 69 6c 3e 3d 39 20 29  ze || avail>=9 )
11ee0 3b 20 2a 2f 0a 20 20 20 20 73 7a 48 64 72 20 3d  ; */.    szHdr =
11ef0 20 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38   getVarint32((u8
11f00 2a 29 7a 44 61 74 61 2c 20 6f 66 66 73 65 74 29  *)zData, offset)
11f10 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  ;..    /* Make s
11f20 75 72 65 20 61 20 63 6f 72 72 75 70 74 20 64 61  ure a corrupt da
11f30 74 61 62 61 73 65 20 68 61 73 20 6e 6f 74 20 67  tabase has not g
11f40 69 76 65 6e 20 75 73 20 61 6e 20 6f 76 65 72 73  iven us an overs
11f50 69 7a 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20  ize header..    
11f60 2a 2a 20 44 6f 20 74 68 69 73 20 6e 6f 77 20 74  ** Do this now t
11f70 6f 20 61 76 6f 69 64 20 61 6e 20 6f 76 65 72 73  o avoid an overs
11f80 69 7a 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ize memory alloc
11f90 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20  ation..    **.  
11fa0 20 20 2a 2a 20 54 79 70 65 20 65 6e 74 72 69 65    ** Type entrie
11fb0 73 20 63 61 6e 20 62 65 20 62 65 74 77 65 65 6e  s can be between
11fc0 20 31 20 61 6e 64 20 35 20 62 79 74 65 73 20 65   1 and 5 bytes e
11fd0 61 63 68 2e 20 20 42 75 74 20 34 20 61 6e 64 20  ach.  But 4 and 
11fe0 35 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 74 79  5 byte.    ** ty
11ff0 70 65 73 20 75 73 65 20 73 6f 20 6d 75 63 68 20  pes use so much 
12000 64 61 74 61 20 73 70 61 63 65 20 74 68 61 74 20  data space that 
12010 74 68 65 72 65 20 63 61 6e 20 6f 6e 6c 79 20 62  there can only b
12020 65 20 34 30 39 36 20 61 6e 64 20 33 32 20 6f 66  e 4096 and 32 of
12030 0a 20 20 20 20 2a 2a 20 74 68 65 6d 2c 20 72 65  .    ** them, re
12040 73 70 65 63 74 69 76 65 6c 79 2e 20 20 53 6f 20  spectively.  So 
12050 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 61 64  the maximum head
12060 65 72 20 6c 65 6e 67 74 68 20 72 65 73 75 6c 74  er length result
12070 73 20 66 72 6f 6d 20 61 0a 20 20 20 20 2a 2a 20  s from a.    ** 
12080 33 2d 62 79 74 65 20 74 79 70 65 20 66 6f 72 20  3-byte type for 
12090 65 61 63 68 20 6f 66 20 74 68 65 20 6d 61 78 69  each of the maxi
120a0 6d 75 6d 20 6f 66 20 33 32 37 36 38 20 63 6f 6c  mum of 32768 col
120b0 75 6d 6e 73 20 70 6c 75 73 20 74 68 72 65 65 0a  umns plus three.
120c0 20 20 20 20 2a 2a 20 65 78 74 72 61 20 62 79 74      ** extra byt
120d0 65 73 20 66 6f 72 20 74 68 65 20 68 65 61 64 65  es for the heade
120e0 72 20 6c 65 6e 67 74 68 20 69 74 73 65 6c 66 2e  r length itself.
120f0 20 20 33 32 37 36 38 2a 33 20 2b 20 33 20 3d 20    32768*3 + 3 = 
12100 39 38 33 30 37 2e 0a 20 20 20 20 2a 2f 0a 20 20  98307..    */.  
12110 20 20 69 66 28 20 6f 66 66 73 65 74 20 3e 20 39    if( offset > 9
12120 38 33 30 37 20 29 7b 0a 20 20 20 20 20 20 72 63  8307 ){.      rc
12130 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
12140 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
12150 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74  to op_column_out
12160 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12170 43 6f 6d 70 75 74 65 20 69 6e 20 6c 65 6e 20 74  Compute in len t
12180 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
12190 65 73 20 6f 66 20 64 61 74 61 20 77 65 20 6e 65  es of data we ne
121a0 65 64 20 74 6f 20 72 65 61 64 20 69 6e 20 6f 72  ed to read in or
121b0 64 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 67 65  der.    ** to ge
121c0 74 20 6e 46 69 65 6c 64 20 74 79 70 65 20 76 61  t nField type va
121d0 6c 75 65 73 2e 20 20 6f 66 66 73 65 74 20 69 73  lues.  offset is
121e0 20 61 6e 20 75 70 70 65 72 20 62 6f 75 6e 64 20   an upper bound 
121f0 6f 6e 20 74 68 69 73 2e 20 20 42 75 74 0a 20 20  on this.  But.  
12200 20 20 2a 2a 20 6e 46 69 65 6c 64 20 6d 69 67 68    ** nField migh
12210 74 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74  t be significant
12220 6c 79 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ly less than the
12230 20 74 72 75 65 20 6e 75 6d 62 65 72 20 6f 66 20   true number of 
12240 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a 20 69  columns.    ** i
12250 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 61 6e 64  n the table, and
12260 20 69 6e 20 74 68 61 74 20 63 61 73 65 2c 20 35   in that case, 5
12270 2a 6e 46 69 65 6c 64 2b 33 20 6d 69 67 68 74 20  *nField+3 might 
12280 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  be smaller than 
12290 6f 66 66 73 65 74 2e 0a 20 20 20 20 2a 2a 20 57  offset..    ** W
122a0 65 20 77 61 6e 74 20 74 6f 20 6d 69 6e 69 6d 69  e want to minimi
122b0 7a 65 20 6c 65 6e 20 69 6e 20 6f 72 64 65 72 20  ze len in order 
122c0 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a  to limit the siz
122d0 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 0a  e of the memory.
122e0 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f      ** allocatio
122f0 6e 2c 20 65 73 70 65 63 69 61 6c 6c 79 20 69 66  n, especially if
12300 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
12310 61 73 65 20 66 69 6c 65 20 68 61 73 20 63 61 75  ase file has cau
12320 73 65 64 20 6f 66 66 73 65 74 0a 20 20 20 20 2a  sed offset.    *
12330 2a 20 74 6f 20 62 65 20 6f 76 65 72 73 69 7a 65  * to be oversize
12340 64 2e 20 4f 66 66 73 65 74 20 69 73 20 6c 69 6d  d. Offset is lim
12350 69 74 65 64 20 74 6f 20 39 38 33 30 37 20 61 62  ited to 98307 ab
12360 6f 76 65 2e 20 20 42 75 74 20 39 38 33 30 37 20  ove.  But 98307 
12370 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 73 74 69  might.    ** sti
12380 6c 6c 20 65 78 63 65 65 64 20 52 6f 62 73 6f 6e  ll exceed Robson
12390 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
123a0 6f 6e 20 6c 69 6d 69 74 73 20 6f 6e 20 73 6f 6d  on limits on som
123b0 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  e configurations
123c0 2e 0a 20 20 20 20 2a 2a 20 4f 6e 20 73 79 73 74  ..    ** On syst
123d0 65 6d 73 20 74 68 61 74 20 63 61 6e 6e 6f 74 20  ems that cannot 
123e0 74 6f 6c 65 72 61 74 65 20 6c 61 72 67 65 20 6d  tolerate large m
123f0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
12400 73 2c 20 6e 46 69 65 6c 64 2a 35 2b 33 0a 20 20  s, nField*5+3.  
12410 20 20 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79    ** will likely
12420 20 62 65 20 6d 75 63 68 20 73 6d 61 6c 6c 65 72   be much smaller
12430 20 73 69 6e 63 65 20 6e 46 69 65 6c 64 20 77 69   since nField wi
12440 6c 6c 20 6c 69 6b 65 6c 79 20 62 65 20 6c 65 73  ll likely be les
12450 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 32 30  s than.    ** 20
12460 20 6f 72 20 73 6f 2e 20 20 54 68 69 73 20 69 6e   or so.  This in
12470 73 75 72 65 73 20 74 68 61 74 20 52 6f 62 73 6f  sures that Robso
12480 6e 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  n memory allocat
12490 69 6f 6e 20 6c 69 6d 69 74 73 20 61 72 65 0a 20  ion limits are. 
124a0 20 20 20 2a 2a 20 6e 6f 74 20 65 78 63 65 65 64     ** not exceed
124b0 65 64 20 65 76 65 6e 20 66 6f 72 20 63 6f 72 72  ed even for corr
124c0 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
124d0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c  es..    */.    l
124e0 65 6e 20 3d 20 6e 46 69 65 6c 64 2a 35 20 2b 20  en = nField*5 + 
124f0 33 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 20 3e  3;.    if( len >
12500 20 28 69 6e 74 29 6f 66 66 73 65 74 20 29 20 6c   (int)offset ) l
12510 65 6e 20 3d 20 28 69 6e 74 29 6f 66 66 73 65 74  en = (int)offset
12520 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 4b 65  ;..    /* The Ke
12530 79 46 65 74 63 68 28 29 20 6f 72 20 44 61 74 61  yFetch() or Data
12540 46 65 74 63 68 28 29 20 61 62 6f 76 65 20 61 72  Fetch() above ar
12550 65 20 66 61 73 74 20 61 6e 64 20 77 69 6c 6c 20  e fast and will 
12560 67 65 74 20 74 68 65 20 65 6e 74 69 72 65 0a 20  get the entire. 
12570 20 20 20 2a 2a 20 72 65 63 6f 72 64 20 68 65 61     ** record hea
12580 64 65 72 20 69 6e 20 6d 6f 73 74 20 63 61 73 65  der in most case
12590 73 2e 20 20 42 75 74 20 74 68 65 79 20 77 69 6c  s.  But they wil
125a0 6c 20 66 61 69 6c 20 74 6f 20 67 65 74 20 74 68  l fail to get th
125b0 65 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a  e complete.    *
125c0 2a 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20  * record header 
125d0 69 66 20 74 68 65 20 72 65 63 6f 72 64 20 68 65  if the record he
125e0 61 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 66 69  ader does not fi
125f0 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61  t on a single pa
12600 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  ge.    ** in the
12610 20 42 2d 54 72 65 65 2e 20 20 57 68 65 6e 20 74   B-Tree.  When t
12620 68 61 74 20 68 61 70 70 65 6e 73 2c 20 75 73 65  hat happens, use
12630 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
12640 72 6f 6d 42 74 72 65 65 28 29 20 74 6f 0a 20 20  romBtree() to.  
12650 20 20 2a 2a 20 61 63 71 75 69 72 65 20 74 68 65    ** acquire the
12660 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
12670 20 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20   text..    */.  
12680 20 20 69 66 28 20 21 7a 52 65 63 20 26 26 20 61    if( !zRec && a
12690 76 61 69 6c 3c 6c 65 6e 20 29 7b 0a 20 20 20 20  vail<len ){.    
126a0 20 20 73 4d 65 6d 2e 66 6c 61 67 73 20 3d 20 30    sMem.flags = 0
126b0 3b 0a 20 20 20 20 20 20 73 4d 65 6d 2e 64 62 20  ;.      sMem.db 
126c0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
126d0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
126e0 6f 6d 42 74 72 65 65 28 70 43 72 73 72 2c 20 30  omBtree(pCrsr, 0
126f0 2c 20 6c 65 6e 2c 20 70 43 2d 3e 69 73 49 6e 64  , len, pC->isInd
12700 65 78 2c 20 26 73 4d 65 6d 29 3b 0a 20 20 20 20  ex, &sMem);.    
12710 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12720 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
12730 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75  oto op_column_ou
12740 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
12750 20 7a 44 61 74 61 20 3d 20 73 4d 65 6d 2e 7a 3b   zData = sMem.z;
12760 0a 20 20 20 20 7d 0a 20 20 20 20 7a 45 6e 64 48  .    }.    zEndH
12770 64 72 20 3d 20 28 75 38 20 2a 29 26 7a 44 61 74  dr = (u8 *)&zDat
12780 61 5b 6c 65 6e 5d 3b 0a 20 20 20 20 7a 49 64 78  a[len];.    zIdx
12790 20 3d 20 28 75 38 20 2a 29 26 7a 44 61 74 61 5b   = (u8 *)&zData[
127a0 73 7a 48 64 72 5d 3b 0a 0a 20 20 20 20 2f 2a 20  szHdr];..    /* 
127b0 53 63 61 6e 20 74 68 65 20 68 65 61 64 65 72 20  Scan the header 
127c0 61 6e 64 20 75 73 65 20 69 74 20 74 6f 20 66 69  and use it to fi
127d0 6c 6c 20 69 6e 20 74 68 65 20 61 54 79 70 65 5b  ll in the aType[
127e0 5d 20 61 6e 64 20 61 4f 66 66 73 65 74 5b 5d 0a  ] and aOffset[].
127f0 20 20 20 20 2a 2a 20 61 72 72 61 79 73 2e 20 20      ** arrays.  
12800 61 54 79 70 65 5b 69 5d 20 77 69 6c 6c 20 63 6f  aType[i] will co
12810 6e 74 61 69 6e 20 74 68 65 20 74 79 70 65 20 69  ntain the type i
12820 6e 74 65 67 65 72 20 66 6f 72 20 74 68 65 20 69  nteger for the i
12830 2d 74 68 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  -th.    ** colum
12840 6e 20 61 6e 64 20 61 4f 66 66 73 65 74 5b 69 5d  n and aOffset[i]
12850 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68   will contain th
12860 65 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 74 68  e offset from th
12870 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  e beginning.    
12880 2a 2a 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  ** of the record
12890 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
128a0 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
128b0 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20  e i-th column.  
128c0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
128d0 3b 20 69 3c 6e 46 69 65 6c 64 3b 20 69 2b 2b 29  ; i<nField; i++)
128e0 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 64 78  {.      if( zIdx
128f0 3c 7a 45 6e 64 48 64 72 20 29 7b 0a 20 20 20 20  <zEndHdr ){.    
12900 20 20 20 20 61 4f 66 66 73 65 74 5b 69 5d 20 3d      aOffset[i] =
12910 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
12920 20 69 66 28 20 7a 49 64 78 5b 30 5d 3c 30 78 38   if( zIdx[0]<0x8
12930 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  0 ){.          t
12940 20 3d 20 7a 49 64 78 5b 30 5d 3b 0a 20 20 20 20   = zIdx[0];.    
12950 20 20 20 20 20 20 7a 49 64 78 2b 2b 3b 0a 20 20        zIdx++;.  
12960 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12970 20 20 20 20 20 20 20 7a 49 64 78 20 2b 3d 20 73         zIdx += s
12980 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
12990 32 28 7a 49 64 78 2c 20 26 74 29 3b 0a 20 20 20  2(zIdx, &t);.   
129a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
129b0 54 79 70 65 5b 69 5d 20 3d 20 74 3b 0a 20 20 20  Type[i] = t;.   
129c0 20 20 20 20 20 73 7a 46 69 65 6c 64 20 3d 20 73       szField = s
129d0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
129e0 54 79 70 65 4c 65 6e 28 74 29 3b 0a 20 20 20 20  TypeLen(t);.    
129f0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 7a      offset += sz
12a00 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 20 20 69  Field;.        i
12a10 66 28 20 6f 66 66 73 65 74 3c 73 7a 46 69 65 6c  f( offset<szFiel
12a20 64 20 29 7b 20 20 2f 2a 20 54 72 75 65 20 69 66  d ){  /* True if
12a30 20 6f 66 66 73 65 74 20 6f 76 65 72 66 6c 6f 77   offset overflow
12a40 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a  s */.          z
12a50 49 64 78 20 3d 20 26 7a 45 6e 64 48 64 72 5b 31  Idx = &zEndHdr[1
12a60 5d 3b 20 20 2f 2a 20 46 6f 72 63 65 73 20 53 51  ];  /* Forces SQ
12a70 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 72 65 74  LITE_CORRUPT ret
12a80 75 72 6e 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  urn below */.   
12a90 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
12ab0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
12ac0 49 66 20 69 20 69 73 20 6c 65 73 73 20 74 68 61  If i is less tha
12ad0 74 20 6e 46 69 65 6c 64 2c 20 74 68 65 6e 20 74  t nField, then t
12ae0 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20 66  here are fewer f
12af0 69 65 6c 64 73 20 69 6e 20 74 68 69 73 0a 20 20  ields in this.  
12b00 20 20 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 20        ** record 
12b10 74 68 61 6e 20 53 65 74 4e 75 6d 43 6f 6c 75 6d  than SetNumColum
12b20 6e 73 20 69 6e 64 69 63 61 74 65 64 20 74 68 65  ns indicated the
12b30 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69  re are columns i
12b40 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  n the.        **
12b50 20 74 61 62 6c 65 2e 20 53 65 74 20 74 68 65 20   table. Set the 
12b60 6f 66 66 73 65 74 20 66 6f 72 20 61 6e 79 20 65  offset for any e
12b70 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 6f 74  xtra columns not
12b80 20 70 72 65 73 65 6e 74 20 69 6e 0a 20 20 20 20   present in.    
12b90 20 20 20 20 2a 2a 20 74 68 65 20 72 65 63 6f 72      ** the recor
12ba0 64 20 74 6f 20 30 2e 20 54 68 69 73 20 74 65 6c  d to 0. This tel
12bb0 6c 73 20 63 6f 64 65 20 62 65 6c 6f 77 20 74 6f  ls code below to
12bc0 20 73 74 6f 72 65 20 74 68 65 20 64 65 66 61 75   store the defau
12bd0 6c 74 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  lt value.       
12be0 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6c 75   ** for the colu
12bf0 6d 6e 20 69 6e 73 74 65 61 64 20 6f 66 20 64 65  mn instead of de
12c00 73 65 72 69 61 6c 69 7a 69 6e 67 20 61 20 76 61  serializing a va
12c10 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 72 65 63  lue from the rec
12c20 6f 72 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ord..        */.
12c30 20 20 20 20 20 20 20 20 61 4f 66 66 73 65 74 5b          aOffset[
12c40 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
12c50 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
12c60 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
12c70 26 73 4d 65 6d 29 3b 0a 20 20 20 20 73 4d 65 6d  &sMem);.    sMem
12c80 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
12c90 6c 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  l;..    /* If we
12ca0 20 68 61 76 65 20 72 65 61 64 20 6d 6f 72 65 20   have read more 
12cb0 68 65 61 64 65 72 20 64 61 74 61 20 74 68 61 6e  header data than
12cc0 20 77 61 73 20 63 6f 6e 74 61 69 6e 65 64 20 69   was contained i
12cd0 6e 20 74 68 65 20 68 65 61 64 65 72 2c 0a 20 20  n the header,.  
12ce0 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 65    ** or if the e
12cf0 6e 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20 66  nd of the last f
12d00 69 65 6c 64 20 61 70 70 65 61 72 73 20 74 6f 20  ield appears to 
12d10 62 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  be past the end 
12d20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  of the.    ** re
12d30 63 6f 72 64 2c 20 6f 72 20 69 66 20 74 68 65 20  cord, or if the 
12d40 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20  end of the last 
12d50 66 69 65 6c 64 20 61 70 70 65 61 72 73 20 74 6f  field appears to
12d60 20 62 65 20 62 65 66 6f 72 65 20 74 68 65 20 65   be before the e
12d70 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  nd.    ** of the
12d80 20 72 65 63 6f 72 64 20 28 77 68 65 6e 20 61 6c   record (when al
12d90 6c 20 66 69 65 6c 64 73 20 70 72 65 73 65 6e 74  l fields present
12da0 29 2c 20 74 68 65 6e 20 77 65 20 6d 75 73 74 20  ), then we must 
12db0 62 65 20 64 65 61 6c 69 6e 67 20 0a 20 20 20 20  be dealing .    
12dc0 2a 2a 20 77 69 74 68 20 61 20 63 6f 72 72 75 70  ** with a corrup
12dd0 74 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  t database..    
12de0 2a 2f 0a 20 20 20 20 69 66 28 20 28 7a 49 64 78  */.    if( (zIdx
12df0 20 3e 20 7a 45 6e 64 48 64 72 29 20 7c 7c 20 28   > zEndHdr) || (
12e00 6f 66 66 73 65 74 20 3e 20 70 61 79 6c 6f 61 64  offset > payload
12e10 53 69 7a 65 29 0a 20 20 20 20 20 20 20 20 20 7c  Size).         |
12e20 7c 20 28 7a 49 64 78 3d 3d 7a 45 6e 64 48 64 72  | (zIdx==zEndHdr
12e30 20 26 26 20 6f 66 66 73 65 74 21 3d 70 61 79 6c   && offset!=payl
12e40 6f 61 64 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  oadSize) ){.    
12e50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
12e60 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
12e70 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e    goto op_column
12e80 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
12e90 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f  .  /* Get the co
12ea0 6c 75 6d 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  lumn information
12eb0 2e 20 49 66 20 61 4f 66 66 73 65 74 5b 70 32 5d  . If aOffset[p2]
12ec0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
12ed0 65 6e 20 0a 20 20 2a 2a 20 64 65 73 65 72 69 61  en .  ** deseria
12ee0 6c 69 7a 65 20 74 68 65 20 76 61 6c 75 65 20 66  lize the value f
12ef0 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 20  rom the record. 
12f00 49 66 20 61 4f 66 66 73 65 74 5b 70 32 5d 20 69  If aOffset[p2] i
12f10 73 20 7a 65 72 6f 2c 0a 20 20 2a 2a 20 74 68 65  s zero,.  ** the
12f20 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 74 20  n there are not 
12f30 65 6e 6f 75 67 68 20 66 69 65 6c 64 73 20 69 6e  enough fields in
12f40 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 73   the record to s
12f50 61 74 69 73 66 79 20 74 68 65 0a 20 20 2a 2a 20  atisfy the.  ** 
12f60 72 65 71 75 65 73 74 2e 20 20 49 6e 20 74 68 69  request.  In thi
12f70 73 20 63 61 73 65 2c 20 73 65 74 20 74 68 65 20  s case, set the 
12f80 76 61 6c 75 65 20 4e 55 4c 4c 20 6f 72 20 74 6f  value NULL or to
12f90 20 50 34 20 69 66 20 50 34 20 69 73 0a 20 20 2a   P4 if P4 is.  *
12fa0 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * a pointer to a
12fb0 20 4d 65 6d 20 6f 62 6a 65 63 74 2e 0a 20 20 2a   Mem object..  *
12fc0 2f 0a 20 20 69 66 28 20 61 4f 66 66 73 65 74 5b  /.  if( aOffset[
12fd0 70 32 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72  p2] ){.    asser
12fe0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
12ff0 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 63   );.    if( zRec
13000 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
13010 73 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  s is the common 
13020 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 77  case where the w
13030 68 6f 6c 65 20 72 6f 77 20 66 69 74 73 20 6f 6e  hole row fits on
13040 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 2a   a single page *
13050 2f 0a 20 20 20 20 20 20 56 64 62 65 4d 65 6d 52  /.      VdbeMemR
13060 65 6c 65 61 73 65 28 70 44 65 73 74 29 3b 0a 20  elease(pDest);. 
13070 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13080 53 65 72 69 61 6c 47 65 74 28 28 75 38 20 2a 29  SerialGet((u8 *)
13090 26 7a 52 65 63 5b 61 4f 66 66 73 65 74 5b 70 32  &zRec[aOffset[p2
130a0 5d 5d 2c 20 61 54 79 70 65 5b 70 32 5d 2c 20 70  ]], aType[p2], p
130b0 44 65 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Dest);.    }else
130c0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
130d0 62 72 61 6e 63 68 20 68 61 70 70 65 6e 73 20 6f  branch happens o
130e0 6e 6c 79 20 77 68 65 6e 20 74 68 65 20 72 6f 77  nly when the row
130f0 20 6f 76 65 72 66 6c 6f 77 73 20 6f 6e 74 6f 20   overflows onto 
13100 6d 75 6c 74 69 70 6c 65 20 70 61 67 65 73 20 2a  multiple pages *
13110 2f 0a 20 20 20 20 20 20 74 20 3d 20 61 54 79 70  /.      t = aTyp
13120 65 5b 70 32 5d 3b 0a 20 20 20 20 20 20 69 66 28  e[p2];.      if(
13130 20 28 70 4f 70 2d 3e 70 35 20 26 20 28 4f 50 46   (pOp->p5 & (OPF
13140 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50  LAG_LENGTHARG|OP
13150 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 29  FLAG_TYPEOFARG))
13160 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 28  !=0.       && ((
13170 74 3e 3d 31 32 20 26 26 20 28 74 26 31 29 3d 3d  t>=12 && (t&1)==
13180 30 29 20 7c 7c 20 28 70 4f 70 2d 3e 70 35 20 26  0) || (pOp->p5 &
13190 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
131a0 47 29 21 3d 30 29 0a 20 20 20 20 20 20 29 7b 0a  G)!=0).      ){.
131b0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
131c0 6e 74 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74  nt is irrelevant
131d0 20 66 6f 72 20 74 68 65 20 74 79 70 65 6f 66 28   for the typeof(
131e0 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 66  ) function and f
131f0 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  or.        ** th
13200 65 20 6c 65 6e 67 74 68 28 58 29 20 66 75 6e 63  e length(X) func
13210 74 69 6f 6e 20 69 66 20 58 20 69 73 20 61 20 62  tion if X is a b
13220 6c 6f 62 2e 20 20 53 6f 20 77 65 20 6d 69 67 68  lob.  So we migh
13230 74 20 61 73 20 77 65 6c 6c 20 75 73 65 0a 20 20  t as well use.  
13240 20 20 20 20 20 20 2a 2a 20 62 6f 67 75 73 20 63        ** bogus c
13250 6f 6e 74 65 6e 74 20 72 61 74 68 65 72 20 74 68  ontent rather th
13260 61 6e 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65  an reading conte
13270 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 4e  nt from disk.  N
13280 55 4c 4c 20 77 6f 72 6b 73 0a 20 20 20 20 20 20  ULL works.      
13290 20 20 2a 2a 20 66 6f 72 20 74 65 78 74 20 61 6e    ** for text an
132a0 64 20 62 6c 6f 62 20 61 6e 64 20 77 68 61 74 65  d blob and whate
132b0 76 65 72 20 69 73 20 69 6e 20 74 68 65 20 70 61  ver is in the pa
132c0 79 6c 6f 61 64 53 69 7a 65 36 34 20 76 61 72 69  yloadSize64 vari
132d0 61 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  able.        ** 
132e0 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72 20 65 76  will work for ev
132f0 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 2a  erything else. *
13300 2f 0a 20 20 20 20 20 20 20 20 7a 44 61 74 61 20  /.        zData 
13310 3d 20 74 3c 31 32 20 3f 20 28 63 68 61 72 2a 29  = t<12 ? (char*)
13320 26 70 61 79 6c 6f 61 64 53 69 7a 65 36 34 20 3a  &payloadSize64 :
13330 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
13340 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 73  .        len = s
13350 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
13360 54 79 70 65 4c 65 6e 28 74 29 3b 0a 20 20 20 20  TypeLen(t);.    
13370 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
13380 65 6d 4d 6f 76 65 28 26 73 4d 65 6d 2c 20 70 44  emMove(&sMem, pD
13390 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  est);.        rc
133a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
133b0 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 72 73 72  mFromBtree(pCrsr
133c0 2c 20 61 4f 66 66 73 65 74 5b 70 32 5d 2c 20 6c  , aOffset[p2], l
133d0 65 6e 2c 20 20 70 43 2d 3e 69 73 49 6e 64 65 78  en,  pC->isIndex
133e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
133f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13400 20 20 20 20 20 20 20 26 73 4d 65 6d 29 3b 0a 20         &sMem);. 
13410 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
13420 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13430 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f        goto op_co
13440 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20  lumn_out;.      
13450 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 44 61 74    }.        zDat
13460 61 20 3d 20 73 4d 65 6d 2e 7a 3b 0a 20 20 20 20  a = sMem.z;.    
13470 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
13480 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28  3VdbeSerialGet((
13490 75 38 2a 29 7a 44 61 74 61 2c 20 74 2c 20 70 44  u8*)zData, t, pD
134a0 65 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  est);.    }.    
134b0 70 44 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e 63  pDest->enc = enc
134c0 6f 64 69 6e 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a  oding;.  }else{.
134d0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74      if( pOp->p4t
134e0 79 70 65 3d 3d 50 34 5f 4d 45 4d 20 29 7b 0a 20  ype==P4_MEM ){. 
134f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13500 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70  MemShallowCopy(p
13510 44 65 73 74 2c 20 70 4f 70 2d 3e 70 34 2e 70 4d  Dest, pOp->p4.pM
13520 65 6d 2c 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b  em, MEM_Static);
13530 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13540 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
13550 28 70 44 65 73 74 2c 20 4d 45 4d 5f 4e 75 6c 6c  (pDest, MEM_Null
13560 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
13570 2f 2a 20 49 66 20 77 65 20 64 79 6e 61 6d 69 63  /* If we dynamic
13580 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73  ally allocated s
13590 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
135a0 20 64 61 74 61 20 28 69 6e 20 74 68 65 0a 20 20   data (in the.  
135b0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ** sqlite3VdbeMe
135c0 6d 46 72 6f 6d 42 74 72 65 65 28 29 20 63 61 6c  mFromBtree() cal
135d0 6c 20 61 62 6f 76 65 29 20 74 68 65 6e 20 74 72  l above) then tr
135e0 61 6e 73 66 65 72 20 63 6f 6e 74 72 6f 6c 20 6f  ansfer control o
135f0 66 20 74 68 61 74 0a 20 20 2a 2a 20 64 79 6e 61  f that.  ** dyna
13600 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
13610 64 20 73 70 61 63 65 20 6f 76 65 72 20 74 6f 20  d space over to 
13620 74 68 65 20 70 44 65 73 74 20 73 74 72 75 63 74  the pDest struct
13630 75 72 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70  ure..  ** This p
13640 72 65 76 65 6e 74 73 20 61 20 6d 65 6d 6f 72 79  revents a memory
13650 20 63 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66   copy..  */.  if
13660 28 20 73 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63 20 29  ( sMem.zMalloc )
13670 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 4d  {.    assert( sM
13680 65 6d 2e 7a 3d 3d 73 4d 65 6d 2e 7a 4d 61 6c 6c  em.z==sMem.zMall
13690 6f 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  oc );.    assert
136a0 28 20 21 28 70 44 65 73 74 2d 3e 66 6c 61 67 73  ( !(pDest->flags
136b0 20 26 20 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20   & MEM_Dyn) );. 
136c0 20 20 20 61 73 73 65 72 74 28 20 21 28 70 44 65     assert( !(pDe
136d0 73 74 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d  st->flags & (MEM
136e0 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29 29 20  _Blob|MEM_Str)) 
136f0 7c 7c 20 70 44 65 73 74 2d 3e 7a 3d 3d 73 4d 65  || pDest->z==sMe
13700 6d 2e 7a 20 29 3b 0a 20 20 20 20 70 44 65 73 74  m.z );.    pDest
13710 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d  ->flags &= ~(MEM
13720 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 61 74 69  _Ephem|MEM_Stati
13730 63 29 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 66  c);.    pDest->f
13740 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d  lags |= MEM_Term
13750 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 7a 20 3d  ;.    pDest->z =
13760 20 73 4d 65 6d 2e 7a 3b 0a 20 20 20 20 70 44 65   sMem.z;.    pDe
13770 73 74 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 73 4d  st->zMalloc = sM
13780 65 6d 2e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 7d 0a  em.zMalloc;.  }.
13790 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
137a0 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61  dbeMemMakeWritea
137b0 62 6c 65 28 70 44 65 73 74 29 3b 0a 0a 6f 70 5f  ble(pDest);..op_
137c0 63 6f 6c 75 6d 6e 5f 6f 75 74 3a 0a 20 20 55 50  column_out:.  UP
137d0 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
137e0 45 28 70 44 65 73 74 29 3b 0a 20 20 52 45 47 49  E(pDest);.  REGI
137f0 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
13800 70 33 2c 20 70 44 65 73 74 29 3b 0a 20 20 62 72  p3, pDest);.  br
13810 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
13820 65 3a 20 41 66 66 69 6e 69 74 79 20 50 31 20 50  e: Affinity P1 P
13830 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 41  2 * P4 *.**.** A
13840 70 70 6c 79 20 61 66 66 69 6e 69 74 69 65 73 20  pply affinities 
13850 74 6f 20 61 20 72 61 6e 67 65 20 6f 66 20 50 32  to a range of P2
13860 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
13870 69 6e 67 20 77 69 74 68 20 50 31 2e 0a 2a 2a 0a  ing with P1..**.
13880 2a 2a 20 50 34 20 69 73 20 61 20 73 74 72 69 6e  ** P4 is a strin
13890 67 20 74 68 61 74 20 69 73 20 50 32 20 63 68 61  g that is P2 cha
138a0 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20 54 68  racters long. Th
138b0 65 20 6e 74 68 20 63 68 61 72 61 63 74 65 72 20  e nth character 
138c0 6f 66 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67  of the.** string
138d0 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 63   indicates the c
138e0 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 74  olumn affinity t
138f0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
13900 65 64 20 66 6f 72 20 74 68 65 20 6e 74 68 0a 2a  ed for the nth.*
13910 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  * memory cell in
13920 20 74 68 65 20 72 61 6e 67 65 2e 0a 2a 2f 0a 63   the range..*/.c
13930 61 73 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 3a  ase OP_Affinity:
13940 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
13950 2a 7a 41 66 66 69 6e 69 74 79 3b 20 20 20 2f 2a  *zAffinity;   /*
13960 20 54 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   The affinity to
13970 20 62 65 20 61 70 70 6c 69 65 64 20 2a 2f 0a 20   be applied */. 
13980 20 63 68 61 72 20 63 41 66 66 3b 20 20 20 20 20   char cAff;     
13990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
139a0 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 20  ingle character 
139b0 6f 66 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 0a  of affinity */..
139c0 20 20 7a 41 66 66 69 6e 69 74 79 20 3d 20 70 4f    zAffinity = pO
139d0 70 2d 3e 70 34 2e 7a 3b 0a 20 20 61 73 73 65 72  p->p4.z;.  asser
139e0 74 28 20 7a 41 66 66 69 6e 69 74 79 21 3d 30 20  t( zAffinity!=0 
139f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66  );.  assert( zAf
13a00 66 69 6e 69 74 79 5b 70 4f 70 2d 3e 70 32 5d 3d  finity[pOp->p2]=
13a10 3d 30 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26  =0 );.  pIn1 = &
13a20 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
13a30 20 77 68 69 6c 65 28 20 28 63 41 66 66 20 3d 20   while( (cAff = 
13a40 2a 28 7a 41 66 66 69 6e 69 74 79 2b 2b 29 29 21  *(zAffinity++))!
13a50 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
13a60 28 20 70 49 6e 31 20 3c 3d 20 26 70 2d 3e 61 4d  ( pIn1 <= &p->aM
13a70 65 6d 5b 70 2d 3e 6e 4d 65 6d 5d 20 29 3b 0a 20  em[p->nMem] );. 
13a80 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
13a90 56 61 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20  Valid(pIn1) );. 
13aa0 20 20 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49     ExpandBlob(pI
13ab0 6e 31 29 3b 0a 20 20 20 20 61 70 70 6c 79 41 66  n1);.    applyAf
13ac0 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 63 41 66  finity(pIn1, cAf
13ad0 66 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  f, encoding);.  
13ae0 20 20 70 49 6e 31 2b 2b 3b 0a 20 20 7d 0a 20 20    pIn1++;.  }.  
13af0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
13b00 6f 64 65 3a 20 4d 61 6b 65 52 65 63 6f 72 64 20  ode: MakeRecord 
13b10 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a  P1 P2 P3 P4 *.**
13b20 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 50 32 20 72  .** Convert P2 r
13b30 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69  egisters beginni
13b40 6e 67 20 77 69 74 68 20 50 31 20 69 6e 74 6f 20  ng with P1 into 
13b50 74 68 65 20 5b 72 65 63 6f 72 64 20 66 6f 72 6d  the [record form
13b60 61 74 5d 0a 2a 2a 20 75 73 65 20 61 73 20 61 20  at].** use as a 
13b70 64 61 74 61 20 72 65 63 6f 72 64 20 69 6e 20 61  data record in a
13b80 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
13b90 6f 72 20 61 73 20 61 20 6b 65 79 0a 2a 2a 20 69  or as a key.** i
13ba0 6e 20 61 6e 20 69 6e 64 65 78 2e 20 20 54 68 65  n an index.  The
13bb0 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64   OP_Column opcod
13bc0 65 20 63 61 6e 20 64 65 63 6f 64 65 20 74 68 65  e can decode the
13bd0 20 72 65 63 6f 72 64 20 6c 61 74 65 72 2e 0a 2a   record later..*
13be0 2a 0a 2a 2a 20 50 34 20 6d 61 79 20 62 65 20 61  *.** P4 may be a
13bf0 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
13c00 50 32 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f  P2 characters lo
13c10 6e 67 2e 20 20 54 68 65 20 6e 74 68 20 63 68 61  ng.  The nth cha
13c20 72 61 63 74 65 72 20 6f 66 20 74 68 65 0a 2a 2a  racter of the.**
13c30 20 73 74 72 69 6e 67 20 69 6e 64 69 63 61 74 65   string indicate
13c40 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  s the column aff
13c50 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
13c60 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
13c70 65 20 6e 74 68 0a 2a 2a 20 66 69 65 6c 64 20 6f  e nth.** field o
13c80 66 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 2e  f the index key.
13c90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 70 70 69  .**.** The mappi
13ca0 6e 67 20 66 72 6f 6d 20 63 68 61 72 61 63 74 65  ng from characte
13cb0 72 20 74 6f 20 61 66 66 69 6e 69 74 79 20 69 73  r to affinity is
13cc0 20 67 69 76 65 6e 20 62 79 20 74 68 65 20 53 51   given by the SQ
13cd0 4c 49 54 45 5f 41 46 46 5f 0a 2a 2a 20 6d 61 63  LITE_AFF_.** mac
13ce0 72 6f 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ros defined in s
13cf0 71 6c 69 74 65 49 6e 74 2e 68 2e 0a 2a 2a 0a 2a  qliteInt.h..**.*
13d00 2a 20 49 66 20 50 34 20 69 73 20 4e 55 4c 4c 20  * If P4 is NULL 
13d10 74 68 65 6e 20 61 6c 6c 20 69 6e 64 65 78 20 66  then all index f
13d20 69 65 6c 64 73 20 68 61 76 65 20 74 68 65 20 61  ields have the a
13d30 66 66 69 6e 69 74 79 20 4e 4f 4e 45 2e 0a 2a 2f  ffinity NONE..*/
13d40 0a 63 61 73 65 20 4f 50 5f 4d 61 6b 65 52 65 63  .case OP_MakeRec
13d50 6f 72 64 3a 20 7b 0a 20 20 75 38 20 2a 7a 4e 65  ord: {.  u8 *zNe
13d60 77 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20  wRecord;        
13d70 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
13d80 6f 6c 64 20 74 68 65 20 64 61 74 61 20 66 6f 72  old the data for
13d90 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
13da0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 65 63 3b 20  */.  Mem *pRec; 
13db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13dc0 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
13dd0 0a 20 20 75 36 34 20 6e 44 61 74 61 3b 20 20 20  .  u64 nData;   
13de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
13df0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
13e00 64 61 74 61 20 73 70 61 63 65 20 2a 2f 0a 20 20  data space */.  
13e10 69 6e 74 20 6e 48 64 72 3b 20 20 20 20 20 20 20  int nHdr;       
13e20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
13e30 20 6f 66 20 62 79 74 65 73 20 6f 66 20 68 65 61   of bytes of hea
13e40 64 65 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 69  der space */.  i
13e50 36 34 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  64 nByte;       
13e60 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 73 70        /* Data sp
13e70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
13e80 20 74 68 69 73 20 72 65 63 6f 72 64 20 2a 2f 0a   this record */.
13e90 20 20 69 6e 74 20 6e 5a 65 72 6f 3b 20 20 20 20    int nZero;    
13ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13eb0 65 72 20 6f 66 20 7a 65 72 6f 20 62 79 74 65 73  er of zero bytes
13ec0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
13ed0 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  he record */.  i
13ee0 6e 74 20 6e 56 61 72 69 6e 74 3b 20 20 20 20 20  nt nVarint;     
13ef0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13f00 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 76 61  of bytes in a va
13f10 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 65  rint */.  u32 se
13f20 72 69 61 6c 5f 74 79 70 65 3b 20 20 20 20 20 20  rial_type;      
13f30 20 2f 2a 20 54 79 70 65 20 66 69 65 6c 64 20 2a   /* Type field *
13f40 2f 0a 20 20 4d 65 6d 20 2a 70 44 61 74 61 30 3b  /.  Mem *pData0;
13f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
13f60 72 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20  rst field to be 
13f70 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f 20 74 68  combined into th
13f80 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65  e record */.  Me
13f90 6d 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 20  m *pLast;       
13fa0 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 69 65       /* Last fie
13fb0 6c 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  ld of the record
13fc0 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   */.  int nField
13fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
13fe0 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  Number of fields
13ff0 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a   in the record *
14000 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 69 6e  /.  char *zAffin
14010 69 74 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ity;       /* Th
14020 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
14030 67 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64  g for the record
14040 20 2a 2f 0a 20 20 69 6e 74 20 66 69 6c 65 5f 66   */.  int file_f
14050 6f 72 6d 61 74 3b 20 20 20 20 20 20 20 2f 2a 20  ormat;       /* 
14060 46 69 6c 65 20 66 6f 72 6d 61 74 20 74 6f 20 75  File format to u
14070 73 65 20 66 6f 72 20 65 6e 63 6f 64 69 6e 67 20  se for encoding 
14080 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
14090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
140a0 70 61 63 65 20 75 73 65 64 20 69 6e 20 7a 4e 65  pace used in zNe
140b0 77 52 65 63 6f 72 64 5b 5d 20 2a 2f 0a 20 20 69  wRecord[] */.  i
140c0 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  nt len;         
140d0 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
140e0 6f 66 20 61 20 66 69 65 6c 64 20 2a 2f 0a 0a 20  of a field */.. 
140f0 20 2f 2a 20 41 73 73 75 6d 69 6e 67 20 74 68 65   /* Assuming the
14100 20 72 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 73   record contains
14110 20 4e 20 66 69 65 6c 64 73 2c 20 74 68 65 20 72   N fields, the r
14120 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 6c 6f 6f  ecord format loo
14130 6b 73 0a 20 20 2a 2a 20 6c 69 6b 65 20 74 68 69  ks.  ** like thi
14140 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 2d 2d 2d  s:.  **.  ** ---
14150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14190 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 7c 20 68 64 72  -----.  ** | hdr
141a0 2d 73 69 7a 65 20 7c 20 74 79 70 65 20 30 20 7c  -size | type 0 |
141b0 20 74 79 70 65 20 31 20 7c 20 2e 2e 2e 20 7c 20   type 1 | ... | 
141c0 74 79 70 65 20 4e 2d 31 20 7c 20 64 61 74 61 30  type N-1 | data0
141d0 20 7c 20 2e 2e 2e 20 7c 20 64 61 74 61 20 4e 2d   | ... | data N-
141e0 31 20 7c 20 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d  1 | .  ** ------
141f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14230 2d 2d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 61 74  --.  **.  ** Dat
14240 61 28 30 29 20 69 73 20 74 61 6b 65 6e 20 66 72  a(0) is taken fr
14250 6f 6d 20 72 65 67 69 73 74 65 72 20 50 31 2e 20  om register P1. 
14260 20 44 61 74 61 28 31 29 20 63 6f 6d 65 73 20 66   Data(1) comes f
14270 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50 31 2b  rom register P1+
14280 31 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20 66 72  1.  ** and so fr
14290 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  oth..  **.  ** E
142a0 61 63 68 20 74 79 70 65 20 66 69 65 6c 64 20 69  ach type field i
142b0 73 20 61 20 76 61 72 69 6e 74 20 72 65 70 72 65  s a varint repre
142c0 73 65 6e 74 69 6e 67 20 74 68 65 20 73 65 72 69  senting the seri
142d0 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 0a  al type of the .
142e0 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69    ** correspondi
142f0 6e 67 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  ng data element 
14300 28 73 65 65 20 73 71 6c 69 74 65 33 56 64 62 65  (see sqlite3Vdbe
14310 53 65 72 69 61 6c 54 79 70 65 28 29 29 2e 20 54  SerialType()). T
14320 68 65 0a 20 20 2a 2a 20 68 64 72 2d 73 69 7a 65  he.  ** hdr-size
14330 20 66 69 65 6c 64 20 69 73 20 61 6c 73 6f 20 61   field is also a
14340 20 76 61 72 69 6e 74 20 77 68 69 63 68 20 69 73   varint which is
14350 20 74 68 65 20 6f 66 66 73 65 74 20 66 72 6f 6d   the offset from
14360 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
14370 20 2a 2a 20 6f 66 20 74 68 65 20 72 65 63 6f 72   ** of the recor
14380 64 20 74 6f 20 64 61 74 61 30 2e 0a 20 20 2a 2f  d to data0..  */
14390 0a 20 20 6e 44 61 74 61 20 3d 20 30 3b 20 20 20  .  nData = 0;   
143a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
143b0 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
143c0 20 73 70 61 63 65 20 2a 2f 0a 20 20 6e 48 64 72   space */.  nHdr
143d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
143e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
143f0 73 20 6f 66 20 68 65 61 64 65 72 20 73 70 61 63  s of header spac
14400 65 20 2a 2f 0a 20 20 6e 5a 65 72 6f 20 3d 20 30  e */.  nZero = 0
14410 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
14420 62 65 72 20 6f 66 20 7a 65 72 6f 20 62 79 74 65  ber of zero byte
14430 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
14440 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
14450 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 31  nField = pOp->p1
14460 3b 0a 20 20 7a 41 66 66 69 6e 69 74 79 20 3d 20  ;.  zAffinity = 
14470 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 61 73 73  pOp->p4.z;.  ass
14480 65 72 74 28 20 6e 46 69 65 6c 64 3e 30 20 26 26  ert( nField>0 &&
14490 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f   pOp->p2>0 && pO
144a0 70 2d 3e 70 32 2b 6e 46 69 65 6c 64 3c 3d 70 2d  p->p2+nField<=p-
144b0 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 20 20 70 44 61  >nMem+1 );.  pDa
144c0 74 61 30 20 3d 20 26 61 4d 65 6d 5b 6e 46 69 65  ta0 = &aMem[nFie
144d0 6c 64 5d 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20  ld];.  nField = 
144e0 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 4c 61 73 74  pOp->p2;.  pLast
144f0 20 3d 20 26 70 44 61 74 61 30 5b 6e 46 69 65 6c   = &pData0[nFiel
14500 64 2d 31 5d 3b 0a 20 20 66 69 6c 65 5f 66 6f 72  d-1];.  file_for
14510 6d 61 74 20 3d 20 70 2d 3e 6d 69 6e 57 72 69 74  mat = p->minWrit
14520 65 46 69 6c 65 46 6f 72 6d 61 74 3b 0a 0a 20 20  eFileFormat;..  
14530 2f 2a 20 49 64 65 6e 74 69 66 79 20 74 68 65 20  /* Identify the 
14540 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  output register 
14550 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
14560 2d 3e 70 33 3c 70 4f 70 2d 3e 70 31 20 7c 7c 20  ->p3<pOp->p1 || 
14570 70 4f 70 2d 3e 70 33 3e 3d 70 4f 70 2d 3e 70 31  pOp->p3>=pOp->p1
14580 2b 70 4f 70 2d 3e 70 32 20 29 3b 0a 20 20 70 4f  +pOp->p2 );.  pO
14590 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
145a0 70 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54  p3];.  memAboutT
145b0 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29  oChange(p, pOut)
145c0 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72  ;..  /* Loop thr
145d0 6f 75 67 68 20 74 68 65 20 65 6c 65 6d 65 6e 74  ough the element
145e0 73 20 74 68 61 74 20 77 69 6c 6c 20 6d 61 6b 65  s that will make
145f0 20 75 70 20 74 68 65 20 72 65 63 6f 72 64 20 74   up the record t
14600 6f 20 66 69 67 75 72 65 0a 20 20 2a 2a 20 6f 75  o figure.  ** ou
14610 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  t how much space
14620 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
14630 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e   the new record.
14640 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 52 65 63  .  */.  for(pRec
14650 3d 70 44 61 74 61 30 3b 20 70 52 65 63 3c 3d 70  =pData0; pRec<=p
14660 4c 61 73 74 3b 20 70 52 65 63 2b 2b 29 7b 0a 20  Last; pRec++){. 
14670 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
14680 56 61 6c 69 64 28 70 52 65 63 29 20 29 3b 0a 20  Valid(pRec) );. 
14690 20 20 20 69 66 28 20 7a 41 66 66 69 6e 69 74 79     if( zAffinity
146a0 20 29 7b 0a 20 20 20 20 20 20 61 70 70 6c 79 41   ){.      applyA
146b0 66 66 69 6e 69 74 79 28 70 52 65 63 2c 20 7a 41  ffinity(pRec, zA
146c0 66 66 69 6e 69 74 79 5b 70 52 65 63 2d 70 44 61  ffinity[pRec-pDa
146d0 74 61 30 5d 2c 20 65 6e 63 6f 64 69 6e 67 29 3b  ta0], encoding);
146e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
146f0 52 65 63 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 5a  Rec->flags&MEM_Z
14700 65 72 6f 20 26 26 20 70 52 65 63 2d 3e 6e 3e 30  ero && pRec->n>0
14710 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14720 33 56 64 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c  3VdbeMemExpandBl
14730 6f 62 28 70 52 65 63 29 3b 0a 20 20 20 20 7d 0a  ob(pRec);.    }.
14740 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
14750 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
14760 69 61 6c 54 79 70 65 28 70 52 65 63 2c 20 66 69  ialType(pRec, fi
14770 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20  le_format);.    
14780 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62  len = sqlite3Vdb
14790 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
147a0 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
147b0 20 6e 44 61 74 61 20 2b 3d 20 6c 65 6e 3b 0a 20   nData += len;. 
147c0 20 20 20 6e 48 64 72 20 2b 3d 20 73 71 6c 69 74     nHdr += sqlit
147d0 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69  e3VarintLen(seri
147e0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 66  al_type);.    if
147f0 28 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20  ( pRec->flags & 
14800 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
14810 20 20 2f 2a 20 4f 6e 6c 79 20 70 75 72 65 20 7a    /* Only pure z
14820 65 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f 42 73  ero-filled BLOBs
14830 20 63 61 6e 20 62 65 20 69 6e 70 75 74 20 74 6f   can be input to
14840 20 74 68 69 73 20 4f 70 63 6f 64 65 2e 0a 20 20   this Opcode..  
14850 20 20 20 20 2a 2a 20 57 65 20 64 6f 20 6e 6f 74      ** We do not
14860 20 61 6c 6c 6f 77 20 62 6c 6f 62 73 20 77 69 74   allow blobs wit
14870 68 20 61 20 70 72 65 66 69 78 20 61 6e 64 20 61  h a prefix and a
14880 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
14890 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 5a 65 72  l. */.      nZer
148a0 6f 20 2b 3d 20 70 52 65 63 2d 3e 75 2e 6e 5a 65  o += pRec->u.nZe
148b0 72 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ro;.    }else if
148c0 28 20 6c 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e  ( len ){.      n
148d0 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Zero = 0;.    }.
148e0 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
148f0 65 20 69 6e 69 74 69 61 6c 20 68 65 61 64 65 72  e initial header
14900 20 76 61 72 69 6e 74 20 61 6e 64 20 74 6f 74 61   varint and tota
14910 6c 20 74 68 65 20 73 69 7a 65 20 2a 2f 0a 20 20  l the size */.  
14920 6e 48 64 72 20 2b 3d 20 6e 56 61 72 69 6e 74 20  nHdr += nVarint 
14930 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c  = sqlite3VarintL
14940 65 6e 28 6e 48 64 72 29 3b 0a 20 20 69 66 28 20  en(nHdr);.  if( 
14950 6e 56 61 72 69 6e 74 3c 73 71 6c 69 74 65 33 56  nVarint<sqlite3V
14960 61 72 69 6e 74 4c 65 6e 28 6e 48 64 72 29 20 29  arintLen(nHdr) )
14970 7b 0a 20 20 20 20 6e 48 64 72 2b 2b 3b 0a 20 20  {.    nHdr++;.  
14980 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6e 48 64 72  }.  nByte = nHdr
14990 2b 6e 44 61 74 61 2d 6e 5a 65 72 6f 3b 0a 20 20  +nData-nZero;.  
149a0 69 66 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61 4c  if( nByte>db->aL
149b0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
149c0 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20  T_LENGTH] ){.   
149d0 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20   goto too_big;. 
149e0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
149f0 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 72 65  re the output re
14a00 67 69 73 74 65 72 20 68 61 73 20 61 20 62 75 66  gister has a buf
14a10 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  fer large enough
14a20 20 74 6f 20 73 74 6f 72 65 20 0a 20 20 2a 2a 20   to store .  ** 
14a30 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e 20  the new record. 
14a40 54 68 65 20 6f 75 74 70 75 74 20 72 65 67 69 73  The output regis
14a50 74 65 72 20 28 70 4f 70 2d 3e 70 33 29 20 69 73  ter (pOp->p3) is
14a60 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a   not allowed to.
14a70 20 20 2a 2a 20 62 65 20 6f 6e 65 20 6f 66 20 74    ** be one of t
14a80 68 65 20 69 6e 70 75 74 20 72 65 67 69 73 74 65  he input registe
14a90 72 73 20 28 62 65 63 61 75 73 65 20 74 68 65 20  rs (because the 
14aa0 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74  following call t
14ab0 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64  o.  ** sqlite3Vd
14ac0 62 65 4d 65 6d 47 72 6f 77 28 29 20 63 6f 75 6c  beMemGrow() coul
14ad0 64 20 63 6c 6f 62 62 65 72 20 74 68 65 20 76 61  d clobber the va
14ae0 6c 75 65 20 62 65 66 6f 72 65 20 69 74 20 69 73  lue before it is
14af0 20 75 73 65 64 29 2e 0a 20 20 2a 2f 0a 20 20 69   used)..  */.  i
14b00 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
14b10 6d 47 72 6f 77 28 70 4f 75 74 2c 20 28 69 6e 74  mGrow(pOut, (int
14b20 29 6e 42 79 74 65 2c 20 30 29 20 29 7b 0a 20 20  )nByte, 0) ){.  
14b30 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
14b40 20 7d 0a 20 20 7a 4e 65 77 52 65 63 6f 72 64 20   }.  zNewRecord 
14b50 3d 20 28 75 38 20 2a 29 70 4f 75 74 2d 3e 7a 3b  = (u8 *)pOut->z;
14b60 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
14b70 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 20 3d   record */.  i =
14b80 20 70 75 74 56 61 72 69 6e 74 33 32 28 7a 4e 65   putVarint32(zNe
14b90 77 52 65 63 6f 72 64 2c 20 6e 48 64 72 29 3b 0a  wRecord, nHdr);.
14ba0 20 20 66 6f 72 28 70 52 65 63 3d 70 44 61 74 61    for(pRec=pData
14bb0 30 3b 20 70 52 65 63 3c 3d 70 4c 61 73 74 3b 20  0; pRec<=pLast; 
14bc0 70 52 65 63 2b 2b 29 7b 0a 20 20 20 20 73 65 72  pRec++){.    ser
14bd0 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74  ial_type = sqlit
14be0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
14bf0 28 70 52 65 63 2c 20 66 69 6c 65 5f 66 6f 72 6d  (pRec, file_form
14c00 61 74 29 3b 0a 20 20 20 20 69 20 2b 3d 20 70 75  at);.    i += pu
14c10 74 56 61 72 69 6e 74 33 32 28 26 7a 4e 65 77 52  tVarint32(&zNewR
14c20 65 63 6f 72 64 5b 69 5d 2c 20 73 65 72 69 61 6c  ecord[i], serial
14c30 5f 74 79 70 65 29 3b 20 20 20 20 20 20 2f 2a 20  _type);      /* 
14c40 73 65 72 69 61 6c 20 74 79 70 65 20 2a 2f 0a 20  serial type */. 
14c50 20 7d 0a 20 20 66 6f 72 28 70 52 65 63 3d 70 44   }.  for(pRec=pD
14c60 61 74 61 30 3b 20 70 52 65 63 3c 3d 70 4c 61 73  ata0; pRec<=pLas
14c70 74 3b 20 70 52 65 63 2b 2b 29 7b 20 20 2f 2a 20  t; pRec++){  /* 
14c80 73 65 72 69 61 6c 20 64 61 74 61 20 2a 2f 0a 20  serial data */. 
14c90 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 56     i += sqlite3V
14ca0 64 62 65 53 65 72 69 61 6c 50 75 74 28 26 7a 4e  dbeSerialPut(&zN
14cb0 65 77 52 65 63 6f 72 64 5b 69 5d 2c 20 28 69 6e  ewRecord[i], (in
14cc0 74 29 28 6e 42 79 74 65 2d 69 29 2c 20 70 52 65  t)(nByte-i), pRe
14cd0 63 2c 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a  c,file_format);.
14ce0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 3d    }.  assert( i=
14cf0 3d 6e 42 79 74 65 20 29 3b 0a 0a 20 20 61 73 73  =nByte );..  ass
14d00 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26  ert( pOp->p3>0 &
14d10 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d  & pOp->p3<=p->nM
14d20 65 6d 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20  em );.  pOut->n 
14d30 3d 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a 20 20  = (int)nByte;.  
14d40 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
14d50 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 44 79 6e  M_Blob | MEM_Dyn
14d60 3b 0a 20 20 70 4f 75 74 2d 3e 78 44 65 6c 20 3d  ;.  pOut->xDel =
14d70 20 30 3b 0a 20 20 69 66 28 20 6e 5a 65 72 6f 20   0;.  if( nZero 
14d80 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 6e  ){.    pOut->u.n
14d90 5a 65 72 6f 20 3d 20 6e 5a 65 72 6f 3b 0a 20 20  Zero = nZero;.  
14da0 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d    pOut->flags |=
14db0 20 4d 45 4d 5f 5a 65 72 6f 3b 0a 20 20 7d 0a 20   MEM_Zero;.  }. 
14dc0 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 53 51 4c   pOut->enc = SQL
14dd0 49 54 45 5f 55 54 46 38 3b 20 20 2f 2a 20 49 6e  ITE_UTF8;  /* In
14de0 20 63 61 73 65 20 74 68 65 20 62 6c 6f 62 20 69   case the blob i
14df0 73 20 65 76 65 72 20 63 6f 6e 76 65 72 74 65 64  s ever converted
14e00 20 74 6f 20 74 65 78 74 20 2a 2f 0a 20 20 52 45   to text */.  RE
14e10 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
14e20 2d 3e 70 33 2c 20 70 4f 75 74 29 3b 0a 20 20 55  ->p3, pOut);.  U
14e30 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49  PDATE_MAX_BLOBSI
14e40 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61  ZE(pOut);.  brea
14e50 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
14e60 20 43 6f 75 6e 74 20 50 31 20 50 32 20 2a 20 2a   Count P1 P2 * *
14e70 20 2a 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 74   *.**.** Store t
14e80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
14e90 72 69 65 73 20 28 61 6e 20 69 6e 74 65 67 65 72  ries (an integer
14ea0 20 76 61 6c 75 65 29 20 69 6e 20 74 68 65 20 74   value) in the t
14eb0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 0a 2a  able or index .*
14ec0 2a 20 6f 70 65 6e 65 64 20 62 79 20 63 75 72 73  * opened by curs
14ed0 6f 72 20 50 31 20 69 6e 20 72 65 67 69 73 74 65  or P1 in registe
14ee0 72 20 50 32 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  r P2.*/.#ifndef 
14ef0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
14f00 45 43 4f 55 4e 54 0a 63 61 73 65 20 4f 50 5f 43  ECOUNT.case OP_C
14f10 6f 75 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20  ount: {         
14f20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61  /* out2-prerelea
14f30 73 65 20 2a 2f 0a 20 20 69 36 34 20 6e 45 6e 74  se */.  i64 nEnt
14f40 72 79 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ry;.  BtCursor *
14f50 70 43 72 73 72 3b 0a 0a 20 20 70 43 72 73 72 20  pCrsr;..  pCrsr 
14f60 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
14f70 70 31 5d 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  p1]->pCursor;.  
14f80 69 66 28 20 41 4c 57 41 59 53 28 70 43 72 73 72  if( ALWAYS(pCrsr
14f90 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
14fa0 6c 69 74 65 33 42 74 72 65 65 43 6f 75 6e 74 28  lite3BtreeCount(
14fb0 70 43 72 73 72 2c 20 26 6e 45 6e 74 72 79 29 3b  pCrsr, &nEntry);
14fc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 45  .  }else{.    nE
14fd0 6e 74 72 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ntry = 0;.  }.  
14fe0 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 6e 45 6e 74  pOut->u.i = nEnt
14ff0 72 79 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  ry;.  break;.}.#
15000 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65  endif../* Opcode
15010 3a 20 53 61 76 65 70 6f 69 6e 74 20 50 31 20 2a  : Savepoint P1 *
15020 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70   * P4 *.**.** Op
15030 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72  en, release or r
15040 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 61 76 65  ollback the save
15050 70 6f 69 6e 74 20 6e 61 6d 65 64 20 62 79 20 70  point named by p
15060 61 72 61 6d 65 74 65 72 20 50 34 2c 20 64 65 70  arameter P4, dep
15070 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ending.** on the
15080 20 76 61 6c 75 65 20 6f 66 20 50 31 2e 20 54 6f   value of P1. To
15090 20 6f 70 65 6e 20 61 20 6e 65 77 20 73 61 76 65   open a new save
150a0 70 6f 69 6e 74 2c 20 50 31 3d 3d 30 2e 20 54 6f  point, P1==0. To
150b0 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74   release (commit
150c0 29 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67  ) an.** existing
150d0 20 73 61 76 65 70 6f 69 6e 74 2c 20 50 31 3d 3d   savepoint, P1==
150e0 31 2c 20 6f 72 20 74 6f 20 72 6f 6c 6c 62 61 63  1, or to rollbac
150f0 6b 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 61  k an existing sa
15100 76 65 70 6f 69 6e 74 20 50 31 3d 3d 32 2e 0a 2a  vepoint P1==2..*
15110 2f 0a 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f  /.case OP_Savepo
15120 69 6e 74 3a 20 7b 0a 20 20 69 6e 74 20 70 31 3b  int: {.  int p1;
15130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15140 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
15150 65 20 6f 66 20 50 31 20 6f 70 65 72 61 6e 64 20  e of P1 operand 
15160 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
15170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15180 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
15190 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 69  savepoint */.  i
151a0 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 53 61 76 65  nt nName;.  Save
151b0 70 6f 69 6e 74 20 2a 70 4e 65 77 3b 0a 20 20 53  point *pNew;.  S
151c0 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70  avepoint *pSavep
151d0 6f 69 6e 74 3b 0a 20 20 53 61 76 65 70 6f 69 6e  oint;.  Savepoin
151e0 74 20 2a 70 54 6d 70 3b 0a 20 20 69 6e 74 20 69  t *pTmp;.  int i
151f0 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 69 6e 74  Savepoint;.  int
15200 20 69 69 3b 0a 0a 20 20 70 31 20 3d 20 70 4f 70   ii;..  p1 = pOp
15210 2d 3e 70 31 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  ->p1;.  zName = 
15220 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 0a 20 20 2f 2a  pOp->p4.z;..  /*
15230 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
15240 20 70 31 20 70 61 72 61 6d 65 74 65 72 20 69 73   p1 parameter is
15250 20 76 61 6c 69 64 2e 20 41 6c 73 6f 20 74 68 61   valid. Also tha
15260 74 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  t if there is no
15270 20 6f 70 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73   open.  ** trans
15280 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65  action, then the
15290 72 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 79  re cannot be any
152a0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 0a 20 20   savepoints. .  
152b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  */.  assert( db-
152c0 3e 70 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c  >pSavepoint==0 |
152d0 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  | db->autoCommit
152e0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
152f0 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42   p1==SAVEPOINT_B
15300 45 47 49 4e 7c 7c 70 31 3d 3d 53 41 56 45 50 4f  EGIN||p1==SAVEPO
15310 49 4e 54 5f 52 45 4c 45 41 53 45 7c 7c 70 31 3d  INT_RELEASE||p1=
15320 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
15330 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ACK );.  assert(
15340 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
15350 7c 7c 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63  || db->isTransac
15360 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30  tionSavepoint==0
15370 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 68   );.  assert( ch
15380 65 63 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e  eckSavepointCoun
15390 74 28 64 62 29 20 29 3b 0a 0a 20 20 69 66 28 20  t(db) );..  if( 
153a0 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45  p1==SAVEPOINT_BE
153b0 47 49 4e 20 29 7b 0a 20 20 20 20 69 66 28 20 64  GIN ){.    if( d
153c0 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 3e  b->writeVdbeCnt>
153d0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
153e0 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20 63 61  new savepoint ca
153f0 6e 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 20  nnot be created 
15400 69 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74  if there are act
15410 69 76 65 20 77 72 69 74 65 20 0a 20 20 20 20 20  ive write .     
15420 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 28   ** statements (
15430 69 2e 65 2e 20 6f 70 65 6e 20 72 65 61 64 2f 77  i.e. open read/w
15440 72 69 74 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c  rite incremental
15450 20 62 6c 6f 62 20 68 61 6e 64 6c 65 73 29 2e 0a   blob handles)..
15460 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
15470 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
15480 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
15490 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 61   "cannot open sa
154a0 76 65 70 6f 69 6e 74 20 2d 20 22 0a 20 20 20 20  vepoint - ".    
154b0 20 20 20 20 22 53 51 4c 20 73 74 61 74 65 6d 65      "SQL stateme
154c0 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73 22  nts in progress"
154d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
154e0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
154f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 4e 61 6d  else{.      nNam
15500 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
15510 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 0a 23 69 66  n30(zName);..#if
15520 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15530 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
15540 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
15550 20 69 73 20 4f 6b 20 65 76 65 6e 20 69 66 20 74   is Ok even if t
15560 68 69 73 20 73 61 76 65 70 6f 69 6e 74 20 69 73  his savepoint is
15570 20 61 63 74 75 61 6c 6c 79 20 61 20 74 72 61 6e   actually a tran
15580 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  saction.      **
15590 20 73 61 76 65 70 6f 69 6e 74 20 28 61 6e 64 20   savepoint (and 
155a0 74 68 65 72 65 66 6f 72 65 20 73 68 6f 75 6c 64  therefore should
155b0 20 6e 6f 74 20 70 72 6f 6d 70 74 20 78 53 61 76   not prompt xSav
155c0 65 70 6f 69 6e 74 28 29 29 20 63 61 6c 6c 62 61  epoint()) callba
155d0 63 6b 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66  cks..      ** If
155e0 20 74 68 69 73 20 69 73 20 61 20 74 72 61 6e 73   this is a trans
155f0 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
15600 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 2c 20 69   being opened, i
15610 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  t is guaranteed.
15620 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68        ** that th
15630 65 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20  e db->aVTrans[] 
15640 61 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20  array is empty. 
15650 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
15660 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  ( db->autoCommit
15670 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 56 54 72 61  ==0 || db->nVTra
15680 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ns==0 );.      r
15690 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
156a0 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56  avepoint(db, SAV
156b0 45 50 4f 49 4e 54 5f 42 45 47 49 4e 2c 0a 20 20  EPOINT_BEGIN,.  
156c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62                db
156e0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d  ->nStatement+db-
156f0 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >nSavepoint);.  
15700 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15710 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f  TE_OK ) goto abo
15720 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
15730 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
15740 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 73  * Create a new s
15750 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75  avepoint structu
15760 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  re. */.      pNe
15770 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
15780 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
15790 66 28 53 61 76 65 70 6f 69 6e 74 29 2b 6e 4e 61  f(Savepoint)+nNa
157a0 6d 65 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  me+1);.      if(
157b0 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
157c0 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28   pNew->zName = (
157d0 63 68 61 72 20 2a 29 26 70 4e 65 77 5b 31 5d 3b  char *)&pNew[1];
157e0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
157f0 70 4e 65 77 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  pNew->zName, zNa
15800 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20  me, nName+1);.  
15810 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66    .        /* If
15820 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65   there is no ope
15830 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  n transaction, t
15840 68 65 6e 20 6d 61 72 6b 20 74 68 69 73 20 61 73  hen mark this as
15850 20 61 20 73 70 65 63 69 61 6c 0a 20 20 20 20 20   a special.     
15860 20 20 20 2a 2a 20 22 74 72 61 6e 73 61 63 74 69     ** "transacti
15870 6f 6e 20 73 61 76 65 70 6f 69 6e 74 22 2e 20 2a  on savepoint". *
15880 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  /.        if( db
15890 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a  ->autoCommit ){.
158a0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75            db->au
158b0 74 6f 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20  toCommit = 0;.  
158c0 20 20 20 20 20 20 20 20 64 62 2d 3e 69 73 54 72          db->isTr
158d0 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69  ansactionSavepoi
158e0 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nt = 1;.        
158f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
15900 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2b   db->nSavepoint+
15910 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  +;.        }..  
15920 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68        /* Link th
15930 65 20 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20  e new savepoint 
15940 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
15950 65 20 68 61 6e 64 6c 65 27 73 20 6c 69 73 74 2e  e handle's list.
15960 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
15970 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 53  ->pNext = db->pS
15980 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20  avepoint;.      
15990 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74    db->pSavepoint
159a0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
159b0 20 70 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65 64   pNew->nDeferred
159c0 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65  Cons = db->nDefe
159d0 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20  rredCons;.      
159e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
159f0 0a 20 20 20 20 69 53 61 76 65 70 6f 69 6e 74 20  .    iSavepoint 
15a00 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  = 0;..    /* Fin
15a10 64 20 74 68 65 20 6e 61 6d 65 64 20 73 61 76 65  d the named save
15a20 70 6f 69 6e 74 2e 20 49 66 20 74 68 65 72 65 20  point. If there 
15a30 69 73 20 6e 6f 20 73 75 63 68 20 73 61 76 65 70  is no such savep
15a40 6f 69 6e 74 2c 20 74 68 65 6e 20 61 6e 0a 20 20  oint, then an.  
15a50 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 69 73    ** an error is
15a60 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
15a70 20 75 73 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66   user.  */.    f
15a80 6f 72 28 0a 20 20 20 20 20 20 70 53 61 76 65 70  or(.      pSavep
15a90 6f 69 6e 74 20 3d 20 64 62 2d 3e 70 53 61 76 65  oint = db->pSave
15aa0 70 6f 69 6e 74 3b 20 0a 20 20 20 20 20 20 70 53  point; .      pS
15ab0 61 76 65 70 6f 69 6e 74 20 26 26 20 73 71 6c 69  avepoint && sqli
15ac0 74 65 33 53 74 72 49 43 6d 70 28 70 53 61 76 65  te3StrICmp(pSave
15ad0 70 6f 69 6e 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  point->zName, zN
15ae0 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 53 61 76  ame);.      pSav
15af0 65 70 6f 69 6e 74 20 3d 20 70 53 61 76 65 70 6f  epoint = pSavepo
15b00 69 6e 74 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29  int->pNext.    )
15b10 7b 0a 20 20 20 20 20 20 69 53 61 76 65 70 6f 69  {.      iSavepoi
15b20 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
15b30 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20  if( !pSavepoint 
15b40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15b50 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
15b60 72 72 4d 73 67 2c 20 64 62 2c 20 22 6e 6f 20 73  rrMsg, db, "no s
15b70 75 63 68 20 73 61 76 65 70 6f 69 6e 74 3a 20 25  uch savepoint: %
15b80 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
15b90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
15ba0 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
15bb0 66 28 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65  f( db->writeVdbe
15bc0 43 6e 74 3e 30 20 26 26 20 70 31 3d 3d 53 41 56  Cnt>0 && p1==SAV
15bd0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29  EPOINT_RELEASE )
15be0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
15bf0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
15c00 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74   release (commit
15c10 29 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 66  ) a savepoint if
15c20 20 74 68 65 72 65 20 61 72 65 20 0a 20 20 20 20   there are .    
15c30 20 20 2a 2a 20 61 63 74 69 76 65 20 77 72 69 74    ** active writ
15c40 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  e statements..  
15c50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
15c60 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
15c70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 0a  ->zErrMsg, db, .
15c80 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
15c90 72 65 6c 65 61 73 65 20 73 61 76 65 70 6f 69 6e  release savepoin
15ca0 74 20 2d 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  t - SQL statemen
15cb0 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73 22 0a  ts in progress".
15cc0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
15cd0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
15ce0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20  .    }else{..   
15cf0 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20     /* Determine 
15d00 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
15d10 68 69 73 20 69 73 20 61 20 74 72 61 6e 73 61 63  his is a transac
15d20 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 2e 20  tion savepoint. 
15d30 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 2a 2a 20  If so,.      ** 
15d40 61 6e 64 20 74 68 69 73 20 69 73 20 61 20 52 45  and this is a RE
15d50 4c 45 41 53 45 20 63 6f 6d 6d 61 6e 64 2c 20 74  LEASE command, t
15d60 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
15d70 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20  transaction .   
15d80 20 20 20 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74     ** is committ
15d90 65 64 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ed. .      */.  
15da0 20 20 20 20 69 6e 74 20 69 73 54 72 61 6e 73 61      int isTransa
15db0 63 74 69 6f 6e 20 3d 20 70 53 61 76 65 70 6f 69  ction = pSavepoi
15dc0 6e 74 2d 3e 70 4e 65 78 74 3d 3d 30 20 26 26 20  nt->pNext==0 && 
15dd0 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f  db->isTransactio
15de0 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  nSavepoint;.    
15df0 20 20 69 66 28 20 69 73 54 72 61 6e 73 61 63 74    if( isTransact
15e00 69 6f 6e 20 26 26 20 70 31 3d 3d 53 41 56 45 50  ion && p1==SAVEP
15e10 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a  OINT_RELEASE ){.
15e20 20 20 20 20 20 20 20 20 69 66 28 20 28 72 63 20          if( (rc 
15e30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
15e40 63 6b 46 6b 28 70 2c 20 31 29 29 21 3d 53 51 4c  ckFk(p, 1))!=SQL
15e50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15e60 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65      goto vdbe_re
15e70 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
15e80 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
15e90 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
15ea0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
15eb0 64 62 65 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49  dbeHalt(p)==SQLI
15ec0 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
15ed0 20 20 20 20 20 70 2d 3e 70 63 20 3d 20 70 63 3b       p->pc = pc;
15ee0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  .          db->a
15ef0 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20  utoCommit = 0;. 
15f00 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
15f10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
15f20 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  Y;.          got
15f30 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20  o vdbe_return;. 
15f40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15f50 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69   db->isTransacti
15f60 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  onSavepoint = 0;
15f70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 2d  .        rc = p-
15f80 3e 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >rc;.      }else
15f90 7b 0a 20 20 20 20 20 20 20 20 69 53 61 76 65 70  {.        iSavep
15fa0 6f 69 6e 74 20 3d 20 64 62 2d 3e 6e 53 61 76 65  oint = db->nSave
15fb0 70 6f 69 6e 74 20 2d 20 69 53 61 76 65 70 6f 69  point - iSavepoi
15fc0 6e 74 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  nt - 1;.        
15fd0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 64 62 2d  for(ii=0; ii<db-
15fe0 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  >nDb; ii++){.   
15ff0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
16000 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
16010 73 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42  s(db->aDb[ii].pB
16020 74 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 29  t, SQLITE_ABORT)
16030 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16040 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
16050 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b  <db->nDb; ii++){
16060 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
16070 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
16080 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 69  point(db->aDb[ii
16090 5d 2e 70 42 74 2c 20 70 31 2c 20 69 53 61 76 65  ].pBt, p1, iSave
160a0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
160b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
160c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
160d0 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
160e0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
160f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16100 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 31  }.        if( p1
16110 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
16120 42 41 43 4b 20 26 26 20 28 64 62 2d 3e 66 6c 61  BACK && (db->fla
16130 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  gs&SQLITE_Intern
16140 43 68 61 6e 67 65 73 29 21 3d 30 20 29 7b 0a 20  Changes)!=0 ){. 
16150 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16160 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
16170 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
16180 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
16190 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
161a0 6d 61 28 64 62 2c 20 2d 31 29 3b 0a 20 20 20 20  ma(db, -1);.    
161b0 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
161c0 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53  = (db->flags | S
161d0 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
161e0 67 65 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ges);.        }.
161f0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
16200 20 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f   /* Regardless o
16210 66 20 77 68 65 74 68 65 72 20 74 68 69 73 20 69  f whether this i
16220 73 20 61 20 52 45 4c 45 41 53 45 20 6f 72 20 52  s a RELEASE or R
16230 4f 4c 4c 42 41 43 4b 2c 20 64 65 73 74 72 6f 79  OLLBACK, destroy
16240 20 61 6c 6c 20 0a 20 20 20 20 20 20 2a 2a 20 73   all .      ** s
16250 61 76 65 70 6f 69 6e 74 73 20 6e 65 73 74 65 64  avepoints nested
16260 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 73   inside of the s
16270 61 76 65 70 6f 69 6e 74 20 62 65 69 6e 67 20 6f  avepoint being o
16280 70 65 72 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20  perated on. */. 
16290 20 20 20 20 20 77 68 69 6c 65 28 20 64 62 2d 3e       while( db->
162a0 70 53 61 76 65 70 6f 69 6e 74 21 3d 70 53 61 76  pSavepoint!=pSav
162b0 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20  epoint ){.      
162c0 20 20 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61    pTmp = db->pSa
162d0 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20  vepoint;.       
162e0 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
162f0 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20  = pTmp->pNext;. 
16300 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
16310 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a  Free(db, pTmp);.
16320 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 61 76          db->nSav
16330 65 70 6f 69 6e 74 2d 2d 3b 0a 20 20 20 20 20 20  epoint--;.      
16340 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69  }..      /* If i
16350 74 20 69 73 20 61 20 52 45 4c 45 41 53 45 2c 20  t is a RELEASE, 
16360 74 68 65 6e 20 64 65 73 74 72 6f 79 20 74 68 65  then destroy the
16370 20 73 61 76 65 70 6f 69 6e 74 20 62 65 69 6e 67   savepoint being
16380 20 6f 70 65 72 61 74 65 64 20 6f 6e 20 0a 20 20   operated on .  
16390 20 20 20 20 2a 2a 20 74 6f 6f 2e 20 49 66 20 69      ** too. If i
163a0 74 20 69 73 20 61 20 52 4f 4c 4c 42 41 43 4b 20  t is a ROLLBACK 
163b0 54 4f 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65  TO, then set the
163c0 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 66 65 72   number of defer
163d0 72 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  red .      ** co
163e0 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69  nstraint violati
163f0 6f 6e 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ons present in t
16400 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74  he database to t
16410 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 0a  he value stored.
16420 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68        ** when th
16430 65 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73 20  e savepoint was 
16440 63 72 65 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20  created.  */.   
16450 20 20 20 69 66 28 20 70 31 3d 3d 53 41 56 45 50     if( p1==SAVEP
16460 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a  OINT_RELEASE ){.
16470 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16480 70 53 61 76 65 70 6f 69 6e 74 3d 3d 64 62 2d 3e  pSavepoint==db->
16490 70 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  pSavepoint );.  
164a0 20 20 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70        db->pSavep
164b0 6f 69 6e 74 20 3d 20 70 53 61 76 65 70 6f 69 6e  oint = pSavepoin
164c0 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
164d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
164e0 64 62 2c 20 70 53 61 76 65 70 6f 69 6e 74 29 3b  db, pSavepoint);
164f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
16500 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
16510 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 61           db->nSa
16520 76 65 70 6f 69 6e 74 2d 2d 3b 0a 20 20 20 20 20  vepoint--;.     
16530 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
16540 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44  {.        db->nD
16550 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 53  eferredCons = pS
16560 61 76 65 70 6f 69 6e 74 2d 3e 6e 44 65 66 65 72  avepoint->nDefer
16570 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 7d  redCons;.      }
16580 0a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 54  ..      if( !isT
16590 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
165a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
165b0 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
165c0 64 62 2c 20 70 31 2c 20 69 53 61 76 65 70 6f 69  db, p1, iSavepoi
165d0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nt);.        if(
165e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
165f0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
16600 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
16610 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62  }.    }.  }..  b
16620 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
16630 64 65 3a 20 41 75 74 6f 43 6f 6d 6d 69 74 20 50  de: AutoCommit P
16640 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
16650 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73   Set the databas
16660 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
16670 61 67 20 74 6f 20 50 31 20 28 31 20 6f 72 20 30  ag to P1 (1 or 0
16680 29 2e 20 49 66 20 50 32 20 69 73 20 74 72 75 65  ). If P2 is true
16690 2c 20 72 6f 6c 6c 0a 2a 2a 20 62 61 63 6b 20 61  , roll.** back a
166a0 6e 79 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ny currently act
166b0 69 76 65 20 62 74 72 65 65 20 74 72 61 6e 73 61  ive btree transa
166c0 63 74 69 6f 6e 73 2e 20 49 66 20 74 68 65 72 65  ctions. If there
166d0 20 61 72 65 20 61 6e 79 20 61 63 74 69 76 65 0a   are any active.
166e0 2a 2a 20 56 4d 73 20 28 61 70 61 72 74 20 66 72  ** VMs (apart fr
166f0 6f 6d 20 74 68 69 73 20 6f 6e 65 29 2c 20 74 68  om this one), th
16700 65 6e 20 61 20 52 4f 4c 4c 42 41 43 4b 20 66 61  en a ROLLBACK fa
16710 69 6c 73 2e 20 20 41 20 43 4f 4d 4d 49 54 20 66  ils.  A COMMIT f
16720 61 69 6c 73 20 69 66 0a 2a 2a 20 74 68 65 72 65  ails if.** there
16730 20 61 72 65 20 61 63 74 69 76 65 20 77 72 69 74   are active writ
16740 69 6e 67 20 56 4d 73 20 6f 72 20 61 63 74 69 76  ing VMs or activ
16750 65 20 56 4d 73 20 74 68 61 74 20 75 73 65 20 73  e VMs that use s
16760 68 61 72 65 64 20 63 61 63 68 65 2e 0a 2a 2a 0a  hared cache..**.
16770 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  ** This instruct
16780 69 6f 6e 20 63 61 75 73 65 73 20 74 68 65 20 56  ion causes the V
16790 4d 20 74 6f 20 68 61 6c 74 2e 0a 2a 2f 0a 63 61  M to halt..*/.ca
167a0 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  se OP_AutoCommit
167b0 3a 20 7b 0a 20 20 69 6e 74 20 64 65 73 69 72 65  : {.  int desire
167c0 64 41 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20 69  dAutoCommit;.  i
167d0 6e 74 20 69 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20  nt iRollback;.  
167e0 69 6e 74 20 74 75 72 6e 4f 6e 41 43 3b 0a 0a 20  int turnOnAC;.. 
167f0 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d   desiredAutoComm
16800 69 74 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  it = pOp->p1;.  
16810 69 52 6f 6c 6c 62 61 63 6b 20 3d 20 70 4f 70 2d  iRollback = pOp-
16820 3e 70 32 3b 0a 20 20 74 75 72 6e 4f 6e 41 43 20  >p2;.  turnOnAC 
16830 3d 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  = desiredAutoCom
16840 6d 69 74 20 26 26 20 21 64 62 2d 3e 61 75 74 6f  mit && !db->auto
16850 43 6f 6d 6d 69 74 3b 0a 20 20 61 73 73 65 72 74  Commit;.  assert
16860 28 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  ( desiredAutoCom
16870 6d 69 74 3d 3d 31 20 7c 7c 20 64 65 73 69 72 65  mit==1 || desire
16880 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29  dAutoCommit==0 )
16890 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65 73 69  ;.  assert( desi
168a0 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31  redAutoCommit==1
168b0 20 7c 7c 20 69 52 6f 6c 6c 62 61 63 6b 3d 3d 30   || iRollback==0
168c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
168d0 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e  ->activeVdbeCnt>
168e0 30 20 29 3b 20 20 2f 2a 20 41 74 20 6c 65 61 73  0 );  /* At leas
168f0 74 20 74 68 69 73 20 6f 6e 65 20 56 4d 20 69 73  t this one VM is
16900 20 61 63 74 69 76 65 20 2a 2f 0a 0a 23 69 66 20   active */..#if 
16910 30 0a 20 20 69 66 28 20 74 75 72 6e 4f 6e 41 43  0.  if( turnOnAC
16920 20 26 26 20 69 52 6f 6c 6c 62 61 63 6b 20 26 26   && iRollback &&
16930 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
16940 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  nt>1 ){.    /* I
16950 66 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  f this instructi
16960 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20  on implements a 
16970 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 6f 74 68  ROLLBACK and oth
16980 65 72 20 56 4d 73 20 61 72 65 0a 20 20 20 20 2a  er VMs are.    *
16990 2a 20 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 2c  * still running,
169a0 20 61 6e 64 20 61 20 74 72 61 6e 73 61 63 74 69   and a transacti
169b0 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 72 65  on is active, re
169c0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e  turn an error in
169d0 64 69 63 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20  dicating.    ** 
169e0 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 56  that the other V
169f0 4d 73 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  Ms must complete
16a00 20 66 69 72 73 74 2e 20 0a 20 20 20 20 2a 2f 0a   first. .    */.
16a10 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
16a20 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
16a30 2c 20 64 62 2c 20 22 63 61 6e 6e 6f 74 20 72 6f  , db, "cannot ro
16a40 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69  llback transacti
16a50 6f 6e 20 2d 20 22 0a 20 20 20 20 20 20 20 20 22  on - ".        "
16a60 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69  SQL statements i
16a70 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20  n progress");.  
16a80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
16a90 53 59 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  SY;.  }else.#end
16aa0 69 66 0a 20 20 69 66 28 20 74 75 72 6e 4f 6e 41  if.  if( turnOnA
16ab0 43 20 26 26 20 21 69 52 6f 6c 6c 62 61 63 6b 20  C && !iRollback 
16ac0 26 26 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65  && db->writeVdbe
16ad0 43 6e 74 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Cnt>0 ){.    /* 
16ae0 49 66 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  If this instruct
16af0 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  ion implements a
16b00 20 43 4f 4d 4d 49 54 20 61 6e 64 20 6f 74 68 65   COMMIT and othe
16b10 72 20 56 4d 73 20 61 72 65 20 77 72 69 74 69 6e  r VMs are writin
16b20 67 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20  g.    ** return 
16b30 61 6e 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74  an error indicat
16b40 69 6e 67 20 74 68 61 74 20 74 68 65 20 6f 74 68  ing that the oth
16b50 65 72 20 56 4d 73 20 6d 75 73 74 20 63 6f 6d 70  er VMs must comp
16b60 6c 65 74 65 20 66 69 72 73 74 2e 20 0a 20 20 20  lete first. .   
16b70 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 53   */.    sqlite3S
16b80 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
16b90 72 4d 73 67 2c 20 64 62 2c 20 22 63 61 6e 6e 6f  rMsg, db, "canno
16ba0 74 20 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63  t commit transac
16bb0 74 69 6f 6e 20 2d 20 22 0a 20 20 20 20 20 20 20  tion - ".       
16bc0 20 22 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73   "SQL statements
16bd0 20 69 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a   in progress");.
16be0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16bf0 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66  BUSY;.  }else if
16c00 28 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  ( desiredAutoCom
16c10 6d 69 74 21 3d 64 62 2d 3e 61 75 74 6f 43 6f 6d  mit!=db->autoCom
16c20 6d 69 74 20 29 7b 0a 20 20 20 20 69 66 28 20 69  mit ){.    if( i
16c30 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
16c40 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72 65    assert( desire
16c50 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 29  dAutoCommit==1 )
16c60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
16c70 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
16c80 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
16c90 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 64 62 2d  BACK);.      db-
16ca0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
16cb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
16cc0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
16cd0 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 29 21 3d  CheckFk(p, 1))!=
16ce0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16cf0 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74     goto vdbe_ret
16d00 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  urn;.    }else{.
16d10 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
16d20 6d 6d 69 74 20 3d 20 28 75 38 29 64 65 73 69 72  mmit = (u8)desir
16d30 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20  edAutoCommit;.  
16d40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
16d50 64 62 65 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49  dbeHalt(p)==SQLI
16d60 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
16d70 20 20 20 70 2d 3e 70 63 20 3d 20 70 63 3b 0a 20     p->pc = pc;. 
16d80 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
16d90 6f 6d 6d 69 74 20 3d 20 28 75 38 29 28 31 2d 64  ommit = (u8)(1-d
16da0 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
16db0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  );.        p->rc
16dc0 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42   = rc = SQLITE_B
16dd0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  USY;.        got
16de0 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20  o vdbe_return;. 
16df0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16e00 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74   assert( db->nSt
16e10 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  atement==0 );.  
16e20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
16e30 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
16e40 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
16e50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16e60 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
16e70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16e80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
16e90 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
16ea0 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e  goto vdbe_return
16eb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
16ec0 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
16ed0 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
16ee0 0a 20 20 20 20 20 20 20 20 28 21 64 65 73 69 72  .        (!desir
16ef0 65 64 41 75 74 6f 43 6f 6d 6d 69 74 29 3f 22 63  edAutoCommit)?"c
16f00 61 6e 6e 6f 74 20 73 74 61 72 74 20 61 20 74 72  annot start a tr
16f10 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 69 6e  ansaction within
16f20 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 3a   a transaction":
16f30 28 0a 20 20 20 20 20 20 20 20 28 69 52 6f 6c 6c  (.        (iRoll
16f40 62 61 63 6b 29 3f 22 63 61 6e 6e 6f 74 20 72 6f  back)?"cannot ro
16f50 6c 6c 62 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e  llback - no tran
16f60 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
16f70 65 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  e":.            
16f80 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63         "cannot c
16f90 6f 6d 6d 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73  ommit - no trans
16fa0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
16fb0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 0a 20  "));.         . 
16fc0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
16fd0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 62 72 65 61  RROR;.  }.  brea
16fe0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
16ff0 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 50 31 20   Transaction P1 
17000 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 42  P2 * * *.**.** B
17010 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
17020 6f 6e 2e 20 20 54 68 65 20 74 72 61 6e 73 61 63  on.  The transac
17030 74 69 6f 6e 20 65 6e 64 73 20 77 68 65 6e 20 61  tion ends when a
17040 20 43 6f 6d 6d 69 74 20 6f 72 20 52 6f 6c 6c 62   Commit or Rollb
17050 61 63 6b 0a 2a 2a 20 6f 70 63 6f 64 65 20 69 73  ack.** opcode is
17060 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 20 44   encountered.  D
17070 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
17080 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 73 65 74 74  ON CONFLICT sett
17090 69 6e 67 2c 20 74 68 65 0a 2a 2a 20 74 72 61 6e  ing, the.** tran
170a0 73 61 63 74 69 6f 6e 20 6d 69 67 68 74 20 61 6c  saction might al
170b0 73 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  so be rolled bac
170c0 6b 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  k if an error is
170d0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
170e0 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69 6e  .** P1 is the in
170f0 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
17100 61 73 65 20 66 69 6c 65 20 6f 6e 20 77 68 69 63  ase file on whic
17110 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  h the transactio
17120 6e 20 69 73 0a 2a 2a 20 73 74 61 72 74 65 64 2e  n is.** started.
17130 20 20 49 6e 64 65 78 20 30 20 69 73 20 74 68 65    Index 0 is the
17140 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
17150 69 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 31 20  ile and index 1 
17160 69 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 75  is the.** file u
17170 73 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  sed for temporar
17180 79 20 74 61 62 6c 65 73 2e 20 20 49 6e 64 69 63  y tables.  Indic
17190 65 73 20 6f 66 20 32 20 6f 72 20 6d 6f 72 65 20  es of 2 or more 
171a0 61 72 65 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  are used for.** 
171b0 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
171c0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32 20  es..**.** If P2 
171d0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
171e0 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
171f0 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
17200 2e 20 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f  .  A RESERVED lo
17210 63 6b 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65  ck is.** obtaine
17220 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
17230 65 20 66 69 6c 65 20 77 68 65 6e 20 61 20 77 72  e file when a wr
17240 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
17250 69 73 20 73 74 61 72 74 65 64 2e 20 20 4e 6f 0a  is started.  No.
17260 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ** other process
17270 20 63 61 6e 20 73 74 61 72 74 20 61 6e 6f 74 68   can start anoth
17280 65 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  er write transac
17290 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 69 73 20  tion while this 
172a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a  transaction is.*
172b0 2a 20 75 6e 64 65 72 77 61 79 2e 20 20 53 74 61  * underway.  Sta
172c0 72 74 69 6e 67 20 61 20 77 72 69 74 65 20 74 72  rting a write tr
172d0 61 6e 73 61 63 74 69 6f 6e 20 61 6c 73 6f 20 63  ansaction also c
172e0 72 65 61 74 65 73 20 61 20 72 6f 6c 6c 62 61 63  reates a rollbac
172f0 6b 20 6a 6f 75 72 6e 61 6c 2e 20 41 0a 2a 2a 20  k journal. A.** 
17300 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
17310 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65  n must be starte
17320 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
17330 6e 67 65 73 20 63 61 6e 20 62 65 20 6d 61 64 65  nges can be made
17340 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
17350 61 73 65 2e 20 20 49 66 20 50 32 20 69 73 20 32  ase.  If P2 is 2
17360 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 65 6e   or greater then
17370 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
17380 63 6b 20 69 73 20 61 6c 73 6f 20 6f 62 74 61 69  ck is also obtai
17390 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 66 69  ned.** on the fi
173a0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 77  le..**.** If a w
173b0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
173c0 20 69 73 20 73 74 61 72 74 65 64 20 61 6e 64 20   is started and 
173d0 74 68 65 20 56 64 62 65 2e 75 73 65 73 53 74 6d  the Vdbe.usesStm
173e0 74 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73  tJournal flag is
173f0 0a 2a 2a 20 74 72 75 65 20 28 74 68 69 73 20 66  .** true (this f
17400 6c 61 67 20 69 73 20 73 65 74 20 69 66 20 74 68  lag is set if th
17410 65 20 56 64 62 65 20 6d 61 79 20 6d 6f 64 69 66  e Vdbe may modif
17420 79 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  y more than one 
17430 72 6f 77 20 61 6e 64 20 6d 61 79 0a 2a 2a 20 74  row and may.** t
17440 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78  hrow an ABORT ex
17450 63 65 70 74 69 6f 6e 29 2c 20 61 20 73 74 61 74  ception), a stat
17460 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
17470 6e 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 6f 70  n may also be op
17480 65 6e 65 64 2e 0a 2a 2a 20 4d 6f 72 65 20 73 70  ened..** More sp
17490 65 63 69 66 69 63 61 6c 6c 79 2c 20 61 20 73 74  ecifically, a st
174a0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
174b0 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 69 66  ion is opened if
174c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
174d0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  * connection is 
174e0 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 69 6e  currently not in
174f0 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   autocommit mode
17500 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 61 72  , or if there ar
17510 65 20 6f 74 68 65 72 0a 2a 2a 20 61 63 74 69 76  e other.** activ
17520 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 41 20  e statements. A 
17530 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
17540 63 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 74 68 65  ction allows the
17550 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
17560 20 74 68 69 73 0a 2a 2a 20 56 44 42 45 20 74 6f   this.** VDBE to
17570 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
17580 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 77  after an error w
17590 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
175a0 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a   roll back the.*
175b0 2a 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  * entire transac
175c0 74 69 6f 6e 2e 20 49 66 20 6e 6f 20 65 72 72 6f  tion. If no erro
175d0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
175e0 2c 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  , the statement 
175f0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77  transaction.** w
17600 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
17610 79 20 63 6f 6d 6d 69 74 20 77 68 65 6e 20 74 68  y commit when th
17620 65 20 56 44 42 45 20 68 61 6c 74 73 2e 0a 2a 2a  e VDBE halts..**
17630 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 7a 65 72  .** If P2 is zer
17640 6f 2c 20 74 68 65 6e 20 61 20 72 65 61 64 2d 6c  o, then a read-l
17650 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
17660 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
17670 66 69 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  file..*/.case OP
17680 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a  _Transaction: {.
17690 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 0a 20    Btree *pBt;.. 
176a0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
176b0 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64  >=0 && pOp->p1<d
176c0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
176d0 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73  rt( (p->btreeMas
176e0 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31  k & (((yDbMask)1
176f0 29 3c 3c 70 4f 70 2d 3e 70 31 29 29 21 3d 30 20  )<<pOp->p1))!=0 
17700 29 3b 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61  );.  pBt = db->a
17710 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b  Db[pOp->p1].pBt;
17720 0a 0a 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20  ..  if( pBt ){. 
17730 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
17740 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
17750 42 74 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20  Bt, pOp->p2);.  
17760 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17770 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 70  _BUSY ){.      p
17780 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 20  ->pc = pc;.     
17790 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53 51   p->rc = rc = SQ
177a0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
177b0 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72   goto vdbe_retur
177c0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
177d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
177e0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f  {.      goto abo
177f0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
17800 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
17810 70 4f 70 2d 3e 70 32 20 26 26 20 70 2d 3e 75 73  pOp->p2 && p->us
17820 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 0a 20  esStmtJournal . 
17830 20 20 20 20 26 26 20 28 64 62 2d 3e 61 75 74 6f      && (db->auto
17840 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
17850 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 31  >activeVdbeCnt>1
17860 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
17870 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
17880 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
17890 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
178a0 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30  p->iStatement==0
178b0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
178c0 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  rt( db->nStateme
178d0 6e 74 3e 3d 30 20 26 26 20 64 62 2d 3e 6e 53 61  nt>=0 && db->nSa
178e0 76 65 70 6f 69 6e 74 3e 3d 30 20 29 3b 0a 20 20  vepoint>=0 );.  
178f0 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65        db->nState
17900 6d 65 6e 74 2b 2b 3b 20 0a 20 20 20 20 20 20 20  ment++; .       
17910 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
17920 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20   db->nSavepoint 
17930 2b 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  + db->nStatement
17940 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
17950 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
17960 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
17970 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 2c 20  AVEPOINT_BEGIN, 
17980 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 29  p->iStatement-1)
17990 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
179a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
179b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
179c0 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28  3BtreeBeginStmt(
179d0 70 42 74 2c 20 70 2d 3e 69 53 74 61 74 65 6d 65  pBt, p->iStateme
179e0 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  nt);.      }..  
179f0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
17a00 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
17a10 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
17a20 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20  andles deferred 
17a30 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20  constraint.     
17a40 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 49 66 20   ** counter. If 
17a50 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
17a60 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20  ansaction needs 
17a70 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
17a80 6b 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  k,.      ** the 
17a90 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 63 6f  value of this co
17aa0 75 6e 74 65 72 20 6e 65 65 64 73 20 74 6f 20 62  unter needs to b
17ab0 65 20 72 65 73 74 6f 72 65 64 20 74 6f 6f 2e 20  e restored too. 
17ac0 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74   */.      p->nSt
17ad0 6d 74 44 65 66 43 6f 6e 73 20 3d 20 64 62 2d 3e  mtDefCons = db->
17ae0 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3b 0a 20  nDeferredCons;. 
17af0 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
17b00 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
17b10 52 65 61 64 43 6f 6f 6b 69 65 20 50 31 20 50 32  ReadCookie P1 P2
17b20 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65   P3 * *.**.** Re
17b30 61 64 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72  ad cookie number
17b40 20 50 33 20 66 72 6f 6d 20 64 61 74 61 62 61 73   P3 from databas
17b50 65 20 50 31 20 61 6e 64 20 77 72 69 74 65 20 69  e P1 and write i
17b60 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  t into register 
17b70 50 32 2e 0a 2a 2a 20 50 33 3d 3d 31 20 69 73 20  P2..** P3==1 is 
17b80 74 68 65 20 73 63 68 65 6d 61 20 76 65 72 73 69  the schema versi
17b90 6f 6e 2e 20 20 50 33 3d 3d 32 20 69 73 20 74 68  on.  P3==2 is th
17ba0 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61  e database forma
17bb0 74 2e 0a 2a 2a 20 50 33 3d 3d 33 20 69 73 20 74  t..** P3==3 is t
17bc0 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70  he recommended p
17bd0 61 67 65 72 20 63 61 63 68 65 20 73 69 7a 65 2c  ager cache size,
17be0 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   and so forth.  
17bf0 50 31 3d 3d 30 20 69 73 0a 2a 2a 20 74 68 65 20  P1==0 is.** the 
17c00 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
17c10 6c 65 20 61 6e 64 20 50 31 3d 3d 31 20 69 73 20  le and P1==1 is 
17c20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17c30 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
17c40 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
17c50 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  les..**.** There
17c60 20 6d 75 73 74 20 62 65 20 61 20 72 65 61 64 2d   must be a read-
17c70 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
17c80 62 61 73 65 20 28 65 69 74 68 65 72 20 61 20 74  base (either a t
17c90 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75  ransaction.** mu
17ca0 73 74 20 62 65 20 73 74 61 72 74 65 64 20 6f 72  st be started or
17cb0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
17cc0 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 29 20 62  n open cursor) b
17cd0 65 66 6f 72 65 0a 2a 2a 20 65 78 65 63 75 74 69  efore.** executi
17ce0 6e 67 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  ng this instruct
17cf0 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ion..*/.case OP_
17d00 52 65 61 64 43 6f 6f 6b 69 65 3a 20 7b 20 20 20  ReadCookie: {   
17d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
17d20 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a  ut2-prerelease *
17d30 2f 0a 20 20 69 6e 74 20 69 4d 65 74 61 3b 0a 20  /.  int iMeta;. 
17d40 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20   int iDb;.  int 
17d50 69 43 6f 6f 6b 69 65 3b 0a 0a 20 20 69 44 62 20  iCookie;..  iDb 
17d60 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 43 6f  = pOp->p1;.  iCo
17d70 6f 6b 69 65 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a  okie = pOp->p3;.
17d80 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
17d90 33 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45  3<SQLITE_N_BTREE
17da0 5f 4d 45 54 41 20 29 3b 0a 20 20 61 73 73 65 72  _META );.  asser
17db0 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
17dc0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
17dd0 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44  sert( db->aDb[iD
17de0 62 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  b].pBt!=0 );.  a
17df0 73 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65  ssert( (p->btree
17e00 4d 61 73 6b 20 26 20 28 28 28 79 44 62 4d 61 73  Mask & (((yDbMas
17e10 6b 29 31 29 3c 3c 69 44 62 29 29 21 3d 30 20 29  k)1)<<iDb))!=0 )
17e20 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
17e30 65 47 65 74 4d 65 74 61 28 64 62 2d 3e 61 44 62  eGetMeta(db->aDb
17e40 5b 69 44 62 5d 2e 70 42 74 2c 20 69 43 6f 6f 6b  [iDb].pBt, iCook
17e50 69 65 2c 20 28 75 33 32 20 2a 29 26 69 4d 65 74  ie, (u32 *)&iMet
17e60 61 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20  a);.  pOut->u.i 
17e70 3d 20 69 4d 65 74 61 3b 0a 20 20 62 72 65 61 6b  = iMeta;.  break
17e80 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
17e90 53 65 74 43 6f 6f 6b 69 65 20 50 31 20 50 32 20  SetCookie P1 P2 
17ea0 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69  P3 * *.**.** Wri
17eb0 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  te the content o
17ec0 66 20 72 65 67 69 73 74 65 72 20 50 33 20 28 69  f register P3 (i
17ed0 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e  nterpreted as an
17ee0 20 69 6e 74 65 67 65 72 29 0a 2a 2a 20 69 6e 74   integer).** int
17ef0 6f 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20  o cookie number 
17f00 50 32 20 6f 66 20 64 61 74 61 62 61 73 65 20 50  P2 of database P
17f10 31 2e 20 20 50 32 3d 3d 31 20 69 73 20 74 68 65  1.  P2==1 is the
17f20 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 2e   schema version.
17f30 20 20 0a 2a 2a 20 50 32 3d 3d 32 20 69 73 20 74    .** P2==2 is t
17f40 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d  he database form
17f50 61 74 2e 20 50 32 3d 3d 33 20 69 73 20 74 68 65  at. P2==3 is the
17f60 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61 67   recommended pag
17f70 65 72 20 63 61 63 68 65 20 0a 2a 2a 20 73 69 7a  er cache .** siz
17f80 65 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  e, and so forth.
17f90 20 20 50 31 3d 3d 30 20 69 73 20 74 68 65 20 6d    P1==0 is the m
17fa0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
17fb0 65 20 61 6e 64 20 50 31 3d 3d 31 20 69 73 20 74  e and P1==1 is t
17fc0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
17fd0 66 69 6c 65 20 75 73 65 64 20 74 6f 20 73 74 6f  file used to sto
17fe0 72 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  re temporary tab
17ff0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61  les..**.** A tra
18000 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
18010 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
18020 65 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 6f  executing this o
18030 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  pcode..*/.case O
18040 50 5f 53 65 74 43 6f 6f 6b 69 65 3a 20 7b 20 20  P_SetCookie: {  
18050 20 20 20 20 20 2f 2a 20 69 6e 33 20 2a 2f 0a 20       /* in3 */. 
18060 20 44 62 20 2a 70 44 62 3b 0a 20 20 61 73 73 65   Db *pDb;.  asse
18070 72 74 28 20 70 4f 70 2d 3e 70 32 3c 53 51 4c 49  rt( pOp->p2<SQLI
18080 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20  TE_N_BTREE_META 
18090 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
180a0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
180b0 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p1<db->nDb );.  
180c0 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65  assert( (p->btre
180d0 65 4d 61 73 6b 20 26 20 28 28 28 79 44 62 4d 61  eMask & (((yDbMa
180e0 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e 70 31 29 29  sk)1)<<pOp->p1))
180f0 21 3d 30 20 29 3b 0a 20 20 70 44 62 20 3d 20 26  !=0 );.  pDb = &
18100 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d  db->aDb[pOp->p1]
18110 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d  ;.  assert( pDb-
18120 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
18130 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
18140 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
18150 70 4f 70 2d 3e 70 31 2c 20 30 29 20 29 3b 0a 20  pOp->p1, 0) );. 
18160 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn3 = &aMem[pO
18170 70 2d 3e 70 33 5d 3b 0a 20 20 73 71 6c 69 74 65  p->p3];.  sqlite
18180 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69  3VdbeMemIntegeri
18190 66 79 28 70 49 6e 33 29 3b 0a 20 20 2f 2a 20 53  fy(pIn3);.  /* S
181a0 65 65 20 6e 6f 74 65 20 61 62 6f 75 74 20 69 6e  ee note about in
181b0 64 65 78 20 73 68 69 66 74 69 6e 67 20 6f 6e 20  dex shifting on 
181c0 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 20 2a 2f  OP_ReadCookie */
181d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
181e0 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70  treeUpdateMeta(p
181f0 44 62 2d 3e 70 42 74 2c 20 70 4f 70 2d 3e 70 32  Db->pBt, pOp->p2
18200 2c 20 28 69 6e 74 29 70 49 6e 33 2d 3e 75 2e 69  , (int)pIn3->u.i
18210 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32  );.  if( pOp->p2
18220 3d 3d 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56  ==BTREE_SCHEMA_V
18230 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 2f 2a  ERSION ){.    /*
18240 20 57 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   When the schema
18250 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65 73 2c   cookie changes,
18260 20 72 65 63 6f 72 64 20 74 68 65 20 6e 65 77 20   record the new 
18270 63 6f 6f 6b 69 65 20 69 6e 74 65 72 6e 61 6c 6c  cookie internall
18280 79 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 70 53  y */.    pDb->pS
18290 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f  chema->schema_co
182a0 6f 6b 69 65 20 3d 20 28 69 6e 74 29 70 49 6e 33  okie = (int)pIn3
182b0 2d 3e 75 2e 69 3b 0a 20 20 20 20 64 62 2d 3e 66  ->u.i;.    db->f
182c0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
182d0 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
182e0 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 70  }else if( pOp->p
182f0 32 3d 3d 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  2==BTREE_FILE_FO
18300 52 4d 41 54 20 29 7b 0a 20 20 20 20 2f 2a 20 52  RMAT ){.    /* R
18310 65 63 6f 72 64 20 63 68 61 6e 67 65 73 20 69 6e  ecord changes in
18320 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
18330 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 70 53 63   */.    pDb->pSc
18340 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  hema->file_forma
18350 74 20 3d 20 28 75 38 29 70 49 6e 33 2d 3e 75 2e  t = (u8)pIn3->u.
18360 69 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70  i;.  }.  if( pOp
18370 2d 3e 70 31 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  ->p1==1 ){.    /
18380 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  * Invalidate all
18390 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
183a0 65 6e 74 73 20 77 68 65 6e 65 76 65 72 20 74 68  ents whenever th
183b0 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 0a  e TEMP database.
183c0 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 20 69 73      ** schema is
183d0 20 63 68 61 6e 67 65 64 2e 20 20 54 69 63 6b 65   changed.  Ticke
183e0 74 20 23 31 36 34 34 20 2a 2f 0a 20 20 20 20 73  t #1644 */.    s
183f0 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
18400 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
18410 62 29 3b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72  b);.    p->expir
18420 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 62 72  ed = 0;.  }.  br
18430 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
18440 65 3a 20 56 65 72 69 66 79 43 6f 6f 6b 69 65 20  e: VerifyCookie 
18450 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
18460 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 76 61 6c  ** Check the val
18470 75 65 20 6f 66 20 67 6c 6f 62 61 6c 20 64 61 74  ue of global dat
18480 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72 20  abase parameter 
18490 6e 75 6d 62 65 72 20 30 20 28 74 68 65 0a 2a 2a  number 0 (the.**
184a0 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 29   schema version)
184b0 20 61 6e 64 20 6d 61 6b 65 20 73 75 72 65 20 69   and make sure i
184c0 74 20 69 73 20 65 71 75 61 6c 20 74 6f 20 50 32  t is equal to P2
184d0 20 61 6e 64 20 74 68 61 74 20 74 68 65 0a 2a 2a   and that the.**
184e0 20 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 75 6e   generation coun
184f0 74 65 72 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ter on the local
18500 20 73 63 68 65 6d 61 20 70 61 72 73 65 20 65 71   schema parse eq
18510 75 61 6c 73 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 50  uals P3..**.** P
18520 31 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73  1 is the databas
18530 65 20 6e 75 6d 62 65 72 20 77 68 69 63 68 20 69  e number which i
18540 73 20 30 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  s 0 for the main
18550 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
18560 2a 20 61 6e 64 20 31 20 66 6f 72 20 74 68 65 20  * and 1 for the 
18570 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 65 6d  file holding tem
18580 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 61 6e  porary tables an
18590 64 20 73 6f 6d 65 20 68 69 67 68 65 72 20 6e 75  d some higher nu
185a0 6d 62 65 72 0a 2a 2a 20 66 6f 72 20 61 75 78 69  mber.** for auxi
185b0 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73 2e  liary databases.
185c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6f 6b 69  .**.** The cooki
185d0 65 20 63 68 61 6e 67 65 73 20 69 74 73 20 76 61  e changes its va
185e0 6c 75 65 20 77 68 65 6e 65 76 65 72 20 74 68 65  lue whenever the
185f0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
18600 20 63 68 61 6e 67 65 73 2e 0a 2a 2a 20 54 68 69   changes..** Thi
18610 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 75  s operation is u
18620 73 65 64 20 74 6f 20 64 65 74 65 63 74 20 77 68  sed to detect wh
18630 65 6e 20 74 68 61 74 20 74 68 65 20 63 6f 6f 6b  en that the cook
18640 69 65 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ie has changed.*
18650 2a 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 63  * and that the c
18660 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 6e  urrent process n
18670 65 65 64 73 20 74 6f 20 72 65 72 65 61 64 20 74  eeds to reread t
18680 68 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a  he schema..**.**
18690 20 45 69 74 68 65 72 20 61 20 74 72 61 6e 73 61   Either a transa
186a0 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 68  ction needs to h
186b0 61 76 65 20 62 65 65 6e 20 73 74 61 72 74 65 64  ave been started
186c0 20 6f 72 20 61 6e 20 4f 50 5f 4f 70 65 6e 20 6e   or an OP_Open n
186d0 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20 65 78  eeds.** to be ex
186e0 65 63 75 74 65 64 20 28 74 6f 20 65 73 74 61 62  ecuted (to estab
186f0 6c 69 73 68 20 61 20 72 65 61 64 20 6c 6f 63 6b  lish a read lock
18700 29 20 62 65 66 6f 72 65 20 74 68 69 73 20 6f 70  ) before this op
18710 63 6f 64 65 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b  code is.** invok
18720 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56  ed..*/.case OP_V
18730 65 72 69 66 79 43 6f 6f 6b 69 65 3a 20 7b 0a 20  erifyCookie: {. 
18740 20 69 6e 74 20 69 4d 65 74 61 3b 0a 20 20 69 6e   int iMeta;.  in
18750 74 20 69 47 65 6e 3b 0a 20 20 42 74 72 65 65 20  t iGen;.  Btree 
18760 2a 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pBt;..  assert(
18770 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
18780 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29  Op->p1<db->nDb )
18790 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  ;.  assert( (p->
187a0 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79  btreeMask & (((y
187b0 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e  DbMask)1)<<pOp->
187c0 70 31 29 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  p1))!=0 );.  ass
187d0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
187e0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
187f0 70 4f 70 2d 3e 70 31 2c 20 30 29 20 29 3b 0a 20  pOp->p1, 0) );. 
18800 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70   pBt = db->aDb[p
18810 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 69  Op->p1].pBt;.  i
18820 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 73 71  f( pBt ){.    sq
18830 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
18840 61 28 70 42 74 2c 20 42 54 52 45 45 5f 53 43 48  a(pBt, BTREE_SCH
18850 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 28 75 33  EMA_VERSION, (u3
18860 32 20 2a 29 26 69 4d 65 74 61 29 3b 0a 20 20 20  2 *)&iMeta);.   
18870 20 69 47 65 6e 20 3d 20 64 62 2d 3e 61 44 62 5b   iGen = db->aDb[
18880 70 4f 70 2d 3e 70 31 5d 2e 70 53 63 68 65 6d 61  pOp->p1].pSchema
18890 2d 3e 69 47 65 6e 65 72 61 74 69 6f 6e 3b 0a 20  ->iGeneration;. 
188a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 47 65 6e   }else{.    iGen
188b0 20 3d 20 69 4d 65 74 61 20 3d 20 30 3b 0a 20 20   = iMeta = 0;.  
188c0 7d 0a 20 20 69 66 28 20 69 4d 65 74 61 21 3d 70  }.  if( iMeta!=p
188d0 4f 70 2d 3e 70 32 20 7c 7c 20 69 47 65 6e 21 3d  Op->p2 || iGen!=
188e0 70 4f 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20 73  pOp->p3 ){.    s
188f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18900 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
18910 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73    p->zErrMsg = s
18920 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
18930 62 2c 20 22 64 61 74 61 62 61 73 65 20 73 63 68  b, "database sch
18940 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64 22  ema has changed"
18950 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  );.    /* If the
18960 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 66   schema-cookie f
18970 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
18980 20 66 69 6c 65 20 6d 61 74 63 68 65 73 20 74 68   file matches th
18990 65 20 63 6f 6f 6b 69 65 20 0a 20 20 20 20 2a 2a  e cookie .    **
189a0 20 73 74 6f 72 65 64 20 77 69 74 68 20 74 68 65   stored with the
189b0 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
189c0 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
189d0 20 73 63 68 65 6d 61 2c 20 64 6f 0a 20 20 20 20   schema, do.    
189e0 2a 2a 20 6e 6f 74 20 72 65 6c 6f 61 64 20 74 68  ** not reload th
189f0 65 20 73 63 68 65 6d 61 20 66 72 6f 6d 20 74 68  e schema from th
18a00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
18a10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
18a20 66 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 73  f virtual-tables
18a30 20 61 72 65 20 69 6e 20 75 73 65 2c 20 74 68 69   are in use, thi
18a40 73 20 69 73 20 6e 6f 74 20 6a 75 73 74 20 61 6e  s is not just an
18a50 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20   optimization.. 
18a60 20 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 76 2d 74     ** Often, v-t
18a70 61 62 6c 65 73 20 73 74 6f 72 65 20 74 68 65 69  ables store thei
18a80 72 20 64 61 74 61 20 69 6e 20 6f 74 68 65 72 20  r data in other 
18a90 53 51 4c 69 74 65 20 74 61 62 6c 65 73 2c 20 77  SQLite tables, w
18aa0 68 69 63 68 0a 20 20 20 20 2a 2a 20 61 72 65 20  hich.    ** are 
18ab0 71 75 65 72 69 65 64 20 66 72 6f 6d 20 77 69 74  queried from wit
18ac0 68 69 6e 20 78 4e 65 78 74 28 29 20 61 6e 64 20  hin xNext() and 
18ad0 6f 74 68 65 72 20 76 2d 74 61 62 6c 65 20 6d 65  other v-table me
18ae0 74 68 6f 64 73 20 75 73 69 6e 67 0a 20 20 20 20  thods using.    
18af0 2a 2a 20 70 72 65 70 61 72 65 64 20 71 75 65 72  ** prepared quer
18b00 69 65 73 2e 20 49 66 20 73 75 63 68 20 61 20 71  ies. If such a q
18b10 75 65 72 79 20 69 73 20 6f 75 74 2d 6f 66 2d 64  uery is out-of-d
18b20 61 74 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 77  ate, we do not w
18b30 61 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  ant to.    ** di
18b40 73 63 61 72 64 20 74 68 65 20 64 61 74 61 62 61  scard the databa
18b50 73 65 20 73 63 68 65 6d 61 2c 20 61 73 20 74 68  se schema, as th
18b60 65 20 75 73 65 72 20 63 6f 64 65 20 69 6d 70 6c  e user code impl
18b70 65 6d 65 6e 74 69 6e 67 20 74 68 65 0a 20 20 20  ementing the.   
18b80 20 2a 2a 20 76 2d 74 61 62 6c 65 20 77 6f 75 6c   ** v-table woul
18b90 64 20 68 61 76 65 20 74 6f 20 62 65 20 72 65 61  d have to be rea
18ba0 64 79 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  dy for the sqlit
18bb0 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
18bc0 65 20 69 74 73 65 6c 66 0a 20 20 20 20 2a 2a 20  e itself.    ** 
18bd0 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  to be invalidate
18be0 64 20 77 68 65 6e 65 76 65 72 20 73 71 6c 69 74  d whenever sqlit
18bf0 65 33 5f 73 74 65 70 28 29 20 69 73 20 63 61 6c  e3_step() is cal
18c00 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
18c10 0a 20 20 20 20 2a 2a 20 61 20 76 2d 74 61 62 6c  .    ** a v-tabl
18c20 65 20 6d 65 74 68 6f 64 2e 0a 20 20 20 20 2a 2f  e method..    */
18c30 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62  .    if( db->aDb
18c40 5b 70 4f 70 2d 3e 70 31 5d 2e 70 53 63 68 65 6d  [pOp->p1].pSchem
18c50 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
18c60 21 3d 69 4d 65 74 61 20 29 7b 0a 20 20 20 20 20  !=iMeta ){.     
18c70 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
18c80 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
18c90 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20 7d 0a  pOp->p1);.    }.
18ca0 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
18cb0 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 1;.    rc = SQ
18cc0 4c 49 54 45 5f 53 43 48 45 4d 41 3b 0a 20 20 7d  LITE_SCHEMA;.  }
18cd0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
18ce0 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 52 65 61 64  Opcode: OpenRead
18cf0 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
18d00 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61  **.** Open a rea
18d10 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 66 6f  d-only cursor fo
18d20 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  r the database t
18d30 61 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  able whose root 
18d40 70 61 67 65 20 69 73 0a 2a 2a 20 50 32 20 69 6e  page is.** P2 in
18d50 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
18d60 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  .  The database 
18d70 66 69 6c 65 20 69 73 20 64 65 74 65 72 6d 69 6e  file is determin
18d80 65 64 20 62 79 20 50 33 2e 20 0a 2a 2a 20 50 33  ed by P3. .** P3
18d90 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 20 6d 61  ==0 means the ma
18da0 69 6e 20 64 61 74 61 62 61 73 65 2c 20 50 33 3d  in database, P3=
18db0 3d 31 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  =1 means the dat
18dc0 61 62 61 73 65 20 75 73 65 64 20 66 6f 72 20 0a  abase used for .
18dd0 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
18de0 6c 65 73 2c 20 61 6e 64 20 50 33 3e 31 20 6d 65  les, and P3>1 me
18df0 61 6e 73 20 75 73 65 64 20 74 68 65 20 63 6f 72  ans used the cor
18e00 72 65 73 70 6f 6e 64 69 6e 67 20 61 74 74 61 63  responding attac
18e10 68 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  hed.** database.
18e20 20 20 47 69 76 65 20 74 68 65 20 6e 65 77 20 63    Give the new c
18e30 75 72 73 6f 72 20 61 6e 20 69 64 65 6e 74 69 66  ursor an identif
18e40 69 65 72 20 6f 66 20 50 31 2e 20 20 54 68 65 20  ier of P1.  The 
18e50 50 31 0a 2a 2a 20 76 61 6c 75 65 73 20 6e 65 65  P1.** values nee
18e60 64 20 6e 6f 74 20 62 65 20 63 6f 6e 74 69 67 75  d not be contigu
18e70 6f 75 73 20 62 75 74 20 61 6c 6c 20 50 31 20 76  ous but all P1 v
18e80 61 6c 75 65 73 20 73 68 6f 75 6c 64 20 62 65 20  alues should be 
18e90 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73 2e 0a  small integers..
18ea0 2a 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  ** It is an erro
18eb0 72 20 66 6f 72 20 50 31 20 74 6f 20 62 65 20 6e  r for P1 to be n
18ec0 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 49  egative..**.** I
18ed0 66 20 50 35 21 3d 30 20 74 68 65 6e 20 75 73 65  f P5!=0 then use
18ee0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
18ef0 72 65 67 69 73 74 65 72 20 50 32 20 61 73 20 74  register P2 as t
18f00 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 6e 6f  he root page, no
18f10 74 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  t.** the value o
18f20 66 20 50 32 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a  f P2 itself..**.
18f30 2a 2a 20 54 68 65 72 65 20 77 69 6c 6c 20 62 65  ** There will be
18f40 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
18f50 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68 65  the database whe
18f60 6e 65 76 65 72 20 74 68 65 72 65 20 69 73 20 61  never there is a
18f70 6e 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72  n.** open cursor
18f80 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
18f90 73 65 20 77 61 73 20 75 6e 6c 6f 63 6b 65 64 20  se was unlocked 
18fa0 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 69 6e  prior to this in
18fb0 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 74 68 65  struction.** the
18fc0 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  n a read lock is
18fd0 20 61 63 71 75 69 72 65 64 20 61 73 20 70 61 72   acquired as par
18fe0 74 20 6f 66 20 74 68 69 73 20 69 6e 73 74 72 75  t of this instru
18ff0 63 74 69 6f 6e 2e 20 20 41 20 72 65 61 64 0a 2a  ction.  A read.*
19000 2a 20 6c 6f 63 6b 20 61 6c 6c 6f 77 73 20 6f 74  * lock allows ot
19010 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 74 6f  her processes to
19020 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61   read the databa
19030 73 65 20 62 75 74 20 70 72 6f 68 69 62 69 74 73  se but prohibits
19040 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 70 72  .** any other pr
19050 6f 63 65 73 73 20 66 72 6f 6d 20 6d 6f 64 69 66  ocess from modif
19060 79 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ying the databas
19070 65 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  e.  The read loc
19080 6b 20 69 73 0a 2a 2a 20 72 65 6c 65 61 73 65 64  k is.** released
19090 20 77 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72   when all cursor
190a0 73 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 20 49  s are closed.  I
190b0 66 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  f this instructi
190c0 6f 6e 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  on attempts.** t
190d0 6f 20 67 65 74 20 61 20 72 65 61 64 20 6c 6f 63  o get a read loc
190e0 6b 20 62 75 74 20 66 61 69 6c 73 2c 20 74 68 65  k but fails, the
190f0 20 73 63 72 69 70 74 20 74 65 72 6d 69 6e 61 74   script terminat
19100 65 73 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51  es with an.** SQ
19110 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20  LITE_BUSY error 
19120 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  code..**.** The 
19130 50 34 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  P4 value may be 
19140 65 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65  either an intege
19150 72 20 28 50 34 5f 49 4e 54 33 32 29 20 6f 72 20  r (P4_INT32) or 
19160 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  a pointer to.** 
19170 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
19180 75 72 65 20 28 50 34 5f 4b 45 59 49 4e 46 4f 29  ure (P4_KEYINFO)
19190 2e 20 49 66 20 69 74 20 69 73 20 61 20 70 6f 69  . If it is a poi
191a0 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66  nter to a KeyInf
191b0 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2c  o .** structure,
191c0 20 74 68 65 6e 20 73 61 69 64 20 73 74 72 75 63   then said struc
191d0 74 75 72 65 20 64 65 66 69 6e 65 73 20 74 68 65  ture defines the
191e0 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 63 6f 6c   content and col
191f0 6c 61 74 69 6e 67 20 0a 2a 2a 20 73 65 71 75 65  lating .** seque
19200 6e 63 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  nce of the index
19210 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 2e 20 4f   being opened. O
19220 74 68 65 72 77 69 73 65 2c 20 69 66 20 50 34 20  therwise, if P4 
19230 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 0a 2a  is an integer .*
19240 2a 20 76 61 6c 75 65 2c 20 69 74 20 69 73 20 73  * value, it is s
19250 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
19260 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
19270 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
19280 53 65 65 20 61 6c 73 6f 20 4f 70 65 6e 57 72 69  See also OpenWri
19290 74 65 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  te..*/./* Opcode
192a0 3a 20 4f 70 65 6e 57 72 69 74 65 20 50 31 20 50  : OpenWrite P1 P
192b0 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
192c0 20 4f 70 65 6e 20 61 20 72 65 61 64 2f 77 72 69   Open a read/wri
192d0 74 65 20 63 75 72 73 6f 72 20 6e 61 6d 65 64 20  te cursor named 
192e0 50 31 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  P1 on the table 
192f0 6f 72 20 69 6e 64 65 78 20 77 68 6f 73 65 20 72  or index whose r
19300 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 50  oot.** page is P
19310 32 2e 20 20 4f 72 20 69 66 20 50 35 21 3d 30 20  2.  Or if P5!=0 
19320 75 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  use the content 
19330 6f 66 20 72 65 67 69 73 74 65 72 20 50 32 20 74  of register P2 t
19340 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 72 6f  o find the.** ro
19350 6f 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ot page..**.** T
19360 68 65 20 50 34 20 76 61 6c 75 65 20 6d 61 79 20  he P4 value may 
19370 62 65 20 65 69 74 68 65 72 20 61 6e 20 69 6e 74  be either an int
19380 65 67 65 72 20 28 50 34 5f 49 4e 54 33 32 29 20  eger (P4_INT32) 
19390 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  or a pointer to.
193a0 2a 2a 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  ** a KeyInfo str
193b0 75 63 74 75 72 65 20 28 50 34 5f 4b 45 59 49 4e  ucture (P4_KEYIN
193c0 46 4f 29 2e 20 49 66 20 69 74 20 69 73 20 61 20  FO). If it is a 
193d0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79  pointer to a Key
193e0 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75  Info .** structu
193f0 72 65 2c 20 74 68 65 6e 20 73 61 69 64 20 73 74  re, then said st
19400 72 75 63 74 75 72 65 20 64 65 66 69 6e 65 73 20  ructure defines 
19410 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  the content and 
19420 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a 2a 20 73 65  collating .** se
19430 71 75 65 6e 63 65 20 6f 66 20 74 68 65 20 69 6e  quence of the in
19440 64 65 78 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  dex being opened
19450 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
19460 50 34 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  P4 is an integer
19470 20 0a 2a 2a 20 76 61 6c 75 65 2c 20 69 74 20 69   .** value, it i
19480 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
19490 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
194a0 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 6f 72 20  n the table, or 
194b0 74 6f 20 74 68 65 0a 2a 2a 20 6c 61 72 67 65 73  to the.** larges
194c0 74 20 69 6e 64 65 78 20 6f 66 20 61 6e 79 20 63  t index of any c
194d0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
194e0 6c 65 20 74 68 61 74 20 69 73 20 61 63 74 75 61  le that is actua
194f0 6c 6c 79 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  lly used..**.** 
19500 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  This instruction
19510 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
19520 20 4f 70 65 6e 52 65 61 64 20 65 78 63 65 70 74   OpenRead except
19530 20 74 68 61 74 20 69 74 20 6f 70 65 6e 73 20 74   that it opens t
19540 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 6e 20  he cursor.** in 
19550 72 65 61 64 2f 77 72 69 74 65 20 6d 6f 64 65 2e  read/write mode.
19560 20 20 46 6f 72 20 61 20 67 69 76 65 6e 20 74 61    For a given ta
19570 62 6c 65 2c 20 74 68 65 72 65 20 63 61 6e 20 62  ble, there can b
19580 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72 65  e one or more re
19590 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f  ad-only.** curso
195a0 72 73 20 6f 72 20 61 20 73 69 6e 67 6c 65 20 72  rs or a single r
195b0 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72  ead/write cursor
195c0 20 62 75 74 20 6e 6f 74 20 62 6f 74 68 2e 0a 2a   but not both..*
195d0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 4f 70  *.** See also Op
195e0 65 6e 52 65 61 64 2e 0a 2a 2f 0a 63 61 73 65 20  enRead..*/.case 
195f0 4f 50 5f 4f 70 65 6e 52 65 61 64 3a 0a 63 61 73  OP_OpenRead:.cas
19600 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3a 20  e OP_OpenWrite: 
19610 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a  {.  int nField;.
19620 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
19630 6e 66 6f 3b 0a 20 20 69 6e 74 20 70 32 3b 0a 20  nfo;.  int p2;. 
19640 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20   int iDb;.  int 
19650 77 72 46 6c 61 67 3b 0a 20 20 42 74 72 65 65 20  wrFlag;.  Btree 
19660 2a 70 58 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  *pX;.  VdbeCurso
19670 72 20 2a 70 43 75 72 3b 0a 20 20 44 62 20 2a 70  r *pCur;.  Db *p
19680 44 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 65 78  Db;..  if( p->ex
19690 70 69 72 65 64 20 29 7b 0a 20 20 20 20 72 63 20  pired ){.    rc 
196a0 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  = SQLITE_ABORT;.
196b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
196c0 20 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20    nField = 0;.  
196d0 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20  pKeyInfo = 0;.  
196e0 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  p2 = pOp->p2;.  
196f0 69 44 62 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20  iDb = pOp->p3;. 
19700 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
19710 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
19720 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  ;.  assert( (p->
19730 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79  btreeMask & (((y
19740 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62 29 29  DbMask)1)<<iDb))
19750 21 3d 30 20 29 3b 0a 20 20 70 44 62 20 3d 20 26  !=0 );.  pDb = &
19760 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
19770 70 58 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20  pX = pDb->pBt;. 
19780 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29   assert( pX!=0 )
19790 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
197a0 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74  ode==OP_OpenWrit
197b0 65 20 29 7b 0a 20 20 20 20 77 72 46 6c 61 67 20  e ){.    wrFlag 
197c0 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 1;.    assert(
197d0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
197e0 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
197f0 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70   0) );.    if( p
19800 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c  Db->pSchema->fil
19810 65 5f 66 6f 72 6d 61 74 20 3c 20 70 2d 3e 6d 69  e_format < p->mi
19820 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74  nWriteFileFormat
19830 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 69 6e   ){.      p->min
19840 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20  WriteFileFormat 
19850 3d 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  = pDb->pSchema->
19860 66 69 6c 65 5f 66 6f 72 6d 61 74 3b 0a 20 20 20  file_format;.   
19870 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
19880 77 72 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a  wrFlag = 0;.  }.
19890 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b    if( pOp->p5 ){
198a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 32 3e  .    assert( p2>
198b0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
198c0 20 70 32 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a   p2<=p->nMem );.
198d0 20 20 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d      pIn2 = &aMem
198e0 5b 70 32 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  [p2];.    assert
198f0 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e  ( memIsValid(pIn
19900 32 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  2) );.    assert
19910 28 20 28 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26  ( (pIn2->flags &
19920 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a   MEM_Int)!=0 );.
19930 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
19940 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e  emIntegerify(pIn
19950 32 29 3b 0a 20 20 20 20 70 32 20 3d 20 28 69 6e  2);.    p2 = (in
19960 74 29 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20  t)pIn2->u.i;.   
19970 20 2f 2a 20 54 68 65 20 70 32 20 76 61 6c 75 65   /* The p2 value
19980 20 61 6c 77 61 79 73 20 63 6f 6d 65 73 20 66 72   always comes fr
19990 6f 6d 20 61 20 70 72 69 6f 72 20 4f 50 5f 43 72  om a prior OP_Cr
199a0 65 61 74 65 54 61 62 6c 65 20 6f 70 63 6f 64 65  eateTable opcode
199b0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 61 74   and.    ** that
199c0 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 61 6c 77   opcode will alw
199d0 61 79 73 20 73 65 74 20 74 68 65 20 70 32 20 76  ays set the p2 v
199e0 61 6c 75 65 20 74 6f 20 32 20 6f 72 20 6d 6f 72  alue to 2 or mor
199f0 65 20 6f 72 20 65 6c 73 65 20 66 61 69 6c 2e 0a  e or else fail..
19a00 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
19a10 77 65 72 65 20 61 20 66 61 69 6c 75 72 65 2c 20  were a failure, 
19a20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
19a30 74 65 6d 65 6e 74 20 77 6f 75 6c 64 20 68 61 76  tement would hav
19a40 65 20 68 61 6c 74 65 64 0a 20 20 20 20 2a 2a 20  e halted.    ** 
19a50 62 65 66 6f 72 65 20 72 65 61 63 68 69 6e 67 20  before reaching 
19a60 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
19a70 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56  . */.    if( NEV
19a80 45 52 28 70 32 3c 32 29 20 29 20 7b 0a 20 20 20  ER(p2<2) ) {.   
19a90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
19aa0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
19ab0 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
19ac0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
19ad0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d  }.  }.  if( pOp-
19ae0 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49  >p4type==P4_KEYI
19af0 4e 46 4f 20 29 7b 0a 20 20 20 20 70 4b 65 79 49  NFO ){.    pKeyI
19b00 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  nfo = pOp->p4.pK
19b10 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79  eyInfo;.    pKey
19b20 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  Info->enc = ENC(
19b30 70 2d 3e 64 62 29 3b 0a 20 20 20 20 6e 46 69 65  p->db);.    nFie
19b40 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
19b50 46 69 65 6c 64 2b 31 3b 0a 20 20 7d 65 6c 73 65  Field+1;.  }else
19b60 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
19b70 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20  ==P4_INT32 ){.  
19b80 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e    nField = pOp->
19b90 70 34 2e 69 3b 0a 20 20 7d 0a 20 20 61 73 73 65  p4.i;.  }.  asse
19ba0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29  rt( pOp->p1>=0 )
19bb0 3b 0a 20 20 70 43 75 72 20 3d 20 61 6c 6c 6f 63  ;.  pCur = alloc
19bc0 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70  ateCursor(p, pOp
19bd0 2d 3e 70 31 2c 20 6e 46 69 65 6c 64 2c 20 69 44  ->p1, nField, iD
19be0 62 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 75  b, 1);.  if( pCu
19bf0 72 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  r==0 ) goto no_m
19c00 65 6d 3b 0a 20 20 70 43 75 72 2d 3e 6e 75 6c 6c  em;.  pCur->null
19c10 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 75 72 2d  Row = 1;.  pCur-
19c20 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a  >isOrdered = 1;.
19c30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
19c40 72 65 65 43 75 72 73 6f 72 28 70 58 2c 20 70 32  reeCursor(pX, p2
19c50 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e  , wrFlag, pKeyIn
19c60 66 6f 2c 20 70 43 75 72 2d 3e 70 43 75 72 73 6f  fo, pCur->pCurso
19c70 72 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  r);.  pCur->pKey
19c80 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
19c90 0a 0a 20 20 2f 2a 20 53 69 6e 63 65 20 69 74 20  ..  /* Since it 
19ca0 70 65 72 66 6f 72 6d 73 20 6e 6f 20 6d 65 6d 6f  performs no memo
19cb0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 72  ry allocation or
19cc0 20 49 4f 2c 20 74 68 65 20 6f 6e 6c 79 20 76 61   IO, the only va
19cd0 6c 75 65 20 74 68 61 74 0a 20 20 2a 2a 20 73 71  lue that.  ** sq
19ce0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
19cf0 28 29 20 6d 61 79 20 72 65 74 75 72 6e 20 69 73  () may return is
19d00 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 2a 2f 0a 20   SQLITE_OK. */. 
19d10 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
19d20 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20  ITE_OK );..  /* 
19d30 53 65 74 20 74 68 65 20 56 64 62 65 43 75 72 73  Set the VdbeCurs
19d40 6f 72 2e 69 73 54 61 62 6c 65 20 61 6e 64 20 69  or.isTable and i
19d50 73 49 6e 64 65 78 20 76 61 72 69 61 62 6c 65 73  sIndex variables
19d60 2e 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69  . Previous versi
19d70 6f 6e 73 20 6f 66 0a 20 20 2a 2a 20 53 51 4c 69  ons of.  ** SQLi
19d80 74 65 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  te used to check
19d90 20 69 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   if the root-pag
19da0 65 20 66 6c 61 67 73 20 77 65 72 65 20 73 61 6e  e flags were san
19db0 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 0a  e at this point.
19dc0 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 20    ** and report 
19dd0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
19de0 69 6f 6e 20 69 66 20 74 68 65 79 20 77 65 72 65  ion if they were
19df0 20 6e 6f 74 2c 20 62 75 74 20 74 68 69 73 20 63   not, but this c
19e00 68 65 63 6b 20 68 61 73 0a 20 20 2a 2a 20 73 69  heck has.  ** si
19e10 6e 63 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74  nce moved into t
19e20 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 20  he btree layer. 
19e30 20 2a 2f 20 20 0a 20 20 70 43 75 72 2d 3e 69 73   */  .  pCur->is
19e40 54 61 62 6c 65 20 3d 20 70 4f 70 2d 3e 70 34 74  Table = pOp->p4t
19e50 79 70 65 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 3b  ype!=P4_KEYINFO;
19e60 0a 20 20 70 43 75 72 2d 3e 69 73 49 6e 64 65 78  .  pCur->isIndex
19e70 20 3d 20 21 70 43 75 72 2d 3e 69 73 54 61 62 6c   = !pCur->isTabl
19e80 65 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  e;.  break;.}../
19e90 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 45 70  * Opcode: OpenEp
19ea0 68 65 6d 65 72 61 6c 20 50 31 20 50 32 20 2a 20  hemeral P1 P2 * 
19eb0 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  P4 P5.**.** Open
19ec0 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 50 31   a new cursor P1
19ed0 20 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 20   to a transient 
19ee0 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 63 75  table..** The cu
19ef0 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 20 6f  rsor is always o
19f00 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65  pened read/write
19f10 20 65 76 65 6e 20 69 66 20 0a 2a 2a 20 74 68 65   even if .** the
19f20 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
19f30 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 54 68  s read-only.  Th
19f40 65 20 65 70 68 65 6d 65 72 61 6c 0a 2a 2a 20 74  e ephemeral.** t
19f50 61 62 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20  able is deleted 
19f60 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
19f70 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
19f80 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 50   closed..**.** P
19f90 32 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  2 is the number 
19fa0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
19fb0 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
19fc0 65 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  e..** The cursor
19fd0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 42 54 72   points to a BTr
19fe0 65 65 20 74 61 62 6c 65 20 69 66 20 50 34 3d 3d  ee table if P4==
19ff0 30 20 61 6e 64 20 74 6f 20 61 20 42 54 72 65 65  0 and to a BTree
1a000 20 69 6e 64 65 78 0a 2a 2a 20 69 66 20 50 34 20   index.** if P4 
1a010 69 73 20 6e 6f 74 20 30 2e 20 20 49 66 20 50 34  is not 0.  If P4
1a020 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
1a030 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79   points to a Key
1a040 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
1a050 2a 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  * that defines t
1a060 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 6b 65 79  he format of key
1a070 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  s in the index..
1a080 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
1a090 65 20 77 61 73 20 6f 6e 63 65 20 63 61 6c 6c 65  e was once calle
1a0a0 64 20 4f 70 65 6e 54 65 6d 70 2e 20 20 42 75 74  d OpenTemp.  But
1a0b0 20 74 68 61 74 20 63 72 65 61 74 65 64 0a 2a 2a   that created.**
1a0c0 20 63 6f 6e 66 75 73 69 6f 6e 20 62 65 63 61 75   confusion becau
1a0d0 73 65 20 74 68 65 20 74 65 72 6d 20 22 74 65 6d  se the term "tem
1a0e0 70 20 74 61 62 6c 65 22 2c 20 6d 69 67 68 74 20  p table", might 
1a0f0 72 65 66 65 72 20 65 69 74 68 65 72 0a 2a 2a 20  refer either.** 
1a100 74 6f 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20  to a TEMP table 
1a110 61 74 20 74 68 65 20 53 51 4c 20 6c 65 76 65 6c  at the SQL level
1a120 2c 20 6f 72 20 74 6f 20 61 20 74 61 62 6c 65 20  , or to a table 
1a130 6f 70 65 6e 65 64 20 62 79 0a 2a 2a 20 74 68 69  opened by.** thi
1a140 73 20 6f 70 63 6f 64 65 2e 20 20 54 68 65 6e 20  s opcode.  Then 
1a150 74 68 69 73 20 6f 70 63 6f 64 65 20 77 61 73 20  this opcode was 
1a160 63 61 6c 6c 20 4f 70 65 6e 56 69 72 74 75 61 6c  call OpenVirtual
1a170 2e 20 20 42 75 74 0a 2a 2a 20 74 68 61 74 20 63  .  But.** that c
1a180 72 65 61 74 65 64 20 63 6f 6e 66 75 73 69 6f 6e  reated confusion
1a190 20 77 69 74 68 20 74 68 65 20 77 68 6f 6c 65 20   with the whole 
1a1a0 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 69 64  virtual-table id
1a1b0 65 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35  ea..**.** The P5
1a1c0 20 70 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62   parameter can b
1a1d0 65 20 61 20 6d 61 73 6b 20 6f 66 20 74 68 65 20  e a mask of the 
1a1e0 42 54 52 45 45 5f 2a 20 66 6c 61 67 73 20 64 65  BTREE_* flags de
1a1f0 66 69 6e 65 64 0a 2a 2a 20 69 6e 20 62 74 72 65  fined.** in btre
1a200 65 2e 68 2e 20 20 54 68 65 73 65 20 66 6c 61 67  e.h.  These flag
1a210 73 20 63 6f 6e 74 72 6f 6c 20 61 73 70 65 63 74  s control aspect
1a220 73 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 69  s of the operati
1a230 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 62 74 72  on of.** the btr
1a240 65 65 2e 20 20 54 68 65 20 42 54 52 45 45 5f 4f  ee.  The BTREE_O
1a250 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20  MIT_JOURNAL and 
1a260 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 66 6c 61  BTREE_SINGLE fla
1a270 67 73 20 61 72 65 0a 2a 2a 20 61 64 64 65 64 20  gs are.** added 
1a280 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a  automatically..*
1a290 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65  /./* Opcode: Ope
1a2a0 6e 41 75 74 6f 69 6e 64 65 78 20 50 31 20 50 32  nAutoindex P1 P2
1a2b0 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68   * P4 *.**.** Th
1a2c0 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20  is opcode works 
1a2d0 74 68 65 20 73 61 6d 65 20 61 73 20 4f 50 5f 4f  the same as OP_O
1a2e0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2e 20 20 49  penEphemeral.  I
1a2f0 74 20 68 61 73 20 61 0a 2a 2a 20 64 69 66 66 65  t has a.** diffe
1a300 72 65 6e 74 20 6e 61 6d 65 20 74 6f 20 64 69 73  rent name to dis
1a310 74 69 6e 67 75 69 73 68 20 69 74 73 20 75 73 65  tinguish its use
1a320 2e 20 20 54 61 62 6c 65 73 20 63 72 65 61 74 65  .  Tables create
1a330 64 20 75 73 69 6e 67 0a 2a 2a 20 62 79 20 74 68  d using.** by th
1a340 69 73 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62  is opcode will b
1a350 65 20 75 73 65 64 20 66 6f 72 20 61 75 74 6f 6d  e used for autom
1a360 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
1a370 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 69 6e   transient.** in
1a380 64 69 63 65 73 20 69 6e 20 6a 6f 69 6e 73 2e 0a  dices in joins..
1a390 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 41  */.case OP_OpenA
1a3a0 75 74 6f 69 6e 64 65 78 3a 20 0a 63 61 73 65 20  utoindex: .case 
1a3b0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1a3c0 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
1a3d0 20 2a 70 43 78 3b 0a 20 20 73 74 61 74 69 63 20   *pCx;.  static 
1a3e0 63 6f 6e 73 74 20 69 6e 74 20 76 66 73 46 6c 61  const int vfsFla
1a3f0 67 73 20 3d 20 0a 20 20 20 20 20 20 53 51 4c 49  gs = .      SQLI
1a400 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1a410 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45  E |.      SQLITE
1a420 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
1a430 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1a440 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
1a450 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
1a460 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
1a470 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1a480 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 3b 0a 0a  _TRANSIENT_DB;..
1a490 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1a4a0 31 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20 3d 20  1>=0 );.  pCx = 
1a4b0 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70  allocateCursor(p
1a4c0 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
1a4d0 70 32 2c 20 2d 31 2c 20 31 29 3b 0a 20 20 69 66  p2, -1, 1);.  if
1a4e0 28 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20  ( pCx==0 ) goto 
1a4f0 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e  no_mem;.  pCx->n
1a500 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 63  ullRow = 1;.  rc
1a510 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f   = sqlite3BtreeO
1a520 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c  pen(db->pVfs, 0,
1a530 20 64 62 2c 20 26 70 43 78 2d 3e 70 42 74 2c 20   db, &pCx->pBt, 
1a540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a550 20 20 20 20 20 20 20 20 20 42 54 52 45 45 5f 4f           BTREE_O
1a560 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 7c 20 42 54  MIT_JOURNAL | BT
1a570 52 45 45 5f 53 49 4e 47 4c 45 20 7c 20 70 4f 70  REE_SINGLE | pOp
1a580 2d 3e 70 35 2c 20 76 66 73 46 6c 61 67 73 29 3b  ->p5, vfsFlags);
1a590 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1a5a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1a5b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
1a5c0 69 6e 54 72 61 6e 73 28 70 43 78 2d 3e 70 42 74  inTrans(pCx->pBt
1a5d0 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 1);.  }.  if( 
1a5e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a5f0 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 72 61  .    /* If a tra
1a600 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 69 73 20  nsient index is 
1a610 72 65 71 75 69 72 65 64 2c 20 63 72 65 61 74 65  required, create
1a620 20 69 74 20 62 79 20 63 61 6c 6c 69 6e 67 0a 20   it by calling. 
1a630 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72     ** sqlite3Btr
1a640 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 20  eeCreateTable() 
1a650 77 69 74 68 20 74 68 65 20 42 54 52 45 45 5f 42  with the BTREE_B
1a660 4c 4f 42 4b 45 59 20 66 6c 61 67 20 62 65 66 6f  LOBKEY flag befo
1a670 72 65 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  re.    ** openin
1a680 67 20 69 74 2e 20 49 66 20 61 20 74 72 61 6e 73  g it. If a trans
1a690 69 65 6e 74 20 74 61 62 6c 65 20 69 73 20 72 65  ient table is re
1a6a0 71 75 69 72 65 64 2c 20 6a 75 73 74 20 75 73 65  quired, just use
1a6b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 61 75 74 6f   the.    ** auto
1a6c0 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65  matically create
1a6d0 64 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  d table with roo
1a6e0 74 2d 70 61 67 65 20 31 20 28 61 6e 20 42 4c 4f  t-page 1 (an BLO
1a6f0 42 5f 49 4e 54 4b 45 59 20 74 61 62 6c 65 29 2e  B_INTKEY table).
1a700 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1a710 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
1a720 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 67   ){.      int pg
1a730 6e 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  no;.      assert
1a740 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
1a750 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20 20  4_KEYINFO );.   
1a760 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1a770 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
1a780 70 43 78 2d 3e 70 42 74 2c 20 26 70 67 6e 6f 2c  pCx->pBt, &pgno,
1a790 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 20 7c   BTREE_BLOBKEY |
1a7a0 20 70 4f 70 2d 3e 70 35 29 3b 20 0a 20 20 20 20   pOp->p5); .    
1a7b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a7c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
1a7d0 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d 4d 41 53  ssert( pgno==MAS
1a7e0 54 45 52 5f 52 4f 4f 54 2b 31 20 29 3b 0a 20 20  TER_ROOT+1 );.  
1a7f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1a800 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 70 43  e3BtreeCursor(pC
1a810 78 2d 3e 70 42 74 2c 20 70 67 6e 6f 2c 20 31 2c  x->pBt, pgno, 1,
1a820 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a840 20 20 28 4b 65 79 49 6e 66 6f 2a 29 70 4f 70 2d    (KeyInfo*)pOp-
1a850 3e 70 34 2e 7a 2c 20 70 43 78 2d 3e 70 43 75 72  >p4.z, pCx->pCur
1a860 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 70 43  sor);.        pC
1a870 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f  x->pKeyInfo = pO
1a880 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
1a890 20 20 20 20 20 20 20 20 70 43 78 2d 3e 70 4b 65          pCx->pKe
1a8a0 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43  yInfo->enc = ENC
1a8b0 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 7d  (p->db);.      }
1a8c0 0a 20 20 20 20 20 20 70 43 78 2d 3e 69 73 54 61  .      pCx->isTa
1a8d0 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ble = 0;.    }el
1a8e0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
1a8f0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1a900 72 28 70 43 78 2d 3e 70 42 74 2c 20 4d 41 53 54  r(pCx->pBt, MAST
1a910 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 30 2c 20 70  ER_ROOT, 1, 0, p
1a920 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20  Cx->pCursor);.  
1a930 20 20 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65      pCx->isTable
1a940 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
1a950 20 20 70 43 78 2d 3e 69 73 4f 72 64 65 72 65 64    pCx->isOrdered
1a960 20 3d 20 28 70 4f 70 2d 3e 70 35 21 3d 42 54 52   = (pOp->p5!=BTR
1a970 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
1a980 20 70 43 78 2d 3e 69 73 49 6e 64 65 78 20 3d 20   pCx->isIndex = 
1a990 21 70 43 78 2d 3e 69 73 54 61 62 6c 65 3b 0a 20  !pCx->isTable;. 
1a9a0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
1a9b0 63 6f 64 65 3a 20 4f 70 65 6e 53 6f 72 74 65 72  code: OpenSorter
1a9c0 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a   P1 P2 * P4 *.**
1a9d0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
1a9e0 77 6f 72 6b 73 20 6c 69 6b 65 20 4f 50 5f 4f 70  works like OP_Op
1a9f0 65 6e 45 70 68 65 6d 65 72 61 6c 20 65 78 63 65  enEphemeral exce
1aa00 70 74 20 74 68 61 74 20 69 74 20 6f 70 65 6e 73  pt that it opens
1aa10 0a 2a 2a 20 61 20 74 72 61 6e 73 69 65 6e 74 20  .** a transient 
1aa20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 73 70  index that is sp
1aa30 65 63 69 66 69 63 61 6c 6c 79 20 64 65 73 69 67  ecifically desig
1aa40 6e 65 64 20 74 6f 20 73 6f 72 74 20 6c 61 72 67  ned to sort larg
1aa50 65 0a 2a 2a 20 74 61 62 6c 65 73 20 75 73 69 6e  e.** tables usin
1aa60 67 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 6d 65  g an external me
1aa70 72 67 65 2d 73 6f 72 74 20 61 6c 67 6f 72 69 74  rge-sort algorit
1aa80 68 6d 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  hm..*/.case OP_S
1aa90 6f 72 74 65 72 4f 70 65 6e 3a 20 7b 0a 20 20 56  orterOpen: {.  V
1aaa0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a  dbeCursor *pCx;.
1aab0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1aac0 4d 49 54 5f 4d 45 52 47 45 5f 53 4f 52 54 0a 20  MIT_MERGE_SORT. 
1aad0 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65 43   pCx = allocateC
1aae0 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31  ursor(p, pOp->p1
1aaf0 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d 31 2c 20 31  , pOp->p2, -1, 1
1ab00 29 3b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20  );.  if( pCx==0 
1ab10 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
1ab20 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d   pCx->pKeyInfo =
1ab30 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
1ab40 6f 3b 0a 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e  o;.  pCx->pKeyIn
1ab50 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 70 2d  fo->enc = ENC(p-
1ab60 3e 64 62 29 3b 0a 20 20 70 43 78 2d 3e 69 73 53  >db);.  pCx->isS
1ab70 6f 72 74 65 72 20 3d 20 31 3b 0a 20 20 72 63 20  orter = 1;.  rc 
1ab80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72  = sqlite3VdbeSor
1ab90 74 65 72 49 6e 69 74 28 64 62 2c 20 70 43 78 29  terInit(db, pCx)
1aba0 3b 0a 23 65 6c 73 65 0a 20 20 70 4f 70 2d 3e 6f  ;.#else.  pOp->o
1abb0 70 63 6f 64 65 20 3d 20 4f 50 5f 4f 70 65 6e 45  pcode = OP_OpenE
1abc0 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70 63 2d 2d  phemeral;.  pc--
1abd0 3b 0a 23 65 6e 64 69 66 0a 20 20 62 72 65 61 6b  ;.#endif.  break
1abe0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1abf0 4f 70 65 6e 50 73 65 75 64 6f 20 50 31 20 50 32  OpenPseudo P1 P2
1ac00 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70   P3 * *.**.** Op
1ac10 65 6e 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  en a new cursor 
1ac20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  that points to a
1ac30 20 66 61 6b 65 20 74 61 62 6c 65 20 74 68 61 74   fake table that
1ac40 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67   contains a sing
1ac50 6c 65 0a 2a 2a 20 72 6f 77 20 6f 66 20 64 61 74  le.** row of dat
1ac60 61 2e 20 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  a.  The content 
1ac70 6f 66 20 74 68 61 74 20 6f 6e 65 20 72 6f 77 20  of that one row 
1ac80 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  in the content o
1ac90 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69  f memory.** regi
1aca0 73 74 65 72 20 50 32 2e 20 20 49 6e 20 6f 74 68  ster P2.  In oth
1acb0 65 72 20 77 6f 72 64 73 2c 20 63 75 72 73 6f 72  er words, cursor
1acc0 20 50 31 20 62 65 63 6f 6d 65 73 20 61 6e 20 61   P1 becomes an a
1acd0 6c 69 61 73 20 66 6f 72 20 74 68 65 20 0a 2a 2a  lias for the .**
1ace0 20 4d 45 4d 5f 42 6c 6f 62 20 63 6f 6e 74 65 6e   MEM_Blob conten
1acf0 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 72  t contained in r
1ad00 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
1ad10 2a 20 41 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  * A pseudo-table
1ad20 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
1ad30 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
1ad40 74 6f 20 68 6f 6c 64 20 61 20 73 69 6e 67 6c 65  to hold a single
1ad50 0a 2a 2a 20 72 6f 77 20 6f 75 74 70 75 74 20 66  .** row output f
1ad60 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 73  rom the sorter s
1ad70 6f 20 74 68 61 74 20 74 68 65 20 72 6f 77 20 63  o that the row c
1ad80 61 6e 20 62 65 20 64 65 63 6f 6d 70 6f 73 65 64  an be decomposed
1ad90 20 69 6e 74 6f 0a 2a 2a 20 69 6e 64 69 76 69 64   into.** individ
1ada0 75 61 6c 20 63 6f 6c 75 6d 6e 73 20 75 73 69 6e  ual columns usin
1adb0 67 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  g the OP_Column 
1adc0 6f 70 63 6f 64 65 2e 20 20 54 68 65 20 4f 50 5f  opcode.  The OP_
1add0 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 0a 2a 2a  Column opcode.**
1ade0 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 63 75 72   is the only cur
1adf0 73 6f 72 20 6f 70 63 6f 64 65 20 74 68 61 74 20  sor opcode that 
1ae00 77 6f 72 6b 73 20 77 69 74 68 20 61 20 70 73 65  works with a pse
1ae10 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  udo-table..**.**
1ae20 20 50 33 20 69 73 20 74 68 65 20 6e 75 6d 62 65   P3 is the numbe
1ae30 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74  r of fields in t
1ae40 68 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  he records that 
1ae50 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 62  will be stored b
1ae60 79 0a 2a 2a 20 74 68 65 20 70 73 65 75 64 6f 2d  y.** the pseudo-
1ae70 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  table..*/.case O
1ae80 50 5f 4f 70 65 6e 50 73 65 75 64 6f 3a 20 7b 0a  P_OpenPseudo: {.
1ae90 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
1aea0 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  x;..  assert( pO
1aeb0 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 70 43  p->p1>=0 );.  pC
1aec0 78 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  x = allocateCurs
1aed0 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  or(p, pOp->p1, p
1aee0 4f 70 2d 3e 70 33 2c 20 2d 31 2c 20 30 29 3b 0a  Op->p3, -1, 0);.
1aef0 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20 67    if( pCx==0 ) g
1af00 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43  oto no_mem;.  pC
1af10 78 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  x->nullRow = 1;.
1af20 20 20 70 43 78 2d 3e 70 73 65 75 64 6f 54 61 62    pCx->pseudoTab
1af30 6c 65 52 65 67 20 3d 20 70 4f 70 2d 3e 70 32 3b  leReg = pOp->p2;
1af40 0a 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 20  .  pCx->isTable 
1af50 3d 20 31 3b 0a 20 20 70 43 78 2d 3e 69 73 49 6e  = 1;.  pCx->isIn
1af60 64 65 78 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b  dex = 0;.  break
1af70 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1af80 43 6c 6f 73 65 20 50 31 20 2a 20 2a 20 2a 20 2a  Close P1 * * * *
1af90 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  .**.** Close a c
1afa0 75 72 73 6f 72 20 70 72 65 76 69 6f 75 73 6c 79  ursor previously
1afb0 20 6f 70 65 6e 65 64 20 61 73 20 50 31 2e 20 20   opened as P1.  
1afc0 49 66 20 50 31 20 69 73 20 6e 6f 74 0a 2a 2a 20  If P1 is not.** 
1afd0 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20  currently open, 
1afe0 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
1aff0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1b000 63 61 73 65 20 4f 50 5f 43 6c 6f 73 65 3a 20 7b  case OP_Close: {
1b010 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1b020 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
1b030 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
1b040 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
1b050 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43  Cursor(p, p->apC
1b060 73 72 5b 70 4f 70 2d 3e 70 31 5d 29 3b 0a 20 20  sr[pOp->p1]);.  
1b070 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
1b080 5d 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a  ] = 0;.  break;.
1b090 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65  }../* Opcode: Se
1b0a0 65 6b 47 65 20 50 31 20 50 32 20 50 33 20 50 34  ekGe P1 P2 P3 P4
1b0b0 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73   *.**.** If curs
1b0c0 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f 20  or P1 refers to 
1b0d0 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d  an SQL table (B-
1b0e0 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20 69  Tree that uses i
1b0f0 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a  nteger keys), .*
1b100 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20  * use the value 
1b110 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 61  in register P3 a
1b120 73 20 74 68 65 20 6b 65 79 2e 20 20 49 66 20 63  s the key.  If c
1b130 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73 20  ursor P1 refers 
1b140 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e  .** to an SQL in
1b150 64 65 78 2c 20 74 68 65 6e 20 50 33 20 69 73 20  dex, then P3 is 
1b160 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
1b170 61 72 72 61 79 20 6f 66 20 50 34 20 72 65 67 69  array of P4 regi
1b180 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 61  sters .** that a
1b190 72 65 20 75 73 65 64 20 61 73 20 61 6e 20 75 6e  re used as an un
1b1a0 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
1b1b0 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74  . .**.** Reposit
1b1c0 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 73 6f  ion cursor P1 so
1b1d0 20 74 68 61 74 20 20 69 74 20 70 6f 69 6e 74 73   that  it points
1b1e0 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74   to the smallest
1b1f0 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20   entry that .** 
1b200 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1b210 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
1b220 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68  key value. If th
1b230 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72  ere are no recor
1b240 64 73 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74  ds .** greater t
1b250 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1b260 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69  the key and P2 i
1b270 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
1b280 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a   jump to P2..**.
1b290 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
1b2a0 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69  nd, NotFound, Di
1b2b0 73 74 69 6e 63 74 2c 20 53 65 65 6b 4c 74 2c 20  stinct, SeekLt, 
1b2c0 53 65 65 6b 47 74 2c 20 53 65 65 6b 4c 65 0a 2a  SeekGt, SeekLe.*
1b2d0 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65  /./* Opcode: See
1b2e0 6b 47 74 20 50 31 20 50 32 20 50 33 20 50 34 20  kGt P1 P2 P3 P4 
1b2f0 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f  *.**.** If curso
1b300 72 20 50 31 20 72 65 66 65 72 73 20 74 6f 20 61  r P1 refers to a
1b310 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54  n SQL table (B-T
1b320 72 65 65 20 74 68 61 74 20 75 73 65 73 20 69 6e  ree that uses in
1b330 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a  teger keys), .**
1b340 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 69   use the value i
1b350 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 61 73  n register P3 as
1b360 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73 6f   a key. If curso
1b370 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20  r P1 refers .** 
1b380 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c  to an SQL index,
1b390 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20   then P3 is the 
1b3a0 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61  first in an arra
1b3b0 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72  y of P4 register
1b3c0 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75  s .** that are u
1b3d0 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b  sed as an unpack
1b3e0 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a  ed index key. .*
1b3f0 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20  *.** Reposition 
1b400 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61  cursor P1 so tha
1b410 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  t  it points to 
1b420 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74  the smallest ent
1b430 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 67  ry that .** is g
1b440 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
1b450 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68  key value. If th
1b460 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72  ere are no recor
1b470 64 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ds greater than 
1b480 0a 2a 2a 20 74 68 65 20 6b 65 79 20 61 6e 64 20  .** the key and 
1b490 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  P2 is not zero, 
1b4a0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e  then jump to P2.
1b4b0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
1b4c0 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64   Found, NotFound
1b4d0 2c 20 44 69 73 74 69 6e 63 74 2c 20 53 65 65 6b  , Distinct, Seek
1b4e0 4c 74 2c 20 53 65 65 6b 47 65 2c 20 53 65 65 6b  Lt, SeekGe, Seek
1b4f0 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  Le.*/./* Opcode:
1b500 20 53 65 65 6b 4c 74 20 50 31 20 50 32 20 50 33   SeekLt P1 P2 P3
1b510 20 50 34 20 2a 20 0a 2a 2a 0a 2a 2a 20 49 66 20   P4 * .**.** If 
1b520 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73  cursor P1 refers
1b530 20 74 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c 65   to an SQL table
1b540 20 28 42 2d 54 72 65 65 20 74 68 61 74 20 75 73   (B-Tree that us
1b550 65 73 20 69 6e 74 65 67 65 72 20 6b 65 79 73 29  es integer keys)
1b560 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65 20 76 61  , .** use the va
1b570 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
1b580 50 33 20 61 73 20 61 20 6b 65 79 2e 20 49 66 20  P3 as a key. If 
1b590 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73  cursor P1 refers
1b5a0 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69   .** to an SQL i
1b5b0 6e 64 65 78 2c 20 74 68 65 6e 20 50 33 20 69 73  ndex, then P3 is
1b5c0 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e   the first in an
1b5d0 20 61 72 72 61 79 20 6f 66 20 50 34 20 72 65 67   array of P4 reg
1b5e0 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20  isters .** that 
1b5f0 61 72 65 20 75 73 65 64 20 61 73 20 61 6e 20 75  are used as an u
1b600 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
1b610 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69  y. .**.** Reposi
1b620 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 73  tion cursor P1 s
1b630 6f 20 74 68 61 74 20 20 69 74 20 70 6f 69 6e 74  o that  it point
1b640 73 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74  s to the largest
1b650 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20   entry that .** 
1b660 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  is less than the
1b670 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74   key value. If t
1b680 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f  here are no reco
1b690 72 64 73 20 6c 65 73 73 20 74 68 61 6e 20 0a 2a  rds less than .*
1b6a0 2a 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32  * the key and P2
1b6b0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
1b6c0 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a  en jump to P2..*
1b6d0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46  *.** See also: F
1b6e0 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20  ound, NotFound, 
1b6f0 44 69 73 74 69 6e 63 74 2c 20 53 65 65 6b 47 74  Distinct, SeekGt
1b700 2c 20 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c 65  , SeekGe, SeekLe
1b710 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .*/./* Opcode: S
1b720 65 65 6b 4c 65 20 50 31 20 50 32 20 50 33 20 50  eekLe P1 P2 P3 P
1b730 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72  4 *.**.** If cur
1b740 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f  sor P1 refers to
1b750 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42   an SQL table (B
1b760 2d 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20  -Tree that uses 
1b770 69 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a  integer keys), .
1b780 2a 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65  ** use the value
1b790 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20   in register P3 
1b7a0 61 73 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72  as a key. If cur
1b7b0 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a  sor P1 refers .*
1b7c0 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  * to an SQL inde
1b7d0 78 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68  x, then P3 is th
1b7e0 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
1b7f0 72 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74  ray of P4 regist
1b800 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65  ers .** that are
1b810 20 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61   used as an unpa
1b820 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20  cked index key. 
1b830 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f  .**.** Repositio
1b840 6e 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74  n cursor P1 so t
1b850 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
1b860 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74   the largest ent
1b870 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 6c  ry that .** is l
1b880 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
1b890 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c  l to the key val
1b8a0 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ue. If there are
1b8b0 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20   no records .** 
1b8c0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
1b8d0 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 61 6e  al to the key an
1b8e0 64 20 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f  d P2 is not zero
1b8f0 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50  , then jump to P
1b900 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  2..**.** See als
1b910 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75  o: Found, NotFou
1b920 6e 64 2c 20 44 69 73 74 69 6e 63 74 2c 20 53 65  nd, Distinct, Se
1b930 65 6b 47 74 2c 20 53 65 65 6b 47 65 2c 20 53 65  ekGt, SeekGe, Se
1b940 65 6b 4c 74 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ekLt.*/.case OP_
1b950 53 65 65 6b 4c 74 3a 20 20 20 20 20 20 20 20 20  SeekLt:         
1b960 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a  /* jump, in3 */.
1b970 63 61 73 65 20 4f 50 5f 53 65 65 6b 4c 65 3a 20  case OP_SeekLe: 
1b980 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
1b990 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in3 */.case OP_
1b9a0 53 65 65 6b 47 65 3a 20 20 20 20 20 20 20 20 20  SeekGe:         
1b9b0 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a  /* jump, in3 */.
1b9c0 63 61 73 65 20 4f 50 5f 53 65 65 6b 47 74 3a 20  case OP_SeekGt: 
1b9d0 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c  {       /* jump,
1b9e0 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 72 65   in3 */.  int re
1b9f0 73 3b 0a 20 20 69 6e 74 20 6f 63 3b 0a 20 20 56  s;.  int oc;.  V
1ba00 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
1ba10 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1ba20 72 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  r;.  int nField;
1ba30 0a 20 20 69 36 34 20 69 4b 65 79 3b 20 20 20 20  .  i64 iKey;    
1ba40 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 77    /* The rowid w
1ba50 65 20 61 72 65 20 74 6f 20 73 65 65 6b 20 74 6f  e are to seek to
1ba60 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1ba70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
1ba80 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
1ba90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
1baa0 2d 3e 70 32 21 3d 30 20 29 3b 0a 20 20 70 43 20  ->p2!=0 );.  pC 
1bab0 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
1bac0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
1bad0 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
1bae0 28 20 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c  ( pC->pseudoTabl
1baf0 65 52 65 67 3d 3d 30 20 29 3b 0a 20 20 61 73 73  eReg==0 );.  ass
1bb00 65 72 74 28 20 4f 50 5f 53 65 65 6b 4c 65 20 3d  ert( OP_SeekLe =
1bb10 3d 20 4f 50 5f 53 65 65 6b 4c 74 2b 31 20 29 3b  = OP_SeekLt+1 );
1bb20 0a 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65  .  assert( OP_Se
1bb30 65 6b 47 65 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c  ekGe == OP_SeekL
1bb40 74 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t+2 );.  assert(
1bb50 20 4f 50 5f 53 65 65 6b 47 74 20 3d 3d 20 4f 50   OP_SeekGt == OP
1bb60 5f 53 65 65 6b 4c 74 2b 33 20 29 3b 0a 20 20 61  _SeekLt+3 );.  a
1bb70 73 73 65 72 74 28 20 70 43 2d 3e 69 73 4f 72 64  ssert( pC->isOrd
1bb80 65 72 65 64 20 29 3b 0a 20 20 69 66 28 20 41 4c  ered );.  if( AL
1bb90 57 41 59 53 28 70 43 2d 3e 70 43 75 72 73 6f 72  WAYS(pC->pCursor
1bba0 21 3d 30 29 20 29 7b 0a 20 20 20 20 6f 63 20 3d  !=0) ){.    oc =
1bbb0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pOp->opcode;.  
1bbc0 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20    pC->nullRow = 
1bbd0 30 3b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 69  0;.    if( pC->i
1bbe0 73 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  sTable ){.      
1bbf0 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 76 61 6c  /* The input val
1bc00 75 65 20 69 6e 20 50 33 20 6d 69 67 68 74 20 62  ue in P3 might b
1bc10 65 20 6f 66 20 61 6e 79 20 74 79 70 65 3a 20 69  e of any type: i
1bc20 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73 74  nteger, real, st
1bc30 72 69 6e 67 2c 0a 20 20 20 20 20 20 2a 2a 20 62  ring,.      ** b
1bc40 6c 6f 62 2c 20 6f 72 20 4e 55 4c 4c 2e 20 20 42  lob, or NULL.  B
1bc50 75 74 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  ut it needs to b
1bc60 65 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65 66  e an integer bef
1bc70 6f 72 65 20 77 65 20 63 61 6e 20 64 6f 0a 20 20  ore we can do.  
1bc80 20 20 20 20 2a 2a 20 74 68 65 20 73 65 65 6b 2c      ** the seek,
1bc90 20 73 6f 20 63 6f 76 65 72 74 20 69 74 2e 20 2a   so covert it. *
1bca0 2f 0a 20 20 20 20 20 20 70 49 6e 33 20 3d 20 26  /.      pIn3 = &
1bcb0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
1bcc0 20 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69       applyNumeri
1bcd0 63 41 66 66 69 6e 69 74 79 28 70 49 6e 33 29 3b  cAffinity(pIn3);
1bce0 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 73 71  .      iKey = sq
1bcf0 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
1bd00 65 28 70 49 6e 33 29 3b 0a 20 20 20 20 20 20 70  e(pIn3);.      p
1bd10 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  C->rowidIsValid 
1bd20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  = 0;..      /* I
1bd30 66 20 74 68 65 20 50 33 20 76 61 6c 75 65 20 63  f the P3 value c
1bd40 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6f 6e 76  ould not be conv
1bd50 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e  erted into an in
1bd60 74 65 67 65 72 20 77 69 74 68 6f 75 74 0a 20 20  teger without.  
1bd70 20 20 20 20 2a 2a 20 6c 6f 73 73 20 6f 66 20 69      ** loss of i
1bd80 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20 74 68 65 6e  nformation, then
1bd90 20 73 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73   special process
1bda0 69 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2e  ing is required.
1bdb0 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .. */.      if( 
1bdc0 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn3->flags & M
1bdd0 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20  EM_Int)==0 ){.  
1bde0 20 20 20 20 20 20 69 66 28 20 28 70 49 6e 33 2d        if( (pIn3-
1bdf0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
1be00 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
1be10 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 33 20     /* If the P3 
1be20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20  value cannot be 
1be30 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
1be40 6e 79 20 6b 69 6e 64 20 6f 66 20 61 20 6e 75 6d  ny kind of a num
1be50 62 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 2a  ber,.          *
1be60 2a 20 74 68 65 6e 20 74 68 65 20 73 65 65 6b 20  * then the seek 
1be70 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c  is not possible,
1be80 20 73 6f 20 6a 75 6d 70 20 74 6f 20 50 32 20 2a   so jump to P2 *
1be90 2f 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d  /.          pc =
1bea0 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
1beb0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1bec0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1bed0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
1bee0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
1bef0 20 74 68 65 20 50 33 20 76 61 6c 75 65 20 6d 75   the P3 value mu
1bf00 73 74 20 62 65 20 61 20 66 6c 6f 61 74 69 6e 67  st be a floating
1bf10 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e  .        ** poin
1bf20 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20  t number. */.   
1bf30 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 49       assert( (pI
1bf40 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n3->flags & MEM_
1bf50 52 65 61 6c 29 21 3d 30 20 29 3b 0a 0a 20 20 20  Real)!=0 );..   
1bf60 20 20 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 53       if( iKey==S
1bf70 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 26 26  MALLEST_INT64 &&
1bf80 20 28 70 49 6e 33 2d 3e 72 3c 28 64 6f 75 62 6c   (pIn3->r<(doubl
1bf90 65 29 69 4b 65 79 20 7c 7c 20 70 49 6e 33 2d 3e  e)iKey || pIn3->
1bfa0 72 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  r>0) ){.        
1bfb0 20 20 2f 2a 20 54 68 65 20 50 33 20 76 61 6c 75    /* The P3 valu
1bfc0 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 69  e is too large i
1bfd0 6e 20 6d 61 67 6e 69 74 75 64 65 20 74 6f 20 62  n magnitude to b
1bfe0 65 20 65 78 70 72 65 73 73 65 64 20 61 73 20 61  e expressed as a
1bff0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  n.          ** i
1c000 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
1c010 20 20 20 20 20 72 65 73 20 3d 20 31 3b 0a 20 20       res = 1;.  
1c020 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 33          if( pIn3
1c030 2d 3e 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ->r<0 ){.       
1c040 20 20 20 20 20 69 66 28 20 6f 63 3e 3d 4f 50 5f       if( oc>=OP_
1c050 53 65 65 6b 47 65 20 29 7b 20 20 61 73 73 65 72  SeekGe ){  asser
1c060 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 65  t( oc==OP_SeekGe
1c070 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47   || oc==OP_SeekG
1c080 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t );.           
1c090 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1c0a0 74 72 65 65 46 69 72 73 74 28 70 43 2d 3e 70 43  treeFirst(pC->pC
1c0b0 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20  ursor, &res);.  
1c0c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1c0d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1c0e0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
1c0f0 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  o_error;.       
1c100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1c110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c120 20 20 20 20 69 66 28 20 6f 63 3c 3d 4f 50 5f 53      if( oc<=OP_S
1c130 65 65 6b 4c 65 20 29 7b 20 20 61 73 73 65 72 74  eekLe ){  assert
1c140 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20  ( oc==OP_SeekLt 
1c150 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65  || oc==OP_SeekLe
1c160 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1c170 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1c180 72 65 65 4c 61 73 74 28 70 43 2d 3e 70 43 75 72  reeLast(pC->pCur
1c190 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  sor, &res);.    
1c1a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1c1b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1c1c0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1c1d0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  error;.         
1c1e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1c1f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1c200 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
1c210 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
1c220 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
1c230 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c240 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1c250 66 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74  f( oc==OP_SeekLt
1c260 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47   || oc==OP_SeekG
1c270 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  e ){.          /
1c280 2a 20 55 73 65 20 74 68 65 20 63 65 69 6c 69 6e  * Use the ceilin
1c290 67 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  g() function to 
1c2a0 63 6f 6e 76 65 72 74 20 72 65 61 6c 2d 3e 69 6e  convert real->in
1c2b0 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  t */.          i
1c2c0 66 28 20 70 49 6e 33 2d 3e 72 20 3e 20 28 64 6f  f( pIn3->r > (do
1c2d0 75 62 6c 65 29 69 4b 65 79 20 29 20 69 4b 65 79  uble)iKey ) iKey
1c2e0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
1c2f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1c300 55 73 65 20 74 68 65 20 66 6c 6f 6f 72 28 29 20  Use the floor() 
1c310 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 6f 6e 76  function to conv
1c320 65 72 74 20 72 65 61 6c 2d 3e 69 6e 74 20 2a 2f  ert real->int */
1c330 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1c340 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65  t( oc==OP_SeekLe
1c350 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47   || oc==OP_SeekG
1c360 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  t );.          i
1c370 66 28 20 70 49 6e 33 2d 3e 72 20 3c 20 28 64 6f  f( pIn3->r < (do
1c380 75 62 6c 65 29 69 4b 65 79 20 29 20 69 4b 65 79  uble)iKey ) iKey
1c390 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  --;.        }.  
1c3a0 20 20 20 20 7d 20 0a 20 20 20 20 20 20 72 63 20      } .      rc 
1c3b0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
1c3c0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d  vetoUnpacked(pC-
1c3d0 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 36  >pCursor, 0, (u6
1c3e0 34 29 69 4b 65 79 2c 20 30 2c 20 26 72 65 73 29  4)iKey, 0, &res)
1c3f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1c400 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c410 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
1c420 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
1c430 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c440 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
1c450 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c    pC->rowidIsVal
1c460 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  id = 1;.        
1c470 70 43 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  pC->lastRowid = 
1c480 69 4b 65 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iKey;.      }.  
1c490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
1c4a0 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 34 2e  Field = pOp->p4.
1c4b0 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  i;.      assert(
1c4c0 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
1c4d0 5f 49 4e 54 33 32 20 29 3b 0a 20 20 20 20 20 20  _INT32 );.      
1c4e0 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 3e 30  assert( nField>0
1c4f0 20 29 3b 0a 20 20 20 20 20 20 72 2e 70 4b 65 79   );.      r.pKey
1c500 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49  Info = pC->pKeyI
1c510 6e 66 6f 3b 0a 20 20 20 20 20 20 72 2e 6e 46 69  nfo;.      r.nFi
1c520 65 6c 64 20 3d 20 28 75 31 36 29 6e 46 69 65 6c  eld = (u16)nFiel
1c530 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  d;..      /* The
1c540 20 6e 65 78 74 20 6c 69 6e 65 20 6f 66 20 63 6f   next line of co
1c550 64 65 20 63 6f 6d 70 75 74 65 73 20 61 73 20 66  de computes as f
1c560 6f 6c 6c 6f 77 73 2c 20 6f 6e 6c 79 20 66 61 73  ollows, only fas
1c570 74 65 72 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20  ter:.      **   
1c580 69 66 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47  if( oc==OP_SeekG
1c590 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  t || oc==OP_Seek
1c5a0 4c 65 20 29 7b 0a 20 20 20 20 20 20 2a 2a 20 20  Le ){.      **  
1c5b0 20 20 20 72 2e 66 6c 61 67 73 20 3d 20 55 4e 50     r.flags = UNP
1c5c0 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 3b 0a 20  ACKED_INCRKEY;. 
1c5d0 20 20 20 20 20 2a 2a 20 20 20 7d 65 6c 73 65 7b       **   }else{
1c5e0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 72 2e  .      **     r.
1c5f0 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20  flags = 0;.     
1c600 20 2a 2a 20 20 20 7d 0a 20 20 20 20 20 20 2a 2f   **   }.      */
1c610 0a 20 20 20 20 20 20 72 2e 66 6c 61 67 73 20 3d  .      r.flags =
1c620 20 28 75 31 36 29 28 55 4e 50 41 43 4b 45 44 5f   (u16)(UNPACKED_
1c630 49 4e 43 52 4b 45 59 20 2a 20 28 31 20 26 20 28  INCRKEY * (1 & (
1c640 6f 63 20 2d 20 4f 50 5f 53 65 65 6b 4c 74 29 29  oc - OP_SeekLt))
1c650 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1c660 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 47 74 20 7c   oc!=OP_SeekGt |
1c670 7c 20 72 2e 66 6c 61 67 73 3d 3d 55 4e 50 41 43  | r.flags==UNPAC
1c680 4b 45 44 5f 49 4e 43 52 4b 45 59 20 29 3b 0a 20  KED_INCRKEY );. 
1c690 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 21       assert( oc!
1c6a0 3d 4f 50 5f 53 65 65 6b 4c 65 20 7c 7c 20 72 2e  =OP_SeekLe || r.
1c6b0 66 6c 61 67 73 3d 3d 55 4e 50 41 43 4b 45 44 5f  flags==UNPACKED_
1c6c0 49 4e 43 52 4b 45 59 20 29 3b 0a 20 20 20 20 20  INCRKEY );.     
1c6d0 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f   assert( oc!=OP_
1c6e0 53 65 65 6b 47 65 20 7c 7c 20 72 2e 66 6c 61 67  SeekGe || r.flag
1c6f0 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  s==0 );.      as
1c700 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65  sert( oc!=OP_See
1c710 6b 4c 74 20 7c 7c 20 72 2e 66 6c 61 67 73 3d 3d  kLt || r.flags==
1c720 30 20 29 3b 0a 0a 20 20 20 20 20 20 72 2e 61 4d  0 );..      r.aM
1c730 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  em = &aMem[pOp->
1c740 70 33 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  p3];.#ifdef SQLI
1c750 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 7b  TE_DEBUG.      {
1c760 20 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b   int i; for(i=0;
1c770 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b   i<r.nField; i++
1c780 29 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56  ) assert( memIsV
1c790 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29  alid(&r.aMem[i])
1c7a0 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20   ); }.#endif.   
1c7b0 20 20 20 45 78 70 61 6e 64 42 6c 6f 62 28 72 2e     ExpandBlob(r.
1c7c0 61 4d 65 6d 29 3b 0a 20 20 20 20 20 20 72 63 20  aMem);.      rc 
1c7d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
1c7e0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d  vetoUnpacked(pC-
1c7f0 3e 70 43 75 72 73 6f 72 2c 20 26 72 2c 20 30 2c  >pCursor, &r, 0,
1c800 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20   0, &res);.     
1c810 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c820 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
1c830 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1c840 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20  error;.      }. 
1c850 20 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73       pC->rowidIs
1c860 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d  Valid = 0;.    }
1c870 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65  .    pC->deferre
1c880 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20  dMoveto = 0;.   
1c890 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
1c8a0 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
1c8b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1c8c0 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ST.    sqlite3_s
1c8d0 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  earch_count++;.#
1c8e0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6f 63  endif.    if( oc
1c8f0 3e 3d 4f 50 5f 53 65 65 6b 47 65 20 29 7b 20 20  >=OP_SeekGe ){  
1c900 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53  assert( oc==OP_S
1c910 65 65 6b 47 65 20 7c 7c 20 6f 63 3d 3d 4f 50 5f  eekGe || oc==OP_
1c920 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 20 20  SeekGt );.      
1c930 69 66 28 20 72 65 73 3c 30 20 7c 7c 20 28 72 65  if( res<0 || (re
1c940 73 3d 3d 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53  s==0 && oc==OP_S
1c950 65 65 6b 47 74 29 20 29 7b 0a 20 20 20 20 20 20  eekGt) ){.      
1c960 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1c970 72 65 65 4e 65 78 74 28 70 43 2d 3e 70 43 75 72  reeNext(pC->pCur
1c980 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  sor, &res);.    
1c990 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c9a0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f  TE_OK ) goto abo
1c9b0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
1c9c0 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 72 6f 77  .        pC->row
1c9d0 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20  idIsValid = 0;. 
1c9e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c9f0 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 20      res = 0;.   
1ca00 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1ca10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63        assert( oc
1ca20 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 7c 7c 20 6f  ==OP_SeekLt || o
1ca30 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a  c==OP_SeekLe );.
1ca40 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 30 20        if( res>0 
1ca50 7c 7c 20 28 72 65 73 3d 3d 30 20 26 26 20 6f 63  || (res==0 && oc
1ca60 3d 3d 4f 50 5f 53 65 65 6b 4c 74 29 20 29 7b 0a  ==OP_SeekLt) ){.
1ca70 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1ca80 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
1ca90 73 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26  s(pC->pCursor, &
1caa0 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  res);.        if
1cab0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cac0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
1cad0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
1cae0 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61     pC->rowidIsVa
1caf0 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  lid = 0;.      }
1cb00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
1cb10 20 72 65 73 20 6d 69 67 68 74 20 62 65 20 6e 65   res might be ne
1cb20 67 61 74 69 76 65 20 62 65 63 61 75 73 65 20 74  gative because t
1cb30 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
1cb40 79 2e 20 20 43 68 65 63 6b 20 74 6f 0a 20 20 20  y.  Check to.   
1cb50 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 74       ** see if t
1cb60 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e  his is the case.
1cb70 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1cb80 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
1cb90 33 42 74 72 65 65 45 6f 66 28 70 43 2d 3e 70 43  3BtreeEof(pC->pC
1cba0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
1cbb0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1cbc0 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20  ( pOp->p2>0 );. 
1cbd0 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
1cbe0 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
1cbf0 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   - 1;.    }.  }e
1cc00 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
1cc10 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 74   happens when at
1cc20 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f 70 65 6e  tempting to open
1cc30 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 61 73   the sqlite3_mas
1cc40 74 65 72 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  ter table.    **
1cc50 20 66 6f 72 20 72 65 61 64 20 61 63 63 65 73 73   for read access
1cc60 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1cc70 45 4d 50 54 59 2e 20 49 6e 20 74 68 69 73 20 63  EMPTY. In this c
1cc80 61 73 65 20 61 6c 77 61 79 73 0a 20 20 20 20 2a  ase always.    *
1cc90 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * take the jump 
1cca0 28 73 69 6e 63 65 20 74 68 65 72 65 20 61 72 65  (since there are
1ccb0 20 6e 6f 20 72 65 63 6f 72 64 73 20 69 6e 20 74   no records in t
1ccc0 68 65 20 74 61 62 6c 65 29 2e 0a 20 20 20 20 2a  he table)..    *
1ccd0 2f 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e  /.    pc = pOp->
1cce0 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72  p2 - 1;.  }.  br
1ccf0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
1cd00 65 3a 20 53 65 65 6b 20 50 31 20 50 32 20 2a 20  e: Seek P1 P2 * 
1cd10 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20  * *.**.** P1 is 
1cd20 61 6e 20 6f 70 65 6e 20 74 61 62 6c 65 20 63 75  an open table cu
1cd30 72 73 6f 72 20 61 6e 64 20 50 32 20 69 73 20 61  rsor and P2 is a
1cd40 20 72 6f 77 69 64 20 69 6e 74 65 67 65 72 2e 20   rowid integer. 
1cd50 20 41 72 72 61 6e 67 65 0a 2a 2a 20 66 6f 72 20   Arrange.** for 
1cd60 50 31 20 74 6f 20 6d 6f 76 65 20 73 6f 20 74 68  P1 to move so th
1cd70 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
1cd80 74 68 65 20 72 6f 77 69 64 20 67 69 76 65 6e 20  the rowid given 
1cd90 62 79 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  by P2..**.** Thi
1cda0 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  s is actually a 
1cdb0 64 65 66 65 72 72 65 64 20 73 65 65 6b 2e 20 20  deferred seek.  
1cdc0 4e 6f 74 68 69 6e 67 20 61 63 74 75 61 6c 6c 79  Nothing actually
1cdd0 20 68 61 70 70 65 6e 73 20 75 6e 74 69 6c 0a 2a   happens until.*
1cde0 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
1cdf0 75 73 65 64 20 74 6f 20 72 65 61 64 20 61 20 72  used to read a r
1ce00 65 63 6f 72 64 2e 20 20 54 68 61 74 20 77 61 79  ecord.  That way
1ce10 2c 20 69 66 20 6e 6f 20 72 65 61 64 73 0a 2a 2a  , if no reads.**
1ce20 20 6f 63 63 75 72 2c 20 6e 6f 20 75 6e 6e 65 63   occur, no unnec
1ce30 65 73 73 61 72 79 20 49 2f 4f 20 68 61 70 70 65  essary I/O happe
1ce40 6e 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  ns..*/.case OP_S
1ce50 65 65 6b 3a 20 7b 20 20 20 20 2f 2a 20 69 6e 32  eek: {    /* in2
1ce60 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
1ce70 20 2a 70 43 3b 0a 0a 20 20 61 73 73 65 72 74 28   *pC;..  assert(
1ce80 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
1ce90 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
1cea0 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  r );.  pC = p->a
1ceb0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
1cec0 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
1ced0 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
1cee0 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 29 20 29  C->pCursor!=0) )
1cef0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
1cf00 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20  ->isTable );.   
1cf10 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30   pC->nullRow = 0
1cf20 3b 0a 20 20 20 20 70 49 6e 32 20 3d 20 26 61 4d  ;.    pIn2 = &aM
1cf30 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20  em[pOp->p2];.   
1cf40 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65   pC->movetoTarge
1cf50 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49  t = sqlite3VdbeI
1cf60 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 3b 0a 20  ntValue(pIn2);. 
1cf70 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61     pC->rowidIsVa
1cf80 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d  lid = 0;.    pC-
1cf90 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
1cfa0 3d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  = 1;.  }.  break
1cfb0 3b 0a 7d 0a 20 20 0a 0a 2f 2a 20 4f 70 63 6f 64  ;.}.  ../* Opcod
1cfc0 65 3a 20 46 6f 75 6e 64 20 50 31 20 50 32 20 50  e: Found P1 P2 P
1cfd0 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20  3 P4 *.**.** If 
1cfe0 50 34 3d 3d 30 20 74 68 65 6e 20 72 65 67 69 73  P4==0 then regis
1cff0 74 65 72 20 50 33 20 68 6f 6c 64 73 20 61 20 62  ter P3 holds a b
1d000 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20  lob constructed 
1d010 62 79 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20  by MakeRecord.  
1d020 49 66 0a 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20  If.** P4>0 then 
1d030 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20 74  register P3 is t
1d040 68 65 20 66 69 72 73 74 20 6f 66 20 50 34 20 72  he first of P4 r
1d050 65 67 69 73 74 65 72 73 20 74 68 61 74 20 66 6f  egisters that fo
1d060 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a  rm an unpacked.*
1d070 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  * record..**.** 
1d080 43 75 72 73 6f 72 20 50 31 20 69 73 20 6f 6e 20  Cursor P1 is on 
1d090 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2e 20  an index btree. 
1d0a0 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
1d0b0 64 65 6e 74 69 66 69 65 64 20 62 79 20 50 33 20  dentified by P3 
1d0c0 61 6e 64 20 50 34 0a 2a 2a 20 69 73 20 61 20 70  and P4.** is a p
1d0d0 72 65 66 69 78 20 6f 66 20 61 6e 79 20 65 6e 74  refix of any ent
1d0e0 72 79 20 69 6e 20 50 31 20 74 68 65 6e 20 61 20  ry in P1 then a 
1d0f0 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f 20  jump is made to 
1d100 50 32 20 61 6e 64 0a 2a 2a 20 50 31 20 69 73 20  P2 and.** P1 is 
1d110 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1d120 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 65 6e   the matching en
1d130 74 72 79 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  try..*/./* Opcod
1d140 65 3a 20 4e 6f 74 46 6f 75 6e 64 20 50 31 20 50  e: NotFound P1 P
1d150 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  2 P3 P4 *.**.** 
1d160 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20 72 65  If P4==0 then re
1d170 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64 73 20  gister P3 holds 
1d180 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74  a blob construct
1d190 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f 72 64  ed by MakeRecord
1d1a0 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74 68  .  If.** P4>0 th
1d1b0 65 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 69  en register P3 i
1d1c0 73 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 50  s the first of P
1d1d0 34 20 72 65 67 69 73 74 65 72 73 20 74 68 61 74  4 registers that
1d1e0 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65   form an unpacke
1d1f0 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a 20  d.** record..** 
1d200 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69 73  .** Cursor P1 is
1d210 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74 72   on an index btr
1d220 65 65 2e 20 20 49 66 20 74 68 65 20 72 65 63 6f  ee.  If the reco
1d230 72 64 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  rd identified by
1d240 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 69 73   P3 and P4.** is
1d250 20 6e 6f 74 20 74 68 65 20 70 72 65 66 69 78 20   not the prefix 
1d260 6f 66 20 61 6e 79 20 65 6e 74 72 79 20 69 6e 20  of any entry in 
1d270 50 31 20 74 68 65 6e 20 61 20 6a 75 6d 70 20 69  P1 then a jump i
1d280 73 20 6d 61 64 65 20 74 6f 20 50 32 2e 20 20 49  s made to P2.  I
1d290 66 20 50 31 20 0a 2a 2a 20 64 6f 65 73 20 63 6f  f P1 .** does co
1d2a0 6e 74 61 69 6e 20 61 6e 20 65 6e 74 72 79 20 77  ntain an entry w
1d2b0 68 6f 73 65 20 70 72 65 66 69 78 20 6d 61 74 63  hose prefix matc
1d2c0 68 65 73 20 74 68 65 20 50 33 2f 50 34 20 72 65  hes the P3/P4 re
1d2d0 63 6f 72 64 20 74 68 65 6e 20 63 6f 6e 74 72 6f  cord then contro
1d2e0 6c 0a 2a 2a 20 66 61 6c 6c 73 20 74 68 72 6f 75  l.** falls throu
1d2f0 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
1d300 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 50  nstruction and P
1d310 31 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  1 is left pointi
1d320 6e 67 20 61 74 20 74 68 65 0a 2a 2a 20 6d 61 74  ng at the.** mat
1d330 63 68 69 6e 67 20 65 6e 74 72 79 2e 0a 2a 2a 0a  ching entry..**.
1d340 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
1d350 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73 2c 20 49  nd, NotExists, I
1d360 73 55 6e 69 71 75 65 0a 2a 2f 0a 63 61 73 65 20  sUnique.*/.case 
1d370 4f 50 5f 4e 6f 74 46 6f 75 6e 64 3a 20 20 20 20  OP_NotFound:    
1d380 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20     /* jump, in3 
1d390 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 6f 75 6e 64  */.case OP_Found
1d3a0 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
1d3b0 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74  mp, in3 */.  int
1d3c0 20 61 6c 72 65 61 64 79 45 78 69 73 74 73 3b 0a   alreadyExists;.
1d3d0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
1d3e0 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 63  ;.  int res;.  c
1d3f0 68 61 72 20 2a 70 46 72 65 65 3b 0a 20 20 55 6e  har *pFree;.  Un
1d400 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
1d410 64 78 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65  dxKey;.  Unpacke
1d420 64 52 65 63 6f 72 64 20 72 3b 0a 20 20 63 68 61  dRecord r;.  cha
1d430 72 20 61 54 65 6d 70 52 65 63 5b 52 4f 55 4e 44  r aTempRec[ROUND
1d440 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
1d450 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65  dRecord)) + size
1d460 6f 66 28 4d 65 6d 29 2a 33 20 2b 20 37 5d 3b 0a  of(Mem)*3 + 7];.
1d470 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1d480 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 66 6f  EST.  sqlite3_fo
1d490 75 6e 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  und_count++;.#en
1d4a0 64 69 66 0a 0a 20 20 61 6c 72 65 61 64 79 45 78  dif..  alreadyEx
1d4b0 69 73 74 73 20 3d 20 30 3b 0a 20 20 61 73 73 65  ists = 0;.  asse
1d4c0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
1d4d0 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
1d4e0 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74  rsor );.  assert
1d4f0 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
1d500 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 70 43 20  4_INT32 );.  pC 
1d510 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
1d520 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
1d530 43 21 3d 30 20 29 3b 0a 20 20 70 49 6e 33 20 3d  C!=0 );.  pIn3 =
1d540 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
1d550 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43  .  if( ALWAYS(pC
1d560 2d 3e 70 43 75 72 73 6f 72 21 3d 30 29 20 29 7b  ->pCursor!=0) ){
1d570 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ..    assert( pC
1d580 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  ->isTable==0 );.
1d590 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 2e      if( pOp->p4.
1d5a0 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 2e 70  i>0 ){.      r.p
1d5b0 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b  KeyInfo = pC->pK
1d5c0 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 72 2e  eyInfo;.      r.
1d5d0 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 70 4f  nField = (u16)pO
1d5e0 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 20 20 72  p->p4.i;.      r
1d5f0 2e 61 4d 65 6d 20 3d 20 70 49 6e 33 3b 0a 23 69  .aMem = pIn3;.#i
1d600 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1d610 47 0a 20 20 20 20 20 20 7b 20 69 6e 74 20 69 3b  G.      { int i;
1d620 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 2e 6e 46   for(i=0; i<r.nF
1d630 69 65 6c 64 3b 20 69 2b 2b 29 20 61 73 73 65 72  ield; i++) asser
1d640 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 72  t( memIsValid(&r
1d650 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23  .aMem[i]) ); }.#
1d660 65 6e 64 69 66 0a 20 20 20 20 20 20 72 2e 66 6c  endif.      r.fl
1d670 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 50  ags = UNPACKED_P
1d680 52 45 46 49 58 5f 4d 41 54 43 48 3b 0a 20 20 20  REFIX_MATCH;.   
1d690 20 20 20 70 49 64 78 4b 65 79 20 3d 20 26 72 3b     pIdxKey = &r;
1d6a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d6b0 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69    pIdxKey = sqli
1d6c0 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
1d6d0 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20  ckedRecord(.    
1d6e0 20 20 20 20 20 20 70 43 2d 3e 70 4b 65 79 49 6e        pC->pKeyIn
1d6f0 66 6f 2c 20 61 54 65 6d 70 52 65 63 2c 20 73 69  fo, aTempRec, si
1d700 7a 65 6f 66 28 61 54 65 6d 70 52 65 63 29 2c 20  zeof(aTempRec), 
1d710 26 70 46 72 65 65 0a 20 20 20 20 20 20 29 3b 20  &pFree.      ); 
1d720 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b  .      if( pIdxK
1d730 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  ey==0 ) goto no_
1d740 6d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  mem;.      asser
1d750 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26  t( pIn3->flags &
1d760 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20   MEM_Blob );.   
1d770 20 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 33     assert( (pIn3
1d780 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1d790 72 6f 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 7a 65  ro)==0 );  /* ze
1d7a0 72 6f 62 6c 6f 62 73 20 61 6c 72 65 61 64 79 20  roblobs already 
1d7b0 65 78 70 61 6e 64 65 64 20 2a 2f 0a 20 20 20 20  expanded */.    
1d7c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63    sqlite3VdbeRec
1d7d0 6f 72 64 55 6e 70 61 63 6b 28 70 43 2d 3e 70 4b  ordUnpack(pC->pK
1d7e0 65 79 49 6e 66 6f 2c 20 70 49 6e 33 2d 3e 6e 2c  eyInfo, pIn3->n,
1d7f0 20 70 49 6e 33 2d 3e 7a 2c 20 70 49 64 78 4b 65   pIn3->z, pIdxKe
1d800 79 29 3b 0a 20 20 20 20 20 20 70 49 64 78 4b 65  y);.      pIdxKe
1d810 79 2d 3e 66 6c 61 67 73 20 7c 3d 20 55 4e 50 41  y->flags |= UNPA
1d820 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43  CKED_PREFIX_MATC
1d830 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  H;.    }.    rc 
1d840 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
1d850 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d  vetoUnpacked(pC-
1d860 3e 70 43 75 72 73 6f 72 2c 20 70 49 64 78 4b 65  >pCursor, pIdxKe
1d870 79 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a  y, 0, 0, &res);.
1d880 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 2e      if( pOp->p4.
1d890 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  i==0 ){.      sq
1d8a0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1d8b0 70 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFree);.    }.  
1d8c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d8d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 62 72 65  _OK ){.      bre
1d8e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6c  ak;.    }.    al
1d8f0 72 65 61 64 79 45 78 69 73 74 73 20 3d 20 28 72  readyExists = (r
1d900 65 73 3d 3d 30 29 3b 0a 20 20 20 20 70 43 2d 3e  es==0);.    pC->
1d910 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
1d920 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68   0;.    pC->cach
1d930 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
1d940 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28  STALE;.  }.  if(
1d950 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
1d960 5f 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20 69 66  _Found ){.    if
1d970 28 20 61 6c 72 65 61 64 79 45 78 69 73 74 73 20  ( alreadyExists 
1d980 29 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d  ) pc = pOp->p2 -
1d990 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
1d9a0 20 69 66 28 20 21 61 6c 72 65 61 64 79 45 78 69   if( !alreadyExi
1d9b0 73 74 73 20 29 20 70 63 20 3d 20 70 4f 70 2d 3e  sts ) pc = pOp->
1d9c0 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72  p2 - 1;.  }.  br
1d9d0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
1d9e0 65 3a 20 49 73 55 6e 69 71 75 65 20 50 31 20 50  e: IsUnique P1 P
1d9f0 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  2 P3 P4 *.**.** 
1da00 43 75 72 73 6f 72 20 50 31 20 69 73 20 6f 70 65  Cursor P1 is ope
1da10 6e 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d  n on an index b-
1da20 74 72 65 65 20 2d 20 74 68 61 74 20 69 73 20 74  tree - that is t
1da30 6f 20 73 61 79 2c 20 61 20 62 74 72 65 65 20 77  o say, a btree w
1da40 68 69 63 68 0a 2a 2a 20 6e 6f 20 64 61 74 61 20  hich.** no data 
1da50 61 6e 64 20 77 68 65 72 65 20 74 68 65 20 6b 65  and where the ke
1da60 79 20 61 72 65 20 72 65 63 6f 72 64 73 20 67 65  y are records ge
1da70 6e 65 72 61 74 65 64 20 62 79 20 4f 50 5f 4d 61  nerated by OP_Ma
1da80 6b 65 52 65 63 6f 72 64 20 77 69 74 68 0a 2a 2a  keRecord with.**
1da90 20 74 68 65 20 6c 69 73 74 20 66 69 65 6c 64 20   the list field 
1daa0 62 65 69 6e 67 20 74 68 65 20 69 6e 74 65 67 65  being the intege
1dab0 72 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20 65  r ROWID of the e
1dac0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 69 6e  ntry that the in
1dad0 64 65 78 0a 2a 2a 20 65 6e 74 72 79 20 72 65 66  dex.** entry ref
1dae0 65 72 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ers to..**.** Th
1daf0 65 20 50 33 20 72 65 67 69 73 74 65 72 20 63 6f  e P3 register co
1db00 6e 74 61 69 6e 73 20 61 6e 20 69 6e 74 65 67 65  ntains an intege
1db10 72 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e  r record number.
1db20 20 43 61 6c 6c 20 74 68 69 73 20 72 65 63 6f 72   Call this recor
1db30 64 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 52 2e 20  d .** number R. 
1db40 52 65 67 69 73 74 65 72 20 50 34 20 69 73 20 74  Register P4 is t
1db50 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 73 65  he first in a se
1db60 74 20 6f 66 20 4e 20 63 6f 6e 74 69 67 75 6f 75  t of N contiguou
1db70 73 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 74  s registers.** t
1db80 68 61 74 20 6d 61 6b 65 20 75 70 20 61 6e 20 75  hat make up an u
1db90 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
1dba0 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  y that can be us
1dbb0 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 50  ed with cursor P
1dbc0 31 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  1..** The value 
1dbd0 6f 66 20 4e 20 63 61 6e 20 62 65 20 69 6e 66 65  of N can be infe
1dbe0 72 72 65 64 20 66 72 6f 6d 20 74 68 65 20 63 75  rred from the cu
1dbf0 72 73 6f 72 2e 20 4e 20 69 6e 63 6c 75 64 65 73  rsor. N includes
1dc00 20 74 68 65 20 72 6f 77 69 64 0a 2a 2a 20 76 61   the rowid.** va
1dc10 6c 75 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20  lue appended to 
1dc20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
1dc30 6e 64 65 78 20 72 65 63 6f 72 64 2e 20 54 68 69  ndex record. Thi
1dc40 73 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6d 61  s rowid value ma
1dc50 79 0a 2a 2a 20 6f 72 20 6d 61 79 20 6e 6f 74 20  y.** or may not 
1dc60 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 52  be the same as R
1dc70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 6f  ..**.** If any o
1dc80 66 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72  f the N register
1dc90 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  s beginning with
1dca0 20 72 65 67 69 73 74 65 72 20 50 34 20 63 6f 6e   register P4 con
1dcb0 74 61 69 6e 73 20 61 20 4e 55 4c 4c 0a 2a 2a 20  tains a NULL.** 
1dcc0 76 61 6c 75 65 2c 20 6a 75 6d 70 20 69 6d 6d 65  value, jump imme
1dcd0 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a  diately to P2..*
1dce0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1dcf0 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
1dd00 20 63 68 65 63 6b 73 20 69 66 20 63 75 72 73 6f   checks if curso
1dd10 72 20 50 31 20 63 6f 6e 74 61 69 6e 73 20 61 6e  r P1 contains an
1dd20 20 65 6e 74 72 79 0a 2a 2a 20 77 68 65 72 65 20   entry.** where 
1dd30 74 68 65 20 66 69 72 73 74 20 28 4e 2d 31 29 20  the first (N-1) 
1dd40 66 69 65 6c 64 73 20 6d 61 74 63 68 20 62 75 74  fields match but
1dd50 20 74 68 65 20 72 6f 77 69 64 20 76 61 6c 75 65   the rowid value
1dd60 20 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f   at the end.** o
1dd70 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
1dd80 79 20 69 73 20 6e 6f 74 20 52 2e 20 49 66 20 74  y is not R. If t
1dd90 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20  here is no such 
1dda0 65 6e 74 72 79 2c 20 63 6f 6e 74 72 6f 6c 20 6a  entry, control j
1ddb0 75 6d 70 73 0a 2a 2a 20 74 6f 20 69 6e 73 74 72  umps.** to instr
1ddc0 75 63 74 69 6f 6e 20 50 32 2e 20 4f 74 68 65 72  uction P2. Other
1ddd0 77 69 73 65 2c 20 74 68 65 20 72 6f 77 69 64 20  wise, the rowid 
1dde0 6f 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 69  of the conflicti
1ddf0 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 65 6e 74 72  ng index.** entr
1de00 79 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 72  y is copied to r
1de10 65 67 69 73 74 65 72 20 50 33 20 61 6e 64 20 63  egister P3 and c
1de20 6f 6e 74 72 6f 6c 20 66 61 6c 6c 73 20 74 68 72  ontrol falls thr
1de30 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
1de40 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  .** instruction.
1de50 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
1de60 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f 74 45 78   NotFound, NotEx
1de70 69 73 74 73 2c 20 46 6f 75 6e 64 0a 2a 2f 0a 63  ists, Found.*/.c
1de80 61 73 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 3a  ase OP_IsUnique:
1de90 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
1dea0 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 75 31 36 20  p, in3 */.  u16 
1deb0 69 69 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  ii;.  VdbeCursor
1dec0 20 2a 70 43 78 3b 0a 20 20 42 74 43 75 72 73 6f   *pCx;.  BtCurso
1ded0 72 20 2a 70 43 72 73 72 3b 0a 20 20 75 31 36 20  r *pCrsr;.  u16 
1dee0 6e 46 69 65 6c 64 3b 0a 20 20 4d 65 6d 20 2a 61  nField;.  Mem *a
1def0 4d 78 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  Mx;.  UnpackedRe
1df00 63 6f 72 64 20 72 3b 20 20 20 20 20 20 20 20 20  cord r;         
1df10 20 20 20 20 20 20 20 20 20 2f 2a 20 42 2d 54 72           /* B-Tr
1df20 65 65 20 69 6e 64 65 78 20 73 65 61 72 63 68 20  ee index search 
1df30 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 52 3b 20  key */.  i64 R; 
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1df60 6f 77 69 64 20 73 74 6f 72 65 64 20 69 6e 20 72  owid stored in r
1df70 65 67 69 73 74 65 72 20 50 33 20 2a 2f 0a 0a 20  egister P3 */.. 
1df80 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn3 = &aMem[pO
1df90 70 2d 3e 70 33 5d 3b 0a 20 20 61 4d 78 20 3d 20  p->p3];.  aMx = 
1dfa0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 34 2e 69 5d  &aMem[pOp->p4.i]
1dfb0 3b 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ;.  /* Assert th
1dfc0 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  at the values of
1dfd0 20 70 61 72 61 6d 65 74 65 72 73 20 50 31 20 61   parameters P1 a
1dfe0 6e 64 20 50 34 20 61 72 65 20 69 6e 20 72 61 6e  nd P4 are in ran
1dff0 67 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ge. */.  assert(
1e000 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
1e010 5f 49 4e 54 33 32 20 29 3b 0a 20 20 61 73 73 65  _INT32 );.  asse
1e020 72 74 28 20 70 4f 70 2d 3e 70 34 2e 69 3e 30 20  rt( pOp->p4.i>0 
1e030 26 26 20 70 4f 70 2d 3e 70 34 2e 69 3c 3d 70 2d  && pOp->p4.i<=p-
1e040 3e 6e 4d 65 6d 20 29 3b 0a 20 20 61 73 73 65 72  >nMem );.  asser
1e050 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
1e060 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
1e070 73 6f 72 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  sor );..  /* Fin
1e080 64 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73  d the index curs
1e090 6f 72 2e 20 2a 2f 0a 20 20 70 43 78 20 3d 20 70  or. */.  pCx = p
1e0a0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
1e0b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 78 2d  ;.  assert( pCx-
1e0c0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d  >deferredMoveto=
1e0d0 3d 30 20 29 3b 0a 20 20 70 43 78 2d 3e 73 65 65  =0 );.  pCx->see
1e0e0 6b 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 70  kResult = 0;.  p
1e0f0 43 78 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  Cx->cacheStatus 
1e100 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
1e110 20 70 43 72 73 72 20 3d 20 70 43 78 2d 3e 70 43   pCrsr = pCx->pC
1e120 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20  ursor;..  /* If 
1e130 61 6e 79 20 6f 66 20 74 68 65 20 76 61 6c 75 65  any of the value
1e140 73 20 61 72 65 20 4e 55 4c 4c 2c 20 74 61 6b 65  s are NULL, take
1e150 20 74 68 65 20 6a 75 6d 70 2e 20 2a 2f 0a 20 20   the jump. */.  
1e160 6e 46 69 65 6c 64 20 3d 20 70 43 78 2d 3e 70 4b  nField = pCx->pK
1e170 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a  eyInfo->nField;.
1e180 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
1e190 46 69 65 6c 64 3b 20 69 69 2b 2b 29 7b 0a 20 20  Field; ii++){.  
1e1a0 20 20 69 66 28 20 61 4d 78 5b 69 69 5d 2e 66 6c    if( aMx[ii].fl
1e1b0 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
1e1c0 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70  {.      pc = pOp
1e1d0 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20 20  ->p2 - 1;.      
1e1e0 70 43 72 73 72 20 3d 20 30 3b 0a 20 20 20 20 20  pCrsr = 0;.     
1e1f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1e200 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61 4d 78  }.  assert( (aMx
1e210 5b 6e 46 69 65 6c 64 5d 2e 66 6c 61 67 73 20 26  [nField].flags &
1e220 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b   MEM_Null)==0 );
1e230 0a 0a 20 20 69 66 28 20 70 43 72 73 72 21 3d 30  ..  if( pCrsr!=0
1e240 20 29 7b 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c   ){.    /* Popul
1e250 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 65  ate the index se
1e260 61 72 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20  arch key. */.   
1e270 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43   r.pKeyInfo = pC
1e280 78 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  x->pKeyInfo;.   
1e290 20 72 2e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65   r.nField = nFie
1e2a0 6c 64 20 2b 20 31 3b 0a 20 20 20 20 72 2e 66 6c  ld + 1;.    r.fl
1e2b0 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 50  ags = UNPACKED_P
1e2c0 52 45 46 49 58 5f 53 45 41 52 43 48 3b 0a 20 20  REFIX_SEARCH;.  
1e2d0 20 20 72 2e 61 4d 65 6d 20 3d 20 61 4d 78 3b 0a    r.aMem = aMx;.
1e2e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1e2f0 42 55 47 0a 20 20 20 20 7b 20 69 6e 74 20 69 3b  BUG.    { int i;
1e300 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 2e 6e 46   for(i=0; i<r.nF
1e310 69 65 6c 64 3b 20 69 2b 2b 29 20 61 73 73 65 72  ield; i++) asser
1e320 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 72  t( memIsValid(&r
1e330 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23  .aMem[i]) ); }.#
1e340 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 78  endif..    /* Ex
1e350 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
1e360 6f 66 20 52 20 66 72 6f 6d 20 72 65 67 69 73 74  of R from regist
1e370 65 72 20 50 33 2e 20 2a 2f 0a 20 20 20 20 73 71  er P3. */.    sq
1e380 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65  lite3VdbeMemInte
1e390 67 65 72 69 66 79 28 70 49 6e 33 29 3b 0a 20 20  gerify(pIn3);.  
1e3a0 20 20 52 20 3d 20 70 49 6e 33 2d 3e 75 2e 69 3b    R = pIn3->u.i;
1e3b0 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  ..    /* Search 
1e3c0 74 68 65 20 42 2d 54 72 65 65 20 69 6e 64 65 78  the B-Tree index
1e3d0 2e 20 49 66 20 6e 6f 20 63 6f 6e 66 6c 69 63 74  . If no conflict
1e3e0 69 6e 67 20 72 65 63 6f 72 64 20 69 73 20 66 6f  ing record is fo
1e3f0 75 6e 64 2c 20 6a 75 6d 70 0a 20 20 20 20 2a 2a  und, jump.    **
1e400 20 74 6f 20 50 32 2e 20 4f 74 68 65 72 77 69 73   to P2. Otherwis
1e410 65 2c 20 63 6f 70 79 20 74 68 65 20 72 6f 77 69  e, copy the rowi
1e420 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 6c 69 63  d of the conflic
1e430 74 69 6e 67 20 72 65 63 6f 72 64 20 74 6f 0a 20  ting record to. 
1e440 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72 20 50     ** register P
1e450 33 20 61 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75  3 and fall throu
1e460 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
1e470 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 2a 2f 0a  nstruction.  */.
1e480 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e490 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
1e4a0 6b 65 64 28 70 43 72 73 72 2c 20 26 72 2c 20 30  ked(pCrsr, &r, 0
1e4b0 2c 20 30 2c 20 26 70 43 78 2d 3e 73 65 65 6b 52  , 0, &pCx->seekR
1e4c0 65 73 75 6c 74 29 3b 0a 20 20 20 20 69 66 28 20  esult);.    if( 
1e4d0 28 72 2e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  (r.flags & UNPAC
1e4e0 4b 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43  KED_PREFIX_SEARC
1e4f0 48 29 20 7c 7c 20 72 2e 72 6f 77 69 64 3d 3d 52  H) || r.rowid==R
1e500 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70   ){.      pc = p
1e510 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20  Op->p2 - 1;.    
1e520 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e  }else{.      pIn
1e530 33 2d 3e 75 2e 69 20 3d 20 72 2e 72 6f 77 69 64  3->u.i = r.rowid
1e540 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
1e550 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
1e560 65 3a 20 4e 6f 74 45 78 69 73 74 73 20 50 31 20  e: NotExists P1 
1e570 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
1e580 55 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  Use the content 
1e590 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20 61  of register P3 a
1e5a0 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6b 65 79  s an integer key
1e5b0 2e 20 20 49 66 20 61 20 72 65 63 6f 72 64 20 0a  .  If a record .
1e5c0 2a 2a 20 77 69 74 68 20 74 68 61 74 20 6b 65 79  ** with that key
1e5d0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20   does not exist 
1e5e0 69 6e 20 74 61 62 6c 65 20 6f 66 20 50 31 2c 20  in table of P1, 
1e5f0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e  then jump to P2.
1e600 20 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f   .** If the reco
1e610 72 64 20 64 6f 65 73 20 65 78 69 73 74 2c 20 74  rd does exist, t
1e620 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
1e630 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  .  The cursor is
1e640 20 6c 65 66 74 20 0a 2a 2a 20 70 6f 69 6e 74 69   left .** pointi
1e650 6e 67 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64  ng to the record
1e660 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a 2a   if it exists..*
1e670 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
1e680 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
1e690 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e 64 20 4e   operation and N
1e6a0 6f 74 46 6f 75 6e 64 20 69 73 20 74 68 61 74 20  otFound is that 
1e6b0 74 68 69 73 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  this.** operatio
1e6c0 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 6b 65  n assumes the ke
1e6d0 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  y is an integer 
1e6e0 61 6e 64 20 74 68 61 74 20 50 31 20 69 73 20 61  and that P1 is a
1e6f0 20 74 61 62 6c 65 20 77 68 65 72 65 61 73 0a 2a   table whereas.*
1e700 2a 20 4e 6f 74 46 6f 75 6e 64 20 61 73 73 75 6d  * NotFound assum
1e710 65 73 20 6b 65 79 20 69 73 20 61 20 62 6c 6f 62  es key is a blob
1e720 20 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72 6f   constructed fro
1e730 6d 20 4d 61 6b 65 52 65 63 6f 72 64 20 61 6e 64  m MakeRecord and
1e740 0a 2a 2a 20 50 31 20 69 73 20 61 6e 20 69 6e 64  .** P1 is an ind
1e750 65 78 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ex..**.** See al
1e760 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f  so: Found, NotFo
1e770 75 6e 64 2c 20 49 73 55 6e 69 71 75 65 0a 2a 2f  und, IsUnique.*/
1e780 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 45 78 69 73  .case OP_NotExis
1e790 74 73 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  ts: {        /* 
1e7a0 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 56  jump, in3 */.  V
1e7b0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
1e7c0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72   BtCursor *pCrsr
1e7d0 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75  ;.  int res;.  u
1e7e0 36 34 20 69 4b 65 79 3b 0a 0a 20 20 70 49 6e 33  64 iKey;..  pIn3
1e7f0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
1e800 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ];.  assert( pIn
1e810 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  3->flags & MEM_I
1e820 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nt );.  assert( 
1e830 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
1e840 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
1e850 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
1e860 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
1e870 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
1e880 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69  .  assert( pC->i
1e890 73 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  sTable );.  asse
1e8a0 72 74 28 20 70 43 2d 3e 70 73 65 75 64 6f 54 61  rt( pC->pseudoTa
1e8b0 62 6c 65 52 65 67 3d 3d 30 20 29 3b 0a 20 20 70  bleReg==0 );.  p
1e8c0 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73  Crsr = pC->pCurs
1e8d0 6f 72 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  or;.  if( ALWAYS
1e8e0 28 70 43 72 73 72 21 3d 30 29 20 29 7b 0a 20 20  (pCrsr!=0) ){.  
1e8f0 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 69    res = 0;.    i
1e900 4b 65 79 20 3d 20 70 49 6e 33 2d 3e 75 2e 69 3b  Key = pIn3->u.i;
1e910 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1e920 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
1e930 63 6b 65 64 28 70 43 72 73 72 2c 20 30 2c 20 69  cked(pCrsr, 0, i
1e940 4b 65 79 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  Key, 0, &res);. 
1e950 20 20 20 70 43 2d 3e 6c 61 73 74 52 6f 77 69 64     pC->lastRowid
1e960 20 3d 20 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20   = pIn3->u.i;.  
1e970 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c    pC->rowidIsVal
1e980 69 64 20 3d 20 72 65 73 3d 3d 30 20 3f 31 3a 30  id = res==0 ?1:0
1e990 3b 0a 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f  ;.    pC->nullRo
1e9a0 77 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63  w = 0;.    pC->c
1e9b0 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
1e9c0 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 70 43  HE_STALE;.    pC
1e9d0 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
1e9e0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 65   = 0;.    if( re
1e9f0 73 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 63  s!=0 ){.      pc
1ea00 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
1ea10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1ea20 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 3d 3d  ->rowidIsValid==
1ea30 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  0 );.    }.    p
1ea40 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d 20  C->seekResult = 
1ea50 72 65 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  res;.  }else{.  
1ea60 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
1ea70 73 20 77 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  s when an attemp
1ea80 74 20 74 6f 20 6f 70 65 6e 20 61 20 72 65 61 64  t to open a read
1ea90 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 0a   cursor on the .
1eaa0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61      ** sqlite_ma
1eab0 73 74 65 72 20 74 61 62 6c 65 20 72 65 74 75 72  ster table retur
1eac0 6e 73 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 2e  ns SQLITE_EMPTY.
1ead0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 63 20 3d  .    */.    pc =
1eae0 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
1eaf0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 72 6f    assert( pC->ro
1eb00 77 69 64 49 73 56 61 6c 69 64 3d 3d 30 20 29 3b  widIsValid==0 );
1eb10 0a 20 20 20 20 70 43 2d 3e 73 65 65 6b 52 65 73  .    pC->seekRes
1eb20 75 6c 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 62  ult = 0;.  }.  b
1eb30 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
1eb40 64 65 3a 20 53 65 71 75 65 6e 63 65 20 50 31 20  de: Sequence P1 
1eb50 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46  P2 * * *.**.** F
1eb60 69 6e 64 20 74 68 65 20 6e 65 78 74 20 61 76 61  ind the next ava
1eb70 69 6c 61 62 6c 65 20 73 65 71 75 65 6e 63 65 20  ilable sequence 
1eb80 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72 73 6f  number for curso
1eb90 72 20 50 31 2e 0a 2a 2a 20 57 72 69 74 65 20 74  r P1..** Write t
1eba0 68 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62  he sequence numb
1ebb0 65 72 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  er into register
1ebc0 20 50 32 2e 0a 2a 2a 20 54 68 65 20 73 65 71 75   P2..** The sequ
1ebd0 65 6e 63 65 20 6e 75 6d 62 65 72 20 6f 6e 20 74  ence number on t
1ebe0 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 63  he cursor is inc
1ebf0 72 65 6d 65 6e 74 65 64 20 61 66 74 65 72 20 74  remented after t
1ec00 68 69 73 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69  his.** instructi
1ec10 6f 6e 2e 20 20 0a 2a 2f 0a 63 61 73 65 20 4f 50  on.  .*/.case OP
1ec20 5f 53 65 71 75 65 6e 63 65 3a 20 7b 20 20 20 20  _Sequence: {    
1ec30 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70         /* out2-p
1ec40 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 61  rerelease */.  a
1ec50 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
1ec60 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
1ec70 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73  nCursor );.  ass
1ec80 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f  ert( p->apCsr[pO
1ec90 70 2d 3e 70 31 5d 21 3d 30 20 29 3b 0a 20 20 70  p->p1]!=0 );.  p
1eca0 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 2d 3e 61 70  Out->u.i = p->ap
1ecb0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 73 65  Csr[pOp->p1]->se
1ecc0 71 43 6f 75 6e 74 2b 2b 3b 0a 20 20 62 72 65 61  qCount++;.  brea
1ecd0 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65  k;.}.../* Opcode
1ece0 3a 20 4e 65 77 52 6f 77 69 64 20 50 31 20 50 32  : NewRowid P1 P2
1ecf0 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 47 65   P3 * *.**.** Ge
1ed00 74 20 61 20 6e 65 77 20 69 6e 74 65 67 65 72 20  t a new integer 
1ed10 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 28 61  record number (a
1ed20 2e 6b 2e 61 20 22 72 6f 77 69 64 22 29 20 75 73  .k.a "rowid") us
1ed30 65 64 20 61 73 20 74 68 65 20 6b 65 79 20 74 6f  ed as the key to
1ed40 20 61 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65   a table..** The
1ed50 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 69   record number i
1ed60 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79  s not previously
1ed70 20 75 73 65 64 20 61 73 20 61 20 6b 65 79 20 69   used as a key i
1ed80 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
1ed90 2a 20 74 61 62 6c 65 20 74 68 61 74 20 63 75 72  * table that cur
1eda0 73 6f 72 20 50 31 20 70 6f 69 6e 74 73 20 74 6f  sor P1 points to
1edb0 2e 20 20 54 68 65 20 6e 65 77 20 72 65 63 6f 72  .  The new recor
1edc0 64 20 6e 75 6d 62 65 72 20 69 73 20 77 72 69 74  d number is writ
1edd0 74 65 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  ten.** written t
1ede0 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  o register P2..*
1edf0 2a 0a 2a 2a 20 49 66 20 50 33 3e 30 20 74 68 65  *.** If P3>0 the
1ee00 6e 20 50 33 20 69 73 20 61 20 72 65 67 69 73 74  n P3 is a regist
1ee10 65 72 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 66  er in the root f
1ee20 72 61 6d 65 20 6f 66 20 74 68 69 73 20 56 44 42  rame of this VDB
1ee30 45 20 74 68 61 74 20 68 6f 6c 64 73 20 0a 2a 2a  E that holds .**
1ee40 20 74 68 65 20 6c 61 72 67 65 73 74 20 70 72 65   the largest pre
1ee50 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65  viously generate
1ee60 64 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e  d record number.
1ee70 20 4e 6f 20 6e 65 77 20 72 65 63 6f 72 64 20 6e   No new record n
1ee80 75 6d 62 65 72 73 20 61 72 65 0a 2a 2a 20 61 6c  umbers are.** al
1ee90 6c 6f 77 65 64 20 74 6f 20 62 65 20 6c 65 73 73  lowed to be less
1eea0 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
1eeb0 2e 20 57 68 65 6e 20 74 68 69 73 20 76 61 6c 75  . When this valu
1eec0 65 20 72 65 61 63 68 65 73 20 69 74 73 20 6d 61  e reaches its ma
1eed0 78 69 6d 75 6d 2c 20 0a 2a 2a 20 61 6e 20 53 51  ximum, .** an SQ
1eee0 4c 49 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20  LITE_FULL error 
1eef0 69 73 20 67 65 6e 65 72 61 74 65 64 2e 20 54 68  is generated. Th
1ef00 65 20 50 33 20 72 65 67 69 73 74 65 72 20 69 73  e P3 register is
1ef10 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68   updated with th
1ef20 65 20 27 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64  e '.** generated
1ef30 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20   record number. 
1ef40 54 68 69 73 20 50 33 20 6d 65 63 68 61 6e 69 73  This P3 mechanis
1ef50 6d 20 69 73 20 75 73 65 64 20 74 6f 20 68 65 6c  m is used to hel
1ef60 70 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a  p implement the.
1ef70 2a 2a 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  ** AUTOINCREMENT
1ef80 20 66 65 61 74 75 72 65 2e 0a 2a 2f 0a 63 61 73   feature..*/.cas
1ef90 65 20 4f 50 5f 4e 65 77 52 6f 77 69 64 3a 20 7b  e OP_NewRowid: {
1efa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
1efb0 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f  t2-prerelease */
1efc0 0a 20 20 69 36 34 20 76 3b 20 20 20 20 20 20 20  .  i64 v;       
1efd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1efe0 20 6e 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20   new rowid */.  
1eff0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 20  VdbeCursor *pC; 
1f000 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
1f010 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 67 65 74   of table to get
1f020 20 74 68 65 20 6e 65 77 20 72 6f 77 69 64 20 2a   the new rowid *
1f030 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20  /.  int res;    
1f040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1f050 73 75 6c 74 20 6f 66 20 61 6e 20 73 71 6c 69 74  sult of an sqlit
1f060 65 33 42 74 72 65 65 4c 61 73 74 28 29 20 2a 2f  e3BtreeLast() */
1f070 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
1f080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
1f090 6e 74 65 72 20 74 6f 20 6c 69 6d 69 74 20 74 68  nter to limit th
1f0a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72  e number of sear
1f0b0 63 68 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  ches */.  Mem *p
1f0c0 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
1f0d0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
1f0e0 64 69 6e 67 20 6c 61 72 67 65 73 74 20 72 6f 77  ding largest row
1f0f0 69 64 20 66 6f 72 20 41 55 54 4f 49 4e 43 52 45  id for AUTOINCRE
1f100 4d 45 4e 54 20 2a 2f 0a 20 20 56 64 62 65 46 72  MENT */.  VdbeFr
1f110 61 6d 65 20 2a 70 46 72 61 6d 65 3b 20 20 20 20  ame *pFrame;    
1f120 20 2f 2a 20 52 6f 6f 74 20 66 72 61 6d 65 20 6f   /* Root frame o
1f130 66 20 56 44 42 45 20 2a 2f 0a 0a 20 20 76 20 3d  f VDBE */..  v =
1f140 20 30 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20   0;.  res = 0;. 
1f150 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
1f160 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
1f170 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
1f180 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
1f190 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
1f1a0 20 70 43 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   pC!=0 );.  if( 
1f1b0 4e 45 56 45 52 28 70 43 2d 3e 70 43 75 72 73 6f  NEVER(pC->pCurso
1f1c0 72 3d 3d 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20  r==0) ){.    /* 
1f1d0 54 68 65 20 7a 65 72 6f 20 69 6e 69 74 69 61 6c  The zero initial
1f1e0 69 7a 61 74 69 6f 6e 20 61 62 6f 76 65 20 69 73  ization above is
1f1f0 20 61 6c 6c 20 74 68 61 74 20 69 73 20 6e 65 65   all that is nee
1f200 64 65 64 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  ded */.  }else{.
1f210 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
1f220 72 6f 77 69 64 20 6f 72 20 72 65 63 6f 72 64 20  rowid or record 
1f230 6e 75 6d 62 65 72 20 28 64 69 66 66 65 72 65 6e  number (differen
1f240 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20  t terms for the 
1f250 73 61 6d 65 0a 20 20 20 20 2a 2a 20 74 68 69 6e  same.    ** thin
1f260 67 29 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  g) is obtained i
1f270 6e 20 61 20 74 77 6f 2d 73 74 65 70 20 61 6c 67  n a two-step alg
1f280 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 0a 20  orithm..    **. 
1f290 20 20 20 2a 2a 20 46 69 72 73 74 20 77 65 20 61     ** First we a
1f2a0 74 74 65 6d 70 74 20 74 6f 20 66 69 6e 64 20 74  ttempt to find t
1f2b0 68 65 20 6c 61 72 67 65 73 74 20 65 78 69 73 74  he largest exist
1f2c0 69 6e 67 20 72 6f 77 69 64 20 61 6e 64 20 61 64  ing rowid and ad
1f2d0 64 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 74 6f 20  d one.    ** to 
1f2e0 74 68 61 74 2e 20 20 42 75 74 20 69 66 20 74 68  that.  But if th
1f2f0 65 20 6c 61 72 67 65 73 74 20 65 78 69 73 74 69  e largest existi
1f300 6e 67 20 72 6f 77 69 64 20 69 73 20 61 6c 72 65  ng rowid is alre
1f310 61 64 79 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a  ady the maximum.
1f320 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 76 65 20      ** positive 
1f330 69 6e 74 65 67 65 72 2c 20 77 65 20 68 61 76 65  integer, we have
1f340 20 74 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   to fall through
1f350 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 0a 20   to the second. 
1f360 20 20 20 2a 2a 20 70 72 6f 62 61 62 69 6c 69 73     ** probabilis
1f370 74 69 63 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20  tic algorithm.  
1f380 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1f390 73 65 63 6f 6e 64 20 61 6c 67 6f 72 69 74 68 6d  second algorithm
1f3a0 20 69 73 20 74 6f 20 73 65 6c 65 63 74 20 61 20   is to select a 
1f3b0 72 6f 77 69 64 20 61 74 20 72 61 6e 64 6f 6d 20  rowid at random 
1f3c0 61 6e 64 20 73 65 65 20 69 66 0a 20 20 20 20 2a  and see if.    *
1f3d0 2a 20 69 74 20 61 6c 72 65 61 64 79 20 65 78 69  * it already exi
1f3e0 73 74 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  sts in the table
1f3f0 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f  .  If it does no
1f400 74 20 65 78 69 73 74 2c 20 77 65 20 68 61 76 65  t exist, we have
1f410 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 65 64 65  .    ** succeede
1f420 64 2e 20 20 49 66 20 74 68 65 20 72 61 6e 64 6f  d.  If the rando
1f430 6d 20 72 6f 77 69 64 20 64 6f 65 73 20 65 78 69  m rowid does exi
1f440 73 74 2c 20 77 65 20 73 65 6c 65 63 74 20 61 20  st, we select a 
1f450 6e 65 77 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 61  new one.    ** a
1f460 6e 64 20 74 72 79 20 61 67 61 69 6e 2c 20 75 70  nd try again, up
1f470 20 74 6f 20 31 30 30 20 74 69 6d 65 73 2e 0a 20   to 100 times.. 
1f480 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1f490 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b  ( pC->isTable );
1f4a0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1f4b0 33 32 42 49 54 5f 52 4f 57 49 44 0a 23 20 20 20  32BIT_ROWID.#   
1f4c0 64 65 66 69 6e 65 20 4d 41 58 5f 52 4f 57 49 44  define MAX_ROWID
1f4d0 20 30 78 37 66 66 66 66 66 66 66 0a 23 65 6c 73   0x7fffffff.#els
1f4e0 65 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 20 63 6f  e.    /* Some co
1f4f0 6d 70 69 6c 65 72 73 20 63 6f 6d 70 6c 61 69 6e  mpilers complain
1f500 20 61 62 6f 75 74 20 63 6f 6e 73 74 61 6e 74 73   about constants
1f510 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 30 78 37   of the form 0x7
1f520 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 2e  fffffffffffffff.
1f530 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 73 20 63  .    ** Others c
1f540 6f 6d 70 6c 61 69 6e 20 61 62 6f 75 74 20 30 78  omplain about 0x
1f550 37 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66  7fffffffffffffff
1f560 66 4c 4c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  fLL.  The follow
1f570 69 6e 67 20 6d 61 63 72 6f 20 73 65 65 6d 73 0a  ing macro seems.
1f580 20 20 20 20 2a 2a 20 74 6f 20 70 72 6f 76 69 64      ** to provid
1f590 65 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 77  e the constant w
1f5a0 68 69 6c 65 20 6d 61 6b 69 6e 67 20 61 6c 6c 20  hile making all 
1f5b0 63 6f 6d 70 69 6c 65 72 73 20 68 61 70 70 79 2e  compilers happy.
1f5c0 0a 20 20 20 20 2a 2f 0a 23 20 20 20 64 65 66 69  .    */.#   defi
1f5d0 6e 65 20 4d 41 58 5f 52 4f 57 49 44 20 20 28 69  ne MAX_ROWID  (i
1f5e0 36 34 29 28 20 28 28 28 75 36 34 29 30 78 37 66  64)( (((u64)0x7f
1f5f0 66 66 66 66 66 66 29 3c 3c 33 32 29 20 7c 20 28  ffffff)<<32) | (
1f600 75 36 34 29 30 78 66 66 66 66 66 66 66 66 20 29  u64)0xffffffff )
1f610 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28  .#endif..    if(
1f620 20 21 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52   !pC->useRandomR
1f630 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 76 20  owid ){.      v 
1f640 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
1f650 74 43 61 63 68 65 64 52 6f 77 69 64 28 70 43 2d  tCachedRowid(pC-
1f660 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >pCursor);.     
1f670 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
1f680 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f690 33 42 74 72 65 65 4c 61 73 74 28 70 43 2d 3e 70  3BtreeLast(pC->p
1f6a0 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20  Cursor, &res);. 
1f6b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1f6c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f6d0 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74        goto abort
1f6e0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
1f6f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f700 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
1f710 20 20 20 20 20 20 76 20 3d 20 31 3b 20 20 20 2f        v = 1;   /
1f720 2a 20 49 4d 50 3a 20 52 2d 36 31 39 31 34 2d 34  * IMP: R-61914-4
1f730 38 30 37 34 20 2a 2f 0a 20 20 20 20 20 20 20 20  8074 */.        
1f740 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f750 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1f760 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
1f770 69 64 28 70 43 2d 3e 70 43 75 72 73 6f 72 29 20  id(pC->pCursor) 
1f780 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1f790 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
1f7a0 79 53 69 7a 65 28 70 43 2d 3e 70 43 75 72 73 6f  ySize(pC->pCurso
1f7b0 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20  r, &v);.        
1f7c0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1f7d0 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 2f 2a 20  LITE_OK );   /* 
1f7e0 43 61 6e 6e 6f 74 20 66 61 69 6c 20 66 6f 6c 6c  Cannot fail foll
1f7f0 6f 77 69 6e 67 20 42 74 72 65 65 4c 61 73 74 28  owing BtreeLast(
1f800 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  ) */.          i
1f810 66 28 20 76 3e 3d 4d 41 58 5f 52 4f 57 49 44 20  f( v>=MAX_ROWID 
1f820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1f830 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69  C->useRandomRowi
1f840 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  d = 1;.         
1f850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f860 20 20 20 20 76 2b 2b 3b 20 20 20 2f 2a 20 49 4d      v++;   /* IM
1f870 50 3a 20 52 2d 32 39 35 33 38 2d 33 34 39 38 37  P: R-29538-34987
1f880 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   */.          }.
1f890 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f8a0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1f8b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
1f8c0 4d 45 4e 54 0a 20 20 20 20 20 20 69 66 28 20 70  MENT.      if( p
1f8d0 4f 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20 20 20  Op->p3 ){.      
1f8e0 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
1f8f0 20 50 33 20 69 73 20 61 20 76 61 6c 69 64 20 6d   P3 is a valid m
1f900 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20  emory cell. */. 
1f910 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1f920 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20  Op->p3>0 );.    
1f930 20 20 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d      if( p->pFram
1f940 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  e ){.          f
1f950 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72  or(pFrame=p->pFr
1f960 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61  ame; pFrame->pPa
1f970 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72  rent; pFrame=pFr
1f980 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  ame->pParent);. 
1f990 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65           /* Asse
1f9a0 72 74 20 74 68 61 74 20 50 33 20 69 73 20 61 20  rt that P3 is a 
1f9b0 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 63 65 6c  valid memory cel
1f9c0 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  l. */.          
1f9d0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c  assert( pOp->p3<
1f9e0 3d 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 20 29 3b  =pFrame->nMem );
1f9f0 0a 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d 20  .          pMem 
1fa00 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b  = &pFrame->aMem[
1fa10 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20  pOp->p3];.      
1fa20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1fa30 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61     /* Assert tha
1fa40 74 20 50 33 20 69 73 20 61 20 76 61 6c 69 64 20  t P3 is a valid 
1fa50 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a  memory cell. */.
1fa60 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1fa70 28 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d  ( pOp->p3<=p->nM
1fa80 65 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  em );.          
1fa90 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pMem = &aMem[pOp
1faa0 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20 20 20 20  ->p3];.         
1fab0 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
1fac0 65 28 70 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  e(p, pMem);.    
1fad0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1fae0 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
1faf0 28 70 4d 65 6d 29 20 29 3b 0a 0a 20 20 20 20 20  (pMem) );..     
1fb00 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
1fb10 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4d 65 6d 29  E(pOp->p3, pMem)
1fb20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1fb30 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69  3VdbeMemIntegeri
1fb40 66 79 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20  fy(pMem);.      
1fb50 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d    assert( (pMem-
1fb60 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
1fb70 29 21 3d 30 20 29 3b 20 20 2f 2a 20 6d 65 6d 28  )!=0 );  /* mem(
1fb80 50 33 29 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74  P3) holds an int
1fb90 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  eger */.        
1fba0 69 66 28 20 70 4d 65 6d 2d 3e 75 2e 69 3d 3d 4d  if( pMem->u.i==M
1fbb0 41 58 5f 52 4f 57 49 44 20 7c 7c 20 70 43 2d 3e  AX_ROWID || pC->
1fbc0 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 29  useRandomRowid )
1fbd0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1fbe0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 20 20 20   SQLITE_FULL;   
1fbf0 2f 2a 20 49 4d 50 3a 20 52 2d 31 32 32 37 35 2d  /* IMP: R-12275-
1fc00 36 31 33 33 38 20 2a 2f 0a 20 20 20 20 20 20 20  61338 */.       
1fc10 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
1fc20 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
1fc30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1fc40 28 20 76 3c 70 4d 65 6d 2d 3e 75 2e 69 2b 31 20  ( v<pMem->u.i+1 
1fc50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 76 20 3d  ){.          v =
1fc60 20 70 4d 65 6d 2d 3e 75 2e 69 20 2b 20 31 3b 0a   pMem->u.i + 1;.
1fc70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fc80 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 76 3b    pMem->u.i = v;
1fc90 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1fca0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
1fcb0 72 65 65 53 65 74 43 61 63 68 65 64 52 6f 77 69  reeSetCachedRowi
1fcc0 64 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 76  d(pC->pCursor, v
1fcd0 3c 4d 41 58 5f 52 4f 57 49 44 20 3f 20 76 2b 31  <MAX_ROWID ? v+1
1fce0 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20   : 0);.    }.   
1fcf0 20 69 66 28 20 70 43 2d 3e 75 73 65 52 61 6e 64   if( pC->useRand
1fd00 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  omRowid ){.     
1fd10 20 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   /* IMPLEMENTATI
1fd20 4f 4e 2d 4f 46 3a 20 52 2d 30 37 36 37 37 2d 34  ON-OF: R-07677-4
1fd30 31 38 38 31 20 49 66 20 74 68 65 20 6c 61 72 67  1881 If the larg
1fd40 65 73 74 20 52 4f 57 49 44 20 69 73 20 65 71 75  est ROWID is equ
1fd50 61 6c 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  al to the.      
1fd60 2a 2a 20 6c 61 72 67 65 73 74 20 70 6f 73 73 69  ** largest possi
1fd70 62 6c 65 20 69 6e 74 65 67 65 72 20 28 39 32 32  ble integer (922
1fd80 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37  3372036854775807
1fd90 29 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  ) then the datab
1fda0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 67  ase.      ** eng
1fdb0 69 6e 65 20 73 74 61 72 74 73 20 70 69 63 6b 69  ine starts picki
1fdc0 6e 67 20 70 6f 73 69 74 69 76 65 20 63 61 6e 64  ng positive cand
1fdd0 69 64 61 74 65 20 52 4f 57 49 44 73 20 61 74 20  idate ROWIDs at 
1fde0 72 61 6e 64 6f 6d 20 75 6e 74 69 6c 0a 20 20 20  random until.   
1fdf0 20 20 20 2a 2a 20 69 74 20 66 69 6e 64 73 20 6f     ** it finds o
1fe00 6e 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 70  ne that is not p
1fe10 72 65 76 69 6f 75 73 6c 79 20 75 73 65 64 2e 20  reviously used. 
1fe20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1fe30 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 3b 20 20   pOp->p3==0 );  
1fe40 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20 62 65 20  /* We cannot be 
1fe50 69 6e 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20  in random rowid 
1fe60 6d 6f 64 65 20 69 66 20 74 68 69 73 20 69 73 0a  mode if this is.
1fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe80 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1fe90 61 6e 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  an AUTOINCREMENT
1fea0 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20   table. */.     
1feb0 20 2f 2a 20 6f 6e 20 74 68 65 20 66 69 72 73 74   /* on the first
1fec0 20 61 74 74 65 6d 70 74 2c 20 73 69 6d 70 6c 79   attempt, simply
1fed0 20 64 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   do one more tha
1fee0 6e 20 70 72 65 76 69 6f 75 73 20 2a 2f 0a 20 20  n previous */.  
1fef0 20 20 20 20 76 20 3d 20 6c 61 73 74 52 6f 77 69      v = lastRowi
1ff00 64 3b 0a 20 20 20 20 20 20 76 20 26 3d 20 28 4d  d;.      v &= (M
1ff10 41 58 5f 52 4f 57 49 44 3e 3e 31 29 3b 20 2f 2a  AX_ROWID>>1); /*
1ff20 20 65 6e 73 75 72 65 20 64 6f 65 73 6e 27 74 20   ensure doesn't 
1ff30 67 6f 20 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20  go negative */. 
1ff40 20 20 20 20 20 76 2b 2b 3b 20 2f 2a 20 65 6e 73       v++; /* ens
1ff50 75 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a  ure non-zero */.
1ff60 20 20 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20        cnt = 0;. 
1ff70 20 20 20 20 20 77 68 69 6c 65 28 20 20 20 28 28       while(   ((
1ff80 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1ff90 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
1ffa0 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  pC->pCursor, 0, 
1ffb0 28 75 36 34 29 76 2c 0a 20 20 20 20 20 20 20 20  (u64)v,.        
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffe0 20 20 20 20 20 20 20 20 20 30 2c 20 26 72 65 73           0, &res
1fff0 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a 20  ))==SQLITE_OK). 
20000 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72             && (r
20010 65 73 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20  es==0).         
20020 20 20 20 26 26 20 28 2b 2b 63 6e 74 3c 31 30 30     && (++cnt<100
20030 29 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63  )){.        /* c
20040 6f 6c 6c 69 73 69 6f 6e 20 2d 20 74 72 79 20 61  ollision - try a
20050 6e 6f 74 68 65 72 20 72 61 6e 64 6f 6d 20 72 6f  nother random ro
20060 77 69 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  wid */.        s
20070 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
20080 73 28 73 69 7a 65 6f 66 28 76 29 2c 20 26 76 29  s(sizeof(v), &v)
20090 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6e  ;.        if( cn
200a0 74 3c 35 20 29 7b 0a 20 20 20 20 20 20 20 20 20  t<5 ){.         
200b0 20 2f 2a 20 74 72 79 20 22 73 6d 61 6c 6c 22 20   /* try "small" 
200c0 72 61 6e 64 6f 6d 20 72 6f 77 69 64 73 20 66 6f  random rowids fo
200d0 72 20 74 68 65 20 69 6e 69 74 69 61 6c 20 61 74  r the initial at
200e0 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 20 20  tempts */.      
200f0 20 20 20 20 76 20 26 3d 20 30 78 66 66 66 66 66      v &= 0xfffff
20100 66 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  f;.        }else
20110 7b 0a 20 20 20 20 20 20 20 20 20 20 76 20 26 3d  {.          v &=
20120 20 28 4d 41 58 5f 52 4f 57 49 44 3e 3e 31 29 3b   (MAX_ROWID>>1);
20130 20 2f 2a 20 65 6e 73 75 72 65 20 64 6f 65 73 6e   /* ensure doesn
20140 27 74 20 67 6f 20 6e 65 67 61 74 69 76 65 20 2a  't go negative *
20150 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
20160 20 20 20 20 76 2b 2b 3b 20 2f 2a 20 65 6e 73 75      v++; /* ensu
20170 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20  re non-zero */. 
20180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20190 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
201a0 26 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  & res==0 ){.    
201b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
201c0 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50 3a 20  FULL;   /* IMP: 
201d0 52 2d 33 38 32 31 39 2d 35 33 30 30 32 20 2a 2f  R-38219-53002 */
201e0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62  .        goto ab
201f0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
20200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20210 61 73 73 65 72 74 28 20 76 3e 30 20 29 3b 20 20  assert( v>0 );  
20220 2f 2a 20 45 56 3a 20 52 2d 34 30 38 31 32 2d 30  /* EV: R-40812-0
20230 33 35 37 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  3570 */.    }.  
20240 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c    pC->rowidIsVal
20250 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e  id = 0;.    pC->
20260 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
20270 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68   0;.    pC->cach
20280 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
20290 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 70 4f 75  STALE;.  }.  pOu
202a0 74 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 62 72  t->u.i = v;.  br
202b0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
202c0 65 3a 20 49 6e 73 65 72 74 20 50 31 20 50 32 20  e: Insert P1 P2 
202d0 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 57  P3 P4 P5.**.** W
202e0 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
202f0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20  to the table of 
20300 63 75 72 73 6f 72 20 50 31 2e 20 20 41 20 6e 65  cursor P1.  A ne
20310 77 20 65 6e 74 72 79 20 69 73 0a 2a 2a 20 63 72  w entry is.** cr
20320 65 61 74 65 64 20 69 66 20 69 74 20 64 6f 65 73  eated if it does
20330 6e 27 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  n't already exis
20340 74 20 6f 72 20 74 68 65 20 64 61 74 61 20 66 6f  t or the data fo
20350 72 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a  r an existing.**
20360 20 65 6e 74 72 79 20 69 73 20 6f 76 65 72 77 72   entry is overwr
20370 69 74 74 65 6e 2e 20 20 54 68 65 20 64 61 74 61  itten.  The data
20380 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 4d 45   is the value ME
20390 4d 5f 42 6c 6f 62 20 73 74 6f 72 65 64 20 69 6e  M_Blob stored in
203a0 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6e 75 6d   register.** num
203b0 62 65 72 20 50 32 2e 20 54 68 65 20 6b 65 79 20  ber P2. The key 
203c0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
203d0 69 73 74 65 72 20 50 33 2e 20 54 68 65 20 6b 65  ister P3. The ke
203e0 79 20 6d 75 73 74 0a 2a 2a 20 62 65 20 61 20 4d  y must.** be a M
203f0 45 4d 5f 49 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  EM_Int..**.** If
20400 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41   the OPFLAG_NCHA
20410 4e 47 45 20 66 6c 61 67 20 6f 66 20 50 35 20 69  NGE flag of P5 i
20420 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
20430 72 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  row change count
20440 20 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74   is.** increment
20450 65 64 20 28 6f 74 68 65 72 77 69 73 65 20 6e 6f  ed (otherwise no
20460 74 29 2e 20 20 49 66 20 74 68 65 20 4f 50 46 4c  t).  If the OPFL
20470 41 47 5f 4c 41 53 54 52 4f 57 49 44 20 66 6c 61  AG_LASTROWID fla
20480 67 20 6f 66 20 50 35 20 69 73 20 73 65 74 2c 0a  g of P5 is set,.
20490 2a 2a 20 74 68 65 6e 20 72 6f 77 69 64 20 69 73  ** then rowid is
204a0 20 73 74 6f 72 65 64 20 66 6f 72 20 73 75 62 73   stored for subs
204b0 65 71 75 65 6e 74 20 72 65 74 75 72 6e 20 62 79  equent return by
204c0 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
204d0 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
204e0 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 28 6f 74  d() function (ot
204f0 68 65 72 77 69 73 65 20 69 74 20 69 73 20 75 6e  herwise it is un
20500 6d 6f 64 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  modified)..**.**
20510 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 55   If the OPFLAG_U
20520 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61  SESEEKRESULT fla
20530 67 20 6f 66 20 50 35 20 69 73 20 73 65 74 20 61  g of P5 is set a
20540 6e 64 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  nd if the result
20550 20 6f 66 0a 2a 2a 20 74 68 65 20 6c 61 73 74 20   of.** the last 
20560 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20 28  seek operation (
20570 4f 50 5f 4e 6f 74 45 78 69 73 74 73 29 20 77 61  OP_NotExists) wa
20580 73 20 61 20 73 75 63 63 65 73 73 2c 20 74 68 65  s a success, the
20590 6e 20 74 68 69 73 0a 2a 2a 20 6f 70 65 72 61 74  n this.** operat
205a0 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74  ion will not att
205b0 65 6d 70 74 20 74 6f 20 66 69 6e 64 20 74 68 65  empt to find the
205c0 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 6f 77   appropriate row
205d0 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 0a 2a 2a   before doing.**
205e0 20 74 68 65 20 69 6e 73 65 72 74 20 62 75 74 20   the insert but 
205f0 77 69 6c 6c 20 69 6e 73 74 65 61 64 20 6f 76 65  will instead ove
20600 72 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74  rwrite the row t
20610 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
20620 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70  s.** currently p
20630 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 50 72 65  ointing to.  Pre
20640 73 75 6d 61 62 6c 79 2c 20 74 68 65 20 70 72 69  sumably, the pri
20650 6f 72 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20  or OP_NotExists 
20660 6f 70 63 6f 64 65 0a 2a 2a 20 68 61 73 20 61 6c  opcode.** has al
20670 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64  ready positioned
20680 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f 72 72   the cursor corr
20690 65 63 74 6c 79 2e 20 20 54 68 69 73 20 69 73 20  ectly.  This is 
206a0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  an optimization.
206b0 2a 2a 20 74 68 61 74 20 62 6f 6f 73 74 73 20 70  ** that boosts p
206c0 65 72 66 6f 72 6d 61 6e 63 65 20 62 79 20 61 76  erformance by av
206d0 6f 69 64 69 6e 67 20 72 65 64 75 6e 64 61 6e 74  oiding redundant
206e0 20 73 65 65 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   seeks..**.** If
206f0 20 74 68 65 20 4f 50 46 4c 41 47 5f 49 53 55 50   the OPFLAG_ISUP
20700 44 41 54 45 20 66 6c 61 67 20 69 73 20 73 65 74  DATE flag is set
20710 2c 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63 6f  , then this opco
20720 64 65 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  de is part of an
20730 0a 2a 2a 20 55 50 44 41 54 45 20 6f 70 65 72 61  .** UPDATE opera
20740 74 69 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65  tion.  Otherwise
20750 20 28 69 66 20 74 68 65 20 66 6c 61 67 20 69 73   (if the flag is
20760 20 63 6c 65 61 72 29 20 74 68 65 6e 20 74 68 69   clear) then thi
20770 73 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 70  s opcode.** is p
20780 61 72 74 20 6f 66 20 61 6e 20 49 4e 53 45 52 54  art of an INSERT
20790 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 54 68 65   operation.  The
207a0 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 6f   difference is o
207b0 6e 6c 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  nly important to
207c0 0a 2a 2a 20 74 68 65 20 75 70 64 61 74 65 20 68  .** the update h
207d0 6f 6f 6b 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ook..**.** Param
207e0 65 74 65 72 20 50 34 20 6d 61 79 20 70 6f 69 6e  eter P4 may poin
207f0 74 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72  t to a Table str
20800 75 63 74 75 72 65 2c 20 6f 72 20 6d 61 79 20 62  ucture, or may b
20810 65 20 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69 73  e NULL. If it is
20820 20 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74   .** not NULL, t
20830 68 65 6e 20 74 68 65 20 75 70 64 61 74 65 2d 68  hen the update-h
20840 6f 6f 6b 20 28 73 71 6c 69 74 65 33 2e 78 55 70  ook (sqlite3.xUp
20850 64 61 74 65 43 61 6c 6c 62 61 63 6b 29 20 69 73  dateCallback) is
20860 20 69 6e 76 6f 6b 65 64 20 0a 2a 2a 20 66 6f 6c   invoked .** fol
20870 6c 6f 77 69 6e 67 20 61 20 73 75 63 63 65 73 73  lowing a success
20880 66 75 6c 20 69 6e 73 65 72 74 2e 0a 2a 2a 0a 2a  ful insert..**.*
20890 2a 20 28 57 41 52 4e 49 4e 47 2f 54 4f 44 4f 3a  * (WARNING/TODO:
208a0 20 49 66 20 50 31 20 69 73 20 61 20 70 73 65 75   If P1 is a pseu
208b0 64 6f 2d 63 75 72 73 6f 72 20 61 6e 64 20 50 32  do-cursor and P2
208c0 20 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   is dynamically.
208d0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68  ** allocated, th
208e0 65 6e 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  en ownership of 
208f0 50 32 20 69 73 20 74 72 61 6e 73 66 65 72 72 65  P2 is transferre
20900 64 20 74 6f 20 74 68 65 20 70 73 65 75 64 6f 2d  d to the pseudo-
20910 63 75 72 73 6f 72 0a 2a 2a 20 61 6e 64 20 72 65  cursor.** and re
20920 67 69 73 74 65 72 20 50 32 20 62 65 63 6f 6d 65  gister P2 become
20930 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 49 66  s ephemeral.  If
20940 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 63   the cursor is c
20950 68 61 6e 67 65 64 2c 20 74 68 65 0a 2a 2a 20 76  hanged, the.** v
20960 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72  alue of register
20970 20 50 32 20 77 69 6c 6c 20 74 68 65 6e 20 63 68   P2 will then ch
20980 61 6e 67 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ange.  Make sure
20990 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 0a 2a   this does not.*
209a0 2a 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  * cause any prob
209b0 6c 65 6d 73 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69  lems.).**.** Thi
209c0 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e  s instruction on
209d0 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 74 61 62 6c  ly works on tabl
209e0 65 73 2e 20 20 54 68 65 20 65 71 75 69 76 61 6c  es.  The equival
209f0 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  ent instruction.
20a00 2a 2a 20 66 6f 72 20 69 6e 64 69 63 65 73 20 69  ** for indices i
20a10 73 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2e 0a  s OP_IdxInsert..
20a20 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e  */./* Opcode: In
20a30 73 65 72 74 49 6e 74 20 50 31 20 50 32 20 50 33  sertInt P1 P2 P3
20a40 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69   P4 P5.**.** Thi
20a50 73 20 77 6f 72 6b 73 20 65 78 61 63 74 6c 79 20  s works exactly 
20a60 6c 69 6b 65 20 4f 50 5f 49 6e 73 65 72 74 20 65  like OP_Insert e
20a70 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6b  xcept that the k
20a80 65 79 20 69 73 20 74 68 65 0a 2a 2a 20 69 6e 74  ey is the.** int
20a90 65 67 65 72 20 76 61 6c 75 65 20 50 33 2c 20 6e  eger value P3, n
20aa0 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ot the value of 
20ab0 74 68 65 20 69 6e 74 65 67 65 72 20 73 74 6f 72  the integer stor
20ac0 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
20ad0 33 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  3..*/.case OP_In
20ae0 73 65 72 74 3a 20 0a 63 61 73 65 20 4f 50 5f 49  sert: .case OP_I
20af0 6e 73 65 72 74 49 6e 74 3a 20 7b 0a 20 20 4d 65  nsertInt: {.  Me
20b00 6d 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20  m *pData;       
20b10 2f 2a 20 4d 45 4d 20 63 65 6c 6c 20 68 6f 6c 64  /* MEM cell hold
20b20 69 6e 67 20 64 61 74 61 20 66 6f 72 20 74 68 65  ing data for the
20b30 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e   record to be in
20b40 73 65 72 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 20  serted */.  Mem 
20b50 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 2f 2a  *pKey;        /*
20b60 20 4d 45 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e   MEM cell holdin
20b70 67 20 6b 65 79 20 20 66 6f 72 20 74 68 65 20 72  g key  for the r
20b80 65 63 6f 72 64 20 2a 2f 0a 20 20 69 36 34 20 69  ecord */.  i64 i
20b90 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Key;         /* 
20ba0 54 68 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49  The integer ROWI
20bb0 44 20 6f 72 20 6b 65 79 20 66 6f 72 20 74 68 65  D or key for the
20bc0 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e   record to be in
20bd0 73 65 72 74 65 64 20 2a 2f 0a 20 20 56 64 62 65  serted */.  Vdbe
20be0 43 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 2f 2a  Cursor *pC;   /*
20bf0 20 43 75 72 73 6f 72 20 74 6f 20 74 61 62 6c 65   Cursor to table
20c00 20 69 6e 74 6f 20 77 68 69 63 68 20 69 6e 73 65   into which inse
20c10 72 74 20 69 73 20 77 72 69 74 74 65 6e 20 2a 2f  rt is written */
20c20 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 3b 20 20 20  .  int nZero;   
20c30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20c40 66 20 7a 65 72 6f 2d 62 79 74 65 73 20 74 6f 20  f zero-bytes to 
20c50 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  append */.  int 
20c60 73 65 65 6b 52 65 73 75 6c 74 3b 20 20 20 2f 2a  seekResult;   /*
20c70 20 52 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72   Result of prior
20c80 20 73 65 65 6b 20 6f 72 20 30 20 69 66 20 6e 6f   seek or 0 if no
20c90 20 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66   USESEEKRESULT f
20ca0 6c 61 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  lag */.  const c
20cb0 68 61 72 20 2a 7a 44 62 3b 20 20 2f 2a 20 64 61  har *zDb;  /* da
20cc0 74 61 62 61 73 65 20 6e 61 6d 65 20 2d 20 75 73  tabase name - us
20cd0 65 64 20 62 79 20 74 68 65 20 75 70 64 61 74 65  ed by the update
20ce0 20 68 6f 6f 6b 20 2a 2f 0a 20 20 54 61 62 6c 65   hook */.  Table
20cf0 20 2a 70 54 61 62 3b 20 20 20 20 20 20 2f 2a 20   *pTab;      /* 
20d00 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
20d10 2d 20 75 73 65 64 20 62 79 20 75 70 64 61 74 65  - used by update
20d20 20 61 6e 64 20 70 72 65 2d 75 70 64 61 74 65 20   and pre-update 
20d30 68 6f 6f 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 6f  hooks */.  int o
20d40 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
20d50 4f 70 63 6f 64 65 20 66 6f 72 20 75 70 64 61 74  Opcode for updat
20d60 65 20 68 6f 6f 6b 3a 20 53 51 4c 49 54 45 5f 55  e hook: SQLITE_U
20d70 50 44 41 54 45 20 6f 72 20 53 51 4c 49 54 45 5f  PDATE or SQLITE_
20d80 49 4e 53 45 52 54 20 2a 2f 0a 0a 20 20 70 44 61  INSERT */..  pDa
20d90 74 61 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ta = &aMem[pOp->
20da0 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p2];.  assert( p
20db0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
20dc0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
20dd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  );.  assert( mem
20de0 49 73 56 61 6c 69 64 28 70 44 61 74 61 29 20 29  IsValid(pData) )
20df0 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
20e00 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
20e10 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
20e20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70 43 75   assert( pC->pCu
20e30 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rsor!=0 );.  ass
20e40 65 72 74 28 20 70 43 2d 3e 70 73 65 75 64 6f 54  ert( pC->pseudoT
20e50 61 62 6c 65 52 65 67 3d 3d 30 20 29 3b 0a 20 20  ableReg==0 );.  
20e60 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61  assert( pC->isTa
20e70 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ble );.  assert(
20e80 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
20e90 5f 54 41 42 4c 45 20 7c 7c 20 70 4f 70 2d 3e 70  _TABLE || pOp->p
20ea0 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53 45  4type==P4_NOTUSE
20eb0 44 20 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f  D );.  REGISTER_
20ec0 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70  TRACE(pOp->p2, p
20ed0 44 61 74 61 29 3b 0a 0a 20 20 69 66 28 20 70 4f  Data);..  if( pO
20ee0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  p->opcode==OP_In
20ef0 73 65 72 74 20 29 7b 0a 20 20 20 20 70 4b 65 79  sert ){.    pKey
20f00 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
20f10 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
20f20 4b 65 79 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Key->flags & MEM
20f30 5f 49 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  _Int );.    asse
20f40 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70  rt( memIsValid(p
20f50 4b 65 79 29 20 29 3b 0a 20 20 20 20 52 45 47 49  Key) );.    REGI
20f60 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
20f70 70 33 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 69  p3, pKey);.    i
20f80 4b 65 79 20 3d 20 70 4b 65 79 2d 3e 75 2e 69 3b  Key = pKey->u.i;
20f90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
20fa0 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
20fb0 65 3d 3d 4f 50 5f 49 6e 73 65 72 74 49 6e 74 20  e==OP_InsertInt 
20fc0 29 3b 0a 20 20 20 20 69 4b 65 79 20 3d 20 70 4f  );.    iKey = pO
20fd0 70 2d 3e 70 33 3b 0a 20 20 7d 0a 0a 20 20 69 66  p->p3;.  }..  if
20fe0 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
20ff0 34 5f 54 41 42 4c 45 20 26 26 20 48 41 53 5f 55  4_TABLE && HAS_U
21000 50 44 41 54 45 5f 48 4f 4f 4b 28 64 62 29 20 29  PDATE_HOOK(db) )
21010 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
21020 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20  ->isTable );.   
21030 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 44 62   assert( pC->iDb
21040 3e 3d 30 20 29 3b 0a 20 20 20 20 7a 44 62 20 3d  >=0 );.    zDb =
21050 20 64 62 2d 3e 61 44 62 5b 70 43 2d 3e 69 44 62   db->aDb[pC->iDb
21060 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 54 61  ].zName;.    pTa
21070 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62  b = pOp->p4.pTab
21080 3b 0a 20 20 20 20 6f 70 20 3d 20 28 28 70 4f 70  ;.    op = ((pOp
21090 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 49 53  ->p5 & OPFLAG_IS
210a0 55 50 44 41 54 45 29 20 3f 20 53 51 4c 49 54 45  UPDATE) ? SQLITE
210b0 5f 55 50 44 41 54 45 20 3a 20 53 51 4c 49 54 45  _UPDATE : SQLITE
210c0 5f 49 4e 53 45 52 54 29 3b 0a 20 20 7d 0a 0a 23  _INSERT);.  }..#
210d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
210e0 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
210f0 4f 4b 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74  OK.  /* Invoke t
21100 68 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f  he pre-update ho
21110 6f 6b 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  ok, if any */.  
21120 69 66 28 20 64 62 2d 3e 78 50 72 65 55 70 64 61  if( db->xPreUpda
21130 74 65 43 61 6c 6c 62 61 63 6b 20 0a 20 20 20 26  teCallback .   &
21140 26 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  & pOp->p4type==P
21150 34 5f 54 41 42 4c 45 0a 20 20 20 26 26 20 28 21  4_TABLE.   && (!
21160 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41  (pOp->p5 & OPFLA
21170 47 5f 49 53 55 50 44 41 54 45 29 20 7c 7c 20 70  G_ISUPDATE) || p
21180 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 3d  C->rowidIsValid=
21190 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  =0).  ){.    sql
211a0 69 74 65 33 56 64 62 65 50 72 65 55 70 64 61 74  ite3VdbePreUpdat
211b0 65 48 6f 6f 6b 28 70 2c 20 70 43 2c 20 53 51 4c  eHook(p, pC, SQL
211c0 49 54 45 5f 49 4e 53 45 52 54 2c 20 7a 44 62 2c  ITE_INSERT, zDb,
211d0 20 70 54 61 62 2c 20 69 4b 65 79 2c 20 70 4f 70   pTab, iKey, pOp
211e0 2d 3e 70 32 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ->p2);.  }.#endi
211f0 66 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35  f..  if( pOp->p5
21200 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47   & OPFLAG_NCHANG
21210 45 20 29 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b  E ) p->nChange++
21220 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20  ;.  if( pOp->p5 
21230 26 20 4f 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57  & OPFLAG_LASTROW
21240 49 44 20 29 20 64 62 2d 3e 6c 61 73 74 52 6f 77  ID ) db->lastRow
21250 69 64 20 3d 20 6c 61 73 74 52 6f 77 69 64 20 3d  id = lastRowid =
21260 20 69 4b 65 79 3b 0a 20 20 69 66 28 20 70 44 61   iKey;.  if( pDa
21270 74 61 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ta->flags & MEM_
21280 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70 44 61 74  Null ){.    pDat
21290 61 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 70 44  a->z = 0;.    pD
212a0 61 74 61 2d 3e 6e 20 3d 20 30 3b 0a 20 20 7d 65  ata->n = 0;.  }e
212b0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
212c0 20 70 44 61 74 61 2d 3e 66 6c 61 67 73 20 26 20   pData->flags & 
212d0 28 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74  (MEM_Blob|MEM_St
212e0 72 29 20 29 3b 0a 20 20 7d 0a 20 20 73 65 65 6b  r) );.  }.  seek
212f0 52 65 73 75 6c 74 20 3d 20 28 28 70 4f 70 2d 3e  Result = ((pOp->
21300 70 35 20 26 20 4f 50 46 4c 41 47 5f 55 53 45 53  p5 & OPFLAG_USES
21310 45 45 4b 52 45 53 55 4c 54 29 20 3f 20 70 43 2d  EEKRESULT) ? pC-
21320 3e 73 65 65 6b 52 65 73 75 6c 74 20 3a 20 30 29  >seekResult : 0)
21330 3b 0a 20 20 69 66 28 20 70 44 61 74 61 2d 3e 66  ;.  if( pData->f
21340 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
21350 29 7b 0a 20 20 20 20 6e 5a 65 72 6f 20 3d 20 70  ){.    nZero = p
21360 44 61 74 61 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  Data->u.nZero;. 
21370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 5a 65 72   }else{.    nZer
21380 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  o = 0;.  }.  sql
21390 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
213a0 65 64 52 6f 77 69 64 28 70 43 2d 3e 70 43 75 72  edRowid(pC->pCur
213b0 73 6f 72 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20  sor, 0);.  rc = 
213c0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
213d0 72 74 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  rt(pC->pCursor, 
213e0 30 2c 20 69 4b 65 79 2c 0a 20 20 20 20 20 20 20  0, iKey,.       
213f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21400 20 20 20 70 44 61 74 61 2d 3e 7a 2c 20 70 44 61     pData->z, pDa
21410 74 61 2d 3e 6e 2c 20 6e 5a 65 72 6f 2c 0a 20 20  ta->n, nZero,.  
21420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21430 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 35 20          pOp->p5 
21440 26 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 2c  & OPFLAG_APPEND,
21450 20 73 65 65 6b 52 65 73 75 6c 74 0a 20 20 29 3b   seekResult.  );
21460 0a 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61  .  pC->rowidIsVa
21470 6c 69 64 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 64  lid = 0;.  pC->d
21480 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
21490 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74  0;.  pC->cacheSt
214a0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
214b0 4c 45 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65  LE;..  /* Invoke
214c0 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b   the update-hook
214d0 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
214e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
214f0 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 78 55 70 64  E_OK && db->xUpd
21500 61 74 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 70  ateCallback && p
21510 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20 20  Op->p4.z ){.    
21520 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  db->xUpdateCallb
21530 61 63 6b 28 64 62 2d 3e 70 55 70 64 61 74 65 41  ack(db->pUpdateA
21540 72 67 2c 20 6f 70 2c 20 7a 44 62 2c 20 70 54 61  rg, op, zDb, pTa
21550 62 2d 3e 7a 4e 61 6d 65 2c 20 69 4b 65 79 29 3b  b->zName, iKey);
21560 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
21570 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65 6c 65  ./* Opcode: Dele
21580 74 65 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  te P1 P2 P3 P4 *
21590 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  .**.** Delete th
215a0 65 20 72 65 63 6f 72 64 20 61 74 20 77 68 69 63  e record at whic
215b0 68 20 74 68 65 20 50 31 20 63 75 72 73 6f 72 20  h the P1 cursor 
215c0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
215d0 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
215e0 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20   cursor will be 
215f0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
21600 20 65 69 74 68 65 72 20 74 68 65 20 6e 65 78 74   either the next
21610 20 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73   or the previous
21620 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e 20 74 68  .** record in th
21630 65 20 74 61 62 6c 65 2e 20 49 66 20 69 74 20 69  e table. If it i
21640 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
21650 61 74 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f  at the next reco
21660 72 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  rd, then.** the 
21670 6e 65 78 74 20 4e 65 78 74 20 69 6e 73 74 72 75  next Next instru
21680 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 20  ction will be a 
21690 6e 6f 2d 6f 70 2e 20 20 48 65 6e 63 65 20 69 74  no-op.  Hence it
216a0 20 69 73 20 4f 4b 20 74 6f 20 64 65 6c 65 74 65   is OK to delete
216b0 0a 2a 2a 20 61 20 72 65 63 6f 72 64 20 66 72 6f  .** a record fro
216c0 6d 20 77 69 74 68 69 6e 20 61 6e 20 4e 65 78 74  m within an Next
216d0 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   loop..**.** If 
216e0 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  the OPFLAG_NCHAN
216f0 47 45 20 66 6c 61 67 20 6f 66 20 50 32 20 69 73  GE flag of P2 is
21700 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72   set, then the r
21710 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20  ow change count 
21720 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65  is.** incremente
21730 64 20 28 6f 74 68 65 72 77 69 73 65 20 6e 6f 74  d (otherwise not
21740 29 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 6d 75 73 74  )..**.** P1 must
21750 20 6e 6f 74 20 62 65 20 70 73 65 75 64 6f 2d 74   not be pseudo-t
21760 61 62 6c 65 2e 20 20 49 74 20 68 61 73 20 74 6f  able.  It has to
21770 20 62 65 20 61 20 72 65 61 6c 20 74 61 62 6c 65   be a real table
21780 20 77 69 74 68 0a 2a 2a 20 6d 75 6c 74 69 70 6c   with.** multipl
21790 65 20 72 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  e rows..**.** If
217a0 20 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20   P4 is not NULL 
217b0 74 68 65 6e 20 69 74 20 70 6f 69 6e 74 73 20 74  then it points t
217c0 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 74 75  o a Table strutu
217d0 72 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  re. In this case
217e0 20 65 69 74 68 65 72 20 0a 2a 2a 20 74 68 65 20   either .** the 
217f0 75 70 64 61 74 65 20 6f 72 20 70 72 65 2d 75 70  update or pre-up
21800 64 61 74 65 20 68 6f 6f 6b 2c 20 6f 72 20 62 6f  date hook, or bo
21810 74 68 2c 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b  th, may be invok
21820 65 64 2e 20 54 68 65 20 50 31 20 63 75 72 73 6f  ed. The P1 curso
21830 72 20 6d 75 73 74 0a 2a 2a 20 68 61 76 65 20 62  r must.** have b
21840 65 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 20 75  een positioned u
21850 73 69 6e 67 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  sing OP_NotFound
21860 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
21870 6e 67 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69  ng this opcode i
21880 6e 20 0a 2a 2a 20 74 68 69 73 20 63 61 73 65 2e  n .** this case.
21890 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69   Specifically, i
218a0 66 20 6f 6e 65 20 69 73 20 63 6f 6e 66 69 67 75  f one is configu
218b0 72 65 64 2c 20 74 68 65 20 70 72 65 2d 75 70 64  red, the pre-upd
218c0 61 74 65 20 68 6f 6f 6b 20 69 73 20 0a 2a 2a 20  ate hook is .** 
218d0 69 6e 76 6f 6b 65 64 20 69 66 20 50 34 20 69 73  invoked if P4 is
218e0 20 6e 6f 74 20 4e 55 4c 4c 2e 20 54 68 65 20 75   not NULL. The u
218f0 70 64 61 74 65 2d 68 6f 6f 6b 20 69 73 20 69 6e  pdate-hook is in
21900 76 6f 6b 65 64 20 69 66 20 6f 6e 65 20 69 73 20  voked if one is 
21910 63 6f 6e 66 69 67 75 72 65 64 2c 20 0a 2a 2a 20  configured, .** 
21920 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  P4 is not NULL, 
21930 61 6e 64 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e  and the OPFLAG_N
21940 43 48 41 4e 47 45 20 66 6c 61 67 20 69 73 20 73  CHANGE flag is s
21950 65 74 20 69 6e 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  et in P2..**.** 
21960 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 49 53  If the OPFLAG_IS
21970 55 50 44 41 54 45 20 66 6c 61 67 20 69 73 20 73  UPDATE flag is s
21980 65 74 20 69 6e 20 50 32 2c 20 74 68 65 6e 20 50  et in P2, then P
21990 33 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61  3 contains the a
219a0 64 64 72 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65  ddress.** of the
219b0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
219c0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  t contains the v
219d0 61 6c 75 65 20 74 68 61 74 20 74 68 65 20 72 6f  alue that the ro
219e0 77 69 64 20 6f 66 20 74 68 65 20 72 6f 77 20 77  wid of the row w
219f0 69 6c 6c 0a 2a 2a 20 62 65 20 73 65 74 20 74 6f  ill.** be set to
21a00 20 62 79 20 74 68 65 20 75 70 64 61 74 65 2e 0a   by the update..
21a10 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65 6c 65 74  */.case OP_Delet
21a20 65 3a 20 7b 0a 20 20 69 36 34 20 69 4b 65 79 3b  e: {.  i64 iKey;
21a30 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
21a40 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  C;.  const char 
21a50 2a 7a 44 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70  *zDb;.  Table *p
21a60 54 61 62 3b 0a 20 20 69 6e 74 20 6f 70 66 6c 61  Tab;.  int opfla
21a70 67 73 3b 0a 0a 20 20 6f 70 66 6c 61 67 73 20 3d  gs;..  opflags =
21a80 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 4b 65 79   pOp->p2;.  iKey
21a90 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
21aa0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
21ab0 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
21ac0 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
21ad0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
21ae0 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
21af0 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70  .  assert( pC->p
21b00 43 75 72 73 6f 72 21 3d 30 20 29 3b 20 20 2f 2a  Cursor!=0 );  /*
21b10 20 4f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20   Only valid for 
21b20 72 65 61 6c 20 74 61 62 6c 65 73 2c 20 6e 6f 20  real tables, no 
21b30 70 73 65 75 64 6f 74 61 62 6c 65 73 20 2a 2f 0a  pseudotables */.
21b40 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
21b50 34 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45 20  4type==P4_TABLE 
21b60 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  || pOp->p4type==
21b70 50 34 5f 4e 4f 54 55 53 45 44 20 29 3b 0a 0a 20  P4_NOTUSED );.. 
21b80 20 2f 2a 20 54 68 65 20 4f 50 5f 44 65 6c 65 74   /* The OP_Delet
21b90 65 20 6f 70 63 6f 64 65 20 61 6c 77 61 79 73 20  e opcode always 
21ba0 66 6f 6c 6c 6f 77 73 20 61 6e 20 4f 50 5f 4e 6f  follows an OP_No
21bb0 74 45 78 69 73 74 73 20 6f 72 20 4f 50 5f 4c 61  tExists or OP_La
21bc0 73 74 20 6f 72 0a 20 20 2a 2a 20 4f 50 5f 43 6f  st or.  ** OP_Co
21bd0 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  lumn on the same
21be0 20 74 61 62 6c 65 20 77 69 74 68 6f 75 74 20 61   table without a
21bf0 6e 79 20 69 6e 74 65 72 76 65 6e 69 6e 67 20 6f  ny intervening o
21c00 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 0a 20  perations that. 
21c10 20 2a 2a 20 6d 69 67 68 74 20 6d 6f 76 65 20 6f   ** might move o
21c20 72 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65  r invalidate the
21c30 20 63 75 72 73 6f 72 2e 20 20 48 65 6e 63 65 20   cursor.  Hence 
21c40 63 75 72 73 6f 72 20 70 43 20 69 73 20 61 6c 77  cursor pC is alw
21c50 61 79 73 20 70 6f 69 6e 74 69 6e 67 0a 20 20 2a  ays pointing.  *
21c60 2a 20 74 6f 20 74 68 65 20 72 6f 77 20 74 6f 20  * to the row to 
21c70 62 65 20 64 65 6c 65 74 65 64 20 61 6e 64 20 74  be deleted and t
21c80 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  he sqlite3VdbeCu
21c90 72 73 6f 72 4d 6f 76 65 74 6f 28 29 20 6f 70 65  rsorMoveto() ope
21ca0 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 62 65 6c 6f  ration.  ** belo
21cb0 77 20 69 73 20 61 6c 77 61 79 73 20 61 20 6e 6f  w is always a no
21cc0 2d 6f 70 20 61 6e 64 20 63 61 6e 6e 6f 74 20 66  -op and cannot f
21cd0 61 69 6c 2e 20 20 57 65 20 77 69 6c 6c 20 72 75  ail.  We will ru
21ce0 6e 20 69 74 20 61 6e 79 68 6f 77 2c 20 74 68 6f  n it anyhow, tho
21cf0 75 67 68 2c 0a 20 20 2a 2a 20 74 6f 20 67 75 61  ugh,.  ** to gua
21d00 72 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72  rd against futur
21d10 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
21d20 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 2e   code generator.
21d30 0a 20 20 2a 2a 2f 0a 20 20 61 73 73 65 72 74 28  .  **/.  assert(
21d40 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
21d50 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  eto==0 );.  rc =
21d60 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
21d70 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20  orMoveto(pC);.  
21d80 69 66 28 20 4e 45 56 45 52 28 72 63 21 3d 53 51  if( NEVER(rc!=SQ
21d90 4c 49 54 45 5f 4f 4b 29 20 29 20 67 6f 74 6f 20  LITE_OK) ) goto 
21da0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
21db0 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  or;..  /* If the
21dc0 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 6f 72 20   update-hook or 
21dd0 70 72 65 2d 75 70 64 61 74 65 2d 68 6f 6f 6b 20  pre-update-hook 
21de0 77 69 6c 6c 20 62 65 20 69 6e 76 6f 6b 65 64 2c  will be invoked,
21df0 20 73 65 74 20 69 4b 65 79 20 74 6f 20 0a 20 20   set iKey to .  
21e00 2a 2a 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  ** the rowid of 
21e10 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 64 65  the row being de
21e20 6c 65 74 65 64 2e 20 53 65 74 20 7a 44 62 20 61  leted. Set zDb a
21e30 6e 64 20 7a 54 61 62 20 61 73 20 77 65 6c 6c 2e  nd zTab as well.
21e40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d  .  */.  if( pOp-
21e50 3e 70 34 2e 7a 20 26 26 20 48 41 53 5f 55 50 44  >p4.z && HAS_UPD
21e60 41 54 45 5f 48 4f 4f 4b 28 64 62 29 20 29 7b 0a  ATE_HOOK(db) ){.
21e70 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
21e80 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73  iDb>=0 );.    as
21e90 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c  sert( pC->isTabl
21ea0 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
21eb0 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69   pC->rowidIsVali
21ec0 64 20 29 3b 20 20 2f 2a 20 6c 61 73 74 52 6f 77  d );  /* lastRow
21ed0 69 64 20 73 65 74 20 62 79 20 70 72 65 76 69 6f  id set by previo
21ee0 75 73 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 2a  us OP_NotFound *
21ef0 2f 0a 20 20 20 20 69 4b 65 79 20 3d 20 70 43 2d  /.    iKey = pC-
21f00 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 20 20  >lastRowid;.    
21f10 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 43  zDb = db->aDb[pC
21f20 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->iDb].zName;.  
21f30 20 20 70 54 61 62 20 3d 20 70 4f 70 2d 3e 70 34    pTab = pOp->p4
21f40 2e 70 54 61 62 3b 0a 20 20 7d 0a 0a 23 69 66 64  .pTab;.  }..#ifd
21f50 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
21f60 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a  _PREUPDATE_HOOK.
21f70 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
21f80 70 72 65 2d 75 70 64 61 74 65 2d 68 6f 6f 6b 20  pre-update-hook 
21f90 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
21fa0 20 20 69 66 28 20 64 62 2d 3e 78 50 72 65 55 70    if( db->xPreUp
21fb0 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26 26 20  dateCallback && 
21fc0 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20  pOp->p4.z ){.   
21fd0 20 61 73 73 65 72 74 28 20 21 28 6f 70 66 6c 61   assert( !(opfla
21fe0 67 73 20 26 20 4f 50 46 4c 41 47 5f 49 53 55 50  gs & OPFLAG_ISUP
21ff0 44 41 54 45 29 20 7c 7c 20 28 61 4d 65 6d 5b 70  DATE) || (aMem[p
22000 4f 70 2d 3e 70 33 5d 2e 66 6c 61 67 73 20 26 20  Op->p3].flags & 
22010 4d 45 4d 5f 49 6e 74 29 20 29 3b 0a 20 20 20 20  MEM_Int) );.    
22020 73 71 6c 69 74 65 33 56 64 62 65 50 72 65 55 70  sqlite3VdbePreUp
22030 64 61 74 65 48 6f 6f 6b 28 70 2c 20 70 43 2c 0a  dateHook(p, pC,.
22040 20 20 20 20 20 20 20 20 28 6f 70 66 6c 61 67 73          (opflags
22050 20 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41   & OPFLAG_ISUPDA
22060 54 45 29 20 3f 20 53 51 4c 49 54 45 5f 55 50 44  TE) ? SQLITE_UPD
22070 41 54 45 20 3a 20 53 51 4c 49 54 45 5f 44 45 4c  ATE : SQLITE_DEL
22080 45 54 45 2c 20 0a 20 20 20 20 20 20 20 20 7a 44  ETE, .        zD
22090 62 2c 20 70 54 61 62 2c 20 69 4b 65 79 2c 0a 20  b, pTab, iKey,. 
220a0 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 0a 20         pOp->p3. 
220b0 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66     );.  }.#endif
220c0 0a 0a 20 20 69 66 28 20 6f 70 66 6c 61 67 73 20  ..  if( opflags 
220d0 26 20 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f 50 20  & OPFLAG_ISNOOP 
220e0 29 20 62 72 65 61 6b 3b 0a 0a 20 20 73 71 6c 69  ) break;..  sqli
220f0 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
22100 64 52 6f 77 69 64 28 70 43 2d 3e 70 43 75 72 73  dRowid(pC->pCurs
22110 6f 72 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  or, 0);.  rc = s
22120 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
22130 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 29 3b 0a  e(pC->pCursor);.
22140 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
22150 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
22160 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
22170 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
22180 20 61 6e 64 20 69 6e 76 6f 6b 65 20 74 68 65 20   and invoke the 
22190 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72  update-hook if r
221a0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
221b0 28 20 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c  ( opflags & OPFL
221c0 41 47 5f 4e 43 48 41 4e 47 45 20 29 7b 0a 20 20  AG_NCHANGE ){.  
221d0 20 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a    p->nChange++;.
221e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
221f0 3e 70 34 2e 7a 20 29 3b 0a 20 20 20 20 69 66 28  >p4.z );.    if(
22200 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22210 26 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c  & db->xUpdateCal
22220 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 64  lback ){.      d
22230 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61  b->xUpdateCallba
22240 63 6b 28 64 62 2d 3e 70 55 70 64 61 74 65 41 72  ck(db->pUpdateAr
22250 67 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  g, SQLITE_DELETE
22260 2c 20 7a 44 62 2c 20 70 54 61 62 2d 3e 7a 4e 61  , zDb, pTab->zNa
22270 6d 65 2c 69 4b 65 79 29 3b 0a 20 20 20 20 7d 0a  me,iKey);.    }.
22280 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 2f    }.  break;.}./
22290 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 65 74 43  * Opcode: ResetC
222a0 6f 75 6e 74 20 2a 20 2a 20 2a 20 2a 20 2a 0a 2a  ount * * * * *.*
222b0 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  *.** The value o
222c0 66 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  f the change cou
222d0 6e 74 65 72 20 69 73 20 63 6f 70 69 65 64 20 74  nter is copied t
222e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  o the database h
222f0 61 6e 64 6c 65 0a 2a 2a 20 63 68 61 6e 67 65 20  andle.** change 
22300 63 6f 75 6e 74 65 72 20 28 72 65 74 75 72 6e 65  counter (returne
22310 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  d by subsequent 
22320 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
22330 5f 63 68 61 6e 67 65 73 28 29 29 2e 0a 2a 2a 20  _changes())..** 
22340 54 68 65 6e 20 74 68 65 20 56 4d 73 20 69 6e 74  Then the VMs int
22350 65 72 6e 61 6c 20 63 68 61 6e 67 65 20 63 6f 75  ernal change cou
22360 6e 74 65 72 20 72 65 73 65 74 73 20 74 6f 20 30  nter resets to 0
22370 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65  ..** This is use
22380 64 20 62 79 20 74 72 69 67 67 65 72 20 70 72 6f  d by trigger pro
22390 67 72 61 6d 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f  grams..*/.case O
223a0 50 5f 52 65 73 65 74 43 6f 75 6e 74 3a 20 7b 0a  P_ResetCount: {.
223b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
223c0 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
223d0 43 68 61 6e 67 65 29 3b 0a 20 20 70 2d 3e 6e 43  Change);.  p->nC
223e0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 62 72 65  hange = 0;.  bre
223f0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
22400 3a 20 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 20  : SorterCompare 
22410 50 31 20 50 32 20 50 33 0a 2a 2a 0a 2a 2a 20 50  P1 P2 P3.**.** P
22420 31 20 69 73 20 61 20 73 6f 72 74 65 72 20 63 75  1 is a sorter cu
22430 72 73 6f 72 2e 20 54 68 69 73 20 69 6e 73 74 72  rsor. This instr
22440 75 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20  uction compares 
22450 74 68 65 20 72 65 63 6f 72 64 20 62 6c 6f 62 20  the record blob 
22460 69 6e 20 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  in .** register 
22470 50 33 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  P3 with the entr
22480 79 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 65  y that the sorte
22490 72 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  r cursor current
224a0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ly points to..**
224b0 20 49 66 2c 20 65 78 63 6c 75 64 69 6e 67 20 74   If, excluding t
224c0 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 73 20  he rowid fields 
224d0 61 74 20 74 68 65 20 65 6e 64 2c 20 74 68 65 20  at the end, the 
224e0 74 77 6f 20 72 65 63 6f 72 64 73 20 61 72 65 20  two records are 
224f0 61 20 6d 61 74 63 68 2c 0a 2a 2a 20 66 61 6c 6c  a match,.** fall
22500 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
22510 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
22520 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6a 75 6d  . Otherwise, jum
22530 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e  p to instruction
22540 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
22550 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 3a 20 7b  SorterCompare: {
22560 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
22570 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  C;.  int res;.. 
22580 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
22590 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
225a0 74 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 20  t( isSorter(pC) 
225b0 29 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65  );.  pIn3 = &aMe
225c0 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 72 63  m[pOp->p3];.  rc
225d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f   = sqlite3VdbeSo
225e0 72 74 65 72 43 6f 6d 70 61 72 65 28 70 43 2c 20  rterCompare(pC, 
225f0 70 49 6e 33 2c 20 26 72 65 73 29 3b 0a 20 20 69  pIn3, &res);.  i
22600 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 70 63  f( res ){.    pc
22610 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20   = pOp->p2-1;.  
22620 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a 0a 2f  }.  break;.};../
22630 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65 72  * Opcode: Sorter
22640 44 61 74 61 20 50 31 20 50 32 20 2a 20 2a 20 2a  Data P1 P2 * * *
22650 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74  .**.** Write int
22660 6f 20 72 65 67 69 73 74 65 72 20 50 32 20 74 68  o register P2 th
22670 65 20 63 75 72 72 65 6e 74 20 73 6f 72 74 65 72  e current sorter
22680 20 64 61 74 61 20 66 6f 72 20 73 6f 72 74 65 72   data for sorter
22690 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2f 0a 63   cursor P1..*/.c
226a0 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  ase OP_SorterDat
226b0 61 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  a: {.  VdbeCurso
226c0 72 20 2a 70 43 3b 0a 23 69 66 6e 64 65 66 20 53  r *pC;.#ifndef S
226d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 52 47 45  QLITE_OMIT_MERGE
226e0 5f 53 4f 52 54 0a 20 20 70 4f 75 74 20 3d 20 26  _SORT.  pOut = &
226f0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
22700 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
22710 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
22720 74 28 20 70 43 2d 3e 69 73 53 6f 72 74 65 72 20  t( pC->isSorter 
22730 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
22740 33 56 64 62 65 53 6f 72 74 65 72 52 6f 77 6b 65  3VdbeSorterRowke
22750 79 28 70 43 2c 20 70 4f 75 74 29 3b 0a 23 65 6c  y(pC, pOut);.#el
22760 73 65 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  se.  pOp->opcode
22770 20 3d 20 4f 50 5f 52 6f 77 4b 65 79 3b 0a 20 20   = OP_RowKey;.  
22780 70 63 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 62  pc--;.#endif.  b
22790 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
227a0 64 65 3a 20 52 6f 77 44 61 74 61 20 50 31 20 50  de: RowData P1 P
227b0 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72  2 * * *.**.** Wr
227c0 69 74 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65  ite into registe
227d0 72 20 50 32 20 74 68 65 20 63 6f 6d 70 6c 65 74  r P2 the complet
227e0 65 20 72 6f 77 20 64 61 74 61 20 66 6f 72 20 63  e row data for c
227f0 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 20 54 68 65  ursor P1..** The
22800 72 65 20 69 73 20 6e 6f 20 69 6e 74 65 72 70 72  re is no interpr
22810 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  etation of the d
22820 61 74 61 2e 20 20 0a 2a 2a 20 49 74 20 69 73 20  ata.  .** It is 
22830 6a 75 73 74 20 63 6f 70 69 65 64 20 6f 6e 74 6f  just copied onto
22840 20 74 68 65 20 50 32 20 72 65 67 69 73 74 65 72   the P2 register
22850 20 65 78 61 63 74 6c 79 20 61 73 20 0a 2a 2a 20   exactly as .** 
22860 69 74 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  it is found in t
22870 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22880 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
22890 31 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65  1 cursor must be
228a0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76   pointing to a v
228b0 61 6c 69 64 20 72 6f 77 20 28 6e 6f 74 20 61 20  alid row (not a 
228c0 4e 55 4c 4c 20 72 6f 77 29 0a 2a 2a 20 6f 66 20  NULL row).** of 
228d0 61 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f  a real table, no
228e0 74 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  t a pseudo-table
228f0 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
22900 52 6f 77 4b 65 79 20 50 31 20 50 32 20 2a 20 2a  RowKey P1 P2 * *
22910 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69   *.**.** Write i
22920 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 20  nto register P2 
22930 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 6f 77  the complete row
22940 20 6b 65 79 20 66 6f 72 20 63 75 72 73 6f 72 20   key for cursor 
22950 50 31 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  P1..** There is 
22960 6e 6f 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f  no interpretatio
22970 6e 20 6f 66 20 74 68 65 20 64 61 74 61 2e 20 20  n of the data.  
22980 0a 2a 2a 20 54 68 65 20 6b 65 79 20 69 73 20 63  .** The key is c
22990 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68 65 20 50  opied onto the P
229a0 33 20 72 65 67 69 73 74 65 72 20 65 78 61 63 74  3 register exact
229b0 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20 69 73 20  ly as .** it is 
229c0 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74  found in the dat
229d0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
229e0 2a 20 49 66 20 74 68 65 20 50 31 20 63 75 72 73  * If the P1 curs
229f0 6f 72 20 6d 75 73 74 20 62 65 20 70 6f 69 6e 74  or must be point
22a00 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72  ing to a valid r
22a10 6f 77 20 28 6e 6f 74 20 61 20 4e 55 4c 4c 20 72  ow (not a NULL r
22a20 6f 77 29 0a 2a 2a 20 6f 66 20 61 20 72 65 61 6c  ow).** of a real
22a30 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73   table, not a ps
22a40 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 63  eudo-table..*/.c
22a50 61 73 65 20 4f 50 5f 52 6f 77 4b 65 79 3a 0a 63  ase OP_RowKey:.c
22a60 61 73 65 20 4f 50 5f 52 6f 77 44 61 74 61 3a 20  ase OP_RowData: 
22a70 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
22a80 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  pC;.  BtCursor *
22a90 70 43 72 73 72 3b 0a 20 20 75 33 32 20 6e 3b 0a  pCrsr;.  u32 n;.
22aa0 20 20 69 36 34 20 6e 36 34 3b 0a 0a 20 20 70 4f    i64 n64;..  pO
22ab0 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
22ac0 70 32 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54  p2];.  memAboutT
22ad0 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29  oChange(p, pOut)
22ae0 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61  ;..  /* Note tha
22af0 74 20 52 6f 77 4b 65 79 20 61 6e 64 20 52 6f 77  t RowKey and Row
22b00 44 61 74 61 20 61 72 65 20 72 65 61 6c 6c 79 20  Data are really 
22b10 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
22b20 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
22b30 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
22b40 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
22b50 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
22b60 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
22b70 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
22b80 28 20 70 43 2d 3e 69 73 53 6f 72 74 65 72 3d 3d  ( pC->isSorter==
22b90 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
22ba0 43 2d 3e 69 73 54 61 62 6c 65 20 7c 7c 20 70 4f  C->isTable || pO
22bb0 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 52 6f  p->opcode!=OP_Ro
22bc0 77 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  wData );.  asser
22bd0 74 28 20 70 43 2d 3e 69 73 49 6e 64 65 78 20 7c  t( pC->isIndex |
22be0 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
22bf0 50 5f 52 6f 77 44 61 74 61 20 29 3b 0a 20 20 61  P_RowData );.  a
22c00 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
22c10 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 6e 75    assert( pC->nu
22c20 6c 6c 52 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  llRow==0 );.  as
22c30 73 65 72 74 28 20 70 43 2d 3e 70 73 65 75 64 6f  sert( pC->pseudo
22c40 54 61 62 6c 65 52 65 67 3d 3d 30 20 29 3b 0a 20  TableReg==0 );. 
22c50 20 61 73 73 65 72 74 28 20 21 70 43 2d 3e 69 73   assert( !pC->is
22c60 53 6f 72 74 65 72 20 29 3b 0a 20 20 61 73 73 65  Sorter );.  asse
22c70 72 74 28 20 70 43 2d 3e 70 43 75 72 73 6f 72 21  rt( pC->pCursor!
22c80 3d 30 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20  =0 );.  pCrsr = 
22c90 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 61  pC->pCursor;.  a
22ca0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
22cb0 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
22cc0 28 70 43 72 73 72 29 20 29 3b 0a 0a 20 20 2f 2a  (pCrsr) );..  /*
22cd0 20 54 68 65 20 4f 50 5f 52 6f 77 4b 65 79 20 61   The OP_RowKey a
22ce0 6e 64 20 4f 50 5f 52 6f 77 44 61 74 61 20 6f 70  nd OP_RowData op
22cf0 63 6f 64 65 73 20 61 6c 77 61 79 73 20 66 6f 6c  codes always fol
22d00 6c 6f 77 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  low OP_NotExists
22d10 20 6f 72 0a 20 20 2a 2a 20 4f 50 5f 52 65 77 69   or.  ** OP_Rewi
22d20 6e 64 2f 4f 70 5f 4e 65 78 74 20 77 69 74 68 20  nd/Op_Next with 
22d30 6e 6f 20 69 6e 74 65 72 76 65 6e 69 6e 67 20 69  no intervening i
22d40 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74  nstructions that
22d50 20 6d 69 67 68 74 20 69 6e 76 61 6c 69 64 61 74   might invalidat
22d60 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  e.  ** the curso
22d70 72 2e 20 20 48 65 6e 63 65 20 74 68 65 20 66 6f  r.  Hence the fo
22d80 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 56  llowing sqlite3V
22d90 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
22da0 29 20 63 61 6c 6c 20 69 73 20 61 6c 77 61 79 73  ) call is always
22db0 0a 20 20 2a 2a 20 61 20 6e 6f 2d 6f 70 20 61 6e  .  ** a no-op an
22dc0 64 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  d can never fail
22dd0 2e 20 20 42 75 74 20 77 65 20 6c 65 61 76 65 20  .  But we leave 
22de0 69 74 20 69 6e 20 70 6c 61 63 65 20 61 73 20 61  it in place as a
22df0 20 73 61 66 65 74 79 2e 0a 20 20 2a 2f 0a 20 20   safety..  */.  
22e00 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65  assert( pC->defe
22e10 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
22e20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
22e30 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
22e40 70 43 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  pC);.  if( NEVER
22e50 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc!=SQLITE_OK) 
22e60 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
22e70 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 69 66  _to_error;..  if
22e80 28 20 70 43 2d 3e 69 73 49 6e 64 65 78 20 29 7b  ( pC->isIndex ){
22e90 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43  .    assert( !pC
22ea0 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20  ->isTable );.   
22eb0 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20   VVA_ONLY(rc =) 
22ec0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
22ed0 69 7a 65 28 70 43 72 73 72 2c 20 26 6e 36 34 29  ize(pCrsr, &n64)
22ee0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
22ef0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
22f00 20 20 2f 2a 20 54 72 75 65 20 62 65 63 61 75 73    /* True becaus
22f10 65 20 6f 66 20 43 75 72 73 6f 72 4d 6f 76 65 74  e of CursorMovet
22f20 6f 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 20 2a  o() call above *
22f30 2f 0a 20 20 20 20 69 66 28 20 6e 36 34 3e 64 62  /.    if( n64>db
22f40 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
22f50 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b  LIMIT_LENGTH] ){
22f60 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f  .      goto too_
22f70 62 69 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  big;.    }.    n
22f80 20 3d 20 28 75 33 32 29 6e 36 34 3b 0a 20 20 7d   = (u32)n64;.  }
22f90 65 6c 73 65 7b 0a 20 20 20 20 56 56 41 5f 4f 4e  else{.    VVA_ON
22fa0 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33  LY(rc =) sqlite3
22fb0 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 70 43  BtreeDataSize(pC
22fc0 72 73 72 2c 20 26 6e 29 3b 0a 20 20 20 20 61 73  rsr, &n);.    as
22fd0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
22fe0 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 44 61 74  _OK );    /* Dat
22ff0 61 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66  aSize() cannot f
23000 61 69 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ail */.    if( n
23010 3e 28 75 33 32 29 64 62 2d 3e 61 4c 69 6d 69 74  >(u32)db->aLimit
23020 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
23030 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 20 20 67  NGTH] ){.      g
23040 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20  oto too_big;.   
23050 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c   }.  }.  if( sql
23060 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
23070 70 4f 75 74 2c 20 6e 2c 20 30 29 20 29 7b 0a 20  pOut, n, 0) ){. 
23080 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
23090 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20    }.  pOut->n = 
230a0 6e 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46  n;.  MemSetTypeF
230b0 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 42 6c  lag(pOut, MEM_Bl
230c0 6f 62 29 3b 0a 20 20 69 66 28 20 70 43 2d 3e 69  ob);.  if( pC->i
230d0 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 72 63  sIndex ){.    rc
230e0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
230f0 65 79 28 70 43 72 73 72 2c 20 30 2c 20 6e 2c 20  ey(pCrsr, 0, n, 
23100 70 4f 75 74 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73  pOut->z);.  }els
23110 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
23120 74 65 33 42 74 72 65 65 44 61 74 61 28 70 43 72  te3BtreeData(pCr
23130 73 72 2c 20 30 2c 20 6e 2c 20 70 4f 75 74 2d 3e  sr, 0, n, pOut->
23140 7a 29 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e  z);.  }.  pOut->
23150 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
23160 38 3b 20 20 2f 2a 20 49 6e 20 63 61 73 65 20 74  8;  /* In case t
23170 68 65 20 62 6c 6f 62 20 69 73 20 65 76 65 72 20  he blob is ever 
23180 63 61 73 74 20 74 6f 20 74 65 78 74 20 2a 2f 0a  cast to text */.
23190 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
231a0 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62  BSIZE(pOut);.  b
231b0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
231c0 64 65 3a 20 52 6f 77 69 64 20 50 31 20 50 32 20  de: Rowid P1 P2 
231d0 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 74 6f 72  * * *.**.** Stor
231e0 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
231f0 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
23200 68 20 69 73 20 74 68 65 20 6b 65 79 20 6f 66 20  h is the key of 
23210 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
23220 74 68 61 74 0a 2a 2a 20 50 31 20 69 73 20 63 75  that.** P1 is cu
23230 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f  rrently point to
23240 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 63 61 6e 20 62  ..**.** P1 can b
23250 65 20 65 69 74 68 65 72 20 61 6e 20 6f 72 64 69  e either an ordi
23260 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 61 20  nary table or a 
23270 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
23280 54 68 65 72 65 20 75 73 65 64 20 74 6f 0a 2a 2a  There used to.**
23290 20 62 65 20 61 20 73 65 70 61 72 61 74 65 20 4f   be a separate O
232a0 50 5f 56 52 6f 77 69 64 20 6f 70 63 6f 64 65 20  P_VRowid opcode 
232b0 66 6f 72 20 75 73 65 20 77 69 74 68 20 76 69 72  for use with vir
232c0 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 62 75 74  tual tables, but
232d0 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 20 6f 70 63   this.** one opc
232e0 6f 64 65 20 6e 6f 77 20 77 6f 72 6b 73 20 66 6f  ode now works fo
232f0 72 20 62 6f 74 68 20 74 61 62 6c 65 20 74 79 70  r both table typ
23300 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  es..*/.case OP_R
23310 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20 20 20  owid: {         
23320 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
23330 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
23340 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
23350 20 20 69 36 34 20 76 3b 0a 20 20 73 71 6c 69 74    i64 v;.  sqlit
23360 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a  e3_vtab *pVtab;.
23370 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
23380 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b  module *pModule;
23390 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
233a0 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
233b0 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
233c0 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
233d0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
233e0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
233f0 73 73 65 72 74 28 20 70 43 2d 3e 70 73 65 75 64  ssert( pC->pseud
23400 6f 54 61 62 6c 65 52 65 67 3d 3d 30 20 29 3b 0a  oTableReg==0 );.
23410 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f    if( pC->nullRo
23420 77 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66  w ){.    pOut->f
23430 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
23440 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 65  .    break;.  }e
23450 6c 73 65 20 69 66 28 20 70 43 2d 3e 64 65 66 65  lse if( pC->defe
23460 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20  rredMoveto ){.  
23470 20 20 76 20 3d 20 70 43 2d 3e 6d 6f 76 65 74 6f    v = pC->moveto
23480 54 61 72 67 65 74 3b 0a 23 69 66 6e 64 65 66 20  Target;.#ifndef 
23490 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
234a0 55 41 4c 54 41 42 4c 45 0a 20 20 7d 65 6c 73 65  UALTABLE.  }else
234b0 20 69 66 28 20 70 43 2d 3e 70 56 74 61 62 43 75   if( pC->pVtabCu
234c0 72 73 6f 72 20 29 7b 0a 20 20 20 20 70 56 74 61  rsor ){.    pVta
234d0 62 20 3d 20 70 43 2d 3e 70 56 74 61 62 43 75 72  b = pC->pVtabCur
234e0 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20  sor->pVtab;.    
234f0 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d  pModule = pVtab-
23500 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 61 73  >pModule;.    as
23510 73 65 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78  sert( pModule->x
23520 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 72 63 20  Rowid );.    rc 
23530 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 6f 77 69  = pModule->xRowi
23540 64 28 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f  d(pC->pVtabCurso
23550 72 2c 20 26 76 29 3b 0a 20 20 20 20 69 6d 70 6f  r, &v);.    impo
23560 72 74 56 74 61 62 45 72 72 4d 73 67 28 70 2c 20  rtVtabErrMsg(p, 
23570 70 56 74 61 62 29 3b 0a 23 65 6e 64 69 66 20 2f  pVtab);.#endif /
23580 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
23590 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 20 20  RTUALTABLE */.  
235a0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
235b0 74 28 20 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d  t( pC->pCursor!=
235c0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
235d0 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
235e0 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 20 20 69  oveto(pC);.    i
235f0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
23600 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
23610 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 72 6f 77  .    if( pC->row
23620 69 64 49 73 56 61 6c 69 64 20 29 7b 0a 20 20 20  idIsValid ){.   
23630 20 20 20 76 20 3d 20 70 43 2d 3e 6c 61 73 74 52     v = pC->lastR
23640 6f 77 69 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  owid;.    }else{
23650 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23660 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
23670 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 76 29  pC->pCursor, &v)
23680 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
23690 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
236a0 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 6f 20 62    /* Always so b
236b0 65 63 61 75 73 65 20 6f 66 20 43 75 72 73 6f 72  ecause of Cursor
236c0 4d 6f 76 65 74 6f 28 29 20 61 62 6f 76 65 20 2a  Moveto() above *
236d0 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4f  /.    }.  }.  pO
236e0 75 74 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 62  ut->u.i = v;.  b
236f0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
23700 64 65 3a 20 4e 75 6c 6c 52 6f 77 20 50 31 20 2a  de: NullRow P1 *
23710 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 6f 76   * * *.**.** Mov
23720 65 20 74 68 65 20 63 75 72 73 6f 72 20 50 31 20  e the cursor P1 
23730 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 2e 20 20  to a null row.  
23740 41 6e 79 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70  Any OP_Column op
23750 65 72 61 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  erations.** that
23760 20 6f 63 63 75 72 20 77 68 69 6c 65 20 74 68 65   occur while the
23770 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 20 74 68   cursor is on th
23780 65 20 6e 75 6c 6c 20 72 6f 77 20 77 69 6c 6c 20  e null row will 
23790 61 6c 77 61 79 73 0a 2a 2a 20 77 72 69 74 65 20  always.** write 
237a0 61 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20  a NULL..*/.case 
237b0 4f 50 5f 4e 75 6c 6c 52 6f 77 3a 20 7b 0a 20 20  OP_NullRow: {.  
237c0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
237d0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
237e0 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
237f0 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
23800 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
23810 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
23820 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70 43  t( pC!=0 );.  pC
23830 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20  ->nullRow = 1;. 
23840 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69   pC->rowidIsVali
23850 64 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  d = 0;.  assert(
23860 20 70 43 2d 3e 70 43 75 72 73 6f 72 20 7c 7c 20   pC->pCursor || 
23870 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20  pC->pVtabCursor 
23880 29 3b 0a 20 20 69 66 28 20 70 43 2d 3e 70 43 75  );.  if( pC->pCu
23890 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
238a0 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
238b0 73 6f 72 28 70 43 2d 3e 70 43 75 72 73 6f 72 29  sor(pC->pCursor)
238c0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
238d0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 61 73  ../* Opcode: Las
238e0 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  t P1 P2 * * *.**
238f0 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 75 73 65  .** The next use
23900 20 6f 66 20 74 68 65 20 52 6f 77 69 64 20 6f 72   of the Rowid or
23910 20 43 6f 6c 75 6d 6e 20 6f 72 20 4e 65 78 74 20   Column or Next 
23920 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72 20  instruction for 
23930 50 31 20 0a 2a 2a 20 77 69 6c 6c 20 72 65 66 65  P1 .** will refe
23940 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  r to the last en
23950 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
23960 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ase table or ind
23970 65 78 2e 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  ex..** If the ta
23980 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20  ble or index is 
23990 65 6d 70 74 79 20 61 6e 64 20 50 32 3e 30 2c 20  empty and P2>0, 
239a0 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69  then jump immedi
239b0 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 20  ately to P2..** 
239c0 49 66 20 50 32 20 69 73 20 30 20 6f 72 20 69 66  If P2 is 0 or if
239d0 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
239e0 64 65 78 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  dex is not empty
239f0 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 2a  , fall through.*
23a00 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * to the followi
23a10 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ng instruction..
23a20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 61 73 74 3a  */.case OP_Last:
23a30 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
23a40 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  p */.  VdbeCurso
23a50 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f  r *pC;.  BtCurso
23a60 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20  r *pCrsr;.  int 
23a70 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  res;..  assert( 
23a80 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
23a90 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
23aa0 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
23ab0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
23ac0 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
23ad0 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 70  .  pCrsr = pC->p
23ae0 43 75 72 73 6f 72 3b 0a 20 20 72 65 73 20 3d 20  Cursor;.  res = 
23af0 30 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  0;.  if( ALWAYS(
23b00 70 43 72 73 72 21 3d 30 29 20 29 7b 0a 20 20 20  pCrsr!=0) ){.   
23b10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
23b20 65 65 4c 61 73 74 28 70 43 72 73 72 2c 20 26 72  eeLast(pCrsr, &r
23b30 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 2d 3e 6e  es);.  }.  pC->n
23b40 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29 72 65 73  ullRow = (u8)res
23b50 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64  ;.  pC->deferred
23b60 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43  Moveto = 0;.  pC
23b70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d  ->rowidIsValid =
23b80 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53   0;.  pC->cacheS
23b90 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
23ba0 41 4c 45 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  ALE;.  if( pOp->
23bb0 70 32 3e 30 20 26 26 20 72 65 73 20 29 7b 0a 20  p2>0 && res ){. 
23bc0 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
23bd0 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  - 1;.  }.  break
23be0 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ;.}.../* Opcode:
23bf0 20 53 6f 72 74 20 50 31 20 50 32 20 2a 20 2a 20   Sort P1 P2 * * 
23c00 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  *.**.** This opc
23c10 6f 64 65 20 64 6f 65 73 20 65 78 61 63 74 6c 79  ode does exactly
23c20 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20   the same thing 
23c30 61 73 20 4f 50 5f 52 65 77 69 6e 64 20 65 78 63  as OP_Rewind exc
23c40 65 70 74 20 74 68 61 74 0a 2a 2a 20 69 74 20 69  ept that.** it i
23c50 6e 63 72 65 6d 65 6e 74 73 20 61 6e 20 75 6e 64  ncrements an und
23c60 6f 63 75 6d 65 6e 74 65 64 20 67 6c 6f 62 61 6c  ocumented global
23c70 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20 66   variable used f
23c80 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2a 0a 2a  or testing..**.*
23c90 2a 20 53 6f 72 74 69 6e 67 20 69 73 20 61 63 63  * Sorting is acc
23ca0 6f 6d 70 6c 69 73 68 65 64 20 62 79 20 77 72 69  omplished by wri
23cb0 74 69 6e 67 20 72 65 63 6f 72 64 73 20 69 6e 74  ting records int
23cc0 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  o a sorting inde
23cd0 78 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 77 69 6e  x,.** then rewin
23ce0 64 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20  ding that index 
23cf0 61 6e 64 20 70 6c 61 79 69 6e 67 20 69 74 20 62  and playing it b
23d00 61 63 6b 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69  ack from beginni
23d10 6e 67 20 74 6f 0a 2a 2a 20 65 6e 64 2e 20 20 57  ng to.** end.  W
23d20 65 20 75 73 65 20 74 68 65 20 4f 50 5f 53 6f 72  e use the OP_Sor
23d30 74 20 6f 70 63 6f 64 65 20 69 6e 73 74 65 61 64  t opcode instead
23d40 20 6f 66 20 4f 50 5f 52 65 77 69 6e 64 20 74 6f   of OP_Rewind to
23d50 20 64 6f 20 74 68 65 0a 2a 2a 20 72 65 77 69 6e   do the.** rewin
23d60 64 69 6e 67 20 73 6f 20 74 68 61 74 20 74 68 65  ding so that the
23d70 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
23d80 20 77 69 6c 6c 20 62 65 20 69 6e 63 72 65 6d 65   will be increme
23d90 6e 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 67 72  nted and.** regr
23da0 65 73 73 69 6f 6e 20 74 65 73 74 73 20 63 61 6e  ession tests can
23db0 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
23dc0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6f 70  er or not the op
23dd0 74 69 6d 69 7a 65 72 20 69 73 0a 2a 2a 20 63 6f  timizer is.** co
23de0 72 72 65 63 74 6c 79 20 6f 70 74 69 6d 69 7a 69  rrectly optimizi
23df0 6e 67 20 6f 75 74 20 73 6f 72 74 73 2e 0a 2a 2f  ng out sorts..*/
23e00 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 53  .case OP_SorterS
23e10 6f 72 74 3a 20 20 20 20 2f 2a 20 6a 75 6d 70 20  ort:    /* jump 
23e20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
23e30 5f 4f 4d 49 54 5f 4d 45 52 47 45 5f 53 4f 52 54  _OMIT_MERGE_SORT
23e40 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
23e50 20 4f 50 5f 53 6f 72 74 3b 0a 23 65 6e 64 69 66   OP_Sort;.#endif
23e60 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 3a 20 7b  .case OP_Sort: {
23e70 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
23e80 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
23e90 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
23ea0 73 6f 72 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  sort_count++;.  
23eb0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
23ec0 6f 75 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20  ount--;.#endif. 
23ed0 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c   p->aCounter[SQL
23ee0 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53  ITE_STMTSTATUS_S
23ef0 4f 52 54 2d 31 5d 2b 2b 3b 0a 20 20 2f 2a 20 46  ORT-1]++;.  /* F
23f00 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f  all through into
23f10 20 4f 50 5f 52 65 77 69 6e 64 20 2a 2f 0a 7d 0a   OP_Rewind */.}.
23f20 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 77 69 6e  /* Opcode: Rewin
23f30 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  d P1 P2 * * *.**
23f40 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 75 73 65  .** The next use
23f50 20 6f 66 20 74 68 65 20 52 6f 77 69 64 20 6f 72   of the Rowid or
23f60 20 43 6f 6c 75 6d 6e 20 6f 72 20 4e 65 78 74 20   Column or Next 
23f70 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72 20  instruction for 
23f80 50 31 20 0a 2a 2a 20 77 69 6c 6c 20 72 65 66 65  P1 .** will refe
23f90 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  r to the first e
23fa0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
23fb0 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  base table or in
23fc0 64 65 78 2e 0a 2a 2a 20 49 66 20 74 68 65 20 74  dex..** If the t
23fd0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73  able or index is
23fe0 20 65 6d 70 74 79 20 61 6e 64 20 50 32 3e 30 2c   empty and P2>0,
23ff0 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64   then jump immed
24000 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a  iately to P2..**
24010 20 49 66 20 50 32 20 69 73 20 30 20 6f 72 20 69   If P2 is 0 or i
24020 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
24030 6e 64 65 78 20 69 73 20 6e 6f 74 20 65 6d 70 74  ndex is not empt
24040 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a  y, fall through.
24050 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  ** to the follow
24060 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ing instruction.
24070 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 77 69  .*/.case OP_Rewi
24080 6e 64 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  nd: {        /* 
24090 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43 75  jump */.  VdbeCu
240a0 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75  rsor *pC;.  BtCu
240b0 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 69  rsor *pCrsr;.  i
240c0 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72  nt res;..  asser
240d0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
240e0 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
240f0 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
24100 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
24110 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
24120 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
24130 2d 3e 69 73 53 6f 72 74 65 72 3d 3d 28 70 4f 70  ->isSorter==(pOp
24140 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72  ->opcode==OP_Sor
24150 74 65 72 53 6f 72 74 29 20 29 3b 0a 20 20 72 65  terSort) );.  re
24160 73 20 3d 20 31 3b 0a 20 20 69 66 28 20 69 73 53  s = 1;.  if( isS
24170 6f 72 74 65 72 28 70 43 29 20 29 7b 0a 20 20 20  orter(pC) ){.   
24180 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
24190 65 53 6f 72 74 65 72 52 65 77 69 6e 64 28 64 62  eSorterRewind(db
241a0 2c 20 70 43 2c 20 26 72 65 73 29 3b 0a 20 20 7d  , pC, &res);.  }
241b0 65 6c 73 65 7b 0a 20 20 20 20 70 43 72 73 72 20  else{.    pCrsr 
241c0 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20  = pC->pCursor;. 
241d0 20 20 20 61 73 73 65 72 74 28 20 70 43 72 73 72     assert( pCrsr
241e0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
241f0 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 70  ite3BtreeFirst(p
24200 43 72 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 20  Crsr, &res);.   
24210 20 70 43 2d 3e 61 74 46 69 72 73 74 20 3d 20 72   pC->atFirst = r
24220 65 73 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 20 20  es==0 ?1:0;.    
24230 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
24240 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e  to = 0;.    pC->
24250 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
24260 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 70  CHE_STALE;.    p
24270 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  C->rowidIsValid 
24280 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 2d 3e 6e  = 0;.  }.  pC->n
24290 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29 72 65 73  ullRow = (u8)res
242a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
242b0 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32  >p2>0 && pOp->p2
242c0 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28  <p->nOp );.  if(
242d0 20 72 65 73 20 29 7b 0a 20 20 20 20 70 63 20 3d   res ){.    pc =
242e0 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
242f0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
24300 20 4f 70 63 6f 64 65 3a 20 4e 65 78 74 20 50 31   Opcode: Next P1
24310 20 50 32 20 2a 20 50 34 20 50 35 0a 2a 2a 0a 2a   P2 * P4 P5.**.*
24320 2a 20 41 64 76 61 6e 63 65 20 63 75 72 73 6f 72  * Advance cursor
24330 20 50 31 20 73 6f 20 74 68 61 74 20 69 74 20 70   P1 so that it p
24340 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 65 78  oints to the nex
24350 74 20 6b 65 79 2f 64 61 74 61 20 70 61 69 72 20  t key/data pair 
24360 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62 6c 65 20  in its.** table 
24370 6f 72 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68  or index.  If th
24380 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
24390 6b 65 79 2f 76 61 6c 75 65 20 70 61 69 72 73 20  key/value pairs 
243a0 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67  then fall throug
243b0 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c  h.** to the foll
243c0 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f  owing instructio
243d0 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 63  n.  But if the c
243e0 75 72 73 6f 72 20 61 64 76 61 6e 63 65 20 77 61  ursor advance wa
243f0 73 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  s successful,.**
24400 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
24410 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54  y to P2..**.** T
24420 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73  he P1 cursor mus
24430 74 20 62 65 20 66 6f 72 20 61 20 72 65 61 6c 20  t be for a real 
24440 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65  table, not a pse
24450 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  udo-table..**.**
24460 20 50 34 20 69 73 20 61 6c 77 61 79 73 20 6f 66   P4 is always of
24470 20 74 79 70 65 20 50 34 5f 41 44 56 41 4e 43 45   type P4_ADVANCE
24480 2e 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 70  . The function p
24490 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  ointer points to
244a0 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
244b0 4e 65 78 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Next()..**.** If
244c0 20 50 35 20 69 73 20 70 6f 73 69 74 69 76 65 20   P5 is positive 
244d0 61 6e 64 20 74 68 65 20 6a 75 6d 70 20 69 73 20  and the jump is 
244e0 74 61 6b 65 6e 2c 20 74 68 65 6e 20 65 76 65 6e  taken, then even
244f0 74 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 6e 75 6d  t counter.** num
24500 62 65 72 20 50 35 2d 31 20 69 6e 20 74 68 65 20  ber P5-1 in the 
24510 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
24520 6e 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  nt is incremente
24530 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  d..**.** See als
24540 6f 3a 20 50 72 65 76 0a 2a 2f 0a 2f 2a 20 4f 70  o: Prev.*/./* Op
24550 63 6f 64 65 3a 20 50 72 65 76 20 50 31 20 50 32  code: Prev P1 P2
24560 20 2a 20 2a 20 50 35 0a 2a 2a 0a 2a 2a 20 42 61   * * P5.**.** Ba
24570 63 6b 20 75 70 20 63 75 72 73 6f 72 20 50 31 20  ck up cursor P1 
24580 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
24590 73 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  s to the previou
245a0 73 20 6b 65 79 2f 64 61 74 61 20 70 61 69 72 20  s key/data pair 
245b0 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62 6c 65 20  in its.** table 
245c0 6f 72 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68  or index.  If th
245d0 65 72 65 20 69 73 20 6e 6f 20 70 72 65 76 69 6f  ere is no previo
245e0 75 73 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69  us key/value pai
245f0 72 73 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  rs then fall thr
24600 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ough.** to the f
24610 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63  ollowing instruc
24620 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 20 74 68  tion.  But if th
24630 65 20 63 75 72 73 6f 72 20 62 61 63 6b 75 70 20  e cursor backup 
24640 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 0a  was successful,.
24650 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  ** jump immediat
24660 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a  ely to P2..**.**
24670 20 54 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d   The P1 cursor m
24680 75 73 74 20 62 65 20 66 6f 72 20 61 20 72 65 61  ust be for a rea
24690 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70  l table, not a p
246a0 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a  seudo-table..**.
246b0 2a 2a 20 50 34 20 69 73 20 61 6c 77 61 79 73 20  ** P4 is always 
246c0 6f 66 20 74 79 70 65 20 50 34 5f 41 44 56 41 4e  of type P4_ADVAN
246d0 43 45 2e 20 54 68 65 20 66 75 6e 63 74 69 6f 6e  CE. The function
246e0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
246f0 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  to.** sqlite3Btr
24700 65 65 50 72 65 76 69 6f 75 73 28 29 2e 0a 2a 2a  eePrevious()..**
24710 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 70 6f 73  .** If P5 is pos
24720 69 74 69 76 65 20 61 6e 64 20 74 68 65 20 6a 75  itive and the ju
24730 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20 74 68 65  mp is taken, the
24740 6e 20 65 76 65 6e 74 20 63 6f 75 6e 74 65 72 0a  n event counter.
24750 2a 2a 20 6e 75 6d 62 65 72 20 50 35 2d 31 20 69  ** number P5-1 i
24760 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
24770 74 61 74 65 6d 65 6e 74 20 69 73 20 69 6e 63 72  tatement is incr
24780 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 63 61 73 65  emented..*/.case
24790 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20   OP_SorterNext: 
247a0 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 23 69     /* jump */.#i
247b0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
247c0 5f 4d 45 52 47 45 5f 53 4f 52 54 0a 20 20 70 4f  _MERGE_SORT.  pO
247d0 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
247e0 65 78 74 3b 0a 23 65 6e 64 69 66 0a 63 61 73 65  ext;.#endif.case
247f0 20 4f 50 5f 50 72 65 76 3a 20 20 20 20 20 20 20   OP_Prev:       
24800 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61     /* jump */.ca
24810 73 65 20 4f 50 5f 4e 65 78 74 3a 20 7b 20 20 20  se OP_Next: {   
24820 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
24830 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
24840 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20  ;.  int res;..  
24850 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52 52  CHECK_FOR_INTERR
24860 55 50 54 3b 0a 20 20 61 73 73 65 72 74 28 20 70  UPT;.  assert( p
24870 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
24880 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
24890 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
248a0 2d 3e 70 35 3c 3d 41 72 72 61 79 53 69 7a 65 28  ->p5<=ArraySize(
248b0 70 2d 3e 61 43 6f 75 6e 74 65 72 29 20 29 3b 0a  p->aCounter) );.
248c0 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
248d0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20  pOp->p1];.  if( 
248e0 70 43 3d 3d 30 20 29 7b 0a 20 20 20 20 62 72 65  pC==0 ){.    bre
248f0 61 6b 3b 20 20 2f 2a 20 53 65 65 20 74 69 63 6b  ak;  /* See tick
24900 65 74 20 23 32 32 37 33 20 2a 2f 0a 20 20 7d 0a  et #2273 */.  }.
24910 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73    assert( pC->is
24920 53 6f 72 74 65 72 3d 3d 28 70 4f 70 2d 3e 6f 70  Sorter==(pOp->op
24930 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 4e  code==OP_SorterN
24940 65 78 74 29 20 29 3b 0a 20 20 69 66 28 20 69 73  ext) );.  if( is
24950 53 6f 72 74 65 72 28 70 43 29 20 29 7b 0a 20 20  Sorter(pC) ){.  
24960 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
24970 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72  pcode==OP_Sorter
24980 4e 65 78 74 20 29 3b 0a 20 20 20 20 72 63 20 3d  Next );.    rc =
24990 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
249a0 65 72 4e 65 78 74 28 64 62 2c 20 70 43 2c 20 26  erNext(db, pC, &
249b0 72 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  res);.  }else{. 
249c0 20 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 20 20     res = 1;.    
249d0 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65  assert( pC->defe
249e0 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
249f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
24a00 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
24a10 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
24a20 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 20 7c 7c 20  ode!=OP_Next || 
24a30 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
24a40 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  ==sqlite3BtreeNe
24a50 78 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  xt );.    assert
24a60 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f  ( pOp->opcode!=O
24a70 50 5f 50 72 65 76 20 7c 7c 20 70 4f 70 2d 3e 70  P_Prev || pOp->p
24a80 34 2e 78 41 64 76 61 6e 63 65 3d 3d 73 71 6c 69  4.xAdvance==sqli
24a90 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
24aa0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 4f 70   );.    rc = pOp
24ab0 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 28 70 43  ->p4.xAdvance(pC
24ac0 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29  ->pCursor, &res)
24ad0 3b 0a 20 20 7d 0a 20 20 70 43 2d 3e 6e 75 6c 6c  ;.  }.  pC->null
24ae0 52 6f 77 20 3d 20 28 75 38 29 72 65 73 3b 0a 20  Row = (u8)res;. 
24af0 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
24b00 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
24b10 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
24b20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
24b30 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 4f   - 1;.    if( pO
24b40 70 2d 3e 70 35 20 29 20 70 2d 3e 61 43 6f 75 6e  p->p5 ) p->aCoun
24b50 74 65 72 5b 70 4f 70 2d 3e 70 35 2d 31 5d 2b 2b  ter[pOp->p5-1]++
24b60 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
24b70 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33  TEST.    sqlite3
24b80 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b  _search_count++;
24b90 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 43  .#endif.  }.  pC
24ba0 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d  ->rowidIsValid =
24bb0 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   0;.  break;.}..
24bc0 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 49 6e  /* Opcode: IdxIn
24bd0 73 65 72 74 20 50 31 20 50 32 20 50 33 20 2a 20  sert P1 P2 P3 * 
24be0 50 35 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65  P5.**.** Registe
24bf0 72 20 50 32 20 68 6f 6c 64 73 20 61 6e 20 53 51  r P2 holds an SQ
24c00 4c 20 69 6e 64 65 78 20 6b 65 79 20 6d 61 64 65  L index key made
24c10 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 4d 61   using the.** Ma
24c20 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63  keRecord instruc
24c30 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 6f 70 63  tions.  This opc
24c40 6f 64 65 20 77 72 69 74 65 73 20 74 68 61 74 20  ode writes that 
24c50 6b 65 79 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  key.** into the 
24c60 69 6e 64 65 78 20 50 31 2e 20 20 44 61 74 61 20  index P1.  Data 
24c70 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 69 73  for the entry is
24c80 20 6e 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 33 20 69   nil..**.** P3 i
24c90 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 70 72  s a flag that pr
24ca0 6f 76 69 64 65 73 20 61 20 68 69 6e 74 20 74 6f  ovides a hint to
24cb0 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65   the b-tree laye
24cc0 72 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 69  r that this.** i
24cd0 6e 73 65 72 74 20 69 73 20 6c 69 6b 65 6c 79 20  nsert is likely 
24ce0 74 6f 20 62 65 20 61 6e 20 61 70 70 65 6e 64 2e  to be an append.
24cf0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74  .**.** This inst
24d00 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72  ruction only wor
24d10 6b 73 20 66 6f 72 20 69 6e 64 69 63 65 73 2e 20  ks for indices. 
24d20 20 54 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   The equivalent 
24d30 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66  instruction.** f
24d40 6f 72 20 74 61 62 6c 65 73 20 69 73 20 4f 50 5f  or tables is OP_
24d50 49 6e 73 65 72 74 2e 0a 2a 2f 0a 63 61 73 65 20  Insert..*/.case 
24d60 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3a  OP_SorterInsert:
24d70 20 20 20 20 20 20 20 2f 2a 20 69 6e 32 20 2a 2f         /* in2 */
24d80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
24d90 4d 49 54 5f 4d 45 52 47 45 5f 53 4f 52 54 0a 20  MIT_MERGE_SORT. 
24da0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
24db0 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a 23 65 6e  P_IdxInsert;.#en
24dc0 64 69 66 0a 63 61 73 65 20 4f 50 5f 49 64 78 49  dif.case OP_IdxI
24dd0 6e 73 65 72 74 3a 20 7b 20 20 20 20 20 20 20 20  nsert: {        
24de0 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56 64 62 65  /* in2 */.  Vdbe
24df0 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74  Cursor *pC;.  Bt
24e00 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20  Cursor *pCrsr;. 
24e10 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 63 6f 6e   int nKey;.  con
24e20 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 0a  st char *zKey;..
24e30 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
24e40 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
24e50 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
24e60 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
24e70 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
24e80 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
24e90 65 72 74 28 20 70 43 2d 3e 69 73 53 6f 72 74 65  ert( pC->isSorte
24ea0 72 3d 3d 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  r==(pOp->opcode=
24eb0 3d 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74  =OP_SorterInsert
24ec0 29 20 29 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61  ) );.  pIn2 = &a
24ed0 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
24ee0 61 73 73 65 72 74 28 20 70 49 6e 32 2d 3e 66 6c  assert( pIn2->fl
24ef0 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
24f00 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e  ;.  pCrsr = pC->
24f10 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 41  pCursor;.  if( A
24f20 4c 57 41 59 53 28 70 43 72 73 72 21 3d 30 29 20  LWAYS(pCrsr!=0) 
24f30 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
24f40 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b  C->isTable==0 );
24f50 0a 20 20 20 20 72 63 20 3d 20 45 78 70 61 6e 64  .    rc = Expand
24f60 42 6c 6f 62 28 70 49 6e 32 29 3b 0a 20 20 20 20  Blob(pIn2);.    
24f70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24f80 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
24f90 73 53 6f 72 74 65 72 28 70 43 29 20 29 7b 0a 20  sSorter(pC) ){. 
24fa0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
24fb0 74 65 33 56 64 62 65 53 6f 72 74 65 72 57 72 69  te3VdbeSorterWri
24fc0 74 65 28 64 62 2c 20 70 43 2c 20 70 49 6e 32 29  te(db, pC, pIn2)
24fd0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
24fe0 20 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 49         nKey = pI
24ff0 6e 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7a  n2->n;.        z
25000 4b 65 79 20 3d 20 70 49 6e 32 2d 3e 7a 3b 0a 20  Key = pIn2->z;. 
25010 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
25020 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 70  te3BtreeInsert(p
25030 43 72 73 72 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79  Crsr, zKey, nKey
25040 2c 20 22 22 2c 20 30 2c 20 30 2c 20 70 4f 70 2d  , "", 0, 0, pOp-
25050 3e 70 33 2c 20 0a 20 20 20 20 20 20 20 20 20 20  >p3, .          
25060 20 20 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50    ((pOp->p5 & OP
25070 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
25080 4c 54 29 20 3f 20 70 43 2d 3e 73 65 65 6b 52 65  LT) ? pC->seekRe
25090 73 75 6c 74 20 3a 20 30 29 0a 20 20 20 20 20 20  sult : 0).      
250a0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
250b0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66   assert( pC->def
250c0 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29  erredMoveto==0 )
250d0 3b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 63 61  ;.        pC->ca
250e0 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
250f0 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20 7d  E_STALE;.      }
25100 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
25110 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
25120 3a 20 49 64 78 44 65 6c 65 74 65 20 50 31 20 50  : IdxDelete P1 P
25130 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  2 P3 * *.**.** T
25140 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 50 33  he content of P3
25150 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
25160 69 6e 67 20 61 74 20 72 65 67 69 73 74 65 72 20  ing at register 
25170 50 32 20 66 6f 72 6d 0a 2a 2a 20 61 6e 20 75 6e  P2 form.** an un
25180 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
25190 2e 20 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65  . This opcode re
251a0 6d 6f 76 65 73 20 74 68 61 74 20 65 6e 74 72 79  moves that entry
251b0 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 69 6e   from the .** in
251c0 64 65 78 20 6f 70 65 6e 65 64 20 62 79 20 63 75  dex opened by cu
251d0 72 73 6f 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65  rsor P1..*/.case
251e0 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 3a 20 7b   OP_IdxDelete: {
251f0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
25200 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  C;.  BtCursor *p
25210 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b  Crsr;.  int res;
25220 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
25230 64 20 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  d r;..  assert( 
25240 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 61  pOp->p3>0 );.  a
25250 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30  ssert( pOp->p2>0
25260 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d   && pOp->p2+pOp-
25270 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29  >p3<=p->nMem+1 )
25280 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
25290 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
252a0 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
252b0 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
252c0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
252d0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70  rt( pC!=0 );.  p
252e0 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73  Crsr = pC->pCurs
252f0 6f 72 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  or;.  if( ALWAYS
25300 28 70 43 72 73 72 21 3d 30 29 20 29 7b 0a 20 20  (pCrsr!=0) ){.  
25310 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70    r.pKeyInfo = p
25320 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  C->pKeyInfo;.   
25330 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36   r.nField = (u16
25340 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 72 2e  )pOp->p3;.    r.
25350 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 72  flags = 0;.    r
25360 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f  .aMem = &aMem[pO
25370 70 2d 3e 70 32 5d 3b 0a 23 69 66 64 65 66 20 53  p->p2];.#ifdef S
25380 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
25390 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30  { int i; for(i=0
253a0 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b  ; i<r.nField; i+
253b0 2b 29 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73  +) assert( memIs
253c0 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d  Valid(&r.aMem[i]
253d0 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20  ) ); }.#endif.  
253e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
253f0 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
25400 64 28 70 43 72 73 72 2c 20 26 72 2c 20 30 2c 20  d(pCrsr, &r, 0, 
25410 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66  0, &res);.    if
25420 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25430 26 26 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  && res==0 ){.   
25440 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
25450 74 72 65 65 44 65 6c 65 74 65 28 70 43 72 73 72  treeDelete(pCrsr
25460 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
25470 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65  ert( pC->deferre
25480 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20  dMoveto==0 );.  
25490 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
254a0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
254b0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
254c0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 52  ./* Opcode: IdxR
254d0 6f 77 69 64 20 50 31 20 50 32 20 2a 20 2a 20 2a  owid P1 P2 * * *
254e0 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74  .**.** Write int
254f0 6f 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e  o register P2 an
25500 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
25510 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  s the last entry
25520 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 61   in the record a
25530 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20  t.** the end of 
25540 74 68 65 20 69 6e 64 65 78 20 6b 65 79 20 70 6f  the index key po
25550 69 6e 74 65 64 20 74 6f 20 62 79 20 63 75 72 73  inted to by curs
25560 6f 72 20 50 31 2e 20 20 54 68 69 73 20 69 6e 74  or P1.  This int
25570 65 67 65 72 20 73 68 6f 75 6c 64 20 62 65 0a 2a  eger should be.*
25580 2a 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  * the rowid of t
25590 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 74  he table entry t
255a0 6f 20 77 68 69 63 68 20 74 68 69 73 20 69 6e 64  o which this ind
255b0 65 78 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 2e  ex entry points.
255c0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
255d0 20 52 6f 77 69 64 2c 20 4d 61 6b 65 52 65 63 6f   Rowid, MakeReco
255e0 72 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  rd..*/.case OP_I
255f0 64 78 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20  dxRowid: {      
25600 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
25610 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
25620 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
25630 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
25640 43 3b 0a 20 20 69 36 34 20 72 6f 77 69 64 3b 0a  C;.  i64 rowid;.
25650 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
25660 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
25670 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
25680 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
25690 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
256a0 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70 43  t( pC!=0 );.  pC
256b0 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  rsr = pC->pCurso
256c0 72 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  r;.  pOut->flags
256d0 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 69   = MEM_Null;.  i
256e0 66 28 20 41 4c 57 41 59 53 28 70 43 72 73 72 21  f( ALWAYS(pCrsr!
256f0 3d 30 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =0) ){.    rc = 
25700 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
25710 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 20  rMoveto(pC);.   
25720 20 69 66 28 20 4e 45 56 45 52 28 72 63 29 20 29   if( NEVER(rc) )
25730 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
25740 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 61 73  to_error;.    as
25750 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72  sert( pC->deferr
25760 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20  edMoveto==0 );. 
25770 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
25780 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  sTable==0 );.   
25790 20 69 66 28 20 21 70 43 2d 3e 6e 75 6c 6c 52 6f   if( !pC->nullRo
257a0 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  w ){.      rc = 
257b0 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
257c0 77 69 64 28 64 62 2c 20 70 43 72 73 72 2c 20 26  wid(db, pCrsr, &
257d0 72 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66  rowid);.      if
257e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
257f0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
25800 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
25810 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
25820 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 6f    pOut->u.i = ro
25830 77 69 64 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  wid;.      pOut-
25840 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
25850 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
25860 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
25870 65 3a 20 49 64 78 47 45 20 50 31 20 50 32 20 50  e: IdxGE P1 P2 P
25880 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68  3 P4 P5.**.** Th
25890 65 20 50 34 20 72 65 67 69 73 74 65 72 20 76 61  e P4 register va
258a0 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77  lues beginning w
258b0 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e 20 75  ith P3 form an u
258c0 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a  npacked index .*
258d0 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69 74 73  * key that omits
258e0 20 74 68 65 20 52 4f 57 49 44 2e 20 20 43 6f 6d   the ROWID.  Com
258f0 70 61 72 65 20 74 68 69 73 20 6b 65 79 20 76 61  pare this key va
25900 6c 75 65 20 61 67 61 69 6e 73 74 20 74 68 65 20  lue against the 
25910 69 6e 64 65 78 20 0a 2a 2a 20 74 68 61 74 20 50  index .** that P
25920 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  1 is currently p
25930 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f  ointing to, igno
25940 72 69 6e 67 20 74 68 65 20 52 4f 57 49 44 20 6f  ring the ROWID o
25950 6e 20 74 68 65 20 50 31 20 69 6e 64 65 78 2e 0a  n the P1 index..
25960 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20  **.** If the P1 
25970 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 67  index entry is g
25980 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
25990 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20  qual to the key 
259a0 76 61 6c 75 65 0a 2a 2a 20 74 68 65 6e 20 6a 75  value.** then ju
259b0 6d 70 20 74 6f 20 50 32 2e 20 20 4f 74 68 65 72  mp to P2.  Other
259c0 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67  wise fall throug
259d0 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
259e0 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
259f0 20 49 66 20 50 35 20 69 73 20 6e 6f 6e 2d 7a 65   If P5 is non-ze
25a00 72 6f 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20  ro then the key 
25a10 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73  value is increas
25a20 65 64 20 62 79 20 61 6e 20 65 70 73 69 6c 6f 6e  ed by an epsilon
25a30 20 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68   .** prior to th
25a40 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  e comparison.  T
25a50 68 69 73 20 6d 61 6b 65 20 74 68 65 20 6f 70 63  his make the opc
25a60 6f 64 65 20 77 6f 72 6b 20 6c 69 6b 65 20 49 64  ode work like Id
25a70 78 47 54 20 65 78 63 65 70 74 0a 2a 2a 20 74 68  xGT except.** th
25a80 61 74 20 69 66 20 74 68 65 20 6b 65 79 20 66 72  at if the key fr
25a90 6f 6d 20 72 65 67 69 73 74 65 72 20 50 33 20 69  om register P3 i
25aa0 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
25ab0 65 20 6b 65 79 20 69 6e 20 74 68 65 20 63 75 72  e key in the cur
25ac0 73 6f 72 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75  sor,.** the resu
25ad0 6c 74 20 69 73 20 66 61 6c 73 65 20 77 68 65 72  lt is false wher
25ae0 65 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20  eas it would be 
25af0 74 72 75 65 20 77 69 74 68 20 49 64 78 47 54 2e  true with IdxGT.
25b00 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .*/./* Opcode: I
25b10 64 78 4c 54 20 50 31 20 50 32 20 50 33 20 50 34  dxLT P1 P2 P3 P4
25b20 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34   P5.**.** The P4
25b30 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 73   register values
25b40 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
25b50 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63  P3 form an unpac
25b60 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b 65  ked index .** ke
25b70 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65  y that omits the
25b80 20 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72 65   ROWID.  Compare
25b90 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20   this key value 
25ba0 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65  against the inde
25bb0 78 20 0a 2a 2a 20 74 68 61 74 20 50 31 20 69 73  x .** that P1 is
25bc0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
25bd0 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67  ing to, ignoring
25be0 20 74 68 65 20 52 4f 57 49 44 20 6f 6e 20 74 68   the ROWID on th
25bf0 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  e P1 index..**.*
25c00 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e 64 65  * If the P1 inde
25c10 78 20 65 6e 74 72 79 20 69 73 20 6c 65 73 73 20  x entry is less 
25c20 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61 6c  than the key val
25c30 75 65 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ue then jump to 
25c40 50 32 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  P2..** Otherwise
25c50 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
25c60 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
25c70 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
25c80 50 35 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  P5 is non-zero t
25c90 68 65 6e 20 74 68 65 20 6b 65 79 20 76 61 6c 75  hen the key valu
25ca0 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 62  e is increased b
25cb0 79 20 61 6e 20 65 70 73 69 6c 6f 6e 20 70 72 69  y an epsilon pri
25cc0 6f 72 20 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f  or .** to the co
25cd0 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 69 73 20  mparison.  This 
25ce0 6d 61 6b 65 73 20 74 68 65 20 6f 70 63 6f 64 65  makes the opcode
25cf0 20 77 6f 72 6b 20 6c 69 6b 65 20 49 64 78 4c 45   work like IdxLE
25d00 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78  ..*/.case OP_Idx
25d10 4c 54 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  LT:          /* 
25d20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  jump */.case OP_
25d30 49 64 78 47 45 3a 20 7b 20 20 20 20 20 20 20 20  IdxGE: {        
25d40 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62  /* jump */.  Vdb
25d50 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69  eCursor *pC;.  i
25d60 6e 74 20 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b  nt res;.  Unpack
25d70 65 64 52 65 63 6f 72 64 20 72 3b 0a 0a 20 20 61  edRecord r;..  a
25d80 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
25d90 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
25da0 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
25db0 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
25dc0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
25dd0 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
25de0 28 20 70 43 2d 3e 69 73 4f 72 64 65 72 65 64 20  ( pC->isOrdered 
25df0 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
25e00 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 29 20  pC->pCursor!=0) 
25e10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
25e20 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
25e30 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  o==0 );.    asse
25e40 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c  rt( pOp->p5==0 |
25e50 7c 20 70 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b 0a  | pOp->p5==1 );.
25e60 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
25e70 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
25e80 32 20 29 3b 0a 20 20 20 20 72 2e 70 4b 65 79 49  2 );.    r.pKeyI
25e90 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e  nfo = pC->pKeyIn
25ea0 66 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64  fo;.    r.nField
25eb0 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 34 2e   = (u16)pOp->p4.
25ec0 69 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  i;.    if( pOp->
25ed0 70 35 20 29 7b 0a 20 20 20 20 20 20 72 2e 66 6c  p5 ){.      r.fl
25ee0 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 49  ags = UNPACKED_I
25ef0 4e 43 52 4b 45 59 20 7c 20 55 4e 50 41 43 4b 45  NCRKEY | UNPACKE
25f00 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 3b 0a  D_PREFIX_MATCH;.
25f10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25f20 20 72 2e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43   r.flags = UNPAC
25f30 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48  KED_PREFIX_MATCH
25f40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 2e 61 4d  ;.    }.    r.aM
25f50 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  em = &aMem[pOp->
25f60 70 33 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  p3];.#ifdef SQLI
25f70 54 45 5f 44 45 42 55 47 0a 20 20 20 20 7b 20 69  TE_DEBUG.    { i
25f80 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69  nt i; for(i=0; i
25f90 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20  <r.nField; i++) 
25fa0 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
25fb0 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29  id(&r.aMem[i]) )
25fc0 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  ; }.#endif.    r
25fd0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49  c = sqlite3VdbeI
25fe0 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 70 43 2c  dxKeyCompare(pC,
25ff0 20 26 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20   &r, &res);.    
26000 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
26010 3d 4f 50 5f 49 64 78 4c 54 20 29 7b 0a 20 20 20  =OP_IdxLT ){.   
26020 20 20 20 72 65 73 20 3d 20 2d 72 65 73 3b 0a 20     res = -res;. 
26030 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26040 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
26050 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b  ode==OP_IdxGE );
26060 0a 20 20 20 20 20 20 72 65 73 2b 2b 3b 0a 20 20  .      res++;.  
26070 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 3e    }.    if( res>
26080 30 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20  0 ){.      pc = 
26090 70 4f 70 2d 3e 70 32 20 2d 20 31 20 3b 0a 20 20  pOp->p2 - 1 ;.  
260a0 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
260b0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  .}../* Opcode: D
260c0 65 73 74 72 6f 79 20 50 31 20 50 32 20 50 33 20  estroy P1 P2 P3 
260d0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65  * *.**.** Delete
260e0 20 61 6e 20 65 6e 74 69 72 65 20 64 61 74 61 62   an entire datab
260f0 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ase table or ind
26100 65 78 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61  ex whose root pa
26110 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
26120 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 67 69  se.** file is gi
26130 76 65 6e 20 62 79 20 50 31 2e 0a 2a 2a 0a 2a 2a  ven by P1..**.**
26140 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
26150 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 69 6e   destroyed is in
26160 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
26170 73 65 20 66 69 6c 65 20 69 66 20 50 33 3d 3d 30  se file if P3==0
26180 2e 20 20 49 66 0a 2a 2a 20 50 33 3d 3d 31 20 74  .  If.** P3==1 t
26190 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f  hen the table to
261a0 20 62 65 20 63 6c 65 61 72 20 69 73 20 69 6e 20   be clear is in 
261b0 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
261c0 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74  tabase file.** t
261d0 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  hat is used to s
261e0 74 6f 72 65 20 74 61 62 6c 65 73 20 63 72 65 61  tore tables crea
261f0 74 65 20 75 73 69 6e 67 20 43 52 45 41 54 45 20  te using CREATE 
26200 54 45 4d 50 4f 52 41 52 59 20 54 41 42 4c 45 2e  TEMPORARY TABLE.
26210 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41  .**.** If AUTOVA
26220 43 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20  CUUM is enabled 
26230 74 68 65 6e 20 69 74 20 69 73 20 70 6f 73 73 69  then it is possi
26240 62 6c 65 20 74 68 61 74 20 61 6e 6f 74 68 65 72  ble that another
26250 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 6d 69   root page.** mi
26260 67 68 74 20 62 65 20 6d 6f 76 65 64 20 69 6e 74  ght be moved int
26270 6f 20 74 68 65 20 6e 65 77 6c 79 20 64 65 6c 65  o the newly dele
26280 74 65 64 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ted root page in
26290 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 61   order to keep a
262a0 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73  ll.** root pages
262b0 20 63 6f 6e 74 69 67 75 6f 75 73 20 61 74 20 74   contiguous at t
262c0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
262d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
262e0 68 65 20 66 6f 72 6d 65 72 0a 2a 2a 20 76 61 6c  he former.** val
262f0 75 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 70  ue of the root p
26300 61 67 65 20 74 68 61 74 20 6d 6f 76 65 64 20 2d  age that moved -
26310 20 69 74 73 20 76 61 6c 75 65 20 62 65 66 6f 72   its value befor
26320 65 20 74 68 65 20 6d 6f 76 65 20 6f 63 63 75 72  e the move occur
26330 72 65 64 20 2d 0a 2a 2a 20 69 73 20 73 74 6f 72  red -.** is stor
26340 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
26350 32 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20 0a  2.  If no page .
26360 2a 2a 20 6d 6f 76 65 6d 65 6e 74 20 77 61 73 20  ** movement was 
26370 72 65 71 75 69 72 65 64 20 28 62 65 63 61 75 73  required (becaus
26380 65 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  e the table bein
26390 67 20 64 72 6f 70 70 65 64 20 77 61 73 20 61 6c  g dropped was al
263a0 72 65 61 64 79 20 0a 2a 2a 20 74 68 65 20 6c 61  ready .** the la
263b0 73 74 20 6f 6e 65 20 69 6e 20 74 68 65 20 64 61  st one in the da
263c0 74 61 62 61 73 65 29 20 74 68 65 6e 20 61 20 7a  tabase) then a z
263d0 65 72 6f 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ero is stored in
263e0 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
263f0 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69   If AUTOVACUUM i
26400 73 20 64 69 73 61 62 6c 65 64 20 74 68 65 6e 20  s disabled then 
26410 61 20 7a 65 72 6f 20 69 73 20 73 74 6f 72 65 64  a zero is stored
26420 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
26430 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
26440 20 43 6c 65 61 72 0a 2a 2f 0a 63 61 73 65 20 4f   Clear.*/.case O
26450 50 5f 44 65 73 74 72 6f 79 3a 20 7b 20 20 20 20  P_Destroy: {    
26460 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65   /* out2-prerele
26470 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 6f  ase */.  int iMo
26480 76 65 64 3b 0a 20 20 69 6e 74 20 69 43 6e 74 3b  ved;.  int iCnt;
26490 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65 3b 0a  .  Vdbe *pVdbe;.
264a0 20 20 69 6e 74 20 69 44 62 3b 0a 23 69 66 6e 64    int iDb;.#ifnd
264b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
264c0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 43  IRTUALTABLE.  iC
264d0 6e 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 56  nt = 0;.  for(pV
264e0 64 62 65 3d 64 62 2d 3e 70 56 64 62 65 3b 20 70  dbe=db->pVdbe; p
264f0 56 64 62 65 3b 20 70 56 64 62 65 20 3d 20 70 56  Vdbe; pVdbe = pV
26500 64 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  dbe->pNext){.   
26510 20 69 66 28 20 70 56 64 62 65 2d 3e 6d 61 67 69   if( pVdbe->magi
26520 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
26530 4e 20 26 26 20 70 56 64 62 65 2d 3e 69 6e 56 74  N && pVdbe->inVt
26540 61 62 4d 65 74 68 6f 64 3c 32 20 26 26 20 70 56  abMethod<2 && pV
26550 64 62 65 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  dbe->pc>=0 ){.  
26560 20 20 20 20 69 43 6e 74 2b 2b 3b 0a 20 20 20 20      iCnt++;.    
26570 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 43  }.  }.#else.  iC
26580 6e 74 20 3d 20 64 62 2d 3e 61 63 74 69 76 65 56  nt = db->activeV
26590 64 62 65 43 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  dbeCnt;.#endif. 
265a0 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
265b0 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 69 66 28 20 69  EM_Null;.  if( i
265c0 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20 72 63 20  Cnt>1 ){.    rc 
265d0 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  = SQLITE_LOCKED;
265e0 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  .    p->errorAct
265f0 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
26600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 44 62    }else{.    iDb
26610 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20   = pOp->p3;.    
26620 61 73 73 65 72 74 28 20 69 43 6e 74 3d 3d 31 20  assert( iCnt==1 
26630 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
26640 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28  p->btreeMask & (
26650 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44  ((yDbMask)1)<<iD
26660 62 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 72 63  b))!=0 );.    rc
26670 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44   = sqlite3BtreeD
26680 72 6f 70 54 61 62 6c 65 28 64 62 2d 3e 61 44 62  ropTable(db->aDb
26690 5b 69 44 62 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e  [iDb].pBt, pOp->
266a0 70 31 2c 20 26 69 4d 6f 76 65 64 29 3b 0a 20 20  p1, &iMoved);.  
266b0 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
266c0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4f 75  MEM_Int;.    pOu
266d0 74 2d 3e 75 2e 69 20 3d 20 69 4d 6f 76 65 64 3b  t->u.i = iMoved;
266e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
266f0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
26700 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26710 54 45 5f 4f 4b 20 26 26 20 69 4d 6f 76 65 64 21  TE_OK && iMoved!
26720 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
26730 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64  te3RootPageMoved
26740 28 64 62 2c 20 69 44 62 2c 20 69 4d 6f 76 65 64  (db, iDb, iMoved
26750 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20  , pOp->p1);.    
26760 20 20 2f 2a 20 41 6c 6c 20 4f 50 5f 44 65 73 74    /* All OP_Dest
26770 72 6f 79 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  roy operations o
26780 63 63 75 72 20 6f 6e 20 74 68 65 20 73 61 6d 65  ccur on the same
26790 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20   btree */.      
267a0 61 73 73 65 72 74 28 20 72 65 73 65 74 53 63 68  assert( resetSch
267b0 65 6d 61 4f 6e 46 61 75 6c 74 3d 3d 30 20 7c 7c  emaOnFault==0 ||
267c0 20 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61   resetSchemaOnFa
267d0 75 6c 74 3d 3d 69 44 62 2b 31 20 29 3b 0a 20 20  ult==iDb+1 );.  
267e0 20 20 20 20 72 65 73 65 74 53 63 68 65 6d 61 4f      resetSchemaO
267f0 6e 46 61 75 6c 74 20 3d 20 69 44 62 2b 31 3b 0a  nFault = iDb+1;.
26800 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
26810 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
26820 4f 70 63 6f 64 65 3a 20 43 6c 65 61 72 20 50 31  Opcode: Clear P1
26830 20 50 32 20 50 33 0a 2a 2a 0a 2a 2a 20 44 65 6c   P2 P3.**.** Del
26840 65 74 65 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 73  ete all contents
26850 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
26860 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
26870 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 0a  whose root page.
26880 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
26890 73 65 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  se file is given
268a0 20 62 79 20 50 31 2e 20 20 42 75 74 2c 20 75 6e   by P1.  But, un
268b0 6c 69 6b 65 20 44 65 73 74 72 6f 79 2c 20 64 6f  like Destroy, do
268c0 20 6e 6f 74 0a 2a 2a 20 72 65 6d 6f 76 65 20 74   not.** remove t
268d0 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
268e0 78 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  x from the datab
268f0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
26900 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
26910 63 6c 65 61 72 20 69 73 20 69 6e 20 74 68 65 20  clear is in the 
26920 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
26930 6c 65 20 69 66 20 50 32 3d 3d 30 2e 20 20 49 66  le if P2==0.  If
26940 0a 2a 2a 20 50 32 3d 3d 31 20 74 68 65 6e 20 74  .** P2==1 then t
26950 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 63  he table to be c
26960 6c 65 61 72 20 69 73 20 69 6e 20 74 68 65 20 61  lear is in the a
26970 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
26980 65 20 66 69 6c 65 0a 2a 2a 20 74 68 61 74 20 69  e file.** that i
26990 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
269a0 74 61 62 6c 65 73 20 63 72 65 61 74 65 20 75 73  tables create us
269b0 69 6e 67 20 43 52 45 41 54 45 20 54 45 4d 50 4f  ing CREATE TEMPO
269c0 52 41 52 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  RARY TABLE..**.*
269d0 2a 20 49 66 20 74 68 65 20 50 33 20 76 61 6c 75  * If the P3 valu
269e0 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  e is non-zero, t
269f0 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 72 65  hen the table re
26a00 66 65 72 72 65 64 20 74 6f 20 6d 75 73 74 20 62  ferred to must b
26a10 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 74  e an.** intkey t
26a20 61 62 6c 65 20 28 61 6e 20 53 51 4c 20 74 61 62  able (an SQL tab
26a30 6c 65 2c 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78  le, not an index
26a40 29 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ). In this case 
26a50 74 68 65 20 72 6f 77 20 63 68 61 6e 67 65 20 0a  the row change .
26a60 2a 2a 20 63 6f 75 6e 74 20 69 73 20 69 6e 63 72  ** count is incr
26a70 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e  emented by the n
26a80 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
26a90 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
26aa0 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2a 20 49 66   cleared. .** If
26ab0 20 50 33 20 69 73 20 67 72 65 61 74 65 72 20 74   P3 is greater t
26ac0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
26ad0 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
26ae0 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 69  in register P3 i
26af0 73 0a 2a 2a 20 61 6c 73 6f 20 69 6e 63 72 65 6d  s.** also increm
26b00 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  ented by the num
26b10 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
26b20 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63  he table being c
26b30 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  leared..**.** Se
26b40 65 20 61 6c 73 6f 3a 20 44 65 73 74 72 6f 79 0a  e also: Destroy.
26b50 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6c 65 61 72  */.case OP_Clear
26b60 3a 20 7b 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67  : {.  int nChang
26b70 65 3b 0a 20 0a 20 20 6e 43 68 61 6e 67 65 20 3d  e;. .  nChange =
26b80 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   0;.  assert( (p
26b90 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28  ->btreeMask & ((
26ba0 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70  (yDbMask)1)<<pOp
26bb0 2d 3e 70 32 29 29 21 3d 30 20 29 3b 0a 20 20 72  ->p2))!=0 );.  r
26bc0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
26bd0 43 6c 65 61 72 54 61 62 6c 65 28 0a 20 20 20 20  ClearTable(.    
26be0 20 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70    db->aDb[pOp->p
26bf0 32 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 31 2c  2].pBt, pOp->p1,
26c00 20 28 70 4f 70 2d 3e 70 33 20 3f 20 26 6e 43 68   (pOp->p3 ? &nCh
26c10 61 6e 67 65 20 3a 20 30 29 0a 20 20 29 3b 0a 20  ange : 0).  );. 
26c20 20 69 66 28 20 70 4f 70 2d 3e 70 33 20 29 7b 0a   if( pOp->p3 ){.
26c30 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 2b      p->nChange +
26c40 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 20 20 69  = nChange;.    i
26c50 66 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 7b 0a  f( pOp->p3>0 ){.
26c60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
26c70 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70  mIsValid(&aMem[p
26c80 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a 20 20 20 20  Op->p3]) );.    
26c90 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
26ca0 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d  ge(p, &aMem[pOp-
26cb0 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20 61 4d 65  >p3]);.      aMe
26cc0 6d 5b 70 4f 70 2d 3e 70 33 5d 2e 75 2e 69 20 2b  m[pOp->p3].u.i +
26cd0 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 20 20 7d  = nChange;.    }
26ce0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
26cf0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 72 65 61  ./* Opcode: Crea
26d00 74 65 54 61 62 6c 65 20 50 31 20 50 32 20 2a 20  teTable P1 P2 * 
26d10 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  * *.**.** Alloca
26d20 74 65 20 61 20 6e 65 77 20 74 61 62 6c 65 20 69  te a new table i
26d30 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
26d40 61 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d  ase file if P1==
26d50 30 20 6f 72 20 69 6e 20 74 68 65 0a 2a 2a 20 61  0 or in the.** a
26d60 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
26d70 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 31 20  e file if P1==1 
26d80 6f 72 20 69 6e 20 61 6e 20 61 74 74 61 63 68 65  or in an attache
26d90 64 20 64 61 74 61 62 61 73 65 20 69 66 0a 2a 2a  d database if.**
26da0 20 50 31 3e 31 2e 20 20 57 72 69 74 65 20 74 68   P1>1.  Write th
26db0 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
26dc0 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  er of the new ta
26dd0 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69  ble into.** regi
26de0 73 74 65 72 20 50 32 0a 2a 2a 0a 2a 2a 20 54 68  ster P2.**.** Th
26df0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
26e00 77 65 65 6e 20 61 20 74 61 62 6c 65 20 61 6e 64  ween a table and
26e10 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74 68 69   an index is thi
26e20 73 3a 20 20 41 20 74 61 62 6c 65 20 6d 75 73 74  s:  A table must
26e30 0a 2a 2a 20 68 61 76 65 20 61 20 34 2d 62 79 74  .** have a 4-byt
26e40 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 61 6e  e integer key an
26e50 64 20 63 61 6e 20 68 61 76 65 20 61 72 62 69 74  d can have arbit
26e60 72 61 72 79 20 64 61 74 61 2e 20 20 41 6e 20 69  rary data.  An i
26e70 6e 64 65 78 0a 2a 2a 20 68 61 73 20 61 6e 20 61  ndex.** has an a
26e80 72 62 69 74 72 61 72 79 20 6b 65 79 20 62 75 74  rbitrary key but
26e90 20 6e 6f 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20   no data..**.** 
26ea0 53 65 65 20 61 6c 73 6f 3a 20 43 72 65 61 74 65  See also: Create
26eb0 49 6e 64 65 78 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  Index.*/./* Opco
26ec0 64 65 3a 20 43 72 65 61 74 65 49 6e 64 65 78 20  de: CreateIndex 
26ed0 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
26ee0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
26ef0 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 6d 61   index in the ma
26f00 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
26f10 20 69 66 20 50 31 3d 3d 30 20 6f 72 20 69 6e 20   if P1==0 or in 
26f20 74 68 65 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79  the.** auxiliary
26f30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
26f40 66 20 50 31 3d 3d 31 20 6f 72 20 69 6e 20 61 6e  f P1==1 or in an
26f50 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
26f60 73 65 20 69 66 0a 2a 2a 20 50 31 3e 31 2e 20 20  se if.** P1>1.  
26f70 57 72 69 74 65 20 74 68 65 20 72 6f 6f 74 20 70  Write the root p
26f80 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
26f90 65 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 74 6f  e new table into
26fa0 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 32 2e  .** register P2.
26fb0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 64 6f 63 75 6d  .**.** See docum
26fc0 65 6e 74 61 74 69 6f 6e 20 6f 6e 20 4f 50 5f 43  entation on OP_C
26fd0 72 65 61 74 65 54 61 62 6c 65 20 66 6f 72 20 61  reateTable for a
26fe0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
26ff0 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ation..*/.case O
27000 50 5f 43 72 65 61 74 65 49 6e 64 65 78 3a 20 20  P_CreateIndex:  
27010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
27020 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a  2-prerelease */.
27030 63 61 73 65 20 4f 50 5f 43 72 65 61 74 65 54 61  case OP_CreateTa
27040 62 6c 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ble: {          
27050 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61  /* out2-prerelea
27060 73 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f  se */.  int pgno
27070 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20  ;.  int flags;. 
27080 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 70 67 6e   Db *pDb;..  pgn
27090 6f 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  o = 0;.  assert(
270a0 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
270b0 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29  Op->p1<db->nDb )
270c0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  ;.  assert( (p->
270d0 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79  btreeMask & (((y
270e0 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e  DbMask)1)<<pOp->
270f0 70 31 29 29 21 3d 30 20 29 3b 0a 20 20 70 44 62  p1))!=0 );.  pDb
27100 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 4f 70 2d   = &db->aDb[pOp-
27110 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
27120 70 44 62 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  pDb->pBt!=0 );. 
27130 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
27140 3d 3d 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  ==OP_CreateTable
27150 20 29 7b 0a 20 20 20 20 2f 2a 20 66 6c 61 67 73   ){.    /* flags
27160 20 3d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 3b   = BTREE_INTKEY;
27170 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d 20   */.    flags = 
27180 42 54 52 45 45 5f 49 4e 54 4b 45 59 3b 0a 20 20  BTREE_INTKEY;.  
27190 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c 61 67 73  }else{.    flags
271a0 20 3d 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59   = BTREE_BLOBKEY
271b0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
271c0 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
271d0 61 62 6c 65 28 70 44 62 2d 3e 70 42 74 2c 20 26  able(pDb->pBt, &
271e0 70 67 6e 6f 2c 20 66 6c 61 67 73 29 3b 0a 20 20  pgno, flags);.  
271f0 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 67 6e 6f  pOut->u.i = pgno
27200 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
27210 20 4f 70 63 6f 64 65 3a 20 50 61 72 73 65 53 63   Opcode: ParseSc
27220 68 65 6d 61 20 50 31 20 2a 20 2a 20 50 34 20 2a  hema P1 * * P4 *
27230 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20  .**.** Read and 
27240 70 61 72 73 65 20 61 6c 6c 20 65 6e 74 72 69 65  parse all entrie
27250 73 20 66 72 6f 6d 20 74 68 65 20 53 51 4c 49 54  s from the SQLIT
27260 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
27270 66 20 64 61 74 61 62 61 73 65 20 50 31 0a 2a 2a  f database P1.**
27280 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20   that match the 
27290 57 48 45 52 45 20 63 6c 61 75 73 65 20 50 34 2e  WHERE clause P4.
272a0 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63   .**.** This opc
272b0 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ode invokes the 
272c0 70 61 72 73 65 72 20 74 6f 20 63 72 65 61 74 65  parser to create
272d0 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 6d   a new virtual m
272e0 61 63 68 69 6e 65 2c 0a 2a 2a 20 74 68 65 6e 20  achine,.** then 
272f0 72 75 6e 73 20 74 68 65 20 6e 65 77 20 76 69 72  runs the new vir
27300 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 49  tual machine.  I
27310 74 20 69 73 20 74 68 75 73 20 61 20 72 65 2d 65  t is thus a re-e
27320 6e 74 72 61 6e 74 20 6f 70 63 6f 64 65 2e 0a 2a  ntrant opcode..*
27330 2f 0a 63 61 73 65 20 4f 50 5f 50 61 72 73 65 53  /.case OP_ParseS
27340 63 68 65 6d 61 3a 20 7b 0a 20 20 69 6e 74 20 69  chema: {.  int i
27350 44 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db;.  const char
27360 20 2a 7a 4d 61 73 74 65 72 3b 0a 20 20 63 68 61   *zMaster;.  cha
27370 72 20 2a 7a 53 71 6c 3b 0a 20 20 49 6e 69 74 44  r *zSql;.  InitD
27380 61 74 61 20 69 6e 69 74 44 61 74 61 3b 0a 0a 20  ata initData;.. 
27390 20 2f 2a 20 41 6e 79 20 70 72 65 70 61 72 65 64   /* Any prepared
273a0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
273b0 69 6e 76 6f 6b 65 73 20 74 68 69 73 20 6f 70 63  invokes this opc
273c0 6f 64 65 20 77 69 6c 6c 20 68 6f 6c 64 20 6d 75  ode will hold mu
273d0 74 65 78 65 73 0a 20 20 2a 2a 20 6f 6e 20 65 76  texes.  ** on ev
273e0 65 72 79 20 62 74 72 65 65 2e 20 20 54 68 69 73  ery btree.  This
273f0 20 69 73 20 61 20 70 72 65 72 65 71 75 69 73 69   is a prerequisi
27400 74 65 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20  te for invoking 
27410 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 49 6e 69  .  ** sqlite3Ini
27420 74 43 61 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 2a  tCallback()..  *
27430 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
27440 44 45 42 55 47 0a 20 20 66 6f 72 28 69 44 62 3d  DEBUG.  for(iDb=
27450 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  0; iDb<db->nDb; 
27460 69 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  iDb++){.    asse
27470 72 74 28 20 69 44 62 3d 3d 31 20 7c 7c 20 73 71  rt( iDb==1 || sq
27480 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
27490 75 74 65 78 28 64 62 2d 3e 61 44 62 5b 69 44 62  utex(db->aDb[iDb
274a0 5d 2e 70 42 74 29 20 29 3b 0a 20 20 7d 0a 23 65  ].pBt) );.  }.#e
274b0 6e 64 69 66 0a 0a 20 20 69 44 62 20 3d 20 70 4f  ndif..  iDb = pO
274c0 70 2d 3e 70 31 3b 0a 20 20 61 73 73 65 72 74 28  p->p1;.  assert(
274d0 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
274e0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
274f0 72 74 28 20 44 62 48 61 73 50 72 6f 70 65 72 74  rt( DbHasPropert
27500 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 53 63  y(db, iDb, DB_Sc
27510 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 3b 0a 20  hemaLoaded) );. 
27520 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20 61   /* Used to be a
27530 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 2a 2f 20   conditional */ 
27540 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
27550 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
27560 29 3b 0a 20 20 20 20 69 6e 69 74 44 61 74 61 2e  );.    initData.
27570 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 69 6e 69  db = db;.    ini
27580 74 44 61 74 61 2e 69 44 62 20 3d 20 70 4f 70 2d  tData.iDb = pOp-
27590 3e 70 31 3b 0a 20 20 20 20 69 6e 69 74 44 61 74  >p1;.    initDat
275a0 61 2e 70 7a 45 72 72 4d 73 67 20 3d 20 26 70 2d  a.pzErrMsg = &p-
275b0 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 7a 53  >zErrMsg;.    zS
275c0 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  ql = sqlite3MPri
275d0 6e 74 66 28 64 62 2c 0a 20 20 20 20 20 20 20 22  ntf(db,.       "
275e0 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 72 6f 6f  SELECT name, roo
275f0 74 70 61 67 65 2c 20 73 71 6c 20 46 52 4f 4d 20  tpage, sql FROM 
27600 27 25 71 27 2e 25 73 20 57 48 45 52 45 20 25 73  '%q'.%s WHERE %s
27610 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 22   ORDER BY rowid"
27620 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ,.       db->aDb
27630 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 4d 61  [iDb].zName, zMa
27640 73 74 65 72 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  ster, pOp->p4.z)
27650 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d  ;.    if( zSql==
27660 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
27670 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
27680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
27690 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
276a0 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  busy==0 );.     
276b0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d   db->init.busy =
276c0 20 31 3b 0a 20 20 20 20 20 20 69 6e 69 74 44 61   1;.      initDa
276d0 74 61 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  ta.rc = SQLITE_O
276e0 4b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  K;.      assert(
276f0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
27700 65 64 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ed );.      rc =
27710 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
27720 2c 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65 33 49  , zSql, sqlite3I
27730 6e 69 74 43 61 6c 6c 62 61 63 6b 2c 20 26 69 6e  nitCallback, &in
27740 69 74 44 61 74 61 2c 20 30 29 3b 0a 20 20 20 20  itData, 0);.    
27750 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27760 5f 4f 4b 20 29 20 72 63 20 3d 20 69 6e 69 74 44  _OK ) rc = initD
27770 61 74 61 2e 72 63 3b 0a 20 20 20 20 20 20 73 71  ata.rc;.      sq
27780 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
27790 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 64 62 2d  zSql);.      db-
277a0 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20 30 3b 0a  >init.busy = 0;.
277b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
277c0 72 63 20 29 20 73 71 6c 69 74 65 33 52 65 73 65  rc ) sqlite3Rese
277d0 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
277e0 64 62 2c 20 2d 31 29 3b 0a 20 20 69 66 28 20 72  db, -1);.  if( r
277f0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
27800 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  ){.    goto no_m
27810 65 6d 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  em;.  }.  break;
27820 20 20 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e    .}..#if !defin
27830 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed(SQLITE_OMIT_A
27840 4e 41 4c 59 5a 45 29 0a 2f 2a 20 4f 70 63 6f 64  NALYZE)./* Opcod
27850 65 3a 20 4c 6f 61 64 41 6e 61 6c 79 73 69 73 20  e: LoadAnalysis 
27860 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  P1 * * * *.**.**
27870 20 52 65 61 64 20 74 68 65 20 73 71 6c 69 74 65   Read the sqlite
27880 5f 73 74 61 74 31 20 74 61 62 6c 65 20 66 6f 72  _stat1 table for
27890 20 64 61 74 61 62 61 73 65 20 50 31 20 61 6e 64   database P1 and
278a0 20 6c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   load the conten
278b0 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 62  t.** of that tab
278c0 6c 65 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 65  le into the inte
278d0 72 6e 61 6c 20 69 6e 64 65 78 20 68 61 73 68 20  rnal index hash 
278e0 74 61 62 6c 65 2e 20 20 54 68 69 73 20 77 69 6c  table.  This wil
278f0 6c 20 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 61  l cause.** the a
27900 6e 61 6c 79 73 69 73 20 74 6f 20 62 65 20 75 73  nalysis to be us
27910 65 64 20 77 68 65 6e 20 70 72 65 70 61 72 69 6e  ed when preparin
27920 67 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  g all subsequent
27930 20 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 63 61 73   queries..*/.cas
27940 65 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73 69  e OP_LoadAnalysi
27950 73 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70  s: {.  assert( p
27960 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
27970 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  ->p1<db->nDb );.
27980 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 6e    rc = sqlite3An
27990 61 6c 79 73 69 73 4c 6f 61 64 28 64 62 2c 20 70  alysisLoad(db, p
279a0 4f 70 2d 3e 70 31 29 3b 0a 20 20 62 72 65 61 6b  Op->p1);.  break
279b0 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
279c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
279d0 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 29 20 2a 2f  OMIT_ANALYZE) */
279e0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f  ../* Opcode: Dro
279f0 70 54 61 62 6c 65 20 50 31 20 2a 20 2a 20 50 34  pTable P1 * * P4
27a00 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20   *.**.** Remove 
27a10 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e  the internal (in
27a20 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20 73 74  -memory) data st
27a30 72 75 63 74 75 72 65 73 20 74 68 61 74 20 64 65  ructures that de
27a40 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20 74 61  scribe.** the ta
27a50 62 6c 65 20 6e 61 6d 65 64 20 50 34 20 69 6e 20  ble named P4 in 
27a60 64 61 74 61 62 61 73 65 20 50 31 2e 20 20 54 68  database P1.  Th
27a70 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  is is called aft
27a80 65 72 20 61 20 74 61 62 6c 65 0a 2a 2a 20 69 73  er a table.** is
27a90 20 64 72 6f 70 70 65 64 20 69 6e 20 6f 72 64 65   dropped in orde
27aa0 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 69 6e  r to keep the in
27ab0 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74  ternal represent
27ac0 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
27ad0 73 63 68 65 6d 61 20 63 6f 6e 73 69 73 74 65 6e  schema consisten
27ae0 74 20 77 69 74 68 20 77 68 61 74 20 69 73 20 6f  t with what is o
27af0 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20  n disk..*/.case 
27b00 4f 50 5f 44 72 6f 70 54 61 62 6c 65 3a 20 7b 0a  OP_DropTable: {.
27b10 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41    sqlite3UnlinkA
27b20 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  ndDeleteTable(db
27b30 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
27b40 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  p4.z);.  break;.
27b50 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72  }../* Opcode: Dr
27b60 6f 70 49 6e 64 65 78 20 50 31 20 2a 20 2a 20 50  opIndex P1 * * P
27b70 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65  4 *.**.** Remove
27b80 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28 69   the internal (i
27b90 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20 73  n-memory) data s
27ba0 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20 64  tructures that d
27bb0 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20 69  escribe.** the i
27bc0 6e 64 65 78 20 6e 61 6d 65 64 20 50 34 20 69 6e  ndex named P4 in
27bd0 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 20 54   database P1.  T
27be0 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66  his is called af
27bf0 74 65 72 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  ter an index.** 
27c00 69 73 20 64 72 6f 70 70 65 64 20 69 6e 20 6f 72  is dropped in or
27c10 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
27c20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65  internal represe
27c30 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  ntation of the.*
27c40 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73 69 73 74  * schema consist
27c50 65 6e 74 20 77 69 74 68 20 77 68 61 74 20 69 73  ent with what is
27c60 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73   on disk..*/.cas
27c70 65 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 3a 20  e OP_DropIndex: 
27c80 7b 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  {.  sqlite3Unlin
27c90 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28  kAndDeleteIndex(
27ca0 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  db, pOp->p1, pOp
27cb0 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b  ->p4.z);.  break
27cc0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
27cd0 44 72 6f 70 54 72 69 67 67 65 72 20 50 31 20 2a  DropTrigger P1 *
27ce0 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65   * P4 *.**.** Re
27cf0 6d 6f 76 65 20 74 68 65 20 69 6e 74 65 72 6e 61  move the interna
27d00 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61  l (in-memory) da
27d10 74 61 20 73 74 72 75 63 74 75 72 65 73 20 74 68  ta structures th
27d20 61 74 20 64 65 73 63 72 69 62 65 0a 2a 2a 20 74  at describe.** t
27d30 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65 64  he trigger named
27d40 20 50 34 20 69 6e 20 64 61 74 61 62 61 73 65 20   P4 in database 
27d50 50 31 2e 20 20 54 68 69 73 20 69 73 20 63 61 6c  P1.  This is cal
27d60 6c 65 64 20 61 66 74 65 72 20 61 20 74 72 69 67  led after a trig
27d70 67 65 72 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65  ger.** is droppe
27d80 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  d in order to ke
27d90 65 70 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ep the internal 
27da0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
27db0 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20  f the.** schema 
27dc0 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20  consistent with 
27dd0 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e  what is on disk.
27de0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70  .*/.case OP_Drop
27df0 54 72 69 67 67 65 72 3a 20 7b 0a 20 20 73 71 6c  Trigger: {.  sql
27e00 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
27e10 65 74 65 54 72 69 67 67 65 72 28 64 62 2c 20 70  eteTrigger(db, p
27e20 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e  Op->p1, pOp->p4.
27e30 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  z);.  break;.}..
27e40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27e50 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
27e60 48 45 43 4b 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  HECK./* Opcode: 
27e70 49 6e 74 65 67 72 69 74 79 43 6b 20 50 31 20 50  IntegrityCk P1 P
27e80 32 20 50 33 20 2a 20 50 35 0a 2a 2a 0a 2a 2a 20  2 P3 * P5.**.** 
27e90 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f  Do an analysis o
27ea0 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  f the currently 
27eb0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e 20 20  open database.  
27ec0 53 74 6f 72 65 20 69 6e 0a 2a 2a 20 72 65 67 69  Store in.** regi
27ed0 73 74 65 72 20 50 31 20 74 68 65 20 74 65 78 74  ster P1 the text
27ee0 20 6f 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73   of an error mes
27ef0 73 61 67 65 20 64 65 73 63 72 69 62 69 6e 67 20  sage describing 
27f00 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 2a 2a  any problems..**
27f10 20 49 66 20 6e 6f 20 70 72 6f 62 6c 65 6d 73 20   If no problems 
27f20 61 72 65 20 66 6f 75 6e 64 2c 20 73 74 6f 72 65  are found, store
27f30 20 61 20 4e 55 4c 4c 20 69 6e 20 72 65 67 69 73   a NULL in regis
27f40 74 65 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  ter P1..**.** Th
27f50 65 20 72 65 67 69 73 74 65 72 20 50 33 20 63 6f  e register P3 co
27f60 6e 74 61 69 6e 73 20 74 68 65 20 6d 61 78 69 6d  ntains the maxim
27f70 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c  um number of all
27f80 6f 77 65 64 20 65 72 72 6f 72 73 2e 0a 2a 2a 20  owed errors..** 
27f90 41 74 20 6d 6f 73 74 20 72 65 67 28 50 33 29 20  At most reg(P3) 
27fa0 65 72 72 6f 72 73 20 77 69 6c 6c 20 62 65 20 72  errors will be r
27fb0 65 70 6f 72 74 65 64 2e 0a 2a 2a 20 49 6e 20 6f  eported..** In o
27fc0 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
27fd0 61 6e 61 6c 79 73 69 73 20 73 74 6f 70 73 20 61  analysis stops a
27fe0 73 20 73 6f 6f 6e 20 61 73 20 72 65 67 28 50 31  s soon as reg(P1
27ff0 29 20 65 72 72 6f 72 73 20 61 72 65 20 0a 2a 2a  ) errors are .**
28000 20 73 65 65 6e 2e 20 20 52 65 67 28 50 31 29 20   seen.  Reg(P1) 
28010 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 20  is updated with 
28020 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
28030 72 6f 72 73 20 72 65 6d 61 69 6e 69 6e 67 2e 0a  rors remaining..
28040 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70  **.** The root p
28050 61 67 65 20 6e 75 6d 62 65 72 73 20 6f 66 20 61  age numbers of a
28060 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
28070 20 64 61 74 61 62 61 73 65 20 61 72 65 20 69 6e   database are in
28080 74 65 67 65 72 0a 2a 2a 20 73 74 6f 72 65 64 20  teger.** stored 
28090 69 6e 20 72 65 67 28 50 31 29 2c 20 72 65 67 28  in reg(P1), reg(
280a0 50 31 2b 31 29 2c 20 72 65 67 28 50 31 2b 32 29  P1+1), reg(P1+2)
280b0 2c 20 2e 2e 2e 2e 20 20 54 68 65 72 65 20 61 72  , ....  There ar
280c0 65 20 50 32 20 74 61 62 6c 65 73 0a 2a 2a 20 74  e P2 tables.** t
280d0 6f 74 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  otal..**.** If P
280e0 35 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  5 is not zero, t
280f0 68 65 20 63 68 65 63 6b 20 69 73 20 64 6f 6e 65  he check is done
28100 20 6f 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   on the auxiliar
28110 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  y database.** fi
28120 6c 65 2c 20 6e 6f 74 20 74 68 65 20 6d 61 69 6e  le, not the main
28130 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
28140 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
28150 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
28160 6c 65 6d 65 6e 74 20 74 68 65 20 69 6e 74 65 67  lement the integ
28170 72 69 74 79 5f 63 68 65 63 6b 20 70 72 61 67 6d  rity_check pragm
28180 61 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  a..*/.case OP_In
28190 74 65 67 72 69 74 79 43 6b 3a 20 7b 0a 20 20 69  tegrityCk: {.  i
281a0 6e 74 20 6e 52 6f 6f 74 3b 20 20 20 20 20 20 2f  nt nRoot;      /
281b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  * Number of tabl
281c0 65 73 20 74 6f 20 63 68 65 63 6b 2e 20 20 28 4e  es to check.  (N
281d0 75 6d 62 65 72 20 6f 66 20 72 6f 6f 74 20 70 61  umber of root pa
281e0 67 65 73 2e 29 20 2a 2f 0a 20 20 69 6e 74 20 2a  ges.) */.  int *
281f0 61 52 6f 6f 74 3b 20 20 20 20 20 2f 2a 20 41 72  aRoot;     /* Ar
28200 72 61 79 20 6f 66 20 72 6f 6f 74 70 61 67 65 20  ray of rootpage 
28210 6e 75 6d 62 65 72 73 20 66 6f 72 20 74 61 62 6c  numbers for tabl
28220 65 73 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64  es to be checked
28230 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
28240 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
28250 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  unter */.  int n
28260 45 72 72 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  Err;       /* Nu
28270 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 72  mber of errors r
28280 65 70 6f 72 74 65 64 20 2a 2f 0a 20 20 63 68 61  eported */.  cha
28290 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 2f 2a 20  r *z;        /* 
282a0 54 65 78 74 20 6f 66 20 74 68 65 20 65 72 72 6f  Text of the erro
282b0 72 20 72 65 70 6f 72 74 20 2a 2f 0a 20 20 4d 65  r report */.  Me
282c0 6d 20 2a 70 6e 45 72 72 3b 20 20 20 20 20 2f 2a  m *pnErr;     /*
282d0 20 52 65 67 69 73 74 65 72 20 6b 65 65 70 69 6e   Register keepin
282e0 67 20 74 72 61 63 6b 20 6f 66 20 65 72 72 6f 72  g track of error
282f0 73 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 20  s remaining */. 
28300 20 0a 20 20 6e 52 6f 6f 74 20 3d 20 70 4f 70 2d   .  nRoot = pOp-
28310 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  >p2;.  assert( n
28320 52 6f 6f 74 3e 30 20 29 3b 0a 20 20 61 52 6f 6f  Root>0 );.  aRoo
28330 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
28340 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
28350 66 28 69 6e 74 29 2a 28 6e 52 6f 6f 74 2b 31 29  f(int)*(nRoot+1)
28360 20 29 3b 0a 20 20 69 66 28 20 61 52 6f 6f 74 3d   );.  if( aRoot=
28370 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
28380 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
28390 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33  >p3>0 && pOp->p3
283a0 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70  <=p->nMem );.  p
283b0 6e 45 72 72 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  nErr = &aMem[pOp
283c0 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p3];.  assert(
283d0 20 28 70 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26   (pnErr->flags &
283e0 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a   MEM_Int)!=0 );.
283f0 20 20 61 73 73 65 72 74 28 20 28 70 6e 45 72 72    assert( (pnErr
28400 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53  ->flags & (MEM_S
28410 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30  tr|MEM_Blob))==0
28420 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   );.  pIn1 = &aM
28430 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 66  em[pOp->p1];.  f
28440 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 52 6f 6f 74 3b  or(j=0; j<nRoot;
28450 20 6a 2b 2b 29 7b 0a 20 20 20 20 61 52 6f 6f 74   j++){.    aRoot
28460 5b 6a 5d 20 3d 20 28 69 6e 74 29 73 71 6c 69 74  [j] = (int)sqlit
28470 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 26  e3VdbeIntValue(&
28480 70 49 6e 31 5b 6a 5d 29 3b 0a 20 20 7d 0a 20 20  pIn1[j]);.  }.  
28490 61 52 6f 6f 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20  aRoot[j] = 0;.  
284a0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c  assert( pOp->p5<
284b0 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
284c0 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61  ert( (p->btreeMa
284d0 73 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29  sk & (((yDbMask)
284e0 31 29 3c 3c 70 4f 70 2d 3e 70 35 29 29 21 3d 30  1)<<pOp->p5))!=0
284f0 20 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65   );.  z = sqlite
28500 33 42 74 72 65 65 49 6e 74 65 67 72 69 74 79 43  3BtreeIntegrityC
28510 68 65 63 6b 28 64 62 2d 3e 61 44 62 5b 70 4f 70  heck(db->aDb[pOp
28520 2d 3e 70 35 5d 2e 70 42 74 2c 20 61 52 6f 6f 74  ->p5].pBt, aRoot
28530 2c 20 6e 52 6f 6f 74 2c 0a 20 20 20 20 20 20 20  , nRoot,.       
28540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28550 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70            (int)p
28560 6e 45 72 72 2d 3e 75 2e 69 2c 20 26 6e 45 72 72  nErr->u.i, &nErr
28570 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
28580 65 65 28 64 62 2c 20 61 52 6f 6f 74 29 3b 0a 20  ee(db, aRoot);. 
28590 20 70 6e 45 72 72 2d 3e 75 2e 69 20 2d 3d 20 6e   pnErr->u.i -= n
285a0 45 72 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Err;.  sqlite3Vd
285b0 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 49 6e  beMemSetNull(pIn
285c0 31 29 3b 0a 20 20 69 66 28 20 6e 45 72 72 3d 3d  1);.  if( nErr==
285d0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
285e0 20 7a 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65   z==0 );.  }else
285f0 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
28600 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
28610 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
28620 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
28630 70 49 6e 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c  pIn1, z, -1, SQL
28640 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74 65  ITE_UTF8, sqlite
28650 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 20 20 55  3_free);.  }.  U
28660 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49  PDATE_MAX_BLOBSI
28670 5a 45 28 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69  ZE(pIn1);.  sqli
28680 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
28690 6f 64 69 6e 67 28 70 49 6e 31 2c 20 65 6e 63 6f  oding(pIn1, enco
286a0 64 69 6e 67 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  ding);.  break;.
286b0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
286c0 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
286d0 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 20 4f  Y_CHECK */../* O
286e0 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 41 64 64  pcode: RowSetAdd
286f0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
28700 2a 2a 20 49 6e 73 65 72 74 20 74 68 65 20 69 6e  ** Insert the in
28710 74 65 67 65 72 20 76 61 6c 75 65 20 68 65 6c 64  teger value held
28720 20 62 79 20 72 65 67 69 73 74 65 72 20 50 32 20   by register P2 
28730 69 6e 74 6f 20 61 20 62 6f 6f 6c 65 61 6e 20 69  into a boolean i
28740 6e 64 65 78 0a 2a 2a 20 68 65 6c 64 20 69 6e 20  ndex.** held in 
28750 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 0a  register P1..**.
28760 2a 2a 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  ** An assertion 
28770 66 61 69 6c 73 20 69 66 20 50 32 20 69 73 20 6e  fails if P2 is n
28780 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a  ot an integer..*
28790 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65 74  /.case OP_RowSet
287a0 41 64 64 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20  Add: {       /* 
287b0 69 6e 31 2c 20 69 6e 32 20 2a 2f 0a 20 20 70 49  in1, in2 */.  pI
287c0 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
287d0 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61  p1];.  pIn2 = &a
287e0 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
287f0 61 73 73 65 72 74 28 20 28 70 49 6e 32 2d 3e 66  assert( (pIn2->f
28800 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21  lags & MEM_Int)!
28810 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 49 6e  =0 );.  if( (pIn
28820 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  1->flags & MEM_R
28830 6f 77 53 65 74 29 3d 3d 30 20 29 7b 0a 20 20 20  owSet)==0 ){.   
28840 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
28850 65 74 52 6f 77 53 65 74 28 70 49 6e 31 29 3b 0a  etRowSet(pIn1);.
28860 20 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66      if( (pIn1->f
28870 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
28880 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  t)==0 ) goto no_
28890 6d 65 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  mem;.  }.  sqlit
288a0 65 33 52 6f 77 53 65 74 49 6e 73 65 72 74 28 70  e3RowSetInsert(p
288b0 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20  In1->u.pRowSet, 
288c0 70 49 6e 32 2d 3e 75 2e 69 29 3b 0a 20 20 62 72  pIn2->u.i);.  br
288d0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
288e0 65 3a 20 52 6f 77 53 65 74 52 65 61 64 20 50 31  e: RowSetRead P1
288f0 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
28900 20 45 78 74 72 61 63 74 20 74 68 65 20 73 6d 61   Extract the sma
28910 6c 6c 65 73 74 20 76 61 6c 75 65 20 66 72 6f 6d  llest value from
28920 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20 50   boolean index P
28930 31 20 61 6e 64 20 70 75 74 20 74 68 61 74 20 76  1 and put that v
28940 61 6c 75 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67  alue into.** reg
28950 69 73 74 65 72 20 50 33 2e 20 20 4f 72 2c 20 69  ister P3.  Or, i
28960 66 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20  f boolean index 
28970 50 31 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  P1 is initially 
28980 65 6d 70 74 79 2c 20 6c 65 61 76 65 20 50 33 0a  empty, leave P3.
28990 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ** unchanged and
289a0 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63   jump to instruc
289b0 74 69 6f 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  tion P2..*/.case
289c0 20 4f 50 5f 52 6f 77 53 65 74 52 65 61 64 3a 20   OP_RowSetRead: 
289d0 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c  {       /* jump,
289e0 20 69 6e 31 2c 20 6f 75 74 33 20 2a 2f 0a 20 20   in1, out3 */.  
289f0 69 36 34 20 76 61 6c 3b 0a 20 20 43 48 45 43 4b  i64 val;.  CHECK
28a00 5f 46 4f 52 5f 49 4e 54 45 52 52 55 50 54 3b 0a  _FOR_INTERRUPT;.
28a10 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
28a20 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 28  Op->p1];.  if( (
28a30 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
28a40 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 0a 20 20  M_RowSet)==0 .  
28a50 20 7c 7c 20 73 71 6c 69 74 65 33 52 6f 77 53 65   || sqlite3RowSe
28a60 74 4e 65 78 74 28 70 49 6e 31 2d 3e 75 2e 70 52  tNext(pIn1->u.pR
28a70 6f 77 53 65 74 2c 20 26 76 61 6c 29 3d 3d 30 0a  owSet, &val)==0.
28a80 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20    ){.    /* The 
28a90 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20 69 73  boolean index is
28aa0 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 73 71   empty */.    sq
28ab0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
28ac0 75 6c 6c 28 70 49 6e 31 29 3b 0a 20 20 20 20 70  ull(pIn1);.    p
28ad0 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
28ae0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
28af0 20 41 20 76 61 6c 75 65 20 77 61 73 20 70 75 6c   A value was pul
28b00 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  led from the ind
28b10 65 78 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ex */.    sqlite
28b20 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34  3VdbeMemSetInt64
28b30 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2c  (&aMem[pOp->p3],
28b40 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20 62 72 65   val);.  }.  bre
28b50 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
28b60 3a 20 52 6f 77 53 65 74 54 65 73 74 20 50 31 20  : RowSetTest P1 
28b70 50 32 20 50 33 20 50 34 0a 2a 2a 0a 2a 2a 20 52  P2 P3 P4.**.** R
28b80 65 67 69 73 74 65 72 20 50 33 20 69 73 20 61 73  egister P3 is as
28b90 73 75 6d 65 64 20 74 6f 20 68 6f 6c 64 20 61 20  sumed to hold a 
28ba0 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76  64-bit integer v
28bb0 61 6c 75 65 2e 20 49 66 20 72 65 67 69 73 74 65  alue. If registe
28bc0 72 20 50 31 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  r P1.** contains
28bd0 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74   a RowSet object
28be0 20 61 6e 64 20 74 68 61 74 20 52 6f 77 53 65 74   and that RowSet
28bf0 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
28c00 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 68 65  .** the value he
28c10 6c 64 20 69 6e 20 50 33 2c 20 6a 75 6d 70 20 74  ld in P3, jump t
28c20 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 4f  o register P2. O
28c30 74 68 65 72 77 69 73 65 2c 20 69 6e 73 65 72 74  therwise, insert
28c40 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20   the.** integer 
28c50 69 6e 20 50 33 20 69 6e 74 6f 20 74 68 65 20 52  in P3 into the R
28c60 6f 77 53 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  owSet and contin
28c70 75 65 20 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  ue on to the.** 
28c80 6e 65 78 74 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  next opcode..**.
28c90 2a 2a 20 54 68 65 20 52 6f 77 53 65 74 20 6f 62  ** The RowSet ob
28ca0 6a 65 63 74 20 69 73 20 6f 70 74 69 6d 69 7a 65  ject is optimize
28cb0 64 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  d for the case w
28cc0 68 65 72 65 20 73 75 63 63 65 73 73 69 76 65 20  here successive 
28cd0 73 65 74 73 0a 2a 2a 20 6f 66 20 69 6e 74 65 67  sets.** of integ
28ce0 65 72 73 2c 20 77 68 65 72 65 20 65 61 63 68 20  ers, where each 
28cf0 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  set contains no 
28d00 64 75 70 6c 69 63 61 74 65 73 2e 20 45 61 63 68  duplicates. Each
28d10 20 73 65 74 0a 2a 2a 20 6f 66 20 76 61 6c 75 65   set.** of value
28d20 73 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20  s is identified 
28d30 62 79 20 61 20 75 6e 69 71 75 65 20 50 34 20 76  by a unique P4 v
28d40 61 6c 75 65 2e 20 54 68 65 20 66 69 72 73 74 20  alue. The first 
28d50 73 65 74 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65  set.** must have
28d60 20 50 34 3d 3d 30 2c 20 74 68 65 20 66 69 6e 61   P4==0, the fina
28d70 6c 20 73 65 74 20 50 34 3d 2d 31 2e 20 20 50 34  l set P4=-1.  P4
28d80 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
28d90 2d 31 20 6f 72 0a 2a 2a 20 6e 6f 6e 2d 6e 65 67  -1 or.** non-neg
28da0 61 74 69 76 65 2e 20 20 46 6f 72 20 6e 6f 6e 2d  ative.  For non-
28db0 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20  negative values 
28dc0 6f 66 20 50 34 20 6f 6e 6c 79 20 74 68 65 20 6c  of P4 only the l
28dd0 6f 77 65 72 20 34 0a 2a 2a 20 62 69 74 73 20 61  ower 4.** bits a
28de0 72 65 20 73 69 67 6e 69 66 69 63 61 6e 74 2e 0a  re significant..
28df0 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77  **.** This allow
28e00 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 3a  s optimizations:
28e10 20 28 61 29 20 77 68 65 6e 20 50 34 3d 3d 30 20   (a) when P4==0 
28e20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
28e30 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 65 20   to test.** the 
28e40 72 6f 77 73 65 74 20 6f 62 6a 65 63 74 20 66 6f  rowset object fo
28e50 72 20 50 33 2c 20 61 73 20 69 74 20 69 73 20 67  r P3, as it is g
28e60 75 61 72 61 6e 74 65 65 64 20 6e 6f 74 20 74 6f  uaranteed not to
28e70 20 63 6f 6e 74 61 69 6e 20 69 74 2c 0a 2a 2a 20   contain it,.** 
28e80 28 62 29 20 77 68 65 6e 20 50 34 3d 3d 2d 31 20  (b) when P4==-1 
28e90 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
28ea0 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 76   to insert the v
28eb0 61 6c 75 65 2c 20 61 73 20 69 74 20 77 69 6c 6c  alue, as it will
28ec0 0a 2a 2a 20 6e 65 76 65 72 20 62 65 20 74 65 73  .** never be tes
28ed0 74 65 64 20 66 6f 72 2c 20 61 6e 64 20 28 63 29  ted for, and (c)
28ee0 20 77 68 65 6e 20 61 20 76 61 6c 75 65 20 74 68   when a value th
28ef0 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 73 65  at is part of se
28f00 74 20 58 20 69 73 0a 2a 2a 20 69 6e 73 65 72 74  t X is.** insert
28f10 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ed, there is no 
28f20 6e 65 65 64 20 74 6f 20 73 65 61 72 63 68 20 74  need to search t
28f30 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 61 6d  o see if the sam
28f40 65 20 76 61 6c 75 65 20 77 61 73 0a 2a 2a 20 70  e value was.** p
28f50 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 65 72 74  reviously insert
28f60 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 73 65  ed as part of se
28f70 74 20 58 20 28 6f 6e 6c 79 20 69 66 20 69 74 20  t X (only if it 
28f80 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  was previously.*
28f90 2a 20 69 6e 73 65 72 74 65 64 20 61 73 20 70 61  * inserted as pa
28fa0 72 74 20 6f 66 20 73 6f 6d 65 20 6f 74 68 65 72  rt of some other
28fb0 20 73 65 74 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f   set)..*/.case O
28fc0 50 5f 52 6f 77 53 65 74 54 65 73 74 3a 20 7b 20  P_RowSetTest: { 
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fe0 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31      /* jump, in1
28ff0 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 69  , in3 */.  int i
29000 53 65 74 3b 0a 20 20 69 6e 74 20 65 78 69 73 74  Set;.  int exist
29010 73 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d  s;..  pIn1 = &aM
29020 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70  em[pOp->p1];.  p
29030 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In3 = &aMem[pOp-
29040 3e 70 33 5d 3b 0a 20 20 69 53 65 74 20 3d 20 70  >p3];.  iSet = p
29050 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 61 73 73 65  Op->p4.i;.  asse
29060 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 26  rt( pIn3->flags&
29070 4d 45 4d 5f 49 6e 74 20 29 3b 0a 0a 20 20 2f 2a  MEM_Int );..  /*
29080 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   If there is any
29090 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
290a0 20 61 20 72 6f 77 73 65 74 20 6f 62 6a 65 63 74   a rowset object
290b0 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
290c0 50 31 2c 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20  P1,.  ** delete 
290d0 69 74 20 6e 6f 77 20 61 6e 64 20 69 6e 69 74 69  it now and initi
290e0 61 6c 69 7a 65 20 50 31 20 77 69 74 68 20 61 6e  alize P1 with an
290f0 20 65 6d 70 74 79 20 72 6f 77 73 65 74 0a 20 20   empty rowset.  
29100 2a 2f 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  */.  if( (pIn1->
29110 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
29120 65 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  et)==0 ){.    sq
29130 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 52  lite3VdbeMemSetR
29140 6f 77 53 65 74 28 70 49 6e 31 29 3b 0a 20 20 20  owSet(pIn1);.   
29150 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
29160 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d  s & MEM_RowSet)=
29170 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
29180 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
29190 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
291a0 5f 49 4e 54 33 32 20 29 3b 0a 20 20 61 73 73 65  _INT32 );.  asse
291b0 72 74 28 20 69 53 65 74 3d 3d 2d 31 20 7c 7c 20  rt( iSet==-1 || 
291c0 69 53 65 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28  iSet>=0 );.  if(
291d0 20 69 53 65 74 20 29 7b 0a 20 20 20 20 65 78 69   iSet ){.    exi
291e0 73 74 73 20 3d 20 73 71 6c 69 74 65 33 52 6f 77  sts = sqlite3Row
291f0 53 65 74 54 65 73 74 28 70 49 6e 31 2d 3e 75 2e  SetTest(pIn1->u.
29200 70 52 6f 77 53 65 74 2c 20 0a 20 20 20 20 20 20  pRowSet, .      
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29220 20 20 20 20 20 20 20 20 20 28 75 38 29 28 69 53           (u8)(iS
29230 65 74 3e 3d 30 20 3f 20 69 53 65 74 20 26 20 30  et>=0 ? iSet & 0
29240 78 66 20 3a 20 30 78 66 66 29 2c 0a 20 20 20 20  xf : 0xff),.    
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 20 20 20 70 49 6e 33 2d             pIn3-
29270 3e 75 2e 69 29 3b 0a 20 20 20 20 69 66 28 20 65  >u.i);.    if( e
29280 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 70  xists ){.      p
29290 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
292a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
292b0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 53    }.  }.  if( iS
292c0 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  et>=0 ){.    sql
292d0 69 74 65 33 52 6f 77 53 65 74 49 6e 73 65 72 74  ite3RowSetInsert
292e0 28 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74  (pIn1->u.pRowSet
292f0 2c 20 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20  , pIn3->u.i);.  
29300 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23  }.  break;.}...#
29310 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
29320 49 54 5f 54 52 49 47 47 45 52 0a 0a 2f 2a 20 4f  IT_TRIGGER../* O
29330 70 63 6f 64 65 3a 20 50 72 6f 67 72 61 6d 20 50  pcode: Program P
29340 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a  1 P2 P3 P4 *.**.
29350 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 74  ** Execute the t
29360 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 70  rigger program p
29370 61 73 73 65 64 20 61 73 20 50 34 20 28 74 79 70  assed as P4 (typ
29380 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 29  e P4_SUBPROGRAM)
29390 2e 20 0a 2a 2a 0a 2a 2a 20 50 31 20 63 6f 6e 74  . .**.** P1 cont
293a0 61 69 6e 73 20 74 68 65 20 61 64 64 72 65 73 73  ains the address
293b0 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   of the memory c
293c0 65 6c 6c 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ell that contain
293d0 73 20 74 68 65 20 66 69 72 73 74 20 6d 65 6d 6f  s the first memo
293e0 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 61  ry .** cell in a
293f0 6e 20 61 72 72 61 79 20 6f 66 20 76 61 6c 75 65  n array of value
29400 73 20 75 73 65 64 20 61 73 20 61 72 67 75 6d 65  s used as argume
29410 6e 74 73 20 74 6f 20 74 68 65 20 73 75 62 2d 70  nts to the sub-p
29420 72 6f 67 72 61 6d 2e 20 50 32 20 0a 2a 2a 20 63  rogram. P2 .** c
29430 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64 72  ontains the addr
29440 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  ess to jump to i
29450 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61  f the sub-progra
29460 6d 20 74 68 72 6f 77 73 20 61 6e 20 49 47 4e 4f  m throws an IGNO
29470 52 45 20 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e  RE .** exception
29480 20 75 73 69 6e 67 20 74 68 65 20 52 41 49 53 45   using the RAISE
29490 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 52 65 67  () function. Reg
294a0 69 73 74 65 72 20 50 33 20 63 6f 6e 74 61 69 6e  ister P3 contain
294b0 73 20 74 68 65 20 61 64 64 72 65 73 73 20 0a 2a  s the address .*
294c0 2a 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 63 65  * of a memory ce
294d0 6c 6c 20 69 6e 20 74 68 69 73 20 28 74 68 65 20  ll in this (the 
294e0 70 61 72 65 6e 74 29 20 56 4d 20 74 68 61 74 20  parent) VM that 
294f0 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
29500 61 74 65 20 74 68 65 20 0a 2a 2a 20 6d 65 6d 6f  ate the .** memo
29510 72 79 20 72 65 71 75 69 72 65 64 20 62 79 20 74  ry required by t
29520 68 65 20 73 75 62 2d 76 64 62 65 20 61 74 20 72  he sub-vdbe at r
29530 75 6e 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 50 34  untime..**.** P4
29540 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
29550 20 74 68 65 20 56 4d 20 63 6f 6e 74 61 69 6e 69   the VM containi
29560 6e 67 20 74 68 65 20 74 72 69 67 67 65 72 20 70  ng the trigger p
29570 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 63 61 73 65 20  rogram..*/.case 
29580 4f 50 5f 50 72 6f 67 72 61 6d 3a 20 7b 20 20 20  OP_Program: {   
29590 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
295a0 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20    int nMem;     
295b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
295c0 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65  ber of memory re
295d0 67 69 73 74 65 72 73 20 66 6f 72 20 73 75 62 2d  gisters for sub-
295e0 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 69 6e 74  program */.  int
295f0 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
29600 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
29610 20 72 75 6e 74 69 6d 65 20 73 70 61 63 65 20 72   runtime space r
29620 65 71 75 69 72 65 64 20 66 6f 72 20 73 75 62 2d  equired for sub-
29630 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 4d 65 6d  program */.  Mem
29640 20 2a 70 52 74 3b 20 20 20 20 20 20 20 20 20 20   *pRt;          
29650 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
29660 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 72 75 6e   to allocate run
29670 74 69 6d 65 20 73 70 61 63 65 20 2a 2f 0a 20 20  time space */.  
29680 4d 65 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20  Mem *pMem;      
29690 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
296a0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
296b0 67 68 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  gh memory cells 
296c0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 20  */.  Mem *pEnd; 
296d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
296e0 4c 61 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  Last memory cell
296f0 20 69 6e 20 6e 65 77 20 61 72 72 61 79 20 2a 2f   in new array */
29700 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46  .  VdbeFrame *pF
29710 72 61 6d 65 3b 20 20 20 20 20 20 2f 2a 20 4e 65  rame;      /* Ne
29720 77 20 76 64 62 65 20 66 72 61 6d 65 20 74 6f 20  w vdbe frame to 
29730 65 78 65 63 75 74 65 20 69 6e 20 2a 2f 0a 20 20  execute in */.  
29740 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 50 72 6f  SubProgram *pPro
29750 67 72 61 6d 3b 20 20 20 2f 2a 20 53 75 62 2d 70  gram;   /* Sub-p
29760 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74  rogram to execut
29770 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 74 3b 20  e */.  void *t; 
29780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29790 2a 20 54 6f 6b 65 6e 20 69 64 65 6e 74 69 66 79  * Token identify
297a0 69 6e 67 20 74 72 69 67 67 65 72 20 2a 2f 0a 0a  ing trigger */..
297b0 20 20 70 50 72 6f 67 72 61 6d 20 3d 20 70 4f 70    pProgram = pOp
297c0 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20  ->p4.pProgram;. 
297d0 20 70 52 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70   pRt = &aMem[pOp
297e0 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p3];.  assert(
297f0 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3e 30   pProgram->nOp>0
29800 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74   );.  .  /* If t
29810 68 65 20 70 35 20 66 6c 61 67 20 69 73 20 63 6c  he p5 flag is cl
29820 65 61 72 2c 20 74 68 65 6e 20 72 65 63 75 72 73  ear, then recurs
29830 69 76 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ive invocation o
29840 66 20 74 72 69 67 67 65 72 73 20 69 73 20 0a 20  f triggers is . 
29850 20 2a 2a 20 64 69 73 61 62 6c 65 64 20 66 6f 72   ** disabled for
29860 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
29870 74 69 62 69 6c 69 74 79 20 28 70 35 20 69 73 20  tibility (p5 is 
29880 73 65 74 20 69 66 20 74 68 69 73 20 73 75 62 2d  set if this sub-
29890 70 72 6f 67 72 61 6d 0a 20 20 2a 2a 20 69 73 20  program.  ** is 
298a0 72 65 61 6c 6c 79 20 61 20 74 72 69 67 67 65 72  really a trigger
298b0 2c 20 6e 6f 74 20 61 20 66 6f 72 65 69 67 6e 20  , not a foreign 
298c0 6b 65 79 20 61 63 74 69 6f 6e 2c 20 61 6e 64 20  key action, and 
298d0 74 68 65 20 66 6c 61 67 20 73 65 74 0a 20 20 2a  the flag set.  *
298e0 2a 20 61 6e 64 20 63 6c 65 61 72 65 64 20 62 79  * and cleared by
298f0 20 74 68 65 20 22 50 52 41 47 4d 41 20 72 65 63   the "PRAGMA rec
29900 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73 22  ursive_triggers"
29910 20 63 6f 6d 6d 61 6e 64 20 69 73 20 63 6c 65 61   command is clea
29920 72 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49  r)..  ** .  ** I
29930 74 20 69 73 20 72 65 63 75 72 73 69 76 65 20 69  t is recursive i
29940 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 72 69  nvocation of tri
29950 67 67 65 72 73 2c 20 61 74 20 74 68 65 20 53 51  ggers, at the SQ
29960 4c 20 6c 65 76 65 6c 2c 20 74 68 61 74 20 69 73  L level, that is
29970 20 0a 20 20 2a 2a 20 64 69 73 61 62 6c 65 64 2e   .  ** disabled.
29980 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 61   In some cases a
29990 20 73 69 6e 67 6c 65 20 74 72 69 67 67 65 72 20   single trigger 
299a0 6d 61 79 20 67 65 6e 65 72 61 74 65 20 6d 6f 72  may generate mor
299b0 65 20 74 68 61 6e 20 6f 6e 65 20 0a 20 20 2a 2a  e than one .  **
299c0 20 53 75 62 50 72 6f 67 72 61 6d 20 28 69 66 20   SubProgram (if 
299d0 74 68 65 20 74 72 69 67 67 65 72 20 6d 61 79 20  the trigger may 
299e0 62 65 20 65 78 65 63 75 74 65 64 20 77 69 74 68  be executed with
299f0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
29a00 69 66 66 65 72 65 6e 74 20 0a 20 20 2a 2a 20 4f  ifferent .  ** O
29a10 4e 20 43 4f 4e 46 4c 49 43 54 20 61 6c 67 6f 72  N CONFLICT algor
29a20 69 74 68 6d 29 2e 20 53 75 62 50 72 6f 67 72 61  ithm). SubProgra
29a30 6d 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73  m structures ass
29a40 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 0a 20  ociated with a. 
29a50 20 2a 2a 20 73 69 6e 67 6c 65 20 74 72 69 67 67   ** single trigg
29a60 65 72 20 61 6c 6c 20 68 61 76 65 20 74 68 65 20  er all have the 
29a70 73 61 6d 65 20 76 61 6c 75 65 20 66 6f 72 20 74  same value for t
29a80 68 65 20 53 75 62 50 72 6f 67 72 61 6d 2e 74 6f  he SubProgram.to
29a90 6b 65 6e 20 0a 20 20 2a 2a 20 76 61 72 69 61 62  ken .  ** variab
29aa0 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  le.  */.  if( pO
29ab0 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 74 20 3d  p->p5 ){.    t =
29ac0 20 70 50 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e   pProgram->token
29ad0 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65  ;.    for(pFrame
29ae0 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61  =p->pFrame; pFra
29af0 6d 65 20 26 26 20 70 46 72 61 6d 65 2d 3e 74 6f  me && pFrame->to
29b00 6b 65 6e 21 3d 74 3b 20 70 46 72 61 6d 65 3d 70  ken!=t; pFrame=p
29b10 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
29b20 0a 20 20 20 20 69 66 28 20 70 46 72 61 6d 65 20  .    if( pFrame 
29b30 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20  ) break;.  }..  
29b40 69 66 28 20 70 2d 3e 6e 46 72 61 6d 65 3e 3d 64  if( p->nFrame>=d
29b50 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
29b60 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44  _LIMIT_TRIGGER_D
29b70 45 50 54 48 5d 20 29 7b 0a 20 20 20 20 72 63 20  EPTH] ){.    rc 
29b80 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
29b90 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
29ba0 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
29bb0 2c 20 64 62 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  , db, "too many 
29bc0 6c 65 76 65 6c 73 20 6f 66 20 74 72 69 67 67 65  levels of trigge
29bd0 72 20 72 65 63 75 72 73 69 6f 6e 22 29 3b 0a 20  r recursion");. 
29be0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
29bf0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 70 52 74   /* Register pRt
29c00 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
29c10 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71  e the memory req
29c20 75 69 72 65 64 20 74 6f 20 73 61 76 65 20 74 68  uired to save th
29c30 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20  e state.  ** of 
29c40 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 67  the current prog
29c50 72 61 6d 2c 20 61 6e 64 20 74 68 65 20 6d 65 6d  ram, and the mem
29c60 6f 72 79 20 72 65 71 75 69 72 65 64 20 61 74 20  ory required at 
29c70 72 75 6e 74 69 6d 65 20 74 6f 20 65 78 65 63 75  runtime to execu
29c80 74 65 0a 20 20 2a 2a 20 74 68 65 20 74 72 69 67  te.  ** the trig
29c90 67 65 72 20 70 72 6f 67 72 61 6d 2e 20 49 66 20  ger program. If 
29ca0 74 68 69 73 20 74 72 69 67 67 65 72 20 68 61 73  this trigger has
29cb0 20 62 65 65 6e 20 66 69 72 65 64 20 62 65 66 6f   been fired befo
29cc0 72 65 2c 20 74 68 65 6e 20 70 52 74 20 0a 20 20  re, then pRt .  
29cd0 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 61 6c  ** is already al
29ce0 6c 6f 63 61 74 65 64 2e 20 4f 74 68 65 72 77 69  located. Otherwi
29cf0 73 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 69  se, it must be i
29d00 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a  nitialized.  */.
29d10 20 20 69 66 28 20 28 70 52 74 2d 3e 66 6c 61 67    if( (pRt->flag
29d20 73 26 4d 45 4d 5f 46 72 61 6d 65 29 3d 3d 30 20  s&MEM_Frame)==0 
29d30 29 7b 0a 20 20 20 20 2f 2a 20 53 75 62 50 72 6f  ){.    /* SubPro
29d40 67 72 61 6d 2e 6e 4d 65 6d 20 69 73 20 73 65 74  gram.nMem is set
29d50 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
29d60 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 75  f memory cells u
29d70 73 65 64 20 62 79 20 74 68 65 20 0a 20 20 20 20  sed by the .    
29d80 2a 2a 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65  ** program store
29d90 64 20 69 6e 20 53 75 62 50 72 6f 67 72 61 6d 2e  d in SubProgram.
29da0 61 4f 70 2e 20 41 73 20 77 65 6c 6c 20 61 73 20  aOp. As well as 
29db0 74 68 65 73 65 2c 20 6f 6e 65 20 6d 65 6d 6f 72  these, one memor
29dc0 79 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 69 73  y.    ** cell is
29dd0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61   required for ea
29de0 63 68 20 63 75 72 73 6f 72 20 75 73 65 64 20 62  ch cursor used b
29df0 79 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 53  y the program. S
29e00 65 74 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20  et local.    ** 
29e10 76 61 72 69 61 62 6c 65 20 6e 4d 65 6d 20 28 61  variable nMem (a
29e20 6e 64 20 6c 61 74 65 72 2c 20 56 64 62 65 46 72  nd later, VdbeFr
29e30 61 6d 65 2e 6e 43 68 69 6c 64 4d 65 6d 29 20 74  ame.nChildMem) t
29e40 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 0a 20 20  o this value..  
29e50 20 20 2a 2f 0a 20 20 20 20 6e 4d 65 6d 20 3d 20    */.    nMem = 
29e60 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20 2b  pProgram->nMem +
29e70 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b   pProgram->nCsr;
29e80 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  .    nByte = ROU
29e90 4e 44 38 28 73 69 7a 65 6f 66 28 56 64 62 65 46  ND8(sizeof(VdbeF
29ea0 72 61 6d 65 29 29 0a 20 20 20 20 20 20 20 20 20  rame)).         
29eb0 20 20 20 20 20 2b 20 6e 4d 65 6d 20 2a 20 73 69       + nMem * si
29ec0 7a 65 6f 66 28 4d 65 6d 29 0a 20 20 20 20 20 20  zeof(Mem).      
29ed0 20 20 20 20 20 20 20 20 2b 20 70 50 72 6f 67 72          + pProgr
29ee0 61 6d 2d 3e 6e 43 73 72 20 2a 20 73 69 7a 65 6f  am->nCsr * sizeo
29ef0 66 28 56 64 62 65 43 75 72 73 6f 72 20 2a 29 0a  f(VdbeCursor *).
29f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
29f10 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 6e 63 65 20  pProgram->nOnce 
29f20 2a 20 73 69 7a 65 6f 66 28 75 38 29 3b 0a 20 20  * sizeof(u8);.  
29f30 20 20 70 46 72 61 6d 65 20 3d 20 73 71 6c 69 74    pFrame = sqlit
29f40 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
29f50 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  b, nByte);.    i
29f60 66 28 20 21 70 46 72 61 6d 65 20 29 7b 0a 20 20  f( !pFrame ){.  
29f70 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
29f80 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
29f90 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
29fa0 28 70 52 74 29 3b 0a 20 20 20 20 70 52 74 2d 3e  (pRt);.    pRt->
29fb0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 46 72 61 6d  flags = MEM_Fram
29fc0 65 3b 0a 20 20 20 20 70 52 74 2d 3e 75 2e 70 46  e;.    pRt->u.pF
29fd0 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a 0a  rame = pFrame;..
29fe0 20 20 20 20 70 46 72 61 6d 65 2d 3e 76 20 3d 20      pFrame->v = 
29ff0 70 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e  p;.    pFrame->n
2a000 43 68 69 6c 64 4d 65 6d 20 3d 20 6e 4d 65 6d 3b  ChildMem = nMem;
2a010 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68  .    pFrame->nCh
2a020 69 6c 64 43 73 72 20 3d 20 70 50 72 6f 67 72 61  ildCsr = pProgra
2a030 6d 2d 3e 6e 43 73 72 3b 0a 20 20 20 20 70 46 72  m->nCsr;.    pFr
2a040 61 6d 65 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20  ame->pc = pc;.  
2a050 20 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 20 3d    pFrame->aMem =
2a060 20 70 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 70 46   p->aMem;.    pF
2a070 72 61 6d 65 2d 3e 6e 4d 65 6d 20 3d 20 70 2d 3e  rame->nMem = p->
2a080 6e 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d 65  nMem;.    pFrame
2a090 2d 3e 61 70 43 73 72 20 3d 20 70 2d 3e 61 70 43  ->apCsr = p->apC
2a0a0 73 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e  sr;.    pFrame->
2a0b0 6e 43 75 72 73 6f 72 20 3d 20 70 2d 3e 6e 43 75  nCursor = p->nCu
2a0c0 72 73 6f 72 3b 0a 20 20 20 20 70 46 72 61 6d 65  rsor;.    pFrame
2a0d0 2d 3e 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a  ->aOp = p->aOp;.
2a0e0 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 20      pFrame->nOp 
2a0f0 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 70 46  = p->nOp;.    pF
2a100 72 61 6d 65 2d 3e 74 6f 6b 65 6e 20 3d 20 70 50  rame->token = pP
2a110 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 20  rogram->token;. 
2a120 20 20 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65     pFrame->aOnce
2a130 46 6c 61 67 20 3d 20 70 2d 3e 61 4f 6e 63 65 46  Flag = p->aOnceF
2a140 6c 61 67 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d  lag;.    pFrame-
2a150 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 2d 3e  >nOnceFlag = p->
2a160 6e 4f 6e 63 65 46 6c 61 67 3b 0a 0a 20 20 20 20  nOnceFlag;..    
2a170 70 45 6e 64 20 3d 20 26 56 64 62 65 46 72 61 6d  pEnd = &VdbeFram
2a180 65 4d 65 6d 28 70 46 72 61 6d 65 29 5b 70 46 72  eMem(pFrame)[pFr
2a190 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b  ame->nChildMem];
2a1a0 0a 20 20 20 20 66 6f 72 28 70 4d 65 6d 3d 56 64  .    for(pMem=Vd
2a1b0 62 65 46 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d  beFrameMem(pFram
2a1c0 65 29 3b 20 70 4d 65 6d 21 3d 70 45 6e 64 3b 20  e); pMem!=pEnd; 
2a1d0 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70  pMem++){.      p
2a1e0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
2a1f0 5f 49 6e 76 61 6c 69 64 3b 0a 20 20 20 20 20 20  _Invalid;.      
2a200 70 4d 65 6d 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  pMem->db = db;. 
2a210 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2a220 20 20 70 46 72 61 6d 65 20 3d 20 70 52 74 2d 3e    pFrame = pRt->
2a230 75 2e 70 46 72 61 6d 65 3b 0a 20 20 20 20 61 73  u.pFrame;.    as
2a240 73 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e  sert( pProgram->
2a250 6e 4d 65 6d 2b 70 50 72 6f 67 72 61 6d 2d 3e 6e  nMem+pProgram->n
2a260 43 73 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68  Csr==pFrame->nCh
2a270 69 6c 64 4d 65 6d 20 29 3b 0a 20 20 20 20 61 73  ildMem );.    as
2a280 73 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e  sert( pProgram->
2a290 6e 43 73 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43  nCsr==pFrame->nC
2a2a0 68 69 6c 64 43 73 72 20 29 3b 0a 20 20 20 20 61  hildCsr );.    a
2a2b0 73 73 65 72 74 28 20 70 63 3d 3d 70 46 72 61 6d  ssert( pc==pFram
2a2c0 65 2d 3e 70 63 20 29 3b 0a 20 20 7d 0a 0a 20 20  e->pc );.  }..  
2a2d0 70 2d 3e 6e 46 72 61 6d 65 2b 2b 3b 0a 20 20 70  p->nFrame++;.  p
2a2e0 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 20 3d  Frame->pParent =
2a2f0 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 70 46   p->pFrame;.  pF
2a300 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 20  rame->lastRowid 
2a310 3d 20 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 70  = lastRowid;.  p
2a320 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 20 3d  Frame->nChange =
2a330 20 70 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 70   p->nChange;.  p
2a340 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
2a350 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 70 46 72   p->pFrame = pFr
2a360 61 6d 65 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d  ame;.  p->aMem =
2a370 20 61 4d 65 6d 20 3d 20 26 56 64 62 65 46 72 61   aMem = &VdbeFra
2a380 6d 65 4d 65 6d 28 70 46 72 61 6d 65 29 5b 2d 31  meMem(pFrame)[-1
2a390 5d 3b 0a 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 70  ];.  p->nMem = p
2a3a0 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d  Frame->nChildMem
2a3b0 3b 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d  ;.  p->nCursor =
2a3c0 20 28 75 31 36 29 70 46 72 61 6d 65 2d 3e 6e 43   (u16)pFrame->nC
2a3d0 68 69 6c 64 43 73 72 3b 0a 20 20 70 2d 3e 61 70  hildCsr;.  p->ap
2a3e0 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 73 6f  Csr = (VdbeCurso
2a3f0 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 4d  r **)&aMem[p->nM
2a400 65 6d 2b 31 5d 3b 0a 20 20 70 2d 3e 61 4f 70 20  em+1];.  p->aOp 
2a410 3d 20 61 4f 70 20 3d 20 70 50 72 6f 67 72 61 6d  = aOp = pProgram
2a420 2d 3e 61 4f 70 3b 0a 20 20 70 2d 3e 6e 4f 70 20  ->aOp;.  p->nOp 
2a430 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3b  = pProgram->nOp;
2a440 0a 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20  .  p->aOnceFlag 
2a450 3d 20 28 75 38 20 2a 29 26 70 2d 3e 61 70 43 73  = (u8 *)&p->apCs
2a460 72 5b 70 2d 3e 6e 43 75 72 73 6f 72 5d 3b 0a 20  r[p->nCursor];. 
2a470 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20   p->nOnceFlag = 
2a480 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 6e 63 65 3b  pProgram->nOnce;
2a490 0a 20 20 70 63 20 3d 20 2d 31 3b 0a 20 20 6d 65  .  pc = -1;.  me
2a4a0 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61  mset(p->aOnceFla
2a4b0 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c  g, 0, p->nOnceFl
2a4c0 61 67 29 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d  ag);..  break;.}
2a4d0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61 72  ../* Opcode: Par
2a4e0 61 6d 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  am P1 P2 * * *.*
2a4f0 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
2a500 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 70 72   is only ever pr
2a510 65 73 65 6e 74 20 69 6e 20 73 75 62 2d 70 72 6f  esent in sub-pro
2a520 67 72 61 6d 73 20 63 61 6c 6c 65 64 20 76 69 61  grams called via
2a530 20 74 68 65 20 0a 2a 2a 20 4f 50 5f 50 72 6f 67   the .** OP_Prog
2a540 72 61 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ram instruction.
2a550 20 43 6f 70 79 20 61 20 76 61 6c 75 65 20 63 75   Copy a value cu
2a560 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
2a570 6e 20 61 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63  n a memory .** c
2a580 65 6c 6c 20 6f 66 20 74 68 65 20 63 61 6c 6c 69  ell of the calli
2a590 6e 67 20 28 70 61 72 65 6e 74 29 20 66 72 61 6d  ng (parent) fram
2a5a0 65 20 74 6f 20 63 65 6c 6c 20 50 32 20 69 6e 20  e to cell P2 in 
2a5b0 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d  the current fram
2a5c0 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
2a5d0 70 61 63 65 2e 20 54 68 69 73 20 69 73 20 75 73  pace. This is us
2a5e0 65 64 20 62 79 20 74 72 69 67 67 65 72 20 70 72  ed by trigger pr
2a5f0 6f 67 72 61 6d 73 20 74 6f 20 61 63 63 65 73 73  ograms to access
2a600 20 74 68 65 20 6e 65 77 2e 2a 20 0a 2a 2a 20 61   the new.* .** a
2a610 6e 64 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 2e  nd old.* values.
2a620 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 64 64 72 65  .**.** The addre
2a630 73 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69  ss of the cell i
2a640 6e 20 74 68 65 20 70 61 72 65 6e 74 20 66 72 61  n the parent fra
2a650 6d 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  me is determined
2a660 20 62 79 20 61 64 64 69 6e 67 0a 2a 2a 20 74 68   by adding.** th
2a670 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
2a680 31 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  1 argument to th
2a690 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
2a6a0 31 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  1 argument to th
2a6b0 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 4f 50 5f  e.** calling OP_
2a6c0 50 72 6f 67 72 61 6d 20 69 6e 73 74 72 75 63 74  Program instruct
2a6d0 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ion..*/.case OP_
2a6e0 50 61 72 61 6d 3a 20 7b 20 20 20 20 20 20 20 20  Param: {        
2a6f0 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65     /* out2-prere
2a700 6c 65 61 73 65 20 2a 2f 0a 20 20 56 64 62 65 46  lease */.  VdbeF
2a710 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20  rame *pFrame;.  
2a720 4d 65 6d 20 2a 70 49 6e 3b 0a 20 20 70 46 72 61  Mem *pIn;.  pFra
2a730 6d 65 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a  me = p->pFrame;.
2a740 20 20 70 49 6e 20 3d 20 26 70 46 72 61 6d 65 2d    pIn = &pFrame-
2a750 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 20 2b 20  >aMem[pOp->p1 + 
2a760 70 46 72 61 6d 65 2d 3e 61 4f 70 5b 70 46 72 61  pFrame->aOp[pFra
2a770 6d 65 2d 3e 70 63 5d 2e 70 31 5d 3b 20 20 20 0a  me->pc].p1];   .
2a780 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
2a790 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74  ShallowCopy(pOut
2a7a0 2c 20 70 49 6e 2c 20 4d 45 4d 5f 45 70 68 65 6d  , pIn, MEM_Ephem
2a7b0 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23  );.  break;.}..#
2a7c0 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
2a7d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
2a7e0 47 47 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  GGER */..#ifndef
2a7f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
2a800 45 49 47 4e 5f 4b 45 59 0a 2f 2a 20 4f 70 63 6f  EIGN_KEY./* Opco
2a810 64 65 3a 20 46 6b 43 6f 75 6e 74 65 72 20 50 31  de: FkCounter P1
2a820 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
2a830 49 6e 63 72 65 6d 65 6e 74 20 61 20 22 63 6f 6e  Increment a "con
2a840 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 22  straint counter"
2a850 20 62 79 20 50 32 20 28 50 32 20 6d 61 79 20 62   by P2 (P2 may b
2a860 65 20 6e 65 67 61 74 69 76 65 20 6f 72 20 70 6f  e negative or po
2a870 73 69 74 69 76 65 29 2e 0a 2a 2a 20 49 66 20 50  sitive)..** If P
2a880 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  1 is non-zero, t
2a890 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 73  he database cons
2a8a0 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 69  traint counter i
2a8b0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 0a 2a  s incremented .*
2a8c0 2a 20 28 64 65 66 65 72 72 65 64 20 66 6f 72 65  * (deferred fore
2a8d0 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
2a8e0 6e 74 73 29 2e 20 4f 74 68 65 72 77 69 73 65 2c  nts). Otherwise,
2a8f0 20 69 66 20 50 31 20 69 73 20 7a 65 72 6f 2c 20   if P1 is zero, 
2a900 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  the .** statemen
2a910 74 20 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 63  t counter is inc
2a920 72 65 6d 65 6e 74 65 64 20 28 69 6d 6d 65 64 69  remented (immedi
2a930 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
2a940 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e 0a 2a 2f  constraints)..*/
2a950 0a 63 61 73 65 20 4f 50 5f 46 6b 43 6f 75 6e 74  .case OP_FkCount
2a960 65 72 3a 20 7b 0a 20 20 69 66 28 20 70 4f 70 2d  er: {.  if( pOp-
2a970 3e 70 31 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  >p1 ){.    db->n
2a980 44 65 66 65 72 72 65 64 43 6f 6e 73 20 2b 3d 20  DeferredCons += 
2a990 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d 65 6c 73 65  pOp->p2;.  }else
2a9a0 7b 0a 20 20 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73  {.    p->nFkCons
2a9b0 74 72 61 69 6e 74 20 2b 3d 20 70 4f 70 2d 3e 70  traint += pOp->p
2a9c0 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  2;.  }.  break;.
2a9d0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6b  }../* Opcode: Fk
2a9e0 49 66 5a 65 72 6f 20 50 31 20 50 32 20 2a 20 2a  IfZero P1 P2 * *
2a9f0 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70   *.**.** This op
2aa00 63 6f 64 65 20 74 65 73 74 73 20 69 66 20 61 20  code tests if a 
2aa10 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
2aa20 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72 20 69  traint-counter i
2aa30 73 20 63 75 72 72 65 6e 74 6c 79 20 7a 65 72 6f  s currently zero
2aa40 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20 6a 75 6d 70  ..** If so, jump
2aa50 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   to instruction 
2aa60 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66  P2. Otherwise, f
2aa70 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
2aa80 68 65 20 6e 65 78 74 20 0a 2a 2a 20 69 6e 73 74  he next .** inst
2aa90 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  ruction..**.** I
2aaa0 66 20 50 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  f P1 is non-zero
2aab0 2c 20 74 68 65 6e 20 74 68 65 20 6a 75 6d 70 20  , then the jump 
2aac0 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20  is taken if the 
2aad0 64 61 74 61 62 61 73 65 20 63 6f 6e 73 74 72 61  database constra
2aae0 69 6e 74 2d 63 6f 75 6e 74 65 72 0a 2a 2a 20 69  int-counter.** i
2aaf0 73 20 7a 65 72 6f 20 28 74 68 65 20 6f 6e 65 20  s zero (the one 
2ab00 74 68 61 74 20 63 6f 75 6e 74 73 20 64 65 66 65  that counts defe
2ab10 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  rred constraint 
2ab20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e 20 49 66 20  violations). If 
2ab30 50 31 20 69 73 0a 2a 2a 20 7a 65 72 6f 2c 20 74  P1 is.** zero, t
2ab40 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
2ab50 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
2ab60 74 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75  t constraint-cou
2ab70 6e 74 65 72 20 69 73 20 7a 65 72 6f 0a 2a 2a 20  nter is zero.** 
2ab80 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69  (immediate forei
2ab90 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
2aba0 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e 0a 2a  t violations)..*
2abb0 2f 0a 63 61 73 65 20 4f 50 5f 46 6b 49 66 5a 65  /.case OP_FkIfZe
2abc0 72 6f 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a  ro: {         /*
2abd0 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 66 28 20 70   jump */.  if( p
2abe0 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 69 66  Op->p1 ){.    if
2abf0 28 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43  ( db->nDeferredC
2ac00 6f 6e 73 3d 3d 30 20 29 20 70 63 20 3d 20 70 4f  ons==0 ) pc = pO
2ac10 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d 65 6c 73 65  p->p2-1;.  }else
2ac20 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 46 6b  {.    if( p->nFk
2ac30 43 6f 6e 73 74 72 61 69 6e 74 3d 3d 30 20 29 20  Constraint==0 ) 
2ac40 70 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a  pc = pOp->p2-1;.
2ac50 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23    }.  break;.}.#
2ac60 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
2ac70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
2ac80 45 49 47 4e 5f 4b 45 59 20 2a 2f 0a 0a 23 69 66  EIGN_KEY */..#if
2ac90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2aca0 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 2f  _AUTOINCREMENT./
2acb0 2a 20 4f 70 63 6f 64 65 3a 20 4d 65 6d 4d 61 78  * Opcode: MemMax
2acc0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
2acd0 2a 2a 20 50 31 20 69 73 20 61 20 72 65 67 69 73  ** P1 is a regis
2ace0 74 65 72 20 69 6e 20 74 68 65 20 72 6f 6f 74 20  ter in the root 
2acf0 66 72 61 6d 65 20 6f 66 20 74 68 69 73 20 56 4d  frame of this VM
2ad00 20 28 74 68 65 20 72 6f 6f 74 20 66 72 61 6d 65   (the root frame
2ad10 20 69 73 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74   is.** different
2ad20 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
2ad30 74 20 66 72 61 6d 65 20 69 66 20 74 68 69 73 20  t frame if this 
2ad40 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 62  instruction is b
2ad50 65 69 6e 67 20 65 78 65 63 75 74 65 64 0a 2a 2a  eing executed.**
2ad60 20 77 69 74 68 69 6e 20 61 20 73 75 62 2d 70 72   within a sub-pr
2ad70 6f 67 72 61 6d 29 2e 20 53 65 74 20 74 68 65 20  ogram). Set the 
2ad80 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65  value of registe
2ad90 72 20 50 31 20 74 6f 20 74 68 65 20 6d 61 78 69  r P1 to the maxi
2ada0 6d 75 6d 20 6f 66 20 0a 2a 2a 20 69 74 73 20 63  mum of .** its c
2adb0 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64  urrent value and
2adc0 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
2add0 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a  gister P2..**.**
2ade0 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   This instructio
2adf0 6e 20 74 68 72 6f 77 73 20 61 6e 20 65 72 72 6f  n throws an erro
2ae00 72 20 69 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  r if the memory 
2ae10 63 65 6c 6c 20 69 73 20 6e 6f 74 20 69 6e 69 74  cell is not init
2ae20 69 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65  ially.** an inte
2ae30 67 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ger..*/.case OP_
2ae40 4d 65 6d 4d 61 78 3a 20 7b 20 20 20 20 20 20 20  MemMax: {       
2ae50 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 4d 65 6d   /* in2 */.  Mem
2ae60 20 2a 70 49 6e 31 3b 0a 20 20 56 64 62 65 46 72   *pIn1;.  VdbeFr
2ae70 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 69  ame *pFrame;.  i
2ae80 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a  f( p->pFrame ){.
2ae90 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70      for(pFrame=p
2aea0 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65  ->pFrame; pFrame
2aeb0 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d  ->pParent; pFram
2aec0 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  e=pFrame->pParen
2aed0 74 29 3b 0a 20 20 20 20 70 49 6e 31 20 3d 20 26  t);.    pIn1 = &
2aee0 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70  pFrame->aMem[pOp
2aef0 2d 3e 70 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ->p1];.  }else{.
2af00 20 20 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d      pIn1 = &aMem
2af10 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 7d 0a 20  [pOp->p1];.  }. 
2af20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
2af30 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 73  lid(pIn1) );.  s
2af40 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74  qlite3VdbeMemInt
2af50 65 67 65 72 69 66 79 28 70 49 6e 31 29 3b 0a 20  egerify(pIn1);. 
2af60 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn2 = &aMem[pO
2af70 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65  p->p2];.  sqlite
2af80 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69  3VdbeMemIntegeri
2af90 66 79 28 70 49 6e 32 29 3b 0a 20 20 69 66 28 20  fy(pIn2);.  if( 
2afa0 70 49 6e 31 2d 3e 75 2e 69 3c 70 49 6e 32 2d 3e  pIn1->u.i<pIn2->
2afb0 75 2e 69 29 7b 0a 20 20 20 20 70 49 6e 31 2d 3e  u.i){.    pIn1->
2afc0 75 2e 69 20 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b  u.i = pIn2->u.i;
2afd0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
2afe0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2aff0 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
2b000 45 4e 54 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64  ENT */../* Opcod
2b010 65 3a 20 49 66 50 6f 73 20 50 31 20 50 32 20 2a  e: IfPos P1 P2 *
2b020 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   * *.**.** If th
2b030 65 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73  e value of regis
2b040 74 65 72 20 50 31 20 69 73 20 31 20 6f 72 20 67  ter P1 is 1 or g
2b050 72 65 61 74 65 72 2c 20 6a 75 6d 70 20 74 6f 20  reater, jump to 
2b060 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  P2..**.** It is 
2b070 69 6c 6c 65 67 61 6c 20 74 6f 20 75 73 65 20 74  illegal to use t
2b080 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
2b090 6f 6e 20 61 20 72 65 67 69 73 74 65 72 20 74 68  on a register th
2b0a0 61 74 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  at does.** not c
2b0b0 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65  ontain an intege
2b0c0 72 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  r.  An assertion
2b0d0 20 66 61 75 6c 74 20 77 69 6c 6c 20 72 65 73 75   fault will resu
2b0e0 6c 74 20 69 66 20 79 6f 75 20 74 72 79 2e 0a 2a  lt if you try..*
2b0f0 2f 0a 63 61 73 65 20 4f 50 5f 49 66 50 6f 73 3a  /.case OP_IfPos:
2b100 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
2b110 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31  p, in1 */.  pIn1
2b120 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
2b130 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ];.  assert( pIn
2b140 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  1->flags&MEM_Int
2b150 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e   );.  if( pIn1->
2b160 75 2e 69 3e 30 20 29 7b 0a 20 20 20 20 20 70 63  u.i>0 ){.     pc
2b170 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
2b180 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
2b190 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 4e 65 67  /* Opcode: IfNeg
2b1a0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
2b1b0 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  ** If the value 
2b1c0 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69  of register P1 i
2b1d0 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
2b1e0 2c 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 0a 2a  , jump to P2. .*
2b1f0 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  *.** It is illeg
2b200 61 6c 20 74 6f 20 75 73 65 20 74 68 69 73 20 69  al to use this i
2b210 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 20 61 20  nstruction on a 
2b220 72 65 67 69 73 74 65 72 20 74 68 61 74 20 64 6f  register that do
2b230 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
2b240 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 41  n an integer.  A
2b250 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c  n assertion faul
2b260 74 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 66  t will result if
2b270 20 79 6f 75 20 74 72 79 2e 0a 2a 2f 0a 63 61 73   you try..*/.cas
2b280 65 20 4f 50 5f 49 66 4e 65 67 3a 20 7b 20 20 20  e OP_IfNeg: {   
2b290 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
2b2a0 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61  1 */.  pIn1 = &a
2b2b0 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
2b2c0 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c  assert( pIn1->fl
2b2d0 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  ags&MEM_Int );. 
2b2e0 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3c 30   if( pIn1->u.i<0
2b2f0 20 29 7b 0a 20 20 20 20 20 70 63 20 3d 20 70 4f   ){.     pc = pO
2b300 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20  p->p2 - 1;.  }. 
2b310 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
2b320 63 6f 64 65 3a 20 49 66 5a 65 72 6f 20 50 31 20  code: IfZero P1 
2b330 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
2b340 54 68 65 20 72 65 67 69 73 74 65 72 20 50 31 20  The register P1 
2b350 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20  must contain an 
2b360 69 6e 74 65 67 65 72 2e 20 20 41 64 64 20 6c 69  integer.  Add li
2b370 74 65 72 61 6c 20 50 33 20 74 6f 20 74 68 65 0a  teral P3 to the.
2b380 2a 2a 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  ** value in regi
2b390 73 74 65 72 20 50 31 2e 20 20 49 66 20 74 68 65  ster P1.  If the
2b3a0 20 72 65 73 75 6c 74 20 69 73 20 65 78 61 63 74   result is exact
2b3b0 6c 79 20 30 2c 20 6a 75 6d 70 20 74 6f 20 50 32  ly 0, jump to P2
2b3c0 2e 20 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  . .**.** It is i
2b3d0 6c 6c 65 67 61 6c 20 74 6f 20 75 73 65 20 74 68  llegal to use th
2b3e0 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f  is instruction o
2b3f0 6e 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61  n a register tha
2b400 74 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  t does.** not co
2b410 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72  ntain an integer
2b420 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
2b430 66 61 75 6c 74 20 77 69 6c 6c 20 72 65 73 75 6c  fault will resul
2b440 74 20 69 66 20 79 6f 75 20 74 72 79 2e 0a 2a 2f  t if you try..*/
2b450 0a 63 61 73 65 20 4f 50 5f 49 66 5a 65 72 6f 3a  .case OP_IfZero:
2b460 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
2b470 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31  p, in1 */.  pIn1
2b480 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
2b490 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ];.  assert( pIn
2b4a0 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  1->flags&MEM_Int
2b4b0 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20   );.  pIn1->u.i 
2b4c0 2b 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66  += pOp->p3;.  if
2b4d0 28 20 70 49 6e 31 2d 3e 75 2e 69 3d 3d 30 20 29  ( pIn1->u.i==0 )
2b4e0 7b 0a 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  {.     pc = pOp-
2b4f0 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62  >p2 - 1;.  }.  b
2b500 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
2b510 64 65 3a 20 41 67 67 53 74 65 70 20 2a 20 50 32  de: AggStep * P2
2b520 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20   P3 P4 P5.**.** 
2b530 45 78 65 63 75 74 65 20 74 68 65 20 73 74 65 70  Execute the step
2b540 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e   function for an
2b550 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 65   aggregate.  The
2b560 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  .** function has
2b570 20 50 35 20 61 72 67 75 6d 65 6e 74 73 2e 20 20   P5 arguments.  
2b580 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72   P4 is a pointer
2b590 20 74 6f 20 74 68 65 20 46 75 6e 63 44 65 66 0a   to the FuncDef.
2b5a0 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ** structure tha
2b5b0 74 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  t specifies the 
2b5c0 66 75 6e 63 74 69 6f 6e 2e 20 20 55 73 65 20 72  function.  Use r
2b5d0 65 67 69 73 74 65 72 0a 2a 2a 20 50 33 20 61 73  egister.** P3 as
2b5e0 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
2b5f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 61  ..**.** The P5 a
2b600 72 67 75 6d 65 6e 74 73 20 61 72 65 20 74 61 6b  rguments are tak
2b610 65 6e 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  en from register
2b620 20 50 32 20 61 6e 64 20 69 74 73 0a 2a 2a 20 73   P2 and its.** s
2b630 75 63 63 65 73 73 6f 72 73 2e 0a 2a 2f 0a 63 61  uccessors..*/.ca
2b640 73 65 20 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b  se OP_AggStep: {
2b650 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
2b660 69 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a  i;.  Mem *pMem;.
2b670 20 20 4d 65 6d 20 2a 70 52 65 63 3b 0a 20 20 73    Mem *pRec;.  s
2b680 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 63  qlite3_context c
2b690 74 78 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  tx;.  sqlite3_va
2b6a0 6c 75 65 20 2a 2a 61 70 56 61 6c 3b 0a 0a 20 20  lue **apVal;..  
2b6b0 6e 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 61  n = pOp->p5;.  a
2b6c0 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20  ssert( n>=0 );. 
2b6d0 20 70 52 65 63 20 3d 20 26 61 4d 65 6d 5b 70 4f   pRec = &aMem[pO
2b6e0 70 2d 3e 70 32 5d 3b 0a 20 20 61 70 56 61 6c 20  p->p2];.  apVal 
2b6f0 3d 20 70 2d 3e 61 70 41 72 67 3b 0a 20 20 61 73  = p->apArg;.  as
2b700 73 65 72 74 28 20 61 70 56 61 6c 20 7c 7c 20 6e  sert( apVal || n
2b710 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ==0 );.  for(i=0
2b720 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 52 65 63  ; i<n; i++, pRec
2b730 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
2b740 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 52 65 63   memIsValid(pRec
2b750 29 20 29 3b 0a 20 20 20 20 61 70 56 61 6c 5b 69  ) );.    apVal[i
2b760 5d 20 3d 20 70 52 65 63 3b 0a 20 20 20 20 6d 65  ] = pRec;.    me
2b770 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
2b780 2c 20 70 52 65 63 29 3b 0a 20 20 20 20 73 71 6c  , pRec);.    sql
2b790 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f 72 65  ite3VdbeMemStore
2b7a0 54 79 70 65 28 70 52 65 63 29 3b 0a 20 20 7d 0a  Type(pRec);.  }.
2b7b0 20 20 63 74 78 2e 70 46 75 6e 63 20 3d 20 70 4f    ctx.pFunc = pO
2b7c0 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 61  p->p4.pFunc;.  a
2b7d0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30  ssert( pOp->p3>0
2b7e0 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e   && pOp->p3<=p->
2b7f0 6e 4d 65 6d 20 29 3b 0a 20 20 63 74 78 2e 70 4d  nMem );.  ctx.pM
2b800 65 6d 20 3d 20 70 4d 65 6d 20 3d 20 26 61 4d 65  em = pMem = &aMe
2b810 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 4d  m[pOp->p3];.  pM
2b820 65 6d 2d 3e 6e 2b 2b 3b 0a 20 20 63 74 78 2e 73  em->n++;.  ctx.s
2b830 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
2b840 6c 3b 0a 20 20 63 74 78 2e 73 2e 7a 20 3d 20 30  l;.  ctx.s.z = 0
2b850 3b 0a 20 20 63 74 78 2e 73 2e 7a 4d 61 6c 6c 6f  ;.  ctx.s.zMallo
2b860 63 20 3d 20 30 3b 0a 20 20 63 74 78 2e 73 2e 78  c = 0;.  ctx.s.x
2b870 44 65 6c 20 3d 20 30 3b 0a 20 20 63 74 78 2e 73  Del = 0;.  ctx.s
2b880 2e 64 62 20 3d 20 64 62 3b 0a 20 20 63 74 78 2e  .db = db;.  ctx.
2b890 69 73 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 63  isError = 0;.  c
2b8a0 74 78 2e 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  tx.pColl = 0;.  
2b8b0 63 74 78 2e 73 6b 69 70 46 6c 61 67 20 3d 20 30  ctx.skipFlag = 0
2b8c0 3b 0a 20 20 69 66 28 20 63 74 78 2e 70 46 75 6e  ;.  if( ctx.pFun
2b8d0 63 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  c->flags & SQLIT
2b8e0 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
2b8f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2b900 4f 70 3e 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20  Op>p->aOp );.   
2b910 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
2b920 2e 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c  .p4type==P4_COLL
2b930 53 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  SEQ );.    asser
2b940 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64  t( pOp[-1].opcod
2b950 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71 20 29 3b  e==OP_CollSeq );
2b960 0a 20 20 20 20 63 74 78 2e 70 43 6f 6c 6c 20 3d  .    ctx.pColl =
2b970 20 70 4f 70 5b 2d 31 5d 2e 70 34 2e 70 43 6f 6c   pOp[-1].p4.pCol
2b980 6c 3b 0a 20 20 7d 0a 20 20 28 63 74 78 2e 70 46  l;.  }.  (ctx.pF
2b990 75 6e 63 2d 3e 78 53 74 65 70 29 28 26 63 74 78  unc->xStep)(&ctx
2b9a0 2c 20 6e 2c 20 61 70 56 61 6c 29 3b 20 2f 2a 20  , n, apVal); /* 
2b9b0 49 4d 50 3a 20 52 2d 32 34 35 30 35 2d 32 33 32  IMP: R-24505-232
2b9c0 33 30 20 2a 2f 0a 20 20 69 66 28 20 63 74 78 2e  30 */.  if( ctx.
2b9d0 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 73  isError ){.    s
2b9e0 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
2b9f0 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
2ba00 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76   "%s", sqlite3_v
2ba10 61 6c 75 65 5f 74 65 78 74 28 26 63 74 78 2e 73  alue_text(&ctx.s
2ba20 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 74 78  ));.    rc = ctx
2ba30 2e 69 73 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  .isError;.  }.  
2ba40 69 66 28 20 63 74 78 2e 73 6b 69 70 46 6c 61 67  if( ctx.skipFlag
2ba50 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2ba60 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
2ba70 4f 50 5f 43 6f 6c 6c 53 65 71 20 29 3b 0a 20 20  OP_CollSeq );.  
2ba80 20 20 69 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31    i = pOp[-1].p1
2ba90 3b 0a 20 20 20 20 69 66 28 20 69 20 29 20 73 71  ;.    if( i ) sq
2baa0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49  lite3VdbeMemSetI
2bab0 6e 74 36 34 28 26 61 4d 65 6d 5b 69 5d 2c 20 31  nt64(&aMem[i], 1
2bac0 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
2bad0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
2bae0 26 63 74 78 2e 73 29 3b 0a 0a 20 20 62 72 65 61  &ctx.s);..  brea
2baf0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
2bb00 20 41 67 67 46 69 6e 61 6c 20 50 31 20 50 32 20   AggFinal P1 P2 
2bb10 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 65  * P4 *.**.** Exe
2bb20 63 75 74 65 20 74 68 65 20 66 69 6e 61 6c 69 7a  cute the finaliz
2bb30 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
2bb40 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 50  an aggregate.  P
2bb50 31 20 69 73 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f  1 is.** the memo
2bb60 72 79 20 6c 6f 63 61 74 69 6f 6e 20 74 68 61 74  ry location that
2bb70 20 69 73 20 74 68 65 20 61 63 63 75 6d 75 6c 61   is the accumula
2bb80 74 6f 72 20 66 6f 72 20 74 68 65 20 61 67 67 72  tor for the aggr
2bb90 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 50 32 20  egate..**.** P2 
2bba0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2bbb0 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20   arguments that 
2bbc0 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
2bbd0 6e 20 74 61 6b 65 73 20 61 6e 64 0a 2a 2a 20 50  n takes and.** P
2bbe0 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
2bbf0 6f 20 74 68 65 20 46 75 6e 63 44 65 66 20 66 6f  o the FuncDef fo
2bc00 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  r this function.
2bc10 20 20 54 68 65 20 50 32 0a 2a 2a 20 61 72 67 75    The P2.** argu
2bc20 6d 65 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64  ment is not used
2bc30 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 2e   by this opcode.
2bc40 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 74 68 65    It is only the
2bc50 72 65 20 74 6f 20 64 69 73 61 6d 62 69 67 75 61  re to disambigua
2bc60 74 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  te.** functions 
2bc70 74 68 61 74 20 63 61 6e 20 74 61 6b 65 20 76 61  that can take va
2bc80 72 79 69 6e 67 20 6e 75 6d 62 65 72 73 20 6f 66  rying numbers of
2bc90 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65   arguments.  The
2bca0 0a 2a 2a 20 50 34 20 61 72 67 75 6d 65 6e 74 20  .** P4 argument 
2bcb0 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66  is only needed f
2bcc0 6f 72 20 74 68 65 20 64 65 67 65 6e 65 72 61 74  or the degenerat
2bcd0 65 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20  e case where.** 
2bce0 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
2bcf0 6e 20 77 61 73 20 6e 6f 74 20 70 72 65 76 69 6f  n was not previo
2bd00 75 73 6c 79 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  usly called..*/.
2bd10 63 61 73 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c  case OP_AggFinal
2bd20 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b  : {.  Mem *pMem;
2bd30 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2bd40 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  p1>0 && pOp->p1<
2bd50 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 4d  =p->nMem );.  pM
2bd60 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  em = &aMem[pOp->
2bd70 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  p1];.  assert( (
2bd80 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 7e 28  pMem->flags & ~(
2bd90 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 41 67 67  MEM_Null|MEM_Agg
2bda0 29 29 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  ))==0 );.  rc = 
2bdb0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 69  sqlite3VdbeMemFi
2bdc0 6e 61 6c 69 7a 65 28 70 4d 65 6d 2c 20 70 4f 70  nalize(pMem, pOp
2bdd0 2d 3e 70 34 2e 70 46 75 6e 63 29 3b 0a 20 20 69  ->p4.pFunc);.  i
2bde0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
2bdf0 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
2be00 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
2be10 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  %s", sqlite3_val
2be20 75 65 5f 74 65 78 74 28 70 4d 65 6d 29 29 3b 0a  ue_text(pMem));.
2be30 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
2be40 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28  eChangeEncoding(
2be50 70 4d 65 6d 2c 20 65 6e 63 6f 64 69 6e 67 29 3b  pMem, encoding);
2be60 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c  .  UPDATE_MAX_BL
2be70 4f 42 53 49 5a 45 28 70 4d 65 6d 29 3b 0a 20 20  OBSIZE(pMem);.  
2be80 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
2be90 65 6d 54 6f 6f 42 69 67 28 70 4d 65 6d 29 20 29  emTooBig(pMem) )
2bea0 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62  {.    goto too_b
2beb0 69 67 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  ig;.  }.  break;
2bec0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
2bed0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 4f  TE_OMIT_WAL./* O
2bee0 70 63 6f 64 65 3a 20 43 68 65 63 6b 70 6f 69 6e  pcode: Checkpoin
2bef0 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  t P1 P2 P3 * *.*
2bf00 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20  *.** Checkpoint 
2bf10 64 61 74 61 62 61 73 65 20 50 31 2e 20 54 68 69  database P1. Thi
2bf20 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
2bf30 50 31 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  P1 is not curren
2bf40 74 6c 79 20 69 6e 0a 2a 2a 20 57 41 4c 20 6d 6f  tly in.** WAL mo
2bf50 64 65 2e 20 50 61 72 61 6d 65 74 65 72 20 50 32  de. Parameter P2
2bf60 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   is one of SQLIT
2bf70 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
2bf80 53 49 56 45 2c 20 46 55 4c 4c 0a 2a 2a 20 6f 72  SIVE, FULL.** or
2bf90 20 52 45 53 54 41 52 54 2e 20 20 57 72 69 74 65   RESTART.  Write
2bfa0 20 31 20 6f 72 20 30 20 69 6e 74 6f 20 6d 65 6d   1 or 0 into mem
2bfb0 5b 50 33 5d 20 69 66 20 74 68 65 20 63 68 65 63  [P3] if the chec
2bfc0 6b 70 6f 69 6e 74 20 72 65 74 75 72 6e 73 0a 2a  kpoint returns.*
2bfd0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72  * SQLITE_BUSY or
2bfe0 20 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76 65   not, respective
2bff0 6c 79 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  ly.  Write the n
2c000 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2c010 6e 20 74 68 65 0a 2a 2a 20 57 41 4c 20 61 66 74  n the.** WAL aft
2c020 65 72 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  er the checkpoin
2c030 74 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b 31 5d  t into mem[P3+1]
2c040 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
2c050 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 20 74  of pages.** in t
2c060 68 65 20 57 41 4c 20 74 68 61 74 20 68 61 76 65  he WAL that have
2c070 20 62 65 65 6e 20 63 68 65 63 6b 70 6f 69 6e 74   been checkpoint
2c080 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68 65  ed after the che
2c090 63 6b 70 6f 69 6e 74 0a 2a 2a 20 63 6f 6d 70 6c  ckpoint.** compl
2c0a0 65 74 65 73 20 69 6e 74 6f 20 6d 65 6d 5b 50 33  etes into mem[P3
2c0b0 2b 32 5d 2e 20 20 48 6f 77 65 76 65 72 20 6f 6e  +2].  However on
2c0c0 20 61 6e 20 65 72 72 6f 72 2c 20 6d 65 6d 5b 50   an error, mem[P
2c0d0 33 2b 31 5d 20 61 6e 64 0a 2a 2a 20 6d 65 6d 5b  3+1] and.** mem[
2c0e0 50 33 2b 32 5d 20 61 72 65 20 69 6e 69 74 69 61  P3+2] are initia
2c0f0 6c 69 7a 65 64 20 74 6f 20 2d 31 2e 0a 2a 2f 0a  lized to -1..*/.
2c100 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69  case OP_Checkpoi
2c110 6e 74 3a 20 7b 0a 20 20 69 6e 74 20 69 3b 20 20  nt: {.  int i;  
2c120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c130 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2c140 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
2c150 20 61 52 65 73 5b 33 5d 3b 20 20 20 20 20 20 20   aRes[3];       
2c160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c170 52 65 73 75 6c 74 73 20 2a 2f 0a 20 20 4d 65 6d  Results */.  Mem
2c180 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   *pMem;         
2c190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c1a0 57 72 69 74 65 20 72 65 73 75 6c 74 73 20 68 65  Write results he
2c1b0 72 65 20 2a 2f 0a 0a 20 20 61 52 65 73 5b 30 5d  re */..  aRes[0]
2c1c0 20 3d 20 30 3b 0a 20 20 61 52 65 73 5b 31 5d 20   = 0;.  aRes[1] 
2c1d0 3d 20 61 52 65 73 5b 32 5d 20 3d 20 2d 31 3b 0a  = aRes[2] = -1;.
2c1e0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2c1f0 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  2==SQLITE_CHECKP
2c200 4f 49 4e 54 5f 50 41 53 53 49 56 45 0a 20 20 20  OINT_PASSIVE.   
2c210 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d      || pOp->p2==
2c220 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
2c230 54 5f 46 55 4c 4c 0a 20 20 20 20 20 20 20 7c 7c  T_FULL.       ||
2c240 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45   pOp->p2==SQLITE
2c250 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54  _CHECKPOINT_REST
2c260 41 52 54 0a 20 20 29 3b 0a 20 20 72 63 20 3d 20  ART.  );.  rc = 
2c270 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e  sqlite3Checkpoin
2c280 74 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  t(db, pOp->p1, p
2c290 4f 70 2d 3e 70 32 2c 20 26 61 52 65 73 5b 31 5d  Op->p2, &aRes[1]
2c2a0 2c 20 26 61 52 65 73 5b 32 5d 29 3b 0a 20 20 69  , &aRes[2]);.  i
2c2b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
2c2c0 53 59 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  SY ){.    rc = S
2c2d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 61 52  QLITE_OK;.    aR
2c2e0 65 73 5b 30 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20  es[0] = 1;.  }. 
2c2f0 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 20 3d   for(i=0, pMem =
2c300 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
2c310 20 69 3c 33 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b   i<3; i++, pMem+
2c320 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
2c330 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 70  dbeMemSetInt64(p
2c340 4d 65 6d 2c 20 28 69 36 34 29 61 52 65 73 5b 69  Mem, (i64)aRes[i
2c350 5d 29 3b 0a 20 20 7d 20 20 20 20 0a 20 20 62 72  ]);.  }    .  br
2c360 65 61 6b 3b 0a 7d 3b 20 20 0a 23 65 6e 64 69 66  eak;.};  .#endif
2c370 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c380 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 2f 2a 20  _OMIT_PRAGMA./* 
2c390 4f 70 63 6f 64 65 3a 20 4a 6f 75 72 6e 61 6c 4d  Opcode: JournalM
2c3a0 6f 64 65 20 50 31 20 50 32 20 50 33 20 2a 20 50  ode P1 P2 P3 * P
2c3b0 35 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  5.**.** Change t
2c3c0 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20  he journal mode 
2c3d0 6f 66 20 64 61 74 61 62 61 73 65 20 50 31 20 74  of database P1 t
2c3e0 6f 20 50 33 2e 20 50 33 20 6d 75 73 74 20 62 65  o P3. P3 must be
2c3f0 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 50   one of the.** P
2c400 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2c410 5f 58 58 58 20 76 61 6c 75 65 73 2e 20 49 66 20  _XXX values. If 
2c420 63 68 61 6e 67 69 6e 67 20 62 65 74 77 65 65 6e  changing between
2c430 20 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f 6c   the various rol
2c440 6c 62 61 63 6b 0a 2a 2a 20 6d 6f 64 65 73 20 28  lback.** modes (
2c450 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65  delete, truncate
2c460 2c 20 70 65 72 73 69 73 74 2c 20 6f 66 66 20 61  , persist, off a
2c470 6e 64 20 6d 65 6d 6f 72 79 29 2c 20 74 68 69 73  nd memory), this
2c480 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20   is a simple.** 
2c490 6f 70 65 72 61 74 69 6f 6e 2e 20 4e 6f 20 49 4f  operation. No IO
2c4a0 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   is required..**
2c4b0 0a 2a 2a 20 49 66 20 63 68 61 6e 67 69 6e 67 20  .** If changing 
2c4c0 69 6e 74 6f 20 6f 72 20 6f 75 74 20 6f 66 20 57  into or out of W
2c4d0 41 4c 20 6d 6f 64 65 20 74 68 65 20 70 72 6f 63  AL mode the proc
2c4e0 65 64 75 72 65 20 69 73 20 6d 6f 72 65 20 63 6f  edure is more co
2c4f0 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  mplicated..**.**
2c500 20 57 72 69 74 65 20 61 20 73 74 72 69 6e 67 20   Write a string 
2c510 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66  containing the f
2c520 69 6e 61 6c 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  inal journal-mod
2c530 65 20 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  e to register P2
2c540 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4a 6f 75  ..*/.case OP_Jou
2c550 72 6e 61 6c 4d 6f 64 65 3a 20 7b 20 20 20 20 2f  rnalMode: {    /
2c560 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73  * out2-prereleas
2c570 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 42  e */.  Btree *pB
2c580 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2c590 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
2c5a0 74 6f 20 63 68 61 6e 67 65 20 6a 6f 75 72 6e 61  to change journa
2c5b0 6c 20 6d 6f 64 65 20 6f 66 20 2a 2f 0a 20 20 50  l mode of */.  P
2c5c0 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
2c5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c5e0 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69 61 74  * Pager associat
2c5f0 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f 0a 20  ed with pBt */. 
2c600 20 69 6e 74 20 65 4e 65 77 3b 20 20 20 20 20 20   int eNew;      
2c610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c620 20 2f 2a 20 4e 65 77 20 6a 6f 75 72 6e 61 6c 20   /* New journal 
2c630 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  mode */.  int eO
2c640 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
2c650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2c660 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64   old journal mod
2c670 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2c680 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
2c690 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2c6a0 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2c6b0 66 6f 72 20 70 50 61 67 65 72 20 2a 2f 0a 0a 20  for pPager */.. 
2c6c0 20 65 4e 65 77 20 3d 20 70 4f 70 2d 3e 70 33 3b   eNew = pOp->p3;
2c6d0 0a 20 20 61 73 73 65 72 74 28 20 65 4e 65 77 3d  .  assert( eNew=
2c6e0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2c6f0 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
2c700 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52    || eNew==PAGER
2c710 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
2c720 4e 43 41 54 45 20 0a 20 20 20 20 20 20 20 7c 7c  NCATE .       ||
2c730 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55   eNew==PAGER_JOU
2c740 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
2c750 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77   .       || eNew
2c760 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2c770 4f 44 45 5f 4f 46 46 0a 20 20 20 20 20 20 20 7c  ODE_OFF.       |
2c780 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f  | eNew==PAGER_JO
2c790 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
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 57 41 4c 0a 20 20 20 20 20 20 20 7c 7c  DE_WAL.       ||
2c7d0 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55   eNew==PAGER_JOU
2c7e0 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20  RNALMODE_QUERY. 
2c7f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
2c800 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
2c810 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  >p1<db->nDb );..
2c820 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b    pBt = db->aDb[
2c830 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20 20  pOp->p1].pBt;.  
2c840 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
2c850 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b  BtreePager(pBt);
2c860 0a 20 20 65 4f 6c 64 20 3d 20 73 71 6c 69 74 65  .  eOld = sqlite
2c870 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c  3PagerGetJournal
2c880 4d 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Mode(pPager);.  
2c890 69 66 28 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f  if( eNew==PAGER_
2c8a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
2c8b0 59 20 29 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b  Y ) eNew = eOld;
2c8c0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 50  .  if( !sqlite3P
2c8d0 61 67 65 72 4f 6b 54 6f 43 68 61 6e 67 65 4a 6f  agerOkToChangeJo
2c8e0 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72  urnalMode(pPager
2c8f0 29 20 29 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b  ) ) eNew = eOld;
2c900 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c910 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 7a 46 69 6c  _OMIT_WAL.  zFil
2c920 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 50  ename = sqlite3P
2c930 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 50 61  agerFilename(pPa
2c940 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e  ger);..  /* Do n
2c950 6f 74 20 61 6c 6c 6f 77 20 61 20 74 72 61 6e 73  ot allow a trans
2c960 69 74 69 6f 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  ition to journal
2c970 5f 6d 6f 64 65 3d 57 41 4c 20 66 6f 72 20 61 20  _mode=WAL for a 
2c980 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 6e  database.  ** in
2c990 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
2c9a0 67 65 20 6f 72 20 69 66 20 74 68 65 20 56 46 53  ge or if the VFS
2c9b0 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
2c9c0 74 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  t shared memory 
2c9d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 4e 65 77  .  */.  if( eNew
2c9e0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2c9f0 4f 44 45 5f 57 41 4c 0a 20 20 20 26 26 20 28 73  ODE_WAL.   && (s
2ca00 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2ca10 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 20 20 20  Filename)==0    
2ca20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 66         /* Temp f
2ca30 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c  ile */.       ||
2ca40 20 21 73 71 6c 69 74 65 33 50 61 67 65 72 57 61   !sqlite3PagerWa
2ca50 6c 53 75 70 70 6f 72 74 65 64 28 70 50 61 67 65  lSupported(pPage
2ca60 72 29 29 20 20 20 2f 2a 20 4e 6f 20 73 68 61 72  r))   /* No shar
2ca70 65 64 2d 6d 65 6d 6f 72 79 20 73 75 70 70 6f 72  ed-memory suppor
2ca80 74 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 65 4e  t */.  ){.    eN
2ca90 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 7d 0a 0a  ew = eOld;.  }..
2caa0 20 20 69 66 28 20 28 65 4e 65 77 21 3d 65 4f 6c    if( (eNew!=eOl
2cab0 64 29 0a 20 20 20 26 26 20 28 65 4f 6c 64 3d 3d  d).   && (eOld==
2cac0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2cad0 45 5f 57 41 4c 20 7c 7c 20 65 4e 65 77 3d 3d 50  E_WAL || eNew==P
2cae0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2caf0 5f 57 41 4c 29 0a 20 20 29 7b 0a 20 20 20 20 69  _WAL).  ){.    i
2cb00 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  f( !db->autoComm
2cb10 69 74 20 7c 7c 20 64 62 2d 3e 61 63 74 69 76 65  it || db->active
2cb20 56 64 62 65 43 6e 74 3e 31 20 29 7b 0a 20 20 20  VdbeCnt>1 ){.   
2cb30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2cb40 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69  RROR;.      sqli
2cb50 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
2cb60 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 0a 20  >zErrMsg, db, . 
2cb70 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74           "cannot
2cb80 20 63 68 61 6e 67 65 20 25 73 20 77 61 6c 20 6d   change %s wal m
2cb90 6f 64 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ode from within 
2cba0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a  a transaction",.
2cbb0 20 20 20 20 20 20 20 20 20 20 28 65 4e 65 77 3d            (eNew=
2cbc0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2cbd0 44 45 5f 57 41 4c 20 3f 20 22 69 6e 74 6f 22 20  DE_WAL ? "into" 
2cbe0 3a 20 22 6f 75 74 20 6f 66 22 29 0a 20 20 20 20  : "out of").    
2cbf0 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b    );.      break
2cc00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 0a 20  ;.    }else{. . 
2cc10 20 20 20 20 20 69 66 28 20 65 4f 6c 64 3d 3d 50       if( eOld==P
2cc20 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2cc30 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _WAL ){.        
2cc40 2f 2a 20 49 66 20 6c 65 61 76 69 6e 67 20 57 41  /* If leaving WA
2cc50 4c 20 6d 6f 64 65 2c 20 63 6c 6f 73 65 20 74 68  L mode, close th
2cc60 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73  e log file. If s
2cc70 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20 63  uccessful, the c
2cc80 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  all.        ** t
2cc90 6f 20 50 61 67 65 72 43 6c 6f 73 65 57 61 6c 28  o PagerCloseWal(
2cca0 29 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 61 6e  ) checkpoints an
2ccb0 64 20 64 65 6c 65 74 65 73 20 74 68 65 20 77 72  d deletes the wr
2ccc0 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 0a 20  ite-ahead-log . 
2ccd0 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20         ** file. 
2cce0 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  An EXCLUSIVE loc
2ccf0 6b 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 68  k may still be h
2cd00 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
2cd10 61 73 65 20 66 69 6c 65 20 0a 20 20 20 20 20 20  ase file .      
2cd20 20 20 2a 2a 20 61 66 74 65 72 20 61 20 73 75 63    ** after a suc
2cd30 63 65 73 73 66 75 6c 20 72 65 74 75 72 6e 2e 20  cessful return. 
2cd40 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2cd50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2cd60 50 61 67 65 72 43 6c 6f 73 65 57 61 6c 28 70 50  PagerCloseWal(pP
2cd70 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
2cd80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2cd90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2cda0 6c 69 74 65 33 50 61 67 65 72 53 65 74 4a 6f 75  lite3PagerSetJou
2cdb0 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 2c  rnalMode(pPager,
2cdc0 20 65 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   eNew);.        
2cdd0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
2cde0 28 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f  ( eOld==PAGER_JO
2cdf0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
2ce00 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
2ce10 61 6e 6e 6f 74 20 74 72 61 6e 73 69 74 69 6f 6e  annot transition
2ce20 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 4d   directly from M
2ce30 45 4d 4f 52 59 20 74 6f 20 57 41 4c 2e 20 20 55  EMORY to WAL.  U
2ce40 73 65 20 6d 6f 64 65 20 4f 46 46 0a 20 20 20 20  se mode OFF.    
2ce50 20 20 20 20 2a 2a 20 61 73 20 61 6e 20 69 6e 74      ** as an int
2ce60 65 72 6d 65 64 69 61 74 65 20 2a 2f 0a 20 20 20  ermediate */.   
2ce70 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
2ce80 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  rSetJournalMode(
2ce90 70 50 61 67 65 72 2c 20 50 41 47 45 52 5f 4a 4f  pPager, PAGER_JO
2cea0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 3b 0a  URNALMODE_OFF);.
2ceb0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
2cec0 20 2f 2a 20 4f 70 65 6e 20 61 20 74 72 61 6e 73   /* Open a trans
2ced0 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61  action on the da
2cee0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 52 65 67  tabase file. Reg
2cef0 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6a  ardless of the j
2cf00 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
2cf10 6d 6f 64 65 2c 20 74 68 69 73 20 74 72 61 6e 73  mode, this trans
2cf20 61 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75 73  action always us
2cf30 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
2cf40 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a  urnal..      */.
2cf50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
2cf60 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
2cf70 61 6e 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20  ans(pBt)==0 );. 
2cf80 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2cf90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2cfa0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2cfb0 72 65 65 53 65 74 56 65 72 73 69 6f 6e 28 70 42  reeSetVersion(pB
2cfc0 74 2c 20 28 65 4e 65 77 3d 3d 50 41 47 45 52 5f  t, (eNew==PAGER_
2cfd0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
2cfe0 3f 20 32 20 3a 20 31 29 29 3b 0a 20 20 20 20 20  ? 2 : 1));.     
2cff0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
2d000 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  dif /* ifndef SQ
2d010 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
2d020 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ..  if( rc ){.  
2d030 20 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20    eNew = eOld;. 
2d040 20 7d 0a 20 20 65 4e 65 77 20 3d 20 73 71 6c 69   }.  eNew = sqli
2d050 74 65 33 50 61 67 65 72 53 65 74 4a 6f 75 72 6e  te3PagerSetJourn
2d060 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65  alMode(pPager, e
2d070 4e 65 77 29 3b 0a 0a 20 20 70 4f 75 74 20 3d 20  New);..  pOut = 
2d080 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
2d090 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
2d0a0 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74 61 74  MEM_Str|MEM_Stat
2d0b0 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70  ic|MEM_Term;.  p
2d0c0 4f 75 74 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Out->z = (char *
2d0d0 29 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4d  )sqlite3JournalM
2d0e0 6f 64 65 6e 61 6d 65 28 65 4e 65 77 29 3b 0a 20  odename(eNew);. 
2d0f0 20 70 4f 75 74 2d 3e 6e 20 3d 20 73 71 6c 69 74   pOut->n = sqlit
2d100 65 33 53 74 72 6c 65 6e 33 30 28 70 4f 75 74 2d  e3Strlen30(pOut-
2d110 3e 7a 29 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63  >z);.  pOut->enc
2d120 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
2d130 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2d140 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4f 75 74  ngeEncoding(pOut
2d150 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 62  , encoding);.  b
2d160 72 65 61 6b 3b 0a 7d 3b 0a 23 65 6e 64 69 66 20  reak;.};.#endif 
2d170 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  /* SQLITE_OMIT_P
2d180 52 41 47 4d 41 20 2a 2f 0a 0a 23 69 66 20 21 64  RAGMA */..#if !d
2d190 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2d1a0 49 54 5f 56 41 43 55 55 4d 29 20 26 26 20 21 64  IT_VACUUM) && !d
2d1b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2d1c0 49 54 5f 41 54 54 41 43 48 29 0a 2f 2a 20 4f 70  IT_ATTACH)./* Op
2d1d0 63 6f 64 65 3a 20 56 61 63 75 75 6d 20 2a 20 2a  code: Vacuum * *
2d1e0 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 56 61 63   * * *.**.** Vac
2d1f0 75 75 6d 20 74 68 65 20 65 6e 74 69 72 65 20 64  uum the entire d
2d200 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 6f  atabase.  This o
2d210 70 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65  pcode will cause
2d220 20 6f 74 68 65 72 20 76 69 72 74 75 61 6c 0a 2a   other virtual.*
2d230 2a 20 6d 61 63 68 69 6e 65 73 20 74 6f 20 62 65  * machines to be
2d240 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 75 6e   created and run
2d250 2e 20 20 49 74 20 6d 61 79 20 6e 6f 74 20 62 65  .  It may not be
2d260 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
2d270 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63  hin.** a transac
2d280 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  tion..*/.case OP
2d290 5f 56 61 63 75 75 6d 3a 20 7b 0a 20 20 72 63 20  _Vacuum: {.  rc 
2d2a0 3d 20 73 71 6c 69 74 65 33 52 75 6e 56 61 63 75  = sqlite3RunVacu
2d2b0 75 6d 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  um(&p->zErrMsg, 
2d2c0 64 62 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  db);.  break;.}.
2d2d0 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
2d2e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2d2f0 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 2f 2a 20  _AUTOVACUUM)./* 
2d300 4f 70 63 6f 64 65 3a 20 49 6e 63 72 56 61 63 75  Opcode: IncrVacu
2d310 75 6d 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  um P1 P2 * * *.*
2d320 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73  *.** Perform a s
2d330 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 74 68  ingle step of th
2d340 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
2d350 63 75 75 6d 20 70 72 6f 63 65 64 75 72 65 20 6f  cuum procedure o
2d360 6e 0a 2a 2a 20 74 68 65 20 50 31 20 64 61 74 61  n.** the P1 data
2d370 62 61 73 65 2e 20 49 66 20 74 68 65 20 76 61 63  base. If the vac
2d380 75 75 6d 20 68 61 73 20 66 69 6e 69 73 68 65 64  uum has finished
2d390 2c 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75  , jump to instru
2d3a0 63 74 69 6f 6e 0a 2a 2a 20 50 32 2e 20 4f 74 68  ction.** P2. Oth
2d3b0 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72  erwise, fall thr
2d3c0 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
2d3d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
2d3e0 0a 63 61 73 65 20 4f 50 5f 49 6e 63 72 56 61 63  .case OP_IncrVac
2d3f0 75 75 6d 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  uum: {        /*
2d400 20 6a 75 6d 70 20 2a 2f 0a 20 20 42 74 72 65 65   jump */.  Btree
2d410 20 2a 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74   *pBt;..  assert
2d420 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
2d430 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20  pOp->p1<db->nDb 
2d440 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
2d450 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28  >btreeMask & (((
2d460 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70 2d  yDbMask)1)<<pOp-
2d470 3e 70 31 29 29 21 3d 30 20 29 3b 0a 20 20 70 42  >p1))!=0 );.  pB
2d480 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d  t = db->aDb[pOp-
2d490 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 72 63 20 3d  >p1].pBt;.  rc =
2d4a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
2d4b0 72 56 61 63 75 75 6d 28 70 42 74 29 3b 0a 20 20  rVacuum(pBt);.  
2d4c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
2d4d0 4f 4e 45 20 29 7b 0a 20 20 20 20 70 63 20 3d 20  ONE ){.    pc = 
2d4e0 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20  pOp->p2 - 1;.   
2d4f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2d500 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
2d510 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64  #endif../* Opcod
2d520 65 3a 20 45 78 70 69 72 65 20 50 31 20 2a 20 2a  e: Expire P1 * *
2d530 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 61 75 73 65   * *.**.** Cause
2d540 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61   precompiled sta
2d550 74 65 6d 65 6e 74 73 20 74 6f 20 62 65 63 6f 6d  tements to becom
2d560 65 20 65 78 70 69 72 65 64 2e 20 41 6e 20 65 78  e expired. An ex
2d570 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a  pired statement.
2d580 2a 2a 20 66 61 69 6c 73 20 77 69 74 68 20 61 6e  ** fails with an
2d590 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 66 20 53   error code of S
2d5a0 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 69 66 20  QLITE_SCHEMA if 
2d5b0 69 74 20 69 73 20 65 76 65 72 20 65 78 65 63 75  it is ever execu
2d5c0 74 65 64 20 0a 2a 2a 20 28 76 69 61 20 73 71 6c  ted .** (via sql
2d5d0 69 74 65 33 5f 73 74 65 70 28 29 29 2e 0a 2a 2a  ite3_step())..**
2d5e0 20 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 30 2c   .** If P1 is 0,
2d5f0 20 74 68 65 6e 20 61 6c 6c 20 53 51 4c 20 73 74   then all SQL st
2d600 61 74 65 6d 65 6e 74 73 20 62 65 63 6f 6d 65 20  atements become 
2d610 65 78 70 69 72 65 64 2e 20 49 66 20 50 31 20 69  expired. If P1 i
2d620 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20 74  s non-zero,.** t
2d630 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 63 75 72  hen only the cur
2d640 72 65 6e 74 6c 79 20 65 78 65 63 75 74 69 6e 67  rently executing
2d650 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 66   statement is af
2d660 66 65 63 74 65 64 2e 20 0a 2a 2f 0a 63 61 73 65  fected. .*/.case
2d670 20 4f 50 5f 45 78 70 69 72 65 3a 20 7b 0a 20 20   OP_Expire: {.  
2d680 69 66 28 20 21 70 4f 70 2d 3e 70 31 20 29 7b 0a  if( !pOp->p1 ){.
2d690 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
2d6a0 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
2d6b0 6e 74 73 28 64 62 29 3b 0a 20 20 7d 65 6c 73 65  nts(db);.  }else
2d6c0 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
2d6d0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61   = 1;.  }.  brea
2d6e0 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  k;.}..#ifndef SQ
2d6f0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2d700 5f 43 41 43 48 45 0a 2f 2a 20 4f 70 63 6f 64 65  _CACHE./* Opcode
2d710 3a 20 54 61 62 6c 65 4c 6f 63 6b 20 50 31 20 50  : TableLock P1 P
2d720 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  2 P3 P4 *.**.** 
2d730 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e  Obtain a lock on
2d740 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74 61   a particular ta
2d750 62 6c 65 2e 20 54 68 69 73 20 69 6e 73 74 72 75  ble. This instru
2d760 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
2d770 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 73  ed when.** the s
2d780 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
2d790 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ure is enabled. 
2d7a0 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65  .**.** P1 is the
2d7b0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   index of the da
2d7c0 74 61 62 61 73 65 20 69 6e 20 73 71 6c 69 74 65  tabase in sqlite
2d7d0 33 2e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64  3.aDb[] of the d
2d7e0 61 74 61 62 61 73 65 0a 2a 2a 20 6f 6e 20 77 68  atabase.** on wh
2d7f0 69 63 68 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ich the lock is 
2d800 61 63 71 75 69 72 65 64 2e 20 20 41 20 72 65 61  acquired.  A rea
2d810 64 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65  dlock is obtaine
2d820 64 20 69 66 20 50 33 3d 3d 30 20 6f 72 0a 2a 2a  d if P3==0 or.**
2d830 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66   a write lock if
2d840 20 50 33 3d 3d 31 2e 0a 2a 2a 0a 2a 2a 20 50 32   P3==1..**.** P2
2d850 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 6f   contains the ro
2d860 6f 74 2d 70 61 67 65 20 6f 66 20 74 68 65 20 74  ot-page of the t
2d870 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 2e 0a 2a 2a  able to lock..**
2d880 0a 2a 2a 20 50 34 20 63 6f 6e 74 61 69 6e 73 20  .** P4 contains 
2d890 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2d8a0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
2d8b0 6c 65 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e  le being locked.
2d8c0 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 0a 2a 2a   This is only.**
2d8d0 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
2d8e0 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
2d8f0 67 65 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63  ge if the lock c
2d900 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
2d910 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 61  d..*/.case OP_Ta
2d920 62 6c 65 4c 6f 63 6b 3a 20 7b 0a 20 20 75 38 20  bleLock: {.  u8 
2d930 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28 75  isWriteLock = (u
2d940 38 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28  8)pOp->p3;.  if(
2d950 20 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20   isWriteLock || 
2d960 30 3d 3d 28 64 62 2d 3e 66 6c 61 67 73 26 53 51  0==(db->flags&SQ
2d970 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
2d980 74 74 65 64 29 20 29 7b 0a 20 20 20 20 69 6e 74  tted) ){.    int
2d990 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 0a   p1 = pOp->p1; .
2d9a0 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d      assert( p1>=
2d9b0 30 20 26 26 20 70 31 3c 64 62 2d 3e 6e 44 62 20  0 && p1<db->nDb 
2d9c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
2d9d0 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28  p->btreeMask & (
2d9e0 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70 31  ((yDbMask)1)<<p1
2d9f0 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ))!=0 );.    ass
2da00 65 72 74 28 20 69 73 57 72 69 74 65 4c 6f 63 6b  ert( isWriteLock
2da10 3d 3d 30 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f  ==0 || isWriteLo
2da20 63 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 72 63 20  ck==1 );.    rc 
2da30 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f  = sqlite3BtreeLo
2da40 63 6b 54 61 62 6c 65 28 64 62 2d 3e 61 44 62 5b  ckTable(db->aDb[
2da50 70 31 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 32  p1].pBt, pOp->p2
2da60 2c 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a  , isWriteLock);.
2da70 20 20 20 20 69 66 28 20 28 72 63 26 30 78 46 46      if( (rc&0xFF
2da80 29 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  )==SQLITE_LOCKED
2da90 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
2daa0 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70  char *z = pOp->p
2dab0 34 2e 7a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  4.z;.      sqlit
2dac0 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
2dad0 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 64 61  zErrMsg, db, "da
2dae0 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
2daf0 6c 6f 63 6b 65 64 3a 20 25 73 22 2c 20 7a 29 3b  locked: %s", z);
2db00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
2db10 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ak;.}.#endif /* 
2db20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2db30 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
2db40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2db50 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
2db60 20 4f 70 63 6f 64 65 3a 20 56 42 65 67 69 6e 20   Opcode: VBegin 
2db70 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  * * * P4 *.**.**
2db80 20 50 34 20 6d 61 79 20 62 65 20 61 20 70 6f 69   P4 may be a poi
2db90 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
2dba0 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
2dbb0 65 2e 20 49 66 20 73 6f 2c 20 63 61 6c 6c 20 74  e. If so, call t
2dbc0 68 65 20 0a 2a 2a 20 78 42 65 67 69 6e 20 6d 65  he .** xBegin me
2dbd0 74 68 6f 64 20 66 6f 72 20 74 68 61 74 20 74 61  thod for that ta
2dbe0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 2c  ble..**.** Also,
2dbf0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2dc00 50 34 20 69 73 20 73 65 74 2c 20 63 68 65 63 6b  P4 is set, check
2dc10 20 74 68 61 74 20 74 68 69 73 20 69 73 20 6e 6f   that this is no
2dc20 74 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  t being called f
2dc30 72 6f 6d 0a 2a 2a 20 77 69 74 68 69 6e 20 61 20  rom.** within a 
2dc40 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 20 76 69  callback to a vi
2dc50 72 74 75 61 6c 20 74 61 62 6c 65 20 78 53 79 6e  rtual table xSyn
2dc60 63 28 29 20 6d 65 74 68 6f 64 2e 20 49 66 20 69  c() method. If i
2dc70 74 20 69 73 2c 20 74 68 65 20 65 72 72 6f 72 0a  t is, the error.
2dc80 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20  ** code will be 
2dc90 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4c 4f  set to SQLITE_LO
2dca0 43 4b 45 44 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  CKED..*/.case OP
2dcb0 5f 56 42 65 67 69 6e 3a 20 7b 0a 20 20 56 54 61  _VBegin: {.  VTa
2dcc0 62 6c 65 20 2a 70 56 54 61 62 3b 0a 20 20 70 56  ble *pVTab;.  pV
2dcd0 54 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56  Tab = pOp->p4.pV
2dce0 74 61 62 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  tab;.  rc = sqli
2dcf0 74 65 33 56 74 61 62 42 65 67 69 6e 28 64 62 2c  te3VtabBegin(db,
2dd00 20 70 56 54 61 62 29 3b 0a 20 20 69 66 28 20 70   pVTab);.  if( p
2dd10 56 54 61 62 20 29 20 69 6d 70 6f 72 74 56 74 61  VTab ) importVta
2dd20 62 45 72 72 4d 73 67 28 70 2c 20 70 56 54 61 62  bErrMsg(p, pVTab
2dd30 2d 3e 70 56 74 61 62 29 3b 0a 20 20 62 72 65 61  ->pVtab);.  brea
2dd40 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  k;.}.#endif /* S
2dd50 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2dd60 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e  ALTABLE */..#ifn
2dd70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2dd80 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20  VIRTUALTABLE./* 
2dd90 4f 70 63 6f 64 65 3a 20 56 43 72 65 61 74 65 20  Opcode: VCreate 
2dda0 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
2ddb0 2a 20 50 34 20 69 73 20 74 68 65 20 6e 61 6d 65  * P4 is the name
2ddc0 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61   of a virtual ta
2ddd0 62 6c 65 20 69 6e 20 64 61 74 61 62 61 73 65 20  ble in database 
2dde0 50 31 2e 20 43 61 6c 6c 20 74 68 65 20 78 43 72  P1. Call the xCr
2ddf0 65 61 74 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 66  eate method.** f
2de00 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a  or that table..*
2de10 2f 0a 63 61 73 65 20 4f 50 5f 56 43 72 65 61 74  /.case OP_VCreat
2de20 65 3a 20 7b 0a 20 20 72 63 20 3d 20 73 71 6c 69  e: {.  rc = sqli
2de30 74 65 33 56 74 61 62 43 61 6c 6c 43 72 65 61 74  te3VtabCallCreat
2de40 65 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  e(db, pOp->p1, p
2de50 4f 70 2d 3e 70 34 2e 7a 2c 20 26 70 2d 3e 7a 45  Op->p4.z, &p->zE
2de60 72 72 4d 73 67 29 3b 0a 20 20 62 72 65 61 6b 3b  rrMsg);.  break;
2de70 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2de80 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2de90 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  TABLE */..#ifnde
2dea0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2deb0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70  RTUALTABLE./* Op
2dec0 63 6f 64 65 3a 20 56 44 65 73 74 72 6f 79 20 50  code: VDestroy P
2ded0 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  1 * * P4 *.**.**
2dee0 20 50 34 20 69 73 20 74 68 65 20 6e 61 6d 65 20   P4 is the name 
2def0 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  of a virtual tab
2df00 6c 65 20 69 6e 20 64 61 74 61 62 61 73 65 20 50  le in database P
2df10 31 2e 20 20 43 61 6c 6c 20 74 68 65 20 78 44 65  1.  Call the xDe
2df20 73 74 72 6f 79 20 6d 65 74 68 6f 64 0a 2a 2a 20  stroy method.** 
2df30 6f 66 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a  of that table..*
2df40 2f 0a 63 61 73 65 20 4f 50 5f 56 44 65 73 74 72  /.case OP_VDestr
2df50 6f 79 3a 20 7b 0a 20 20 70 2d 3e 69 6e 56 74 61  oy: {.  p->inVta
2df60 62 4d 65 74 68 6f 64 20 3d 20 32 3b 0a 20 20 72  bMethod = 2;.  r
2df70 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 43  c = sqlite3VtabC
2df80 61 6c 6c 44 65 73 74 72 6f 79 28 64 62 2c 20 70  allDestroy(db, p
2df90 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e  Op->p1, pOp->p4.
2dfa0 7a 29 3b 0a 20 20 70 2d 3e 69 6e 56 74 61 62 4d  z);.  p->inVtabM
2dfb0 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 62 72 65  ethod = 0;.  bre
2dfc0 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ak;.}.#endif /* 
2dfd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2dfe0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
2dff0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2e000 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
2e010 20 4f 70 63 6f 64 65 3a 20 56 4f 70 65 6e 20 50   Opcode: VOpen P
2e020 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  1 * * P4 *.**.**
2e030 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72   P4 is a pointer
2e040 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61   to a virtual ta
2e050 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73  ble object, an s
2e060 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75  qlite3_vtab stru
2e070 63 74 75 72 65 2e 0a 2a 2a 20 50 31 20 69 73 20  cture..** P1 is 
2e080 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e  a cursor number.
2e090 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6f 70    This opcode op
2e0a0 65 6e 73 20 61 20 63 75 72 73 6f 72 20 74 6f 20  ens a cursor to 
2e0b0 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  the virtual.** t
2e0c0 61 62 6c 65 20 61 6e 64 20 73 74 6f 72 65 73 20  able and stores 
2e0d0 74 68 61 74 20 63 75 72 73 6f 72 20 69 6e 20 50  that cursor in P
2e0e0 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 4f  1..*/.case OP_VO
2e0f0 70 65 6e 3a 20 7b 0a 20 20 56 64 62 65 43 75 72  pen: {.  VdbeCur
2e100 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 73 71 6c  sor *pCur;.  sql
2e110 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
2e120 20 2a 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20   *pVtabCursor;. 
2e130 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
2e140 56 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Vtab;.  sqlite3_
2e150 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b  module *pModule;
2e160 0a 0a 20 20 70 43 75 72 20 3d 20 30 3b 0a 20 20  ..  pCur = 0;.  
2e170 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 30 3b  pVtabCursor = 0;
2e180 0a 20 20 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  .  pVtab = pOp->
2e190 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b  p4.pVtab->pVtab;
2e1a0 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20 28 73 71  .  pModule = (sq
2e1b0 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 29 70  lite3_module *)p
2e1c0 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
2e1d0 20 61 73 73 65 72 74 28 70 56 74 61 62 20 26 26   assert(pVtab &&
2e1e0 20 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 72 63 20   pModule);.  rc 
2e1f0 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4f 70 65 6e  = pModule->xOpen
2e200 28 70 56 74 61 62 2c 20 26 70 56 74 61 62 43 75  (pVtab, &pVtabCu
2e210 72 73 6f 72 29 3b 0a 20 20 69 6d 70 6f 72 74 56  rsor);.  importV
2e220 74 61 62 45 72 72 4d 73 67 28 70 2c 20 70 56 74  tabErrMsg(p, pVt
2e230 61 62 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  ab);.  if( SQLIT
2e240 45 5f 4f 4b 3d 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK==rc ){.    
2e250 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 73 71  /* Initialize sq
2e260 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
2e270 72 20 62 61 73 65 20 63 6c 61 73 73 20 2a 2f 0a  r base class */.
2e280 20 20 20 20 70 56 74 61 62 43 75 72 73 6f 72 2d      pVtabCursor-
2e290 3e 70 56 74 61 62 20 3d 20 70 56 74 61 62 3b 0a  >pVtab = pVtab;.
2e2a0 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
2e2b0 73 65 20 76 64 62 65 20 63 75 72 73 6f 72 20 6f  se vdbe cursor o
2e2c0 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 70 43 75  bject */.    pCu
2e2d0 72 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  r = allocateCurs
2e2e0 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 30  or(p, pOp->p1, 0
2e2f0 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  , -1, 0);.    if
2e300 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ( pCur ){.      
2e310 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f  pCur->pVtabCurso
2e320 72 20 3d 20 70 56 74 61 62 43 75 72 73 6f 72 3b  r = pVtabCursor;
2e330 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4d 6f  .      pCur->pMo
2e340 64 75 6c 65 20 3d 20 70 56 74 61 62 43 75 72 73  dule = pVtabCurs
2e350 6f 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75  or->pVtab->pModu
2e360 6c 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  le;.    }else{. 
2e370 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
2e380 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
2e390 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
2e3a0 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20  (pVtabCursor);. 
2e3b0 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
2e3c0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2e3d0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2e3e0 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64  LTABLE */..#ifnd
2e3f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2e400 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f  IRTUALTABLE./* O
2e410 70 63 6f 64 65 3a 20 56 46 69 6c 74 65 72 20 50  pcode: VFilter P
2e420 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a  1 P2 P3 P4 *.**.
2e430 2a 2a 20 50 31 20 69 73 20 61 20 63 75 72 73 6f  ** P1 is a curso
2e440 72 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 56  r opened using V
2e450 4f 70 65 6e 2e 20 20 50 32 20 69 73 20 61 6e 20  Open.  P2 is an 
2e460 61 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20  address to jump 
2e470 74 6f 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 6c  to if.** the fil
2e480 74 65 72 65 64 20 72 65 73 75 6c 74 20 73 65 74  tered result set
2e490 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
2e4a0 20 50 34 20 69 73 20 65 69 74 68 65 72 20 4e 55   P4 is either NU
2e4b0 4c 4c 20 6f 72 20 61 20 73 74 72 69 6e 67 20 74  LL or a string t
2e4c0 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65  hat was generate
2e4d0 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e  d by the xBestIn
2e4e0 64 65 78 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66  dex.** method of
2e4f0 20 74 68 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68   the module.  Th
2e500 65 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e  e interpretation
2e510 20 6f 66 20 74 68 65 20 50 34 20 73 74 72 69 6e   of the P4 strin
2e520 67 20 69 73 20 6c 65 66 74 0a 2a 2a 20 74 6f 20  g is left.** to 
2e530 74 68 65 20 6d 6f 64 75 6c 65 20 69 6d 70 6c 65  the module imple
2e540 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  mentation..**.**
2e550 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 76   This opcode inv
2e560 6f 6b 65 73 20 74 68 65 20 78 46 69 6c 74 65 72  okes the xFilter
2e570 20 6d 65 74 68 6f 64 20 6f 6e 20 74 68 65 20 76   method on the v
2e580 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73 70 65  irtual table spe
2e590 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 50 31 2e  cified.** by P1.
2e5a0 20 20 54 68 65 20 69 6e 74 65 67 65 72 20 71 75    The integer qu
2e5b0 65 72 79 20 70 6c 61 6e 20 70 61 72 61 6d 65 74  ery plan paramet
2e5c0 65 72 20 74 6f 20 78 46 69 6c 74 65 72 20 69 73  er to xFilter is
2e5d0 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
2e5e0 74 65 72 0a 2a 2a 20 50 33 2e 20 52 65 67 69 73  ter.** P3. Regis
2e5f0 74 65 72 20 50 33 2b 31 20 73 74 6f 72 65 73 20  ter P3+1 stores 
2e600 74 68 65 20 61 72 67 63 20 70 61 72 61 6d 65 74  the argc paramet
2e610 65 72 20 74 6f 20 62 65 20 70 61 73 73 65 64 20  er to be passed 
2e620 74 6f 20 74 68 65 0a 2a 2a 20 78 46 69 6c 74 65  to the.** xFilte
2e630 72 20 6d 65 74 68 6f 64 2e 20 52 65 67 69 73 74  r method. Regist
2e640 65 72 73 20 50 33 2b 32 2e 2e 50 33 2b 31 2b 61  ers P3+2..P3+1+a
2e650 72 67 63 20 61 72 65 20 74 68 65 20 61 72 67 63  rgc are the argc
2e660 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 70  .** additional p
2e670 61 72 61 6d 65 74 65 72 73 20 77 68 69 63 68 20  arameters which 
2e680 61 72 65 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a  are passed to.**
2e690 20 78 46 69 6c 74 65 72 20 61 73 20 61 72 67 76   xFilter as argv
2e6a0 2e 20 52 65 67 69 73 74 65 72 20 50 33 2b 32 20  . Register P3+2 
2e6b0 62 65 63 6f 6d 65 73 20 61 72 67 76 5b 30 5d 20  becomes argv[0] 
2e6c0 77 68 65 6e 20 70 61 73 73 65 64 20 74 6f 20 78  when passed to x
2e6d0 46 69 6c 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  Filter..**.** A 
2e6e0 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f 20  jump is made to 
2e6f0 50 32 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  P2 if the result
2e700 20 73 65 74 20 61 66 74 65 72 20 66 69 6c 74 65   set after filte
2e710 72 69 6e 67 20 77 6f 75 6c 64 20 62 65 20 65 6d  ring would be em
2e720 70 74 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  pty..*/.case OP_
2e730 56 46 69 6c 74 65 72 3a 20 7b 20 20 20 2f 2a 20  VFilter: {   /* 
2e740 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  jump */.  int nA
2e750 72 67 3b 0a 20 20 69 6e 74 20 69 51 75 65 72 79  rg;.  int iQuery
2e760 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  ;.  const sqlite
2e770 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
2e780 65 3b 0a 20 20 4d 65 6d 20 2a 70 51 75 65 72 79  e;.  Mem *pQuery
2e790 3b 0a 20 20 4d 65 6d 20 2a 70 41 72 67 63 3b 0a  ;.  Mem *pArgc;.
2e7a0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
2e7b0 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
2e7c0 6f 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  or;.  sqlite3_vt
2e7d0 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 56 64 62  ab *pVtab;.  Vdb
2e7e0 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  eCursor *pCur;. 
2e7f0 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20   int res;.  int 
2e800 69 3b 0a 20 20 4d 65 6d 20 2a 2a 61 70 41 72 67  i;.  Mem **apArg
2e810 3b 0a 0a 20 20 70 51 75 65 72 79 20 3d 20 26 61  ;..  pQuery = &a
2e820 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
2e830 70 41 72 67 63 20 3d 20 26 70 51 75 65 72 79 5b  pArgc = &pQuery[
2e840 31 5d 3b 0a 20 20 70 43 75 72 20 3d 20 70 2d 3e  1];.  pCur = p->
2e850 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
2e860 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
2e870 61 6c 69 64 28 70 51 75 65 72 79 29 20 29 3b 0a  alid(pQuery) );.
2e880 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
2e890 28 70 4f 70 2d 3e 70 33 2c 20 70 51 75 65 72 79  (pOp->p3, pQuery
2e8a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2e8b0 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29  r->pVtabCursor )
2e8c0 3b 0a 20 20 70 56 74 61 62 43 75 72 73 6f 72 20  ;.  pVtabCursor 
2e8d0 3d 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72  = pCur->pVtabCur
2e8e0 73 6f 72 3b 0a 20 20 70 56 74 61 62 20 3d 20 70  sor;.  pVtab = p
2e8f0 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
2e900 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70  b;.  pModule = p
2e910 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 0a  Vtab->pModule;..
2e920 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 69 6e    /* Grab the in
2e930 64 65 78 20 6e 75 6d 62 65 72 20 61 6e 64 20 61  dex number and a
2e940 72 67 63 20 70 61 72 61 6d 65 74 65 72 73 20 2a  rgc parameters *
2e950 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 51 75  /.  assert( (pQu
2e960 65 72 79 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49  ery->flags&MEM_I
2e970 6e 74 29 21 3d 30 20 26 26 20 70 41 72 67 63 2d  nt)!=0 && pArgc-
2e980 3e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 74 20  >flags==MEM_Int 
2e990 29 3b 0a 20 20 6e 41 72 67 20 3d 20 28 69 6e 74  );.  nArg = (int
2e9a0 29 70 41 72 67 63 2d 3e 75 2e 69 3b 0a 20 20 69  )pArgc->u.i;.  i
2e9b0 51 75 65 72 79 20 3d 20 28 69 6e 74 29 70 51 75  Query = (int)pQu
2e9c0 65 72 79 2d 3e 75 2e 69 3b 0a 0a 20 20 2f 2a 20  ery->u.i;..  /* 
2e9d0 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 74  Invoke the xFilt
2e9e0 65 72 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7b  er method */.  {
2e9f0 0a 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20  .    res = 0;.  
2ea00 20 20 61 70 41 72 67 20 3d 20 70 2d 3e 61 70 41    apArg = p->apA
2ea10 72 67 3b 0a 20 20 20 20 66 6f 72 28 69 20 3d 20  rg;.    for(i = 
2ea20 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
2ea30 0a 20 20 20 20 20 20 61 70 41 72 67 5b 69 5d 20  .      apArg[i] 
2ea40 3d 20 26 70 41 72 67 63 5b 69 2b 31 5d 3b 0a 20  = &pArgc[i+1];. 
2ea50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ea60 4d 65 6d 53 74 6f 72 65 54 79 70 65 28 61 70 41  MemStoreType(apA
2ea70 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20  rg[i]);.    }.. 
2ea80 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68     p->inVtabMeth
2ea90 6f 64 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d  od = 1;.    rc =
2eaa0 20 70 4d 6f 64 75 6c 65 2d 3e 78 46 69 6c 74 65   pModule->xFilte
2eab0 72 28 70 56 74 61 62 43 75 72 73 6f 72 2c 20 69  r(pVtabCursor, i
2eac0 51 75 65 72 79 2c 20 70 4f 70 2d 3e 70 34 2e 7a  Query, pOp->p4.z
2ead0 2c 20 6e 41 72 67 2c 20 61 70 41 72 67 29 3b 0a  , nArg, apArg);.
2eae0 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74      p->inVtabMet
2eaf0 68 6f 64 20 3d 20 30 3b 0a 20 20 20 20 69 6d 70  hod = 0;.    imp
2eb00 6f 72 74 56 74 61 62 45 72 72 4d 73 67 28 70 2c  ortVtabErrMsg(p,
2eb10 20 70 56 74 61 62 29 3b 0a 20 20 20 20 69 66 28   pVtab);.    if(
2eb20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2eb30 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 4d  {.      res = pM
2eb40 6f 64 75 6c 65 2d 3e 78 45 6f 66 28 70 56 74 61  odule->xEof(pVta
2eb50 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  bCursor);.    }.
2eb60 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
2eb70 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e        pc = pOp->
2eb80 70 32 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  p2 - 1;.    }.  
2eb90 7d 0a 20 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f  }.  pCur->nullRo
2eba0 77 20 3d 20 30 3b 0a 0a 20 20 62 72 65 61 6b 3b  w = 0;..  break;
2ebb0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2ebc0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2ebd0 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  TABLE */..#ifnde
2ebe0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2ebf0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70  RTUALTABLE./* Op
2ec00 63 6f 64 65 3a 20 56 43 6f 6c 75 6d 6e 20 50 31  code: VColumn P1
2ec10 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
2ec20 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   Store the value
2ec30 20 6f 66 20 74 68 65 20 50 32 2d 74 68 20 63 6f   of the P2-th co
2ec40 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72  lumn of.** the r
2ec50 6f 77 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  ow of the virtua
2ec60 6c 2d 74 61 62 6c 65 20 74 68 61 74 20 74 68 65  l-table that the
2ec70 20 0a 2a 2a 20 50 31 20 63 75 72 73 6f 72 20 69   .** P1 cursor i
2ec80 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 6e  s pointing to in
2ec90 74 6f 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  to register P3..
2eca0 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 43 6f 6c 75  */.case OP_VColu
2ecb0 6d 6e 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  mn: {.  sqlite3_
2ecc0 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 63  vtab *pVtab;.  c
2ecd0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
2ece0 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20  ule *pModule;.  
2ecf0 4d 65 6d 20 2a 70 44 65 73 74 3b 0a 20 20 73 71  Mem *pDest;.  sq
2ed00 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 73 43  lite3_context sC
2ed10 6f 6e 74 65 78 74 3b 0a 0a 20 20 56 64 62 65 43  ontext;..  VdbeC
2ed20 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 2d  ursor *pCur = p-
2ed30 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
2ed40 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2ed50 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 3b 0a  >pVtabCursor );.
2ed60 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2ed70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d  3>0 && pOp->p3<=
2ed80 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 44 65  p->nMem );.  pDe
2ed90 73 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  st = &aMem[pOp->
2eda0 70 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54  p3];.  memAboutT
2edb0 6f 43 68 61 6e 67 65 28 70 2c 20 70 44 65 73 74  oChange(p, pDest
2edc0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 6e  );.  if( pCur->n
2edd0 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 73 71  ullRow ){.    sq
2ede0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
2edf0 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20 20 20  ull(pDest);.    
2ee00 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 56 74  break;.  }.  pVt
2ee10 61 62 20 3d 20 70 43 75 72 2d 3e 70 56 74 61 62  ab = pCur->pVtab
2ee20 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20  Cursor->pVtab;. 
2ee30 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62   pModule = pVtab
2ee40 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 73  ->pModule;.  ass
2ee50 65 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 43  ert( pModule->xC
2ee60 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6d 65 6d 73 65  olumn );.  memse
2ee70 74 28 26 73 43 6f 6e 74 65 78 74 2c 20 30 2c 20  t(&sContext, 0, 
2ee80 73 69 7a 65 6f 66 28 73 43 6f 6e 74 65 78 74 29  sizeof(sContext)
2ee90 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6f 75 74  );..  /* The out
2eea0 70 75 74 20 63 65 6c 6c 20 6d 61 79 20 61 6c 72  put cell may alr
2eeb0 65 61 64 79 20 68 61 76 65 20 61 20 62 75 66 66  eady have a buff
2eec0 65 72 20 61 6c 6c 6f 63 61 74 65 64 2e 20 4d 6f  er allocated. Mo
2eed0 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 72  ve.  ** the curr
2eee0 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20  ent contents to 
2eef0 73 43 6f 6e 74 65 78 74 2e 73 20 73 6f 20 69 6e  sContext.s so in
2ef00 20 63 61 73 65 20 74 68 65 20 75 73 65 72 2d 66   case the user-f
2ef10 75 6e 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 63 61  unction .  ** ca
2ef20 6e 20 75 73 65 20 74 68 65 20 61 6c 72 65 61 64  n use the alread
2ef30 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  y allocated buff
2ef40 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6c  er instead of al
2ef50 6c 6f 63 61 74 69 6e 67 20 61 20 0a 20 20 2a 2a  locating a .  **
2ef60 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   new one..  */. 
2ef70 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d   sqlite3VdbeMemM
2ef80 6f 76 65 28 26 73 43 6f 6e 74 65 78 74 2e 73 2c  ove(&sContext.s,
2ef90 20 70 44 65 73 74 29 3b 0a 20 20 4d 65 6d 53 65   pDest);.  MemSe
2efa0 74 54 79 70 65 46 6c 61 67 28 26 73 43 6f 6e 74  tTypeFlag(&sCont
2efb0 65 78 74 2e 73 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  ext.s, MEM_Null)
2efc0 3b 0a 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c  ;..  rc = pModul
2efd0 65 2d 3e 78 43 6f 6c 75 6d 6e 28 70 43 75 72 2d  e->xColumn(pCur-
2efe0 3e 70 56 74 61 62 43 75 72 73 6f 72 2c 20 26 73  >pVtabCursor, &s
2eff0 43 6f 6e 74 65 78 74 2c 20 70 4f 70 2d 3e 70 32  Context, pOp->p2
2f000 29 3b 0a 20 20 69 6d 70 6f 72 74 56 74 61 62 45  );.  importVtabE
2f010 72 72 4d 73 67 28 70 2c 20 70 56 74 61 62 29 3b  rrMsg(p, pVtab);
2f020 0a 20 20 69 66 28 20 73 43 6f 6e 74 65 78 74 2e  .  if( sContext.
2f030 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 72  isError ){.    r
2f040 63 20 3d 20 73 43 6f 6e 74 65 78 74 2e 69 73 45  c = sContext.isE
2f050 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rror;.  }..  /* 
2f060 43 6f 70 79 20 74 68 65 20 72 65 73 75 6c 74 20  Copy the result 
2f070 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
2f080 74 6f 20 74 68 65 20 50 33 20 72 65 67 69 73 74  to the P3 regist
2f090 65 72 2e 20 57 65 0a 20 20 2a 2a 20 64 6f 20 74  er. We.  ** do t
2f0a0 68 69 73 20 72 65 67 61 72 64 6c 65 73 73 20 6f  his regardless o
2f0b0 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
2f0c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
2f0d0 65 64 20 74 6f 20 65 6e 73 75 72 65 20 61 6e 79  ed to ensure any
2f0e0 0a 20 20 2a 2a 20 64 79 6e 61 6d 69 63 20 61 6c  .  ** dynamic al
2f0f0 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 73 43 6f 6e  location in sCon
2f100 74 65 78 74 2e 73 20 28 61 20 4d 65 6d 20 73 74  text.s (a Mem st
2f110 72 75 63 74 29 20 69 73 20 20 72 65 6c 65 61 73  ruct) is  releas
2f120 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ed..  */.  sqlit
2f130 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f  e3VdbeChangeEnco
2f140 64 69 6e 67 28 26 73 43 6f 6e 74 65 78 74 2e 73  ding(&sContext.s
2f150 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 73  , encoding);.  s
2f160 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76  qlite3VdbeMemMov
2f170 65 28 70 44 65 73 74 2c 20 26 73 43 6f 6e 74 65  e(pDest, &sConte
2f180 78 74 2e 73 29 3b 0a 20 20 52 45 47 49 53 54 45  xt.s);.  REGISTE
2f190 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c  R_TRACE(pOp->p3,
2f1a0 20 70 44 65 73 74 29 3b 0a 20 20 55 50 44 41 54   pDest);.  UPDAT
2f1b0 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70  E_MAX_BLOBSIZE(p
2f1c0 44 65 73 74 29 3b 0a 0a 20 20 69 66 28 20 73 71  Dest);..  if( sq
2f1d0 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42  lite3VdbeMemTooB
2f1e0 69 67 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  ig(pDest) ){.   
2f1f0 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20   goto too_big;. 
2f200 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65   }.  break;.}.#e
2f210 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2f220 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2f230 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
2f240 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2f250 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a  TABLE./* Opcode:
2f260 20 56 4e 65 78 74 20 50 31 20 50 32 20 2a 20 2a   VNext P1 P2 * *
2f270 20 2a 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65   *.**.** Advance
2f280 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 50   virtual table P
2f290 31 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  1 to the next ro
2f2a0 77 20 69 6e 20 69 74 73 20 72 65 73 75 6c 74 20  w in its result 
2f2b0 73 65 74 20 61 6e 64 0a 2a 2a 20 6a 75 6d 70 20  set and.** jump 
2f2c0 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50  to instruction P
2f2d0 32 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 76  2.  Or, if the v
2f2e0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 73  irtual table has
2f2f0 20 72 65 61 63 68 65 64 0a 2a 2a 20 74 68 65 20   reached.** the 
2f300 65 6e 64 20 6f 66 20 69 74 73 20 72 65 73 75 6c  end of its resul
2f310 74 20 73 65 74 2c 20 74 68 65 6e 20 66 61 6c 6c  t set, then fall
2f320 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
2f330 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2f340 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 4e 65  ..*/.case OP_VNe
2f350 78 74 3a 20 7b 20 20 20 2f 2a 20 6a 75 6d 70 20  xt: {   /* jump 
2f360 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  */.  sqlite3_vta
2f370 62 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73  b *pVtab;.  cons
2f380 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
2f390 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e 74   *pModule;.  int
2f3a0 20 72 65 73 3b 0a 20 20 56 64 62 65 43 75 72 73   res;.  VdbeCurs
2f3b0 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 72 65 73  or *pCur;..  res
2f3c0 20 3d 20 30 3b 0a 20 20 70 43 75 72 20 3d 20 70   = 0;.  pCur = p
2f3d0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
2f3e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2f3f0 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 3b  ->pVtabCursor );
2f400 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 75 6c  .  if( pCur->nul
2f410 6c 52 6f 77 20 29 7b 0a 20 20 20 20 62 72 65 61  lRow ){.    brea
2f420 6b 3b 0a 20 20 7d 0a 20 20 70 56 74 61 62 20 3d  k;.  }.  pVtab =
2f430 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73   pCur->pVtabCurs
2f440 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f  or->pVtab;.  pMo
2f450 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d  dule = pVtab->pM
2f460 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  odule;.  assert(
2f470 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 20   pModule->xNext 
2f480 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  );..  /* Invoke 
2f490 74 68 65 20 78 4e 65 78 74 28 29 20 6d 65 74 68  the xNext() meth
2f4a0 6f 64 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c 65  od of the module
2f4b0 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 77 61  . There is no wa
2f4c0 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 75  y for the.  ** u
2f4d0 6e 64 65 72 6c 79 69 6e 67 20 69 6d 70 6c 65 6d  nderlying implem
2f4e0 65 6e 74 61 74 69 6f 6e 20 74 6f 20 72 65 74 75  entation to retu
2f4f0 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6f  rn an error if o
2f500 6e 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ne occurs during
2f510 0a 20 20 2a 2a 20 78 4e 65 78 74 28 29 2e 20 49  .  ** xNext(). I
2f520 6e 73 74 65 61 64 2c 20 69 66 20 61 6e 20 65 72  nstead, if an er
2f530 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 72 75 65  ror occurs, true
2f540 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 69 6e   is returned (in
2f550 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 0a 20  dicating that . 
2f560 20 2a 2a 20 64 61 74 61 20 69 73 20 61 76 61 69   ** data is avai
2f570 6c 61 62 6c 65 29 20 61 6e 64 20 74 68 65 20 65  lable) and the e
2f580 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
2f590 65 64 20 77 68 65 6e 20 78 43 6f 6c 75 6d 6e 20  ed when xColumn 
2f5a0 6f 72 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 74 68  or.  ** some oth
2f5b0 65 72 20 6d 65 74 68 6f 64 20 69 73 20 6e 65 78  er method is nex
2f5c0 74 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68 65  t invoked on the
2f5d0 20 73 61 76 65 20 76 69 72 74 75 61 6c 20 74 61   save virtual ta
2f5e0 62 6c 65 20 63 75 72 73 6f 72 2e 0a 20 20 2a 2f  ble cursor..  */
2f5f0 0a 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68  .  p->inVtabMeth
2f600 6f 64 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 70  od = 1;.  rc = p
2f610 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 28 70 43  Module->xNext(pC
2f620 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 29  ur->pVtabCursor)
2f630 3b 0a 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74  ;.  p->inVtabMet
2f640 68 6f 64 20 3d 20 30 3b 0a 20 20 69 6d 70 6f 72  hod = 0;.  impor
2f650 74 56 74 61 62 45 72 72 4d 73 67 28 70 2c 20 70  tVtabErrMsg(p, p
2f660 56 74 61 62 29 3b 0a 20 20 69 66 28 20 72 63 3d  Vtab);.  if( rc=
2f670 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f680 20 20 72 65 73 20 3d 20 70 4d 6f 64 75 6c 65 2d    res = pModule-
2f690 3e 78 45 6f 66 28 70 43 75 72 2d 3e 70 56 74 61  >xEof(pCur->pVta
2f6a0 62 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 0a 20  bCursor);.  }.. 
2f6b0 20 69 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20   if( !res ){.   
2f6c0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2f6d0 64 61 74 61 2c 20 6a 75 6d 70 20 74 6f 20 50 32  data, jump to P2
2f6e0 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 70 4f 70   */.    pc = pOp
2f6f0 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  ->p2 - 1;.  }.  
2f700 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
2f710 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
2f720 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
2f730 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2f740 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2f750 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 52 65 6e  ./* Opcode: VRen
2f760 61 6d 65 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a  ame P1 * * P4 *.
2f770 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f  **.** P4 is a po
2f780 69 6e 74 65 72 20 74 6f 20 61 20 76 69 72 74 75  inter to a virtu
2f790 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 2c  al table object,
2f7a0 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
2f7b0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54   structure..** T
2f7c0 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b  his opcode invok
2f7d0 65 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  es the correspon
2f7e0 64 69 6e 67 20 78 52 65 6e 61 6d 65 20 6d 65 74  ding xRename met
2f7f0 68 6f 64 2e 20 54 68 65 20 76 61 6c 75 65 0a 2a  hod. The value.*
2f800 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  * in register P1
2f810 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
2f820 65 20 7a 4e 61 6d 65 20 61 72 67 75 6d 65 6e 74  e zName argument
2f830 20 74 6f 20 74 68 65 20 78 52 65 6e 61 6d 65 20   to the xRename 
2f840 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 63 61 73 65 20  method..*/.case 
2f850 4f 50 5f 56 52 65 6e 61 6d 65 3a 20 7b 0a 20 20  OP_VRename: {.  
2f860 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
2f870 74 61 62 3b 0a 20 20 4d 65 6d 20 2a 70 4e 61 6d  tab;.  Mem *pNam
2f880 65 3b 0a 0a 20 20 70 56 74 61 62 20 3d 20 70 4f  e;..  pVtab = pO
2f890 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74  p->p4.pVtab->pVt
2f8a0 61 62 3b 0a 20 20 70 4e 61 6d 65 20 3d 20 26 61  ab;.  pName = &a
2f8b0 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
2f8c0 61 73 73 65 72 74 28 20 70 56 74 61 62 2d 3e 70  assert( pVtab->p
2f8d0 4d 6f 64 75 6c 65 2d 3e 78 52 65 6e 61 6d 65 20  Module->xRename 
2f8e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  );.  assert( mem
2f8f0 49 73 56 61 6c 69 64 28 70 4e 61 6d 65 29 20 29  IsValid(pName) )
2f900 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41  ;.  REGISTER_TRA
2f910 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70 4e 61 6d  CE(pOp->p1, pNam
2f920 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  e);.  assert( pN
2f930 61 6d 65 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ame->flags & MEM
2f940 5f 53 74 72 20 29 3b 0a 20 20 74 65 73 74 63 61  _Str );.  testca
2f950 73 65 28 20 70 4e 61 6d 65 2d 3e 65 6e 63 3d 3d  se( pName->enc==
2f960 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20  SQLITE_UTF8 );. 
2f970 20 74 65 73 74 63 61 73 65 28 20 70 4e 61 6d 65   testcase( pName
2f980 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
2f990 46 31 36 42 45 20 29 3b 0a 20 20 74 65 73 74 63  F16BE );.  testc
2f9a0 61 73 65 28 20 70 4e 61 6d 65 2d 3e 65 6e 63 3d  ase( pName->enc=
2f9b0 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20  =SQLITE_UTF16LE 
2f9c0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2f9d0 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64  3VdbeChangeEncod
2f9e0 69 6e 67 28 70 4e 61 6d 65 2c 20 53 51 4c 49 54  ing(pName, SQLIT
2f9f0 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 72  E_UTF8);.  if( r
2fa00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2fa10 20 20 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e      rc = pVtab->
2fa20 70 4d 6f 64 75 6c 65 2d 3e 78 52 65 6e 61 6d 65  pModule->xRename
2fa30 28 70 56 74 61 62 2c 20 70 4e 61 6d 65 2d 3e 7a  (pVtab, pName->z
2fa40 29 3b 0a 20 20 20 20 69 6d 70 6f 72 74 56 74 61  );.    importVta
2fa50 62 45 72 72 4d 73 67 28 70 2c 20 70 56 74 61 62  bErrMsg(p, pVtab
2fa60 29 3b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  );.    p->expire
2fa70 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 62 72 65  d = 0;.  }.  bre
2fa80 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ak;.}.#endif..#i
2fa90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2faa0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
2fab0 2a 20 4f 70 63 6f 64 65 3a 20 56 55 70 64 61 74  * Opcode: VUpdat
2fac0 65 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  e P1 P2 P3 P4 *.
2fad0 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f  **.** P4 is a po
2fae0 69 6e 74 65 72 20 74 6f 20 61 20 76 69 72 74 75  inter to a virtu
2faf0 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 2c  al table object,
2fb00 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
2fb10 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54   structure..** T
2fb20 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b  his opcode invok
2fb30 65 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  es the correspon
2fb40 64 69 6e 67 20 78 55 70 64 61 74 65 20 6d 65 74  ding xUpdate met
2fb50 68 6f 64 2e 20 50 32 20 76 61 6c 75 65 73 0a 2a  hod. P2 values.*
2fb60 2a 20 61 72 65 20 63 6f 6e 74 69 67 75 6f 75 73  * are contiguous
2fb70 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 73 74   memory cells st
2fb80 61 72 74 69 6e 67 20 61 74 20 50 33 20 74 6f 20  arting at P3 to 
2fb90 70 61 73 73 20 74 6f 20 74 68 65 20 78 55 70 64  pass to the xUpd
2fba0 61 74 65 20 0a 2a 2a 20 69 6e 76 6f 63 61 74 69  ate .** invocati
2fbb0 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 69 6e  on. The value in
2fbc0 20 72 65 67 69 73 74 65 72 20 28 50 33 2b 50 32   register (P3+P2
2fbd0 2d 31 29 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  -1) corresponds 
2fbe0 74 6f 20 74 68 65 20 0a 2a 2a 20 70 32 74 68 20  to the .** p2th 
2fbf0 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61  element of the a
2fc00 72 67 76 20 61 72 72 61 79 20 70 61 73 73 65 64  rgv array passed
2fc10 20 74 6f 20 78 55 70 64 61 74 65 2e 0a 2a 2a 0a   to xUpdate..**.
2fc20 2a 2a 20 54 68 65 20 78 55 70 64 61 74 65 20 6d  ** The xUpdate m
2fc30 65 74 68 6f 64 20 77 69 6c 6c 20 64 6f 20 61 20  ethod will do a 
2fc40 44 45 4c 45 54 45 20 6f 72 20 61 6e 20 49 4e 53  DELETE or an INS
2fc50 45 52 54 20 6f 72 20 62 6f 74 68 2e 0a 2a 2a 20  ERT or both..** 
2fc60 54 68 65 20 61 72 67 76 5b 30 5d 20 65 6c 65 6d  The argv[0] elem
2fc70 65 6e 74 20 28 77 68 69 63 68 20 63 6f 72 72 65  ent (which corre
2fc80 73 70 6f 6e 64 73 20 74 6f 20 6d 65 6d 6f 72 79  sponds to memory
2fc90 20 63 65 6c 6c 20 50 33 29 0a 2a 2a 20 69 73 20   cell P3).** is 
2fca0 74 68 65 20 72 6f 77 69 64 20 6f 66 20 61 20 72  the rowid of a r
2fcb0 6f 77 20 74 6f 20 64 65 6c 65 74 65 2e 20 20 49  ow to delete.  I
2fcc0 66 20 61 72 67 76 5b 30 5d 20 69 73 20 4e 55 4c  f argv[0] is NUL
2fcd0 4c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 64 65  L then no .** de
2fce0 6c 65 74 69 6f 6e 20 6f 63 63 75 72 73 2e 20 20  letion occurs.  
2fcf0 54 68 65 20 61 72 67 76 5b 31 5d 20 65 6c 65 6d  The argv[1] elem
2fd00 65 6e 74 20 69 73 20 74 68 65 20 72 6f 77 69 64  ent is the rowid
2fd10 20 6f 66 20 74 68 65 20 6e 65 77 20 0a 2a 2a 20   of the new .** 
2fd20 72 6f 77 2e 20 20 54 68 69 73 20 63 61 6e 20 62  row.  This can b
2fd30 65 20 4e 55 4c 4c 20 74 6f 20 68 61 76 65 20 74  e NULL to have t
2fd40 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
2fd50 20 73 65 6c 65 63 74 20 74 68 65 20 6e 65 77 20   select the new 
2fd60 0a 2a 2a 20 72 6f 77 69 64 20 66 6f 72 20 69 74  .** rowid for it
2fd70 73 65 6c 66 2e 20 20 54 68 65 20 73 75 62 73 65  self.  The subse
2fd80 71 75 65 6e 74 20 65 6c 65 6d 65 6e 74 73 20 69  quent elements i
2fd90 6e 20 74 68 65 20 61 72 72 61 79 20 61 72 65 20  n the array are 
2fda0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 6f  .** the values o
2fdb0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
2fdc0 20 6e 65 77 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20   new row..**.** 
2fdd0 49 66 20 50 32 3d 3d 31 20 74 68 65 6e 20 6e 6f  If P2==1 then no
2fde0 20 69 6e 73 65 72 74 20 69 73 20 70 65 72 66 6f   insert is perfo
2fdf0 72 6d 65 64 2e 20 20 61 72 67 76 5b 30 5d 20 69  rmed.  argv[0] i
2fe00 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 0a 2a  s the rowid of.*
2fe10 2a 20 61 20 72 6f 77 20 74 6f 20 64 65 6c 65 74  * a row to delet
2fe20 65 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61  e..**.** P1 is a
2fe30 20 62 6f 6f 6c 65 61 6e 20 66 6c 61 67 2e 20 49   boolean flag. I
2fe40 66 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 74  f it is set to t
2fe50 72 75 65 20 61 6e 64 20 74 68 65 20 78 55 70 64  rue and the xUpd
2fe60 61 74 65 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 73  ate call.** is s
2fe70 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 6e 20  uccessful, then 
2fe80 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
2fe90 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6c 61  ed by sqlite3_la
2fea0 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
2feb0 29 20 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ) .** is set to 
2fec0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2fed0 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 72   rowid for the r
2fee0 6f 77 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64  ow just inserted
2fef0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 55 70  ..*/.case OP_VUp
2ff00 64 61 74 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65  date: {.  sqlite
2ff10 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20  3_vtab *pVtab;. 
2ff20 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
2ff30 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e 74 20  *pModule;.  int 
2ff40 6e 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  nArg;.  int i;. 
2ff50 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f   sqlite_int64 ro
2ff60 77 69 64 3b 0a 20 20 4d 65 6d 20 2a 2a 61 70 41  wid;.  Mem **apA
2ff70 72 67 3b 0a 20 20 4d 65 6d 20 2a 70 58 3b 0a 0a  rg;.  Mem *pX;..
2ff80 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2ff90 32 3d 3d 31 20 20 20 20 20 20 20 20 7c 7c 20 70  2==1        || p
2ffa0 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 46 61 69 6c 20  Op->p5==OE_Fail 
2ffb0 20 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45    || pOp->p5==OE
2ffc0 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20  _Rollback .     
2ffd0 20 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45    || pOp->p5==OE
2ffe0 5f 41 62 6f 72 74 20 7c 7c 20 70 4f 70 2d 3e 70  _Abort || pOp->p
2fff0 35 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 7c 7c 20  5==OE_Ignore || 
30000 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 52 65 70 6c  pOp->p5==OE_Repl
30010 61 63 65 0a 20 20 29 3b 0a 20 20 70 56 74 61 62  ace.  );.  pVtab
30020 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62   = pOp->p4.pVtab
30030 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64 75  ->pVtab;.  pModu
30040 6c 65 20 3d 20 28 73 71 6c 69 74 65 33 5f 6d 6f  le = (sqlite3_mo
30050 64 75 6c 65 20 2a 29 70 56 74 61 62 2d 3e 70 4d  dule *)pVtab->pM
30060 6f 64 75 6c 65 3b 0a 20 20 6e 41 72 67 20 3d 20  odule;.  nArg = 
30070 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72  pOp->p2;.  asser
30080 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
30090 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 69 66 28  P4_VTAB );.  if(
300a0 20 41 4c 57 41 59 53 28 70 4d 6f 64 75 6c 65 2d   ALWAYS(pModule-
300b0 3e 78 55 70 64 61 74 65 29 20 29 7b 0a 20 20 20  >xUpdate) ){.   
300c0 20 75 38 20 76 74 61 62 4f 6e 43 6f 6e 66 6c 69   u8 vtabOnConfli
300d0 63 74 20 3d 20 64 62 2d 3e 76 74 61 62 4f 6e 43  ct = db->vtabOnC
300e0 6f 6e 66 6c 69 63 74 3b 0a 20 20 20 20 61 70 41  onflict;.    apA
300f0 72 67 20 3d 20 70 2d 3e 61 70 41 72 67 3b 0a 20  rg = p->apArg;. 
30100 20 20 20 70 58 20 3d 20 26 61 4d 65 6d 5b 70 4f     pX = &aMem[pO
30110 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 66 6f 72 28  p->p3];.    for(
30120 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
30130 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
30140 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 58 29 20   memIsValid(pX) 
30150 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62 6f 75  );.      memAbou
30160 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 58 29  tToChange(p, pX)
30170 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
30180 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28  dbeMemStoreType(
30190 70 58 29 3b 0a 20 20 20 20 20 20 61 70 41 72 67  pX);.      apArg
301a0 5b 69 5d 20 3d 20 70 58 3b 0a 20 20 20 20 20 20  [i] = pX;.      
301b0 70 58 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pX++;.    }.    
301c0 64 62 2d 3e 76 74 61 62 4f 6e 43 6f 6e 66 6c 69  db->vtabOnConfli
301d0 63 74 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20  ct = pOp->p5;.  
301e0 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e    rc = pModule->
301f0 78 55 70 64 61 74 65 28 70 56 74 61 62 2c 20 6e  xUpdate(pVtab, n
30200 41 72 67 2c 20 61 70 41 72 67 2c 20 26 72 6f 77  Arg, apArg, &row
30210 69 64 29 3b 0a 20 20 20 20 64 62 2d 3e 76 74 61  id);.    db->vta
30220 62 4f 6e 43 6f 6e 66 6c 69 63 74 20 3d 20 76 74  bOnConflict = vt
30230 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 3b 0a 20 20  abOnConflict;.  
30240 20 20 69 6d 70 6f 72 74 56 74 61 62 45 72 72 4d    importVtabErrM
30250 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20  sg(p, pVtab);.  
30260 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30270 5f 4f 4b 20 26 26 20 70 4f 70 2d 3e 70 31 20 29  _OK && pOp->p1 )
30280 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
30290 6e 41 72 67 3e 31 20 26 26 20 61 70 41 72 67 5b  nArg>1 && apArg[
302a0 30 5d 20 26 26 20 28 61 70 41 72 67 5b 30 5d 2d  0] && (apArg[0]-
302b0 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 29  >flags&MEM_Null)
302c0 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 61   );.      db->la
302d0 73 74 52 6f 77 69 64 20 3d 20 6c 61 73 74 52 6f  stRowid = lastRo
302e0 77 69 64 20 3d 20 72 6f 77 69 64 3b 0a 20 20 20  wid = rowid;.   
302f0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
30300 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
30310 20 26 26 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61   && pOp->p4.pVta
30320 62 2d 3e 62 43 6f 6e 73 74 72 61 69 6e 74 20 29  b->bConstraint )
30330 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
30340 3e 70 35 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29  >p5==OE_Ignore )
30350 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
30360 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
30370 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
30380 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
30390 28 28 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 52 65  ((pOp->p5==OE_Re
303a0 70 6c 61 63 65 29 20 3f 20 4f 45 5f 41 62 6f 72  place) ? OE_Abor
303b0 74 20 3a 20 70 4f 70 2d 3e 70 35 29 3b 0a 20 20  t : pOp->p5);.  
303c0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
303d0 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
303e0 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
303f0 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
30400 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
30410 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
30420 0a 23 69 66 6e 64 65 66 20 20 53 51 4c 49 54 45  .#ifndef  SQLITE
30430 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
30440 4d 41 53 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50  MAS./* Opcode: P
30450 61 67 65 63 6f 75 6e 74 20 50 31 20 50 32 20 2a  agecount P1 P2 *
30460 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65   * *.**.** Write
30470 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d   the current num
30480 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
30490 64 61 74 61 62 61 73 65 20 50 31 20 74 6f 20 6d  database P1 to m
304a0 65 6d 6f 72 79 20 63 65 6c 6c 20 50 32 2e 0a 2a  emory cell P2..*
304b0 2f 0a 63 61 73 65 20 4f 50 5f 50 61 67 65 63 6f  /.case OP_Pageco
304c0 75 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20  unt: {          
304d0 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c    /* out2-prerel
304e0 65 61 73 65 20 2a 2f 0a 20 20 70 4f 75 74 2d 3e  ease */.  pOut->
304f0 75 2e 69 20 3d 20 73 71 6c 69 74 65 33 42 74 72  u.i = sqlite3Btr
30500 65 65 4c 61 73 74 50 61 67 65 28 64 62 2d 3e 61  eeLastPage(db->a
30510 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 29  Db[pOp->p1].pBt)
30520 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
30530 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 20 53  dif...#ifndef  S
30540 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
30550 5f 50 52 41 47 4d 41 53 0a 2f 2a 20 4f 70 63 6f  _PRAGMAS./* Opco
30560 64 65 3a 20 4d 61 78 50 67 63 6e 74 20 50 31 20  de: MaxPgcnt P1 
30570 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
30580 54 72 79 20 74 6f 20 73 65 74 20 74 68 65 20 6d  Try to set the m
30590 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
305a0 74 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 50  t for database P
305b0 31 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  1 to the value i
305c0 6e 20 50 33 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20  n P3..** Do not 
305d0 6c 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  let the maximum 
305e0 70 61 67 65 20 63 6f 75 6e 74 20 66 61 6c 6c 20  page count fall 
305f0 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
30600 74 20 70 61 67 65 20 63 6f 75 6e 74 20 61 6e 64  t page count and
30610 0a 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67  .** do not chang
30620 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  e the maximum pa
30630 67 65 20 63 6f 75 6e 74 20 76 61 6c 75 65 20 69  ge count value i
30640 66 20 50 33 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 53  f P3==0..**.** S
30650 74 6f 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  tore the maximum
30660 20 70 61 67 65 20 63 6f 75 6e 74 20 61 66 74 65   page count afte
30670 72 20 74 68 65 20 63 68 61 6e 67 65 20 69 6e 20  r the change in 
30680 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a  register P2..*/.
30690 63 61 73 65 20 4f 50 5f 4d 61 78 50 67 63 6e 74  case OP_MaxPgcnt
306a0 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
306b0 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73  * out2-prereleas
306c0 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
306d0 69 6e 74 20 6e 65 77 4d 61 78 3b 0a 20 20 42 74  int newMax;.  Bt
306e0 72 65 65 20 2a 70 42 74 3b 0a 0a 20 20 70 42 74  ree *pBt;..  pBt
306f0 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e   = db->aDb[pOp->
30700 70 31 5d 2e 70 42 74 3b 0a 20 20 6e 65 77 4d 61  p1].pBt;.  newMa
30710 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 70  x = 0;.  if( pOp
30720 2d 3e 70 33 20 29 7b 0a 20 20 20 20 6e 65 77 4d  ->p3 ){.    newM
30730 61 78 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ax = sqlite3Btre
30740 65 4c 61 73 74 50 61 67 65 28 70 42 74 29 3b 0a  eLastPage(pBt);.
30750 20 20 20 20 69 66 28 20 6e 65 77 4d 61 78 20 3c      if( newMax <
30760 20 28 75 6e 73 69 67 6e 65 64 29 70 4f 70 2d 3e   (unsigned)pOp->
30770 70 33 20 29 20 6e 65 77 4d 61 78 20 3d 20 28 75  p3 ) newMax = (u
30780 6e 73 69 67 6e 65 64 29 70 4f 70 2d 3e 70 33 3b  nsigned)pOp->p3;
30790 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69  .  }.  pOut->u.i
307a0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
307b0 61 78 50 61 67 65 43 6f 75 6e 74 28 70 42 74 2c  axPageCount(pBt,
307c0 20 6e 65 77 4d 61 78 29 3b 0a 20 20 62 72 65 61   newMax);.  brea
307d0 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  k;.}.#endif...#i
307e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
307f0 54 5f 54 52 41 43 45 0a 2f 2a 20 4f 70 63 6f 64  T_TRACE./* Opcod
30800 65 3a 20 54 72 61 63 65 20 2a 20 2a 20 2a 20 50  e: Trace * * * P
30810 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 61  4 *.**.** If tra
30820 63 69 6e 67 20 69 73 20 65 6e 61 62 6c 65 64 20  cing is enabled 
30830 28 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f  (by the sqlite3_
30840 74 72 61 63 65 28 29 29 20 69 6e 74 65 72 66 61  trace()) interfa
30850 63 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ce, then.** the 
30860 55 54 46 2d 38 20 73 74 72 69 6e 67 20 63 6f 6e  UTF-8 string con
30870 74 61 69 6e 65 64 20 69 6e 20 50 34 20 69 73 20  tained in P4 is 
30880 65 6d 69 74 74 65 64 20 6f 6e 20 74 68 65 20 74  emitted on the t
30890 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  race callback..*
308a0 2f 0a 63 61 73 65 20 4f 50 5f 54 72 61 63 65 3a  /.case OP_Trace:
308b0 20 7b 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63   {.  char *zTrac
308c0 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  e;.  char *z;.. 
308d0 20 69 66 28 20 64 62 2d 3e 78 54 72 61 63 65 20   if( db->xTrace 
308e0 26 26 20 28 7a 54 72 61 63 65 20 3d 20 28 70 4f  && (zTrace = (pO
308f0 70 2d 3e 70 34 2e 7a 20 3f 20 70 4f 70 2d 3e 70  p->p4.z ? pOp->p
30900 34 2e 7a 20 3a 20 70 2d 3e 7a 53 71 6c 29 29 21  4.z : p->zSql))!
30910 3d 30 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71  =0 ){.    z = sq
30920 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53  lite3VdbeExpandS
30930 71 6c 28 70 2c 20 7a 54 72 61 63 65 29 3b 0a 20  ql(p, zTrace);. 
30940 20 20 20 64 62 2d 3e 78 54 72 61 63 65 28 64 62     db->xTrace(db
30950 2d 3e 70 54 72 61 63 65 41 72 67 2c 20 7a 29 3b  ->pTraceArg, z);
30960 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
30970 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 7d 0a 23  ee(db, z);.  }.#
30980 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
30990 55 47 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  UG.  if( (db->fl
309a0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 71 6c  ags & SQLITE_Sql
309b0 54 72 61 63 65 29 21 3d 30 0a 20 20 20 26 26 20  Trace)!=0.   && 
309c0 28 7a 54 72 61 63 65 20 3d 20 28 70 4f 70 2d 3e  (zTrace = (pOp->
309d0 70 34 2e 7a 20 3f 20 70 4f 70 2d 3e 70 34 2e 7a  p4.z ? pOp->p4.z
309e0 20 3a 20 70 2d 3e 7a 53 71 6c 29 29 21 3d 30 0a   : p->zSql))!=0.
309f0 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
30a00 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 51 4c  DebugPrintf("SQL
30a10 2d 74 72 61 63 65 3a 20 25 73 5c 6e 22 2c 20 7a  -trace: %s\n", z
30a20 54 72 61 63 65 29 3b 0a 20 20 7d 0a 23 65 6e 64  Trace);.  }.#end
30a30 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
30a40 55 47 20 2a 2f 0a 20 20 62 72 65 61 6b 3b 0a 7d  UG */.  break;.}
30a50 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 4f 70 63  .#endif.../* Opc
30a60 6f 64 65 3a 20 4e 6f 6f 70 20 2a 20 2a 20 2a 20  ode: Noop * * * 
30a70 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  * *.**.** Do not
30a80 68 69 6e 67 2e 20 20 54 68 69 73 20 69 6e 73 74  hing.  This inst
30a90 72 75 63 74 69 6f 6e 20 69 73 20 6f 66 74 65 6e  ruction is often
30aa0 20 75 73 65 66 75 6c 20 61 73 20 61 20 6a 75 6d   useful as a jum
30ab0 70 0a 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e  p.** destination
30ac0 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  ..*/./*.** The m
30ad0 61 67 69 63 20 45 78 70 6c 61 69 6e 20 6f 70 63  agic Explain opc
30ae0 6f 64 65 20 61 72 65 20 6f 6e 6c 79 20 69 6e 73  ode are only ins
30af0 65 72 74 65 64 20 77 68 65 6e 20 65 78 70 6c 61  erted when expla
30b00 69 6e 3d 3d 32 20 28 77 68 69 63 68 0a 2a 2a 20  in==2 (which.** 
30b10 69 73 20 74 6f 20 73 61 79 20 77 68 65 6e 20 74  is to say when t
30b20 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  he EXPLAIN QUERY
30b30 20 50 4c 41 4e 20 73 79 6e 74 61 78 20 69 73 20   PLAN syntax is 
30b40 75 73 65 64 2e 29 0a 2a 2a 20 54 68 69 73 20 6f  used.).** This o
30b50 70 63 6f 64 65 20 72 65 63 6f 72 64 73 20 69 6e  pcode records in
30b60 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
30b70 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 49  he optimizer.  I
30b80 74 20 69 73 20 74 68 65 0a 2a 2a 20 74 68 65 20  t is the.** the 
30b90 73 61 6d 65 20 61 73 20 61 20 6e 6f 2d 6f 70 2e  same as a no-op.
30ba0 20 20 54 68 69 73 20 6f 70 63 6f 64 65 73 6e 65    This opcodesne
30bb0 76 65 72 20 61 70 70 65 61 72 73 20 69 6e 20 61  ver appears in a
30bc0 20 72 65 61 6c 20 56 4d 20 70 72 6f 67 72 61 6d   real VM program
30bd0 2e 0a 2a 2f 0a 64 65 66 61 75 6c 74 3a 20 7b 20  ..*/.default: { 
30be0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
30bf0 20 69 73 20 72 65 61 6c 6c 79 20 4f 50 5f 4e 6f   is really OP_No
30c00 6f 70 20 61 6e 64 20 4f 50 5f 45 78 70 6c 61 69  op and OP_Explai
30c10 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  n */.  assert( p
30c20 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e  Op->opcode==OP_N
30c30 6f 6f 70 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f  oop || pOp->opco
30c40 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de==OP_Explain )
30c50 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
30c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
30cb0 54 68 65 20 63 61 73 65 73 20 6f 66 20 74 68 65  The cases of the
30cc0 20 73 77 69 74 63 68 20 73 74 61 74 65 6d 65 6e   switch statemen
30cd0 74 20 61 62 6f 76 65 20 74 68 69 73 20 6c 69 6e  t above this lin
30ce0 65 20 73 68 6f 75 6c 64 20 61 6c 6c 20 62 65 20  e should all be 
30cf0 69 6e 64 65 6e 74 65 64 0a 2a 2a 20 62 79 20 36  indented.** by 6
30d00 20 73 70 61 63 65 73 2e 20 20 42 75 74 20 74 68   spaces.  But th
30d10 65 20 6c 65 66 74 2d 6d 6f 73 74 20 36 20 73 70  e left-most 6 sp
30d20 61 63 65 73 20 68 61 76 65 20 62 65 65 6e 20 72  aces have been r
30d30 65 6d 6f 76 65 64 20 74 6f 20 69 6d 70 72 6f 76  emoved to improv
30d40 65 20 74 68 65 0a 2a 2a 20 72 65 61 64 61 62 69  e the.** readabi
30d50 6c 69 74 79 2e 20 20 46 72 6f 6d 20 74 68 69 73  lity.  From this
30d60 20 70 6f 69 6e 74 20 6f 6e 20 64 6f 77 6e 2c 20   point on down, 
30d70 74 68 65 20 6e 6f 72 6d 61 6c 20 69 6e 64 65 6e  the normal inden
30d80 74 61 74 69 6f 6e 20 72 75 6c 65 73 20 61 72 65  tation rules are
30d90 0a 2a 2a 20 72 65 73 74 6f 72 65 64 2e 0a 2a 2a  .** restored..**
30da0 2a 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 2f 0a 20 20 20  ***********/.   
30df0 20 7d 0a 0a 23 69 66 64 65 66 20 56 44 42 45 5f   }..#ifdef VDBE_
30e00 50 52 4f 46 49 4c 45 0a 20 20 20 20 7b 0a 20 20  PROFILE.    {.  
30e10 20 20 20 20 75 36 34 20 65 6c 61 70 73 65 64 20      u64 elapsed 
30e20 3d 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28  = sqlite3Hwtime(
30e30 29 20 2d 20 73 74 61 72 74 3b 0a 20 20 20 20 20  ) - start;.     
30e40 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 2b 3d 20   pOp->cycles += 
30e50 65 6c 61 70 73 65 64 3b 0a 20 20 20 20 20 20 70  elapsed;.      p
30e60 4f 70 2d 3e 63 6e 74 2b 2b 3b 0a 23 69 66 20 30  Op->cnt++;.#if 0
30e70 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
30e80 28 73 74 64 6f 75 74 2c 20 22 25 31 30 6c 6c 75  (stdout, "%10llu
30e90 20 22 2c 20 65 6c 61 70 73 65 64 29 3b 0a 20 20   ", elapsed);.  
30ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30eb0 65 50 72 69 6e 74 4f 70 28 73 74 64 6f 75 74 2c  ePrintOp(stdout,
30ec0 20 6f 72 69 67 50 63 2c 20 26 61 4f 70 5b 6f 72   origPc, &aOp[or
30ed0 69 67 50 63 5d 29 3b 0a 23 65 6e 64 69 66 0a 20  igPc]);.#endif. 
30ee0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
30ef0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
30f00 67 20 63 6f 64 65 20 61 64 64 73 20 6e 6f 74 68  g code adds noth
30f10 69 6e 67 20 74 6f 20 74 68 65 20 61 63 74 75 61  ing to the actua
30f20 6c 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 0a  l functionality.
30f30 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72      ** of the pr
30f40 6f 67 72 61 6d 2e 20 20 49 74 20 69 73 20 6f 6e  ogram.  It is on
30f50 6c 79 20 68 65 72 65 20 66 6f 72 20 74 65 73 74  ly here for test
30f60 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
30f70 67 2e 0a 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65  g..    ** On the
30f80 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 74 20   other hand, it 
30f90 64 6f 65 73 20 62 75 72 6e 20 43 50 55 20 63 79  does burn CPU cy
30fa0 63 6c 65 73 20 65 76 65 72 79 20 74 69 6d 65 20  cles every time 
30fb0 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74  through.    ** t
30fc0 68 65 20 65 76 61 6c 75 61 74 6f 72 20 6c 6f 6f  he evaluator loo
30fd0 70 2e 20 20 53 6f 20 77 65 20 63 61 6e 20 6c 65  p.  So we can le
30fe0 61 76 65 20 69 74 20 6f 75 74 20 77 68 65 6e 20  ave it out when 
30ff0 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  NDEBUG is define
31000 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  d..    */.#ifnde
31010 66 20 4e 44 45 42 55 47 0a 20 20 20 20 61 73 73  f NDEBUG.    ass
31020 65 72 74 28 20 70 63 3e 3d 2d 31 20 26 26 20 70  ert( pc>=-1 && p
31030 63 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 0a 23 69 66  c<p->nOp );..#if
31040 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
31050 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 72 61 63  .    if( p->trac
31060 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  e ){.      if( r
31070 63 21 3d 30 20 29 20 66 70 72 69 6e 74 66 28 70  c!=0 ) fprintf(p
31080 2d 3e 74 72 61 63 65 2c 22 72 63 3d 25 64 5c 6e  ->trace,"rc=%d\n
31090 22 2c 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28  ",rc);.      if(
310a0 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20   pOp->opflags & 
310b0 28 4f 50 46 4c 47 5f 4f 55 54 32 5f 50 52 45 52  (OPFLG_OUT2_PRER
310c0 45 4c 45 41 53 45 7c 4f 50 46 4c 47 5f 4f 55 54  ELEASE|OPFLG_OUT
310d0 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  2) ){.        re
310e0 67 69 73 74 65 72 54 72 61 63 65 28 70 2d 3e 74  gisterTrace(p->t
310f0 72 61 63 65 2c 20 70 4f 70 2d 3e 70 32 2c 20 26  race, pOp->p2, &
31100 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b 0a  aMem[pOp->p2]);.
31110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
31120 28 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26  ( pOp->opflags &
31130 20 4f 50 46 4c 47 5f 4f 55 54 33 20 29 7b 0a 20   OPFLG_OUT3 ){. 
31140 20 20 20 20 20 20 20 72 65 67 69 73 74 65 72 54         registerT
31150 72 61 63 65 28 70 2d 3e 74 72 61 63 65 2c 20 70  race(p->trace, p
31160 4f 70 2d 3e 70 33 2c 20 26 61 4d 65 6d 5b 70 4f  Op->p3, &aMem[pO
31170 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20 7d  p->p3]);.      }
31180 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 20 2f  .    }.#endif  /
31190 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
311a0 2f 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45  /.#endif  /* NDE
311b0 42 55 47 20 2a 2f 0a 20 20 7d 20 20 2f 2a 20 54  BUG */.  }  /* T
311c0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 6f  he end of the fo
311d0 72 28 3b 3b 29 20 6c 6f 6f 70 20 74 68 65 20 6c  r(;;) loop the l
311e0 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 6f 70 63  oops through opc
311f0 6f 64 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  odes */..  /* If
31200 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
31210 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
31220 68 61 74 20 65 78 65 63 75 74 69 6f 6e 20 69 73  hat execution is
31230 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 0a 20   finished with. 
31240 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 66 20   ** an error of 
31250 73 6f 6d 65 20 6b 69 6e 64 2e 0a 20 20 2a 2f 0a  some kind..  */.
31260 76 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3a  vdbe_error_halt:
31270 0a 20 20 61 73 73 65 72 74 28 20 72 63 20 29 3b  .  assert( rc );
31280 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  .  p->rc = rc;. 
31290 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
312a0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
312b0 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Log!=0 );.  sqli
312c0 74 65 33 5f 6c 6f 67 28 72 63 2c 20 22 73 74 61  te3_log(rc, "sta
312d0 74 65 6d 65 6e 74 20 61 62 6f 72 74 73 20 61 74  tement aborts at
312e0 20 25 64 3a 20 5b 25 73 5d 20 25 73 22 2c 20 0a   %d: [%s] %s", .
312f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31300 20 20 20 70 63 2c 20 70 2d 3e 7a 53 71 6c 2c 20     pc, p->zSql, 
31310 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  p->zErrMsg);.  s
31320 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
31330 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
31340 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
31350 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ) db->mallocFail
31360 65 64 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 53  ed = 1;.  rc = S
31370 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69  QLITE_ERROR;.  i
31380 66 28 20 72 65 73 65 74 53 63 68 65 6d 61 4f 6e  f( resetSchemaOn
31390 46 61 75 6c 74 3e 30 20 29 7b 0a 20 20 20 20 73  Fault>0 ){.    s
313a0 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
313b0 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 72 65  nalSchema(db, re
313c0 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74  setSchemaOnFault
313d0 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  -1);.  }..  /* T
313e0 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
313f0 77 61 79 20 6f 75 74 20 6f 66 20 74 68 69 73 20  way out of this 
31400 70 72 6f 63 65 64 75 72 65 2e 20 20 57 65 20 68  procedure.  We h
31410 61 76 65 20 74 6f 0a 20 20 2a 2a 20 72 65 6c 65  ave to.  ** rele
31420 61 73 65 20 74 68 65 20 6d 75 74 65 78 65 73 20  ase the mutexes 
31430 6f 6e 20 62 74 72 65 65 73 20 74 68 61 74 20 77  on btrees that w
31440 65 72 65 20 61 63 71 75 69 72 65 64 20 61 74 20  ere acquired at 
31450 74 68 65 0a 20 20 2a 2a 20 74 6f 70 2e 20 2a 2f  the.  ** top. */
31460 0a 76 64 62 65 5f 72 65 74 75 72 6e 3a 0a 20 20  .vdbe_return:.  
31470 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
31480 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 73 71 6c  lastRowid;.  sql
31490 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
314a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ;.  return rc;..
314b0 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
314c0 65 20 69 66 20 61 20 73 74 72 69 6e 67 20 6f 72  e if a string or
314d0 20 62 6c 6f 62 20 6c 61 72 67 65 72 20 74 68 61   blob larger tha
314e0 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  n SQLITE_MAX_LEN
314f0 47 54 48 0a 20 20 2a 2a 20 69 73 20 65 6e 63 6f  GTH.  ** is enco
31500 75 6e 74 65 72 65 64 2e 0a 20 20 2a 2f 0a 74 6f  untered..  */.to
31510 6f 5f 62 69 67 3a 0a 20 20 73 71 6c 69 74 65 33  o_big:.  sqlite3
31520 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
31530 72 72 4d 73 67 2c 20 64 62 2c 20 22 73 74 72 69  rrMsg, db, "stri
31540 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62  ng or blob too b
31550 69 67 22 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c  ig");.  rc = SQL
31560 49 54 45 5f 54 4f 4f 42 49 47 3b 0a 20 20 67 6f  ITE_TOOBIG;.  go
31570 74 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68 61  to vdbe_error_ha
31580 6c 74 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  lt;..  /* Jump t
31590 6f 20 68 65 72 65 20 69 66 20 61 20 6d 61 6c 6c  o here if a mall
315a0 6f 63 28 29 20 66 61 69 6c 73 2e 0a 20 20 2a 2f  oc() fails..  */
315b0 0a 6e 6f 5f 6d 65 6d 3a 0a 20 20 64 62 2d 3e 6d  .no_mem:.  db->m
315c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
315d0 0a 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72  .  sqlite3SetStr
315e0 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
315f0 20 64 62 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d   db, "out of mem
31600 6f 72 79 22 29 3b 0a 20 20 72 63 20 3d 20 53 51  ory");.  rc = SQ
31610 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 67 6f  LITE_NOMEM;.  go
31620 74 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68 61  to vdbe_error_ha
31630 6c 74 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  lt;..  /* Jump t
31640 6f 20 68 65 72 65 20 66 6f 72 20 61 6e 79 20 6f  o here for any o
31650 74 68 65 72 20 6b 69 6e 64 20 6f 66 20 66 61 74  ther kind of fat
31660 61 6c 20 65 72 72 6f 72 2e 20 20 54 68 65 20 22  al error.  The "
31670 72 63 22 20 76 61 72 69 61 62 6c 65 0a 20 20 2a  rc" variable.  *
31680 2a 20 73 68 6f 75 6c 64 20 68 6f 6c 64 20 74 68  * should hold th
31690 65 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 2e 0a  e error number..
316a0 20 20 2a 2f 0a 61 62 6f 72 74 5f 64 75 65 5f 74    */.abort_due_t
316b0 6f 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72  o_error:.  asser
316c0 74 28 20 70 2d 3e 7a 45 72 72 4d 73 67 3d 3d 30  t( p->zErrMsg==0
316d0 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   );.  if( db->ma
316e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 63 20  llocFailed ) rc 
316f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
31700 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31710 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a  _IOERR_NOMEM ){.
31720 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
31730 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
31740 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69  , db, "%s", sqli
31750 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a  te3ErrStr(rc));.
31760 20 20 7d 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f    }.  goto vdbe_
31770 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 0a 20 20 2f  error_halt;..  /
31780 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
31790 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
317a0 74 65 72 72 75 70 74 28 29 20 41 50 49 20 73 65  terrupt() API se
317b0 74 73 20 74 68 65 20 69 6e 74 65 72 72 75 70 74  ts the interrupt
317c0 0a 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20 2a 2f  .  ** flag..  */
317d0 0a 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 69 6e  .abort_due_to_in
317e0 74 65 72 72 75 70 74 3a 0a 20 20 61 73 73 65 72  terrupt:.  asser
317f0 74 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  t( db->u1.isInte
31800 72 72 75 70 74 65 64 20 29 3b 0a 20 20 72 63 20  rrupted );.  rc 
31810 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
31820 50 54 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63  PT;.  p->rc = rc
31830 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 74 53 74  ;.  sqlite3SetSt
31840 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
31850 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69  , db, "%s", sqli
31860 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a  te3ErrStr(rc));.
31870 20 20 67 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f    goto vdbe_erro
31880 72 5f 68 61 6c 74 3b 0a 7d 0a                    r_halt;.}.