/ Hex Artifact Content
Login

Artifact 9970b726e045a4098b41009ab35d3528cef7c79e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ******.** The co
0180: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
0190: 69 6d 70 6c 65 6d 65 6e 74 73 20 65 78 65 63 75  implements execu
01a0: 74 69 6f 6e 20 6d 65 74 68 6f 64 20 6f 66 20 74  tion method of t
01b0: 68 65 20 0a 2a 2a 20 56 69 72 74 75 61 6c 20 44  he .** Virtual D
01c0: 61 74 61 62 61 73 65 20 45 6e 67 69 6e 65 20 28  atabase Engine (
01d0: 56 44 42 45 29 2e 20 20 41 20 73 65 70 61 72 61  VDBE).  A separa
01e0: 74 65 20 66 69 6c 65 20 28 22 76 64 62 65 61 75  te file ("vdbeau
01f0: 78 2e 63 22 29 0a 2a 2a 20 68 61 6e 64 6c 65 73  x.c").** handles
0200: 20 68 6f 75 73 65 6b 65 65 70 69 6e 67 20 64 65   housekeeping de
0210: 74 61 69 6c 73 20 73 75 63 68 20 61 73 20 63 72  tails such as cr
0220: 65 61 74 69 6e 67 20 61 6e 64 20 64 65 6c 65 74  eating and delet
0230: 69 6e 67 0a 2a 2a 20 56 44 42 45 20 69 6e 73 74  ing.** VDBE inst
0240: 61 6e 63 65 73 2e 20 20 54 68 69 73 20 66 69 6c  ances.  This fil
0250: 65 20 69 73 20 73 6f 6c 65 6c 79 20 69 6e 74 65  e is solely inte
0260: 72 65 73 74 65 64 20 69 6e 20 65 78 65 63 75 74  rested in execut
0270: 69 6e 67 0a 2a 2a 20 74 68 65 20 56 44 42 45 20  ing.** the VDBE 
0280: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
0290: 6e 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 69  n the external i
02a0: 6e 74 65 72 66 61 63 65 2c 20 61 6e 20 22 73 71  nterface, an "sq
02b0: 6c 69 74 65 33 5f 73 74 6d 74 2a 22 20 69 73 20  lite3_stmt*" is 
02c0: 61 6e 20 6f 70 61 71 75 65 20 70 6f 69 6e 74 65  an opaque pointe
02d0: 72 0a 2a 2a 20 74 6f 20 61 20 56 44 42 45 2e 0a  r.** to a VDBE..
02e0: 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 20 70 61  **.** The SQL pa
02f0: 72 73 65 72 20 67 65 6e 65 72 61 74 65 73 20 61  rser generates a
0300: 20 70 72 6f 67 72 61 6d 20 77 68 69 63 68 20 69   program which i
0310: 73 20 74 68 65 6e 20 65 78 65 63 75 74 65 64 20  s then executed 
0320: 62 79 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 74  by.** the VDBE t
0330: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
0340: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
0350: 6e 74 2e 20 20 56 44 42 45 20 70 72 6f 67 72 61  nt.  VDBE progra
0360: 6d 73 20 61 72 65 20 0a 2a 2a 20 73 69 6d 69 6c  ms are .** simil
0370: 61 72 20 69 6e 20 66 6f 72 6d 20 74 6f 20 61 73  ar in form to as
0380: 73 65 6d 62 6c 79 20 6c 61 6e 67 75 61 67 65 2e  sembly language.
0390: 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 63 6f    The program co
03a0: 6e 73 69 73 74 73 20 6f 66 0a 2a 2a 20 61 20 6c  nsists of.** a l
03b0: 69 6e 65 61 72 20 73 65 71 75 65 6e 63 65 20 6f  inear sequence o
03c0: 66 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 45  f operations.  E
03d0: 61 63 68 20 6f 70 65 72 61 74 69 6f 6e 20 68 61  ach operation ha
03e0: 73 20 61 6e 20 6f 70 63 6f 64 65 20 0a 2a 2a 20  s an opcode .** 
03f0: 61 6e 64 20 35 20 6f 70 65 72 61 6e 64 73 2e 20  and 5 operands. 
0400: 20 4f 70 65 72 61 6e 64 73 20 50 31 2c 20 50 32   Operands P1, P2
0410: 2c 20 61 6e 64 20 50 33 20 61 72 65 20 69 6e 74  , and P3 are int
0420: 65 67 65 72 73 2e 20 20 4f 70 65 72 61 6e 64 20  egers.  Operand 
0430: 50 34 20 0a 2a 2a 20 69 73 20 61 20 6e 75 6c 6c  P4 .** is a null
0440: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
0450: 6e 67 2e 20 20 4f 70 65 72 61 6e 64 20 50 35 20  ng.  Operand P5 
0460: 69 73 20 61 6e 20 75 6e 73 69 67 6e 65 64 20 63  is an unsigned c
0470: 68 61 72 61 63 74 65 72 2e 0a 2a 2a 20 46 65 77  haracter..** Few
0480: 20 6f 70 63 6f 64 65 73 20 75 73 65 20 61 6c 6c   opcodes use all
0490: 20 35 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2a 0a   5 operands..**.
04a0: 2a 2a 20 43 6f 6d 70 75 74 61 74 69 6f 6e 20 72  ** Computation r
04b0: 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
04c0: 64 20 6f 6e 20 61 20 73 65 74 20 6f 66 20 72 65  d on a set of re
04d0: 67 69 73 74 65 72 73 20 6e 75 6d 62 65 72 65 64  gisters numbered
04e0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69   beginning.** wi
04f0: 74 68 20 31 20 61 6e 64 20 67 6f 69 6e 67 20 75  th 1 and going u
0500: 70 20 74 6f 20 56 64 62 65 2e 6e 4d 65 6d 2e 20  p to Vdbe.nMem. 
0510: 20 45 61 63 68 20 72 65 67 69 73 74 65 72 20 63   Each register c
0520: 61 6e 20 73 74 6f 72 65 0a 2a 2a 20 65 69 74 68  an store.** eith
0530: 65 72 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61  er an integer, a
0540: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
0550: 20 73 74 72 69 6e 67 2c 20 61 20 66 6c 6f 61 74   string, a float
0560: 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d  ing point.** num
0570: 62 65 72 2c 20 6f 72 20 74 68 65 20 53 51 4c 20  ber, or the SQL 
0580: 22 4e 55 4c 4c 22 20 76 61 6c 75 65 2e 20 20 41  "NULL" value.  A
0590: 6e 20 69 6d 70 6c 69 63 69 74 20 63 6f 6e 76 65  n implicit conve
05a0: 72 73 69 6f 6e 20 66 72 6f 6d 20 6f 6e 65 0a 2a  rsion from one.*
05b0: 2a 20 74 79 70 65 20 74 6f 20 74 68 65 20 6f 74  * type to the ot
05c0: 68 65 72 20 6f 63 63 75 72 73 20 61 73 20 6e 65  her occurs as ne
05d0: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 0a 2a 2a 20  cessary..** .** 
05e0: 4d 6f 73 74 20 6f 66 20 74 68 65 20 63 6f 64 65  Most of the code
05f0: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69 73   in this file is
0600: 20 74 61 6b 65 6e 20 75 70 20 62 79 20 74 68 65   taken up by the
0610: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
0620: 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  ().** function w
0630: 68 69 63 68 20 64 6f 65 73 20 74 68 65 20 77 6f  hich does the wo
0640: 72 6b 20 6f 66 20 69 6e 74 65 72 70 72 65 74 69  rk of interpreti
0650: 6e 67 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  ng a VDBE progra
0660: 6d 2e 0a 2a 2a 20 42 75 74 20 6f 74 68 65 72 20  m..** But other 
0670: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 73  routines are als
0680: 6f 20 70 72 6f 76 69 64 65 64 20 74 6f 20 68 65  o provided to he
0690: 6c 70 20 69 6e 20 62 75 69 6c 64 69 6e 67 20 75  lp in building u
06a0: 70 0a 2a 2a 20 61 20 70 72 6f 67 72 61 6d 20 69  p.** a program i
06b0: 6e 73 74 72 75 63 74 69 6f 6e 20 62 79 20 69 6e  nstruction by in
06c0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
06d0: 20 56 61 72 69 6f 75 73 20 73 63 72 69 70 74 73   Various scripts
06e0: 20 73 63 61 6e 20 74 68 69 73 20 73 6f 75 72 63   scan this sourc
06f0: 65 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  e file in order 
0700: 74 6f 20 67 65 6e 65 72 61 74 65 20 48 54 4d 4c  to generate HTML
0710: 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .** documentatio
0720: 6e 2c 20 68 65 61 64 65 72 73 20 66 69 6c 65 73  n, headers files
0730: 2c 20 6f 72 20 6f 74 68 65 72 20 64 65 72 69 76  , or other deriv
0740: 65 64 20 66 69 6c 65 73 2e 20 20 54 68 65 20 66  ed files.  The f
0750: 6f 72 6d 61 74 74 69 6e 67 0a 2a 2a 20 6f 66 20  ormatting.** of 
0760: 74 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73  the code in this
0770: 20 66 69 6c 65 20 69 73 2c 20 74 68 65 72 65 66   file is, theref
0780: 6f 72 65 2c 20 69 6d 70 6f 72 74 61 6e 74 2e 20  ore, important. 
0790: 20 53 65 65 20 6f 74 68 65 72 20 63 6f 6d 6d 65   See other comme
07a0: 6e 74 73 0a 2a 2a 20 69 6e 20 74 68 69 73 20 66  nts.** in this f
07b0: 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ile for details.
07c0: 20 20 49 66 20 69 6e 20 64 6f 75 62 74 2c 20 64    If in doubt, d
07d0: 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72  o not deviate fr
07e0: 6f 6d 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 63  om existing.** c
07f0: 6f 6d 6d 65 6e 74 69 6e 67 20 61 6e 64 20 69 6e  ommenting and in
0800: 64 65 6e 74 61 74 69 6f 6e 20 70 72 61 63 74 69  dentation practi
0810: 63 65 73 20 77 68 65 6e 20 63 68 61 6e 67 69 6e  ces when changin
0820: 67 20 6f 72 20 61 64 64 69 6e 67 20 63 6f 64 65  g or adding code
0830: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
0840: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0850: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
0860: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
0870: 68 69 73 20 6d 61 63 72 6f 20 6f 6e 20 6d 65 6d  his macro on mem
0880: 6f 72 79 20 63 65 6c 6c 73 20 6a 75 73 74 20 70  ory cells just p
0890: 72 69 6f 72 20 74 6f 20 63 68 61 6e 67 69 6e 67  rior to changing
08a0: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
08b0: 20 74 68 65 20 63 65 6c 6c 2e 20 20 54 68 69 73   the cell.  This
08c0: 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73 20   macro verifies 
08d0: 74 68 61 74 20 73 68 61 6c 6c 6f 77 20 63 6f 70  that shallow cop
08e0: 69 65 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 6d  ies are.** not m
08f0: 69 73 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65  isused..*/.#ifde
0900: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 23  f SQLITE_DEBUG.#
0910: 20 64 65 66 69 6e 65 20 6d 65 6d 41 62 6f 75 74   define memAbout
0920: 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 20 73 71  ToChange(P,M) sq
0930: 6c 69 74 65 33 56 64 62 65 4d 65 6d 41 62 6f 75  lite3VdbeMemAbou
0940: 74 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 0a 23  tToChange(P,M).#
0950: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6d 65  else.# define me
0960: 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 50  mAboutToChange(P
0970: 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,M).#endif../*.*
0980: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
0990: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
09a0: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 65  is incremented e
09b0: 76 65 72 79 20 74 69 6d 65 20 61 20 63 75 72 73  very time a curs
09c0: 6f 72 0a 2a 2a 20 6d 6f 76 65 73 2c 20 65 69 74  or.** moves, eit
09d0: 68 65 72 20 62 79 20 74 68 65 20 4f 50 5f 53 65  her by the OP_Se
09e0: 65 6b 58 58 2c 20 4f 50 5f 4e 65 78 74 2c 20 6f  ekXX, OP_Next, o
09f0: 72 20 4f 50 5f 50 72 65 76 20 6f 70 63 6f 64 65  r OP_Prev opcode
0a00: 73 2e 20 20 54 68 65 20 74 65 73 74 0a 2a 2a 20  s.  The test.** 
0a10: 70 72 6f 63 65 64 75 72 65 73 20 75 73 65 20 74  procedures use t
0a20: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
0a30: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
0a40: 74 20 69 6e 64 69 63 65 73 20 61 72 65 0a 2a 2a  t indices are.**
0a50: 20 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 74   working correct
0a60: 6c 79 2e 20 20 54 68 69 73 20 76 61 72 69 61 62  ly.  This variab
0a70: 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69  le has no functi
0a80: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f  on other than to
0a90: 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79 20  .** help verify 
0aa0: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
0ab0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62  ation of the lib
0ac0: 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  rary..*/.#ifdef 
0ad0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
0ae0: 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
0af0: 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
0b00: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
0b10: 73 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  s global variabl
0b20: 65 20 69 73 20 70 6f 73 69 74 69 76 65 2c 20 69  e is positive, i
0b30: 74 20 67 65 74 73 20 64 65 63 72 65 6d 65 6e 74  t gets decrement
0b40: 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 0a 2a  ed once before.*
0b50: 2a 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  * each instructi
0b60: 6f 6e 20 69 6e 20 74 68 65 20 56 44 42 45 2e 20  on in the VDBE. 
0b70: 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
0b80: 20 7a 65 72 6f 2c 20 74 68 65 20 75 31 2e 69 73   zero, the u1.is
0b90: 49 6e 74 65 72 72 75 70 74 65 64 0a 2a 2a 20 66  Interrupted.** f
0ba0: 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69  ield of the sqli
0bb0: 74 65 33 20 73 74 72 75 63 74 75 72 65 20 69 73  te3 structure is
0bc0: 20 73 65 74 20 69 6e 20 6f 72 64 65 72 20 74 6f   set in order to
0bd0: 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6e 74   simulate an int
0be0: 65 72 72 75 70 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  errupt..**.** Th
0bf0: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 75  is facility is u
0c00: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
0c10: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
0c20: 49 74 20 64 6f 65 73 20 6e 6f 74 20 66 75 6e 63  It does not func
0c30: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 6e 20 6f 72  tion.** in an or
0c40: 64 69 6e 61 72 79 20 62 75 69 6c 64 2e 0a 2a 2f  dinary build..*/
0c50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
0c60: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
0c70: 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 20  interrupt_count 
0c80: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
0c90: 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f 62  ** The next glob
0ca0: 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
0cb0: 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68 20  ncremented each 
0cc0: 74 79 70 65 20 74 68 65 20 4f 50 5f 53 6f 72 74  type the OP_Sort
0cd0: 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65 78   opcode.** is ex
0ce0: 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65 73  ecuted.  The tes
0cf0: 74 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 65  t procedures use
0d00: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
0d10: 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  n to make sure t
0d20: 68 61 74 0a 2a 2a 20 73 6f 72 74 69 6e 67 20 69  hat.** sorting i
0d30: 73 20 6f 63 63 75 72 72 69 6e 67 20 6f 72 20 6e  s occurring or n
0d40: 6f 74 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20  ot occurring at 
0d50: 61 70 70 72 6f 70 72 69 61 74 65 20 74 69 6d 65  appropriate time
0d60: 73 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62  s.   This variab
0d70: 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75 6e  le.** has no fun
0d80: 63 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ction other than
0d90: 20 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79 20   to help verify 
0da0: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
0db0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
0dc0: 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64  library..*/.#ifd
0dd0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
0de0: 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f  nt sqlite3_sort_
0df0: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0e00: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  f../*.** The nex
0e10: 74 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  t global variabl
0e20: 65 20 72 65 63 6f 72 64 73 20 74 68 65 20 73 69  e records the si
0e30: 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73  ze of the larges
0e40: 74 20 4d 45 4d 5f 42 6c 6f 62 0a 2a 2a 20 6f 72  t MEM_Blob.** or
0e50: 20 4d 45 4d 5f 53 74 72 20 74 68 61 74 20 68 61   MEM_Str that ha
0e60: 73 20 62 65 65 6e 20 75 73 65 64 20 62 79 20 61  s been used by a
0e70: 20 56 44 42 45 20 6f 70 63 6f 64 65 2e 20 20 54   VDBE opcode.  T
0e80: 68 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72  he test procedur
0e90: 65 73 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 69  es.** use this i
0ea0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6d 61  nformation to ma
0eb0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
0ec0: 20 7a 65 72 6f 2d 62 6c 6f 62 20 66 75 6e 63 74   zero-blob funct
0ed0: 69 6f 6e 61 6c 69 74 79 0a 2a 2a 20 69 73 20 77  ionality.** is w
0ee0: 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 74 6c 79  orking correctly
0ef0: 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62 6c  .   This variabl
0f00: 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69 6f  e has no functio
0f10: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f 0a  n other than to.
0f20: 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79 20 74  ** help verify t
0f30: 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
0f40: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62 72  tion of the libr
0f50: 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ary..*/.#ifdef S
0f60: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
0f70: 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73  qlite3_max_blobs
0f80: 69 7a 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ize = 0;.static 
0f90: 76 6f 69 64 20 75 70 64 61 74 65 4d 61 78 42 6c  void updateMaxBl
0fa0: 6f 62 73 69 7a 65 28 4d 65 6d 20 2a 70 29 7b 0a  obsize(Mem *p){.
0fb0: 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20    if( (p->flags 
0fc0: 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  & (MEM_Str|MEM_B
0fd0: 6c 6f 62 29 29 21 3d 30 20 26 26 20 70 2d 3e 6e  lob))!=0 && p->n
0fe0: 3e 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f  >sqlite3_max_blo
0ff0: 62 73 69 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c  bsize ){.    sql
1000: 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a  ite3_max_blobsiz
1010: 65 20 3d 20 70 2d 3e 6e 3b 0a 20 20 7d 0a 7d 0a  e = p->n;.  }.}.
1020: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1030: 65 20 6e 65 78 74 20 67 6c 6f 62 61 6c 20 76 61  e next global va
1040: 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
1050: 65 6e 74 65 64 20 65 61 63 68 20 74 79 70 65 20  ented each type 
1060: 74 68 65 20 4f 50 5f 46 6f 75 6e 64 20 6f 70 63  the OP_Found opc
1070: 6f 64 65 0a 2a 2a 20 69 73 20 65 78 65 63 75 74  ode.** is execut
1080: 65 64 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  ed. This is used
1090: 20 74 6f 20 74 65 73 74 20 77 68 65 74 68 65 72   to test whether
10a0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 66 6f 72 65   or not the fore
10b0: 69 67 6e 20 6b 65 79 0a 2a 2a 20 6f 70 65 72 61  ign key.** opera
10c0: 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  tion implemented
10d0: 20 75 73 69 6e 67 20 4f 50 5f 46 6b 49 73 5a 65   using OP_FkIsZe
10e0: 72 6f 20 69 73 20 77 6f 72 6b 69 6e 67 2e 20 54  ro is working. T
10f0: 68 69 73 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  his variable.** 
1100: 68 61 73 20 6e 6f 20 66 75 6e 63 74 69 6f 6e 20  has no function 
1110: 6f 74 68 65 72 20 74 68 61 6e 20 74 6f 20 68 65  other than to he
1120: 6c 70 20 76 65 72 69 66 79 20 74 68 65 20 63 6f  lp verify the co
1130: 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
1140: 6f 66 20 74 68 65 0a 2a 2a 20 6c 69 62 72 61 72  of the.** librar
1150: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
1160: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
1170: 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74  ite3_found_count
1180: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
1190: 0a 2a 2a 20 54 65 73 74 20 61 20 72 65 67 69 73  .** Test a regis
11a0: 74 65 72 20 74 6f 20 73 65 65 20 69 66 20 69 74  ter to see if it
11b0: 20 65 78 63 65 65 64 73 20 74 68 65 20 63 75 72   exceeds the cur
11c0: 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 62 6c 6f  rent maximum blo
11d0: 62 20 73 69 7a 65 2e 0a 2a 2a 20 49 66 20 69 74  b size..** If it
11e0: 20 64 6f 65 73 2c 20 72 65 63 6f 72 64 20 74 68   does, record th
11f0: 65 20 6e 65 77 20 6d 61 78 69 6d 75 6d 20 62 6c  e new maximum bl
1200: 6f 62 20 73 69 7a 65 2e 0a 2a 2f 0a 23 69 66 20  ob size..*/.#if 
1210: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1220: 45 53 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  EST) && !defined
1230: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49  (SQLITE_OMIT_BUI
1240: 4c 54 49 4e 5f 54 45 53 54 29 0a 23 20 64 65 66  LTIN_TEST).# def
1250: 69 6e 65 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ine UPDATE_MAX_B
1260: 4c 4f 42 53 49 5a 45 28 50 29 20 20 75 70 64 61  LOBSIZE(P)  upda
1270: 74 65 4d 61 78 42 6c 6f 62 73 69 7a 65 28 50 29  teMaxBlobsize(P)
1280: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1290: 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
12a0: 49 5a 45 28 50 29 0a 23 65 6e 64 69 66 0a 0a 2f  IZE(P).#endif../
12b0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65  *.** Convert the
12c0: 20 67 69 76 65 6e 20 72 65 67 69 73 74 65 72 20   given register 
12d0: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 69 66  into a string if
12e0: 20 69 74 20 69 73 6e 27 74 20 6f 6e 65 0a 2a 2a   it isn't one.**
12f0: 20 61 6c 72 65 61 64 79 2e 20 52 65 74 75 72 6e   already. Return
1300: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 6d   non-zero if a m
1310: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
1320: 2f 0a 23 64 65 66 69 6e 65 20 53 74 72 69 6e 67  /.#define String
1330: 69 66 79 28 50 2c 20 65 6e 63 29 20 5c 0a 20 20  ify(P, enc) \.  
1340: 20 69 66 28 28 28 50 29 2d 3e 66 6c 61 67 73 26   if(((P)->flags&
1350: 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
1360: 62 29 29 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  b))==0 && sqlite
1370: 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67 69 66  3VdbeMemStringif
1380: 79 28 50 2c 65 6e 63 29 29 20 5c 0a 20 20 20 20  y(P,enc)) \.    
1390: 20 7b 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 20   { goto no_mem; 
13a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 65 70 68 65  }../*.** An ephe
13b0: 6d 65 72 61 6c 20 73 74 72 69 6e 67 20 76 61 6c  meral string val
13c0: 75 65 20 28 73 69 67 6e 69 66 69 65 64 20 62 79  ue (signified by
13d0: 20 74 68 65 20 4d 45 4d 5f 45 70 68 65 6d 20 66   the MEM_Ephem f
13e0: 6c 61 67 29 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  lag) contains.**
13f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1400: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
1410: 63 61 74 65 64 20 73 74 72 69 6e 67 20 77 68 65  cated string whe
1420: 72 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 6e  re some other en
1430: 74 69 74 79 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tity.** is respo
1440: 6e 73 69 62 6c 65 20 66 6f 72 20 64 65 61 6c 6c  nsible for deall
1450: 6f 63 61 74 69 6e 67 20 74 68 61 74 20 73 74 72  ocating that str
1460: 69 6e 67 2e 20 20 42 65 63 61 75 73 65 20 74 68  ing.  Because th
1470: 65 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 64 6f  e register.** do
1480: 65 73 20 6e 6f 74 20 63 6f 6e 74 72 6f 6c 20 74  es not control t
1490: 68 65 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 69  he string, it mi
14a0: 67 68 74 20 62 65 20 64 65 6c 65 74 65 64 20 77  ght be deleted w
14b0: 69 74 68 6f 75 74 20 74 68 65 20 72 65 67 69 73  ithout the regis
14c0: 74 65 72 0a 2a 2a 20 6b 6e 6f 77 69 6e 67 20 69  ter.** knowing i
14d0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
14e0: 75 74 69 6e 65 20 63 6f 6e 76 65 72 74 73 20 61  utine converts a
14f0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69  n ephemeral stri
1500: 6e 67 20 69 6e 74 6f 20 61 20 64 79 6e 61 6d 69  ng into a dynami
1510: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 0a  cally allocated.
1520: 2a 2a 20 73 74 72 69 6e 67 20 74 68 61 74 20 74  ** string that t
1530: 68 65 20 72 65 67 69 73 74 65 72 20 69 74 73 65  he register itse
1540: 6c 66 20 63 6f 6e 74 72 6f 6c 73 2e 20 20 49 6e  lf controls.  In
1550: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74   other words, it
1560: 0a 2a 2a 20 63 6f 6e 76 65 72 74 73 20 61 6e 20  .** converts an 
1570: 4d 45 4d 5f 45 70 68 65 6d 20 73 74 72 69 6e 67  MEM_Ephem string
1580: 20 69 6e 74 6f 20 61 6e 20 4d 45 4d 5f 44 79 6e   into an MEM_Dyn
1590: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 23 64 65 66   string..*/.#def
15a0: 69 6e 65 20 44 65 65 70 68 65 6d 65 72 61 6c 69  ine Deephemerali
15b0: 7a 65 28 50 29 20 5c 0a 20 20 20 69 66 28 20 28  ze(P) \.   if( (
15c0: 28 50 29 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 45  (P)->flags&MEM_E
15d0: 70 68 65 6d 29 21 3d 30 20 5c 0a 20 20 20 20 20  phem)!=0 \.     
15e0: 20 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65    && sqlite3Vdbe
15f0: 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c 65  MemMakeWriteable
1600: 28 50 29 20 29 7b 20 67 6f 74 6f 20 6e 6f 5f 6d  (P) ){ goto no_m
1610: 65 6d 3b 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  em;}../* Return 
1620: 74 72 75 65 20 69 66 20 74 68 65 20 63 75 72 73  true if the curs
1630: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 75 73  or was opened us
1640: 69 6e 67 20 74 68 65 20 4f 50 5f 4f 70 65 6e 53  ing the OP_OpenS
1650: 6f 72 74 65 72 20 6f 70 63 6f 64 65 2e 20 2a 2f  orter opcode. */
1660: 0a 23 20 64 65 66 69 6e 65 20 69 73 53 6f 72 74  .# define isSort
1670: 65 72 28 78 29 20 28 28 78 29 2d 3e 70 53 6f 72  er(x) ((x)->pSor
1680: 74 65 72 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 41  ter!=0)../*.** A
1690: 72 67 75 6d 65 6e 74 20 70 4d 65 6d 20 70 6f 69  rgument pMem poi
16a0: 6e 74 73 20 61 74 20 61 20 72 65 67 69 73 74 65  nts at a registe
16b0: 72 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 70  r that will be p
16c0: 61 73 73 65 64 20 74 6f 20 61 0a 2a 2a 20 75 73  assed to a.** us
16d0: 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
16e0: 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 65 64 20  ion or returned 
16f0: 74 6f 20 74 68 65 20 75 73 65 72 20 61 73 20 74  to the user as t
1700: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 71  he result of a q
1710: 75 65 72 79 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  uery..** This ro
1720: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 70  utine sets the p
1730: 4d 65 6d 2d 3e 74 79 70 65 20 76 61 72 69 61 62  Mem->type variab
1740: 6c 65 20 75 73 65 64 20 62 79 20 74 68 65 20 73  le used by the s
1750: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 2a 28 29  qlite3_value_*()
1760: 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 2e 0a 2a   .** routines..*
1770: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
1780: 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28 4d  beMemStoreType(M
1790: 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e 74  em *pMem){.  int
17a0: 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66   flags = pMem->f
17b0: 6c 61 67 73 3b 0a 20 20 69 66 28 20 66 6c 61 67  lags;.  if( flag
17c0: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
17d0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
17e0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20   SQLITE_NULL;.  
17f0: 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 66 6c 61  }.  else if( fla
1800: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
1810: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
1820: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
1830: 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20  .  }.  else if( 
1840: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
1850: 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   ){.    pMem->ty
1860: 70 65 20 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  pe = SQLITE_FLOA
1870: 54 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  T;.  }.  else if
1880: 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ( flags & MEM_St
1890: 72 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  r ){.    pMem->t
18a0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
18b0: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
18c0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
18d0: 49 54 45 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 7d 0a  ITE_BLOB;.  }.}.
18e0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
18f0: 56 64 62 65 43 75 72 73 6f 72 20 6e 75 6d 62 65  VdbeCursor numbe
1900: 72 20 69 43 75 72 2e 20 20 52 65 74 75 72 6e 20  r iCur.  Return 
1910: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e  a pointer to it.
1920: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a    Return NULL.**
1930: 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
1940: 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  f memory..*/.sta
1950: 74 69 63 20 56 64 62 65 43 75 72 73 6f 72 20 2a  tic VdbeCursor *
1960: 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 0a  allocateCursor(.
1970: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
1980: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
1990: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a  irtual machine *
19a0: 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
19b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
19c0: 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 56 64  ex of the new Vd
19d0: 62 65 43 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e  beCursor */.  in
19e0: 74 20 6e 46 69 65 6c 64 2c 20 20 20 20 20 20 20  t nField,       
19f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a00: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 74   fields in the t
1a10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
1a20: 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20  .  int iDb,     
1a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1a40: 62 61 73 65 20 74 68 65 20 63 75 72 73 6f 72 20  base the cursor 
1a50: 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 6f 72 20 2d  belongs to, or -
1a60: 31 20 2a 2f 0a 20 20 69 6e 74 20 69 73 42 74 72  1 */.  int isBtr
1a70: 65 65 43 75 72 73 6f 72 20 20 20 20 20 2f 2a 20  eeCursor     /* 
1a80: 54 72 75 65 20 66 6f 72 20 42 2d 54 72 65 65 2e  True for B-Tree.
1a90: 20 20 46 61 6c 73 65 20 66 6f 72 20 70 73 65 75    False for pseu
1aa0: 64 6f 2d 74 61 62 6c 65 20 6f 72 20 76 74 61 62  do-table or vtab
1ab0: 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 46 69 6e 64   */.){.  /* Find
1ac0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
1ad0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
1ae0: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
1af0: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 0a 20  blob of memory. 
1b00: 20 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72   ** required for
1b10: 20 74 68 69 73 20 56 64 62 65 43 75 72 73 6f 72   this VdbeCursor
1b20: 20 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69   structure. It i
1b30: 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20  s convenient to 
1b40: 75 73 65 20 61 20 0a 20 20 2a 2a 20 76 64 62 65  use a .  ** vdbe
1b50: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   memory cell to 
1b60: 6d 61 6e 61 67 65 20 74 68 65 20 6d 65 6d 6f 72  manage the memor
1b70: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 65 71  y allocation req
1b80: 75 69 72 65 64 20 66 6f 72 20 61 0a 20 20 2a 2a  uired for a.  **
1b90: 20 56 64 62 65 43 75 72 73 6f 72 20 73 74 72 75   VdbeCursor stru
1ba0: 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 66 6f  cture for the fo
1bb0: 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a  llowing reasons:
1bc0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 53  .  **.  **   * S
1bd0: 6f 6d 65 74 69 6d 65 73 20 63 75 72 73 6f 72 20  ometimes cursor 
1be0: 6e 75 6d 62 65 72 73 20 61 72 65 20 75 73 65 64  numbers are used
1bf0: 20 66 6f 72 20 61 20 63 6f 75 70 6c 65 20 6f 66   for a couple of
1c00: 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20   different.  ** 
1c10: 20 20 20 20 70 75 72 70 6f 73 65 73 20 69 6e 20      purposes in 
1c20: 61 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20  a vdbe program. 
1c30: 54 68 65 20 64 69 66 66 65 72 65 6e 74 20 75 73  The different us
1c40: 65 73 20 6d 69 67 68 74 20 72 65 71 75 69 72 65  es might require
1c50: 0a 20 20 2a 2a 20 20 20 20 20 64 69 66 66 65 72  .  **     differ
1c60: 65 6e 74 20 73 69 7a 65 64 20 61 6c 6c 6f 63 61  ent sized alloca
1c70: 74 69 6f 6e 73 2e 20 4d 65 6d 6f 72 79 20 63 65  tions. Memory ce
1c80: 6c 6c 73 20 70 72 6f 76 69 64 65 20 67 72 6f 77  lls provide grow
1c90: 61 62 6c 65 0a 20 20 2a 2a 20 20 20 20 20 61 6c  able.  **     al
1ca0: 6c 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a  locations..  **.
1cb0: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 75 73    **   * When us
1cc0: 69 6e 67 20 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ing ENABLE_MEMOR
1cd0: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 2c 20 6d 65  Y_MANAGEMENT, me
1ce0: 6d 6f 72 79 20 63 65 6c 6c 20 62 75 66 66 65 72  mory cell buffer
1cf0: 73 20 63 61 6e 0a 20 20 2a 2a 20 20 20 20 20 62  s can.  **     b
1d00: 65 20 66 72 65 65 64 20 6c 61 7a 69 6c 79 20 76  e freed lazily v
1d10: 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 5f 72  ia the sqlite3_r
1d20: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20  elease_memory() 
1d30: 41 50 49 2e 20 54 68 69 73 0a 20 20 2a 2a 20 20  API. This.  **  
1d40: 20 20 20 6d 69 6e 69 6d 69 7a 65 73 20 74 68 65     minimizes the
1d50: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 6c 6c 6f   number of mallo
1d60: 63 20 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 20  c calls made by 
1d70: 74 68 65 20 73 79 73 74 65 6d 2e 0a 20 20 2a 2a  the system..  **
1d80: 0a 20 20 2a 2a 20 4d 65 6d 6f 72 79 20 63 65 6c  .  ** Memory cel
1d90: 6c 73 20 66 6f 72 20 63 75 72 73 6f 72 73 20 61  ls for cursors a
1da0: 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  re allocated at 
1db0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 61  the top of the a
1dc0: 64 64 72 65 73 73 0a 20 20 2a 2a 20 73 70 61 63  ddress.  ** spac
1dd0: 65 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28  e. Memory cell (
1de0: 70 2d 3e 6e 4d 65 6d 29 20 63 6f 72 72 65 73 70  p->nMem) corresp
1df0: 6f 6e 64 73 20 74 6f 20 63 75 72 73 6f 72 20 30  onds to cursor 0
1e00: 2e 20 53 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a  . Space for.  **
1e10: 20 63 75 72 73 6f 72 20 31 20 69 73 20 6d 61 6e   cursor 1 is man
1e20: 61 67 65 64 20 62 79 20 6d 65 6d 6f 72 79 20 63  aged by memory c
1e30: 65 6c 6c 20 28 70 2d 3e 6e 4d 65 6d 2d 31 29 2c  ell (p->nMem-1),
1e40: 20 65 74 63 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d   etc..  */.  Mem
1e50: 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65   *pMem = &p->aMe
1e60: 6d 5b 70 2d 3e 6e 4d 65 6d 2d 69 43 75 72 5d 3b  m[p->nMem-iCur];
1e70: 0a 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ..  int nByte;. 
1e80: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78   VdbeCursor *pCx
1e90: 20 3d 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20   = 0;.  nByte = 
1ea0: 0a 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69  .      ROUND8(si
1eb0: 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 29  zeof(VdbeCursor)
1ec0: 29 20 2b 20 0a 20 20 20 20 20 20 28 69 73 42 74  ) + .      (isBt
1ed0: 72 65 65 43 75 72 73 6f 72 3f 73 71 6c 69 74 65  reeCursor?sqlite
1ee0: 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
1ef0: 28 29 3a 30 29 20 2b 20 0a 20 20 20 20 20 20 32  ():0) + .      2
1f00: 2a 6e 46 69 65 6c 64 2a 73 69 7a 65 6f 66 28 75  *nField*sizeof(u
1f10: 33 32 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  32);..  assert( 
1f20: 69 43 75 72 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  iCur<p->nCursor 
1f30: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  );.  if( p->apCs
1f40: 72 5b 69 43 75 72 5d 20 29 7b 0a 20 20 20 20 73  r[iCur] ){.    s
1f50: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
1f60: 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43 73 72  rsor(p, p->apCsr
1f70: 5b 69 43 75 72 5d 29 3b 0a 20 20 20 20 70 2d 3e  [iCur]);.    p->
1f80: 61 70 43 73 72 5b 69 43 75 72 5d 20 3d 20 30 3b  apCsr[iCur] = 0;
1f90: 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
1fa0: 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62  E_OK==sqlite3Vdb
1fb0: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 6e  eMemGrow(pMem, n
1fc0: 42 79 74 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  Byte, 0) ){.    
1fd0: 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20 3d  p->apCsr[iCur] =
1fe0: 20 70 43 78 20 3d 20 28 56 64 62 65 43 75 72 73   pCx = (VdbeCurs
1ff0: 6f 72 2a 29 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20  or*)pMem->z;.   
2000: 20 6d 65 6d 73 65 74 28 70 43 78 2c 20 30 2c 20   memset(pCx, 0, 
2010: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
2020: 72 29 29 3b 0a 20 20 20 20 70 43 78 2d 3e 69 44  r));.    pCx->iD
2030: 62 20 3d 20 69 44 62 3b 0a 20 20 20 20 70 43 78  b = iDb;.    pCx
2040: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
2050: 64 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 65 6c  d;.    if( nFiel
2060: 64 20 29 7b 0a 20 20 20 20 20 20 70 43 78 2d 3e  d ){.      pCx->
2070: 61 54 79 70 65 20 3d 20 28 75 33 32 20 2a 29 26  aType = (u32 *)&
2080: 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38 28 73  pMem->z[ROUND8(s
2090: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
20a0: 29 29 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ))];.    }.    i
20b0: 66 28 20 69 73 42 74 72 65 65 43 75 72 73 6f 72  f( isBtreeCursor
20c0: 20 29 7b 0a 20 20 20 20 20 20 70 43 78 2d 3e 70   ){.      pCx->p
20d0: 43 75 72 73 6f 72 20 3d 20 28 42 74 43 75 72 73  Cursor = (BtCurs
20e0: 6f 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20 26  or*).          &
20f0: 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38 28 73  pMem->z[ROUND8(s
2100: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
2110: 29 29 2b 32 2a 6e 46 69 65 6c 64 2a 73 69 7a 65  ))+2*nField*size
2120: 6f 66 28 75 33 32 29 5d 3b 0a 20 20 20 20 20 20  of(u32)];.      
2130: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
2140: 6f 72 5a 65 72 6f 28 70 43 78 2d 3e 70 43 75 72  orZero(pCx->pCur
2150: 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  sor);.    }.  }.
2160: 20 20 72 65 74 75 72 6e 20 70 43 78 3b 0a 7d 0a    return pCx;.}.
2170: 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 63 6f  ./*.** Try to co
2180: 6e 76 65 72 74 20 61 20 76 61 6c 75 65 20 69 6e  nvert a value in
2190: 74 6f 20 61 20 6e 75 6d 65 72 69 63 20 72 65 70  to a numeric rep
21a0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 66 20 77  resentation if w
21b0: 65 20 63 61 6e 0a 2a 2a 20 64 6f 20 73 6f 20 77  e can.** do so w
21c0: 69 74 68 6f 75 74 20 6c 6f 73 73 20 6f 66 20 69  ithout loss of i
21d0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 6e 20  nformation.  In 
21e0: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
21f0: 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 6f  the string.** lo
2200: 6f 6b 73 20 6c 69 6b 65 20 61 20 6e 75 6d 62 65  oks like a numbe
2210: 72 2c 20 63 6f 6e 76 65 72 74 20 69 74 20 69 6e  r, convert it in
2220: 74 6f 20 61 20 6e 75 6d 62 65 72 2e 20 20 49 66  to a number.  If
2230: 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20   it does not.** 
2240: 6c 6f 6f 6b 20 6c 69 6b 65 20 61 20 6e 75 6d 62  look like a numb
2250: 65 72 2c 20 6c 65 61 76 65 20 69 74 20 61 6c 6f  er, leave it alo
2260: 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ne..*/.static vo
2270: 69 64 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41  id applyNumericA
2280: 66 66 69 6e 69 74 79 28 4d 65 6d 20 2a 70 52 65  ffinity(Mem *pRe
2290: 63 29 7b 0a 20 20 69 66 28 20 28 70 52 65 63 2d  c){.  if( (pRec-
22a0: 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65  >flags & (MEM_Re
22b0: 61 6c 7c 4d 45 4d 5f 49 6e 74 29 29 3d 3d 30 20  al|MEM_Int))==0 
22c0: 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 56  ){.    double rV
22d0: 61 6c 75 65 3b 0a 20 20 20 20 69 36 34 20 69 56  alue;.    i64 iV
22e0: 61 6c 75 65 3b 0a 20 20 20 20 75 38 20 65 6e 63  alue;.    u8 enc
22f0: 20 3d 20 70 52 65 63 2d 3e 65 6e 63 3b 0a 20 20   = pRec->enc;.  
2300: 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66 6c 61    if( (pRec->fla
2310: 67 73 26 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29  gs&MEM_Str)==0 )
2320: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28   return;.    if(
2330: 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 52 65   sqlite3AtoF(pRe
2340: 63 2d 3e 7a 2c 20 26 72 56 61 6c 75 65 2c 20 70  c->z, &rValue, p
2350: 52 65 63 2d 3e 6e 2c 20 65 6e 63 29 3d 3d 30 20  Rec->n, enc)==0 
2360: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
2370: 28 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69  ( 0==sqlite3Atoi
2380: 36 34 28 70 52 65 63 2d 3e 7a 2c 20 26 69 56 61  64(pRec->z, &iVa
2390: 6c 75 65 2c 20 70 52 65 63 2d 3e 6e 2c 20 65 6e  lue, pRec->n, en
23a0: 63 29 20 29 7b 0a 20 20 20 20 20 20 70 52 65 63  c) ){.      pRec
23b0: 2d 3e 75 2e 69 20 3d 20 69 56 61 6c 75 65 3b 0a  ->u.i = iValue;.
23c0: 20 20 20 20 20 20 70 52 65 63 2d 3e 66 6c 61 67        pRec->flag
23d0: 73 20 7c 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  s |= MEM_Int;.  
23e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
23f0: 52 65 63 2d 3e 72 20 3d 20 72 56 61 6c 75 65 3b  Rec->r = rValue;
2400: 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 66 6c 61  .      pRec->fla
2410: 67 73 20 7c 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a  gs |= MEM_Real;.
2420: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
2430: 2a 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 69 73  ** Processing is
2440: 20 64 65 74 65 72 6d 69 6e 65 20 62 79 20 74 68   determine by th
2450: 65 20 61 66 66 69 6e 69 74 79 20 70 61 72 61 6d  e affinity param
2460: 65 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  eter:.**.** SQLI
2470: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3a 0a  TE_AFF_INTEGER:.
2480: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  ** SQLITE_AFF_RE
2490: 41 4c 3a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  AL:.** SQLITE_AF
24a0: 46 5f 4e 55 4d 45 52 49 43 3a 0a 2a 2a 20 20 20  F_NUMERIC:.**   
24b0: 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20   Try to convert 
24c0: 70 52 65 63 20 74 6f 20 61 6e 20 69 6e 74 65 67  pRec to an integ
24d0: 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  er representatio
24e0: 6e 20 6f 72 20 61 20 0a 2a 2a 20 20 20 20 66 6c  n or a .**    fl
24f0: 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 72 65 70  oating-point rep
2500: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 66 20 61  resentation if a
2510: 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73  n integer repres
2520: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 69  entation.**    i
2530: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
2540: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 69   Note that the i
2550: 6e 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74  nteger represent
2560: 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 20 20 20 61  ation is.**    a
2570: 6c 77 61 79 73 20 70 72 65 66 65 72 72 65 64 2c  lways preferred,
2580: 20 65 76 65 6e 20 69 66 20 74 68 65 20 61 66 66   even if the aff
2590: 69 6e 69 74 79 20 69 73 20 52 45 41 4c 2c 20 62  inity is REAL, b
25a0: 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 61 6e 20  ecause.**    an 
25b0: 69 6e 74 65 67 65 72 20 72 65 70 72 65 73 65 6e  integer represen
25c0: 74 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 73  tation is more s
25d0: 70 61 63 65 20 65 66 66 69 63 69 65 6e 74 20 6f  pace efficient o
25e0: 6e 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 53 51  n disk..**.** SQ
25f0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 2a  LITE_AFF_TEXT:.*
2600: 2a 20 20 20 20 43 6f 6e 76 65 72 74 20 70 52 65  *    Convert pRe
2610: 63 20 74 6f 20 61 20 74 65 78 74 20 72 65 70 72  c to a text repr
2620: 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  esentation..**.*
2630: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
2640: 45 3a 0a 2a 2a 20 20 20 20 4e 6f 2d 6f 70 2e 20  E:.**    No-op. 
2650: 20 70 52 65 63 20 69 73 20 75 6e 63 68 61 6e 67   pRec is unchang
2660: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
2670: 69 64 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79  id applyAffinity
2680: 28 0a 20 20 4d 65 6d 20 2a 70 52 65 63 2c 20 20  (.  Mem *pRec,  
2690: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
26a0: 61 6c 75 65 20 74 6f 20 61 70 70 6c 79 20 61 66  alue to apply af
26b0: 66 69 6e 69 74 79 20 74 6f 20 2a 2f 0a 20 20 63  finity to */.  c
26c0: 68 61 72 20 61 66 66 69 6e 69 74 79 2c 20 20 20  har affinity,   
26d0: 20 20 20 2f 2a 20 54 68 65 20 61 66 66 69 6e 69     /* The affini
26e0: 74 79 20 74 6f 20 62 65 20 61 70 70 6c 69 65 64  ty to be applied
26f0: 20 2a 2f 0a 20 20 75 38 20 65 6e 63 20 20 20 20   */.  u8 enc    
2700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2710: 20 74 68 69 73 20 74 65 78 74 20 65 6e 63 6f 64   this text encod
2720: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ing */.){.  if( 
2730: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
2740: 5f 41 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20  _AFF_TEXT ){.   
2750: 20 2f 2a 20 4f 6e 6c 79 20 61 74 74 65 6d 70 74   /* Only attempt
2760: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
2770: 74 6f 20 54 45 58 54 20 69 66 20 74 68 65 72 65  to TEXT if there
2780: 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6f   is an integer o
2790: 72 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 72 65  r real.    ** re
27a0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 28 62 6c  presentation (bl
27b0: 6f 62 20 61 6e 64 20 4e 55 4c 4c 20 64 6f 20 6e  ob and NULL do n
27c0: 6f 74 20 67 65 74 20 63 6f 6e 76 65 72 74 65 64  ot get converted
27d0: 29 20 62 75 74 20 6e 6f 20 73 74 72 69 6e 67 0a  ) but no string.
27e0: 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74      ** represent
27f0: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
2800: 20 20 69 66 28 20 30 3d 3d 28 70 52 65 63 2d 3e    if( 0==(pRec->
2810: 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 20 26  flags&MEM_Str) &
2820: 26 20 28 70 52 65 63 2d 3e 66 6c 61 67 73 26 28  & (pRec->flags&(
2830: 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74  MEM_Real|MEM_Int
2840: 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  )) ){.      sqli
2850: 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67  te3VdbeMemString
2860: 69 66 79 28 70 52 65 63 2c 20 65 6e 63 29 3b 0a  ify(pRec, enc);.
2870: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 63 2d 3e      }.    pRec->
2880: 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 52  flags &= ~(MEM_R
2890: 65 61 6c 7c 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20  eal|MEM_Int);.  
28a0: 7d 65 6c 73 65 20 69 66 28 20 61 66 66 69 6e 69  }else if( affini
28b0: 74 79 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ty!=SQLITE_AFF_N
28c0: 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ONE ){.    asser
28d0: 74 28 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  t( affinity==SQL
28e0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
28f0: 7c 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  || affinity==SQL
2900: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20  ITE_AFF_REAL.   
2910: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 61 66 66            || aff
2920: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
2930: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
2940: 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66   applyNumericAff
2950: 69 6e 69 74 79 28 70 52 65 63 29 3b 0a 20 20 20  inity(pRec);.   
2960: 20 69 66 28 20 70 52 65 63 2d 3e 66 6c 61 67 73   if( pRec->flags
2970: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
2980: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2990: 49 6e 74 65 67 65 72 41 66 66 69 6e 69 74 79 28  IntegerAffinity(
29a0: 70 52 65 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pRec);.    }.  }
29b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
29c0: 20 63 6f 6e 76 65 72 74 20 74 68 65 20 74 79 70   convert the typ
29d0: 65 20 6f 66 20 61 20 66 75 6e 63 74 69 6f 6e 20  e of a function 
29e0: 61 72 67 75 6d 65 6e 74 20 6f 72 20 61 20 72 65  argument or a re
29f0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69  sult column.** i
2a00: 6e 74 6f 20 61 20 6e 75 6d 65 72 69 63 20 72 65  nto a numeric re
2a10: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 55  presentation.  U
2a20: 73 65 20 65 69 74 68 65 72 20 49 4e 54 45 47 45  se either INTEGE
2a30: 52 20 6f 72 20 52 45 41 4c 20 77 68 69 63 68 65  R or REAL whiche
2a40: 76 65 72 0a 2a 2a 20 69 73 20 61 70 70 72 6f 70  ver.** is approp
2a50: 72 69 61 74 65 2e 20 20 42 75 74 20 6f 6e 6c 79  riate.  But only
2a60: 20 64 6f 20 74 68 65 20 63 6f 6e 76 65 72 73 69   do the conversi
2a70: 6f 6e 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  on if it is poss
2a80: 69 62 6c 65 20 77 69 74 68 6f 75 74 0a 2a 2a 20  ible without.** 
2a90: 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72 6d 61 74  loss of informat
2aa0: 69 6f 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ion and return t
2ab0: 68 65 20 72 65 76 69 73 65 64 20 74 79 70 65 20  he revised type 
2ac0: 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  of the argument.
2ad0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
2ae0: 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79  value_numeric_ty
2af0: 70 65 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  pe(sqlite3_value
2b00: 20 2a 70 56 61 6c 29 7b 0a 20 20 4d 65 6d 20 2a   *pVal){.  Mem *
2b10: 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 70 56 61  pMem = (Mem*)pVa
2b20: 6c 3b 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 74  l;.  if( pMem->t
2b30: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype==SQLITE_TEXT
2b40: 20 29 7b 0a 20 20 20 20 61 70 70 6c 79 4e 75 6d   ){.    applyNum
2b50: 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 4d 65  ericAffinity(pMe
2b60: 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  m);.    sqlite3V
2b70: 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28  dbeMemStoreType(
2b80: 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pMem);.  }.  ret
2b90: 75 72 6e 20 70 4d 65 6d 2d 3e 74 79 70 65 3b 0a  urn pMem->type;.
2ba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6f 72 74 65  }../*.** Exporte
2bb0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 61 70 70  d version of app
2bc0: 6c 79 41 66 66 69 6e 69 74 79 28 29 2e 20 54 68  lyAffinity(). Th
2bd0: 69 73 20 6f 6e 65 20 77 6f 72 6b 73 20 6f 6e 20  is one works on 
2be0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20  sqlite3_value*, 
2bf0: 0a 2a 2a 20 6e 6f 74 20 74 68 65 20 69 6e 74 65  .** not the inte
2c00: 72 6e 61 6c 20 4d 65 6d 2a 20 74 79 70 65 2e 0a  rnal Mem* type..
2c10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2c20: 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74  alueApplyAffinit
2c30: 79 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  y(.  sqlite3_val
2c40: 75 65 20 2a 70 56 61 6c 2c 20 0a 20 20 75 38 20  ue *pVal, .  u8 
2c50: 61 66 66 69 6e 69 74 79 2c 20 0a 20 20 75 38 20  affinity, .  u8 
2c60: 65 6e 63 0a 29 7b 0a 20 20 61 70 70 6c 79 41 66  enc.){.  applyAf
2c70: 66 69 6e 69 74 79 28 28 4d 65 6d 20 2a 29 70 56  finity((Mem *)pV
2c80: 61 6c 2c 20 61 66 66 69 6e 69 74 79 2c 20 65 6e  al, affinity, en
2c90: 63 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  c);.}..#ifdef SQ
2ca0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
2cb0: 20 57 72 69 74 65 20 61 20 6e 69 63 65 20 73 74   Write a nice st
2cc0: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
2cd0: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  ion of the conte
2ce0: 6e 74 73 20 6f 66 20 63 65 6c 6c 20 70 4d 65 6d  nts of cell pMem
2cf0: 0a 2a 2a 20 69 6e 74 6f 20 62 75 66 66 65 72 20  .** into buffer 
2d00: 7a 42 75 66 2c 20 6c 65 6e 67 74 68 20 6e 42 75  zBuf, length nBu
2d10: 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  f..*/.void sqlit
2d20: 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79 50  e3VdbeMemPrettyP
2d30: 72 69 6e 74 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  rint(Mem *pMem, 
2d40: 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 63  char *zBuf){.  c
2d50: 68 61 72 20 2a 7a 43 73 72 20 3d 20 7a 42 75 66  har *zCsr = zBuf
2d60: 3b 0a 20 20 69 6e 74 20 66 20 3d 20 70 4d 65 6d  ;.  int f = pMem
2d70: 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20 73 74 61 74  ->flags;..  stat
2d80: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
2d90: 6f 6e 73 74 20 65 6e 63 6e 61 6d 65 73 5b 5d 20  onst encnames[] 
2da0: 3d 20 7b 22 28 58 29 22 2c 20 22 28 38 29 22 2c  = {"(X)", "(8)",
2db0: 20 22 28 31 36 4c 45 29 22 2c 20 22 28 31 36 42   "(16LE)", "(16B
2dc0: 45 29 22 7d 3b 0a 0a 20 20 69 66 28 20 66 26 4d  E)"};..  if( f&M
2dd0: 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 69  EM_Blob ){.    i
2de0: 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 63  nt i;.    char c
2df0: 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d 45  ;.    if( f & ME
2e00: 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 63  M_Dyn ){.      c
2e10: 20 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20 61 73   = 'z';.      as
2e20: 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f  sert( (f & (MEM_
2e30: 53 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68 65 6d  Static|MEM_Ephem
2e40: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c  ))==0 );.    }el
2e50: 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 53  se if( f & MEM_S
2e60: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 63  tatic ){.      c
2e70: 20 3d 20 27 74 27 3b 0a 20 20 20 20 20 20 61 73   = 't';.      as
2e80: 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f  sert( (f & (MEM_
2e90: 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d  Dyn|MEM_Ephem))=
2ea0: 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  =0 );.    }else 
2eb0: 69 66 28 20 66 20 26 20 4d 45 4d 5f 45 70 68 65  if( f & MEM_Ephe
2ec0: 6d 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 27  m ){.      c = '
2ed0: 65 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e';.      assert
2ee0: 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74  ( (f & (MEM_Stat
2ef0: 69 63 7c 4d 45 4d 5f 44 79 6e 29 29 3d 3d 30 20  ic|MEM_Dyn))==0 
2f00: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2f10: 20 20 20 20 63 20 3d 20 27 73 27 3b 0a 20 20 20      c = 's';.   
2f20: 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
2f30: 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43  snprintf(100, zC
2f40: 73 72 2c 20 22 25 63 22 2c 20 63 29 3b 0a 20 20  sr, "%c", c);.  
2f50: 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65    zCsr += sqlite
2f60: 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b  3Strlen30(zCsr);
2f70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2f80: 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72 2c  rintf(100, zCsr,
2f90: 20 22 25 64 5b 22 2c 20 70 4d 65 6d 2d 3e 6e 29   "%d[", pMem->n)
2fa0: 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71  ;.    zCsr += sq
2fb0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
2fc0: 73 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  sr);.    for(i=0
2fd0: 3b 20 69 3c 31 36 20 26 26 20 69 3c 70 4d 65 6d  ; i<16 && i<pMem
2fe0: 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ->n; i++){.     
2ff0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
3000: 66 28 31 30 30 2c 20 7a 43 73 72 2c 20 22 25 30  f(100, zCsr, "%0
3010: 32 58 22 2c 20 28 28 69 6e 74 29 70 4d 65 6d 2d  2X", ((int)pMem-
3020: 3e 7a 5b 69 5d 20 26 20 30 78 46 46 29 29 3b 0a  >z[i] & 0xFF));.
3030: 20 20 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71        zCsr += sq
3040: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
3050: 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  sr);.    }.    f
3060: 6f 72 28 69 3d 30 3b 20 69 3c 31 36 20 26 26 20  or(i=0; i<16 && 
3070: 69 3c 70 4d 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b  i<pMem->n; i++){
3080: 0a 20 20 20 20 20 20 63 68 61 72 20 7a 20 3d 20  .      char z = 
3090: 70 4d 65 6d 2d 3e 7a 5b 69 5d 3b 0a 20 20 20 20  pMem->z[i];.    
30a0: 20 20 69 66 28 20 7a 3c 33 32 20 7c 7c 20 7a 3e    if( z<32 || z>
30b0: 31 32 36 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20  126 ) *zCsr++ = 
30c0: 27 2e 27 3b 0a 20 20 20 20 20 20 65 6c 73 65 20  '.';.      else 
30d0: 2a 7a 43 73 72 2b 2b 20 3d 20 7a 3b 0a 20 20 20  *zCsr++ = z;.   
30e0: 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
30f0: 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43  snprintf(100, zC
3100: 73 72 2c 20 22 5d 25 73 22 2c 20 65 6e 63 6e 61  sr, "]%s", encna
3110: 6d 65 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d 29 3b  mes[pMem->enc]);
3120: 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c  .    zCsr += sql
3130: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73  ite3Strlen30(zCs
3140: 72 29 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20  r);.    if( f & 
3150: 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
3160: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
3170: 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 22 2b 25  tf(100, zCsr,"+%
3180: 64 7a 22 2c 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  dz",pMem->u.nZer
3190: 6f 29 3b 0a 20 20 20 20 20 20 7a 43 73 72 20 2b  o);.      zCsr +
31a0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
31b0: 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20  0(zCsr);.    }. 
31c0: 20 20 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b     *zCsr = '\0';
31d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26  .  }else if( f &
31e0: 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
31f0: 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20 20 20 7a 42  int j, k;.    zB
3200: 75 66 5b 30 5d 20 3d 20 27 20 27 3b 0a 20 20 20  uf[0] = ' ';.   
3210: 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 44 79 6e   if( f & MEM_Dyn
3220: 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31   ){.      zBuf[1
3230: 5d 20 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20 61  ] = 'z';.      a
3240: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
3250: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68 65  _Static|MEM_Ephe
3260: 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65  m))==0 );.    }e
3270: 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f  lse if( f & MEM_
3280: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
3290: 7a 42 75 66 5b 31 5d 20 3d 20 27 74 27 3b 0a 20  zBuf[1] = 't';. 
32a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 66 20       assert( (f 
32b0: 26 20 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45  & (MEM_Dyn|MEM_E
32c0: 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20  phem))==0 );.   
32d0: 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d   }else if( f & M
32e0: 45 4d 5f 45 70 68 65 6d 20 29 7b 0a 20 20 20 20  EM_Ephem ){.    
32f0: 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 65 27 3b    zBuf[1] = 'e';
3300: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
3310: 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c  f & (MEM_Static|
3320: 4d 45 4d 5f 44 79 6e 29 29 3d 3d 30 20 29 3b 0a  MEM_Dyn))==0 );.
3330: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3340: 20 7a 42 75 66 5b 31 5d 20 3d 20 27 73 27 3b 0a   zBuf[1] = 's';.
3350: 20 20 20 20 7d 0a 20 20 20 20 6b 20 3d 20 32 3b      }.    k = 2;
3360: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
3370: 72 69 6e 74 66 28 31 30 30 2c 20 26 7a 42 75 66  rintf(100, &zBuf
3380: 5b 6b 5d 2c 20 22 25 64 22 2c 20 70 4d 65 6d 2d  [k], "%d", pMem-
3390: 3e 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  >n);.    k += sq
33a0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
33b0: 42 75 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a 42 75  Buf[k]);.    zBu
33c0: 66 5b 6b 2b 2b 5d 20 3d 20 27 5b 27 3b 0a 20 20  f[k++] = '[';.  
33d0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31 35 20    for(j=0; j<15 
33e0: 26 26 20 6a 3c 70 4d 65 6d 2d 3e 6e 3b 20 6a 2b  && j<pMem->n; j+
33f0: 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 63 20 3d  +){.      u8 c =
3400: 20 70 4d 65 6d 2d 3e 7a 5b 6a 5d 3b 0a 20 20 20   pMem->z[j];.   
3410: 20 20 20 69 66 28 20 63 3e 3d 30 78 32 30 20 26     if( c>=0x20 &
3420: 26 20 63 3c 30 78 37 66 20 29 7b 0a 20 20 20 20  & c<0x7f ){.    
3430: 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20      zBuf[k++] = 
3440: 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  c;.      }else{.
3450: 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6b 2b 2b          zBuf[k++
3460: 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20 7d  ] = '.';.      }
3470: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b  .    }.    zBuf[
3480: 6b 2b 2b 5d 20 3d 20 27 5d 27 3b 0a 20 20 20 20  k++] = ']';.    
3490: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
34a0: 28 31 30 30 2c 26 7a 42 75 66 5b 6b 5d 2c 20 65  (100,&zBuf[k], e
34b0: 6e 63 6e 61 6d 65 73 5b 70 4d 65 6d 2d 3e 65 6e  ncnames[pMem->en
34c0: 63 5d 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  c]);.    k += sq
34d0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
34e0: 42 75 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a 42 75  Buf[k]);.    zBu
34f0: 66 5b 6b 2b 2b 5d 20 3d 20 30 3b 0a 20 20 7d 0a  f[k++] = 0;.  }.
3500: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
3510: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
3520: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 76 61  .** Print the va
3530: 6c 75 65 20 6f 66 20 61 20 72 65 67 69 73 74 65  lue of a registe
3540: 72 20 66 6f 72 20 74 72 61 63 69 6e 67 20 70 75  r for tracing pu
3550: 72 70 6f 73 65 73 3a 0a 2a 2f 0a 73 74 61 74 69  rposes:.*/.stati
3560: 63 20 76 6f 69 64 20 6d 65 6d 54 72 61 63 65 50  c void memTraceP
3570: 72 69 6e 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20  rint(FILE *out, 
3580: 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  Mem *p){.  if( p
3590: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
35a0: 76 61 6c 69 64 20 29 7b 0a 20 20 20 20 66 70 72  valid ){.    fpr
35b0: 69 6e 74 66 28 6f 75 74 2c 20 22 20 75 6e 64 65  intf(out, " unde
35c0: 66 69 6e 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65  fined");.  }else
35d0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
35e0: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
35f0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 4e  fprintf(out, " N
3600: 55 4c 4c 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ULL");.  }else i
3610: 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 28  f( (p->flags & (
3620: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 53 74 72 29  MEM_Int|MEM_Str)
3630: 29 3d 3d 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f  )==(MEM_Int|MEM_
3640: 53 74 72 29 20 29 7b 0a 20 20 20 20 66 70 72 69  Str) ){.    fpri
3650: 6e 74 66 28 6f 75 74 2c 20 22 20 73 69 3a 25 6c  ntf(out, " si:%l
3660: 6c 64 22 2c 20 70 2d 3e 75 2e 69 29 3b 0a 20 20  ld", p->u.i);.  
3670: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61  }else if( p->fla
3680: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
3690: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
36a0: 20 22 20 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75   " i:%lld", p->u
36b0: 2e 69 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  .i);.#ifndef SQL
36c0: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
36d0: 47 5f 50 4f 49 4e 54 0a 20 20 7d 65 6c 73 65 20  G_POINT.  }else 
36e0: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  if( p->flags & M
36f0: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 66  EM_Real ){.    f
3700: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 72 3a  printf(out, " r:
3710: 25 67 22 2c 20 70 2d 3e 72 29 3b 0a 23 65 6e 64  %g", p->r);.#end
3720: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  if.  }else if( p
3730: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
3740: 77 53 65 74 20 29 7b 0a 20 20 20 20 66 70 72 69  wSet ){.    fpri
3750: 6e 74 66 28 6f 75 74 2c 20 22 20 28 72 6f 77 73  ntf(out, " (rows
3760: 65 74 29 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  et)");.  }else{.
3770: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30      char zBuf[20
3780: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0];.    sqlite3V
3790: 64 62 65 4d 65 6d 50 72 65 74 74 79 50 72 69 6e  dbeMemPrettyPrin
37a0: 74 28 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20  t(p, zBuf);.    
37b0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 22  fprintf(out, " "
37c0: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
37d0: 75 74 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b  ut, "%s", zBuf);
37e0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
37f0: 69 64 20 72 65 67 69 73 74 65 72 54 72 61 63 65  id registerTrace
3800: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e 74 20  (FILE *out, int 
3810: 69 52 65 67 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20  iReg, Mem *p){. 
3820: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 52   fprintf(out, "R
3830: 45 47 5b 25 64 5d 20 3d 20 22 2c 20 69 52 65 67  EG[%d] = ", iReg
3840: 29 3b 0a 20 20 6d 65 6d 54 72 61 63 65 50 72 69  );.  memTracePri
3850: 6e 74 28 6f 75 74 2c 20 70 29 3b 0a 20 20 66 70  nt(out, p);.  fp
3860: 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
3870: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
3880: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
3890: 23 20 20 64 65 66 69 6e 65 20 52 45 47 49 53 54  #  define REGIST
38a0: 45 52 5f 54 52 41 43 45 28 52 2c 4d 29 20 69 66  ER_TRACE(R,M) if
38b0: 28 70 2d 3e 74 72 61 63 65 29 72 65 67 69 73 74  (p->trace)regist
38c0: 65 72 54 72 61 63 65 28 70 2d 3e 74 72 61 63 65  erTrace(p->trace
38d0: 2c 52 2c 4d 29 0a 23 65 6c 73 65 0a 23 20 20 64  ,R,M).#else.#  d
38e0: 65 66 69 6e 65 20 52 45 47 49 53 54 45 52 5f 54  efine REGISTER_T
38f0: 52 41 43 45 28 52 2c 4d 29 0a 23 65 6e 64 69 66  RACE(R,M).#endif
3900: 0a 0a 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  ...#ifdef VDBE_P
3910: 52 4f 46 49 4c 45 0a 0a 2f 2a 20 0a 2a 2a 20 68  ROFILE../* .** h
3920: 77 74 69 6d 65 2e 68 20 63 6f 6e 74 61 69 6e 73  wtime.h contains
3930: 20 69 6e 6c 69 6e 65 20 61 73 73 65 6d 62 6c 65   inline assemble
3940: 72 20 63 6f 64 65 20 66 6f 72 20 69 6d 70 6c 65  r code for imple
3950: 6d 65 6e 74 69 6e 67 20 0a 2a 2a 20 68 69 67 68  menting .** high
3960: 2d 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 69 6d  -performance tim
3970: 69 6e 67 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f  ing routines..*/
3980: 0a 23 69 6e 63 6c 75 64 65 20 22 68 77 74 69 6d  .#include "hwtim
3990: 65 2e 68 22 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a  e.h"..#endif../*
39a0: 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 46 4f  .** The CHECK_FO
39b0: 52 5f 49 4e 54 45 52 52 55 50 54 20 6d 61 63 72  R_INTERRUPT macr
39c0: 6f 20 64 65 66 69 6e 65 64 20 68 65 72 65 20 6c  o defined here l
39d0: 6f 6f 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ooks to see if t
39e0: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e  he.** sqlite3_in
39f0: 74 65 72 72 75 70 74 28 29 20 72 6f 75 74 69 6e  terrupt() routin
3a00: 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  e has been calle
3a10: 64 2e 20 20 49 66 20 69 74 20 68 61 73 20 62 65  d.  If it has be
3a20: 65 6e 2c 20 74 68 65 6e 0a 2a 2a 20 70 72 6f 63  en, then.** proc
3a30: 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 56 44  essing of the VD
3a40: 42 45 20 70 72 6f 67 72 61 6d 20 69 73 20 69 6e  BE program is in
3a50: 74 65 72 72 75 70 74 65 64 2e 0a 2a 2a 0a 2a 2a  terrupted..**.**
3a60: 20 54 68 69 73 20 6d 61 63 72 6f 20 61 64 64 65   This macro adde
3a70: 64 20 74 6f 20 65 76 65 72 79 20 69 6e 73 74 72  d to every instr
3a80: 75 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73  uction that does
3a90: 20 61 20 6a 75 6d 70 20 69 6e 20 6f 72 64 65 72   a jump in order
3aa0: 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
3ab0: 20 61 20 6c 6f 6f 70 2e 20 20 54 68 69 73 20 74   a loop.  This t
3ac0: 65 73 74 20 75 73 65 64 20 74 6f 20 62 65 20 6f  est used to be o
3ad0: 6e 20 65 76 65 72 79 20 73 69 6e 67 6c 65 20 69  n every single i
3ae0: 6e 73 74 72 75 63 74 69 6f 6e 2c 0a 2a 2a 20 62  nstruction,.** b
3af0: 75 74 20 74 68 61 74 20 6d 65 61 6e 74 20 77 65  ut that meant we
3b00: 20 6d 6f 72 65 20 74 65 73 74 69 6e 67 20 74 68   more testing th
3b10: 61 6e 20 77 65 20 6e 65 65 64 65 64 2e 20 20 42  an we needed.  B
3b20: 79 20 6f 6e 6c 79 20 74 65 73 74 69 6e 67 20 74  y only testing t
3b30: 68 65 0a 2a 2a 20 66 6c 61 67 20 6f 6e 20 6a 75  he.** flag on ju
3b40: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2c  mp instructions,
3b50: 20 77 65 20 67 65 74 20 61 20 28 73 6d 61 6c 6c   we get a (small
3b60: 29 20 73 70 65 65 64 20 69 6d 70 72 6f 76 65 6d  ) speed improvem
3b70: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
3b80: 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52 52  CHECK_FOR_INTERR
3b90: 55 50 54 20 5c 0a 20 20 20 69 66 28 20 64 62 2d  UPT \.   if( db-
3ba0: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
3bb0: 64 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  d ) goto abort_d
3bc0: 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70 74 3b  ue_to_interrupt;
3bd0: 0a 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ...#ifndef NDEBU
3be0: 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  G./*.** This fun
3bf0: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
3c00: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
3c10: 20 61 6e 20 61 73 73 65 72 74 28 29 20 65 78 70   an assert() exp
3c20: 72 65 73 73 69 6f 6e 2e 20 49 74 0a 2a 2a 20 63  ression. It.** c
3c30: 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73  hecks that the s
3c40: 71 6c 69 74 65 33 2e 6e 54 72 61 6e 73 61 63 74  qlite3.nTransact
3c50: 69 6f 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20  ion variable is 
3c60: 63 6f 72 72 65 63 74 6c 79 20 73 65 74 20 74 6f  correctly set to
3c70: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
3c80: 66 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f  f non-transactio
3c90: 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 63 75 72  n savepoints cur
3ca0: 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 0a 2a  rently in the .*
3cb0: 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  * linked list st
3cc0: 61 72 74 69 6e 67 20 61 74 20 73 71 6c 69 74 65  arting at sqlite
3cd0: 33 2e 70 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a  3.pSavepoint..**
3ce0: 20 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a   .** Usage:.**.*
3cf0: 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 63 68  *     assert( ch
3d00: 65 63 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e  eckSavepointCoun
3d10: 74 28 64 62 29 20 29 3b 0a 2a 2f 0a 73 74 61 74  t(db) );.*/.stat
3d20: 69 63 20 69 6e 74 20 63 68 65 63 6b 53 61 76 65  ic int checkSave
3d30: 70 6f 69 6e 74 43 6f 75 6e 74 28 73 71 6c 69 74  pointCount(sqlit
3d40: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6e  e3 *db){.  int n
3d50: 20 3d 20 30 3b 0a 20 20 53 61 76 65 70 6f 69 6e   = 0;.  Savepoin
3d60: 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 64 62  t *p;.  for(p=db
3d70: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 20 70 3b  ->pSavepoint; p;
3d80: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 20 6e 2b 2b   p=p->pNext) n++
3d90: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 28  ;.  assert( n==(
3da0: 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b  db->nSavepoint +
3db0: 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69   db->isTransacti
3dc0: 6f 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a  onSavepoint) );.
3dd0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
3de0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  ndif.../*.** Exe
3df0: 63 75 74 65 20 61 73 20 6d 75 63 68 20 6f 66 20  cute as much of 
3e00: 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61  a VDBE program a
3e10: 73 20 77 65 20 63 61 6e 20 74 68 65 6e 20 72 65  s we can then re
3e20: 74 75 72 6e 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  turn..**.** sqli
3e30: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
3e40: 28 29 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  () must be calle
3e50: 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  d before this ro
3e60: 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
3e70: 6f 0a 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 70  o.** close the p
3e80: 72 6f 67 72 61 6d 20 77 69 74 68 20 61 20 66 69  rogram with a fi
3e90: 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 61 6e 64 20  nal OP_Halt and 
3ea0: 74 6f 20 73 65 74 20 75 70 20 74 68 65 20 63 61  to set up the ca
3eb0: 6c 6c 62 61 63 6b 73 0a 2a 2a 20 61 6e 64 20 74  llbacks.** and t
3ec0: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
3ed0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
3ee0: 57 68 65 6e 65 76 65 72 20 61 20 72 6f 77 20 6f  Whenever a row o
3ef0: 72 20 72 65 73 75 6c 74 20 64 61 74 61 20 69 73  r result data is
3f00: 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73   available, this
3f10: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 65 69   routine will ei
3f20: 74 68 65 72 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74  ther.** invoke t
3f30: 68 65 20 72 65 73 75 6c 74 20 63 61 6c 6c 62 61  he result callba
3f40: 63 6b 20 28 69 66 20 74 68 65 72 65 20 69 73 20  ck (if there is 
3f50: 6f 6e 65 29 20 6f 72 20 72 65 74 75 72 6e 20 77  one) or return w
3f60: 69 74 68 0a 2a 2a 20 53 51 4c 49 54 45 5f 52 4f  ith.** SQLITE_RO
3f70: 57 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 61  W..**.** If an a
3f80: 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
3f90: 6f 20 6f 70 65 6e 20 61 20 6c 6f 63 6b 65 64 20  o open a locked 
3fa0: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
3fb0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77  his routine.** w
3fc0: 69 6c 6c 20 65 69 74 68 65 72 20 69 6e 76 6f 6b  ill either invok
3fd0: 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  e the busy callb
3fe0: 61 63 6b 20 28 69 66 20 74 68 65 72 65 20 69 73  ack (if there is
3ff0: 20 6f 6e 65 29 20 6f 72 20 69 74 20 77 69 6c 6c   one) or it will
4000: 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54  .** return SQLIT
4010: 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 49 66  E_BUSY..**.** If
4020: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
4030: 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
4040: 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ge is written to
4050: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
4060: 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  .** from sqlite3
4070: 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 2d  _malloc() and p-
4080: 3e 7a 45 72 72 4d 73 67 20 69 73 20 6d 61 64 65  >zErrMsg is made
4090: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
40a0: 74 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 20 54 68 65  t memory..** The
40b0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
40c0: 74 6f 72 65 64 20 69 6e 20 70 2d 3e 72 63 20 61  tored in p->rc a
40d0: 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
40e0: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45  returns SQLITE_E
40f0: 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  RROR..**.** If t
4100: 68 65 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72  he callback ever
4110: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
4120: 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 67  o, then the prog
4130: 72 61 6d 20 65 78 69 74 73 0a 2a 2a 20 69 6d 6d  ram exits.** imm
4140: 65 64 69 61 74 65 6c 79 2e 20 20 54 68 65 72 65  ediately.  There
4150: 20 77 69 6c 6c 20 62 65 20 6e 6f 20 65 72 72 6f   will be no erro
4160: 72 20 6d 65 73 73 61 67 65 20 62 75 74 20 74 68  r message but th
4170: 65 20 70 2d 3e 72 63 20 66 69 65 6c 64 20 69 73  e p->rc field is
4180: 0a 2a 2a 20 73 65 74 20 74 6f 20 53 51 4c 49 54  .** set to SQLIT
4190: 45 5f 41 42 4f 52 54 20 61 6e 64 20 74 68 69 73  E_ABORT and this
41a0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
41b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
41c0: 52 2e 0a 2a 2a 0a 2a 2a 20 41 20 6d 65 6d 6f 72  R..**.** A memor
41d0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
41e0: 6f 72 20 63 61 75 73 65 73 20 70 2d 3e 72 63 20  or causes p->rc 
41f0: 74 6f 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c  to be set to SQL
4200: 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 74 68  ITE_NOMEM and th
4210: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  is.** routine to
4220: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
4230: 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  RROR..**.** Othe
4240: 72 20 66 61 74 61 6c 20 65 72 72 6f 72 73 20 72  r fatal errors r
4250: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
4260: 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  OR..**.** After 
4270: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  this routine has
4280: 20 66 69 6e 69 73 68 65 64 2c 20 73 71 6c 69 74   finished, sqlit
4290: 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 29  e3VdbeFinalize()
42a0: 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 73   should be.** us
42b0: 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74  ed to clean up t
42c0: 68 65 20 6d 65 73 73 20 74 68 61 74 20 77 61 73  he mess that was
42d0: 20 6c 65 66 74 20 62 65 68 69 6e 64 2e 0a 2a 2f   left behind..*/
42e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
42f0: 45 78 65 63 28 0a 20 20 56 64 62 65 20 2a 70 20  Exec(.  Vdbe *p 
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4310: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
4320: 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3d 30 3b  /.){.  int pc=0;
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4340: 20 20 2f 2a 20 54 68 65 20 70 72 6f 67 72 61 6d    /* The program
4350: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4f 70   counter */.  Op
4360: 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 20   *aOp = p->aOp; 
4370: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
4380: 20 6f 66 20 70 2d 3e 61 4f 70 20 2a 2f 0a 20 20   of p->aOp */.  
4390: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20  Op *pOp;        
43a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
43b0: 72 72 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrent operation 
43c0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
43d0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
43e0: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
43f0: 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  rn */.  sqlite3 
4400: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20  *db = p->db;    
4410: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
4420: 73 65 20 2a 2f 0a 20 20 75 38 20 72 65 73 65 74  se */.  u8 reset
4430: 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 20 3d 20  SchemaOnFault = 
4440: 30 3b 20 2f 2a 20 52 65 73 65 74 20 73 63 68 65  0; /* Reset sche
4450: 6d 61 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f  ma after an erro
4460: 72 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  r if positive */
4470: 0a 20 20 75 38 20 65 6e 63 6f 64 69 6e 67 20 3d  .  u8 encoding =
4480: 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 2f 2a   ENC(db);     /*
4490: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 65 6e   The database en
44a0: 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  coding */.  int 
44b0: 69 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 20 20  iCompare = 0;   
44c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
44d0: 20 6f 66 20 6c 61 73 74 20 4f 50 5f 43 6f 6d 70   of last OP_Comp
44e0: 61 72 65 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  are operation */
44f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6e 56 6d 53  .  unsigned nVmS
4500: 74 65 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  tep = 0;      /*
4510: 20 4e 75 6d 62 65 72 20 6f 66 20 76 69 72 74 75   Number of virtu
4520: 61 6c 20 6d 61 63 68 69 6e 65 20 73 74 65 70 73  al machine steps
4530: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
4540: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
4550: 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 75 6e 73 69  _CALLBACK.  unsi
4560: 67 6e 65 64 20 6e 50 72 6f 67 72 65 73 73 4c 69  gned nProgressLi
4570: 6d 69 74 20 3d 20 30 3b 2f 2a 20 49 6e 76 6f 6b  mit = 0;/* Invok
4580: 65 20 78 50 72 6f 67 72 65 73 73 28 29 20 77 68  e xProgress() wh
4590: 65 6e 20 6e 56 6d 53 74 65 70 20 72 65 61 63 68  en nVmStep reach
45a0: 65 73 20 74 68 69 73 20 2a 2f 0a 23 65 6e 64 69  es this */.#endi
45b0: 66 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20  f.  Mem *aMem = 
45c0: 70 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f  p->aMem;       /
45d0: 2a 20 43 6f 70 79 20 6f 66 20 70 2d 3e 61 4d 65  * Copy of p->aMe
45e0: 6d 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 31  m */.  Mem *pIn1
45f0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
4600: 20 20 2f 2a 20 31 73 74 20 69 6e 70 75 74 20 6f    /* 1st input o
4610: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20  perand */.  Mem 
4620: 2a 70 49 6e 32 20 3d 20 30 3b 20 20 20 20 20 20  *pIn2 = 0;      
4630: 20 20 20 20 20 20 20 2f 2a 20 32 6e 64 20 69 6e         /* 2nd in
4640: 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  put operand */. 
4650: 20 4d 65 6d 20 2a 70 49 6e 33 20 3d 20 30 3b 20   Mem *pIn3 = 0; 
4660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33              /* 3
4670: 72 64 20 69 6e 70 75 74 20 6f 70 65 72 61 6e 64  rd input operand
4680: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4f 75 74 20   */.  Mem *pOut 
4690: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
46a0: 20 2f 2a 20 4f 75 74 70 75 74 20 6f 70 65 72 61   /* Output opera
46b0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  nd */.  int *aPe
46c0: 72 6d 75 74 65 20 3d 20 30 3b 20 20 20 20 20 20  rmute = 0;      
46d0: 20 20 20 2f 2a 20 50 65 72 6d 75 74 61 74 69 6f     /* Permutatio
46e0: 6e 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  n of columns for
46f0: 20 4f 50 5f 43 6f 6d 70 61 72 65 20 2a 2f 0a 20   OP_Compare */. 
4700: 20 69 36 34 20 6c 61 73 74 52 6f 77 69 64 20 3d   i64 lastRowid =
4710: 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 20   db->lastRowid; 
4720: 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
4730: 6f 66 20 74 68 65 20 6c 61 73 74 20 69 6e 73 65  of the last inse
4740: 72 74 20 52 4f 57 49 44 20 2a 2f 0a 23 69 66 64  rt ROWID */.#ifd
4750: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
4760: 20 20 75 36 34 20 73 74 61 72 74 3b 20 20 20 20    u64 start;    
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4780: 43 50 55 20 63 6c 6f 63 6b 20 63 6f 75 6e 74 20  CPU clock count 
4790: 61 74 20 73 74 61 72 74 20 6f 66 20 6f 70 63 6f  at start of opco
47a0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67  de */.  int orig
47b0: 50 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pc;             
47c0: 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f     /* Program co
47d0: 75 6e 74 65 72 20 61 74 20 73 74 61 72 74 20 6f  unter at start o
47e0: 66 20 6f 70 63 6f 64 65 20 2a 2f 0a 23 65 6e 64  f opcode */.#end
47f0: 69 66 0a 20 20 2f 2a 2a 2a 20 49 4e 53 45 52 54  if.  /*** INSERT
4800: 20 53 54 41 43 4b 20 55 4e 49 4f 4e 20 48 45 52   STACK UNION HER
4810: 45 20 2a 2a 2a 2f 0a 0a 20 20 61 73 73 65 72 74  E ***/..  assert
4820: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
4830: 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 20 20 2f  _MAGIC_RUN );  /
4840: 2a 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  * sqlite3_step()
4850: 20 76 65 72 69 66 69 65 73 20 74 68 69 73 20 2a   verifies this *
4860: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 45  /.  sqlite3VdbeE
4870: 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
4880: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
4890: 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  EM ){.    /* Thi
48a0: 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d  s happens if a m
48b0: 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61  alloc() inside a
48c0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
48d0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f  _column_text() o
48e0: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
48f0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
4900: 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20   failed.  */.   
4910: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
4920: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  }.  assert( p->r
4930: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
4940: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
4950: 53 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  SY );.  assert( 
4960: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 7c 7c 20  p->bIsReader || 
4970: 70 2d 3e 72 65 61 64 4f 6e 6c 79 21 3d 30 20 29  p->readOnly!=0 )
4980: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ;.  p->rc = SQLI
4990: 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 69 43 75 72  TE_OK;.  p->iCur
49a0: 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20  rentTime = 0;.  
49b0: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
49c0: 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 52  in==0 );.  p->pR
49d0: 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 20 20  esultSet = 0;.  
49e0: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e  db->busyHandler.
49f0: 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 43 48 45  nBusy = 0;.  CHE
4a00: 43 4b 5f 46 4f 52 5f 49 4e 54 45 52 52 55 50 54  CK_FOR_INTERRUPT
4a10: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 49  ;.  sqlite3VdbeI
4a20: 4f 54 72 61 63 65 53 71 6c 28 70 29 3b 0a 23 69  OTraceSql(p);.#i
4a30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4a40: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
4a50: 41 43 4b 0a 20 20 69 66 28 20 64 62 2d 3e 78 50  ACK.  if( db->xP
4a60: 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 61  rogress ){.    a
4a70: 73 73 65 72 74 28 20 30 20 3c 20 64 62 2d 3e 6e  ssert( 0 < db->n
4a80: 50 72 6f 67 72 65 73 73 4f 70 73 20 29 3b 0a 20  ProgressOps );. 
4a90: 20 20 20 6e 50 72 6f 67 72 65 73 73 4c 69 6d 69     nProgressLimi
4aa0: 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 70 2d  t = (unsigned)p-
4ab0: 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45  >aCounter[SQLITE
4ac0: 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53  _STMTSTATUS_VM_S
4ad0: 54 45 50 5d 3b 0a 20 20 20 20 69 66 28 20 6e 50  TEP];.    if( nP
4ae0: 72 6f 67 72 65 73 73 4c 69 6d 69 74 3d 3d 30 20  rogressLimit==0 
4af0: 29 7b 0a 20 20 20 20 20 20 6e 50 72 6f 67 72 65  ){.      nProgre
4b00: 73 73 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 6e 50  ssLimit = db->nP
4b10: 72 6f 67 72 65 73 73 4f 70 73 3b 0a 20 20 20 20  rogressOps;.    
4b20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 72  }else{.      nPr
4b30: 6f 67 72 65 73 73 4c 69 6d 69 74 20 25 3d 20 28  ogressLimit %= (
4b40: 75 6e 73 69 67 6e 65 64 29 64 62 2d 3e 6e 50 72  unsigned)db->nPr
4b50: 6f 67 72 65 73 73 4f 70 73 3b 0a 20 20 20 20 7d  ogressOps;.    }
4b60: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64  .  }.#endif.#ifd
4b70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
4b80: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
4b90: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
4ba0: 69 66 28 20 70 2d 3e 70 63 3d 3d 30 20 20 26 26  if( p->pc==0  &&
4bb0: 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26   (p->db->flags &
4bc0: 20 53 51 4c 49 54 45 5f 56 64 62 65 4c 69 73 74   SQLITE_VdbeList
4bd0: 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  ing)!=0 ){.    i
4be0: 6e 74 20 69 3b 0a 20 20 20 20 70 72 69 6e 74 66  nt i;.    printf
4bf0: 28 22 56 44 42 45 20 50 72 6f 67 72 61 6d 20 4c  ("VDBE Program L
4c00: 69 73 74 69 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20  isting:\n");.   
4c10: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
4c20: 74 53 71 6c 28 70 29 3b 0a 20 20 20 20 66 6f 72  tSql(p);.    for
4c30: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
4c40: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
4c50: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 73  te3VdbePrintOp(s
4c60: 74 64 6f 75 74 2c 20 69 2c 20 26 61 4f 70 5b 69  tdout, i, &aOp[i
4c70: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ]);.    }.  }.  
4c80: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
4c90: 4d 61 6c 6c 6f 63 28 29 3b 0a 23 65 6e 64 69 66  Malloc();.#endif
4ca0: 0a 20 20 66 6f 72 28 70 63 3d 70 2d 3e 70 63 3b  .  for(pc=p->pc;
4cb0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
4cc0: 70 63 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72  pc++){.    asser
4cd0: 74 28 20 70 63 3e 3d 30 20 26 26 20 70 63 3c 70  t( pc>=0 && pc<p
4ce0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 20 20 69 66 28  ->nOp );.    if(
4cf0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
4d00: 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  d ) goto no_mem;
4d10: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
4d20: 46 49 4c 45 0a 20 20 20 20 6f 72 69 67 50 63 20  FILE.    origPc 
4d30: 3d 20 70 63 3b 0a 20 20 20 20 73 74 61 72 74 20  = pc;.    start 
4d40: 3d 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28  = sqlite3Hwtime(
4d50: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e 56  );.#endif.    nV
4d60: 6d 53 74 65 70 2b 2b 3b 0a 20 20 20 20 70 4f 70  mStep++;.    pOp
4d70: 20 3d 20 26 61 4f 70 5b 70 63 5d 3b 0a 0a 20 20   = &aOp[pc];..  
4d80: 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20    /* Only allow 
4d90: 74 72 61 63 69 6e 67 20 69 66 20 53 51 4c 49 54  tracing if SQLIT
4da0: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
4db0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65  ed..    */.#ifde
4dc0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
4dd0: 20 20 20 69 66 28 20 70 2d 3e 74 72 61 63 65 20     if( p->trace 
4de0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3d  ){.      if( pc=
4df0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  =0 ){.        pr
4e00: 69 6e 74 66 28 22 56 44 42 45 20 45 78 65 63 75  intf("VDBE Execu
4e10: 74 69 6f 6e 20 54 72 61 63 65 3a 5c 6e 22 29 3b  tion Trace:\n");
4e20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4e30: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 70 29 3b  VdbePrintSql(p);
4e40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
4e50: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
4e60: 70 28 70 2d 3e 74 72 61 63 65 2c 20 70 63 2c 20  p(p->trace, pc, 
4e70: 70 4f 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pOp);.    }.#end
4e80: 69 66 0a 20 20 20 20 20 20 0a 0a 20 20 20 20 2f  if.      ..    /
4e90: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
4ea0: 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 69 6d  f we need to sim
4eb0: 75 6c 61 74 65 20 61 6e 20 69 6e 74 65 72 72 75  ulate an interru
4ec0: 70 74 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 68  pt.  This only h
4ed0: 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 69 66  appens.    ** if
4ee0: 20 77 65 20 68 61 76 65 20 61 20 73 70 65 63 69   we have a speci
4ef0: 61 6c 20 74 65 73 74 20 62 75 69 6c 64 2e 0a 20  al test build.. 
4f00: 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
4f10: 49 54 45 5f 54 45 53 54 0a 20 20 20 20 69 66 28  ITE_TEST.    if(
4f20: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
4f30: 70 74 5f 63 6f 75 6e 74 3e 30 20 29 7b 0a 20 20  pt_count>0 ){.  
4f40: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65      sqlite3_inte
4f50: 72 72 75 70 74 5f 63 6f 75 6e 74 2d 2d 3b 0a 20  rrupt_count--;. 
4f60: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
4f70: 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
4f80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
4f90: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
4fa0: 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  (db);.      }.  
4fb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
4fc0: 2f 2a 20 4f 6e 20 61 6e 79 20 6f 70 63 6f 64 65  /* On any opcode
4fd0: 20 77 69 74 68 20 74 68 65 20 22 6f 75 74 32 2d   with the "out2-
4fe0: 70 72 65 72 65 6c 65 61 73 65 22 20 74 61 67 2c  prerelease" tag,
4ff0: 20 66 72 65 65 20 61 6e 79 0a 20 20 20 20 2a 2a   free any.    **
5000: 20 65 78 74 65 72 6e 61 6c 20 61 6c 6c 6f 63 61   external alloca
5010: 74 69 6f 6e 73 20 6f 75 74 20 6f 66 20 6d 65 6d  tions out of mem
5020: 5b 70 32 5d 20 61 6e 64 20 73 65 74 20 6d 65 6d  [p2] and set mem
5030: 5b 70 32 5d 20 74 6f 20 62 65 0a 20 20 20 20 2a  [p2] to be.    *
5040: 2a 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 20 69  * an undefined i
5050: 6e 74 65 67 65 72 2e 20 20 4f 70 63 6f 64 65 73  nteger.  Opcodes
5060: 20 77 69 6c 6c 20 65 69 74 68 65 72 20 66 69 6c   will either fil
5070: 6c 20 69 6e 20 74 68 65 20 69 6e 74 65 67 65 72  l in the integer
5080: 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 72  .    ** value or
5090: 20 63 6f 6e 76 65 72 74 20 6d 65 6d 5b 70 32 5d   convert mem[p2]
50a0: 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
50b0: 74 79 70 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  type..    */.   
50c0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
50d0: 66 6c 61 67 73 3d 3d 73 71 6c 69 74 65 33 4f 70  flags==sqlite3Op
50e0: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 70  codeProperty[pOp
50f0: 2d 3e 6f 70 63 6f 64 65 5d 20 29 3b 0a 20 20 20  ->opcode] );.   
5100: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 66 6c 61 67   if( pOp->opflag
5110: 73 20 26 20 4f 50 46 4c 47 5f 4f 55 54 32 5f 50  s & OPFLG_OUT2_P
5120: 52 45 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20  RERELEASE ){.   
5130: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
5140: 70 32 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  p2>0 );.      as
5150: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 28  sert( pOp->p2<=(
5160: 70 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73  p->nMem-p->nCurs
5170: 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 70 4f 75  or) );.      pOu
5180: 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
5190: 32 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62 6f  2];.      memAbo
51a0: 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f  utToChange(p, pO
51b0: 75 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 4d  ut);.      VdbeM
51c0: 65 6d 52 65 6c 65 61 73 65 28 70 4f 75 74 29 3b  emRelease(pOut);
51d0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61  .      pOut->fla
51e0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
51f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 61 6e 69    }..    /* Sani
5200: 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 6f  ty checking on o
5210: 74 68 65 72 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ther operands */
5220: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
5230: 45 42 55 47 0a 20 20 20 20 69 66 28 20 28 70 4f  EBUG.    if( (pO
5240: 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46  p->opflags & OPF
5250: 4c 47 5f 49 4e 31 29 21 3d 30 20 29 7b 0a 20 20  LG_IN1)!=0 ){.  
5260: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
5270: 3e 70 31 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  >p1>0 );.      a
5280: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3c 3d  ssert( pOp->p1<=
5290: 28 70 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72  (p->nMem-p->nCur
52a0: 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73  sor) );.      as
52b0: 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
52c0: 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29  (&aMem[pOp->p1])
52d0: 20 29 3b 0a 20 20 20 20 20 20 52 45 47 49 53 54   );.      REGIST
52e0: 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31  ER_TRACE(pOp->p1
52f0: 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  , &aMem[pOp->p1]
5300: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
5310: 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26   (pOp->opflags &
5320: 20 4f 50 46 4c 47 5f 49 4e 32 29 21 3d 30 20 29   OPFLG_IN2)!=0 )
5330: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5340: 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 20  pOp->p2>0 );.   
5350: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
5360: 70 32 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d 70 2d 3e  p2<=(p->nMem-p->
5370: 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20  nCursor) );.    
5380: 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
5390: 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e  alid(&aMem[pOp->
53a0: 70 32 5d 29 20 29 3b 0a 20 20 20 20 20 20 52 45  p2]) );.      RE
53b0: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
53c0: 2d 3e 70 32 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d  ->p2, &aMem[pOp-
53d0: 3e 70 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >p2]);.    }.   
53e0: 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61   if( (pOp->opfla
53f0: 67 73 20 26 20 4f 50 46 4c 47 5f 49 4e 33 29 21  gs & OPFLG_IN3)!
5400: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
5410: 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b  rt( pOp->p3>0 );
5420: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
5430: 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p3<=(p->nMem
5440: 2d 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a  -p->nCursor) );.
5450: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
5460: 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70  mIsValid(&aMem[p
5470: 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a 20 20 20 20  Op->p3]) );.    
5480: 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
5490: 28 70 4f 70 2d 3e 70 33 2c 20 26 61 4d 65 6d 5b  (pOp->p3, &aMem[
54a0: 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 7d  pOp->p3]);.    }
54b0: 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f  .    if( (pOp->o
54c0: 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 4f  pflags & OPFLG_O
54d0: 55 54 32 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  UT2)!=0 ){.     
54e0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
54f0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
5500: 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d  rt( pOp->p2<=(p-
5510: 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f 72  >nMem-p->nCursor
5520: 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62  ) );.      memAb
5530: 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 26  outToChange(p, &
5540: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b 0a  aMem[pOp->p2]);.
5550: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
5560: 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50  Op->opflags & OP
5570: 46 4c 47 5f 4f 55 54 33 29 21 3d 30 20 29 7b 0a  FLG_OUT3)!=0 ){.
5580: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
5590: 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20 20  p->p3>0 );.     
55a0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
55b0: 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43  <=(p->nMem-p->nC
55c0: 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20  ursor) );.      
55d0: 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
55e0: 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  (p, &aMem[pOp->p
55f0: 33 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  3]);.    }.#endi
5600: 66 0a 20 20 0a 20 20 20 20 73 77 69 74 63 68 28  f.  .    switch(
5610: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a   pOp->opcode ){.
5620: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
5630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
5670: 2a 2a 20 57 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ** What follows 
5680: 69 73 20 61 20 6d 61 73 73 69 76 65 20 73 77 69  is a massive swi
5690: 74 63 68 20 73 74 61 74 65 6d 65 6e 74 20 77 68  tch statement wh
56a0: 65 72 65 20 65 61 63 68 20 63 61 73 65 20 69 6d  ere each case im
56b0: 70 6c 65 6d 65 6e 74 73 20 61 0a 2a 2a 20 73 65  plements a.** se
56c0: 70 61 72 61 74 65 20 69 6e 73 74 72 75 63 74 69  parate instructi
56d0: 6f 6e 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  on in the virtua
56e0: 6c 20 6d 61 63 68 69 6e 65 2e 20 20 49 66 20 77  l machine.  If w
56f0: 65 20 66 6f 6c 6c 6f 77 20 74 68 65 20 75 73 75  e follow the usu
5700: 61 6c 0a 2a 2a 20 69 6e 64 65 6e 74 61 74 69 6f  al.** indentatio
5710: 6e 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2c 20 65  n conventions, e
5720: 61 63 68 20 63 61 73 65 20 73 68 6f 75 6c 64 20  ach case should 
5730: 62 65 20 69 6e 64 65 6e 74 65 64 20 62 79 20 36  be indented by 6
5740: 20 73 70 61 63 65 73 2e 20 20 42 75 74 0a 2a 2a   spaces.  But.**
5750: 20 74 68 61 74 20 69 73 20 61 20 6c 6f 74 20 6f   that is a lot o
5760: 66 20 77 61 73 74 65 64 20 73 70 61 63 65 20 6f  f wasted space o
5770: 6e 20 74 68 65 20 6c 65 66 74 20 6d 61 72 67 69  n the left margi
5780: 6e 2e 20 20 53 6f 20 74 68 65 20 63 6f 64 65 20  n.  So the code 
5790: 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 73 77  within.** the sw
57a0: 69 74 63 68 20 73 74 61 74 65 6d 65 6e 74 20 77  itch statement w
57b0: 69 6c 6c 20 62 72 65 61 6b 20 77 69 74 68 20 63  ill break with c
57c0: 6f 6e 76 65 6e 74 69 6f 6e 20 61 6e 64 20 62 65  onvention and be
57d0: 20 66 6c 75 73 68 2d 6c 65 66 74 2e 20 41 6e 6f   flush-left. Ano
57e0: 74 68 65 72 0a 2a 2a 20 62 69 67 20 63 6f 6d 6d  ther.** big comm
57f0: 65 6e 74 20 28 73 69 6d 69 6c 61 72 20 74 6f 20  ent (similar to 
5800: 74 68 69 73 20 6f 6e 65 29 20 77 69 6c 6c 20 6d  this one) will m
5810: 61 72 6b 20 74 68 65 20 70 6f 69 6e 74 20 69 6e  ark the point in
5820: 20 74 68 65 20 63 6f 64 65 20 77 68 65 72 65 0a   the code where.
5830: 2a 2a 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e  ** we transition
5840: 20 62 61 63 6b 20 74 6f 20 6e 6f 72 6d 61 6c 20   back to normal 
5850: 69 6e 64 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a  indentation..**.
5860: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 74 69 6e  ** The formattin
5870: 67 20 6f 66 20 65 61 63 68 20 63 61 73 65 20 69  g of each case i
5880: 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 68  s important.  Th
5890: 65 20 6d 61 6b 65 66 69 6c 65 20 66 6f 72 20 53  e makefile for S
58a0: 51 4c 69 74 65 0a 2a 2a 20 67 65 6e 65 72 61 74  QLite.** generat
58b0: 65 73 20 74 77 6f 20 43 20 66 69 6c 65 73 20 22  es two C files "
58c0: 6f 70 63 6f 64 65 73 2e 68 22 20 61 6e 64 20 22  opcodes.h" and "
58d0: 6f 70 63 6f 64 65 73 2e 63 22 20 62 79 20 73 63  opcodes.c" by sc
58e0: 61 6e 6e 69 6e 67 20 74 68 69 73 0a 2a 2a 20 66  anning this.** f
58f0: 69 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ile looking for 
5900: 6c 69 6e 65 73 20 74 68 61 74 20 62 65 67 69 6e  lines that begin
5910: 20 77 69 74 68 20 22 63 61 73 65 20 4f 50 5f 22   with "case OP_"
5920: 2e 20 20 54 68 65 20 6f 70 63 6f 64 65 73 2e 68  .  The opcodes.h
5930: 20 66 69 6c 65 73 0a 2a 2a 20 77 69 6c 6c 20 62   files.** will b
5940: 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 23 64  e filled with #d
5950: 65 66 69 6e 65 73 20 74 68 61 74 20 67 69 76 65  efines that give
5960: 20 75 6e 69 71 75 65 20 69 6e 74 65 67 65 72 20   unique integer 
5970: 76 61 6c 75 65 73 20 74 6f 20 65 61 63 68 0a 2a  values to each.*
5980: 2a 20 6f 70 63 6f 64 65 20 61 6e 64 20 74 68 65  * opcode and the
5990: 20 6f 70 63 6f 64 65 73 2e 63 20 66 69 6c 65 20   opcodes.c file 
59a0: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 61  is filled with a
59b0: 6e 20 61 72 72 61 79 20 6f 66 20 73 74 72 69 6e  n array of strin
59c0: 67 73 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68  gs where.** each
59d0: 20 73 74 72 69 6e 67 20 69 73 20 74 68 65 20 73   string is the s
59e0: 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 66 6f 72  ymbolic name for
59f0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
5a00: 6e 67 20 6f 70 63 6f 64 65 2e 20 20 49 66 20 74  ng opcode.  If t
5a10: 68 65 0a 2a 2a 20 63 61 73 65 20 73 74 61 74 65  he.** case state
5a20: 6d 65 6e 74 20 69 73 20 66 6f 6c 6c 6f 77 65 64  ment is followed
5a30: 20 62 79 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 66   by a comment of
5a40: 20 74 68 65 20 66 6f 72 6d 20 22 2f 23 20 73 61   the form "/# sa
5a50: 6d 65 20 61 73 20 2e 2e 2e 20 23 2f 22 0a 2a 2a  me as ... #/".**
5a60: 20 74 68 61 74 20 63 6f 6d 6d 65 6e 74 20 69 73   that comment is
5a70: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
5a80: 6e 65 20 74 68 65 20 70 61 72 74 69 63 75 6c 61  ne the particula
5a90: 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6f  r value of the o
5aa0: 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  pcode..**.** Oth
5ab0: 65 72 20 6b 65 79 77 6f 72 64 73 20 69 6e 20 74  er keywords in t
5ac0: 68 65 20 63 6f 6d 6d 65 6e 74 20 74 68 61 74 20  he comment that 
5ad0: 66 6f 6c 6c 6f 77 73 20 65 61 63 68 20 63 61 73  follows each cas
5ae0: 65 20 61 72 65 20 75 73 65 64 20 74 6f 0a 2a 2a  e are used to.**
5af0: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 4f   construct the O
5b00: 50 46 4c 47 5f 49 4e 49 54 49 41 4c 49 5a 45 52  PFLG_INITIALIZER
5b10: 20 76 61 6c 75 65 20 74 68 61 74 20 69 6e 69 74   value that init
5b20: 69 61 6c 69 7a 65 73 20 6f 70 63 6f 64 65 50 72  ializes opcodePr
5b30: 6f 70 65 72 74 79 5b 5d 2e 0a 2a 2a 20 4b 65 79  operty[]..** Key
5b40: 77 6f 72 64 73 20 69 6e 63 6c 75 64 65 3a 20 69  words include: i
5b50: 6e 31 2c 20 69 6e 32 2c 20 69 6e 33 2c 20 6f 75  n1, in2, in3, ou
5b60: 74 32 5f 70 72 65 72 65 6c 65 61 73 65 2c 20 6f  t2_prerelease, o
5b70: 75 74 32 2c 20 6f 75 74 33 2e 20 20 53 65 65 0a  ut2, out3.  See.
5b80: 2a 2a 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  ** the mkopcodeh
5b90: 2e 61 77 6b 20 73 63 72 69 70 74 20 66 6f 72 20  .awk script for 
5ba0: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
5bb0: 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 6f  mation..**.** Do
5bc0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 61 62 6f 75  cumentation abou
5bd0: 74 20 56 44 42 45 20 6f 70 63 6f 64 65 73 20 69  t VDBE opcodes i
5be0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 73  s generated by s
5bf0: 63 61 6e 6e 69 6e 67 20 74 68 69 73 20 66 69 6c  canning this fil
5c00: 65 0a 2a 2a 20 66 6f 72 20 6c 69 6e 65 73 20 6f  e.** for lines o
5c10: 66 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 22  f that contain "
5c20: 4f 70 63 6f 64 65 3a 22 2e 20 20 54 68 61 74 20  Opcode:".  That 
5c30: 6c 69 6e 65 20 61 6e 64 20 61 6c 6c 20 73 75 62  line and all sub
5c40: 73 65 71 75 65 6e 74 0a 2a 2a 20 63 6f 6d 6d 65  sequent.** comme
5c50: 6e 74 20 6c 69 6e 65 73 20 61 72 65 20 75 73 65  nt lines are use
5c60: 64 20 69 6e 20 74 68 65 20 67 65 6e 65 72 61 74  d in the generat
5c70: 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  ion of the opcod
5c80: 65 2e 68 74 6d 6c 20 64 6f 63 75 6d 65 6e 74 61  e.html documenta
5c90: 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2a  tion.** file..**
5ca0: 0a 2a 2a 20 53 55 4d 4d 41 52 59 3a 0a 2a 2a 0a  .** SUMMARY:.**.
5cb0: 2a 2a 20 20 20 20 20 46 6f 72 6d 61 74 74 69 6e  **     Formattin
5cc0: 67 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  g is important t
5cd0: 6f 20 73 63 72 69 70 74 73 20 74 68 61 74 20 73  o scripts that s
5ce0: 63 61 6e 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a  can this file..*
5cf0: 2a 20 20 20 20 20 44 6f 20 6e 6f 74 20 64 65 76  *     Do not dev
5d00: 69 61 74 65 20 66 72 6f 6d 20 74 68 65 20 66 6f  iate from the fo
5d10: 72 6d 61 74 74 69 6e 67 20 73 74 79 6c 65 20 63  rmatting style c
5d20: 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e  urrently in use.
5d30: 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
5d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d80: 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20  */../* Opcode:  
5d90: 47 6f 74 6f 20 2a 20 50 32 20 2a 20 2a 20 2a 0a  Goto * P2 * * *.
5da0: 2a 2a 0a 2a 2a 20 41 6e 20 75 6e 63 6f 6e 64 69  **.** An uncondi
5db0: 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 61  tional jump to a
5dc0: 64 64 72 65 73 73 20 50 32 2e 0a 2a 2a 20 54 68  ddress P2..** Th
5dd0: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
5de0: 6f 6e 20 65 78 65 63 75 74 65 64 20 77 69 6c 6c  on executed will
5df0: 20 62 65 20 0a 2a 2a 20 74 68 65 20 6f 6e 65 20   be .** the one 
5e00: 61 74 20 69 6e 64 65 78 20 50 32 20 66 72 6f 6d  at index P2 from
5e10: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
5e20: 66 0a 2a 2a 20 74 68 65 20 70 72 6f 67 72 61 6d  f.** the program
5e30: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 6f 74  ..*/.case OP_Got
5e40: 6f 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  o: {            
5e50: 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 70 63   /* jump */.  pc
5e60: 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
5e70: 0a 20 20 2f 2a 20 4f 70 63 6f 64 65 73 20 74 68  .  /* Opcodes th
5e80: 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20 74  at are used as t
5e90: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 61 20 6c  he bottom of a l
5ea0: 6f 6f 70 20 28 4f 50 5f 4e 65 78 74 2c 20 4f 50  oop (OP_Next, OP
5eb0: 5f 50 72 65 76 2c 0a 20 20 2a 2a 20 4f 50 5f 56  _Prev,.  ** OP_V
5ec0: 4e 65 78 74 2c 20 4f 50 5f 52 6f 77 53 65 74 4e  Next, OP_RowSetN
5ed0: 65 78 74 2c 20 6f 72 20 4f 50 5f 53 6f 72 74 65  ext, or OP_Sorte
5ee0: 72 4e 65 78 74 29 20 61 6c 6c 20 6a 75 6d 70 20  rNext) all jump 
5ef0: 68 65 72 65 20 75 70 6f 6e 0a 20 20 2a 2a 20 63  here upon.  ** c
5f00: 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 43 68 65 63  ompletion.  Chec
5f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 73 71 6c 69  k to see if sqli
5f20: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 29 20  te3_interrupt() 
5f30: 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a  has been called.
5f40: 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70    ** or if the p
5f50: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
5f60: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 76   needs to be inv
5f70: 6f 6b 65 64 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  oked. .  **.  **
5f80: 20 54 68 69 73 20 63 6f 64 65 20 75 73 65 73 20   This code uses 
5f90: 75 6e 73 74 72 75 63 74 75 72 65 64 20 22 67 6f  unstructured "go
5fa0: 74 6f 22 20 73 74 61 74 65 6d 65 6e 74 73 20 61  to" statements a
5fb0: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b  nd does not look
5fc0: 20 63 6c 65 61 6e 2e 0a 20 20 2a 2a 20 42 75 74   clean..  ** But
5fd0: 20 74 68 61 74 20 69 73 20 6e 6f 74 20 64 75 65   that is not due
5fe0: 20 74 6f 20 73 6c 6f 70 70 79 20 63 6f 64 69 6e   to sloppy codin
5ff0: 67 20 68 61 62 69 74 73 2e 20 54 68 65 20 63 6f  g habits. The co
6000: 64 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 68  de is written th
6010: 69 73 0a 20 20 2a 2a 20 77 61 79 20 66 6f 72 20  is.  ** way for 
6020: 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 74 6f 20  performance, to 
6030: 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20  avoid having to 
6040: 72 75 6e 20 74 68 65 20 69 6e 74 65 72 72 75 70  run the interrup
6050: 74 20 61 6e 64 20 70 72 6f 67 72 65 73 73 0a 20  t and progress. 
6060: 20 2a 2a 20 63 68 65 63 6b 73 20 6f 6e 20 65 76   ** checks on ev
6070: 65 72 79 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  ery opcode.  Thi
6080: 73 20 68 65 6c 70 73 20 73 71 6c 69 74 65 33 5f  s helps sqlite3_
6090: 73 74 65 70 28 29 20 74 6f 20 72 75 6e 20 61 62  step() to run ab
60a0: 6f 75 74 20 31 2e 35 25 0a 20 20 2a 2a 20 66 61  out 1.5%.  ** fa
60b0: 73 74 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  ster according t
60c0: 6f 20 22 76 61 6c 67 72 69 6e 64 20 2d 2d 74 6f  o "valgrind --to
60d0: 6f 6c 3d 63 61 63 68 65 67 72 69 6e 64 22 20 2a  ol=cachegrind" *
60e0: 2f 0a 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65  /.check_for_inte
60f0: 72 72 75 70 74 3a 0a 20 20 43 48 45 43 4b 5f 46  rrupt:.  CHECK_F
6100: 4f 52 5f 49 4e 54 45 52 52 55 50 54 3b 0a 23 69  OR_INTERRUPT;.#i
6110: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6120: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
6130: 41 43 4b 0a 20 20 2f 2a 20 43 61 6c 6c 20 74 68  ACK.  /* Call th
6140: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
6150: 61 63 6b 20 69 66 20 69 74 20 69 73 20 63 6f 6e  ack if it is con
6160: 66 69 67 75 72 65 64 20 61 6e 64 20 74 68 65 20  figured and the 
6170: 72 65 71 75 69 72 65 64 20 6e 75 6d 62 65 72 0a  required number.
6180: 20 20 2a 2a 20 6f 66 20 56 44 42 45 20 6f 70 73    ** of VDBE ops
6190: 20 68 61 76 65 20 62 65 65 6e 20 65 78 65 63 75   have been execu
61a0: 74 65 64 20 28 65 69 74 68 65 72 20 73 69 6e 63  ted (either sinc
61b0: 65 20 74 68 69 73 20 69 6e 76 6f 63 61 74 69 6f  e this invocatio
61c0: 6e 20 6f 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65  n of.  ** sqlite
61d0: 33 56 64 62 65 45 78 65 63 28 29 20 6f 72 20 73  3VdbeExec() or s
61e0: 69 6e 63 65 20 6c 61 73 74 20 74 69 6d 65 20 74  ince last time t
61f0: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
6200: 62 61 63 6b 20 77 61 73 20 63 61 6c 6c 65 64 29  back was called)
6210: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 72  ..  ** If the pr
6220: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
6230: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
6240: 2c 20 65 78 69 74 20 74 68 65 20 76 69 72 74 75  , exit the virtu
6250: 61 6c 20 6d 61 63 68 69 6e 65 20 77 69 74 68 0a  al machine with.
6260: 20 20 2a 2a 20 61 20 72 65 74 75 72 6e 20 63 6f    ** a return co
6270: 64 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 2e  de SQLITE_ABORT.
6280: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
6290: 78 50 72 6f 67 72 65 73 73 21 3d 30 20 26 26 20  xProgress!=0 && 
62a0: 6e 56 6d 53 74 65 70 3e 3d 6e 50 72 6f 67 72 65  nVmStep>=nProgre
62b0: 73 73 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69  ssLimit ){.    i
62c0: 6e 74 20 70 72 63 3b 0a 20 20 20 20 70 72 63 20  nt prc;.    prc 
62d0: 3d 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 28  = db->xProgress(
62e0: 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67  db->pProgressArg
62f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 72 63 21 3d  );.    if( prc!=
6300: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
6310: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
6320: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62  ;.      goto vdb
6330: 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 20 20  e_error_halt;.  
6340: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
6350: 78 50 72 6f 67 72 65 73 73 21 3d 30 20 29 7b 0a  xProgress!=0 ){.
6360: 20 20 20 20 20 20 6e 50 72 6f 67 72 65 73 73 4c        nProgressL
6370: 69 6d 69 74 20 3d 20 6e 56 6d 53 74 65 70 20 2b  imit = nVmStep +
6380: 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70   db->nProgressOp
6390: 73 20 2d 20 28 6e 56 6d 53 74 65 70 25 64 62 2d  s - (nVmStep%db-
63a0: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 29 3b 0a  >nProgressOps);.
63b0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
63c0: 0a 20 20 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  .  .  break;.}..
63d0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 47 6f 73 75  /* Opcode:  Gosu
63e0: 62 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  b P1 P2 * * *.**
63f0: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 63 75  .** Write the cu
6400: 72 72 65 6e 74 20 61 64 64 72 65 73 73 20 6f 6e  rrent address on
6410: 74 6f 20 72 65 67 69 73 74 65 72 20 50 31 0a 2a  to register P1.*
6420: 2a 20 61 6e 64 20 74 68 65 6e 20 6a 75 6d 70 20  * and then jump 
6430: 74 6f 20 61 64 64 72 65 73 73 20 50 32 2e 0a 2a  to address P2..*
6440: 2f 0a 63 61 73 65 20 4f 50 5f 47 6f 73 75 62 3a  /.case OP_Gosub:
6450: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {            /*
6460: 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72   jump */.  asser
6470: 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20  t( pOp->p1>0 && 
6480: 70 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65  pOp->p1<=(p->nMe
6490: 6d 2d 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  m-p->nCursor) );
64a0: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
64b0: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
64c0: 72 74 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  rt( (pIn1->flags
64d0: 20 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d 30 20 29   & MEM_Dyn)==0 )
64e0: 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68  ;.  memAboutToCh
64f0: 61 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20  ange(p, pIn1);. 
6500: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d   pIn1->flags = M
6510: 45 4d 5f 49 6e 74 3b 0a 20 20 70 49 6e 31 2d 3e  EM_Int;.  pIn1->
6520: 75 2e 69 20 3d 20 70 63 3b 0a 20 20 52 45 47 49  u.i = pc;.  REGI
6530: 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
6540: 70 31 2c 20 70 49 6e 31 29 3b 0a 20 20 70 63 20  p1, pIn1);.  pc 
6550: 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
6560: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
6570: 63 6f 64 65 3a 20 20 52 65 74 75 72 6e 20 50 31  code:  Return P1
6580: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a   * * * *.**.** J
6590: 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ump to the next 
65a0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 66 74 65  instruction afte
65b0: 72 20 74 68 65 20 61 64 64 72 65 73 73 20 69 6e  r the address in
65c0: 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2f   register P1..*/
65d0: 0a 63 61 73 65 20 4f 50 5f 52 65 74 75 72 6e 3a  .case OP_Return:
65e0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {           /* 
65f0: 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  in1 */.  pIn1 = 
6600: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
6610: 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e    assert( pIn1->
6620: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
6630: 29 3b 0a 20 20 70 63 20 3d 20 28 69 6e 74 29 70  );.  pc = (int)p
6640: 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 62 72 65 61  In1->u.i;.  brea
6650: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
6660: 20 20 59 69 65 6c 64 20 50 31 20 2a 20 2a 20 2a    Yield P1 * * *
6670: 20 2a 0a 2a 2a 0a 2a 2a 20 53 77 61 70 20 74 68   *.**.** Swap th
6680: 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  e program counte
6690: 72 20 77 69 74 68 20 74 68 65 20 76 61 6c 75 65  r with the value
66a0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
66b0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 59 69 65 6c  .*/.case OP_Yiel
66c0: 64 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  d: {            
66d0: 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 69 6e 74 20  /* in1 */.  int 
66e0: 70 63 44 65 73 74 3b 0a 20 20 70 49 6e 31 20 3d  pcDest;.  pIn1 =
66f0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
6700: 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 31  .  assert( (pIn1
6710: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79  ->flags & MEM_Dy
6720: 6e 29 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31 2d  n)==0 );.  pIn1-
6730: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
6740: 3b 0a 20 20 70 63 44 65 73 74 20 3d 20 28 69 6e  ;.  pcDest = (in
6750: 74 29 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 70  t)pIn1->u.i;.  p
6760: 49 6e 31 2d 3e 75 2e 69 20 3d 20 70 63 3b 0a 20  In1->u.i = pc;. 
6770: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
6780: 70 4f 70 2d 3e 70 31 2c 20 70 49 6e 31 29 3b 0a  pOp->p1, pIn1);.
6790: 20 20 70 63 20 3d 20 70 63 44 65 73 74 3b 0a 20    pc = pcDest;. 
67a0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
67b0: 63 6f 64 65 3a 20 20 48 61 6c 74 49 66 4e 75 6c  code:  HaltIfNul
67c0: 6c 20 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  l  P1 P2 P3 P4 *
67d0: 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65  .**.** Check the
67e0: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
67f0: 65 72 20 50 33 2e 20 20 49 66 20 69 74 20 69 73  er P3.  If it is
6800: 20 4e 55 4c 4c 20 74 68 65 6e 20 48 61 6c 74 20   NULL then Halt 
6810: 75 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74  using.** paramet
6820: 65 72 20 50 31 2c 20 50 32 2c 20 61 6e 64 20 50  er P1, P2, and P
6830: 34 20 61 73 20 69 66 20 74 68 69 73 20 77 65 72  4 as if this wer
6840: 65 20 61 20 48 61 6c 74 20 69 6e 73 74 72 75 63  e a Halt instruc
6850: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 0a 2a 2a  tion.  If the.**
6860: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
6870: 65 72 20 50 33 20 69 73 20 6e 6f 74 20 4e 55 4c  er P3 is not NUL
6880: 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  L, then this rou
6890: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
68a0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 48 61 6c 74  .*/.case OP_Halt
68b0: 49 66 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 2f  IfNull: {      /
68c0: 2a 20 69 6e 33 20 2a 2f 0a 20 20 70 49 6e 33 20  * in3 */.  pIn3 
68d0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
68e0: 3b 0a 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66  ;.  if( (pIn3->f
68f0: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
6900: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 2f  ==0 ) break;.  /
6910: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  * Fall through i
6920: 6e 74 6f 20 4f 50 5f 48 61 6c 74 20 2a 2f 0a 7d  nto OP_Halt */.}
6930: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 48 61  ../* Opcode:  Ha
6940: 6c 74 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a  lt P1 P2 * P4 *.
6950: 2a 2a 0a 2a 2a 20 45 78 69 74 20 69 6d 6d 65 64  **.** Exit immed
6960: 69 61 74 65 6c 79 2e 20 20 41 6c 6c 20 6f 70 65  iately.  All ope
6970: 6e 20 63 75 72 73 6f 72 73 2c 20 65 74 63 20 61  n cursors, etc a
6980: 72 65 20 63 6c 6f 73 65 64 0a 2a 2a 20 61 75 74  re closed.** aut
6990: 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2a 0a 2a  omatically..**.*
69a0: 2a 20 50 31 20 69 73 20 74 68 65 20 72 65 73 75  * P1 is the resu
69b0: 6c 74 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  lt code returned
69c0: 20 62 79 20 73 71 6c 69 74 65 33 5f 65 78 65 63   by sqlite3_exec
69d0: 28 29 2c 20 73 71 6c 69 74 65 33 5f 72 65 73 65  (), sqlite3_rese
69e0: 74 28 29 2c 0a 2a 2a 20 6f 72 20 73 71 6c 69 74  t(),.** or sqlit
69f0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 2e 20 20  e3_finalize().  
6a00: 46 6f 72 20 61 20 6e 6f 72 6d 61 6c 20 68 61 6c  For a normal hal
6a10: 74 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 62  t, this should b
6a20: 65 20 53 51 4c 49 54 45 5f 4f 4b 20 28 30 29 2e  e SQLITE_OK (0).
6a30: 0a 2a 2a 20 46 6f 72 20 65 72 72 6f 72 73 2c 20  .** For errors, 
6a40: 69 74 20 63 61 6e 20 62 65 20 73 6f 6d 65 20 6f  it can be some o
6a50: 74 68 65 72 20 76 61 6c 75 65 2e 20 20 49 66 20  ther value.  If 
6a60: 50 31 21 3d 30 20 74 68 65 6e 20 50 32 20 77 69  P1!=0 then P2 wi
6a70: 6c 6c 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  ll determine.** 
6a80: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
6a90: 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 63  o rollback the c
6aa0: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
6ab0: 6f 6e 2e 20 20 44 6f 20 6e 6f 74 20 72 6f 6c 6c  on.  Do not roll
6ac0: 62 61 63 6b 0a 2a 2a 20 69 66 20 50 32 3d 3d 4f  back.** if P2==O
6ad0: 45 5f 46 61 69 6c 2e 20 44 6f 20 74 68 65 20 72  E_Fail. Do the r
6ae0: 6f 6c 6c 62 61 63 6b 20 69 66 20 50 32 3d 3d 4f  ollback if P2==O
6af0: 45 5f 52 6f 6c 6c 62 61 63 6b 2e 20 20 49 66 20  E_Rollback.  If 
6b00: 50 32 3d 3d 4f 45 5f 41 62 6f 72 74 2c 0a 2a 2a  P2==OE_Abort,.**
6b10: 20 74 68 65 6e 20 62 61 63 6b 20 6f 75 74 20 61   then back out a
6b20: 6c 6c 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ll changes that 
6b30: 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 64 75  have occurred du
6b40: 72 69 6e 67 20 74 68 69 73 20 65 78 65 63 75 74  ring this execut
6b50: 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44  ion of the.** VD
6b60: 42 45 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 72  BE, but do not r
6b70: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
6b80: 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  saction. .**.** 
6b90: 49 66 20 50 34 20 69 73 20 6e 6f 74 20 6e 75 6c  If P4 is not nul
6ba0: 6c 20 74 68 65 6e 20 69 74 20 69 73 20 61 6e 20  l then it is an 
6bb0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
6bc0: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ring..**.** Ther
6bd0: 65 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64 20  e is an implied 
6be0: 22 48 61 6c 74 20 30 20 30 20 30 22 20 69 6e 73  "Halt 0 0 0" ins
6bf0: 74 72 75 63 74 69 6f 6e 20 69 6e 73 65 72 74 65  truction inserte
6c00: 64 20 61 74 20 74 68 65 20 76 65 72 79 20 65 6e  d at the very en
6c10: 64 20 6f 66 0a 2a 2a 20 65 76 65 72 79 20 70 72  d of.** every pr
6c20: 6f 67 72 61 6d 2e 20 20 53 6f 20 61 20 6a 75 6d  ogram.  So a jum
6c30: 70 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  p past the last 
6c40: 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74  instruction of t
6c50: 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 69 73  he program.** is
6c60: 20 74 68 65 20 73 61 6d 65 20 61 73 20 65 78 65   the same as exe
6c70: 63 75 74 69 6e 67 20 48 61 6c 74 2e 0a 2a 2f 0a  cuting Halt..*/.
6c80: 63 61 73 65 20 4f 50 5f 48 61 6c 74 3a 20 7b 0a  case OP_Halt: {.
6c90: 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 53    if( pOp->p1==S
6ca0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70  QLITE_OK && p->p
6cb0: 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Frame ){.    /* 
6cc0: 48 61 6c 74 20 74 68 65 20 73 75 62 2d 70 72 6f  Halt the sub-pro
6cd0: 67 72 61 6d 2e 20 52 65 74 75 72 6e 20 63 6f 6e  gram. Return con
6ce0: 74 72 6f 6c 20 74 6f 20 74 68 65 20 70 61 72 65  trol to the pare
6cf0: 6e 74 20 66 72 61 6d 65 2e 20 2a 2f 0a 20 20 20  nt frame. */.   
6d00: 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61   VdbeFrame *pFra
6d10: 6d 65 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a  me = p->pFrame;.
6d20: 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20      p->pFrame = 
6d30: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b  pFrame->pParent;
6d40: 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 2d 2d  .    p->nFrame--
6d50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6d60: 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
6d70: 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
6d80: 20 70 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   pc = sqlite3Vdb
6d90: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46  eFrameRestore(pF
6da0: 72 61 6d 65 29 3b 0a 20 20 20 20 6c 61 73 74 52  rame);.    lastR
6db0: 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61 73 74 52  owid = db->lastR
6dc0: 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20 70 4f  owid;.    if( pO
6dd0: 70 2d 3e 70 32 3d 3d 4f 45 5f 49 67 6e 6f 72 65  p->p2==OE_Ignore
6de0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 73   ){.      /* Ins
6df0: 74 72 75 63 74 69 6f 6e 20 70 63 20 69 73 20 74  truction pc is t
6e00: 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 74 68  he OP_Program th
6e10: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 65 20 73  at invoked the s
6e20: 75 62 2d 70 72 6f 67 72 61 6d 20 0a 20 20 20 20  ub-program .    
6e30: 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62    ** currently b
6e40: 65 69 6e 67 20 68 61 6c 74 65 64 2e 20 49 66 20  eing halted. If 
6e50: 74 68 65 20 70 32 20 69 6e 73 74 72 75 63 74 69  the p2 instructi
6e60: 6f 6e 20 6f 66 20 74 68 69 73 20 4f 50 5f 48 61  on of this OP_Ha
6e70: 6c 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73 74  lt.      ** inst
6e80: 72 75 63 74 69 6f 6e 20 69 73 20 73 65 74 20 74  ruction is set t
6e90: 6f 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 74 68 65  o OE_Ignore, the
6ea0: 6e 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61  n the sub-progra
6eb0: 6d 20 69 73 20 74 68 72 6f 77 69 6e 67 0a 20 20  m is throwing.  
6ec0: 20 20 20 20 2a 2a 20 61 6e 20 49 47 4e 4f 52 45      ** an IGNORE
6ed0: 20 65 78 63 65 70 74 69 6f 6e 2e 20 49 6e 20 74   exception. In t
6ee0: 68 69 73 20 63 61 73 65 20 6a 75 6d 70 20 74 6f  his case jump to
6ef0: 20 74 68 65 20 61 64 64 72 65 73 73 20 73 70 65   the address spe
6f00: 63 69 66 69 65 64 0a 20 20 20 20 20 20 2a 2a 20  cified.      ** 
6f10: 61 73 20 74 68 65 20 70 32 20 6f 66 20 74 68 65  as the p2 of the
6f20: 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50 72 6f 67   calling OP_Prog
6f30: 72 61 6d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70  ram.  */.      p
6f40: 63 20 3d 20 70 2d 3e 61 4f 70 5b 70 63 5d 2e 70  c = p->aOp[pc].p
6f50: 32 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  2-1;.    }.    a
6f60: 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20  Op = p->aOp;.   
6f70: 20 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b   aMem = p->aMem;
6f80: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6f90: 0a 20 20 70 2d 3e 72 63 20 3d 20 70 4f 70 2d 3e  .  p->rc = pOp->
6fa0: 70 31 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63  p1;.  p->errorAc
6fb0: 74 69 6f 6e 20 3d 20 28 75 38 29 70 4f 70 2d 3e  tion = (u8)pOp->
6fc0: 70 32 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 70 63  p2;.  p->pc = pc
6fd0: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 2e  ;.  if( pOp->p4.
6fe0: 7a 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  z ){.    assert(
6ff0: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
7000: 4b 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  K );.    sqlite3
7010: 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
7020: 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c  rrMsg, db, "%s",
7030: 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20   pOp->p4.z);.   
7040: 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
7050: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
7060: 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 20 20 73 71  Log!=0 );.    sq
7070: 6c 69 74 65 33 5f 6c 6f 67 28 70 4f 70 2d 3e 70  lite3_log(pOp->p
7080: 31 2c 20 22 61 62 6f 72 74 20 61 74 20 25 64 20  1, "abort at %d 
7090: 69 6e 20 5b 25 73 5d 3a 20 25 73 22 2c 20 70 63  in [%s]: %s", pc
70a0: 2c 20 70 2d 3e 7a 53 71 6c 2c 20 70 4f 70 2d 3e  , p->zSql, pOp->
70b0: 70 34 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65 20 69  p4.z);.  }else i
70c0: 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20  f( p->rc ){.    
70d0: 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
70e0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
70f0: 6f 67 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  og!=0 );.    sql
7100: 69 74 65 33 5f 6c 6f 67 28 70 4f 70 2d 3e 70 31  ite3_log(pOp->p1
7110: 2c 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  , "constraint fa
7120: 69 6c 65 64 20 61 74 20 25 64 20 69 6e 20 5b 25  iled at %d in [%
7130: 73 5d 22 2c 20 70 63 2c 20 70 2d 3e 7a 53 71 6c  s]", pc, p->zSql
7140: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
7150: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
7160: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
7170: 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 72  SQLITE_BUSY || r
7180: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
7190: 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
71a0: 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
71b0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
71c0: 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53 51   p->rc = rc = SQ
71d0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  LITE_BUSY;.  }el
71e0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
71f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
7200: 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53   (p->rc&0xff)==S
7210: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
7220: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
7230: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
7240: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
7250: 6e 73 3e 30 20 7c 7c 20 64 62 2d 3e 6e 44 65 66  ns>0 || db->nDef
7260: 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3e 30 20 29  erredImmCons>0 )
7270: 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63  ;.    rc = p->rc
7280: 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   ? SQLITE_ERROR 
7290: 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  : SQLITE_DONE;. 
72a0: 20 7d 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 72   }.  goto vdbe_r
72b0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  eturn;.}../* Opc
72c0: 6f 64 65 3a 20 49 6e 74 65 67 65 72 20 50 31 20  ode: Integer P1 
72d0: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  P2 * * *.**.** T
72e0: 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  he 32-bit intege
72f0: 72 20 76 61 6c 75 65 20 50 31 20 69 73 20 77 72  r value P1 is wr
7300: 69 74 74 65 6e 20 69 6e 74 6f 20 72 65 67 69 73  itten into regis
7310: 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20  ter P2..*/.case 
7320: 4f 50 5f 49 6e 74 65 67 65 72 3a 20 7b 20 20 20  OP_Integer: {   
7330: 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72        /* out2-pr
7340: 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 70 4f  erelease */.  pO
7350: 75 74 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  ut->u.i = pOp->p
7360: 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  1;.  break;.}../
7370: 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 36 34 20  * Opcode: Int64 
7380: 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  * P2 * P4 *.**.*
7390: 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65  * P4 is a pointe
73a0: 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20 69 6e  r to a 64-bit in
73b0: 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2a 20  teger value..** 
73c0: 57 72 69 74 65 20 74 68 61 74 20 76 61 6c 75 65  Write that value
73d0: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
73e0: 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  2..*/.case OP_In
73f0: 74 36 34 3a 20 7b 20 20 20 20 20 20 20 20 20 20  t64: {          
7400: 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65   /* out2-prerele
7410: 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ase */.  assert(
7420: 20 70 4f 70 2d 3e 70 34 2e 70 49 36 34 21 3d 30   pOp->p4.pI64!=0
7430: 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20   );.  pOut->u.i 
7440: 3d 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 3b  = *pOp->p4.pI64;
7450: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66  .  break;.}..#if
7460: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7470: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
7480: 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 61 6c 20  /* Opcode: Real 
7490: 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  * P2 * P4 *.**.*
74a0: 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65  * P4 is a pointe
74b0: 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20 66 6c  r to a 64-bit fl
74c0: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
74d0: 75 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 61  ue..** Write tha
74e0: 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67  t value into reg
74f0: 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73  ister P2..*/.cas
7500: 65 20 4f 50 5f 52 65 61 6c 3a 20 7b 20 20 20 20  e OP_Real: {    
7510: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
7520: 61 73 20 54 4b 5f 46 4c 4f 41 54 2c 20 6f 75 74  as TK_FLOAT, out
7530: 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a  2-prerelease */.
7540: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
7550: 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 61 73 73 65  MEM_Real;.  asse
7560: 72 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61  rt( !sqlite3IsNa
7570: 4e 28 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c  N(*pOp->p4.pReal
7580: 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 72 20 3d  ) );.  pOut->r =
7590: 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 3b   *pOp->p4.pReal;
75a0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
75b0: 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  if../* Opcode: S
75c0: 74 72 69 6e 67 38 20 2a 20 50 32 20 2a 20 50 34  tring8 * P2 * P4
75d0: 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e   *.**.** P4 poin
75e0: 74 73 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  ts to a nul term
75f0: 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73 74 72  inated UTF-8 str
7600: 69 6e 67 2e 20 54 68 69 73 20 6f 70 63 6f 64 65  ing. This opcode
7610: 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   is transformed 
7620: 0a 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 53  .** into an OP_S
7630: 74 72 69 6e 67 20 62 65 66 6f 72 65 20 69 74 20  tring before it 
7640: 69 73 20 65 78 65 63 75 74 65 64 20 66 6f 72 20  is executed for 
7650: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 2e 0a  the first time..
7660: 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 74 72 69 6e  */.case OP_Strin
7670: 67 38 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a  g8: {         /*
7680: 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 54 52 49   same as TK_STRI
7690: 4e 47 2c 20 6f 75 74 32 2d 70 72 65 72 65 6c 65  NG, out2-prerele
76a0: 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ase */.  assert(
76b0: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b   pOp->p4.z!=0 );
76c0: 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
76d0: 20 4f 50 5f 53 74 72 69 6e 67 3b 0a 20 20 70 4f   OP_String;.  pO
76e0: 70 2d 3e 70 31 20 3d 20 73 71 6c 69 74 65 33 53  p->p1 = sqlite3S
76f0: 74 72 6c 65 6e 33 30 28 70 4f 70 2d 3e 70 34 2e  trlen30(pOp->p4.
7700: 7a 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  z);..#ifndef SQL
7710: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
7720: 20 69 66 28 20 65 6e 63 6f 64 69 6e 67 21 3d 53   if( encoding!=S
7730: 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20  QLITE_UTF8 ){.  
7740: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
7750: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4f 75 74  beMemSetStr(pOut
7760: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 2d 31 2c  , pOp->p4.z, -1,
7770: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
7780: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
7790: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
77a0: 5f 54 4f 4f 42 49 47 20 29 20 67 6f 74 6f 20 74  _TOOBIG ) goto t
77b0: 6f 6f 5f 62 69 67 3b 0a 20 20 20 20 69 66 28 20  oo_big;.    if( 
77c0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
77d0: 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f  e3VdbeChangeEnco
77e0: 64 69 6e 67 28 70 4f 75 74 2c 20 65 6e 63 6f 64  ding(pOut, encod
77f0: 69 6e 67 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  ing) ) goto no_m
7800: 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  em;.    assert( 
7810: 70 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 70  pOut->zMalloc==p
7820: 4f 75 74 2d 3e 7a 20 29 3b 0a 20 20 20 20 61 73  Out->z );.    as
7830: 73 65 72 74 28 20 70 4f 75 74 2d 3e 66 6c 61 67  sert( pOut->flag
7840: 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20  s & MEM_Dyn );. 
7850: 20 20 20 70 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63     pOut->zMalloc
7860: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e   = 0;.    pOut->
7870: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 53 74 61  flags |= MEM_Sta
7880: 74 69 63 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66  tic;.    pOut->f
7890: 6c 61 67 73 20 26 3d 20 7e 4d 45 4d 5f 44 79 6e  lags &= ~MEM_Dyn
78a0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  ;.    if( pOp->p
78b0: 34 74 79 70 65 3d 3d 50 34 5f 44 59 4e 41 4d 49  4type==P4_DYNAMI
78c0: 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  C ){.      sqlit
78d0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70  e3DbFree(db, pOp
78e0: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20  ->p4.z);.    }. 
78f0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
7900: 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 20   P4_DYNAMIC;.   
7910: 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 70 4f 75   pOp->p4.z = pOu
7920: 74 2d 3e 7a 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  t->z;.    pOp->p
7930: 31 20 3d 20 70 4f 75 74 2d 3e 6e 3b 0a 20 20 7d  1 = pOut->n;.  }
7940: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4f  .#endif.  if( pO
7950: 70 2d 3e 70 31 3e 64 62 2d 3e 61 4c 69 6d 69 74  p->p1>db->aLimit
7960: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
7970: 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74  NGTH] ){.    got
7980: 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20  o too_big;.  }. 
7990: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
79a0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73   to the next cas
79b0: 65 2c 20 4f 50 5f 53 74 72 69 6e 67 20 2a 2f 0a  e, OP_String */.
79c0: 7d 0a 20 20 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  }.  ./* Opcode: 
79d0: 53 74 72 69 6e 67 20 50 31 20 50 32 20 2a 20 50  String P1 P2 * P
79e0: 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74  4 *.**.** The st
79f0: 72 69 6e 67 20 76 61 6c 75 65 20 50 34 20 6f 66  ring value P4 of
7a00: 20 6c 65 6e 67 74 68 20 50 31 20 28 62 79 74 65   length P1 (byte
7a10: 73 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  s) is stored in 
7a20: 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a  register P2..*/.
7a30: 63 61 73 65 20 4f 50 5f 53 74 72 69 6e 67 3a 20  case OP_String: 
7a40: 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75  {          /* ou
7a50: 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f  t2-prerelease */
7a60: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
7a70: 70 34 2e 7a 21 3d 30 20 29 3b 0a 20 20 70 4f 75  p4.z!=0 );.  pOu
7a80: 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  t->flags = MEM_S
7a90: 74 72 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45  tr|MEM_Static|ME
7aa0: 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e  M_Term;.  pOut->
7ab0: 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  z = pOp->p4.z;. 
7ac0: 20 70 4f 75 74 2d 3e 6e 20 3d 20 70 4f 70 2d 3e   pOut->n = pOp->
7ad0: 70 31 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20  p1;.  pOut->enc 
7ae0: 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50  = encoding;.  UP
7af0: 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
7b00: 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b  E(pOut);.  break
7b10: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
7b20: 4e 75 6c 6c 20 50 31 20 50 32 20 50 33 20 2a 20  Null P1 P2 P3 * 
7b30: 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  *.**.** Write a 
7b40: 4e 55 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73 74  NULL into regist
7b50: 65 72 73 20 50 32 2e 20 20 49 66 20 50 33 20 67  ers P2.  If P3 g
7b60: 72 65 61 74 65 72 20 74 68 61 6e 20 50 32 2c 20  reater than P2, 
7b70: 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a  then also write.
7b80: 2a 2a 20 4e 55 4c 4c 20 69 6e 74 6f 20 72 65 67  ** NULL into reg
7b90: 69 73 74 65 72 20 50 33 20 61 6e 64 20 65 76 65  ister P3 and eve
7ba0: 72 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 62  ry register in b
7bb0: 65 74 77 65 65 6e 20 50 32 20 61 6e 64 20 50 33  etween P2 and P3
7bc0: 2e 20 20 49 66 20 50 33 0a 2a 2a 20 69 73 20 6c  .  If P3.** is l
7bd0: 65 73 73 20 74 68 61 6e 20 50 32 20 28 74 79 70  ess than P2 (typ
7be0: 69 63 61 6c 6c 79 20 50 33 20 69 73 20 7a 65 72  ically P3 is zer
7bf0: 6f 29 20 74 68 65 6e 20 6f 6e 6c 79 20 72 65 67  o) then only reg
7c00: 69 73 74 65 72 20 50 32 20 69 73 0a 2a 2a 20 73  ister P2 is.** s
7c10: 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
7c20: 2a 20 49 66 20 74 68 65 20 50 31 20 76 61 6c 75  * If the P1 valu
7c30: 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  e is non-zero, t
7c40: 68 65 6e 20 61 6c 73 6f 20 73 65 74 20 74 68 65  hen also set the
7c50: 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 66 6c 61   MEM_Cleared fla
7c60: 67 20 73 6f 20 74 68 61 74 0a 2a 2a 20 4e 55 4c  g so that.** NUL
7c70: 4c 20 76 61 6c 75 65 73 20 77 69 6c 6c 20 6e 6f  L values will no
7c80: 74 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20  t compare equal 
7c90: 65 76 65 6e 20 69 66 20 53 51 4c 49 54 45 5f 4e  even if SQLITE_N
7ca0: 55 4c 4c 45 51 20 69 73 20 73 65 74 20 6f 6e 0a  ULLEQ is set on.
7cb0: 2a 2a 20 4f 50 5f 4e 65 20 6f 72 20 4f 50 5f 45  ** OP_Ne or OP_E
7cc0: 71 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 75  q..*/.case OP_Nu
7cd0: 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ll: {           
7ce0: 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61  /* out2-prerelea
7cf0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  se */.  int cnt;
7d00: 0a 20 20 75 31 36 20 6e 75 6c 6c 46 6c 61 67 3b  .  u16 nullFlag;
7d10: 0a 20 20 63 6e 74 20 3d 20 70 4f 70 2d 3e 70 33  .  cnt = pOp->p3
7d20: 2d 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65  -pOp->p2;.  asse
7d30: 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d  rt( pOp->p3<=(p-
7d40: 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f 72  >nMem-p->nCursor
7d50: 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61  ) );.  pOut->fla
7d60: 67 73 20 3d 20 6e 75 6c 6c 46 6c 61 67 20 3d 20  gs = nullFlag = 
7d70: 70 4f 70 2d 3e 70 31 20 3f 20 28 4d 45 4d 5f 4e  pOp->p1 ? (MEM_N
7d80: 75 6c 6c 7c 4d 45 4d 5f 43 6c 65 61 72 65 64 29  ull|MEM_Cleared)
7d90: 20 3a 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 77   : MEM_Null;.  w
7da0: 68 69 6c 65 28 20 63 6e 74 3e 30 20 29 7b 0a 20  hile( cnt>0 ){. 
7db0: 20 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 20 20 6d     pOut++;.    m
7dc0: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
7dd0: 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 56 64  p, pOut);.    Vd
7de0: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4f 75  beMemRelease(pOu
7df0: 74 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c  t);.    pOut->fl
7e00: 61 67 73 20 3d 20 6e 75 6c 6c 46 6c 61 67 3b 0a  ags = nullFlag;.
7e10: 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 7d 0a 20      cnt--;.  }. 
7e20: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f   break;.}.../* O
7e30: 70 63 6f 64 65 3a 20 42 6c 6f 62 20 50 31 20 50  pcode: Blob P1 P
7e40: 32 20 2a 20 50 34 0a 2a 2a 0a 2a 2a 20 50 34 20  2 * P4.**.** P4 
7e50: 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 6c 6f 62  points to a blob
7e60: 20 6f 66 20 64 61 74 61 20 50 31 20 62 79 74 65   of data P1 byte
7e70: 73 20 6c 6f 6e 67 2e 20 20 53 74 6f 72 65 20 74  s long.  Store t
7e80: 68 69 73 0a 2a 2a 20 62 6c 6f 62 20 69 6e 20 72  his.** blob in r
7e90: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63  egister P2..*/.c
7ea0: 61 73 65 20 4f 50 5f 42 6c 6f 62 3a 20 7b 20 20  ase OP_Blob: {  
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7ec0: 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65   out2-prerelease
7ed0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f   */.  assert( pO
7ee0: 70 2d 3e 70 31 20 3c 3d 20 53 51 4c 49 54 45 5f  p->p1 <= SQLITE_
7ef0: 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  MAX_LENGTH );.  
7f00: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
7f10: 74 53 74 72 28 70 4f 75 74 2c 20 70 4f 70 2d 3e  tStr(pOut, pOp->
7f20: 70 34 2e 7a 2c 20 70 4f 70 2d 3e 70 31 2c 20 30  p4.z, pOp->p1, 0
7f30: 2c 20 30 29 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e  , 0);.  pOut->en
7f40: 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20  c = encoding;.  
7f50: 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
7f60: 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65  IZE(pOut);.  bre
7f70: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
7f80: 3a 20 56 61 72 69 61 62 6c 65 20 50 31 20 50 32  : Variable P1 P2
7f90: 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 72   * P4 *.**.** Tr
7fa0: 61 6e 73 66 65 72 20 74 68 65 20 76 61 6c 75 65  ansfer the value
7fb0: 73 20 6f 66 20 62 6f 75 6e 64 20 70 61 72 61 6d  s of bound param
7fc0: 65 74 65 72 20 50 31 20 69 6e 74 6f 20 72 65 67  eter P1 into reg
7fd0: 69 73 74 65 72 20 50 32 0a 2a 2a 0a 2a 2a 20 49  ister P2.**.** I
7fe0: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
7ff0: 69 73 20 6e 61 6d 65 64 2c 20 74 68 65 6e 20 69  is named, then i
8000: 74 73 20 6e 61 6d 65 20 61 70 70 65 61 72 73 20  ts name appears 
8010: 69 6e 20 50 34 20 61 6e 64 20 50 33 3d 3d 31 2e  in P4 and P3==1.
8020: 0a 2a 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65  .** The P4 value
8030: 20 69 73 20 75 73 65 64 20 62 79 20 73 71 6c 69   is used by sqli
8040: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
8050: 65 72 5f 6e 61 6d 65 28 29 2e 0a 2a 2f 0a 63 61  er_name()..*/.ca
8060: 73 65 20 4f 50 5f 56 61 72 69 61 62 6c 65 3a 20  se OP_Variable: 
8070: 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  {            /* 
8080: 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20  out2-prerelease 
8090: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 56 61 72 3b 20  */.  Mem *pVar; 
80a0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 62        /* Value b
80b0: 65 69 6e 67 20 74 72 61 6e 73 66 65 72 72 65 64  eing transferred
80c0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
80d0: 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d  Op->p1>0 && pOp-
80e0: 3e 70 31 3c 3d 70 2d 3e 6e 56 61 72 20 29 3b 0a  >p1<=p->nVar );.
80f0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
8100: 34 2e 7a 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70  4.z==0 || pOp->p
8110: 34 2e 7a 3d 3d 70 2d 3e 61 7a 56 61 72 5b 70 4f  4.z==p->azVar[pO
8120: 70 2d 3e 70 31 2d 31 5d 20 29 3b 0a 20 20 70 56  p->p1-1] );.  pV
8130: 61 72 20 3d 20 26 70 2d 3e 61 56 61 72 5b 70 4f  ar = &p->aVar[pO
8140: 70 2d 3e 70 31 20 2d 20 31 5d 3b 0a 20 20 69 66  p->p1 - 1];.  if
8150: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
8160: 54 6f 6f 42 69 67 28 70 56 61 72 29 20 29 7b 0a  TooBig(pVar) ){.
8170: 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67      goto too_big
8180: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
8190: 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70  dbeMemShallowCop
81a0: 79 28 70 4f 75 74 2c 20 70 56 61 72 2c 20 4d 45  y(pOut, pVar, ME
81b0: 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20 55 50 44  M_Static);.  UPD
81c0: 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
81d0: 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b  (pOut);.  break;
81e0: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d  .}../* Opcode: M
81f0: 6f 76 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a  ove P1 P2 P3 * *
8200: 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  .**.** Move the 
8210: 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74  values in regist
8220: 65 72 20 50 31 2e 2e 50 31 2b 50 33 20 6f 76 65  er P1..P1+P3 ove
8230: 72 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74  r into.** regist
8240: 65 72 73 20 50 32 2e 2e 50 32 2b 50 33 2e 20 20  ers P2..P2+P3.  
8250: 52 65 67 69 73 74 65 72 73 20 50 31 2e 2e 50 31  Registers P1..P1
8260: 2b 50 33 20 61 72 65 0a 2a 2a 20 6c 65 66 74 20  +P3 are.** left 
8270: 68 6f 6c 64 69 6e 67 20 61 20 4e 55 4c 4c 2e 20  holding a NULL. 
8280: 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
8290: 66 6f 72 20 72 65 67 69 73 74 65 72 20 72 61 6e  for register ran
82a0: 67 65 73 0a 2a 2a 20 50 31 2e 2e 50 31 2b 50 33  ges.** P1..P1+P3
82b0: 20 61 6e 64 20 50 32 2e 2e 50 32 2b 50 33 20 74   and P2..P2+P3 t
82c0: 6f 20 6f 76 65 72 6c 61 70 2e 0a 2a 2f 0a 63 61  o overlap..*/.ca
82d0: 73 65 20 4f 50 5f 4d 6f 76 65 3a 20 7b 0a 20 20  se OP_Move: {.  
82e0: 63 68 61 72 20 2a 7a 4d 61 6c 6c 6f 63 3b 20 20  char *zMalloc;  
82f0: 20 2f 2a 20 48 6f 6c 64 69 6e 67 20 76 61 72 69   /* Holding vari
8300: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74  able for allocat
8310: 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
8320: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
8330: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67  /* Number of reg
8340: 69 73 74 65 72 73 20 6c 65 66 74 20 74 6f 20 63  isters left to c
8350: 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 70 31 3b  opy */.  int p1;
8360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
8370: 69 73 74 65 72 20 74 6f 20 63 6f 70 79 20 66 72  ister to copy fr
8380: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 70 32 3b 20  om */.  int p2; 
8390: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
83a0: 73 74 65 72 20 74 6f 20 63 6f 70 79 20 74 6f 20  ster to copy to 
83b0: 2a 2f 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70  */..  n = pOp->p
83c0: 33 20 2b 20 31 3b 0a 20 20 70 31 20 3d 20 70 4f  3 + 1;.  p1 = pO
83d0: 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70 4f  p->p1;.  p2 = pO
83e0: 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28  p->p2;.  assert(
83f0: 20 6e 3e 30 20 26 26 20 70 31 3e 30 20 26 26 20   n>0 && p1>0 && 
8400: 70 32 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p2>0 );.  assert
8410: 28 20 70 31 2b 6e 3c 3d 70 32 20 7c 7c 20 70 32  ( p1+n<=p2 || p2
8420: 2b 6e 3c 3d 70 31 20 29 3b 0a 0a 20 20 70 49 6e  +n<=p1 );..  pIn
8430: 31 20 3d 20 26 61 4d 65 6d 5b 70 31 5d 3b 0a 20  1 = &aMem[p1];. 
8440: 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 32   pOut = &aMem[p2
8450: 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  ];.  while( n-- 
8460: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
8470: 4f 75 74 3c 3d 26 61 4d 65 6d 5b 28 70 2d 3e 6e  Out<=&aMem[(p->n
8480: 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f 72 29 5d  Mem-p->nCursor)]
8490: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
84a0: 70 49 6e 31 3c 3d 26 61 4d 65 6d 5b 28 70 2d 3e  pIn1<=&aMem[(p->
84b0: 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f 72 29  nMem-p->nCursor)
84c0: 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ] );.    assert(
84d0: 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e 31   memIsValid(pIn1
84e0: 29 20 29 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75  ) );.    memAbou
84f0: 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75  tToChange(p, pOu
8500: 74 29 3b 0a 20 20 20 20 7a 4d 61 6c 6c 6f 63 20  t);.    zMalloc 
8510: 3d 20 70 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 3b  = pOut->zMalloc;
8520: 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 4d 61 6c 6c  .    pOut->zMall
8530: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  oc = 0;.    sqli
8540: 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 70  te3VdbeMemMove(p
8550: 4f 75 74 2c 20 70 49 6e 31 29 3b 0a 23 69 66 64  Out, pIn1);.#ifd
8560: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8570: 20 20 20 20 69 66 28 20 70 4f 75 74 2d 3e 70 53      if( pOut->pS
8580: 63 6f 70 79 46 72 6f 6d 3e 3d 26 61 4d 65 6d 5b  copyFrom>=&aMem[
8590: 70 31 5d 20 26 26 20 70 4f 75 74 2d 3e 70 53 63  p1] && pOut->pSc
85a0: 6f 70 79 46 72 6f 6d 3c 26 61 4d 65 6d 5b 70 31  opyFrom<&aMem[p1
85b0: 2b 70 4f 70 2d 3e 70 33 5d 20 29 7b 0a 20 20 20  +pOp->p3] ){.   
85c0: 20 20 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46     pOut->pScopyF
85d0: 72 6f 6d 20 2b 3d 20 70 31 20 2d 20 70 4f 70 2d  rom += p1 - pOp-
85e0: 3e 70 32 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  >p2;.    }.#endi
85f0: 66 0a 20 20 20 20 70 49 6e 31 2d 3e 7a 4d 61 6c  f.    pIn1->zMal
8600: 6c 6f 63 20 3d 20 7a 4d 61 6c 6c 6f 63 3b 0a 20  loc = zMalloc;. 
8610: 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
8620: 45 28 70 32 2b 2b 2c 20 70 4f 75 74 29 3b 0a 20  E(p2++, pOut);. 
8630: 20 20 20 70 49 6e 31 2b 2b 3b 0a 20 20 20 20 70     pIn1++;.    p
8640: 4f 75 74 2b 2b 3b 0a 20 20 7d 0a 20 20 62 72 65  Out++;.  }.  bre
8650: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
8660: 3a 20 43 6f 70 79 20 50 31 20 50 32 20 50 33 20  : Copy P1 P2 P3 
8670: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 61  * *.**.** Make a
8680: 20 63 6f 70 79 20 6f 66 20 72 65 67 69 73 74 65   copy of registe
8690: 72 73 20 50 31 2e 2e 50 31 2b 50 33 20 69 6e 74  rs P1..P1+P3 int
86a0: 6f 20 72 65 67 69 73 74 65 72 73 20 50 32 2e 2e  o registers P2..
86b0: 50 32 2b 50 33 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  P2+P3..**.** Thi
86c0: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6d 61  s instruction ma
86d0: 6b 65 73 20 61 20 64 65 65 70 20 63 6f 70 79 20  kes a deep copy 
86e0: 6f 66 20 74 68 65 20 76 61 6c 75 65 2e 20 20 41  of the value.  A
86f0: 20 64 75 70 6c 69 63 61 74 65 0a 2a 2a 20 69 73   duplicate.** is
8700: 20 6d 61 64 65 20 6f 66 20 61 6e 79 20 73 74 72   made of any str
8710: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 63 6f 6e 73  ing or blob cons
8720: 74 61 6e 74 2e 20 20 53 65 65 20 61 6c 73 6f 20  tant.  See also 
8730: 4f 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 63 61 73  OP_SCopy..*/.cas
8740: 65 20 4f 50 5f 43 6f 70 79 3a 20 7b 0a 20 20 69  e OP_Copy: {.  i
8750: 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70 4f 70  nt n;..  n = pOp
8760: 2d 3e 70 33 3b 0a 20 20 70 49 6e 31 20 3d 20 26  ->p3;.  pIn1 = &
8770: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
8780: 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
8790: 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74  p->p2];.  assert
87a0: 28 20 70 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a  ( pOut!=pIn1 );.
87b0: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
87c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
87d0: 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74  ShallowCopy(pOut
87e0: 2c 20 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65  , pIn1, MEM_Ephe
87f0: 6d 29 3b 0a 20 20 20 20 44 65 65 70 68 65 6d 65  m);.    Deepheme
8800: 72 61 6c 69 7a 65 28 70 4f 75 74 29 3b 0a 23 69  ralize(pOut);.#i
8810: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8820: 47 0a 20 20 20 20 70 4f 75 74 2d 3e 70 53 63 6f  G.    pOut->pSco
8830: 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64  pyFrom = 0;.#end
8840: 69 66 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  if.    REGISTER_
8850: 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2b 70 4f  TRACE(pOp->p2+pO
8860: 70 2d 3e 70 33 2d 6e 2c 20 70 4f 75 74 29 3b 0a  p->p3-n, pOut);.
8870: 20 20 20 20 69 66 28 20 28 6e 2d 2d 29 3d 3d 30      if( (n--)==0
8880: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4f   ) break;.    pO
8890: 75 74 2b 2b 3b 0a 20 20 20 20 70 49 6e 31 2b 2b  ut++;.    pIn1++
88a0: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
88b0: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 43 6f  ../* Opcode: SCo
88c0: 70 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  py P1 P2 * * *.*
88d0: 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 73 68 61 6c  *.** Make a shal
88e0: 6c 6f 77 20 63 6f 70 79 20 6f 66 20 72 65 67 69  low copy of regi
88f0: 73 74 65 72 20 50 31 20 69 6e 74 6f 20 72 65 67  ster P1 into reg
8900: 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  ister P2..**.** 
8910: 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  This instruction
8920: 20 6d 61 6b 65 73 20 61 20 73 68 61 6c 6c 6f 77   makes a shallow
8930: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 76 61 6c   copy of the val
8940: 75 65 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75  ue.  If the valu
8950: 65 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67  e.** is a string
8960: 20 6f 72 20 62 6c 6f 62 2c 20 74 68 65 6e 20 74   or blob, then t
8970: 68 65 20 63 6f 70 79 20 69 73 20 6f 6e 6c 79 20  he copy is only 
8980: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
8990: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 61 6e 64  .** original and
89a0: 20 68 65 6e 63 65 20 69 66 20 74 68 65 20 6f 72   hence if the or
89b0: 69 67 69 6e 61 6c 20 63 68 61 6e 67 65 73 20 73  iginal changes s
89c0: 6f 20 77 69 6c 6c 20 74 68 65 20 63 6f 70 79 2e  o will the copy.
89d0: 0a 2a 2a 20 57 6f 72 73 65 2c 20 69 66 20 74 68  .** Worse, if th
89e0: 65 20 6f 72 69 67 69 6e 61 6c 20 69 73 20 64 65  e original is de
89f0: 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 20 63  allocated, the c
8a00: 6f 70 79 20 62 65 63 6f 6d 65 73 20 69 6e 76 61  opy becomes inva
8a10: 6c 69 64 2e 0a 2a 2a 20 54 68 75 73 20 74 68 65  lid..** Thus the
8a20: 20 70 72 6f 67 72 61 6d 20 6d 75 73 74 20 67 75   program must gu
8a30: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
8a40: 20 6f 72 69 67 69 6e 61 6c 20 77 69 6c 6c 20 6e   original will n
8a50: 6f 74 20 63 68 61 6e 67 65 0a 2a 2a 20 64 75 72  ot change.** dur
8a60: 69 6e 67 20 74 68 65 20 6c 69 66 65 74 69 6d 65  ing the lifetime
8a70: 20 6f 66 20 74 68 65 20 63 6f 70 79 2e 20 20 55   of the copy.  U
8a80: 73 65 20 4f 50 5f 43 6f 70 79 20 74 6f 20 6d 61  se OP_Copy to ma
8a90: 6b 65 20 61 20 63 6f 6d 70 6c 65 74 65 0a 2a 2a  ke a complete.**
8aa0: 20 63 6f 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f   copy..*/.case O
8ab0: 50 5f 53 43 6f 70 79 3a 20 7b 20 20 20 20 20 20  P_SCopy: {      
8ac0: 20 20 20 20 20 20 2f 2a 20 69 6e 31 2c 20 6f 75        /* in1, ou
8ad0: 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  t2 */.  pIn1 = &
8ae0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
8af0: 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
8b00: 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74  p->p2];.  assert
8b10: 28 20 70 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a  ( pOut!=pIn1 );.
8b20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
8b30: 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74  ShallowCopy(pOut
8b40: 2c 20 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65  , pIn1, MEM_Ephe
8b50: 6d 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m);.#ifdef SQLIT
8b60: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 4f  E_DEBUG.  if( pO
8b70: 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3d 3d  ut->pScopyFrom==
8b80: 30 20 29 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79  0 ) pOut->pScopy
8b90: 46 72 6f 6d 20 3d 20 70 49 6e 31 3b 0a 23 65 6e  From = pIn1;.#en
8ba0: 64 69 66 0a 20 20 52 45 47 49 53 54 45 52 5f 54  dif.  REGISTER_T
8bb0: 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f  RACE(pOp->p2, pO
8bc0: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
8bd0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 75  ./* Opcode: Resu
8be0: 6c 74 52 6f 77 20 50 31 20 50 32 20 2a 20 2a 20  ltRow P1 P2 * * 
8bf0: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69  *.**.** The regi
8c00: 73 74 65 72 73 20 50 31 20 74 68 72 6f 75 67 68  sters P1 through
8c10: 20 50 31 2b 50 32 2d 31 20 63 6f 6e 74 61 69 6e   P1+P2-1 contain
8c20: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
8c30: 0a 2a 2a 20 72 65 73 75 6c 74 73 2e 20 54 68 69  .** results. Thi
8c40: 73 20 6f 70 63 6f 64 65 20 63 61 75 73 65 73 20  s opcode causes 
8c50: 74 68 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  the sqlite3_step
8c60: 28 29 20 63 61 6c 6c 20 74 6f 20 74 65 72 6d 69  () call to termi
8c70: 6e 61 74 65 0a 2a 2a 20 77 69 74 68 20 61 6e 20  nate.** with an 
8c80: 53 51 4c 49 54 45 5f 52 4f 57 20 72 65 74 75 72  SQLITE_ROW retur
8c90: 6e 20 63 6f 64 65 20 61 6e 64 20 69 74 20 73 65  n code and it se
8ca0: 74 73 20 75 70 20 74 68 65 20 73 71 6c 69 74 65  ts up the sqlite
8cb0: 33 5f 73 74 6d 74 0a 2a 2a 20 73 74 72 75 63 74  3_stmt.** struct
8cc0: 75 72 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61  ure to provide a
8cd0: 63 63 65 73 73 20 74 6f 20 74 68 65 20 74 6f 70  ccess to the top
8ce0: 20 50 31 20 76 61 6c 75 65 73 20 61 73 20 74 68   P1 values as th
8cf0: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 6f 77 2e  e result.** row.
8d00: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 75  .*/.case OP_Resu
8d10: 6c 74 52 6f 77 3a 20 7b 0a 20 20 4d 65 6d 20 2a  ltRow: {.  Mem *
8d20: 70 4d 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pMem;.  int i;. 
8d30: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 73   assert( p->nRes
8d40: 43 6f 6c 75 6d 6e 3d 3d 70 4f 70 2d 3e 70 32 20  Column==pOp->p2 
8d50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
8d60: 2d 3e 70 31 3e 30 20 29 3b 0a 20 20 61 73 73 65  ->p1>0 );.  asse
8d70: 72 74 28 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d  rt( pOp->p1+pOp-
8d80: 3e 70 32 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d 70 2d  >p2<=(p->nMem-p-
8d90: 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 0a  >nCursor)+1 );..
8da0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 74 61    /* If this sta
8db0: 74 65 6d 65 6e 74 20 68 61 73 20 76 69 6f 6c 61  tement has viola
8dc0: 74 65 64 20 69 6d 6d 65 64 69 61 74 65 20 66 6f  ted immediate fo
8dd0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
8de0: 61 69 6e 74 73 2c 20 64 6f 0a 20 20 2a 2a 20 6e  aints, do.  ** n
8df0: 6f 74 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ot return the nu
8e00: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6d 6f 64  mber of rows mod
8e10: 69 66 69 65 64 2e 20 41 6e 64 20 64 6f 20 6e 6f  ified. And do no
8e20: 74 20 52 45 4c 45 41 53 45 20 74 68 65 20 73 74  t RELEASE the st
8e30: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61  atement.  ** tra
8e40: 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 6e 65 65  nsaction. It nee
8e50: 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
8e60: 62 61 63 6b 2e 20 20 2a 2f 0a 20 20 69 66 28 20  back.  */.  if( 
8e70: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
8e80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
8e90: 6b 46 6b 28 70 2c 20 30 29 29 20 29 7b 0a 20 20  kFk(p, 0)) ){.  
8ea0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 66 6c    assert( db->fl
8eb0: 61 67 73 26 53 51 4c 49 54 45 5f 43 6f 75 6e 74  ags&SQLITE_Count
8ec0: 52 6f 77 73 20 29 3b 0a 20 20 20 20 61 73 73 65  Rows );.    asse
8ed0: 72 74 28 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a  rt( p->usesStmtJ
8ee0: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 62 72  ournal );.    br
8ef0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  eak;.  }..  /* I
8f00: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 43 6f 75  f the SQLITE_Cou
8f10: 6e 74 52 6f 77 73 20 66 6c 61 67 20 69 73 20 73  ntRows flag is s
8f20: 65 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c  et in sqlite3.fl
8f30: 61 67 73 20 6d 61 73 6b 2c 20 74 68 65 6e 20 0a  ags mask, then .
8f40: 20 20 2a 2a 20 44 4d 4c 20 73 74 61 74 65 6d 65    ** DML stateme
8f50: 6e 74 73 20 69 6e 76 6f 6b 65 20 74 68 69 73 20  nts invoke this 
8f60: 6f 70 63 6f 64 65 20 74 6f 20 72 65 74 75 72 6e  opcode to return
8f70: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
8f80: 6f 77 73 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ows .  ** modifi
8f90: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20  ed to the user. 
8fa0: 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  This is the only
8fb0: 20 77 61 79 20 74 68 61 74 20 61 20 56 4d 20 74   way that a VM t
8fc0: 68 61 74 0a 20 20 2a 2a 20 6f 70 65 6e 73 20 61  hat.  ** opens a
8fd0: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
8fe0: 61 63 74 69 6f 6e 20 6d 61 79 20 69 6e 76 6f 6b  action may invok
8ff0: 65 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 20  e this opcode.. 
9000: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63 61 73 65   **.  ** In case
9010: 20 74 68 69 73 20 69 73 20 73 75 63 68 20 61 20   this is such a 
9020: 73 74 61 74 65 6d 65 6e 74 2c 20 63 6c 6f 73 65  statement, close
9030: 20 61 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 74   any statement t
9040: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
9050: 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 56  opened by this V
9060: 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  M before returni
9070: 6e 67 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68  ng control to th
9080: 65 20 75 73 65 72 2e 20 54 68 69 73 20 69 73 20  e user. This is 
9090: 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20 74  to.  ** ensure t
90a0: 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  hat statement-tr
90b0: 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 61  ansactions are a
90c0: 6c 77 61 79 73 20 6e 65 73 74 65 64 2c 20 6e 6f  lways nested, no
90d0: 74 20 6f 76 65 72 6c 61 70 70 69 6e 67 2e 0a 20  t overlapping.. 
90e0: 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 6e 20   ** If the open 
90f0: 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
9100: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6c 6f  ction is not clo
9110: 73 65 64 20 68 65 72 65 2c 20 74 68 65 6e 20 74  sed here, then t
9120: 68 65 20 75 73 65 72 0a 20 20 2a 2a 20 6d 61 79  he user.  ** may
9130: 20 73 74 65 70 20 61 6e 6f 74 68 65 72 20 56 4d   step another VM
9140: 20 74 68 61 74 20 6f 70 65 6e 73 20 69 74 73 20   that opens its 
9150: 6f 77 6e 20 73 74 61 74 65 6d 65 6e 74 20 74 72  own statement tr
9160: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 0a  ansaction. This.
9170: 20 20 2a 2a 20 6d 61 79 20 6c 65 61 64 20 74 6f    ** may lead to
9180: 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 73 74 61   overlapping sta
9190: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
91a0: 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ons..  **.  ** T
91b0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
91c0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 76 65  nsaction is neve
91d0: 72 20 61 20 74 6f 70 2d 6c 65 76 65 6c 20 74 72  r a top-level tr
91e0: 61 6e 73 61 63 74 69 6f 6e 2e 20 20 48 65 6e 63  ansaction.  Henc
91f0: 65 0a 20 20 2a 2a 20 74 68 65 20 52 45 4c 45 41  e.  ** the RELEA
9200: 53 45 20 63 61 6c 6c 20 62 65 6c 6f 77 20 63 61  SE call below ca
9210: 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a 20 20  n never fail..  
9220: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9230: 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 7c 7c  iStatement==0 ||
9240: 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   db->flags&SQLIT
9250: 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 3b 0a 20  E_CountRows );. 
9260: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
9270: 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
9280: 70 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p, SAVEPOINT_REL
9290: 45 41 53 45 29 3b 0a 20 20 69 66 28 20 4e 45 56  EASE);.  if( NEV
92a0: 45 52 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  ER(rc!=SQLITE_OK
92b0: 29 20 29 7b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ) ){.    break;.
92c0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 76 61 6c 69    }..  /* Invali
92d0: 64 61 74 65 20 61 6c 6c 20 65 70 68 65 6d 65 72  date all ephemer
92e0: 61 6c 20 63 75 72 73 6f 72 20 72 6f 77 20 63 61  al cursor row ca
92f0: 63 68 65 73 20 2a 2f 0a 20 20 70 2d 3e 63 61 63  ches */.  p->cac
9300: 68 65 43 74 72 20 3d 20 28 70 2d 3e 63 61 63 68  heCtr = (p->cach
9310: 65 43 74 72 20 2b 20 32 29 7c 31 3b 0a 0a 20 20  eCtr + 2)|1;..  
9320: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
9330: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
9340: 63 75 72 72 65 6e 74 20 72 6f 77 20 61 72 65 20  current row are 
9350: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 0a  \000 terminated.
9360: 20 20 2a 2a 20 61 6e 64 20 68 61 76 65 20 61 6e    ** and have an
9370: 20 61 73 73 69 67 6e 65 64 20 74 79 70 65 2e 20   assigned type. 
9380: 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
9390: 20 64 65 2d 65 70 68 65 6d 65 72 61 6c 69 7a 65   de-ephemeralize
93a0: 64 20 61 73 0a 20 20 2a 2a 20 61 20 73 69 64 65  d as.  ** a side
93b0: 20 65 66 66 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   effect..  */.  
93c0: 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c  pMem = p->pResul
93d0: 74 53 65 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  tSet = &aMem[pOp
93e0: 2d 3e 70 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ->p1];.  for(i=0
93f0: 3b 20 69 3c 70 4f 70 2d 3e 70 32 3b 20 69 2b 2b  ; i<pOp->p2; i++
9400: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  ){.    assert( m
9410: 65 6d 49 73 56 61 6c 69 64 28 26 70 4d 65 6d 5b  emIsValid(&pMem[
9420: 69 5d 29 20 29 3b 0a 20 20 20 20 44 65 65 70 68  i]) );.    Deeph
9430: 65 6d 65 72 61 6c 69 7a 65 28 26 70 4d 65 6d 5b  emeralize(&pMem[
9440: 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  i]);.    assert(
9450: 20 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20   (pMem[i].flags 
9460: 26 20 4d 45 4d 5f 45 70 68 65 6d 29 3d 3d 30 0a  & MEM_Ephem)==0.
9470: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
9480: 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20 26 20  pMem[i].flags & 
9490: 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
94a0: 62 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  b))==0 );.    sq
94b0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e 75 6c 54  lite3VdbeMemNulT
94c0: 65 72 6d 69 6e 61 74 65 28 26 70 4d 65 6d 5b 69  erminate(&pMem[i
94d0: 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ]);.    sqlite3V
94e0: 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28  dbeMemStoreType(
94f0: 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 20 20 52  &pMem[i]);.    R
9500: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
9510: 70 2d 3e 70 31 2b 69 2c 20 26 70 4d 65 6d 5b 69  p->p1+i, &pMem[i
9520: 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  ]);.  }.  if( db
9530: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9540: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 0a 20   goto no_mem;.. 
9550: 20 2f 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54   /* Return SQLIT
9560: 45 5f 52 4f 57 0a 20 20 2a 2f 0a 20 20 70 2d 3e  E_ROW.  */.  p->
9570: 70 63 20 3d 20 70 63 20 2b 20 31 3b 0a 20 20 72  pc = pc + 1;.  r
9580: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
9590: 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75    goto vdbe_retu
95a0: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  rn;.}../* Opcode
95b0: 3a 20 43 6f 6e 63 61 74 20 50 31 20 50 32 20 50  : Concat P1 P2 P
95c0: 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 64 64 20  3 * *.**.** Add 
95d0: 74 68 65 20 74 65 78 74 20 69 6e 20 72 65 67 69  the text in regi
95e0: 73 74 65 72 20 50 31 20 6f 6e 74 6f 20 74 68 65  ster P1 onto the
95f0: 20 65 6e 64 20 6f 66 20 74 68 65 20 74 65 78 74   end of the text
9600: 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74 65 72 20   in.** register 
9610: 50 32 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  P2 and store the
9620: 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73   result in regis
9630: 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69  ter P3..** If ei
9640: 74 68 65 72 20 74 68 65 20 50 31 20 6f 72 20 50  ther the P1 or P
9650: 32 20 74 65 78 74 20 61 72 65 20 4e 55 4c 4c 20  2 text are NULL 
9660: 74 68 65 6e 20 73 74 6f 72 65 20 4e 55 4c 4c 20  then store NULL 
9670: 69 6e 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 20 20 50  in P3..**.**   P
9680: 33 20 3d 20 50 32 20 7c 7c 20 50 31 0a 2a 2a 0a  3 = P2 || P1.**.
9690: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
96a0: 20 66 6f 72 20 50 31 20 61 6e 64 20 50 33 20 74   for P1 and P3 t
96b0: 6f 20 62 65 20 74 68 65 20 73 61 6d 65 20 72 65  o be the same re
96c0: 67 69 73 74 65 72 2e 20 53 6f 6d 65 74 69 6d 65  gister. Sometime
96d0: 73 2c 0a 2a 2a 20 69 66 20 50 33 20 69 73 20 74  s,.** if P3 is t
96e0: 68 65 20 73 61 6d 65 20 72 65 67 69 73 74 65 72  he same register
96f0: 20 61 73 20 50 32 2c 20 74 68 65 20 69 6d 70 6c   as P2, the impl
9700: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 62  ementation is ab
9710: 6c 65 0a 2a 2a 20 74 6f 20 61 76 6f 69 64 20 61  le.** to avoid a
9720: 20 6d 65 6d 63 70 79 28 29 2e 0a 2a 2f 0a 63 61   memcpy()..*/.ca
9730: 73 65 20 4f 50 5f 43 6f 6e 63 61 74 3a 20 7b 20  se OP_Concat: { 
9740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
9750: 65 20 61 73 20 54 4b 5f 43 4f 4e 43 41 54 2c 20  e as TK_CONCAT, 
9760: 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a  in1, in2, out3 *
9770: 2f 0a 20 20 69 36 34 20 6e 42 79 74 65 3b 0a 0a  /.  i64 nByte;..
9780: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
9790: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 32 20  Op->p1];.  pIn2 
97a0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
97b0: 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  ;.  pOut = &aMem
97c0: 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73  [pOp->p3];.  ass
97d0: 65 72 74 28 20 70 49 6e 31 21 3d 70 4f 75 74 20  ert( pIn1!=pOut 
97e0: 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  );.  if( (pIn1->
97f0: 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e 66 6c  flags | pIn2->fl
9800: 61 67 73 29 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  ags) & MEM_Null 
9810: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
9820: 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75  beMemSetNull(pOu
9830: 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
9840: 20 7d 0a 20 20 69 66 28 20 45 78 70 61 6e 64 42   }.  if( ExpandB
9850: 6c 6f 62 28 70 49 6e 31 29 20 7c 7c 20 45 78 70  lob(pIn1) || Exp
9860: 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29 20 29 20  andBlob(pIn2) ) 
9870: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 53  goto no_mem;.  S
9880: 74 72 69 6e 67 69 66 79 28 70 49 6e 31 2c 20 65  tringify(pIn1, e
9890: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 53 74 72 69  ncoding);.  Stri
98a0: 6e 67 69 66 79 28 70 49 6e 32 2c 20 65 6e 63 6f  ngify(pIn2, enco
98b0: 64 69 6e 67 29 3b 0a 20 20 6e 42 79 74 65 20 3d  ding);.  nByte =
98c0: 20 70 49 6e 31 2d 3e 6e 20 2b 20 70 49 6e 32 2d   pIn1->n + pIn2-
98d0: 3e 6e 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e  >n;.  if( nByte>
98e0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
98f0: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20  E_LIMIT_LENGTH] 
9900: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f  ){.    goto too_
9910: 62 69 67 3b 0a 20 20 7d 0a 20 20 4d 65 6d 53 65  big;.  }.  MemSe
9920: 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20  tTypeFlag(pOut, 
9930: 4d 45 4d 5f 53 74 72 29 3b 0a 20 20 69 66 28 20  MEM_Str);.  if( 
9940: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72  sqlite3VdbeMemGr
9950: 6f 77 28 70 4f 75 74 2c 20 28 69 6e 74 29 6e 42  ow(pOut, (int)nB
9960: 79 74 65 2b 32 2c 20 70 4f 75 74 3d 3d 70 49 6e  yte+2, pOut==pIn
9970: 32 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e  2) ){.    goto n
9980: 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28  o_mem;.  }.  if(
9990: 20 70 4f 75 74 21 3d 70 49 6e 32 20 29 7b 0a 20   pOut!=pIn2 ){. 
99a0: 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e     memcpy(pOut->
99b0: 7a 2c 20 70 49 6e 32 2d 3e 7a 2c 20 70 49 6e 32  z, pIn2->z, pIn2
99c0: 2d 3e 6e 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63  ->n);.  }.  memc
99d0: 70 79 28 26 70 4f 75 74 2d 3e 7a 5b 70 49 6e 32  py(&pOut->z[pIn2
99e0: 2d 3e 6e 5d 2c 20 70 49 6e 31 2d 3e 7a 2c 20 70  ->n], pIn1->z, p
99f0: 49 6e 31 2d 3e 6e 29 3b 0a 20 20 70 4f 75 74 2d  In1->n);.  pOut-
9a00: 3e 7a 5b 6e 42 79 74 65 5d 20 3d 20 30 3b 0a 20  >z[nByte] = 0;. 
9a10: 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74 65 2b 31   pOut->z[nByte+1
9a20: 5d 20 3d 20 30 3b 0a 20 20 70 4f 75 74 2d 3e 66  ] = 0;.  pOut->f
9a30: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d  lags |= MEM_Term
9a40: 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 28 69  ;.  pOut->n = (i
9a50: 6e 74 29 6e 42 79 74 65 3b 0a 20 20 70 4f 75 74  nt)nByte;.  pOut
9a60: 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67  ->enc = encoding
9a70: 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
9a80: 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20  LOBSIZE(pOut);. 
9a90: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
9aa0: 63 6f 64 65 3a 20 41 64 64 20 50 31 20 50 32 20  code: Add P1 P2 
9ab0: 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 64 64  P3 * *.**.** Add
9ac0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
9ad0: 67 69 73 74 65 72 20 50 31 20 74 6f 20 74 68 65  gister P1 to the
9ae0: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
9af0: 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f  er P2.** and sto
9b00: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
9b10: 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
9b20: 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74   If either input
9b30: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   is NULL, the re
9b40: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  sult is NULL..*/
9b50: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 75 6c 74  ./* Opcode: Mult
9b60: 69 70 6c 79 20 50 31 20 50 32 20 50 33 20 2a 20  iply P1 P2 P3 * 
9b70: 2a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4d 75 6c 74 69  *.**.**.** Multi
9b80: 70 6c 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ply the value in
9b90: 20 72 65 67 69 73 74 65 72 20 50 31 20 62 79 20   register P1 by 
9ba0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
9bb0: 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20  ister P2.** and 
9bc0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
9bd0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
9be0: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e  .** If either in
9bf0: 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  put is NULL, the
9c00: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
9c10: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .*/./* Opcode: S
9c20: 75 62 74 72 61 63 74 20 50 31 20 50 32 20 50 33  ubtract P1 P2 P3
9c30: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 75 62 74 72   * *.**.** Subtr
9c40: 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e  act the value in
9c50: 20 72 65 67 69 73 74 65 72 20 50 31 20 66 72 6f   register P1 fro
9c60: 6d 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  m the value in r
9c70: 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e  egister P2.** an
9c80: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
9c90: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
9ca0: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
9cb0: 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74  input is NULL, t
9cc0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
9cd0: 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  L..*/./* Opcode:
9ce0: 20 44 69 76 69 64 65 20 50 31 20 50 32 20 50 33   Divide P1 P2 P3
9cf0: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 69 76 69 64   * *.**.** Divid
9d00: 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  e the value in r
9d10: 65 67 69 73 74 65 72 20 50 31 20 62 79 20 74 68  egister P1 by th
9d20: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
9d30: 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74  ter P2.** and st
9d40: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
9d50: 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 28 50  n register P3 (P
9d60: 33 3d 50 32 2f 50 31 29 2e 20 49 66 20 74 68 65  3=P2/P1). If the
9d70: 20 76 61 6c 75 65 20 69 6e 20 0a 2a 2a 20 72 65   value in .** re
9d80: 67 69 73 74 65 72 20 50 31 20 69 73 20 7a 65 72  gister P1 is zer
9d90: 6f 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  o, then the resu
9da0: 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 49 66 20 65  lt is NULL. If e
9db0: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 0a  ither input is .
9dc0: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  ** NULL, the res
9dd0: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
9de0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6d 61 69  /* Opcode: Remai
9df0: 6e 64 65 72 20 50 31 20 50 32 20 50 33 20 2a 20  nder P1 P2 P3 * 
9e00: 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  *.**.** Compute 
9e10: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 61 66  the remainder af
9e20: 74 65 72 20 69 6e 74 65 67 65 72 20 64 69 76 69  ter integer divi
9e30: 73 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 6c 75  sion of the valu
9e40: 65 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74 65 72  e in.** register
9e50: 20 50 31 20 62 79 20 74 68 65 20 76 61 6c 75 65   P1 by the value
9e60: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 20   in register P2 
9e70: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
9e80: 73 75 6c 74 20 69 6e 20 50 33 2e 20 0a 2a 2a 20  sult in P3. .** 
9e90: 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  If the value in 
9ea0: 72 65 67 69 73 74 65 72 20 50 32 20 69 73 20 7a  register P2 is z
9eb0: 65 72 6f 20 74 68 65 20 72 65 73 75 6c 74 20 69  ero the result i
9ec0: 73 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 66 20 65 69  s NULL..** If ei
9ed0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
9ee0: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74  NULL, the result
9ef0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73   is NULL..*/.cas
9f00: 65 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20  e OP_Add:       
9f10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
9f20: 61 6d 65 20 61 73 20 54 4b 5f 50 4c 55 53 2c 20  ame as TK_PLUS, 
9f30: 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a  in1, in2, out3 *
9f40: 2f 0a 63 61 73 65 20 4f 50 5f 53 75 62 74 72 61  /.case OP_Subtra
9f50: 63 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ct:             
9f60: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4d   /* same as TK_M
9f70: 49 4e 55 53 2c 20 69 6e 31 2c 20 69 6e 32 2c 20  INUS, in1, in2, 
9f80: 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  out3 */.case OP_
9f90: 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20 20 20 20  Multiply:       
9fa0: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
9fb0: 73 20 54 4b 5f 53 54 41 52 2c 20 69 6e 31 2c 20  s TK_STAR, in1, 
9fc0: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73  in2, out3 */.cas
9fd0: 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 20 20 20  e OP_Divide:    
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
9ff0: 61 6d 65 20 61 73 20 54 4b 5f 53 4c 41 53 48 2c  ame as TK_SLASH,
a000: 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
a010: 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 6d 61 69  */.case OP_Remai
a020: 6e 64 65 72 3a 20 7b 20 20 20 20 20 20 20 20 20  nder: {         
a030: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
a040: 52 45 4d 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  REM, in1, in2, o
a050: 75 74 33 20 2a 2f 0a 20 20 63 68 61 72 20 62 49  ut3 */.  char bI
a060: 6e 74 69 6e 74 3b 20 20 20 2f 2a 20 53 74 61 72  ntint;   /* Star
a070: 74 65 64 20 6f 75 74 20 61 73 20 74 77 6f 20 69  ted out as two i
a080: 6e 74 65 67 65 72 20 6f 70 65 72 61 6e 64 73 20  nteger operands 
a090: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20  */.  int flags; 
a0a0: 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
a0b0: 20 4d 45 4d 5f 2a 20 66 6c 61 67 73 20 66 72 6f   MEM_* flags fro
a0c0: 6d 20 62 6f 74 68 20 69 6e 70 75 74 73 20 2a 2f  m both inputs */
a0d0: 0a 20 20 69 36 34 20 69 41 3b 20 20 20 20 20 20  .  i64 iA;      
a0e0: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 76 61     /* Integer va
a0f0: 6c 75 65 20 6f 66 20 6c 65 66 74 20 6f 70 65 72  lue of left oper
a100: 61 6e 64 20 2a 2f 0a 20 20 69 36 34 20 69 42 3b  and */.  i64 iB;
a110: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
a120: 67 65 72 20 76 61 6c 75 65 20 6f 66 20 72 69 67  ger value of rig
a130: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
a140: 64 6f 75 62 6c 65 20 72 41 3b 20 20 20 20 20 20  double rA;      
a150: 2f 2a 20 52 65 61 6c 20 76 61 6c 75 65 20 6f 66  /* Real value of
a160: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
a170: 0a 20 20 64 6f 75 62 6c 65 20 72 42 3b 20 20 20  .  double rB;   
a180: 20 20 20 2f 2a 20 52 65 61 6c 20 76 61 6c 75 65     /* Real value
a190: 20 6f 66 20 72 69 67 68 74 20 6f 70 65 72 61 6e   of right operan
a1a0: 64 20 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d 20 26  d */..  pIn1 = &
a1b0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
a1c0: 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66   applyNumericAff
a1d0: 69 6e 69 74 79 28 70 49 6e 31 29 3b 0a 20 20 70  inity(pIn1);.  p
a1e0: 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In2 = &aMem[pOp-
a1f0: 3e 70 32 5d 3b 0a 20 20 61 70 70 6c 79 4e 75 6d  >p2];.  applyNum
a200: 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 49 6e  ericAffinity(pIn
a210: 32 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d  2);.  pOut = &aM
a220: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 66  em[pOp->p3];.  f
a230: 6c 61 67 73 20 3d 20 70 49 6e 31 2d 3e 66 6c 61  lags = pIn1->fla
a240: 67 73 20 7c 20 70 49 6e 32 2d 3e 66 6c 61 67 73  gs | pIn2->flags
a250: 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20 26  ;.  if( (flags &
a260: 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29 20   MEM_Null)!=0 ) 
a270: 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f  goto arithmetic_
a280: 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a  result_is_null;.
a290: 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
a2a0: 67 73 20 26 20 70 49 6e 32 2d 3e 66 6c 61 67 73  gs & pIn2->flags
a2b0: 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 4d 45 4d   & MEM_Int)==MEM
a2c0: 5f 49 6e 74 20 29 7b 0a 20 20 20 20 69 41 20 3d  _Int ){.    iA =
a2d0: 20 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 20 20   pIn1->u.i;.    
a2e0: 69 42 20 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b 0a  iB = pIn2->u.i;.
a2f0: 20 20 20 20 62 49 6e 74 69 6e 74 20 3d 20 31 3b      bIntint = 1;
a300: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 4f 70  .    switch( pOp
a310: 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20  ->opcode ){.    
a320: 20 20 63 61 73 65 20 4f 50 5f 41 64 64 3a 20 20    case OP_Add:  
a330: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
a340: 41 64 64 49 6e 74 36 34 28 26 69 42 2c 69 41 29  AddInt64(&iB,iA)
a350: 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b   ) goto fp_math;
a360: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a370: 61 73 65 20 4f 50 5f 53 75 62 74 72 61 63 74 3a  ase OP_Subtract:
a380: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 75 62    if( sqlite3Sub
a390: 49 6e 74 36 34 28 26 69 42 2c 69 41 29 20 29 20  Int64(&iB,iA) ) 
a3a0: 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 20 20 62  goto fp_math;  b
a3b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a3c0: 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20 69   OP_Multiply:  i
a3d0: 66 28 20 73 71 6c 69 74 65 33 4d 75 6c 49 6e 74  f( sqlite3MulInt
a3e0: 36 34 28 26 69 42 2c 69 41 29 20 29 20 67 6f 74  64(&iB,iA) ) got
a3f0: 6f 20 66 70 5f 6d 61 74 68 3b 20 20 62 72 65 61  o fp_math;  brea
a400: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
a410: 5f 44 69 76 69 64 65 3a 20 7b 0a 20 20 20 20 20  _Divide: {.     
a420: 20 20 20 69 66 28 20 69 41 3d 3d 30 20 29 20 67     if( iA==0 ) g
a430: 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72  oto arithmetic_r
a440: 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20  esult_is_null;. 
a450: 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d 2d         if( iA==-
a460: 31 20 26 26 20 69 42 3d 3d 53 4d 41 4c 4c 45 53  1 && iB==SMALLES
a470: 54 5f 49 4e 54 36 34 20 29 20 67 6f 74 6f 20 66  T_INT64 ) goto f
a480: 70 5f 6d 61 74 68 3b 0a 20 20 20 20 20 20 20 20  p_math;.        
a490: 69 42 20 2f 3d 20 69 41 3b 0a 20 20 20 20 20 20  iB /= iA;.      
a4a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
a4b0: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
a4c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41  {.        if( iA
a4d0: 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68  ==0 ) goto arith
a4e0: 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f  metic_result_is_
a4f0: 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  null;.        if
a500: 28 20 69 41 3d 3d 2d 31 20 29 20 69 41 20 3d 20  ( iA==-1 ) iA = 
a510: 31 3b 0a 20 20 20 20 20 20 20 20 69 42 20 25 3d  1;.        iB %=
a520: 20 69 41 3b 0a 20 20 20 20 20 20 20 20 62 72 65   iA;.        bre
a530: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
a540: 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20  }.    pOut->u.i 
a550: 3d 20 69 42 3b 0a 20 20 20 20 4d 65 6d 53 65 74  = iB;.    MemSet
a560: 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d  TypeFlag(pOut, M
a570: 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 65 6c 73 65  EM_Int);.  }else
a580: 7b 0a 20 20 20 20 62 49 6e 74 69 6e 74 20 3d 20  {.    bIntint = 
a590: 30 3b 0a 66 70 5f 6d 61 74 68 3a 0a 20 20 20 20  0;.fp_math:.    
a5a0: 72 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rA = sqlite3Vdbe
a5b0: 52 65 61 6c 56 61 6c 75 65 28 70 49 6e 31 29 3b  RealValue(pIn1);
a5c0: 0a 20 20 20 20 72 42 20 3d 20 73 71 6c 69 74 65  .    rB = sqlite
a5d0: 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28 70  3VdbeRealValue(p
a5e0: 49 6e 32 29 3b 0a 20 20 20 20 73 77 69 74 63 68  In2);.    switch
a5f0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b  ( pOp->opcode ){
a600: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41  .      case OP_A
a610: 64 64 3a 20 20 20 20 20 20 20 20 20 72 42 20 2b  dd:         rB +
a620: 3d 20 72 41 3b 20 20 20 20 20 20 20 62 72 65 61  = rA;       brea
a630: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
a640: 5f 53 75 62 74 72 61 63 74 3a 20 20 20 20 72 42  _Subtract:    rB
a650: 20 2d 3d 20 72 41 3b 20 20 20 20 20 20 20 62 72   -= rA;       br
a660: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a670: 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20  OP_Multiply:    
a680: 72 42 20 2a 3d 20 72 41 3b 20 20 20 20 20 20 20  rB *= rA;       
a690: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a6a0: 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 7b 0a 20  e OP_Divide: {. 
a6b0: 20 20 20 20 20 20 20 2f 2a 20 28 64 6f 75 62 6c         /* (doubl
a6c0: 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20 53  e)0 In case of S
a6d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
a6e0: 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a  ING_POINT... */.
a6f0: 20 20 20 20 20 20 20 20 69 66 28 20 72 41 3d 3d          if( rA==
a700: 28 64 6f 75 62 6c 65 29 30 20 29 20 67 6f 74 6f  (double)0 ) goto
a710: 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75   arithmetic_resu
a720: 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20  lt_is_null;.    
a730: 20 20 20 20 72 42 20 2f 3d 20 72 41 3b 0a 20 20      rB /= rA;.  
a740: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a750: 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75     }.      defau
a760: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 41  lt: {.        iA
a770: 20 3d 20 28 69 36 34 29 72 41 3b 0a 20 20 20 20   = (i64)rA;.    
a780: 20 20 20 20 69 42 20 3d 20 28 69 36 34 29 72 42      iB = (i64)rB
a790: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41  ;.        if( iA
a7a0: 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68  ==0 ) goto arith
a7b0: 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f  metic_result_is_
a7c0: 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  null;.        if
a7d0: 28 20 69 41 3d 3d 2d 31 20 29 20 69 41 20 3d 20  ( iA==-1 ) iA = 
a7e0: 31 3b 0a 20 20 20 20 20 20 20 20 72 42 20 3d 20  1;.        rB = 
a7f0: 28 64 6f 75 62 6c 65 29 28 69 42 20 25 20 69 41  (double)(iB % iA
a800: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
a810: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a820: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
a830: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
a840: 54 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20  T.    pOut->u.i 
a850: 3d 20 72 42 3b 0a 20 20 20 20 4d 65 6d 53 65 74  = rB;.    MemSet
a860: 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d  TypeFlag(pOut, M
a870: 45 4d 5f 49 6e 74 29 3b 0a 23 65 6c 73 65 0a 20  EM_Int);.#else. 
a880: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
a890: 4e 61 4e 28 72 42 29 20 29 7b 0a 20 20 20 20 20  NaN(rB) ){.     
a8a0: 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63   goto arithmetic
a8b0: 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b  _result_is_null;
a8c0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74 2d  .    }.    pOut-
a8d0: 3e 72 20 3d 20 72 42 3b 0a 20 20 20 20 4d 65 6d  >r = rB;.    Mem
a8e0: 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
a8f0: 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b 0a 20 20 20  , MEM_Real);.   
a900: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45   if( (flags & ME
a910: 4d 5f 52 65 61 6c 29 3d 3d 30 20 26 26 20 21 62  M_Real)==0 && !b
a920: 49 6e 74 69 6e 74 20 29 7b 0a 20 20 20 20 20 20  Intint ){.      
a930: 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 65 67  sqlite3VdbeInteg
a940: 65 72 41 66 66 69 6e 69 74 79 28 70 4f 75 74 29  erAffinity(pOut)
a950: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
a960: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 61 72 69   }.  break;..ari
a970: 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69  thmetic_result_i
a980: 73 5f 6e 75 6c 6c 3a 0a 20 20 73 71 6c 69 74 65  s_null:.  sqlite
a990: 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
a9a0: 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  pOut);.  break;.
a9b0: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f  }../* Opcode: Co
a9c0: 6c 6c 53 65 71 20 50 31 20 2a 20 2a 20 50 34 0a  llSeq P1 * * P4.
a9d0: 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f  **.** P4 is a po
a9e0: 69 6e 74 65 72 20 74 6f 20 61 20 43 6f 6c 6c 53  inter to a CollS
a9f0: 65 71 20 73 74 72 75 63 74 2e 20 49 66 20 74 68  eq struct. If th
aa00: 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61  e next call to a
aa10: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a   user function.*
aa20: 2a 20 6f 72 20 61 67 67 72 65 67 61 74 65 20 63  * or aggregate c
aa30: 61 6c 6c 73 20 73 71 6c 69 74 65 33 47 65 74 46  alls sqlite3GetF
aa40: 75 6e 63 43 6f 6c 6c 53 65 71 28 29 2c 20 74 68  uncCollSeq(), th
aa50: 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  is collation seq
aa60: 75 65 6e 63 65 20 77 69 6c 6c 0a 2a 2a 20 62 65  uence will.** be
aa70: 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20   returned. This 
aa80: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62  is used by the b
aa90: 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 2c 20 6d  uilt-in min(), m
aaa0: 61 78 28 29 20 61 6e 64 20 6e 75 6c 6c 69 66 28  ax() and nullif(
aab0: 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ).** functions..
aac0: 2a 2a 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 6e  **.** If P1 is n
aad0: 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  ot zero, then it
aae0: 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20 74   is a register t
aaf0: 68 61 74 20 61 20 73 75 62 73 65 71 75 65 6e 74  hat a subsequent
ab00: 20 6d 69 6e 28 29 20 6f 72 0a 2a 2a 20 6d 61 78   min() or.** max
ab10: 28 29 20 61 67 67 72 65 67 61 74 65 20 77 69 6c  () aggregate wil
ab20: 6c 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68  l set to 1 if th
ab30: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
ab40: 20 6e 6f 74 20 74 68 65 20 6d 69 6e 69 6d 75 6d   not the minimum
ab50: 20 6f 72 0a 2a 2a 20 6d 61 78 69 6d 75 6d 2e 20   or.** maximum. 
ab60: 20 54 68 65 20 50 31 20 72 65 67 69 73 74 65 72   The P1 register
ab70: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
ab80: 74 6f 20 30 20 62 79 20 74 68 69 73 20 69 6e 73  to 0 by this ins
ab90: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
aba0: 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 75 73  The interface us
abb0: 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d  ed by the implem
abc0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
abd0: 61 66 6f 72 65 6d 65 6e 74 69 6f 6e 65 64 20 66  aforementioned f
abe0: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 6f 20 72  unctions.** to r
abf0: 65 74 72 69 65 76 65 20 74 68 65 20 63 6f 6c 6c  etrieve the coll
ac00: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 73  ation sequence s
ac10: 65 74 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64  et by this opcod
ac20: 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
ac30: 6c 65 0a 2a 2a 20 70 75 62 6c 69 63 6c 79 2c 20  le.** publicly, 
ac40: 6f 6e 6c 79 20 74 6f 20 75 73 65 72 20 66 75 6e  only to user fun
ac50: 63 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20 69  ctions defined i
ac60: 6e 20 66 75 6e 63 2e 63 2e 0a 2a 2f 0a 63 61 73  n func.c..*/.cas
ac70: 65 20 4f 50 5f 43 6f 6c 6c 53 65 71 3a 20 7b 0a  e OP_CollSeq: {.
ac80: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
ac90: 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45  4type==P4_COLLSE
aca0: 51 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  Q );.  if( pOp->
acb0: 70 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  p1 ){.    sqlite
acc0: 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34  3VdbeMemSetInt64
acd0: 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 2c  (&aMem[pOp->p1],
ace0: 20 30 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b   0);.  }.  break
acf0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
ad00: 46 75 6e 63 74 69 6f 6e 20 50 31 20 50 32 20 50  Function P1 P2 P
ad10: 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 49 6e  3 P4 P5.**.** In
ad20: 76 6f 6b 65 20 61 20 75 73 65 72 20 66 75 6e 63  voke a user func
ad30: 74 69 6f 6e 20 28 50 34 20 69 73 20 61 20 70 6f  tion (P4 is a po
ad40: 69 6e 74 65 72 20 74 6f 20 61 20 46 75 6e 63 74  inter to a Funct
ad50: 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20 74 68  ion structure th
ad60: 61 74 0a 2a 2a 20 64 65 66 69 6e 65 73 20 74 68  at.** defines th
ad70: 65 20 66 75 6e 63 74 69 6f 6e 29 20 77 69 74 68  e function) with
ad80: 20 50 35 20 61 72 67 75 6d 65 6e 74 73 20 74 61   P5 arguments ta
ad90: 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69 73 74 65  ken from registe
ada0: 72 20 50 32 20 61 6e 64 0a 2a 2a 20 73 75 63 63  r P2 and.** succ
adb0: 65 73 73 6f 72 73 2e 20 20 54 68 65 20 72 65 73  essors.  The res
adc0: 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ult of the funct
add0: 69 6f 6e 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ion is stored in
ade0: 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
adf0: 20 52 65 67 69 73 74 65 72 20 50 33 20 6d 75 73   Register P3 mus
ae00: 74 20 6e 6f 74 20 62 65 20 6f 6e 65 20 6f 66 20  t not be one of 
ae10: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 70  the function inp
ae20: 75 74 73 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73  uts..**.** P1 is
ae30: 20 61 20 33 32 2d 62 69 74 20 62 69 74 6d 61 73   a 32-bit bitmas
ae40: 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 65  k indicating whe
ae50: 74 68 65 72 20 6f 72 20 6e 6f 74 20 65 61 63 68  ther or not each
ae60: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
ae70: 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61   .** function wa
ae80: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74 6f 20  s determined to 
ae90: 62 65 20 63 6f 6e 73 74 61 6e 74 20 61 74 20 63  be constant at c
aea0: 6f 6d 70 69 6c 65 20 74 69 6d 65 2e 20 49 66 20  ompile time. If 
aeb0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
aec0: 75 6d 65 6e 74 20 77 61 73 20 63 6f 6e 73 74 61  ument was consta
aed0: 6e 74 20 74 68 65 6e 20 62 69 74 20 30 20 6f 66  nt then bit 0 of
aee0: 20 50 31 20 69 73 20 73 65 74 2e 20 54 68 69 73   P1 is set. This
aef0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
af00: 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72  rmine.** whether
af10: 20 6d 65 74 61 20 64 61 74 61 20 61 73 73 6f 63   meta data assoc
af20: 69 61 74 65 64 20 77 69 74 68 20 61 20 75 73 65  iated with a use
af30: 72 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  r function argum
af40: 65 6e 74 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a  ent using the.**
af50: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 78   sqlite3_set_aux
af60: 64 61 74 61 28 29 20 41 50 49 20 6d 61 79 20 62  data() API may b
af70: 65 20 73 61 66 65 6c 79 20 72 65 74 61 69 6e 65  e safely retaine
af80: 64 20 75 6e 74 69 6c 20 74 68 65 20 6e 65 78 74  d until the next
af90: 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  .** invocation o
afa0: 66 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a  f this opcode..*
afb0: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 41  *.** See also: A
afc0: 67 67 53 74 65 70 20 61 6e 64 20 41 67 67 46 69  ggStep and AggFi
afd0: 6e 61 6c 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 46  nal.*/.case OP_F
afe0: 75 6e 63 74 69 6f 6e 3a 20 7b 0a 20 20 69 6e 74  unction: {.  int
aff0: 20 69 3b 0a 20 20 4d 65 6d 20 2a 70 41 72 67 3b   i;.  Mem *pArg;
b000: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
b010: 78 74 20 63 74 78 3b 0a 20 20 73 71 6c 69 74 65  xt ctx;.  sqlite
b020: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 3b  3_value **apVal;
b030: 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d  .  int n;..  n =
b040: 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 61 70 56 61   pOp->p5;.  apVa
b050: 6c 20 3d 20 70 2d 3e 61 70 41 72 67 3b 0a 20 20  l = p->apArg;.  
b060: 61 73 73 65 72 74 28 20 61 70 56 61 6c 20 7c 7c  assert( apVal ||
b070: 20 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   n==0 );.  asser
b080: 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20  t( pOp->p3>0 && 
b090: 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65  pOp->p3<=(p->nMe
b0a0: 6d 2d 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  m-p->nCursor) );
b0b0: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
b0c0: 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41  pOp->p3];.  memA
b0d0: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
b0e0: 70 4f 75 74 29 3b 0a 0a 20 20 61 73 73 65 72 74  pOut);..  assert
b0f0: 28 20 6e 3d 3d 30 20 7c 7c 20 28 70 4f 70 2d 3e  ( n==0 || (pOp->
b100: 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b  p2>0 && pOp->p2+
b110: 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e  n<=(p->nMem-p->n
b120: 43 75 72 73 6f 72 29 2b 31 29 20 29 3b 0a 20 20  Cursor)+1) );.  
b130: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c  assert( pOp->p3<
b140: 70 4f 70 2d 3e 70 32 20 7c 7c 20 70 4f 70 2d 3e  pOp->p2 || pOp->
b150: 70 33 3e 3d 70 4f 70 2d 3e 70 32 2b 6e 20 29 3b  p3>=pOp->p2+n );
b160: 0a 20 20 70 41 72 67 20 3d 20 26 61 4d 65 6d 5b  .  pArg = &aMem[
b170: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 66 6f 72 28  pOp->p2];.  for(
b180: 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70  i=0; i<n; i++, p
b190: 41 72 67 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  Arg++){.    asse
b1a0: 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70  rt( memIsValid(p
b1b0: 41 72 67 29 20 29 3b 0a 20 20 20 20 61 70 56 61  Arg) );.    apVa
b1c0: 6c 5b 69 5d 20 3d 20 70 41 72 67 3b 0a 20 20 20  l[i] = pArg;.   
b1d0: 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65 28   Deephemeralize(
b1e0: 70 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  pArg);.    sqlit
b1f0: 65 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79  e3VdbeMemStoreTy
b200: 70 65 28 70 41 72 67 29 3b 0a 20 20 20 20 52 45  pe(pArg);.    RE
b210: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
b220: 2d 3e 70 32 2b 69 2c 20 70 41 72 67 29 3b 0a 20  ->p2+i, pArg);. 
b230: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f   }..  assert( pO
b240: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55  p->p4type==P4_FU
b250: 4e 43 44 45 46 20 29 3b 0a 20 20 63 74 78 2e 70  NCDEF );.  ctx.p
b260: 46 75 6e 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Func = pOp->p4.p
b270: 46 75 6e 63 3b 0a 20 20 63 74 78 2e 73 2e 66 6c  Func;.  ctx.s.fl
b280: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
b290: 20 20 63 74 78 2e 73 2e 64 62 20 3d 20 64 62 3b    ctx.s.db = db;
b2a0: 0a 20 20 63 74 78 2e 73 2e 78 44 65 6c 20 3d 20  .  ctx.s.xDel = 
b2b0: 30 3b 0a 20 20 63 74 78 2e 73 2e 7a 4d 61 6c 6c  0;.  ctx.s.zMall
b2c0: 6f 63 20 3d 20 30 3b 0a 20 20 63 74 78 2e 69 4f  oc = 0;.  ctx.iO
b2d0: 70 20 3d 20 70 63 3b 0a 20 20 63 74 78 2e 70 56  p = pc;.  ctx.pV
b2e0: 64 62 65 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 54  dbe = p;..  /* T
b2f0: 68 65 20 6f 75 74 70 75 74 20 63 65 6c 6c 20 6d  he output cell m
b300: 61 79 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ay already have 
b310: 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  a buffer allocat
b320: 65 64 2e 20 4d 6f 76 65 0a 20 20 2a 2a 20 74 68  ed. Move.  ** th
b330: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 63 74 78  e pointer to ctx
b340: 2e 73 20 73 6f 20 69 6e 20 63 61 73 65 20 74 68  .s so in case th
b350: 65 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20  e user-function 
b360: 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65  can use.  ** the
b370: 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74   already allocat
b380: 65 64 20 62 75 66 66 65 72 20 69 6e 73 74 65 61  ed buffer instea
b390: 64 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6e 67 20  d of allocating 
b3a0: 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
b3b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
b3c0: 4d 6f 76 65 28 26 63 74 78 2e 73 2c 20 70 4f 75  Move(&ctx.s, pOu
b3d0: 74 29 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65  t);.  MemSetType
b3e0: 46 6c 61 67 28 26 63 74 78 2e 73 2c 20 4d 45 4d  Flag(&ctx.s, MEM
b3f0: 5f 4e 75 6c 6c 29 3b 0a 0a 20 20 63 74 78 2e 66  _Null);..  ctx.f
b400: 45 72 72 6f 72 4f 72 41 75 78 20 3d 20 30 3b 0a  ErrorOrAux = 0;.
b410: 20 20 69 66 28 20 63 74 78 2e 70 46 75 6e 63 2d    if( ctx.pFunc-
b420: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
b430: 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
b440: 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  L ){.    assert(
b450: 20 70 4f 70 3e 61 4f 70 20 29 3b 0a 20 20 20 20   pOp>aOp );.    
b460: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
b470: 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53  p4type==P4_COLLS
b480: 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
b490: 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65  ( pOp[-1].opcode
b4a0: 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71 20 29 3b 0a  ==OP_CollSeq );.
b4b0: 20 20 20 20 63 74 78 2e 70 43 6f 6c 6c 20 3d 20      ctx.pColl = 
b4c0: 70 4f 70 5b 2d 31 5d 2e 70 34 2e 70 43 6f 6c 6c  pOp[-1].p4.pColl
b4d0: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c 61 73 74  ;.  }.  db->last
b4e0: 52 6f 77 69 64 20 3d 20 6c 61 73 74 52 6f 77 69  Rowid = lastRowi
b4f0: 64 3b 0a 20 20 28 2a 63 74 78 2e 70 46 75 6e 63  d;.  (*ctx.pFunc
b500: 2d 3e 78 46 75 6e 63 29 28 26 63 74 78 2c 20 6e  ->xFunc)(&ctx, n
b510: 2c 20 61 70 56 61 6c 29 3b 20 2f 2a 20 49 4d 50  , apVal); /* IMP
b520: 3a 20 52 2d 32 34 35 30 35 2d 32 33 32 33 30 20  : R-24505-23230 
b530: 2a 2f 0a 20 20 6c 61 73 74 52 6f 77 69 64 20 3d  */.  lastRowid =
b540: 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a   db->lastRowid;.
b550: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
b560: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 2f  cFailed ){.    /
b570: 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 61 20  * Even though a 
b580: 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 66 61 69  malloc() has fai
b590: 6c 65 64 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65  led, the impleme
b5a0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  ntation of the. 
b5b0: 20 20 20 2a 2a 20 75 73 65 72 20 66 75 6e 63 74     ** user funct
b5c0: 69 6f 6e 20 6d 61 79 20 68 61 76 65 20 63 61 6c  ion may have cal
b5d0: 6c 65 64 20 61 6e 20 73 71 6c 69 74 65 33 5f 72  led an sqlite3_r
b5e0: 65 73 75 6c 74 5f 58 58 58 28 29 20 66 75 6e 63  esult_XXX() func
b5f0: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 6f 20 72  tion.    ** to r
b600: 65 74 75 72 6e 20 61 20 76 61 6c 75 65 2e 20 54  eturn a value. T
b610: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
b620: 6c 20 72 65 6c 65 61 73 65 73 20 61 6e 79 20 72  l releases any r
b630: 65 73 6f 75 72 63 65 73 0a 20 20 20 20 2a 2a 20  esources.    ** 
b640: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
b650: 73 75 63 68 20 61 20 76 61 6c 75 65 2e 0a 20 20  such a value..  
b660: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
b670: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
b680: 63 74 78 2e 73 29 3b 0a 20 20 20 20 67 6f 74 6f  ctx.s);.    goto
b690: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 0a 20 20   no_mem;.  }..  
b6a0: 2f 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  /* If the functi
b6b0: 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  on returned an e
b6c0: 72 72 6f 72 2c 20 74 68 72 6f 77 20 61 6e 20 65  rror, throw an e
b6d0: 78 63 65 70 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  xception */.  if
b6e0: 28 20 63 74 78 2e 66 45 72 72 6f 72 4f 72 41 75  ( ctx.fErrorOrAu
b6f0: 78 20 29 7b 0a 20 20 20 20 69 66 28 20 63 74 78  x ){.    if( ctx
b700: 2e 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  .isError ){.    
b710: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
b720: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
b730: 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  db, "%s", sqlite
b740: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 26 63 74  3_value_text(&ct
b750: 78 2e 73 29 29 3b 0a 20 20 20 20 20 20 72 63 20  x.s));.      rc 
b760: 3d 20 63 74 78 2e 69 73 45 72 72 6f 72 3b 0a 20  = ctx.isError;. 
b770: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
b780: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
b790: 61 28 70 2c 20 70 63 2c 20 70 4f 70 2d 3e 70 31  a(p, pc, pOp->p1
b7a0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 70  );.  }..  /* Cop
b7b0: 79 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  y the result of 
b7c0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 74  the function int
b7d0: 6f 20 72 65 67 69 73 74 65 72 20 50 33 20 2a 2f  o register P3 */
b7e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
b7f0: 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 26 63 74  angeEncoding(&ct
b800: 78 2e 73 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  x.s, encoding);.
b810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
b820: 4d 6f 76 65 28 70 4f 75 74 2c 20 26 63 74 78 2e  Move(pOut, &ctx.
b830: 73 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  s);.  if( sqlite
b840: 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70  3VdbeMemTooBig(p
b850: 4f 75 74 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  Out) ){.    goto
b860: 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a 23   too_big;.  }..#
b870: 69 66 20 30 0a 20 20 2f 2a 20 54 68 65 20 61 70  if 0.  /* The ap
b880: 70 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  p-defined functi
b890: 6f 6e 20 68 61 73 20 64 6f 6e 65 20 73 6f 6d 65  on has done some
b8a0: 74 68 69 6e 67 20 74 68 61 74 20 61 73 20 63 61  thing that as ca
b8b0: 75 73 65 64 20 74 68 69 73 0a 20 20 2a 2a 20 73  used this.  ** s
b8c0: 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 70 69  tatement to expi
b8d0: 72 65 2e 20 20 28 50 65 72 68 61 70 73 20 74 68  re.  (Perhaps th
b8e0: 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  e function calle
b8f0: 64 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  d sqlite3_exec()
b900: 0a 20 20 2a 2a 20 77 69 74 68 20 61 20 43 52 45  .  ** with a CRE
b910: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
b920: 65 6e 74 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ent.).  */.  if(
b930: 20 70 2d 3e 65 78 70 69 72 65 64 20 29 20 72 63   p->expired ) rc
b940: 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b   = SQLITE_ABORT;
b950: 0a 23 65 6e 64 69 66 0a 0a 20 20 52 45 47 49 53  .#endif..  REGIS
b960: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
b970: 33 2c 20 70 4f 75 74 29 3b 0a 20 20 55 50 44 41  3, pOut);.  UPDA
b980: 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
b990: 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  pOut);.  break;.
b9a0: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69  }../* Opcode: Bi
b9b0: 74 41 6e 64 20 50 31 20 50 32 20 50 33 20 2a 20  tAnd P1 P2 P3 * 
b9c0: 2a 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65  *.**.** Take the
b9d0: 20 62 69 74 2d 77 69 73 65 20 41 4e 44 20 6f 66   bit-wise AND of
b9e0: 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72   the values in r
b9f0: 65 67 69 73 74 65 72 20 50 31 20 61 6e 64 20 50  egister P1 and P
ba00: 32 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74  2 and.** store t
ba10: 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  he result in reg
ba20: 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20  ister P3..** If 
ba30: 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20  either input is 
ba40: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74  NULL, the result
ba50: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20   is NULL..*/./* 
ba60: 4f 70 63 6f 64 65 3a 20 42 69 74 4f 72 20 50 31  Opcode: BitOr P1
ba70: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
ba80: 20 54 61 6b 65 20 74 68 65 20 62 69 74 2d 77 69   Take the bit-wi
ba90: 73 65 20 4f 52 20 6f 66 20 74 68 65 20 76 61 6c  se OR of the val
baa0: 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  ues in register 
bab0: 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a  P1 and P2 and.**
bac0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
bad0: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  t in register P3
bae0: 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69  ..** If either i
baf0: 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  nput is NULL, th
bb00: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
bb10: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
bb20: 53 68 69 66 74 4c 65 66 74 20 50 31 20 50 32 20  ShiftLeft P1 P2 
bb30: 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 68 69  P3 * *.**.** Shi
bb40: 66 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 76  ft the integer v
bb50: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
bb60: 20 50 32 20 74 6f 20 74 68 65 20 6c 65 66 74 20   P2 to the left 
bb70: 62 79 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  by the.** number
bb80: 20 6f 66 20 62 69 74 73 20 73 70 65 63 69 66 69   of bits specifi
bb90: 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 67 65  ed by the intege
bba0: 72 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  r in register P1
bbb0: 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 72  ..** Store the r
bbc0: 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65  esult in registe
bbd0: 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68  r P3..** If eith
bbe0: 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c  er input is NULL
bbf0: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
bc00: 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  NULL..*/./* Opco
bc10: 64 65 3a 20 53 68 69 66 74 52 69 67 68 74 20 50  de: ShiftRight P
bc20: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
bc30: 2a 20 53 68 69 66 74 20 74 68 65 20 69 6e 74 65  * Shift the inte
bc40: 67 65 72 20 76 61 6c 75 65 20 69 6e 20 72 65 67  ger value in reg
bc50: 69 73 74 65 72 20 50 32 20 74 6f 20 74 68 65 20  ister P2 to the 
bc60: 72 69 67 68 74 20 62 79 20 74 68 65 0a 2a 2a 20  right by the.** 
bc70: 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 73  number of bits s
bc80: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
bc90: 69 6e 74 65 67 65 72 20 69 6e 20 72 65 67 69 73  integer in regis
bca0: 74 65 72 20 50 31 2e 0a 2a 2a 20 53 74 6f 72 65  ter P1..** Store
bcb0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72   the result in r
bcc0: 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49  egister P3..** I
bcd0: 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69  f either input i
bce0: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75  s NULL, the resu
bcf0: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63  lt is NULL..*/.c
bd00: 61 73 65 20 4f 50 5f 42 69 74 41 6e 64 3a 20 20  ase OP_BitAnd:  
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd20: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54  * same as TK_BIT
bd30: 41 4e 44 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  AND, in1, in2, o
bd40: 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 42  ut3 */.case OP_B
bd50: 69 74 4f 72 3a 20 20 20 20 20 20 20 20 20 20 20  itOr:           
bd60: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
bd70: 73 20 54 4b 5f 42 49 54 4f 52 2c 20 69 6e 31 2c  s TK_BITOR, in1,
bd80: 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61   in2, out3 */.ca
bd90: 73 65 20 4f 50 5f 53 68 69 66 74 4c 65 66 74 3a  se OP_ShiftLeft:
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bdb0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c 53 48 49   same as TK_LSHI
bdc0: 46 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  FT, in1, in2, ou
bdd0: 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 68  t3 */.case OP_Sh
bde0: 69 66 74 52 69 67 68 74 3a 20 7b 20 20 20 20 20  iftRight: {     
bdf0: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
be00: 20 54 4b 5f 52 53 48 49 46 54 2c 20 69 6e 31 2c   TK_RSHIFT, in1,
be10: 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20   in2, out3 */.  
be20: 69 36 34 20 69 41 3b 0a 20 20 75 36 34 20 75 41  i64 iA;.  u64 uA
be30: 3b 0a 20 20 69 36 34 20 69 42 3b 0a 20 20 75 38  ;.  i64 iB;.  u8
be40: 20 6f 70 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26   op;..  pIn1 = &
be50: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
be60: 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn2 = &aMem[pO
be70: 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75 74 20 3d  p->p2];.  pOut =
be80: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
be90: 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
bea0: 61 67 73 20 7c 20 70 49 6e 32 2d 3e 66 6c 61 67  ags | pIn2->flag
beb0: 73 29 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  s) & MEM_Null ){
bec0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bed0: 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29  MemSetNull(pOut)
bee0: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
bef0: 0a 20 20 69 41 20 3d 20 73 71 6c 69 74 65 33 56  .  iA = sqlite3V
bf00: 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 32  dbeIntValue(pIn2
bf10: 29 3b 0a 20 20 69 42 20 3d 20 73 71 6c 69 74 65  );.  iB = sqlite
bf20: 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49  3VdbeIntValue(pI
bf30: 6e 31 29 3b 0a 20 20 6f 70 20 3d 20 70 4f 70 2d  n1);.  op = pOp-
bf40: 3e 6f 70 63 6f 64 65 3b 0a 20 20 69 66 28 20 6f  >opcode;.  if( o
bf50: 70 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 7b 0a  p==OP_BitAnd ){.
bf60: 20 20 20 20 69 41 20 26 3d 20 69 42 3b 0a 20 20      iA &= iB;.  
bf70: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 4f 50  }else if( op==OP
bf80: 5f 42 69 74 4f 72 20 29 7b 0a 20 20 20 20 69 41  _BitOr ){.    iA
bf90: 20 7c 3d 20 69 42 3b 0a 20 20 7d 65 6c 73 65 20   |= iB;.  }else 
bfa0: 69 66 28 20 69 42 21 3d 30 20 29 7b 0a 20 20 20  if( iB!=0 ){.   
bfb0: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f   assert( op==OP_
bfc0: 53 68 69 66 74 52 69 67 68 74 20 7c 7c 20 6f 70  ShiftRight || op
bfd0: 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29  ==OP_ShiftLeft )
bfe0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 68 69  ;..    /* If shi
bff0: 66 74 69 6e 67 20 62 79 20 61 20 6e 65 67 61 74  fting by a negat
c000: 69 76 65 20 61 6d 6f 75 6e 74 2c 20 73 68 69 66  ive amount, shif
c010: 74 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  t in the other d
c020: 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  irection */.    
c030: 69 66 28 20 69 42 3c 30 20 29 7b 0a 20 20 20 20  if( iB<0 ){.    
c040: 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 68 69    assert( OP_Shi
c050: 66 74 52 69 67 68 74 3d 3d 4f 50 5f 53 68 69 66  ftRight==OP_Shif
c060: 74 4c 65 66 74 2b 31 20 29 3b 0a 20 20 20 20 20  tLeft+1 );.     
c070: 20 6f 70 20 3d 20 32 2a 4f 50 5f 53 68 69 66 74   op = 2*OP_Shift
c080: 4c 65 66 74 20 2b 20 31 20 2d 20 6f 70 3b 0a 20  Left + 1 - op;. 
c090: 20 20 20 20 20 69 42 20 3d 20 69 42 3e 28 2d 36       iB = iB>(-6
c0a0: 34 29 20 3f 20 2d 69 42 20 3a 20 36 34 3b 0a 20  4) ? -iB : 64;. 
c0b0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 42     }..    if( iB
c0c0: 3e 3d 36 34 20 29 7b 0a 20 20 20 20 20 20 69 41  >=64 ){.      iA
c0d0: 20 3d 20 28 69 41 3e 3d 30 20 7c 7c 20 6f 70 3d   = (iA>=0 || op=
c0e0: 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 29 20 3f  =OP_ShiftLeft) ?
c0f0: 20 30 20 3a 20 2d 31 3b 0a 20 20 20 20 7d 65 6c   0 : -1;.    }el
c100: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  se{.      memcpy
c110: 28 26 75 41 2c 20 26 69 41 2c 20 73 69 7a 65 6f  (&uA, &iA, sizeo
c120: 66 28 75 41 29 29 3b 0a 20 20 20 20 20 20 69 66  f(uA));.      if
c130: 28 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  ( op==OP_ShiftLe
c140: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 75 41  ft ){.        uA
c150: 20 3c 3c 3d 20 69 42 3b 0a 20 20 20 20 20 20 7d   <<= iB;.      }
c160: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 41  else{.        uA
c170: 20 3e 3e 3d 20 69 42 3b 0a 20 20 20 20 20 20 20   >>= iB;.       
c180: 20 2f 2a 20 53 69 67 6e 2d 65 78 74 65 6e 64 20   /* Sign-extend 
c190: 6f 6e 20 61 20 72 69 67 68 74 20 73 68 69 66 74  on a right shift
c1a0: 20 6f 66 20 61 20 6e 65 67 61 74 69 76 65 20 6e   of a negative n
c1b0: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  umber */.       
c1c0: 20 69 66 28 20 69 41 3c 30 20 29 20 75 41 20 7c   if( iA<0 ) uA |
c1d0: 3d 20 28 28 28 28 75 36 34 29 30 78 66 66 66 66  = ((((u64)0xffff
c1e0: 66 66 66 66 29 3c 3c 33 32 29 7c 30 78 66 66 66  ffff)<<32)|0xfff
c1f0: 66 66 66 66 66 29 20 3c 3c 20 28 36 34 2d 69 42  fffff) << (64-iB
c200: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c210: 20 6d 65 6d 63 70 79 28 26 69 41 2c 20 26 75 41   memcpy(&iA, &uA
c220: 2c 20 73 69 7a 65 6f 66 28 69 41 29 29 3b 0a 20  , sizeof(iA));. 
c230: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4f 75 74 2d     }.  }.  pOut-
c240: 3e 75 2e 69 20 3d 20 69 41 3b 0a 20 20 4d 65 6d  >u.i = iA;.  Mem
c250: 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
c260: 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62 72  , MEM_Int);.  br
c270: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
c280: 65 3a 20 41 64 64 49 6d 6d 20 20 50 31 20 50 32  e: AddImm  P1 P2
c290: 20 2a 20 2a 20 2a 0a 2a 2a 20 0a 2a 2a 20 41 64   * * *.** .** Ad
c2a0: 64 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 50  d the constant P
c2b0: 32 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  2 to the value i
c2c0: 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a  n register P1..*
c2d0: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20  * The result is 
c2e0: 61 6c 77 61 79 73 20 61 6e 20 69 6e 74 65 67 65  always an intege
c2f0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 66 6f 72 63  r..**.** To forc
c300: 65 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 74  e any register t
c310: 6f 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 2c  o be an integer,
c320: 20 6a 75 73 74 20 61 64 64 20 30 2e 0a 2a 2f 0a   just add 0..*/.
c330: 63 61 73 65 20 4f 50 5f 41 64 64 49 6d 6d 3a 20  case OP_AddImm: 
c340: 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  {            /* 
c350: 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  in1 */.  pIn1 = 
c360: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
c370: 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
c380: 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20 20 73  ge(p, pIn1);.  s
c390: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74  qlite3VdbeMemInt
c3a0: 65 67 65 72 69 66 79 28 70 49 6e 31 29 3b 0a 20  egerify(pIn1);. 
c3b0: 20 70 49 6e 31 2d 3e 75 2e 69 20 2b 3d 20 70 4f   pIn1->u.i += pO
c3c0: 70 2d 3e 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a  p->p2;.  break;.
c3d0: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 75  }../* Opcode: Mu
c3e0: 73 74 42 65 49 6e 74 20 50 31 20 50 32 20 2a 20  stBeInt P1 P2 * 
c3f0: 2a 20 2a 0a 2a 2a 20 0a 2a 2a 20 46 6f 72 63 65  * *.** .** Force
c400: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
c410: 67 69 73 74 65 72 20 50 31 20 74 6f 20 62 65 20  gister P1 to be 
c420: 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20  an integer.  If 
c430: 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20  the value.** in 
c440: 50 31 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  P1 is not an int
c450: 65 67 65 72 20 61 6e 64 20 63 61 6e 6e 6f 74 20  eger and cannot 
c460: 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
c470: 6f 20 61 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20  o an integer.** 
c480: 77 69 74 68 6f 75 74 20 64 61 74 61 20 6c 6f 73  without data los
c490: 73 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d  s, then jump imm
c4a0: 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2c 20  ediately to P2, 
c4b0: 6f 72 20 69 66 20 50 32 3d 3d 30 0a 2a 2a 20 72  or if P2==0.** r
c4c0: 61 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d  aise an SQLITE_M
c4d0: 49 53 4d 41 54 43 48 20 65 78 63 65 70 74 69 6f  ISMATCH exceptio
c4e0: 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 75  n..*/.case OP_Mu
c4f0: 73 74 42 65 49 6e 74 3a 20 7b 20 20 20 20 20 20  stBeInt: {      
c500: 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69        /* jump, i
c510: 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
c520: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
c530: 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70   applyAffinity(p
c540: 49 6e 31 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  In1, SQLITE_AFF_
c550: 4e 55 4d 45 52 49 43 2c 20 65 6e 63 6f 64 69 6e  NUMERIC, encodin
c560: 67 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d  g);.  if( (pIn1-
c570: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
c580: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
c590: 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20 20  pOp->p2==0 ){.  
c5a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c5b0: 4d 49 53 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  MISMATCH;.      
c5c0: 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
c5d0: 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c  o_error;.    }el
c5e0: 73 65 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70  se{.      pc = p
c5f0: 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20  Op->p2 - 1;.    
c600: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4d  }.  }else{.    M
c610: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 49  emSetTypeFlag(pI
c620: 6e 31 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20  n1, MEM_Int);.  
c630: 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69  }.  break;.}..#i
c640: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c650: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
c660: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 61 6c  ./* Opcode: Real
c670: 41 66 66 69 6e 69 74 79 20 50 31 20 2a 20 2a 20  Affinity P1 * * 
c680: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67  * *.**.** If reg
c690: 69 73 74 65 72 20 50 31 20 68 6f 6c 64 73 20 61  ister P1 holds a
c6a0: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 76 65 72  n integer conver
c6b0: 74 20 69 74 20 74 6f 20 61 20 72 65 61 6c 20 76  t it to a real v
c6c0: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  alue..**.** This
c6d0: 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
c6e0: 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20  when extracting 
c6f0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
c700: 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a   a column that.*
c710: 2a 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e  * has REAL affin
c720: 69 74 79 2e 20 20 53 75 63 68 20 63 6f 6c 75 6d  ity.  Such colum
c730: 6e 20 76 61 6c 75 65 73 20 6d 61 79 20 73 74 69  n values may sti
c740: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a  ll be stored as.
c750: 2a 2a 20 69 6e 74 65 67 65 72 73 2c 20 66 6f 72  ** integers, for
c760: 20 73 70 61 63 65 20 65 66 66 69 63 69 65 6e 63   space efficienc
c770: 79 2c 20 62 75 74 20 61 66 74 65 72 20 65 78 74  y, but after ext
c780: 72 61 63 74 69 6f 6e 20 77 65 20 77 61 6e 74 20  raction we want 
c790: 74 68 65 6d 0a 2a 2a 20 74 6f 20 68 61 76 65 20  them.** to have 
c7a0: 6f 6e 6c 79 20 61 20 72 65 61 6c 20 76 61 6c 75  only a real valu
c7b0: 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65  e..*/.case OP_Re
c7c0: 61 6c 41 66 66 69 6e 69 74 79 3a 20 7b 20 20 20  alAffinity: {   
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c7e0: 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  * in1 */.  pIn1 
c7f0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
c800: 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c  ;.  if( pIn1->fl
c810: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
c820: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c830: 4d 65 6d 52 65 61 6c 69 66 79 28 70 49 6e 31 29  MemRealify(pIn1)
c840: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
c850: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
c860: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
c870: 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 6f 54  T./* Opcode: ToT
c880: 65 78 74 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a  ext P1 * * * *.*
c890: 2a 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76  *.** Force the v
c8a0: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
c8b0: 20 50 31 20 74 6f 20 62 65 20 74 65 78 74 2e 0a   P1 to be text..
c8c0: 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  ** If the value 
c8d0: 69 73 20 6e 75 6d 65 72 69 63 2c 20 63 6f 6e 76  is numeric, conv
c8e0: 65 72 74 20 69 74 20 74 6f 20 61 20 73 74 72 69  ert it to a stri
c8f0: 6e 67 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20  ng using the.** 
c900: 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 70 72  equivalent of pr
c910: 69 6e 74 66 28 29 2e 20 20 42 6c 6f 62 20 76 61  intf().  Blob va
c920: 6c 75 65 73 20 61 72 65 20 75 6e 63 68 61 6e 67  lues are unchang
c930: 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 61 66  ed and.** are af
c940: 74 65 72 77 61 72 64 73 20 73 69 6d 70 6c 79 20  terwards simply 
c950: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 74  interpreted as t
c960: 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  ext..**.** A NUL
c970: 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 63  L value is not c
c980: 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 72  hanged by this r
c990: 6f 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d 61  outine.  It rema
c9a0: 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73  ins NULL..*/.cas
c9b0: 65 20 4f 50 5f 54 6f 54 65 78 74 3a 20 7b 20 20  e OP_ToText: {  
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 54 4f  /* same as TK_TO
c9e0: 5f 54 45 58 54 2c 20 69 6e 31 20 2a 2f 0a 20 20  _TEXT, in1 */.  
c9f0: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
ca00: 2d 3e 70 31 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75  ->p1];.  memAbou
ca10: 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 49 6e  tToChange(p, pIn
ca20: 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e  1);.  if( pIn1->
ca30: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
ca40: 20 29 20 62 72 65 61 6b 3b 0a 20 20 61 73 73 65   ) break;.  asse
ca50: 72 74 28 20 4d 45 4d 5f 53 74 72 3d 3d 28 4d 45  rt( MEM_Str==(ME
ca60: 4d 5f 42 6c 6f 62 3e 3e 33 29 20 29 3b 0a 20 20  M_Blob>>3) );.  
ca70: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 3d 20 28  pIn1->flags |= (
ca80: 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pIn1->flags&MEM_
ca90: 42 6c 6f 62 29 3e 3e 33 3b 0a 20 20 61 70 70 6c  Blob)>>3;.  appl
caa0: 79 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 20  yAffinity(pIn1, 
cab0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 2c  SQLITE_AFF_TEXT,
cac0: 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 72 63   encoding);.  rc
cad0: 20 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49   = ExpandBlob(pI
cae0: 6e 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n1);.  assert( p
caf0: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
cb00: 5f 53 74 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  _Str || db->mall
cb10: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 70 49  ocFailed );.  pI
cb20: 6e 31 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d  n1->flags &= ~(M
cb30: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c  EM_Int|MEM_Real|
cb40: 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 5a 65 72  MEM_Blob|MEM_Zer
cb50: 6f 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58  o);.  UPDATE_MAX
cb60: 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31 29 3b  _BLOBSIZE(pIn1);
cb70: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
cb80: 4f 70 63 6f 64 65 3a 20 54 6f 42 6c 6f 62 20 50  Opcode: ToBlob P
cb90: 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  1 * * * *.**.** 
cba0: 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75 65 20  Force the value 
cbb0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 74  in register P1 t
cbc0: 6f 20 62 65 20 61 20 42 4c 4f 42 2e 0a 2a 2a 20  o be a BLOB..** 
cbd0: 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  If the value is 
cbe0: 6e 75 6d 65 72 69 63 2c 20 63 6f 6e 76 65 72 74  numeric, convert
cbf0: 20 69 74 20 74 6f 20 61 20 73 74 72 69 6e 67 20   it to a string 
cc00: 66 69 72 73 74 2e 0a 2a 2a 20 53 74 72 69 6e 67  first..** String
cc10: 73 20 61 72 65 20 73 69 6d 70 6c 79 20 72 65 69  s are simply rei
cc20: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 62 6c  nterpreted as bl
cc30: 6f 62 73 20 77 69 74 68 20 6e 6f 20 63 68 61 6e  obs with no chan
cc40: 67 65 0a 2a 2a 20 74 6f 20 74 68 65 20 75 6e 64  ge.** to the und
cc50: 65 72 6c 79 69 6e 67 20 64 61 74 61 2e 0a 2a 2a  erlying data..**
cc60: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65  .** A NULL value
cc70: 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20   is not changed 
cc80: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
cc90: 20 20 49 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c    It remains NUL
cca0: 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f  L..*/.case OP_To
ccb0: 42 6c 6f 62 3a 20 7b 20 20 20 20 20 20 20 20 20  Blob: {         
ccc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
ccd0: 20 61 73 20 54 4b 5f 54 4f 5f 42 4c 4f 42 2c 20   as TK_TO_BLOB, 
cce0: 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  in1 */.  pIn1 = 
ccf0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
cd00: 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67    if( pIn1->flag
cd10: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 20 62  s & MEM_Null ) b
cd20: 72 65 61 6b 3b 0a 20 20 69 66 28 20 28 70 49 6e  reak;.  if( (pIn
cd30: 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  1->flags & MEM_B
cd40: 6c 6f 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  lob)==0 ){.    a
cd50: 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e  pplyAffinity(pIn
cd60: 31 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  1, SQLITE_AFF_TE
cd70: 58 54 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  XT, encoding);. 
cd80: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d     assert( pIn1-
cd90: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  >flags & MEM_Str
cda0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
cdb0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 4d 65 6d 53  iled );.    MemS
cdc0: 65 74 54 79 70 65 46 6c 61 67 28 70 49 6e 31 2c  etTypeFlag(pIn1,
cdd0: 20 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 20 20 7d 65   MEM_Blob);.  }e
cde0: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 66  lse{.    pIn1->f
cdf0: 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 54 79  lags &= ~(MEM_Ty
ce00: 70 65 4d 61 73 6b 26 7e 4d 45 4d 5f 42 6c 6f 62  peMask&~MEM_Blob
ce10: 29 3b 0a 20 20 7d 0a 20 20 55 50 44 41 54 45 5f  );.  }.  UPDATE_
ce20: 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e  MAX_BLOBSIZE(pIn
ce30: 31 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  1);.  break;.}..
ce40: 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 6f 4e 75 6d  /* Opcode: ToNum
ce50: 65 72 69 63 20 50 31 20 2a 20 2a 20 2a 20 2a 0a  eric P1 * * * *.
ce60: 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65 20  **.** Force the 
ce70: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
ce80: 72 20 50 31 20 74 6f 20 62 65 20 6e 75 6d 65 72  r P1 to be numer
ce90: 69 63 20 28 65 69 74 68 65 72 20 61 6e 0a 2a 2a  ic (either an.**
cea0: 20 69 6e 74 65 67 65 72 20 6f 72 20 61 20 66 6c   integer or a fl
ceb0: 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 6e 75 6d  oating-point num
cec0: 62 65 72 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20  ber.).** If the 
ced0: 76 61 6c 75 65 20 69 73 20 74 65 78 74 20 6f 72  value is text or
cee0: 20 62 6c 6f 62 2c 20 74 72 79 20 74 6f 20 63 6f   blob, try to co
cef0: 6e 76 65 72 74 20 69 74 20 74 6f 20 61 6e 20 75  nvert it to an u
cf00: 73 69 6e 67 20 74 68 65 0a 2a 2a 20 65 71 75 69  sing the.** equi
cf10: 76 61 6c 65 6e 74 20 6f 66 20 61 74 6f 69 28 29  valent of atoi()
cf20: 20 6f 72 20 61 74 6f 66 28 29 20 61 6e 64 20 73   or atof() and s
cf30: 74 6f 72 65 20 30 20 69 66 20 6e 6f 20 73 75 63  tore 0 if no suc
cf40: 68 20 63 6f 6e 76 65 72 73 69 6f 6e 20 0a 2a 2a  h conversion .**
cf50: 20 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a   is possible..**
cf60: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65  .** A NULL value
cf70: 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20   is not changed 
cf80: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
cf90: 20 20 49 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c    It remains NUL
cfa0: 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f  L..*/.case OP_To
cfb0: 4e 75 6d 65 72 69 63 3a 20 7b 20 20 20 20 20 20  Numeric: {      
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
cfd0: 61 6d 65 20 61 73 20 54 4b 5f 54 4f 5f 4e 55 4d  ame as TK_TO_NUM
cfe0: 45 52 49 43 2c 20 69 6e 31 20 2a 2f 0a 20 20 70  ERIC, in1 */.  p
cff0: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
d000: 3e 70 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56  >p1];.  sqlite3V
d010: 64 62 65 4d 65 6d 4e 75 6d 65 72 69 66 79 28 70  dbeMemNumerify(p
d020: 49 6e 31 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  In1);.  break;.}
d030: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
d040: 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 0a  E_OMIT_CAST */..
d050: 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 6f 49 6e 74  /* Opcode: ToInt
d060: 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
d070: 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75  * Force the valu
d080: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
d090: 20 74 6f 20 62 65 20 61 6e 20 69 6e 74 65 67 65   to be an intege
d0a0: 72 2e 20 20 49 66 0a 2a 2a 20 54 68 65 20 76 61  r.  If.** The va
d0b0: 6c 75 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  lue is currently
d0c0: 20 61 20 72 65 61 6c 20 6e 75 6d 62 65 72 2c 20   a real number, 
d0d0: 64 72 6f 70 20 69 74 73 20 66 72 61 63 74 69 6f  drop its fractio
d0e0: 6e 61 6c 20 70 61 72 74 2e 0a 2a 2a 20 49 66 20  nal part..** If 
d0f0: 74 68 65 20 76 61 6c 75 65 20 69 73 20 74 65 78  the value is tex
d100: 74 20 6f 72 20 62 6c 6f 62 2c 20 74 72 79 20 74  t or blob, try t
d110: 6f 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f 20  o convert it to 
d120: 61 6e 20 69 6e 74 65 67 65 72 20 75 73 69 6e 67  an integer using
d130: 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65   the.** equivale
d140: 6e 74 20 6f 66 20 61 74 6f 69 28 29 20 61 6e 64  nt of atoi() and
d150: 20 73 74 6f 72 65 20 30 20 69 66 20 6e 6f 20 73   store 0 if no s
d160: 75 63 68 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69  uch conversion i
d170: 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a  s possible..**.*
d180: 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69  * A NULL value i
d190: 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 62 79  s not changed by
d1a0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
d1b0: 49 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e  It remains NULL.
d1c0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f 49 6e  .*/.case OP_ToIn
d1d0: 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  t: {            
d1e0: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
d1f0: 20 54 4b 5f 54 4f 5f 49 4e 54 2c 20 69 6e 31 20   TK_TO_INT, in1 
d200: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
d210: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66  m[pOp->p1];.  if
d220: 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
d230: 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b   MEM_Null)==0 ){
d240: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d250: 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49  MemIntegerify(pI
d260: 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  n1);.  }.  break
d270: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
d280: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  d(SQLITE_OMIT_CA
d290: 53 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ST) && !defined(
d2a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
d2b0: 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 2f 2a 20 4f  TING_POINT)./* O
d2c0: 70 63 6f 64 65 3a 20 54 6f 52 65 61 6c 20 50 31  pcode: ToReal P1
d2d0: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46   * * * *.**.** F
d2e0: 6f 72 63 65 20 74 68 65 20 76 61 6c 75 65 20 69  orce the value i
d2f0: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f  n register P1 to
d300: 20 62 65 20 61 20 66 6c 6f 61 74 69 6e 67 20 70   be a floating p
d310: 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  oint number..** 
d320: 49 66 20 54 68 65 20 76 61 6c 75 65 20 69 73 20  If The value is 
d330: 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 69 6e 74  currently an int
d340: 65 67 65 72 2c 20 63 6f 6e 76 65 72 74 20 69 74  eger, convert it
d350: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75  ..** If the valu
d360: 65 20 69 73 20 74 65 78 74 20 6f 72 20 62 6c 6f  e is text or blo
d370: 62 2c 20 74 72 79 20 74 6f 20 63 6f 6e 76 65 72  b, try to conver
d380: 74 20 69 74 20 74 6f 20 61 6e 20 69 6e 74 65 67  t it to an integ
d390: 65 72 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20  er using the.** 
d3a0: 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 61 74  equivalent of at
d3b0: 6f 69 28 29 20 61 6e 64 20 73 74 6f 72 65 20 30  oi() and store 0
d3c0: 2e 30 20 69 66 20 6e 6f 20 73 75 63 68 20 63 6f  .0 if no such co
d3d0: 6e 76 65 72 73 69 6f 6e 20 69 73 20 70 6f 73 73  nversion is poss
d3e0: 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  ible..**.** A NU
d3f0: 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20  LL value is not 
d400: 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20  changed by this 
d410: 72 6f 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d  routine.  It rem
d420: 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61  ains NULL..*/.ca
d430: 73 65 20 4f 50 5f 54 6f 52 65 61 6c 3a 20 7b 20  se OP_ToReal: { 
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d450: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 54   /* same as TK_T
d460: 4f 5f 52 45 41 4c 2c 20 69 6e 31 20 2a 2f 0a 20  O_REAL, in1 */. 
d470: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
d480: 70 2d 3e 70 31 5d 3b 0a 20 20 6d 65 6d 41 62 6f  p->p1];.  memAbo
d490: 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 49  utToChange(p, pI
d4a0: 6e 31 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31  n1);.  if( (pIn1
d4b0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
d4c0: 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ll)==0 ){.    sq
d4d0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 61 6c  lite3VdbeMemReal
d4e0: 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20  ify(pIn1);.  }. 
d4f0: 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
d500: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
d510: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 29 20 26  ITE_OMIT_CAST) &
d520: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
d530: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
d540: 50 4f 49 4e 54 29 20 2a 2f 0a 0a 2f 2a 20 4f 70  POINT) */../* Op
d550: 63 6f 64 65 3a 20 4c 74 20 50 31 20 50 32 20 50  code: Lt P1 P2 P
d560: 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 43 6f  3 P4 P5.**.** Co
d570: 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73  mpare the values
d580: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
d590: 61 6e 64 20 50 33 2e 20 20 49 66 20 72 65 67 28  and P3.  If reg(
d5a0: 50 33 29 3c 72 65 67 28 50 31 29 20 74 68 65 6e  P3)<reg(P1) then
d5b0: 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 61 64 64 72  .** jump to addr
d5c0: 65 73 73 20 50 32 2e 20 20 0a 2a 2a 0a 2a 2a 20  ess P2.  .**.** 
d5d0: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4a 55  If the SQLITE_JU
d5e0: 4d 50 49 46 4e 55 4c 4c 20 62 69 74 20 6f 66 20  MPIFNULL bit of 
d5f0: 50 35 20 69 73 20 73 65 74 20 61 6e 64 20 65 69  P5 is set and ei
d600: 74 68 65 72 20 72 65 67 28 50 31 29 20 6f 72 0a  ther reg(P1) or.
d610: 2a 2a 20 72 65 67 28 50 33 29 20 69 73 20 4e 55  ** reg(P3) is NU
d620: 4c 4c 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65  LL then take the
d630: 20 6a 75 6d 70 2e 20 20 49 66 20 74 68 65 20 53   jump.  If the S
d640: 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
d650: 20 0a 2a 2a 20 62 69 74 20 69 73 20 63 6c 65 61   .** bit is clea
d660: 72 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  r then fall thro
d670: 75 67 68 20 69 66 20 65 69 74 68 65 72 20 6f 70  ugh if either op
d680: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2e 0a 2a  erand is NULL..*
d690: 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
d6a0: 41 46 46 5f 4d 41 53 4b 20 70 6f 72 74 69 6f 6e  AFF_MASK portion
d6b0: 20 6f 66 20 50 35 20 6d 75 73 74 20 62 65 20 61   of P5 must be a
d6c0: 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 72 61  n affinity chara
d6d0: 63 74 65 72 20 2d 0a 2a 2a 20 53 51 4c 49 54 45  cter -.** SQLITE
d6e0: 5f 41 46 46 5f 54 45 58 54 2c 20 53 51 4c 49 54  _AFF_TEXT, SQLIT
d6f0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 2c 20 61  E_AFF_INTEGER, a
d700: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 41 6e 20  nd so forth. An 
d710: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
d720: 0a 2a 2a 20 74 6f 20 63 6f 65 72 63 65 20 62 6f  .** to coerce bo
d730: 74 68 20 69 6e 70 75 74 73 20 61 63 63 6f 72 64  th inputs accord
d740: 69 6e 67 20 74 6f 20 74 68 69 73 20 61 66 66 69  ing to this affi
d750: 6e 69 74 79 20 62 65 66 6f 72 65 20 74 68 65 0a  nity before the.
d760: 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  ** comparison is
d770: 20 6d 61 64 65 2e 20 49 66 20 74 68 65 20 53 51   made. If the SQ
d780: 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 69 73  LITE_AFF_MASK is
d790: 20 30 78 30 30 2c 20 74 68 65 6e 20 6e 75 6d 65   0x00, then nume
d7a0: 72 69 63 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  ric.** affinity 
d7b0: 69 73 20 75 73 65 64 2e 20 4e 6f 74 65 20 74 68  is used. Note th
d7c0: 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  at the affinity 
d7d0: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20  conversions are 
d7e0: 73 74 6f 72 65 64 0a 2a 2a 20 62 61 63 6b 20 69  stored.** back i
d7f0: 6e 74 6f 20 74 68 65 20 69 6e 70 75 74 20 72 65  nto the input re
d800: 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50  gisters P1 and P
d810: 33 2e 20 20 53 6f 20 74 68 69 73 20 6f 70 63 6f  3.  So this opco
d820: 64 65 20 63 61 6e 20 63 61 75 73 65 0a 2a 2a 20  de can cause.** 
d830: 70 65 72 73 69 73 74 65 6e 74 20 63 68 61 6e 67  persistent chang
d840: 65 73 20 74 6f 20 72 65 67 69 73 74 65 72 73 20  es to registers 
d850: 50 31 20 61 6e 64 20 50 33 2e 0a 2a 2a 0a 2a 2a  P1 and P3..**.**
d860: 20 4f 6e 63 65 20 61 6e 79 20 63 6f 6e 76 65 72   Once any conver
d870: 73 69 6f 6e 73 20 68 61 76 65 20 74 61 6b 65 6e  sions have taken
d880: 20 70 6c 61 63 65 2c 20 61 6e 64 20 6e 65 69 74   place, and neit
d890: 68 65 72 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  her value is NUL
d8a0: 4c 2c 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  L, .** the value
d8b0: 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64 2e 20  s are compared. 
d8c0: 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61  If both values a
d8d0: 72 65 20 62 6c 6f 62 73 20 74 68 65 6e 20 6d 65  re blobs then me
d8e0: 6d 63 6d 70 28 29 20 69 73 0a 2a 2a 20 75 73 65  mcmp() is.** use
d8f0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
d900: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
d910: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49  e comparison.  I
d920: 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 2a 2a  f both values.**
d930: 20 61 72 65 20 74 65 78 74 2c 20 74 68 65 6e 20   are text, then 
d940: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
d950: 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
d960: 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 0a  on specified in.
d970: 2a 2a 20 50 34 20 69 73 20 20 75 73 65 64 20 74  ** P4 is  used t
d980: 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  o do the compari
d990: 73 6f 6e 2e 20 20 49 66 20 50 34 20 69 73 20 6e  son.  If P4 is n
d9a0: 6f 74 20 73 70 65 63 69 66 69 65 64 20 74 68 65  ot specified the
d9b0: 6e 0a 2a 2a 20 6d 65 6d 63 6d 70 28 29 20 69 73  n.** memcmp() is
d9c0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65   used to compare
d9d0: 20 74 65 78 74 20 73 74 72 69 6e 67 2e 20 20 49   text string.  I
d9e0: 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72  f both values ar
d9f0: 65 0a 2a 2a 20 6e 75 6d 65 72 69 63 2c 20 74 68  e.** numeric, th
da00: 65 6e 20 61 20 6e 75 6d 65 72 69 63 20 63 6f 6d  en a numeric com
da10: 70 61 72 69 73 6f 6e 20 69 73 20 75 73 65 64 2e  parison is used.
da20: 20 49 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75   If the two valu
da30: 65 73 0a 2a 2a 20 61 72 65 20 6f 66 20 64 69 66  es.** are of dif
da40: 66 65 72 65 6e 74 20 74 79 70 65 73 2c 20 74 68  ferent types, th
da50: 65 6e 20 6e 75 6d 62 65 72 73 20 61 72 65 20 63  en numbers are c
da60: 6f 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20 74  onsidered less t
da70: 68 61 6e 0a 2a 2a 20 73 74 72 69 6e 67 73 20 61  han.** strings a
da80: 6e 64 20 73 74 72 69 6e 67 73 20 61 72 65 20 63  nd strings are c
da90: 6f 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20 74  onsidered less t
daa0: 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2a 0a 2a 2a  han blobs..**.**
dab0: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53   If the SQLITE_S
dac0: 54 4f 52 45 50 32 20 62 69 74 20 6f 66 20 50 35  TOREP2 bit of P5
dad0: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 64 6f   is set, then do
dae0: 20 6e 6f 74 20 6a 75 6d 70 2e 20 20 49 6e 73 74   not jump.  Inst
daf0: 65 61 64 2c 0a 2a 2a 20 73 74 6f 72 65 20 61 20  ead,.** store a 
db00: 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 28  boolean result (
db10: 65 69 74 68 65 72 20 30 2c 20 6f 72 20 31 2c 20  either 0, or 1, 
db20: 6f 72 20 4e 55 4c 4c 29 20 69 6e 20 72 65 67 69  or NULL) in regi
db30: 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49  ster P2..**.** I
db40: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 55 4c  f the SQLITE_NUL
db50: 4c 45 51 20 62 69 74 20 69 73 20 73 65 74 20 69  LEQ bit is set i
db60: 6e 20 50 35 2c 20 74 68 65 6e 20 4e 55 4c 4c 20  n P5, then NULL 
db70: 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69  values are consi
db80: 64 65 72 65 64 0a 2a 2a 20 65 71 75 61 6c 20 74  dered.** equal t
db90: 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2c 20 70  o one another, p
dba0: 72 6f 76 69 64 65 64 20 74 68 61 74 20 74 68 65  rovided that the
dbb0: 79 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68  y do not have th
dbc0: 65 69 72 20 4d 45 4d 5f 43 6c 65 61 72 65 64 0a  eir MEM_Cleared.
dbd0: 2a 2a 20 62 69 74 20 73 65 74 2e 0a 2a 2f 0a 2f  ** bit set..*/./
dbe0: 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 20 50 31 20  * Opcode: Ne P1 
dbf0: 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
dc00: 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
dc10: 74 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70  t like the Lt op
dc20: 63 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74  code except that
dc30: 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
dc40: 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 6f 70 65  en if.** the ope
dc50: 72 61 6e 64 73 20 69 6e 20 72 65 67 69 73 74 65  rands in registe
dc60: 72 73 20 50 31 20 61 6e 64 20 50 33 20 61 72 65  rs P1 and P3 are
dc70: 20 6e 6f 74 20 65 71 75 61 6c 2e 20 20 53 65 65   not equal.  See
dc80: 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66   the Lt opcode f
dc90: 6f 72 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c  or.** additional
dca0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
dcb0: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4e 55  .** If SQLITE_NU
dcc0: 4c 4c 45 51 20 69 73 20 73 65 74 20 69 6e 20 50  LLEQ is set in P
dcd0: 35 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  5 then the resul
dce0: 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
dcf0: 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72  is always either
dd00: 0a 2a 2a 20 74 72 75 65 20 6f 72 20 66 61 6c 73  .** true or fals
dd10: 65 20 61 6e 64 20 69 73 20 6e 65 76 65 72 20 4e  e and is never N
dd20: 55 4c 4c 2e 20 20 49 66 20 62 6f 74 68 20 6f 70  ULL.  If both op
dd30: 65 72 61 6e 64 73 20 61 72 65 20 4e 55 4c 4c 20  erands are NULL 
dd40: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a  then the result.
dd50: 2a 2a 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ** of comparison
dd60: 20 69 73 20 66 61 6c 73 65 2e 20 20 49 66 20 65   is false.  If e
dd70: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
dd80: 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72   NULL then the r
dd90: 65 73 75 6c 74 20 69 73 20 74 72 75 65 2e 0a 2a  esult is true..*
dda0: 2a 20 49 66 20 6e 65 69 74 68 65 72 20 6f 70 65  * If neither ope
ddb0: 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74 68 65  rand is NULL the
ddc0: 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 73   result is the s
ddd0: 61 6d 65 20 61 73 20 69 74 20 77 6f 75 6c 64 20  ame as it would 
dde0: 62 65 20 69 66 0a 2a 2a 20 74 68 65 20 53 51 4c  be if.** the SQL
ddf0: 49 54 45 5f 4e 55 4c 4c 45 51 20 66 6c 61 67 20  ITE_NULLEQ flag 
de00: 77 65 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f  were omitted fro
de10: 6d 20 50 35 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  m P5..*/./* Opco
de20: 64 65 3a 20 45 71 20 50 31 20 50 32 20 50 33 20  de: Eq P1 P2 P3 
de30: 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73  P4 P5.**.** This
de40: 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
de50: 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65   the Lt opcode e
de60: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6a  xcept that the j
de70: 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a  ump is taken if.
de80: 2a 2a 20 74 68 65 20 6f 70 65 72 61 6e 64 73 20  ** the operands 
de90: 69 6e 20 72 65 67 69 73 74 65 72 73 20 50 31 20  in registers P1 
dea0: 61 6e 64 20 50 33 20 61 72 65 20 65 71 75 61 6c  and P3 are equal
deb0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 4c 74 20  ..** See the Lt 
dec0: 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74  opcode for addit
ded0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
dee0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  n..**.** If SQLI
def0: 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 73 65 74  TE_NULLEQ is set
df00: 20 69 6e 20 50 35 20 74 68 65 6e 20 74 68 65 20   in P5 then the 
df10: 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  result of compar
df20: 69 73 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65  ison is always e
df30: 69 74 68 65 72 0a 2a 2a 20 74 72 75 65 20 6f 72  ither.** true or
df40: 20 66 61 6c 73 65 20 61 6e 64 20 69 73 20 6e 65   false and is ne
df50: 76 65 72 20 4e 55 4c 4c 2e 20 20 49 66 20 62 6f  ver NULL.  If bo
df60: 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20  th operands are 
df70: 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72 65  NULL then the re
df80: 73 75 6c 74 0a 2a 2a 20 6f 66 20 63 6f 6d 70 61  sult.** of compa
df90: 72 69 73 6f 6e 20 69 73 20 74 72 75 65 2e 20 20  rison is true.  
dfa0: 49 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e  If either operan
dfb0: 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74  d is NULL then t
dfc0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c  he result is fal
dfd0: 73 65 2e 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65  se..** If neithe
dfe0: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
dff0: 4c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  L the result is 
e000: 74 68 65 20 73 61 6d 65 20 61 73 20 69 74 20 77  the same as it w
e010: 6f 75 6c 64 20 62 65 20 69 66 0a 2a 2a 20 74 68  ould be if.** th
e020: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20  e SQLITE_NULLEQ 
e030: 66 6c 61 67 20 77 65 72 65 20 6f 6d 69 74 74 65  flag were omitte
e040: 64 20 66 72 6f 6d 20 50 35 2e 0a 2a 2f 0a 2f 2a  d from P5..*/./*
e050: 20 4f 70 63 6f 64 65 3a 20 4c 65 20 50 31 20 50   Opcode: Le P1 P
e060: 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
e070: 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74   This works just
e080: 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63   like the Lt opc
e090: 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74 20  ode except that 
e0a0: 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65  the jump is take
e0b0: 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  n if.** the cont
e0c0: 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20  ent of register 
e0d0: 50 33 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  P3 is less than 
e0e0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
e0f0: 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65  content of.** re
e100: 67 69 73 74 65 72 20 50 31 2e 20 20 53 65 65 20  gister P1.  See 
e110: 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f  the Lt opcode fo
e120: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
e130: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20  ormation..*/./* 
e140: 4f 70 63 6f 64 65 3a 20 47 74 20 50 31 20 50 32  Opcode: Gt P1 P2
e150: 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20   P3 P4 P5.**.** 
e160: 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20  This works just 
e170: 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f  like the Lt opco
e180: 64 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74  de except that t
e190: 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
e1a0: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65   if.** the conte
e1b0: 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
e1c0: 33 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  3 is greater tha
e1d0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
e1e0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 2e  .** register P1.
e1f0: 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63    See the Lt opc
e200: 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ode for addition
e210: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
e220: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 65  */./* Opcode: Ge
e230: 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
e240: 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
e250: 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 4c   just like the L
e260: 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20  t opcode except 
e270: 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73  that the jump is
e280: 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65   taken if.** the
e290: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69   content of regi
e2a0: 73 74 65 72 20 50 33 20 69 73 20 67 72 65 61 74  ster P3 is great
e2b0: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
e2c0: 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   to the content 
e2d0: 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50  of.** register P
e2e0: 31 2e 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f  1.  See the Lt o
e2f0: 70 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69  pcode for additi
e300: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
e310: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 71 3a  ..*/.case OP_Eq:
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e330: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 45 51 2c  * same as TK_EQ,
e340: 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20   jump, in1, in3 
e350: 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 3a 20 20  */.case OP_Ne:  
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e370: 73 61 6d 65 20 61 73 20 54 4b 5f 4e 45 2c 20 6a  same as TK_NE, j
e380: 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f  ump, in1, in3 */
e390: 0a 63 61 73 65 20 4f 50 5f 4c 74 3a 20 20 20 20  .case OP_Lt:    
e3a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
e3b0: 6d 65 20 61 73 20 54 4b 5f 4c 54 2c 20 6a 75 6d  me as TK_LT, jum
e3c0: 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63  p, in1, in3 */.c
e3d0: 61 73 65 20 4f 50 5f 4c 65 3a 20 20 20 20 20 20  ase OP_Le:      
e3e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
e3f0: 20 61 73 20 54 4b 5f 4c 45 2c 20 6a 75 6d 70 2c   as TK_LE, jump,
e400: 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73   in1, in3 */.cas
e410: 65 20 4f 50 5f 47 74 3a 20 20 20 20 20 20 20 20  e OP_Gt:        
e420: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
e430: 73 20 54 4b 5f 47 54 2c 20 6a 75 6d 70 2c 20 69  s TK_GT, jump, i
e440: 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20  n1, in3 */.case 
e450: 4f 50 5f 47 65 3a 20 7b 20 20 20 20 20 20 20 20  OP_Ge: {        
e460: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
e470: 54 4b 5f 47 45 2c 20 6a 75 6d 70 2c 20 69 6e 31  TK_GE, jump, in1
e480: 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 72  , in3 */.  int r
e490: 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  es;            /
e4a0: 2a 20 52 65 73 75 6c 74 20 6f 66 20 74 68 65 20  * Result of the 
e4b0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 70 49  comparison of pI
e4c0: 6e 31 20 61 67 61 69 6e 73 74 20 70 49 6e 33 20  n1 against pIn3 
e4d0: 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69 6e 69  */.  char affini
e4e0: 74 79 3b 20 20 20 20 20 20 2f 2a 20 41 66 66 69  ty;      /* Affi
e4f0: 6e 69 74 79 20 74 6f 20 75 73 65 20 66 6f 72 20  nity to use for 
e500: 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20  comparison */.  
e510: 75 31 36 20 66 6c 61 67 73 31 3b 20 20 20 20 20  u16 flags1;     
e520: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69      /* Copy of i
e530: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
e540: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 2a 2f 0a 20  pIn1->flags */. 
e550: 20 75 31 36 20 66 6c 61 67 73 33 3b 20 20 20 20   u16 flags3;    
e560: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
e570: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  initial value of
e580: 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 2a 2f 0a   pIn3->flags */.
e590: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
e5a0: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 33  pOp->p1];.  pIn3
e5b0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
e5c0: 5d 3b 0a 20 20 66 6c 61 67 73 31 20 3d 20 70 49  ];.  flags1 = pI
e5d0: 6e 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 6c 61  n1->flags;.  fla
e5e0: 67 73 33 20 3d 20 70 49 6e 33 2d 3e 66 6c 61 67  gs3 = pIn3->flag
e5f0: 73 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 31  s;.  if( (flags1
e600: 20 7c 20 66 6c 61 67 73 33 29 26 4d 45 4d 5f 4e   | flags3)&MEM_N
e610: 75 6c 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e  ull ){.    /* On
e620: 65 20 6f 72 20 62 6f 74 68 20 6f 70 65 72 61 6e  e or both operan
e630: 64 73 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ds are NULL */. 
e640: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26     if( pOp->p5 &
e650: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 29   SQLITE_NULLEQ )
e660: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 53 51  {.      /* If SQ
e670: 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 73  LITE_NULLEQ is s
e680: 65 74 20 28 77 68 69 63 68 20 77 69 6c 6c 20 6f  et (which will o
e690: 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
e6a0: 65 20 6f 70 65 72 61 74 6f 72 20 69 73 0a 20 20  e operator is.  
e6b0: 20 20 20 20 2a 2a 20 4f 50 5f 45 71 20 6f 72 20      ** OP_Eq or 
e6c0: 4f 50 5f 4e 65 29 20 74 68 65 6e 20 74 61 6b 65  OP_Ne) then take
e6d0: 20 74 68 65 20 6a 75 6d 70 20 6f 72 20 6e 6f 74   the jump or not
e6e0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
e6f0: 65 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f  ether.      ** o
e700: 72 20 6e 6f 74 20 62 6f 74 68 20 6f 70 65 72 61  r not both opera
e710: 6e 64 73 20 61 72 65 20 6e 75 6c 6c 2e 0a 20 20  nds are null..  
e720: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
e730: 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
e740: 3d 3d 4f 50 5f 45 71 20 7c 7c 20 70 4f 70 2d 3e  ==OP_Eq || pOp->
e750: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b  opcode==OP_Ne );
e760: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
e770: 66 6c 61 67 73 31 20 26 20 4d 45 4d 5f 43 6c 65  flags1 & MEM_Cle
e780: 61 72 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ared)==0 );.    
e790: 20 20 69 66 28 20 28 66 6c 61 67 73 31 26 4d 45    if( (flags1&ME
e7a0: 4d 5f 4e 75 6c 6c 29 21 3d 30 0a 20 20 20 20 20  M_Null)!=0.     
e7b0: 20 20 26 26 20 28 66 6c 61 67 73 33 26 4d 45 4d    && (flags3&MEM
e7c0: 5f 4e 75 6c 6c 29 21 3d 30 0a 20 20 20 20 20 20  _Null)!=0.      
e7d0: 20 26 26 20 28 66 6c 61 67 73 33 26 4d 45 4d 5f   && (flags3&MEM_
e7e0: 43 6c 65 61 72 65 64 29 3d 3d 30 0a 20 20 20 20  Cleared)==0.    
e7f0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73    ){.        res
e800: 20 3d 20 30 3b 20 20 2f 2a 20 52 65 73 75 6c 74   = 0;  /* Result
e810: 73 20 61 72 65 20 65 71 75 61 6c 20 2a 2f 0a 20  s are equal */. 
e820: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e830: 20 20 20 20 72 65 73 20 3d 20 31 3b 20 20 2f 2a      res = 1;  /*
e840: 20 52 65 73 75 6c 74 73 20 61 72 65 20 6e 6f 74   Results are not
e850: 20 65 71 75 61 6c 20 2a 2f 0a 20 20 20 20 20 20   equal */.      
e860: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
e870: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55 4c     /* SQLITE_NUL
e880: 4c 45 51 20 69 73 20 63 6c 65 61 72 20 61 6e 64  LEQ is clear and
e890: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70   at least one op
e8a0: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c 0a 20  erand is NULL,. 
e8b0: 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
e8c0: 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79   result is alway
e8d0: 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 2a 2a  s NULL..      **
e8e0: 20 54 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   The jump is tak
e8f0: 65 6e 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  en if the SQLITE
e900: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 62 69 74 20  _JUMPIFNULL bit 
e910: 69 73 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f  is set..      */
e920: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
e930: 70 35 20 26 20 53 51 4c 49 54 45 5f 4a 55 4d 50  p5 & SQLITE_JUMP
e940: 49 46 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  IFNULL ){.      
e950: 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31    pc = pOp->p2-1
e960: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
e970: 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49  ( pOp->p5 & SQLI
e980: 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 20  TE_STOREP2 ){.  
e990: 20 20 20 20 20 20 70 4f 75 74 20 3d 20 26 61 4d        pOut = &aM
e9a0: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20  em[pOp->p2];.   
e9b0: 20 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46       MemSetTypeF
e9c0: 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 4e 75  lag(pOut, MEM_Nu
e9d0: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 52 45 47  ll);.        REG
e9e0: 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
e9f0: 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20  >p2, pOut);.    
ea00: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
ea10: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
ea20: 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 6f      /* Neither o
ea30: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2e 20  perand is NULL. 
ea40: 20 44 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   Do a comparison
ea50: 2e 20 2a 2f 0a 20 20 20 20 61 66 66 69 6e 69 74  . */.    affinit
ea60: 79 20 3d 20 70 4f 70 2d 3e 70 35 20 26 20 53 51  y = pOp->p5 & SQ
ea70: 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 3b 0a 20  LITE_AFF_MASK;. 
ea80: 20 20 20 69 66 28 20 61 66 66 69 6e 69 74 79 20     if( affinity 
ea90: 29 7b 0a 20 20 20 20 20 20 61 70 70 6c 79 41 66  ){.      applyAf
eaa0: 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 61 66 66  finity(pIn1, aff
eab0: 69 6e 69 74 79 2c 20 65 6e 63 6f 64 69 6e 67 29  inity, encoding)
eac0: 3b 0a 20 20 20 20 20 20 61 70 70 6c 79 41 66 66  ;.      applyAff
ead0: 69 6e 69 74 79 28 70 49 6e 33 2c 20 61 66 66 69  inity(pIn3, affi
eae0: 6e 69 74 79 2c 20 65 6e 63 6f 64 69 6e 67 29 3b  nity, encoding);
eaf0: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  .      if( db->m
eb00: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
eb10: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
eb20: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ..    assert( pO
eb30: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f  p->p4type==P4_CO
eb40: 4c 4c 53 45 51 20 7c 7c 20 70 4f 70 2d 3e 70 34  LLSEQ || pOp->p4
eb50: 2e 70 43 6f 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  .pColl==0 );.   
eb60: 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31   ExpandBlob(pIn1
eb70: 29 3b 0a 20 20 20 20 45 78 70 61 6e 64 42 6c 6f  );.    ExpandBlo
eb80: 62 28 70 49 6e 33 29 3b 0a 20 20 20 20 72 65 73  b(pIn3);.    res
eb90: 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
eba0: 70 61 72 65 28 70 49 6e 33 2c 20 70 49 6e 31 2c  pare(pIn3, pIn1,
ebb0: 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 29 3b   pOp->p4.pColl);
ebc0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
ebd0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20  Op->opcode ){.  
ebe0: 20 20 63 61 73 65 20 4f 50 5f 45 71 3a 20 20 20    case OP_Eq:   
ebf0: 20 72 65 73 20 3d 20 72 65 73 3d 3d 30 3b 20 20   res = res==0;  
ec00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
ec10: 73 65 20 4f 50 5f 4e 65 3a 20 20 20 20 72 65 73  se OP_Ne:    res
ec20: 20 3d 20 72 65 73 21 3d 30 3b 20 20 20 20 20 62   = res!=0;     b
ec30: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f  reak;.    case O
ec40: 50 5f 4c 74 3a 20 20 20 20 72 65 73 20 3d 20 72  P_Lt:    res = r
ec50: 65 73 3c 30 3b 20 20 20 20 20 20 62 72 65 61 6b  es<0;      break
ec60: 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 4c 65  ;.    case OP_Le
ec70: 3a 20 20 20 20 72 65 73 20 3d 20 72 65 73 3c 3d  :    res = res<=
ec80: 30 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  0;     break;.  
ec90: 20 20 63 61 73 65 20 4f 50 5f 47 74 3a 20 20 20    case OP_Gt:   
eca0: 20 72 65 73 20 3d 20 72 65 73 3e 30 3b 20 20 20   res = res>0;   
ecb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
ecc0: 66 61 75 6c 74 3a 20 20 20 20 20 20 20 72 65 73  fault:       res
ecd0: 20 3d 20 72 65 73 3e 3d 30 3b 20 20 20 20 20 62   = res>=0;     b
ece0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  reak;.  }..  if(
ecf0: 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54   pOp->p5 & SQLIT
ed00: 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 20 20  E_STOREP2 ){.   
ed10: 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
ed20: 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 6d 65 6d 41  p->p2];.    memA
ed30: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
ed40: 70 4f 75 74 29 3b 0a 20 20 20 20 4d 65 6d 53 65  pOut);.    MemSe
ed50: 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20  tTypeFlag(pOut, 
ed60: 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 20 20 70 4f  MEM_Int);.    pO
ed70: 75 74 2d 3e 75 2e 69 20 3d 20 72 65 73 3b 0a 20  ut->u.i = res;. 
ed80: 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
ed90: 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29  E(pOp->p2, pOut)
eda0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65  ;.  }else if( re
edb0: 73 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f  s ){.    pc = pO
edc0: 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d 0a 0a 20 20  p->p2-1;.  }..  
edd0: 2f 2a 20 55 6e 64 6f 20 61 6e 79 20 63 68 61 6e  /* Undo any chan
ede0: 67 65 73 20 6d 61 64 65 20 62 79 20 61 70 70 6c  ges made by appl
edf0: 79 41 66 66 69 6e 69 74 79 28 29 20 74 6f 20 74  yAffinity() to t
ee00: 68 65 20 69 6e 70 75 74 20 72 65 67 69 73 74 65  he input registe
ee10: 72 73 2e 20 2a 2f 0a 20 20 70 49 6e 31 2d 3e 66  rs. */.  pIn1->f
ee20: 6c 61 67 73 20 3d 20 28 70 49 6e 31 2d 3e 66 6c  lags = (pIn1->fl
ee30: 61 67 73 26 7e 4d 45 4d 5f 54 79 70 65 4d 61 73  ags&~MEM_TypeMas
ee40: 6b 29 20 7c 20 28 66 6c 61 67 73 31 26 4d 45 4d  k) | (flags1&MEM
ee50: 5f 54 79 70 65 4d 61 73 6b 29 3b 0a 20 20 70 49  _TypeMask);.  pI
ee60: 6e 33 2d 3e 66 6c 61 67 73 20 3d 20 28 70 49 6e  n3->flags = (pIn
ee70: 33 2d 3e 66 6c 61 67 73 26 7e 4d 45 4d 5f 54 79  3->flags&~MEM_Ty
ee80: 70 65 4d 61 73 6b 29 20 7c 20 28 66 6c 61 67 73  peMask) | (flags
ee90: 33 26 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 3b  3&MEM_TypeMask);
eea0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
eeb0: 4f 70 63 6f 64 65 3a 20 50 65 72 6d 75 74 61 74  Opcode: Permutat
eec0: 69 6f 6e 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a  ion * * * P4 *.*
eed0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 65 72  *.** Set the per
eee0: 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 62 79  mutation used by
eef0: 20 74 68 65 20 4f 50 5f 43 6f 6d 70 61 72 65 20   the OP_Compare 
ef00: 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 74  operator to be t
ef10: 68 65 20 61 72 72 61 79 0a 2a 2a 20 6f 66 20 69  he array.** of i
ef20: 6e 74 65 67 65 72 73 20 69 6e 20 50 34 2e 0a 2a  ntegers in P4..*
ef30: 2a 0a 2a 2a 20 54 68 65 20 70 65 72 6d 75 74 61  *.** The permuta
ef40: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 76 61 6c  tion is only val
ef50: 69 64 20 75 6e 74 69 6c 20 74 68 65 20 6e 65 78  id until the nex
ef60: 74 20 4f 50 5f 43 6f 6d 70 61 72 65 20 74 68 61  t OP_Compare tha
ef70: 74 20 68 61 73 0a 2a 2a 20 74 68 65 20 4f 50 46  t has.** the OPF
ef80: 4c 41 47 5f 50 45 52 4d 55 54 45 20 62 69 74 20  LAG_PERMUTE bit 
ef90: 73 65 74 20 69 6e 20 50 35 2e 20 54 79 70 69 63  set in P5. Typic
efa0: 61 6c 6c 79 20 74 68 65 20 4f 50 5f 50 65 72 6d  ally the OP_Perm
efb0: 75 74 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 0a  utation should .
efc0: 2a 2a 20 6f 63 63 75 72 20 69 6d 6d 65 64 69 61  ** occur immedia
efd0: 74 65 6c 79 20 70 72 69 6f 72 20 74 6f 20 74 68  tely prior to th
efe0: 65 20 4f 50 5f 43 6f 6d 70 61 72 65 2e 0a 2a 2f  e OP_Compare..*/
eff0: 0a 63 61 73 65 20 4f 50 5f 50 65 72 6d 75 74 61  .case OP_Permuta
f000: 74 69 6f 6e 3a 20 7b 0a 20 20 61 73 73 65 72 74  tion: {.  assert
f010: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
f020: 34 5f 49 4e 54 41 52 52 41 59 20 29 3b 0a 20 20  4_INTARRAY );.  
f030: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e  assert( pOp->p4.
f040: 61 69 20 29 3b 0a 20 20 61 50 65 72 6d 75 74 65  ai );.  aPermute
f050: 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20   = pOp->p4.ai;. 
f060: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
f070: 63 6f 64 65 3a 20 43 6f 6d 70 61 72 65 20 50 31  code: Compare P1
f080: 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a   P2 P3 P4 P5.**.
f090: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 76  ** Compare two v
f0a0: 65 63 74 6f 72 73 20 6f 66 20 72 65 67 69 73 74  ectors of regist
f0b0: 65 72 73 20 69 6e 20 72 65 67 28 50 31 29 2e 2e  ers in reg(P1)..
f0c0: 72 65 67 28 50 31 2b 50 33 2d 31 29 20 28 63 61  reg(P1+P3-1) (ca
f0d0: 6c 6c 20 74 68 69 73 0a 2a 2a 20 76 65 63 74 6f  ll this.** vecto
f0e0: 72 20 22 41 22 29 20 61 6e 64 20 69 6e 20 72 65  r "A") and in re
f0f0: 67 28 50 32 29 2e 2e 72 65 67 28 50 32 2b 50 33  g(P2)..reg(P2+P3
f100: 2d 31 29 20 28 22 42 22 29 2e 20 20 53 61 76 65  -1) ("B").  Save
f110: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
f120: 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * the comparison
f130: 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
f140: 6e 65 78 74 20 4f 50 5f 4a 75 6d 70 20 69 6e 73  next OP_Jump ins
f150: 74 72 75 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  truct..**.** If 
f160: 50 35 20 68 61 73 20 74 68 65 20 4f 50 46 4c 41  P5 has the OPFLA
f170: 47 5f 50 45 52 4d 55 54 45 20 62 69 74 20 73 65  G_PERMUTE bit se
f180: 74 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 64 65  t, then the orde
f190: 72 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  r of comparison 
f1a0: 69 73 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  is.** determined
f1b0: 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63   by the most rec
f1c0: 65 6e 74 20 4f 50 5f 50 65 72 6d 75 74 61 74 69  ent OP_Permutati
f1d0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  on operator.  If
f1e0: 20 74 68 65 0a 2a 2a 20 4f 50 46 4c 41 47 5f 50   the.** OPFLAG_P
f1f0: 45 52 4d 55 54 45 20 62 69 74 20 69 73 20 63 6c  ERMUTE bit is cl
f200: 65 61 72 2c 20 74 68 65 6e 20 72 65 67 69 73 74  ear, then regist
f210: 65 72 20 61 72 65 20 63 6f 6d 70 61 72 65 64 20  er are compared 
f220: 69 6e 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  in sequential.**
f230: 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 50 34   order..**.** P4
f240: 20 69 73 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   is a KeyInfo st
f250: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66  ructure that def
f260: 69 6e 65 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ines collating s
f270: 65 71 75 65 6e 63 65 73 20 61 6e 64 20 73 6f 72  equences and sor
f280: 74 0a 2a 2a 20 6f 72 64 65 72 73 20 66 6f 72 20  t.** orders for 
f290: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  the comparison. 
f2a0: 20 54 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   The permutation
f2b0: 20 61 70 70 6c 69 65 73 20 74 6f 20 72 65 67 69   applies to regi
f2c0: 73 74 65 72 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 20  sters.** only.  
f2d0: 54 68 65 20 4b 65 79 49 6e 66 6f 20 65 6c 65 6d  The KeyInfo elem
f2e0: 65 6e 74 73 20 61 72 65 20 75 73 65 64 20 73 65  ents are used se
f2f0: 71 75 65 6e 74 69 61 6c 6c 79 2e 0a 2a 2a 0a 2a  quentially..**.*
f300: 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
f310: 20 69 73 20 61 20 73 6f 72 74 20 63 6f 6d 70 61   is a sort compa
f320: 72 69 73 6f 6e 2c 20 73 6f 20 4e 55 4c 4c 73 20  rison, so NULLs 
f330: 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 2c 0a 2a  compare equal,.*
f340: 2a 20 4e 55 4c 4c 73 20 61 72 65 20 6c 65 73 73  * NULLs are less
f350: 20 74 68 61 6e 20 6e 75 6d 62 65 72 73 2c 20 6e   than numbers, n
f360: 75 6d 62 65 72 73 20 61 72 65 20 6c 65 73 73 20  umbers are less 
f370: 74 68 61 6e 20 73 74 72 69 6e 67 73 2c 0a 2a 2a  than strings,.**
f380: 20 61 6e 64 20 73 74 72 69 6e 67 73 20 61 72 65   and strings are
f390: 20 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f 62 73   less than blobs
f3a0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6d  ..*/.case OP_Com
f3b0: 70 61 72 65 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b  pare: {.  int n;
f3c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
f3d0: 70 31 3b 0a 20 20 69 6e 74 20 70 32 3b 0a 20 20  p1;.  int p2;.  
f3e0: 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70  const KeyInfo *p
f3f0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 69  KeyInfo;.  int i
f400: 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  dx;.  CollSeq *p
f410: 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c  Coll;    /* Coll
f420: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
f430: 6f 20 75 73 65 20 6f 6e 20 74 68 69 73 20 74 65  o use on this te
f440: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  rm */.  int bRev
f450: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
f460: 75 65 20 66 6f 72 20 44 45 53 43 45 4e 44 49 4e  ue for DESCENDIN
f470: 47 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a  G sort order */.
f480: 0a 20 20 69 66 28 20 28 70 4f 70 2d 3e 70 35 20  .  if( (pOp->p5 
f490: 26 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45  & OPFLAG_PERMUTE
f4a0: 29 3d 3d 30 20 29 20 61 50 65 72 6d 75 74 65 20  )==0 ) aPermute 
f4b0: 3d 20 30 3b 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e  = 0;.  n = pOp->
f4c0: 70 33 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d  p3;.  pKeyInfo =
f4d0: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
f4e0: 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30  o;.  assert( n>0
f4f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
f500: 65 79 49 6e 66 6f 21 3d 30 20 29 3b 0a 20 20 70  eyInfo!=0 );.  p
f510: 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70  1 = pOp->p1;.  p
f520: 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 23 69 66  2 = pOp->p2;.#if
f530: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
f540: 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a  if( aPermute ){.
f550: 20 20 20 20 69 6e 74 20 6b 2c 20 6d 78 20 3d 20      int k, mx = 
f560: 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  0;.    for(k=0; 
f570: 6b 3c 6e 3b 20 6b 2b 2b 29 20 69 66 28 20 61 50  k<n; k++) if( aP
f580: 65 72 6d 75 74 65 5b 6b 5d 3e 6d 78 20 29 20 6d  ermute[k]>mx ) m
f590: 78 20 3d 20 61 50 65 72 6d 75 74 65 5b 6b 5d 3b  x = aPermute[k];
f5a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e  .    assert( p1>
f5b0: 30 20 26 26 20 70 31 2b 6d 78 3c 3d 28 70 2d 3e  0 && p1+mx<=(p->
f5c0: 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f 72 29  nMem-p->nCursor)
f5d0: 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +1 );.    assert
f5e0: 28 20 70 32 3e 30 20 26 26 20 70 32 2b 6d 78 3c  ( p2>0 && p2+mx<
f5f0: 3d 28 70 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75  =(p->nMem-p->nCu
f600: 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20 7d 65 6c  rsor)+1 );.  }el
f610: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
f620: 70 31 3e 30 20 26 26 20 70 31 2b 6e 3c 3d 28 70  p1>0 && p1+n<=(p
f630: 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f  ->nMem-p->nCurso
f640: 72 29 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65  r)+1 );.    asse
f650: 72 74 28 20 70 32 3e 30 20 26 26 20 70 32 2b 6e  rt( p2>0 && p2+n
f660: 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43  <=(p->nMem-p->nC
f670: 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20 7d 0a  ursor)+1 );.  }.
f680: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f690: 5f 44 45 42 55 47 20 2a 2f 0a 20 20 66 6f 72 28  _DEBUG */.  for(
f6a0: 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
f6b0: 20 20 20 20 69 64 78 20 3d 20 61 50 65 72 6d 75      idx = aPermu
f6c0: 74 65 20 3f 20 61 50 65 72 6d 75 74 65 5b 69 5d  te ? aPermute[i]
f6d0: 20 3a 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74   : i;.    assert
f6e0: 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d  ( memIsValid(&aM
f6f0: 65 6d 5b 70 31 2b 69 64 78 5d 29 20 29 3b 0a 20  em[p1+idx]) );. 
f700: 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
f710: 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 32 2b 69  Valid(&aMem[p2+i
f720: 64 78 5d 29 20 29 3b 0a 20 20 20 20 52 45 47 49  dx]) );.    REGI
f730: 53 54 45 52 5f 54 52 41 43 45 28 70 31 2b 69 64  STER_TRACE(p1+id
f740: 78 2c 20 26 61 4d 65 6d 5b 70 31 2b 69 64 78 5d  x, &aMem[p1+idx]
f750: 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  );.    REGISTER_
f760: 54 52 41 43 45 28 70 32 2b 69 64 78 2c 20 26 61  TRACE(p2+idx, &a
f770: 4d 65 6d 5b 70 32 2b 69 64 78 5d 29 3b 0a 20 20  Mem[p2+idx]);.  
f780: 20 20 61 73 73 65 72 74 28 20 69 3c 70 4b 65 79    assert( i<pKey
f790: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a  Info->nField );.
f7a0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 4b 65 79      pColl = pKey
f7b0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 3b 0a  Info->aColl[i];.
f7c0: 20 20 20 20 62 52 65 76 20 3d 20 70 4b 65 79 49      bRev = pKeyI
f7d0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
f7e0: 69 5d 3b 0a 20 20 20 20 69 43 6f 6d 70 61 72 65  i];.    iCompare
f7f0: 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
f800: 70 61 72 65 28 26 61 4d 65 6d 5b 70 31 2b 69 64  pare(&aMem[p1+id
f810: 78 5d 2c 20 26 61 4d 65 6d 5b 70 32 2b 69 64 78  x], &aMem[p2+idx
f820: 5d 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69  ], pColl);.    i
f830: 66 28 20 69 43 6f 6d 70 61 72 65 20 29 7b 0a 20  f( iCompare ){. 
f840: 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29 20       if( bRev ) 
f850: 69 43 6f 6d 70 61 72 65 20 3d 20 2d 69 43 6f 6d  iCompare = -iCom
f860: 70 61 72 65 3b 0a 20 20 20 20 20 20 62 72 65 61  pare;.      brea
f870: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  k;.    }.  }.  a
f880: 50 65 72 6d 75 74 65 20 3d 20 30 3b 0a 20 20 62  Permute = 0;.  b
f890: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
f8a0: 64 65 3a 20 4a 75 6d 70 20 50 31 20 50 32 20 50  de: Jump P1 P2 P
f8b0: 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70  3 * *.**.** Jump
f8c0: 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74   to the instruct
f8d0: 69 6f 6e 20 61 74 20 61 64 64 72 65 73 73 20 50  ion at address P
f8e0: 31 2c 20 50 32 2c 20 6f 72 20 50 33 20 64 65 70  1, P2, or P3 dep
f8f0: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
f900: 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 6f 73 74  r.** in the most
f910: 20 72 65 63 65 6e 74 20 4f 50 5f 43 6f 6d 70 61   recent OP_Compa
f920: 72 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  re instruction t
f930: 68 65 20 50 31 20 76 65 63 74 6f 72 20 77 61 73  he P1 vector was
f940: 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 65 71   less than.** eq
f950: 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
f960: 65 72 20 74 68 61 6e 20 74 68 65 20 50 32 20 76  er than the P2 v
f970: 65 63 74 6f 72 2c 20 72 65 73 70 65 63 74 69 76  ector, respectiv
f980: 65 6c 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ely..*/.case OP_
f990: 4a 75 6d 70 3a 20 7b 20 20 20 20 20 20 20 20 20  Jump: {         
f9a0: 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20      /* jump */. 
f9b0: 20 69 66 28 20 69 43 6f 6d 70 61 72 65 3c 30 20   if( iCompare<0 
f9c0: 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  ){.    pc = pOp-
f9d0: 3e 70 31 20 2d 20 31 3b 0a 20 20 7d 65 6c 73 65  >p1 - 1;.  }else
f9e0: 20 69 66 28 20 69 43 6f 6d 70 61 72 65 3d 3d 30   if( iCompare==0
f9f0: 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70   ){.    pc = pOp
fa00: 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 65 6c 73  ->p2 - 1;.  }els
fa10: 65 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  e{.    pc = pOp-
fa20: 3e 70 33 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62  >p3 - 1;.  }.  b
fa30: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
fa40: 64 65 3a 20 41 6e 64 20 50 31 20 50 32 20 50 33  de: And P1 P2 P3
fa50: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20   * *.**.** Take 
fa60: 74 68 65 20 6c 6f 67 69 63 61 6c 20 41 4e 44 20  the logical AND 
fa70: 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  of the values in
fa80: 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61 6e   registers P1 an
fa90: 64 20 50 32 20 61 6e 64 0a 2a 2a 20 77 72 69 74  d P2 and.** writ
faa0: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 74  e the result int
fab0: 6f 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  o register P3..*
fac0: 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 50  *.** If either P
fad0: 31 20 6f 72 20 50 32 20 69 73 20 30 20 28 66 61  1 or P2 is 0 (fa
fae0: 6c 73 65 29 20 74 68 65 6e 20 74 68 65 20 72 65  lse) then the re
faf0: 73 75 6c 74 20 69 73 20 30 20 65 76 65 6e 20 69  sult is 0 even i
fb00: 66 0a 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 69  f.** the other i
fb10: 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e 20 20 41  nput is NULL.  A
fb20: 20 4e 55 4c 4c 20 61 6e 64 20 74 72 75 65 20 6f   NULL and true o
fb30: 72 20 74 77 6f 20 4e 55 4c 4c 73 20 67 69 76 65  r two NULLs give
fb40: 0a 2a 2a 20 61 20 4e 55 4c 4c 20 6f 75 74 70 75  .** a NULL outpu
fb50: 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  t..*/./* Opcode:
fb60: 20 4f 72 20 50 31 20 50 32 20 50 33 20 2a 20 2a   Or P1 P2 P3 * *
fb70: 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20  .**.** Take the 
fb80: 6c 6f 67 69 63 61 6c 20 4f 52 20 6f 66 20 74 68  logical OR of th
fb90: 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69  e values in regi
fba0: 73 74 65 72 20 50 31 20 61 6e 64 20 50 32 20 61  ster P1 and P2 a
fbb0: 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20  nd.** store the 
fbc0: 61 6e 73 77 65 72 20 69 6e 20 72 65 67 69 73 74  answer in regist
fbd0: 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  er P3..**.** If 
fbe0: 65 69 74 68 65 72 20 50 31 20 6f 72 20 50 32 20  either P1 or P2 
fbf0: 69 73 20 6e 6f 6e 7a 65 72 6f 20 28 74 72 75 65  is nonzero (true
fc00: 29 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  ) then the resul
fc10: 74 20 69 73 20 31 20 28 74 72 75 65 29 0a 2a 2a  t is 1 (true).**
fc20: 20 65 76 65 6e 20 69 66 20 74 68 65 20 6f 74 68   even if the oth
fc30: 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c  er input is NULL
fc40: 2e 20 20 41 20 4e 55 4c 4c 20 61 6e 64 20 66 61  .  A NULL and fa
fc50: 6c 73 65 20 6f 72 20 74 77 6f 20 4e 55 4c 4c 73  lse or two NULLs
fc60: 0a 2a 2a 20 67 69 76 65 20 61 20 4e 55 4c 4c 20  .** give a NULL 
fc70: 6f 75 74 70 75 74 2e 0a 2a 2f 0a 63 61 73 65 20  output..*/.case 
fc80: 4f 50 5f 41 6e 64 3a 20 20 20 20 20 20 20 20 20  OP_And:         
fc90: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
fca0: 54 4b 5f 41 4e 44 2c 20 69 6e 31 2c 20 69 6e 32  TK_AND, in1, in2
fcb0: 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f  , out3 */.case O
fcc0: 50 5f 4f 72 3a 20 7b 20 20 20 20 20 20 20 20 20  P_Or: {         
fcd0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
fce0: 4b 5f 4f 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20  K_OR, in1, in2, 
fcf0: 6f 75 74 33 20 2a 2f 0a 20 20 69 6e 74 20 76 31  out3 */.  int v1
fd00: 3b 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65  ;    /* Left ope
fd10: 72 61 6e 64 3a 20 20 30 3d 3d 46 41 4c 53 45 2c  rand:  0==FALSE,
fd20: 20 31 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e 4b   1==TRUE, 2==UNK
fd30: 4e 4f 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  NOWN or NULL */.
fd40: 20 20 69 6e 74 20 76 32 3b 20 20 20 20 2f 2a 20    int v2;    /* 
fd50: 52 69 67 68 74 20 6f 70 65 72 61 6e 64 3a 20 30  Right operand: 0
fd60: 3d 3d 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55 45  ==FALSE, 1==TRUE
fd70: 2c 20 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20  , 2==UNKNOWN or 
fd80: 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 70 49 6e 31 20  NULL */..  pIn1 
fd90: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
fda0: 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c  ;.  if( pIn1->fl
fdb0: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
fdc0: 7b 0a 20 20 20 20 76 31 20 3d 20 32 3b 0a 20 20  {.    v1 = 2;.  
fdd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 76 31 20 3d 20  }else{.    v1 = 
fde0: 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
fdf0: 6c 75 65 28 70 49 6e 31 29 21 3d 30 3b 0a 20 20  lue(pIn1)!=0;.  
fe00: 7d 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d  }.  pIn2 = &aMem
fe10: 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69 66 28  [pOp->p2];.  if(
fe20: 20 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn2->flags & M
fe30: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 76  EM_Null ){.    v
fe40: 32 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2 = 2;.  }else{.
fe50: 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33      v2 = sqlite3
fe60: 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e  VdbeIntValue(pIn
fe70: 32 29 21 3d 30 3b 0a 20 20 7d 0a 20 20 69 66 28  2)!=0;.  }.  if(
fe80: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
fe90: 5f 41 6e 64 20 29 7b 0a 20 20 20 20 73 74 61 74  _And ){.    stat
fea0: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
feb0: 64 20 63 68 61 72 20 61 6e 64 5f 6c 6f 67 69 63  d char and_logic
fec0: 5b 5d 20 3d 20 7b 20 30 2c 20 30 2c 20 30 2c 20  [] = { 0, 0, 0, 
fed0: 30 2c 20 31 2c 20 32 2c 20 30 2c 20 32 2c 20 32  0, 1, 2, 0, 2, 2
fee0: 20 7d 3b 0a 20 20 20 20 76 31 20 3d 20 61 6e 64   };.    v1 = and
fef0: 5f 6c 6f 67 69 63 5b 76 31 2a 33 2b 76 32 5d 3b  _logic[v1*3+v2];
ff00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
ff10: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
ff20: 6e 65 64 20 63 68 61 72 20 6f 72 5f 6c 6f 67 69  ned char or_logi
ff30: 63 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c  c[] = { 0, 1, 2,
ff40: 20 31 2c 20 31 2c 20 31 2c 20 32 2c 20 31 2c 20   1, 1, 1, 2, 1, 
ff50: 32 20 7d 3b 0a 20 20 20 20 76 31 20 3d 20 6f 72  2 };.    v1 = or
ff60: 5f 6c 6f 67 69 63 5b 76 31 2a 33 2b 76 32 5d 3b  _logic[v1*3+v2];
ff70: 0a 20 20 7d 0a 20 20 70 4f 75 74 20 3d 20 26 61  .  }.  pOut = &a
ff80: 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
ff90: 69 66 28 20 76 31 3d 3d 32 20 29 7b 0a 20 20 20  if( v1==2 ){.   
ffa0: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
ffb0: 70 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  pOut, MEM_Null);
ffc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4f  .  }else{.    pO
ffd0: 75 74 2d 3e 75 2e 69 20 3d 20 76 31 3b 0a 20 20  ut->u.i = v1;.  
ffe0: 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
fff0: 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b  (pOut, MEM_Int);
10000 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
10010 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 20  ./* Opcode: Not 
10020 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
10030 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20  * Interpret the 
10040 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
10050 72 20 50 31 20 61 73 20 61 20 62 6f 6f 6c 65 61  r P1 as a boolea
10060 6e 20 76 61 6c 75 65 2e 20 20 53 74 6f 72 65 20  n value.  Store 
10070 74 68 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 63  the.** boolean c
10080 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 20 72 65 67  omplement in reg
10090 69 73 74 65 72 20 50 32 2e 20 20 49 66 20 74 68  ister P2.  If th
100a0 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
100b0 74 65 72 20 50 31 20 69 73 20 0a 2a 2a 20 4e 55  ter P1 is .** NU
100c0 4c 4c 2c 20 74 68 65 6e 20 61 20 4e 55 4c 4c 20  LL, then a NULL 
100d0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50 32 2e  is stored in P2.
100e0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 3a  .*/.case OP_Not:
100f0 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
10100 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
10110 4e 4f 54 2c 20 69 6e 31 2c 20 6f 75 74 32 20 2a  NOT, in1, out2 *
10120 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
10130 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75  [pOp->p1];.  pOu
10140 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
10150 32 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e  2];.  if( pIn1->
10160 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
10170 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
10180 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f  dbeMemSetNull(pO
10190 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
101a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
101b0 53 65 74 49 6e 74 36 34 28 70 4f 75 74 2c 20 21  SetInt64(pOut, !
101c0 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
101d0 6c 75 65 28 70 49 6e 31 29 29 3b 0a 20 20 7d 0a  lue(pIn1));.  }.
101e0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
101f0 70 63 6f 64 65 3a 20 42 69 74 4e 6f 74 20 50 31  pcode: BitNot P1
10200 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
10210 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 63 6f  Interpret the co
10220 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65  ntent of registe
10230 72 20 50 31 20 61 73 20 61 6e 20 69 6e 74 65 67  r P1 as an integ
10240 65 72 2e 20 20 53 74 6f 72 65 20 74 68 65 0a 2a  er.  Store the.*
10250 2a 20 6f 6e 65 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * ones-complemen
10260 74 20 6f 66 20 74 68 65 20 50 31 20 76 61 6c 75  t of the P1 valu
10270 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  e into register 
10280 50 32 2e 20 20 49 66 20 50 31 20 68 6f 6c 64 73  P2.  If P1 holds
10290 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 68 65 6e 20  .** a NULL then 
102a0 73 74 6f 72 65 20 61 20 4e 55 4c 4c 20 69 6e 20  store a NULL in 
102b0 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42  P2..*/.case OP_B
102c0 69 74 4e 6f 74 3a 20 7b 20 20 20 20 20 20 20 20  itNot: {        
102d0 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
102e0 54 4b 5f 42 49 54 4e 4f 54 2c 20 69 6e 31 2c 20  TK_BITNOT, in1, 
102f0 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d  out2 */.  pIn1 =
10300 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
10310 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
10320 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69 66 28 20  pOp->p2];.  if( 
10330 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
10340 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73 71  M_Null ){.    sq
10350 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
10360 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 7d 65 6c  ull(pOut);.  }el
10370 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
10380 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 70  dbeMemSetInt64(p
10390 4f 75 74 2c 20 7e 73 71 6c 69 74 65 33 56 64 62  Out, ~sqlite3Vdb
103a0 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 29  eIntValue(pIn1))
103b0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
103c0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 6e 63  ../* Opcode: Onc
103d0 65 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  e P1 P2 * * *.**
103e0 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 4f 50 5f  .** Check if OP_
103f0 4f 6e 63 65 20 66 6c 61 67 20 50 31 20 69 73 20  Once flag P1 is 
10400 73 65 74 2e 20 49 66 20 73 6f 2c 20 6a 75 6d 70  set. If so, jump
10410 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   to instruction 
10420 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  P2. Otherwise,.*
10430 2a 20 73 65 74 20 74 68 65 20 66 6c 61 67 20 61  * set the flag a
10440 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  nd fall through 
10450 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
10460 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  ruction..*/.case
10470 20 4f 50 5f 4f 6e 63 65 3a 20 7b 20 20 20 20 20   OP_Once: {     
10480 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
10490 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
104a0 2d 3e 70 31 3c 70 2d 3e 6e 4f 6e 63 65 46 6c 61  ->p1<p->nOnceFla
104b0 67 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  g );.  if( p->aO
104c0 6e 63 65 46 6c 61 67 5b 70 4f 70 2d 3e 70 31 5d  nceFlag[pOp->p1]
104d0 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70   ){.    pc = pOp
104e0 2d 3e 70 32 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  ->p2-1;.  }else{
104f0 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61  .    p->aOnceFla
10500 67 5b 70 4f 70 2d 3e 70 31 5d 20 3d 20 31 3b 0a  g[pOp->p1] = 1;.
10510 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
10520 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 20 50 31  /* Opcode: If P1
10530 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
10540 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74   Jump to P2 if t
10550 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
10560 73 74 65 72 20 50 31 20 69 73 20 74 72 75 65 2e  ster P1 is true.
10570 20 20 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69    The value.** i
10580 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 72 75  s considered tru
10590 65 20 69 66 20 69 74 20 69 73 20 6e 75 6d 65 72  e if it is numer
105a0 69 63 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 2e  ic and non-zero.
105b0 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a    If the value.*
105c0 2a 20 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c 20  * in P1 is NULL 
105d0 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75  then take the ju
105e0 6d 70 20 69 66 20 50 33 20 69 73 20 6e 6f 6e 2d  mp if P3 is non-
105f0 7a 65 72 6f 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  zero..*/./* Opco
10600 64 65 3a 20 49 66 4e 6f 74 20 50 31 20 50 32 20  de: IfNot P1 P2 
10610 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d  P3 * *.**.** Jum
10620 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 76  p to P2 if the v
10630 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
10640 20 50 31 20 69 73 20 46 61 6c 73 65 2e 20 20 54   P1 is False.  T
10650 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 63  he value.** is c
10660 6f 6e 73 69 64 65 72 65 64 20 66 61 6c 73 65 20  onsidered false 
10670 69 66 20 69 74 20 68 61 73 20 61 20 6e 75 6d 65  if it has a nume
10680 72 69 63 20 76 61 6c 75 65 20 6f 66 20 7a 65 72  ric value of zer
10690 6f 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65  o.  If the value
106a0 0a 2a 2a 20 69 6e 20 50 31 20 69 73 20 4e 55 4c  .** in P1 is NUL
106b0 4c 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20  L then take the 
106c0 6a 75 6d 70 20 69 66 20 50 33 20 69 73 20 7a 65  jump if P3 is ze
106d0 72 6f 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  ro..*/.case OP_I
106e0 66 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f:              
106f0 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20     /* jump, in1 
10700 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 4e 6f 74  */.case OP_IfNot
10710 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
10720 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20  * jump, in1 */. 
10730 20 69 6e 74 20 63 3b 0a 20 20 70 49 6e 31 20 3d   int c;.  pIn1 =
10740 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
10750 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61  .  if( pIn1->fla
10760 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  gs & MEM_Null ){
10770 0a 20 20 20 20 63 20 3d 20 70 4f 70 2d 3e 70 33  .    c = pOp->p3
10780 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65  ;.  }else{.#ifde
10790 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
107a0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
107b0 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
107c0 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 21 3d  IntValue(pIn1)!=
107d0 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 20 3d  0;.#else.    c =
107e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c   sqlite3VdbeReal
107f0 56 61 6c 75 65 28 70 49 6e 31 29 21 3d 30 2e 30  Value(pIn1)!=0.0
10800 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
10810 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
10820 5f 49 66 4e 6f 74 20 29 20 63 20 3d 20 21 63 3b  _IfNot ) c = !c;
10830 0a 20 20 7d 0a 20 20 69 66 28 20 63 20 29 7b 0a  .  }.  if( c ){.
10840 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
10850 2d 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  -1;.  }.  break;
10860 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .}../* Opcode: I
10870 73 4e 75 6c 6c 20 50 31 20 50 32 20 2a 20 2a 20  sNull P1 P2 * * 
10880 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20  *.**.** Jump to 
10890 50 32 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  P2 if the value 
108a0 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69  in register P1 i
108b0 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20  s NULL..*/.case 
108c0 4f 50 5f 49 73 4e 75 6c 6c 3a 20 7b 20 20 20 20  OP_IsNull: {    
108d0 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
108e0 61 73 20 54 4b 5f 49 53 4e 55 4c 4c 2c 20 6a 75  as TK_ISNULL, ju
108f0 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e  mp, in1 */.  pIn
10900 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
10910 31 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d  1];.  if( (pIn1-
10920 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
10930 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 63 20  l)!=0 ){.    pc 
10940 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
10950 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
10960 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 4e 75 6c  * Opcode: NotNul
10970 6c 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  l P1 P2 * * *.**
10980 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69  .** Jump to P2 i
10990 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  f the value in r
109a0 65 67 69 73 74 65 72 20 50 31 20 69 73 20 6e 6f  egister P1 is no
109b0 74 20 4e 55 4c 4c 2e 20 20 0a 2a 2f 0a 63 61 73  t NULL.  .*/.cas
109c0 65 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3a 20 7b 20  e OP_NotNull: { 
109d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
109e0 6d 65 20 61 73 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  me as TK_NOTNULL
109f0 2c 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20  , jump, in1 */. 
10a00 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
10a10 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 28 70  p->p1];.  if( (p
10a20 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
10a30 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  _Null)==0 ){.   
10a40 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
10a50 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  1;.  }.  break;.
10a60 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f  }../* Opcode: Co
10a70 6c 75 6d 6e 20 50 31 20 50 32 20 50 33 20 50 34  lumn P1 P2 P3 P4
10a80 20 50 35 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70   P5.**.** Interp
10a90 72 65 74 20 74 68 65 20 64 61 74 61 20 74 68 61  ret the data tha
10aa0 74 20 63 75 72 73 6f 72 20 50 31 20 70 6f 69 6e  t cursor P1 poin
10ab0 74 73 20 74 6f 20 61 73 20 61 20 73 74 72 75 63  ts to as a struc
10ac0 74 75 72 65 20 62 75 69 6c 74 20 75 73 69 6e 67  ture built using
10ad0 0a 2a 2a 20 74 68 65 20 4d 61 6b 65 52 65 63 6f  .** the MakeReco
10ae0 72 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  rd instruction. 
10af0 20 28 53 65 65 20 74 68 65 20 4d 61 6b 65 52 65   (See the MakeRe
10b00 63 6f 72 64 20 6f 70 63 6f 64 65 20 66 6f 72 20  cord opcode for 
10b10 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e  additional.** in
10b20 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
10b30 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 74 68  the format of th
10b40 65 20 64 61 74 61 2e 29 20 20 45 78 74 72 61 63  e data.)  Extrac
10b50 74 20 74 68 65 20 50 32 2d 74 68 20 63 6f 6c 75  t the P2-th colu
10b60 6d 6e 0a 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20  mn.** from this 
10b70 72 65 63 6f 72 64 2e 20 20 49 66 20 74 68 65 72  record.  If ther
10b80 65 20 61 72 65 20 6c 65 73 73 20 74 68 61 74 20  e are less that 
10b90 28 50 32 2b 31 29 20 0a 2a 2a 20 76 61 6c 75 65  (P2+1) .** value
10ba0 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 2c  s in the record,
10bb0 20 65 78 74 72 61 63 74 20 61 20 4e 55 4c 4c 2e   extract a NULL.
10bc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
10bd0 20 65 78 74 72 61 63 74 65 64 20 69 73 20 73 74   extracted is st
10be0 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
10bf0 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   P3..**.** If th
10c00 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  e column contain
10c10 73 20 66 65 77 65 72 20 74 68 61 6e 20 50 32 20  s fewer than P2 
10c20 66 69 65 6c 64 73 2c 20 74 68 65 6e 20 65 78 74  fields, then ext
10c30 72 61 63 74 20 61 20 4e 55 4c 4c 2e 20 20 4f 72  ract a NULL.  Or
10c40 2c 0a 2a 2a 20 69 66 20 74 68 65 20 50 34 20 61  ,.** if the P4 a
10c50 72 67 75 6d 65 6e 74 20 69 73 20 61 20 50 34 5f  rgument is a P4_
10c60 4d 45 4d 20 75 73 65 20 74 68 65 20 76 61 6c 75  MEM use the valu
10c70 65 20 6f 66 20 74 68 65 20 50 34 20 61 72 67 75  e of the P4 argu
10c80 6d 65 6e 74 20 61 73 0a 2a 2a 20 74 68 65 20 72  ment as.** the r
10c90 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  esult..**.** If 
10ca0 74 68 65 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52  the OPFLAG_CLEAR
10cb0 43 41 43 48 45 20 62 69 74 20 69 73 20 73 65 74  CACHE bit is set
10cc0 20 6f 6e 20 50 35 20 61 6e 64 20 50 31 20 69 73   on P5 and P1 is
10cd0 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20   a pseudo-table 
10ce0 63 75 72 73 6f 72 2c 0a 2a 2a 20 74 68 65 6e 20  cursor,.** then 
10cf0 74 68 65 20 63 61 63 68 65 20 6f 66 20 74 68 65  the cache of the
10d00 20 63 75 72 73 6f 72 20 69 73 20 72 65 73 65 74   cursor is reset
10d10 20 70 72 69 6f 72 20 74 6f 20 65 78 74 72 61 63   prior to extrac
10d20 74 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  ting the column.
10d30 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 4f 50  .** The first OP
10d40 5f 43 6f 6c 75 6d 6e 20 61 67 61 69 6e 73 74 20  _Column against 
10d50 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 61  a pseudo-table a
10d60 66 74 65 72 20 74 68 65 20 76 61 6c 75 65 20 6f  fter the value o
10d70 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a  f the content.**
10d80 20 72 65 67 69 73 74 65 72 20 68 61 73 20 63 68   register has ch
10d90 61 6e 67 65 64 20 73 68 6f 75 6c 64 20 68 61 76  anged should hav
10da0 65 20 74 68 69 73 20 62 69 74 20 73 65 74 2e 0a  e this bit set..
10db0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46  **.** If the OPF
10dc0 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 61 6e  LAG_LENGTHARG an
10dd0 64 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  d OPFLAG_TYPEOFA
10de0 52 47 20 62 69 74 73 20 61 72 65 20 73 65 74 20  RG bits are set 
10df0 6f 6e 20 50 35 20 77 68 65 6e 0a 2a 2a 20 74 68  on P5 when.** th
10e00 65 20 72 65 73 75 6c 74 20 69 73 20 67 75 61 72  e result is guar
10e10 61 6e 74 65 65 64 20 74 6f 20 6f 6e 6c 79 20 62  anteed to only b
10e20 65 20 75 73 65 64 20 61 73 20 74 68 65 20 61 72  e used as the ar
10e30 67 75 6d 65 6e 74 20 6f 66 20 61 20 6c 65 6e 67  gument of a leng
10e40 74 68 28 29 0a 2a 2a 20 6f 72 20 74 79 70 65 6f  th().** or typeo
10e50 66 28 29 20 66 75 6e 63 74 69 6f 6e 2c 20 72 65  f() function, re
10e60 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65  spectively.  The
10e70 20 6c 6f 61 64 69 6e 67 20 6f 66 20 6c 61 72 67   loading of larg
10e80 65 20 62 6c 6f 62 73 20 63 61 6e 20 62 65 0a 2a  e blobs can be.*
10e90 2a 20 73 6b 69 70 70 65 64 20 66 6f 72 20 6c 65  * skipped for le
10ea0 6e 67 74 68 28 29 20 61 6e 64 20 61 6c 6c 20 63  ngth() and all c
10eb0 6f 6e 74 65 6e 74 20 6c 6f 61 64 69 6e 67 20 63  ontent loading c
10ec0 61 6e 20 62 65 20 73 6b 69 70 70 65 64 20 66 6f  an be skipped fo
10ed0 72 20 74 79 70 65 6f 66 28 29 2e 0a 2a 2f 0a 63  r typeof()..*/.c
10ee0 61 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 3a 20 7b  ase OP_Column: {
10ef0 0a 20 20 75 33 32 20 70 61 79 6c 6f 61 64 53 69  .  u32 payloadSi
10f00 7a 65 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ze;   /* Number 
10f10 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
10f20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 36 34 20  record */.  i64 
10f30 70 61 79 6c 6f 61 64 53 69 7a 65 36 34 3b 20 2f  payloadSize64; /
10f40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
10f50 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20  s in the record 
10f60 2a 2f 0a 20 20 69 6e 74 20 70 31 3b 20 20 20 20  */.  int p1;    
10f70 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 76 61          /* P1 va
10f80 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  lue of the opcod
10f90 65 20 2a 2f 0a 20 20 69 6e 74 20 70 32 3b 20 20  e */.  int p2;  
10fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6c            /* col
10fb0 75 6d 6e 20 6e 75 6d 62 65 72 20 74 6f 20 72 65  umn number to re
10fc0 74 72 69 65 76 65 20 2a 2f 0a 20 20 56 64 62 65  trieve */.  Vdbe
10fd0 43 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 20 2f  Cursor *pC;    /
10fe0 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
10ff0 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 65  r */.  char *zRe
11000 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  c;        /* Poi
11010 6e 74 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  nter to complete
11020 20 72 65 63 6f 72 64 2d 64 61 74 61 20 2a 2f 0a   record-data */.
11030 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
11040 72 3b 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65  r;   /* The BTre
11050 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 75 33  e cursor */.  u3
11060 32 20 2a 61 54 79 70 65 3b 20 20 20 20 20 20 20  2 *aType;       
11070 20 2f 2a 20 61 54 79 70 65 5b 69 5d 20 68 6f 6c   /* aType[i] hol
11080 64 73 20 74 68 65 20 6e 75 6d 65 72 69 63 20 74  ds the numeric t
11090 79 70 65 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ype of the i-th 
110a0 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 75 33 32 20  column */.  u32 
110b0 2a 61 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  *aOffset;      /
110c0 2a 20 61 4f 66 66 73 65 74 5b 69 5d 20 69 73 20  * aOffset[i] is 
110d0 6f 66 66 73 65 74 20 74 6f 20 73 74 61 72 74 20  offset to start 
110e0 6f 66 20 64 61 74 61 20 66 6f 72 20 69 2d 74 68  of data for i-th
110f0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
11100 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20   nField;        
11110 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  /* number of fie
11120 6c 64 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72  lds in the recor
11130 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b 20  d */.  int len; 
11140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11150 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73   length of the s
11160 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 66  erialized data f
11170 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f  or the column */
11180 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
11190 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
111a0 75 6e 74 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  unter */.  char 
111b0 2a 7a 44 61 74 61 3b 20 20 20 20 20 20 20 2f 2a  *zData;       /*
111c0 20 50 61 72 74 20 6f 66 20 74 68 65 20 72 65 63   Part of the rec
111d0 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65  ord being decode
111e0 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 44 65 73  d */.  Mem *pDes
111f0 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  t;        /* Whe
11200 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  re to write the 
11210 65 78 74 72 61 63 74 65 64 20 76 61 6c 75 65 20  extracted value 
11220 2a 2f 0a 20 20 4d 65 6d 20 73 4d 65 6d 3b 20 20  */.  Mem sMem;  
11230 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73          /* For s
11240 74 6f 72 69 6e 67 20 74 68 65 20 72 65 63 6f 72  toring the recor
11250 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20  d being decoded 
11260 2a 2f 0a 20 20 75 38 20 2a 7a 49 64 78 3b 20 20  */.  u8 *zIdx;  
11270 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
11280 20 69 6e 74 6f 20 68 65 61 64 65 72 20 2a 2f 0a   into header */.
11290 20 20 75 38 20 2a 7a 45 6e 64 48 64 72 3b 20 20    u8 *zEndHdr;  
112a0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
112b0 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 61 66  to first byte af
112c0 74 65 72 20 74 68 65 20 68 65 61 64 65 72 20 2a  ter the header *
112d0 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 3b 20  /.  u32 offset; 
112e0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
112f0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 2a   into the data *
11300 2f 0a 20 20 75 33 32 20 73 7a 46 69 65 6c 64 3b  /.  u32 szField;
11310 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11320 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
11330 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 66 69   content of a fi
11340 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 48  eld */.  int szH
11350 64 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  dr;         /* S
11360 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
11370 72 20 73 69 7a 65 20 66 69 65 6c 64 20 61 74 20  r size field at 
11380 73 74 61 72 74 20 6f 66 20 72 65 63 6f 72 64 20  start of record 
11390 2a 2f 0a 20 20 69 6e 74 20 61 76 61 69 6c 3b 20  */.  int avail; 
113a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
113b0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
113c0 61 69 6c 61 62 6c 65 20 64 61 74 61 20 2a 2f 0a  ailable data */.
113d0 20 20 75 33 32 20 74 3b 20 20 20 20 20 20 20 20    u32 t;        
113e0 20 20 20 20 20 2f 2a 20 41 20 74 79 70 65 20 63       /* A type c
113f0 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 72 65 63  ode from the rec
11400 6f 72 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ord header */.  
11410 4d 65 6d 20 2a 70 52 65 67 3b 20 20 20 20 20 20  Mem *pReg;      
11420 20 20 20 2f 2a 20 50 73 65 75 64 6f 54 61 62 6c     /* PseudoTabl
11430 65 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72  e input register
11440 20 2a 2f 0a 0a 0a 20 20 70 31 20 3d 20 70 4f 70   */...  p1 = pOp
11450 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70 4f 70  ->p1;.  p2 = pOp
11460 2d 3e 70 32 3b 0a 20 20 70 43 20 3d 20 30 3b 0a  ->p2;.  pC = 0;.
11470 20 20 6d 65 6d 73 65 74 28 26 73 4d 65 6d 2c 20    memset(&sMem, 
11480 30 2c 20 73 69 7a 65 6f 66 28 73 4d 65 6d 29 29  0, sizeof(sMem))
11490 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 3c 70  ;.  assert( p1<p
114a0 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61  ->nCursor );.  a
114b0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30  ssert( pOp->p3>0
114c0 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d   && pOp->p3<=(p-
114d0 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f 72  >nMem-p->nCursor
114e0 29 20 29 3b 0a 20 20 70 44 65 73 74 20 3d 20 26  ) );.  pDest = &
114f0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
11500 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
11510 65 28 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7a  e(p, pDest);.  z
11520 52 65 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  Rec = 0;..  /* T
11530 68 69 73 20 62 6c 6f 63 6b 20 73 65 74 73 20 74  his block sets t
11540 68 65 20 76 61 72 69 61 62 6c 65 20 70 61 79 6c  he variable payl
11550 6f 61 64 53 69 7a 65 20 74 6f 20 62 65 20 74 68  oadSize to be th
11560 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
11570 66 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20  f.  ** bytes in 
11580 74 68 65 20 72 65 63 6f 72 64 2e 0a 20 20 2a 2a  the record..  **
11590 0a 20 20 2a 2a 20 7a 52 65 63 20 69 73 20 73 65  .  ** zRec is se
115a0 74 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6d 70  t to be the comp
115b0 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
115c0 20 72 65 63 6f 72 64 20 69 66 20 69 74 20 69 73   record if it is
115d0 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 2a 2a   available..  **
115e0 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 65   The complete re
115f0 63 6f 72 64 20 74 65 78 74 20 69 73 20 61 6c 77  cord text is alw
11600 61 79 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ays available fo
11610 72 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 0a  r pseudo-tables.
11620 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f    ** If the reco
11630 72 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  rd is stored in 
11640 61 20 63 75 72 73 6f 72 2c 20 74 68 65 20 63 6f  a cursor, the co
11650 6d 70 6c 65 74 65 20 72 65 63 6f 72 64 20 74 65  mplete record te
11660 78 74 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  xt.  ** might be
11670 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
11680 65 20 20 70 43 2d 3e 61 52 6f 77 20 63 61 63 68  e  pC->aRow cach
11690 65 2e 20 20 4f 72 20 69 74 20 6d 69 67 68 74 20  e.  Or it might 
116a0 6e 6f 74 20 62 65 2e 0a 20 20 2a 2a 20 49 66 20  not be..  ** If 
116b0 74 68 65 20 64 61 74 61 20 69 73 20 75 6e 61 76  the data is unav
116c0 61 69 6c 61 62 6c 65 2c 20 20 7a 52 65 63 20 69  ailable,  zRec i
116d0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 20  s set to NULL.. 
116e0 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 61 6c 73 6f   **.  ** We also
116f0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d   compute the num
11700 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
11710 6e 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20 46  n the record.  F
11720 6f 72 20 63 75 72 73 6f 72 73 2c 0a 20 20 2a 2a  or cursors,.  **
11730 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
11740 6f 6c 75 6d 6e 73 20 69 73 20 73 74 6f 72 65 64  olumns is stored
11750 20 69 6e 20 74 68 65 20 56 64 62 65 43 75 72 73   in the VdbeCurs
11760 6f 72 2e 6e 46 69 65 6c 64 20 65 6c 65 6d 65 6e  or.nField elemen
11770 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 20 3d 20 70  t..  */.  pC = p
11780 2d 3e 61 70 43 73 72 5b 70 31 5d 3b 0a 20 20 61  ->apCsr[p1];.  a
11790 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
117a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
117b0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
117c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70  .  assert( pC->p
117d0 56 74 61 62 43 75 72 73 6f 72 3d 3d 30 20 29 3b  VtabCursor==0 );
117e0 0a 23 65 6e 64 69 66 0a 20 20 70 43 72 73 72 20  .#endif.  pCrsr 
117f0 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20  = pC->pCursor;. 
11800 20 69 66 28 20 70 43 72 73 72 21 3d 30 20 29 7b   if( pCrsr!=0 ){
11810 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f  .    /* The reco
11820 72 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  rd is stored in 
11830 61 20 42 2d 54 72 65 65 20 2a 2f 0a 20 20 20 20  a B-Tree */.    
11840 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
11850 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29  CursorMoveto(pC)
11860 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
11870 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
11880 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20  _error;.    if( 
11890 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20  pC->nullRow ){. 
118a0 20 20 20 20 20 70 61 79 6c 6f 61 64 53 69 7a 65       payloadSize
118b0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
118c0 69 66 28 20 70 43 2d 3e 63 61 63 68 65 53 74 61  if( pC->cacheSta
118d0 74 75 73 3d 3d 70 2d 3e 63 61 63 68 65 43 74 72  tus==p->cacheCtr
118e0 20 29 7b 0a 20 20 20 20 20 20 70 61 79 6c 6f 61   ){.      payloa
118f0 64 53 69 7a 65 20 3d 20 70 43 2d 3e 70 61 79 6c  dSize = pC->payl
11900 6f 61 64 53 69 7a 65 3b 0a 20 20 20 20 20 20 7a  oadSize;.      z
11910 52 65 63 20 3d 20 28 63 68 61 72 2a 29 70 43 2d  Rec = (char*)pC-
11920 3e 61 52 6f 77 3b 0a 20 20 20 20 7d 65 6c 73 65  >aRow;.    }else
11930 20 69 66 28 20 70 43 2d 3e 69 73 49 6e 64 65 78   if( pC->isIndex
11940 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
11950 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
11960 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 72 73  rsorIsValid(pCrs
11970 72 29 20 29 3b 0a 20 20 20 20 20 20 56 56 41 5f  r) );.      VVA_
11980 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74  ONLY(rc =) sqlit
11990 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
119a0 43 72 73 72 2c 20 26 70 61 79 6c 6f 61 64 53 69  Crsr, &payloadSi
119b0 7a 65 36 34 29 3b 0a 20 20 20 20 20 20 61 73 73  ze64);.      ass
119c0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
119d0 4f 4b 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20  OK );   /* True 
119e0 62 65 63 61 75 73 65 20 6f 66 20 43 75 72 73 6f  because of Curso
119f0 72 4d 6f 76 65 74 6f 28 29 20 63 61 6c 6c 20 61  rMoveto() call a
11a00 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  bove */.      /*
11a10 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
11a20 73 65 43 65 6c 6c 50 74 72 28 29 20 75 73 65 73  seCellPtr() uses
11a30 20 67 65 74 56 61 72 69 6e 74 33 32 28 29 20 74   getVarint32() t
11a40 6f 20 65 78 74 72 61 63 74 20 74 68 65 0a 20 20  o extract the.  
11a50 20 20 20 20 2a 2a 20 70 61 79 6c 6f 61 64 20 73      ** payload s
11a60 69 7a 65 2c 20 73 6f 20 69 74 20 69 73 20 69 6d  ize, so it is im
11a70 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 70 61 79  possible for pay
11a80 6c 6f 61 64 53 69 7a 65 36 34 20 74 6f 20 62 65  loadSize64 to be
11a90 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 72  .      ** larger
11aa0 20 74 68 61 6e 20 33 32 20 62 69 74 73 2e 20 2a   than 32 bits. *
11ab0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
11ac0 28 70 61 79 6c 6f 61 64 53 69 7a 65 36 34 20 26  (payloadSize64 &
11ad0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29   SQLITE_MAX_U32)
11ae0 3d 3d 28 75 36 34 29 70 61 79 6c 6f 61 64 53 69  ==(u64)payloadSi
11af0 7a 65 36 34 20 29 3b 0a 20 20 20 20 20 20 70 61  ze64 );.      pa
11b00 79 6c 6f 61 64 53 69 7a 65 20 3d 20 28 75 33 32  yloadSize = (u32
11b10 29 70 61 79 6c 6f 61 64 53 69 7a 65 36 34 3b 0a  )payloadSize64;.
11b20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11b30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11b40 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
11b50 69 64 28 70 43 72 73 72 29 20 29 3b 0a 20 20 20  id(pCrsr) );.   
11b60 20 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d     VVA_ONLY(rc =
11b70 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  ) sqlite3BtreeDa
11b80 74 61 53 69 7a 65 28 70 43 72 73 72 2c 20 26 70  taSize(pCrsr, &p
11b90 61 79 6c 6f 61 64 53 69 7a 65 29 3b 0a 20 20 20  ayloadSize);.   
11ba0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
11bb0 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 2f 2a  QLITE_OK );   /*
11bc0 20 44 61 74 61 53 69 7a 65 28 29 20 63 61 6e 6e   DataSize() cann
11bd0 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 20 20 7d  ot fail */.    }
11be0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57  .  }else if( ALW
11bf0 41 59 53 28 70 43 2d 3e 70 73 65 75 64 6f 54 61  AYS(pC->pseudoTa
11c00 62 6c 65 52 65 67 3e 30 29 20 29 7b 0a 20 20 20  bleReg>0) ){.   
11c10 20 70 52 65 67 20 3d 20 26 61 4d 65 6d 5b 70 43   pReg = &aMem[pC
11c20 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67  ->pseudoTableReg
11c30 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 6d  ];.    if( pC->m
11c40 75 6c 74 69 50 73 65 75 64 6f 20 29 7b 0a 20 20  ultiPseudo ){.  
11c50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
11c60 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 44  emShallowCopy(pD
11c70 65 73 74 2c 20 70 52 65 67 2b 70 32 2c 20 4d 45  est, pReg+p2, ME
11c80 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 20 20  M_Ephem);.      
11c90 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 70  Deephemeralize(p
11ca0 44 65 73 74 29 3b 0a 20 20 20 20 20 20 67 6f 74  Dest);.      got
11cb0 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b  o op_column_out;
11cc0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
11cd0 74 28 20 70 52 65 67 2d 3e 66 6c 61 67 73 20 26  t( pReg->flags &
11ce0 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20   MEM_Blob );.   
11cf0 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
11d00 6c 69 64 28 70 52 65 67 29 20 29 3b 0a 20 20 20  lid(pReg) );.   
11d10 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 70   payloadSize = p
11d20 52 65 67 2d 3e 6e 3b 0a 20 20 20 20 7a 52 65 63  Reg->n;.    zRec
11d30 20 3d 20 70 52 65 67 2d 3e 7a 3b 0a 20 20 20 20   = pReg->z;.    
11d40 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
11d50 3d 20 28 70 4f 70 2d 3e 70 35 26 4f 50 46 4c 41  = (pOp->p5&OPFLA
11d60 47 5f 43 4c 45 41 52 43 41 43 48 45 29 20 3f 20  G_CLEARCACHE) ? 
11d70 43 41 43 48 45 5f 53 54 41 4c 45 20 3a 20 70 2d  CACHE_STALE : p-
11d80 3e 63 61 63 68 65 43 74 72 3b 0a 20 20 20 20 61  >cacheCtr;.    a
11d90 73 73 65 72 74 28 20 70 61 79 6c 6f 61 64 53 69  ssert( payloadSi
11da0 7a 65 3d 3d 30 20 7c 7c 20 7a 52 65 63 21 3d 30  ze==0 || zRec!=0
11db0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
11dc0 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65   /* Consider the
11dd0 20 72 6f 77 20 74 6f 20 62 65 20 4e 55 4c 4c 20   row to be NULL 
11de0 2a 2f 0a 20 20 20 20 70 61 79 6c 6f 61 64 53 69  */.    payloadSi
11df0 7a 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ze = 0;.  }..  /
11e00 2a 20 49 66 20 70 61 79 6c 6f 61 64 53 69 7a 65  * If payloadSize
11e10 20 69 73 20 30 2c 20 74 68 65 6e 20 6a 75 73 74   is 0, then just
11e20 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c 2e 20 20   store a NULL.  
11e30 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  This can happen 
11e40 62 65 63 61 75 73 65 20 6f 66 0a 20 20 2a 2a 20  because of.  ** 
11e50 6e 75 6c 6c 52 6f 77 20 6f 72 20 62 65 63 61 75  nullRow or becau
11e60 73 65 20 6f 66 20 61 20 63 6f 72 72 75 70 74 20  se of a corrupt 
11e70 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20 69  database. */.  i
11e80 66 28 20 70 61 79 6c 6f 61 64 53 69 7a 65 3d 3d  f( payloadSize==
11e90 30 20 29 7b 0a 20 20 20 20 4d 65 6d 53 65 74 54  0 ){.    MemSetT
11ea0 79 70 65 46 6c 61 67 28 70 44 65 73 74 2c 20 4d  ypeFlag(pDest, M
11eb0 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 67 6f  EM_Null);.    go
11ec0 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74  to op_column_out
11ed0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
11ee0 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
11ef0 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3e  E_LIMIT_LENGTH]>
11f00 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 61 79 6c  =0 );.  if( payl
11f10 6f 61 64 53 69 7a 65 20 3e 20 28 75 33 32 29 64  oadSize > (u32)d
11f20 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
11f30 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29  _LIMIT_LENGTH] )
11f40 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62  {.    goto too_b
11f50 69 67 3b 0a 20 20 7d 0a 0a 20 20 6e 46 69 65 6c  ig;.  }..  nFiel
11f60 64 20 3d 20 70 43 2d 3e 6e 46 69 65 6c 64 3b 0a  d = pC->nField;.
11f70 20 20 61 73 73 65 72 74 28 20 70 32 3c 6e 46 69    assert( p2<nFi
11f80 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  eld );..  /* Rea
11f90 64 20 61 6e 64 20 70 61 72 73 65 20 74 68 65 20  d and parse the 
11fa0 74 61 62 6c 65 20 68 65 61 64 65 72 2e 20 20 53  table header.  S
11fb0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
11fc0 20 6f 66 20 74 68 65 20 70 61 72 73 65 0a 20 20   of the parse.  
11fd0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 72 65 63 6f  ** into the reco
11fe0 72 64 20 68 65 61 64 65 72 20 63 61 63 68 65 20  rd header cache 
11ff0 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 63 75  fields of the cu
12000 72 73 6f 72 2e 0a 20 20 2a 2f 0a 20 20 61 54 79  rsor..  */.  aTy
12010 70 65 20 3d 20 70 43 2d 3e 61 54 79 70 65 3b 0a  pe = pC->aType;.
12020 20 20 69 66 28 20 70 43 2d 3e 63 61 63 68 65 53    if( pC->cacheS
12030 74 61 74 75 73 3d 3d 70 2d 3e 63 61 63 68 65 43  tatus==p->cacheC
12040 74 72 20 29 7b 0a 20 20 20 20 61 4f 66 66 73 65  tr ){.    aOffse
12050 74 20 3d 20 70 43 2d 3e 61 4f 66 66 73 65 74 3b  t = pC->aOffset;
12060 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
12070 73 65 72 74 28 61 54 79 70 65 29 3b 0a 20 20 20  sert(aType);.   
12080 20 61 76 61 69 6c 20 3d 20 30 3b 0a 20 20 20 20   avail = 0;.    
12090 70 43 2d 3e 61 4f 66 66 73 65 74 20 3d 20 61 4f  pC->aOffset = aO
120a0 66 66 73 65 74 20 3d 20 26 61 54 79 70 65 5b 6e  ffset = &aType[n
120b0 46 69 65 6c 64 5d 3b 0a 20 20 20 20 70 43 2d 3e  Field];.    pC->
120c0 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 70 61  payloadSize = pa
120d0 79 6c 6f 61 64 53 69 7a 65 3b 0a 20 20 20 20 70  yloadSize;.    p
120e0 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  C->cacheStatus =
120f0 20 70 2d 3e 63 61 63 68 65 43 74 72 3b 0a 0a 20   p->cacheCtr;.. 
12100 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
12110 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20   how many bytes 
12120 61 72 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  are in the heade
12130 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 52 65  r */.    if( zRe
12140 63 20 29 7b 0a 20 20 20 20 20 20 7a 44 61 74 61  c ){.      zData
12150 20 3d 20 7a 52 65 63 3b 0a 20 20 20 20 7d 65 6c   = zRec;.    }el
12160 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  se{.      if( pC
12170 2d 3e 69 73 49 6e 64 65 78 20 29 7b 0a 20 20 20  ->isIndex ){.   
12180 20 20 20 20 20 7a 44 61 74 61 20 3d 20 28 63 68       zData = (ch
12190 61 72 2a 29 73 71 6c 69 74 65 33 42 74 72 65 65  ar*)sqlite3Btree
121a0 4b 65 79 46 65 74 63 68 28 70 43 72 73 72 2c 20  KeyFetch(pCrsr, 
121b0 26 61 76 61 69 6c 29 3b 0a 20 20 20 20 20 20 7d  &avail);.      }
121c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 44  else{.        zD
121d0 61 74 61 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  ata = (char*)sql
121e0 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
121f0 63 68 28 70 43 72 73 72 2c 20 26 61 76 61 69 6c  ch(pCrsr, &avail
12200 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12210 20 2f 2a 20 49 66 20 4b 65 79 46 65 74 63 68 28   /* If KeyFetch(
12220 29 2f 44 61 74 61 46 65 74 63 68 28 29 20 6d 61  )/DataFetch() ma
12230 6e 61 67 65 64 20 74 6f 20 67 65 74 20 74 68 65  naged to get the
12240 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 2c   entire payload,
12250 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 65 20 74  .      ** save t
12260 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 20 74 68  he payload in th
12270 65 20 70 43 2d 3e 61 52 6f 77 20 63 61 63 68 65  e pC->aRow cache
12280 2e 20 20 54 68 61 74 20 77 69 6c 6c 20 73 61 76  .  That will sav
12290 65 20 75 73 20 66 72 6f 6d 0a 20 20 20 20 20 20  e us from.      
122a0 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 6b  ** having to mak
122b0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 61 6c  e additional cal
122c0 6c 73 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  ls to fetch the 
122d0 63 6f 6e 74 65 6e 74 20 70 6f 72 74 69 6f 6e 20  content portion 
122e0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
122f0 72 65 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f  record..      */
12300 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
12310 76 61 69 6c 3e 3d 30 20 29 3b 0a 20 20 20 20 20  vail>=0 );.     
12320 20 69 66 28 20 70 61 79 6c 6f 61 64 53 69 7a 65   if( payloadSize
12330 20 3c 3d 20 28 75 33 32 29 61 76 61 69 6c 20 29   <= (u32)avail )
12340 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 63 20 3d  {.        zRec =
12350 20 7a 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20   zData;.        
12360 70 43 2d 3e 61 52 6f 77 20 3d 20 28 75 38 2a 29  pC->aRow = (u8*)
12370 7a 44 61 74 61 3b 0a 20 20 20 20 20 20 7d 65 6c  zData;.      }el
12380 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e  se{.        pC->
12390 61 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20 20  aRow = 0;.      
123a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 54  }.    }.    /* T
123b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
123c0 65 72 74 20 69 73 20 74 72 75 65 20 69 6e 20 61  ert is true in a
123d0 6c 6c 20 63 61 73 65 73 20 65 78 63 65 70 74 20  ll cases except 
123e0 77 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  when.    ** the 
123f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
12400 73 20 62 65 65 6e 20 63 6f 72 72 75 70 74 65 64  s been corrupted
12410 20 65 78 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 20   externally..   
12420 20 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 7a   **    assert( z
12430 52 65 63 21 3d 30 20 7c 7c 20 61 76 61 69 6c 3e  Rec!=0 || avail>
12440 3d 70 61 79 6c 6f 61 64 53 69 7a 65 20 7c 7c 20  =payloadSize || 
12450 61 76 61 69 6c 3e 3d 39 20 29 3b 20 2a 2f 0a 20  avail>=9 ); */. 
12460 20 20 20 73 7a 48 64 72 20 3d 20 67 65 74 56 61     szHdr = getVa
12470 72 69 6e 74 33 32 28 28 75 38 2a 29 7a 44 61 74  rint32((u8*)zDat
12480 61 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20  a, offset);..   
12490 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 20   /* Make sure a 
124a0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
124b0 20 68 61 73 20 6e 6f 74 20 67 69 76 65 6e 20 75   has not given u
124c0 73 20 61 6e 20 6f 76 65 72 73 69 7a 65 20 68 65  s an oversize he
124d0 61 64 65 72 2e 0a 20 20 20 20 2a 2a 20 44 6f 20  ader..    ** Do 
124e0 74 68 69 73 20 6e 6f 77 20 74 6f 20 61 76 6f 69  this now to avoi
124f0 64 20 61 6e 20 6f 76 65 72 73 69 7a 65 20 6d 65  d an oversize me
12500 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  mory allocation.
12510 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
12520 79 70 65 20 65 6e 74 72 69 65 73 20 63 61 6e 20  ype entries can 
12530 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  be between 1 and
12540 20 35 20 62 79 74 65 73 20 65 61 63 68 2e 20 20   5 bytes each.  
12550 42 75 74 20 34 20 61 6e 64 20 35 20 62 79 74 65  But 4 and 5 byte
12560 0a 20 20 20 20 2a 2a 20 74 79 70 65 73 20 75 73  .    ** types us
12570 65 20 73 6f 20 6d 75 63 68 20 64 61 74 61 20 73  e so much data s
12580 70 61 63 65 20 74 68 61 74 20 74 68 65 72 65 20  pace that there 
12590 63 61 6e 20 6f 6e 6c 79 20 62 65 20 34 30 39 36  can only be 4096
125a0 20 61 6e 64 20 33 32 20 6f 66 0a 20 20 20 20 2a   and 32 of.    *
125b0 2a 20 74 68 65 6d 2c 20 72 65 73 70 65 63 74 69  * them, respecti
125c0 76 65 6c 79 2e 20 20 53 6f 20 74 68 65 20 6d 61  vely.  So the ma
125d0 78 69 6d 75 6d 20 68 65 61 64 65 72 20 6c 65 6e  ximum header len
125e0 67 74 68 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  gth results from
125f0 20 61 0a 20 20 20 20 2a 2a 20 33 2d 62 79 74 65   a.    ** 3-byte
12600 20 74 79 70 65 20 66 6f 72 20 65 61 63 68 20 6f   type for each o
12610 66 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  f the maximum of
12620 20 33 32 37 36 38 20 63 6f 6c 75 6d 6e 73 20 70   32768 columns p
12630 6c 75 73 20 74 68 72 65 65 0a 20 20 20 20 2a 2a  lus three.    **
12640 20 65 78 74 72 61 20 62 79 74 65 73 20 66 6f 72   extra bytes for
12650 20 74 68 65 20 68 65 61 64 65 72 20 6c 65 6e 67   the header leng
12660 74 68 20 69 74 73 65 6c 66 2e 20 20 33 32 37 36  th itself.  3276
12670 38 2a 33 20 2b 20 33 20 3d 20 39 38 33 30 37 2e  8*3 + 3 = 98307.
12680 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12690 6f 66 66 73 65 74 20 3e 20 39 38 33 30 37 20 29  offset > 98307 )
126a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
126b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
126c0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f  ;.      goto op_
126d0 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20 20  column_out;.    
126e0 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  }..    /* Comput
126f0 65 20 69 6e 20 6c 65 6e 20 74 68 65 20 6e 75 6d  e in len the num
12700 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
12710 64 61 74 61 20 77 65 20 6e 65 65 64 20 74 6f 20  data we need to 
12720 72 65 61 64 20 69 6e 20 6f 72 64 65 72 0a 20 20  read in order.  
12730 20 20 2a 2a 20 74 6f 20 67 65 74 20 6e 46 69 65    ** to get nFie
12740 6c 64 20 74 79 70 65 20 76 61 6c 75 65 73 2e 20  ld type values. 
12750 20 6f 66 66 73 65 74 20 69 73 20 61 6e 20 75 70   offset is an up
12760 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 69  per bound on thi
12770 73 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 6e  s.  But.    ** n
12780 46 69 65 6c 64 20 6d 69 67 68 74 20 62 65 20 73  Field might be s
12790 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 6c 65 73  ignificantly les
127a0 73 20 74 68 61 6e 20 74 68 65 20 74 72 75 65 20  s than the true 
127b0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
127c0 73 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  s.    ** in the 
127d0 74 61 62 6c 65 2c 20 61 6e 64 20 69 6e 20 74 68  table, and in th
127e0 61 74 20 63 61 73 65 2c 20 35 2a 6e 46 69 65 6c  at case, 5*nFiel
127f0 64 2b 33 20 6d 69 67 68 74 20 62 65 20 73 6d 61  d+3 might be sma
12800 6c 6c 65 72 20 74 68 61 6e 20 6f 66 66 73 65 74  ller than offset
12810 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 61 6e 74  ..    ** We want
12820 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 6c 65 6e   to minimize len
12830 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6c 69 6d   in order to lim
12840 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  it the size of t
12850 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  he memory.    **
12860 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 65 73 70   allocation, esp
12870 65 63 69 61 6c 6c 79 20 69 66 20 61 20 63 6f 72  ecially if a cor
12880 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
12890 6c 65 20 68 61 73 20 63 61 75 73 65 64 20 6f 66  le has caused of
128a0 66 73 65 74 0a 20 20 20 20 2a 2a 20 74 6f 20 62  fset.    ** to b
128b0 65 20 6f 76 65 72 73 69 7a 65 64 2e 20 4f 66 66  e oversized. Off
128c0 73 65 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74  set is limited t
128d0 6f 20 39 38 33 30 37 20 61 62 6f 76 65 2e 20 20  o 98307 above.  
128e0 42 75 74 20 39 38 33 30 37 20 6d 69 67 68 74 0a  But 98307 might.
128f0 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 65 78 63      ** still exc
12900 65 65 64 20 52 6f 62 73 6f 6e 20 6d 65 6d 6f 72  eed Robson memor
12910 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6c 69 6d  y allocation lim
12920 69 74 73 20 6f 6e 20 73 6f 6d 65 20 63 6f 6e 66  its on some conf
12930 69 67 75 72 61 74 69 6f 6e 73 2e 0a 20 20 20 20  igurations..    
12940 2a 2a 20 4f 6e 20 73 79 73 74 65 6d 73 20 74 68  ** On systems th
12950 61 74 20 63 61 6e 6e 6f 74 20 74 6f 6c 65 72 61  at cannot tolera
12960 74 65 20 6c 61 72 67 65 20 6d 65 6d 6f 72 79 20  te large memory 
12970 61 6c 6c 6f 63 61 74 69 6f 6e 73 2c 20 6e 46 69  allocations, nFi
12980 65 6c 64 2a 35 2b 33 0a 20 20 20 20 2a 2a 20 77  eld*5+3.    ** w
12990 69 6c 6c 20 6c 69 6b 65 6c 79 20 62 65 20 6d 75  ill likely be mu
129a0 63 68 20 73 6d 61 6c 6c 65 72 20 73 69 6e 63 65  ch smaller since
129b0 20 6e 46 69 65 6c 64 20 77 69 6c 6c 20 6c 69 6b   nField will lik
129c0 65 6c 79 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ely be less than
129d0 0a 20 20 20 20 2a 2a 20 32 30 20 6f 72 20 73 6f  .    ** 20 or so
129e0 2e 20 20 54 68 69 73 20 69 6e 73 75 72 65 73 20  .  This insures 
129f0 74 68 61 74 20 52 6f 62 73 6f 6e 20 6d 65 6d 6f  that Robson memo
12a00 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6c 69  ry allocation li
12a10 6d 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  mits are.    ** 
12a20 6e 6f 74 20 65 78 63 65 65 64 65 64 20 65 76 65  not exceeded eve
12a30 6e 20 66 6f 72 20 63 6f 72 72 75 70 74 20 64 61  n for corrupt da
12a40 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 20 20  tabase files..  
12a50 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 6e    */.    len = n
12a60 46 69 65 6c 64 2a 35 20 2b 20 33 3b 0a 20 20 20  Field*5 + 3;.   
12a70 20 69 66 28 20 6c 65 6e 20 3e 20 28 69 6e 74 29   if( len > (int)
12a80 6f 66 66 73 65 74 20 29 20 6c 65 6e 20 3d 20 28  offset ) len = (
12a90 69 6e 74 29 6f 66 66 73 65 74 3b 0a 0a 20 20 20  int)offset;..   
12aa0 20 2f 2a 20 54 68 65 20 4b 65 79 46 65 74 63 68   /* The KeyFetch
12ab0 28 29 20 6f 72 20 44 61 74 61 46 65 74 63 68 28  () or DataFetch(
12ac0 29 20 61 62 6f 76 65 20 61 72 65 20 66 61 73 74  ) above are fast
12ad0 20 61 6e 64 20 77 69 6c 6c 20 67 65 74 20 74 68   and will get th
12ae0 65 20 65 6e 74 69 72 65 0a 20 20 20 20 2a 2a 20  e entire.    ** 
12af0 72 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e  record header in
12b00 20 6d 6f 73 74 20 63 61 73 65 73 2e 20 20 42 75   most cases.  Bu
12b10 74 20 74 68 65 79 20 77 69 6c 6c 20 66 61 69 6c  t they will fail
12b20 20 74 6f 20 67 65 74 20 74 68 65 20 63 6f 6d 70   to get the comp
12b30 6c 65 74 65 0a 20 20 20 20 2a 2a 20 72 65 63 6f  lete.    ** reco
12b40 72 64 20 68 65 61 64 65 72 20 69 66 20 74 68 65  rd header if the
12b50 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20 64   record header d
12b60 6f 65 73 20 6e 6f 74 20 66 69 74 20 6f 6e 20 61  oes not fit on a
12b70 20 73 69 6e 67 6c 65 20 70 61 67 65 0a 20 20 20   single page.   
12b80 20 2a 2a 20 69 6e 20 74 68 65 20 42 2d 54 72 65   ** in the B-Tre
12b90 65 2e 20 20 57 68 65 6e 20 74 68 61 74 20 68 61  e.  When that ha
12ba0 70 70 65 6e 73 2c 20 75 73 65 20 73 71 6c 69 74  ppens, use sqlit
12bb0 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
12bc0 65 65 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 61  ee() to.    ** a
12bd0 63 71 75 69 72 65 20 74 68 65 20 63 6f 6d 70 6c  cquire the compl
12be0 65 74 65 20 68 65 61 64 65 72 20 74 65 78 74 2e  ete header text.
12bf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12c00 21 7a 52 65 63 20 26 26 20 61 76 61 69 6c 3c 6c  !zRec && avail<l
12c10 65 6e 20 29 7b 0a 20 20 20 20 20 20 73 4d 65 6d  en ){.      sMem
12c20 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  .flags = 0;.    
12c30 20 20 73 4d 65 6d 2e 64 62 20 3d 20 30 3b 0a 20    sMem.db = 0;. 
12c40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12c50 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
12c60 65 28 70 43 72 73 72 2c 20 30 2c 20 6c 65 6e 2c  e(pCrsr, 0, len,
12c70 20 70 43 2d 3e 69 73 49 6e 64 65 78 2c 20 26 73   pC->isIndex, &s
12c80 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Mem);.      if( 
12c90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12ca0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  .        goto op
12cb0 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20  _column_out;.   
12cc0 20 20 20 7d 0a 20 20 20 20 20 20 7a 44 61 74 61     }.      zData
12cd0 20 3d 20 73 4d 65 6d 2e 7a 3b 0a 20 20 20 20 7d   = sMem.z;.    }
12ce0 0a 20 20 20 20 7a 45 6e 64 48 64 72 20 3d 20 28  .    zEndHdr = (
12cf0 75 38 20 2a 29 26 7a 44 61 74 61 5b 6c 65 6e 5d  u8 *)&zData[len]
12d00 3b 0a 20 20 20 20 7a 49 64 78 20 3d 20 28 75 38  ;.    zIdx = (u8
12d10 20 2a 29 26 7a 44 61 74 61 5b 73 7a 48 64 72 5d   *)&zData[szHdr]
12d20 3b 0a 0a 20 20 20 20 2f 2a 20 53 63 61 6e 20 74  ;..    /* Scan t
12d30 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 75 73  he header and us
12d40 65 20 69 74 20 74 6f 20 66 69 6c 6c 20 69 6e 20  e it to fill in 
12d50 74 68 65 20 61 54 79 70 65 5b 5d 20 61 6e 64 20  the aType[] and 
12d60 61 4f 66 66 73 65 74 5b 5d 0a 20 20 20 20 2a 2a  aOffset[].    **
12d70 20 61 72 72 61 79 73 2e 20 20 61 54 79 70 65 5b   arrays.  aType[
12d80 69 5d 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  i] will contain 
12d90 74 68 65 20 74 79 70 65 20 69 6e 74 65 67 65 72  the type integer
12da0 20 66 6f 72 20 74 68 65 20 69 2d 74 68 0a 20 20   for the i-th.  
12db0 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 61 6e 64 20    ** column and 
12dc0 61 4f 66 66 73 65 74 5b 69 5d 20 77 69 6c 6c 20  aOffset[i] will 
12dd0 63 6f 6e 74 61 69 6e 20 74 68 65 20 6f 66 66 73  contain the offs
12de0 65 74 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  et from the begi
12df0 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20  nning.    ** of 
12e00 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 74 68  the record to th
12e10 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 64  e start of the d
12e20 61 74 61 20 66 6f 72 20 74 68 65 20 69 2d 74 68  ata for the i-th
12e30 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20   column.    */. 
12e40 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46     for(i=0; i<nF
12e50 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ield; i++){.    
12e60 20 20 69 66 28 20 7a 49 64 78 3c 7a 45 6e 64 48    if( zIdx<zEndH
12e70 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4f  dr ){.        aO
12e80 66 66 73 65 74 5b 69 5d 20 3d 20 6f 66 66 73 65  ffset[i] = offse
12e90 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  t;.        if( z
12ea0 49 64 78 5b 30 5d 3c 30 78 38 30 20 29 7b 0a 20  Idx[0]<0x80 ){. 
12eb0 20 20 20 20 20 20 20 20 20 74 20 3d 20 7a 49 64           t = zId
12ec0 78 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  x[0];.          
12ed0 7a 49 64 78 2b 2b 3b 0a 20 20 20 20 20 20 20 20  zIdx++;.        
12ee0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12ef0 20 7a 49 64 78 20 2b 3d 20 73 71 6c 69 74 65 33   zIdx += sqlite3
12f00 47 65 74 56 61 72 69 6e 74 33 32 28 7a 49 64 78  GetVarint32(zIdx
12f10 2c 20 26 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  , &t);.        }
12f20 0a 20 20 20 20 20 20 20 20 61 54 79 70 65 5b 69  .        aType[i
12f30 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 73  ] = t;.        s
12f40 7a 46 69 65 6c 64 20 3d 20 73 71 6c 69 74 65 33  zField = sqlite3
12f50 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
12f60 6e 28 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  n(t);.        of
12f70 66 73 65 74 20 2b 3d 20 73 7a 46 69 65 6c 64 3b  fset += szField;
12f80 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 66 66  .        if( off
12f90 73 65 74 3c 73 7a 46 69 65 6c 64 20 29 7b 20 20  set<szField ){  
12fa0 2f 2a 20 54 72 75 65 20 69 66 20 6f 66 66 73 65  /* True if offse
12fb0 74 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  t overflows */. 
12fc0 20 20 20 20 20 20 20 20 20 7a 49 64 78 20 3d 20           zIdx = 
12fd0 26 7a 45 6e 64 48 64 72 5b 31 5d 3b 20 20 2f 2a  &zEndHdr[1];  /*
12fe0 20 46 6f 72 63 65 73 20 53 51 4c 49 54 45 5f 43   Forces SQLITE_C
12ff0 4f 52 52 55 50 54 20 72 65 74 75 72 6e 20 62 65  ORRUPT return be
13000 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  low */.         
13010 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
13020 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
13030 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 20 69         /* If i i
13040 73 20 6c 65 73 73 20 74 68 61 74 20 6e 46 69 65  s less that nFie
13050 6c 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 61  ld, then there a
13060 72 65 20 66 65 77 65 72 20 66 69 65 6c 64 73 20  re fewer fields 
13070 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  in this.        
13080 2a 2a 20 72 65 63 6f 72 64 20 74 68 61 6e 20 53  ** record than S
13090 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20 69 6e 64  etNumColumns ind
130a0 69 63 61 74 65 64 20 74 68 65 72 65 20 61 72 65  icated there are
130b0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
130c0 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
130d0 2e 20 53 65 74 20 74 68 65 20 6f 66 66 73 65 74  . Set the offset
130e0 20 66 6f 72 20 61 6e 79 20 65 78 74 72 61 20 63   for any extra c
130f0 6f 6c 75 6d 6e 73 20 6e 6f 74 20 70 72 65 73 65  olumns not prese
13100 6e 74 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  nt in.        **
13110 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 30   the record to 0
13120 2e 20 54 68 69 73 20 74 65 6c 6c 73 20 63 6f 64  . This tells cod
13130 65 20 62 65 6c 6f 77 20 74 6f 20 73 74 6f 72 65  e below to store
13140 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
13150 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  ue.        ** fo
13160 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 73  r the column ins
13170 74 65 61 64 20 6f 66 20 64 65 73 65 72 69 61 6c  tead of deserial
13180 69 7a 69 6e 67 20 61 20 76 61 6c 75 65 20 66 72  izing a value fr
13190 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 0a 20  om the record.. 
131a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
131b0 20 20 61 4f 66 66 73 65 74 5b 69 5d 20 3d 20 30    aOffset[i] = 0
131c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
131d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
131e0 65 6d 52 65 6c 65 61 73 65 28 26 73 4d 65 6d 29  emRelease(&sMem)
131f0 3b 0a 20 20 20 20 73 4d 65 6d 2e 66 6c 61 67 73  ;.    sMem.flags
13200 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 0a 20 20   = MEM_Null;..  
13210 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
13220 72 65 61 64 20 6d 6f 72 65 20 68 65 61 64 65 72  read more header
13230 20 64 61 74 61 20 74 68 61 6e 20 77 61 73 20 63   data than was c
13240 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
13250 68 65 61 64 65 72 2c 0a 20 20 20 20 2a 2a 20 6f  header,.    ** o
13260 72 20 69 66 20 74 68 65 20 65 6e 64 20 6f 66 20  r if the end of 
13270 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 61  the last field a
13280 70 70 65 61 72 73 20 74 6f 20 62 65 20 70 61 73  ppears to be pas
13290 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
132a0 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2c 20  .    ** record, 
132b0 6f 72 20 69 66 20 74 68 65 20 65 6e 64 20 6f 66  or if the end of
132c0 20 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20   the last field 
132d0 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 62 65  appears to be be
132e0 66 6f 72 65 20 74 68 65 20 65 6e 64 0a 20 20 20  fore the end.   
132f0 20 2a 2a 20 6f 66 20 74 68 65 20 72 65 63 6f 72   ** of the recor
13300 64 20 28 77 68 65 6e 20 61 6c 6c 20 66 69 65 6c  d (when all fiel
13310 64 73 20 70 72 65 73 65 6e 74 29 2c 20 74 68 65  ds present), the
13320 6e 20 77 65 20 6d 75 73 74 20 62 65 20 64 65 61  n we must be dea
13330 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 77 69 74  ling .    ** wit
13340 68 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  h a corrupt data
13350 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  base..    */.   
13360 20 69 66 28 20 28 7a 49 64 78 20 3e 20 7a 45 6e   if( (zIdx > zEn
13370 64 48 64 72 29 20 7c 7c 20 28 6f 66 66 73 65 74  dHdr) || (offset
13380 20 3e 20 70 61 79 6c 6f 61 64 53 69 7a 65 29 0a   > payloadSize).
13390 20 20 20 20 20 20 20 20 20 7c 7c 20 28 7a 49 64           || (zId
133a0 78 3d 3d 7a 45 6e 64 48 64 72 20 26 26 20 6f 66  x==zEndHdr && of
133b0 66 73 65 74 21 3d 70 61 79 6c 6f 61 64 53 69 7a  fset!=payloadSiz
133c0 65 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  e) ){.      rc =
133d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
133e0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
133f0 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a   op_column_out;.
13400 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
13410 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  Get the column i
13420 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 49 66 20 61  nformation. If a
13430 4f 66 66 73 65 74 5b 70 32 5d 20 69 73 20 6e 6f  Offset[p2] is no
13440 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 0a 20 20  n-zero, then .  
13450 2a 2a 20 64 65 73 65 72 69 61 6c 69 7a 65 20 74  ** deserialize t
13460 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
13470 65 20 72 65 63 6f 72 64 2e 20 49 66 20 61 4f 66  e record. If aOf
13480 66 73 65 74 5b 70 32 5d 20 69 73 20 7a 65 72 6f  fset[p2] is zero
13490 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72  ,.  ** then ther
134a0 65 20 61 72 65 20 6e 6f 74 20 65 6e 6f 75 67 68  e are not enough
134b0 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 72   fields in the r
134c0 65 63 6f 72 64 20 74 6f 20 73 61 74 69 73 66 79  ecord to satisfy
134d0 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73   the.  ** reques
134e0 74 2e 20 20 49 6e 20 74 68 69 73 20 63 61 73 65  t.  In this case
134f0 2c 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  , set the value 
13500 4e 55 4c 4c 20 6f 72 20 74 6f 20 50 34 20 69 66  NULL or to P4 if
13510 20 50 34 20 69 73 0a 20 20 2a 2a 20 61 20 70 6f   P4 is.  ** a po
13520 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 20 6f  inter to a Mem o
13530 62 6a 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  bject..  */.  if
13540 28 20 61 4f 66 66 73 65 74 5b 70 32 5d 20 29 7b  ( aOffset[p2] ){
13550 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
13560 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
13570 20 20 69 66 28 20 7a 52 65 63 20 29 7b 0a 20 20    if( zRec ){.  
13580 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
13590 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
135a0 68 65 72 65 20 74 68 65 20 77 68 6f 6c 65 20 72  here the whole r
135b0 6f 77 20 66 69 74 73 20 6f 6e 20 61 20 73 69 6e  ow fits on a sin
135c0 67 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  gle page */.    
135d0 20 20 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65    VdbeMemRelease
135e0 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 73  (pDest);.      s
135f0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
13600 47 65 74 28 28 75 38 20 2a 29 26 7a 52 65 63 5b  Get((u8 *)&zRec[
13610 61 4f 66 66 73 65 74 5b 70 32 5d 5d 2c 20 61 54  aOffset[p2]], aT
13620 79 70 65 5b 70 32 5d 2c 20 70 44 65 73 74 29 3b  ype[p2], pDest);
13630 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13640 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
13650 20 68 61 70 70 65 6e 73 20 6f 6e 6c 79 20 77 68   happens only wh
13660 65 6e 20 74 68 65 20 72 6f 77 20 6f 76 65 72 66  en the row overf
13670 6c 6f 77 73 20 6f 6e 74 6f 20 6d 75 6c 74 69 70  lows onto multip
13680 6c 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20  le pages */.    
13690 20 20 74 20 3d 20 61 54 79 70 65 5b 70 32 5d 3b    t = aType[p2];
136a0 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f 70 2d  .      if( (pOp-
136b0 3e 70 35 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45  >p5 & (OPFLAG_LE
136c0 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54  NGTHARG|OPFLAG_T
136d0 59 50 45 4f 46 41 52 47 29 29 21 3d 30 0a 20 20  YPEOFARG))!=0.  
136e0 20 20 20 20 20 26 26 20 28 28 74 3e 3d 31 32 20       && ((t>=12 
136f0 26 26 20 28 74 26 31 29 3d 3d 30 29 20 7c 7c 20  && (t&1)==0) || 
13700 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41  (pOp->p5 & OPFLA
13710 47 5f 54 59 50 45 4f 46 41 52 47 29 21 3d 30 29  G_TYPEOFARG)!=0)
13720 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
13730 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 69 73 20    /* Content is 
13740 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 74  irrelevant for t
13750 68 65 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63  he typeof() func
13760 74 69 6f 6e 20 61 6e 64 20 66 6f 72 0a 20 20 20  tion and for.   
13770 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 6e 67       ** the leng
13780 74 68 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69  th(X) function i
13790 66 20 58 20 69 73 20 61 20 62 6c 6f 62 2e 20 20  f X is a blob.  
137a0 53 6f 20 77 65 20 6d 69 67 68 74 20 61 73 20 77  So we might as w
137b0 65 6c 6c 20 75 73 65 0a 20 20 20 20 20 20 20 20  ell use.        
137c0 2a 2a 20 62 6f 67 75 73 20 63 6f 6e 74 65 6e 74  ** bogus content
137d0 20 72 61 74 68 65 72 20 74 68 61 6e 20 72 65 61   rather than rea
137e0 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ding content fro
137f0 6d 20 64 69 73 6b 2e 20 20 4e 55 4c 4c 20 77 6f  m disk.  NULL wo
13800 72 6b 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  rks.        ** f
13810 6f 72 20 74 65 78 74 20 61 6e 64 20 62 6c 6f 62  or text and blob
13820 20 61 6e 64 20 77 68 61 74 65 76 65 72 20 69 73   and whatever is
13830 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 53   in the payloadS
13840 69 7a 65 36 34 20 76 61 72 69 61 62 6c 65 0a 20  ize64 variable. 
13850 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 77         ** will w
13860 6f 72 6b 20 66 6f 72 20 65 76 65 72 79 74 68 69  ork for everythi
13870 6e 67 20 65 6c 73 65 2e 20 2a 2f 0a 20 20 20 20  ng else. */.    
13880 20 20 20 20 7a 44 61 74 61 20 3d 20 74 3c 31 32      zData = t<12
13890 20 3f 20 28 63 68 61 72 2a 29 26 70 61 79 6c 6f   ? (char*)&paylo
138a0 61 64 53 69 7a 65 36 34 20 3a 20 30 3b 0a 20 20  adSize64 : 0;.  
138b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
138c0 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33     len = sqlite3
138d0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
138e0 6e 28 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n(t);.        sq
138f0 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65  lite3VdbeMemMove
13900 28 26 73 4d 65 6d 2c 20 70 44 65 73 74 29 3b 0a  (&sMem, pDest);.
13910 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13920 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
13930 74 72 65 65 28 70 43 72 73 72 2c 20 61 4f 66 66  tree(pCrsr, aOff
13940 73 65 74 5b 70 32 5d 2c 20 6c 65 6e 2c 20 20 70  set[p2], len,  p
13950 43 2d 3e 69 73 49 6e 64 65 78 2c 0a 20 20 20 20  C->isIndex,.    
13960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13980 20 26 73 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20   &sMem);.       
13990 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
139a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
139b0 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f  goto op_column_o
139c0 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
139d0 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 73 4d        zData = sM
139e0 65 6d 2e 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20  em.z;.      }.  
139f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
13a00 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 7a 44  erialGet((u8*)zD
13a10 61 74 61 2c 20 74 2c 20 70 44 65 73 74 29 3b 0a  ata, t, pDest);.
13a20 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73 74 2d      }.    pDest-
13a30 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b  >enc = encoding;
13a40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
13a50 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
13a60 34 5f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73  4_MEM ){.      s
13a70 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
13a80 6c 6c 6f 77 43 6f 70 79 28 70 44 65 73 74 2c 20  llowCopy(pDest, 
13a90 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 2c 20 4d 45  pOp->p4.pMem, ME
13aa0 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 7d  M_Static);.    }
13ab0 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65 6d 53  else{.      MemS
13ac0 65 74 54 79 70 65 46 6c 61 67 28 70 44 65 73 74  etTypeFlag(pDest
13ad0 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
13ae0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
13af0 77 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61  we dynamically a
13b00 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20 74  llocated space t
13b10 6f 20 68 6f 6c 64 20 74 68 65 20 64 61 74 61 20  o hold the data 
13b20 28 69 6e 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  (in the.  ** sql
13b30 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
13b40 74 72 65 65 28 29 20 63 61 6c 6c 20 61 62 6f 76  tree() call abov
13b50 65 29 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  e) then transfer
13b60 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 74 68 61 74   control of that
13b70 0a 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c  .  ** dynamicall
13b80 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  y allocated spac
13b90 65 20 6f 76 65 72 20 74 6f 20 74 68 65 20 70 44  e over to the pD
13ba0 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 20  est structure.. 
13bb0 20 2a 2a 20 54 68 69 73 20 70 72 65 76 65 6e 74   ** This prevent
13bc0 73 20 61 20 6d 65 6d 6f 72 79 20 63 6f 70 79 2e  s a memory copy.
13bd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 4d 65 6d  .  */.  if( sMem
13be0 2e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  .zMalloc ){.    
13bf0 61 73 73 65 72 74 28 20 73 4d 65 6d 2e 7a 3d 3d  assert( sMem.z==
13c00 73 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63 20 29 3b 0a  sMem.zMalloc );.
13c10 20 20 20 20 61 73 73 65 72 74 28 20 21 28 70 44      assert( !(pD
13c20 65 73 74 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  est->flags & MEM
13c30 5f 44 79 6e 29 20 29 3b 0a 20 20 20 20 61 73 73  _Dyn) );.    ass
13c40 65 72 74 28 20 21 28 70 44 65 73 74 2d 3e 66 6c  ert( !(pDest->fl
13c50 61 67 73 20 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c  ags & (MEM_Blob|
13c60 4d 45 4d 5f 53 74 72 29 29 20 7c 7c 20 70 44 65  MEM_Str)) || pDe
13c70 73 74 2d 3e 7a 3d 3d 73 4d 65 6d 2e 7a 20 29 3b  st->z==sMem.z );
13c80 0a 20 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67  .    pDest->flag
13c90 73 20 26 3d 20 7e 28 4d 45 4d 5f 45 70 68 65 6d  s &= ~(MEM_Ephem
13ca0 7c 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20  |MEM_Static);.  
13cb0 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 7c    pDest->flags |
13cc0 3d 20 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  = MEM_Term;.    
13cd0 70 44 65 73 74 2d 3e 7a 20 3d 20 73 4d 65 6d 2e  pDest->z = sMem.
13ce0 7a 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 7a 4d  z;.    pDest->zM
13cf0 61 6c 6c 6f 63 20 3d 20 73 4d 65 6d 2e 7a 4d 61  alloc = sMem.zMa
13d00 6c 6c 6f 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  lloc;.  }..  rc 
13d10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
13d20 4d 61 6b 65 57 72 69 74 65 61 62 6c 65 28 70 44  MakeWriteable(pD
13d30 65 73 74 29 3b 0a 0a 6f 70 5f 63 6f 6c 75 6d 6e  est);..op_column
13d40 5f 6f 75 74 3a 0a 20 20 55 50 44 41 54 45 5f 4d  _out:.  UPDATE_M
13d50 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 44 65 73  AX_BLOBSIZE(pDes
13d60 74 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54  t);.  REGISTER_T
13d70 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 44  RACE(pOp->p3, pD
13d80 65 73 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  est);.  break;.}
13d90 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 66 66  ../* Opcode: Aff
13da0 69 6e 69 74 79 20 50 31 20 50 32 20 2a 20 50 34  inity P1 P2 * P4
13db0 20 2a 0a 2a 2a 0a 2a 2a 20 41 70 70 6c 79 20 61   *.**.** Apply a
13dc0 66 66 69 6e 69 74 69 65 73 20 74 6f 20 61 20 72  ffinities to a r
13dd0 61 6e 67 65 20 6f 66 20 50 32 20 72 65 67 69 73  ange of P2 regis
13de0 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69  ters starting wi
13df0 74 68 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20  th P1..**.** P4 
13e00 69 73 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  is a string that
13e10 20 69 73 20 50 32 20 63 68 61 72 61 63 74 65 72   is P2 character
13e20 73 20 6c 6f 6e 67 2e 20 54 68 65 20 6e 74 68 20  s long. The nth 
13e30 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
13e40 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 64 69 63  .** string indic
13e50 61 74 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  ates the column 
13e60 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
13e70 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
13e80 20 74 68 65 20 6e 74 68 0a 2a 2a 20 6d 65 6d 6f   the nth.** memo
13e90 72 79 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 72  ry cell in the r
13ea0 61 6e 67 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ange..*/.case OP
13eb0 5f 41 66 66 69 6e 69 74 79 3a 20 7b 0a 20 20 63  _Affinity: {.  c
13ec0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 66 66 69  onst char *zAffi
13ed0 6e 69 74 79 3b 20 20 20 2f 2a 20 54 68 65 20 61  nity;   /* The a
13ee0 66 66 69 6e 69 74 79 20 74 6f 20 62 65 20 61 70  ffinity to be ap
13ef0 70 6c 69 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  plied */.  char 
13f00 63 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  cAff;           
13f10 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
13f20 63 68 61 72 61 63 74 65 72 20 6f 66 20 61 66 66  character of aff
13f30 69 6e 69 74 79 20 2a 2f 0a 0a 20 20 7a 41 66 66  inity */..  zAff
13f40 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34 2e  inity = pOp->p4.
13f50 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66  z;.  assert( zAf
13f60 66 69 6e 69 74 79 21 3d 30 20 29 3b 0a 20 20 61  finity!=0 );.  a
13f70 73 73 65 72 74 28 20 7a 41 66 66 69 6e 69 74 79  ssert( zAffinity
13f80 5b 70 4f 70 2d 3e 70 32 5d 3d 3d 30 20 29 3b 0a  [pOp->p2]==0 );.
13f90 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
13fa0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 77 68 69 6c 65  Op->p1];.  while
13fb0 28 20 28 63 41 66 66 20 3d 20 2a 28 7a 41 66 66  ( (cAff = *(zAff
13fc0 69 6e 69 74 79 2b 2b 29 29 21 3d 30 20 29 7b 0a  inity++))!=0 ){.
13fd0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 31      assert( pIn1
13fe0 20 3c 3d 20 26 70 2d 3e 61 4d 65 6d 5b 28 70 2d   <= &p->aMem[(p-
13ff0 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f 72  >nMem-p->nCursor
14000 29 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  )] );.    assert
14010 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e  ( memIsValid(pIn
14020 31 29 20 29 3b 0a 20 20 20 20 45 78 70 61 6e 64  1) );.    Expand
14030 42 6c 6f 62 28 70 49 6e 31 29 3b 0a 20 20 20 20  Blob(pIn1);.    
14040 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49  applyAffinity(pI
14050 6e 31 2c 20 63 41 66 66 2c 20 65 6e 63 6f 64 69  n1, cAff, encodi
14060 6e 67 29 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b  ng);.    pIn1++;
14070 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
14080 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 61 6b 65  ./* Opcode: Make
14090 52 65 63 6f 72 64 20 50 31 20 50 32 20 50 33 20  Record P1 P2 P3 
140a0 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76 65  P4 *.**.** Conve
140b0 72 74 20 50 32 20 72 65 67 69 73 74 65 72 73 20  rt P2 registers 
140c0 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 50  beginning with P
140d0 31 20 69 6e 74 6f 20 74 68 65 20 5b 72 65 63 6f  1 into the [reco
140e0 72 64 20 66 6f 72 6d 61 74 5d 0a 2a 2a 20 75 73  rd format].** us
140f0 65 20 61 73 20 61 20 64 61 74 61 20 72 65 63 6f  e as a data reco
14100 72 64 20 69 6e 20 61 20 64 61 74 61 62 61 73 65  rd in a database
14110 20 74 61 62 6c 65 20 6f 72 20 61 73 20 61 20 6b   table or as a k
14120 65 79 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e 64 65  ey.** in an inde
14130 78 2e 20 20 54 68 65 20 4f 50 5f 43 6f 6c 75 6d  x.  The OP_Colum
14140 6e 20 6f 70 63 6f 64 65 20 63 61 6e 20 64 65 63  n opcode can dec
14150 6f 64 65 20 74 68 65 20 72 65 63 6f 72 64 20 6c  ode the record l
14160 61 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 6d  ater..**.** P4 m
14170 61 79 20 62 65 20 61 20 73 74 72 69 6e 67 20 74  ay be a string t
14180 68 61 74 20 69 73 20 50 32 20 63 68 61 72 61 63  hat is P2 charac
14190 74 65 72 73 20 6c 6f 6e 67 2e 20 20 54 68 65 20  ters long.  The 
141a0 6e 74 68 20 63 68 61 72 61 63 74 65 72 20 6f 66  nth character of
141b0 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20 69   the.** string i
141c0 6e 64 69 63 61 74 65 73 20 74 68 65 20 63 6f 6c  ndicates the col
141d0 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 74 68 61  umn affinity tha
141e0 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
141f0 20 66 6f 72 20 74 68 65 20 6e 74 68 0a 2a 2a 20   for the nth.** 
14200 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64  field of the ind
14210 65 78 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  ex key..**.** Th
14220 65 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 63  e mapping from c
14230 68 61 72 61 63 74 65 72 20 74 6f 20 61 66 66 69  haracter to affi
14240 6e 69 74 79 20 69 73 20 67 69 76 65 6e 20 62 79  nity is given by
14250 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f   the SQLITE_AFF_
14260 0a 2a 2a 20 6d 61 63 72 6f 73 20 64 65 66 69 6e  .** macros defin
14270 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
14280 68 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69  h..**.** If P4 i
14290 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 20  s NULL then all 
142a0 69 6e 64 65 78 20 66 69 65 6c 64 73 20 68 61 76  index fields hav
142b0 65 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 4e  e the affinity N
142c0 4f 4e 45 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ONE..*/.case OP_
142d0 4d 61 6b 65 52 65 63 6f 72 64 3a 20 7b 0a 20 20  MakeRecord: {.  
142e0 75 38 20 2a 7a 4e 65 77 52 65 63 6f 72 64 3b 20  u8 *zNewRecord; 
142f0 20 20 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66         /* A buff
14300 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 64  er to hold the d
14310 61 74 61 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ata for the new 
14320 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65 6d 20  record */.  Mem 
14330 2a 70 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  *pRec;          
14340 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 65     /* The new re
14350 63 6f 72 64 20 2a 2f 0a 20 20 75 36 34 20 6e 44  cord */.  u64 nD
14360 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
14370 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
14380 74 65 73 20 6f 66 20 64 61 74 61 20 73 70 61 63  tes of data spac
14390 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 64 72 3b  e */.  int nHdr;
143a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
143b0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
143c0 20 6f 66 20 68 65 61 64 65 72 20 73 70 61 63 65   of header space
143d0 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74 65 3b   */.  i64 nByte;
143e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
143f0 44 61 74 61 20 73 70 61 63 65 20 72 65 71 75 69  Data space requi
14400 72 65 64 20 66 6f 72 20 74 68 69 73 20 72 65 63  red for this rec
14410 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ord */.  int nZe
14420 72 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ro;             
14430 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a 65 72  /* Number of zer
14440 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65  o bytes at the e
14450 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  nd of the record
14460 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 69 6e   */.  int nVarin
14470 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
14480 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
14490 69 6e 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20  in a varint */. 
144a0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
144b0 3b 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20  ;       /* Type 
144c0 66 69 65 6c 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a  field */.  Mem *
144d0 70 44 61 74 61 30 3b 20 20 20 20 20 20 20 20 20  pData0;         
144e0 20 20 2f 2a 20 46 69 72 73 74 20 66 69 65 6c 64    /* First field
144f0 20 74 6f 20 62 65 20 63 6f 6d 62 69 6e 65 64 20   to be combined 
14500 69 6e 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20  into the record 
14510 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4c 61 73 74 3b  */.  Mem *pLast;
14520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
14530 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ast field of the
14540 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
14550 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20   nField;        
14560 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
14570 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 72   fields in the r
14580 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20  ecord */.  char 
14590 2a 7a 41 66 66 69 6e 69 74 79 3b 20 20 20 20 20  *zAffinity;     
145a0 20 20 2f 2a 20 54 68 65 20 61 66 66 69 6e 69 74    /* The affinit
145b0 79 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  y string for the
145c0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
145d0 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3b 20 20 20   file_format;   
145e0 20 20 20 20 2f 2a 20 46 69 6c 65 20 66 6f 72 6d      /* File form
145f0 61 74 20 74 6f 20 75 73 65 20 66 6f 72 20 65 6e  at to use for en
14600 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  coding */.  int 
14610 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
14620 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73 65 64     /* Space used
14630 20 69 6e 20 7a 4e 65 77 52 65 63 6f 72 64 5b 5d   in zNewRecord[]
14640 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 20   */.  int len;  
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14660 4c 65 6e 67 74 68 20 6f 66 20 61 20 66 69 65 6c  Length of a fiel
14670 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 73 73 75 6d  d */..  /* Assum
14680 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 63  ing the record c
14690 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c 64 73  ontains N fields
146a0 2c 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72  , the record for
146b0 6d 61 74 20 6c 6f 6f 6b 73 0a 20 20 2a 2a 20 6c  mat looks.  ** l
146c0 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
146d0 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ** ------------
146e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
146f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a  ------------.  *
14720 2a 20 7c 20 68 64 72 2d 73 69 7a 65 20 7c 20 74  * | hdr-size | t
14730 79 70 65 20 30 20 7c 20 74 79 70 65 20 31 20 7c  ype 0 | type 1 |
14740 20 2e 2e 2e 20 7c 20 74 79 70 65 20 4e 2d 31 20   ... | type N-1 
14750 7c 20 64 61 74 61 30 20 7c 20 2e 2e 2e 20 7c 20  | data0 | ... | 
14760 64 61 74 61 20 4e 2d 31 20 7c 20 0a 20 20 2a 2a  data N-1 | .  **
14770 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
14780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
147a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
147b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 0a 20  ---------.  **. 
147c0 20 2a 2a 20 44 61 74 61 28 30 29 20 69 73 20 74   ** Data(0) is t
147d0 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69 73 74  aken from regist
147e0 65 72 20 50 31 2e 20 20 44 61 74 61 28 31 29 20  er P1.  Data(1) 
147f0 63 6f 6d 65 73 20 66 72 6f 6d 20 72 65 67 69 73  comes from regis
14800 74 65 72 20 50 31 2b 31 0a 20 20 2a 2a 20 61 6e  ter P1+1.  ** an
14810 64 20 73 6f 20 66 72 6f 74 68 2e 0a 20 20 2a 2a  d so froth..  **
14820 0a 20 20 2a 2a 20 45 61 63 68 20 74 79 70 65 20  .  ** Each type 
14830 66 69 65 6c 64 20 69 73 20 61 20 76 61 72 69 6e  field is a varin
14840 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  t representing t
14850 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f  he serial type o
14860 66 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 72 72  f the .  ** corr
14870 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 20 65  esponding data e
14880 6c 65 6d 65 6e 74 20 28 73 65 65 20 73 71 6c 69  lement (see sqli
14890 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
148a0 65 28 29 29 2e 20 54 68 65 0a 20 20 2a 2a 20 68  e()). The.  ** h
148b0 64 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73  dr-size field is
148c0 20 61 6c 73 6f 20 61 20 76 61 72 69 6e 74 20 77   also a varint w
148d0 68 69 63 68 20 69 73 20 74 68 65 20 6f 66 66 73  hich is the offs
148e0 65 74 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  et from the begi
148f0 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74 68  nning.  ** of th
14900 65 20 72 65 63 6f 72 64 20 74 6f 20 64 61 74 61  e record to data
14910 30 2e 0a 20 20 2a 2f 0a 20 20 6e 44 61 74 61 20  0..  */.  nData 
14920 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
14930 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
14940 6f 66 20 64 61 74 61 20 73 70 61 63 65 20 2a 2f  of data space */
14950 0a 20 20 6e 48 64 72 20 3d 20 30 3b 20 20 20 20  .  nHdr = 0;    
14960 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14970 6f 66 20 62 79 74 65 73 20 6f 66 20 68 65 61 64  of bytes of head
14980 65 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 6e 5a  er space */.  nZ
14990 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ero = 0;        
149a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a 65   /* Number of ze
149b0 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20  ro bytes at the 
149c0 65 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72  end of the recor
149d0 64 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20  d */.  nField = 
149e0 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 41 66 66 69  pOp->p1;.  zAffi
149f0 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  nity = pOp->p4.z
14a00 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69 65  ;.  assert( nFie
14a10 6c 64 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 3e  ld>0 && pOp->p2>
14a20 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 6e 46 69  0 && pOp->p2+nFi
14a30 65 6c 64 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d 70 2d  eld<=(p->nMem-p-
14a40 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20  >nCursor)+1 );. 
14a50 20 70 44 61 74 61 30 20 3d 20 26 61 4d 65 6d 5b   pData0 = &aMem[
14a60 6e 46 69 65 6c 64 5d 3b 0a 20 20 6e 46 69 65 6c  nField];.  nFiel
14a70 64 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 70  d = pOp->p2;.  p
14a80 4c 61 73 74 20 3d 20 26 70 44 61 74 61 30 5b 6e  Last = &pData0[n
14a90 46 69 65 6c 64 2d 31 5d 3b 0a 20 20 66 69 6c 65  Field-1];.  file
14aa0 5f 66 6f 72 6d 61 74 20 3d 20 70 2d 3e 6d 69 6e  _format = p->min
14ab0 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 3b  WriteFileFormat;
14ac0 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
14ad0 74 68 65 20 6f 75 74 70 75 74 20 72 65 67 69 73  the output regis
14ae0 74 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ter */.  assert(
14af0 20 70 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e 70 31   pOp->p3<pOp->p1
14b00 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70 4f 70   || pOp->p3>=pOp
14b10 2d 3e 70 31 2b 70 4f 70 2d 3e 70 32 20 29 3b 0a  ->p1+pOp->p2 );.
14b20 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
14b30 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41 62  Op->p3];.  memAb
14b40 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70  outToChange(p, p
14b50 4f 75 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  Out);..  /* Loop
14b60 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 6c 65   through the ele
14b70 6d 65 6e 74 73 20 74 68 61 74 20 77 69 6c 6c 20  ments that will 
14b80 6d 61 6b 65 20 75 70 20 74 68 65 20 72 65 63 6f  make up the reco
14b90 72 64 20 74 6f 20 66 69 67 75 72 65 0a 20 20 2a  rd to figure.  *
14ba0 2a 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73  * out how much s
14bb0 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64  pace is required
14bc0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 72 65 63   for the new rec
14bd0 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ord..  */.  for(
14be0 70 52 65 63 3d 70 44 61 74 61 30 3b 20 70 52 65  pRec=pData0; pRe
14bf0 63 3c 3d 70 4c 61 73 74 3b 20 70 52 65 63 2b 2b  c<=pLast; pRec++
14c00 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  ){.    assert( m
14c10 65 6d 49 73 56 61 6c 69 64 28 70 52 65 63 29 20  emIsValid(pRec) 
14c20 29 3b 0a 20 20 20 20 69 66 28 20 7a 41 66 66 69  );.    if( zAffi
14c30 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 61 70  nity ){.      ap
14c40 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 63  plyAffinity(pRec
14c50 2c 20 7a 41 66 66 69 6e 69 74 79 5b 70 52 65 63  , zAffinity[pRec
14c60 2d 70 44 61 74 61 30 5d 2c 20 65 6e 63 6f 64 69  -pData0], encodi
14c70 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ng);.    }.    i
14c80 66 28 20 70 52 65 63 2d 3e 66 6c 61 67 73 26 4d  f( pRec->flags&M
14c90 45 4d 5f 5a 65 72 6f 20 26 26 20 70 52 65 63 2d  EM_Zero && pRec-
14ca0 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71  >n>0 ){.      sq
14cb0 6c 69 74 65 33 56 64 62 65 4d 65 6d 45 78 70 61  lite3VdbeMemExpa
14cc0 6e 64 42 6c 6f 62 28 70 52 65 63 29 3b 0a 20 20  ndBlob(pRec);.  
14cd0 20 20 7d 0a 20 20 20 20 73 65 72 69 61 6c 5f 74    }.    serial_t
14ce0 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ype = sqlite3Vdb
14cf0 65 53 65 72 69 61 6c 54 79 70 65 28 70 52 65 63  eSerialType(pRec
14d00 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a  , file_format);.
14d10 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65      len = sqlite
14d20 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
14d30 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
14d40 0a 20 20 20 20 6e 44 61 74 61 20 2b 3d 20 6c 65  .    nData += le
14d50 6e 3b 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20 73  n;.    nHdr += s
14d60 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28  qlite3VarintLen(
14d70 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
14d80 20 20 69 66 28 20 70 52 65 63 2d 3e 66 6c 61 67    if( pRec->flag
14d90 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
14da0 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70 75        /* Only pu
14db0 72 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42  re zero-filled B
14dc0 4c 4f 42 73 20 63 61 6e 20 62 65 20 69 6e 70 75  LOBs can be inpu
14dd0 74 20 74 6f 20 74 68 69 73 20 4f 70 63 6f 64 65  t to this Opcode
14de0 2e 0a 20 20 20 20 20 20 2a 2a 20 57 65 20 64 6f  ..      ** We do
14df0 20 6e 6f 74 20 61 6c 6c 6f 77 20 62 6c 6f 62 73   not allow blobs
14e00 20 77 69 74 68 20 61 20 70 72 65 66 69 78 20 61   with a prefix a
14e10 6e 64 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  nd a zero-filled
14e20 20 74 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   tail. */.      
14e30 6e 5a 65 72 6f 20 2b 3d 20 70 52 65 63 2d 3e 75  nZero += pRec->u
14e40 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 65 6c 73  .nZero;.    }els
14e50 65 20 69 66 28 20 6c 65 6e 20 29 7b 0a 20 20 20  e if( len ){.   
14e60 20 20 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20     nZero = 0;.  
14e70 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64    }.  }..  /* Ad
14e80 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 68 65  d the initial he
14e90 61 64 65 72 20 76 61 72 69 6e 74 20 61 6e 64 20  ader varint and 
14ea0 74 6f 74 61 6c 20 74 68 65 20 73 69 7a 65 20 2a  total the size *
14eb0 2f 0a 20 20 6e 48 64 72 20 2b 3d 20 6e 56 61 72  /.  nHdr += nVar
14ec0 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 61 72  int = sqlite3Var
14ed0 69 6e 74 4c 65 6e 28 6e 48 64 72 29 3b 0a 20 20  intLen(nHdr);.  
14ee0 69 66 28 20 6e 56 61 72 69 6e 74 3c 73 71 6c 69  if( nVarint<sqli
14ef0 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 6e 48 64  te3VarintLen(nHd
14f00 72 29 20 29 7b 0a 20 20 20 20 6e 48 64 72 2b 2b  r) ){.    nHdr++
14f10 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
14f20 6e 48 64 72 2b 6e 44 61 74 61 2d 6e 5a 65 72 6f  nHdr+nData-nZero
14f30 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 64 62  ;.  if( nByte>db
14f40 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
14f50 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b  LIMIT_LENGTH] ){
14f60 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69  .    goto too_bi
14f70 67 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  g;.  }..  /* Mak
14f80 65 20 73 75 72 65 20 74 68 65 20 6f 75 74 70 75  e sure the outpu
14f90 74 20 72 65 67 69 73 74 65 72 20 68 61 73 20 61  t register has a
14fa0 20 62 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e   buffer large en
14fb0 6f 75 67 68 20 74 6f 20 73 74 6f 72 65 20 0a 20  ough to store . 
14fc0 20 2a 2a 20 74 68 65 20 6e 65 77 20 72 65 63 6f   ** the new reco
14fd0 72 64 2e 20 54 68 65 20 6f 75 74 70 75 74 20 72  rd. The output r
14fe0 65 67 69 73 74 65 72 20 28 70 4f 70 2d 3e 70 33  egister (pOp->p3
14ff0 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  ) is not allowed
15000 20 74 6f 0a 20 20 2a 2a 20 62 65 20 6f 6e 65 20   to.  ** be one 
15010 6f 66 20 74 68 65 20 69 6e 70 75 74 20 72 65 67  of the input reg
15020 69 73 74 65 72 73 20 28 62 65 63 61 75 73 65 20  isters (because 
15030 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  the following ca
15040 6c 6c 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74  ll to.  ** sqlit
15050 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 29 20  e3VdbeMemGrow() 
15060 63 6f 75 6c 64 20 63 6c 6f 62 62 65 72 20 74 68  could clobber th
15070 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 69  e value before i
15080 74 20 69 73 20 75 73 65 64 29 2e 0a 20 20 2a 2f  t is used)..  */
15090 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  .  if( sqlite3Vd
150a0 62 65 4d 65 6d 47 72 6f 77 28 70 4f 75 74 2c 20  beMemGrow(pOut, 
150b0 28 69 6e 74 29 6e 42 79 74 65 2c 20 30 29 20 29  (int)nByte, 0) )
150c0 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65  {.    goto no_me
150d0 6d 3b 0a 20 20 7d 0a 20 20 7a 4e 65 77 52 65 63  m;.  }.  zNewRec
150e0 6f 72 64 20 3d 20 28 75 38 20 2a 29 70 4f 75 74  ord = (u8 *)pOut
150f0 2d 3e 7a 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  ->z;..  /* Write
15100 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20   the record */. 
15110 20 69 20 3d 20 70 75 74 56 61 72 69 6e 74 33 32   i = putVarint32
15120 28 7a 4e 65 77 52 65 63 6f 72 64 2c 20 6e 48 64  (zNewRecord, nHd
15130 72 29 3b 0a 20 20 66 6f 72 28 70 52 65 63 3d 70  r);.  for(pRec=p
15140 44 61 74 61 30 3b 20 70 52 65 63 3c 3d 70 4c 61  Data0; pRec<=pLa
15150 73 74 3b 20 70 52 65 63 2b 2b 29 7b 0a 20 20 20  st; pRec++){.   
15160 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73   serial_type = s
15170 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15180 54 79 70 65 28 70 52 65 63 2c 20 66 69 6c 65 5f  Type(pRec, file_
15190 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 69 20 2b  format);.    i +
151a0 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 7a  = putVarint32(&z
151b0 4e 65 77 52 65 63 6f 72 64 5b 69 5d 2c 20 73 65  NewRecord[i], se
151c0 72 69 61 6c 5f 74 79 70 65 29 3b 20 20 20 20 20  rial_type);     
151d0 20 2f 2a 20 73 65 72 69 61 6c 20 74 79 70 65 20   /* serial type 
151e0 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 70 52 65  */.  }.  for(pRe
151f0 63 3d 70 44 61 74 61 30 3b 20 70 52 65 63 3c 3d  c=pData0; pRec<=
15200 70 4c 61 73 74 3b 20 70 52 65 63 2b 2b 29 7b 20  pLast; pRec++){ 
15210 20 2f 2a 20 73 65 72 69 61 6c 20 64 61 74 61 20   /* serial data 
15220 2a 2f 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69  */.    i += sqli
15230 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
15240 28 26 7a 4e 65 77 52 65 63 6f 72 64 5b 69 5d 2c  (&zNewRecord[i],
15250 20 28 69 6e 74 29 28 6e 42 79 74 65 2d 69 29 2c   (int)(nByte-i),
15260 20 70 52 65 63 2c 66 69 6c 65 5f 66 6f 72 6d 61   pRec,file_forma
15270 74 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  t);.  }.  assert
15280 28 20 69 3d 3d 6e 42 79 74 65 20 29 3b 0a 0a 20  ( i==nByte );.. 
15290 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
152a0 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28  >0 && pOp->p3<=(
152b0 70 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73  p->nMem-p->nCurs
152c0 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 6e  or) );.  pOut->n
152d0 20 3d 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a 20   = (int)nByte;. 
152e0 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
152f0 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 44 79  EM_Blob | MEM_Dy
15300 6e 3b 0a 20 20 70 4f 75 74 2d 3e 78 44 65 6c 20  n;.  pOut->xDel 
15310 3d 20 30 3b 0a 20 20 69 66 28 20 6e 5a 65 72 6f  = 0;.  if( nZero
15320 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e   ){.    pOut->u.
15330 6e 5a 65 72 6f 20 3d 20 6e 5a 65 72 6f 3b 0a 20  nZero = nZero;. 
15340 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c     pOut->flags |
15350 3d 20 4d 45 4d 5f 5a 65 72 6f 3b 0a 20 20 7d 0a  = MEM_Zero;.  }.
15360 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 53 51    pOut->enc = SQ
15370 4c 49 54 45 5f 55 54 46 38 3b 20 20 2f 2a 20 49  LITE_UTF8;  /* I
15380 6e 20 63 61 73 65 20 74 68 65 20 62 6c 6f 62 20  n case the blob 
15390 69 73 20 65 76 65 72 20 63 6f 6e 76 65 72 74 65  is ever converte
153a0 64 20 74 6f 20 74 65 78 74 20 2a 2f 0a 20 20 52  d to text */.  R
153b0 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
153c0 70 2d 3e 70 33 2c 20 70 4f 75 74 29 3b 0a 20 20  p->p3, pOut);.  
153d0 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
153e0 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65  IZE(pOut);.  bre
153f0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
15400 3a 20 43 6f 75 6e 74 20 50 31 20 50 32 20 2a 20  : Count P1 P2 * 
15410 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20  * *.**.** Store 
15420 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
15430 74 72 69 65 73 20 28 61 6e 20 69 6e 74 65 67 65  tries (an intege
15440 72 20 76 61 6c 75 65 29 20 69 6e 20 74 68 65 20  r value) in the 
15450 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 0a  table or index .
15460 2a 2a 20 6f 70 65 6e 65 64 20 62 79 20 63 75 72  ** opened by cur
15470 73 6f 72 20 50 31 20 69 6e 20 72 65 67 69 73 74  sor P1 in regist
15480 65 72 20 50 32 0a 2a 2f 0a 23 69 66 6e 64 65 66  er P2.*/.#ifndef
15490 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
154a0 45 45 43 4f 55 4e 54 0a 63 61 73 65 20 4f 50 5f  EECOUNT.case OP_
154b0 43 6f 75 6e 74 3a 20 7b 20 20 20 20 20 20 20 20  Count: {        
154c0 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65   /* out2-prerele
154d0 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6e 45 6e  ase */.  i64 nEn
154e0 74 72 79 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  try;.  BtCursor 
154f0 2a 70 43 72 73 72 3b 0a 0a 20 20 70 43 72 73 72  *pCrsr;..  pCrsr
15500 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
15510 3e 70 31 5d 2d 3e 70 43 75 72 73 6f 72 3b 0a 20  >p1]->pCursor;. 
15520 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 72 73   if( ALWAYS(pCrs
15530 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  r) ){.    rc = s
15540 71 6c 69 74 65 33 42 74 72 65 65 43 6f 75 6e 74  qlite3BtreeCount
15550 28 70 43 72 73 72 2c 20 26 6e 45 6e 74 72 79 29  (pCrsr, &nEntry)
15560 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
15570 45 6e 74 72 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  Entry = 0;.  }. 
15580 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 6e 45 6e   pOut->u.i = nEn
15590 74 72 79 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  try;.  break;.}.
155a0 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64  #endif../* Opcod
155b0 65 3a 20 53 61 76 65 70 6f 69 6e 74 20 50 31 20  e: Savepoint P1 
155c0 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 4f  * * P4 *.**.** O
155d0 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
155e0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 61 76  rollback the sav
155f0 65 70 6f 69 6e 74 20 6e 61 6d 65 64 20 62 79 20  epoint named by 
15600 70 61 72 61 6d 65 74 65 72 20 50 34 2c 20 64 65  parameter P4, de
15610 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68  pending.** on th
15620 65 20 76 61 6c 75 65 20 6f 66 20 50 31 2e 20 54  e value of P1. T
15630 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 73 61 76  o open a new sav
15640 65 70 6f 69 6e 74 2c 20 50 31 3d 3d 30 2e 20 54  epoint, P1==0. T
15650 6f 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69  o release (commi
15660 74 29 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e  t) an.** existin
15670 67 20 73 61 76 65 70 6f 69 6e 74 2c 20 50 31 3d  g savepoint, P1=
15680 3d 31 2c 20 6f 72 20 74 6f 20 72 6f 6c 6c 62 61  =1, or to rollba
15690 63 6b 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  ck an existing s
156a0 61 76 65 70 6f 69 6e 74 20 50 31 3d 3d 32 2e 0a  avepoint P1==2..
156b0 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 61 76 65 70  */.case OP_Savep
156c0 6f 69 6e 74 3a 20 7b 0a 20 20 69 6e 74 20 70 31  oint: {.  int p1
156d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
156e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
156f0 75 65 20 6f 66 20 50 31 20 6f 70 65 72 61 6e 64  ue of P1 operand
15700 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
15710 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
15720 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
15730 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
15740 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 53 61 76  int nName;.  Sav
15750 65 70 6f 69 6e 74 20 2a 70 4e 65 77 3b 0a 20 20  epoint *pNew;.  
15760 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
15770 70 6f 69 6e 74 3b 0a 20 20 53 61 76 65 70 6f 69  point;.  Savepoi
15780 6e 74 20 2a 70 54 6d 70 3b 0a 20 20 69 6e 74 20  nt *pTmp;.  int 
15790 69 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 69 6e  iSavepoint;.  in
157a0 74 20 69 69 3b 0a 0a 20 20 70 31 20 3d 20 70 4f  t ii;..  p1 = pO
157b0 70 2d 3e 70 31 3b 0a 20 20 7a 4e 61 6d 65 20 3d  p->p1;.  zName =
157c0 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 0a 20 20 2f   pOp->p4.z;..  /
157d0 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
157e0 65 20 70 31 20 70 61 72 61 6d 65 74 65 72 20 69  e p1 parameter i
157f0 73 20 76 61 6c 69 64 2e 20 41 6c 73 6f 20 74 68  s valid. Also th
15800 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  at if there is n
15810 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 74 72 61 6e  o open.  ** tran
15820 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68  saction, then th
15830 65 72 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e  ere cannot be an
15840 79 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 0a 20  y savepoints. . 
15850 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62   */.  assert( db
15860 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20  ->pSavepoint==0 
15870 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  || db->autoCommi
15880 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t==0 );.  assert
15890 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( p1==SAVEPOINT_
158a0 42 45 47 49 4e 7c 7c 70 31 3d 3d 53 41 56 45 50  BEGIN||p1==SAVEP
158b0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 7c 7c 70 31  OINT_RELEASE||p1
158c0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
158d0 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  BACK );.  assert
158e0 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  ( db->pSavepoint
158f0 20 7c 7c 20 64 62 2d 3e 69 73 54 72 61 6e 73 61   || db->isTransa
15900 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 3d 3d  ctionSavepoint==
15910 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  0 );.  assert( c
15920 68 65 63 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75  heckSavepointCou
15930 6e 74 28 64 62 29 20 29 3b 0a 20 20 61 73 73 65  nt(db) );.  asse
15940 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  rt( p->bIsReader
15950 20 29 3b 0a 0a 20 20 69 66 28 20 70 31 3d 3d 53   );..  if( p1==S
15960 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 29  AVEPOINT_BEGIN )
15970 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56  {.    if( db->nV
15980 64 62 65 57 72 69 74 65 3e 30 20 29 7b 0a 20 20  dbeWrite>0 ){.  
15990 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 61 76      /* A new sav
159a0 65 70 6f 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  epoint cannot be
159b0 20 63 72 65 61 74 65 64 20 69 66 20 74 68 65 72   created if ther
159c0 65 20 61 72 65 20 61 63 74 69 76 65 20 77 72 69  e are active wri
159d0 74 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  te .      ** sta
159e0 74 65 6d 65 6e 74 73 20 28 69 2e 65 2e 20 6f 70  tements (i.e. op
159f0 65 6e 20 72 65 61 64 2f 77 72 69 74 65 20 69 6e  en read/write in
15a00 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 68  cremental blob h
15a10 61 6e 64 6c 65 73 29 2e 0a 20 20 20 20 20 20 2a  andles)..      *
15a20 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
15a30 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
15a40 72 4d 73 67 2c 20 64 62 2c 20 22 63 61 6e 6e 6f  rMsg, db, "canno
15a50 74 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  t open savepoint
15a60 20 2d 20 22 0a 20 20 20 20 20 20 20 20 22 53 51   - ".        "SQ
15a70 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  L statements in 
15a80 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20 20 20  progress");.    
15a90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
15aa0 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  SY;.    }else{. 
15ab0 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c       nName = sql
15ac0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
15ad0 6d 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  me);..#ifndef SQ
15ae0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
15af0 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20  LTABLE.      /* 
15b00 54 68 69 73 20 63 61 6c 6c 20 69 73 20 4f 6b 20  This call is Ok 
15b10 65 76 65 6e 20 69 66 20 74 68 69 73 20 73 61 76  even if this sav
15b20 65 70 6f 69 6e 74 20 69 73 20 61 63 74 75 61 6c  epoint is actual
15b30 6c 79 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ly a transaction
15b40 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 65 70 6f  .      ** savepo
15b50 69 6e 74 20 28 61 6e 64 20 74 68 65 72 65 66 6f  int (and therefo
15b60 72 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 70 72  re should not pr
15b70 6f 6d 70 74 20 78 53 61 76 65 70 6f 69 6e 74 28  ompt xSavepoint(
15b80 29 29 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20  )) callbacks..  
15b90 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
15ba0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
15bb0 73 61 76 65 70 6f 69 6e 74 20 62 65 69 6e 67 20  savepoint being 
15bc0 6f 70 65 6e 65 64 2c 20 69 74 20 69 73 20 67 75  opened, it is gu
15bd0 61 72 61 6e 74 65 65 64 0a 20 20 20 20 20 20 2a  aranteed.      *
15be0 2a 20 74 68 61 74 20 74 68 65 20 64 62 2d 3e 61  * that the db->a
15bf0 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 20 69  VTrans[] array i
15c00 73 20 65 6d 70 74 79 2e 20 20 2a 2f 0a 20 20 20  s empty.  */.   
15c10 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
15c20 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20  utoCommit==0 || 
15c30 64 62 2d 3e 6e 56 54 72 61 6e 73 3d 3d 30 20 29  db->nVTrans==0 )
15c40 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
15c50 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
15c60 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
15c70 42 45 47 49 4e 2c 0a 20 20 20 20 20 20 20 20 20  BEGIN,.         
15c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c90 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74         db->nStat
15ca0 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70  ement+db->nSavep
15cb0 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  oint);.      if(
15cc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15cd0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
15ce0 74 6f 5f 65 72 72 6f 72 3b 0a 23 65 6e 64 69 66  to_error;.#endif
15cf0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  ..      /* Creat
15d00 65 20 61 20 6e 65 77 20 73 61 76 65 70 6f 69 6e  e a new savepoin
15d10 74 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  t structure. */.
15d20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
15d30 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
15d40 64 62 2c 20 73 69 7a 65 6f 66 28 53 61 76 65 70  db, sizeof(Savep
15d50 6f 69 6e 74 29 2b 6e 4e 61 6d 65 2b 31 29 3b 0a  oint)+nName+1);.
15d60 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
15d70 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
15d80 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29  zName = (char *)
15d90 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20  &pNew[1];.      
15da0 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a    memcpy(pNew->z
15db0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Name, zName, nNa
15dc0 6d 65 2b 31 29 3b 0a 20 20 20 20 0a 20 20 20 20  me+1);.    .    
15dd0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
15de0 69 73 20 6e 6f 20 6f 70 65 6e 20 74 72 61 6e 73  is no open trans
15df0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6d 61 72  action, then mar
15e00 6b 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63  k this as a spec
15e10 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  ial.        ** "
15e20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
15e30 70 6f 69 6e 74 22 2e 20 2a 2f 0a 20 20 20 20 20  point". */.     
15e40 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43     if( db->autoC
15e50 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  ommit ){.       
15e60 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
15e70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
15e80 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69   db->isTransacti
15e90 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 31 3b  onSavepoint = 1;
15ea0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
15eb0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53            db->nS
15ec0 61 76 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20  avepoint++;.    
15ed0 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20      }.    .     
15ee0 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e     /* Link the n
15ef0 65 77 20 73 61 76 65 70 6f 69 6e 74 20 69 6e 74  ew savepoint int
15f00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  o the database h
15f10 61 6e 64 6c 65 27 73 20 6c 69 73 74 2e 20 2a 2f  andle's list. */
15f20 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
15f30 4e 65 78 74 20 3d 20 64 62 2d 3e 70 53 61 76 65  Next = db->pSave
15f40 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 64  point;.        d
15f50 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20  b->pSavepoint = 
15f60 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4e  pNew;.        pN
15f70 65 77 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  ew->nDeferredCon
15f80 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72 65  s = db->nDeferre
15f90 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 20 20 70  dCons;.        p
15fa0 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d  New->nDeferredIm
15fb0 6d 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66  mCons = db->nDef
15fc0 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a 20 20  erredImmCons;.  
15fd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
15fe0 6c 73 65 7b 0a 20 20 20 20 69 53 61 76 65 70 6f  lse{.    iSavepo
15ff0 69 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  int = 0;..    /*
16000 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 64 20   Find the named 
16010 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 74 68  savepoint. If th
16020 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 73  ere is no such s
16030 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  avepoint, then a
16040 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f  n.    ** an erro
16050 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  r is returned to
16060 20 74 68 65 20 75 73 65 72 2e 20 20 2a 2f 0a 20   the user.  */. 
16070 20 20 20 66 6f 72 28 0a 20 20 20 20 20 20 70 53     for(.      pS
16080 61 76 65 70 6f 69 6e 74 20 3d 20 64 62 2d 3e 70  avepoint = db->p
16090 53 61 76 65 70 6f 69 6e 74 3b 20 0a 20 20 20 20  Savepoint; .    
160a0 20 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20    pSavepoint && 
160b0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
160c0 53 61 76 65 70 6f 69 6e 74 2d 3e 7a 4e 61 6d 65  Savepoint->zName
160d0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
160e0 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 53 61  pSavepoint = pSa
160f0 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 0a 20  vepoint->pNext. 
16100 20 20 20 29 7b 0a 20 20 20 20 20 20 69 53 61 76     ){.      iSav
16110 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a  epoint++;.    }.
16120 20 20 20 20 69 66 28 20 21 70 53 61 76 65 70 6f      if( !pSavepo
16130 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  int ){.      sql
16140 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
16150 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
16160 6e 6f 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e  no such savepoin
16170 74 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  t: %s", zName);.
16180 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16190 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  E_ERROR;.    }el
161a0 73 65 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65  se if( db->nVdbe
161b0 57 72 69 74 65 3e 30 20 26 26 20 70 31 3d 3d 53  Write>0 && p1==S
161c0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
161d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20   ){.      /* It 
161e0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
161f0 74 6f 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d  to release (comm
16200 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e 74 20  it) a savepoint 
16210 69 66 20 74 68 65 72 65 20 61 72 65 20 0a 20 20  if there are .  
16220 20 20 20 20 2a 2a 20 61 63 74 69 76 65 20 77 72      ** active wr
16230 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ite statements..
16240 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
16250 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
16260 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
16270 20 0a 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f   .        "canno
16280 74 20 72 65 6c 65 61 73 65 20 73 61 76 65 70 6f  t release savepo
16290 69 6e 74 20 2d 20 53 51 4c 20 73 74 61 74 65 6d  int - SQL statem
162a0 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73  ents in progress
162b0 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ".      );.     
162c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
162d0 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 0a 20  Y;.    }else{.. 
162e0 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e       /* Determin
162f0 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
16300 20 74 68 69 73 20 69 73 20 61 20 74 72 61 6e 73   this is a trans
16310 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
16320 2e 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 2a  . If so,.      *
16330 2a 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20  * and this is a 
16340 52 45 4c 45 41 53 45 20 63 6f 6d 6d 61 6e 64 2c  RELEASE command,
16350 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   then the curren
16360 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  t transaction . 
16370 20 20 20 20 20 2a 2a 20 69 73 20 63 6f 6d 6d 69       ** is commi
16380 74 74 65 64 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  tted. .      */.
16390 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 61 6e        int isTran
163a0 73 61 63 74 69 6f 6e 20 3d 20 70 53 61 76 65 70  saction = pSavep
163b0 6f 69 6e 74 2d 3e 70 4e 65 78 74 3d 3d 30 20 26  oint->pNext==0 &
163c0 26 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74  & db->isTransact
163d0 69 6f 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20  ionSavepoint;.  
163e0 20 20 20 20 69 66 28 20 69 73 54 72 61 6e 73 61      if( isTransa
163f0 63 74 69 6f 6e 20 26 26 20 70 31 3d 3d 53 41 56  ction && p1==SAV
16400 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29  EPOINT_RELEASE )
16410 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 72  {.        if( (r
16420 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
16430 68 65 63 6b 46 6b 28 70 2c 20 31 29 29 21 3d 53  heckFk(p, 1))!=S
16440 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16450 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f        goto vdbe_
16460 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
16470 7d 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  }.        db->au
16480 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
16490 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
164a0 33 56 64 62 65 48 61 6c 74 28 70 29 3d 3d 53 51  3VdbeHalt(p)==SQ
164b0 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
164c0 20 20 20 20 20 20 20 70 2d 3e 70 63 20 3d 20 70         p->pc = p
164d0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  c;.          db-
164e0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 30 3b  >autoCommit = 0;
164f0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
16500 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42   = rc = SQLITE_B
16510 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67  USY;.          g
16520 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b  oto vdbe_return;
16530 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16540 20 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63     db->isTransac
16550 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  tionSavepoint = 
16560 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
16570 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c  p->rc;.      }el
16580 73 65 7b 0a 20 20 20 20 20 20 20 20 69 53 61 76  se{.        iSav
16590 65 70 6f 69 6e 74 20 3d 20 64 62 2d 3e 6e 53 61  epoint = db->nSa
165a0 76 65 70 6f 69 6e 74 20 2d 20 69 53 61 76 65 70  vepoint - iSavep
165b0 6f 69 6e 74 20 2d 20 31 3b 0a 20 20 20 20 20 20  oint - 1;.      
165c0 20 20 69 66 28 20 70 31 3d 3d 53 41 56 45 50 4f    if( p1==SAVEPO
165d0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
165e0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69            for(ii
165f0 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20  =0; ii<db->nDb; 
16600 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ii++){.         
16610 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54     sqlite3BtreeT
16620 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 64 62  ripAllCursors(db
16630 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c 20 53  ->aDb[ii].pBt, S
16640 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20  QLITE_ABORT);.  
16650 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16660 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
16670 69 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62  ii=0; ii<db->nDb
16680 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
16690 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
166a0 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 64 62  treeSavepoint(db
166b0 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c 20 70  ->aDb[ii].pBt, p
166c0 31 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  1, iSavepoint);.
166d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
166e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
166f0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
16700 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
16710 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  or;.          }.
16720 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16730 20 20 69 66 28 20 70 31 3d 3d 53 41 56 45 50 4f    if( p1==SAVEPO
16740 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20  INT_ROLLBACK && 
16750 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  (db->flags&SQLIT
16760 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29  E_InternChanges)
16770 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
16780 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
16790 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
167a0 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
167b0 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53  sqlite3ResetAllS
167c0 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69  chemasOfConnecti
167d0 6f 6e 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  on(db);.        
167e0 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64    db->flags = (d
167f0 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54  b->flags | SQLIT
16800 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29  E_InternChanges)
16810 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16820 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
16830 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
16840 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61 20  ether this is a 
16850 52 45 4c 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42  RELEASE or ROLLB
16860 41 43 4b 2c 20 64 65 73 74 72 6f 79 20 61 6c 6c  ACK, destroy all
16870 20 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 65 70   .      ** savep
16880 6f 69 6e 74 73 20 6e 65 73 74 65 64 20 69 6e 73  oints nested ins
16890 69 64 65 20 6f 66 20 74 68 65 20 73 61 76 65 70  ide of the savep
168a0 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70 65 72 61  oint being opera
168b0 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  ted on. */.     
168c0 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76   while( db->pSav
168d0 65 70 6f 69 6e 74 21 3d 70 53 61 76 65 70 6f 69  epoint!=pSavepoi
168e0 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  nt ){.        pT
168f0 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f  mp = db->pSavepo
16900 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  int;.        db-
16910 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54  >pSavepoint = pT
16920 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  mp->pNext;.     
16930 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16940 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 20 20  (db, pTmp);.    
16950 20 20 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69      db->nSavepoi
16960 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  nt--;.      }.. 
16970 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73       /* If it is
16980 20 61 20 52 45 4c 45 41 53 45 2c 20 74 68 65 6e   a RELEASE, then
16990 20 64 65 73 74 72 6f 79 20 74 68 65 20 73 61 76   destroy the sav
169a0 65 70 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70 65  epoint being ope
169b0 72 61 74 65 64 20 6f 6e 20 0a 20 20 20 20 20 20  rated on .      
169c0 2a 2a 20 74 6f 6f 2e 20 49 66 20 69 74 20 69 73  ** too. If it is
169d0 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 2c 20   a ROLLBACK TO, 
169e0 74 68 65 6e 20 73 65 74 20 74 68 65 20 6e 75 6d  then set the num
169f0 62 65 72 20 6f 66 20 64 65 66 65 72 72 65 64 20  ber of deferred 
16a00 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  .      ** constr
16a10 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20  aint violations 
16a20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64  present in the d
16a30 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 20 76  atabase to the v
16a40 61 6c 75 65 20 73 74 6f 72 65 64 0a 20 20 20 20  alue stored.    
16a50 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 73 61    ** when the sa
16a60 76 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61  vepoint was crea
16a70 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ted.  */.      i
16a80 66 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54  f( p1==SAVEPOINT
16a90 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20 20  _RELEASE ){.    
16aa0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 61 76      assert( pSav
16ab0 65 70 6f 69 6e 74 3d 3d 64 62 2d 3e 70 53 61 76  epoint==db->pSav
16ac0 65 70 6f 69 6e 74 20 29 3b 0a 20 20 20 20 20 20  epoint );.      
16ad0 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74    db->pSavepoint
16ae0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 70   = pSavepoint->p
16af0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71  Next;.        sq
16b00 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16b10 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  pSavepoint);.   
16b20 20 20 20 20 20 69 66 28 20 21 69 73 54 72 61 6e       if( !isTran
16b30 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
16b40 20 20 20 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f       db->nSavepo
16b50 69 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d  int--;.        }
16b60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16b70 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
16b80 72 65 64 43 6f 6e 73 20 3d 20 70 53 61 76 65 70  redCons = pSavep
16b90 6f 69 6e 74 2d 3e 6e 44 65 66 65 72 72 65 64 43  oint->nDeferredC
16ba0 6f 6e 73 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  ons;.        db-
16bb0 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
16bc0 73 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  s = pSavepoint->
16bd0 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
16be0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
16bf0 20 69 66 28 20 21 69 73 54 72 61 6e 73 61 63 74   if( !isTransact
16c00 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ion ){.        r
16c10 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
16c20 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 70 31 2c  avepoint(db, p1,
16c30 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
16c40 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16c50 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
16c60 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
16c70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
16c80 0a 20 20 7d 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d  .  }..  break;.}
16c90 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 75 74  ../* Opcode: Aut
16ca0 6f 43 6f 6d 6d 69 74 20 50 31 20 50 32 20 2a 20  oCommit P1 P2 * 
16cb0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68  * *.**.** Set th
16cc0 65 20 64 61 74 61 62 61 73 65 20 61 75 74 6f 2d  e database auto-
16cd0 63 6f 6d 6d 69 74 20 66 6c 61 67 20 74 6f 20 50  commit flag to P
16ce0 31 20 28 31 20 6f 72 20 30 29 2e 20 49 66 20 50  1 (1 or 0). If P
16cf0 32 20 69 73 20 74 72 75 65 2c 20 72 6f 6c 6c 0a  2 is true, roll.
16d00 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 75 72 72  ** back any curr
16d10 65 6e 74 6c 79 20 61 63 74 69 76 65 20 62 74 72  ently active btr
16d20 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  ee transactions.
16d30 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
16d40 79 20 61 63 74 69 76 65 0a 2a 2a 20 56 4d 73 20  y active.** VMs 
16d50 28 61 70 61 72 74 20 66 72 6f 6d 20 74 68 69 73  (apart from this
16d60 20 6f 6e 65 29 2c 20 74 68 65 6e 20 61 20 52 4f   one), then a RO
16d70 4c 4c 42 41 43 4b 20 66 61 69 6c 73 2e 20 20 41  LLBACK fails.  A
16d80 20 43 4f 4d 4d 49 54 20 66 61 69 6c 73 20 69 66   COMMIT fails if
16d90 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 61 63  .** there are ac
16da0 74 69 76 65 20 77 72 69 74 69 6e 67 20 56 4d 73  tive writing VMs
16db0 20 6f 72 20 61 63 74 69 76 65 20 56 4d 73 20 74   or active VMs t
16dc0 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20 63  hat use shared c
16dd0 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ache..**.** This
16de0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 61 75   instruction cau
16df0 73 65 73 20 74 68 65 20 56 4d 20 74 6f 20 68 61  ses the VM to ha
16e00 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41  lt..*/.case OP_A
16e10 75 74 6f 43 6f 6d 6d 69 74 3a 20 7b 0a 20 20 69  utoCommit: {.  i
16e20 6e 74 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f  nt desiredAutoCo
16e30 6d 6d 69 74 3b 0a 20 20 69 6e 74 20 69 52 6f 6c  mmit;.  int iRol
16e40 6c 62 61 63 6b 3b 0a 20 20 69 6e 74 20 74 75 72  lback;.  int tur
16e50 6e 4f 6e 41 43 3b 0a 0a 20 20 64 65 73 69 72 65  nOnAC;..  desire
16e60 64 41 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 70 4f  dAutoCommit = pO
16e70 70 2d 3e 70 31 3b 0a 20 20 69 52 6f 6c 6c 62 61  p->p1;.  iRollba
16e80 63 6b 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  ck = pOp->p2;.  
16e90 74 75 72 6e 4f 6e 41 43 20 3d 20 64 65 73 69 72  turnOnAC = desir
16ea0 65 64 41 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20  edAutoCommit && 
16eb0 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b  !db->autoCommit;
16ec0 0a 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72  .  assert( desir
16ed0 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20  edAutoCommit==1 
16ee0 7c 7c 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f  || desiredAutoCo
16ef0 6d 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  mmit==0 );.  ass
16f00 65 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f  ert( desiredAuto
16f10 43 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 69 52 6f  Commit==1 || iRo
16f20 6c 6c 62 61 63 6b 3d 3d 30 20 29 3b 0a 20 20 61  llback==0 );.  a
16f30 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
16f40 41 63 74 69 76 65 3e 30 20 29 3b 20 20 2f 2a 20  Active>0 );  /* 
16f50 41 74 20 6c 65 61 73 74 20 74 68 69 73 20 6f 6e  At least this on
16f60 65 20 56 4d 20 69 73 20 61 63 74 69 76 65 20 2a  e VM is active *
16f70 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  /.  assert( p->b
16f80 49 73 52 65 61 64 65 72 20 29 3b 0a 0a 23 69 66  IsReader );..#if
16f90 20 30 0a 20 20 69 66 28 20 74 75 72 6e 4f 6e 41   0.  if( turnOnA
16fa0 43 20 26 26 20 69 52 6f 6c 6c 62 61 63 6b 20 26  C && iRollback &
16fb0 26 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  & db->nVdbeActiv
16fc0 65 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  e>1 ){.    /* If
16fd0 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
16fe0 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 52  n implements a R
16ff0 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 6f 74 68 65  OLLBACK and othe
17000 72 20 56 4d 73 20 61 72 65 0a 20 20 20 20 2a 2a  r VMs are.    **
17010 20 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 2c 20   still running, 
17020 61 6e 64 20 61 20 74 72 61 6e 73 61 63 74 69 6f  and a transactio
17030 6e 20 69 73 20 61 63 74 69 76 65 2c 20 72 65 74  n is active, ret
17040 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 64  urn an error ind
17050 69 63 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74  icating.    ** t
17060 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 56 4d  hat the other VM
17070 73 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20  s must complete 
17080 66 69 72 73 74 2e 20 0a 20 20 20 20 2a 2f 0a 20  first. .    */. 
17090 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
170a0 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
170b0 20 64 62 2c 20 22 63 61 6e 6e 6f 74 20 72 6f 6c   db, "cannot rol
170c0 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f  lback transactio
170d0 6e 20 2d 20 22 0a 20 20 20 20 20 20 20 20 22 53  n - ".        "S
170e0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  QL statements in
170f0 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20 20   progress");.   
17100 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
17110 59 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  Y;.  }else.#endi
17120 66 0a 20 20 69 66 28 20 74 75 72 6e 4f 6e 41 43  f.  if( turnOnAC
17130 20 26 26 20 21 69 52 6f 6c 6c 62 61 63 6b 20 26   && !iRollback &
17140 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  & db->nVdbeWrite
17150 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >0 ){.    /* If 
17160 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
17170 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 43 4f   implements a CO
17180 4d 4d 49 54 20 61 6e 64 20 6f 74 68 65 72 20 56  MMIT and other V
17190 4d 73 20 61 72 65 20 77 72 69 74 69 6e 67 0a 20  Ms are writing. 
171a0 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20     ** return an 
171b0 65 72 72 6f 72 20 69 6e 64 69 63 61 74 69 6e 67  error indicating
171c0 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20   that the other 
171d0 56 4d 73 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74  VMs must complet
171e0 65 20 66 69 72 73 74 2e 20 0a 20 20 20 20 2a 2f  e first. .    */
171f0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
17200 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
17210 67 2c 20 64 62 2c 20 22 63 61 6e 6e 6f 74 20 63  g, db, "cannot c
17220 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63 74 69 6f  ommit transactio
17230 6e 20 2d 20 22 0a 20 20 20 20 20 20 20 20 22 53  n - ".        "S
17240 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  QL statements in
17250 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20 20   progress");.   
17260 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
17270 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  Y;.  }else if( d
17280 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
17290 21 3d 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  !=db->autoCommit
172a0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 6c   ){.    if( iRol
172b0 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 61  lback ){.      a
172c0 73 73 65 72 74 28 20 64 65 73 69 72 65 64 41 75  ssert( desiredAu
172d0 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 29 3b 0a 20  toCommit==1 );. 
172e0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
172f0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
17300 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
17310 4b 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 75  K);.      db->au
17320 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
17330 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20    }else if( (rc 
17340 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
17350 63 6b 46 6b 28 70 2c 20 31 29 29 21 3d 53 51 4c  ckFk(p, 1))!=SQL
17360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17370 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e  goto vdbe_return
17380 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17390 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
173a0 74 20 3d 20 28 75 38 29 64 65 73 69 72 65 64 41  t = (u8)desiredA
173b0 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20  utoCommit;.     
173c0 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
173d0 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45 5f  Halt(p)==SQLITE_
173e0 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
173f0 70 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20 20 20  p->pc = pc;.    
17400 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
17410 69 74 20 3d 20 28 75 38 29 28 31 2d 64 65 73 69  it = (u8)(1-desi
17420 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a  redAutoCommit);.
17430 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
17440 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
17450 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76  ;.        goto v
17460 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20  dbe_return;.    
17470 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
17480 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65  sert( db->nState
17490 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  ment==0 );.    s
174a0 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
174b0 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 69  oints(db);.    i
174c0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
174d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
174e0 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
174f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17500 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
17510 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  R;.    }.    got
17520 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20  o vdbe_return;. 
17530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
17540 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
17550 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 0a 20 20  >zErrMsg, db,.  
17560 20 20 20 20 20 20 28 21 64 65 73 69 72 65 64 41        (!desiredA
17570 75 74 6f 43 6f 6d 6d 69 74 29 3f 22 63 61 6e 6e  utoCommit)?"cann
17580 6f 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  ot start a trans
17590 61 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20  action within a 
175a0 74 72 61 6e 73 61 63 74 69 6f 6e 22 3a 28 0a 20  transaction":(. 
175b0 20 20 20 20 20 20 20 28 69 52 6f 6c 6c 62 61 63         (iRollbac
175c0 6b 29 3f 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62  k)?"cannot rollb
175d0 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63  ack - no transac
175e0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 3a  tion is active":
175f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17600 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d      "cannot comm
17610 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74  it - no transact
17620 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29 29  ion is active"))
17630 3b 0a 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  ;.         .    
17640 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
17650 52 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  R;.  }.  break;.
17660 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 72  }../* Opcode: Tr
17670 61 6e 73 61 63 74 69 6f 6e 20 50 31 20 50 32 20  ansaction P1 P2 
17680 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 42 65 67 69  * * *.**.** Begi
17690 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  n a transaction.
176a0 20 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f    The transactio
176b0 6e 20 65 6e 64 73 20 77 68 65 6e 20 61 20 43 6f  n ends when a Co
176c0 6d 6d 69 74 20 6f 72 20 52 6f 6c 6c 62 61 63 6b  mmit or Rollback
176d0 0a 2a 2a 20 6f 70 63 6f 64 65 20 69 73 20 65 6e  .** opcode is en
176e0 63 6f 75 6e 74 65 72 65 64 2e 20 20 44 65 70 65  countered.  Depe
176f0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 4f 4e 20  nding on the ON 
17700 43 4f 4e 46 4c 49 43 54 20 73 65 74 74 69 6e 67  CONFLICT setting
17710 2c 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  , the.** transac
17720 74 69 6f 6e 20 6d 69 67 68 74 20 61 6c 73 6f 20  tion might also 
17730 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  be rolled back i
17740 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
17750 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
17760 20 50 31 20 69 73 20 74 68 65 20 69 6e 64 65 78   P1 is the index
17770 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
17780 20 66 69 6c 65 20 6f 6e 20 77 68 69 63 68 20 74   file on which t
17790 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
177a0 73 0a 2a 2a 20 73 74 61 72 74 65 64 2e 20 20 49  s.** started.  I
177b0 6e 64 65 78 20 30 20 69 73 20 74 68 65 20 6d 61  ndex 0 is the ma
177c0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
177d0 20 61 6e 64 20 69 6e 64 65 78 20 31 20 69 73 20   and index 1 is 
177e0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 75 73 65 64  the.** file used
177f0 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74   for temporary t
17800 61 62 6c 65 73 2e 20 20 49 6e 64 69 63 65 73 20  ables.  Indices 
17810 6f 66 20 32 20 6f 72 20 6d 6f 72 65 20 61 72 65  of 2 or more are
17820 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 61 74 74   used for.** att
17830 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2e  ached databases.
17840 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32 20 69 73 20  .**.** If P2 is 
17850 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
17860 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
17870 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2e 20 20  on is started.  
17880 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
17890 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 6f  is.** obtained o
178a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
178b0 69 6c 65 20 77 68 65 6e 20 61 20 77 72 69 74 65  ile when a write
178c0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
178d0 73 74 61 72 74 65 64 2e 20 20 4e 6f 0a 2a 2a 20  started.  No.** 
178e0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 61  other process ca
178f0 6e 20 73 74 61 72 74 20 61 6e 6f 74 68 65 72 20  n start another 
17900 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
17910 6e 20 77 68 69 6c 65 20 74 68 69 73 20 74 72 61  n while this tra
17920 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 75  nsaction is.** u
17930 6e 64 65 72 77 61 79 2e 20 20 53 74 61 72 74 69  nderway.  Starti
17940 6e 67 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ng a write trans
17950 61 63 74 69 6f 6e 20 61 6c 73 6f 20 63 72 65 61  action also crea
17960 74 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  tes a rollback j
17970 6f 75 72 6e 61 6c 2e 20 41 0a 2a 2a 20 77 72 69  ournal. A.** wri
17980 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
17990 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
179a0 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
179b0 73 20 63 61 6e 20 62 65 20 6d 61 64 65 20 74 6f  s can be made to
179c0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
179d0 2e 20 20 49 66 20 50 32 20 69 73 20 67 72 65 61  .  If P2 is grea
179e0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
179f0 6c 20 74 6f 20 32 20 74 68 65 6e 20 61 6e 20 45  l to 2 then an E
17a00 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
17a10 0a 2a 2a 20 61 6c 73 6f 20 6f 62 74 61 69 6e 65  .** also obtaine
17a20 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  d on the file..*
17a30 2a 0a 2a 2a 20 49 66 20 61 20 77 72 69 74 65 2d  *.** If a write-
17a40 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
17a50 74 61 72 74 65 64 20 61 6e 64 20 74 68 65 20 56  tarted and the V
17a60 64 62 65 2e 75 73 65 73 53 74 6d 74 4a 6f 75 72  dbe.usesStmtJour
17a70 6e 61 6c 20 66 6c 61 67 20 69 73 0a 2a 2a 20 74  nal flag is.** t
17a80 72 75 65 20 28 74 68 69 73 20 66 6c 61 67 20 69  rue (this flag i
17a90 73 20 73 65 74 20 69 66 20 74 68 65 20 56 64 62  s set if the Vdb
17aa0 65 20 6d 61 79 20 6d 6f 64 69 66 79 20 6d 6f 72  e may modify mor
17ab0 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20 61  e than one row a
17ac0 6e 64 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20  nd may.** throw 
17ad0 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74 69  an ABORT excepti
17ae0 6f 6e 29 2c 20 61 20 73 74 61 74 65 6d 65 6e 74  on), a statement
17af0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
17b00 20 61 6c 73 6f 20 62 65 20 6f 70 65 6e 65 64 2e   also be opened.
17b10 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69  .** More specifi
17b20 63 61 6c 6c 79 2c 20 61 20 73 74 61 74 65 6d 65  cally, a stateme
17b30 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
17b40 73 20 6f 70 65 6e 65 64 20 69 66 66 20 74 68 65  s opened iff the
17b50 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
17b60 6e 65 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  nection is curre
17b70 6e 74 6c 79 20 6e 6f 74 20 69 6e 20 61 75 74 6f  ntly not in auto
17b80 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 6f 72 20  commit mode, or 
17b90 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68  if there are oth
17ba0 65 72 0a 2a 2a 20 61 63 74 69 76 65 20 73 74 61  er.** active sta
17bb0 74 65 6d 65 6e 74 73 2e 20 41 20 73 74 61 74 65  tements. A state
17bc0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
17bd0 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 61 6e   allows the chan
17be0 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
17bf0 0a 2a 2a 20 56 44 42 45 20 74 6f 20 62 65 20 72  .** VDBE to be r
17c00 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72  olled back after
17c10 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 6f 75   an error withou
17c20 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
17c30 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 65 6e 74   back the.** ent
17c40 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ire transaction.
17c50 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 69 73 20   If no error is 
17c60 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
17c70 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
17c80 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 61  action.** will a
17c90 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6d  utomatically com
17ca0 6d 69 74 20 77 68 65 6e 20 74 68 65 20 56 44 42  mit when the VDB
17cb0 45 20 68 61 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49  E halts..**.** I
17cc0 66 20 50 32 20 69 73 20 7a 65 72 6f 2c 20 74 68  f P2 is zero, th
17cd0 65 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  en a read-lock i
17ce0 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  s obtained on th
17cf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
17d00 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 72 61 6e  .*/.case OP_Tran
17d10 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 42 74 72  saction: {.  Btr
17d20 65 65 20 2a 70 42 74 3b 0a 0a 20 20 61 73 73 65  ee *pBt;..  asse
17d30 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  rt( p->bIsReader
17d40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
17d50 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  >readOnly==0 || 
17d60 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 3b 0a 20 20  pOp->p2==0 );.  
17d70 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
17d80 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62  =0 && pOp->p1<db
17d90 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
17da0 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  t( (p->btreeMask
17db0 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31 29   & (((yDbMask)1)
17dc0 3c 3c 70 4f 70 2d 3e 70 31 29 29 21 3d 30 20 29  <<pOp->p1))!=0 )
17dd0 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20  ;.  if( pOp->p2 
17de0 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  && (db->flags & 
17df0 53 51 4c 49 54 45 5f 51 75 65 72 79 4f 6e 6c 79  SQLITE_QueryOnly
17e00 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )!=0 ){.    rc =
17e10 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
17e20 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74  ;.    goto abort
17e30 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
17e40 20 7d 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61   }.  pBt = db->a
17e50 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b  Db[pOp->p1].pBt;
17e60 0a 0a 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20  ..  if( pBt ){. 
17e70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
17e80 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
17e90 42 74 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20  Bt, pOp->p2);.  
17ea0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17eb0 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 70  _BUSY ){.      p
17ec0 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 20  ->pc = pc;.     
17ed0 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53 51   p->rc = rc = SQ
17ee0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
17ef0 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72   goto vdbe_retur
17f00 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
17f10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17f20 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f  {.      goto abo
17f30 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
17f40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
17f50 70 4f 70 2d 3e 70 32 20 26 26 20 70 2d 3e 75 73  pOp->p2 && p->us
17f60 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 0a 20  esStmtJournal . 
17f70 20 20 20 20 26 26 20 28 64 62 2d 3e 61 75 74 6f      && (db->auto
17f80 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
17f90 3e 6e 56 64 62 65 52 65 61 64 3e 31 29 20 0a 20  >nVdbeRead>1) . 
17fa0 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
17fb0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
17fc0 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
17fd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  ;.      if( p->i
17fe0 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 7b 0a  Statement==0 ){.
17ff0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18000 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 3d  db->nStatement>=
18010 30 20 26 26 20 64 62 2d 3e 6e 53 61 76 65 70 6f  0 && db->nSavepo
18020 69 6e 74 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  int>=0 );.      
18030 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
18040 2b 2b 3b 20 0a 20 20 20 20 20 20 20 20 70 2d 3e  ++; .        p->
18050 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 64 62 2d  iStatement = db-
18060 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20 64 62  >nSavepoint + db
18070 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3b 0a 20 20  ->nStatement;.  
18080 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20      }..      rc 
18090 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
180a0 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
180b0 4f 49 4e 54 5f 42 45 47 49 4e 2c 20 70 2d 3e 69  OINT_BEGIN, p->i
180c0 53 74 61 74 65 6d 65 6e 74 2d 31 29 3b 0a 20 20  Statement-1);.  
180d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
180e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
180f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
18100 65 65 42 65 67 69 6e 53 74 6d 74 28 70 42 74 2c  eeBeginStmt(pBt,
18110 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 29 3b   p->iStatement);
18120 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18130 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 63 75 72  /* Store the cur
18140 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
18150 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
18160 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  es deferred cons
18170 74 72 61 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20  traint.      ** 
18180 63 6f 75 6e 74 65 72 2e 20 49 66 20 74 68 65 20  counter. If the 
18190 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
181a0 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 62  ction needs to b
181b0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 0a 20  e rolled back,. 
181c0 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
181d0 65 20 6f 66 20 74 68 69 73 20 63 6f 75 6e 74 65  e of this counte
181e0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  r needs to be re
181f0 73 74 6f 72 65 64 20 74 6f 6f 2e 20 20 2a 2f 0a  stored too.  */.
18200 20 20 20 20 20 20 70 2d 3e 6e 53 74 6d 74 44 65        p->nStmtDe
18210 66 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66  fCons = db->nDef
18220 65 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20  erredCons;.     
18230 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43   p->nStmtDefImmC
18240 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72  ons = db->nDefer
18250 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20  redImmCons;.    
18260 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  }.  }.  break;.}
18270 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 61  ../* Opcode: Rea
18280 64 43 6f 6f 6b 69 65 20 50 31 20 50 32 20 50 33  dCookie P1 P2 P3
18290 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20   * *.**.** Read 
182a0 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20 50 33  cookie number P3
182b0 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 50   from database P
182c0 31 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 69  1 and write it i
182d0 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e  nto register P2.
182e0 0a 2a 2a 20 50 33 3d 3d 31 20 69 73 20 74 68 65  .** P3==1 is the
182f0 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 2e   schema version.
18300 20 20 50 33 3d 3d 32 20 69 73 20 74 68 65 20 64    P3==2 is the d
18310 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 2e 0a  atabase format..
18320 2a 2a 20 50 33 3d 3d 33 20 69 73 20 74 68 65 20  ** P3==3 is the 
18330 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61 67 65  recommended page
18340 72 20 63 61 63 68 65 20 73 69 7a 65 2c 20 61 6e  r cache size, an
18350 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 50 31 3d  d so forth.  P1=
18360 3d 30 20 69 73 0a 2a 2a 20 74 68 65 20 6d 61 69  =0 is.** the mai
18370 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
18380 61 6e 64 20 50 31 3d 3d 31 20 69 73 20 74 68 65  and P1==1 is the
18390 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
183a0 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20  sed to store.** 
183b0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
183c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
183d0 73 74 20 62 65 20 61 20 72 65 61 64 2d 6c 6f 63  st be a read-loc
183e0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
183f0 65 20 28 65 69 74 68 65 72 20 61 20 74 72 61 6e  e (either a tran
18400 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  saction.** must 
18410 62 65 20 73 74 61 72 74 65 64 20 6f 72 20 74 68  be started or th
18420 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f  ere must be an o
18430 70 65 6e 20 63 75 72 73 6f 72 29 20 62 65 66 6f  pen cursor) befo
18440 72 65 0a 2a 2a 20 65 78 65 63 75 74 69 6e 67 20  re.** executing 
18450 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
18460 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61  ..*/.case OP_Rea
18470 64 43 6f 6f 6b 69 65 3a 20 7b 20 20 20 20 20 20  dCookie: {      
18480 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
18490 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20  -prerelease */. 
184a0 20 69 6e 74 20 69 4d 65 74 61 3b 0a 20 20 69 6e   int iMeta;.  in
184b0 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 43 6f  t iDb;.  int iCo
184c0 6f 6b 69 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  okie;..  assert(
184d0 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b   p->bIsReader );
184e0 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31  .  iDb = pOp->p1
184f0 3b 0a 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 4f  ;.  iCookie = pO
18500 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72 74 28  p->p3;.  assert(
18510 20 70 4f 70 2d 3e 70 33 3c 53 51 4c 49 54 45 5f   pOp->p3<SQLITE_
18520 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20 29 3b 0a  N_BTREE_META );.
18530 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
18540 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
18550 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
18560 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
18570 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
18580 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28  ->btreeMask & ((
18590 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62  (yDbMask)1)<<iDb
185a0 29 29 21 3d 30 20 29 3b 0a 0a 20 20 73 71 6c 69  ))!=0 );..  sqli
185b0 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
185c0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
185d0 2c 20 69 43 6f 6f 6b 69 65 2c 20 28 75 33 32 20  , iCookie, (u32 
185e0 2a 29 26 69 4d 65 74 61 29 3b 0a 20 20 70 4f 75  *)&iMeta);.  pOu
185f0 74 2d 3e 75 2e 69 20 3d 20 69 4d 65 74 61 3b 0a  t->u.i = iMeta;.
18600 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
18610 70 63 6f 64 65 3a 20 53 65 74 43 6f 6f 6b 69 65  pcode: SetCookie
18620 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
18630 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f  .** Write the co
18640 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65  ntent of registe
18650 72 20 50 33 20 28 69 6e 74 65 72 70 72 65 74 65  r P3 (interprete
18660 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 29  d as an integer)
18670 0a 2a 2a 20 69 6e 74 6f 20 63 6f 6f 6b 69 65 20  .** into cookie 
18680 6e 75 6d 62 65 72 20 50 32 20 6f 66 20 64 61 74  number P2 of dat
18690 61 62 61 73 65 20 50 31 2e 20 20 50 32 3d 3d 31  abase P1.  P2==1
186a0 20 69 73 20 74 68 65 20 73 63 68 65 6d 61 20 76   is the schema v
186b0 65 72 73 69 6f 6e 2e 20 20 0a 2a 2a 20 50 32 3d  ersion.  .** P2=
186c0 3d 32 20 69 73 20 74 68 65 20 64 61 74 61 62 61  =2 is the databa
186d0 73 65 20 66 6f 72 6d 61 74 2e 20 50 32 3d 3d 33  se format. P2==3
186e0 20 69 73 20 74 68 65 20 72 65 63 6f 6d 6d 65 6e   is the recommen
186f0 64 65 64 20 70 61 67 65 72 20 63 61 63 68 65 20  ded pager cache 
18700 0a 2a 2a 20 73 69 7a 65 2c 20 61 6e 64 20 73 6f  .** size, and so
18710 20 66 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20 69   forth.  P1==0 i
18720 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
18730 61 73 65 20 66 69 6c 65 20 61 6e 64 20 50 31 3d  ase file and P1=
18740 3d 31 20 69 73 20 74 68 65 20 0a 2a 2a 20 64 61  =1 is the .** da
18750 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
18760 20 74 6f 20 73 74 6f 72 65 20 74 65 6d 70 6f 72   to store tempor
18770 61 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a  ary tables..**.*
18780 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
18790 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
187a0 62 65 66 6f 72 65 20 65 78 65 63 75 74 69 6e 67  before executing
187b0 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2f   this opcode..*/
187c0 0a 63 61 73 65 20 4f 50 5f 53 65 74 43 6f 6f 6b  .case OP_SetCook
187d0 69 65 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 69  ie: {       /* i
187e0 6e 33 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b  n3 */.  Db *pDb;
187f0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
18800 70 32 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45  p2<SQLITE_N_BTRE
18810 45 5f 4d 45 54 41 20 29 3b 0a 20 20 61 73 73 65  E_META );.  asse
18820 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
18830 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44  & pOp->p1<db->nD
18840 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  b );.  assert( (
18850 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28  p->btreeMask & (
18860 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f  ((yDbMask)1)<<pO
18870 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a 20 20  p->p1))!=0 );.  
18880 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f  assert( p->readO
18890 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 70 44 62 20  nly==0 );.  pDb 
188a0 3d 20 26 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e  = &db->aDb[pOp->
188b0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
188c0 44 62 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  Db->pBt!=0 );.  
188d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
188e0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
188f0 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 29 20 29  b, pOp->p1, 0) )
18900 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d  ;.  pIn3 = &aMem
18910 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 73 71 6c  [pOp->p3];.  sql
18920 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67  ite3VdbeMemInteg
18930 65 72 69 66 79 28 70 49 6e 33 29 3b 0a 20 20 2f  erify(pIn3);.  /
18940 2a 20 53 65 65 20 6e 6f 74 65 20 61 62 6f 75 74  * See note about
18950 20 69 6e 64 65 78 20 73 68 69 66 74 69 6e 67 20   index shifting 
18960 6f 6e 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65  on OP_ReadCookie
18970 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
18980 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
18990 61 28 70 44 62 2d 3e 70 42 74 2c 20 70 4f 70 2d  a(pDb->pBt, pOp-
189a0 3e 70 32 2c 20 28 69 6e 74 29 70 49 6e 33 2d 3e  >p2, (int)pIn3->
189b0 75 2e 69 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d  u.i);.  if( pOp-
189c0 3e 70 32 3d 3d 42 54 52 45 45 5f 53 43 48 45 4d  >p2==BTREE_SCHEM
189d0 41 5f 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20  A_VERSION ){.   
189e0 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 73 63 68   /* When the sch
189f0 65 6d 61 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67  ema cookie chang
18a00 65 73 2c 20 72 65 63 6f 72 64 20 74 68 65 20 6e  es, record the n
18a10 65 77 20 63 6f 6f 6b 69 65 20 69 6e 74 65 72 6e  ew cookie intern
18a20 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 70 44 62 2d  ally */.    pDb-
18a30 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  >pSchema->schema
18a40 5f 63 6f 6f 6b 69 65 20 3d 20 28 69 6e 74 29 70  _cookie = (int)p
18a50 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 20 20 64 62  In3->u.i;.    db
18a60 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
18a70 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
18a80 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70  .  }else if( pOp
18a90 2d 3e 70 32 3d 3d 42 54 52 45 45 5f 46 49 4c 45  ->p2==BTREE_FILE
18aa0 5f 46 4f 52 4d 41 54 20 29 7b 0a 20 20 20 20 2f  _FORMAT ){.    /
18ab0 2a 20 52 65 63 6f 72 64 20 63 68 61 6e 67 65 73  * Record changes
18ac0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72   in the file for
18ad0 6d 61 74 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e  mat */.    pDb->
18ae0 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f  pSchema->file_fo
18af0 72 6d 61 74 20 3d 20 28 75 38 29 70 49 6e 33 2d  rmat = (u8)pIn3-
18b00 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >u.i;.  }.  if( 
18b10 70 4f 70 2d 3e 70 31 3d 3d 31 20 29 7b 0a 20 20  pOp->p1==1 ){.  
18b20 20 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74 65 20    /* Invalidate 
18b30 61 6c 6c 20 70 72 65 70 61 72 65 64 20 73 74 61  all prepared sta
18b40 74 65 6d 65 6e 74 73 20 77 68 65 6e 65 76 65 72  tements whenever
18b50 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
18b60 73 65 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d 61  se.    ** schema
18b70 20 69 73 20 63 68 61 6e 67 65 64 2e 20 20 54 69   is changed.  Ti
18b80 63 6b 65 74 20 23 31 36 34 34 20 2a 2f 0a 20 20  cket #1644 */.  
18b90 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
18ba0 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
18bb0 73 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 65 78  s(db);.    p->ex
18bc0 70 69 72 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  pired = 0;.  }. 
18bd0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
18be0 63 6f 64 65 3a 20 56 65 72 69 66 79 43 6f 6f 6b  code: VerifyCook
18bf0 69 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  ie P1 P2 P3 * *.
18c00 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20  **.** Check the 
18c10 76 61 6c 75 65 20 6f 66 20 67 6c 6f 62 61 6c 20  value of global 
18c20 64 61 74 61 62 61 73 65 20 70 61 72 61 6d 65 74  database paramet
18c30 65 72 20 6e 75 6d 62 65 72 20 30 20 28 74 68 65  er number 0 (the
18c40 0a 2a 2a 20 73 63 68 65 6d 61 20 76 65 72 73 69  .** schema versi
18c50 6f 6e 29 20 61 6e 64 20 6d 61 6b 65 20 73 75 72  on) and make sur
18c60 65 20 69 74 20 69 73 20 65 71 75 61 6c 20 74 6f  e it is equal to
18c70 20 50 32 20 61 6e 64 20 74 68 61 74 20 74 68 65   P2 and that the
18c80 0a 2a 2a 20 67 65 6e 65 72 61 74 69 6f 6e 20 63  .** generation c
18c90 6f 75 6e 74 65 72 20 6f 6e 20 74 68 65 20 6c 6f  ounter on the lo
18ca0 63 61 6c 20 73 63 68 65 6d 61 20 70 61 72 73 65  cal schema parse
18cb0 20 65 71 75 61 6c 73 20 50 33 2e 0a 2a 2a 0a 2a   equals P3..**.*
18cc0 2a 20 50 31 20 69 73 20 74 68 65 20 64 61 74 61  * P1 is the data
18cd0 62 61 73 65 20 6e 75 6d 62 65 72 20 77 68 69 63  base number whic
18ce0 68 20 69 73 20 30 20 66 6f 72 20 74 68 65 20 6d  h is 0 for the m
18cf0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
18d00 65 0a 2a 2a 20 61 6e 64 20 31 20 66 6f 72 20 74  e.** and 1 for t
18d10 68 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  he file holding 
18d20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
18d30 20 61 6e 64 20 73 6f 6d 65 20 68 69 67 68 65 72   and some higher
18d40 20 6e 75 6d 62 65 72 0a 2a 2a 20 66 6f 72 20 61   number.** for a
18d50 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
18d60 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  es..**.** The co
18d70 6f 6b 69 65 20 63 68 61 6e 67 65 73 20 69 74 73  okie changes its
18d80 20 76 61 6c 75 65 20 77 68 65 6e 65 76 65 72 20   value whenever 
18d90 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
18da0 65 6d 61 20 63 68 61 6e 67 65 73 2e 0a 2a 2a 20  ema changes..** 
18db0 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69  This operation i
18dc0 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 63 74  s used to detect
18dd0 20 77 68 65 6e 20 74 68 61 74 20 74 68 65 20 63   when that the c
18de0 6f 6f 6b 69 65 20 68 61 73 20 63 68 61 6e 67 65  ookie has change
18df0 64 0a 2a 2a 20 61 6e 64 20 74 68 61 74 20 74 68  d.** and that th
18e00 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  e current proces
18e10 73 20 6e 65 65 64 73 20 74 6f 20 72 65 72 65 61  s needs to rerea
18e20 64 20 74 68 65 20 73 63 68 65 6d 61 2e 0a 2a 2a  d the schema..**
18e30 0a 2a 2a 20 45 69 74 68 65 72 20 61 20 74 72 61  .** Either a tra
18e40 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
18e50 6f 20 68 61 76 65 20 62 65 65 6e 20 73 74 61 72  o have been star
18e60 74 65 64 20 6f 72 20 61 6e 20 4f 50 5f 4f 70 65  ted or an OP_Ope
18e70 6e 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65  n needs.** to be
18e80 20 65 78 65 63 75 74 65 64 20 28 74 6f 20 65 73   executed (to es
18e90 74 61 62 6c 69 73 68 20 61 20 72 65 61 64 20 6c  tablish a read l
18ea0 6f 63 6b 29 20 62 65 66 6f 72 65 20 74 68 69 73  ock) before this
18eb0 20 6f 70 63 6f 64 65 20 69 73 0a 2a 2a 20 69 6e   opcode is.** in
18ec0 76 6f 6b 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f  voked..*/.case O
18ed0 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 3a 20  P_VerifyCookie: 
18ee0 7b 0a 20 20 69 6e 74 20 69 4d 65 74 61 3b 0a 20  {.  int iMeta;. 
18ef0 20 69 6e 74 20 69 47 65 6e 3b 0a 20 20 42 74 72   int iGen;.  Btr
18f00 65 65 20 2a 70 42 74 3b 0a 0a 20 20 61 73 73 65  ee *pBt;..  asse
18f10 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
18f20 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44  & pOp->p1<db->nD
18f30 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  b );.  assert( (
18f40 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28  p->btreeMask & (
18f50 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f  ((yDbMask)1)<<pO
18f60 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a 20 20  p->p1))!=0 );.  
18f70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
18f80 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
18f90 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 29 20 29  b, pOp->p1, 0) )
18fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  ;.  assert( p->b
18fb0 49 73 52 65 61 64 65 72 20 29 3b 0a 20 20 70 42  IsReader );.  pB
18fc0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d  t = db->aDb[pOp-
18fd0 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 69 66 28 20  >p1].pBt;.  if( 
18fe0 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBt ){.    sqlit
18ff0 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
19000 42 74 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41  Bt, BTREE_SCHEMA
19010 5f 56 45 52 53 49 4f 4e 2c 20 28 75 33 32 20 2a  _VERSION, (u32 *
19020 29 26 69 4d 65 74 61 29 3b 0a 20 20 20 20 69 47  )&iMeta);.    iG
19030 65 6e 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70  en = db->aDb[pOp
19040 2d 3e 70 31 5d 2e 70 53 63 68 65 6d 61 2d 3e 69  ->p1].pSchema->i
19050 47 65 6e 65 72 61 74 69 6f 6e 3b 0a 20 20 7d 65  Generation;.  }e
19060 6c 73 65 7b 0a 20 20 20 20 69 47 65 6e 20 3d 20  lse{.    iGen = 
19070 69 4d 65 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20  iMeta = 0;.  }. 
19080 20 69 66 28 20 69 4d 65 74 61 21 3d 70 4f 70 2d   if( iMeta!=pOp-
19090 3e 70 32 20 7c 7c 20 69 47 65 6e 21 3d 70 4f 70  >p2 || iGen!=pOp
190a0 2d 3e 70 33 20 29 7b 0a 20 20 20 20 73 71 6c 69  ->p3 ){.    sqli
190b0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
190c0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
190d0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  ->zErrMsg = sqli
190e0 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
190f0 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61  "database schema
19100 20 68 61 73 20 63 68 61 6e 67 65 64 22 29 3b 0a   has changed");.
19110 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 63      /* If the sc
19120 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 66 72 6f 6d  hema-cookie from
19130 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19140 6c 65 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  le matches the c
19150 6f 6f 6b 69 65 20 0a 20 20 20 20 2a 2a 20 73 74  ookie .    ** st
19160 6f 72 65 64 20 77 69 74 68 20 74 68 65 20 69 6e  ored with the in
19170 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
19180 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63  tation of the sc
19190 68 65 6d 61 2c 20 64 6f 0a 20 20 20 20 2a 2a 20  hema, do.    ** 
191a0 6e 6f 74 20 72 65 6c 6f 61 64 20 74 68 65 20 73  not reload the s
191b0 63 68 65 6d 61 20 66 72 6f 6d 20 74 68 65 20 64  chema from the d
191c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
191d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 76    **.    ** If v
191e0 69 72 74 75 61 6c 2d 74 61 62 6c 65 73 20 61 72  irtual-tables ar
191f0 65 20 69 6e 20 75 73 65 2c 20 74 68 69 73 20 69  e in use, this i
19200 73 20 6e 6f 74 20 6a 75 73 74 20 61 6e 20 6f 70  s not just an op
19210 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20  timization..    
19220 2a 2a 20 4f 66 74 65 6e 2c 20 76 2d 74 61 62 6c  ** Often, v-tabl
19230 65 73 20 73 74 6f 72 65 20 74 68 65 69 72 20 64  es store their d
19240 61 74 61 20 69 6e 20 6f 74 68 65 72 20 53 51 4c  ata in other SQL
19250 69 74 65 20 74 61 62 6c 65 73 2c 20 77 68 69 63  ite tables, whic
19260 68 0a 20 20 20 20 2a 2a 20 61 72 65 20 71 75 65  h.    ** are que
19270 72 69 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  ried from within
19280 20 78 4e 65 78 74 28 29 20 61 6e 64 20 6f 74 68   xNext() and oth
19290 65 72 20 76 2d 74 61 62 6c 65 20 6d 65 74 68 6f  er v-table metho
192a0 64 73 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20  ds using.    ** 
192b0 70 72 65 70 61 72 65 64 20 71 75 65 72 69 65 73  prepared queries
192c0 2e 20 49 66 20 73 75 63 68 20 61 20 71 75 65 72  . If such a quer
192d0 79 20 69 73 20 6f 75 74 2d 6f 66 2d 64 61 74 65  y is out-of-date
192e0 2c 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74  , we do not want
192f0 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 63 61   to.    ** disca
19300 72 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rd the database 
19310 73 63 68 65 6d 61 2c 20 61 73 20 74 68 65 20 75  schema, as the u
19320 73 65 72 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65  ser code impleme
19330 6e 74 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  nting the.    **
19340 20 76 2d 74 61 62 6c 65 20 77 6f 75 6c 64 20 68   v-table would h
19350 61 76 65 20 74 6f 20 62 65 20 72 65 61 64 79 20  ave to be ready 
19360 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f  for the sqlite3_
19370 76 74 61 62 20 73 74 72 75 63 74 75 72 65 20 69  vtab structure i
19380 74 73 65 6c 66 0a 20 20 20 20 2a 2a 20 74 6f 20  tself.    ** to 
19390 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 77  be invalidated w
193a0 68 65 6e 65 76 65 72 20 73 71 6c 69 74 65 33 5f  henever sqlite3_
193b0 73 74 65 70 28 29 20 69 73 20 63 61 6c 6c 65 64  step() is called
193c0 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 0a 20 20   from within .  
193d0 20 20 2a 2a 20 61 20 76 2d 74 61 62 6c 65 20 6d    ** a v-table m
193e0 65 74 68 6f 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ethod..    */.  
193f0 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 70 4f    if( db->aDb[pO
19400 70 2d 3e 70 31 5d 2e 70 53 63 68 65 6d 61 2d 3e  p->p1].pSchema->
19410 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 21 3d 69  schema_cookie!=i
19420 4d 65 74 61 20 29 7b 0a 20 20 20 20 20 20 73 71  Meta ){.      sq
19430 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68  lite3ResetOneSch
19440 65 6d 61 28 64 62 2c 20 70 4f 70 2d 3e 70 31 29  ema(db, pOp->p1)
19450 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  ;.    }..    p->
19460 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 20  expired = 1;.   
19470 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 53 43 48   rc = SQLITE_SCH
19480 45 4d 41 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  EMA;.  }.  break
19490 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
194a0 4f 70 65 6e 52 65 61 64 20 50 31 20 50 32 20 50  OpenRead P1 P2 P
194b0 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 4f 70  3 P4 P5.**.** Op
194c0 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  en a read-only c
194d0 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61  ursor for the da
194e0 74 61 62 61 73 65 20 74 61 62 6c 65 20 77 68 6f  tabase table who
194f0 73 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 0a  se root page is.
19500 2a 2a 20 50 32 20 69 6e 20 61 20 64 61 74 61 62  ** P2 in a datab
19510 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 64  ase file.  The d
19520 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
19530 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 50 33  determined by P3
19540 2e 20 0a 2a 2a 20 50 33 3d 3d 30 20 6d 65 61 6e  . .** P3==0 mean
19550 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
19560 61 73 65 2c 20 50 33 3d 3d 31 20 6d 65 61 6e 73  ase, P3==1 means
19570 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
19580 65 64 20 66 6f 72 20 0a 2a 2a 20 74 65 6d 70 6f  ed for .** tempo
19590 72 61 72 79 20 74 61 62 6c 65 73 2c 20 61 6e 64  rary tables, and
195a0 20 50 33 3e 31 20 6d 65 61 6e 73 20 75 73 65 64   P3>1 means used
195b0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
195c0 6e 67 20 61 74 74 61 63 68 65 64 0a 2a 2a 20 64  ng attached.** d
195d0 61 74 61 62 61 73 65 2e 20 20 47 69 76 65 20 74  atabase.  Give t
195e0 68 65 20 6e 65 77 20 63 75 72 73 6f 72 20 61 6e  he new cursor an
195f0 20 69 64 65 6e 74 69 66 69 65 72 20 6f 66 20 50   identifier of P
19600 31 2e 20 20 54 68 65 20 50 31 0a 2a 2a 20 76 61  1.  The P1.** va
19610 6c 75 65 73 20 6e 65 65 64 20 6e 6f 74 20 62 65  lues need not be
19620 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 75 74 20   contiguous but 
19630 61 6c 6c 20 50 31 20 76 61 6c 75 65 73 20 73 68  all P1 values sh
19640 6f 75 6c 64 20 62 65 20 73 6d 61 6c 6c 20 69 6e  ould be small in
19650 74 65 67 65 72 73 2e 0a 2a 2a 20 49 74 20 69 73  tegers..** It is
19660 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 50 31   an error for P1
19670 20 74 6f 20 62 65 20 6e 65 67 61 74 69 76 65 2e   to be negative.
19680 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 21 3d 30 20  .**.** If P5!=0 
19690 74 68 65 6e 20 75 73 65 20 74 68 65 20 63 6f 6e  then use the con
196a0 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72  tent of register
196b0 20 50 32 20 61 73 20 74 68 65 20 72 6f 6f 74 20   P2 as the root 
196c0 70 61 67 65 2c 20 6e 6f 74 0a 2a 2a 20 74 68 65  page, not.** the
196d0 20 76 61 6c 75 65 20 6f 66 20 50 32 20 69 74 73   value of P2 its
196e0 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  elf..**.** There
196f0 20 77 69 6c 6c 20 62 65 20 61 20 72 65 61 64 20   will be a read 
19700 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
19710 62 61 73 65 20 77 68 65 6e 65 76 65 72 20 74 68  base whenever th
19720 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 6f 70 65  ere is an.** ope
19730 6e 20 63 75 72 73 6f 72 2e 20 20 49 66 20 74 68  n cursor.  If th
19740 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 75  e database was u
19750 6e 6c 6f 63 6b 65 64 20 70 72 69 6f 72 20 74 6f  nlocked prior to
19760 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
19770 6e 0a 2a 2a 20 74 68 65 6e 20 61 20 72 65 61 64  n.** then a read
19780 20 6c 6f 63 6b 20 69 73 20 61 63 71 75 69 72 65   lock is acquire
19790 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69  d as part of thi
197a0 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  s instruction.  
197b0 41 20 72 65 61 64 0a 2a 2a 20 6c 6f 63 6b 20 61  A read.** lock a
197c0 6c 6c 6f 77 73 20 6f 74 68 65 72 20 70 72 6f 63  llows other proc
197d0 65 73 73 65 73 20 74 6f 20 72 65 61 64 20 74 68  esses to read th
197e0 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 70  e database but p
197f0 72 6f 68 69 62 69 74 73 0a 2a 2a 20 61 6e 79 20  rohibits.** any 
19800 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 66 72  other process fr
19810 6f 6d 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  om modifying the
19820 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
19830 72 65 61 64 20 6c 6f 63 6b 20 69 73 0a 2a 2a 20  read lock is.** 
19840 72 65 6c 65 61 73 65 64 20 77 68 65 6e 20 61 6c  released when al
19850 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6c  l cursors are cl
19860 6f 73 65 64 2e 20 20 49 66 20 74 68 69 73 20 69  osed.  If this i
19870 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 74 65 6d  nstruction attem
19880 70 74 73 0a 2a 2a 20 74 6f 20 67 65 74 20 61 20  pts.** to get a 
19890 72 65 61 64 20 6c 6f 63 6b 20 62 75 74 20 66 61  read lock but fa
198a0 69 6c 73 2c 20 74 68 65 20 73 63 72 69 70 74 20  ils, the script 
198b0 74 65 72 6d 69 6e 61 74 65 73 20 77 69 74 68 20  terminates with 
198c0 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  an.** SQLITE_BUS
198d0 59 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  Y error code..**
198e0 0a 2a 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65  .** The P4 value
198f0 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61   may be either a
19900 6e 20 69 6e 74 65 67 65 72 20 28 50 34 5f 49 4e  n integer (P4_IN
19910 54 33 32 29 20 6f 72 20 61 20 70 6f 69 6e 74 65  T32) or a pointe
19920 72 20 74 6f 0a 2a 2a 20 61 20 4b 65 79 49 6e 66  r to.** a KeyInf
19930 6f 20 73 74 72 75 63 74 75 72 65 20 28 50 34 5f  o structure (P4_
19940 4b 45 59 49 4e 46 4f 29 2e 20 49 66 20 69 74 20  KEYINFO). If it 
19950 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
19960 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74  a KeyInfo .** st
19970 72 75 63 74 75 72 65 2c 20 74 68 65 6e 20 73 61  ructure, then sa
19980 69 64 20 73 74 72 75 63 74 75 72 65 20 64 65 66  id structure def
19990 69 6e 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  ines the content
199a0 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 0a   and collating .
199b0 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74  ** sequence of t
199c0 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 6f  he index being o
199d0 70 65 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  pened. Otherwise
199e0 2c 20 69 66 20 50 34 20 69 73 20 61 6e 20 69 6e  , if P4 is an in
199f0 74 65 67 65 72 20 0a 2a 2a 20 76 61 6c 75 65 2c  teger .** value,
19a00 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 74 68   it is set to th
19a10 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
19a20 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
19a30 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
19a40 20 4f 70 65 6e 57 72 69 74 65 2e 0a 2a 2f 0a 2f   OpenWrite..*/./
19a50 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 57 72  * Opcode: OpenWr
19a60 69 74 65 20 50 31 20 50 32 20 50 33 20 50 34 20  ite P1 P2 P3 P4 
19a70 50 35 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  P5.**.** Open a 
19a80 72 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f  read/write curso
19a90 72 20 6e 61 6d 65 64 20 50 31 20 6f 6e 20 74 68  r named P1 on th
19aa0 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
19ab0 20 77 68 6f 73 65 20 72 6f 6f 74 0a 2a 2a 20 70   whose root.** p
19ac0 61 67 65 20 69 73 20 50 32 2e 20 20 4f 72 20 69  age is P2.  Or i
19ad0 66 20 50 35 21 3d 30 20 75 73 65 20 74 68 65 20  f P5!=0 use the 
19ae0 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73  content of regis
19af0 74 65 72 20 50 32 20 74 6f 20 66 69 6e 64 20 74  ter P2 to find t
19b00 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e  he.** root page.
19b10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 76 61  .**.** The P4 va
19b20 6c 75 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  lue may be eithe
19b30 72 20 61 6e 20 69 6e 74 65 67 65 72 20 28 50 34  r an integer (P4
19b40 5f 49 4e 54 33 32 29 20 6f 72 20 61 20 70 6f 69  _INT32) or a poi
19b50 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20 4b 65 79  nter to.** a Key
19b60 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 28  Info structure (
19b70 50 34 5f 4b 45 59 49 4e 46 4f 29 2e 20 49 66 20  P4_KEYINFO). If 
19b80 69 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  it is a pointer 
19b90 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a  to a KeyInfo .**
19ba0 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e   structure, then
19bb0 20 73 61 69 64 20 73 74 72 75 63 74 75 72 65 20   said structure 
19bc0 64 65 66 69 6e 65 73 20 74 68 65 20 63 6f 6e 74  defines the cont
19bd0 65 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ent and collatin
19be0 67 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f  g .** sequence o
19bf0 66 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  f the index bein
19c00 67 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65 72 77  g opened. Otherw
19c10 69 73 65 2c 20 69 66 20 50 34 20 69 73 20 61 6e  ise, if P4 is an
19c20 20 69 6e 74 65 67 65 72 20 0a 2a 2a 20 76 61 6c   integer .** val
19c30 75 65 2c 20 69 74 20 69 73 20 73 65 74 20 74 6f  ue, it is set to
19c40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
19c50 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
19c60 62 6c 65 2c 20 6f 72 20 74 6f 20 74 68 65 0a 2a  ble, or to the.*
19c70 2a 20 6c 61 72 67 65 73 74 20 69 6e 64 65 78 20  * largest index 
19c80 6f 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66  of any column of
19c90 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
19ca0 69 73 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64  is actually used
19cb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73  ..**.** This ins
19cc0 74 72 75 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6a  truction works j
19cd0 75 73 74 20 6c 69 6b 65 20 4f 70 65 6e 52 65 61  ust like OpenRea
19ce0 64 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  d except that it
19cf0 20 6f 70 65 6e 73 20 74 68 65 20 63 75 72 73 6f   opens the curso
19d00 72 0a 2a 2a 20 69 6e 20 72 65 61 64 2f 77 72 69  r.** in read/wri
19d10 74 65 20 6d 6f 64 65 2e 20 20 46 6f 72 20 61 20  te mode.  For a 
19d20 67 69 76 65 6e 20 74 61 62 6c 65 2c 20 74 68 65  given table, the
19d30 72 65 20 63 61 6e 20 62 65 20 6f 6e 65 20 6f 72  re can be one or
19d40 20 6d 6f 72 65 20 72 65 61 64 2d 6f 6e 6c 79 0a   more read-only.
19d50 2a 2a 20 63 75 72 73 6f 72 73 20 6f 72 20 61 20  ** cursors or a 
19d60 73 69 6e 67 6c 65 20 72 65 61 64 2f 77 72 69 74  single read/writ
19d70 65 20 63 75 72 73 6f 72 20 62 75 74 20 6e 6f 74  e cursor but not
19d80 20 62 6f 74 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   both..**.** See
19d90 20 61 6c 73 6f 20 4f 70 65 6e 52 65 61 64 2e 0a   also OpenRead..
19da0 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 52  */.case OP_OpenR
19db0 65 61 64 3a 0a 63 61 73 65 20 4f 50 5f 4f 70 65  ead:.case OP_Ope
19dc0 6e 57 72 69 74 65 3a 20 7b 0a 20 20 69 6e 74 20  nWrite: {.  int 
19dd0 6e 46 69 65 6c 64 3b 0a 20 20 4b 65 79 49 6e 66  nField;.  KeyInf
19de0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69  o *pKeyInfo;.  i
19df0 6e 74 20 70 32 3b 0a 20 20 69 6e 74 20 69 44 62  nt p2;.  int iDb
19e00 3b 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 3b 0a  ;.  int wrFlag;.
19e10 20 20 42 74 72 65 65 20 2a 70 58 3b 0a 20 20 56    Btree *pX;.  V
19e20 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b  dbeCursor *pCur;
19e30 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61  .  Db *pDb;..  a
19e40 73 73 65 72 74 28 20 28 70 4f 70 2d 3e 70 35 26  ssert( (pOp->p5&
19e50 28 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 7c  (OPFLAG_P2ISREG|
19e60 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 29 29  OPFLAG_BULKCSR))
19e70 3d 3d 70 4f 70 2d 3e 70 35 20 29 3b 0a 20 20 61  ==pOp->p5 );.  a
19e80 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
19e90 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65  de==OP_OpenWrite
19ea0 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 29   || pOp->p5==0 )
19eb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  ;.  assert( p->b
19ec0 49 73 52 65 61 64 65 72 20 29 3b 0a 20 20 61 73  IsReader );.  as
19ed0 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
19ee0 65 3d 3d 4f 50 5f 4f 70 65 6e 52 65 61 64 20 7c  e==OP_OpenRead |
19ef0 7c 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  | p->readOnly==0
19f00 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 65 78   );..  if( p->ex
19f10 70 69 72 65 64 20 29 7b 0a 20 20 20 20 72 63 20  pired ){.    rc 
19f20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  = SQLITE_ABORT;.
19f30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
19f40 20 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20    nField = 0;.  
19f50 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20  pKeyInfo = 0;.  
19f60 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  p2 = pOp->p2;.  
19f70 69 44 62 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20  iDb = pOp->p3;. 
19f80 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
19f90 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
19fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  ;.  assert( (p->
19fb0 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79  btreeMask & (((y
19fc0 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62 29 29  DbMask)1)<<iDb))
19fd0 21 3d 30 20 29 3b 0a 20 20 70 44 62 20 3d 20 26  !=0 );.  pDb = &
19fe0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
19ff0 70 58 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20  pX = pDb->pBt;. 
1a000 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29   assert( pX!=0 )
1a010 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
1a020 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74  ode==OP_OpenWrit
1a030 65 20 29 7b 0a 20 20 20 20 77 72 46 6c 61 67 20  e ){.    wrFlag 
1a040 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 1;.    assert(
1a050 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
1a060 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
1a070 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70   0) );.    if( p
1a080 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c  Db->pSchema->fil
1a090 65 5f 66 6f 72 6d 61 74 20 3c 20 70 2d 3e 6d 69  e_format < p->mi
1a0a0 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74  nWriteFileFormat
1a0b0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 69 6e   ){.      p->min
1a0c0 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20  WriteFileFormat 
1a0d0 3d 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  = pDb->pSchema->
1a0e0 66 69 6c 65 5f 66 6f 72 6d 61 74 3b 0a 20 20 20  file_format;.   
1a0f0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1a100 77 72 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a  wrFlag = 0;.  }.
1a110 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20    if( pOp->p5 & 
1a120 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 20 29  OPFLAG_P2ISREG )
1a130 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 32  {.    assert( p2
1a140 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
1a150 28 20 70 32 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d 70  ( p2<=(p->nMem-p
1a160 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
1a170 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70    pIn2 = &aMem[p
1a180 32 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  2];.    assert( 
1a190 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e 32 29  memIsValid(pIn2)
1a1a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1a1b0 28 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn2->flags & M
1a1c0 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20  EM_Int)!=0 );.  
1a1d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1a1e0 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 32 29  Integerify(pIn2)
1a1f0 3b 0a 20 20 20 20 70 32 20 3d 20 28 69 6e 74 29  ;.    p2 = (int)
1a200 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 2f  pIn2->u.i;.    /
1a210 2a 20 54 68 65 20 70 32 20 76 61 6c 75 65 20 61  * The p2 value a
1a220 6c 77 61 79 73 20 63 6f 6d 65 73 20 66 72 6f 6d  lways comes from
1a230 20 61 20 70 72 69 6f 72 20 4f 50 5f 43 72 65 61   a prior OP_Crea
1a240 74 65 54 61 62 6c 65 20 6f 70 63 6f 64 65 20 61  teTable opcode a
1a250 6e 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 6f  nd.    ** that o
1a260 70 63 6f 64 65 20 77 69 6c 6c 20 61 6c 77 61 79  pcode will alway
1a270 73 20 73 65 74 20 74 68 65 20 70 32 20 76 61 6c  s set the p2 val
1a280 75 65 20 74 6f 20 32 20 6f 72 20 6d 6f 72 65 20  ue to 2 or more 
1a290 6f 72 20 65 6c 73 65 20 66 61 69 6c 2e 0a 20 20  or else fail..  
1a2a0 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 77 65    ** If there we
1a2b0 72 65 20 61 20 66 61 69 6c 75 72 65 2c 20 74 68  re a failure, th
1a2c0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
1a2d0 6d 65 6e 74 20 77 6f 75 6c 64 20 68 61 76 65 20  ment would have 
1a2e0 68 61 6c 74 65 64 0a 20 20 20 20 2a 2a 20 62 65  halted.    ** be
1a2f0 66 6f 72 65 20 72 65 61 63 68 69 6e 67 20 74 68  fore reaching th
1a300 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  is instruction. 
1a310 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  */.    if( NEVER
1a320 28 70 32 3c 32 29 20 29 20 7b 0a 20 20 20 20 20  (p2<2) ) {.     
1a330 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1a340 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1a350 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
1a360 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  to_error;.    }.
1a370 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70    }.  if( pOp->p
1a380 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46  4type==P4_KEYINF
1a390 4f 20 29 7b 0a 20 20 20 20 70 4b 65 79 49 6e 66  O ){.    pKeyInf
1a3a0 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  o = pOp->p4.pKey
1a3b0 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Info;.    pKeyIn
1a3c0 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 70 2d  fo->enc = ENC(p-
1a3d0 3e 64 62 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64  >db);.    nField
1a3e0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   = pKeyInfo->nFi
1a3f0 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58  eld+pKeyInfo->nX
1a400 46 69 65 6c 64 3b 0a 20 20 7d 65 6c 73 65 20 69  Field;.  }else i
1a410 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
1a420 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
1a430 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 34  nField = pOp->p4
1a440 2e 69 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  .i;.  }.  assert
1a450 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a  ( pOp->p1>=0 );.
1a460 20 20 70 43 75 72 20 3d 20 61 6c 6c 6f 63 61 74    pCur = allocat
1a470 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e  eCursor(p, pOp->
1a480 70 31 2c 20 6e 46 69 65 6c 64 2c 20 69 44 62 2c  p1, nField, iDb,
1a490 20 31 29 3b 0a 20 20 69 66 28 20 70 43 75 72 3d   1);.  if( pCur=
1a4a0 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
1a4b0 3b 0a 20 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f  ;.  pCur->nullRo
1a4c0 77 20 3d 20 31 3b 0a 20 20 70 43 75 72 2d 3e 69  w = 1;.  pCur->i
1a4d0 73 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20  sOrdered = 1;.  
1a4e0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1a4f0 65 43 75 72 73 6f 72 28 70 58 2c 20 70 32 2c 20  eCursor(pX, p2, 
1a500 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f  wrFlag, pKeyInfo
1a510 2c 20 70 43 75 72 2d 3e 70 43 75 72 73 6f 72 29  , pCur->pCursor)
1a520 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ;.  pCur->pKeyIn
1a530 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
1a540 20 61 73 73 65 72 74 28 20 4f 50 46 4c 41 47 5f   assert( OPFLAG_
1a550 42 55 4c 4b 43 53 52 3d 3d 42 54 52 45 45 5f 42  BULKCSR==BTREE_B
1a560 55 4c 4b 4c 4f 41 44 20 29 3b 0a 20 20 73 71 6c  ULKLOAD );.  sql
1a570 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
1a580 69 6e 74 73 28 70 43 75 72 2d 3e 70 43 75 72 73  ints(pCur->pCurs
1a590 6f 72 2c 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f  or, (pOp->p5 & O
1a5a0 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 29 29 3b  PFLAG_BULKCSR));
1a5b0 0a 0a 20 20 2f 2a 20 53 69 6e 63 65 20 69 74 20  ..  /* Since it 
1a5c0 70 65 72 66 6f 72 6d 73 20 6e 6f 20 6d 65 6d 6f  performs no memo
1a5d0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 72  ry allocation or
1a5e0 20 49 4f 2c 20 74 68 65 20 6f 6e 6c 79 20 76 61   IO, the only va
1a5f0 6c 75 65 20 74 68 61 74 0a 20 20 2a 2a 20 73 71  lue that.  ** sq
1a600 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1a610 28 29 20 6d 61 79 20 72 65 74 75 72 6e 20 69 73  () may return is
1a620 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 2a 2f 0a 20   SQLITE_OK. */. 
1a630 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1a640 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20  ITE_OK );..  /* 
1a650 53 65 74 20 74 68 65 20 56 64 62 65 43 75 72 73  Set the VdbeCurs
1a660 6f 72 2e 69 73 54 61 62 6c 65 20 61 6e 64 20 69  or.isTable and i
1a670 73 49 6e 64 65 78 20 76 61 72 69 61 62 6c 65 73  sIndex variables
1a680 2e 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69  . Previous versi
1a690 6f 6e 73 20 6f 66 0a 20 20 2a 2a 20 53 51 4c 69  ons of.  ** SQLi
1a6a0 74 65 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  te used to check
1a6b0 20 69 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   if the root-pag
1a6c0 65 20 66 6c 61 67 73 20 77 65 72 65 20 73 61 6e  e flags were san
1a6d0 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 0a  e at this point.
1a6e0 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 20    ** and report 
1a6f0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1a700 69 6f 6e 20 69 66 20 74 68 65 79 20 77 65 72 65  ion if they were
1a710 20 6e 6f 74 2c 20 62 75 74 20 74 68 69 73 20 63   not, but this c
1a720 68 65 63 6b 20 68 61 73 0a 20 20 2a 2a 20 73 69  heck has.  ** si
1a730 6e 63 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74  nce moved into t
1a740 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 20  he btree layer. 
1a750 20 2a 2f 20 20 0a 20 20 70 43 75 72 2d 3e 69 73   */  .  pCur->is
1a760 54 61 62 6c 65 20 3d 20 70 4f 70 2d 3e 70 34 74  Table = pOp->p4t
1a770 79 70 65 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 3b  ype!=P4_KEYINFO;
1a780 0a 20 20 70 43 75 72 2d 3e 69 73 49 6e 64 65 78  .  pCur->isIndex
1a790 20 3d 20 21 70 43 75 72 2d 3e 69 73 54 61 62 6c   = !pCur->isTabl
1a7a0 65 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  e;.  break;.}../
1a7b0 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 45 70  * Opcode: OpenEp
1a7c0 68 65 6d 65 72 61 6c 20 50 31 20 50 32 20 2a 20  hemeral P1 P2 * 
1a7d0 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  P4 P5.**.** Open
1a7e0 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 50 31   a new cursor P1
1a7f0 20 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 20   to a transient 
1a800 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 63 75  table..** The cu
1a810 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 20 6f  rsor is always o
1a820 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65  pened read/write
1a830 20 65 76 65 6e 20 69 66 20 0a 2a 2a 20 74 68 65   even if .** the
1a840 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
1a850 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 54 68  s read-only.  Th
1a860 65 20 65 70 68 65 6d 65 72 61 6c 0a 2a 2a 20 74  e ephemeral.** t
1a870 61 62 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20  able is deleted 
1a880 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
1a890 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
1a8a0 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 50   closed..**.** P
1a8b0 32 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  2 is the number 
1a8c0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
1a8d0 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
1a8e0 65 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  e..** The cursor
1a8f0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 42 54 72   points to a BTr
1a900 65 65 20 74 61 62 6c 65 20 69 66 20 50 34 3d 3d  ee table if P4==
1a910 30 20 61 6e 64 20 74 6f 20 61 20 42 54 72 65 65  0 and to a BTree
1a920 20 69 6e 64 65 78 0a 2a 2a 20 69 66 20 50 34 20   index.** if P4 
1a930 69 73 20 6e 6f 74 20 30 2e 20 20 49 66 20 50 34  is not 0.  If P4
1a940 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
1a950 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79   points to a Key
1a960 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
1a970 2a 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  * that defines t
1a980 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 6b 65 79  he format of key
1a990 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  s in the index..
1a9a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
1a9b0 65 20 77 61 73 20 6f 6e 63 65 20 63 61 6c 6c 65  e was once calle
1a9c0 64 20 4f 70 65 6e 54 65 6d 70 2e 20 20 42 75 74  d OpenTemp.  But
1a9d0 20 74 68 61 74 20 63 72 65 61 74 65 64 0a 2a 2a   that created.**
1a9e0 20 63 6f 6e 66 75 73 69 6f 6e 20 62 65 63 61 75   confusion becau
1a9f0 73 65 20 74 68 65 20 74 65 72 6d 20 22 74 65 6d  se the term "tem
1aa00 70 20 74 61 62 6c 65 22 2c 20 6d 69 67 68 74 20  p table", might 
1aa10 72 65 66 65 72 20 65 69 74 68 65 72 0a 2a 2a 20  refer either.** 
1aa20 74 6f 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20  to a TEMP table 
1aa30 61 74 20 74 68 65 20 53 51 4c 20 6c 65 76 65 6c  at the SQL level
1aa40 2c 20 6f 72 20 74 6f 20 61 20 74 61 62 6c 65 20  , or to a table 
1aa50 6f 70 65 6e 65 64 20 62 79 0a 2a 2a 20 74 68 69  opened by.** thi
1aa60 73 20 6f 70 63 6f 64 65 2e 20 20 54 68 65 6e 20  s opcode.  Then 
1aa70 74 68 69 73 20 6f 70 63 6f 64 65 20 77 61 73 20  this opcode was 
1aa80 63 61 6c 6c 20 4f 70 65 6e 56 69 72 74 75 61 6c  call OpenVirtual
1aa90 2e 20 20 42 75 74 0a 2a 2a 20 74 68 61 74 20 63  .  But.** that c
1aaa0 72 65 61 74 65 64 20 63 6f 6e 66 75 73 69 6f 6e  reated confusion
1aab0 20 77 69 74 68 20 74 68 65 20 77 68 6f 6c 65 20   with the whole 
1aac0 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 69 64  virtual-table id
1aad0 65 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35  ea..**.** The P5
1aae0 20 70 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62   parameter can b
1aaf0 65 20 61 20 6d 61 73 6b 20 6f 66 20 74 68 65 20  e a mask of the 
1ab00 42 54 52 45 45 5f 2a 20 66 6c 61 67 73 20 64 65  BTREE_* flags de
1ab10 66 69 6e 65 64 0a 2a 2a 20 69 6e 20 62 74 72 65  fined.** in btre
1ab20 65 2e 68 2e 20 20 54 68 65 73 65 20 66 6c 61 67  e.h.  These flag
1ab30 73 20 63 6f 6e 74 72 6f 6c 20 61 73 70 65 63 74  s control aspect
1ab40 73 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 69  s of the operati
1ab50 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 62 74 72  on of.** the btr
1ab60 65 65 2e 20 20 54 68 65 20 42 54 52 45 45 5f 4f  ee.  The BTREE_O
1ab70 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20  MIT_JOURNAL and 
1ab80 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 66 6c 61  BTREE_SINGLE fla
1ab90 67 73 20 61 72 65 0a 2a 2a 20 61 64 64 65 64 20  gs are.** added 
1aba0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a  automatically..*
1abb0 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65  /./* Opcode: Ope
1abc0 6e 41 75 74 6f 69 6e 64 65 78 20 50 31 20 50 32  nAutoindex P1 P2
1abd0 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68   * P4 *.**.** Th
1abe0 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20  is opcode works 
1abf0 74 68 65 20 73 61 6d 65 20 61 73 20 4f 50 5f 4f  the same as OP_O
1ac00 70 65 6e 45 70 68 65 6d 65 72 61 6c 2e 20 20 49  penEphemeral.  I
1ac10 74 20 68 61 73 20 61 0a 2a 2a 20 64 69 66 66 65  t has a.** diffe
1ac20 72 65 6e 74 20 6e 61 6d 65 20 74 6f 20 64 69 73  rent name to dis
1ac30 74 69 6e 67 75 69 73 68 20 69 74 73 20 75 73 65  tinguish its use
1ac40 2e 20 20 54 61 62 6c 65 73 20 63 72 65 61 74 65  .  Tables create
1ac50 64 20 75 73 69 6e 67 0a 2a 2a 20 62 79 20 74 68  d using.** by th
1ac60 69 73 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62  is opcode will b
1ac70 65 20 75 73 65 64 20 66 6f 72 20 61 75 74 6f 6d  e used for autom
1ac80 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
1ac90 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 69 6e   transient.** in
1aca0 64 69 63 65 73 20 69 6e 20 6a 6f 69 6e 73 2e 0a  dices in joins..
1acb0 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 41  */.case OP_OpenA
1acc0 75 74 6f 69 6e 64 65 78 3a 20 0a 63 61 73 65 20  utoindex: .case 
1acd0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1ace0 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
1acf0 20 2a 70 43 78 3b 0a 20 20 73 74 61 74 69 63 20   *pCx;.  static 
1ad00 63 6f 6e 73 74 20 69 6e 74 20 76 66 73 46 6c 61  const int vfsFla
1ad10 67 73 20 3d 20 0a 20 20 20 20 20 20 53 51 4c 49  gs = .      SQLI
1ad20 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1ad30 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45  E |.      SQLITE
1ad40 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
1ad50 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1ad60 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
1ad70 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
1ad80 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
1ad90 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1ada0 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 3b 0a 0a  _TRANSIENT_DB;..
1adb0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1adc0 31 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20 3d 20  1>=0 );.  pCx = 
1add0 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70  allocateCursor(p
1ade0 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
1adf0 70 32 2c 20 2d 31 2c 20 31 29 3b 0a 20 20 69 66  p2, -1, 1);.  if
1ae00 28 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20  ( pCx==0 ) goto 
1ae10 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e  no_mem;.  pCx->n
1ae20 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 63  ullRow = 1;.  rc
1ae30 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f   = sqlite3BtreeO
1ae40 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c  pen(db->pVfs, 0,
1ae50 20 64 62 2c 20 26 70 43 78 2d 3e 70 42 74 2c 20   db, &pCx->pBt, 
1ae60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ae70 20 20 20 20 20 20 20 20 20 42 54 52 45 45 5f 4f           BTREE_O
1ae80 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 7c 20 42 54  MIT_JOURNAL | BT
1ae90 52 45 45 5f 53 49 4e 47 4c 45 20 7c 20 70 4f 70  REE_SINGLE | pOp
1aea0 2d 3e 70 35 2c 20 76 66 73 46 6c 61 67 73 29 3b  ->p5, vfsFlags);
1aeb0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1aec0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1aed0 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
1aee0 69 6e 54 72 61 6e 73 28 70 43 78 2d 3e 70 42 74  inTrans(pCx->pBt
1aef0 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 1);.  }.  if( 
1af00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1af10 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 72 61  .    /* If a tra
1af20 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 69 73 20  nsient index is 
1af30 72 65 71 75 69 72 65 64 2c 20 63 72 65 61 74 65  required, create
1af40 20 69 74 20 62 79 20 63 61 6c 6c 69 6e 67 0a 20   it by calling. 
1af50 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72     ** sqlite3Btr
1af60 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 20  eeCreateTable() 
1af70 77 69 74 68 20 74 68 65 20 42 54 52 45 45 5f 42  with the BTREE_B
1af80 4c 4f 42 4b 45 59 20 66 6c 61 67 20 62 65 66 6f  LOBKEY flag befo
1af90 72 65 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  re.    ** openin
1afa0 67 20 69 74 2e 20 49 66 20 61 20 74 72 61 6e 73  g it. If a trans
1afb0 69 65 6e 74 20 74 61 62 6c 65 20 69 73 20 72 65  ient table is re
1afc0 71 75 69 72 65 64 2c 20 6a 75 73 74 20 75 73 65  quired, just use
1afd0 20 74 68 65 0a 20 20 20 20 2a 2a 20 61 75 74 6f   the.    ** auto
1afe0 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65  matically create
1aff0 64 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  d table with roo
1b000 74 2d 70 61 67 65 20 31 20 28 61 6e 20 42 4c 4f  t-page 1 (an BLO
1b010 42 5f 49 4e 54 4b 45 59 20 74 61 62 6c 65 29 2e  B_INTKEY table).
1b020 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1b030 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
1b040 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 67   ){.      int pg
1b050 6e 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  no;.      assert
1b060 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
1b070 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20 20  4_KEYINFO );.   
1b080 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1b090 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
1b0a0 70 43 78 2d 3e 70 42 74 2c 20 26 70 67 6e 6f 2c  pCx->pBt, &pgno,
1b0b0 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 20 7c   BTREE_BLOBKEY |
1b0c0 20 70 4f 70 2d 3e 70 35 29 3b 20 0a 20 20 20 20   pOp->p5); .    
1b0d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b0e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
1b0f0 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d 4d 41 53  ssert( pgno==MAS
1b100 54 45 52 5f 52 4f 4f 54 2b 31 20 29 3b 0a 20 20  TER_ROOT+1 );.  
1b110 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1b120 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 70 43  e3BtreeCursor(pC
1b130 78 2d 3e 70 42 74 2c 20 70 67 6e 6f 2c 20 31 2c  x->pBt, pgno, 1,
1b140 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b160 20 20 28 4b 65 79 49 6e 66 6f 2a 29 70 4f 70 2d    (KeyInfo*)pOp-
1b170 3e 70 34 2e 7a 2c 20 70 43 78 2d 3e 70 43 75 72  >p4.z, pCx->pCur
1b180 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 70 43  sor);.        pC
1b190 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f  x->pKeyInfo = pO
1b1a0 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
1b1b0 20 20 20 20 20 20 20 20 70 43 78 2d 3e 70 4b 65          pCx->pKe
1b1c0 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43  yInfo->enc = ENC
1b1d0 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 7d  (p->db);.      }
1b1e0 0a 20 20 20 20 20 20 70 43 78 2d 3e 69 73 54 61  .      pCx->isTa
1b1f0 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ble = 0;.    }el
1b200 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
1b210 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1b220 72 28 70 43 78 2d 3e 70 42 74 2c 20 4d 41 53 54  r(pCx->pBt, MAST
1b230 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 30 2c 20 70  ER_ROOT, 1, 0, p
1b240 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20  Cx->pCursor);.  
1b250 20 20 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65      pCx->isTable
1b260 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
1b270 20 20 70 43 78 2d 3e 69 73 4f 72 64 65 72 65 64    pCx->isOrdered
1b280 20 3d 20 28 70 4f 70 2d 3e 70 35 21 3d 42 54 52   = (pOp->p5!=BTR
1b290 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
1b2a0 20 70 43 78 2d 3e 69 73 49 6e 64 65 78 20 3d 20   pCx->isIndex = 
1b2b0 21 70 43 78 2d 3e 69 73 54 61 62 6c 65 3b 0a 20  !pCx->isTable;. 
1b2c0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
1b2d0 63 6f 64 65 3a 20 53 6f 72 74 65 72 4f 70 65 6e  code: SorterOpen
1b2e0 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a   P1 P2 * P4 *.**
1b2f0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
1b300 77 6f 72 6b 73 20 6c 69 6b 65 20 4f 50 5f 4f 70  works like OP_Op
1b310 65 6e 45 70 68 65 6d 65 72 61 6c 20 65 78 63 65  enEphemeral exce
1b320 70 74 20 74 68 61 74 20 69 74 20 6f 70 65 6e 73  pt that it opens
1b330 0a 2a 2a 20 61 20 74 72 61 6e 73 69 65 6e 74 20  .** a transient 
1b340 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 73 70  index that is sp
1b350 65 63 69 66 69 63 61 6c 6c 79 20 64 65 73 69 67  ecifically desig
1b360 6e 65 64 20 74 6f 20 73 6f 72 74 20 6c 61 72 67  ned to sort larg
1b370 65 0a 2a 2a 20 74 61 62 6c 65 73 20 75 73 69 6e  e.** tables usin
1b380 67 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 6d 65  g an external me
1b390 72 67 65 2d 73 6f 72 74 20 61 6c 67 6f 72 69 74  rge-sort algorit
1b3a0 68 6d 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  hm..*/.case OP_S
1b3b0 6f 72 74 65 72 4f 70 65 6e 3a 20 7b 0a 20 20 56  orterOpen: {.  V
1b3c0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a  dbeCursor *pCx;.
1b3d0 0a 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74  .  pCx = allocat
1b3e0 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e  eCursor(p, pOp->
1b3f0 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d 31 2c  p1, pOp->p2, -1,
1b400 20 31 29 3b 0a 20 20 69 66 28 20 70 43 78 3d 3d   1);.  if( pCx==
1b410 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
1b420 0a 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f  .  pCx->pKeyInfo
1b430 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
1b440 6e 66 6f 3b 0a 20 20 70 43 78 2d 3e 70 4b 65 79  nfo;.  pCx->pKey
1b450 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  Info->enc = ENC(
1b460 70 2d 3e 64 62 29 3b 0a 20 20 70 43 78 2d 3e 69  p->db);.  pCx->i
1b470 73 53 6f 72 74 65 72 20 3d 20 31 3b 0a 20 20 72  sSorter = 1;.  r
1b480 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  c = sqlite3VdbeS
1b490 6f 72 74 65 72 49 6e 69 74 28 64 62 2c 20 70 43  orterInit(db, pC
1b4a0 78 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  x);.  break;.}..
1b4b0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 50  /* Opcode: OpenP
1b4c0 73 65 75 64 6f 20 50 31 20 50 32 20 50 33 20 2a  seudo P1 P2 P3 *
1b4d0 20 50 35 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61   P5.**.** Open a
1b4e0 20 6e 65 77 20 63 75 72 73 6f 72 20 74 68 61 74   new cursor that
1b4f0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 61 6b   points to a fak
1b500 65 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e  e table that con
1b510 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 0a 2a  tains a single.*
1b520 2a 20 72 6f 77 20 6f 66 20 64 61 74 61 2e 20 20  * row of data.  
1b530 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
1b540 68 61 74 20 6f 6e 65 20 72 6f 77 20 69 6e 20 74  hat one row in t
1b550 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6d 65  he content of me
1b560 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 73 74 65 72  mory.** register
1b570 20 50 32 20 77 68 65 6e 20 50 35 3d 3d 30 2e 20   P2 when P5==0. 
1b580 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1b590 20 63 75 72 73 6f 72 20 50 31 20 62 65 63 6f 6d   cursor P1 becom
1b5a0 65 73 20 61 6e 20 61 6c 69 61 73 20 66 6f 72 20  es an alias for 
1b5b0 74 68 65 20 0a 2a 2a 20 4d 45 4d 5f 42 6c 6f 62  the .** MEM_Blob
1b5c0 20 63 6f 6e 74 65 6e 74 20 63 6f 6e 74 61 69 6e   content contain
1b5d0 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
1b5e0 32 2e 20 20 57 68 65 6e 20 50 35 3d 3d 31 2c 20  2.  When P5==1, 
1b5f0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20  then the.** row 
1b600 69 73 20 72 65 70 72 65 73 65 6e 74 65 64 20 62  is represented b
1b610 79 20 50 33 20 63 6f 6e 73 65 63 75 74 69 76 65  y P3 consecutive
1b620 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e   registers begin
1b630 6e 69 6e 67 20 77 69 74 68 20 50 32 2e 0a 2a 2a  ning with P2..**
1b640 0a 2a 2a 20 41 20 70 73 65 75 64 6f 2d 74 61 62  .** A pseudo-tab
1b650 6c 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68  le created by th
1b660 69 73 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  is opcode is use
1b670 64 20 74 6f 20 68 6f 6c 64 20 61 20 73 69 6e 67  d to hold a sing
1b680 6c 65 0a 2a 2a 20 72 6f 77 20 6f 75 74 70 75 74  le.** row output
1b690 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72   from the sorter
1b6a0 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 6f 77   so that the row
1b6b0 20 63 61 6e 20 62 65 20 64 65 63 6f 6d 70 6f 73   can be decompos
1b6c0 65 64 20 69 6e 74 6f 0a 2a 2a 20 69 6e 64 69 76  ed into.** indiv
1b6d0 69 64 75 61 6c 20 63 6f 6c 75 6d 6e 73 20 75 73  idual columns us
1b6e0 69 6e 67 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d  ing the OP_Colum
1b6f0 6e 20 6f 70 63 6f 64 65 2e 20 20 54 68 65 20 4f  n opcode.  The O
1b700 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 0a  P_Column opcode.
1b710 2a 2a 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 63  ** is the only c
1b720 75 72 73 6f 72 20 6f 70 63 6f 64 65 20 74 68 61  ursor opcode tha
1b730 74 20 77 6f 72 6b 73 20 77 69 74 68 20 61 20 70  t works with a p
1b740 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a  seudo-table..**.
1b750 2a 2a 20 50 33 20 69 73 20 74 68 65 20 6e 75 6d  ** P3 is the num
1b760 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
1b770 20 74 68 65 20 72 65 63 6f 72 64 73 20 74 68 61   the records tha
1b780 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  t will be stored
1b790 20 62 79 0a 2a 2a 20 74 68 65 20 70 73 65 75 64   by.** the pseud
1b7a0 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65  o-table..*/.case
1b7b0 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 3a 20   OP_OpenPseudo: 
1b7c0 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
1b7d0 70 43 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pCx;..  assert( 
1b7e0 70 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20  pOp->p1>=0 );.  
1b7f0 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75  pCx = allocateCu
1b800 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c  rsor(p, pOp->p1,
1b810 20 70 4f 70 2d 3e 70 33 2c 20 2d 31 2c 20 30 29   pOp->p3, -1, 0)
1b820 3b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29  ;.  if( pCx==0 )
1b830 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
1b840 70 43 78 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31  pCx->nullRow = 1
1b850 3b 0a 20 20 70 43 78 2d 3e 70 73 65 75 64 6f 54  ;.  pCx->pseudoT
1b860 61 62 6c 65 52 65 67 20 3d 20 70 4f 70 2d 3e 70  ableReg = pOp->p
1b870 32 3b 0a 20 20 70 43 78 2d 3e 69 73 54 61 62 6c  2;.  pCx->isTabl
1b880 65 20 3d 20 31 3b 0a 20 20 70 43 78 2d 3e 69 73  e = 1;.  pCx->is
1b890 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 43 78  Index = 0;.  pCx
1b8a0 2d 3e 6d 75 6c 74 69 50 73 65 75 64 6f 20 3d 20  ->multiPseudo = 
1b8b0 70 4f 70 2d 3e 70 35 3b 0a 20 20 62 72 65 61 6b  pOp->p5;.  break
1b8c0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1b8d0 43 6c 6f 73 65 20 50 31 20 2a 20 2a 20 2a 20 2a  Close P1 * * * *
1b8e0 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  .**.** Close a c
1b8f0 75 72 73 6f 72 20 70 72 65 76 69 6f 75 73 6c 79  ursor previously
1b900 20 6f 70 65 6e 65 64 20 61 73 20 50 31 2e 20 20   opened as P1.  
1b910 49 66 20 50 31 20 69 73 20 6e 6f 74 0a 2a 2a 20  If P1 is not.** 
1b920 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20  currently open, 
1b930 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
1b940 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1b950 63 61 73 65 20 4f 50 5f 43 6c 6f 73 65 3a 20 7b  case OP_Close: {
1b960 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1b970 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
1b980 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
1b990 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
1b9a0 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43  Cursor(p, p->apC
1b9b0 73 72 5b 70 4f 70 2d 3e 70 31 5d 29 3b 0a 20 20  sr[pOp->p1]);.  
1b9c0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
1b9d0 5d 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a  ] = 0;.  break;.
1b9e0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65  }../* Opcode: Se
1b9f0 65 6b 47 65 20 50 31 20 50 32 20 50 33 20 50 34  ekGe P1 P2 P3 P4
1ba00 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73   *.**.** If curs
1ba10 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f 20  or P1 refers to 
1ba20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d  an SQL table (B-
1ba30 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20 69  Tree that uses i
1ba40 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a  nteger keys), .*
1ba50 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20  * use the value 
1ba60 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 61  in register P3 a
1ba70 73 20 74 68 65 20 6b 65 79 2e 20 20 49 66 20 63  s the key.  If c
1ba80 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73 20  ursor P1 refers 
1ba90 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e  .** to an SQL in
1baa0 64 65 78 2c 20 74 68 65 6e 20 50 33 20 69 73 20  dex, then P3 is 
1bab0 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
1bac0 61 72 72 61 79 20 6f 66 20 50 34 20 72 65 67 69  array of P4 regi
1bad0 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 61  sters .** that a
1bae0 72 65 20 75 73 65 64 20 61 73 20 61 6e 20 75 6e  re used as an un
1baf0 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
1bb00 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74  . .**.** Reposit
1bb10 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 73 6f  ion cursor P1 so
1bb20 20 74 68 61 74 20 20 69 74 20 70 6f 69 6e 74 73   that  it points
1bb30 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74   to the smallest
1bb40 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20   entry that .** 
1bb50 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1bb60 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
1bb70 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68  key value. If th
1bb80 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72  ere are no recor
1bb90 64 73 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74  ds .** greater t
1bba0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1bbb0 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69  the key and P2 i
1bbc0 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
1bbd0 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a   jump to P2..**.
1bbe0 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
1bbf0 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69  nd, NotFound, Di
1bc00 73 74 69 6e 63 74 2c 20 53 65 65 6b 4c 74 2c 20  stinct, SeekLt, 
1bc10 53 65 65 6b 47 74 2c 20 53 65 65 6b 4c 65 0a 2a  SeekGt, SeekLe.*
1bc20 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65  /./* Opcode: See
1bc30 6b 47 74 20 50 31 20 50 32 20 50 33 20 50 34 20  kGt P1 P2 P3 P4 
1bc40 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f  *.**.** If curso
1bc50 72 20 50 31 20 72 65 66 65 72 73 20 74 6f 20 61  r P1 refers to a
1bc60 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54  n SQL table (B-T
1bc70 72 65 65 20 74 68 61 74 20 75 73 65 73 20 69 6e  ree that uses in
1bc80 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a  teger keys), .**
1bc90 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 69   use the value i
1bca0 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 61 73  n register P3 as
1bcb0 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73 6f   a key. If curso
1bcc0 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20  r P1 refers .** 
1bcd0 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c  to an SQL index,
1bce0 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20   then P3 is the 
1bcf0 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61  first in an arra
1bd00 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72  y of P4 register
1bd10 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75  s .** that are u
1bd20 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b  sed as an unpack
1bd30 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a  ed index key. .*
1bd40 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20  *.** Reposition 
1bd50 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61  cursor P1 so tha
1bd60 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  t  it points to 
1bd70 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74  the smallest ent
1bd80 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 67  ry that .** is g
1bd90 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
1bda0 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68  key value. If th
1bdb0 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72  ere are no recor
1bdc0 64 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ds greater than 
1bdd0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 61 6e 64 20  .** the key and 
1bde0 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  P2 is not zero, 
1bdf0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e  then jump to P2.
1be00 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
1be10 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64   Found, NotFound
1be20 2c 20 44 69 73 74 69 6e 63 74 2c 20 53 65 65 6b  , Distinct, Seek
1be30 4c 74 2c 20 53 65 65 6b 47 65 2c 20 53 65 65 6b  Lt, SeekGe, Seek
1be40 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  Le.*/./* Opcode:
1be50 20 53 65 65 6b 4c 74 20 50 31 20 50 32 20 50 33   SeekLt P1 P2 P3
1be60 20 50 34 20 2a 20 0a 2a 2a 0a 2a 2a 20 49 66 20   P4 * .**.** If 
1be70 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73  cursor P1 refers
1be80 20 74 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c 65   to an SQL table
1be90 20 28 42 2d 54 72 65 65 20 74 68 61 74 20 75 73   (B-Tree that us
1bea0 65 73 20 69 6e 74 65 67 65 72 20 6b 65 79 73 29  es integer keys)
1beb0 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65 20 76 61  , .** use the va
1bec0 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
1bed0 50 33 20 61 73 20 61 20 6b 65 79 2e 20 49 66 20  P3 as a key. If 
1bee0 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73  cursor P1 refers
1bef0 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69   .** to an SQL i
1bf00 6e 64 65 78 2c 20 74 68 65 6e 20 50 33 20 69 73  ndex, then P3 is
1bf10 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e   the first in an
1bf20 20 61 72 72 61 79 20 6f 66 20 50 34 20 72 65 67   array of P4 reg
1bf30 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20  isters .** that 
1bf40 61 72 65 20 75 73 65 64 20 61 73 20 61 6e 20 75  are used as an u
1bf50 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
1bf60 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69  y. .**.** Reposi
1bf70 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 73  tion cursor P1 s
1bf80 6f 20 74 68 61 74 20 20 69 74 20 70 6f 69 6e 74  o that  it point
1bf90 73 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74  s to the largest
1bfa0 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20   entry that .** 
1bfb0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  is less than the
1bfc0 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74   key value. If t
1bfd0 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f  here are no reco
1bfe0 72 64 73 20 6c 65 73 73 20 74 68 61 6e 20 0a 2a  rds less than .*
1bff0 2a 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32  * the key and P2
1c000 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
1c010 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a  en jump to P2..*
1c020 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46  *.** See also: F
1c030 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20  ound, NotFound, 
1c040 44 69 73 74 69 6e 63 74 2c 20 53 65 65 6b 47 74  Distinct, SeekGt
1c050 2c 20 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c 65  , SeekGe, SeekLe
1c060 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .*/./* Opcode: S
1c070 65 65 6b 4c 65 20 50 31 20 50 32 20 50 33 20 50  eekLe P1 P2 P3 P
1c080 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72  4 *.**.** If cur
1c090 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f  sor P1 refers to
1c0a0 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42   an SQL table (B
1c0b0 2d 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20  -Tree that uses 
1c0c0 69 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a  integer keys), .
1c0d0 2a 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65  ** use the value
1c0e0 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20   in register P3 
1c0f0 61 73 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72  as a key. If cur
1c100 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a  sor P1 refers .*
1c110 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  * to an SQL inde
1c120 78 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68  x, then P3 is th
1c130 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
1c140 72 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74  ray of P4 regist
1c150 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65  ers .** that are
1c160 20 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61   used as an unpa
1c170 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20  cked index key. 
1c180 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f  .**.** Repositio
1c190 6e 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74  n cursor P1 so t
1c1a0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
1c1b0 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74   the largest ent
1c1c0 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 6c  ry that .** is l
1c1d0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
1c1e0 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c  l to the key val
1c1f0 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ue. If there are
1c200 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20   no records .** 
1c210 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
1c220 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 61 6e  al to the key an
1c230 64 20 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f  d P2 is not zero
1c240 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50  , then jump to P
1c250 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  2..**.** See als
1c260 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75  o: Found, NotFou
1c270 6e 64 2c 20 44 69 73 74 69 6e 63 74 2c 20 53 65  nd, Distinct, Se
1c280 65 6b 47 74 2c 20 53 65 65 6b 47 65 2c 20 53 65  ekGt, SeekGe, Se
1c290 65 6b 4c 74 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ekLt.*/.case OP_
1c2a0 53 65 65 6b 4c 74 3a 20 20 20 20 20 20 20 20 20  SeekLt:         
1c2b0 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a  /* jump, in3 */.
1c2c0 63 61 73 65 20 4f 50 5f 53 65 65 6b 4c 65 3a 20  case OP_SeekLe: 
1c2d0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
1c2e0 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in3 */.case OP_
1c2f0 53 65 65 6b 47 65 3a 20 20 20 20 20 20 20 20 20  SeekGe:         
1c300 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a  /* jump, in3 */.
1c310 63 61 73 65 20 4f 50 5f 53 65 65 6b 47 74 3a 20  case OP_SeekGt: 
1c320 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c  {       /* jump,
1c330 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 72 65   in3 */.  int re
1c340 73 3b 0a 20 20 69 6e 74 20 6f 63 3b 0a 20 20 56  s;.  int oc;.  V
1c350 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
1c360 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1c370 72 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  r;.  int nField;
1c380 0a 20 20 69 36 34 20 69 4b 65 79 3b 20 20 20 20  .  i64 iKey;    
1c390 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 77    /* The rowid w
1c3a0 65 20 61 72 65 20 74 6f 20 73 65 65 6b 20 74 6f  e are to seek to
1c3b0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1c3c0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
1c3d0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
1c3e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
1c3f0 2d 3e 70 32 21 3d 30 20 29 3b 0a 20 20 70 43 20  ->p2!=0 );.  pC 
1c400 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
1c410 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
1c420 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
1c430 28 20 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c  ( pC->pseudoTabl
1c440 65 52 65 67 3d 3d 30 20 29 3b 0a 20 20 61 73 73  eReg==0 );.  ass
1c450 65 72 74 28 20 4f 50 5f 53 65 65 6b 4c 65 20 3d  ert( OP_SeekLe =
1c460 3d 20 4f 50 5f 53 65 65 6b 4c 74 2b 31 20 29 3b  = OP_SeekLt+1 );
1c470 0a 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65  .  assert( OP_Se
1c480 65 6b 47 65 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c  ekGe == OP_SeekL
1c490 74 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t+2 );.  assert(
1c4a0 20 4f 50 5f 53 65 65 6b 47 74 20 3d 3d 20 4f 50   OP_SeekGt == OP
1c4b0 5f 53 65 65 6b 4c 74 2b 33 20 29 3b 0a 20 20 61  _SeekLt+3 );.  a
1c4c0 73 73 65 72 74 28 20 70 43 2d 3e 69 73 4f 72 64  ssert( pC->isOrd
1c4d0 65 72 65 64 20 29 3b 0a 20 20 69 66 28 20 41 4c  ered );.  if( AL
1c4e0 57 41 59 53 28 70 43 2d 3e 70 43 75 72 73 6f 72  WAYS(pC->pCursor
1c4f0 21 3d 30 29 20 29 7b 0a 20 20 20 20 6f 63 20 3d  !=0) ){.    oc =
1c500 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pOp->opcode;.  
1c510 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20    pC->nullRow = 
1c520 30 3b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 69  0;.    if( pC->i
1c530 73 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  sTable ){.      
1c540 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 76 61 6c  /* The input val
1c550 75 65 20 69 6e 20 50 33 20 6d 69 67 68 74 20 62  ue in P3 might b
1c560 65 20 6f 66 20 61 6e 79 20 74 79 70 65 3a 20 69  e of any type: i
1c570 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73 74  nteger, real, st
1c580 72 69 6e 67 2c 0a 20 20 20 20 20 20 2a 2a 20 62  ring,.      ** b
1c590 6c 6f 62 2c 20 6f 72 20 4e 55 4c 4c 2e 20 20 42  lob, or NULL.  B
1c5a0 75 74 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  ut it needs to b
1c5b0 65 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65 66  e an integer bef
1c5c0 6f 72 65 20 77 65 20 63 61 6e 20 64 6f 0a 20 20  ore we can do.  
1c5d0 20 20 20 20 2a 2a 20 74 68 65 20 73 65 65 6b 2c      ** the seek,
1c5e0 20 73 6f 20 63 6f 76 65 72 74 20 69 74 2e 20 2a   so covert it. *
1c5f0 2f 0a 20 20 20 20 20 20 70 49 6e 33 20 3d 20 26  /.      pIn3 = &
1c600 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
1c610 20 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69       applyNumeri
1c620 63 41 66 66 69 6e 69 74 79 28 70 49 6e 33 29 3b  cAffinity(pIn3);
1c630 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 73 71  .      iKey = sq
1c640 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
1c650 65 28 70 49 6e 33 29 3b 0a 20 20 20 20 20 20 70  e(pIn3);.      p
1c660 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  C->rowidIsValid 
1c670 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  = 0;..      /* I
1c680 66 20 74 68 65 20 50 33 20 76 61 6c 75 65 20 63  f the P3 value c
1c690 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6f 6e 76  ould not be conv
1c6a0 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e  erted into an in
1c6b0 74 65 67 65 72 20 77 69 74 68 6f 75 74 0a 20 20  teger without.  
1c6c0 20 20 20 20 2a 2a 20 6c 6f 73 73 20 6f 66 20 69      ** loss of i
1c6d0 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20 74 68 65 6e  nformation, then
1c6e0 20 73 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73   special process
1c6f0 69 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2e  ing is required.
1c700 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .. */.      if( 
1c710 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn3->flags & M
1c720 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20  EM_Int)==0 ){.  
1c730 20 20 20 20 20 20 69 66 28 20 28 70 49 6e 33 2d        if( (pIn3-
1c740 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
1c750 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
1c760 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 33 20     /* If the P3 
1c770 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20  value cannot be 
1c780 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
1c790 6e 79 20 6b 69 6e 64 20 6f 66 20 61 20 6e 75 6d  ny kind of a num
1c7a0 62 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 2a  ber,.          *
1c7b0 2a 20 74 68 65 6e 20 74 68 65 20 73 65 65 6b 20  * then the seek 
1c7c0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c  is not possible,
1c7d0 20 73 6f 20 6a 75 6d 70 20 74 6f 20 50 32 20 2a   so jump to P2 *
1c7e0 2f 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d  /.          pc =
1c7f0 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
1c800 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c810 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c820 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
1c830 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
1c840 20 74 68 65 20 50 33 20 76 61 6c 75 65 20 6d 75   the P3 value mu
1c850 73 74 20 62 65 20 61 20 66 6c 6f 61 74 69 6e 67  st be a floating
1c860 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e  .        ** poin
1c870 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20  t number. */.   
1c880 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 49       assert( (pI
1c890 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n3->flags & MEM_
1c8a0 52 65 61 6c 29 21 3d 30 20 29 3b 0a 0a 20 20 20  Real)!=0 );..   
1c8b0 20 20 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 53       if( iKey==S
1c8c0 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 26 26  MALLEST_INT64 &&
1c8d0 20 28 70 49 6e 33 2d 3e 72 3c 28 64 6f 75 62 6c   (pIn3->r<(doubl
1c8e0 65 29 69 4b 65 79 20 7c 7c 20 70 49 6e 33 2d 3e  e)iKey || pIn3->
1c8f0 72 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  r>0) ){.        
1c900 20 20 2f 2a 20 54 68 65 20 50 33 20 76 61 6c 75    /* The P3 valu
1c910 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 69  e is too large i
1c920 6e 20 6d 61 67 6e 69 74 75 64 65 20 74 6f 20 62  n magnitude to b
1c930 65 20 65 78 70 72 65 73 73 65 64 20 61 73 20 61  e expressed as a
1c940 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  n.          ** i
1c950 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
1c960 20 20 20 20 20 72 65 73 20 3d 20 31 3b 0a 20 20       res = 1;.  
1c970 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 33          if( pIn3
1c980 2d 3e 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ->r<0 ){.       
1c990 20 20 20 20 20 69 66 28 20 6f 63 3e 3d 4f 50 5f       if( oc>=OP_
1c9a0 53 65 65 6b 47 65 20 29 7b 20 20 61 73 73 65 72  SeekGe ){  asser
1c9b0 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 65  t( oc==OP_SeekGe
1c9c0 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47   || oc==OP_SeekG
1c9d0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t );.           
1c9e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1c9f0 74 72 65 65 46 69 72 73 74 28 70 43 2d 3e 70 43  treeFirst(pC->pC
1ca00 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20  ursor, &res);.  
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ca20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1ca30 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
1ca40 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  o_error;.       
1ca50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1ca60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ca70 20 20 20 20 69 66 28 20 6f 63 3c 3d 4f 50 5f 53      if( oc<=OP_S
1ca80 65 65 6b 4c 65 20 29 7b 20 20 61 73 73 65 72 74  eekLe ){  assert
1ca90 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20  ( oc==OP_SeekLt 
1caa0 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65  || oc==OP_SeekLe
1cab0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1cac0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1cad0 72 65 65 4c 61 73 74 28 70 43 2d 3e 70 43 75 72  reeLast(pC->pCur
1cae0 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  sor, &res);.    
1caf0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1cb00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1cb10 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1cb20 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  error;.         
1cb30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1cb40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1cb50 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
1cb60 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
1cb70 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
1cb80 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1cb90 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1cba0 66 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74  f( oc==OP_SeekLt
1cbb0 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47   || oc==OP_SeekG
1cbc0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  e ){.          /
1cbd0 2a 20 55 73 65 20 74 68 65 20 63 65 69 6c 69 6e  * Use the ceilin
1cbe0 67 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  g() function to 
1cbf0 63 6f 6e 76 65 72 74 20 72 65 61 6c 2d 3e 69 6e  convert real->in
1cc00 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  t */.          i
1cc10 66 28 20 70 49 6e 33 2d 3e 72 20 3e 20 28 64 6f  f( pIn3->r > (do
1cc20 75 62 6c 65 29 69 4b 65 79 20 29 20 69 4b 65 79  uble)iKey ) iKey
1cc30 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
1cc40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1cc50 55 73 65 20 74 68 65 20 66 6c 6f 6f 72 28 29 20  Use the floor() 
1cc60 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 6f 6e 76  function to conv
1cc70 65 72 74 20 72 65 61 6c 2d 3e 69 6e 74 20 2a 2f  ert real->int */
1cc80 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1cc90 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65  t( oc==OP_SeekLe
1cca0 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47   || oc==OP_SeekG
1ccb0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  t );.          i
1ccc0 66 28 20 70 49 6e 33 2d 3e 72 20 3c 20 28 64 6f  f( pIn3->r < (do
1ccd0 75 62 6c 65 29 69 4b 65 79 20 29 20 69 4b 65 79  uble)iKey ) iKey
1cce0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  --;.        }.  
1ccf0 20 20 20 20 7d 20 0a 20 20 20 20 20 20 72 63 20      } .      rc 
1cd00 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
1cd10 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d  vetoUnpacked(pC-
1cd20 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 36  >pCursor, 0, (u6
1cd30 34 29 69 4b 65 79 2c 20 30 2c 20 26 72 65 73 29  4)iKey, 0, &res)
1cd40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1cd50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cd60 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
1cd70 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
1cd80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1cd90 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
1cda0 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c    pC->rowidIsVal
1cdb0 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  id = 1;.        
1cdc0 70 43 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  pC->lastRowid = 
1cdd0 69 4b 65 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iKey;.      }.  
1cde0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
1cdf0 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 34 2e  Field = pOp->p4.
1ce00 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  i;.      assert(
1ce10 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
1ce20 5f 49 4e 54 33 32 20 29 3b 0a 20 20 20 20 20 20  _INT32 );.      
1ce30 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 3e 30  assert( nField>0
1ce40 20 29 3b 0a 20 20 20 20 20 20 72 2e 70 4b 65 79   );.      r.pKey
1ce50 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49  Info = pC->pKeyI
1ce60 6e 66 6f 3b 0a 20 20 20 20 20 20 72 2e 6e 46 69  nfo;.      r.nFi
1ce70 65 6c 64 20 3d 20 28 75 31 36 29 6e 46 69 65 6c  eld = (u16)nFiel
1ce80 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  d;..      /* The
1ce90 20 6e 65 78 74 20 6c 69 6e 65 20 6f 66 20 63 6f   next line of co
1cea0 64 65 20 63 6f 6d 70 75 74 65 73 20 61 73 20 66  de computes as f
1ceb0 6f 6c 6c 6f 77 73 2c 20 6f 6e 6c 79 20 66 61 73  ollows, only fas
1cec0 74 65 72 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20  ter:.      **   
1ced0 69 66 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47  if( oc==OP_SeekG
1cee0 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  t || oc==OP_Seek
1cef0 4c 65 20 29 7b 0a 20 20 20 20 20 20 2a 2a 20 20  Le ){.      **  
1cf00 20 20 20 72 2e 66 6c 61 67 73 20 3d 20 55 4e 50     r.flags = UNP
1cf10 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 3b 0a 20  ACKED_INCRKEY;. 
1cf20 20 20 20 20 20 2a 2a 20 20 20 7d 65 6c 73 65 7b       **   }else{
1cf30 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 72 2e  .      **     r.
1cf40 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20  flags = 0;.     
1cf50 20 2a 2a 20 20 20 7d 0a 20 20 20 20 20 20 2a 2f   **   }.      */
1cf60 0a 20 20 20 20 20 20 72 2e 66 6c 61 67 73 20 3d  .      r.flags =
1cf70 20 28 75 38 29 28 55 4e 50 41 43 4b 45 44 5f 49   (u8)(UNPACKED_I
1cf80 4e 43 52 4b 45 59 20 2a 20 28 31 20 26 20 28 6f  NCRKEY * (1 & (o
1cf90 63 20 2d 20 4f 50 5f 53 65 65 6b 4c 74 29 29 29  c - OP_SeekLt)))
1cfa0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1cfb0 6f 63 21 3d 4f 50 5f 53 65 65 6b 47 74 20 7c 7c  oc!=OP_SeekGt ||
1cfc0 20 72 2e 66 6c 61 67 73 3d 3d 55 4e 50 41 43 4b   r.flags==UNPACK
1cfd0 45 44 5f 49 4e 43 52 4b 45 59 20 29 3b 0a 20 20  ED_INCRKEY );.  
1cfe0 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d      assert( oc!=
1cff0 4f 50 5f 53 65 65 6b 4c 65 20 7c 7c 20 72 2e 66  OP_SeekLe || r.f
1d000 6c 61 67 73 3d 3d 55 4e 50 41 43 4b 45 44 5f 49  lags==UNPACKED_I
1d010 4e 43 52 4b 45 59 20 29 3b 0a 20 20 20 20 20 20  NCRKEY );.      
1d020 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53  assert( oc!=OP_S
1d030 65 65 6b 47 65 20 7c 7c 20 72 2e 66 6c 61 67 73  eekGe || r.flags
1d040 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==0 );.      ass
1d050 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b  ert( oc!=OP_Seek
1d060 4c 74 20 7c 7c 20 72 2e 66 6c 61 67 73 3d 3d 30  Lt || r.flags==0
1d070 20 29 3b 0a 0a 20 20 20 20 20 20 72 2e 61 4d 65   );..      r.aMe
1d080 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  m = &aMem[pOp->p
1d090 33 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  3];.#ifdef SQLIT
1d0a0 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 7b 20  E_DEBUG.      { 
1d0b0 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20  int i; for(i=0; 
1d0c0 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29  i<r.nField; i++)
1d0d0 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
1d0e0 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20  lid(&r.aMem[i]) 
1d0f0 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20  ); }.#endif.    
1d100 20 20 45 78 70 61 6e 64 42 6c 6f 62 28 72 2e 61    ExpandBlob(r.a
1d110 4d 65 6d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Mem);.      rc =
1d120 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1d130 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e  etoUnpacked(pC->
1d140 70 43 75 72 73 6f 72 2c 20 26 72 2c 20 30 2c 20  pCursor, &r, 0, 
1d150 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20  0, &res);.      
1d160 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d170 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
1d180 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
1d190 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rror;.      }.  
1d1a0 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56      pC->rowidIsV
1d1b0 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  alid = 0;.    }.
1d1c0 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64      pC->deferred
1d1d0 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20  Moveto = 0;.    
1d1e0 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
1d1f0 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 23  = CACHE_STALE;.#
1d200 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1d210 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65  T.    sqlite3_se
1d220 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  arch_count++;.#e
1d230 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6f 63 3e  ndif.    if( oc>
1d240 3d 4f 50 5f 53 65 65 6b 47 65 20 29 7b 20 20 61  =OP_SeekGe ){  a
1d250 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65  ssert( oc==OP_Se
1d260 65 6b 47 65 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53  ekGe || oc==OP_S
1d270 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 20 20 69  eekGt );.      i
1d280 66 28 20 72 65 73 3c 30 20 7c 7c 20 28 72 65 73  f( res<0 || (res
1d290 3d 3d 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53 65  ==0 && oc==OP_Se
1d2a0 65 6b 47 74 29 20 29 7b 0a 20 20 20 20 20 20 20  ekGt) ){.       
1d2b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1d2c0 65 65 4e 65 78 74 28 70 43 2d 3e 70 43 75 72 73  eeNext(pC->pCurs
1d2d0 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20  or, &res);.     
1d2e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d2f0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72  E_OK ) goto abor
1d300 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
1d310 20 20 20 20 20 20 20 20 70 43 2d 3e 72 6f 77 69          pC->rowi
1d320 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  dIsValid = 0;.  
1d330 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d340 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20     res = 0;.    
1d350 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1d360 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 3d       assert( oc=
1d370 3d 4f 50 5f 53 65 65 6b 4c 74 20 7c 7c 20 6f 63  =OP_SeekLt || oc
1d380 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20  ==OP_SeekLe );. 
1d390 20 20 20 20 20 69 66 28 20 72 65 73 3e 30 20 7c       if( res>0 |
1d3a0 7c 20 28 72 65 73 3d 3d 30 20 26 26 20 6f 63 3d  | (res==0 && oc=
1d3b0 3d 4f 50 5f 53 65 65 6b 4c 74 29 20 29 7b 0a 20  =OP_SeekLt) ){. 
1d3c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1d3d0 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
1d3e0 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72  (pC->pCursor, &r
1d3f0 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
1d400 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d410 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
1d420 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
1d430 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c    pC->rowidIsVal
1d440 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  id = 0;.      }e
1d450 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1d460 72 65 73 20 6d 69 67 68 74 20 62 65 20 6e 65 67  res might be neg
1d470 61 74 69 76 65 20 62 65 63 61 75 73 65 20 74 68  ative because th
1d480 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1d490 2e 20 20 43 68 65 63 6b 20 74 6f 0a 20 20 20 20  .  Check to.    
1d4a0 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 74 68      ** see if th
1d4b0 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  is is the case..
1d4c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1d4d0 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
1d4e0 42 74 72 65 65 45 6f 66 28 70 43 2d 3e 70 43 75  BtreeEof(pC->pCu
1d4f0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
1d500 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1d510 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20   pOp->p2>0 );.  
1d520 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
1d530 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
1d540 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  - 1;.    }.  }el
1d550 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
1d560 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 74 74  happens when att
1d570 65 6d 70 74 69 6e 67 20 74 6f 20 6f 70 65 6e 20  empting to open 
1d580 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 61 73 74  the sqlite3_mast
1d590 65 72 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  er table.    ** 
1d5a0 66 6f 72 20 72 65 61 64 20 61 63 63 65 73 73 20  for read access 
1d5b0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45  returns SQLITE_E
1d5c0 4d 50 54 59 2e 20 49 6e 20 74 68 69 73 20 63 61  MPTY. In this ca
1d5d0 73 65 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a  se always.    **
1d5e0 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 28   take the jump (
1d5f0 73 69 6e 63 65 20 74 68 65 72 65 20 61 72 65 20  since there are 
1d600 6e 6f 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  no records in th
1d610 65 20 74 61 62 6c 65 29 2e 0a 20 20 20 20 2a 2f  e table)..    */
1d620 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70  .    pc = pOp->p
1d630 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65  2 - 1;.  }.  bre
1d640 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1d650 3a 20 53 65 65 6b 20 50 31 20 50 32 20 2a 20 2a  : Seek P1 P2 * *
1d660 20 2a 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61   *.**.** P1 is a
1d670 6e 20 6f 70 65 6e 20 74 61 62 6c 65 20 63 75 72  n open table cur
1d680 73 6f 72 20 61 6e 64 20 50 32 20 69 73 20 61 20  sor and P2 is a 
1d690 72 6f 77 69 64 20 69 6e 74 65 67 65 72 2e 20 20  rowid integer.  
1d6a0 41 72 72 61 6e 67 65 0a 2a 2a 20 66 6f 72 20 50  Arrange.** for P
1d6b0 31 20 74 6f 20 6d 6f 76 65 20 73 6f 20 74 68 61  1 to move so tha
1d6c0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
1d6d0 68 65 20 72 6f 77 69 64 20 67 69 76 65 6e 20 62  he rowid given b
1d6e0 79 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  y P2..**.** This
1d6f0 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 64   is actually a d
1d700 65 66 65 72 72 65 64 20 73 65 65 6b 2e 20 20 4e  eferred seek.  N
1d710 6f 74 68 69 6e 67 20 61 63 74 75 61 6c 6c 79 20  othing actually 
1d720 68 61 70 70 65 6e 73 20 75 6e 74 69 6c 0a 2a 2a  happens until.**
1d730 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 75   the cursor is u
1d740 73 65 64 20 74 6f 20 72 65 61 64 20 61 20 72 65  sed to read a re
1d750 63 6f 72 64 2e 20 20 54 68 61 74 20 77 61 79 2c  cord.  That way,
1d760 20 69 66 20 6e 6f 20 72 65 61 64 73 0a 2a 2a 20   if no reads.** 
1d770 6f 63 63 75 72 2c 20 6e 6f 20 75 6e 6e 65 63 65  occur, no unnece
1d780 73 73 61 72 79 20 49 2f 4f 20 68 61 70 70 65 6e  ssary I/O happen
1d790 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65  s..*/.case OP_Se
1d7a0 65 6b 3a 20 7b 20 20 20 20 2f 2a 20 69 6e 32 20  ek: {    /* in2 
1d7b0 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
1d7c0 2a 70 43 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  *pC;..  assert( 
1d7d0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
1d7e0 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
1d7f0 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
1d800 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
1d810 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
1d820 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43  .  if( ALWAYS(pC
1d830 2d 3e 70 43 75 72 73 6f 72 21 3d 30 29 20 29 7b  ->pCursor!=0) ){
1d840 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
1d850 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  >isTable );.    
1d860 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b  pC->nullRow = 0;
1d870 0a 20 20 20 20 70 49 6e 32 20 3d 20 26 61 4d 65  .    pIn2 = &aMe
1d880 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20  m[pOp->p2];.    
1d890 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74  pC->movetoTarget
1d8a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e   = sqlite3VdbeIn
1d8b0 74 56 61 6c 75 65 28 70 49 6e 32 29 3b 0a 20 20  tValue(pIn2);.  
1d8c0 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c    pC->rowidIsVal
1d8d0 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e  id = 0;.    pC->
1d8e0 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
1d8f0 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   1;.  }.  break;
1d900 0a 7d 0a 20 20 0a 0a 2f 2a 20 4f 70 63 6f 64 65  .}.  ../* Opcode
1d910 3a 20 46 6f 75 6e 64 20 50 31 20 50 32 20 50 33  : Found P1 P2 P3
1d920 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 50   P4 *.**.** If P
1d930 34 3d 3d 30 20 74 68 65 6e 20 72 65 67 69 73 74  4==0 then regist
1d940 65 72 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c  er P3 holds a bl
1d950 6f 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ob constructed b
1d960 79 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 49  y MakeRecord.  I
1d970 66 0a 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20 72  f.** P4>0 then r
1d980 65 67 69 73 74 65 72 20 50 33 20 69 73 20 74 68  egister P3 is th
1d990 65 20 66 69 72 73 74 20 6f 66 20 50 34 20 72 65  e first of P4 re
1d9a0 67 69 73 74 65 72 73 20 74 68 61 74 20 66 6f 72  gisters that for
1d9b0 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a  m an unpacked.**
1d9c0 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 43   record..**.** C
1d9d0 75 72 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61  ursor P1 is on a
1d9e0 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20  n index btree.  
1d9f0 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 64  If the record id
1da00 65 6e 74 69 66 69 65 64 20 62 79 20 50 33 20 61  entified by P3 a
1da10 6e 64 20 50 34 0a 2a 2a 20 69 73 20 61 20 70 72  nd P4.** is a pr
1da20 65 66 69 78 20 6f 66 20 61 6e 79 20 65 6e 74 72  efix of any entr
1da30 79 20 69 6e 20 50 31 20 74 68 65 6e 20 61 20 6a  y in P1 then a j
1da40 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f 20 50  ump is made to P
1da50 32 20 61 6e 64 0a 2a 2a 20 50 31 20 69 73 20 6c  2 and.** P1 is l
1da60 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
1da70 74 68 65 20 6d 61 74 63 68 69 6e 67 20 65 6e 74  the matching ent
1da80 72 79 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  ry..*/./* Opcode
1da90 3a 20 4e 6f 74 46 6f 75 6e 64 20 50 31 20 50 32  : NotFound P1 P2
1daa0 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 49   P3 P4 *.**.** I
1dab0 66 20 50 34 3d 3d 30 20 74 68 65 6e 20 72 65 67  f P4==0 then reg
1dac0 69 73 74 65 72 20 50 33 20 68 6f 6c 64 73 20 61  ister P3 holds a
1dad0 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74 65   blob constructe
1dae0 64 20 62 79 20 4d 61 6b 65 52 65 63 6f 72 64 2e  d by MakeRecord.
1daf0 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74 68 65    If.** P4>0 the
1db00 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73  n register P3 is
1db10 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 50 34   the first of P4
1db20 20 72 65 67 69 73 74 65 72 73 20 74 68 61 74 20   registers that 
1db30 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64  form an unpacked
1db40 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 0a  .** record..** .
1db50 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69 73 20  ** Cursor P1 is 
1db60 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  on an index btre
1db70 65 2e 20 20 49 66 20 74 68 65 20 72 65 63 6f 72  e.  If the recor
1db80 64 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  d identified by 
1db90 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 69 73 20  P3 and P4.** is 
1dba0 6e 6f 74 20 74 68 65 20 70 72 65 66 69 78 20 6f  not the prefix o
1dbb0 66 20 61 6e 79 20 65 6e 74 72 79 20 69 6e 20 50  f any entry in P
1dbc0 31 20 74 68 65 6e 20 61 20 6a 75 6d 70 20 69 73  1 then a jump is
1dbd0 20 6d 61 64 65 20 74 6f 20 50 32 2e 20 20 49 66   made to P2.  If
1dbe0 20 50 31 20 0a 2a 2a 20 64 6f 65 73 20 63 6f 6e   P1 .** does con
1dbf0 74 61 69 6e 20 61 6e 20 65 6e 74 72 79 20 77 68  tain an entry wh
1dc00 6f 73 65 20 70 72 65 66 69 78 20 6d 61 74 63 68  ose prefix match
1dc10 65 73 20 74 68 65 20 50 33 2f 50 34 20 72 65 63  es the P3/P4 rec
1dc20 6f 72 64 20 74 68 65 6e 20 63 6f 6e 74 72 6f 6c  ord then control
1dc30 0a 2a 2a 20 66 61 6c 6c 73 20 74 68 72 6f 75 67  .** falls throug
1dc40 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
1dc50 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 50 31  struction and P1
1dc60 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
1dc70 67 20 61 74 20 74 68 65 0a 2a 2a 20 6d 61 74 63  g at the.** matc
1dc80 68 69 6e 67 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  hing entry..**.*
1dc90 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e  * See also: Foun
1dca0 64 2c 20 4e 6f 74 45 78 69 73 74 73 2c 20 49 73  d, NotExists, Is
1dcb0 55 6e 69 71 75 65 0a 2a 2f 0a 63 61 73 65 20 4f  Unique.*/.case O
1dcc0 50 5f 4e 6f 74 46 6f 75 6e 64 3a 20 20 20 20 20  P_NotFound:     
1dcd0 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
1dce0 2f 0a 63 61 73 65 20 4f 50 5f 46 6f 75 6e 64 3a  /.case OP_Found:
1dcf0 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
1dd00 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20  p, in3 */.  int 
1dd10 61 6c 72 65 61 64 79 45 78 69 73 74 73 3b 0a 20  alreadyExists;. 
1dd20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
1dd30 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 63 68  .  int res;.  ch
1dd40 61 72 20 2a 70 46 72 65 65 3b 0a 20 20 55 6e 70  ar *pFree;.  Unp
1dd50 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
1dd60 78 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64  xKey;.  Unpacked
1dd70 52 65 63 6f 72 64 20 72 3b 0a 20 20 63 68 61 72  Record r;.  char
1dd80 20 61 54 65 6d 70 52 65 63 5b 52 4f 55 4e 44 38   aTempRec[ROUND8
1dd90 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
1dda0 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f  Record)) + sizeo
1ddb0 66 28 4d 65 6d 29 2a 33 20 2b 20 37 5d 3b 0a 0a  f(Mem)*3 + 7];..
1ddc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1ddd0 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 66 6f 75  ST.  sqlite3_fou
1dde0 6e 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nd_count++;.#end
1ddf0 69 66 0a 0a 20 20 61 6c 72 65 61 64 79 45 78 69  if..  alreadyExi
1de00 73 74 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  sts = 0;.  asser
1de10 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
1de20 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
1de30 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sor );.  assert(
1de40 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
1de50 5f 49 4e 54 33 32 20 29 3b 0a 20 20 70 43 20 3d  _INT32 );.  pC =
1de60 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
1de70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
1de80 21 3d 30 20 29 3b 0a 20 20 70 49 6e 33 20 3d 20  !=0 );.  pIn3 = 
1de90 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
1dea0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 2d    if( ALWAYS(pC-
1deb0 3e 70 43 75 72 73 6f 72 21 3d 30 29 20 29 7b 0a  >pCursor!=0) ){.
1dec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
1ded0 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  >isTable==0 );. 
1dee0 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 2e 69     if( pOp->p4.i
1def0 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 2e 70 4b  >0 ){.      r.pK
1df00 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65  eyInfo = pC->pKe
1df10 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 72 2e 6e  yInfo;.      r.n
1df20 46 69 65 6c 64 20 3d 20 28 75 31 36 29 70 4f 70  Field = (u16)pOp
1df30 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 20 20 72 2e  ->p4.i;.      r.
1df40 61 4d 65 6d 20 3d 20 70 49 6e 33 3b 0a 23 69 66  aMem = pIn3;.#if
1df50 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1df60 0a 20 20 20 20 20 20 7b 20 69 6e 74 20 69 3b 20  .      { int i; 
1df70 66 6f 72 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 69  for(i=0; i<r.nFi
1df80 65 6c 64 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  eld; i++) assert
1df90 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 72 2e  ( memIsValid(&r.
1dfa0 61 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23 65  aMem[i]) ); }.#e
1dfb0 6e 64 69 66 0a 20 20 20 20 20 20 72 2e 66 6c 61  ndif.      r.fla
1dfc0 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs = UNPACKED_PR
1dfd0 45 46 49 58 5f 4d 41 54 43 48 3b 0a 20 20 20 20  EFIX_MATCH;.    
1dfe0 20 20 70 49 64 78 4b 65 79 20 3d 20 26 72 3b 0a    pIdxKey = &r;.
1dff0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e000 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74   pIdxKey = sqlit
1e010 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
1e020 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20  kedRecord(.     
1e030 20 20 20 20 20 70 43 2d 3e 70 4b 65 79 49 6e 66       pC->pKeyInf
1e040 6f 2c 20 61 54 65 6d 70 52 65 63 2c 20 73 69 7a  o, aTempRec, siz
1e050 65 6f 66 28 61 54 65 6d 70 52 65 63 29 2c 20 26  eof(aTempRec), &
1e060 70 46 72 65 65 0a 20 20 20 20 20 20 29 3b 20 0a  pFree.      ); .
1e070 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65        if( pIdxKe
1e080 79 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  y==0 ) goto no_m
1e090 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  em;.      assert
1e0a0 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20  ( pIn3->flags & 
1e0b0 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
1e0c0 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 33 2d    assert( (pIn3-
1e0d0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1e0e0 6f 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 7a 65 72  o)==0 );  /* zer
1e0f0 6f 62 6c 6f 62 73 20 61 6c 72 65 61 64 79 20 65  oblobs already e
1e100 78 70 61 6e 64 65 64 20 2a 2f 0a 20 20 20 20 20  xpanded */.     
1e110 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1e120 72 64 55 6e 70 61 63 6b 28 70 43 2d 3e 70 4b 65  rdUnpack(pC->pKe
1e130 79 49 6e 66 6f 2c 20 70 49 6e 33 2d 3e 6e 2c 20  yInfo, pIn3->n, 
1e140 70 49 6e 33 2d 3e 7a 2c 20 70 49 64 78 4b 65 79  pIn3->z, pIdxKey
1e150 29 3b 0a 20 20 20 20 20 20 70 49 64 78 4b 65 79  );.      pIdxKey
1e160 2d 3e 66 6c 61 67 73 20 7c 3d 20 55 4e 50 41 43  ->flags |= UNPAC
1e170 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48  KED_PREFIX_MATCH
1e180 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1e190 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1e1a0 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e  etoUnpacked(pC->
1e1b0 70 43 75 72 73 6f 72 2c 20 70 49 64 78 4b 65 79  pCursor, pIdxKey
1e1c0 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  , 0, 0, &res);. 
1e1d0 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 2e 69     if( pOp->p4.i
1e1e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
1e1f0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1e200 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Free);.    }.   
1e210 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e220 4f 4b 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  OK ){.      brea
1e230 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6c 72  k;.    }.    alr
1e240 65 61 64 79 45 78 69 73 74 73 20 3d 20 28 72 65  eadyExists = (re
1e250 73 3d 3d 30 29 3b 0a 20 20 20 20 70 43 2d 3e 64  s==0);.    pC->d
1e260 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
1e270 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65  0;.    pC->cache
1e280 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
1e290 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  TALE;.  }.  if( 
1e2a0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
1e2b0 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20 69 66 28  Found ){.    if(
1e2c0 20 61 6c 72 65 61 64 79 45 78 69 73 74 73 20 29   alreadyExists )
1e2d0 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
1e2e0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
1e2f0 69 66 28 20 21 61 6c 72 65 61 64 79 45 78 69 73  if( !alreadyExis
1e300 74 73 20 29 20 70 63 20 3d 20 70 4f 70 2d 3e 70  ts ) pc = pOp->p
1e310 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65  2 - 1;.  }.  bre
1e320 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1e330 3a 20 49 73 55 6e 69 71 75 65 20 50 31 20 50 32  : IsUnique P1 P2
1e340 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 43   P3 P4 *.**.** C
1e350 75 72 73 6f 72 20 50 31 20 69 73 20 6f 70 65 6e  ursor P1 is open
1e360 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   on an index b-t
1e370 72 65 65 20 2d 20 74 68 61 74 20 69 73 20 74 6f  ree - that is to
1e380 20 73 61 79 2c 20 61 20 62 74 72 65 65 20 77 68   say, a btree wh
1e390 69 63 68 0a 2a 2a 20 6e 6f 20 64 61 74 61 20 61  ich.** no data a
1e3a0 6e 64 20 77 68 65 72 65 20 74 68 65 20 6b 65 79  nd where the key
1e3b0 20 61 72 65 20 72 65 63 6f 72 64 73 20 67 65 6e   are records gen
1e3c0 65 72 61 74 65 64 20 62 79 20 4f 50 5f 4d 61 6b  erated by OP_Mak
1e3d0 65 52 65 63 6f 72 64 20 77 69 74 68 0a 2a 2a 20  eRecord with.** 
1e3e0 74 68 65 20 6c 69 73 74 20 66 69 65 6c 64 20 62  the list field b
1e3f0 65 69 6e 67 20 74 68 65 20 69 6e 74 65 67 65 72  eing the integer
1e400 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20 65 6e   ROWID of the en
1e410 74 72 79 20 74 68 61 74 20 74 68 65 20 69 6e 64  try that the ind
1e420 65 78 0a 2a 2a 20 65 6e 74 72 79 20 72 65 66 65  ex.** entry refe
1e430 72 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rs to..**.** The
1e440 20 50 33 20 72 65 67 69 73 74 65 72 20 63 6f 6e   P3 register con
1e450 74 61 69 6e 73 20 61 6e 20 69 6e 74 65 67 65 72  tains an integer
1e460 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20   record number. 
1e470 43 61 6c 6c 20 74 68 69 73 20 72 65 63 6f 72 64  Call this record
1e480 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 52 2e 20 52   .** number R. R
1e490 65 67 69 73 74 65 72 20 50 34 20 69 73 20 74 68  egister P4 is th
1e4a0 65 20 66 69 72 73 74 20 69 6e 20 61 20 73 65 74  e first in a set
1e4b0 20 6f 66 20 4e 20 63 6f 6e 74 69 67 75 6f 75 73   of N contiguous
1e4c0 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 74 68   registers.** th
1e4d0 61 74 20 6d 61 6b 65 20 75 70 20 61 6e 20 75 6e  at make up an un
1e4e0 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
1e4f0 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
1e500 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 50 31  d with cursor P1
1e510 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  ..** The value o
1e520 66 20 4e 20 63 61 6e 20 62 65 20 69 6e 66 65 72  f N can be infer
1e530 72 65 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  red from the cur
1e540 73 6f 72 2e 20 4e 20 69 6e 63 6c 75 64 65 73 20  sor. N includes 
1e550 74 68 65 20 72 6f 77 69 64 0a 2a 2a 20 76 61 6c  the rowid.** val
1e560 75 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  ue appended to t
1e570 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
1e580 64 65 78 20 72 65 63 6f 72 64 2e 20 54 68 69 73  dex record. This
1e590 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6d 61 79   rowid value may
1e5a0 0a 2a 2a 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  .** or may not b
1e5b0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 52 2e  e the same as R.
1e5c0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66  .**.** If any of
1e5d0 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72 73   the N registers
1e5e0 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
1e5f0 72 65 67 69 73 74 65 72 20 50 34 20 63 6f 6e 74  register P4 cont
1e600 61 69 6e 73 20 61 20 4e 55 4c 4c 0a 2a 2a 20 76  ains a NULL.** v
1e610 61 6c 75 65 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  alue, jump immed
1e620 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a  iately to P2..**
1e630 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74  .** Otherwise, t
1e640 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
1e650 63 68 65 63 6b 73 20 69 66 20 63 75 72 73 6f 72  checks if cursor
1e660 20 50 31 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20   P1 contains an 
1e670 65 6e 74 72 79 0a 2a 2a 20 77 68 65 72 65 20 74  entry.** where t
1e680 68 65 20 66 69 72 73 74 20 28 4e 2d 31 29 20 66  he first (N-1) f
1e690 69 65 6c 64 73 20 6d 61 74 63 68 20 62 75 74 20  ields match but 
1e6a0 74 68 65 20 72 6f 77 69 64 20 76 61 6c 75 65 20  the rowid value 
1e6b0 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66  at the end.** of
1e6c0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
1e6d0 20 69 73 20 6e 6f 74 20 52 2e 20 49 66 20 74 68   is not R. If th
1e6e0 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 65  ere is no such e
1e6f0 6e 74 72 79 2c 20 63 6f 6e 74 72 6f 6c 20 6a 75  ntry, control ju
1e700 6d 70 73 0a 2a 2a 20 74 6f 20 69 6e 73 74 72 75  mps.** to instru
1e710 63 74 69 6f 6e 20 50 32 2e 20 4f 74 68 65 72 77  ction P2. Otherw
1e720 69 73 65 2c 20 74 68 65 20 72 6f 77 69 64 20 6f  ise, the rowid o
1e730 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e  f the conflictin
1e740 67 20 69 6e 64 65 78 0a 2a 2a 20 65 6e 74 72 79  g index.** entry
1e750 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 72 65   is copied to re
1e760 67 69 73 74 65 72 20 50 33 20 61 6e 64 20 63 6f  gister P3 and co
1e770 6e 74 72 6f 6c 20 66 61 6c 6c 73 20 74 68 72 6f  ntrol falls thro
1e780 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 0a  ugh to the next.
1e790 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ** instruction..
1e7a0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1e7b0 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f 74 45 78 69  NotFound, NotExi
1e7c0 73 74 73 2c 20 46 6f 75 6e 64 0a 2a 2f 0a 63 61  sts, Found.*/.ca
1e7d0 73 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 3a 20  se OP_IsUnique: 
1e7e0 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
1e7f0 2c 20 69 6e 33 20 2a 2f 0a 20 20 75 31 36 20 69  , in3 */.  u16 i
1e800 69 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  i;.  VdbeCursor 
1e810 2a 70 43 78 3b 0a 20 20 42 74 43 75 72 73 6f 72  *pCx;.  BtCursor
1e820 20 2a 70 43 72 73 72 3b 0a 20 20 75 31 36 20 6e   *pCrsr;.  u16 n
1e830 46 69 65 6c 64 3b 0a 20 20 4d 65 6d 20 2a 61 4d  Field;.  Mem *aM
1e840 78 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  x;.  UnpackedRec
1e850 6f 72 64 20 72 3b 20 20 20 20 20 20 20 20 20 20  ord r;          
1e860 20 20 20 20 20 20 20 20 2f 2a 20 42 2d 54 72 65          /* B-Tre
1e870 65 20 69 6e 64 65 78 20 73 65 61 72 63 68 20 6b  e index search k
1e880 65 79 20 2a 2f 0a 20 20 69 36 34 20 52 3b 20 20  ey */.  i64 R;  
1e890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
1e8b0 77 69 64 20 73 74 6f 72 65 64 20 69 6e 20 72 65  wid stored in re
1e8c0 67 69 73 74 65 72 20 50 33 20 2a 2f 0a 0a 20 20  gister P3 */..  
1e8d0 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn3 = &aMem[pOp
1e8e0 2d 3e 70 33 5d 3b 0a 20 20 61 4d 78 20 3d 20 26  ->p3];.  aMx = &
1e8f0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 34 2e 69 5d 3b  aMem[pOp->p4.i];
1e900 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
1e910 74 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  t the values of 
1e920 70 61 72 61 6d 65 74 65 72 73 20 50 31 20 61 6e  parameters P1 an
1e930 64 20 50 34 20 61 72 65 20 69 6e 20 72 61 6e 67  d P4 are in rang
1e940 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
1e950 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
1e960 49 4e 54 33 32 20 29 3b 0a 20 20 61 73 73 65 72  INT32 );.  asser
1e970 74 28 20 70 4f 70 2d 3e 70 34 2e 69 3e 30 20 26  t( pOp->p4.i>0 &
1e980 26 20 70 4f 70 2d 3e 70 34 2e 69 3c 3d 28 70 2d  & pOp->p4.i<=(p-
1e990 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f 72  >nMem-p->nCursor
1e9a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1e9b0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
1e9c0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
1e9d0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  );..  /* Find th
1e9e0 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 2e 20  e index cursor. 
1e9f0 2a 2f 0a 20 20 70 43 78 20 3d 20 70 2d 3e 61 70  */.  pCx = p->ap
1ea00 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
1ea10 61 73 73 65 72 74 28 20 70 43 78 2d 3e 64 65 66  assert( pCx->def
1ea20 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29  erredMoveto==0 )
1ea30 3b 0a 20 20 70 43 78 2d 3e 73 65 65 6b 52 65 73  ;.  pCx->seekRes
1ea40 75 6c 74 20 3d 20 30 3b 0a 20 20 70 43 78 2d 3e  ult = 0;.  pCx->
1ea50 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
1ea60 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 70 43 72  CHE_STALE;.  pCr
1ea70 73 72 20 3d 20 70 43 78 2d 3e 70 43 75 72 73 6f  sr = pCx->pCurso
1ea80 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20  r;..  /* If any 
1ea90 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 61 72  of the values ar
1eaa0 65 20 4e 55 4c 4c 2c 20 74 61 6b 65 20 74 68 65  e NULL, take the
1eab0 20 6a 75 6d 70 2e 20 2a 2f 0a 20 20 6e 46 69 65   jump. */.  nFie
1eac0 6c 64 20 3d 20 70 43 78 2d 3e 70 4b 65 79 49 6e  ld = pCx->pKeyIn
1ead0 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 66 6f  fo->nField;.  fo
1eae0 72 28 69 69 3d 30 3b 20 69 69 3c 6e 46 69 65 6c  r(ii=0; ii<nFiel
1eaf0 64 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  d; ii++){.    if
1eb00 28 20 61 4d 78 5b 69 69 5d 2e 66 6c 61 67 73 20  ( aMx[ii].flags 
1eb10 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
1eb20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
1eb30 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 43 72 73   - 1;.      pCrs
1eb40 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  r = 0;.      bre
1eb50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1eb60 61 73 73 65 72 74 28 20 28 61 4d 78 5b 6e 46 69  assert( (aMx[nFi
1eb70 65 6c 64 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d  eld].flags & MEM
1eb80 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 0a 20 20  _Null)==0 );..  
1eb90 69 66 28 20 70 43 72 73 72 21 3d 30 20 29 7b 0a  if( pCrsr!=0 ){.
1eba0 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
1ebb0 74 68 65 20 69 6e 64 65 78 20 73 65 61 72 63 68  the index search
1ebc0 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 72 2e 70   key. */.    r.p
1ebd0 4b 65 79 49 6e 66 6f 20 3d 20 70 43 78 2d 3e 70  KeyInfo = pCx->p
1ebe0 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 72 2e 6e  KeyInfo;.    r.n
1ebf0 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 20 2b  Field = nField +
1ec00 20 31 3b 0a 20 20 20 20 72 2e 66 6c 61 67 73 20   1;.    r.flags 
1ec10 3d 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49  = UNPACKED_PREFI
1ec20 58 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 72 2e  X_SEARCH;.    r.
1ec30 61 4d 65 6d 20 3d 20 61 4d 78 3b 0a 23 69 66 64  aMem = aMx;.#ifd
1ec40 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1ec50 20 20 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72      { int i; for
1ec60 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64  (i=0; i<r.nField
1ec70 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 6d  ; i++) assert( m
1ec80 65 6d 49 73 56 61 6c 69 64 28 26 72 2e 61 4d 65  emIsValid(&r.aMe
1ec90 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69  m[i]) ); }.#endi
1eca0 66 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  f..    /* Extrac
1ecb0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 52  t the value of R
1ecc0 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50   from register P
1ecd0 33 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  3. */.    sqlite
1ece0 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69  3VdbeMemIntegeri
1ecf0 66 79 28 70 49 6e 33 29 3b 0a 20 20 20 20 52 20  fy(pIn3);.    R 
1ed00 3d 20 70 49 6e 33 2d 3e 75 2e 69 3b 0a 0a 20 20  = pIn3->u.i;..  
1ed10 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20    /* Search the 
1ed20 42 2d 54 72 65 65 20 69 6e 64 65 78 2e 20 49 66  B-Tree index. If
1ed30 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20   no conflicting 
1ed40 72 65 63 6f 72 64 20 69 73 20 66 6f 75 6e 64 2c  record is found,
1ed50 20 6a 75 6d 70 0a 20 20 20 20 2a 2a 20 74 6f 20   jump.    ** to 
1ed60 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 63  P2. Otherwise, c
1ed70 6f 70 79 20 74 68 65 20 72 6f 77 69 64 20 6f 66  opy the rowid of
1ed80 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e 67   the conflicting
1ed90 20 72 65 63 6f 72 64 20 74 6f 0a 20 20 20 20 2a   record to.    *
1eda0 2a 20 72 65 67 69 73 74 65 72 20 50 33 20 61 6e  * register P3 an
1edb0 64 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  d fall through t
1edc0 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
1edd0 75 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uction.  */.    
1ede0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1edf0 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
1ee00 70 43 72 73 72 2c 20 26 72 2c 20 30 2c 20 30 2c  pCrsr, &r, 0, 0,
1ee10 20 26 70 43 78 2d 3e 73 65 65 6b 52 65 73 75 6c   &pCx->seekResul
1ee20 74 29 3b 0a 20 20 20 20 69 66 28 20 28 72 2e 66  t);.    if( (r.f
1ee30 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
1ee40 50 52 45 46 49 58 5f 53 45 41 52 43 48 29 20 7c  PREFIX_SEARCH) |
1ee50 7c 20 72 2e 72 6f 77 69 64 3d 3d 52 20 29 7b 0a  | r.rowid==R ){.
1ee60 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e        pc = pOp->
1ee70 70 32 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  p2 - 1;.    }els
1ee80 65 7b 0a 20 20 20 20 20 20 70 49 6e 33 2d 3e 75  e{.      pIn3->u
1ee90 2e 69 20 3d 20 72 2e 72 6f 77 69 64 3b 0a 20 20  .i = r.rowid;.  
1eea0 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
1eeb0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  .}../* Opcode: N
1eec0 6f 74 45 78 69 73 74 73 20 50 31 20 50 32 20 50  otExists P1 P2 P
1eed0 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20  3 * *.**.** Use 
1eee0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72  the content of r
1eef0 65 67 69 73 74 65 72 20 50 33 20 61 73 20 61 6e  egister P3 as an
1ef00 20 69 6e 74 65 67 65 72 20 6b 65 79 2e 20 20 49   integer key.  I
1ef10 66 20 61 20 72 65 63 6f 72 64 20 0a 2a 2a 20 77  f a record .** w
1ef20 69 74 68 20 74 68 61 74 20 6b 65 79 20 64 6f 65  ith that key doe
1ef30 73 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74  s not exist in t
1ef40 61 62 6c 65 20 6f 66 20 50 31 2c 20 74 68 65 6e  able of P1, then
1ef50 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 0a 2a 2a   jump to P2. .**
1ef60 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 64   If the record d
1ef70 6f 65 73 20 65 78 69 73 74 2c 20 74 68 65 6e 20  oes exist, then 
1ef80 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 20 20 54  fall through.  T
1ef90 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1efa0 74 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  t .** pointing t
1efb0 6f 20 74 68 65 20 72 65 63 6f 72 64 20 69 66 20  o the record if 
1efc0 69 74 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  it exists..**.**
1efd0 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
1efe0 62 65 74 77 65 65 6e 20 74 68 69 73 20 6f 70 65  between this ope
1eff0 72 61 74 69 6f 6e 20 61 6e 64 20 4e 6f 74 46 6f  ration and NotFo
1f000 75 6e 64 20 69 73 20 74 68 61 74 20 74 68 69 73  und is that this
1f010 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 61 73  .** operation as
1f020 73 75 6d 65 73 20 74 68 65 20 6b 65 79 20 69 73  sumes the key is
1f030 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20   an integer and 
1f040 74 68 61 74 20 50 31 20 69 73 20 61 20 74 61 62  that P1 is a tab
1f050 6c 65 20 77 68 65 72 65 61 73 0a 2a 2a 20 4e 6f  le whereas.** No
1f060 74 46 6f 75 6e 64 20 61 73 73 75 6d 65 73 20 6b  tFound assumes k
1f070 65 79 20 69 73 20 61 20 62 6c 6f 62 20 63 6f 6e  ey is a blob con
1f080 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 4d 61  structed from Ma
1f090 6b 65 52 65 63 6f 72 64 20 61 6e 64 0a 2a 2a 20  keRecord and.** 
1f0a0 50 31 20 69 73 20 61 6e 20 69 6e 64 65 78 2e 0a  P1 is an index..
1f0b0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1f0c0 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c  Found, NotFound,
1f0d0 20 49 73 55 6e 69 71 75 65 0a 2a 2f 0a 63 61 73   IsUnique.*/.cas
1f0e0 65 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 3a 20  e OP_NotExists: 
1f0f0 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
1f100 2c 20 69 6e 33 20 2a 2f 0a 20 20 56 64 62 65 43  , in3 */.  VdbeC
1f110 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43  ursor *pC;.  BtC
1f120 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20  ursor *pCrsr;.  
1f130 69 6e 74 20 72 65 73 3b 0a 20 20 75 36 34 20 69  int res;.  u64 i
1f140 4b 65 79 3b 0a 0a 20 20 70 49 6e 33 20 3d 20 26  Key;..  pIn3 = &
1f150 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
1f160 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66   assert( pIn3->f
1f170 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
1f180 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1f190 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
1f1a0 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
1f1b0 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
1f1c0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
1f1d0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
1f1e0 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62  ssert( pC->isTab
1f1f0 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
1f200 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52  pC->pseudoTableR
1f210 65 67 3d 3d 30 20 29 3b 0a 20 20 70 43 72 73 72  eg==0 );.  pCrsr
1f220 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a   = pC->pCursor;.
1f230 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 72    if( ALWAYS(pCr
1f240 73 72 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65  sr!=0) ){.    re
1f250 73 20 3d 20 30 3b 0a 20 20 20 20 69 4b 65 79 20  s = 0;.    iKey 
1f260 3d 20 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 20  = pIn3->u.i;.   
1f270 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1f280 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
1f290 28 70 43 72 73 72 2c 20 30 2c 20 69 4b 65 79 2c  (pCrsr, 0, iKey,
1f2a0 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 70   0, &res);.    p
1f2b0 43 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70  C->lastRowid = p
1f2c0 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 20 20 70 43  In3->u.i;.    pC
1f2d0 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d  ->rowidIsValid =
1f2e0 20 72 65 73 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20   res==0 ?1:0;.  
1f2f0 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20    pC->nullRow = 
1f300 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65  0;.    pC->cache
1f310 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
1f320 54 41 4c 45 3b 0a 20 20 20 20 70 43 2d 3e 64 65  TALE;.    pC->de
1f330 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
1f340 3b 0a 20 20 20 20 69 66 28 20 72 65 73 21 3d 30  ;.    if( res!=0
1f350 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70   ){.      pc = p
1f360 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20  Op->p2 - 1;.    
1f370 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 72 6f    assert( pC->ro
1f380 77 69 64 49 73 56 61 6c 69 64 3d 3d 30 20 29 3b  widIsValid==0 );
1f390 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e 73  .    }.    pC->s
1f3a0 65 65 6b 52 65 73 75 6c 74 20 3d 20 72 65 73 3b  eekResult = res;
1f3b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1f3c0 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
1f3d0 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  en an attempt to
1f3e0 20 6f 70 65 6e 20 61 20 72 65 61 64 20 63 75 72   open a read cur
1f3f0 73 6f 72 20 6f 6e 20 74 68 65 20 0a 20 20 20 20  sor on the .    
1f400 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
1f410 20 74 61 62 6c 65 20 72 65 74 75 72 6e 73 20 53   table returns S
1f420 51 4c 49 54 45 5f 45 4d 50 54 59 2e 0a 20 20 20  QLITE_EMPTY..   
1f430 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 70 4f 70   */.    pc = pOp
1f440 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 61 73  ->p2 - 1;.    as
1f450 73 65 72 74 28 20 70 43 2d 3e 72 6f 77 69 64 49  sert( pC->rowidI
1f460 73 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 20  sValid==0 );.   
1f470 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20   pC->seekResult 
1f480 3d 20 30 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  = 0;.  }.  break
1f490 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1f4a0 53 65 71 75 65 6e 63 65 20 50 31 20 50 32 20 2a  Sequence P1 P2 *
1f4b0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 69 6e 64 20   * *.**.** Find 
1f4c0 74 68 65 20 6e 65 78 74 20 61 76 61 69 6c 61 62  the next availab
1f4d0 6c 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62  le sequence numb
1f4e0 65 72 20 66 6f 72 20 63 75 72 73 6f 72 20 50 31  er for cursor P1
1f4f0 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  ..** Write the s
1f500 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 69  equence number i
1f510 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e  nto register P2.
1f520 0a 2a 2a 20 54 68 65 20 73 65 71 75 65 6e 63 65  .** The sequence
1f530 20 6e 75 6d 62 65 72 20 6f 6e 20 74 68 65 20 63   number on the c
1f540 75 72 73 6f 72 20 69 73 20 69 6e 63 72 65 6d 65  ursor is increme
1f550 6e 74 65 64 20 61 66 74 65 72 20 74 68 69 73 0a  nted after this.
1f560 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ** instruction. 
1f570 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 71   .*/.case OP_Seq
1f580 75 65 6e 63 65 3a 20 7b 20 20 20 20 20 20 20 20  uence: {        
1f590 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65     /* out2-prere
1f5a0 6c 65 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  lease */.  asser
1f5b0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
1f5c0 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
1f5d0 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sor );.  assert(
1f5e0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
1f5f0 31 5d 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74 2d  1]!=0 );.  pOut-
1f600 3e 75 2e 69 20 3d 20 70 2d 3e 61 70 43 73 72 5b  >u.i = p->apCsr[
1f610 70 4f 70 2d 3e 70 31 5d 2d 3e 73 65 71 43 6f 75  pOp->p1]->seqCou
1f620 6e 74 2b 2b 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  nt++;.  break;.}
1f630 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65  .../* Opcode: Ne
1f640 77 52 6f 77 69 64 20 50 31 20 50 32 20 50 33 20  wRowid P1 P2 P3 
1f650 2a 20 2a 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61 20  * *.**.** Get a 
1f660 6e 65 77 20 69 6e 74 65 67 65 72 20 72 65 63 6f  new integer reco
1f670 72 64 20 6e 75 6d 62 65 72 20 28 61 2e 6b 2e 61  rd number (a.k.a
1f680 20 22 72 6f 77 69 64 22 29 20 75 73 65 64 20 61   "rowid") used a
1f690 73 20 74 68 65 20 6b 65 79 20 74 6f 20 61 20 74  s the key to a t
1f6a0 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 72 65 63  able..** The rec
1f6b0 6f 72 64 20 6e 75 6d 62 65 72 20 69 73 20 6e 6f  ord number is no
1f6c0 74 20 70 72 65 76 69 6f 75 73 6c 79 20 75 73 65  t previously use
1f6d0 64 20 61 73 20 61 20 6b 65 79 20 69 6e 20 74 68  d as a key in th
1f6e0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61  e database.** ta
1f6f0 62 6c 65 20 74 68 61 74 20 63 75 72 73 6f 72 20  ble that cursor 
1f700 50 31 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 54  P1 points to.  T
1f710 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 6e 75  he new record nu
1f720 6d 62 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a  mber is written.
1f730 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 72 65  ** written to re
1f740 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a  gister P2..**.**
1f750 20 49 66 20 50 33 3e 30 20 74 68 65 6e 20 50 33   If P3>0 then P3
1f760 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20 69   is a register i
1f770 6e 20 74 68 65 20 72 6f 6f 74 20 66 72 61 6d 65  n the root frame
1f780 20 6f 66 20 74 68 69 73 20 56 44 42 45 20 74 68   of this VDBE th
1f790 61 74 20 68 6f 6c 64 73 20 0a 2a 2a 20 74 68 65  at holds .** the
1f7a0 20 6c 61 72 67 65 73 74 20 70 72 65 76 69 6f 75   largest previou
1f7b0 73 6c 79 20 67 65 6e 65 72 61 74 65 64 20 72 65  sly generated re
1f7c0 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20 4e 6f 20  cord number. No 
1f7d0 6e 65 77 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  new record numbe
1f7e0 72 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77 65  rs are.** allowe
1f7f0 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61  d to be less tha
1f800 6e 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68  n this value. Wh
1f810 65 6e 20 74 68 69 73 20 76 61 6c 75 65 20 72 65  en this value re
1f820 61 63 68 65 73 20 69 74 73 20 6d 61 78 69 6d 75  aches its maximu
1f830 6d 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 49 54 45  m, .** an SQLITE
1f840 5f 46 55 4c 4c 20 65 72 72 6f 72 20 69 73 20 67  _FULL error is g
1f850 65 6e 65 72 61 74 65 64 2e 20 54 68 65 20 50 33  enerated. The P3
1f860 20 72 65 67 69 73 74 65 72 20 69 73 20 75 70 64   register is upd
1f870 61 74 65 64 20 77 69 74 68 20 74 68 65 20 27 0a  ated with the '.
1f880 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 72 65 63  ** generated rec
1f890 6f 72 64 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  ord number. This
1f8a0 20 50 33 20 6d 65 63 68 61 6e 69 73 6d 20 69 73   P3 mechanism is
1f8b0 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20 69 6d   used to help im
1f8c0 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 41  plement the.** A
1f8d0 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 66 65 61  UTOINCREMENT fea
1f8e0 74 75 72 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ture..*/.case OP
1f8f0 5f 4e 65 77 52 6f 77 69 64 3a 20 7b 20 20 20 20  _NewRowid: {    
1f900 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70         /* out2-p
1f910 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  rerelease */.  i
1f920 36 34 20 76 3b 20 20 20 20 20 20 20 20 20 20 20  64 v;           
1f930 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
1f940 20 72 6f 77 69 64 20 2a 2f 0a 20 20 56 64 62 65   rowid */.  Vdbe
1f950 43 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 20 20  Cursor *pC;     
1f960 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20     /* Cursor of 
1f970 74 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65  table to get the
1f980 20 6e 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20   new rowid */.  
1f990 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
1f9a0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1f9b0 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 42 74   of an sqlite3Bt
1f9c0 72 65 65 4c 61 73 74 28 29 20 2a 2f 0a 20 20 69  reeLast() */.  i
1f9d0 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
1f9e0 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72        /* Counter
1f9f0 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
1fa00 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 65 73  mber of searches
1fa10 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b   */.  Mem *pMem;
1fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fa30 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
1fa40 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20 66   largest rowid f
1fa50 6f 72 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  or AUTOINCREMENT
1fa60 20 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d 65 20   */.  VdbeFrame 
1fa70 2a 70 46 72 61 6d 65 3b 20 20 20 20 20 2f 2a 20  *pFrame;     /* 
1fa80 52 6f 6f 74 20 66 72 61 6d 65 20 6f 66 20 56 44  Root frame of VD
1fa90 42 45 20 2a 2f 0a 0a 20 20 76 20 3d 20 30 3b 0a  BE */..  v = 0;.
1faa0 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 61 73 73    res = 0;.  ass
1fab0 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
1fac0 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
1fad0 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20  ursor );.  pC = 
1fae0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
1faf0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  ];.  assert( pC!
1fb00 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
1fb10 52 28 70 43 2d 3e 70 43 75 72 73 6f 72 3d 3d 30  R(pC->pCursor==0
1fb20 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
1fb30 7a 65 72 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74  zero initializat
1fb40 69 6f 6e 20 61 62 6f 76 65 20 69 73 20 61 6c 6c  ion above is all
1fb50 20 74 68 61 74 20 69 73 20 6e 65 65 64 65 64 20   that is needed 
1fb60 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
1fb70 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 77 69  /* The next rowi
1fb80 64 20 6f 72 20 72 65 63 6f 72 64 20 6e 75 6d 62  d or record numb
1fb90 65 72 20 28 64 69 66 66 65 72 65 6e 74 20 74 65  er (different te
1fba0 72 6d 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  rms for the same
1fbb0 0a 20 20 20 20 2a 2a 20 74 68 69 6e 67 29 20 69  .    ** thing) i
1fbc0 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 61 20  s obtained in a 
1fbd0 74 77 6f 2d 73 74 65 70 20 61 6c 67 6f 72 69 74  two-step algorit
1fbe0 68 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  hm..    **.    *
1fbf0 2a 20 46 69 72 73 74 20 77 65 20 61 74 74 65 6d  * First we attem
1fc00 70 74 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c  pt to find the l
1fc10 61 72 67 65 73 74 20 65 78 69 73 74 69 6e 67 20  argest existing 
1fc20 72 6f 77 69 64 20 61 6e 64 20 61 64 64 20 6f 6e  rowid and add on
1fc30 65 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 61 74  e.    ** to that
1fc40 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6c 61  .  But if the la
1fc50 72 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 72  rgest existing r
1fc60 6f 77 69 64 20 69 73 20 61 6c 72 65 61 64 79 20  owid is already 
1fc70 74 68 65 20 6d 61 78 69 6d 75 6d 0a 20 20 20 20  the maximum.    
1fc80 2a 2a 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  ** positive inte
1fc90 67 65 72 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ger, we have to 
1fca0 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
1fcb0 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a  the second.    *
1fcc0 2a 20 70 72 6f 62 61 62 69 6c 69 73 74 69 63 20  * probabilistic 
1fcd0 61 6c 67 6f 72 69 74 68 6d 0a 20 20 20 20 2a 2a  algorithm.    **
1fce0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  .    ** The seco
1fcf0 6e 64 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  nd algorithm is 
1fd00 74 6f 20 73 65 6c 65 63 74 20 61 20 72 6f 77 69  to select a rowi
1fd10 64 20 61 74 20 72 61 6e 64 6f 6d 20 61 6e 64 20  d at random and 
1fd20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 69 74  see if.    ** it
1fd30 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
1fd40 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49  in the table.  I
1fd50 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  f it does not ex
1fd60 69 73 74 2c 20 77 65 20 68 61 76 65 0a 20 20 20  ist, we have.   
1fd70 20 2a 2a 20 73 75 63 63 65 65 64 65 64 2e 20 20   ** succeeded.  
1fd80 49 66 20 74 68 65 20 72 61 6e 64 6f 6d 20 72 6f  If the random ro
1fd90 77 69 64 20 64 6f 65 73 20 65 78 69 73 74 2c 20  wid does exist, 
1fda0 77 65 20 73 65 6c 65 63 74 20 61 20 6e 65 77 20  we select a new 
1fdb0 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74  one.    ** and t
1fdc0 72 79 20 61 67 61 69 6e 2c 20 75 70 20 74 6f 20  ry again, up to 
1fdd0 31 30 30 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a  100 times..    *
1fde0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  /.    assert( pC
1fdf0 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 0a 23 69  ->isTable );..#i
1fe00 66 64 65 66 20 53 51 4c 49 54 45 5f 33 32 42 49  fdef SQLITE_32BI
1fe10 54 5f 52 4f 57 49 44 0a 23 20 20 20 64 65 66 69  T_ROWID.#   defi
1fe20 6e 65 20 4d 41 58 5f 52 4f 57 49 44 20 30 78 37  ne MAX_ROWID 0x7
1fe30 66 66 66 66 66 66 66 0a 23 65 6c 73 65 0a 20 20  fffffff.#else.  
1fe40 20 20 2f 2a 20 53 6f 6d 65 20 63 6f 6d 70 69 6c    /* Some compil
1fe50 65 72 73 20 63 6f 6d 70 6c 61 69 6e 20 61 62 6f  ers complain abo
1fe60 75 74 20 63 6f 6e 73 74 61 6e 74 73 20 6f 66 20  ut constants of 
1fe70 74 68 65 20 66 6f 72 6d 20 30 78 37 66 66 66 66  the form 0x7ffff
1fe80 66 66 66 66 66 66 66 66 66 66 66 2e 0a 20 20 20  fffffffffff..   
1fe90 20 2a 2a 20 4f 74 68 65 72 73 20 63 6f 6d 70 6c   ** Others compl
1fea0 61 69 6e 20 61 62 6f 75 74 20 30 78 37 66 66 66  ain about 0x7fff
1feb0 66 66 66 66 66 66 66 66 66 66 66 66 66 4c 4c 2e  fffffffffffffLL.
1fec0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1fed0 6d 61 63 72 6f 20 73 65 65 6d 73 0a 20 20 20 20  macro seems.    
1fee0 2a 2a 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  ** to provide th
1fef0 65 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 6c 65  e constant while
1ff00 20 6d 61 6b 69 6e 67 20 61 6c 6c 20 63 6f 6d 70   making all comp
1ff10 69 6c 65 72 73 20 68 61 70 70 79 2e 0a 20 20 20  ilers happy..   
1ff20 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
1ff30 41 58 5f 52 4f 57 49 44 20 20 28 69 36 34 29 28  AX_ROWID  (i64)(
1ff40 20 28 28 28 75 36 34 29 30 78 37 66 66 66 66 66   (((u64)0x7fffff
1ff50 66 66 29 3c 3c 33 32 29 20 7c 20 28 75 36 34 29  ff)<<32) | (u64)
1ff60 30 78 66 66 66 66 66 66 66 66 20 29 0a 23 65 6e  0xffffffff ).#en
1ff70 64 69 66 0a 0a 20 20 20 20 69 66 28 20 21 70 43  dif..    if( !pC
1ff80 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64  ->useRandomRowid
1ff90 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 73 71   ){.      v = sq
1ffa0 6c 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63  lite3BtreeGetCac
1ffb0 68 65 64 52 6f 77 69 64 28 70 43 2d 3e 70 43 75  hedRowid(pC->pCu
1ffc0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28  rsor);.      if(
1ffd0 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   v==0 ){.       
1ffe0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1fff0 65 65 4c 61 73 74 28 70 43 2d 3e 70 43 75 72 73  eeLast(pC->pCurs
20000 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20  or, &res);.     
20010 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20020 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20030 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
20040 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
20050 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
20060 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20   res ){.        
20070 20 20 76 20 3d 20 31 3b 20 20 20 2f 2a 20 49 4d    v = 1;   /* IM
20080 50 3a 20 52 2d 36 31 39 31 34 2d 34 38 30 37 34  P: R-61914-48074
20090 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
200a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
200b0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
200c0 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
200d0 43 2d 3e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20  C->pCursor) );. 
200e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
200f0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
20100 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26  e(pC->pCursor, &
20110 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  v);.          as
20120 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
20130 5f 4f 4b 20 29 3b 20 20 20 2f 2a 20 43 61 6e 6e  _OK );   /* Cann
20140 6f 74 20 66 61 69 6c 20 66 6f 6c 6c 6f 77 69 6e  ot fail followin
20150 67 20 42 74 72 65 65 4c 61 73 74 28 29 20 2a 2f  g BtreeLast() */
20160 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76  .          if( v
20170 3e 3d 4d 41 58 5f 52 4f 57 49 44 20 29 7b 0a 20  >=MAX_ROWID ){. 
20180 20 20 20 20 20 20 20 20 20 20 20 70 43 2d 3e 75             pC->u
20190 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 3d 20  seRandomRowid = 
201a0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
201b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
201c0 76 2b 2b 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52  v++;   /* IMP: R
201d0 2d 32 39 35 33 38 2d 33 34 39 38 37 20 2a 2f 0a  -29538-34987 */.
201e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
201f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 23      }.      }..#
20200 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20210 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
20220 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
20230 70 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  p3 ){.        /*
20240 20 41 73 73 65 72 74 20 74 68 61 74 20 50 33 20   Assert that P3 
20250 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72  is a valid memor
20260 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20  y cell. */.     
20270 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
20280 70 33 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  p3>0 );.        
20290 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b  if( p->pFrame ){
202a0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 70  .          for(p
202b0 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b  Frame=p->pFrame;
202c0 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74   pFrame->pParent
202d0 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d  ; pFrame=pFrame-
202e0 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20  >pParent);.     
202f0 20 20 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74       /* Assert t
20300 68 61 74 20 50 33 20 69 73 20 61 20 76 61 6c 69  hat P3 is a vali
20310 64 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a  d memory cell. *
20320 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
20330 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 70 46 72  rt( pOp->p3<=pFr
20340 61 6d 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20  ame->nMem );.   
20350 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 26 70         pMem = &p
20360 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d  Frame->aMem[pOp-
20370 3e 70 33 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65  >p3];.        }e
20380 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
20390 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 50 33  * Assert that P3
203a0 20 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f   is a valid memo
203b0 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20  ry cell. */.    
203c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
203d0 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d  p->p3<=(p->nMem-
203e0 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20  p->nCursor) );. 
203f0 20 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20           pMem = 
20400 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
20410 20 20 20 20 20 20 20 20 20 20 6d 65 6d 41 62 6f            memAbo
20420 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4d  utToChange(p, pM
20430 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  em);.        }. 
20440 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d         assert( m
20450 65 6d 49 73 56 61 6c 69 64 28 70 4d 65 6d 29 20  emIsValid(pMem) 
20460 29 3b 0a 0a 20 20 20 20 20 20 20 20 52 45 47 49  );..        REGI
20470 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
20480 70 33 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20  p3, pMem);.     
20490 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
204a0 6d 49 6e 74 65 67 65 72 69 66 79 28 70 4d 65 6d  mIntegerify(pMem
204b0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
204c0 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
204d0 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b  & MEM_Int)!=0 );
204e0 20 20 2f 2a 20 6d 65 6d 28 50 33 29 20 68 6f 6c    /* mem(P3) hol
204f0 64 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f  ds an integer */
20500 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
20510 6d 2d 3e 75 2e 69 3d 3d 4d 41 58 5f 52 4f 57 49  m->u.i==MAX_ROWI
20520 44 20 7c 7c 20 70 43 2d 3e 75 73 65 52 61 6e 64  D || pC->useRand
20530 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  omRowid ){.     
20540 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
20550 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50 3a  _FULL;   /* IMP:
20560 20 52 2d 31 32 32 37 35 2d 36 31 33 33 38 20 2a   R-12275-61338 *
20570 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
20580 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
20590 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ror;.        }. 
205a0 20 20 20 20 20 20 20 69 66 28 20 76 3c 70 4d 65         if( v<pMe
205b0 6d 2d 3e 75 2e 69 2b 31 20 29 7b 0a 20 20 20 20  m->u.i+1 ){.    
205c0 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e        v = pMem->
205d0 75 2e 69 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  u.i + 1;.       
205e0 20 7d 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d   }.        pMem-
205f0 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 20 20 20 20  >u.i = v;.      
20600 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
20610 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
20620 61 63 68 65 64 52 6f 77 69 64 28 70 43 2d 3e 70  achedRowid(pC->p
20630 43 75 72 73 6f 72 2c 20 76 3c 4d 41 58 5f 52 4f  Cursor, v<MAX_RO
20640 57 49 44 20 3f 20 76 2b 31 20 3a 20 30 29 3b 0a  WID ? v+1 : 0);.
20650 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
20660 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64  ->useRandomRowid
20670 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 4d 50   ){.      /* IMP
20680 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
20690 52 2d 30 37 36 37 37 2d 34 31 38 38 31 20 49 66  R-07677-41881 If
206a0 20 74 68 65 20 6c 61 72 67 65 73 74 20 52 4f 57   the largest ROW
206b0 49 44 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  ID is equal to t
206c0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67  he.      ** larg
206d0 65 73 74 20 70 6f 73 73 69 62 6c 65 20 69 6e 74  est possible int
206e0 65 67 65 72 20 28 39 32 32 33 33 37 32 30 33 36  eger (9223372036
206f0 38 35 34 37 37 35 38 30 37 29 20 74 68 65 6e 20  854775807) then 
20700 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
20710 20 20 20 2a 2a 20 65 6e 67 69 6e 65 20 73 74 61     ** engine sta
20720 72 74 73 20 70 69 63 6b 69 6e 67 20 70 6f 73 69  rts picking posi
20730 74 69 76 65 20 63 61 6e 64 69 64 61 74 65 20 52  tive candidate R
20740 4f 57 49 44 73 20 61 74 20 72 61 6e 64 6f 6d 20  OWIDs at random 
20750 75 6e 74 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69  until.      ** i
20760 74 20 66 69 6e 64 73 20 6f 6e 65 20 74 68 61 74  t finds one that
20770 20 69 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73   is not previous
20780 6c 79 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20  ly used. */.    
20790 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
207a0 33 3d 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20 63  3==0 );  /* We c
207b0 61 6e 6e 6f 74 20 62 65 20 69 6e 20 72 61 6e 64  annot be in rand
207c0 6f 6d 20 72 6f 77 69 64 20 6d 6f 64 65 20 69 66  om rowid mode if
207d0 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20   this is.       
207e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207f0 20 20 20 20 20 20 2a 2a 20 61 6e 20 41 55 54 4f        ** an AUTO
20800 49 4e 43 52 45 4d 45 4e 54 20 74 61 62 6c 65 2e  INCREMENT table.
20810 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 20   */.      /* on 
20820 74 68 65 20 66 69 72 73 74 20 61 74 74 65 6d 70  the first attemp
20830 74 2c 20 73 69 6d 70 6c 79 20 64 6f 20 6f 6e 65  t, simply do one
20840 20 6d 6f 72 65 20 74 68 61 6e 20 70 72 65 76 69   more than previ
20850 6f 75 73 20 2a 2f 0a 20 20 20 20 20 20 76 20 3d  ous */.      v =
20860 20 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 20 20   lastRowid;.    
20870 20 20 76 20 26 3d 20 28 4d 41 58 5f 52 4f 57 49    v &= (MAX_ROWI
20880 44 3e 3e 31 29 3b 20 2f 2a 20 65 6e 73 75 72 65  D>>1); /* ensure
20890 20 64 6f 65 73 6e 27 74 20 67 6f 20 6e 65 67 61   doesn't go nega
208a0 74 69 76 65 20 2a 2f 0a 20 20 20 20 20 20 76 2b  tive */.      v+
208b0 2b 3b 20 2f 2a 20 65 6e 73 75 72 65 20 6e 6f 6e  +; /* ensure non
208c0 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 63  -zero */.      c
208d0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68  nt = 0;.      wh
208e0 69 6c 65 28 20 20 20 28 28 72 63 20 3d 20 73 71  ile(   ((rc = sq
208f0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
20900 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 70 43 75  Unpacked(pC->pCu
20910 72 73 6f 72 2c 20 30 2c 20 28 75 36 34 29 76 2c  rsor, 0, (u64)v,
20920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20950 20 20 30 2c 20 26 72 65 73 29 29 3d 3d 53 51 4c    0, &res))==SQL
20960 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20 20 20  ITE_OK).        
20970 20 20 20 20 26 26 20 28 72 65 73 3d 3d 30 29 0a      && (res==0).
20980 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
20990 2b 2b 63 6e 74 3c 31 30 30 29 29 7b 0a 20 20 20  ++cnt<100)){.   
209a0 20 20 20 20 20 2f 2a 20 63 6f 6c 6c 69 73 69 6f       /* collisio
209b0 6e 20 2d 20 74 72 79 20 61 6e 6f 74 68 65 72 20  n - try another 
209c0 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20 2a 2f 0a  random rowid */.
209d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
209e0 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
209f0 66 28 76 29 2c 20 26 76 29 3b 0a 20 20 20 20 20  f(v), &v);.     
20a00 20 20 20 69 66 28 20 63 6e 74 3c 35 20 29 7b 0a     if( cnt<5 ){.
20a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72 79            /* try
20a20 20 22 73 6d 61 6c 6c 22 20 72 61 6e 64 6f 6d 20   "small" random 
20a30 72 6f 77 69 64 73 20 66 6f 72 20 74 68 65 20 69  rowids for the i
20a40 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 73 20  nitial attempts 
20a50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 20 26  */.          v &
20a60 3d 20 30 78 66 66 66 66 66 66 3b 0a 20 20 20 20  = 0xffffff;.    
20a70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20a80 20 20 20 20 20 76 20 26 3d 20 28 4d 41 58 5f 52       v &= (MAX_R
20a90 4f 57 49 44 3e 3e 31 29 3b 20 2f 2a 20 65 6e 73  OWID>>1); /* ens
20aa0 75 72 65 20 64 6f 65 73 6e 27 74 20 67 6f 20 6e  ure doesn't go n
20ab0 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 20 20 20  egative */.     
20ac0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 76 2b 2b     }.        v++
20ad0 3b 20 2f 2a 20 65 6e 73 75 72 65 20 6e 6f 6e 2d  ; /* ensure non-
20ae0 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  zero */.      }.
20af0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
20b00 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 3d 3d  LITE_OK && res==
20b10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
20b20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 20 20  = SQLITE_FULL;  
20b30 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 38 32 31 39   /* IMP: R-38219
20b40 2d 35 33 30 30 32 20 2a 2f 0a 20 20 20 20 20 20  -53002 */.      
20b50 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
20b60 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
20b70 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
20b80 20 76 3e 30 20 29 3b 20 20 2f 2a 20 45 56 3a 20   v>0 );  /* EV: 
20b90 52 2d 34 30 38 31 32 2d 30 33 35 37 30 20 2a 2f  R-40812-03570 */
20ba0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e 72  .    }.    pC->r
20bb0 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b  owidIsValid = 0;
20bc0 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65  .    pC->deferre
20bd0 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20  dMoveto = 0;.   
20be0 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
20bf0 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
20c00 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20    }.  pOut->u.i 
20c10 3d 20 76 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  = v;.  break;.}.
20c20 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 73 65  ./* Opcode: Inse
20c30 72 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50  rt P1 P2 P3 P4 P
20c40 35 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  5.**.** Write an
20c50 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
20c60 74 61 62 6c 65 20 6f 66 20 63 75 72 73 6f 72 20  table of cursor 
20c70 50 31 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  P1.  A new entry
20c80 20 69 73 0a 2a 2a 20 63 72 65 61 74 65 64 20 69   is.** created i
20c90 66 20 69 74 20 64 6f 65 73 6e 27 74 20 61 6c 72  f it doesn't alr
20ca0 65 61 64 79 20 65 78 69 73 74 20 6f 72 20 74 68  eady exist or th
20cb0 65 20 64 61 74 61 20 66 6f 72 20 61 6e 20 65 78  e data for an ex
20cc0 69 73 74 69 6e 67 0a 2a 2a 20 65 6e 74 72 79 20  isting.** entry 
20cd0 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  is overwritten. 
20ce0 20 54 68 65 20 64 61 74 61 20 69 73 20 74 68 65   The data is the
20cf0 20 76 61 6c 75 65 20 4d 45 4d 5f 42 6c 6f 62 20   value MEM_Blob 
20d00 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
20d10 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 32 2e  er.** number P2.
20d20 20 54 68 65 20 6b 65 79 20 69 73 20 73 74 6f 72   The key is stor
20d30 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
20d40 33 2e 20 54 68 65 20 6b 65 79 20 6d 75 73 74 0a  3. The key must.
20d50 2a 2a 20 62 65 20 61 20 4d 45 4d 5f 49 6e 74 2e  ** be a MEM_Int.
20d60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50  .**.** If the OP
20d70 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 66 6c 61  FLAG_NCHANGE fla
20d80 67 20 6f 66 20 50 35 20 69 73 20 73 65 74 2c 20  g of P5 is set, 
20d90 74 68 65 6e 20 74 68 65 20 72 6f 77 20 63 68 61  then the row cha
20da0 6e 67 65 20 63 6f 75 6e 74 20 69 73 0a 2a 2a 20  nge count is.** 
20db0 69 6e 63 72 65 6d 65 6e 74 65 64 20 28 6f 74 68  incremented (oth
20dc0 65 72 77 69 73 65 20 6e 6f 74 29 2e 20 20 49 66  erwise not).  If
20dd0 20 74 68 65 20 4f 50 46 4c 41 47 5f 4c 41 53 54   the OPFLAG_LAST
20de0 52 4f 57 49 44 20 66 6c 61 67 20 6f 66 20 50 35  ROWID flag of P5
20df0 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 6e   is set,.** then
20e00 20 72 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64   rowid is stored
20e10 20 66 6f 72 20 73 75 62 73 65 71 75 65 6e 74 20   for subsequent 
20e20 72 65 74 75 72 6e 20 62 79 20 74 68 65 0a 2a 2a  return by the.**
20e30 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
20e40 73 65 72 74 5f 72 6f 77 69 64 28 29 20 66 75 6e  sert_rowid() fun
20e50 63 74 69 6f 6e 20 28 6f 74 68 65 72 77 69 73 65  ction (otherwise
20e60 20 69 74 20 69 73 20 75 6e 6d 6f 64 69 66 69 65   it is unmodifie
20e70 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  d)..**.** If the
20e80 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
20e90 45 53 55 4c 54 20 66 6c 61 67 20 6f 66 20 50 35  ESULT flag of P5
20ea0 20 69 73 20 73 65 74 20 61 6e 64 20 69 66 20 74   is set and if t
20eb0 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
20ec0 74 68 65 20 6c 61 73 74 20 73 65 65 6b 20 6f 70  the last seek op
20ed0 65 72 61 74 69 6f 6e 20 28 4f 50 5f 4e 6f 74 45  eration (OP_NotE
20ee0 78 69 73 74 73 29 20 77 61 73 20 61 20 73 75 63  xists) was a suc
20ef0 63 65 73 73 2c 20 74 68 65 6e 20 74 68 69 73 0a  cess, then this.
20f00 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c  ** operation wil
20f10 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  l not attempt to
20f20 20 66 69 6e 64 20 74 68 65 20 61 70 70 72 6f 70   find the approp
20f30 72 69 61 74 65 20 72 6f 77 20 62 65 66 6f 72 65  riate row before
20f40 20 64 6f 69 6e 67 0a 2a 2a 20 74 68 65 20 69 6e   doing.** the in
20f50 73 65 72 74 20 62 75 74 20 77 69 6c 6c 20 69 6e  sert but will in
20f60 73 74 65 61 64 20 6f 76 65 72 77 72 69 74 65 20  stead overwrite 
20f70 74 68 65 20 72 6f 77 20 74 68 61 74 20 74 68 65  the row that the
20f80 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 75   cursor is.** cu
20f90 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
20fa0 20 74 6f 2e 20 20 50 72 65 73 75 6d 61 62 6c 79   to.  Presumably
20fb0 2c 20 74 68 65 20 70 72 69 6f 72 20 4f 50 5f 4e  , the prior OP_N
20fc0 6f 74 45 78 69 73 74 73 20 6f 70 63 6f 64 65 0a  otExists opcode.
20fd0 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  ** has already p
20fe0 6f 73 69 74 69 6f 6e 65 64 20 74 68 65 20 63 75  ositioned the cu
20ff0 72 73 6f 72 20 63 6f 72 72 65 63 74 6c 79 2e 20  rsor correctly. 
21000 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
21010 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 74 68 61 74  mization.** that
21020 20 62 6f 6f 73 74 73 20 70 65 72 66 6f 72 6d 61   boosts performa
21030 6e 63 65 20 62 79 20 61 76 6f 69 64 69 6e 67 20  nce by avoiding 
21040 72 65 64 75 6e 64 61 6e 74 20 73 65 65 6b 73 2e  redundant seeks.
21050 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50  .**.** If the OP
21060 46 4c 41 47 5f 49 53 55 50 44 41 54 45 20 66 6c  FLAG_ISUPDATE fl
21070 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
21080 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 70  this opcode is p
21090 61 72 74 20 6f 66 20 61 6e 0a 2a 2a 20 55 50 44  art of an.** UPD
210a0 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ATE operation.  
210b0 4f 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68  Otherwise (if th
210c0 65 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 29  e flag is clear)
210d0 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63 6f 64   then this opcod
210e0 65 0a 2a 2a 20 69 73 20 70 61 72 74 20 6f 66 20  e.** is part of 
210f0 61 6e 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  an INSERT operat
21100 69 6f 6e 2e 20 20 54 68 65 20 64 69 66 66 65 72  ion.  The differ
21110 65 6e 63 65 20 69 73 20 6f 6e 6c 79 20 69 6d 70  ence is only imp
21120 6f 72 74 61 6e 74 20 74 6f 0a 2a 2a 20 74 68 65  ortant to.** the
21130 20 75 70 64 61 74 65 20 68 6f 6f 6b 2e 0a 2a 2a   update hook..**
21140 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 50 34  .** Parameter P4
21150 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 20   may point to a 
21160 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
21170 67 20 74 68 65 20 74 61 62 6c 65 2d 6e 61 6d 65  g the table-name
21180 2c 20 6f 72 0a 2a 2a 20 6d 61 79 20 62 65 20 4e  , or.** may be N
21190 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ULL. If it is no
211a0 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
211b0 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 0a 2a 2a   update-hook .**
211c0 20 28 73 71 6c 69 74 65 33 2e 78 55 70 64 61 74   (sqlite3.xUpdat
211d0 65 43 61 6c 6c 62 61 63 6b 29 20 69 73 20 69 6e  eCallback) is in
211e0 76 6f 6b 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  voked following 
211f0 61 20 73 75 63 63 65 73 73 66 75 6c 20 69 6e 73  a successful ins
21200 65 72 74 2e 0a 2a 2a 0a 2a 2a 20 28 57 41 52 4e  ert..**.** (WARN
21210 49 4e 47 2f 54 4f 44 4f 3a 20 49 66 20 50 31 20  ING/TODO: If P1 
21220 69 73 20 61 20 70 73 65 75 64 6f 2d 63 75 72 73  is a pseudo-curs
21230 6f 72 20 61 6e 64 20 50 32 20 69 73 20 64 79 6e  or and P2 is dyn
21240 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f  amically.** allo
21250 63 61 74 65 64 2c 20 74 68 65 6e 20 6f 77 6e 65  cated, then owne
21260 72 73 68 69 70 20 6f 66 20 50 32 20 69 73 20 74  rship of P2 is t
21270 72 61 6e 73 66 65 72 72 65 64 20 74 6f 20 74 68  ransferred to th
21280 65 20 70 73 65 75 64 6f 2d 63 75 72 73 6f 72 0a  e pseudo-cursor.
21290 2a 2a 20 61 6e 64 20 72 65 67 69 73 74 65 72 20  ** and register 
212a0 50 32 20 62 65 63 6f 6d 65 73 20 65 70 68 65 6d  P2 becomes ephem
212b0 65 72 61 6c 2e 20 20 49 66 20 74 68 65 20 63 75  eral.  If the cu
212c0 72 73 6f 72 20 69 73 20 63 68 61 6e 67 65 64 2c  rsor is changed,
212d0 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
212e0 20 72 65 67 69 73 74 65 72 20 50 32 20 77 69 6c   register P2 wil
212f0 6c 20 74 68 65 6e 20 63 68 61 6e 67 65 2e 20 20  l then change.  
21300 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 64  Make sure this d
21310 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 61 75 73 65  oes not.** cause
21320 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 29 0a   any problems.).
21330 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72  **.** This instr
21340 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b  uction only work
21350 73 20 6f 6e 20 74 61 62 6c 65 73 2e 20 20 54 68  s on tables.  Th
21360 65 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e 73  e equivalent ins
21370 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  truction.** for 
21380 69 6e 64 69 63 65 73 20 69 73 20 4f 50 5f 49 64  indices is OP_Id
21390 78 49 6e 73 65 72 74 2e 0a 2a 2f 0a 2f 2a 20 4f  xInsert..*/./* O
213a0 70 63 6f 64 65 3a 20 49 6e 73 65 72 74 49 6e 74  pcode: InsertInt
213b0 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
213c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
213d0 20 65 78 61 63 74 6c 79 20 6c 69 6b 65 20 4f 50   exactly like OP
213e0 5f 49 6e 73 65 72 74 20 65 78 63 65 70 74 20 74  _Insert except t
213f0 68 61 74 20 74 68 65 20 6b 65 79 20 69 73 20 74  hat the key is t
21400 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 76 61  he.** integer va
21410 6c 75 65 20 50 33 2c 20 6e 6f 74 20 74 68 65 20  lue P3, not the 
21420 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
21430 65 67 65 72 20 73 74 6f 72 65 64 20 69 6e 20 72  eger stored in r
21440 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2f 0a 63  egister P3..*/.c
21450 61 73 65 20 4f 50 5f 49 6e 73 65 72 74 3a 20 0a  ase OP_Insert: .
21460 63 61 73 65 20 4f 50 5f 49 6e 73 65 72 74 49 6e  case OP_InsertIn
21470 74 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 44 61 74  t: {.  Mem *pDat
21480 61 3b 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 20  a;       /* MEM 
21490 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 64 61 74  cell holding dat
214a0 61 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64  a for the record
214b0 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20   to be inserted 
214c0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4b 65 79 3b 20  */.  Mem *pKey; 
214d0 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 20 63 65         /* MEM ce
214e0 6c 6c 20 68 6f 6c 64 69 6e 67 20 6b 65 79 20 20  ll holding key  
214f0 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 2a  for the record *
21500 2f 0a 20 20 69 36 34 20 69 4b 65 79 3b 20 20 20  /.  i64 iKey;   
21510 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74        /* The int
21520 65 67 65 72 20 52 4f 57 49 44 20 6f 72 20 6b 65  eger ROWID or ke
21530 79 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64  y for the record
21540 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20   to be inserted 
21550 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
21560 2a 70 43 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72  *pC;   /* Cursor
21570 20 74 6f 20 74 61 62 6c 65 20 69 6e 74 6f 20 77   to table into w
21580 68 69 63 68 20 69 6e 73 65 72 74 20 69 73 20 77  hich insert is w
21590 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
215a0 6e 5a 65 72 6f 3b 20 20 20 20 20 20 20 20 2f 2a  nZero;        /*
215b0 20 4e 75 6d 62 65 72 20 6f 66 20 7a 65 72 6f 2d   Number of zero-
215c0 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
215d0 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b 52 65 73  */.  int seekRes
215e0 75 6c 74 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74  ult;   /* Result
215f0 20 6f 66 20 70 72 69 6f 72 20 73 65 65 6b 20 6f   of prior seek o
21600 72 20 30 20 69 66 20 6e 6f 20 55 53 45 53 45 45  r 0 if no USESEE
21610 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 2a 2f 0a  KRESULT flag */.
21620 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
21630 62 3b 20 20 2f 2a 20 64 61 74 61 62 61 73 65 20  b;  /* database 
21640 6e 61 6d 65 20 2d 20 75 73 65 64 20 62 79 20 74  name - used by t
21650 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 20 2a  he update hook *
21660 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
21670 7a 54 62 6c 3b 20 2f 2a 20 54 61 62 6c 65 20 6e  zTbl; /* Table n
21680 61 6d 65 20 2d 20 75 73 65 64 20 62 79 20 74 68  ame - used by th
21690 65 20 6f 70 64 61 74 65 20 68 6f 6f 6b 20 2a 2f  e opdate hook */
216a0 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
216b0 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 66       /* Opcode f
216c0 6f 72 20 75 70 64 61 74 65 20 68 6f 6f 6b 3a 20  or update hook: 
216d0 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 6f 72  SQLITE_UPDATE or
216e0 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 2a   SQLITE_INSERT *
216f0 2f 0a 0a 20 20 70 44 61 74 61 20 3d 20 26 61 4d  /..  pData = &aM
21700 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61  em[pOp->p2];.  a
21710 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
21720 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
21730 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73  nCursor );.  ass
21740 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
21750 70 44 61 74 61 29 20 29 3b 0a 20 20 70 43 20 3d  pData) );.  pC =
21760 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
21770 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
21780 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21790 20 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20   pC->pCursor!=0 
217a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
217b0 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67 3d  >pseudoTableReg=
217c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
217d0 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20  pC->isTable );. 
217e0 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
217f0 70 4f 70 2d 3e 70 32 2c 20 70 44 61 74 61 29 3b  pOp->p2, pData);
21800 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ..  if( pOp->opc
21810 6f 64 65 3d 3d 4f 50 5f 49 6e 73 65 72 74 20 29  ode==OP_Insert )
21820 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 26 61 4d  {.    pKey = &aM
21830 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20  em[pOp->p3];.   
21840 20 61 73 73 65 72 74 28 20 70 4b 65 79 2d 3e 66   assert( pKey->f
21850 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
21860 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
21870 6d 49 73 56 61 6c 69 64 28 70 4b 65 79 29 20 29  mIsValid(pKey) )
21880 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54  ;.    REGISTER_T
21890 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4b  RACE(pOp->p3, pK
218a0 65 79 29 3b 0a 20 20 20 20 69 4b 65 79 20 3d 20  ey);.    iKey = 
218b0 70 4b 65 79 2d 3e 75 2e 69 3b 0a 20 20 7d 65 6c  pKey->u.i;.  }el
218c0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
218d0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
218e0 49 6e 73 65 72 74 49 6e 74 20 29 3b 0a 20 20 20  InsertInt );.   
218f0 20 69 4b 65 79 20 3d 20 70 4f 70 2d 3e 70 33 3b   iKey = pOp->p3;
21900 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 70 2d  .  }..  if( pOp-
21910 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48  >p5 & OPFLAG_NCH
21920 41 4e 47 45 20 29 20 70 2d 3e 6e 43 68 61 6e 67  ANGE ) p->nChang
21930 65 2b 2b 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  e++;.  if( pOp->
21940 70 35 20 26 20 4f 50 46 4c 41 47 5f 4c 41 53 54  p5 & OPFLAG_LAST
21950 52 4f 57 49 44 20 29 20 64 62 2d 3e 6c 61 73 74  ROWID ) db->last
21960 52 6f 77 69 64 20 3d 20 6c 61 73 74 52 6f 77 69  Rowid = lastRowi
21970 64 20 3d 20 69 4b 65 79 3b 0a 20 20 69 66 28 20  d = iKey;.  if( 
21980 70 44 61 74 61 2d 3e 66 6c 61 67 73 20 26 20 4d  pData->flags & M
21990 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70  EM_Null ){.    p
219a0 44 61 74 61 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20  Data->z = 0;.   
219b0 20 70 44 61 74 61 2d 3e 6e 20 3d 20 30 3b 0a 20   pData->n = 0;. 
219c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
219d0 72 74 28 20 70 44 61 74 61 2d 3e 66 6c 61 67 73  rt( pData->flags
219e0 20 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d   & (MEM_Blob|MEM
219f0 5f 53 74 72 29 20 29 3b 0a 20 20 7d 0a 20 20 73  _Str) );.  }.  s
21a00 65 65 6b 52 65 73 75 6c 74 20 3d 20 28 28 70 4f  eekResult = ((pO
21a10 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 55  p->p5 & OPFLAG_U
21a20 53 45 53 45 45 4b 52 45 53 55 4c 54 29 20 3f 20  SESEEKRESULT) ? 
21a30 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3a  pC->seekResult :
21a40 20 30 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61   0);.  if( pData
21a50 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
21a60 72 6f 20 29 7b 0a 20 20 20 20 6e 5a 65 72 6f 20  ro ){.    nZero 
21a70 3d 20 70 44 61 74 61 2d 3e 75 2e 6e 5a 65 72 6f  = pData->u.nZero
21a80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
21a90 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Zero = 0;.  }.  
21aa0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
21ab0 61 63 68 65 64 52 6f 77 69 64 28 70 43 2d 3e 70  achedRowid(pC->p
21ac0 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 72 63  Cursor, 0);.  rc
21ad0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
21ae0 6e 73 65 72 74 28 70 43 2d 3e 70 43 75 72 73 6f  nsert(pC->pCurso
21af0 72 2c 20 30 2c 20 69 4b 65 79 2c 0a 20 20 20 20  r, 0, iKey,.    
21b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b10 20 20 20 20 20 20 70 44 61 74 61 2d 3e 7a 2c 20        pData->z, 
21b20 70 44 61 74 61 2d 3e 6e 2c 20 6e 5a 65 72 6f 2c  pData->n, nZero,
21b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21b40 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
21b50 70 35 20 26 20 4f 50 46 4c 41 47 5f 41 50 50 45  p5 & OPFLAG_APPE
21b60 4e 44 2c 20 73 65 65 6b 52 65 73 75 6c 74 0a 20  ND, seekResult. 
21b70 20 29 3b 0a 20 20 70 43 2d 3e 72 6f 77 69 64 49   );.  pC->rowidI
21b80 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 70 43  sValid = 0;.  pC
21b90 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
21ba0 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68   = 0;.  pC->cach
21bb0 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
21bc0 53 54 41 4c 45 3b 0a 0a 20 20 2f 2a 20 49 6e 76  STALE;..  /* Inv
21bd0 6f 6b 65 20 74 68 65 20 75 70 64 61 74 65 2d 68  oke the update-h
21be0 6f 6f 6b 20 69 66 20 72 65 71 75 69 72 65 64 2e  ook if required.
21bf0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
21c00 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 78  LITE_OK && db->x
21c10 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26  UpdateCallback &
21c20 26 20 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20  & pOp->p4.z ){. 
21c30 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62     zDb = db->aDb
21c40 5b 70 43 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  [pC->iDb].zName;
21c50 0a 20 20 20 20 7a 54 62 6c 20 3d 20 70 4f 70 2d  .    zTbl = pOp-
21c60 3e 70 34 2e 7a 3b 0a 20 20 20 20 6f 70 20 3d 20  >p4.z;.    op = 
21c70 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c  ((pOp->p5 & OPFL
21c80 41 47 5f 49 53 55 50 44 41 54 45 29 20 3f 20 53  AG_ISUPDATE) ? S
21c90 51 4c 49 54 45 5f 55 50 44 41 54 45 20 3a 20 53  QLITE_UPDATE : S
21ca0 51 4c 49 54 45 5f 49 4e 53 45 52 54 29 3b 0a 20  QLITE_INSERT);. 
21cb0 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
21cc0 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 64 62  sTable );.    db
21cd0 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63  ->xUpdateCallbac
21ce0 6b 28 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67  k(db->pUpdateArg
21cf0 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c  , op, zDb, zTbl,
21d00 20 69 4b 65 79 29 3b 0a 20 20 20 20 61 73 73 65   iKey);.    asse
21d10 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29  rt( pC->iDb>=0 )
21d20 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
21d30 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65 6c  ../* Opcode: Del
21d40 65 74 65 20 50 31 20 50 32 20 2a 20 50 34 20 2a  ete P1 P2 * P4 *
21d50 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  .**.** Delete th
21d60 65 20 72 65 63 6f 72 64 20 61 74 20 77 68 69 63  e record at whic
21d70 68 20 74 68 65 20 50 31 20 63 75 72 73 6f 72 20  h the P1 cursor 
21d80 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
21d90 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
21da0 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20   cursor will be 
21db0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
21dc0 20 65 69 74 68 65 72 20 74 68 65 20 6e 65 78 74   either the next
21dd0 20 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73   or the previous
21de0 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e 20 74 68  .** record in th
21df0 65 20 74 61 62 6c 65 2e 20 49 66 20 69 74 20 69  e table. If it i
21e00 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
21e10 61 74 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f  at the next reco
21e20 72 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  rd, then.** the 
21e30 6e 65 78 74 20 4e 65 78 74 20 69 6e 73 74 72 75  next Next instru
21e40 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 20  ction will be a 
21e50 6e 6f 2d 6f 70 2e 20 20 48 65 6e 63 65 20 69 74  no-op.  Hence it
21e60 20 69 73 20 4f 4b 20 74 6f 20 64 65 6c 65 74 65   is OK to delete
21e70 0a 2a 2a 20 61 20 72 65 63 6f 72 64 20 66 72 6f  .** a record fro
21e80 6d 20 77 69 74 68 69 6e 20 61 6e 20 4e 65 78 74  m within an Next
21e90 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   loop..**.** If 
21ea0 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  the OPFLAG_NCHAN
21eb0 47 45 20 66 6c 61 67 20 6f 66 20 50 32 20 69 73  GE flag of P2 is
21ec0 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72   set, then the r
21ed0 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20  ow change count 
21ee0 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65  is.** incremente
21ef0 64 20 28 6f 74 68 65 72 77 69 73 65 20 6e 6f 74  d (otherwise not
21f00 29 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 6d 75 73 74  )..**.** P1 must
21f10 20 6e 6f 74 20 62 65 20 70 73 65 75 64 6f 2d 74   not be pseudo-t
21f20 61 62 6c 65 2e 20 20 49 74 20 68 61 73 20 74 6f  able.  It has to
21f30 20 62 65 20 61 20 72 65 61 6c 20 74 61 62 6c 65   be a real table
21f40 20 77 69 74 68 0a 2a 2a 20 6d 75 6c 74 69 70 6c   with.** multipl
21f50 65 20 72 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  e rows..**.** If
21f60 20 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c   P4 is not NULL,
21f70 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
21f80 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
21f90 65 20 74 68 61 74 20 50 31 20 69 73 0a 2a 2a 20  e that P1 is.** 
21fa0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
21fb0 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 20 77 69  e update hook wi
21fc0 6c 6c 20 62 65 20 69 6e 76 6f 6b 65 64 2c 20 69  ll be invoked, i
21fd0 66 20 69 74 20 65 78 69 73 74 73 2e 0a 2a 2a 20  f it exists..** 
21fe0 49 66 20 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c  If P4 is not NUL
21ff0 4c 20 74 68 65 6e 20 74 68 65 20 50 31 20 63 75  L then the P1 cu
22000 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62  rsor must have b
22010 65 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 0a 2a  een positioned.*
22020 2a 20 75 73 69 6e 67 20 4f 50 5f 4e 6f 74 46 6f  * using OP_NotFo
22030 75 6e 64 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  und prior to inv
22040 6f 6b 69 6e 67 20 74 68 69 73 20 6f 70 63 6f 64  oking this opcod
22050 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65  e..*/.case OP_De
22060 6c 65 74 65 3a 20 7b 0a 20 20 69 36 34 20 69 4b  lete: {.  i64 iK
22070 65 79 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  ey;.  VdbeCursor
22080 20 2a 70 43 3b 0a 0a 20 20 69 4b 65 79 20 3d 20   *pC;..  iKey = 
22090 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  0;.  assert( pOp
220a0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
220b0 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
220c0 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
220d0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
220e0 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
220f0 61 73 73 65 72 74 28 20 70 43 2d 3e 70 43 75 72  assert( pC->pCur
22100 73 6f 72 21 3d 30 20 29 3b 20 20 2f 2a 20 4f 6e  sor!=0 );  /* On
22110 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 72 65 61  ly valid for rea
22120 6c 20 74 61 62 6c 65 73 2c 20 6e 6f 20 70 73 65  l tables, no pse
22130 75 64 6f 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20  udotables */..  
22140 2f 2a 20 49 66 20 74 68 65 20 75 70 64 61 74 65  /* If the update
22150 2d 68 6f 6f 6b 20 77 69 6c 6c 20 62 65 20 69 6e  -hook will be in
22160 76 6f 6b 65 64 2c 20 73 65 74 20 69 4b 65 79 20  voked, set iKey 
22170 74 6f 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  to the rowid of 
22180 74 68 65 0a 20 20 2a 2a 20 72 6f 77 20 62 65 69  the.  ** row bei
22190 6e 67 20 64 65 6c 65 74 65 64 2e 0a 20 20 2a 2f  ng deleted..  */
221a0 0a 20 20 69 66 28 20 64 62 2d 3e 78 55 70 64 61  .  if( db->xUpda
221b0 74 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 70 4f  teCallback && pO
221c0 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20 20 61  p->p4.z ){.    a
221d0 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62  ssert( pC->isTab
221e0 6c 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  le );.    assert
221f0 28 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c  ( pC->rowidIsVal
22200 69 64 20 29 3b 20 20 2f 2a 20 6c 61 73 74 52 6f  id );  /* lastRo
22210 77 69 64 20 73 65 74 20 62 79 20 70 72 65 76 69  wid set by previ
22220 6f 75 73 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20  ous OP_NotFound 
22230 2a 2f 0a 20 20 20 20 69 4b 65 79 20 3d 20 70 43  */.    iKey = pC
22240 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 7d  ->lastRowid;.  }
22250 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 50 5f 44 65  ..  /* The OP_De
22260 6c 65 74 65 20 6f 70 63 6f 64 65 20 61 6c 77 61  lete opcode alwa
22270 79 73 20 66 6f 6c 6c 6f 77 73 20 61 6e 20 4f 50  ys follows an OP
22280 5f 4e 6f 74 45 78 69 73 74 73 20 6f 72 20 4f 50  _NotExists or OP
22290 5f 4c 61 73 74 20 6f 72 0a 20 20 2a 2a 20 4f 50  _Last or.  ** OP
222a0 5f 43 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 73  _Column on the s
222b0 61 6d 65 20 74 61 62 6c 65 20 77 69 74 68 6f 75  ame table withou
222c0 74 20 61 6e 79 20 69 6e 74 65 72 76 65 6e 69 6e  t any intervenin
222d0 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61  g operations tha
222e0 74 0a 20 20 2a 2a 20 6d 69 67 68 74 20 6d 6f 76  t.  ** might mov
222f0 65 20 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20  e or invalidate 
22300 74 68 65 20 63 75 72 73 6f 72 2e 20 20 48 65 6e  the cursor.  Hen
22310 63 65 20 63 75 72 73 6f 72 20 70 43 20 69 73 20  ce cursor pC is 
22320 61 6c 77 61 79 73 20 70 6f 69 6e 74 69 6e 67 0a  always pointing.
22330 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 6f 77 20    ** to the row 
22340 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 61 6e  to be deleted an
22350 64 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  d the sqlite3Vdb
22360 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29 20  eCursorMoveto() 
22370 6f 70 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 62  operation.  ** b
22380 65 6c 6f 77 20 69 73 20 61 6c 77 61 79 73 20 61  elow is always a
22390 20 6e 6f 2d 6f 70 20 61 6e 64 20 63 61 6e 6e 6f   no-op and canno
223a0 74 20 66 61 69 6c 2e 20 20 57 65 20 77 69 6c 6c  t fail.  We will
223b0 20 72 75 6e 20 69 74 20 61 6e 79 68 6f 77 2c 20   run it anyhow, 
223c0 74 68 6f 75 67 68 2c 0a 20 20 2a 2a 20 74 6f 20  though,.  ** to 
223d0 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 66 75  guard against fu
223e0 74 75 72 65 20 63 68 61 6e 67 65 73 20 74 6f 20  ture changes to 
223f0 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
22400 6f 72 2e 0a 20 20 2a 2a 2f 0a 20 20 61 73 73 65  or..  **/.  asse
22410 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64  rt( pC->deferred
22420 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 72  Moveto==0 );.  r
22430 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
22440 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b  ursorMoveto(pC);
22450 0a 20 20 69 66 28 20 4e 45 56 45 52 28 72 63 21  .  if( NEVER(rc!
22460 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 20 67 6f  =SQLITE_OK) ) go
22470 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
22480 65 72 72 6f 72 3b 0a 0a 20 20 73 71 6c 69 74 65  error;..  sqlite
22490 33 42 74 72 65 65 53 65 74 43 61 63 68 65 64 52  3BtreeSetCachedR
224a0 6f 77 69 64 28 70 43 2d 3e 70 43 75 72 73 6f 72  owid(pC->pCursor
224b0 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
224c0 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
224d0 70 43 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20  pC->pCursor);.  
224e0 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
224f0 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 0a  = CACHE_STALE;..
22500 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
22510 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72  update-hook if r
22520 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
22530 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22540 26 26 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61  && db->xUpdateCa
22550 6c 6c 62 61 63 6b 20 26 26 20 70 4f 70 2d 3e 70  llback && pOp->p
22560 34 2e 7a 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  4.z ){.    const
22570 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
22580 3e 61 44 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a 4e  >aDb[pC->iDb].zN
22590 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
225a0 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 4f 70 2d  har *zTbl = pOp-
225b0 3e 70 34 2e 7a 3b 0a 20 20 20 20 64 62 2d 3e 78  >p4.z;.    db->x
225c0 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64  UpdateCallback(d
225d0 62 2d 3e 70 55 70 64 61 74 65 41 72 67 2c 20 53  b->pUpdateArg, S
225e0 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 44  QLITE_DELETE, zD
225f0 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 29 3b 0a  b, zTbl, iKey);.
22600 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
22610 69 44 62 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  iDb>=0 );.  }.  
22620 69 66 28 20 70 4f 70 2d 3e 70 32 20 26 20 4f 50  if( pOp->p2 & OP
22630 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29 20 70  FLAG_NCHANGE ) p
22640 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 62  ->nChange++;.  b
22650 72 65 61 6b 3b 0a 7d 0a 2f 2a 20 4f 70 63 6f 64  reak;.}./* Opcod
22660 65 3a 20 52 65 73 65 74 43 6f 75 6e 74 20 2a 20  e: ResetCount * 
22670 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68  * * * *.**.** Th
22680 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
22690 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 69 73  hange counter is
226a0 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 64   copied to the d
226b0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
226c0 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  * change counter
226d0 20 28 72 65 74 75 72 6e 65 64 20 62 79 20 73 75   (returned by su
226e0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
226f0 6f 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  o sqlite3_change
22700 73 28 29 29 2e 0a 2a 2a 20 54 68 65 6e 20 74 68  s())..** Then th
22710 65 20 56 4d 73 20 69 6e 74 65 72 6e 61 6c 20 63  e VMs internal c
22720 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 72 65  hange counter re
22730 73 65 74 73 20 74 6f 20 30 2e 0a 2a 2a 20 54 68  sets to 0..** Th
22740 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74 72  is is used by tr
22750 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a  igger programs..
22760 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 65 74  */.case OP_Reset
22770 43 6f 75 6e 74 3a 20 7b 0a 20 20 73 71 6c 69 74  Count: {.  sqlit
22780 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
22790 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
227a0 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
227b0 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   0;.  break;.}..
227c0 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65  /* Opcode: Sorte
227d0 72 43 6f 6d 70 61 72 65 20 50 31 20 50 32 20 50  rCompare P1 P2 P
227e0 33 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20  3.**.** P1 is a 
227f0 73 6f 72 74 65 72 20 63 75 72 73 6f 72 2e 20 54  sorter cursor. T
22800 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
22810 63 6f 6d 70 61 72 65 73 20 74 68 65 20 72 65 63  compares the rec
22820 6f 72 64 20 62 6c 6f 62 20 69 6e 20 0a 2a 2a 20  ord blob in .** 
22830 72 65 67 69 73 74 65 72 20 50 33 20 77 69 74 68  register P3 with
22840 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
22850 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f  the sorter curso
22860 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
22870 74 73 20 74 6f 2e 0a 2a 2a 20 49 66 2c 20 65 78  ts to..** If, ex
22880 63 6c 75 64 69 6e 67 20 74 68 65 20 72 6f 77 69  cluding the rowi
22890 64 20 66 69 65 6c 64 73 20 61 74 20 74 68 65 20  d fields at the 
228a0 65 6e 64 2c 20 74 68 65 20 74 77 6f 20 72 65 63  end, the two rec
228b0 6f 72 64 73 20 61 72 65 20 61 20 6d 61 74 63 68  ords are a match
228c0 2c 0a 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67  ,.** fall throug
228d0 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
228e0 73 74 72 75 63 74 69 6f 6e 2e 20 4f 74 68 65 72  struction. Other
228f0 77 69 73 65 2c 20 6a 75 6d 70 20 74 6f 20 69 6e  wise, jump to in
22900 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 0a 2a 2f  struction P2..*/
22910 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 43  .case OP_SorterC
22920 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 56 64 62 65  ompare: {.  Vdbe
22930 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e  Cursor *pC;.  in
22940 74 20 72 65 73 3b 0a 0a 20 20 70 43 20 3d 20 70  t res;..  pC = p
22950 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
22960 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 6f  ;.  assert( isSo
22970 72 74 65 72 28 70 43 29 20 29 3b 0a 20 20 70 49  rter(pC) );.  pI
22980 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n3 = &aMem[pOp->
22990 70 33 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  p3];.  rc = sqli
229a0 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6f 6d  te3VdbeSorterCom
229b0 70 61 72 65 28 70 43 2c 20 70 49 6e 33 2c 20 26  pare(pC, pIn3, &
229c0 72 65 73 29 3b 0a 20 20 69 66 28 20 72 65 73 20  res);.  if( res 
229d0 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  ){.    pc = pOp-
229e0 3e 70 32 2d 31 3b 0a 20 20 7d 0a 20 20 62 72 65  >p2-1;.  }.  bre
229f0 61 6b 3b 0a 7d 3b 0a 0a 2f 2a 20 4f 70 63 6f 64  ak;.};../* Opcod
22a00 65 3a 20 53 6f 72 74 65 72 44 61 74 61 20 50 31  e: SorterData P1
22a10 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
22a20 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67 69 73  Write into regis
22a30 74 65 72 20 50 32 20 74 68 65 20 63 75 72 72 65  ter P2 the curre
22a40 6e 74 20 73 6f 72 74 65 72 20 64 61 74 61 20 66  nt sorter data f
22a50 6f 72 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72  or sorter cursor
22a60 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P1..*/.case OP_
22a70 53 6f 72 74 65 72 44 61 74 61 3a 20 7b 0a 20 20  SorterData: {.  
22a80 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
22a90 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
22aa0 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 43 20 3d  pOp->p2];.  pC =
22ab0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
22ac0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
22ad0 2d 3e 69 73 53 6f 72 74 65 72 20 29 3b 0a 20 20  ->isSorter );.  
22ae0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
22af0 53 6f 72 74 65 72 52 6f 77 6b 65 79 28 70 43 2c  SorterRowkey(pC,
22b00 20 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b   pOut);.  break;
22b10 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  .}../* Opcode: R
22b20 6f 77 44 61 74 61 20 50 31 20 50 32 20 2a 20 2a  owData P1 P2 * *
22b30 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69   *.**.** Write i
22b40 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 20  nto register P2 
22b50 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 6f 77  the complete row
22b60 20 64 61 74 61 20 66 6f 72 20 63 75 72 73 6f 72   data for cursor
22b70 20 50 31 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73   P1..** There is
22b80 20 6e 6f 20 69 6e 74 65 72 70 72 65 74 61 74 69   no interpretati
22b90 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 2e 20  on of the data. 
22ba0 20 0a 2a 2a 20 49 74 20 69 73 20 6a 75 73 74 20   .** It is just 
22bb0 63 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68 65 20  copied onto the 
22bc0 50 32 20 72 65 67 69 73 74 65 72 20 65 78 61 63  P2 register exac
22bd0 74 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20 69 73  tly as .** it is
22be0 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61   found in the da
22bf0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
22c00 2a 2a 20 49 66 20 74 68 65 20 50 31 20 63 75 72  ** If the P1 cur
22c10 73 6f 72 20 6d 75 73 74 20 62 65 20 70 6f 69 6e  sor must be poin
22c20 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20  ting to a valid 
22c30 72 6f 77 20 28 6e 6f 74 20 61 20 4e 55 4c 4c 20  row (not a NULL 
22c40 72 6f 77 29 0a 2a 2a 20 6f 66 20 61 20 72 65 61  row).** of a rea
22c50 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70  l table, not a p
22c60 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a  seudo-table..*/.
22c70 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 4b 65  /* Opcode: RowKe
22c80 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  y P1 P2 * * *.**
22c90 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 72  .** Write into r
22ca0 65 67 69 73 74 65 72 20 50 32 20 74 68 65 20 63  egister P2 the c
22cb0 6f 6d 70 6c 65 74 65 20 72 6f 77 20 6b 65 79 20  omplete row key 
22cc0 66 6f 72 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a  for cursor P1..*
22cd0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 69 6e  * There is no in
22ce0 74 65 72 70 72 65 74 61 74 69 6f 6e 20 6f 66 20  terpretation of 
22cf0 74 68 65 20 64 61 74 61 2e 20 20 0a 2a 2a 20 54  the data.  .** T
22d00 68 65 20 6b 65 79 20 69 73 20 63 6f 70 69 65 64  he key is copied
22d10 20 6f 6e 74 6f 20 74 68 65 20 50 33 20 72 65 67   onto the P3 reg
22d20 69 73 74 65 72 20 65 78 61 63 74 6c 79 20 61 73  ister exactly as
22d30 20 0a 2a 2a 20 69 74 20 69 73 20 66 6f 75 6e 64   .** it is found
22d40 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
22d50 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
22d60 74 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75  the P1 cursor mu
22d70 73 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  st be pointing t
22d80 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 20 28 6e  o a valid row (n
22d90 6f 74 20 61 20 4e 55 4c 4c 20 72 6f 77 29 0a 2a  ot a NULL row).*
22da0 2a 20 6f 66 20 61 20 72 65 61 6c 20 74 61 62 6c  * of a real tabl
22db0 65 2c 20 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d  e, not a pseudo-
22dc0 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  table..*/.case O
22dd0 50 5f 52 6f 77 4b 65 79 3a 0a 63 61 73 65 20 4f  P_RowKey:.case O
22de0 50 5f 52 6f 77 44 61 74 61 3a 20 7b 0a 20 20 56  P_RowData: {.  V
22df0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
22e00 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72   BtCursor *pCrsr
22e10 3b 0a 20 20 75 33 32 20 6e 3b 0a 20 20 69 36 34  ;.  u32 n;.  i64
22e20 20 6e 36 34 3b 0a 0a 20 20 70 4f 75 74 20 3d 20   n64;..  pOut = 
22e30 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
22e40 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
22e50 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 0a 20 20  ge(p, pOut);..  
22e60 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 52 6f 77  /* Note that Row
22e70 4b 65 79 20 61 6e 64 20 52 6f 77 44 61 74 61 20  Key and RowData 
22e80 61 72 65 20 72 65 61 6c 6c 79 20 65 78 61 63 74  are really exact
22e90 6c 79 20 74 68 65 20 73 61 6d 65 20 69 6e 73 74  ly the same inst
22ea0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 61 73 73  ruction */.  ass
22eb0 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
22ec0 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
22ed0 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20  ursor );.  pC = 
22ee0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
22ef0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  ];.  assert( pC-
22f00 3e 69 73 53 6f 72 74 65 72 3d 3d 30 20 29 3b 0a  >isSorter==0 );.
22f10 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73    assert( pC->is
22f20 54 61 62 6c 65 20 7c 7c 20 70 4f 70 2d 3e 6f 70  Table || pOp->op
22f30 63 6f 64 65 21 3d 4f 50 5f 52 6f 77 44 61 74 61  code!=OP_RowData
22f40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
22f50 2d 3e 69 73 49 6e 64 65 78 20 7c 7c 20 70 4f 70  ->isIndex || pOp
22f60 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
22f70 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
22f80 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
22f90 65 72 74 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77  ert( pC->nullRow
22fa0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
22fb0 20 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65   pC->pseudoTable
22fc0 52 65 67 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Reg==0 );.  asse
22fd0 72 74 28 20 70 43 2d 3e 70 43 75 72 73 6f 72 21  rt( pC->pCursor!
22fe0 3d 30 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20  =0 );.  pCrsr = 
22ff0 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 61  pC->pCursor;.  a
23000 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
23010 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
23020 28 70 43 72 73 72 29 20 29 3b 0a 0a 20 20 2f 2a  (pCrsr) );..  /*
23030 20 54 68 65 20 4f 50 5f 52 6f 77 4b 65 79 20 61   The OP_RowKey a
23040 6e 64 20 4f 50 5f 52 6f 77 44 61 74 61 20 6f 70  nd OP_RowData op
23050 63 6f 64 65 73 20 61 6c 77 61 79 73 20 66 6f 6c  codes always fol
23060 6c 6f 77 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  low OP_NotExists
23070 20 6f 72 0a 20 20 2a 2a 20 4f 50 5f 52 65 77 69   or.  ** OP_Rewi
23080 6e 64 2f 4f 70 5f 4e 65 78 74 20 77 69 74 68 20  nd/Op_Next with 
23090 6e 6f 20 69 6e 74 65 72 76 65 6e 69 6e 67 20 69  no intervening i
230a0 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74  nstructions that
230b0 20 6d 69 67 68 74 20 69 6e 76 61 6c 69 64 61 74   might invalidat
230c0 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  e.  ** the curso
230d0 72 2e 20 20 48 65 6e 63 65 20 74 68 65 20 66 6f  r.  Hence the fo
230e0 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 56  llowing sqlite3V
230f0 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
23100 29 20 63 61 6c 6c 20 69 73 20 61 6c 77 61 79 73  ) call is always
23110 0a 20 20 2a 2a 20 61 20 6e 6f 2d 6f 70 20 61 6e  .  ** a no-op an
23120 64 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  d can never fail
23130 2e 20 20 42 75 74 20 77 65 20 6c 65 61 76 65 20  .  But we leave 
23140 69 74 20 69 6e 20 70 6c 61 63 65 20 61 73 20 61  it in place as a
23150 20 73 61 66 65 74 79 2e 0a 20 20 2a 2f 0a 20 20   safety..  */.  
23160 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65  assert( pC->defe
23170 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
23180 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
23190 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
231a0 70 43 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  pC);.  if( NEVER
231b0 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc!=SQLITE_OK) 
231c0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
231d0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 69 66  _to_error;..  if
231e0 28 20 70 43 2d 3e 69 73 49 6e 64 65 78 20 29 7b  ( pC->isIndex ){
231f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43  .    assert( !pC
23200 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20  ->isTable );.   
23210 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20   VVA_ONLY(rc =) 
23220 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
23230 69 7a 65 28 70 43 72 73 72 2c 20 26 6e 36 34 29  ize(pCrsr, &n64)
23240 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
23250 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
23260 20 20 2f 2a 20 54 72 75 65 20 62 65 63 61 75 73    /* True becaus
23270 65 20 6f 66 20 43 75 72 73 6f 72 4d 6f 76 65 74  e of CursorMovet
23280 6f 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 20 2a  o() call above *
23290 2f 0a 20 20 20 20 69 66 28 20 6e 36 34 3e 64 62  /.    if( n64>db
232a0 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
232b0 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b  LIMIT_LENGTH] ){
232c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f  .      goto too_
232d0 62 69 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  big;.    }.    n
232e0 20 3d 20 28 75 33 32 29 6e 36 34 3b 0a 20 20 7d   = (u32)n64;.  }
232f0 65 6c 73 65 7b 0a 20 20 20 20 56 56 41 5f 4f 4e  else{.    VVA_ON
23300 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33  LY(rc =) sqlite3
23310 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 70 43  BtreeDataSize(pC
23320 72 73 72 2c 20 26 6e 29 3b 0a 20 20 20 20 61 73  rsr, &n);.    as
23330 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
23340 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 44 61 74  _OK );    /* Dat
23350 61 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66  aSize() cannot f
23360 61 69 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ail */.    if( n
23370 3e 28 75 33 32 29 64 62 2d 3e 61 4c 69 6d 69 74  >(u32)db->aLimit
23380 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
23390 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 20 20 67  NGTH] ){.      g
233a0 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20  oto too_big;.   
233b0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c   }.  }.  if( sql
233c0 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
233d0 70 4f 75 74 2c 20 6e 2c 20 30 29 20 29 7b 0a 20  pOut, n, 0) ){. 
233e0 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
233f0 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20    }.  pOut->n = 
23400 6e 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46  n;.  MemSetTypeF
23410 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 42 6c  lag(pOut, MEM_Bl
23420 6f 62 29 3b 0a 20 20 69 66 28 20 70 43 2d 3e 69  ob);.  if( pC->i
23430 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 72 63  sIndex ){.    rc
23440 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
23450 65 79 28 70 43 72 73 72 2c 20 30 2c 20 6e 2c 20  ey(pCrsr, 0, n, 
23460 70 4f 75 74 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73  pOut->z);.  }els
23470 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
23480 74 65 33 42 74 72 65 65 44 61 74 61 28 70 43 72  te3BtreeData(pCr
23490 73 72 2c 20 30 2c 20 6e 2c 20 70 4f 75 74 2d 3e  sr, 0, n, pOut->
234a0 7a 29 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e  z);.  }.  pOut->
234b0 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
234c0 38 3b 20 20 2f 2a 20 49 6e 20 63 61 73 65 20 74  8;  /* In case t
234d0 68 65 20 62 6c 6f 62 20 69 73 20 65 76 65 72 20  he blob is ever 
234e0 63 61 73 74 20 74 6f 20 74 65 78 74 20 2a 2f 0a  cast to text */.
234f0 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
23500 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62  BSIZE(pOut);.  b
23510 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
23520 64 65 3a 20 52 6f 77 69 64 20 50 31 20 50 32 20  de: Rowid P1 P2 
23530 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 74 6f 72  * * *.**.** Stor
23540 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
23550 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
23560 68 20 69 73 20 74 68 65 20 6b 65 79 20 6f 66 20  h is the key of 
23570 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
23580 74 68 61 74 0a 2a 2a 20 50 31 20 69 73 20 63 75  that.** P1 is cu
23590 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f  rrently point to
235a0 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 63 61 6e 20 62  ..**.** P1 can b
235b0 65 20 65 69 74 68 65 72 20 61 6e 20 6f 72 64 69  e either an ordi
235c0 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 61 20  nary table or a 
235d0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
235e0 54 68 65 72 65 20 75 73 65 64 20 74 6f 0a 2a 2a  There used to.**
235f0 20 62 65 20 61 20 73 65 70 61 72 61 74 65 20 4f   be a separate O
23600 50 5f 56 52 6f 77 69 64 20 6f 70 63 6f 64 65 20  P_VRowid opcode 
23610 66 6f 72 20 75 73 65 20 77 69 74 68 20 76 69 72  for use with vir
23620 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 62 75 74  tual tables, but
23630 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 20 6f 70 63   this.** one opc
23640 6f 64 65 20 6e 6f 77 20 77 6f 72 6b 73 20 66 6f  ode now works fo
23650 72 20 62 6f 74 68 20 74 61 62 6c 65 20 74 79 70  r both table typ
23660 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  es..*/.case OP_R
23670 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20 20 20  owid: {         
23680 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
23690 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
236a0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
236b0 20 20 69 36 34 20 76 3b 0a 20 20 73 71 6c 69 74    i64 v;.  sqlit
236c0 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a  e3_vtab *pVtab;.
236d0 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
236e0 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b  module *pModule;
236f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
23700 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
23710 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
23720 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
23730 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
23740 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
23750 73 73 65 72 74 28 20 70 43 2d 3e 70 73 65 75 64  ssert( pC->pseud
23760 6f 54 61 62 6c 65 52 65 67 3d 3d 30 20 7c 7c 20  oTableReg==0 || 
23770 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 3b 0a 20  pC->nullRow );. 
23780 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77   if( pC->nullRow
23790 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c   ){.    pOut->fl
237a0 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
237b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 65 6c      break;.  }el
237c0 73 65 20 69 66 28 20 70 43 2d 3e 64 65 66 65 72  se if( pC->defer
237d0 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20  redMoveto ){.   
237e0 20 76 20 3d 20 70 43 2d 3e 6d 6f 76 65 74 6f 54   v = pC->movetoT
237f0 61 72 67 65 74 3b 0a 23 69 66 6e 64 65 66 20 53  arget;.#ifndef S
23800 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
23810 41 4c 54 41 42 4c 45 0a 20 20 7d 65 6c 73 65 20  ALTABLE.  }else 
23820 69 66 28 20 70 43 2d 3e 70 56 74 61 62 43 75 72  if( pC->pVtabCur
23830 73 6f 72 20 29 7b 0a 20 20 20 20 70 56 74 61 62  sor ){.    pVtab
23840 20 3d 20 70 43 2d 3e 70 56 74 61 62 43 75 72 73   = pC->pVtabCurs
23850 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 70  or->pVtab;.    p
23860 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e  Module = pVtab->
23870 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 61 73 73  pModule;.    ass
23880 65 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 52  ert( pModule->xR
23890 6f 77 69 64 20 29 3b 0a 20 20 20 20 72 63 20 3d  owid );.    rc =
238a0 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 6f 77 69 64   pModule->xRowid
238b0 28 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  (pC->pVtabCursor
238c0 2c 20 26 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  , &v);.    sqlit
238d0 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d  e3VtabImportErrm
238e0 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 23 65  sg(p, pVtab);.#e
238f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
23900 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
23910 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
23920 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70 43 75   assert( pC->pCu
23930 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 72  rsor!=0 );.    r
23940 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
23950 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b  ursorMoveto(pC);
23960 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
23970 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
23980 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70  error;.    if( p
23990 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  C->rowidIsValid 
239a0 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 43 2d  ){.      v = pC-
239b0 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 20 20  >lastRowid;.    
239c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
239d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
239e0 79 53 69 7a 65 28 70 43 2d 3e 70 43 75 72 73 6f  ySize(pC->pCurso
239f0 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 61 73  r, &v);.      as
23a00 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
23a10 5f 4f 4b 20 29 3b 20 20 2f 2a 20 41 6c 77 61 79  _OK );  /* Alway
23a20 73 20 73 6f 20 62 65 63 61 75 73 65 20 6f 66 20  s so because of 
23a30 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29 20 61  CursorMoveto() a
23a40 62 6f 76 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  bove */.    }.  
23a50 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  }.  pOut->u.i = 
23a60 76 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  v;.  break;.}../
23a70 2a 20 4f 70 63 6f 64 65 3a 20 4e 75 6c 6c 52 6f  * Opcode: NullRo
23a80 77 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  w P1 * * * *.**.
23a90 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
23aa0 6f 72 20 50 31 20 74 6f 20 61 20 6e 75 6c 6c 20  or P1 to a null 
23ab0 72 6f 77 2e 20 20 41 6e 79 20 4f 50 5f 43 6f 6c  row.  Any OP_Col
23ac0 75 6d 6e 20 6f 70 65 72 61 74 69 6f 6e 73 0a 2a  umn operations.*
23ad0 2a 20 74 68 61 74 20 6f 63 63 75 72 20 77 68 69  * that occur whi
23ae0 6c 65 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  le the cursor is
23af0 20 6f 6e 20 74 68 65 20 6e 75 6c 6c 20 72 6f 77   on the null row
23b00 20 77 69 6c 6c 20 61 6c 77 61 79 73 0a 2a 2a 20   will always.** 
23b10 77 72 69 74 65 20 61 20 4e 55 4c 4c 2e 0a 2a 2f  write a NULL..*/
23b20 0a 63 61 73 65 20 4f 50 5f 4e 75 6c 6c 52 6f 77  .case OP_NullRow
23b30 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
23b40 20 2a 70 43 3b 0a 0a 20 20 61 73 73 65 72 74 28   *pC;..  assert(
23b50 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
23b60 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
23b70 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  r );.  pC = p->a
23b80 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
23b90 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
23ba0 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20  ;.  pC->nullRow 
23bb0 3d 20 31 3b 0a 20 20 70 43 2d 3e 72 6f 77 69 64  = 1;.  pC->rowid
23bc0 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 61  IsValid = 0;.  a
23bd0 73 73 65 72 74 28 20 70 43 2d 3e 70 43 75 72 73  ssert( pC->pCurs
23be0 6f 72 20 7c 7c 20 70 43 2d 3e 70 56 74 61 62 43  or || pC->pVtabC
23bf0 75 72 73 6f 72 20 29 3b 0a 20 20 69 66 28 20 70  ursor );.  if( p
23c00 43 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  C->pCursor ){.  
23c10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
23c20 65 61 72 43 75 72 73 6f 72 28 70 43 2d 3e 70 43  earCursor(pC->pC
23c30 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 62 72  ursor);.  }.  br
23c40 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
23c50 65 3a 20 4c 61 73 74 20 50 31 20 50 32 20 2a 20  e: Last P1 P2 * 
23c60 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  * *.**.** The ne
23c70 78 74 20 75 73 65 20 6f 66 20 74 68 65 20 52 6f  xt use of the Ro
23c80 77 69 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72  wid or Column or
23c90 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   Next instructio
23ca0 6e 20 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c  n for P1 .** wil
23cb0 6c 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 6c  l refer to the l
23cc0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
23cd0 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
23ce0 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20  or index..** If 
23cf0 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
23d00 65 78 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20  ex is empty and 
23d10 50 32 3e 30 2c 20 74 68 65 6e 20 6a 75 6d 70 20  P2>0, then jump 
23d20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50  immediately to P
23d30 32 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 30  2..** If P2 is 0
23d40 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65   or if the table
23d50 20 6f 72 20 69 6e 64 65 78 20 69 73 20 6e 6f 74   or index is not
23d60 20 65 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68 72   empty, fall thr
23d70 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ough.** to the f
23d80 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63  ollowing instruc
23d90 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  tion..*/.case OP
23da0 5f 4c 61 73 74 3a 20 7b 20 20 20 20 20 20 20 20  _Last: {        
23db0 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62  /* jump */.  Vdb
23dc0 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42  eCursor *pC;.  B
23dd0 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a  tCursor *pCrsr;.
23de0 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73    int res;..  as
23df0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
23e00 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
23e10 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
23e20 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
23e30 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
23e40 21 3d 30 20 29 3b 0a 20 20 70 43 72 73 72 20 3d  !=0 );.  pCrsr =
23e50 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20   pC->pCursor;.  
23e60 72 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 41  res = 0;.  if( A
23e70 4c 57 41 59 53 28 70 43 72 73 72 21 3d 30 29 20  LWAYS(pCrsr!=0) 
23e80 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
23e90 74 65 33 42 74 72 65 65 4c 61 73 74 28 70 43 72  te3BtreeLast(pCr
23ea0 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  sr, &res);.  }. 
23eb0 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 28   pC->nullRow = (
23ec0 75 38 29 72 65 73 3b 0a 20 20 70 43 2d 3e 64 65  u8)res;.  pC->de
23ed0 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
23ee0 3b 0a 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56  ;.  pC->rowidIsV
23ef0 61 6c 69 64 20 3d 20 30 3b 0a 20 20 70 43 2d 3e  alid = 0;.  pC->
23f00 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
23f10 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28  CHE_STALE;.  if(
23f20 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 72 65   pOp->p2>0 && re
23f30 73 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f  s ){.    pc = pO
23f40 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20  p->p2 - 1;.  }. 
23f50 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f   break;.}.../* O
23f60 70 63 6f 64 65 3a 20 53 6f 72 74 20 50 31 20 50  pcode: Sort P1 P
23f70 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68  2 * * *.**.** Th
23f80 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 65  is opcode does e
23f90 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
23fa0 74 68 69 6e 67 20 61 73 20 4f 50 5f 52 65 77 69  thing as OP_Rewi
23fb0 6e 64 20 65 78 63 65 70 74 20 74 68 61 74 0a 2a  nd except that.*
23fc0 2a 20 69 74 20 69 6e 63 72 65 6d 65 6e 74 73 20  * it increments 
23fd0 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20  an undocumented 
23fe0 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
23ff0 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
24000 2e 0a 2a 2a 0a 2a 2a 20 53 6f 72 74 69 6e 67 20  ..**.** Sorting 
24010 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 20  is accomplished 
24020 62 79 20 77 72 69 74 69 6e 67 20 72 65 63 6f 72  by writing recor
24030 64 73 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e  ds into a sortin
24040 67 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e  g index,.** then
24050 20 72 65 77 69 6e 64 69 6e 67 20 74 68 61 74 20   rewinding that 
24060 69 6e 64 65 78 20 61 6e 64 20 70 6c 61 79 69 6e  index and playin
24070 67 20 69 74 20 62 61 63 6b 20 66 72 6f 6d 20 62  g it back from b
24080 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 65  eginning to.** e
24090 6e 64 2e 20 20 57 65 20 75 73 65 20 74 68 65 20  nd.  We use the 
240a0 4f 50 5f 53 6f 72 74 20 6f 70 63 6f 64 65 20 69  OP_Sort opcode i
240b0 6e 73 74 65 61 64 20 6f 66 20 4f 50 5f 52 65 77  nstead of OP_Rew
240c0 69 6e 64 20 74 6f 20 64 6f 20 74 68 65 0a 2a 2a  ind to do the.**
240d0 20 72 65 77 69 6e 64 69 6e 67 20 73 6f 20 74 68   rewinding so th
240e0 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61  at the global va
240f0 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 69  riable will be i
24100 6e 63 72 65 6d 65 6e 74 65 64 20 61 6e 64 0a 2a  ncremented and.*
24110 2a 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73  * regression tes
24120 74 73 20 63 61 6e 20 64 65 74 65 72 6d 69 6e 65  ts can determine
24130 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
24140 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  the optimizer is
24150 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 6f 70  .** correctly op
24160 74 69 6d 69 7a 69 6e 67 20 6f 75 74 20 73 6f 72  timizing out sor
24170 74 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  ts..*/.case OP_S
24180 6f 72 74 65 72 53 6f 72 74 3a 20 20 20 20 2f 2a  orterSort:    /*
24190 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50   jump */.case OP
241a0 5f 53 6f 72 74 3a 20 7b 20 20 20 20 20 20 20 20  _Sort: {        
241b0 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 23 69 66 64 65  /* jump */.#ifde
241c0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
241d0 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75  sqlite3_sort_cou
241e0 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt++;.  sqlite3_
241f0 73 65 61 72 63 68 5f 63 6f 75 6e 74 2d 2d 3b 0a  search_count--;.
24200 23 65 6e 64 69 66 0a 20 20 70 2d 3e 61 43 6f 75  #endif.  p->aCou
24210 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53 54 4d 54  nter[SQLITE_STMT
24220 53 54 41 54 55 53 5f 53 4f 52 54 5d 2b 2b 3b 0a  STATUS_SORT]++;.
24230 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
24240 68 20 69 6e 74 6f 20 4f 50 5f 52 65 77 69 6e 64  h into OP_Rewind
24250 20 2a 2f 0a 7d 0a 2f 2a 20 4f 70 63 6f 64 65 3a   */.}./* Opcode:
24260 20 52 65 77 69 6e 64 20 50 31 20 50 32 20 2a 20   Rewind P1 P2 * 
24270 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  * *.**.** The ne
24280 78 74 20 75 73 65 20 6f 66 20 74 68 65 20 52 6f  xt use of the Ro
24290 77 69 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72  wid or Column or
242a0 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   Next instructio
242b0 6e 20 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c  n for P1 .** wil
242c0 6c 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 66  l refer to the f
242d0 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
242e0 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  e database table
242f0 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66   or index..** If
24300 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
24310 64 65 78 20 69 73 20 65 6d 70 74 79 20 61 6e 64  dex is empty and
24320 20 50 32 3e 30 2c 20 74 68 65 6e 20 6a 75 6d 70   P2>0, then jump
24330 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
24340 50 32 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73 20  P2..** If P2 is 
24350 30 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  0 or if the tabl
24360 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20 6e 6f  e or index is no
24370 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68  t empty, fall th
24380 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20  rough.** to the 
24390 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75  following instru
243a0 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ction..*/.case O
243b0 50 5f 52 65 77 69 6e 64 3a 20 7b 20 20 20 20 20  P_Rewind: {     
243c0 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
243d0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
243e0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
243f0 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  r;.  int res;.. 
24400 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
24410 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
24420 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
24430 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
24440 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
24450 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
24460 72 74 28 20 70 43 2d 3e 69 73 53 6f 72 74 65 72  rt( pC->isSorter
24470 3d 3d 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  ==(pOp->opcode==
24480 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 29 20 29  OP_SorterSort) )
24490 3b 0a 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 69  ;.  res = 1;.  i
244a0 66 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 20  f( isSorter(pC) 
244b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
244c0 74 65 33 56 64 62 65 53 6f 72 74 65 72 52 65 77  te3VdbeSorterRew
244d0 69 6e 64 28 64 62 2c 20 70 43 2c 20 26 72 65 73  ind(db, pC, &res
244e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
244f0 70 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72  pCrsr = pC->pCur
24500 73 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  sor;.    assert(
24510 20 70 43 72 73 72 20 29 3b 0a 20 20 20 20 72 63   pCrsr );.    rc
24520 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46   = sqlite3BtreeF
24530 69 72 73 74 28 70 43 72 73 72 2c 20 26 72 65 73  irst(pCrsr, &res
24540 29 3b 0a 20 20 20 20 70 43 2d 3e 61 74 46 69 72  );.    pC->atFir
24550 73 74 20 3d 20 72 65 73 3d 3d 30 20 3f 31 3a 30  st = res==0 ?1:0
24560 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72  ;.    pC->deferr
24570 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
24580 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
24590 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
245a0 0a 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73  .    pC->rowidIs
245b0 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  Valid = 0;.  }. 
245c0 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 28   pC->nullRow = (
245d0 75 38 29 72 65 73 3b 0a 20 20 61 73 73 65 72 74  u8)res;.  assert
245e0 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70  ( pOp->p2>0 && p
245f0 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b  Op->p2<p->nOp );
24600 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20  .  if( res ){.  
24610 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
24620 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   1;.  }.  break;
24630 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  .}../* Opcode: N
24640 65 78 74 20 50 31 20 50 32 20 2a 20 50 34 20 50  ext P1 P2 * P4 P
24650 35 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  5.**.** Advance 
24660 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61  cursor P1 so tha
24670 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
24680 68 65 20 6e 65 78 74 20 6b 65 79 2f 64 61 74 61  he next key/data
24690 20 70 61 69 72 20 69 6e 20 69 74 73 0a 2a 2a 20   pair in its.** 
246a0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20  table or index. 
246b0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
246c0 20 6d 6f 72 65 20 6b 65 79 2f 76 61 6c 75 65 20   more key/value 
246d0 70 61 69 72 73 20 74 68 65 6e 20 66 61 6c 6c 20  pairs then fall 
246e0 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68  through.** to th
246f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74  e following inst
24700 72 75 63 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  ruction.  But if
24710 20 74 68 65 20 63 75 72 73 6f 72 20 61 64 76 61   the cursor adva
24720 6e 63 65 20 77 61 73 20 73 75 63 63 65 73 73 66  nce was successf
24730 75 6c 2c 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65  ul,.** jump imme
24740 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a  diately to P2..*
24750 2a 0a 2a 2a 20 54 68 65 20 50 31 20 63 75 72 73  *.** The P1 curs
24760 6f 72 20 6d 75 73 74 20 62 65 20 66 6f 72 20 61  or must be for a
24770 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74   real table, not
24780 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e   a pseudo-table.
24790 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 6c 77  .**.** P4 is alw
247a0 61 79 73 20 6f 66 20 74 79 70 65 20 50 34 5f 41  ays of type P4_A
247b0 44 56 41 4e 43 45 2e 20 54 68 65 20 66 75 6e 63  DVANCE. The func
247c0 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 70 6f 69  tion pointer poi
247d0 6e 74 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  nts to.** sqlite
247e0 33 42 74 72 65 65 4e 65 78 74 28 29 2e 0a 2a 2a  3BtreeNext()..**
247f0 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 70 6f 73  .** If P5 is pos
24800 69 74 69 76 65 20 61 6e 64 20 74 68 65 20 6a 75  itive and the ju
24810 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20 74 68 65  mp is taken, the
24820 6e 20 65 76 65 6e 74 20 63 6f 75 6e 74 65 72 0a  n event counter.
24830 2a 2a 20 6e 75 6d 62 65 72 20 50 35 2d 31 20 69  ** number P5-1 i
24840 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
24850 74 61 74 65 6d 65 6e 74 20 69 73 20 69 6e 63 72  tatement is incr
24860 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  emented..**.** S
24870 65 65 20 61 6c 73 6f 3a 20 50 72 65 76 0a 2a 2f  ee also: Prev.*/
24880 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 72 65 76  ./* Opcode: Prev
24890 20 50 31 20 50 32 20 2a 20 2a 20 50 35 0a 2a 2a   P1 P2 * * P5.**
248a0 0a 2a 2a 20 42 61 63 6b 20 75 70 20 63 75 72 73  .** Back up curs
248b0 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 69 74  or P1 so that it
248c0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 70   points to the p
248d0 72 65 76 69 6f 75 73 20 6b 65 79 2f 64 61 74 61  revious key/data
248e0 20 70 61 69 72 20 69 6e 20 69 74 73 0a 2a 2a 20   pair in its.** 
248f0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20  table or index. 
24900 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
24910 70 72 65 76 69 6f 75 73 20 6b 65 79 2f 76 61 6c  previous key/val
24920 75 65 20 70 61 69 72 73 20 74 68 65 6e 20 66 61  ue pairs then fa
24930 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f  ll through.** to
24940 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
24950 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 42 75 74  nstruction.  But
24960 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62   if the cursor b
24970 61 63 6b 75 70 20 77 61 73 20 73 75 63 63 65 73  ackup was succes
24980 73 66 75 6c 2c 0a 2a 2a 20 6a 75 6d 70 20 69 6d  sful,.** jump im
24990 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
249a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 31 20 63 75  .**.** The P1 cu
249b0 72 73 6f 72 20 6d 75 73 74 20 62 65 20 66 6f 72  rsor must be for
249c0 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e   a real table, n
249d0 6f 74 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c  ot a pseudo-tabl
249e0 65 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61  e..**.** P4 is a
249f0 6c 77 61 79 73 20 6f 66 20 74 79 70 65 20 50 34  lways of type P4
24a00 5f 41 44 56 41 4e 43 45 2e 20 54 68 65 20 66 75  _ADVANCE. The fu
24a10 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 70  nction pointer p
24a20 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  oints to.** sqli
24a30 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
24a40 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20  ()..**.** If P5 
24a50 69 73 20 70 6f 73 69 74 69 76 65 20 61 6e 64 20  is positive and 
24a60 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65  the jump is take
24a70 6e 2c 20 74 68 65 6e 20 65 76 65 6e 74 20 63 6f  n, then event co
24a80 75 6e 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20  unter.** number 
24a90 50 35 2d 31 20 69 6e 20 74 68 65 20 70 72 65 70  P5-1 in the prep
24aa0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69  ared statement i
24ab0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a  s incremented..*
24ac0 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72  /.case OP_Sorter
24ad0 4e 65 78 74 3a 20 20 20 20 2f 2a 20 6a 75 6d 70  Next:    /* jump
24ae0 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 72 65 76   */.case OP_Prev
24af0 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  :          /* ju
24b00 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65  mp */.case OP_Ne
24b10 78 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  xt: {        /* 
24b20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43 75  jump */.  VdbeCu
24b30 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e 74 20  rsor *pC;.  int 
24b40 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  res;..  assert( 
24b50 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
24b60 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
24b70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
24b80 70 2d 3e 70 35 3c 41 72 72 61 79 53 69 7a 65 28  p->p5<ArraySize(
24b90 70 2d 3e 61 43 6f 75 6e 74 65 72 29 20 29 3b 0a  p->aCounter) );.
24ba0 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
24bb0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20  pOp->p1];.  if( 
24bc0 70 43 3d 3d 30 20 29 7b 0a 20 20 20 20 62 72 65  pC==0 ){.    bre
24bd0 61 6b 3b 20 20 2f 2a 20 53 65 65 20 74 69 63 6b  ak;  /* See tick
24be0 65 74 20 23 32 32 37 33 20 2a 2f 0a 20 20 7d 0a  et #2273 */.  }.
24bf0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73    assert( pC->is
24c00 53 6f 72 74 65 72 3d 3d 28 70 4f 70 2d 3e 6f 70  Sorter==(pOp->op
24c10 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 4e  code==OP_SorterN
24c20 65 78 74 29 20 29 3b 0a 20 20 69 66 28 20 69 73  ext) );.  if( is
24c30 53 6f 72 74 65 72 28 70 43 29 20 29 7b 0a 20 20  Sorter(pC) ){.  
24c40 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
24c50 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72  pcode==OP_Sorter
24c60 4e 65 78 74 20 29 3b 0a 20 20 20 20 72 63 20 3d  Next );.    rc =
24c70 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
24c80 65 72 4e 65 78 74 28 64 62 2c 20 70 43 2c 20 26  erNext(db, pC, &
24c90 72 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  res);.  }else{. 
24ca0 20 20 20 2f 2a 20 72 65 73 20 3d 20 31 3b 20 2f     /* res = 1; /
24cb0 2f 20 41 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  / Always initial
24cc0 69 7a 65 64 20 62 79 20 74 68 65 20 78 41 64 76  ized by the xAdv
24cd0 61 6e 63 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20  ance() call */. 
24ce0 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64     assert( pC->d
24cf0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30  eferredMoveto==0
24d00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
24d10 70 43 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  pC->pCursor );. 
24d20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
24d30 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 20  opcode!=OP_Next 
24d40 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61  || pOp->p4.xAdva
24d50 6e 63 65 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  nce==sqlite3Btre
24d60 65 4e 65 78 74 20 29 3b 0a 20 20 20 20 61 73 73  eNext );.    ass
24d70 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
24d80 21 3d 4f 50 5f 50 72 65 76 20 7c 7c 20 70 4f 70  !=OP_Prev || pOp
24d90 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d 73  ->p4.xAdvance==s
24da0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
24db0 6f 75 73 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ous );.    rc = 
24dc0 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
24dd0 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72  (pC->pCursor, &r
24de0 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 2d 3e 6e  es);.  }.  pC->n
24df0 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29 72 65 73  ullRow = (u8)res
24e00 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61  ;.  pC->cacheSta
24e10 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
24e20 45 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  E;.  if( res==0 
24e30 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  ){.    pc = pOp-
24e40 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 70 2d 3e  >p2 - 1;.    p->
24e50 61 43 6f 75 6e 74 65 72 5b 70 4f 70 2d 3e 70 35  aCounter[pOp->p5
24e60 5d 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ]++;.#ifdef SQLI
24e70 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69  TE_TEST.    sqli
24e80 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
24e90 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  ++;.#endif.  }. 
24ea0 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69   pC->rowidIsVali
24eb0 64 20 3d 20 30 3b 0a 20 20 67 6f 74 6f 20 63 68  d = 0;.  goto ch
24ec0 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70  eck_for_interrup
24ed0 74 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  t;.}../* Opcode:
24ee0 20 49 64 78 49 6e 73 65 72 74 20 50 31 20 50 32   IdxInsert P1 P2
24ef0 20 50 33 20 2a 20 50 35 0a 2a 2a 0a 2a 2a 20 52   P3 * P5.**.** R
24f00 65 67 69 73 74 65 72 20 50 32 20 68 6f 6c 64 73  egister P2 holds
24f10 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 6b 65   an SQL index ke
24f20 79 20 6d 61 64 65 20 75 73 69 6e 67 20 74 68 65  y made using the
24f30 0a 2a 2a 20 4d 61 6b 65 52 65 63 6f 72 64 20 69  .** MakeRecord i
24f40 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 54 68  nstructions.  Th
24f50 69 73 20 6f 70 63 6f 64 65 20 77 72 69 74 65 73  is opcode writes
24f60 20 74 68 61 74 20 6b 65 79 0a 2a 2a 20 69 6e 74   that key.** int
24f70 6f 20 74 68 65 20 69 6e 64 65 78 20 50 31 2e 20  o the index P1. 
24f80 20 44 61 74 61 20 66 6f 72 20 74 68 65 20 65 6e   Data for the en
24f90 74 72 79 20 69 73 20 6e 69 6c 2e 0a 2a 2a 0a 2a  try is nil..**.*
24fa0 2a 20 50 33 20 69 73 20 61 20 66 6c 61 67 20 74  * P3 is a flag t
24fb0 68 61 74 20 70 72 6f 76 69 64 65 73 20 61 20 68  hat provides a h
24fc0 69 6e 74 20 74 6f 20 74 68 65 20 62 2d 74 72 65  int to the b-tre
24fd0 65 20 6c 61 79 65 72 20 74 68 61 74 20 74 68 69  e layer that thi
24fe0 73 0a 2a 2a 20 69 6e 73 65 72 74 20 69 73 20 6c  s.** insert is l
24ff0 69 6b 65 6c 79 20 74 6f 20 62 65 20 61 6e 20 61  ikely to be an a
25000 70 70 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ppend..**.** Thi
25010 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e  s instruction on
25020 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 69 6e 64  ly works for ind
25030 69 63 65 73 2e 20 20 54 68 65 20 65 71 75 69 76  ices.  The equiv
25040 61 6c 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  alent instructio
25050 6e 0a 2a 2a 20 66 6f 72 20 74 61 62 6c 65 73 20  n.** for tables 
25060 69 73 20 4f 50 5f 49 6e 73 65 72 74 2e 0a 2a 2f  is OP_Insert..*/
25070 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 49  .case OP_SorterI
25080 6e 73 65 72 74 3a 20 20 20 20 20 20 20 2f 2a 20  nsert:       /* 
25090 69 6e 32 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  in2 */.case OP_I
250a0 64 78 49 6e 73 65 72 74 3a 20 7b 20 20 20 20 20  dxInsert: {     
250b0 20 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56     /* in2 */.  V
250c0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
250d0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72   BtCursor *pCrsr
250e0 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20  ;.  int nKey;.  
250f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79  const char *zKey
25100 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
25110 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
25120 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
25130 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
25140 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
25150 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
25160 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 53 6f  assert( pC->isSo
25170 72 74 65 72 3d 3d 28 70 4f 70 2d 3e 6f 70 63 6f  rter==(pOp->opco
25180 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 49 6e 73  de==OP_SorterIns
25190 65 72 74 29 20 29 3b 0a 20 20 70 49 6e 32 20 3d  ert) );.  pIn2 =
251a0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
251b0 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 32 2d  .  assert( pIn2-
251c0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
251d0 62 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70  b );.  pCrsr = p
251e0 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  C->pCursor;.  if
251f0 28 20 41 4c 57 41 59 53 28 70 43 72 73 72 21 3d  ( ALWAYS(pCrsr!=
25200 30 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  0) ){.    assert
25210 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30  ( pC->isTable==0
25220 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 45 78 70   );.    rc = Exp
25230 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29 3b 0a 20  andBlob(pIn2);. 
25240 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25250 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
25260 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 20 29  ( isSorter(pC) )
25270 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
25280 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
25290 57 72 69 74 65 28 64 62 2c 20 70 43 2c 20 70 49  Write(db, pC, pI
252a0 6e 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n2);.      }else
252b0 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 20 3d  {.        nKey =
252c0 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 20 20 20 20   pIn2->n;.      
252d0 20 20 7a 4b 65 79 20 3d 20 70 49 6e 32 2d 3e 7a    zKey = pIn2->z
252e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
252f0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
25300 74 28 70 43 72 73 72 2c 20 7a 4b 65 79 2c 20 6e  t(pCrsr, zKey, n
25310 4b 65 79 2c 20 22 22 2c 20 30 2c 20 30 2c 20 70  Key, "", 0, 0, p
25320 4f 70 2d 3e 70 33 2c 20 0a 20 20 20 20 20 20 20  Op->p3, .       
25330 20 20 20 20 20 28 28 70 4f 70 2d 3e 70 35 20 26       ((pOp->p5 &
25340 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
25350 45 53 55 4c 54 29 20 3f 20 70 43 2d 3e 73 65 65  ESULT) ? pC->see
25360 6b 52 65 73 75 6c 74 20 3a 20 30 29 0a 20 20 20  kResult : 0).   
25370 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
25380 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
25390 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d  deferredMoveto==
253a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43 2d  0 );.        pC-
253b0 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
253c0 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20  ACHE_STALE;.    
253d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
253e0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
253f0 6f 64 65 3a 20 49 64 78 44 65 6c 65 74 65 20 50  ode: IdxDelete P
25400 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
25410 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
25420 20 50 33 20 72 65 67 69 73 74 65 72 73 20 73 74   P3 registers st
25430 61 72 74 69 6e 67 20 61 74 20 72 65 67 69 73 74  arting at regist
25440 65 72 20 50 32 20 66 6f 72 6d 0a 2a 2a 20 61 6e  er P2 form.** an
25450 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
25460 6b 65 79 2e 20 54 68 69 73 20 6f 70 63 6f 64 65  key. This opcode
25470 20 72 65 6d 6f 76 65 73 20 74 68 61 74 20 65 6e   removes that en
25480 74 72 79 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  try from the .**
25490 20 69 6e 64 65 78 20 6f 70 65 6e 65 64 20 62 79   index opened by
254a0 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2f 0a 63   cursor P1..*/.c
254b0 61 73 65 20 4f 50 5f 49 64 78 44 65 6c 65 74 65  ase OP_IdxDelete
254c0 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
254d0 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
254e0 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72   *pCrsr;.  int r
254f0 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  es;.  UnpackedRe
25500 63 6f 72 64 20 72 3b 0a 0a 20 20 61 73 73 65 72  cord r;..  asser
25510 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a  t( pOp->p3>0 );.
25520 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
25530 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70  2>0 && pOp->p2+p
25540 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p3<=(p->nMem
25550 2d 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29  -p->nCursor)+1 )
25560 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
25570 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
25580 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
25590 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
255a0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
255b0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70  rt( pC!=0 );.  p
255c0 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73  Crsr = pC->pCurs
255d0 6f 72 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  or;.  if( ALWAYS
255e0 28 70 43 72 73 72 21 3d 30 29 20 29 7b 0a 20 20  (pCrsr!=0) ){.  
255f0 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70    r.pKeyInfo = p
25600 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  C->pKeyInfo;.   
25610 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36   r.nField = (u16
25620 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 72 2e  )pOp->p3;.    r.
25630 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 72  flags = 0;.    r
25640 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f  .aMem = &aMem[pO
25650 70 2d 3e 70 32 5d 3b 0a 23 69 66 64 65 66 20 53  p->p2];.#ifdef S
25660 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
25670 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30  { int i; for(i=0
25680 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b  ; i<r.nField; i+
25690 2b 29 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73  +) assert( memIs
256a0 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d  Valid(&r.aMem[i]
256b0 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20  ) ); }.#endif.  
256c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
256d0 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
256e0 64 28 70 43 72 73 72 2c 20 26 72 2c 20 30 2c 20  d(pCrsr, &r, 0, 
256f0 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66  0, &res);.    if
25700 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25710 26 26 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  && res==0 ){.   
25720 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
25730 74 72 65 65 44 65 6c 65 74 65 28 70 43 72 73 72  treeDelete(pCrsr
25740 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
25750 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65  ert( pC->deferre
25760 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20  dMoveto==0 );.  
25770 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
25780 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
25790 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
257a0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 52  ./* Opcode: IdxR
257b0 6f 77 69 64 20 50 31 20 50 32 20 2a 20 2a 20 2a  owid P1 P2 * * *
257c0 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74  .**.** Write int
257d0 6f 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e  o register P2 an
257e0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
257f0 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  s the last entry
25800 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 61   in the record a
25810 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20  t.** the end of 
25820 74 68 65 20 69 6e 64 65 78 20 6b 65 79 20 70 6f  the index key po
25830 69 6e 74 65 64 20 74 6f 20 62 79 20 63 75 72 73  inted to by curs
25840 6f 72 20 50 31 2e 20 20 54 68 69 73 20 69 6e 74  or P1.  This int
25850 65 67 65 72 20 73 68 6f 75 6c 64 20 62 65 0a 2a  eger should be.*
25860 2a 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  * the rowid of t
25870 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 74  he table entry t
25880 6f 20 77 68 69 63 68 20 74 68 69 73 20 69 6e 64  o which this ind
25890 65 78 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 2e  ex entry points.
258a0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
258b0 20 52 6f 77 69 64 2c 20 4d 61 6b 65 52 65 63 6f   Rowid, MakeReco
258c0 72 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  rd..*/.case OP_I
258d0 64 78 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20  dxRowid: {      
258e0 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
258f0 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
25900 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
25910 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
25920 43 3b 0a 20 20 69 36 34 20 72 6f 77 69 64 3b 0a  C;.  i64 rowid;.
25930 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
25940 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
25950 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
25960 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
25970 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
25980 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70 43  t( pC!=0 );.  pC
25990 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  rsr = pC->pCurso
259a0 72 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  r;.  pOut->flags
259b0 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 69   = MEM_Null;.  i
259c0 66 28 20 41 4c 57 41 59 53 28 70 43 72 73 72 21  f( ALWAYS(pCrsr!
259d0 3d 30 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =0) ){.    rc = 
259e0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
259f0 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 20  rMoveto(pC);.   
25a00 20 69 66 28 20 4e 45 56 45 52 28 72 63 29 20 29   if( NEVER(rc) )
25a10 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
25a20 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 61 73  to_error;.    as
25a30 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72  sert( pC->deferr
25a40 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20  edMoveto==0 );. 
25a50 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
25a60 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  sTable==0 );.   
25a70 20 69 66 28 20 21 70 43 2d 3e 6e 75 6c 6c 52 6f   if( !pC->nullRo
25a80 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  w ){.      rc = 
25a90 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
25aa0 77 69 64 28 64 62 2c 20 70 43 72 73 72 2c 20 26  wid(db, pCrsr, &
25ab0 72 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66  rowid);.      if
25ac0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25ad0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
25ae0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
25af0 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
25b00 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 6f    pOut->u.i = ro
25b10 77 69 64 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  wid;.      pOut-
25b20 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
25b30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
25b40 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
25b50 65 3a 20 49 64 78 47 45 20 50 31 20 50 32 20 50  e: IdxGE P1 P2 P
25b60 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68  3 P4 P5.**.** Th
25b70 65 20 50 34 20 72 65 67 69 73 74 65 72 20 76 61  e P4 register va
25b80 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77  lues beginning w
25b90 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e 20 75  ith P3 form an u
25ba0 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a  npacked index .*
25bb0 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69 74 73  * key that omits
25bc0 20 74 68 65 20 52 4f 57 49 44 2e 20 20 43 6f 6d   the ROWID.  Com
25bd0 70 61 72 65 20 74 68 69 73 20 6b 65 79 20 76 61  pare this key va
25be0 6c 75 65 20 61 67 61 69 6e 73 74 20 74 68 65 20  lue against the 
25bf0 69 6e 64 65 78 20 0a 2a 2a 20 74 68 61 74 20 50  index .** that P
25c00 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  1 is currently p
25c10 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f  ointing to, igno
25c20 72 69 6e 67 20 74 68 65 20 52 4f 57 49 44 20 6f  ring the ROWID o
25c30 6e 20 74 68 65 20 50 31 20 69 6e 64 65 78 2e 0a  n the P1 index..
25c40 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20  **.** If the P1 
25c50 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 67  index entry is g
25c60 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
25c70 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20  qual to the key 
25c80 76 61 6c 75 65 0a 2a 2a 20 74 68 65 6e 20 6a 75  value.** then ju
25c90 6d 70 20 74 6f 20 50 32 2e 20 20 4f 74 68 65 72  mp to P2.  Other
25ca0 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67  wise fall throug
25cb0 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
25cc0 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
25cd0 20 49 66 20 50 35 20 69 73 20 6e 6f 6e 2d 7a 65   If P5 is non-ze
25ce0 72 6f 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20  ro then the key 
25cf0 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73  value is increas
25d00 65 64 20 62 79 20 61 6e 20 65 70 73 69 6c 6f 6e  ed by an epsilon
25d10 20 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68   .** prior to th
25d20 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  e comparison.  T
25d30 68 69 73 20 6d 61 6b 65 20 74 68 65 20 6f 70 63  his make the opc
25d40 6f 64 65 20 77 6f 72 6b 20 6c 69 6b 65 20 49 64  ode work like Id
25d50 78 47 54 20 65 78 63 65 70 74 0a 2a 2a 20 74 68  xGT except.** th
25d60 61 74 20 69 66 20 74 68 65 20 6b 65 79 20 66 72  at if the key fr
25d70 6f 6d 20 72 65 67 69 73 74 65 72 20 50 33 20 69  om register P3 i
25d80 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
25d90 65 20 6b 65 79 20 69 6e 20 74 68 65 20 63 75 72  e key in the cur
25da0 73 6f 72 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75  sor,.** the resu
25db0 6c 74 20 69 73 20 66 61 6c 73 65 20 77 68 65 72  lt is false wher
25dc0 65 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20  eas it would be 
25dd0 74 72 75 65 20 77 69 74 68 20 49 64 78 47 54 2e  true with IdxGT.
25de0 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .*/./* Opcode: I
25df0 64 78 4c 54 20 50 31 20 50 32 20 50 33 20 50 34  dxLT P1 P2 P3 P4
25e00 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34   P5.**.** The P4
25e10 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 73   register values
25e20 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
25e30 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63  P3 form an unpac
25e40 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b 65  ked index .** ke
25e50 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65  y that omits the
25e60 20 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72 65   ROWID.  Compare
25e70 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20   this key value 
25e80 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65  against the inde
25e90 78 20 0a 2a 2a 20 74 68 61 74 20 50 31 20 69 73  x .** that P1 is
25ea0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
25eb0 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67  ing to, ignoring
25ec0 20 74 68 65 20 52 4f 57 49 44 20 6f 6e 20 74 68   the ROWID on th
25ed0 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  e P1 index..**.*
25ee0 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e 64 65  * If the P1 inde
25ef0 78 20 65 6e 74 72 79 20 69 73 20 6c 65 73 73 20  x entry is less 
25f00 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61 6c  than the key val
25f10 75 65 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ue then jump to 
25f20 50 32 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  P2..** Otherwise
25f30 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
25f40 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
25f50 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
25f60 50 35 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  P5 is non-zero t
25f70 68 65 6e 20 74 68 65 20 6b 65 79 20 76 61 6c 75  hen the key valu
25f80 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 62  e is increased b
25f90 79 20 61 6e 20 65 70 73 69 6c 6f 6e 20 70 72 69  y an epsilon pri
25fa0 6f 72 20 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f  or .** to the co
25fb0 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 69 73 20  mparison.  This 
25fc0 6d 61 6b 65 73 20 74 68 65 20 6f 70 63 6f 64 65  makes the opcode
25fd0 20 77 6f 72 6b 20 6c 69 6b 65 20 49 64 78 4c 45   work like IdxLE
25fe0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78  ..*/.case OP_Idx
25ff0 4c 54 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  LT:          /* 
26000 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  jump */.case OP_
26010 49 64 78 47 45 3a 20 7b 20 20 20 20 20 20 20 20  IdxGE: {        
26020 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62  /* jump */.  Vdb
26030 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69  eCursor *pC;.  i
26040 6e 74 20 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b  nt res;.  Unpack
26050 65 64 52 65 63 6f 72 64 20 72 3b 0a 0a 20 20 61  edRecord r;..  a
26060 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
26070 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
26080 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
26090 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
260a0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
260b0 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
260c0 28 20 70 43 2d 3e 69 73 4f 72 64 65 72 65 64 20  ( pC->isOrdered 
260d0 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
260e0 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 29 20  pC->pCursor!=0) 
260f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
26100 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
26110 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  o==0 );.    asse
26120 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c  rt( pOp->p5==0 |
26130 7c 20 70 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b 0a  | pOp->p5==1 );.
26140 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
26150 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
26160 32 20 29 3b 0a 20 20 20 20 72 2e 70 4b 65 79 49  2 );.    r.pKeyI
26170 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e  nfo = pC->pKeyIn
26180 66 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64  fo;.    r.nField
26190 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 34 2e   = (u16)pOp->p4.
261a0 69 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  i;.    if( pOp->
261b0 70 35 20 29 7b 0a 20 20 20 20 20 20 72 2e 66 6c  p5 ){.      r.fl
261c0 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 49  ags = UNPACKED_I
261d0 4e 43 52 4b 45 59 20 7c 20 55 4e 50 41 43 4b 45  NCRKEY | UNPACKE
261e0 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 3b 0a  D_PREFIX_MATCH;.
261f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26200 20 72 2e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43   r.flags = UNPAC
26210 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48  KED_PREFIX_MATCH
26220 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 2e 61 4d  ;.    }.    r.aM
26230 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  em = &aMem[pOp->
26240 70 33 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  p3];.#ifdef SQLI
26250 54 45 5f 44 45 42 55 47 0a 20 20 20 20 7b 20 69  TE_DEBUG.    { i
26260 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69  nt i; for(i=0; i
26270 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20  <r.nField; i++) 
26280 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
26290 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29  id(&r.aMem[i]) )
262a0 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  ; }.#endif.    r
262b0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49  c = sqlite3VdbeI
262c0 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 70 43 2c  dxKeyCompare(pC,
262d0 20 26 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20   &r, &res);.    
262e0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
262f0 3d 4f 50 5f 49 64 78 4c 54 20 29 7b 0a 20 20 20  =OP_IdxLT ){.   
26300 20 20 20 72 65 73 20 3d 20 2d 72 65 73 3b 0a 20     res = -res;. 
26310 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26320 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
26330 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b  ode==OP_IdxGE );
26340 0a 20 20 20 20 20 20 72 65 73 2b 2b 3b 0a 20 20  .      res++;.  
26350 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 3e    }.    if( res>
26360 30 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20  0 ){.      pc = 
26370 70 4f 70 2d 3e 70 32 20 2d 20 31 20 3b 0a 20 20  pOp->p2 - 1 ;.  
26380 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
26390 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  .}../* Opcode: D
263a0 65 73 74 72 6f 79 20 50 31 20 50 32 20 50 33 20  estroy P1 P2 P3 
263b0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65  * *.**.** Delete
263c0 20 61 6e 20 65 6e 74 69 72 65 20 64 61 74 61 62   an entire datab
263d0 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ase table or ind
263e0 65 78 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61  ex whose root pa
263f0 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
26400 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 67 69  se.** file is gi
26410 76 65 6e 20 62 79 20 50 31 2e 0a 2a 2a 0a 2a 2a  ven by P1..**.**
26420 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
26430 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 69 6e   destroyed is in
26440 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
26450 73 65 20 66 69 6c 65 20 69 66 20 50 33 3d 3d 30  se file if P3==0
26460 2e 20 20 49 66 0a 2a 2a 20 50 33 3d 3d 31 20 74  .  If.** P3==1 t
26470 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f  hen the table to
26480 20 62 65 20 63 6c 65 61 72 20 69 73 20 69 6e 20   be clear is in 
26490 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
264a0 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74  tabase file.** t
264b0 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  hat is used to s
264c0 74 6f 72 65 20 74 61 62 6c 65 73 20 63 72 65 61  tore tables crea
264d0 74 65 20 75 73 69 6e 67 20 43 52 45 41 54 45 20  te using CREATE 
264e0 54 45 4d 50 4f 52 41 52 59 20 54 41 42 4c 45 2e  TEMPORARY TABLE.
264f0 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41  .**.** If AUTOVA
26500 43 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20  CUUM is enabled 
26510 74 68 65 6e 20 69 74 20 69 73 20 70 6f 73 73 69  then it is possi
26520 62 6c 65 20 74 68 61 74 20 61 6e 6f 74 68 65 72  ble that another
26530 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 6d 69   root page.** mi
26540 67 68 74 20 62 65 20 6d 6f 76 65 64 20 69 6e 74  ght be moved int
26550 6f 20 74 68 65 20 6e 65 77 6c 79 20 64 65 6c 65  o the newly dele
26560 74 65 64 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ted root page in
26570 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 61   order to keep a
26580 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73  ll.** root pages
26590 20 63 6f 6e 74 69 67 75 6f 75 73 20 61 74 20 74   contiguous at t
265a0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
265b0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
265c0 68 65 20 66 6f 72 6d 65 72 0a 2a 2a 20 76 61 6c  he former.** val
265d0 75 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 70  ue of the root p
265e0 61 67 65 20 74 68 61 74 20 6d 6f 76 65 64 20 2d  age that moved -
265f0 20 69 74 73 20 76 61 6c 75 65 20 62 65 66 6f 72   its value befor
26600 65 20 74 68 65 20 6d 6f 76 65 20 6f 63 63 75 72  e the move occur
26610 72 65 64 20 2d 0a 2a 2a 20 69 73 20 73 74 6f 72  red -.** is stor
26620 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
26630 32 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20 0a  2.  If no page .
26640 2a 2a 20 6d 6f 76 65 6d 65 6e 74 20 77 61 73 20  ** movement was 
26650 72 65 71 75 69 72 65 64 20 28 62 65 63 61 75 73  required (becaus
26660 65 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  e the table bein
26670 67 20 64 72 6f 70 70 65 64 20 77 61 73 20 61 6c  g dropped was al
26680 72 65 61 64 79 20 0a 2a 2a 20 74 68 65 20 6c 61  ready .** the la
26690 73 74 20 6f 6e 65 20 69 6e 20 74 68 65 20 64 61  st one in the da
266a0 74 61 62 61 73 65 29 20 74 68 65 6e 20 61 20 7a  tabase) then a z
266b0 65 72 6f 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ero is stored in
266c0 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
266d0 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69   If AUTOVACUUM i
266e0 73 20 64 69 73 61 62 6c 65 64 20 74 68 65 6e 20  s disabled then 
266f0 61 20 7a 65 72 6f 20 69 73 20 73 74 6f 72 65 64  a zero is stored
26700 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
26710 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
26720 20 43 6c 65 61 72 0a 2a 2f 0a 63 61 73 65 20 4f   Clear.*/.case O
26730 50 5f 44 65 73 74 72 6f 79 3a 20 7b 20 20 20 20  P_Destroy: {    
26740 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65   /* out2-prerele
26750 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 6f  ase */.  int iMo
26760 76 65 64 3b 0a 20 20 69 6e 74 20 69 43 6e 74 3b  ved;.  int iCnt;
26770 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65 3b 0a  .  Vdbe *pVdbe;.
26780 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73    int iDb;..  as
26790 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c  sert( p->readOnl
267a0 79 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20  y==0 );.#ifndef 
267b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
267c0 55 41 4c 54 41 42 4c 45 0a 20 20 69 43 6e 74 20  UALTABLE.  iCnt 
267d0 3d 20 30 3b 0a 20 20 66 6f 72 28 70 56 64 62 65  = 0;.  for(pVdbe
267e0 3d 64 62 2d 3e 70 56 64 62 65 3b 20 70 56 64 62  =db->pVdbe; pVdb
267f0 65 3b 20 70 56 64 62 65 20 3d 20 70 56 64 62 65  e; pVdbe = pVdbe
26800 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
26810 28 20 70 56 64 62 65 2d 3e 6d 61 67 69 63 3d 3d  ( pVdbe->magic==
26820 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26  VDBE_MAGIC_RUN &
26830 26 20 70 56 64 62 65 2d 3e 62 49 73 52 65 61 64  & pVdbe->bIsRead
26840 65 72 20 0a 20 20 20 20 20 26 26 20 70 56 64 62  er .     && pVdb
26850 65 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 3c  e->inVtabMethod<
26860 32 20 26 26 20 70 56 64 62 65 2d 3e 70 63 3e 3d  2 && pVdbe->pc>=
26870 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
26880 69 43 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  iCnt++;.    }.  
26890 7d 0a 23 65 6c 73 65 0a 20 20 69 43 6e 74 20 3d  }.#else.  iCnt =
268a0 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3b 0a   db->nVdbeRead;.
268b0 23 65 6e 64 69 66 0a 20 20 70 4f 75 74 2d 3e 66  #endif.  pOut->f
268c0 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
268d0 0a 20 20 69 66 28 20 69 43 6e 74 3e 31 20 29 7b  .  if( iCnt>1 ){
268e0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
268f0 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 70 2d 3e  _LOCKED;.    p->
26900 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
26910 5f 41 62 6f 72 74 3b 0a 20 20 7d 65 6c 73 65 7b  _Abort;.  }else{
26920 0a 20 20 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e  .    iDb = pOp->
26930 70 33 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p3;.    assert( 
26940 69 43 6e 74 3d 3d 31 20 29 3b 0a 20 20 20 20 61  iCnt==1 );.    a
26950 73 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65  ssert( (p->btree
26960 4d 61 73 6b 20 26 20 28 28 28 79 44 62 4d 61 73  Mask & (((yDbMas
26970 6b 29 31 29 3c 3c 69 44 62 29 29 21 3d 30 20 29  k)1)<<iDb))!=0 )
26980 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
26990 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
269a0 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42  (db->aDb[iDb].pB
269b0 74 2c 20 70 4f 70 2d 3e 70 31 2c 20 26 69 4d 6f  t, pOp->p1, &iMo
269c0 76 65 64 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  ved);.    pOut->
269d0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
269e0 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  .    pOut->u.i =
269f0 20 69 4d 6f 76 65 64 3b 0a 23 69 66 6e 64 65 66   iMoved;.#ifndef
26a00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
26a10 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
26a20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
26a30 20 69 4d 6f 76 65 64 21 3d 30 20 29 7b 0a 20 20   iMoved!=0 ){.  
26a40 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6f 74 50      sqlite3RootP
26a50 61 67 65 4d 6f 76 65 64 28 64 62 2c 20 69 44 62  ageMoved(db, iDb
26a60 2c 20 69 4d 6f 76 65 64 2c 20 70 4f 70 2d 3e 70  , iMoved, pOp->p
26a70 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c  1);.      /* All
26a80 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 70 65 72   OP_Destroy oper
26a90 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 6f 6e 20  ations occur on 
26aa0 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 20 2a  the same btree *
26ab0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
26ac0 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75  resetSchemaOnFau
26ad0 6c 74 3d 3d 30 20 7c 7c 20 72 65 73 65 74 53 63  lt==0 || resetSc
26ae0 68 65 6d 61 4f 6e 46 61 75 6c 74 3d 3d 69 44 62  hemaOnFault==iDb
26af0 2b 31 20 29 3b 0a 20 20 20 20 20 20 72 65 73 65  +1 );.      rese
26b00 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 20 3d  tSchemaOnFault =
26b10 20 69 44 62 2b 31 3b 0a 20 20 20 20 7d 0a 23 65   iDb+1;.    }.#e
26b20 6e 64 69 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b  ndif.  }.  break
26b30 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
26b40 43 6c 65 61 72 20 50 31 20 50 32 20 50 33 0a 2a  Clear P1 P2 P3.*
26b50 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20  *.** Delete all 
26b60 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
26b70 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f  database table o
26b80 72 20 69 6e 64 65 78 20 77 68 6f 73 65 20 72 6f  r index whose ro
26b90 6f 74 20 70 61 67 65 0a 2a 2a 20 69 6e 20 74 68  ot page.** in th
26ba0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26bb0 69 73 20 67 69 76 65 6e 20 62 79 20 50 31 2e 20  is given by P1. 
26bc0 20 42 75 74 2c 20 75 6e 6c 69 6b 65 20 44 65 73   But, unlike Des
26bd0 74 72 6f 79 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20  troy, do not.** 
26be0 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
26bf0 20 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20 74   or index from t
26c00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26c10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
26c20 65 20 62 65 69 6e 67 20 63 6c 65 61 72 20 69 73  e being clear is
26c30 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
26c40 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 32  abase file if P2
26c50 3d 3d 30 2e 20 20 49 66 0a 2a 2a 20 50 32 3d 3d  ==0.  If.** P2==
26c60 31 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65  1 then the table
26c70 20 74 6f 20 62 65 20 63 6c 65 61 72 20 69 73 20   to be clear is 
26c80 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
26c90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
26ca0 2a 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74  * that is used t
26cb0 6f 20 73 74 6f 72 65 20 74 61 62 6c 65 73 20 63  o store tables c
26cc0 72 65 61 74 65 20 75 73 69 6e 67 20 43 52 45 41  reate using CREA
26cd0 54 45 20 54 45 4d 50 4f 52 41 52 59 20 54 41 42  TE TEMPORARY TAB
26ce0 4c 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  LE..**.** If the
26cf0 20 50 33 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e   P3 value is non
26d00 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
26d10 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74  table referred t
26d20 6f 20 6d 75 73 74 20 62 65 20 61 6e 0a 2a 2a 20  o must be an.** 
26d30 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 28 61 6e  intkey table (an
26d40 20 53 51 4c 20 74 61 62 6c 65 2c 20 6e 6f 74 20   SQL table, not 
26d50 61 6e 20 69 6e 64 65 78 29 2e 20 49 6e 20 74 68  an index). In th
26d60 69 73 20 63 61 73 65 20 74 68 65 20 72 6f 77 20  is case the row 
26d70 63 68 61 6e 67 65 20 0a 2a 2a 20 63 6f 75 6e 74  change .** count
26d80 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
26d90 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
26da0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
26db0 6c 65 20 62 65 69 6e 67 20 63 6c 65 61 72 65 64  le being cleared
26dc0 2e 20 0a 2a 2a 20 49 66 20 50 33 20 69 73 20 67  . .** If P3 is g
26dd0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
26de0 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
26df0 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
26e00 74 65 72 20 50 33 20 69 73 0a 2a 2a 20 61 6c 73  ter P3 is.** als
26e10 6f 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79  o incremented by
26e20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
26e30 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
26e40 20 62 65 69 6e 67 20 63 6c 65 61 72 65 64 2e 0a   being cleared..
26e50 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
26e60 44 65 73 74 72 6f 79 0a 2a 2f 0a 63 61 73 65 20  Destroy.*/.case 
26e70 4f 50 5f 43 6c 65 61 72 3a 20 7b 0a 20 20 69 6e  OP_Clear: {.  in
26e80 74 20 6e 43 68 61 6e 67 65 3b 0a 20 0a 20 20 6e  t nChange;. .  n
26e90 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 61 73  Change = 0;.  as
26ea0 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c  sert( p->readOnl
26eb0 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
26ec0 28 20 70 4f 70 2d 3e 70 31 21 3d 31 20 29 3b 0a  ( pOp->p1!=1 );.
26ed0 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74    assert( (p->bt
26ee0 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44 62  reeMask & (((yDb
26ef0 4d 61 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e 70 32  Mask)1)<<pOp->p2
26f00 29 29 21 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  ))!=0 );.  rc = 
26f10 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
26f20 72 54 61 62 6c 65 28 0a 20 20 20 20 20 20 64 62  rTable(.      db
26f30 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 32 5d 2e 70  ->aDb[pOp->p2].p
26f40 42 74 2c 20 70 4f 70 2d 3e 70 31 2c 20 28 70 4f  Bt, pOp->p1, (pO
26f50 70 2d 3e 70 33 20 3f 20 26 6e 43 68 61 6e 67 65  p->p3 ? &nChange
26f60 20 3a 20 30 29 0a 20 20 29 3b 0a 20 20 69 66 28   : 0).  );.  if(
26f70 20 70 4f 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20   pOp->p3 ){.    
26f80 70 2d 3e 6e 43 68 61 6e 67 65 20 2b 3d 20 6e 43  p->nChange += nC
26f90 68 61 6e 67 65 3b 0a 20 20 20 20 69 66 28 20 70  hange;.    if( p
26fa0 4f 70 2d 3e 70 33 3e 30 20 29 7b 0a 20 20 20 20  Op->p3>0 ){.    
26fb0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
26fc0 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e  alid(&aMem[pOp->
26fd0 70 33 5d 29 20 29 3b 0a 20 20 20 20 20 20 6d 65  p3]) );.      me
26fe0 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
26ff0 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  , &aMem[pOp->p3]
27000 29 3b 0a 20 20 20 20 20 20 61 4d 65 6d 5b 70 4f  );.      aMem[pO
27010 70 2d 3e 70 33 5d 2e 75 2e 69 20 2b 3d 20 6e 43  p->p3].u.i += nC
27020 68 61 6e 67 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  hange;.    }.  }
27030 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
27040 4f 70 63 6f 64 65 3a 20 43 72 65 61 74 65 54 61  Opcode: CreateTa
27050 62 6c 65 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  ble P1 P2 * * *.
27060 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  **.** Allocate a
27070 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 20 74 68   new table in th
27080 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
27090 66 69 6c 65 20 69 66 20 50 31 3d 3d 30 20 6f 72  file if P1==0 or
270a0 20 69 6e 20 74 68 65 0a 2a 2a 20 61 75 78 69 6c   in the.** auxil
270b0 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  iary database fi
270c0 6c 65 20 69 66 20 50 31 3d 3d 31 20 6f 72 20 69  le if P1==1 or i
270d0 6e 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  n an attached da
270e0 74 61 62 61 73 65 20 69 66 0a 2a 2a 20 50 31 3e  tabase if.** P1>
270f0 31 2e 20 20 57 72 69 74 65 20 74 68 65 20 72 6f  1.  Write the ro
27100 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
27110 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
27120 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72  into.** register
27130 20 50 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69   P2.**.** The di
27140 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
27150 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61 6e 20   a table and an 
27160 69 6e 64 65 78 20 69 73 20 74 68 69 73 3a 20 20  index is this:  
27170 41 20 74 61 62 6c 65 20 6d 75 73 74 0a 2a 2a 20  A table must.** 
27180 68 61 76 65 20 61 20 34 2d 62 79 74 65 20 69 6e  have a 4-byte in
27190 74 65 67 65 72 20 6b 65 79 20 61 6e 64 20 63 61  teger key and ca
271a0 6e 20 68 61 76 65 20 61 72 62 69 74 72 61 72 79  n have arbitrary
271b0 20 64 61 74 61 2e 20 20 41 6e 20 69 6e 64 65 78   data.  An index
271c0 0a 2a 2a 20 68 61 73 20 61 6e 20 61 72 62 69 74  .** has an arbit
271d0 72 61 72 79 20 6b 65 79 20 62 75 74 20 6e 6f 20  rary key but no 
271e0 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  data..**.** See 
271f0 61 6c 73 6f 3a 20 43 72 65 61 74 65 49 6e 64 65  also: CreateInde
27200 78 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  x.*/./* Opcode: 
27210 43 72 65 61 74 65 49 6e 64 65 78 20 50 31 20 50  CreateIndex P1 P
27220 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 6c  2 * * *.**.** Al
27230 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 69 6e 64  locate a new ind
27240 65 78 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  ex in the main d
27250 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
27260 50 31 3d 3d 30 20 6f 72 20 69 6e 20 74 68 65 0a  P1==0 or in the.
27270 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ** auxiliary dat
27280 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 31  abase file if P1
27290 3d 3d 31 20 6f 72 20 69 6e 20 61 6e 20 61 74 74  ==1 or in an att
272a0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20 69  ached database i
272b0 66 0a 2a 2a 20 50 31 3e 31 2e 20 20 57 72 69 74  f.** P1>1.  Writ
272c0 65 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  e the root page 
272d0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
272e0 77 20 74 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20  w table into.** 
272f0 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a  register P2..**.
27300 2a 2a 20 53 65 65 20 64 6f 63 75 6d 65 6e 74 61  ** See documenta
27310 74 69 6f 6e 20 6f 6e 20 4f 50 5f 43 72 65 61 74  tion on OP_Creat
27320 65 54 61 62 6c 65 20 66 6f 72 20 61 64 64 69 74  eTable for addit
27330 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
27340 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 72  n..*/.case OP_Cr
27350 65 61 74 65 49 6e 64 65 78 3a 20 20 20 20 20 20  eateIndex:      
27360 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72        /* out2-pr
27370 65 72 65 6c 65 61 73 65 20 2a 2f 0a 63 61 73 65  erelease */.case
27380 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 3a   OP_CreateTable:
27390 20 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f   {          /* o
273a0 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a  ut2-prerelease *
273b0 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20  /.  int pgno;.  
273c0 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 44 62 20  int flags;.  Db 
273d0 2a 70 44 62 3b 0a 0a 20 20 70 67 6e 6f 20 3d 20  *pDb;..  pgno = 
273e0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  0;.  assert( pOp
273f0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
27400 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p1<db->nDb );.  
27410 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65  assert( (p->btre
27420 65 4d 61 73 6b 20 26 20 28 28 28 79 44 62 4d 61  eMask & (((yDbMa
27430 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e 70 31 29 29  sk)1)<<pOp->p1))
27440 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
27450 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
27460 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  );.  pDb = &db->
27470 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  aDb[pOp->p1];.  
27480 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 42 74  assert( pDb->pBt
27490 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 70  !=0 );.  if( pOp
274a0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 72 65  ->opcode==OP_Cre
274b0 61 74 65 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ateTable ){.    
274c0 2f 2a 20 66 6c 61 67 73 20 3d 20 42 54 52 45 45  /* flags = BTREE
274d0 5f 49 4e 54 4b 45 59 3b 20 2a 2f 0a 20 20 20 20  _INTKEY; */.    
274e0 66 6c 61 67 73 20 3d 20 42 54 52 45 45 5f 49 4e  flags = BTREE_IN
274f0 54 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TKEY;.  }else{. 
27500 20 20 20 66 6c 61 67 73 20 3d 20 42 54 52 45 45     flags = BTREE
27510 5f 42 4c 4f 42 4b 45 59 3b 0a 20 20 7d 0a 20 20  _BLOBKEY;.  }.  
27520 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
27530 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 44 62  eCreateTable(pDb
27540 2d 3e 70 42 74 2c 20 26 70 67 6e 6f 2c 20 66 6c  ->pBt, &pgno, fl
27550 61 67 73 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e  ags);.  pOut->u.
27560 69 20 3d 20 70 67 6e 6f 3b 0a 20 20 62 72 65 61  i = pgno;.  brea
27570 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
27580 20 50 61 72 73 65 53 63 68 65 6d 61 20 50 31 20   ParseSchema P1 
27590 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52  * * P4 *.**.** R
275a0 65 61 64 20 61 6e 64 20 70 61 72 73 65 20 61 6c  ead and parse al
275b0 6c 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74  l entries from t
275c0 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
275d0 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61 62 61   table of databa
275e0 73 65 20 50 31 0a 2a 2a 20 74 68 61 74 20 6d 61  se P1.** that ma
275f0 74 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c  tch the WHERE cl
27600 61 75 73 65 20 50 34 2e 20 0a 2a 2a 0a 2a 2a 20  ause P4. .**.** 
27610 54 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f  This opcode invo
27620 6b 65 73 20 74 68 65 20 70 61 72 73 65 72 20 74  kes the parser t
27630 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76  o create a new v
27640 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2c 0a  irtual machine,.
27650 2a 2a 20 74 68 65 6e 20 72 75 6e 73 20 74 68 65  ** then runs the
27660 20 6e 65 77 20 76 69 72 74 75 61 6c 20 6d 61 63   new virtual mac
27670 68 69 6e 65 2e 20 20 49 74 20 69 73 20 74 68 75  hine.  It is thu
27680 73 20 61 20 72 65 2d 65 6e 74 72 61 6e 74 20 6f  s a re-entrant o
27690 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  pcode..*/.case O
276a0 50 5f 50 61 72 73 65 53 63 68 65 6d 61 3a 20 7b  P_ParseSchema: {
276b0 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 63 6f  .  int iDb;.  co
276c0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
276d0 72 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  r;.  char *zSql;
276e0 0a 20 20 49 6e 69 74 44 61 74 61 20 69 6e 69 74  .  InitData init
276f0 44 61 74 61 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20  Data;..  /* Any 
27700 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
27710 6e 74 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20  nt that invokes 
27720 74 68 69 73 20 6f 70 63 6f 64 65 20 77 69 6c 6c  this opcode will
27730 20 68 6f 6c 64 20 6d 75 74 65 78 65 73 0a 20 20   hold mutexes.  
27740 2a 2a 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65  ** on every btre
27750 65 2e 20 20 54 68 69 73 20 69 73 20 61 20 70 72  e.  This is a pr
27760 65 72 65 71 75 69 73 69 74 65 20 66 6f 72 20 69  erequisite for i
27770 6e 76 6f 6b 69 6e 67 20 0a 20 20 2a 2a 20 73 71  nvoking .  ** sq
27780 6c 69 74 65 33 49 6e 69 74 43 61 6c 6c 62 61 63  lite3InitCallbac
27790 6b 28 29 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  k()..  */.#ifdef
277a0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
277b0 66 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64  for(iDb=0; iDb<d
277c0 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a  b->nDb; iDb++){.
277d0 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d      assert( iDb=
277e0 3d 31 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  =1 || sqlite3Btr
277f0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 64 62 2d  eeHoldsMutex(db-
27800 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 29 20 29  >aDb[iDb].pBt) )
27810 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
27820 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20  iDb = pOp->p1;. 
27830 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
27840 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
27850 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 48 61  ;.  assert( DbHa
27860 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44  sProperty(db, iD
27870 62 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64  b, DB_SchemaLoad
27880 65 64 29 20 29 3b 0a 20 20 2f 2a 20 55 73 65 64  ed) );.  /* Used
27890 20 74 6f 20 62 65 20 61 20 63 6f 6e 64 69 74 69   to be a conditi
278a0 6f 6e 61 6c 20 2a 2f 20 7b 0a 20 20 20 20 7a 4d  onal */ {.    zM
278b0 61 73 74 65 72 20 3d 20 53 43 48 45 4d 41 5f 54  aster = SCHEMA_T
278c0 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69  ABLE(iDb);.    i
278d0 6e 69 74 44 61 74 61 2e 64 62 20 3d 20 64 62 3b  nitData.db = db;
278e0 0a 20 20 20 20 69 6e 69 74 44 61 74 61 2e 69 44  .    initData.iD
278f0 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20  b = pOp->p1;.   
27900 20 69 6e 69 74 44 61 74 61 2e 70 7a 45 72 72 4d   initData.pzErrM
27910 73 67 20 3d 20 26 70 2d 3e 7a 45 72 72 4d 73 67  sg = &p->zErrMsg
27920 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  ;.    zSql = sql
27930 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 0a  ite3MPrintf(db,.
27940 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
27950 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73  ame, rootpage, s
27960 71 6c 20 46 52 4f 4d 20 27 25 71 27 2e 25 73 20  ql FROM '%q'.%s 
27970 57 48 45 52 45 20 25 73 20 4f 52 44 45 52 20 42  WHERE %s ORDER B
27980 59 20 72 6f 77 69 64 22 2c 0a 20 20 20 20 20 20  Y rowid",.      
27990 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
279a0 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4f  ame, zMaster, pO
279b0 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 69 66  p->p4.z);.    if
279c0 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
279d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
279e0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
279f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
27a00 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
27a10 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69  );.      db->ini
27a20 74 2e 62 75 73 79 20 3d 20 31 3b 0a 20 20 20 20  t.busy = 1;.    
27a30 20 20 69 6e 69 74 44 61 74 61 2e 72 63 20 3d 20    initData.rc = 
27a40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
27a50 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
27a60 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
27a70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27a80 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20  _exec(db, zSql, 
27a90 73 71 6c 69 74 65 33 49 6e 69 74 43 61 6c 6c 62  sqlite3InitCallb
27aa0 61 63 6b 2c 20 26 69 6e 69 74 44 61 74 61 2c 20  ack, &initData, 
27ab0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
27ac0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
27ad0 20 3d 20 69 6e 69 74 44 61 74 61 2e 72 63 3b 0a   = initData.rc;.
27ae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
27af0 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20  ree(db, zSql);. 
27b00 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75       db->init.bu
27b10 73 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  sy = 0;.    }.  
27b20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 73 71 6c  }.  if( rc ) sql
27b30 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65  ite3ResetAllSche
27b40 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28  masOfConnection(
27b50 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  db);.  if( rc==S
27b60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
27b70 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
27b80 20 20 7d 0a 20 20 62 72 65 61 6b 3b 20 20 0a 7d    }.  break;  .}
27b90 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
27ba0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59  QLITE_OMIT_ANALY
27bb0 5a 45 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c  ZE)./* Opcode: L
27bc0 6f 61 64 41 6e 61 6c 79 73 69 73 20 50 31 20 2a  oadAnalysis P1 *
27bd0 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61   * * *.**.** Rea
27be0 64 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  d the sqlite_sta
27bf0 74 31 20 74 61 62 6c 65 20 66 6f 72 20 64 61 74  t1 table for dat
27c00 61 62 61 73 65 20 50 31 20 61 6e 64 20 6c 6f 61  abase P1 and loa
27c10 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a  d the content.**
27c20 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 69   of that table i
27c30 6e 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  nto the internal
27c40 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
27c50 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
27c60 75 73 65 0a 2a 2a 20 74 68 65 20 61 6e 61 6c 79  use.** the analy
27c70 73 69 73 20 74 6f 20 62 65 20 75 73 65 64 20 77  sis to be used w
27c80 68 65 6e 20 70 72 65 70 61 72 69 6e 67 20 61 6c  hen preparing al
27c90 6c 20 73 75 62 73 65 71 75 65 6e 74 20 71 75 65  l subsequent que
27ca0 72 69 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ries..*/.case OP
27cb0 5f 4c 6f 61 64 41 6e 61 6c 79 73 69 73 3a 20 7b  _LoadAnalysis: {
27cc0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
27cd0 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
27ce0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 72 63  <db->nDb );.  rc
27cf0 20 3d 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 73   = sqlite3Analys
27d00 69 73 4c 6f 61 64 28 64 62 2c 20 70 4f 70 2d 3e  isLoad(db, pOp->
27d10 70 31 29 3b 0a 20 20 62 72 65 61 6b 3b 20 20 0a  p1);.  break;  .
27d20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
27d30 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
27d40 5f 41 4e 41 4c 59 5a 45 29 20 2a 2f 0a 0a 2f 2a  _ANALYZE) */../*
27d50 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70 54 61 62   Opcode: DropTab
27d60 6c 65 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a  le P1 * * P4 *.*
27d70 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
27d80 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d  internal (in-mem
27d90 6f 72 79 29 20 64 61 74 61 20 73 74 72 75 63 74  ory) data struct
27da0 75 72 65 73 20 74 68 61 74 20 64 65 73 63 72 69  ures that descri
27db0 62 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  be.** the table 
27dc0 6e 61 6d 65 64 20 50 34 20 69 6e 20 64 61 74 61  named P4 in data
27dd0 62 61 73 65 20 50 31 2e 20 20 54 68 69 73 20 69  base P1.  This i
27de0 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  s called after a
27df0 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 64 72 6f   table.** is dro
27e00 70 70 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  pped in order to
27e10 20 6b 65 65 70 20 74 68 65 20 69 6e 74 65 72 6e   keep the intern
27e20 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  al representatio
27e30 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65  n of the.** sche
27e40 6d 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69  ma consistent wi
27e50 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69  th what is on di
27e60 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44  sk..*/.case OP_D
27e70 72 6f 70 54 61 62 6c 65 3a 20 7b 0a 20 20 73 71  ropTable: {.  sq
27e80 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
27e90 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 4f  leteTable(db, pO
27ea0 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a  p->p1, pOp->p4.z
27eb0 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
27ec0 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70 49 6e  * Opcode: DropIn
27ed0 64 65 78 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a  dex P1 * * P4 *.
27ee0 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  **.** Remove the
27ef0 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65   internal (in-me
27f00 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72 75 63  mory) data struc
27f10 74 75 72 65 73 20 74 68 61 74 20 64 65 73 63 72  tures that descr
27f20 69 62 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  ibe.** the index
27f30 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64 61 74   named P4 in dat
27f40 61 62 61 73 65 20 50 31 2e 20 20 54 68 69 73 20  abase P1.  This 
27f50 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
27f60 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 73 20 64  an index.** is d
27f70 72 6f 70 70 65 64 20 69 6e 20 6f 72 64 65 72 20  ropped in order 
27f80 74 6f 20 6b 65 65 70 20 74 68 65 20 69 6e 74 65  to keep the inte
27f90 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74  rnal representat
27fa0 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 63  ion of the.** sc
27fb0 68 65 6d 61 20 63 6f 6e 73 69 73 74 65 6e 74 20  hema consistent 
27fc0 77 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20  with what is on 
27fd0 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  disk..*/.case OP
27fe0 5f 44 72 6f 70 49 6e 64 65 78 3a 20 7b 0a 20 20  _DropIndex: {.  
27ff0 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
28000 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20  DeleteIndex(db, 
28010 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34  pOp->p1, pOp->p4
28020 2e 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .z);.  break;.}.
28030 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70  ./* Opcode: Drop
28040 54 72 69 67 67 65 72 20 50 31 20 2a 20 2a 20 50  Trigger P1 * * P
28050 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65  4 *.**.** Remove
28060 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28 69   the internal (i
28070 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20 73  n-memory) data s
28080 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20 64  tructures that d
28090 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20 74  escribe.** the t
280a0 72 69 67 67 65 72 20 6e 61 6d 65 64 20 50 34 20  rigger named P4 
280b0 69 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e 20  in database P1. 
280c0 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
280d0 61 66 74 65 72 20 61 20 74 72 69 67 67 65 72 0a  after a trigger.
280e0 2a 2a 20 69 73 20 64 72 6f 70 70 65 64 20 69 6e  ** is dropped in
280f0 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
28100 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72  he internal repr
28110 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
28120 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73  e.** schema cons
28130 69 73 74 65 6e 74 20 77 69 74 68 20 77 68 61 74  istent with what
28140 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a   is on disk..*/.
28150 63 61 73 65 20 4f 50 5f 44 72 6f 70 54 72 69 67  case OP_DropTrig
28160 67 65 72 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33  ger: {.  sqlite3
28170 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54  UnlinkAndDeleteT
28180 72 69 67 67 65 72 28 64 62 2c 20 70 4f 70 2d 3e  rigger(db, pOp->
28190 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  p1, pOp->p4.z);.
281a0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66    break;.}...#if
281b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
281c0 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
281d0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65  ./* Opcode: Inte
281e0 67 72 69 74 79 43 6b 20 50 31 20 50 32 20 50 33  grityCk P1 P2 P3
281f0 20 2a 20 50 35 0a 2a 2a 0a 2a 2a 20 44 6f 20 61   * P5.**.** Do a
28200 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 74 68  n analysis of th
28210 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
28220 20 64 61 74 61 62 61 73 65 2e 20 20 53 74 6f 72   database.  Stor
28230 65 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74 65 72  e in.** register
28240 20 50 31 20 74 68 65 20 74 65 78 74 20 6f 66 20   P1 the text of 
28250 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
28260 20 64 65 73 63 72 69 62 69 6e 67 20 61 6e 79 20   describing any 
28270 70 72 6f 62 6c 65 6d 73 2e 0a 2a 2a 20 49 66 20  problems..** If 
28280 6e 6f 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20  no problems are 
28290 66 6f 75 6e 64 2c 20 73 74 6f 72 65 20 61 20 4e  found, store a N
282a0 55 4c 4c 20 69 6e 20 72 65 67 69 73 74 65 72 20  ULL in register 
282b0 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  P1..**.** The re
282c0 67 69 73 74 65 72 20 50 33 20 63 6f 6e 74 61 69  gister P3 contai
282d0 6e 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ns the maximum n
282e0 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 77 65 64  umber of allowed
282f0 20 65 72 72 6f 72 73 2e 0a 2a 2a 20 41 74 20 6d   errors..** At m
28300 6f 73 74 20 72 65 67 28 50 33 29 20 65 72 72 6f  ost reg(P3) erro
28310 72 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  rs will be repor
28320 74 65 64 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ted..** In other
28330 20 77 6f 72 64 73 2c 20 74 68 65 20 61 6e 61 6c   words, the anal
28340 79 73 69 73 20 73 74 6f 70 73 20 61 73 20 73 6f  ysis stops as so
28350 6f 6e 20 61 73 20 72 65 67 28 50 31 29 20 65 72  on as reg(P1) er
28360 72 6f 72 73 20 61 72 65 20 0a 2a 2a 20 73 65 65  rors are .** see
28370 6e 2e 20 20 52 65 67 28 50 31 29 20 69 73 20 75  n.  Reg(P1) is u
28380 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
28390 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
283a0 20 72 65 6d 61 69 6e 69 6e 67 2e 0a 2a 2a 0a 2a   remaining..**.*
283b0 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
283c0 6e 75 6d 62 65 72 73 20 6f 66 20 61 6c 6c 20 74  numbers of all t
283d0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 61 74  ables in the dat
283e0 61 62 61 73 65 20 61 72 65 20 69 6e 74 65 67 65  abase are intege
283f0 72 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 72  r.** stored in r
28400 65 67 28 50 31 29 2c 20 72 65 67 28 50 31 2b 31  eg(P1), reg(P1+1
28410 29 2c 20 72 65 67 28 50 31 2b 32 29 2c 20 2e 2e  ), reg(P1+2), ..
28420 2e 2e 20 20 54 68 65 72 65 20 61 72 65 20 50 32  ..  There are P2
28430 20 74 61 62 6c 65 73 0a 2a 2a 20 74 6f 74 61 6c   tables.** total
28440 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73  ..**.** If P5 is
28450 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 20 63   not zero, the c
28460 68 65 63 6b 20 69 73 20 64 6f 6e 65 20 6f 6e 20  heck is done on 
28470 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
28480 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 2c 20  tabase.** file, 
28490 6e 6f 74 20 74 68 65 20 6d 61 69 6e 20 64 61 74  not the main dat
284a0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
284b0 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73  * This opcode is
284c0 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
284d0 6e 74 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  nt the integrity
284e0 5f 63 68 65 63 6b 20 70 72 61 67 6d 61 2e 0a 2a  _check pragma..*
284f0 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65 67 72  /.case OP_Integr
28500 69 74 79 43 6b 3a 20 7b 0a 20 20 69 6e 74 20 6e  ityCk: {.  int n
28510 52 6f 6f 74 3b 20 20 20 20 20 20 2f 2a 20 4e 75  Root;      /* Nu
28520 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 74  mber of tables t
28530 6f 20 63 68 65 63 6b 2e 20 20 28 4e 75 6d 62 65  o check.  (Numbe
28540 72 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 2e  r of root pages.
28550 29 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f  ) */.  int *aRoo
28560 74 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  t;     /* Array 
28570 6f 66 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62  of rootpage numb
28580 65 72 73 20 66 6f 72 20 74 61 62 6c 65 73 20 74  ers for tables t
28590 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a  o be checked */.
285a0 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
285b0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
285c0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 3b  r */.  int nErr;
285d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
285e0 20 6f 66 20 65 72 72 6f 72 73 20 72 65 70 6f 72   of errors repor
285f0 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
28600 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74  ;        /* Text
28610 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 72 65   of the error re
28620 70 6f 72 74 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  port */.  Mem *p
28630 6e 45 72 72 3b 20 20 20 20 20 2f 2a 20 52 65 67  nErr;     /* Reg
28640 69 73 74 65 72 20 6b 65 65 70 69 6e 67 20 74 72  ister keeping tr
28650 61 63 6b 20 6f 66 20 65 72 72 6f 72 73 20 72 65  ack of errors re
28660 6d 61 69 6e 69 6e 67 20 2a 2f 0a 0a 20 20 61 73  maining */..  as
28670 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64  sert( p->bIsRead
28680 65 72 20 29 3b 0a 20 20 6e 52 6f 6f 74 20 3d 20  er );.  nRoot = 
28690 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72  pOp->p2;.  asser
286a0 74 28 20 6e 52 6f 6f 74 3e 30 20 29 3b 0a 20 20  t( nRoot>0 );.  
286b0 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 44  aRoot = sqlite3D
286c0 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
286d0 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 52 6f 6f  izeof(int)*(nRoo
286e0 74 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 61 52  t+1) );.  if( aR
286f0 6f 6f 74 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  oot==0 ) goto no
28700 5f 6d 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  _mem;.  assert( 
28710 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70  pOp->p3>0 && pOp
28720 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d 70  ->p3<=(p->nMem-p
28730 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
28740 70 6e 45 72 72 20 3d 20 26 61 4d 65 6d 5b 70 4f  pnErr = &aMem[pO
28750 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74  p->p3];.  assert
28760 28 20 28 70 6e 45 72 72 2d 3e 66 6c 61 67 73 20  ( (pnErr->flags 
28770 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b  & MEM_Int)!=0 );
28780 0a 20 20 61 73 73 65 72 74 28 20 28 70 6e 45 72  .  assert( (pnEr
28790 72 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  r->flags & (MEM_
287a0 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d  Str|MEM_Blob))==
287b0 30 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61  0 );.  pIn1 = &a
287c0 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
287d0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 52 6f 6f 74  for(j=0; j<nRoot
287e0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 61 52 6f 6f  ; j++){.    aRoo
287f0 74 5b 6a 5d 20 3d 20 28 69 6e 74 29 73 71 6c 69  t[j] = (int)sqli
28800 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28  te3VdbeIntValue(
28810 26 70 49 6e 31 5b 6a 5d 29 3b 0a 20 20 7d 0a 20  &pIn1[j]);.  }. 
28820 20 61 52 6f 6f 74 5b 6a 5d 20 3d 20 30 3b 0a 20   aRoot[j] = 0;. 
28830 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35   assert( pOp->p5
28840 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
28850 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d  sert( (p->btreeM
28860 61 73 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b  ask & (((yDbMask
28870 29 31 29 3c 3c 70 4f 70 2d 3e 70 35 29 29 21 3d  )1)<<pOp->p5))!=
28880 30 20 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  0 );.  z = sqlit
28890 65 33 42 74 72 65 65 49 6e 74 65 67 72 69 74 79  e3BtreeIntegrity
288a0 43 68 65 63 6b 28 64 62 2d 3e 61 44 62 5b 70 4f  Check(db->aDb[pO
288b0 70 2d 3e 70 35 5d 2e 70 42 74 2c 20 61 52 6f 6f  p->p5].pBt, aRoo
288c0 74 2c 20 6e 52 6f 6f 74 2c 0a 20 20 20 20 20 20  t, nRoot,.      
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288e0 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
288f0 70 6e 45 72 72 2d 3e 75 2e 69 2c 20 26 6e 45 72  pnErr->u.i, &nEr
28900 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  r);.  sqlite3DbF
28910 72 65 65 28 64 62 2c 20 61 52 6f 6f 74 29 3b 0a  ree(db, aRoot);.
28920 20 20 70 6e 45 72 72 2d 3e 75 2e 69 20 2d 3d 20    pnErr->u.i -= 
28930 6e 45 72 72 3b 0a 20 20 73 71 6c 69 74 65 33 56  nErr;.  sqlite3V
28940 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 49  dbeMemSetNull(pI
28950 6e 31 29 3b 0a 20 20 69 66 28 20 6e 45 72 72 3d  n1);.  if( nErr=
28960 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
28970 28 20 7a 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73  ( z==0 );.  }els
28980 65 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20  e if( z==0 ){.  
28990 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
289a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
289b0 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
289c0 28 70 49 6e 31 2c 20 7a 2c 20 2d 31 2c 20 53 51  (pIn1, z, -1, SQ
289d0 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74  LITE_UTF8, sqlit
289e0 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 20 20  e3_free);.  }.  
289f0 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
28a00 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20 73 71 6c  IZE(pIn1);.  sql
28a10 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e  ite3VdbeChangeEn
28a20 63 6f 64 69 6e 67 28 70 49 6e 31 2c 20 65 6e 63  coding(pIn1, enc
28a30 6f 64 69 6e 67 29 3b 0a 20 20 62 72 65 61 6b 3b  oding);.  break;
28a40 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
28a50 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
28a60 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 20  TY_CHECK */../* 
28a70 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 41 64  Opcode: RowSetAd
28a80 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  d P1 P2 * * *.**
28a90 0a 2a 2a 20 49 6e 73 65 72 74 20 74 68 65 20 69  .** Insert the i
28aa0 6e 74 65 67 65 72 20 76 61 6c 75 65 20 68 65 6c  nteger value hel
28ab0 64 20 62 79 20 72 65 67 69 73 74 65 72 20 50 32  d by register P2
28ac0 20 69 6e 74 6f 20 61 20 62 6f 6f 6c 65 61 6e 20   into a boolean 
28ad0 69 6e 64 65 78 0a 2a 2a 20 68 65 6c 64 20 69 6e  index.** held in
28ae0 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a   register P1..**
28af0 0a 2a 2a 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  .** An assertion
28b00 20 66 61 69 6c 73 20 69 66 20 50 32 20 69 73 20   fails if P2 is 
28b10 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a  not an integer..
28b20 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65  */.case OP_RowSe
28b30 74 41 64 64 3a 20 7b 20 20 20 20 20 20 20 2f 2a  tAdd: {       /*
28b40 20 69 6e 31 2c 20 69 6e 32 20 2a 2f 0a 20 20 70   in1, in2 */.  p
28b50 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
28b60 3e 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26  >p1];.  pIn2 = &
28b70 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
28b80 20 61 73 73 65 72 74 28 20 28 70 49 6e 32 2d 3e   assert( (pIn2->
28b90 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
28ba0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 49  !=0 );.  if( (pI
28bb0 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
28bc0 52 6f 77 53 65 74 29 3d 3d 30 20 29 7b 0a 20 20  RowSet)==0 ){.  
28bd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
28be0 53 65 74 52 6f 77 53 65 74 28 70 49 6e 31 29 3b  SetRowSet(pIn1);
28bf0 0a 20 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  .    if( (pIn1->
28c00 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
28c10 65 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  et)==0 ) goto no
28c20 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  _mem;.  }.  sqli
28c30 74 65 33 52 6f 77 53 65 74 49 6e 73 65 72 74 28  te3RowSetInsert(
28c40 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c  pIn1->u.pRowSet,
28c50 20 70 49 6e 32 2d 3e 75 2e 69 29 3b 0a 20 20 62   pIn2->u.i);.  b
28c60 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
28c70 64 65 3a 20 52 6f 77 53 65 74 52 65 61 64 20 50  de: RowSetRead P
28c80 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
28c90 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 73 6d  * Extract the sm
28ca0 61 6c 6c 65 73 74 20 76 61 6c 75 65 20 66 72 6f  allest value fro
28cb0 6d 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20  m boolean index 
28cc0 50 31 20 61 6e 64 20 70 75 74 20 74 68 61 74 20  P1 and put that 
28cd0 76 61 6c 75 65 20 69 6e 74 6f 0a 2a 2a 20 72 65  value into.** re
28ce0 67 69 73 74 65 72 20 50 33 2e 20 20 4f 72 2c 20  gister P3.  Or, 
28cf0 69 66 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78  if boolean index
28d00 20 50 31 20 69 73 20 69 6e 69 74 69 61 6c 6c 79   P1 is initially
28d10 20 65 6d 70 74 79 2c 20 6c 65 61 76 65 20 50 33   empty, leave P3
28d20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  .** unchanged an
28d30 64 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75  d jump to instru
28d40 63 74 69 6f 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73  ction P2..*/.cas
28d50 65 20 4f 50 5f 52 6f 77 53 65 74 52 65 61 64 3a  e OP_RowSetRead:
28d60 20 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70   {       /* jump
28d70 2c 20 69 6e 31 2c 20 6f 75 74 33 20 2a 2f 0a 20  , in1, out3 */. 
28d80 20 69 36 34 20 76 61 6c 3b 0a 0a 20 20 70 49 6e   i64 val;..  pIn
28d90 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
28da0 31 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d  1];.  if( (pIn1-
28db0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77  >flags & MEM_Row
28dc0 53 65 74 29 3d 3d 30 20 0a 20 20 20 7c 7c 20 73  Set)==0 .   || s
28dd0 71 6c 69 74 65 33 52 6f 77 53 65 74 4e 65 78 74  qlite3RowSetNext
28de0 28 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74  (pIn1->u.pRowSet
28df0 2c 20 26 76 61 6c 29 3d 3d 30 0a 20 20 29 7b 0a  , &val)==0.  ){.
28e00 20 20 20 20 2f 2a 20 54 68 65 20 62 6f 6f 6c 65      /* The boole
28e10 61 6e 20 69 6e 64 65 78 20 69 73 20 65 6d 70 74  an index is empt
28e20 79 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  y */.    sqlite3
28e30 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70  VdbeMemSetNull(p
28e40 49 6e 31 29 3b 0a 20 20 20 20 70 63 20 3d 20 70  In1);.    pc = p
28e50 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 65  Op->p2 - 1;.  }e
28e60 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 20 76 61  lse{.    /* A va
28e70 6c 75 65 20 77 61 73 20 70 75 6c 6c 65 64 20 66  lue was pulled f
28e80 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  rom the index */
28e90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
28ea0 4d 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d 65  MemSetInt64(&aMe
28eb0 6d 5b 70 4f 70 2d 3e 70 33 5d 2c 20 76 61 6c 29  m[pOp->p3], val)
28ec0 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20 63 68 65  ;.  }.  goto che
28ed0 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70 74  ck_for_interrupt
28ee0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
28ef0 52 6f 77 53 65 74 54 65 73 74 20 50 31 20 50 32  RowSetTest P1 P2
28f00 20 50 33 20 50 34 0a 2a 2a 0a 2a 2a 20 52 65 67   P3 P4.**.** Reg
28f10 69 73 74 65 72 20 50 33 20 69 73 20 61 73 73 75  ister P3 is assu
28f20 6d 65 64 20 74 6f 20 68 6f 6c 64 20 61 20 36 34  med to hold a 64
28f30 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
28f40 75 65 2e 20 49 66 20 72 65 67 69 73 74 65 72 20  ue. If register 
28f50 50 31 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61  P1.** contains a
28f60 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 61   RowSet object a
28f70 6e 64 20 74 68 61 74 20 52 6f 77 53 65 74 20 6f  nd that RowSet o
28f80 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 0a 2a  bject contains.*
28f90 2a 20 74 68 65 20 76 61 6c 75 65 20 68 65 6c 64  * the value held
28fa0 20 69 6e 20 50 33 2c 20 6a 75 6d 70 20 74 6f 20   in P3, jump to 
28fb0 72 65 67 69 73 74 65 72 20 50 32 2e 20 4f 74 68  register P2. Oth
28fc0 65 72 77 69 73 65 2c 20 69 6e 73 65 72 74 20 74  erwise, insert t
28fd0 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69 6e  he.** integer in
28fe0 20 50 33 20 69 6e 74 6f 20 74 68 65 20 52 6f 77   P3 into the Row
28ff0 53 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65  Set and continue
29000 20 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65   on to the.** ne
29010 78 74 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  xt opcode..**.**
29020 20 54 68 65 20 52 6f 77 53 65 74 20 6f 62 6a 65   The RowSet obje
29030 63 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  ct is optimized 
29040 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
29050 72 65 20 73 75 63 63 65 73 73 69 76 65 20 73 65  re successive se
29060 74 73 0a 2a 2a 20 6f 66 20 69 6e 74 65 67 65 72  ts.** of integer
29070 73 2c 20 77 68 65 72 65 20 65 61 63 68 20 73 65  s, where each se
29080 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 75  t contains no du
29090 70 6c 69 63 61 74 65 73 2e 20 45 61 63 68 20 73  plicates. Each s
290a0 65 74 0a 2a 2a 20 6f 66 20 76 61 6c 75 65 73 20  et.** of values 
290b0 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
290c0 20 61 20 75 6e 69 71 75 65 20 50 34 20 76 61 6c   a unique P4 val
290d0 75 65 2e 20 54 68 65 20 66 69 72 73 74 20 73 65  ue. The first se
290e0 74 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 50  t.** must have P
290f0 34 3d 3d 30 2c 20 74 68 65 20 66 69 6e 61 6c 20  4==0, the final 
29100 73 65 74 20 50 34 3d 2d 31 2e 20 20 50 34 20 6d  set P4=-1.  P4 m
29110 75 73 74 20 62 65 20 65 69 74 68 65 72 20 2d 31  ust be either -1
29120 20 6f 72 0a 2a 2a 20 6e 6f 6e 2d 6e 65 67 61 74   or.** non-negat
29130 69 76 65 2e 20 20 46 6f 72 20 6e 6f 6e 2d 6e 65  ive.  For non-ne
29140 67 61 74 69 76 65 20 76 61 6c 75 65 73 20 6f 66  gative values of
29150 20 50 34 20 6f 6e 6c 79 20 74 68 65 20 6c 6f 77   P4 only the low
29160 65 72 20 34 0a 2a 2a 20 62 69 74 73 20 61 72 65  er 4.** bits are
29170 20 73 69 67 6e 69 66 69 63 61 6e 74 2e 0a 2a 2a   significant..**
29180 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  .** This allows 
29190 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 3a 20 28  optimizations: (
291a0 61 29 20 77 68 65 6e 20 50 34 3d 3d 30 20 74 68  a) when P4==0 th
291b0 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
291c0 6f 20 74 65 73 74 0a 2a 2a 20 74 68 65 20 72 6f  o test.** the ro
291d0 77 73 65 74 20 6f 62 6a 65 63 74 20 66 6f 72 20  wset object for 
291e0 50 33 2c 20 61 73 20 69 74 20 69 73 20 67 75 61  P3, as it is gua
291f0 72 61 6e 74 65 65 64 20 6e 6f 74 20 74 6f 20 63  ranteed not to c
29200 6f 6e 74 61 69 6e 20 69 74 2c 0a 2a 2a 20 28 62  ontain it,.** (b
29210 29 20 77 68 65 6e 20 50 34 3d 3d 2d 31 20 74 68  ) when P4==-1 th
29220 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
29230 6f 20 69 6e 73 65 72 74 20 74 68 65 20 76 61 6c  o insert the val
29240 75 65 2c 20 61 73 20 69 74 20 77 69 6c 6c 0a 2a  ue, as it will.*
29250 2a 20 6e 65 76 65 72 20 62 65 20 74 65 73 74 65  * never be teste
29260 64 20 66 6f 72 2c 20 61 6e 64 20 28 63 29 20 77  d for, and (c) w
29270 68 65 6e 20 61 20 76 61 6c 75 65 20 74 68 61 74  hen a value that
29280 20 69 73 20 70 61 72 74 20 6f 66 20 73 65 74 20   is part of set 
29290 58 20 69 73 0a 2a 2a 20 69 6e 73 65 72 74 65 64  X is.** inserted
292a0 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
292b0 65 64 20 74 6f 20 73 65 61 72 63 68 20 74 6f 20  ed to search to 
292c0 73 65 65 20 69 66 20 74 68 65 20 73 61 6d 65 20  see if the same 
292d0 76 61 6c 75 65 20 77 61 73 0a 2a 2a 20 70 72 65  value was.** pre
292e0 76 69 6f 75 73 6c 79 20 69 6e 73 65 72 74 65 64  viously inserted
292f0 20 61 73 20 70 61 72 74 20 6f 66 20 73 65 74 20   as part of set 
29300 58 20 28 6f 6e 6c 79 20 69 66 20 69 74 20 77 61  X (only if it wa
29310 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
29320 69 6e 73 65 72 74 65 64 20 61 73 20 70 61 72 74  inserted as part
29330 20 6f 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73   of some other s
29340 65 74 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  et)..*/.case OP_
29350 52 6f 77 53 65 74 54 65 73 74 3a 20 7b 20 20 20  RowSetTest: {   
29360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29370 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 2c 20    /* jump, in1, 
29380 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65  in3 */.  int iSe
29390 74 3b 0a 20 20 69 6e 74 20 65 78 69 73 74 73 3b  t;.  int exists;
293a0 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ..  pIn1 = &aMem
293b0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e  [pOp->p1];.  pIn
293c0 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  3 = &aMem[pOp->p
293d0 33 5d 3b 0a 20 20 69 53 65 74 20 3d 20 70 4f 70  3];.  iSet = pOp
293e0 2d 3e 70 34 2e 69 3b 0a 20 20 61 73 73 65 72 74  ->p4.i;.  assert
293f0 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 26 4d 45  ( pIn3->flags&ME
29400 4d 5f 49 6e 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  M_Int );..  /* I
29410 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68  f there is anyth
29420 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
29430 20 72 6f 77 73 65 74 20 6f 62 6a 65 63 74 20 69   rowset object i
29440 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 50 31  n memory cell P1
29450 2c 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20 69 74  ,.  ** delete it
29460 20 6e 6f 77 20 61 6e 64 20 69 6e 69 74 69 61 6c   now and initial
29470 69 7a 65 20 50 31 20 77 69 74 68 20 61 6e 20 65  ize P1 with an e
29480 6d 70 74 79 20 72 6f 77 73 65 74 0a 20 20 2a 2f  mpty rowset.  */
29490 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
294a0 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
294b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
294c0 74 65 33 56 64 62 65 4d 65 6d 53 65 74 52 6f 77  te3VdbeMemSetRow
294d0 53 65 74 28 70 49 6e 31 29 3b 0a 20 20 20 20 69  Set(pIn1);.    i
294e0 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
294f0 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30  & MEM_RowSet)==0
29500 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
29510 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
29520 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49  Op->p4type==P4_I
29530 4e 54 33 32 20 29 3b 0a 20 20 61 73 73 65 72 74  NT32 );.  assert
29540 28 20 69 53 65 74 3d 3d 2d 31 20 7c 7c 20 69 53  ( iSet==-1 || iS
29550 65 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  et>=0 );.  if( i
29560 53 65 74 20 29 7b 0a 20 20 20 20 65 78 69 73 74  Set ){.    exist
29570 73 20 3d 20 73 71 6c 69 74 65 33 52 6f 77 53 65  s = sqlite3RowSe
29580 74 54 65 73 74 28 70 49 6e 31 2d 3e 75 2e 70 52  tTest(pIn1->u.pR
29590 6f 77 53 65 74 2c 20 0a 20 20 20 20 20 20 20 20  owSet, .        
295a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295b0 20 20 20 20 20 20 20 28 75 38 29 28 69 53 65 74         (u8)(iSet
295c0 3e 3d 30 20 3f 20 69 53 65 74 20 26 20 30 78 66  >=0 ? iSet & 0xf
295d0 20 3a 20 30 78 66 66 29 2c 0a 20 20 20 20 20 20   : 0xff),.      
295e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295f0 20 20 20 20 20 20 20 20 20 70 49 6e 33 2d 3e 75           pIn3->u
29600 2e 69 29 3b 0a 20 20 20 20 69 66 28 20 65 78 69  .i);.    if( exi
29610 73 74 73 20 29 7b 0a 20 20 20 20 20 20 70 63 20  sts ){.      pc 
29620 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
29630 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
29640 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 65 74  }.  }.  if( iSet
29650 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
29660 65 33 52 6f 77 53 65 74 49 6e 73 65 72 74 28 70  e3RowSetInsert(p
29670 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20  In1->u.pRowSet, 
29680 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 7d 0a  pIn3->u.i);.  }.
29690 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66    break;.}...#if
296a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
296b0 5f 54 52 49 47 47 45 52 0a 0a 2f 2a 20 4f 70 63  _TRIGGER../* Opc
296c0 6f 64 65 3a 20 50 72 6f 67 72 61 6d 20 50 31 20  ode: Program P1 
296d0 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  P2 P3 P4 *.**.**
296e0 20 45 78 65 63 75 74 65 20 74 68 65 20 74 72 69   Execute the tri
296f0 67 67 65 72 20 70 72 6f 67 72 61 6d 20 70 61 73  gger program pas
29700 73 65 64 20 61 73 20 50 34 20 28 74 79 70 65 20  sed as P4 (type 
29710 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 29 2e 20  P4_SUBPROGRAM). 
29720 0a 2a 2a 0a 2a 2a 20 50 31 20 63 6f 6e 74 61 69  .**.** P1 contai
29730 6e 73 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  ns the address o
29740 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
29750 6c 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  l that contains 
29760 74 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72 79  the first memory
29770 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 61 6e 20   .** cell in an 
29780 61 72 72 61 79 20 6f 66 20 76 61 6c 75 65 73 20  array of values 
29790 75 73 65 64 20 61 73 20 61 72 67 75 6d 65 6e 74  used as argument
297a0 73 20 74 6f 20 74 68 65 20 73 75 62 2d 70 72 6f  s to the sub-pro
297b0 67 72 61 6d 2e 20 50 32 20 0a 2a 2a 20 63 6f 6e  gram. P2 .** con
297c0 74 61 69 6e 73 20 74 68 65 20 61 64 64 72 65 73  tains the addres
297d0 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66 20  s to jump to if 
297e0 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  the sub-program 
297f0 74 68 72 6f 77 73 20 61 6e 20 49 47 4e 4f 52 45  throws an IGNORE
29800 20 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 75   .** exception u
29810 73 69 6e 67 20 74 68 65 20 52 41 49 53 45 28 29  sing the RAISE()
29820 20 66 75 6e 63 74 69 6f 6e 2e 20 52 65 67 69 73   function. Regis
29830 74 65 72 20 50 33 20 63 6f 6e 74 61 69 6e 73 20  ter P3 contains 
29840 74 68 65 20 61 64 64 72 65 73 73 20 0a 2a 2a 20  the address .** 
29850 6f 66 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  of a memory cell
29860 20 69 6e 20 74 68 69 73 20 28 74 68 65 20 70 61   in this (the pa
29870 72 65 6e 74 29 20 56 4d 20 74 68 61 74 20 69 73  rent) VM that is
29880 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
29890 65 20 74 68 65 20 0a 2a 2a 20 6d 65 6d 6f 72 79  e the .** memory
298a0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
298b0 20 73 75 62 2d 76 64 62 65 20 61 74 20 72 75 6e   sub-vdbe at run
298c0 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69  time..**.** P4 i
298d0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
298e0 68 65 20 56 4d 20 63 6f 6e 74 61 69 6e 69 6e 67  he VM containing
298f0 20 74 68 65 20 74 72 69 67 67 65 72 20 70 72 6f   the trigger pro
29900 67 72 61 6d 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  gram..*/.case OP
29910 5f 50 72 6f 67 72 61 6d 3a 20 7b 20 20 20 20 20  _Program: {     
29920 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
29930 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20  int nMem;       
29940 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
29950 72 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 67 69  r of memory regi
29960 73 74 65 72 73 20 66 6f 72 20 73 75 62 2d 70 72  sters for sub-pr
29970 6f 67 72 61 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ogram */.  int n
29980 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
29990 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 72     /* Bytes of r
299a0 75 6e 74 69 6d 65 20 73 70 61 63 65 20 72 65 71  untime space req
299b0 75 69 72 65 64 20 66 6f 72 20 73 75 62 2d 70 72  uired for sub-pr
299c0 6f 67 72 61 6d 20 2a 2f 0a 20 20 4d 65 6d 20 2a  ogram */.  Mem *
299d0 70 52 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pRt;            
299e0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
299f0 6f 20 61 6c 6c 6f 63 61 74 65 20 72 75 6e 74 69  o allocate runti
29a00 6d 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 4d 65  me space */.  Me
29a10 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20 20  m *pMem;        
29a20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
29a30 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
29a40 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 2a 2f   memory cells */
29a50 0a 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 20 20 20  .  Mem *pEnd;   
29a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
29a70 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  st memory cell i
29a80 6e 20 6e 65 77 20 61 72 72 61 79 20 2a 2f 0a 20  n new array */. 
29a90 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61   VdbeFrame *pFra
29aa0 6d 65 3b 20 20 20 20 20 20 2f 2a 20 4e 65 77 20  me;      /* New 
29ab0 76 64 62 65 20 66 72 61 6d 65 20 74 6f 20 65 78  vdbe frame to ex
29ac0 65 63 75 74 65 20 69 6e 20 2a 2f 0a 20 20 53 75  ecute in */.  Su
29ad0 62 50 72 6f 67 72 61 6d 20 2a 70 50 72 6f 67 72  bProgram *pProgr
29ae0 61 6d 3b 20 20 20 2f 2a 20 53 75 62 2d 70 72 6f  am;   /* Sub-pro
29af0 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20  gram to execute 
29b00 2a 2f 0a 20 20 76 6f 69 64 20 2a 74 3b 20 20 20  */.  void *t;   
29b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29b20 54 6f 6b 65 6e 20 69 64 65 6e 74 69 66 79 69 6e  Token identifyin
29b30 67 20 74 72 69 67 67 65 72 20 2a 2f 0a 0a 20 20  g trigger */..  
29b40 70 50 72 6f 67 72 61 6d 20 3d 20 70 4f 70 2d 3e  pProgram = pOp->
29b50 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70  p4.pProgram;.  p
29b60 52 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  Rt = &aMem[pOp->
29b70 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p3];.  assert( p
29b80 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3e 30 20 29  Program->nOp>0 )
29b90 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 65  ;.  .  /* If the
29ba0 20 70 35 20 66 6c 61 67 20 69 73 20 63 6c 65 61   p5 flag is clea
29bb0 72 2c 20 74 68 65 6e 20 72 65 63 75 72 73 69 76  r, then recursiv
29bc0 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20  e invocation of 
29bd0 74 72 69 67 67 65 72 73 20 69 73 20 0a 20 20 2a  triggers is .  *
29be0 2a 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 62  * disabled for b
29bf0 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
29c00 62 69 6c 69 74 79 20 28 70 35 20 69 73 20 73 65  bility (p5 is se
29c10 74 20 69 66 20 74 68 69 73 20 73 75 62 2d 70 72  t if this sub-pr
29c20 6f 67 72 61 6d 0a 20 20 2a 2a 20 69 73 20 72 65  ogram.  ** is re
29c30 61 6c 6c 79 20 61 20 74 72 69 67 67 65 72 2c 20  ally a trigger, 
29c40 6e 6f 74 20 61 20 66 6f 72 65 69 67 6e 20 6b 65  not a foreign ke
29c50 79 20 61 63 74 69 6f 6e 2c 20 61 6e 64 20 74 68  y action, and th
29c60 65 20 66 6c 61 67 20 73 65 74 0a 20 20 2a 2a 20  e flag set.  ** 
29c70 61 6e 64 20 63 6c 65 61 72 65 64 20 62 79 20 74  and cleared by t
29c80 68 65 20 22 50 52 41 47 4d 41 20 72 65 63 75 72  he "PRAGMA recur
29c90 73 69 76 65 5f 74 72 69 67 67 65 72 73 22 20 63  sive_triggers" c
29ca0 6f 6d 6d 61 6e 64 20 69 73 20 63 6c 65 61 72 29  ommand is clear)
29cb0 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 74 20  ..  ** .  ** It 
29cc0 69 73 20 72 65 63 75 72 73 69 76 65 20 69 6e 76  is recursive inv
29cd0 6f 63 61 74 69 6f 6e 20 6f 66 20 74 72 69 67 67  ocation of trigg
29ce0 65 72 73 2c 20 61 74 20 74 68 65 20 53 51 4c 20  ers, at the SQL 
29cf0 6c 65 76 65 6c 2c 20 74 68 61 74 20 69 73 20 0a  level, that is .
29d00 20 20 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20 49    ** disabled. I
29d10 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 61 20 73  n some cases a s
29d20 69 6e 67 6c 65 20 74 72 69 67 67 65 72 20 6d 61  ingle trigger ma
29d30 79 20 67 65 6e 65 72 61 74 65 20 6d 6f 72 65 20  y generate more 
29d40 74 68 61 6e 20 6f 6e 65 20 0a 20 20 2a 2a 20 53  than one .  ** S
29d50 75 62 50 72 6f 67 72 61 6d 20 28 69 66 20 74 68  ubProgram (if th
29d60 65 20 74 72 69 67 67 65 72 20 6d 61 79 20 62 65  e trigger may be
29d70 20 65 78 65 63 75 74 65 64 20 77 69 74 68 20 6d   executed with m
29d80 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 69 66  ore than one dif
29d90 66 65 72 65 6e 74 20 0a 20 20 2a 2a 20 4f 4e 20  ferent .  ** ON 
29da0 43 4f 4e 46 4c 49 43 54 20 61 6c 67 6f 72 69 74  CONFLICT algorit
29db0 68 6d 29 2e 20 53 75 62 50 72 6f 67 72 61 6d 20  hm). SubProgram 
29dc0 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
29dd0 69 61 74 65 64 20 77 69 74 68 20 61 0a 20 20 2a  iated with a.  *
29de0 2a 20 73 69 6e 67 6c 65 20 74 72 69 67 67 65 72  * single trigger
29df0 20 61 6c 6c 20 68 61 76 65 20 74 68 65 20 73 61   all have the sa
29e00 6d 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  me value for the
29e10 20 53 75 62 50 72 6f 67 72 61 6d 2e 74 6f 6b 65   SubProgram.toke
29e20 6e 20 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  n .  ** variable
29e30 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d  .  */.  if( pOp-
29e40 3e 70 35 20 29 7b 0a 20 20 20 20 74 20 3d 20 70  >p5 ){.    t = p
29e50 50 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a  Program->token;.
29e60 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70      for(pFrame=p
29e70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65  ->pFrame; pFrame
29e80 20 26 26 20 70 46 72 61 6d 65 2d 3e 74 6f 6b 65   && pFrame->toke
29e90 6e 21 3d 74 3b 20 70 46 72 61 6d 65 3d 70 46 72  n!=t; pFrame=pFr
29ea0 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  ame->pParent);. 
29eb0 20 20 20 69 66 28 20 70 46 72 61 6d 65 20 29 20     if( pFrame ) 
29ec0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66  break;.  }..  if
29ed0 28 20 70 2d 3e 6e 46 72 61 6d 65 3e 3d 64 62 2d  ( p->nFrame>=db-
29ee0 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
29ef0 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
29f00 54 48 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  TH] ){.    rc = 
29f10 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
29f20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
29f30 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
29f40 64 62 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 6c 65  db, "too many le
29f50 76 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20  vels of trigger 
29f60 72 65 63 75 72 73 69 6f 6e 22 29 3b 0a 20 20 20  recursion");.   
29f70 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
29f80 2a 20 52 65 67 69 73 74 65 72 20 70 52 74 20 69  * Register pRt i
29f90 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
29fa0 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69  the memory requi
29fb0 72 65 64 20 74 6f 20 73 61 76 65 20 74 68 65 20  red to save the 
29fc0 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68  state.  ** of th
29fd0 65 20 63 75 72 72 65 6e 74 20 70 72 6f 67 72 61  e current progra
29fe0 6d 2c 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  m, and the memor
29ff0 79 20 72 65 71 75 69 72 65 64 20 61 74 20 72 75  y required at ru
2a000 6e 74 69 6d 65 20 74 6f 20 65 78 65 63 75 74 65  ntime to execute
2a010 0a 20 20 2a 2a 20 74 68 65 20 74 72 69 67 67 65  .  ** the trigge
2a020 72 20 70 72 6f 67 72 61 6d 2e 20 49 66 20 74 68  r program. If th
2a030 69 73 20 74 72 69 67 67 65 72 20 68 61 73 20 62  is trigger has b
2a040 65 65 6e 20 66 69 72 65 64 20 62 65 66 6f 72 65  een fired before
2a050 2c 20 74 68 65 6e 20 70 52 74 20 0a 20 20 2a 2a  , then pRt .  **
2a060 20 69 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f   is already allo
2a070 63 61 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65  cated. Otherwise
2a080 2c 20 69 74 20 6d 75 73 74 20 62 65 20 69 6e 69  , it must be ini
2a090 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20 20  tialized.  */.  
2a0a0 69 66 28 20 28 70 52 74 2d 3e 66 6c 61 67 73 26  if( (pRt->flags&
2a0b0 4d 45 4d 5f 46 72 61 6d 65 29 3d 3d 30 20 29 7b  MEM_Frame)==0 ){
2a0c0 0a 20 20 20 20 2f 2a 20 53 75 62 50 72 6f 67 72  .    /* SubProgr
2a0d0 61 6d 2e 6e 4d 65 6d 20 69 73 20 73 65 74 20 74  am.nMem is set t
2a0e0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
2a0f0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 75 73 65  memory cells use
2a100 64 20 62 79 20 74 68 65 20 0a 20 20 20 20 2a 2a  d by the .    **
2a110 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64 20   program stored 
2a120 69 6e 20 53 75 62 50 72 6f 67 72 61 6d 2e 61 4f  in SubProgram.aO
2a130 70 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 74 68  p. As well as th
2a140 65 73 65 2c 20 6f 6e 65 20 6d 65 6d 6f 72 79 0a  ese, one memory.
2a150 20 20 20 20 2a 2a 20 63 65 6c 6c 20 69 73 20 72      ** cell is r
2a160 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
2a170 20 63 75 72 73 6f 72 20 75 73 65 64 20 62 79 20   cursor used by 
2a180 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 53 65 74  the program. Set
2a190 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61   local.    ** va
2a1a0 72 69 61 62 6c 65 20 6e 4d 65 6d 20 28 61 6e 64  riable nMem (and
2a1b0 20 6c 61 74 65 72 2c 20 56 64 62 65 46 72 61 6d   later, VdbeFram
2a1c0 65 2e 6e 43 68 69 6c 64 4d 65 6d 29 20 74 6f 20  e.nChildMem) to 
2a1d0 74 68 69 73 20 76 61 6c 75 65 2e 0a 20 20 20 20  this value..    
2a1e0 2a 2f 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 70 50  */.    nMem = pP
2a1f0 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20 2b 20 70  rogram->nMem + p
2a200 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b 0a 20  Program->nCsr;. 
2a210 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44     nByte = ROUND
2a220 38 28 73 69 7a 65 6f 66 28 56 64 62 65 46 72 61  8(sizeof(VdbeFra
2a230 6d 65 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  me)).           
2a240 20 20 20 2b 20 6e 4d 65 6d 20 2a 20 73 69 7a 65     + nMem * size
2a250 6f 66 28 4d 65 6d 29 0a 20 20 20 20 20 20 20 20  of(Mem).        
2a260 20 20 20 20 20 20 2b 20 70 50 72 6f 67 72 61 6d        + pProgram
2a270 2d 3e 6e 43 73 72 20 2a 20 73 69 7a 65 6f 66 28  ->nCsr * sizeof(
2a280 56 64 62 65 43 75 72 73 6f 72 20 2a 29 0a 20 20  VdbeCursor *).  
2a290 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 70 50              + pP
2a2a0 72 6f 67 72 61 6d 2d 3e 6e 4f 6e 63 65 20 2a 20  rogram->nOnce * 
2a2b0 73 69 7a 65 6f 66 28 75 38 29 3b 0a 20 20 20 20  sizeof(u8);.    
2a2c0 70 46 72 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  pFrame = sqlite3
2a2d0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
2a2e0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
2a2f0 20 21 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20   !pFrame ){.    
2a300 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
2a310 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2a320 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
2a330 52 74 29 3b 0a 20 20 20 20 70 52 74 2d 3e 66 6c  Rt);.    pRt->fl
2a340 61 67 73 20 3d 20 4d 45 4d 5f 46 72 61 6d 65 3b  ags = MEM_Frame;
2a350 0a 20 20 20 20 70 52 74 2d 3e 75 2e 70 46 72 61  .    pRt->u.pFra
2a360 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a 0a 20 20  me = pFrame;..  
2a370 20 20 70 46 72 61 6d 65 2d 3e 76 20 3d 20 70 3b    pFrame->v = p;
2a380 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68  .    pFrame->nCh
2a390 69 6c 64 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20  ildMem = nMem;. 
2a3a0 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c     pFrame->nChil
2a3b0 64 43 73 72 20 3d 20 70 50 72 6f 67 72 61 6d 2d  dCsr = pProgram-
2a3c0 3e 6e 43 73 72 3b 0a 20 20 20 20 70 46 72 61 6d  >nCsr;.    pFram
2a3d0 65 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20 20 20  e->pc = pc;.    
2a3e0 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 20 3d 20 70  pFrame->aMem = p
2a3f0 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61  ->aMem;.    pFra
2a400 6d 65 2d 3e 6e 4d 65 6d 20 3d 20 70 2d 3e 6e 4d  me->nMem = p->nM
2a410 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e  em;.    pFrame->
2a420 61 70 43 73 72 20 3d 20 70 2d 3e 61 70 43 73 72  apCsr = p->apCsr
2a430 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43  ;.    pFrame->nC
2a440 75 72 73 6f 72 20 3d 20 70 2d 3e 6e 43 75 72 73  ursor = p->nCurs
2a450 6f 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e  or;.    pFrame->
2a460 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20  aOp = p->aOp;.  
2a470 20 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 20 3d 20    pFrame->nOp = 
2a480 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 70 46 72 61  p->nOp;.    pFra
2a490 6d 65 2d 3e 74 6f 6b 65 6e 20 3d 20 70 50 72 6f  me->token = pPro
2a4a0 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  gram->token;.   
2a4b0 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c   pFrame->aOnceFl
2a4c0 61 67 20 3d 20 70 2d 3e 61 4f 6e 63 65 46 6c 61  ag = p->aOnceFla
2a4d0 67 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e  g;.    pFrame->n
2a4e0 4f 6e 63 65 46 6c 61 67 20 3d 20 70 2d 3e 6e 4f  OnceFlag = p->nO
2a4f0 6e 63 65 46 6c 61 67 3b 0a 0a 20 20 20 20 70 45  nceFlag;..    pE
2a500 6e 64 20 3d 20 26 56 64 62 65 46 72 61 6d 65 4d  nd = &VdbeFrameM
2a510 65 6d 28 70 46 72 61 6d 65 29 5b 70 46 72 61 6d  em(pFrame)[pFram
2a520 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20  e->nChildMem];. 
2a530 20 20 20 66 6f 72 28 70 4d 65 6d 3d 56 64 62 65     for(pMem=Vdbe
2a540 46 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65 29  FrameMem(pFrame)
2a550 3b 20 70 4d 65 6d 21 3d 70 45 6e 64 3b 20 70 4d  ; pMem!=pEnd; pM
2a560 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4d 65  em++){.      pMe
2a570 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
2a580 6e 76 61 6c 69 64 3b 0a 20 20 20 20 20 20 70 4d  nvalid;.      pM
2a590 65 6d 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  em->db = db;.   
2a5a0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2a5b0 70 46 72 61 6d 65 20 3d 20 70 52 74 2d 3e 75 2e  pFrame = pRt->u.
2a5c0 70 46 72 61 6d 65 3b 0a 20 20 20 20 61 73 73 65  pFrame;.    asse
2a5d0 72 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d  rt( pProgram->nM
2a5e0 65 6d 2b 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73  em+pProgram->nCs
2a5f0 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c  r==pFrame->nChil
2a600 64 4d 65 6d 20 29 3b 0a 20 20 20 20 61 73 73 65  dMem );.    asse
2a610 72 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43  rt( pProgram->nC
2a620 73 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68 69  sr==pFrame->nChi
2a630 6c 64 43 73 72 20 29 3b 0a 20 20 20 20 61 73 73  ldCsr );.    ass
2a640 65 72 74 28 20 70 63 3d 3d 70 46 72 61 6d 65 2d  ert( pc==pFrame-
2a650 3e 70 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d  >pc );.  }..  p-
2a660 3e 6e 46 72 61 6d 65 2b 2b 3b 0a 20 20 70 46 72  >nFrame++;.  pFr
2a670 61 6d 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  ame->pParent = p
2a680 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 70 46 72 61  ->pFrame;.  pFra
2a690 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  me->lastRowid = 
2a6a0 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 70 46 72  lastRowid;.  pFr
2a6b0 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70  ame->nChange = p
2a6c0 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 70 2d 3e  ->nChange;.  p->
2a6d0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70  nChange = 0;.  p
2a6e0 2d 3e 70 46 72 61 6d 65 20 3d 20 70 46 72 61 6d  ->pFrame = pFram
2a6f0 65 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61  e;.  p->aMem = a
2a700 4d 65 6d 20 3d 20 26 56 64 62 65 46 72 61 6d 65  Mem = &VdbeFrame
2a710 4d 65 6d 28 70 46 72 61 6d 65 29 5b 2d 31 5d 3b  Mem(pFrame)[-1];
2a720 0a 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72  .  p->nMem = pFr
2a730 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 3b 0a  ame->nChildMem;.
2a740 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28    p->nCursor = (
2a750 75 31 36 29 70 46 72 61 6d 65 2d 3e 6e 43 68 69  u16)pFrame->nChi
2a760 6c 64 43 73 72 3b 0a 20 20 70 2d 3e 61 70 43 73  ldCsr;.  p->apCs
2a770 72 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20  r = (VdbeCursor 
2a780 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d  **)&aMem[p->nMem
2a790 2b 31 5d 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20  +1];.  p->aOp = 
2a7a0 61 4f 70 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e  aOp = pProgram->
2a7b0 61 4f 70 3b 0a 20 20 70 2d 3e 6e 4f 70 20 3d 20  aOp;.  p->nOp = 
2a7c0 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3b 0a 20  pProgram->nOp;. 
2a7d0 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20   p->aOnceFlag = 
2a7e0 28 75 38 20 2a 29 26 70 2d 3e 61 70 43 73 72 5b  (u8 *)&p->apCsr[
2a7f0 70 2d 3e 6e 43 75 72 73 6f 72 5d 3b 0a 20 20 70  p->nCursor];.  p
2a800 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 50  ->nOnceFlag = pP
2a810 72 6f 67 72 61 6d 2d 3e 6e 4f 6e 63 65 3b 0a 20  rogram->nOnce;. 
2a820 20 70 63 20 3d 20 2d 31 3b 0a 20 20 6d 65 6d 73   pc = -1;.  mems
2a830 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c  et(p->aOnceFlag,
2a840 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67   0, p->nOnceFlag
2a850 29 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  );..  break;.}..
2a860 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61 72 61 6d  /* Opcode: Param
2a870 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
2a880 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69  ** This opcode i
2a890 73 20 6f 6e 6c 79 20 65 76 65 72 20 70 72 65 73  s only ever pres
2a8a0 65 6e 74 20 69 6e 20 73 75 62 2d 70 72 6f 67 72  ent in sub-progr
2a8b0 61 6d 73 20 63 61 6c 6c 65 64 20 76 69 61 20 74  ams called via t
2a8c0 68 65 20 0a 2a 2a 20 4f 50 5f 50 72 6f 67 72 61  he .** OP_Progra
2a8d0 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 43  m instruction. C
2a8e0 6f 70 79 20 61 20 76 61 6c 75 65 20 63 75 72 72  opy a value curr
2a8f0 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
2a900 61 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c  a memory .** cel
2a910 6c 20 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e 67  l of the calling
2a920 20 28 70 61 72 65 6e 74 29 20 66 72 61 6d 65 20   (parent) frame 
2a930 74 6f 20 63 65 6c 6c 20 50 32 20 69 6e 20 74 68  to cell P2 in th
2a940 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 73  e current frames
2a950 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61   .** address spa
2a960 63 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  ce. This is used
2a970 20 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67   by trigger prog
2a980 72 61 6d 73 20 74 6f 20 61 63 63 65 73 73 20 74  rams to access t
2a990 68 65 20 6e 65 77 2e 2a 20 0a 2a 2a 20 61 6e 64  he new.* .** and
2a9a0 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 2e 0a 2a   old.* values..*
2a9b0 2a 0a 2a 2a 20 54 68 65 20 61 64 64 72 65 73 73  *.** The address
2a9c0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 6e 20   of the cell in 
2a9d0 74 68 65 20 70 61 72 65 6e 74 20 66 72 61 6d 65  the parent frame
2a9e0 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
2a9f0 79 20 61 64 64 69 6e 67 0a 2a 2a 20 74 68 65 20  y adding.** the 
2aa00 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20  value of the P1 
2aa10 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
2aa20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20  value of the P1 
2aa30 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a  argument to the.
2aa40 2a 2a 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50 72  ** calling OP_Pr
2aa50 6f 67 72 61 6d 20 69 6e 73 74 72 75 63 74 69 6f  ogram instructio
2aa60 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 61  n..*/.case OP_Pa
2aa70 72 61 6d 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ram: {          
2aa80 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65   /* out2-prerele
2aa90 61 73 65 20 2a 2f 0a 20 20 56 64 62 65 46 72 61  ase */.  VdbeFra
2aaa0 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 4d 65  me *pFrame;.  Me
2aab0 6d 20 2a 70 49 6e 3b 0a 20 20 70 46 72 61 6d 65  m *pIn;.  pFrame
2aac0 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20   = p->pFrame;.  
2aad0 70 49 6e 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61  pIn = &pFrame->a
2aae0 4d 65 6d 5b 70 4f 70 2d 3e 70 31 20 2b 20 70 46  Mem[pOp->p1 + pF
2aaf0 72 61 6d 65 2d 3e 61 4f 70 5b 70 46 72 61 6d 65  rame->aOp[pFrame
2ab00 2d 3e 70 63 5d 2e 70 31 5d 3b 20 20 20 0a 20 20  ->pc].p1];   .  
2ab10 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
2ab20 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20  allowCopy(pOut, 
2ab30 70 49 6e 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  pIn, MEM_Ephem);
2ab40 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 65 6e  .  break;.}..#en
2ab50 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
2ab60 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
2ab70 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ER */..#ifndef S
2ab80 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
2ab90 47 4e 5f 4b 45 59 0a 2f 2a 20 4f 70 63 6f 64 65  GN_KEY./* Opcode
2aba0 3a 20 46 6b 43 6f 75 6e 74 65 72 20 50 31 20 50  : FkCounter P1 P
2abb0 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e  2 * * *.**.** In
2abc0 63 72 65 6d 65 6e 74 20 61 20 22 63 6f 6e 73 74  crement a "const
2abd0 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 22 20 62  raint counter" b
2abe0 79 20 50 32 20 28 50 32 20 6d 61 79 20 62 65 20  y P2 (P2 may be 
2abf0 6e 65 67 61 74 69 76 65 20 6f 72 20 70 6f 73 69  negative or posi
2ac00 74 69 76 65 29 2e 0a 2a 2a 20 49 66 20 50 31 20  tive)..** If P1 
2ac10 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2ac20 20 64 61 74 61 62 61 73 65 20 63 6f 6e 73 74 72   database constr
2ac30 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 69 73 20  aint counter is 
2ac40 69 6e 63 72 65 6d 65 6e 74 65 64 20 0a 2a 2a 20  incremented .** 
2ac50 28 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67  (deferred foreig
2ac60 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
2ac70 73 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  s). Otherwise, i
2ac80 66 20 50 31 20 69 73 20 7a 65 72 6f 2c 20 74 68  f P1 is zero, th
2ac90 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  e .** statement 
2aca0 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 63 72 65  counter is incre
2acb0 6d 65 6e 74 65 64 20 28 69 6d 6d 65 64 69 61 74  mented (immediat
2acc0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
2acd0 6e 73 74 72 61 69 6e 74 73 29 2e 0a 2a 2f 0a 63  nstraints)..*/.c
2ace0 61 73 65 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  ase OP_FkCounter
2acf0 3a 20 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c  : {.  if( db->fl
2ad00 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44 65 66  ags & SQLITE_Def
2ad10 65 72 46 4b 73 20 29 7b 0a 20 20 20 20 64 62 2d  erFKs ){.    db-
2ad20 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
2ad30 73 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  s += pOp->p2;.  
2ad40 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 70  }else if( pOp->p
2ad50 31 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65  1 ){.    db->nDe
2ad60 66 65 72 72 65 64 43 6f 6e 73 20 2b 3d 20 70 4f  ferredCons += pO
2ad70 70 2d 3e 70 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p->p2;.  }else{.
2ad80 20 20 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72      p->nFkConstr
2ad90 61 69 6e 74 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b  aint += pOp->p2;
2ada0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
2adb0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6b 49 66  ./* Opcode: FkIf
2adc0 5a 65 72 6f 20 50 31 20 50 32 20 2a 20 2a 20 2a  Zero P1 P2 * * *
2add0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
2ade0 64 65 20 74 65 73 74 73 20 69 66 20 61 20 66 6f  de tests if a fo
2adf0 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
2ae00 61 69 6e 74 2d 63 6f 75 6e 74 65 72 20 69 73 20  aint-counter is 
2ae10 63 75 72 72 65 6e 74 6c 79 20 7a 65 72 6f 2e 0a  currently zero..
2ae20 2a 2a 20 49 66 20 73 6f 2c 20 6a 75 6d 70 20 74  ** If so, jump t
2ae30 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32  o instruction P2
2ae40 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c  . Otherwise, fal
2ae50 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
2ae60 20 6e 65 78 74 20 0a 2a 2a 20 69 6e 73 74 72 75   next .** instru
2ae70 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
2ae80 50 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  P1 is non-zero, 
2ae90 74 68 65 6e 20 74 68 65 20 6a 75 6d 70 20 69 73  then the jump is
2aea0 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20 64 61   taken if the da
2aeb0 74 61 62 61 73 65 20 63 6f 6e 73 74 72 61 69 6e  tabase constrain
2aec0 74 2d 63 6f 75 6e 74 65 72 0a 2a 2a 20 69 73 20  t-counter.** is 
2aed0 7a 65 72 6f 20 28 74 68 65 20 6f 6e 65 20 74 68  zero (the one th
2aee0 61 74 20 63 6f 75 6e 74 73 20 64 65 66 65 72 72  at counts deferr
2aef0 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69  ed constraint vi
2af00 6f 6c 61 74 69 6f 6e 73 29 2e 20 49 66 20 50 31  olations). If P1
2af10 20 69 73 0a 2a 2a 20 7a 65 72 6f 2c 20 74 68 65   is.** zero, the
2af20 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69   jump is taken i
2af30 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
2af40 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74  constraint-count
2af50 65 72 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 69  er is zero.** (i
2af60 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
2af70 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
2af80 76 69 6f 6c 61 74 69 6f 6e 73 29 2e 0a 2a 2f 0a  violations)..*/.
2af90 63 61 73 65 20 4f 50 5f 46 6b 49 66 5a 65 72 6f  case OP_FkIfZero
2afa0 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6a  : {         /* j
2afb0 75 6d 70 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70  ump */.  if( pOp
2afc0 2d 3e 70 31 20 29 7b 0a 20 20 20 20 69 66 28 20  ->p1 ){.    if( 
2afd0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
2afe0 73 3d 3d 30 20 26 26 20 64 62 2d 3e 6e 44 65 66  s==0 && db->nDef
2aff0 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 20  erredImmCons==0 
2b000 29 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31  ) pc = pOp->p2-1
2b010 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2b020 66 28 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  f( p->nFkConstra
2b030 69 6e 74 3d 3d 30 20 26 26 20 64 62 2d 3e 6e 44  int==0 && db->nD
2b040 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d  eferredImmCons==
2b050 30 20 29 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32  0 ) pc = pOp->p2
2b060 2d 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  -1;.  }.  break;
2b070 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66  .}.#endif /* #if
2b080 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b090 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20 2a 2f 0a  _FOREIGN_KEY */.
2b0a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b0b0 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
2b0c0 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 65  NT./* Opcode: Me
2b0d0 6d 4d 61 78 20 50 31 20 50 32 20 2a 20 2a 20 2a  mMax P1 P2 * * *
2b0e0 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 72  .**.** P1 is a r
2b0f0 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72  egister in the r
2b100 6f 6f 74 20 66 72 61 6d 65 20 6f 66 20 74 68 69  oot frame of thi
2b110 73 20 56 4d 20 28 74 68 65 20 72 6f 6f 74 20 66  s VM (the root f
2b120 72 61 6d 65 20 69 73 0a 2a 2a 20 64 69 66 66 65  rame is.** diffe
2b130 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 63 75  rent from the cu
2b140 72 72 65 6e 74 20 66 72 61 6d 65 20 69 66 20 74  rrent frame if t
2b150 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
2b160 69 73 20 62 65 69 6e 67 20 65 78 65 63 75 74 65  is being execute
2b170 64 0a 2a 2a 20 77 69 74 68 69 6e 20 61 20 73 75  d.** within a su
2b180 62 2d 70 72 6f 67 72 61 6d 29 2e 20 53 65 74 20  b-program). Set 
2b190 74 68 65 20 76 61 6c 75 65 20 6f 66 20 72 65 67  the value of reg
2b1a0 69 73 74 65 72 20 50 31 20 74 6f 20 74 68 65 20  ister P1 to the 
2b1b0 6d 61 78 69 6d 75 6d 20 6f 66 20 0a 2a 2a 20 69  maximum of .** i
2b1c0 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
2b1d0 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 69   and the value i
2b1e0 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  n register P2..*
2b1f0 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75  *.** This instru
2b200 63 74 69 6f 6e 20 74 68 72 6f 77 73 20 61 6e 20  ction throws an 
2b210 65 72 72 6f 72 20 69 66 20 74 68 65 20 6d 65 6d  error if the mem
2b220 6f 72 79 20 63 65 6c 6c 20 69 73 20 6e 6f 74 20  ory cell is not 
2b230 69 6e 69 74 69 61 6c 6c 79 0a 2a 2a 20 61 6e 20  initially.** an 
2b240 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 63 61 73 65  integer..*/.case
2b250 20 4f 50 5f 4d 65 6d 4d 61 78 3a 20 7b 20 20 20   OP_MemMax: {   
2b260 20 20 20 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20       /* in2 */. 
2b270 20 4d 65 6d 20 2a 70 49 6e 31 3b 0a 20 20 56 64   Mem *pIn1;.  Vd
2b280 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b  beFrame *pFrame;
2b290 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65  .  if( p->pFrame
2b2a0 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 46 72 61   ){.    for(pFra
2b2b0 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46  me=p->pFrame; pF
2b2c0 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70  rame->pParent; p
2b2d0 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50  Frame=pFrame->pP
2b2e0 61 72 65 6e 74 29 3b 0a 20 20 20 20 70 49 6e 31  arent);.    pIn1
2b2f0 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d   = &pFrame->aMem
2b300 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 7d 65 6c  [pOp->p1];.  }el
2b310 73 65 7b 0a 20 20 20 20 70 49 6e 31 20 3d 20 26  se{.    pIn1 = &
2b320 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
2b330 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d   }.  assert( mem
2b340 49 73 56 61 6c 69 64 28 70 49 6e 31 29 20 29 3b  IsValid(pIn1) );
2b350 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
2b360 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 31  mIntegerify(pIn1
2b370 29 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65  );.  pIn2 = &aMe
2b380 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71  m[pOp->p2];.  sq
2b390 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65  lite3VdbeMemInte
2b3a0 67 65 72 69 66 79 28 70 49 6e 32 29 3b 0a 20 20  gerify(pIn2);.  
2b3b0 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3c 70 49  if( pIn1->u.i<pI
2b3c0 6e 32 2d 3e 75 2e 69 29 7b 0a 20 20 20 20 70 49  n2->u.i){.    pI
2b3d0 6e 31 2d 3e 75 2e 69 20 3d 20 70 49 6e 32 2d 3e  n1->u.i = pIn2->
2b3e0 75 2e 69 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  u.i;.  }.  break
2b3f0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2b400 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
2b410 43 52 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 20 4f  CREMENT */../* O
2b420 70 63 6f 64 65 3a 20 49 66 50 6f 73 20 50 31 20  pcode: IfPos P1 
2b430 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49  P2 * * *.**.** I
2b440 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 72  f the value of r
2b450 65 67 69 73 74 65 72 20 50 31 20 69 73 20 31 20  egister P1 is 1 
2b460 6f 72 20 67 72 65 61 74 65 72 2c 20 6a 75 6d 70  or greater, jump
2b470 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 74   to P2..**.** It
2b480 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 75   is illegal to u
2b490 73 65 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  se this instruct
2b4a0 69 6f 6e 20 6f 6e 20 61 20 72 65 67 69 73 74 65  ion on a registe
2b4b0 72 20 74 68 61 74 20 64 6f 65 73 0a 2a 2a 20 6e  r that does.** n
2b4c0 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e  ot contain an in
2b4d0 74 65 67 65 72 2e 20 20 41 6e 20 61 73 73 65 72  teger.  An asser
2b4e0 74 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c 20  tion fault will 
2b4f0 72 65 73 75 6c 74 20 69 66 20 79 6f 75 20 74 72  result if you tr
2b500 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66  y..*/.case OP_If
2b510 50 6f 73 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  Pos: {        /*
2b520 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20   jump, in1 */.  
2b530 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
2b540 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2b550 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d   pIn1->flags&MEM
2b560 5f 49 6e 74 20 29 3b 0a 20 20 69 66 28 20 70 49  _Int );.  if( pI
2b570 6e 31 2d 3e 75 2e 69 3e 30 20 29 7b 0a 20 20 20  n1->u.i>0 ){.   
2b580 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
2b590 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   1;.  }.  break;
2b5a0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .}../* Opcode: I
2b5b0 66 4e 65 67 20 50 31 20 50 32 20 2a 20 2a 20 2a  fNeg P1 P2 * * *
2b5c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 76 61  .**.** If the va
2b5d0 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20  lue of register 
2b5e0 50 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  P1 is less than 
2b5f0 7a 65 72 6f 2c 20 6a 75 6d 70 20 74 6f 20 50 32  zero, jump to P2
2b600 2e 20 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  . .**.** It is i
2b610 6c 6c 65 67 61 6c 20 74 6f 20 75 73 65 20 74 68  llegal to use th
2b620 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f  is instruction o
2b630 6e 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61  n a register tha
2b640 74 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  t does.** not co
2b650 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72  ntain an integer
2b660 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
2b670 66 61 75 6c 74 20 77 69 6c 6c 20 72 65 73 75 6c  fault will resul
2b680 74 20 69 66 20 79 6f 75 20 74 72 79 2e 0a 2a 2f  t if you try..*/
2b690 0a 63 61 73 65 20 4f 50 5f 49 66 4e 65 67 3a 20  .case OP_IfNeg: 
2b6a0 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
2b6b0 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  , in1 */.  pIn1 
2b6c0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
2b6d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31  ;.  assert( pIn1
2b6e0 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ->flags&MEM_Int 
2b6f0 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75  );.  if( pIn1->u
2b700 2e 69 3c 30 20 29 7b 0a 20 20 20 20 20 70 63 20  .i<0 ){.     pc 
2b710 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
2b720 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
2b730 2a 20 4f 70 63 6f 64 65 3a 20 49 66 5a 65 72 6f  * Opcode: IfZero
2b740 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
2b750 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74 65 72  .** The register
2b760 20 50 31 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e   P1 must contain
2b770 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 41 64   an integer.  Ad
2b780 64 20 6c 69 74 65 72 61 6c 20 50 33 20 74 6f 20  d literal P3 to 
2b790 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20  the.** value in 
2b7a0 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 49 66  register P1.  If
2b7b0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 65   the result is e
2b7c0 78 61 63 74 6c 79 20 30 2c 20 6a 75 6d 70 20 74  xactly 0, jump t
2b7d0 6f 20 50 32 2e 20 0a 2a 2a 0a 2a 2a 20 49 74 20  o P2. .**.** It 
2b7e0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 75 73  is illegal to us
2b7f0 65 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  e this instructi
2b800 6f 6e 20 6f 6e 20 61 20 72 65 67 69 73 74 65 72  on on a register
2b810 20 74 68 61 74 20 64 6f 65 73 0a 2a 2a 20 6e 6f   that does.** no
2b820 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74  t contain an int
2b830 65 67 65 72 2e 20 20 41 6e 20 61 73 73 65 72 74  eger.  An assert
2b840 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c 20 72  ion fault will r
2b850 65 73 75 6c 74 20 69 66 20 79 6f 75 20 74 72 79  esult if you try
2b860 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 5a  ..*/.case OP_IfZ
2b870 65 72 6f 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  ero: {        /*
2b880 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20   jump, in1 */.  
2b890 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
2b8a0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2b8b0 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d   pIn1->flags&MEM
2b8c0 5f 49 6e 74 20 29 3b 0a 20 20 70 49 6e 31 2d 3e  _Int );.  pIn1->
2b8d0 75 2e 69 20 2b 3d 20 70 4f 70 2d 3e 70 33 3b 0a  u.i += pOp->p3;.
2b8e0 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3d    if( pIn1->u.i=
2b8f0 3d 30 20 29 7b 0a 20 20 20 20 20 70 63 20 3d 20  =0 ){.     pc = 
2b900 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d  pOp->p2 - 1;.  }
2b910 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
2b920 4f 70 63 6f 64 65 3a 20 41 67 67 53 74 65 70 20  Opcode: AggStep 
2b930 2a 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  * P2 P3 P4 P5.**
2b940 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20  .** Execute the 
2b950 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f  step function fo
2b960 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  r an aggregate. 
2b970 20 54 68 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e   The.** function
2b980 20 68 61 73 20 50 35 20 61 72 67 75 6d 65 6e 74   has P5 argument
2b990 73 2e 20 20 20 50 34 20 69 73 20 61 20 70 6f 69  s.   P4 is a poi
2b9a0 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63  nter to the Func
2b9b0 44 65 66 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  Def.** structure
2b9c0 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73 20   that specifies 
2b9d0 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 55  the function.  U
2b9e0 73 65 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 50  se register.** P
2b9f0 33 20 61 73 20 74 68 65 20 61 63 63 75 6d 75 6c  3 as the accumul
2ba00 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
2ba10 50 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  P5 arguments are
2ba20 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69   taken from regi
2ba30 73 74 65 72 20 50 32 20 61 6e 64 20 69 74 73 0a  ster P2 and its.
2ba40 2a 2a 20 73 75 63 63 65 73 73 6f 72 73 2e 0a 2a  ** successors..*
2ba50 2f 0a 63 61 73 65 20 4f 50 5f 41 67 67 53 74 65  /.case OP_AggSte
2ba60 70 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  p: {.  int n;.  
2ba70 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 70 4d  int i;.  Mem *pM
2ba80 65 6d 3b 0a 20 20 4d 65 6d 20 2a 70 52 65 63 3b  em;.  Mem *pRec;
2ba90 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
2baa0 78 74 20 63 74 78 3b 0a 20 20 73 71 6c 69 74 65  xt ctx;.  sqlite
2bab0 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 3b  3_value **apVal;
2bac0 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 35 3b  ..  n = pOp->p5;
2bad0 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20  .  assert( n>=0 
2bae0 29 3b 0a 20 20 70 52 65 63 20 3d 20 26 61 4d 65  );.  pRec = &aMe
2baf0 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 70  m[pOp->p2];.  ap
2bb00 56 61 6c 20 3d 20 70 2d 3e 61 70 41 72 67 3b 0a  Val = p->apArg;.
2bb10 20 20 61 73 73 65 72 74 28 20 61 70 56 61 6c 20    assert( apVal 
2bb20 7c 7c 20 6e 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  || n==0 );.  for
2bb30 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20  (i=0; i<n; i++, 
2bb40 70 52 65 63 2b 2b 29 7b 0a 20 20 20 20 61 73 73  pRec++){.    ass
2bb50 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
2bb60 70 52 65 63 29 20 29 3b 0a 20 20 20 20 61 70 56  pRec) );.    apV
2bb70 61 6c 5b 69 5d 20 3d 20 70 52 65 63 3b 0a 20 20  al[i] = pRec;.  
2bb80 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
2bb90 67 65 28 70 2c 20 70 52 65 63 29 3b 0a 20 20 20  ge(p, pRec);.   
2bba0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
2bbb0 74 6f 72 65 54 79 70 65 28 70 52 65 63 29 3b 0a  toreType(pRec);.
2bbc0 20 20 7d 0a 20 20 63 74 78 2e 70 46 75 6e 63 20    }.  ctx.pFunc 
2bbd0 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b  = pOp->p4.pFunc;
2bbe0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2bbf0 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c  p3>0 && pOp->p3<
2bc00 3d 28 70 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75  =(p->nMem-p->nCu
2bc10 72 73 6f 72 29 20 29 3b 0a 20 20 63 74 78 2e 70  rsor) );.  ctx.p
2bc20 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d 20 26 61 4d  Mem = pMem = &aM
2bc30 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70  em[pOp->p3];.  p
2bc40 4d 65 6d 2d 3e 6e 2b 2b 3b 0a 20 20 63 74 78 2e  Mem->n++;.  ctx.
2bc50 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  s.flags = MEM_Nu
2bc60 6c 6c 3b 0a 20 20 63 74 78 2e 73 2e 7a 20 3d 20  ll;.  ctx.s.z = 
2bc70 30 3b 0a 20 20 63 74 78 2e 73 2e 7a 4d 61 6c 6c  0;.  ctx.s.zMall
2bc80 6f 63 20 3d 20 30 3b 0a 20 20 63 74 78 2e 73 2e  oc = 0;.  ctx.s.
2bc90 78 44 65 6c 20 3d 20 30 3b 0a 20 20 63 74 78 2e  xDel = 0;.  ctx.
2bca0 73 2e 64 62 20 3d 20 64 62 3b 0a 20 20 63 74 78  s.db = db;.  ctx
2bcb0 2e 69 73 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20  .isError = 0;.  
2bcc0 63 74 78 2e 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  ctx.pColl = 0;. 
2bcd0 20 63 74 78 2e 73 6b 69 70 46 6c 61 67 20 3d 20   ctx.skipFlag = 
2bce0 30 3b 0a 20 20 69 66 28 20 63 74 78 2e 70 46 75  0;.  if( ctx.pFu
2bcf0 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
2bd00 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
2bd10 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 61 73 73 65  COLL ){.    asse
2bd20 72 74 28 20 70 4f 70 3e 70 2d 3e 61 4f 70 20 29  rt( pOp>p->aOp )
2bd30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
2bd40 70 5b 2d 31 5d 2e 70 34 74 79 70 65 3d 3d 50 34  p[-1].p4type==P4
2bd50 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 20 20  _COLLSEQ );.    
2bd60 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
2bd70 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53  opcode==OP_CollS
2bd80 65 71 20 29 3b 0a 20 20 20 20 63 74 78 2e 70 43  eq );.    ctx.pC
2bd90 6f 6c 6c 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 34  oll = pOp[-1].p4
2bda0 2e 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 28 63  .pColl;.  }.  (c
2bdb0 74 78 2e 70 46 75 6e 63 2d 3e 78 53 74 65 70 29  tx.pFunc->xStep)
2bdc0 28 26 63 74 78 2c 20 6e 2c 20 61 70 56 61 6c 29  (&ctx, n, apVal)
2bdd0 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 34 35 30  ; /* IMP: R-2450
2bde0 35 2d 32 33 32 33 30 20 2a 2f 0a 20 20 69 66 28  5-23230 */.  if(
2bdf0 20 63 74 78 2e 69 73 45 72 72 6f 72 20 29 7b 0a   ctx.isError ){.
2be00 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
2be10 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
2be20 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69  , db, "%s", sqli
2be30 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 26  te3_value_text(&
2be40 63 74 78 2e 73 29 29 3b 0a 20 20 20 20 72 63 20  ctx.s));.    rc 
2be50 3d 20 63 74 78 2e 69 73 45 72 72 6f 72 3b 0a 20  = ctx.isError;. 
2be60 20 7d 0a 20 20 69 66 28 20 63 74 78 2e 73 6b 69   }.  if( ctx.ski
2be70 70 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 73 73  pFlag ){.    ass
2be80 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
2be90 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71 20  ode==OP_CollSeq 
2bea0 29 3b 0a 20 20 20 20 69 20 3d 20 70 4f 70 5b 2d  );.    i = pOp[-
2beb0 31 5d 2e 70 31 3b 0a 20 20 20 20 69 66 28 20 69  1].p1;.    if( i
2bec0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   ) sqlite3VdbeMe
2bed0 6d 53 65 74 49 6e 74 36 34 28 26 61 4d 65 6d 5b  mSetInt64(&aMem[
2bee0 69 5d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 73  i], 1);.  }..  s
2bef0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
2bf00 65 61 73 65 28 26 63 74 78 2e 73 29 3b 0a 0a 20  ease(&ctx.s);.. 
2bf10 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
2bf20 63 6f 64 65 3a 20 41 67 67 46 69 6e 61 6c 20 50  code: AggFinal P
2bf30 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  1 P2 * P4 *.**.*
2bf40 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 66 69  * Execute the fi
2bf50 6e 61 6c 69 7a 65 72 20 66 75 6e 63 74 69 6f 6e  nalizer function
2bf60 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
2bf70 65 2e 20 20 50 31 20 69 73 0a 2a 2a 20 74 68 65  e.  P1 is.** the
2bf80 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2bf90 20 74 68 61 74 20 69 73 20 74 68 65 20 61 63 63   that is the acc
2bfa0 75 6d 75 6c 61 74 6f 72 20 66 6f 72 20 74 68 65  umulator for the
2bfb0 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a   aggregate..**.*
2bfc0 2a 20 50 32 20 69 73 20 74 68 65 20 6e 75 6d 62  * P2 is the numb
2bfd0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2bfe0 74 68 61 74 20 74 68 65 20 73 74 65 70 20 66 75  that the step fu
2bff0 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 61 6e 64  nction takes and
2c000 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e  .** P4 is a poin
2c010 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44  ter to the FuncD
2c020 65 66 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63  ef for this func
2c030 74 69 6f 6e 2e 20 20 54 68 65 20 50 32 0a 2a 2a  tion.  The P2.**
2c040 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
2c050 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6f 70   used by this op
2c060 63 6f 64 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c  code.  It is onl
2c070 79 20 74 68 65 72 65 20 74 6f 20 64 69 73 61 6d  y there to disam
2c080 62 69 67 75 61 74 65 0a 2a 2a 20 66 75 6e 63 74  biguate.** funct
2c090 69 6f 6e 73 20 74 68 61 74 20 63 61 6e 20 74 61  ions that can ta
2c0a0 6b 65 20 76 61 72 79 69 6e 67 20 6e 75 6d 62 65  ke varying numbe
2c0b0 72 73 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  rs of arguments.
2c0c0 20 20 54 68 65 0a 2a 2a 20 50 34 20 61 72 67 75    The.** P4 argu
2c0d0 6d 65 6e 74 20 69 73 20 6f 6e 6c 79 20 6e 65 65  ment is only nee
2c0e0 64 65 64 20 66 6f 72 20 74 68 65 20 64 65 67 65  ded for the dege
2c0f0 6e 65 72 61 74 65 20 63 61 73 65 20 77 68 65 72  nerate case wher
2c100 65 0a 2a 2a 20 74 68 65 20 73 74 65 70 20 66 75  e.** the step fu
2c110 6e 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 70  nction was not p
2c120 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64  reviously called
2c130 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 67 67  ..*/.case OP_Agg
2c140 46 69 6e 61 6c 3a 20 7b 0a 20 20 4d 65 6d 20 2a  Final: {.  Mem *
2c150 70 4d 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  pMem;.  assert( 
2c160 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70  pOp->p1>0 && pOp
2c170 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d 70  ->p1<=(p->nMem-p
2c180 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
2c190 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pMem = &aMem[pOp
2c1a0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2c1b0 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
2c1c0 7e 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 41  ~(MEM_Null|MEM_A
2c1d0 67 67 29 29 3d 3d 30 20 29 3b 0a 20 20 72 63 20  gg))==0 );.  rc 
2c1e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
2c1f0 46 69 6e 61 6c 69 7a 65 28 70 4d 65 6d 2c 20 70  Finalize(pMem, p
2c200 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 29 3b 0a 20  Op->p4.pFunc);. 
2c210 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
2c220 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
2c230 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
2c240 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76   "%s", sqlite3_v
2c250 61 6c 75 65 5f 74 65 78 74 28 70 4d 65 6d 29 29  alue_text(pMem))
2c260 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
2c270 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e  dbeChangeEncodin
2c280 67 28 70 4d 65 6d 2c 20 65 6e 63 6f 64 69 6e 67  g(pMem, encoding
2c290 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  );.  UPDATE_MAX_
2c2a0 42 4c 4f 42 53 49 5a 45 28 70 4d 65 6d 29 3b 0a  BLOBSIZE(pMem);.
2c2b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
2c2c0 65 4d 65 6d 54 6f 6f 42 69 67 28 70 4d 65 6d 29  eMemTooBig(pMem)
2c2d0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f   ){.    goto too
2c2e0 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 62 72 65 61  _big;.  }.  brea
2c2f0 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  k;.}..#ifndef SQ
2c300 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
2c310 20 4f 70 63 6f 64 65 3a 20 43 68 65 63 6b 70 6f   Opcode: Checkpo
2c320 69 6e 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a  int P1 P2 P3 * *
2c330 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  .**.** Checkpoin
2c340 74 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 54  t database P1. T
2c350 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
2c360 66 20 50 31 20 69 73 20 6e 6f 74 20 63 75 72 72  f P1 is not curr
2c370 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 57 41 4c 20  ently in.** WAL 
2c380 6d 6f 64 65 2e 20 50 61 72 61 6d 65 74 65 72 20  mode. Parameter 
2c390 50 32 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c  P2 is one of SQL
2c3a0 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
2c3b0 41 53 53 49 56 45 2c 20 46 55 4c 4c 0a 2a 2a 20  ASSIVE, FULL.** 
2c3c0 6f 72 20 52 45 53 54 41 52 54 2e 20 20 57 72 69  or RESTART.  Wri
2c3d0 74 65 20 31 20 6f 72 20 30 20 69 6e 74 6f 20 6d  te 1 or 0 into m
2c3e0 65 6d 5b 50 33 5d 20 69 66 20 74 68 65 20 63 68  em[P3] if the ch
2c3f0 65 63 6b 70 6f 69 6e 74 20 72 65 74 75 72 6e 73  eckpoint returns
2c400 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
2c410 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65 63 74 69  or not, respecti
2c420 76 65 6c 79 2e 20 20 57 72 69 74 65 20 74 68 65  vely.  Write the
2c430 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
2c440 20 69 6e 20 74 68 65 0a 2a 2a 20 57 41 4c 20 61   in the.** WAL a
2c450 66 74 65 72 20 74 68 65 20 63 68 65 63 6b 70 6f  fter the checkpo
2c460 69 6e 74 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b  int into mem[P3+
2c470 31 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  1] and the numbe
2c480 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e  r of pages.** in
2c490 20 74 68 65 20 57 41 4c 20 74 68 61 74 20 68 61   the WAL that ha
2c4a0 76 65 20 62 65 65 6e 20 63 68 65 63 6b 70 6f 69  ve been checkpoi
2c4b0 6e 74 65 64 20 61 66 74 65 72 20 74 68 65 20 63  nted after the c
2c4c0 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 63 6f 6d  heckpoint.** com
2c4d0 70 6c 65 74 65 73 20 69 6e 74 6f 20 6d 65 6d 5b  pletes into mem[
2c4e0 50 33 2b 32 5d 2e 20 20 48 6f 77 65 76 65 72 20  P3+2].  However 
2c4f0 6f 6e 20 61 6e 20 65 72 72 6f 72 2c 20 6d 65 6d  on an error, mem
2c500 5b 50 33 2b 31 5d 20 61 6e 64 0a 2a 2a 20 6d 65  [P3+1] and.** me
2c510 6d 5b 50 33 2b 32 5d 20 61 72 65 20 69 6e 69 74  m[P3+2] are init
2c520 69 61 6c 69 7a 65 64 20 74 6f 20 2d 31 2e 0a 2a  ialized to -1..*
2c530 2f 0a 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70  /.case OP_Checkp
2c540 6f 69 6e 74 3a 20 7b 0a 20 20 69 6e 74 20 69 3b  oint: {.  int i;
2c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2c570 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
2c580 6e 74 20 61 52 65 73 5b 33 5d 3b 20 20 20 20 20  nt aRes[3];     
2c590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c5a0 2a 20 52 65 73 75 6c 74 73 20 2a 2f 0a 20 20 4d  * Results */.  M
2c5b0 65 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20  em *pMem;       
2c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c5d0 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 73 20  * Write results 
2c5e0 68 65 72 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  here */..  asser
2c5f0 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  t( p->readOnly==
2c600 30 20 29 3b 0a 20 20 61 52 65 73 5b 30 5d 20 3d  0 );.  aRes[0] =
2c610 20 30 3b 0a 20 20 61 52 65 73 5b 31 5d 20 3d 20   0;.  aRes[1] = 
2c620 61 52 65 73 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20  aRes[2] = -1;.  
2c630 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d  assert( pOp->p2=
2c640 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  =SQLITE_CHECKPOI
2c650 4e 54 5f 50 41 53 53 49 56 45 0a 20 20 20 20 20  NT_PASSIVE.     
2c660 20 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53 51    || pOp->p2==SQ
2c670 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
2c680 46 55 4c 4c 0a 20 20 20 20 20 20 20 7c 7c 20 70  FULL.       || p
2c690 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43  Op->p2==SQLITE_C
2c6a0 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
2c6b0 54 0a 20 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  T.  );.  rc = sq
2c6c0 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
2c6d0 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  db, pOp->p1, pOp
2c6e0 2d 3e 70 32 2c 20 26 61 52 65 73 5b 31 5d 2c 20  ->p2, &aRes[1], 
2c6f0 26 61 52 65 73 5b 32 5d 29 3b 0a 20 20 69 66 28  &aRes[2]);.  if(
2c700 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
2c710 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
2c720 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 61 52 65 73  ITE_OK;.    aRes
2c730 5b 30 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66  [0] = 1;.  }.  f
2c740 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 20 3d 20 26  or(i=0, pMem = &
2c750 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 20 69  aMem[pOp->p3]; i
2c760 3c 33 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29  <3; i++, pMem++)
2c770 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
2c780 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 70 4d 65  eMemSetInt64(pMe
2c790 6d 2c 20 28 69 36 34 29 61 52 65 73 5b 69 5d 29  m, (i64)aRes[i])
2c7a0 3b 0a 20 20 7d 20 20 20 20 0a 20 20 62 72 65 61  ;.  }    .  brea
2c7b0 6b 3b 0a 7d 3b 20 20 0a 23 65 6e 64 69 66 0a 0a  k;.};  .#endif..
2c7c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c7d0 4d 49 54 5f 50 52 41 47 4d 41 0a 2f 2a 20 4f 70  MIT_PRAGMA./* Op
2c7e0 63 6f 64 65 3a 20 4a 6f 75 72 6e 61 6c 4d 6f 64  code: JournalMod
2c7f0 65 20 50 31 20 50 32 20 50 33 20 2a 20 50 35 0a  e P1 P2 P3 * P5.
2c800 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  **.** Change the
2c810 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6f 66   journal mode of
2c820 20 64 61 74 61 62 61 73 65 20 50 31 20 74 6f 20   database P1 to 
2c830 50 33 2e 20 50 33 20 6d 75 73 74 20 62 65 20 6f  P3. P3 must be o
2c840 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 50 41 47  ne of the.** PAG
2c850 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58  ER_JOURNALMODE_X
2c860 58 58 20 76 61 6c 75 65 73 2e 20 49 66 20 63 68  XX values. If ch
2c870 61 6e 67 69 6e 67 20 62 65 74 77 65 65 6e 20 74  anging between t
2c880 68 65 20 76 61 72 69 6f 75 73 20 72 6f 6c 6c 62  he various rollb
2c890 61 63 6b 0a 2a 2a 20 6d 6f 64 65 73 20 28 64 65  ack.** modes (de
2c8a0 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65 2c 20  lete, truncate, 
2c8b0 70 65 72 73 69 73 74 2c 20 6f 66 66 20 61 6e 64  persist, off and
2c8c0 20 6d 65 6d 6f 72 79 29 2c 20 74 68 69 73 20 69   memory), this i
2c8d0 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 6f 70  s a simple.** op
2c8e0 65 72 61 74 69 6f 6e 2e 20 4e 6f 20 49 4f 20 69  eration. No IO i
2c8f0 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a  s required..**.*
2c900 2a 20 49 66 20 63 68 61 6e 67 69 6e 67 20 69 6e  * If changing in
2c910 74 6f 20 6f 72 20 6f 75 74 20 6f 66 20 57 41 4c  to or out of WAL
2c920 20 6d 6f 64 65 20 74 68 65 20 70 72 6f 63 65 64   mode the proced
2c930 75 72 65 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70  ure is more comp
2c940 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57  licated..**.** W
2c950 72 69 74 65 20 61 20 73 74 72 69 6e 67 20 63 6f  rite a string co
2c960 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6e  ntaining the fin
2c970 61 6c 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  al journal-mode 
2c980 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
2c990 2a 2f 0a 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e  */.case OP_Journ
2c9a0 61 6c 4d 6f 64 65 3a 20 7b 20 20 20 20 2f 2a 20  alMode: {    /* 
2c9b0 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20  out2-prerelease 
2c9c0 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  */.  Btree *pBt;
2c9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9e0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 6f       /* Btree to
2c9f0 20 63 68 61 6e 67 65 20 6a 6f 75 72 6e 61 6c 20   change journal 
2ca00 6d 6f 64 65 20 6f 66 20 2a 2f 0a 20 20 50 61 67  mode of */.  Pag
2ca10 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20  er *pPager;     
2ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ca30 50 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64  Pager associated
2ca40 20 77 69 74 68 20 70 42 74 20 2a 2f 0a 20 20 69   with pBt */.  i
2ca50 6e 74 20 65 4e 65 77 3b 20 20 20 20 20 20 20 20  nt eNew;        
2ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ca70 2a 20 4e 65 77 20 6a 6f 75 72 6e 61 6c 20 6d 6f  * New journal mo
2ca80 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 6c 64  de */.  int eOld
2ca90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2caa0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
2cab0 6c 64 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20  ld journal mode 
2cac0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2cad0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 63 6f 6e  E_OMIT_WAL.  con
2cae0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2caf0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  me;          /* 
2cb00 4e 61 6d 65 20 6f 66 20 64 61 74 61 62 61 73 65  Name of database
2cb10 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72   file for pPager
2cb20 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 65 4e   */.#endif..  eN
2cb30 65 77 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  ew = pOp->p3;.  
2cb40 61 73 73 65 72 74 28 20 65 4e 65 77 3d 3d 50 41  assert( eNew==PA
2cb50 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2cb60 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 7c  DELETE .       |
2cb70 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f  | eNew==PAGER_JO
2cb80 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
2cb90 54 45 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e  TE .       || eN
2cba0 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ew==PAGER_JOURNA
2cbb0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 0a 20  LMODE_PERSIST . 
2cbc0 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50        || eNew==P
2cbd0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2cbe0 5f 4f 46 46 0a 20 20 20 20 20 20 20 7c 7c 20 65  _OFF.       || e
2cbf0 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  New==PAGER_JOURN
2cc00 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a 20 20  ALMODE_MEMORY.  
2cc10 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41       || eNew==PA
2cc20 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2cc30 57 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e  WAL.       || eN
2cc40 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ew==PAGER_JOURNA
2cc50 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 29 3b  LMODE_QUERY.  );
2cc60 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2cc70 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
2cc80 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
2cc90 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c  sert( p->readOnl
2cca0 79 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d  y==0 );..  pBt =
2ccb0 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31   db->aDb[pOp->p1
2ccc0 5d 2e 70 42 74 3b 0a 20 20 70 50 61 67 65 72 20  ].pBt;.  pPager 
2ccd0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
2cce0 67 65 72 28 70 42 74 29 3b 0a 20 20 65 4f 6c 64  ger(pBt);.  eOld
2ccf0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
2cd00 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50  etJournalMode(pP
2cd10 61 67 65 72 29 3b 0a 20 20 69 66 28 20 65 4e 65  ager);.  if( eNe
2cd20 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  w==PAGER_JOURNAL
2cd30 4d 4f 44 45 5f 51 55 45 52 59 20 29 20 65 4e 65  MODE_QUERY ) eNe
2cd40 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 69 66 28 20  w = eOld;.  if( 
2cd50 21 73 71 6c 69 74 65 33 50 61 67 65 72 4f 6b 54  !sqlite3PagerOkT
2cd60 6f 43 68 61 6e 67 65 4a 6f 75 72 6e 61 6c 4d 6f  oChangeJournalMo
2cd70 64 65 28 70 50 61 67 65 72 29 20 29 20 65 4e 65  de(pPager) ) eNe
2cd80 77 20 3d 20 65 4f 6c 64 3b 0a 0a 23 69 66 6e 64  w = eOld;..#ifnd
2cd90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2cda0 41 4c 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  AL.  zFilename =
2cdb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
2cdc0 65 6e 61 6d 65 28 70 50 61 67 65 72 2c 20 31 29  ename(pPager, 1)
2cdd0 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61  ;..  /* Do not a
2cde0 6c 6c 6f 77 20 61 20 74 72 61 6e 73 69 74 69 6f  llow a transitio
2cdf0 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  n to journal_mod
2ce00 65 3d 57 41 4c 20 66 6f 72 20 61 20 64 61 74 61  e=WAL for a data
2ce10 62 61 73 65 0a 20 20 2a 2a 20 69 6e 20 74 65 6d  base.  ** in tem
2ce20 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20 6f  porary storage o
2ce30 72 20 69 66 20 74 68 65 20 56 46 53 20 64 6f 65  r if the VFS doe
2ce40 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68  s not support sh
2ce50 61 72 65 64 20 6d 65 6d 6f 72 79 20 0a 20 20 2a  ared memory .  *
2ce60 2f 0a 20 20 69 66 28 20 65 4e 65 77 3d 3d 50 41  /.  if( eNew==PA
2ce70 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2ce80 57 41 4c 0a 20 20 20 26 26 20 28 73 71 6c 69 74  WAL.   && (sqlit
2ce90 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
2cea0 6e 61 6d 65 29 3d 3d 30 20 20 20 20 20 20 20 20  name)==0        
2ceb0 20 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 20     /* Temp file 
2cec0 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20 21 73 71  */.       || !sq
2ced0 6c 69 74 65 33 50 61 67 65 72 57 61 6c 53 75 70  lite3PagerWalSup
2cee0 70 6f 72 74 65 64 28 70 50 61 67 65 72 29 29 20  ported(pPager)) 
2cef0 20 20 2f 2a 20 4e 6f 20 73 68 61 72 65 64 2d 6d    /* No shared-m
2cf00 65 6d 6f 72 79 20 73 75 70 70 6f 72 74 20 2a 2f  emory support */
2cf10 0a 20 20 29 7b 0a 20 20 20 20 65 4e 65 77 20 3d  .  ){.    eNew =
2cf20 20 65 4f 6c 64 3b 0a 20 20 7d 0a 0a 20 20 69 66   eOld;.  }..  if
2cf30 28 20 28 65 4e 65 77 21 3d 65 4f 6c 64 29 0a 20  ( (eNew!=eOld). 
2cf40 20 20 26 26 20 28 65 4f 6c 64 3d 3d 50 41 47 45    && (eOld==PAGE
2cf50 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
2cf60 4c 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52  L || eNew==PAGER
2cf70 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2cf80 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ).  ){.    if( !
2cf90 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 7c  db->autoCommit |
2cfa0 7c 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  | db->nVdbeRead>
2cfb0 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  1 ){.      rc = 
2cfc0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2cfd0 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
2cfe0 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
2cff0 2c 20 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20  , db, .         
2d000 20 22 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20   "cannot change 
2d010 25 73 20 77 61 6c 20 6d 6f 64 65 20 66 72 6f 6d  %s wal mode from
2d020 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
2d030 63 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20  ction",.        
2d040 20 20 28 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a    (eNew==PAGER_J
2d050 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 3f  OURNALMODE_WAL ?
2d060 20 22 69 6e 74 6f 22 20 3a 20 22 6f 75 74 20 6f   "into" : "out o
2d070 66 22 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  f").      );.   
2d080 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
2d090 6c 73 65 7b 0a 20 0a 20 20 20 20 20 20 69 66 28  lse{. .      if(
2d0a0 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55   eOld==PAGER_JOU
2d0b0 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a  RNALMODE_WAL ){.
2d0c0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6c 65          /* If le
2d0d0 61 76 69 6e 67 20 57 41 4c 20 6d 6f 64 65 2c 20  aving WAL mode, 
2d0e0 63 6c 6f 73 65 20 74 68 65 20 6c 6f 67 20 66 69  close the log fi
2d0f0 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  le. If successfu
2d100 6c 2c 20 74 68 65 20 63 61 6c 6c 0a 20 20 20 20  l, the call.    
2d110 20 20 20 20 2a 2a 20 74 6f 20 50 61 67 65 72 43      ** to PagerC
2d120 6c 6f 73 65 57 61 6c 28 29 20 63 68 65 63 6b 70  loseWal() checkp
2d130 6f 69 6e 74 73 20 61 6e 64 20 64 65 6c 65 74 65  oints and delete
2d140 73 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  s the write-ahea
2d150 64 2d 6c 6f 67 20 0a 20 20 20 20 20 20 20 20 2a  d-log .        *
2d160 2a 20 66 69 6c 65 2e 20 41 6e 20 45 58 43 4c 55  * file. An EXCLU
2d170 53 49 56 45 20 6c 6f 63 6b 20 6d 61 79 20 73 74  SIVE lock may st
2d180 69 6c 6c 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  ill be held on t
2d190 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d1a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 66 74   .        ** aft
2d1b0 65 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  er a successful 
2d1c0 72 65 74 75 72 6e 2e 20 0a 20 20 20 20 20 20 20  return. .       
2d1d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
2d1e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
2d1f0 73 65 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  seWal(pPager);. 
2d200 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2d210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d220 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
2d230 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65  erSetJournalMode
2d240 28 70 50 61 67 65 72 2c 20 65 4e 65 77 29 3b 0a  (pPager, eNew);.
2d250 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d260 7d 65 6c 73 65 20 69 66 28 20 65 4f 6c 64 3d 3d  }else if( eOld==
2d270 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2d280 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
2d290 20 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 74 72      /* Cannot tr
2d2a0 61 6e 73 69 74 69 6f 6e 20 64 69 72 65 63 74 6c  ansition directl
2d2b0 79 20 66 72 6f 6d 20 4d 45 4d 4f 52 59 20 74 6f  y from MEMORY to
2d2c0 20 57 41 4c 2e 20 20 55 73 65 20 6d 6f 64 65 20   WAL.  Use mode 
2d2d0 4f 46 46 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  OFF.        ** a
2d2e0 73 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74  s an intermediat
2d2f0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  e */.        sql
2d300 69 74 65 33 50 61 67 65 72 53 65 74 4a 6f 75 72  ite3PagerSetJour
2d310 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 2c 20  nalMode(pPager, 
2d320 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2d330 45 5f 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a  E_OFF);.      }.
2d340 20 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e    .      /* Open
2d350 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
2d360 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2d370 69 6c 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20  ile. Regardless 
2d380 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
2d390 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
2d3a0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  is transaction a
2d3b0 6c 77 61 79 73 20 75 73 65 73 20 61 20 72 6f 6c  lways uses a rol
2d3c0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
2d3d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
2d3e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
2d3f0 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
2d400 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
2d410 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2d420 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
2d430 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 56 65  qlite3BtreeSetVe
2d440 72 73 69 6f 6e 28 70 42 74 2c 20 28 65 4e 65 77  rsion(pBt, (eNew
2d450 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2d460 4f 44 45 5f 57 41 4c 20 3f 20 32 20 3a 20 31 29  ODE_WAL ? 2 : 1)
2d470 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2d480 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69  .  }.#endif /* i
2d490 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2d4a0 54 5f 57 41 4c 20 2a 2f 0a 0a 20 20 69 66 28 20  T_WAL */..  if( 
2d4b0 72 63 20 29 7b 0a 20 20 20 20 65 4e 65 77 20 3d  rc ){.    eNew =
2d4c0 20 65 4f 6c 64 3b 0a 20 20 7d 0a 20 20 65 4e 65   eOld;.  }.  eNe
2d4d0 77 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  w = sqlite3Pager
2d4e0 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70  SetJournalMode(p
2d4f0 50 61 67 65 72 2c 20 65 4e 65 77 29 3b 0a 0a 20  Pager, eNew);.. 
2d500 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
2d510 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75 74 2d 3e  p->p2];.  pOut->
2d520 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c  flags = MEM_Str|
2d530 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 54  MEM_Static|MEM_T
2d540 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e 7a 20 3d  erm;.  pOut->z =
2d550 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
2d560 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e 61 6d 65 28  JournalModename(
2d570 65 4e 65 77 29 3b 0a 20 20 70 4f 75 74 2d 3e 6e  eNew);.  pOut->n
2d580 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2d590 33 30 28 70 4f 75 74 2d 3e 7a 29 3b 0a 20 20 70  30(pOut->z);.  p
2d5a0 4f 75 74 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Out->enc = SQLIT
2d5b0 45 5f 55 54 46 38 3b 0a 20 20 73 71 6c 69 74 65  E_UTF8;.  sqlite
2d5c0 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64  3VdbeChangeEncod
2d5d0 69 6e 67 28 70 4f 75 74 2c 20 65 6e 63 6f 64 69  ing(pOut, encodi
2d5e0 6e 67 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b  ng);.  break;.};
2d5f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2d600 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 20 2a 2f  E_OMIT_PRAGMA */
2d610 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
2d620 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
2d630 4d 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  M) && !defined(S
2d640 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54 41 43  QLITE_OMIT_ATTAC
2d650 48 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 61  H)./* Opcode: Va
2d660 63 75 75 6d 20 2a 20 2a 20 2a 20 2a 20 2a 0a 2a  cuum * * * * *.*
2d670 2a 0a 2a 2a 20 56 61 63 75 75 6d 20 74 68 65 20  *.** Vacuum the 
2d680 65 6e 74 69 72 65 20 64 61 74 61 62 61 73 65 2e  entire database.
2d690 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 69    This opcode wi
2d6a0 6c 6c 20 63 61 75 73 65 20 6f 74 68 65 72 20 76  ll cause other v
2d6b0 69 72 74 75 61 6c 0a 2a 2a 20 6d 61 63 68 69 6e  irtual.** machin
2d6c0 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  es to be created
2d6d0 20 61 6e 64 20 72 75 6e 2e 20 20 49 74 20 6d 61   and run.  It ma
2d6e0 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  y not be called 
2d6f0 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 61  from within.** a
2d700 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
2d710 0a 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a  .case OP_Vacuum:
2d720 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   {.  assert( p->
2d730 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  readOnly==0 );. 
2d740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 75 6e   rc = sqlite3Run
2d750 56 61 63 75 75 6d 28 26 70 2d 3e 7a 45 72 72 4d  Vacuum(&p->zErrM
2d760 73 67 2c 20 64 62 29 3b 0a 20 20 62 72 65 61 6b  sg, db);.  break
2d770 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
2d780 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2d790 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29  OMIT_AUTOVACUUM)
2d7a0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 63 72  ./* Opcode: Incr
2d7b0 56 61 63 75 75 6d 20 50 31 20 50 32 20 2a 20 2a  Vacuum P1 P2 * *
2d7c0 20 2a 0a 2a 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d   *.**.** Perform
2d7d0 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
2d7e0 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
2d7f0 6c 20 76 61 63 75 75 6d 20 70 72 6f 63 65 64 75  l vacuum procedu
2d800 72 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 50 31 20  re on.** the P1 
2d810 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
2d820 20 76 61 63 75 75 6d 20 68 61 73 20 66 69 6e 69   vacuum has fini
2d830 73 68 65 64 2c 20 6a 75 6d 70 20 74 6f 20 69 6e  shed, jump to in
2d840 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 50 32 2e  struction.** P2.
2d850 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
2d860 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
2d870 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2d880 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 63  ..*/.case OP_Inc
2d890 72 56 61 63 75 75 6d 3a 20 7b 20 20 20 20 20 20  rVacuum: {      
2d8a0 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 42    /* jump */.  B
2d8b0 74 72 65 65 20 2a 70 42 74 3b 0a 0a 20 20 61 73  tree *pBt;..  as
2d8c0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
2d8d0 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e   && pOp->p1<db->
2d8e0 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
2d8f0 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26   (p->btreeMask &
2d900 20 28 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c   (((yDbMask)1)<<
2d910 70 4f 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a  pOp->p1))!=0 );.
2d920 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
2d930 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 70 42  dOnly==0 );.  pB
2d940 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d  t = db->aDb[pOp-
2d950 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 72 63 20 3d  >p1].pBt;.  rc =
2d960 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
2d970 72 56 61 63 75 75 6d 28 70 42 74 29 3b 0a 20 20  rVacuum(pBt);.  
2d980 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
2d990 4f 4e 45 20 29 7b 0a 20 20 20 20 70 63 20 3d 20  ONE ){.    pc = 
2d9a0 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20  pOp->p2 - 1;.   
2d9b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2d9c0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
2d9d0 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64  #endif../* Opcod
2d9e0 65 3a 20 45 78 70 69 72 65 20 50 31 20 2a 20 2a  e: Expire P1 * *
2d9f0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 61 75 73 65   * *.**.** Cause
2da00 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61   precompiled sta
2da10 74 65 6d 65 6e 74 73 20 74 6f 20 62 65 63 6f 6d  tements to becom
2da20 65 20 65 78 70 69 72 65 64 2e 20 41 6e 20 65 78  e expired. An ex
2da30 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a  pired statement.
2da40 2a 2a 20 66 61 69 6c 73 20 77 69 74 68 20 61 6e  ** fails with an
2da50 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 66 20 53   error code of S
2da60 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 69 66 20  QLITE_SCHEMA if 
2da70 69 74 20 69 73 20 65 76 65 72 20 65 78 65 63 75  it is ever execu
2da80 74 65 64 20 0a 2a 2a 20 28 76 69 61 20 73 71 6c  ted .** (via sql
2da90 69 74 65 33 5f 73 74 65 70 28 29 29 2e 0a 2a 2a  ite3_step())..**
2daa0 20 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 30 2c   .** If P1 is 0,
2dab0 20 74 68 65 6e 20 61 6c 6c 20 53 51 4c 20 73 74   then all SQL st
2dac0 61 74 65 6d 65 6e 74 73 20 62 65 63 6f 6d 65 20  atements become 
2dad0 65 78 70 69 72 65 64 2e 20 49 66 20 50 31 20 69  expired. If P1 i
2dae0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20 74  s non-zero,.** t
2daf0 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 63 75 72  hen only the cur
2db00 72 65 6e 74 6c 79 20 65 78 65 63 75 74 69 6e 67  rently executing
2db10 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 66   statement is af
2db20 66 65 63 74 65 64 2e 20 0a 2a 2f 0a 63 61 73 65  fected. .*/.case
2db30 20 4f 50 5f 45 78 70 69 72 65 3a 20 7b 0a 20 20   OP_Expire: {.  
2db40 69 66 28 20 21 70 4f 70 2d 3e 70 31 20 29 7b 0a  if( !pOp->p1 ){.
2db50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
2db60 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
2db70 6e 74 73 28 64 62 29 3b 0a 20 20 7d 65 6c 73 65  nts(db);.  }else
2db80 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
2db90 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61   = 1;.  }.  brea
2dba0 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  k;.}..#ifndef SQ
2dbb0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2dbc0 5f 43 41 43 48 45 0a 2f 2a 20 4f 70 63 6f 64 65  _CACHE./* Opcode
2dbd0 3a 20 54 61 62 6c 65 4c 6f 63 6b 20 50 31 20 50  : TableLock P1 P
2dbe0 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  2 P3 P4 *.**.** 
2dbf0 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e  Obtain a lock on
2dc00 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74 61   a particular ta
2dc10 62 6c 65 2e 20 54 68 69 73 20 69 6e 73 74 72 75  ble. This instru
2dc20 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
2dc30 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 73  ed when.** the s
2dc40 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
2dc50 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ure is enabled. 
2dc60 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65  .**.** P1 is the
2dc70 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   index of the da
2dc80 74 61 62 61 73 65 20 69 6e 20 73 71 6c 69 74 65  tabase in sqlite
2dc90 33 2e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64  3.aDb[] of the d
2dca0 61 74 61 62 61 73 65 0a 2a 2a 20 6f 6e 20 77 68  atabase.** on wh
2dcb0 69 63 68 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ich the lock is 
2dcc0 61 63 71 75 69 72 65 64 2e 20 20 41 20 72 65 61  acquired.  A rea
2dcd0 64 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65  dlock is obtaine
2dce0 64 20 69 66 20 50 33 3d 3d 30 20 6f 72 0a 2a 2a  d if P3==0 or.**
2dcf0 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66   a write lock if
2dd00 20 50 33 3d 3d 31 2e 0a 2a 2a 0a 2a 2a 20 50 32   P3==1..**.** P2
2dd10 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 6f   contains the ro
2dd20 6f 74 2d 70 61 67 65 20 6f 66 20 74 68 65 20 74  ot-page of the t
2dd30 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 2e 0a 2a 2a  able to lock..**
2dd40 0a 2a 2a 20 50 34 20 63 6f 6e 74 61 69 6e 73 20  .** P4 contains 
2dd50 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2dd60 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
2dd70 6c 65 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e  le being locked.
2dd80 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 0a 2a 2a   This is only.**
2dd90 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
2dda0 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
2ddb0 67 65 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63  ge if the lock c
2ddc0 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
2ddd0 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 61  d..*/.case OP_Ta
2dde0 62 6c 65 4c 6f 63 6b 3a 20 7b 0a 20 20 75 38 20  bleLock: {.  u8 
2ddf0 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28 75  isWriteLock = (u
2de00 38 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28  8)pOp->p3;.  if(
2de10 20 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20   isWriteLock || 
2de20 30 3d 3d 28 64 62 2d 3e 66 6c 61 67 73 26 53 51  0==(db->flags&SQ
2de30 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
2de40 74 74 65 64 29 20 29 7b 0a 20 20 20 20 69 6e 74  tted) ){.    int
2de50 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 0a   p1 = pOp->p1; .
2de60 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d      assert( p1>=
2de70 30 20 26 26 20 70 31 3c 64 62 2d 3e 6e 44 62 20  0 && p1<db->nDb 
2de80 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
2de90 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28  p->btreeMask & (
2dea0 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70 31  ((yDbMask)1)<<p1
2deb0 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ))!=0 );.    ass
2dec0 65 72 74 28 20 69 73 57 72 69 74 65 4c 6f 63 6b  ert( isWriteLock
2ded0 3d 3d 30 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f  ==0 || isWriteLo
2dee0 63 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 72 63 20  ck==1 );.    rc 
2def0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f  = sqlite3BtreeLo
2df00 63 6b 54 61 62 6c 65 28 64 62 2d 3e 61 44 62 5b  ckTable(db->aDb[
2df10 70 31 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 32  p1].pBt, pOp->p2
2df20 2c 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a  , isWriteLock);.
2df30 20 20 20 20 69 66 28 20 28 72 63 26 30 78 46 46      if( (rc&0xFF
2df40 29 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  )==SQLITE_LOCKED
2df50 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
2df60 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70  char *z = pOp->p
2df70 34 2e 7a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  4.z;.      sqlit
2df80 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
2df90 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 64 61  zErrMsg, db, "da
2dfa0 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
2dfb0 6c 6f 63 6b 65 64 3a 20 25 73 22 2c 20 7a 29 3b  locked: %s", z);
2dfc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
2dfd0 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ak;.}.#endif /* 
2dfe0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2dff0 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
2e000 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2e010 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
2e020 20 4f 70 63 6f 64 65 3a 20 56 42 65 67 69 6e 20   Opcode: VBegin 
2e030 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  * * * P4 *.**.**
2e040 20 50 34 20 6d 61 79 20 62 65 20 61 20 70 6f 69   P4 may be a poi
2e050 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
2e060 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
2e070 65 2e 20 49 66 20 73 6f 2c 20 63 61 6c 6c 20 74  e. If so, call t
2e080 68 65 20 0a 2a 2a 20 78 42 65 67 69 6e 20 6d 65  he .** xBegin me
2e090 74 68 6f 64 20 66 6f 72 20 74 68 61 74 20 74 61  thod for that ta
2e0a0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 2c  ble..**.** Also,
2e0b0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2e0c0 50 34 20 69 73 20 73 65 74 2c 20 63 68 65 63 6b  P4 is set, check
2e0d0 20 74 68 61 74 20 74 68 69 73 20 69 73 20 6e 6f   that this is no
2e0e0 74 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  t being called f
2e0f0 72 6f 6d 0a 2a 2a 20 77 69 74 68 69 6e 20 61 20  rom.** within a 
2e100 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 20 76 69  callback to a vi
2e110 72 74 75 61 6c 20 74 61 62 6c 65 20 78 53 79 6e  rtual table xSyn
2e120 63 28 29 20 6d 65 74 68 6f 64 2e 20 49 66 20 69  c() method. If i
2e130 74 20 69 73 2c 20 74 68 65 20 65 72 72 6f 72 0a  t is, the error.
2e140 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20  ** code will be 
2e150 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4c 4f  set to SQLITE_LO
2e160 43 4b 45 44 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  CKED..*/.case OP
2e170 5f 56 42 65 67 69 6e 3a 20 7b 0a 20 20 56 54 61  _VBegin: {.  VTa
2e180 62 6c 65 20 2a 70 56 54 61 62 3b 0a 20 20 70 56  ble *pVTab;.  pV
2e190 54 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56  Tab = pOp->p4.pV
2e1a0 74 61 62 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  tab;.  rc = sqli
2e1b0 74 65 33 56 74 61 62 42 65 67 69 6e 28 64 62 2c  te3VtabBegin(db,
2e1c0 20 70 56 54 61 62 29 3b 0a 20 20 69 66 28 20 70   pVTab);.  if( p
2e1d0 56 54 61 62 20 29 20 73 71 6c 69 74 65 33 56 74  VTab ) sqlite3Vt
2e1e0 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 70  abImportErrmsg(p
2e1f0 2c 20 70 56 54 61 62 2d 3e 70 56 74 61 62 29 3b  , pVTab->pVtab);
2e200 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
2e210 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2e220 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
2e230 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2e240 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2e250 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56  BLE./* Opcode: V
2e260 43 72 65 61 74 65 20 50 31 20 2a 20 2a 20 50 34  Create P1 * * P4
2e270 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 74   *.**.** P4 is t
2e280 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 69 72  he name of a vir
2e290 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 64 61  tual table in da
2e2a0 74 61 62 61 73 65 20 50 31 2e 20 43 61 6c 6c 20  tabase P1. Call 
2e2b0 74 68 65 20 78 43 72 65 61 74 65 20 6d 65 74 68  the xCreate meth
2e2c0 6f 64 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 74  od.** for that t
2e2d0 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  able..*/.case OP
2e2e0 5f 56 43 72 65 61 74 65 3a 20 7b 0a 20 20 72 63  _VCreate: {.  rc
2e2f0 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 43 61   = sqlite3VtabCa
2e300 6c 6c 43 72 65 61 74 65 28 64 62 2c 20 70 4f 70  llCreate(db, pOp
2e310 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c  ->p1, pOp->p4.z,
2e320 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20   &p->zErrMsg);. 
2e330 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
2e340 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2e350 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
2e360 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e370 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2e380 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 44 65  E./* Opcode: VDe
2e390 73 74 72 6f 79 20 50 31 20 2a 20 2a 20 50 34 20  stroy P1 * * P4 
2e3a0 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 74 68  *.**.** P4 is th
2e3b0 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 69 72 74  e name of a virt
2e3c0 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 64 61 74  ual table in dat
2e3d0 61 62 61 73 65 20 50 31 2e 20 20 43 61 6c 6c 20  abase P1.  Call 
2e3e0 74 68 65 20 78 44 65 73 74 72 6f 79 20 6d 65 74  the xDestroy met
2e3f0 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74  hod.** of that t
2e400 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  able..*/.case OP
2e410 5f 56 44 65 73 74 72 6f 79 3a 20 7b 0a 20 20 70  _VDestroy: {.  p
2e420 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
2e430 20 32 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   2;.  rc = sqlit
2e440 65 33 56 74 61 62 43 61 6c 6c 44 65 73 74 72 6f  e3VtabCallDestro
2e450 79 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  y(db, pOp->p1, p
2e460 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 70 2d 3e  Op->p4.z);.  p->
2e470 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30  inVtabMethod = 0
2e480 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
2e490 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2e4a0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
2e4b0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
2e4c0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2e4d0 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ABLE./* Opcode: 
2e4e0 56 4f 70 65 6e 20 50 31 20 2a 20 2a 20 50 34 20  VOpen P1 * * P4 
2e4f0 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20  *.**.** P4 is a 
2e500 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 76 69 72  pointer to a vir
2e510 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63  tual table objec
2e520 74 2c 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74  t, an sqlite3_vt
2e530 61 62 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ab structure..**
2e540 20 50 31 20 69 73 20 61 20 63 75 72 73 6f 72 20   P1 is a cursor 
2e550 6e 75 6d 62 65 72 2e 20 20 54 68 69 73 20 6f 70  number.  This op
2e560 63 6f 64 65 20 6f 70 65 6e 73 20 61 20 63 75 72  code opens a cur
2e570 73 6f 72 20 74 6f 20 74 68 65 20 76 69 72 74 75  sor to the virtu
2e580 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  al.** table and 
2e590 73 74 6f 72 65 73 20 74 68 61 74 20 63 75 72 73  stores that curs
2e5a0 6f 72 20 69 6e 20 50 31 2e 0a 2a 2f 0a 63 61 73  or in P1..*/.cas
2e5b0 65 20 4f 50 5f 56 4f 70 65 6e 3a 20 7b 0a 20 20  e OP_VOpen: {.  
2e5c0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72  VdbeCursor *pCur
2e5d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ;.  sqlite3_vtab
2e5e0 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
2e5f0 72 73 6f 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f  rsor;.  sqlite3_
2e600 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 73  vtab *pVtab;.  s
2e610 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
2e620 4d 6f 64 75 6c 65 3b 0a 0a 20 20 61 73 73 65 72  Module;..  asser
2e630 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  t( p->bIsReader 
2e640 29 3b 0a 20 20 70 43 75 72 20 3d 20 30 3b 0a 20  );.  pCur = 0;. 
2e650 20 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 30   pVtabCursor = 0
2e660 3b 0a 20 20 70 56 74 61 62 20 3d 20 70 4f 70 2d  ;.  pVtab = pOp-
2e670 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62  >p4.pVtab->pVtab
2e680 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20 28 73  ;.  pModule = (s
2e690 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 29  qlite3_module *)
2e6a0 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
2e6b0 20 20 61 73 73 65 72 74 28 70 56 74 61 62 20 26    assert(pVtab &
2e6c0 26 20 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 72 63  & pModule);.  rc
2e6d0 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4f 70 65   = pModule->xOpe
2e6e0 6e 28 70 56 74 61 62 2c 20 26 70 56 74 61 62 43  n(pVtab, &pVtabC
2e6f0 75 72 73 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65  ursor);.  sqlite
2e700 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73  3VtabImportErrms
2e710 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20 69  g(p, pVtab);.  i
2e720 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63  f( SQLITE_OK==rc
2e730 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69   ){.    /* Initi
2e740 61 6c 69 7a 65 20 73 71 6c 69 74 65 33 5f 76 74  alize sqlite3_vt
2e750 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65 20 63  ab_cursor base c
2e760 6c 61 73 73 20 2a 2f 0a 20 20 20 20 70 56 74 61  lass */.    pVta
2e770 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 20 3d  bCursor->pVtab =
2e780 20 70 56 74 61 62 3b 0a 0a 20 20 20 20 2f 2a 20   pVtab;..    /* 
2e790 49 6e 69 74 69 61 6c 69 7a 65 20 76 64 62 65 20  Initialize vdbe 
2e7a0 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  cursor object */
2e7b0 0a 20 20 20 20 70 43 75 72 20 3d 20 61 6c 6c 6f  .    pCur = allo
2e7c0 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f  cateCursor(p, pO
2e7d0 70 2d 3e 70 31 2c 20 30 2c 20 2d 31 2c 20 30 29  p->p1, 0, -1, 0)
2e7e0 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 20 29  ;.    if( pCur )
2e7f0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 56  {.      pCur->pV
2e800 74 61 62 43 75 72 73 6f 72 20 3d 20 70 56 74 61  tabCursor = pVta
2e810 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 70  bCursor;.      p
2e820 43 75 72 2d 3e 70 4d 6f 64 75 6c 65 20 3d 20 70  Cur->pModule = p
2e830 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
2e840 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20  b->pModule;.    
2e850 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d  }else{.      db-
2e860 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
2e870 31 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c 65  1;.      pModule
2e880 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75  ->xClose(pVtabCu
2e890 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rsor);.    }.  }
2e8a0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
2e8b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2e8c0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
2e8d0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2e8e0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2e8f0 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56  BLE./* Opcode: V
2e900 46 69 6c 74 65 72 20 50 31 20 50 32 20 50 33 20  Filter P1 P2 P3 
2e910 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73  P4 *.**.** P1 is
2e920 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64   a cursor opened
2e930 20 75 73 69 6e 67 20 56 4f 70 65 6e 2e 20 20 50   using VOpen.  P
2e940 32 20 69 73 20 61 6e 20 61 64 64 72 65 73 73 20  2 is an address 
2e950 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66 0a 2a 2a  to jump to if.**
2e960 20 74 68 65 20 66 69 6c 74 65 72 65 64 20 72 65   the filtered re
2e970 73 75 6c 74 20 73 65 74 20 69 73 20 65 6d 70 74  sult set is empt
2e980 79 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 65  y..**.** P4 is e
2e990 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20  ither NULL or a 
2e9a0 73 74 72 69 6e 67 20 74 68 61 74 20 77 61 73 20  string that was 
2e9b0 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
2e9c0 20 78 42 65 73 74 49 6e 64 65 78 0a 2a 2a 20 6d   xBestIndex.** m
2e9d0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 6d 6f 64  ethod of the mod
2e9e0 75 6c 65 2e 20 20 54 68 65 20 69 6e 74 65 72 70  ule.  The interp
2e9f0 72 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  retation of the 
2ea00 50 34 20 73 74 72 69 6e 67 20 69 73 20 6c 65 66  P4 string is lef
2ea10 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6d 6f 64 75  t.** to the modu
2ea20 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
2ea30 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  n..**.** This op
2ea40 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65  code invokes the
2ea50 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 20   xFilter method 
2ea60 6f 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  on the virtual t
2ea70 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 0a 2a  able specified.*
2ea80 2a 20 62 79 20 50 31 2e 20 20 54 68 65 20 69 6e  * by P1.  The in
2ea90 74 65 67 65 72 20 71 75 65 72 79 20 70 6c 61 6e  teger query plan
2eaa0 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 78 46   parameter to xF
2eab0 69 6c 74 65 72 20 69 73 20 73 74 6f 72 65 64 20  ilter is stored 
2eac0 69 6e 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 50  in register.** P
2ead0 33 2e 20 52 65 67 69 73 74 65 72 20 50 33 2b 31  3. Register P3+1
2eae0 20 73 74 6f 72 65 73 20 74 68 65 20 61 72 67 63   stores the argc
2eaf0 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 62 65   parameter to be
2eb00 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 0a 2a   passed to the.*
2eb10 2a 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64  * xFilter method
2eb20 2e 20 52 65 67 69 73 74 65 72 73 20 50 33 2b 32  . Registers P3+2
2eb30 2e 2e 50 33 2b 31 2b 61 72 67 63 20 61 72 65 20  ..P3+1+argc are 
2eb40 74 68 65 20 61 72 67 63 0a 2a 2a 20 61 64 64 69  the argc.** addi
2eb50 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65 72  tional parameter
2eb60 73 20 77 68 69 63 68 20 61 72 65 20 70 61 73 73  s which are pass
2eb70 65 64 20 74 6f 0a 2a 2a 20 78 46 69 6c 74 65 72  ed to.** xFilter
2eb80 20 61 73 20 61 72 67 76 2e 20 52 65 67 69 73 74   as argv. Regist
2eb90 65 72 20 50 33 2b 32 20 62 65 63 6f 6d 65 73 20  er P3+2 becomes 
2eba0 61 72 67 76 5b 30 5d 20 77 68 65 6e 20 70 61 73  argv[0] when pas
2ebb0 73 65 64 20 74 6f 20 78 46 69 6c 74 65 72 2e 0a  sed to xFilter..
2ebc0 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 69 73 20  **.** A jump is 
2ebd0 6d 61 64 65 20 74 6f 20 50 32 20 69 66 20 74 68  made to P2 if th
2ebe0 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 66 74  e result set aft
2ebf0 65 72 20 66 69 6c 74 65 72 69 6e 67 20 77 6f 75  er filtering wou
2ec00 6c 64 20 62 65 20 65 6d 70 74 79 2e 0a 2a 2f 0a  ld be empty..*/.
2ec10 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a  case OP_VFilter:
2ec20 20 7b 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a   {   /* jump */.
2ec30 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e    int nArg;.  in
2ec40 74 20 69 51 75 65 72 79 3b 0a 20 20 63 6f 6e 73  t iQuery;.  cons
2ec50 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
2ec60 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d   *pModule;.  Mem
2ec70 20 2a 70 51 75 65 72 79 3b 0a 20 20 4d 65 6d 20   *pQuery;.  Mem 
2ec80 2a 70 41 72 67 63 3b 0a 20 20 73 71 6c 69 74 65  *pArgc;.  sqlite
2ec90 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
2eca0 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 73 71  VtabCursor;.  sq
2ecb0 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
2ecc0 62 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  b;.  VdbeCursor 
2ecd0 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 65 73  *pCur;.  int res
2ece0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d  ;.  int i;.  Mem
2ecf0 20 2a 2a 61 70 41 72 67 3b 0a 0a 20 20 70 51 75   **apArg;..  pQu
2ed00 65 72 79 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  ery = &aMem[pOp-
2ed10 3e 70 33 5d 3b 0a 20 20 70 41 72 67 63 20 3d 20  >p3];.  pArgc = 
2ed20 26 70 51 75 65 72 79 5b 31 5d 3b 0a 20 20 70 43  &pQuery[1];.  pC
2ed30 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  ur = p->apCsr[pO
2ed40 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
2ed50 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 51 75  ( memIsValid(pQu
2ed60 65 72 79 29 20 29 3b 0a 20 20 52 45 47 49 53 54  ery) );.  REGIST
2ed70 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
2ed80 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 61 73 73  , pQuery);.  ass
2ed90 65 72 74 28 20 70 43 75 72 2d 3e 70 56 74 61 62  ert( pCur->pVtab
2eda0 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 56 74 61  Cursor );.  pVta
2edb0 62 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  bCursor = pCur->
2edc0 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 70  pVtabCursor;.  p
2edd0 56 74 61 62 20 3d 20 70 56 74 61 62 43 75 72 73  Vtab = pVtabCurs
2ede0 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f  or->pVtab;.  pMo
2edf0 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d  dule = pVtab->pM
2ee00 6f 64 75 6c 65 3b 0a 0a 20 20 2f 2a 20 47 72 61  odule;..  /* Gra
2ee10 62 20 74 68 65 20 69 6e 64 65 78 20 6e 75 6d 62  b the index numb
2ee20 65 72 20 61 6e 64 20 61 72 67 63 20 70 61 72 61  er and argc para
2ee30 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65  meters */.  asse
2ee40 72 74 28 20 28 70 51 75 65 72 79 2d 3e 66 6c 61  rt( (pQuery->fla
2ee50 67 73 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 26  gs&MEM_Int)!=0 &
2ee60 26 20 70 41 72 67 63 2d 3e 66 6c 61 67 73 3d 3d  & pArgc->flags==
2ee70 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 6e 41 72  MEM_Int );.  nAr
2ee80 67 20 3d 20 28 69 6e 74 29 70 41 72 67 63 2d 3e  g = (int)pArgc->
2ee90 75 2e 69 3b 0a 20 20 69 51 75 65 72 79 20 3d 20  u.i;.  iQuery = 
2eea0 28 69 6e 74 29 70 51 75 65 72 79 2d 3e 75 2e 69  (int)pQuery->u.i
2eeb0 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74  ;..  /* Invoke t
2eec0 68 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f  he xFilter metho
2eed0 64 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 72 65 73  d */.  {.    res
2eee0 20 3d 20 30 3b 0a 20 20 20 20 61 70 41 72 67 20   = 0;.    apArg 
2eef0 3d 20 70 2d 3e 61 70 41 72 67 3b 0a 20 20 20 20  = p->apArg;.    
2ef00 66 6f 72 28 69 20 3d 20 30 3b 20 69 3c 6e 41 72  for(i = 0; i<nAr
2ef10 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  g; i++){.      a
2ef20 70 41 72 67 5b 69 5d 20 3d 20 26 70 41 72 67 63  pArg[i] = &pArgc
2ef30 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 73 71 6c  [i+1];.      sql
2ef40 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f 72 65  ite3VdbeMemStore
2ef50 54 79 70 65 28 61 70 41 72 67 5b 69 5d 29 3b 0a  Type(apArg[i]);.
2ef60 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 69 6e      }..    p->in
2ef70 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a  VtabMethod = 1;.
2ef80 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65      rc = pModule
2ef90 2d 3e 78 46 69 6c 74 65 72 28 70 56 74 61 62 43  ->xFilter(pVtabC
2efa0 75 72 73 6f 72 2c 20 69 51 75 65 72 79 2c 20 70  ursor, iQuery, p
2efb0 4f 70 2d 3e 70 34 2e 7a 2c 20 6e 41 72 67 2c 20  Op->p4.z, nArg, 
2efc0 61 70 41 72 67 29 3b 0a 20 20 20 20 70 2d 3e 69  apArg);.    p->i
2efd0 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b  nVtabMethod = 0;
2efe0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
2eff0 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 70 2c 20  ImportErrmsg(p, 
2f000 70 56 74 61 62 29 3b 0a 20 20 20 20 69 66 28 20  pVtab);.    if( 
2f010 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2f020 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 4d 6f  .      res = pMo
2f030 64 75 6c 65 2d 3e 78 45 6f 66 28 70 56 74 61 62  dule->xEof(pVtab
2f040 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 0a  Cursor);.    }..
2f050 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
2f060 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70       pc = pOp->p
2f070 32 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  2 - 1;.    }.  }
2f080 0a 20 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77  .  pCur->nullRow
2f090 20 3d 20 30 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a   = 0;..  break;.
2f0a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2f0b0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2f0c0 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ABLE */..#ifndef
2f0d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2f0e0 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63  TUALTABLE./* Opc
2f0f0 6f 64 65 3a 20 56 43 6f 6c 75 6d 6e 20 50 31 20  ode: VColumn P1 
2f100 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
2f110 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  Store the value 
2f120 6f 66 20 74 68 65 20 50 32 2d 74 68 20 63 6f 6c  of the P2-th col
2f130 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 6f  umn of.** the ro
2f140 77 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  w of the virtual
2f150 2d 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20  -table that the 
2f160 0a 2a 2a 20 50 31 20 63 75 72 73 6f 72 20 69 73  .** P1 cursor is
2f170 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 6e 74   pointing to int
2f180 6f 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  o register P3..*
2f190 2f 0a 63 61 73 65 20 4f 50 5f 56 43 6f 6c 75 6d  /.case OP_VColum
2f1a0 6e 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  n: {.  sqlite3_v
2f1b0 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f  tab *pVtab;.  co
2f1c0 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
2f1d0 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 4d  le *pModule;.  M
2f1e0 65 6d 20 2a 70 44 65 73 74 3b 0a 20 20 73 71 6c  em *pDest;.  sql
2f1f0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 73 43 6f  ite3_context sCo
2f200 6e 74 65 78 74 3b 0a 0a 20 20 56 64 62 65 43 75  ntext;..  VdbeCu
2f210 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 2d 3e  rsor *pCur = p->
2f220 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
2f230 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2f240 70 56 74 61 62 43 75 72 73 6f 72 20 29 3b 0a 20  pVtabCursor );. 
2f250 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
2f260 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28  >0 && pOp->p3<=(
2f270 70 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73  p->nMem-p->nCurs
2f280 6f 72 29 20 29 3b 0a 20 20 70 44 65 73 74 20 3d  or) );.  pDest =
2f290 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
2f2a0 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61  .  memAboutToCha
2f2b0 6e 67 65 28 70 2c 20 70 44 65 73 74 29 3b 0a 20  nge(p, pDest);. 
2f2c0 20 69 66 28 20 70 43 75 72 2d 3e 6e 75 6c 6c 52   if( pCur->nullR
2f2d0 6f 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ow ){.    sqlite
2f2e0 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
2f2f0 70 44 65 73 74 29 3b 0a 20 20 20 20 62 72 65 61  pDest);.    brea
2f300 6b 3b 0a 20 20 7d 0a 20 20 70 56 74 61 62 20 3d  k;.  }.  pVtab =
2f310 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73   pCur->pVtabCurs
2f320 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f  or->pVtab;.  pMo
2f330 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d  dule = pVtab->pM
2f340 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  odule;.  assert(
2f350 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d   pModule->xColum
2f360 6e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n );.  memset(&s
2f370 43 6f 6e 74 65 78 74 2c 20 30 2c 20 73 69 7a 65  Context, 0, size
2f380 6f 66 28 73 43 6f 6e 74 65 78 74 29 29 3b 0a 0a  of(sContext));..
2f390 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20    /* The output 
2f3a0 63 65 6c 6c 20 6d 61 79 20 61 6c 72 65 61 64 79  cell may already
2f3b0 20 68 61 76 65 20 61 20 62 75 66 66 65 72 20 61   have a buffer a
2f3c0 6c 6c 6f 63 61 74 65 64 2e 20 4d 6f 76 65 0a 20  llocated. Move. 
2f3d0 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
2f3e0 63 6f 6e 74 65 6e 74 73 20 74 6f 20 73 43 6f 6e  contents to sCon
2f3f0 74 65 78 74 2e 73 20 73 6f 20 69 6e 20 63 61 73  text.s so in cas
2f400 65 20 74 68 65 20 75 73 65 72 2d 66 75 6e 63 74  e the user-funct
2f410 69 6f 6e 20 0a 20 20 2a 2a 20 63 61 6e 20 75 73  ion .  ** can us
2f420 65 20 74 68 65 20 61 6c 72 65 61 64 79 20 61 6c  e the already al
2f430 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 69  located buffer i
2f440 6e 73 74 65 61 64 20 6f 66 20 61 6c 6c 6f 63 61  nstead of alloca
2f450 74 69 6e 67 20 61 20 0a 20 20 2a 2a 20 6e 65 77  ting a .  ** new
2f460 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c   one..  */.  sql
2f470 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28  ite3VdbeMemMove(
2f480 26 73 43 6f 6e 74 65 78 74 2e 73 2c 20 70 44 65  &sContext.s, pDe
2f490 73 74 29 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70  st);.  MemSetTyp
2f4a0 65 46 6c 61 67 28 26 73 43 6f 6e 74 65 78 74 2e  eFlag(&sContext.
2f4b0 73 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 0a 20  s, MEM_Null);.. 
2f4c0 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78   rc = pModule->x
2f4d0 43 6f 6c 75 6d 6e 28 70 43 75 72 2d 3e 70 56 74  Column(pCur->pVt
2f4e0 61 62 43 75 72 73 6f 72 2c 20 26 73 43 6f 6e 74  abCursor, &sCont
2f4f0 65 78 74 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a 20  ext, pOp->p2);. 
2f500 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f   sqlite3VtabImpo
2f510 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74 61  rtErrmsg(p, pVta
2f520 62 29 3b 0a 20 20 69 66 28 20 73 43 6f 6e 74 65  b);.  if( sConte
2f530 78 74 2e 69 73 45 72 72 6f 72 20 29 7b 0a 20 20  xt.isError ){.  
2f540 20 20 72 63 20 3d 20 73 43 6f 6e 74 65 78 74 2e    rc = sContext.
2f550 69 73 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  isError;.  }..  
2f560 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 65 73 75  /* Copy the resu
2f570 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  lt of the functi
2f580 6f 6e 20 74 6f 20 74 68 65 20 50 33 20 72 65 67  on to the P3 reg
2f590 69 73 74 65 72 2e 20 57 65 0a 20 20 2a 2a 20 64  ister. We.  ** d
2f5a0 6f 20 74 68 69 73 20 72 65 67 61 72 64 6c 65 73  o this regardles
2f5b0 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20  s of whether or 
2f5c0 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  not an error occ
2f5d0 75 72 72 65 64 20 74 6f 20 65 6e 73 75 72 65 20  urred to ensure 
2f5e0 61 6e 79 0a 20 20 2a 2a 20 64 79 6e 61 6d 69 63  any.  ** dynamic
2f5f0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 73   allocation in s
2f600 43 6f 6e 74 65 78 74 2e 73 20 28 61 20 4d 65 6d  Context.s (a Mem
2f610 20 73 74 72 75 63 74 29 20 69 73 20 20 72 65 6c   struct) is  rel
2f620 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  eased..  */.  sq
2f630 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45  lite3VdbeChangeE
2f640 6e 63 6f 64 69 6e 67 28 26 73 43 6f 6e 74 65 78  ncoding(&sContex
2f650 74 2e 73 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  t.s, encoding);.
2f660 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
2f670 4d 6f 76 65 28 70 44 65 73 74 2c 20 26 73 43 6f  Move(pDest, &sCo
2f680 6e 74 65 78 74 2e 73 29 3b 0a 20 20 52 45 47 49  ntext.s);.  REGI
2f690 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
2f6a0 70 33 2c 20 70 44 65 73 74 29 3b 0a 20 20 55 50  p3, pDest);.  UP
2f6b0 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
2f6c0 45 28 70 44 65 73 74 29 3b 0a 0a 20 20 69 66 28  E(pDest);..  if(
2f6d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54   sqlite3VdbeMemT
2f6e0 6f 6f 42 69 67 28 70 44 65 73 74 29 20 29 7b 0a  ooBig(pDest) ){.
2f6f0 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67      goto too_big
2f700 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
2f710 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2f720 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2f730 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  BLE */..#ifndef 
2f740 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2f750 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f  UALTABLE./* Opco
2f760 64 65 3a 20 56 4e 65 78 74 20 50 31 20 50 32 20  de: VNext P1 P2 
2f770 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 64 76 61  * * *.**.** Adva
2f780 6e 63 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  nce virtual tabl
2f790 65 20 50 31 20 74 6f 20 74 68 65 20 6e 65 78 74  e P1 to the next
2f7a0 20 72 6f 77 20 69 6e 20 69 74 73 20 72 65 73 75   row in its resu
2f7b0 6c 74 20 73 65 74 20 61 6e 64 0a 2a 2a 20 6a 75  lt set and.** ju
2f7c0 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f  mp to instructio
2f7d0 6e 20 50 32 2e 20 20 4f 72 2c 20 69 66 20 74 68  n P2.  Or, if th
2f7e0 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
2f7f0 68 61 73 20 72 65 61 63 68 65 64 0a 2a 2a 20 74  has reached.** t
2f800 68 65 20 65 6e 64 20 6f 66 20 69 74 73 20 72 65  he end of its re
2f810 73 75 6c 74 20 73 65 74 2c 20 74 68 65 6e 20 66  sult set, then f
2f820 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
2f830 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
2f840 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ion..*/.case OP_
2f850 56 4e 65 78 74 3a 20 7b 20 20 20 2f 2a 20 6a 75  VNext: {   /* ju
2f860 6d 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  mp */.  sqlite3_
2f870 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 63  vtab *pVtab;.  c
2f880 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
2f890 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20  ule *pModule;.  
2f8a0 69 6e 74 20 72 65 73 3b 0a 20 20 56 64 62 65 43  int res;.  VdbeC
2f8b0 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20  ursor *pCur;..  
2f8c0 72 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 20  res = 0;.  pCur 
2f8d0 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
2f8e0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
2f8f0 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  Cur->pVtabCursor
2f900 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2f910 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 62  nullRow ){.    b
2f920 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 56 74 61  reak;.  }.  pVta
2f930 62 20 3d 20 70 43 75 72 2d 3e 70 56 74 61 62 43  b = pCur->pVtabC
2f940 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20  ursor->pVtab;.  
2f950 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d  pModule = pVtab-
2f960 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65  >pModule;.  asse
2f970 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65  rt( pModule->xNe
2f980 78 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f  xt );..  /* Invo
2f990 6b 65 20 74 68 65 20 78 4e 65 78 74 28 29 20 6d  ke the xNext() m
2f9a0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 6d 6f 64  ethod of the mod
2f9b0 75 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  ule. There is no
2f9c0 20 77 61 79 20 66 6f 72 20 74 68 65 0a 20 20 2a   way for the.  *
2f9d0 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 69 6d 70  * underlying imp
2f9e0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20 72  lementation to r
2f9f0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69  eturn an error i
2fa00 66 20 6f 6e 65 20 6f 63 63 75 72 73 20 64 75 72  f one occurs dur
2fa10 69 6e 67 0a 20 20 2a 2a 20 78 4e 65 78 74 28 29  ing.  ** xNext()
2fa20 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 61 6e  . Instead, if an
2fa30 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
2fa40 72 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  rue is returned 
2fa50 28 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74  (indicating that
2fa60 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 73 20 61   .  ** data is a
2fa70 76 61 69 6c 61 62 6c 65 29 20 61 6e 64 20 74 68  vailable) and th
2fa80 65 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74  e error code ret
2fa90 75 72 6e 65 64 20 77 68 65 6e 20 78 43 6f 6c 75  urned when xColu
2faa0 6d 6e 20 6f 72 0a 20 20 2a 2a 20 73 6f 6d 65 20  mn or.  ** some 
2fab0 6f 74 68 65 72 20 6d 65 74 68 6f 64 20 69 73 20  other method is 
2fac0 6e 65 78 74 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  next invoked on 
2fad0 74 68 65 20 73 61 76 65 20 76 69 72 74 75 61 6c  the save virtual
2fae0 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 0a 20   table cursor.. 
2faf0 20 2a 2f 0a 20 20 70 2d 3e 69 6e 56 74 61 62 4d   */.  p->inVtabM
2fb00 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 72 63 20  ethod = 1;.  rc 
2fb10 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74  = pModule->xNext
2fb20 28 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73  (pCur->pVtabCurs
2fb30 6f 72 29 3b 0a 20 20 70 2d 3e 69 6e 56 74 61 62  or);.  p->inVtab
2fb40 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 73 71  Method = 0;.  sq
2fb50 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45  lite3VtabImportE
2fb60 72 72 6d 73 67 28 70 2c 20 70 56 74 61 62 29 3b  rrmsg(p, pVtab);
2fb70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2fb80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 73 20  E_OK ){.    res 
2fb90 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66 28  = pModule->xEof(
2fba0 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f  pCur->pVtabCurso
2fbb0 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  r);.  }..  if( !
2fbc0 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  res ){.    /* If
2fbd0 20 74 68 65 72 65 20 69 73 20 64 61 74 61 2c 20   there is data, 
2fbe0 6a 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20 20  jump to P2 */.  
2fbf0 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
2fc00 20 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20 63   1;.  }.  goto c
2fc10 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75  heck_for_interru
2fc20 70 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  pt;.}.#endif /* 
2fc30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2fc40 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
2fc50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2fc60 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
2fc70 20 4f 70 63 6f 64 65 3a 20 56 52 65 6e 61 6d 65   Opcode: VRename
2fc80 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a   P1 * * P4 *.**.
2fc90 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74  ** P4 is a point
2fca0 65 72 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20  er to a virtual 
2fcb0 74 61 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e  table object, an
2fcc0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74   sqlite3_vtab st
2fcd0 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 69 73  ructure..** This
2fce0 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20   opcode invokes 
2fcf0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2fd00 67 20 78 52 65 6e 61 6d 65 20 6d 65 74 68 6f 64  g xRename method
2fd10 2e 20 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69  . The value.** i
2fd20 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  n register P1 is
2fd30 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 7a   passed as the z
2fd40 4e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f  Name argument to
2fd50 20 74 68 65 20 78 52 65 6e 61 6d 65 20 6d 65 74   the xRename met
2fd60 68 6f 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  hod..*/.case OP_
2fd70 56 52 65 6e 61 6d 65 3a 20 7b 0a 20 20 73 71 6c  VRename: {.  sql
2fd80 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
2fd90 3b 0a 20 20 4d 65 6d 20 2a 70 4e 61 6d 65 3b 0a  ;.  Mem *pName;.
2fda0 0a 20 20 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  .  pVtab = pOp->
2fdb0 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b  p4.pVtab->pVtab;
2fdc0 0a 20 20 70 4e 61 6d 65 20 3d 20 26 61 4d 65 6d  .  pName = &aMem
2fdd0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
2fde0 65 72 74 28 20 70 56 74 61 62 2d 3e 70 4d 6f 64  ert( pVtab->pMod
2fdf0 75 6c 65 2d 3e 78 52 65 6e 61 6d 65 20 29 3b 0a  ule->xRename );.
2fe00 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
2fe10 61 6c 69 64 28 70 4e 61 6d 65 29 20 29 3b 0a 20  alid(pName) );. 
2fe20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64   assert( p->read
2fe30 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 52 45 47  Only==0 );.  REG
2fe40 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
2fe50 3e 70 31 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 61  >p1, pName);.  a
2fe60 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 66 6c  ssert( pName->fl
2fe70 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b  ags & MEM_Str );
2fe80 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4e 61  .  testcase( pNa
2fe90 6d 65 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  me->enc==SQLITE_
2fea0 55 54 46 38 20 29 3b 0a 20 20 74 65 73 74 63 61  UTF8 );.  testca
2feb0 73 65 28 20 70 4e 61 6d 65 2d 3e 65 6e 63 3d 3d  se( pName->enc==
2fec0 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
2fed0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4e  ;.  testcase( pN
2fee0 61 6d 65 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  ame->enc==SQLITE
2fef0 5f 55 54 46 31 36 4c 45 20 29 3b 0a 20 20 72 63  _UTF16LE );.  rc
2ff00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
2ff10 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4e 61  angeEncoding(pNa
2ff20 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  me, SQLITE_UTF8)
2ff30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2ff40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
2ff50 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  = pVtab->pModule
2ff60 2d 3e 78 52 65 6e 61 6d 65 28 70 56 74 61 62 2c  ->xRename(pVtab,
2ff70 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20   pName->z);.    
2ff80 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72  sqlite3VtabImpor
2ff90 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74 61 62  tErrmsg(p, pVtab
2ffa0 29 3b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  );.    p->expire
2ffb0 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 62 72 65  d = 0;.  }.  bre
2ffc0 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ak;.}.#endif..#i
2ffd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ffe0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
2fff0 2a 20 4f 70 63 6f 64 65 3a 20 56 55 70 64 61 74  * Opcode: VUpdat
30000 65 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  e P1 P2 P3 P4 *.
30010 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f  **.** P4 is a po
30020 69 6e 74 65 72 20 74 6f 20 61 20 76 69 72 74 75  inter to a virtu
30030 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 2c  al table object,
30040 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
30050 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54   structure..** T
30060 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b  his opcode invok
30070 65 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  es the correspon
30080 64 69 6e 67 20 78 55 70 64 61 74 65 20 6d 65 74  ding xUpdate met
30090 68 6f 64 2e 20 50 32 20 76 61 6c 75 65 73 0a 2a  hod. P2 values.*
300a0 2a 20 61 72 65 20 63 6f 6e 74 69 67 75 6f 75 73  * are contiguous
300b0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 73 74   memory cells st
300c0 61 72 74 69 6e 67 20 61 74 20 50 33 20 74 6f 20  arting at P3 to 
300d0 70 61 73 73 20 74 6f 20 74 68 65 20 78 55 70 64  pass to the xUpd
300e0 61 74 65 20 0a 2a 2a 20 69 6e 76 6f 63 61 74 69  ate .** invocati
300f0 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 69 6e  on. The value in
30100 20 72 65 67 69 73 74 65 72 20 28 50 33 2b 50 32   register (P3+P2
30110 2d 31 29 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  -1) corresponds 
30120 74 6f 20 74 68 65 20 0a 2a 2a 20 70 32 74 68 20  to the .** p2th 
30130 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61  element of the a
30140 72 67 76 20 61 72 72 61 79 20 70 61 73 73 65 64  rgv array passed
30150 20 74 6f 20 78 55 70 64 61 74 65 2e 0a 2a 2a 0a   to xUpdate..**.
30160 2a 2a 20 54 68 65 20 78 55 70 64 61 74 65 20 6d  ** The xUpdate m
30170 65 74 68 6f 64 20 77 69 6c 6c 20 64 6f 20 61 20  ethod will do a 
30180 44 45 4c 45 54 45 20 6f 72 20 61 6e 20 49 4e 53  DELETE or an INS
30190 45 52 54 20 6f 72 20 62 6f 74 68 2e 0a 2a 2a 20  ERT or both..** 
301a0 54 68 65 20 61 72 67 76 5b 30 5d 20 65 6c 65 6d  The argv[0] elem
301b0 65 6e 74 20 28 77 68 69 63 68 20 63 6f 72 72 65  ent (which corre
301c0 73 70 6f 6e 64 73 20 74 6f 20 6d 65 6d 6f 72 79  sponds to memory
301d0 20 63 65 6c 6c 20 50 33 29 0a 2a 2a 20 69 73 20   cell P3).** is 
301e0 74 68 65 20 72 6f 77 69 64 20 6f 66 20 61 20 72  the rowid of a r
301f0 6f 77 20 74 6f 20 64 65 6c 65 74 65 2e 20 20 49  ow to delete.  I
30200 66 20 61 72 67 76 5b 30 5d 20 69 73 20 4e 55 4c  f argv[0] is NUL
30210 4c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 64 65  L then no .** de
30220 6c 65 74 69 6f 6e 20 6f 63 63 75 72 73 2e 20 20  letion occurs.  
30230 54 68 65 20 61 72 67 76 5b 31 5d 20 65 6c 65 6d  The argv[1] elem
30240 65 6e 74 20 69 73 20 74 68 65 20 72 6f 77 69 64  ent is the rowid
30250 20 6f 66 20 74 68 65 20 6e 65 77 20 0a 2a 2a 20   of the new .** 
30260 72 6f 77 2e 20 20 54 68 69 73 20 63 61 6e 20 62  row.  This can b
30270 65 20 4e 55 4c 4c 20 74 6f 20 68 61 76 65 20 74  e NULL to have t
30280 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
30290 20 73 65 6c 65 63 74 20 74 68 65 20 6e 65 77 20   select the new 
302a0 0a 2a 2a 20 72 6f 77 69 64 20 66 6f 72 20 69 74  .** rowid for it
302b0 73 65 6c 66 2e 20 20 54 68 65 20 73 75 62 73 65  self.  The subse
302c0 71 75 65 6e 74 20 65 6c 65 6d 65 6e 74 73 20 69  quent elements i
302d0 6e 20 74 68 65 20 61 72 72 61 79 20 61 72 65 20  n the array are 
302e0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 6f  .** the values o
302f0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
30300 20 6e 65 77 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20   new row..**.** 
30310 49 66 20 50 32 3d 3d 31 20 74 68 65 6e 20 6e 6f  If P2==1 then no
30320 20 69 6e 73 65 72 74 20 69 73 20 70 65 72 66 6f   insert is perfo
30330 72 6d 65 64 2e 20 20 61 72 67 76 5b 30 5d 20 69  rmed.  argv[0] i
30340 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 0a 2a  s the rowid of.*
30350 2a 20 61 20 72 6f 77 20 74 6f 20 64 65 6c 65 74  * a row to delet
30360 65 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61  e..**.** P1 is a
30370 20 62 6f 6f 6c 65 61 6e 20 66 6c 61 67 2e 20 49   boolean flag. I
30380 66 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 74  f it is set to t
30390 72 75 65 20 61 6e 64 20 74 68 65 20 78 55 70 64  rue and the xUpd
303a0 61 74 65 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 73  ate call.** is s
303b0 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 6e 20  uccessful, then 
303c0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
303d0 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6c 61  ed by sqlite3_la
303e0 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
303f0 29 20 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ) .** is set to 
30400 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
30410 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 72   rowid for the r
30420 6f 77 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64  ow just inserted
30430 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 55 70  ..*/.case OP_VUp
30440 64 61 74 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65  date: {.  sqlite
30450 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20  3_vtab *pVtab;. 
30460 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
30470 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e 74 20  *pModule;.  int 
30480 6e 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  nArg;.  int i;. 
30490 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f   sqlite_int64 ro
304a0 77 69 64 3b 0a 20 20 4d 65 6d 20 2a 2a 61 70 41  wid;.  Mem **apA
304b0 72 67 3b 0a 20 20 4d 65 6d 20 2a 70 58 3b 0a 0a  rg;.  Mem *pX;..
304c0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
304d0 32 3d 3d 31 20 20 20 20 20 20 20 20 7c 7c 20 70  2==1        || p
304e0 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 46 61 69 6c 20  Op->p5==OE_Fail 
304f0 20 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45    || pOp->p5==OE
30500 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20  _Rollback .     
30510 20 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45    || pOp->p5==OE
30520 5f 41 62 6f 72 74 20 7c 7c 20 70 4f 70 2d 3e 70  _Abort || pOp->p
30530 35 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 7c 7c 20  5==OE_Ignore || 
30540 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 52 65 70 6c  pOp->p5==OE_Repl
30550 61 63 65 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  ace.  );.  asser
30560 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  t( p->readOnly==
30570 30 20 29 3b 0a 20 20 70 56 74 61 62 20 3d 20 70  0 );.  pVtab = p
30580 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56  Op->p4.pVtab->pV
30590 74 61 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d  tab;.  pModule =
305a0 20 28 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65   (sqlite3_module
305b0 20 2a 29 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c   *)pVtab->pModul
305c0 65 3b 0a 20 20 6e 41 72 67 20 3d 20 70 4f 70 2d  e;.  nArg = pOp-
305d0 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >p2;.  assert( p
305e0 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 56  Op->p4type==P4_V
305f0 54 41 42 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  TAB );.  if( ALW
30600 41 59 53 28 70 4d 6f 64 75 6c 65 2d 3e 78 55 70  AYS(pModule->xUp
30610 64 61 74 65 29 20 29 7b 0a 20 20 20 20 75 38 20  date) ){.    u8 
30620 76 74 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 20 3d  vtabOnConflict =
30630 20 64 62 2d 3e 76 74 61 62 4f 6e 43 6f 6e 66 6c   db->vtabOnConfl
30640 69 63 74 3b 0a 20 20 20 20 61 70 41 72 67 20 3d  ict;.    apArg =
30650 20 70 2d 3e 61 70 41 72 67 3b 0a 20 20 20 20 70   p->apArg;.    p
30660 58 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  X = &aMem[pOp->p
30670 33 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  3];.    for(i=0;
30680 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
30690 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
306a0 49 73 56 61 6c 69 64 28 70 58 29 20 29 3b 0a 20  IsValid(pX) );. 
306b0 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43       memAboutToC
306c0 68 61 6e 67 65 28 70 2c 20 70 58 29 3b 0a 20 20  hange(p, pX);.  
306d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
306e0 65 6d 53 74 6f 72 65 54 79 70 65 28 70 58 29 3b  emStoreType(pX);
306f0 0a 20 20 20 20 20 20 61 70 41 72 67 5b 69 5d 20  .      apArg[i] 
30700 3d 20 70 58 3b 0a 20 20 20 20 20 20 70 58 2b 2b  = pX;.      pX++
30710 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
30720 76 74 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 20 3d  vtabOnConflict =
30730 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 20 20 72 63   pOp->p5;.    rc
30740 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 55 70 64   = pModule->xUpd
30750 61 74 65 28 70 56 74 61 62 2c 20 6e 41 72 67 2c  ate(pVtab, nArg,
30760 20 61 70 41 72 67 2c 20 26 72 6f 77 69 64 29 3b   apArg, &rowid);
30770 0a 20 20 20 20 64 62 2d 3e 76 74 61 62 4f 6e 43  .    db->vtabOnC
30780 6f 6e 66 6c 69 63 74 20 3d 20 76 74 61 62 4f 6e  onflict = vtabOn
30790 43 6f 6e 66 6c 69 63 74 3b 0a 20 20 20 20 73 71  Conflict;.    sq
307a0 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45  lite3VtabImportE
307b0 72 72 6d 73 67 28 70 2c 20 70 56 74 61 62 29 3b  rrmsg(p, pVtab);
307c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
307d0 49 54 45 5f 4f 4b 20 26 26 20 70 4f 70 2d 3e 70  ITE_OK && pOp->p
307e0 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  1 ){.      asser
307f0 74 28 20 6e 41 72 67 3e 31 20 26 26 20 61 70 41  t( nArg>1 && apA
30800 72 67 5b 30 5d 20 26 26 20 28 61 70 41 72 67 5b  rg[0] && (apArg[
30810 30 5d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  0]->flags&MEM_Nu
30820 6c 6c 29 20 29 3b 0a 20 20 20 20 20 20 64 62 2d  ll) );.      db-
30830 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6c 61 73  >lastRowid = las
30840 74 52 6f 77 69 64 20 3d 20 72 6f 77 69 64 3b 0a  tRowid = rowid;.
30850 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72      }.    if( (r
30860 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
30870 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f  CONSTRAINT && pO
30880 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 62 43 6f  p->p4.pVtab->bCo
30890 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20  nstraint ){.    
308a0 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3d 3d 4f    if( pOp->p5==O
308b0 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20  E_Ignore ){.    
308c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
308d0 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OK;.      }else{
308e0 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 72 72 6f  .        p->erro
308f0 72 41 63 74 69 6f 6e 20 3d 20 28 28 70 4f 70 2d  rAction = ((pOp-
30900 3e 70 35 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29  >p5==OE_Replace)
30910 20 3f 20 4f 45 5f 41 62 6f 72 74 20 3a 20 70 4f   ? OE_Abort : pO
30920 70 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 7d 0a  p->p5);.      }.
30930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30940 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20   p->nChange++;. 
30950 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
30960 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
30970 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
30980 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64  LTABLE */..#ifnd
30990 65 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ef  SQLITE_OMIT_
309a0 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f 2a  PAGER_PRAGMAS./*
309b0 20 4f 70 63 6f 64 65 3a 20 50 61 67 65 63 6f 75   Opcode: Pagecou
309c0 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  nt P1 P2 * * *.*
309d0 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 63  *.** Write the c
309e0 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  urrent number of
309f0 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
30a00 73 65 20 50 31 20 74 6f 20 6d 65 6d 6f 72 79 20  se P1 to memory 
30a10 63 65 6c 6c 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  cell P2..*/.case
30a20 20 4f 50 5f 50 61 67 65 63 6f 75 6e 74 3a 20 7b   OP_Pagecount: {
30a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
30a40 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a  ut2-prerelease *
30a50 2f 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  /.  pOut->u.i = 
30a60 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
30a70 50 61 67 65 28 64 62 2d 3e 61 44 62 5b 70 4f 70  Page(db->aDb[pOp
30a80 2d 3e 70 31 5d 2e 70 42 74 29 3b 0a 20 20 62 72  ->p1].pBt);.  br
30a90 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  eak;.}.#endif...
30aa0 23 69 66 6e 64 65 66 20 20 53 51 4c 49 54 45 5f  #ifndef  SQLITE_
30ab0 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
30ac0 41 53 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 61  AS./* Opcode: Ma
30ad0 78 50 67 63 6e 74 20 50 31 20 50 32 20 50 33 20  xPgcnt P1 P2 P3 
30ae0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f  * *.**.** Try to
30af0 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
30b00 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
30b10 64 61 74 61 62 61 73 65 20 50 31 20 74 6f 20 74  database P1 to t
30b20 68 65 20 76 61 6c 75 65 20 69 6e 20 50 33 2e 0a  he value in P3..
30b30 2a 2a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68  ** Do not let th
30b40 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
30b50 6f 75 6e 74 20 66 61 6c 6c 20 62 65 6c 6f 77 20  ount fall below 
30b60 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
30b70 20 63 6f 75 6e 74 20 61 6e 64 0a 2a 2a 20 64 6f   count and.** do
30b80 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
30b90 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
30ba0 6e 74 20 76 61 6c 75 65 20 69 66 20 50 33 3d 3d  nt value if P3==
30bb0 30 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 74  0..**.** Store t
30bc0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
30bd0 63 6f 75 6e 74 20 61 66 74 65 72 20 74 68 65 20  count after the 
30be0 63 68 61 6e 67 65 20 69 6e 20 72 65 67 69 73 74  change in regist
30bf0 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f  er P2..*/.case O
30c00 50 5f 4d 61 78 50 67 63 6e 74 3a 20 7b 20 20 20  P_MaxPgcnt: {   
30c10 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
30c20 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20  -prerelease */. 
30c30 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65   unsigned int ne
30c40 77 4d 61 78 3b 0a 20 20 42 74 72 65 65 20 2a 70  wMax;.  Btree *p
30c50 42 74 3b 0a 0a 20 20 70 42 74 20 3d 20 64 62 2d  Bt;..  pBt = db-
30c60 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42  >aDb[pOp->p1].pB
30c70 74 3b 0a 20 20 6e 65 77 4d 61 78 20 3d 20 30 3b  t;.  newMax = 0;
30c80 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 20 29  .  if( pOp->p3 )
30c90 7b 0a 20 20 20 20 6e 65 77 4d 61 78 20 3d 20 73  {.    newMax = s
30ca0 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50  qlite3BtreeLastP
30cb0 61 67 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66  age(pBt);.    if
30cc0 28 20 6e 65 77 4d 61 78 20 3c 20 28 75 6e 73 69  ( newMax < (unsi
30cd0 67 6e 65 64 29 70 4f 70 2d 3e 70 33 20 29 20 6e  gned)pOp->p3 ) n
30ce0 65 77 4d 61 78 20 3d 20 28 75 6e 73 69 67 6e 65  ewMax = (unsigne
30cf0 64 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 0a 20  d)pOp->p3;.  }. 
30d00 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 73 71 6c   pOut->u.i = sql
30d10 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65  ite3BtreeMaxPage
30d20 43 6f 75 6e 74 28 70 42 74 2c 20 6e 65 77 4d 61  Count(pBt, newMa
30d30 78 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  x);.  break;.}.#
30d40 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
30d50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
30d60 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 72 61  E./* Opcode: Tra
30d70 63 65 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  ce * * * P4 *.**
30d80 0a 2a 2a 20 49 66 20 74 72 61 63 69 6e 67 20 69  .** If tracing i
30d90 73 20 65 6e 61 62 6c 65 64 20 28 62 79 20 74 68  s enabled (by th
30da0 65 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28  e sqlite3_trace(
30db0 29 29 20 69 6e 74 65 72 66 61 63 65 2c 20 74 68  )) interface, th
30dc0 65 6e 0a 2a 2a 20 74 68 65 20 55 54 46 2d 38 20  en.** the UTF-8 
30dd0 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 65 64  string contained
30de0 20 69 6e 20 50 34 20 69 73 20 65 6d 69 74 74 65   in P4 is emitte
30df0 64 20 6f 6e 20 74 68 65 20 74 72 61 63 65 20 63  d on the trace c
30e00 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 63 61 73 65  allback..*/.case
30e10 20 4f 50 5f 54 72 61 63 65 3a 20 7b 0a 20 20 63   OP_Trace: {.  c
30e20 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 63  har *zTrace;.  c
30e30 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 64  har *z;..  if( d
30e40 62 2d 3e 78 54 72 61 63 65 0a 20 20 20 26 26 20  b->xTrace.   && 
30e50 21 70 2d 3e 64 6f 69 6e 67 52 65 72 75 6e 0a 20  !p->doingRerun. 
30e60 20 20 26 26 20 28 7a 54 72 61 63 65 20 3d 20 28    && (zTrace = (
30e70 70 4f 70 2d 3e 70 34 2e 7a 20 3f 20 70 4f 70 2d  pOp->p4.z ? pOp-
30e80 3e 70 34 2e 7a 20 3a 20 70 2d 3e 7a 53 71 6c 29  >p4.z : p->zSql)
30e90 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 7a 20  )!=0.  ){.    z 
30ea0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  = sqlite3VdbeExp
30eb0 61 6e 64 53 71 6c 28 70 2c 20 7a 54 72 61 63 65  andSql(p, zTrace
30ec0 29 3b 0a 20 20 20 20 64 62 2d 3e 78 54 72 61 63  );.    db->xTrac
30ed0 65 28 64 62 2d 3e 70 54 72 61 63 65 41 72 67 2c  e(db->pTraceArg,
30ee0 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   z);.    sqlite3
30ef0 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
30f00 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
30f10 5f 55 53 45 5f 46 43 4e 54 4c 5f 54 52 41 43 45  _USE_FCNTL_TRACE
30f20 0a 20 20 7a 54 72 61 63 65 20 3d 20 28 70 4f 70  .  zTrace = (pOp
30f30 2d 3e 70 34 2e 7a 20 3f 20 70 4f 70 2d 3e 70 34  ->p4.z ? pOp->p4
30f40 2e 7a 20 3a 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20  .z : p->zSql);. 
30f50 20 69 66 28 20 7a 54 72 61 63 65 20 29 7b 0a 20   if( zTrace ){. 
30f60 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
30f70 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
30f80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
30f90 28 20 28 28 31 3c 3c 69 29 20 26 20 70 2d 3e 62  ( ((1<<i) & p->b
30fa0 74 72 65 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63  treeMask)==0 ) c
30fb0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 73  ontinue;.      s
30fc0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
30fd0 72 6f 6c 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b  rol(db, db->aDb[
30fe0 69 5d 2e 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  i].zName, SQLITE
30ff0 5f 46 43 4e 54 4c 5f 54 52 41 43 45 2c 20 7a 54  _FCNTL_TRACE, zT
31000 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  race);.    }.  }
31010 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
31020 45 5f 55 53 45 5f 46 43 4e 54 4c 5f 54 52 41 43  E_USE_FCNTL_TRAC
31030 45 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  E */.#ifdef SQLI
31040 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 28  TE_DEBUG.  if( (
31050 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
31060 54 45 5f 53 71 6c 54 72 61 63 65 29 21 3d 30 0a  TE_SqlTrace)!=0.
31070 20 20 20 26 26 20 28 7a 54 72 61 63 65 20 3d 20     && (zTrace = 
31080 28 70 4f 70 2d 3e 70 34 2e 7a 20 3f 20 70 4f 70  (pOp->p4.z ? pOp
31090 2d 3e 70 34 2e 7a 20 3a 20 70 2d 3e 7a 53 71 6c  ->p4.z : p->zSql
310a0 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 73  ))!=0.  ){.    s
310b0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
310c0 66 28 22 53 51 4c 2d 74 72 61 63 65 3a 20 25 73  f("SQL-trace: %s
310d0 5c 6e 22 2c 20 7a 54 72 61 63 65 29 3b 0a 20 20  \n", zTrace);.  
310e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
310f0 54 45 5f 44 45 42 55 47 20 2a 2f 0a 20 20 62 72  TE_DEBUG */.  br
31100 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  eak;.}.#endif...
31110 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 6f 70 20  /* Opcode: Noop 
31120 2a 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  * * * * *.**.** 
31130 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 20 54 68 69  Do nothing.  Thi
31140 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  s instruction is
31150 20 6f 66 74 65 6e 20 75 73 65 66 75 6c 20 61 73   often useful as
31160 20 61 20 6a 75 6d 70 0a 2a 2a 20 64 65 73 74 69   a jump.** desti
31170 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a  nation..*/./*.**
31180 20 54 68 65 20 6d 61 67 69 63 20 45 78 70 6c 61   The magic Expla
31190 69 6e 20 6f 70 63 6f 64 65 20 61 72 65 20 6f 6e  in opcode are on
311a0 6c 79 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e  ly inserted when
311b0 20 65 78 70 6c 61 69 6e 3d 3d 32 20 28 77 68 69   explain==2 (whi
311c0 63 68 0a 2a 2a 20 69 73 20 74 6f 20 73 61 79 20  ch.** is to say 
311d0 77 68 65 6e 20 74 68 65 20 45 58 50 4c 41 49 4e  when the EXPLAIN
311e0 20 51 55 45 52 59 20 50 4c 41 4e 20 73 79 6e 74   QUERY PLAN synt
311f0 61 78 20 69 73 20 75 73 65 64 2e 29 0a 2a 2a 20  ax is used.).** 
31200 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65 63 6f  This opcode reco
31210 72 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rds information 
31220 66 72 6f 6d 20 74 68 65 20 6f 70 74 69 6d 69 7a  from the optimiz
31230 65 72 2e 20 20 49 74 20 69 73 20 74 68 65 0a 2a  er.  It is the.*
31240 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20  * the same as a 
31250 6e 6f 2d 6f 70 2e 20 20 54 68 69 73 20 6f 70 63  no-op.  This opc
31260 6f 64 65 73 6e 65 76 65 72 20 61 70 70 65 61 72  odesnever appear
31270 73 20 69 6e 20 61 20 72 65 61 6c 20 56 4d 20 70  s in a real VM p
31280 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 64 65 66 61 75  rogram..*/.defau
31290 6c 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 2f  lt: {          /
312a0 2a 20 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79  * This is really
312b0 20 4f 50 5f 4e 6f 6f 70 20 61 6e 64 20 4f 50 5f   OP_Noop and OP_
312c0 45 78 70 6c 61 69 6e 20 2a 2f 0a 20 20 61 73 73  Explain */.  ass
312d0 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
312e0 3d 3d 4f 50 5f 4e 6f 6f 70 20 7c 7c 20 70 4f 70  ==OP_Noop || pOp
312f0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 78 70  ->opcode==OP_Exp
31300 6c 61 69 6e 20 29 3b 0a 20 20 62 72 65 61 6b 3b  lain );.  break;
31310 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
31320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31360 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 73 65 73 20  **.** The cases 
31370 6f 66 20 74 68 65 20 73 77 69 74 63 68 20 73 74  of the switch st
31380 61 74 65 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  atement above th
31390 69 73 20 6c 69 6e 65 20 73 68 6f 75 6c 64 20 61  is line should a
313a0 6c 6c 20 62 65 20 69 6e 64 65 6e 74 65 64 0a 2a  ll be indented.*
313b0 2a 20 62 79 20 36 20 73 70 61 63 65 73 2e 20 20  * by 6 spaces.  
313c0 42 75 74 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  But the left-mos
313d0 74 20 36 20 73 70 61 63 65 73 20 68 61 76 65 20  t 6 spaces have 
313e0 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 74 6f 20  been removed to 
313f0 69 6d 70 72 6f 76 65 20 74 68 65 0a 2a 2a 20 72  improve the.** r
31400 65 61 64 61 62 69 6c 69 74 79 2e 20 20 46 72 6f  eadability.  Fro
31410 6d 20 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e 20  m this point on 
31420 64 6f 77 6e 2c 20 74 68 65 20 6e 6f 72 6d 61 6c  down, the normal
31430 20 69 6e 64 65 6e 74 61 74 69 6f 6e 20 72 75 6c   indentation rul
31440 65 73 20 61 72 65 0a 2a 2a 20 72 65 73 74 6f 72  es are.** restor
31450 65 64 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ed..************
31460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
314a0 2a 2f 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  */.    }..#ifdef
314b0 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
314c0 20 20 7b 0a 20 20 20 20 20 20 75 36 34 20 65 6c    {.      u64 el
314d0 61 70 73 65 64 20 3d 20 73 71 6c 69 74 65 33 48  apsed = sqlite3H
314e0 77 74 69 6d 65 28 29 20 2d 20 73 74 61 72 74 3b  wtime() - start;
314f0 0a 20 20 20 20 20 20 70 4f 70 2d 3e 63 79 63 6c  .      pOp->cycl
31500 65 73 20 2b 3d 20 65 6c 61 70 73 65 64 3b 0a 20  es += elapsed;. 
31510 20 20 20 20 20 70 4f 70 2d 3e 63 6e 74 2b 2b 3b       pOp->cnt++;
31520 0a 23 69 66 20 30 0a 20 20 20 20 20 20 20 20 66  .#if 0.        f
31530 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
31540 25 31 30 6c 6c 75 20 22 2c 20 65 6c 61 70 73 65  %10llu ", elapse
31550 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
31560 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 73  te3VdbePrintOp(s
31570 74 64 6f 75 74 2c 20 6f 72 69 67 50 63 2c 20 26  tdout, origPc, &
31580 61 4f 70 5b 6f 72 69 67 50 63 5d 29 3b 0a 23 65  aOp[origPc]);.#e
31590 6e 64 69 66 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ndif.    }.#endi
315a0 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  f..    /* The fo
315b0 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 61 64 64  llowing code add
315c0 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 65  s nothing to the
315d0 20 61 63 74 75 61 6c 20 66 75 6e 63 74 69 6f 6e   actual function
315e0 61 6c 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20  ality.    ** of 
315f0 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 49 74  the program.  It
31600 20 69 73 20 6f 6e 6c 79 20 68 65 72 65 20 66 6f   is only here fo
31610 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
31620 62 75 67 67 69 6e 67 2e 0a 20 20 20 20 2a 2a 20  bugging..    ** 
31630 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
31640 64 2c 20 69 74 20 64 6f 65 73 20 62 75 72 6e 20  d, it does burn 
31650 43 50 55 20 63 79 63 6c 65 73 20 65 76 65 72 79  CPU cycles every
31660 20 74 69 6d 65 20 74 68 72 6f 75 67 68 0a 20 20   time through.  
31670 20 20 2a 2a 20 74 68 65 20 65 76 61 6c 75 61 74    ** the evaluat
31680 6f 72 20 6c 6f 6f 70 2e 20 20 53 6f 20 77 65 20  or loop.  So we 
31690 63 61 6e 20 6c 65 61 76 65 20 69 74 20 6f 75 74  can leave it out
316a0 20 77 68 65 6e 20 4e 44 45 42 55 47 20 69 73 20   when NDEBUG is 
316b0 64 65 66 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a  defined..    */.
316c0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
316d0 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 2d     assert( pc>=-
316e0 31 20 26 26 20 70 63 3c 70 2d 3e 6e 4f 70 20 29  1 && pc<p->nOp )
316f0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
31700 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70  _DEBUG.    if( p
31710 2d 3e 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20  ->trace ){.     
31720 20 69 66 28 20 72 63 21 3d 30 20 29 20 66 70 72   if( rc!=0 ) fpr
31730 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 2c 22 72  intf(p->trace,"r
31740 63 3d 25 64 5c 6e 22 2c 72 63 29 3b 0a 20 20 20  c=%d\n",rc);.   
31750 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 66 6c     if( pOp->opfl
31760 61 67 73 20 26 20 28 4f 50 46 4c 47 5f 4f 55 54  ags & (OPFLG_OUT
31770 32 5f 50 52 45 52 45 4c 45 41 53 45 7c 4f 50 46  2_PRERELEASE|OPF
31780 4c 47 5f 4f 55 54 32 29 20 29 7b 0a 20 20 20 20  LG_OUT2) ){.    
31790 20 20 20 20 72 65 67 69 73 74 65 72 54 72 61 63      registerTrac
317a0 65 28 70 2d 3e 74 72 61 63 65 2c 20 70 4f 70 2d  e(p->trace, pOp-
317b0 3e 70 32 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  >p2, &aMem[pOp->
317c0 70 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  p2]);.      }.  
317d0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 66      if( pOp->opf
317e0 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 4f 55 54  lags & OPFLG_OUT
317f0 33 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 67  3 ){.        reg
31800 69 73 74 65 72 54 72 61 63 65 28 70 2d 3e 74 72  isterTrace(p->tr
31810 61 63 65 2c 20 70 4f 70 2d 3e 70 33 2c 20 26 61  ace, pOp->p3, &a
31820 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20  Mem[pOp->p3]);. 
31830 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
31840 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 44  dif  /* SQLITE_D
31850 45 42 55 47 20 2a 2f 0a 23 65 6e 64 69 66 20 20  EBUG */.#endif  
31860 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 20 20 7d  /* NDEBUG */.  }
31870 20 20 2f 2a 20 54 68 65 20 65 6e 64 20 6f 66 20    /* The end of 
31880 74 68 65 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70  the for(;;) loop
31890 20 74 68 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75   the loops throu
318a0 67 68 20 6f 70 63 6f 64 65 73 20 2a 2f 0a 0a 20  gh opcodes */.. 
318b0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
318c0 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
318d0 65 61 6e 73 20 74 68 61 74 20 65 78 65 63 75 74  eans that execut
318e0 69 6f 6e 20 69 73 20 66 69 6e 69 73 68 65 64 20  ion is finished 
318f0 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 65 72 72  with.  ** an err
31900 6f 72 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  or of some kind.
31910 0a 20 20 2a 2f 0a 76 64 62 65 5f 65 72 72 6f 72  .  */.vdbe_error
31920 5f 68 61 6c 74 3a 0a 20 20 61 73 73 65 72 74 28  _halt:.  assert(
31930 20 72 63 20 29 3b 0a 20 20 70 2d 3e 72 63 20 3d   rc );.  p->rc =
31940 20 72 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28   rc;.  testcase(
31950 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
31960 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
31970 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 72 63    sqlite3_log(rc
31980 2c 20 22 73 74 61 74 65 6d 65 6e 74 20 61 62 6f  , "statement abo
31990 72 74 73 20 61 74 20 25 64 3a 20 5b 25 73 5d 20  rts at %d: [%s] 
319a0 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  %s", .          
319b0 20 20 20 20 20 20 20 20 20 70 63 2c 20 70 2d 3e           pc, p->
319c0 7a 53 71 6c 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  zSql, p->zErrMsg
319d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
319e0 48 61 6c 74 28 70 29 3b 0a 20 20 69 66 28 20 72  Halt(p);.  if( r
319f0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
31a00 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c  NOMEM ) db->mall
31a10 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
31a20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
31a30 52 3b 0a 20 20 69 66 28 20 72 65 73 65 74 53 63  R;.  if( resetSc
31a40 68 65 6d 61 4f 6e 46 61 75 6c 74 3e 30 20 29 7b  hemaOnFault>0 ){
31a50 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
31a60 74 4f 6e 65 53 63 68 65 6d 61 28 64 62 2c 20 72  tOneSchema(db, r
31a70 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c  esetSchemaOnFaul
31a80 74 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  t-1);.  }..  /* 
31a90 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  This is the only
31aa0 20 77 61 79 20 6f 75 74 20 6f 66 20 74 68 69 73   way out of this
31ab0 20 70 72 6f 63 65 64 75 72 65 2e 20 20 57 65 20   procedure.  We 
31ac0 68 61 76 65 20 74 6f 0a 20 20 2a 2a 20 72 65 6c  have to.  ** rel
31ad0 65 61 73 65 20 74 68 65 20 6d 75 74 65 78 65 73  ease the mutexes
31ae0 20 6f 6e 20 62 74 72 65 65 73 20 74 68 61 74 20   on btrees that 
31af0 77 65 72 65 20 61 63 71 75 69 72 65 64 20 61 74  were acquired at
31b00 20 74 68 65 0a 20 20 2a 2a 20 74 6f 70 2e 20 2a   the.  ** top. *
31b10 2f 0a 76 64 62 65 5f 72 65 74 75 72 6e 3a 0a 20  /.vdbe_return:. 
31b20 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d   db->lastRowid =
31b30 20 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 74 65   lastRowid;.  te
31b40 73 74 63 61 73 65 28 20 6e 56 6d 53 74 65 70 3e  stcase( nVmStep>
31b50 30 20 29 3b 0a 20 20 70 2d 3e 61 43 6f 75 6e 74  0 );.  p->aCount
31b60 65 72 5b 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  er[SQLITE_STMTST
31b70 41 54 55 53 5f 56 4d 5f 53 54 45 50 5d 20 2b 3d  ATUS_VM_STEP] +=
31b80 20 28 69 6e 74 29 6e 56 6d 53 74 65 70 3b 0a 20   (int)nVmStep;. 
31b90 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
31ba0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
31bb0 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  c;..  /* Jump to
31bc0 20 68 65 72 65 20 69 66 20 61 20 73 74 72 69 6e   here if a strin
31bd0 67 20 6f 72 20 62 6c 6f 62 20 6c 61 72 67 65 72  g or blob larger
31be0 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58   than SQLITE_MAX
31bf0 5f 4c 45 4e 47 54 48 0a 20 20 2a 2a 20 69 73 20  _LENGTH.  ** is 
31c00 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 20 20 2a  encountered..  *
31c10 2f 0a 74 6f 6f 5f 62 69 67 3a 0a 20 20 73 71 6c  /.too_big:.  sql
31c20 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
31c30 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
31c40 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74  string or blob t
31c50 6f 6f 20 62 69 67 22 29 3b 0a 20 20 72 63 20 3d  oo big");.  rc =
31c60 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3b 0a   SQLITE_TOOBIG;.
31c70 20 20 67 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f    goto vdbe_erro
31c80 72 5f 68 61 6c 74 3b 0a 0a 20 20 2f 2a 20 4a 75  r_halt;..  /* Ju
31c90 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 61 20  mp to here if a 
31ca0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
31cb0 20 20 2a 2f 0a 6e 6f 5f 6d 65 6d 3a 0a 20 20 64    */.no_mem:.  d
31cc0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
31cd0 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  = 1;.  sqlite3Se
31ce0 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
31cf0 4d 73 67 2c 20 64 62 2c 20 22 6f 75 74 20 6f 66  Msg, db, "out of
31d00 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 72 63 20   memory");.  rc 
31d10 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
31d20 20 20 67 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f    goto vdbe_erro
31d30 72 5f 68 61 6c 74 3b 0a 0a 20 20 2f 2a 20 4a 75  r_halt;..  /* Ju
31d40 6d 70 20 74 6f 20 68 65 72 65 20 66 6f 72 20 61  mp to here for a
31d50 6e 79 20 6f 74 68 65 72 20 6b 69 6e 64 20 6f 66  ny other kind of
31d60 20 66 61 74 61 6c 20 65 72 72 6f 72 2e 20 20 54   fatal error.  T
31d70 68 65 20 22 72 63 22 20 76 61 72 69 61 62 6c 65  he "rc" variable
31d80 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 6f 6c  .  ** should hol
31d90 64 20 74 68 65 20 65 72 72 6f 72 20 6e 75 6d 62  d the error numb
31da0 65 72 2e 0a 20 20 2a 2f 0a 61 62 6f 72 74 5f 64  er..  */.abort_d
31db0 75 65 5f 74 6f 5f 65 72 72 6f 72 3a 0a 20 20 61  ue_to_error:.  a
31dc0 73 73 65 72 74 28 20 70 2d 3e 7a 45 72 72 4d 73  ssert( p->zErrMs
31dd0 67 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62  g==0 );.  if( db
31de0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
31df0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
31e00 45 4d 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  EM;.  if( rc!=SQ
31e10 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
31e20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
31e30 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
31e40 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20  rMsg, db, "%s", 
31e50 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
31e60 29 29 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20 76  ));.  }.  goto v
31e70 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a  dbe_error_halt;.
31e80 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65  .  /* Jump to he
31e90 72 65 20 69 66 20 74 68 65 20 73 71 6c 69 74 65  re if the sqlite
31ea0 33 5f 69 6e 74 65 72 72 75 70 74 28 29 20 41 50  3_interrupt() AP
31eb0 49 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72  I sets the inter
31ec0 72 75 70 74 0a 20 20 2a 2a 20 66 6c 61 67 2e 0a  rupt.  ** flag..
31ed0 20 20 2a 2f 0a 61 62 6f 72 74 5f 64 75 65 5f 74    */.abort_due_t
31ee0 6f 5f 69 6e 74 65 72 72 75 70 74 3a 0a 20 20 61  o_interrupt:.  a
31ef0 73 73 65 72 74 28 20 64 62 2d 3e 75 31 2e 69 73  ssert( db->u1.is
31f00 49 6e 74 65 72 72 75 70 74 65 64 20 29 3b 0a 20  Interrupted );. 
31f10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54   rc = SQLITE_INT
31f20 45 52 52 55 50 54 3b 0a 20 20 70 2d 3e 72 63 20  ERRUPT;.  p->rc 
31f30 3d 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 53  = rc;.  sqlite3S
31f40 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
31f50 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20  rMsg, db, "%s", 
31f60 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
31f70 29 29 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f  ));.  goto vdbe_
31f80 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 7d 0a        error_halt;.}.