/ Hex Artifact Content
Login

Artifact 16e894bd59d11c4a2c184627906c794a6bdc6eff:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ******.** The co
0180: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
0190: 69 6d 70 6c 65 6d 65 6e 74 73 20 65 78 65 63 75  implements execu
01a0: 74 69 6f 6e 20 6d 65 74 68 6f 64 20 6f 66 20 74  tion method of t
01b0: 68 65 20 0a 2a 2a 20 56 69 72 74 75 61 6c 20 44  he .** Virtual D
01c0: 61 74 61 62 61 73 65 20 45 6e 67 69 6e 65 20 28  atabase Engine (
01d0: 56 44 42 45 29 2e 20 20 41 20 73 65 70 61 72 61  VDBE).  A separa
01e0: 74 65 20 66 69 6c 65 20 28 22 76 64 62 65 61 75  te file ("vdbeau
01f0: 78 2e 63 22 29 0a 2a 2a 20 68 61 6e 64 6c 65 73  x.c").** handles
0200: 20 68 6f 75 73 65 6b 65 65 70 69 6e 67 20 64 65   housekeeping de
0210: 74 61 69 6c 73 20 73 75 63 68 20 61 73 20 63 72  tails such as cr
0220: 65 61 74 69 6e 67 20 61 6e 64 20 64 65 6c 65 74  eating and delet
0230: 69 6e 67 0a 2a 2a 20 56 44 42 45 20 69 6e 73 74  ing.** VDBE inst
0240: 61 6e 63 65 73 2e 20 20 54 68 69 73 20 66 69 6c  ances.  This fil
0250: 65 20 69 73 20 73 6f 6c 65 6c 79 20 69 6e 74 65  e is solely inte
0260: 72 65 73 74 65 64 20 69 6e 20 65 78 65 63 75 74  rested in execut
0270: 69 6e 67 0a 2a 2a 20 74 68 65 20 56 44 42 45 20  ing.** the VDBE 
0280: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
0290: 6e 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 69  n the external i
02a0: 6e 74 65 72 66 61 63 65 2c 20 61 6e 20 22 73 71  nterface, an "sq
02b0: 6c 69 74 65 33 5f 73 74 6d 74 2a 22 20 69 73 20  lite3_stmt*" is 
02c0: 61 6e 20 6f 70 61 71 75 65 20 70 6f 69 6e 74 65  an opaque pointe
02d0: 72 0a 2a 2a 20 74 6f 20 61 20 56 44 42 45 2e 0a  r.** to a VDBE..
02e0: 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 20 70 61  **.** The SQL pa
02f0: 72 73 65 72 20 67 65 6e 65 72 61 74 65 73 20 61  rser generates a
0300: 20 70 72 6f 67 72 61 6d 20 77 68 69 63 68 20 69   program which i
0310: 73 20 74 68 65 6e 20 65 78 65 63 75 74 65 64 20  s then executed 
0320: 62 79 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 74  by.** the VDBE t
0330: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
0340: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
0350: 6e 74 2e 20 20 56 44 42 45 20 70 72 6f 67 72 61  nt.  VDBE progra
0360: 6d 73 20 61 72 65 20 0a 2a 2a 20 73 69 6d 69 6c  ms are .** simil
0370: 61 72 20 69 6e 20 66 6f 72 6d 20 74 6f 20 61 73  ar in form to as
0380: 73 65 6d 62 6c 79 20 6c 61 6e 67 75 61 67 65 2e  sembly language.
0390: 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 63 6f    The program co
03a0: 6e 73 69 73 74 73 20 6f 66 0a 2a 2a 20 61 20 6c  nsists of.** a l
03b0: 69 6e 65 61 72 20 73 65 71 75 65 6e 63 65 20 6f  inear sequence o
03c0: 66 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 45  f operations.  E
03d0: 61 63 68 20 6f 70 65 72 61 74 69 6f 6e 20 68 61  ach operation ha
03e0: 73 20 61 6e 20 6f 70 63 6f 64 65 20 0a 2a 2a 20  s an opcode .** 
03f0: 61 6e 64 20 35 20 6f 70 65 72 61 6e 64 73 2e 20  and 5 operands. 
0400: 20 4f 70 65 72 61 6e 64 73 20 50 31 2c 20 50 32   Operands P1, P2
0410: 2c 20 61 6e 64 20 50 33 20 61 72 65 20 69 6e 74  , and P3 are int
0420: 65 67 65 72 73 2e 20 20 4f 70 65 72 61 6e 64 20  egers.  Operand 
0430: 50 34 20 0a 2a 2a 20 69 73 20 61 20 6e 75 6c 6c  P4 .** is a null
0440: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
0450: 6e 67 2e 20 20 4f 70 65 72 61 6e 64 20 50 35 20  ng.  Operand P5 
0460: 69 73 20 61 6e 20 75 6e 73 69 67 6e 65 64 20 63  is an unsigned c
0470: 68 61 72 61 63 74 65 72 2e 0a 2a 2a 20 46 65 77  haracter..** Few
0480: 20 6f 70 63 6f 64 65 73 20 75 73 65 20 61 6c 6c   opcodes use all
0490: 20 35 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2a 0a   5 operands..**.
04a0: 2a 2a 20 43 6f 6d 70 75 74 61 74 69 6f 6e 20 72  ** Computation r
04b0: 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
04c0: 64 20 6f 6e 20 61 20 73 65 74 20 6f 66 20 72 65  d on a set of re
04d0: 67 69 73 74 65 72 73 20 6e 75 6d 62 65 72 65 64  gisters numbered
04e0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69   beginning.** wi
04f0: 74 68 20 31 20 61 6e 64 20 67 6f 69 6e 67 20 75  th 1 and going u
0500: 70 20 74 6f 20 56 64 62 65 2e 6e 4d 65 6d 2e 20  p to Vdbe.nMem. 
0510: 20 45 61 63 68 20 72 65 67 69 73 74 65 72 20 63   Each register c
0520: 61 6e 20 73 74 6f 72 65 0a 2a 2a 20 65 69 74 68  an store.** eith
0530: 65 72 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61  er an integer, a
0540: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
0550: 20 73 74 72 69 6e 67 2c 20 61 20 66 6c 6f 61 74   string, a float
0560: 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d  ing point.** num
0570: 62 65 72 2c 20 6f 72 20 74 68 65 20 53 51 4c 20  ber, or the SQL 
0580: 22 4e 55 4c 4c 22 20 76 61 6c 75 65 2e 20 20 41  "NULL" value.  A
0590: 6e 20 69 6d 70 6c 69 63 69 74 20 63 6f 6e 76 65  n implicit conve
05a0: 72 73 69 6f 6e 20 66 72 6f 6d 20 6f 6e 65 0a 2a  rsion from one.*
05b0: 2a 20 74 79 70 65 20 74 6f 20 74 68 65 20 6f 74  * type to the ot
05c0: 68 65 72 20 6f 63 63 75 72 73 20 61 73 20 6e 65  her occurs as ne
05d0: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 0a 2a 2a 20  cessary..** .** 
05e0: 4d 6f 73 74 20 6f 66 20 74 68 65 20 63 6f 64 65  Most of the code
05f0: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69 73   in this file is
0600: 20 74 61 6b 65 6e 20 75 70 20 62 79 20 74 68 65   taken up by the
0610: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
0620: 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  ().** function w
0630: 68 69 63 68 20 64 6f 65 73 20 74 68 65 20 77 6f  hich does the wo
0640: 72 6b 20 6f 66 20 69 6e 74 65 72 70 72 65 74 69  rk of interpreti
0650: 6e 67 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  ng a VDBE progra
0660: 6d 2e 0a 2a 2a 20 42 75 74 20 6f 74 68 65 72 20  m..** But other 
0670: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 73  routines are als
0680: 6f 20 70 72 6f 76 69 64 65 64 20 74 6f 20 68 65  o provided to he
0690: 6c 70 20 69 6e 20 62 75 69 6c 64 69 6e 67 20 75  lp in building u
06a0: 70 0a 2a 2a 20 61 20 70 72 6f 67 72 61 6d 20 69  p.** a program i
06b0: 6e 73 74 72 75 63 74 69 6f 6e 20 62 79 20 69 6e  nstruction by in
06c0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
06d0: 20 56 61 72 69 6f 75 73 20 73 63 72 69 70 74 73   Various scripts
06e0: 20 73 63 61 6e 20 74 68 69 73 20 73 6f 75 72 63   scan this sourc
06f0: 65 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  e file in order 
0700: 74 6f 20 67 65 6e 65 72 61 74 65 20 48 54 4d 4c  to generate HTML
0710: 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .** documentatio
0720: 6e 2c 20 68 65 61 64 65 72 73 20 66 69 6c 65 73  n, headers files
0730: 2c 20 6f 72 20 6f 74 68 65 72 20 64 65 72 69 76  , or other deriv
0740: 65 64 20 66 69 6c 65 73 2e 20 20 54 68 65 20 66  ed files.  The f
0750: 6f 72 6d 61 74 74 69 6e 67 0a 2a 2a 20 6f 66 20  ormatting.** of 
0760: 74 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73  the code in this
0770: 20 66 69 6c 65 20 69 73 2c 20 74 68 65 72 65 66   file is, theref
0780: 6f 72 65 2c 20 69 6d 70 6f 72 74 61 6e 74 2e 20  ore, important. 
0790: 20 53 65 65 20 6f 74 68 65 72 20 63 6f 6d 6d 65   See other comme
07a0: 6e 74 73 0a 2a 2a 20 69 6e 20 74 68 69 73 20 66  nts.** in this f
07b0: 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ile for details.
07c0: 20 20 49 66 20 69 6e 20 64 6f 75 62 74 2c 20 64    If in doubt, d
07d0: 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72  o not deviate fr
07e0: 6f 6d 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 63  om existing.** c
07f0: 6f 6d 6d 65 6e 74 69 6e 67 20 61 6e 64 20 69 6e  ommenting and in
0800: 64 65 6e 74 61 74 69 6f 6e 20 70 72 61 63 74 69  dentation practi
0810: 63 65 73 20 77 68 65 6e 20 63 68 61 6e 67 69 6e  ces when changin
0820: 67 20 6f 72 20 61 64 64 69 6e 67 20 63 6f 64 65  g or adding code
0830: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
0840: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0850: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
0860: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
0870: 68 69 73 20 6d 61 63 72 6f 20 6f 6e 20 6d 65 6d  his macro on mem
0880: 6f 72 79 20 63 65 6c 6c 73 20 6a 75 73 74 20 70  ory cells just p
0890: 72 69 6f 72 20 74 6f 20 63 68 61 6e 67 69 6e 67  rior to changing
08a0: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
08b0: 20 74 68 65 20 63 65 6c 6c 2e 20 20 54 68 69 73   the cell.  This
08c0: 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73 20   macro verifies 
08d0: 74 68 61 74 20 73 68 61 6c 6c 6f 77 20 63 6f 70  that shallow cop
08e0: 69 65 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 6d  ies are.** not m
08f0: 69 73 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65  isused..*/.#ifde
0900: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 23  f SQLITE_DEBUG.#
0910: 20 64 65 66 69 6e 65 20 6d 65 6d 41 62 6f 75 74   define memAbout
0920: 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 20 73 71  ToChange(P,M) sq
0930: 6c 69 74 65 33 56 64 62 65 4d 65 6d 41 62 6f 75  lite3VdbeMemAbou
0940: 74 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 0a 23  tToChange(P,M).#
0950: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6d 65  else.# define me
0960: 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 50  mAboutToChange(P
0970: 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,M).#endif../*.*
0980: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
0990: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
09a0: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 65  is incremented e
09b0: 76 65 72 79 20 74 69 6d 65 20 61 20 63 75 72 73  very time a curs
09c0: 6f 72 0a 2a 2a 20 6d 6f 76 65 73 2c 20 65 69 74  or.** moves, eit
09d0: 68 65 72 20 62 79 20 74 68 65 20 4f 50 5f 53 65  her by the OP_Se
09e0: 65 6b 58 58 2c 20 4f 50 5f 4e 65 78 74 2c 20 6f  ekXX, OP_Next, o
09f0: 72 20 4f 50 5f 50 72 65 76 20 6f 70 63 6f 64 65  r OP_Prev opcode
0a00: 73 2e 20 20 54 68 65 20 74 65 73 74 0a 2a 2a 20  s.  The test.** 
0a10: 70 72 6f 63 65 64 75 72 65 73 20 75 73 65 20 74  procedures use t
0a20: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
0a30: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
0a40: 74 20 69 6e 64 69 63 65 73 20 61 72 65 0a 2a 2a  t indices are.**
0a50: 20 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 74   working correct
0a60: 6c 79 2e 20 20 54 68 69 73 20 76 61 72 69 61 62  ly.  This variab
0a70: 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69  le has no functi
0a80: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f  on other than to
0a90: 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79 20  .** help verify 
0aa0: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
0ab0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62  ation of the lib
0ac0: 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  rary..*/.#ifdef 
0ad0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
0ae0: 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
0af0: 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
0b00: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
0b10: 73 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  s global variabl
0b20: 65 20 69 73 20 70 6f 73 69 74 69 76 65 2c 20 69  e is positive, i
0b30: 74 20 67 65 74 73 20 64 65 63 72 65 6d 65 6e 74  t gets decrement
0b40: 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 0a 2a  ed once before.*
0b50: 2a 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  * each instructi
0b60: 6f 6e 20 69 6e 20 74 68 65 20 56 44 42 45 2e 20  on in the VDBE. 
0b70: 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
0b80: 20 7a 65 72 6f 2c 20 74 68 65 20 75 31 2e 69 73   zero, the u1.is
0b90: 49 6e 74 65 72 72 75 70 74 65 64 0a 2a 2a 20 66  Interrupted.** f
0ba0: 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69  ield of the sqli
0bb0: 74 65 33 20 73 74 72 75 63 74 75 72 65 20 69 73  te3 structure is
0bc0: 20 73 65 74 20 69 6e 20 6f 72 64 65 72 20 74 6f   set in order to
0bd0: 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6e 74   simulate an int
0be0: 65 72 72 75 70 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  errupt..**.** Th
0bf0: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 75  is facility is u
0c00: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
0c10: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
0c20: 49 74 20 64 6f 65 73 20 6e 6f 74 20 66 75 6e 63  It does not func
0c30: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 6e 20 6f 72  tion.** in an or
0c40: 64 69 6e 61 72 79 20 62 75 69 6c 64 2e 0a 2a 2f  dinary build..*/
0c50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
0c60: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
0c70: 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 20  interrupt_count 
0c80: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
0c90: 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f 62  ** The next glob
0ca0: 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
0cb0: 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68 20  ncremented each 
0cc0: 74 79 70 65 20 74 68 65 20 4f 50 5f 53 6f 72 74  type the OP_Sort
0cd0: 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65 78   opcode.** is ex
0ce0: 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65 73  ecuted.  The tes
0cf0: 74 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 65  t procedures use
0d00: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
0d10: 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  n to make sure t
0d20: 68 61 74 0a 2a 2a 20 73 6f 72 74 69 6e 67 20 69  hat.** sorting i
0d30: 73 20 6f 63 63 75 72 72 69 6e 67 20 6f 72 20 6e  s occurring or n
0d40: 6f 74 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20  ot occurring at 
0d50: 61 70 70 72 6f 70 72 69 61 74 65 20 74 69 6d 65  appropriate time
0d60: 73 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62  s.   This variab
0d70: 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75 6e  le.** has no fun
0d80: 63 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ction other than
0d90: 20 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79 20   to help verify 
0da0: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
0db0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
0dc0: 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64  library..*/.#ifd
0dd0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
0de0: 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f  nt sqlite3_sort_
0df0: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0e00: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  f../*.** The nex
0e10: 74 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  t global variabl
0e20: 65 20 72 65 63 6f 72 64 73 20 74 68 65 20 73 69  e records the si
0e30: 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73  ze of the larges
0e40: 74 20 4d 45 4d 5f 42 6c 6f 62 0a 2a 2a 20 6f 72  t MEM_Blob.** or
0e50: 20 4d 45 4d 5f 53 74 72 20 74 68 61 74 20 68 61   MEM_Str that ha
0e60: 73 20 62 65 65 6e 20 75 73 65 64 20 62 79 20 61  s been used by a
0e70: 20 56 44 42 45 20 6f 70 63 6f 64 65 2e 20 20 54   VDBE opcode.  T
0e80: 68 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72  he test procedur
0e90: 65 73 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 69  es.** use this i
0ea0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6d 61  nformation to ma
0eb0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
0ec0: 20 7a 65 72 6f 2d 62 6c 6f 62 20 66 75 6e 63 74   zero-blob funct
0ed0: 69 6f 6e 61 6c 69 74 79 0a 2a 2a 20 69 73 20 77  ionality.** is w
0ee0: 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 74 6c 79  orking correctly
0ef0: 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62 6c  .   This variabl
0f00: 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69 6f  e has no functio
0f10: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f 0a  n other than to.
0f20: 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79 20 74  ** help verify t
0f30: 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
0f40: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62 72  tion of the libr
0f50: 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ary..*/.#ifdef S
0f60: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
0f70: 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73  qlite3_max_blobs
0f80: 69 7a 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ize = 0;.static 
0f90: 76 6f 69 64 20 75 70 64 61 74 65 4d 61 78 42 6c  void updateMaxBl
0fa0: 6f 62 73 69 7a 65 28 4d 65 6d 20 2a 70 29 7b 0a  obsize(Mem *p){.
0fb0: 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20    if( (p->flags 
0fc0: 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  & (MEM_Str|MEM_B
0fd0: 6c 6f 62 29 29 21 3d 30 20 26 26 20 70 2d 3e 6e  lob))!=0 && p->n
0fe0: 3e 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f  >sqlite3_max_blo
0ff0: 62 73 69 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c  bsize ){.    sql
1000: 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a  ite3_max_blobsiz
1010: 65 20 3d 20 70 2d 3e 6e 3b 0a 20 20 7d 0a 7d 0a  e = p->n;.  }.}.
1020: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1030: 65 20 6e 65 78 74 20 67 6c 6f 62 61 6c 20 76 61  e next global va
1040: 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
1050: 65 6e 74 65 64 20 65 61 63 68 20 74 79 70 65 20  ented each type 
1060: 74 68 65 20 4f 50 5f 46 6f 75 6e 64 20 6f 70 63  the OP_Found opc
1070: 6f 64 65 0a 2a 2a 20 69 73 20 65 78 65 63 75 74  ode.** is execut
1080: 65 64 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  ed. This is used
1090: 20 74 6f 20 74 65 73 74 20 77 68 65 74 68 65 72   to test whether
10a0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 66 6f 72 65   or not the fore
10b0: 69 67 6e 20 6b 65 79 0a 2a 2a 20 6f 70 65 72 61  ign key.** opera
10c0: 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  tion implemented
10d0: 20 75 73 69 6e 67 20 4f 50 5f 46 6b 49 73 5a 65   using OP_FkIsZe
10e0: 72 6f 20 69 73 20 77 6f 72 6b 69 6e 67 2e 20 54  ro is working. T
10f0: 68 69 73 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  his variable.** 
1100: 68 61 73 20 6e 6f 20 66 75 6e 63 74 69 6f 6e 20  has no function 
1110: 6f 74 68 65 72 20 74 68 61 6e 20 74 6f 20 68 65  other than to he
1120: 6c 70 20 76 65 72 69 66 79 20 74 68 65 20 63 6f  lp verify the co
1130: 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
1140: 6f 66 20 74 68 65 0a 2a 2a 20 6c 69 62 72 61 72  of the.** librar
1150: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
1160: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
1170: 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74  ite3_found_count
1180: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
1190: 0a 2a 2a 20 54 65 73 74 20 61 20 72 65 67 69 73  .** Test a regis
11a0: 74 65 72 20 74 6f 20 73 65 65 20 69 66 20 69 74  ter to see if it
11b0: 20 65 78 63 65 65 64 73 20 74 68 65 20 63 75 72   exceeds the cur
11c0: 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 62 6c 6f  rent maximum blo
11d0: 62 20 73 69 7a 65 2e 0a 2a 2a 20 49 66 20 69 74  b size..** If it
11e0: 20 64 6f 65 73 2c 20 72 65 63 6f 72 64 20 74 68   does, record th
11f0: 65 20 6e 65 77 20 6d 61 78 69 6d 75 6d 20 62 6c  e new maximum bl
1200: 6f 62 20 73 69 7a 65 2e 0a 2a 2f 0a 23 69 66 20  ob size..*/.#if 
1210: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1220: 45 53 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  EST) && !defined
1230: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49  (SQLITE_OMIT_BUI
1240: 4c 54 49 4e 5f 54 45 53 54 29 0a 23 20 64 65 66  LTIN_TEST).# def
1250: 69 6e 65 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ine UPDATE_MAX_B
1260: 4c 4f 42 53 49 5a 45 28 50 29 20 20 75 70 64 61  LOBSIZE(P)  upda
1270: 74 65 4d 61 78 42 6c 6f 62 73 69 7a 65 28 50 29  teMaxBlobsize(P)
1280: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1290: 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
12a0: 49 5a 45 28 50 29 0a 23 65 6e 64 69 66 0a 0a 2f  IZE(P).#endif../
12b0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65  *.** Convert the
12c0: 20 67 69 76 65 6e 20 72 65 67 69 73 74 65 72 20   given register 
12d0: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 69 66  into a string if
12e0: 20 69 74 20 69 73 6e 27 74 20 6f 6e 65 0a 2a 2a   it isn't one.**
12f0: 20 61 6c 72 65 61 64 79 2e 20 52 65 74 75 72 6e   already. Return
1300: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 6d   non-zero if a m
1310: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
1320: 2f 0a 23 64 65 66 69 6e 65 20 53 74 72 69 6e 67  /.#define String
1330: 69 66 79 28 50 2c 20 65 6e 63 29 20 5c 0a 20 20  ify(P, enc) \.  
1340: 20 69 66 28 28 28 50 29 2d 3e 66 6c 61 67 73 26   if(((P)->flags&
1350: 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
1360: 62 29 29 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  b))==0 && sqlite
1370: 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67 69 66  3VdbeMemStringif
1380: 79 28 50 2c 65 6e 63 29 29 20 5c 0a 20 20 20 20  y(P,enc)) \.    
1390: 20 7b 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 20   { goto no_mem; 
13a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 65 70 68 65  }../*.** An ephe
13b0: 6d 65 72 61 6c 20 73 74 72 69 6e 67 20 76 61 6c  meral string val
13c0: 75 65 20 28 73 69 67 6e 69 66 69 65 64 20 62 79  ue (signified by
13d0: 20 74 68 65 20 4d 45 4d 5f 45 70 68 65 6d 20 66   the MEM_Ephem f
13e0: 6c 61 67 29 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  lag) contains.**
13f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1400: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
1410: 63 61 74 65 64 20 73 74 72 69 6e 67 20 77 68 65  cated string whe
1420: 72 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 6e  re some other en
1430: 74 69 74 79 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tity.** is respo
1440: 6e 73 69 62 6c 65 20 66 6f 72 20 64 65 61 6c 6c  nsible for deall
1450: 6f 63 61 74 69 6e 67 20 74 68 61 74 20 73 74 72  ocating that str
1460: 69 6e 67 2e 20 20 42 65 63 61 75 73 65 20 74 68  ing.  Because th
1470: 65 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 64 6f  e register.** do
1480: 65 73 20 6e 6f 74 20 63 6f 6e 74 72 6f 6c 20 74  es not control t
1490: 68 65 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 69  he string, it mi
14a0: 67 68 74 20 62 65 20 64 65 6c 65 74 65 64 20 77  ght be deleted w
14b0: 69 74 68 6f 75 74 20 74 68 65 20 72 65 67 69 73  ithout the regis
14c0: 74 65 72 0a 2a 2a 20 6b 6e 6f 77 69 6e 67 20 69  ter.** knowing i
14d0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
14e0: 75 74 69 6e 65 20 63 6f 6e 76 65 72 74 73 20 61  utine converts a
14f0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69  n ephemeral stri
1500: 6e 67 20 69 6e 74 6f 20 61 20 64 79 6e 61 6d 69  ng into a dynami
1510: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 0a  cally allocated.
1520: 2a 2a 20 73 74 72 69 6e 67 20 74 68 61 74 20 74  ** string that t
1530: 68 65 20 72 65 67 69 73 74 65 72 20 69 74 73 65  he register itse
1540: 6c 66 20 63 6f 6e 74 72 6f 6c 73 2e 20 20 49 6e  lf controls.  In
1550: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74   other words, it
1560: 0a 2a 2a 20 63 6f 6e 76 65 72 74 73 20 61 6e 20  .** converts an 
1570: 4d 45 4d 5f 45 70 68 65 6d 20 73 74 72 69 6e 67  MEM_Ephem string
1580: 20 69 6e 74 6f 20 61 6e 20 4d 45 4d 5f 44 79 6e   into an MEM_Dyn
1590: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 23 64 65 66   string..*/.#def
15a0: 69 6e 65 20 44 65 65 70 68 65 6d 65 72 61 6c 69  ine Deephemerali
15b0: 7a 65 28 50 29 20 5c 0a 20 20 20 69 66 28 20 28  ze(P) \.   if( (
15c0: 28 50 29 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 45  (P)->flags&MEM_E
15d0: 70 68 65 6d 29 21 3d 30 20 5c 0a 20 20 20 20 20  phem)!=0 \.     
15e0: 20 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65    && sqlite3Vdbe
15f0: 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c 65  MemMakeWriteable
1600: 28 50 29 20 29 7b 20 67 6f 74 6f 20 6e 6f 5f 6d  (P) ){ goto no_m
1610: 65 6d 3b 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  em;}../* Return 
1620: 74 72 75 65 20 69 66 20 74 68 65 20 63 75 72 73  true if the curs
1630: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 75 73  or was opened us
1640: 69 6e 67 20 74 68 65 20 4f 50 5f 4f 70 65 6e 53  ing the OP_OpenS
1650: 6f 72 74 65 72 20 6f 70 63 6f 64 65 2e 20 2a 2f  orter opcode. */
1660: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
1670: 4d 49 54 5f 4d 45 52 47 45 5f 53 4f 52 54 0a 23  MIT_MERGE_SORT.#
1680: 20 64 65 66 69 6e 65 20 69 73 53 6f 72 74 65 72   define isSorter
1690: 28 78 29 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  (x) 0.#else.# de
16a0: 66 69 6e 65 20 69 73 53 6f 72 74 65 72 28 78 29  fine isSorter(x)
16b0: 20 28 28 78 29 2d 3e 70 53 6f 72 74 65 72 21 3d   ((x)->pSorter!=
16c0: 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0).#endif../*.**
16d0: 20 41 72 67 75 6d 65 6e 74 20 70 4d 65 6d 20 70   Argument pMem p
16e0: 6f 69 6e 74 73 20 61 74 20 61 20 72 65 67 69 73  oints at a regis
16f0: 74 65 72 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ter that will be
1700: 20 70 61 73 73 65 64 20 74 6f 20 61 0a 2a 2a 20   passed to a.** 
1710: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
1720: 63 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 65  ction or returne
1730: 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 61 73  d to the user as
1740: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61   the result of a
1750: 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 69 73 20   query..** This 
1760: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
1770: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 76 61 72 69   pMem->type vari
1780: 61 62 6c 65 20 75 73 65 64 20 62 79 20 74 68 65  able used by the
1790: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 2a   sqlite3_value_*
17a0: 28 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 2e  () .** routines.
17b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17c0: 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65  VdbeMemStoreType
17d0: 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69  (Mem *pMem){.  i
17e0: 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d  nt flags = pMem-
17f0: 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 66 6c  >flags;.  if( fl
1800: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
1810: 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  {.    pMem->type
1820: 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a   = SQLITE_NULL;.
1830: 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 66    }.  else if( f
1840: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
1850: 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  {.    pMem->type
1860: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
1870: 52 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  R;.  }.  else if
1880: 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ( flags & MEM_Re
1890: 61 6c 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e  al ){.    pMem->
18a0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 46 4c  type = SQLITE_FL
18b0: 4f 41 54 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20  OAT;.  }.  else 
18c0: 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  if( flags & MEM_
18d0: 53 74 72 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d  Str ){.    pMem-
18e0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
18f0: 45 58 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EXT;.  }else{.  
1900: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
1910: 51 4c 49 54 45 5f 42 4c 4f 42 3b 0a 20 20 7d 0a  QLITE_BLOB;.  }.
1920: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1930: 65 20 56 64 62 65 43 75 72 73 6f 72 20 6e 75 6d  e VdbeCursor num
1940: 62 65 72 20 69 43 75 72 2e 20 20 52 65 74 75 72  ber iCur.  Retur
1950: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
1960: 74 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  t.  Return NULL.
1970: 2a 2a 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74  ** if we run out
1980: 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73   of memory..*/.s
1990: 74 61 74 69 63 20 56 64 62 65 43 75 72 73 6f 72  tatic VdbeCursor
19a0: 20 2a 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72   *allocateCursor
19b0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
19c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19d0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
19e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1a00: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20  ndex of the new 
1a10: 56 64 62 65 43 75 72 73 6f 72 20 2a 2f 0a 20 20  VdbeCursor */.  
1a20: 69 6e 74 20 6e 46 69 65 6c 64 2c 20 20 20 20 20  int nField,     
1a30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1a40: 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  of fields in the
1a50: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
1a60: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20  */.  int iDb,   
1a70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1a80: 74 61 62 61 73 65 20 74 68 65 20 63 75 72 73 6f  tabase the curso
1a90: 72 20 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 6f 72  r belongs to, or
1aa0: 20 2d 31 20 2a 2f 0a 20 20 69 6e 74 20 69 73 42   -1 */.  int isB
1ab0: 74 72 65 65 43 75 72 73 6f 72 20 20 20 20 20 2f  treeCursor     /
1ac0: 2a 20 54 72 75 65 20 66 6f 72 20 42 2d 54 72 65  * True for B-Tre
1ad0: 65 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 70 73  e.  False for ps
1ae0: 65 75 64 6f 2d 74 61 62 6c 65 20 6f 72 20 76 74  eudo-table or vt
1af0: 61 62 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 46 69  ab */.){.  /* Fi
1b00: 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  nd the memory ce
1b10: 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ll that will be 
1b20: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
1b30: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
1b40: 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 66  .  ** required f
1b50: 6f 72 20 74 68 69 73 20 56 64 62 65 43 75 72 73  or this VdbeCurs
1b60: 6f 72 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  or structure. It
1b70: 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74   is convenient t
1b80: 6f 20 75 73 65 20 61 20 0a 20 20 2a 2a 20 76 64  o use a .  ** vd
1b90: 62 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  be memory cell t
1ba0: 6f 20 6d 61 6e 61 67 65 20 74 68 65 20 6d 65 6d  o manage the mem
1bb0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72  ory allocation r
1bc0: 65 71 75 69 72 65 64 20 66 6f 72 20 61 0a 20 20  equired for a.  
1bd0: 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 20 73 74  ** VdbeCursor st
1be0: 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20  ructure for the 
1bf0: 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e  following reason
1c00: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  s:.  **.  **   *
1c10: 20 53 6f 6d 65 74 69 6d 65 73 20 63 75 72 73 6f   Sometimes curso
1c20: 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 75 73  r numbers are us
1c30: 65 64 20 66 6f 72 20 61 20 63 6f 75 70 6c 65 20  ed for a couple 
1c40: 6f 66 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a  of different.  *
1c50: 2a 20 20 20 20 20 70 75 72 70 6f 73 65 73 20 69  *     purposes i
1c60: 6e 20 61 20 76 64 62 65 20 70 72 6f 67 72 61 6d  n a vdbe program
1c70: 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 74 20  . The different 
1c80: 75 73 65 73 20 6d 69 67 68 74 20 72 65 71 75 69  uses might requi
1c90: 72 65 0a 20 20 2a 2a 20 20 20 20 20 64 69 66 66  re.  **     diff
1ca0: 65 72 65 6e 74 20 73 69 7a 65 64 20 61 6c 6c 6f  erent sized allo
1cb0: 63 61 74 69 6f 6e 73 2e 20 4d 65 6d 6f 72 79 20  cations. Memory 
1cc0: 63 65 6c 6c 73 20 70 72 6f 76 69 64 65 20 67 72  cells provide gr
1cd0: 6f 77 61 62 6c 65 0a 20 20 2a 2a 20 20 20 20 20  owable.  **     
1ce0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a  allocations..  *
1cf0: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
1d00: 75 73 69 6e 67 20 45 4e 41 42 4c 45 5f 4d 45 4d  using ENABLE_MEM
1d10: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 2c 20  ORY_MANAGEMENT, 
1d20: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 62 75 66 66  memory cell buff
1d30: 65 72 73 20 63 61 6e 0a 20 20 2a 2a 20 20 20 20  ers can.  **    
1d40: 20 62 65 20 66 72 65 65 64 20 6c 61 7a 69 6c 79   be freed lazily
1d50: 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33   via the sqlite3
1d60: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
1d70: 29 20 41 50 49 2e 20 54 68 69 73 0a 20 20 2a 2a  ) API. This.  **
1d80: 20 20 20 20 20 6d 69 6e 69 6d 69 7a 65 73 20 74       minimizes t
1d90: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 6c  he number of mal
1da0: 6c 6f 63 20 63 61 6c 6c 73 20 6d 61 64 65 20 62  loc calls made b
1db0: 79 20 74 68 65 20 73 79 73 74 65 6d 2e 0a 20 20  y the system..  
1dc0: 2a 2a 0a 20 20 2a 2a 20 4d 65 6d 6f 72 79 20 63  **.  ** Memory c
1dd0: 65 6c 6c 73 20 66 6f 72 20 63 75 72 73 6f 72 73  ells for cursors
1de0: 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 61   are allocated a
1df0: 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  t the top of the
1e00: 20 61 64 64 72 65 73 73 0a 20 20 2a 2a 20 73 70   address.  ** sp
1e10: 61 63 65 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c  ace. Memory cell
1e20: 20 28 70 2d 3e 6e 4d 65 6d 29 20 63 6f 72 72 65   (p->nMem) corre
1e30: 73 70 6f 6e 64 73 20 74 6f 20 63 75 72 73 6f 72  sponds to cursor
1e40: 20 30 2e 20 53 70 61 63 65 20 66 6f 72 0a 20 20   0. Space for.  
1e50: 2a 2a 20 63 75 72 73 6f 72 20 31 20 69 73 20 6d  ** cursor 1 is m
1e60: 61 6e 61 67 65 64 20 62 79 20 6d 65 6d 6f 72 79  anaged by memory
1e70: 20 63 65 6c 6c 20 28 70 2d 3e 6e 4d 65 6d 2d 31   cell (p->nMem-1
1e80: 29 2c 20 65 74 63 2e 0a 20 20 2a 2f 0a 20 20 4d  ), etc..  */.  M
1e90: 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61  em *pMem = &p->a
1ea0: 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 2d 69 43 75 72  Mem[p->nMem-iCur
1eb0: 5d 3b 0a 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  ];..  int nByte;
1ec0: 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
1ed0: 43 78 20 3d 20 30 3b 0a 20 20 6e 42 79 74 65 20  Cx = 0;.  nByte 
1ee0: 3d 20 0a 20 20 20 20 20 20 52 4f 55 4e 44 38 28  = .      ROUND8(
1ef0: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
1f00: 72 29 29 20 2b 20 0a 20 20 20 20 20 20 28 69 73  r)) + .      (is
1f10: 42 74 72 65 65 43 75 72 73 6f 72 3f 73 71 6c 69  BtreeCursor?sqli
1f20: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
1f30: 7a 65 28 29 3a 30 29 20 2b 20 0a 20 20 20 20 20  ze():0) + .     
1f40: 20 32 2a 6e 46 69 65 6c 64 2a 73 69 7a 65 6f 66   2*nField*sizeof
1f50: 28 75 33 32 29 3b 0a 0a 20 20 61 73 73 65 72 74  (u32);..  assert
1f60: 28 20 69 43 75 72 3c 70 2d 3e 6e 43 75 72 73 6f  ( iCur<p->nCurso
1f70: 72 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  r );.  if( p->ap
1f80: 43 73 72 5b 69 43 75 72 5d 20 29 7b 0a 20 20 20  Csr[iCur] ){.   
1f90: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
1fa0: 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43  Cursor(p, p->apC
1fb0: 73 72 5b 69 43 75 72 5d 29 3b 0a 20 20 20 20 70  sr[iCur]);.    p
1fc0: 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20 3d 20  ->apCsr[iCur] = 
1fd0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c  0;.  }.  if( SQL
1fe0: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
1ff0: 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c  dbeMemGrow(pMem,
2000: 20 6e 42 79 74 65 2c 20 30 29 20 29 7b 0a 20 20   nByte, 0) ){.  
2010: 20 20 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d    p->apCsr[iCur]
2020: 20 3d 20 70 43 78 20 3d 20 28 56 64 62 65 43 75   = pCx = (VdbeCu
2030: 72 73 6f 72 2a 29 70 4d 65 6d 2d 3e 7a 3b 0a 20  rsor*)pMem->z;. 
2040: 20 20 20 6d 65 6d 73 65 74 28 70 43 78 2c 20 30     memset(pCx, 0
2050: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72  , sizeof(VdbeCur
2060: 73 6f 72 29 29 3b 0a 20 20 20 20 70 43 78 2d 3e  sor));.    pCx->
2070: 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20 20 70  iDb = iDb;.    p
2080: 43 78 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69  Cx->nField = nFi
2090: 65 6c 64 3b 0a 20 20 20 20 69 66 28 20 6e 46 69  eld;.    if( nFi
20a0: 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 43 78  eld ){.      pCx
20b0: 2d 3e 61 54 79 70 65 20 3d 20 28 75 33 32 20 2a  ->aType = (u32 *
20c0: 29 26 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38  )&pMem->z[ROUND8
20d0: 28 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73  (sizeof(VdbeCurs
20e0: 6f 72 29 29 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  or))];.    }.   
20f0: 20 69 66 28 20 69 73 42 74 72 65 65 43 75 72 73   if( isBtreeCurs
2100: 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 43 78 2d  or ){.      pCx-
2110: 3e 70 43 75 72 73 6f 72 20 3d 20 28 42 74 43 75  >pCursor = (BtCu
2120: 72 73 6f 72 2a 29 0a 20 20 20 20 20 20 20 20 20  rsor*).         
2130: 20 26 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38   &pMem->z[ROUND8
2140: 28 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73  (sizeof(VdbeCurs
2150: 6f 72 29 29 2b 32 2a 6e 46 69 65 6c 64 2a 73 69  or))+2*nField*si
2160: 7a 65 6f 66 28 75 33 32 29 5d 3b 0a 20 20 20 20  zeof(u32)];.    
2170: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75    sqlite3BtreeCu
2180: 72 73 6f 72 5a 65 72 6f 28 70 43 78 2d 3e 70 43  rsorZero(pCx->pC
2190: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
21a0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 78 3b 0a  }.  return pCx;.
21b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
21c0: 63 6f 6e 76 65 72 74 20 61 20 76 61 6c 75 65 20  convert a value 
21d0: 69 6e 74 6f 20 61 20 6e 75 6d 65 72 69 63 20 72  into a numeric r
21e0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 66  epresentation if
21f0: 20 77 65 20 63 61 6e 0a 2a 2a 20 64 6f 20 73 6f   we can.** do so
2200: 20 77 69 74 68 6f 75 74 20 6c 6f 73 73 20 6f 66   without loss of
2210: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
2220: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
2230: 66 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  f the string.** 
2240: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 6e 75 6d  looks like a num
2250: 62 65 72 2c 20 63 6f 6e 76 65 72 74 20 69 74 20  ber, convert it 
2260: 69 6e 74 6f 20 61 20 6e 75 6d 62 65 72 2e 20 20  into a number.  
2270: 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a  If it does not.*
2280: 2a 20 6c 6f 6f 6b 20 6c 69 6b 65 20 61 20 6e 75  * look like a nu
2290: 6d 62 65 72 2c 20 6c 65 61 76 65 20 69 74 20 61  mber, leave it a
22a0: 6c 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lone..*/.static 
22b0: 76 6f 69 64 20 61 70 70 6c 79 4e 75 6d 65 72 69  void applyNumeri
22c0: 63 41 66 66 69 6e 69 74 79 28 4d 65 6d 20 2a 70  cAffinity(Mem *p
22d0: 52 65 63 29 7b 0a 20 20 69 66 28 20 28 70 52 65  Rec){.  if( (pRe
22e0: 63 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  c->flags & (MEM_
22f0: 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 29 29 3d 3d  Real|MEM_Int))==
2300: 30 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  0 ){.    double 
2310: 72 56 61 6c 75 65 3b 0a 20 20 20 20 69 36 34 20  rValue;.    i64 
2320: 69 56 61 6c 75 65 3b 0a 20 20 20 20 75 38 20 65  iValue;.    u8 e
2330: 6e 63 20 3d 20 70 52 65 63 2d 3e 65 6e 63 3b 0a  nc = pRec->enc;.
2340: 20 20 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66      if( (pRec->f
2350: 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 3d 3d 30  lags&MEM_Str)==0
2360: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
2370: 66 28 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70  f( sqlite3AtoF(p
2380: 52 65 63 2d 3e 7a 2c 20 26 72 56 61 6c 75 65 2c  Rec->z, &rValue,
2390: 20 70 52 65 63 2d 3e 6e 2c 20 65 6e 63 29 3d 3d   pRec->n, enc)==
23a0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
23b0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 41 74  if( 0==sqlite3At
23c0: 6f 69 36 34 28 70 52 65 63 2d 3e 7a 2c 20 26 69  oi64(pRec->z, &i
23d0: 56 61 6c 75 65 2c 20 70 52 65 63 2d 3e 6e 2c 20  Value, pRec->n, 
23e0: 65 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 70 52  enc) ){.      pR
23f0: 65 63 2d 3e 75 2e 69 20 3d 20 69 56 61 6c 75 65  ec->u.i = iValue
2400: 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 66 6c  ;.      pRec->fl
2410: 61 67 73 20 7c 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  ags |= MEM_Int;.
2420: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2430: 20 70 52 65 63 2d 3e 72 20 3d 20 72 56 61 6c 75   pRec->r = rValu
2440: 65 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 66  e;.      pRec->f
2450: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 52 65 61 6c  lags |= MEM_Real
2460: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
2470: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 69 6e 67 20  *.** Processing 
2480: 69 73 20 64 65 74 65 72 6d 69 6e 65 20 62 79 20  is determine by 
2490: 74 68 65 20 61 66 66 69 6e 69 74 79 20 70 61 72  the affinity par
24a0: 61 6d 65 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 53 51  ameter:.**.** SQ
24b0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
24c0: 3a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  :.** SQLITE_AFF_
24d0: 52 45 41 4c 3a 0a 2a 2a 20 53 51 4c 49 54 45 5f  REAL:.** SQLITE_
24e0: 41 46 46 5f 4e 55 4d 45 52 49 43 3a 0a 2a 2a 20  AFF_NUMERIC:.** 
24f0: 20 20 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72     Try to conver
2500: 74 20 70 52 65 63 20 74 6f 20 61 6e 20 69 6e 74  t pRec to an int
2510: 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61 74  eger representat
2520: 69 6f 6e 20 6f 72 20 61 20 0a 2a 2a 20 20 20 20  ion or a .**    
2530: 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 72  floating-point r
2540: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 66  epresentation if
2550: 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72   an integer repr
2560: 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
2570: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
2580: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
2590: 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73 65   integer represe
25a0: 6e 74 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 20 20  ntation is.**   
25b0: 20 61 6c 77 61 79 73 20 70 72 65 66 65 72 72 65   always preferre
25c0: 64 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 61  d, even if the a
25d0: 66 66 69 6e 69 74 79 20 69 73 20 52 45 41 4c 2c  ffinity is REAL,
25e0: 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 61   because.**    a
25f0: 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73  n integer repres
2600: 65 6e 74 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65  entation is more
2610: 20 73 70 61 63 65 20 65 66 66 69 63 69 65 6e 74   space efficient
2620: 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   on disk..**.** 
2630: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a  SQLITE_AFF_TEXT:
2640: 0a 2a 2a 20 20 20 20 43 6f 6e 76 65 72 74 20 70  .**    Convert p
2650: 52 65 63 20 74 6f 20 61 20 74 65 78 74 20 72 65  Rec to a text re
2660: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a  presentation..**
2670: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  .** SQLITE_AFF_N
2680: 4f 4e 45 3a 0a 2a 2a 20 20 20 20 4e 6f 2d 6f 70  ONE:.**    No-op
2690: 2e 20 20 70 52 65 63 20 69 73 20 75 6e 63 68 61  .  pRec is uncha
26a0: 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nged..*/.static 
26b0: 76 6f 69 64 20 61 70 70 6c 79 41 66 66 69 6e 69  void applyAffini
26c0: 74 79 28 0a 20 20 4d 65 6d 20 2a 70 52 65 63 2c  ty(.  Mem *pRec,
26d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26e0: 20 76 61 6c 75 65 20 74 6f 20 61 70 70 6c 79 20   value to apply 
26f0: 61 66 66 69 6e 69 74 79 20 74 6f 20 2a 2f 0a 20  affinity to */. 
2700: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 2c 20   char affinity, 
2710: 20 20 20 20 20 2f 2a 20 54 68 65 20 61 66 66 69       /* The affi
2720: 6e 69 74 79 20 74 6f 20 62 65 20 61 70 70 6c 69  nity to be appli
2730: 65 64 20 2a 2f 0a 20 20 75 38 20 65 6e 63 20 20  ed */.  u8 enc  
2740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
2750: 73 65 20 74 68 69 73 20 74 65 78 74 20 65 6e 63  se this text enc
2760: 6f 64 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66  oding */.){.  if
2770: 28 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ( affinity==SQLI
2780: 54 45 5f 41 46 46 5f 54 45 58 54 20 29 7b 0a 20  TE_AFF_TEXT ){. 
2790: 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 74 74 65 6d     /* Only attem
27a0: 70 74 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  pt the conversio
27b0: 6e 20 74 6f 20 54 45 58 54 20 69 66 20 74 68 65  n to TEXT if the
27c0: 72 65 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  re is an integer
27d0: 20 6f 72 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20   or real.    ** 
27e0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 28  representation (
27f0: 62 6c 6f 62 20 61 6e 64 20 4e 55 4c 4c 20 64 6f  blob and NULL do
2800: 20 6e 6f 74 20 67 65 74 20 63 6f 6e 76 65 72 74   not get convert
2810: 65 64 29 20 62 75 74 20 6e 6f 20 73 74 72 69 6e  ed) but no strin
2820: 67 0a 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65  g.    ** represe
2830: 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ntation..    */.
2840: 20 20 20 20 69 66 28 20 30 3d 3d 28 70 52 65 63      if( 0==(pRec
2850: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29  ->flags&MEM_Str)
2860: 20 26 26 20 28 70 52 65 63 2d 3e 66 6c 61 67 73   && (pRec->flags
2870: 26 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49  &(MEM_Real|MEM_I
2880: 6e 74 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71  nt)) ){.      sq
2890: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69  lite3VdbeMemStri
28a0: 6e 67 69 66 79 28 70 52 65 63 2c 20 65 6e 63 29  ngify(pRec, enc)
28b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 63  ;.    }.    pRec
28c0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d  ->flags &= ~(MEM
28d0: 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 29 3b 0a  _Real|MEM_Int);.
28e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 66 66 69    }else if( affi
28f0: 6e 69 74 79 21 3d 53 51 4c 49 54 45 5f 41 46 46  nity!=SQLITE_AFF
2900: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73  _NONE ){.    ass
2910: 65 72 74 28 20 61 66 66 69 6e 69 74 79 3d 3d 53  ert( affinity==S
2920: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
2930: 52 20 7c 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53  R || affinity==S
2940: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20  QLITE_AFF_REAL. 
2950: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 61              || a
2960: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
2970: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20  AFF_NUMERIC );. 
2980: 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41     applyNumericA
2990: 66 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a 20  ffinity(pRec);. 
29a0: 20 20 20 69 66 28 20 70 52 65 63 2d 3e 66 6c 61     if( pRec->fla
29b0: 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b  gs & MEM_Real ){
29c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
29d0: 62 65 49 6e 74 65 67 65 72 41 66 66 69 6e 69 74  beIntegerAffinit
29e0: 79 28 70 52 65 63 29 3b 0a 20 20 20 20 7d 0a 20  y(pRec);.    }. 
29f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20   }.}../*.** Try 
2a00: 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20 74  to convert the t
2a10: 79 70 65 20 6f 66 20 61 20 66 75 6e 63 74 69 6f  ype of a functio
2a20: 6e 20 61 72 67 75 6d 65 6e 74 20 6f 72 20 61 20  n argument or a 
2a30: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 0a 2a 2a  result column.**
2a40: 20 69 6e 74 6f 20 61 20 6e 75 6d 65 72 69 63 20   into a numeric 
2a50: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20  representation. 
2a60: 20 55 73 65 20 65 69 74 68 65 72 20 49 4e 54 45   Use either INTE
2a70: 47 45 52 20 6f 72 20 52 45 41 4c 20 77 68 69 63  GER or REAL whic
2a80: 68 65 76 65 72 0a 2a 2a 20 69 73 20 61 70 70 72  hever.** is appr
2a90: 6f 70 72 69 61 74 65 2e 20 20 42 75 74 20 6f 6e  opriate.  But on
2aa0: 6c 79 20 64 6f 20 74 68 65 20 63 6f 6e 76 65 72  ly do the conver
2ab0: 73 69 6f 6e 20 69 66 20 69 74 20 69 73 20 70 6f  sion if it is po
2ac0: 73 73 69 62 6c 65 20 77 69 74 68 6f 75 74 0a 2a  ssible without.*
2ad0: 2a 20 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72 6d  * loss of inform
2ae0: 61 74 69 6f 6e 20 61 6e 64 20 72 65 74 75 72 6e  ation and return
2af0: 20 74 68 65 20 72 65 76 69 73 65 64 20 74 79 70   the revised typ
2b00: 65 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e  e of the argumen
2b10: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2b20: 33 5f 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f  3_value_numeric_
2b30: 74 79 70 65 28 73 71 6c 69 74 65 33 5f 76 61 6c  type(sqlite3_val
2b40: 75 65 20 2a 70 56 61 6c 29 7b 0a 20 20 4d 65 6d  ue *pVal){.  Mem
2b50: 20 2a 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 70   *pMem = (Mem*)p
2b60: 56 61 6c 3b 0a 20 20 69 66 28 20 70 4d 65 6d 2d  Val;.  if( pMem-
2b70: 3e 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45  >type==SQLITE_TE
2b80: 58 54 20 29 7b 0a 20 20 20 20 61 70 70 6c 79 4e  XT ){.    applyN
2b90: 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 70  umericAffinity(p
2ba0: 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Mem);.    sqlite
2bb0: 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70  3VdbeMemStoreTyp
2bc0: 65 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 72  e(pMem);.  }.  r
2bd0: 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 74 79 70 65  eturn pMem->type
2be0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6f 72  ;.}../*.** Expor
2bf0: 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 61  ted version of a
2c00: 70 70 6c 79 41 66 66 69 6e 69 74 79 28 29 2e 20  pplyAffinity(). 
2c10: 54 68 69 73 20 6f 6e 65 20 77 6f 72 6b 73 20 6f  This one works o
2c20: 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  n sqlite3_value*
2c30: 2c 20 0a 2a 2a 20 6e 6f 74 20 74 68 65 20 69 6e  , .** not the in
2c40: 74 65 72 6e 61 6c 20 4d 65 6d 2a 20 74 79 70 65  ternal Mem* type
2c50: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2c60: 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e  3ValueApplyAffin
2c70: 69 74 79 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ity(.  sqlite3_v
2c80: 61 6c 75 65 20 2a 70 56 61 6c 2c 20 0a 20 20 75  alue *pVal, .  u
2c90: 38 20 61 66 66 69 6e 69 74 79 2c 20 0a 20 20 75  8 affinity, .  u
2ca0: 38 20 65 6e 63 0a 29 7b 0a 20 20 61 70 70 6c 79  8 enc.){.  apply
2cb0: 41 66 66 69 6e 69 74 79 28 28 4d 65 6d 20 2a 29  Affinity((Mem *)
2cc0: 70 56 61 6c 2c 20 61 66 66 69 6e 69 74 79 2c 20  pVal, affinity, 
2cd0: 65 6e 63 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  enc);.}..#ifdef 
2ce0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
2cf0: 2a 2a 20 57 72 69 74 65 20 61 20 6e 69 63 65 20  ** Write a nice 
2d00: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
2d10: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e  ation of the con
2d20: 74 65 6e 74 73 20 6f 66 20 63 65 6c 6c 20 70 4d  tents of cell pM
2d30: 65 6d 0a 2a 2a 20 69 6e 74 6f 20 62 75 66 66 65  em.** into buffe
2d40: 72 20 7a 42 75 66 2c 20 6c 65 6e 67 74 68 20 6e  r zBuf, length n
2d50: 42 75 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  Buf..*/.void sql
2d60: 69 74 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74  ite3VdbeMemPrett
2d70: 79 50 72 69 6e 74 28 4d 65 6d 20 2a 70 4d 65 6d  yPrint(Mem *pMem
2d80: 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
2d90: 20 63 68 61 72 20 2a 7a 43 73 72 20 3d 20 7a 42   char *zCsr = zB
2da0: 75 66 3b 0a 20 20 69 6e 74 20 66 20 3d 20 70 4d  uf;.  int f = pM
2db0: 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20 73 74  em->flags;..  st
2dc0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2dd0: 2a 63 6f 6e 73 74 20 65 6e 63 6e 61 6d 65 73 5b  *const encnames[
2de0: 5d 20 3d 20 7b 22 28 58 29 22 2c 20 22 28 38 29  ] = {"(X)", "(8)
2df0: 22 2c 20 22 28 31 36 4c 45 29 22 2c 20 22 28 31  ", "(16LE)", "(1
2e00: 36 42 45 29 22 7d 3b 0a 0a 20 20 69 66 28 20 66  6BE)"};..  if( f
2e10: 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20  &MEM_Blob ){.   
2e20: 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72   int i;.    char
2e30: 20 63 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20   c;.    if( f & 
2e40: 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20  MEM_Dyn ){.     
2e50: 20 63 20 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20   c = 'z';.      
2e60: 61 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45  assert( (f & (ME
2e70: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68  M_Static|MEM_Eph
2e80: 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  em))==0 );.    }
2e90: 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d  else if( f & MEM
2ea0: 5f 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  _Static ){.     
2eb0: 20 63 20 3d 20 27 74 27 3b 0a 20 20 20 20 20 20   c = 't';.      
2ec0: 61 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45  assert( (f & (ME
2ed0: 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29  M_Dyn|MEM_Ephem)
2ee0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73  )==0 );.    }els
2ef0: 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 45 70  e if( f & MEM_Ep
2f00: 68 65 6d 20 29 7b 0a 20 20 20 20 20 20 63 20 3d  hem ){.      c =
2f10: 20 27 65 27 3b 0a 20 20 20 20 20 20 61 73 73 65   'e';.      asse
2f20: 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74  rt( (f & (MEM_St
2f30: 61 74 69 63 7c 4d 45 4d 5f 44 79 6e 29 29 3d 3d  atic|MEM_Dyn))==
2f40: 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0 );.    }else{.
2f50: 20 20 20 20 20 20 63 20 3d 20 27 73 27 3b 0a 20        c = 's';. 
2f60: 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
2f70: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20  3_snprintf(100, 
2f80: 7a 43 73 72 2c 20 22 25 63 22 2c 20 63 29 3b 0a  zCsr, "%c", c);.
2f90: 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69      zCsr += sqli
2fa0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72  te3Strlen30(zCsr
2fb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
2fc0: 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73  nprintf(100, zCs
2fd0: 72 2c 20 22 25 64 5b 22 2c 20 70 4d 65 6d 2d 3e  r, "%d[", pMem->
2fe0: 6e 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20  n);.    zCsr += 
2ff0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3000: 7a 43 73 72 29 3b 0a 20 20 20 20 66 6f 72 28 69  zCsr);.    for(i
3010: 3d 30 3b 20 69 3c 31 36 20 26 26 20 69 3c 70 4d  =0; i<16 && i<pM
3020: 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  em->n; i++){.   
3030: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
3040: 6e 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 20 22  ntf(100, zCsr, "
3050: 25 30 32 58 22 2c 20 28 28 69 6e 74 29 70 4d 65  %02X", ((int)pMe
3060: 6d 2d 3e 7a 5b 69 5d 20 26 20 30 78 46 46 29 29  m->z[i] & 0xFF))
3070: 3b 0a 20 20 20 20 20 20 7a 43 73 72 20 2b 3d 20  ;.      zCsr += 
3080: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3090: 7a 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCsr);.    }.   
30a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 36 20 26   for(i=0; i<16 &
30b0: 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b 20 69 2b 2b  & i<pMem->n; i++
30c0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 20  ){.      char z 
30d0: 3d 20 70 4d 65 6d 2d 3e 7a 5b 69 5d 3b 0a 20 20  = pMem->z[i];.  
30e0: 20 20 20 20 69 66 28 20 7a 3c 33 32 20 7c 7c 20      if( z<32 || 
30f0: 7a 3e 31 32 36 20 29 20 2a 7a 43 73 72 2b 2b 20  z>126 ) *zCsr++ 
3100: 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20 65 6c 73  = '.';.      els
3110: 65 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a 3b 0a 20  e *zCsr++ = z;. 
3120: 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
3130: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20  3_snprintf(100, 
3140: 7a 43 73 72 2c 20 22 5d 25 73 22 2c 20 65 6e 63  zCsr, "]%s", enc
3150: 6e 61 6d 65 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d  names[pMem->enc]
3160: 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 73  );.    zCsr += s
3170: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
3180: 43 73 72 29 3b 0a 20 20 20 20 69 66 28 20 66 20  Csr);.    if( f 
3190: 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
31a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
31b0: 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 22  intf(100, zCsr,"
31c0: 2b 25 64 7a 22 2c 70 4d 65 6d 2d 3e 75 2e 6e 5a  +%dz",pMem->u.nZ
31d0: 65 72 6f 29 3b 0a 20 20 20 20 20 20 7a 43 73 72  ero);.      zCsr
31e0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
31f0: 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 7d  n30(zCsr);.    }
3200: 0a 20 20 20 20 2a 7a 43 73 72 20 3d 20 27 5c 30  .    *zCsr = '\0
3210: 27 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  ';.  }else if( f
3220: 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20   & MEM_Str ){.  
3230: 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20 20 20    int j, k;.    
3240: 7a 42 75 66 5b 30 5d 20 3d 20 27 20 27 3b 0a 20  zBuf[0] = ' ';. 
3250: 20 20 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 44     if( f & MEM_D
3260: 79 6e 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66  yn ){.      zBuf
3270: 5b 31 5d 20 3d 20 27 7a 27 3b 0a 20 20 20 20 20  [1] = 'z';.     
3280: 20 61 73 73 65 72 74 28 20 28 66 20 26 20 28 4d   assert( (f & (M
3290: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 45 70  EM_Static|MEM_Ep
32a0: 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  hem))==0 );.    
32b0: 7d 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45  }else if( f & ME
32c0: 4d 5f 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  M_Static ){.    
32d0: 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 74 27 3b    zBuf[1] = 't';
32e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
32f0: 66 20 26 20 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  f & (MEM_Dyn|MEM
3300: 5f 45 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20  _Ephem))==0 );. 
3310: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26     }else if( f &
3320: 20 4d 45 4d 5f 45 70 68 65 6d 20 29 7b 0a 20 20   MEM_Ephem ){.  
3330: 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 65      zBuf[1] = 'e
3340: 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ';.      assert(
3350: 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69   (f & (MEM_Stati
3360: 63 7c 4d 45 4d 5f 44 79 6e 29 29 3d 3d 30 20 29  c|MEM_Dyn))==0 )
3370: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3380: 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 73 27     zBuf[1] = 's'
3390: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6b 20 3d 20  ;.    }.    k = 
33a0: 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  2;.    sqlite3_s
33b0: 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 26 7a 42  nprintf(100, &zB
33c0: 75 66 5b 6b 5d 2c 20 22 25 64 22 2c 20 70 4d 65  uf[k], "%d", pMe
33d0: 6d 2d 3e 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20  m->n);.    k += 
33e0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
33f0: 26 7a 42 75 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a  &zBuf[k]);.    z
3400: 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27 5b 27 3b 0a  Buf[k++] = '[';.
3410: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31      for(j=0; j<1
3420: 35 20 26 26 20 6a 3c 70 4d 65 6d 2d 3e 6e 3b 20  5 && j<pMem->n; 
3430: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 63  j++){.      u8 c
3440: 20 3d 20 70 4d 65 6d 2d 3e 7a 5b 6a 5d 3b 0a 20   = pMem->z[j];. 
3450: 20 20 20 20 20 69 66 28 20 63 3e 3d 30 78 32 30       if( c>=0x20
3460: 20 26 26 20 63 3c 30 78 37 66 20 29 7b 0a 20 20   && c<0x7f ){.  
3470: 20 20 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20        zBuf[k++] 
3480: 3d 20 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = c;.      }else
3490: 7b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6b  {.        zBuf[k
34a0: 2b 2b 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20 20  ++] = '.';.     
34b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75   }.    }.    zBu
34c0: 66 5b 6b 2b 2b 5d 20 3d 20 27 5d 27 3b 0a 20 20  f[k++] = ']';.  
34d0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
34e0: 74 66 28 31 30 30 2c 26 7a 42 75 66 5b 6b 5d 2c  tf(100,&zBuf[k],
34f0: 20 65 6e 63 6e 61 6d 65 73 5b 70 4d 65 6d 2d 3e   encnames[pMem->
3500: 65 6e 63 5d 29 3b 0a 20 20 20 20 6b 20 2b 3d 20  enc]);.    k += 
3510: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3520: 26 7a 42 75 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a  &zBuf[k]);.    z
3530: 42 75 66 5b 6b 2b 2b 5d 20 3d 20 30 3b 0a 20 20  Buf[k++] = 0;.  
3540: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  }.}.#endif..#ifd
3550: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
3560: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
3570: 76 61 6c 75 65 20 6f 66 20 61 20 72 65 67 69 73  value of a regis
3580: 74 65 72 20 66 6f 72 20 74 72 61 63 69 6e 67 20  ter for tracing 
3590: 70 75 72 70 6f 73 65 73 3a 0a 2a 2f 0a 73 74 61  purposes:.*/.sta
35a0: 74 69 63 20 76 6f 69 64 20 6d 65 6d 54 72 61 63  tic void memTrac
35b0: 65 50 72 69 6e 74 28 46 49 4c 45 20 2a 6f 75 74  ePrint(FILE *out
35c0: 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28  , Mem *p){.  if(
35d0: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
35e0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 66 70 72 69  Null ){.    fpri
35f0: 6e 74 66 28 6f 75 74 2c 20 22 20 4e 55 4c 4c 22  ntf(out, " NULL"
3600: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  );.  }else if( (
3610: 70 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  p->flags & (MEM_
3620: 49 6e 74 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 28  Int|MEM_Str))==(
3630: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 53 74 72 29  MEM_Int|MEM_Str)
3640: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
3650: 6f 75 74 2c 20 22 20 73 69 3a 25 6c 6c 64 22 2c  out, " si:%lld",
3660: 20 70 2d 3e 75 2e 69 29 3b 0a 20 20 7d 65 6c 73   p->u.i);.  }els
3670: 65 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26  e if( p->flags &
3680: 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20   MEM_Int ){.    
3690: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 69  fprintf(out, " i
36a0: 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e 69 29 3b  :%lld", p->u.i);
36b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36c0: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
36d0: 49 4e 54 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  INT.  }else if( 
36e0: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  p->flags & MEM_R
36f0: 65 61 6c 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  eal ){.    fprin
3700: 74 66 28 6f 75 74 2c 20 22 20 72 3a 25 67 22 2c  tf(out, " r:%g",
3710: 20 70 2d 3e 72 29 3b 0a 23 65 6e 64 69 66 0a 20   p->r);.#endif. 
3720: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c   }else if( p->fl
3730: 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
3740: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
3750: 6f 75 74 2c 20 22 20 28 72 6f 77 73 65 74 29 22  out, " (rowset)"
3760: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3770: 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a  char zBuf[200];.
3780: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
3790: 65 6d 50 72 65 74 74 79 50 72 69 6e 74 28 70 2c  emPrettyPrint(p,
37a0: 20 7a 42 75 66 29 3b 0a 20 20 20 20 66 70 72 69   zBuf);.    fpri
37b0: 6e 74 66 28 6f 75 74 2c 20 22 20 22 29 3b 0a 20  ntf(out, " ");. 
37c0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
37d0: 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d  "%s", zBuf);.  }
37e0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
37f0: 65 67 69 73 74 65 72 54 72 61 63 65 28 46 49 4c  egisterTrace(FIL
3800: 45 20 2a 6f 75 74 2c 20 69 6e 74 20 69 52 65 67  E *out, int iReg
3810: 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20 66 70 72  , Mem *p){.  fpr
3820: 69 6e 74 66 28 6f 75 74 2c 20 22 52 45 47 5b 25  intf(out, "REG[%
3830: 64 5d 20 3d 20 22 2c 20 69 52 65 67 29 3b 0a 20  d] = ", iReg);. 
3840: 20 6d 65 6d 54 72 61 63 65 50 72 69 6e 74 28 6f   memTracePrint(o
3850: 75 74 2c 20 70 29 3b 0a 20 20 66 70 72 69 6e 74  ut, p);.  fprint
3860: 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 7d 0a  f(out, "\n");.}.
3870: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
3880: 51 4c 49 54 45 5f 44 45 42 55 47 0a 23 20 20 64  QLITE_DEBUG.#  d
3890: 65 66 69 6e 65 20 52 45 47 49 53 54 45 52 5f 54  efine REGISTER_T
38a0: 52 41 43 45 28 52 2c 4d 29 20 69 66 28 70 2d 3e  RACE(R,M) if(p->
38b0: 74 72 61 63 65 29 72 65 67 69 73 74 65 72 54 72  trace)registerTr
38c0: 61 63 65 28 70 2d 3e 74 72 61 63 65 2c 52 2c 4d  ace(p->trace,R,M
38d0: 29 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  ).#else.#  defin
38e0: 65 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45  e REGISTER_TRACE
38f0: 28 52 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 0a 23  (R,M).#endif...#
3900: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
3910: 4c 45 0a 0a 2f 2a 20 0a 2a 2a 20 68 77 74 69 6d  LE../* .** hwtim
3920: 65 2e 68 20 63 6f 6e 74 61 69 6e 73 20 69 6e 6c  e.h contains inl
3930: 69 6e 65 20 61 73 73 65 6d 62 6c 65 72 20 63 6f  ine assembler co
3940: 64 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74  de for implement
3950: 69 6e 67 20 0a 2a 2a 20 68 69 67 68 2d 70 65 72  ing .** high-per
3960: 66 6f 72 6d 61 6e 63 65 20 74 69 6d 69 6e 67 20  formance timing 
3970: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a 23 69 6e  routines..*/.#in
3980: 63 6c 75 64 65 20 22 68 77 74 69 6d 65 2e 68 22  clude "hwtime.h"
3990: 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ..#endif../*.** 
39a0: 54 68 65 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e  The CHECK_FOR_IN
39b0: 54 45 52 52 55 50 54 20 6d 61 63 72 6f 20 64 65  TERRUPT macro de
39c0: 66 69 6e 65 64 20 68 65 72 65 20 6c 6f 6f 6b 73  fined here looks
39d0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 0a 2a   to see if the.*
39e0: 2a 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  * sqlite3_interr
39f0: 75 70 74 28 29 20 72 6f 75 74 69 6e 65 20 68 61  upt() routine ha
3a00: 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 2e 20 20  s been called.  
3a10: 49 66 20 69 74 20 68 61 73 20 62 65 65 6e 2c 20  If it has been, 
3a20: 74 68 65 6e 0a 2a 2a 20 70 72 6f 63 65 73 73 69  then.** processi
3a30: 6e 67 20 6f 66 20 74 68 65 20 56 44 42 45 20 70  ng of the VDBE p
3a40: 72 6f 67 72 61 6d 20 69 73 20 69 6e 74 65 72 72  rogram is interr
3a50: 75 70 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  upted..**.** Thi
3a60: 73 20 6d 61 63 72 6f 20 61 64 64 65 64 20 74 6f  s macro added to
3a70: 20 65 76 65 72 79 20 69 6e 73 74 72 75 63 74 69   every instructi
3a80: 6f 6e 20 74 68 61 74 20 64 6f 65 73 20 61 20 6a  on that does a j
3a90: 75 6d 70 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a  ump in order to.
3aa0: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 6c  ** implement a l
3ab0: 6f 6f 70 2e 20 20 54 68 69 73 20 74 65 73 74 20  oop.  This test 
3ac0: 75 73 65 64 20 74 6f 20 62 65 20 6f 6e 20 65 76  used to be on ev
3ad0: 65 72 79 20 73 69 6e 67 6c 65 20 69 6e 73 74 72  ery single instr
3ae0: 75 63 74 69 6f 6e 2c 0a 2a 2a 20 62 75 74 20 74  uction,.** but t
3af0: 68 61 74 20 6d 65 61 6e 74 20 77 65 20 6d 6f 72  hat meant we mor
3b00: 65 20 74 65 73 74 69 6e 67 20 74 68 61 6e 20 77  e testing than w
3b10: 65 20 6e 65 65 64 65 64 2e 20 20 42 79 20 6f 6e  e needed.  By on
3b20: 6c 79 20 74 65 73 74 69 6e 67 20 74 68 65 0a 2a  ly testing the.*
3b30: 2a 20 66 6c 61 67 20 6f 6e 20 6a 75 6d 70 20 69  * flag on jump i
3b40: 6e 73 74 72 75 63 74 69 6f 6e 73 2c 20 77 65 20  nstructions, we 
3b50: 67 65 74 20 61 20 28 73 6d 61 6c 6c 29 20 73 70  get a (small) sp
3b60: 65 65 64 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e  eed improvement.
3b70: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43  .*/.#define CHEC
3b80: 4b 5f 46 4f 52 5f 49 4e 54 45 52 52 55 50 54 20  K_FOR_INTERRUPT 
3b90: 5c 0a 20 20 20 69 66 28 20 64 62 2d 3e 75 31 2e  \.   if( db->u1.
3ba0: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 20  isInterrupted ) 
3bb0: 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
3bc0: 6f 5f 69 6e 74 65 72 72 75 70 74 3b 0a 0a 0a 23  o_interrupt;...#
3bd0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
3be0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3bf0: 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  n is only called
3c00: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20   from within an 
3c10: 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73  assert() express
3c20: 69 6f 6e 2e 20 49 74 0a 2a 2a 20 63 68 65 63 6b  ion. It.** check
3c30: 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  s that the sqlit
3c40: 65 33 2e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  e3.nTransaction 
3c50: 76 61 72 69 61 62 6c 65 20 69 73 20 63 6f 72 72  variable is corr
3c60: 65 63 74 6c 79 20 73 65 74 20 74 6f 0a 2a 2a 20  ectly set to.** 
3c70: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f  the number of no
3c80: 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  n-transaction sa
3c90: 76 65 70 6f 69 6e 74 73 20 63 75 72 72 65 6e 74  vepoints current
3ca0: 6c 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ly in the .** li
3cb0: 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
3cc0: 6e 67 20 61 74 20 73 71 6c 69 74 65 33 2e 70 53  ng at sqlite3.pS
3cd0: 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 0a 2a 2a  avepoint..** .**
3ce0: 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   Usage:.**.**   
3cf0: 20 20 61 73 73 65 72 74 28 20 63 68 65 63 6b 53    assert( checkS
3d00: 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28 64 62  avepointCount(db
3d10: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
3d20: 6e 74 20 63 68 65 63 6b 53 61 76 65 70 6f 69 6e  nt checkSavepoin
3d30: 74 43 6f 75 6e 74 28 73 71 6c 69 74 65 33 20 2a  tCount(sqlite3 *
3d40: 64 62 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  db){.  int n = 0
3d50: 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70  ;.  Savepoint *p
3d60: 3b 0a 20 20 66 6f 72 28 70 3d 64 62 2d 3e 70 53  ;.  for(p=db->pS
3d70: 61 76 65 70 6f 69 6e 74 3b 20 70 3b 20 70 3d 70  avepoint; p; p=p
3d80: 2d 3e 70 4e 65 78 74 29 20 6e 2b 2b 3b 0a 20 20  ->pNext) n++;.  
3d90: 61 73 73 65 72 74 28 20 6e 3d 3d 28 64 62 2d 3e  assert( n==(db->
3da0: 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20 64 62 2d  nSavepoint + db-
3db0: 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
3dc0: 76 65 70 6f 69 6e 74 29 20 29 3b 0a 20 20 72 65  vepoint) );.  re
3dd0: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
3de0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  ../*.** Transfer
3df0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
3e00: 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69  ext from an sqli
3e10: 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67  te3_vtab.zErrMsg
3e20: 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
3e30: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
3e40: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
3e50: 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20  _malloc) into a 
3e60: 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65  Vdbe.zErrMsg (te
3e70: 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
3e80: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
3e90: 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
3ea0: 6c 6c 6f 63 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  lloc)..*/.static
3eb0: 20 76 6f 69 64 20 69 6d 70 6f 72 74 56 74 61 62   void importVtab
3ec0: 45 72 72 4d 73 67 28 56 64 62 65 20 2a 70 2c 20  ErrMsg(Vdbe *p, 
3ed0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
3ee0: 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  tab){.  sqlite3 
3ef0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73  *db = p->db;.  s
3f00: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3f10: 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
3f20: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  p->zErrMsg = sql
3f30: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
3f40: 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
3f50: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
3f60: 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
3f70: 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ;.  pVtab->zErrM
3f80: 73 67 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  sg = 0;.}.../*.*
3f90: 2a 20 45 78 65 63 75 74 65 20 61 73 20 6d 75 63  * Execute as muc
3fa0: 68 20 6f 66 20 61 20 56 44 42 45 20 70 72 6f 67  h of a VDBE prog
3fb0: 72 61 6d 20 61 73 20 77 65 20 63 61 6e 20 74 68  ram as we can th
3fc0: 65 6e 20 72 65 74 75 72 6e 2e 0a 2a 2a 0a 2a 2a  en return..**.**
3fd0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
3fe0: 52 65 61 64 79 28 29 20 6d 75 73 74 20 62 65 20  Ready() must be 
3ff0: 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 74 68  called before th
4000: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  is routine in or
4010: 64 65 72 20 74 6f 0a 2a 2a 20 63 6c 6f 73 65 20  der to.** close 
4020: 74 68 65 20 70 72 6f 67 72 61 6d 20 77 69 74 68  the program with
4030: 20 61 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74   a final OP_Halt
4040: 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74   and to set up t
4050: 68 65 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2a 20  he callbacks.** 
4060: 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 6d 65  and the error me
4070: 73 73 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 2a  ssage pointer..*
4080: 2a 0a 2a 2a 20 57 68 65 6e 65 76 65 72 20 61 20  *.** Whenever a 
4090: 72 6f 77 20 6f 72 20 72 65 73 75 6c 74 20 64 61  row or result da
40a0: 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ta is available,
40b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
40c0: 6c 6c 20 65 69 74 68 65 72 0a 2a 2a 20 69 6e 76  ll either.** inv
40d0: 6f 6b 65 20 74 68 65 20 72 65 73 75 6c 74 20 63  oke the result c
40e0: 61 6c 6c 62 61 63 6b 20 28 69 66 20 74 68 65 72  allback (if ther
40f0: 65 20 69 73 20 6f 6e 65 29 20 6f 72 20 72 65 74  e is one) or ret
4100: 75 72 6e 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49  urn with.** SQLI
4110: 54 45 5f 52 4f 57 2e 0a 2a 2a 0a 2a 2a 20 49 66  TE_ROW..**.** If
4120: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
4130: 61 64 65 20 74 6f 20 6f 70 65 6e 20 61 20 6c 6f  ade to open a lo
4140: 63 6b 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  cked database, t
4150: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
4160: 0a 2a 2a 20 77 69 6c 6c 20 65 69 74 68 65 72 20  .** will either 
4170: 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
4180: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 74 68 65  callback (if the
4190: 72 65 20 69 73 20 6f 6e 65 29 20 6f 72 20 69 74  re is one) or it
41a0: 20 77 69 6c 6c 0a 2a 2a 20 72 65 74 75 72 6e 20   will.** return 
41b0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a  SQLITE_BUSY..**.
41c0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
41d0: 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
41e0: 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
41f0: 65 6e 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74  en to memory obt
4200: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
4210: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61  lite3_malloc() a
4220: 6e 64 20 70 2d 3e 7a 45 72 72 4d 73 67 20 69 73  nd p->zErrMsg is
4230: 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
4240: 6f 20 74 68 61 74 20 6d 65 6d 6f 72 79 2e 0a 2a  o that memory..*
4250: 2a 20 54 68 65 20 65 72 72 6f 72 20 63 6f 64 65  * The error code
4260: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 2d   is stored in p-
4270: 3e 72 63 20 61 6e 64 20 74 68 69 73 20 72 6f 75  >rc and this rou
4280: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
4290: 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a  ITE_ERROR..**.**
42a0: 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   If the callback
42b0: 20 65 76 65 72 20 72 65 74 75 72 6e 73 20 6e 6f   ever returns no
42c0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
42d0: 20 70 72 6f 67 72 61 6d 20 65 78 69 74 73 0a 2a   program exits.*
42e0: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20  * immediately.  
42f0: 54 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f  There will be no
4300: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62   error message b
4310: 75 74 20 74 68 65 20 70 2d 3e 72 63 20 66 69 65  ut the p->rc fie
4320: 6c 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ld is.** set to 
4330: 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 61 6e 64  SQLITE_ABORT and
4340: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
4350: 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ll return SQLITE
4360: 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41 20  _ERROR..**.** A 
4370: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
4380: 6e 20 65 72 72 6f 72 20 63 61 75 73 65 73 20 70  n error causes p
4390: 2d 3e 72 63 20 74 6f 20 62 65 20 73 65 74 20 74  ->rc to be set t
43a0: 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61  o SQLITE_NOMEM a
43b0: 6e 64 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  nd this.** routi
43c0: 6e 65 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c  ne to return SQL
43d0: 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a  ITE_ERROR..**.**
43e0: 20 4f 74 68 65 72 20 66 61 74 61 6c 20 65 72 72   Other fatal err
43f0: 6f 72 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ors return SQLIT
4400: 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41  E_ERROR..**.** A
4410: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
4420: 65 20 68 61 73 20 66 69 6e 69 73 68 65 64 2c 20  e has finished, 
4430: 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c  sqlite3VdbeFinal
4440: 69 7a 65 28 29 20 73 68 6f 75 6c 64 20 62 65 0a  ize() should be.
4450: 2a 2a 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  ** used to clean
4460: 20 75 70 20 74 68 65 20 6d 65 73 73 20 74 68 61   up the mess tha
4470: 74 20 77 61 73 20 6c 65 66 74 20 62 65 68 69 6e  t was left behin
4480: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
4490: 33 56 64 62 65 45 78 65 63 28 0a 20 20 56 64 62  3VdbeExec(.  Vdb
44a0: 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20  e *p            
44b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
44c0: 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  DBE */.){.  int 
44d0: 70 63 3d 30 3b 20 20 20 20 20 20 20 20 20 20 20  pc=0;           
44e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
44f0: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f  ogram counter */
4500: 0a 20 20 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e  .  Op *aOp = p->
4510: 61 4f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  aOp;          /*
4520: 20 43 6f 70 79 20 6f 66 20 70 2d 3e 61 4f 70 20   Copy of p->aOp 
4530: 2a 2f 0a 20 20 4f 70 20 2a 70 4f 70 3b 20 20 20  */.  Op *pOp;   
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4550: 2f 2a 20 43 75 72 72 65 6e 74 20 6f 70 65 72 61  /* Current opera
4560: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
4570: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
4580: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
4590: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c   return */.  sql
45a0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
45b0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  ;       /* The d
45c0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
45d0: 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75  resetSchemaOnFau
45e0: 6c 74 20 3d 20 30 3b 20 2f 2a 20 52 65 73 65 74  lt = 0; /* Reset
45f0: 20 73 63 68 65 6d 61 20 61 66 74 65 72 20 61 6e   schema after an
4600: 20 65 72 72 6f 72 20 69 66 20 70 6f 73 69 74 69   error if positi
4610: 76 65 20 2a 2f 0a 20 20 75 38 20 65 6e 63 6f 64  ve */.  u8 encod
4620: 69 6e 67 20 3d 20 45 4e 43 28 64 62 29 3b 20 20  ing = ENC(db);  
4630: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
4640: 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 23  se encoding */.#
4650: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4660: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
4670: 42 41 43 4b 0a 20 20 69 6e 74 20 63 68 65 63 6b  BACK.  int check
4680: 50 72 6f 67 72 65 73 73 3b 20 20 20 20 20 20 20  Progress;       
4690: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 72 6f    /* True if pro
46a0: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 73 20  gress callbacks 
46b0: 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  are enabled */. 
46c0: 20 69 6e 74 20 6e 50 72 6f 67 72 65 73 73 4f 70   int nProgressOp
46d0: 73 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f  s = 0;      /* O
46e0: 70 63 6f 64 65 73 20 65 78 65 63 75 74 65 64 20  pcodes executed 
46f0: 73 69 6e 63 65 20 70 72 6f 67 72 65 73 73 20 63  since progress c
4700: 61 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 23 65 6e 64  allback. */.#end
4710: 69 66 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d  if.  Mem *aMem =
4720: 20 70 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20   p->aMem;       
4730: 2f 2a 20 43 6f 70 79 20 6f 66 20 70 2d 3e 61 4d  /* Copy of p->aM
4740: 65 6d 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e  em */.  Mem *pIn
4750: 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
4760: 20 20 20 2f 2a 20 31 73 74 20 69 6e 70 75 74 20     /* 1st input 
4770: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d  operand */.  Mem
4780: 20 2a 70 49 6e 32 20 3d 20 30 3b 20 20 20 20 20   *pIn2 = 0;     
4790: 20 20 20 20 20 20 20 20 2f 2a 20 32 6e 64 20 69          /* 2nd i
47a0: 6e 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  nput operand */.
47b0: 20 20 4d 65 6d 20 2a 70 49 6e 33 20 3d 20 30 3b    Mem *pIn3 = 0;
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
47d0: 33 72 64 20 69 6e 70 75 74 20 6f 70 65 72 61 6e  3rd input operan
47e0: 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4f 75 74  d */.  Mem *pOut
47f0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
4800: 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 70 65 72    /* Output oper
4810: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  and */.  int iCo
4820: 6d 70 61 72 65 20 3d 20 30 3b 20 20 20 20 20 20  mpare = 0;      
4830: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
4840: 20 6c 61 73 74 20 4f 50 5f 43 6f 6d 70 61 72 65   last OP_Compare
4850: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
4860: 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 20 3d 20  int *aPermute = 
4870: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65  0;         /* Pe
4880: 72 6d 75 74 61 74 69 6f 6e 20 6f 66 20 63 6f 6c  rmutation of col
4890: 75 6d 6e 73 20 66 6f 72 20 4f 50 5f 43 6f 6d 70  umns for OP_Comp
48a0: 61 72 65 20 2a 2f 0a 20 20 69 36 34 20 6c 61 73  are */.  i64 las
48b0: 74 52 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61 73  tRowid = db->las
48c0: 74 52 6f 77 69 64 3b 20 20 2f 2a 20 53 61 76 65  tRowid;  /* Save
48d0: 64 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c  d value of the l
48e0: 61 73 74 20 69 6e 73 65 72 74 20 52 4f 57 49 44  ast insert ROWID
48f0: 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f   */.#ifdef VDBE_
4900: 50 52 4f 46 49 4c 45 0a 20 20 75 36 34 20 73 74  PROFILE.  u64 st
4910: 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  art;            
4920: 20 20 20 20 20 2f 2a 20 43 50 55 20 63 6c 6f 63       /* CPU cloc
4930: 6b 20 63 6f 75 6e 74 20 61 74 20 73 74 61 72 74  k count at start
4940: 20 6f 66 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20   of opcode */.  
4950: 69 6e 74 20 6f 72 69 67 50 63 3b 20 20 20 20 20  int origPc;     
4960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
4970: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 61 74  ogram counter at
4980: 20 73 74 61 72 74 20 6f 66 20 6f 70 63 6f 64 65   start of opcode
4990: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 2a   */.#endif.  /**
49a0: 2a 20 49 4e 53 45 52 54 20 53 54 41 43 4b 20 55  * INSERT STACK U
49b0: 4e 49 4f 4e 20 48 45 52 45 20 2a 2a 2a 2f 0a 0a  NION HERE ***/..
49c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
49d0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
49e0: 55 4e 20 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65  UN );  /* sqlite
49f0: 33 5f 73 74 65 70 28 29 20 76 65 72 69 66 69 65  3_step() verifie
4a00: 73 20 74 68 69 73 20 2a 2f 0a 20 20 73 71 6c 69  s this */.  sqli
4a10: 74 65 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b  te3VdbeEnter(p);
4a20: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
4a30: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
4a40: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
4a50: 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  s if a malloc() 
4a60: 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f  inside a call to
4a70: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
4a80: 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a  text() or.    **
4a90: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
4aa0: 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e  text16() failed.
4ab0: 20 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 6e 6f    */.    goto no
4ac0: 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _mem;.  }.  asse
4ad0: 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
4ae0: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
4af0: 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20  QLITE_BUSY );.  
4b00: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
4b10: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  K;.  assert( p->
4b20: 65 78 70 6c 61 69 6e 3d 3d 30 20 29 3b 0a 20 20  explain==0 );.  
4b30: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
4b40: 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  0;.  db->busyHan
4b50: 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a  dler.nBusy = 0;.
4b60: 20 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45    CHECK_FOR_INTE
4b70: 52 52 55 50 54 3b 0a 20 20 73 71 6c 69 74 65 33  RRUPT;.  sqlite3
4b80: 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 70  VdbeIOTraceSql(p
4b90: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
4ba0: 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f  E_OMIT_PROGRESS_
4bb0: 43 41 4c 4c 42 41 43 4b 0a 20 20 63 68 65 63 6b  CALLBACK.  check
4bc0: 50 72 6f 67 72 65 73 73 20 3d 20 64 62 2d 3e 78  Progress = db->x
4bd0: 50 72 6f 67 72 65 73 73 21 3d 30 3b 0a 23 65 6e  Progress!=0;.#en
4be0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
4bf0: 45 5f 44 45 42 55 47 0a 20 20 73 71 6c 69 74 65  E_DEBUG.  sqlite
4c00: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
4c10: 6f 63 28 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  oc();.  if( p->p
4c20: 63 3d 3d 30 20 20 26 26 20 28 70 2d 3e 64 62 2d  c==0  && (p->db-
4c30: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
4c40: 56 64 62 65 4c 69 73 74 69 6e 67 29 21 3d 30 20  VdbeListing)!=0 
4c50: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
4c60: 20 20 70 72 69 6e 74 66 28 22 56 44 42 45 20 50    printf("VDBE P
4c70: 72 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67 3a 5c  rogram Listing:\
4c80: 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
4c90: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 70 29 3b  VdbePrintSql(p);
4ca0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4cb0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
4cc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
4cd0: 72 69 6e 74 4f 70 28 73 74 64 6f 75 74 2c 20 69  rintOp(stdout, i
4ce0: 2c 20 26 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  , &aOp[i]);.    
4cf0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  }.  }.  sqlite3E
4d00: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
4d10: 3b 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 70  ;.#endif.  for(p
4d20: 63 3d 70 2d 3e 70 63 3b 20 72 63 3d 3d 53 51 4c  c=p->pc; rc==SQL
4d30: 49 54 45 5f 4f 4b 3b 20 70 63 2b 2b 29 7b 0a 20  ITE_OK; pc++){. 
4d40: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 30     assert( pc>=0
4d50: 20 26 26 20 70 63 3c 70 2d 3e 6e 4f 70 20 29 3b   && pc<p->nOp );
4d60: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
4d70: 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
4d80: 20 6e 6f 5f 6d 65 6d 3b 0a 23 69 66 64 65 66 20   no_mem;.#ifdef 
4d90: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 20  VDBE_PROFILE.   
4da0: 20 6f 72 69 67 50 63 20 3d 20 70 63 3b 0a 20 20   origPc = pc;.  
4db0: 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65    start = sqlite
4dc0: 33 48 77 74 69 6d 65 28 29 3b 0a 23 65 6e 64 69  3Hwtime();.#endi
4dd0: 66 0a 20 20 20 20 70 4f 70 20 3d 20 26 61 4f 70  f.    pOp = &aOp
4de0: 5b 70 63 5d 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e  [pc];..    /* On
4df0: 6c 79 20 61 6c 6c 6f 77 20 74 72 61 63 69 6e 67  ly allow tracing
4e00: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
4e10: 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20 20   is defined..   
4e20: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
4e30: 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20  E_DEBUG.    if( 
4e40: 70 2d 3e 74 72 61 63 65 20 29 7b 0a 20 20 20 20  p->trace ){.    
4e50: 20 20 69 66 28 20 70 63 3d 3d 30 20 29 7b 0a 20    if( pc==0 ){. 
4e60: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 56         printf("V
4e70: 44 42 45 20 45 78 65 63 75 74 69 6f 6e 20 54 72  DBE Execution Tr
4e80: 61 63 65 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ace:\n");.      
4e90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
4ea0: 6e 74 53 71 6c 28 70 29 3b 0a 20 20 20 20 20 20  ntSql(p);.      
4eb0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
4ec0: 64 62 65 50 72 69 6e 74 4f 70 28 70 2d 3e 74 72  dbePrintOp(p->tr
4ed0: 61 63 65 2c 20 70 63 2c 20 70 4f 70 29 3b 0a 20  ace, pc, pOp);. 
4ee0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
4ef0: 20 20 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b    ..    /* Check
4f00: 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
4f10: 65 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  ed to simulate a
4f20: 6e 20 69 6e 74 65 72 72 75 70 74 2e 20 20 54 68  n interrupt.  Th
4f30: 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 0a  is only happens.
4f40: 20 20 20 20 2a 2a 20 69 66 20 77 65 20 68 61 76      ** if we hav
4f50: 65 20 61 20 73 70 65 63 69 61 6c 20 74 65 73 74  e a special test
4f60: 20 62 75 69 6c 64 2e 0a 20 20 20 20 2a 2f 0a 23   build..    */.#
4f70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
4f80: 54 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  T.    if( sqlite
4f90: 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e  3_interrupt_coun
4fa0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  t>0 ){.      sql
4fb0: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63  ite3_interrupt_c
4fc0: 6f 75 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 69 66  ount--;.      if
4fd0: 28 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  ( sqlite3_interr
4fe0: 75 70 74 5f 63 6f 75 6e 74 3d 3d 30 20 29 7b 0a  upt_count==0 ){.
4ff0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5000: 69 6e 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20  interrupt(db);. 
5010: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
5020: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
5030: 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
5040: 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 2f  S_CALLBACK.    /
5050: 2a 20 43 61 6c 6c 20 74 68 65 20 70 72 6f 67 72  * Call the progr
5060: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  ess callback if 
5070: 69 74 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  it is configured
5080: 20 61 6e 64 20 74 68 65 20 72 65 71 75 69 72 65   and the require
5090: 64 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2a 20  d number.    ** 
50a0: 6f 66 20 56 44 42 45 20 6f 70 73 20 68 61 76 65  of VDBE ops have
50b0: 20 62 65 65 6e 20 65 78 65 63 75 74 65 64 20 28   been executed (
50c0: 65 69 74 68 65 72 20 73 69 6e 63 65 20 74 68 69  either since thi
50d0: 73 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 0a  s invocation of.
50e0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64      ** sqlite3Vd
50f0: 62 65 45 78 65 63 28 29 20 6f 72 20 73 69 6e 63  beExec() or sinc
5100: 65 20 6c 61 73 74 20 74 69 6d 65 20 74 68 65 20  e last time the 
5110: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
5120: 6b 20 77 61 73 20 63 61 6c 6c 65 64 29 2e 0a 20  k was called).. 
5130: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 70 72 6f     ** If the pro
5140: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 72  gress callback r
5150: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
5160: 20 65 78 69 74 20 74 68 65 20 76 69 72 74 75 61   exit the virtua
5170: 6c 20 6d 61 63 68 69 6e 65 20 77 69 74 68 0a 20  l machine with. 
5180: 20 20 20 2a 2a 20 61 20 72 65 74 75 72 6e 20 63     ** a return c
5190: 6f 64 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ode SQLITE_ABORT
51a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
51b0: 20 63 68 65 63 6b 50 72 6f 67 72 65 73 73 20 29   checkProgress )
51c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
51d0: 6e 50 72 6f 67 72 65 73 73 4f 70 73 3d 3d 6e 50  nProgressOps==nP
51e0: 72 6f 67 72 65 73 73 4f 70 73 20 29 7b 0a 20 20  rogressOps ){.  
51f0: 20 20 20 20 20 20 69 6e 74 20 70 72 63 3b 0a 20        int prc;. 
5200: 20 20 20 20 20 20 20 70 72 63 20 3d 20 64 62 2d         prc = db-
5210: 3e 78 50 72 6f 67 72 65 73 73 28 64 62 2d 3e 70  >xProgress(db->p
5220: 50 72 6f 67 72 65 73 73 41 72 67 29 3b 0a 20 20  ProgressArg);.  
5230: 20 20 20 20 20 20 69 66 28 20 70 72 63 21 3d 30        if( prc!=0
5240: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
5250: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
5260: 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  UPT;.          g
5270: 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68  oto vdbe_error_h
5280: 61 6c 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  alt;.        }. 
5290: 20 20 20 20 20 20 20 6e 50 72 6f 67 72 65 73 73         nProgress
52a0: 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Ops = 0;.      }
52b0: 0a 20 20 20 20 20 20 6e 50 72 6f 67 72 65 73 73  .      nProgress
52c0: 4f 70 73 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e  Ops++;.    }.#en
52d0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 4f 6e 20 61  dif..    /* On a
52e0: 6e 79 20 6f 70 63 6f 64 65 20 77 69 74 68 20 74  ny opcode with t
52f0: 68 65 20 22 6f 75 74 32 2d 70 72 65 72 65 6c 65  he "out2-prerele
5300: 61 73 65 22 20 74 61 67 2c 20 66 72 65 65 20 61  ase" tag, free a
5310: 6e 79 0a 20 20 20 20 2a 2a 20 65 78 74 65 72 6e  ny.    ** extern
5320: 61 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f  al allocations o
5330: 75 74 20 6f 66 20 6d 65 6d 5b 70 32 5d 20 61 6e  ut of mem[p2] an
5340: 64 20 73 65 74 20 6d 65 6d 5b 70 32 5d 20 74 6f  d set mem[p2] to
5350: 20 62 65 0a 20 20 20 20 2a 2a 20 61 6e 20 75 6e   be.    ** an un
5360: 64 65 66 69 6e 65 64 20 69 6e 74 65 67 65 72 2e  defined integer.
5370: 20 20 4f 70 63 6f 64 65 73 20 77 69 6c 6c 20 65    Opcodes will e
5380: 69 74 68 65 72 20 66 69 6c 6c 20 69 6e 20 74 68  ither fill in th
5390: 65 20 69 6e 74 65 67 65 72 0a 20 20 20 20 2a 2a  e integer.    **
53a0: 20 76 61 6c 75 65 20 6f 72 20 63 6f 6e 76 65 72   value or conver
53b0: 74 20 6d 65 6d 5b 70 32 5d 20 74 6f 20 61 20 64  t mem[p2] to a d
53c0: 69 66 66 65 72 65 6e 74 20 74 79 70 65 2e 0a 20  ifferent type.. 
53d0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
53e0: 28 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 3d 3d  ( pOp->opflags==
53f0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
5400: 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64  perty[pOp->opcod
5410: 65 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  e] );.    if( pO
5420: 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46  p->opflags & OPF
5430: 4c 47 5f 4f 55 54 32 5f 50 52 45 52 45 4c 45 41  LG_OUT2_PRERELEA
5440: 53 45 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  SE ){.      asse
5450: 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b  rt( pOp->p2>0 );
5460: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
5470: 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d 20  Op->p2<=p->nMem 
5480: 29 3b 0a 20 20 20 20 20 20 70 4f 75 74 20 3d 20  );.      pOut = 
5490: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
54a0: 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f        memAboutTo
54b0: 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b  Change(p, pOut);
54c0: 0a 20 20 20 20 20 20 56 64 62 65 4d 65 6d 52 65  .      VdbeMemRe
54d0: 6c 65 61 73 65 28 70 4f 75 74 29 3b 0a 20 20 20  lease(pOut);.   
54e0: 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d     pOut->flags =
54f0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 7d 0a   MEM_Int;.    }.
5500: 0a 20 20 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  .    /* Sanity c
5510: 68 65 63 6b 69 6e 67 20 6f 6e 20 6f 74 68 65 72  hecking on other
5520: 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 23 69 66   operands */.#if
5530: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
5540: 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f  .    if( (pOp->o
5550: 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 49  pflags & OPFLG_I
5560: 4e 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  N1)!=0 ){.      
5570: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
5580: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
5590: 74 28 20 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e  t( pOp->p1<=p->n
55a0: 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Mem );.      ass
55b0: 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
55c0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20  &aMem[pOp->p1]) 
55d0: 29 3b 0a 20 20 20 20 20 20 52 45 47 49 53 54 45  );.      REGISTE
55e0: 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c  R_TRACE(pOp->p1,
55f0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29   &aMem[pOp->p1])
5600: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5610: 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20  (pOp->opflags & 
5620: 4f 50 46 4c 47 5f 49 4e 32 29 21 3d 30 20 29 7b  OPFLG_IN2)!=0 ){
5630: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
5640: 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20  Op->p2>0 );.    
5650: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
5660: 32 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  2<=p->nMem );.  
5670: 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
5680: 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70  sValid(&aMem[pOp
5690: 2d 3e 70 32 5d 29 20 29 3b 0a 20 20 20 20 20 20  ->p2]) );.      
56a0: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
56b0: 4f 70 2d 3e 70 32 2c 20 26 61 4d 65 6d 5b 70 4f  Op->p2, &aMem[pO
56c0: 70 2d 3e 70 32 5d 29 3b 0a 20 20 20 20 7d 0a 20  p->p2]);.    }. 
56d0: 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66     if( (pOp->opf
56e0: 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 49 4e 33  lags & OPFLG_IN3
56f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  )!=0 ){.      as
5700: 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20  sert( pOp->p3>0 
5710: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
5720: 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65   pOp->p3<=p->nMe
5730: 6d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  m );.      asser
5740: 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61  t( memIsValid(&a
5750: 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20 29 3b  Mem[pOp->p3]) );
5760: 0a 20 20 20 20 20 20 52 45 47 49 53 54 45 52 5f  .      REGISTER_
5770: 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 26  TRACE(pOp->p3, &
5780: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a  aMem[pOp->p3]);.
5790: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
57a0: 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50  Op->opflags & OP
57b0: 46 4c 47 5f 4f 55 54 32 29 21 3d 30 20 29 7b 0a  FLG_OUT2)!=0 ){.
57c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
57d0: 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20 20  p->p2>0 );.     
57e0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
57f0: 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20  <=p->nMem );.   
5800: 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61     memAboutToCha
5810: 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70  nge(p, &aMem[pOp
5820: 2d 3e 70 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ->p2]);.    }.  
5830: 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c    if( (pOp->opfl
5840: 61 67 73 20 26 20 4f 50 46 4c 47 5f 4f 55 54 33  ags & OPFLG_OUT3
5850: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  )!=0 ){.      as
5860: 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20  sert( pOp->p3>0 
5870: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
5880: 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65   pOp->p3<=p->nMe
5890: 6d 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62  m );.      memAb
58a0: 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 26  outToChange(p, &
58b0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a  aMem[pOp->p3]);.
58c0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a      }.#endif.  .
58d0: 20 20 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d      switch( pOp-
58e0: 3e 6f 70 63 6f 64 65 20 29 7b 0a 0a 2f 2a 2a 2a  >opcode ){../***
58f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 57 68  **********.** Wh
5940: 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 61 20  at follows is a 
5950: 6d 61 73 73 69 76 65 20 73 77 69 74 63 68 20 73  massive switch s
5960: 74 61 74 65 6d 65 6e 74 20 77 68 65 72 65 20 65  tatement where e
5970: 61 63 68 20 63 61 73 65 20 69 6d 70 6c 65 6d 65  ach case impleme
5980: 6e 74 73 20 61 0a 2a 2a 20 73 65 70 61 72 61 74  nts a.** separat
5990: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e  e instruction in
59a0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
59b0: 68 69 6e 65 2e 20 20 49 66 20 77 65 20 66 6f 6c  hine.  If we fol
59c0: 6c 6f 77 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a  low the usual.**
59d0: 20 69 6e 64 65 6e 74 61 74 69 6f 6e 20 63 6f 6e   indentation con
59e0: 76 65 6e 74 69 6f 6e 73 2c 20 65 61 63 68 20 63  ventions, each c
59f0: 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ase should be in
5a00: 64 65 6e 74 65 64 20 62 79 20 36 20 73 70 61 63  dented by 6 spac
5a10: 65 73 2e 20 20 42 75 74 0a 2a 2a 20 74 68 61 74  es.  But.** that
5a20: 20 69 73 20 61 20 6c 6f 74 20 6f 66 20 77 61 73   is a lot of was
5a30: 74 65 64 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ted space on the
5a40: 20 6c 65 66 74 20 6d 61 72 67 69 6e 2e 20 20 53   left margin.  S
5a50: 6f 20 74 68 65 20 63 6f 64 65 20 77 69 74 68 69  o the code withi
5a60: 6e 0a 2a 2a 20 74 68 65 20 73 77 69 74 63 68 20  n.** the switch 
5a70: 73 74 61 74 65 6d 65 6e 74 20 77 69 6c 6c 20 62  statement will b
5a80: 72 65 61 6b 20 77 69 74 68 20 63 6f 6e 76 65 6e  reak with conven
5a90: 74 69 6f 6e 20 61 6e 64 20 62 65 20 66 6c 75 73  tion and be flus
5aa0: 68 2d 6c 65 66 74 2e 20 41 6e 6f 74 68 65 72 0a  h-left. Another.
5ab0: 2a 2a 20 62 69 67 20 63 6f 6d 6d 65 6e 74 20 28  ** big comment (
5ac0: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 69 73 20  similar to this 
5ad0: 6f 6e 65 29 20 77 69 6c 6c 20 6d 61 72 6b 20 74  one) will mark t
5ae0: 68 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  he point in the 
5af0: 63 6f 64 65 20 77 68 65 72 65 0a 2a 2a 20 77 65  code where.** we
5b00: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
5b10: 20 74 6f 20 6e 6f 72 6d 61 6c 20 69 6e 64 65 6e   to normal inden
5b20: 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  tation..**.** Th
5b30: 65 20 66 6f 72 6d 61 74 74 69 6e 67 20 6f 66 20  e formatting of 
5b40: 65 61 63 68 20 63 61 73 65 20 69 73 20 69 6d 70  each case is imp
5b50: 6f 72 74 61 6e 74 2e 20 20 54 68 65 20 6d 61 6b  ortant.  The mak
5b60: 65 66 69 6c 65 20 66 6f 72 20 53 51 4c 69 74 65  efile for SQLite
5b70: 0a 2a 2a 20 67 65 6e 65 72 61 74 65 73 20 74 77  .** generates tw
5b80: 6f 20 43 20 66 69 6c 65 73 20 22 6f 70 63 6f 64  o C files "opcod
5b90: 65 73 2e 68 22 20 61 6e 64 20 22 6f 70 63 6f 64  es.h" and "opcod
5ba0: 65 73 2e 63 22 20 62 79 20 73 63 61 6e 6e 69 6e  es.c" by scannin
5bb0: 67 20 74 68 69 73 0a 2a 2a 20 66 69 6c 65 20 6c  g this.** file l
5bc0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 6c 69 6e 65 73  ooking for lines
5bd0: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
5be0: 20 22 63 61 73 65 20 4f 50 5f 22 2e 20 20 54 68   "case OP_".  Th
5bf0: 65 20 6f 70 63 6f 64 65 73 2e 68 20 66 69 6c 65  e opcodes.h file
5c00: 73 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 66 69 6c  s.** will be fil
5c10: 6c 65 64 20 77 69 74 68 20 23 64 65 66 69 6e 65  led with #define
5c20: 73 20 74 68 61 74 20 67 69 76 65 20 75 6e 69 71  s that give uniq
5c30: 75 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  ue integer value
5c40: 73 20 74 6f 20 65 61 63 68 0a 2a 2a 20 6f 70 63  s to each.** opc
5c50: 6f 64 65 20 61 6e 64 20 74 68 65 20 6f 70 63 6f  ode and the opco
5c60: 64 65 73 2e 63 20 66 69 6c 65 20 69 73 20 66 69  des.c file is fi
5c70: 6c 6c 65 64 20 77 69 74 68 20 61 6e 20 61 72 72  lled with an arr
5c80: 61 79 20 6f 66 20 73 74 72 69 6e 67 73 20 77 68  ay of strings wh
5c90: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 74 72 69  ere.** each stri
5ca0: 6e 67 20 69 73 20 74 68 65 20 73 79 6d 62 6f 6c  ng is the symbol
5cb0: 69 63 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ic name for the 
5cc0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6f 70  corresponding op
5cd0: 63 6f 64 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a  code.  If the.**
5ce0: 20 63 61 73 65 20 73 74 61 74 65 6d 65 6e 74 20   case statement 
5cf0: 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  is followed by a
5d00: 20 63 6f 6d 6d 65 6e 74 20 6f 66 20 74 68 65 20   comment of the 
5d10: 66 6f 72 6d 20 22 2f 23 20 73 61 6d 65 20 61 73  form "/# same as
5d20: 20 2e 2e 2e 20 23 2f 22 0a 2a 2a 20 74 68 61 74   ... #/".** that
5d30: 20 63 6f 6d 6d 65 6e 74 20 69 73 20 75 73 65 64   comment is used
5d40: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
5d50: 65 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c  e particular val
5d60: 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  ue of the opcode
5d70: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 20 6b 65  ..**.** Other ke
5d80: 79 77 6f 72 64 73 20 69 6e 20 74 68 65 20 63 6f  ywords in the co
5d90: 6d 6d 65 6e 74 20 74 68 61 74 20 66 6f 6c 6c 6f  mment that follo
5da0: 77 73 20 65 61 63 68 20 63 61 73 65 20 61 72 65  ws each case are
5db0: 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e 73   used to.** cons
5dc0: 74 72 75 63 74 20 74 68 65 20 4f 50 46 4c 47 5f  truct the OPFLG_
5dd0: 49 4e 49 54 49 41 4c 49 5a 45 52 20 76 61 6c 75  INITIALIZER valu
5de0: 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a  e that initializ
5df0: 65 73 20 6f 70 63 6f 64 65 50 72 6f 70 65 72 74  es opcodePropert
5e00: 79 5b 5d 2e 0a 2a 2a 20 4b 65 79 77 6f 72 64 73  y[]..** Keywords
5e10: 20 69 6e 63 6c 75 64 65 3a 20 69 6e 31 2c 20 69   include: in1, i
5e20: 6e 32 2c 20 69 6e 33 2c 20 6f 75 74 32 5f 70 72  n2, in3, out2_pr
5e30: 65 72 65 6c 65 61 73 65 2c 20 6f 75 74 32 2c 20  erelease, out2, 
5e40: 6f 75 74 33 2e 20 20 53 65 65 0a 2a 2a 20 74 68  out3.  See.** th
5e50: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
5e60: 73 63 72 69 70 74 20 66 6f 72 20 61 64 64 69 74  script for addit
5e70: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
5e80: 6e 2e 0a 2a 2a 0a 2a 2a 20 44 6f 63 75 6d 65 6e  n..**.** Documen
5e90: 74 61 74 69 6f 6e 20 61 62 6f 75 74 20 56 44 42  tation about VDB
5ea0: 45 20 6f 70 63 6f 64 65 73 20 69 73 20 67 65 6e  E opcodes is gen
5eb0: 65 72 61 74 65 64 20 62 79 20 73 63 61 6e 6e 69  erated by scanni
5ec0: 6e 67 20 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20  ng this file.** 
5ed0: 66 6f 72 20 6c 69 6e 65 73 20 6f 66 20 74 68 61  for lines of tha
5ee0: 74 20 63 6f 6e 74 61 69 6e 20 22 4f 70 63 6f 64  t contain "Opcod
5ef0: 65 3a 22 2e 20 20 54 68 61 74 20 6c 69 6e 65 20  e:".  That line 
5f00: 61 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  and all subseque
5f10: 6e 74 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 6c 69  nt.** comment li
5f20: 6e 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20  nes are used in 
5f30: 74 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f  the generation o
5f40: 66 20 74 68 65 20 6f 70 63 6f 64 65 2e 68 74 6d  f the opcode.htm
5f50: 6c 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 0a  l documentation.
5f60: 2a 2a 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  ** file..**.** S
5f70: 55 4d 4d 41 52 59 3a 0a 2a 2a 0a 2a 2a 20 20 20  UMMARY:.**.**   
5f80: 20 20 46 6f 72 6d 61 74 74 69 6e 67 20 69 73 20    Formatting is 
5f90: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 63 72  important to scr
5fa0: 69 70 74 73 20 74 68 61 74 20 73 63 61 6e 20 74  ipts that scan t
5fb0: 68 69 73 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  his file..**    
5fc0: 20 44 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20   Do not deviate 
5fd0: 66 72 6f 6d 20 74 68 65 20 66 6f 72 6d 61 74 74  from the formatt
5fe0: 69 6e 67 20 73 74 79 6c 65 20 63 75 72 72 65 6e  ing style curren
5ff0: 74 6c 79 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  tly in use..**.*
6000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
6050: 2a 20 4f 70 63 6f 64 65 3a 20 20 47 6f 74 6f 20  * Opcode:  Goto 
6060: 2a 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  * P2 * * *.**.**
6070: 20 41 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61   An unconditiona
6080: 6c 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73  l jump to addres
6090: 73 20 50 32 2e 0a 2a 2a 20 54 68 65 20 6e 65 78  s P2..** The nex
60a0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 78  t instruction ex
60b0: 65 63 75 74 65 64 20 77 69 6c 6c 20 62 65 20 0a  ecuted will be .
60c0: 2a 2a 20 74 68 65 20 6f 6e 65 20 61 74 20 69 6e  ** the one at in
60d0: 64 65 78 20 50 32 20 66 72 6f 6d 20 74 68 65 20  dex P2 from the 
60e0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
60f0: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  the program..*/.
6100: 63 61 73 65 20 4f 50 5f 47 6f 74 6f 3a 20 7b 20  case OP_Goto: { 
6110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
6120: 75 6d 70 20 2a 2f 0a 20 20 43 48 45 43 4b 5f 46  ump */.  CHECK_F
6130: 4f 52 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20  OR_INTERRUPT;.  
6140: 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
6150: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
6160: 20 4f 70 63 6f 64 65 3a 20 20 47 6f 73 75 62 20   Opcode:  Gosub 
6170: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
6180: 2a 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72  * Write the curr
6190: 65 6e 74 20 61 64 64 72 65 73 73 20 6f 6e 74 6f  ent address onto
61a0: 20 72 65 67 69 73 74 65 72 20 50 31 0a 2a 2a 20   register P1.** 
61b0: 61 6e 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  and then jump to
61c0: 20 61 64 64 72 65 73 73 20 50 32 2e 0a 2a 2f 0a   address P2..*/.
61d0: 63 61 73 65 20 4f 50 5f 47 6f 73 75 62 3a 20 7b  case OP_Gosub: {
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
61f0: 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ump */.  assert(
6200: 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f   pOp->p1>0 && pO
6210: 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 4d 65 6d 20 29  p->p1<=p->nMem )
6220: 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ;.  pIn1 = &aMem
6230: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
6240: 65 72 74 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67  ert( (pIn1->flag
6250: 73 20 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d 30 20  s & MEM_Dyn)==0 
6260: 29 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43  );.  memAboutToC
6270: 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a  hange(p, pIn1);.
6280: 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20    pIn1->flags = 
6290: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 70 49 6e 31 2d  MEM_Int;.  pIn1-
62a0: 3e 75 2e 69 20 3d 20 70 63 3b 0a 20 20 52 45 47  >u.i = pc;.  REG
62b0: 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
62c0: 3e 70 31 2c 20 70 49 6e 31 29 3b 0a 20 20 70 63  >p1, pIn1);.  pc
62d0: 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
62e0: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
62f0: 70 63 6f 64 65 3a 20 20 52 65 74 75 72 6e 20 50  pcode:  Return P
6300: 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  1 * * * *.**.** 
6310: 4a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74  Jump to the next
6320: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 66 74   instruction aft
6330: 65 72 20 74 68 65 20 61 64 64 72 65 73 73 20 69  er the address i
6340: 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a  n register P1..*
6350: 2f 0a 63 61 73 65 20 4f 50 5f 52 65 74 75 72 6e  /.case OP_Return
6360: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  : {           /*
6370: 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
6380: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
6390: 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d  .  assert( pIn1-
63a0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
63b0: 20 29 3b 0a 20 20 70 63 20 3d 20 28 69 6e 74 29   );.  pc = (int)
63c0: 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 62 72 65  pIn1->u.i;.  bre
63d0: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
63e0: 3a 20 20 59 69 65 6c 64 20 50 31 20 2a 20 2a 20  :  Yield P1 * * 
63f0: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 77 61 70 20 74  * *.**.** Swap t
6400: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74  he program count
6410: 65 72 20 77 69 74 68 20 74 68 65 20 76 61 6c 75  er with the valu
6420: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
6430: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 59 69 65  ..*/.case OP_Yie
6440: 6c 64 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ld: {           
6450: 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 69 6e 74   /* in1 */.  int
6460: 20 70 63 44 65 73 74 3b 0a 20 20 70 49 6e 31 20   pcDest;.  pIn1 
6470: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
6480: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 6e  ;.  assert( (pIn
6490: 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  1->flags & MEM_D
64a0: 79 6e 29 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31  yn)==0 );.  pIn1
64b0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
64c0: 74 3b 0a 20 20 70 63 44 65 73 74 20 3d 20 28 69  t;.  pcDest = (i
64d0: 6e 74 29 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20  nt)pIn1->u.i;.  
64e0: 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 70 63 3b 0a  pIn1->u.i = pc;.
64f0: 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
6500: 28 70 4f 70 2d 3e 70 31 2c 20 70 49 6e 31 29 3b  (pOp->p1, pIn1);
6510: 0a 20 20 70 63 20 3d 20 70 63 44 65 73 74 3b 0a  .  pc = pcDest;.
6520: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
6530: 70 63 6f 64 65 3a 20 20 48 61 6c 74 49 66 4e 75  pcode:  HaltIfNu
6540: 6c 6c 20 20 50 31 20 50 32 20 50 33 20 50 34 20  ll  P1 P2 P3 P4 
6550: 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  *.**.** Check th
6560: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
6570: 74 65 72 20 50 33 2e 20 20 49 66 20 69 74 20 69  ter P3.  If it i
6580: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 48 61 6c 74  s NULL then Halt
6590: 20 75 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65   using.** parame
65a0: 74 65 72 20 50 31 2c 20 50 32 2c 20 61 6e 64 20  ter P1, P2, and 
65b0: 50 34 20 61 73 20 69 66 20 74 68 69 73 20 77 65  P4 as if this we
65c0: 72 65 20 61 20 48 61 6c 74 20 69 6e 73 74 72 75  re a Halt instru
65d0: 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 0a 2a  ction.  If the.*
65e0: 2a 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  * value in regis
65f0: 74 65 72 20 50 33 20 69 73 20 6e 6f 74 20 4e 55  ter P3 is not NU
6600: 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  LL, then this ro
6610: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
6620: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 48 61 6c  ..*/.case OP_Hal
6630: 74 49 66 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20  tIfNull: {      
6640: 2f 2a 20 69 6e 33 20 2a 2f 0a 20 20 70 49 6e 33  /* in3 */.  pIn3
6650: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
6660: 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 33 2d 3e  ];.  if( (pIn3->
6670: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
6680: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
6690: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
66a0: 69 6e 74 6f 20 4f 50 5f 48 61 6c 74 20 2a 2f 0a  into OP_Halt */.
66b0: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 48  }../* Opcode:  H
66c0: 61 6c 74 20 50 31 20 50 32 20 2a 20 50 34 20 2a  alt P1 P2 * P4 *
66d0: 0a 2a 2a 0a 2a 2a 20 45 78 69 74 20 69 6d 6d 65  .**.** Exit imme
66e0: 64 69 61 74 65 6c 79 2e 20 20 41 6c 6c 20 6f 70  diately.  All op
66f0: 65 6e 20 63 75 72 73 6f 72 73 2c 20 65 74 63 20  en cursors, etc 
6700: 61 72 65 20 63 6c 6f 73 65 64 0a 2a 2a 20 61 75  are closed.** au
6710: 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2a 0a  tomatically..**.
6720: 2a 2a 20 50 31 20 69 73 20 74 68 65 20 72 65 73  ** P1 is the res
6730: 75 6c 74 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ult code returne
6740: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 65 78 65  d by sqlite3_exe
6750: 63 28 29 2c 20 73 71 6c 69 74 65 33 5f 72 65 73  c(), sqlite3_res
6760: 65 74 28 29 2c 0a 2a 2a 20 6f 72 20 73 71 6c 69  et(),.** or sqli
6770: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 2e 20  te3_finalize(). 
6780: 20 46 6f 72 20 61 20 6e 6f 72 6d 61 6c 20 68 61   For a normal ha
6790: 6c 74 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20  lt, this should 
67a0: 62 65 20 53 51 4c 49 54 45 5f 4f 4b 20 28 30 29  be SQLITE_OK (0)
67b0: 2e 0a 2a 2a 20 46 6f 72 20 65 72 72 6f 72 73 2c  ..** For errors,
67c0: 20 69 74 20 63 61 6e 20 62 65 20 73 6f 6d 65 20   it can be some 
67d0: 6f 74 68 65 72 20 76 61 6c 75 65 2e 20 20 49 66  other value.  If
67e0: 20 50 31 21 3d 30 20 74 68 65 6e 20 50 32 20 77   P1!=0 then P2 w
67f0: 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a  ill determine.**
6800: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
6810: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
6820: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
6830: 69 6f 6e 2e 20 20 44 6f 20 6e 6f 74 20 72 6f 6c  ion.  Do not rol
6840: 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 50 32 3d 3d  lback.** if P2==
6850: 4f 45 5f 46 61 69 6c 2e 20 44 6f 20 74 68 65 20  OE_Fail. Do the 
6860: 72 6f 6c 6c 62 61 63 6b 20 69 66 20 50 32 3d 3d  rollback if P2==
6870: 4f 45 5f 52 6f 6c 6c 62 61 63 6b 2e 20 20 49 66  OE_Rollback.  If
6880: 20 50 32 3d 3d 4f 45 5f 41 62 6f 72 74 2c 0a 2a   P2==OE_Abort,.*
6890: 2a 20 74 68 65 6e 20 62 61 63 6b 20 6f 75 74 20  * then back out 
68a0: 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 68 61 74  all changes that
68b0: 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 64   have occurred d
68c0: 75 72 69 6e 67 20 74 68 69 73 20 65 78 65 63 75  uring this execu
68d0: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56  tion of the.** V
68e0: 44 42 45 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  DBE, but do not 
68f0: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
6900: 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  nsaction. .**.**
6910: 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20 6e 75   If P4 is not nu
6920: 6c 6c 20 74 68 65 6e 20 69 74 20 69 73 20 61 6e  ll then it is an
6930: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
6940: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tring..**.** The
6950: 72 65 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64  re is an implied
6960: 20 22 48 61 6c 74 20 30 20 30 20 30 22 20 69 6e   "Halt 0 0 0" in
6970: 73 74 72 75 63 74 69 6f 6e 20 69 6e 73 65 72 74  struction insert
6980: 65 64 20 61 74 20 74 68 65 20 76 65 72 79 20 65  ed at the very e
6990: 6e 64 20 6f 66 0a 2a 2a 20 65 76 65 72 79 20 70  nd of.** every p
69a0: 72 6f 67 72 61 6d 2e 20 20 53 6f 20 61 20 6a 75  rogram.  So a ju
69b0: 6d 70 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  mp past the last
69c0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20   instruction of 
69d0: 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 69  the program.** i
69e0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 65 78  s the same as ex
69f0: 65 63 75 74 69 6e 67 20 48 61 6c 74 2e 0a 2a 2f  ecuting Halt..*/
6a00: 0a 63 61 73 65 20 4f 50 5f 48 61 6c 74 3a 20 7b  .case OP_Halt: {
6a10: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d  .  if( pOp->p1==
6a20: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
6a30: 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a  pFrame ){.    /*
6a40: 20 48 61 6c 74 20 74 68 65 20 73 75 62 2d 70 72   Halt the sub-pr
6a50: 6f 67 72 61 6d 2e 20 52 65 74 75 72 6e 20 63 6f  ogram. Return co
6a60: 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 70 61 72  ntrol to the par
6a70: 65 6e 74 20 66 72 61 6d 65 2e 20 2a 2f 0a 20 20  ent frame. */.  
6a80: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72    VdbeFrame *pFr
6a90: 61 6d 65 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b  ame = p->pFrame;
6aa0: 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d  .    p->pFrame =
6ab0: 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74   pFrame->pParent
6ac0: 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 2d  ;.    p->nFrame-
6ad0: 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  -;.    sqlite3Vd
6ae0: 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
6af0: 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20   p->nChange);.  
6b00: 20 20 70 63 20 3d 20 73 71 6c 69 74 65 33 56 64    pc = sqlite3Vd
6b10: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70  beFrameRestore(p
6b20: 46 72 61 6d 65 29 3b 0a 20 20 20 20 6c 61 73 74  Frame);.    last
6b30: 52 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61 73 74  Rowid = db->last
6b40: 52 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20 70  Rowid;.    if( p
6b50: 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 49 67 6e 6f 72  Op->p2==OE_Ignor
6b60: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  e ){.      /* In
6b70: 73 74 72 75 63 74 69 6f 6e 20 70 63 20 69 73 20  struction pc is 
6b80: 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 74  the OP_Program t
6b90: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 65 20  hat invoked the 
6ba0: 73 75 62 2d 70 72 6f 67 72 61 6d 20 0a 20 20 20  sub-program .   
6bb0: 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20     ** currently 
6bc0: 62 65 69 6e 67 20 68 61 6c 74 65 64 2e 20 49 66  being halted. If
6bd0: 20 74 68 65 20 70 32 20 69 6e 73 74 72 75 63 74   the p2 instruct
6be0: 69 6f 6e 20 6f 66 20 74 68 69 73 20 4f 50 5f 48  ion of this OP_H
6bf0: 61 6c 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73  alt.      ** ins
6c00: 74 72 75 63 74 69 6f 6e 20 69 73 20 73 65 74 20  truction is set 
6c10: 74 6f 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 74 68  to OE_Ignore, th
6c20: 65 6e 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  en the sub-progr
6c30: 61 6d 20 69 73 20 74 68 72 6f 77 69 6e 67 0a 20  am is throwing. 
6c40: 20 20 20 20 20 2a 2a 20 61 6e 20 49 47 4e 4f 52       ** an IGNOR
6c50: 45 20 65 78 63 65 70 74 69 6f 6e 2e 20 49 6e 20  E exception. In 
6c60: 74 68 69 73 20 63 61 73 65 20 6a 75 6d 70 20 74  this case jump t
6c70: 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 73 70  o the address sp
6c80: 65 63 69 66 69 65 64 0a 20 20 20 20 20 20 2a 2a  ecified.      **
6c90: 20 61 73 20 74 68 65 20 70 32 20 6f 66 20 74 68   as the p2 of th
6ca0: 65 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50 72 6f  e calling OP_Pro
6cb0: 67 72 61 6d 2e 20 20 2a 2f 0a 20 20 20 20 20 20  gram.  */.      
6cc0: 70 63 20 3d 20 70 2d 3e 61 4f 70 5b 70 63 5d 2e  pc = p->aOp[pc].
6cd0: 70 32 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p2-1;.    }.    
6ce0: 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20  aOp = p->aOp;.  
6cf0: 20 20 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d    aMem = p->aMem
6d00: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
6d10: 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 70 4f 70 2d  ..  p->rc = pOp-
6d20: 3e 70 31 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  >p1;.  p->errorA
6d30: 63 74 69 6f 6e 20 3d 20 28 75 38 29 70 4f 70 2d  ction = (u8)pOp-
6d40: 3e 70 32 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 70  >p2;.  p->pc = p
6d50: 63 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34  c;.  if( pOp->p4
6d60: 2e 7a 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  .z ){.    assert
6d70: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
6d80: 4f 4b 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  OK );.    sqlite
6d90: 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
6da0: 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22  ErrMsg, db, "%s"
6db0: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
6dc0: 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
6dd0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
6de0: 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 20 20 73  xLog!=0 );.    s
6df0: 71 6c 69 74 65 33 5f 6c 6f 67 28 70 4f 70 2d 3e  qlite3_log(pOp->
6e00: 70 31 2c 20 22 61 62 6f 72 74 20 61 74 20 25 64  p1, "abort at %d
6e10: 20 69 6e 20 5b 25 73 5d 3a 20 25 73 22 2c 20 70   in [%s]: %s", p
6e20: 63 2c 20 70 2d 3e 7a 53 71 6c 2c 20 70 4f 70 2d  c, p->zSql, pOp-
6e30: 3e 70 34 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65 20  >p4.z);.  }else 
6e40: 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20  if( p->rc ){.   
6e50: 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
6e60: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
6e70: 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 20 20 73 71  Log!=0 );.    sq
6e80: 6c 69 74 65 33 5f 6c 6f 67 28 70 4f 70 2d 3e 70  lite3_log(pOp->p
6e90: 31 2c 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66  1, "constraint f
6ea0: 61 69 6c 65 64 20 61 74 20 25 64 20 69 6e 20 5b  ailed at %d in [
6eb0: 25 73 5d 22 2c 20 70 63 2c 20 70 2d 3e 7a 53 71  %s]", pc, p->zSq
6ec0: 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  l);.  }.  rc = s
6ed0: 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
6ee0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
6ef0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
6f00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
6f10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f   rc==SQLITE_ERRO
6f20: 52 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  R );.  if( rc==S
6f30: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
6f40: 20 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53    p->rc = rc = S
6f50: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
6f60: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
6f70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
6f80: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
6f90: 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20  CONSTRAINT );.  
6fa0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
6fb0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 64 62 2d 3e 6e  LITE_OK || db->n
6fc0: 44 65 66 65 72 72 65 64 43 6f 6e 73 3e 30 20 29  DeferredCons>0 )
6fd0: 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63  ;.    rc = p->rc
6fe0: 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   ? SQLITE_ERROR 
6ff0: 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  : SQLITE_DONE;. 
7000: 20 7d 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 72   }.  goto vdbe_r
7010: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  eturn;.}../* Opc
7020: 6f 64 65 3a 20 49 6e 74 65 67 65 72 20 50 31 20  ode: Integer P1 
7030: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  P2 * * *.**.** T
7040: 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  he 32-bit intege
7050: 72 20 76 61 6c 75 65 20 50 31 20 69 73 20 77 72  r value P1 is wr
7060: 69 74 74 65 6e 20 69 6e 74 6f 20 72 65 67 69 73  itten into regis
7070: 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20  ter P2..*/.case 
7080: 4f 50 5f 49 6e 74 65 67 65 72 3a 20 7b 20 20 20  OP_Integer: {   
7090: 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72        /* out2-pr
70a0: 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 70 4f  erelease */.  pO
70b0: 75 74 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  ut->u.i = pOp->p
70c0: 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  1;.  break;.}../
70d0: 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 36 34 20  * Opcode: Int64 
70e0: 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  * P2 * P4 *.**.*
70f0: 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65  * P4 is a pointe
7100: 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20 69 6e  r to a 64-bit in
7110: 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2a 20  teger value..** 
7120: 57 72 69 74 65 20 74 68 61 74 20 76 61 6c 75 65  Write that value
7130: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
7140: 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  2..*/.case OP_In
7150: 74 36 34 3a 20 7b 20 20 20 20 20 20 20 20 20 20  t64: {          
7160: 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65   /* out2-prerele
7170: 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ase */.  assert(
7180: 20 70 4f 70 2d 3e 70 34 2e 70 49 36 34 21 3d 30   pOp->p4.pI64!=0
7190: 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20   );.  pOut->u.i 
71a0: 3d 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 3b  = *pOp->p4.pI64;
71b0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66  .  break;.}..#if
71c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
71d0: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
71e0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 61 6c 20  /* Opcode: Real 
71f0: 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  * P2 * P4 *.**.*
7200: 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65  * P4 is a pointe
7210: 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20 66 6c  r to a 64-bit fl
7220: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
7230: 75 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 61  ue..** Write tha
7240: 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67  t value into reg
7250: 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73  ister P2..*/.cas
7260: 65 20 4f 50 5f 52 65 61 6c 3a 20 7b 20 20 20 20  e OP_Real: {    
7270: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
7280: 61 73 20 54 4b 5f 46 4c 4f 41 54 2c 20 6f 75 74  as TK_FLOAT, out
7290: 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a  2-prerelease */.
72a0: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
72b0: 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 61 73 73 65  MEM_Real;.  asse
72c0: 72 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61  rt( !sqlite3IsNa
72d0: 4e 28 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c  N(*pOp->p4.pReal
72e0: 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 72 20 3d  ) );.  pOut->r =
72f0: 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 3b   *pOp->p4.pReal;
7300: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
7310: 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  if../* Opcode: S
7320: 74 72 69 6e 67 38 20 2a 20 50 32 20 2a 20 50 34  tring8 * P2 * P4
7330: 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e   *.**.** P4 poin
7340: 74 73 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  ts to a nul term
7350: 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73 74 72  inated UTF-8 str
7360: 69 6e 67 2e 20 54 68 69 73 20 6f 70 63 6f 64 65  ing. This opcode
7370: 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   is transformed 
7380: 0a 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 53  .** into an OP_S
7390: 74 72 69 6e 67 20 62 65 66 6f 72 65 20 69 74 20  tring before it 
73a0: 69 73 20 65 78 65 63 75 74 65 64 20 66 6f 72 20  is executed for 
73b0: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 2e 0a  the first time..
73c0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 74 72 69 6e  */.case OP_Strin
73d0: 67 38 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a  g8: {         /*
73e0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 54 52 49   same as TK_STRI
73f0: 4e 47 2c 20 6f 75 74 32 2d 70 72 65 72 65 6c 65  NG, out2-prerele
7400: 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ase */.  assert(
7410: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b   pOp->p4.z!=0 );
7420: 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
7430: 20 4f 50 5f 53 74 72 69 6e 67 3b 0a 20 20 70 4f   OP_String;.  pO
7440: 70 2d 3e 70 31 20 3d 20 73 71 6c 69 74 65 33 53  p->p1 = sqlite3S
7450: 74 72 6c 65 6e 33 30 28 70 4f 70 2d 3e 70 34 2e  trlen30(pOp->p4.
7460: 7a 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  z);..#ifndef SQL
7470: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
7480: 20 69 66 28 20 65 6e 63 6f 64 69 6e 67 21 3d 53   if( encoding!=S
7490: 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20  QLITE_UTF8 ){.  
74a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
74b0: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4f 75 74  beMemSetStr(pOut
74c0: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 2d 31 2c  , pOp->p4.z, -1,
74d0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
74e0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
74f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7500: 5f 54 4f 4f 42 49 47 20 29 20 67 6f 74 6f 20 74  _TOOBIG ) goto t
7510: 6f 6f 5f 62 69 67 3b 0a 20 20 20 20 69 66 28 20  oo_big;.    if( 
7520: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
7530: 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f  e3VdbeChangeEnco
7540: 64 69 6e 67 28 70 4f 75 74 2c 20 65 6e 63 6f 64  ding(pOut, encod
7550: 69 6e 67 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  ing) ) goto no_m
7560: 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  em;.    assert( 
7570: 70 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 70  pOut->zMalloc==p
7580: 4f 75 74 2d 3e 7a 20 29 3b 0a 20 20 20 20 61 73  Out->z );.    as
7590: 73 65 72 74 28 20 70 4f 75 74 2d 3e 66 6c 61 67  sert( pOut->flag
75a0: 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20  s & MEM_Dyn );. 
75b0: 20 20 20 70 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63     pOut->zMalloc
75c0: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e   = 0;.    pOut->
75d0: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 53 74 61  flags |= MEM_Sta
75e0: 74 69 63 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66  tic;.    pOut->f
75f0: 6c 61 67 73 20 26 3d 20 7e 4d 45 4d 5f 44 79 6e  lags &= ~MEM_Dyn
7600: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  ;.    if( pOp->p
7610: 34 74 79 70 65 3d 3d 50 34 5f 44 59 4e 41 4d 49  4type==P4_DYNAMI
7620: 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  C ){.      sqlit
7630: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70  e3DbFree(db, pOp
7640: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20  ->p4.z);.    }. 
7650: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
7660: 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 20   P4_DYNAMIC;.   
7670: 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 70 4f 75   pOp->p4.z = pOu
7680: 74 2d 3e 7a 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  t->z;.    pOp->p
7690: 31 20 3d 20 70 4f 75 74 2d 3e 6e 3b 0a 20 20 7d  1 = pOut->n;.  }
76a0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4f  .#endif.  if( pO
76b0: 70 2d 3e 70 31 3e 64 62 2d 3e 61 4c 69 6d 69 74  p->p1>db->aLimit
76c0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
76d0: 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74  NGTH] ){.    got
76e0: 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20  o too_big;.  }. 
76f0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
7700: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73   to the next cas
7710: 65 2c 20 4f 50 5f 53 74 72 69 6e 67 20 2a 2f 0a  e, OP_String */.
7720: 7d 0a 20 20 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  }.  ./* Opcode: 
7730: 53 74 72 69 6e 67 20 50 31 20 50 32 20 2a 20 50  String P1 P2 * P
7740: 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74  4 *.**.** The st
7750: 72 69 6e 67 20 76 61 6c 75 65 20 50 34 20 6f 66  ring value P4 of
7760: 20 6c 65 6e 67 74 68 20 50 31 20 28 62 79 74 65   length P1 (byte
7770: 73 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  s) is stored in 
7780: 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a  register P2..*/.
7790: 63 61 73 65 20 4f 50 5f 53 74 72 69 6e 67 3a 20  case OP_String: 
77a0: 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75  {          /* ou
77b0: 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f  t2-prerelease */
77c0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
77d0: 70 34 2e 7a 21 3d 30 20 29 3b 0a 20 20 70 4f 75  p4.z!=0 );.  pOu
77e0: 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  t->flags = MEM_S
77f0: 74 72 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45  tr|MEM_Static|ME
7800: 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e  M_Term;.  pOut->
7810: 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  z = pOp->p4.z;. 
7820: 20 70 4f 75 74 2d 3e 6e 20 3d 20 70 4f 70 2d 3e   pOut->n = pOp->
7830: 70 31 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20  p1;.  pOut->enc 
7840: 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50  = encoding;.  UP
7850: 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
7860: 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b  E(pOut);.  break
7870: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
7880: 4e 75 6c 6c 20 2a 20 50 32 20 50 33 20 2a 20 2a  Null * P2 P3 * *
7890: 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 4e  .**.** Write a N
78a0: 55 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73 74 65  ULL into registe
78b0: 72 73 20 50 32 2e 20 20 49 66 20 50 33 20 67 72  rs P2.  If P3 gr
78c0: 65 61 74 65 72 20 74 68 61 6e 20 50 32 2c 20 74  eater than P2, t
78d0: 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a  hen also write.*
78e0: 2a 20 4e 55 4c 4c 20 69 6e 74 6f 20 72 65 67 69  * NULL into regi
78f0: 73 74 65 72 20 50 33 20 61 6e 64 20 65 76 65 72  ster P3 and ever
7900: 20 72 65 67 69 73 74 65 72 20 69 6e 20 62 65 74   register in bet
7910: 77 65 65 6e 20 50 32 20 61 6e 64 20 50 33 2e 20  ween P2 and P3. 
7920: 20 49 66 20 50 33 0a 2a 2a 20 69 73 20 6c 65 73   If P3.** is les
7930: 73 20 74 68 61 6e 20 50 32 20 28 74 79 70 69 63  s than P2 (typic
7940: 61 6c 6c 79 20 50 33 20 69 73 20 7a 65 72 6f 29  ally P3 is zero)
7950: 20 74 68 65 6e 20 6f 6e 6c 79 20 72 65 67 69 73   then only regis
7960: 74 65 72 20 50 32 20 69 73 0a 2a 2a 20 73 65 74  ter P2 is.** set
7970: 20 74 6f 20 4e 55 4c 4c 0a 2a 2f 0a 63 61 73 65   to NULL.*/.case
7980: 20 4f 50 5f 4e 75 6c 6c 3a 20 7b 20 20 20 20 20   OP_Null: {     
7990: 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72        /* out2-pr
79a0: 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e  erelease */.  in
79b0: 74 20 63 6e 74 3b 0a 20 20 63 6e 74 20 3d 20 70  t cnt;.  cnt = p
79c0: 4f 70 2d 3e 70 33 2d 70 4f 70 2d 3e 70 32 3b 0a  Op->p3-pOp->p2;.
79d0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
79e0: 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  3<=p->nMem );.  
79f0: 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
7a00: 4d 5f 4e 75 6c 6c 3b 0a 20 20 77 68 69 6c 65 28  M_Null;.  while(
7a10: 20 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 70 4f   cnt>0 ){.    pO
7a20: 75 74 2b 2b 3b 0a 20 20 20 20 6d 65 6d 41 62 6f  ut++;.    memAbo
7a30: 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f  utToChange(p, pO
7a40: 75 74 29 3b 0a 20 20 20 20 56 64 62 65 4d 65 6d  ut);.    VdbeMem
7a50: 52 65 6c 65 61 73 65 28 70 4f 75 74 29 3b 0a 20  Release(pOut);. 
7a60: 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d     pOut->flags =
7a70: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 63   MEM_Null;.    c
7a80: 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20 62 72 65 61  nt--;.  }.  brea
7a90: 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65  k;.}.../* Opcode
7aa0: 3a 20 42 6c 6f 62 20 50 31 20 50 32 20 2a 20 50  : Blob P1 P2 * P
7ab0: 34 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74  4.**.** P4 point
7ac0: 73 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 64  s to a blob of d
7ad0: 61 74 61 20 50 31 20 62 79 74 65 73 20 6c 6f 6e  ata P1 bytes lon
7ae0: 67 2e 20 20 53 74 6f 72 65 20 74 68 69 73 0a 2a  g.  Store this.*
7af0: 2a 20 62 6c 6f 62 20 69 6e 20 72 65 67 69 73 74  * blob in regist
7b00: 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f  er P2..*/.case O
7b10: 50 5f 42 6c 6f 62 3a 20 7b 20 20 20 20 20 20 20  P_Blob: {       
7b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
7b30: 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20  -prerelease */. 
7b40: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
7b50: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c   <= SQLITE_MAX_L
7b60: 45 4e 47 54 48 20 29 3b 0a 20 20 73 71 6c 69 74  ENGTH );.  sqlit
7b70: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
7b80: 70 4f 75 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c  pOut, pOp->p4.z,
7b90: 20 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 30 29 3b   pOp->p1, 0, 0);
7ba0: 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 65  .  pOut->enc = e
7bb0: 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41 54  ncoding;.  UPDAT
7bc0: 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70  E_MAX_BLOBSIZE(p
7bd0: 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  Out);.  break;.}
7be0: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 61 72  ../* Opcode: Var
7bf0: 69 61 62 6c 65 20 50 31 20 50 32 20 2a 20 50 34  iable P1 P2 * P4
7c00: 20 2a 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65   *.**.** Transfe
7c10: 72 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  r the values of 
7c20: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20  bound parameter 
7c30: 50 31 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  P1 into register
7c40: 20 50 32 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65   P2.**.** If the
7c50: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 61   parameter is na
7c60: 6d 65 64 2c 20 74 68 65 6e 20 69 74 73 20 6e 61  med, then its na
7c70: 6d 65 20 61 70 70 65 61 72 73 20 69 6e 20 50 34  me appears in P4
7c80: 20 61 6e 64 20 50 33 3d 3d 31 2e 0a 2a 2a 20 54   and P3==1..** T
7c90: 68 65 20 50 34 20 76 61 6c 75 65 20 69 73 20 75  he P4 value is u
7ca0: 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 62  sed by sqlite3_b
7cb0: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
7cc0: 6d 65 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  me()..*/.case OP
7cd0: 5f 56 61 72 69 61 62 6c 65 3a 20 7b 20 20 20 20  _Variable: {    
7ce0: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
7cf0: 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
7d00: 4d 65 6d 20 2a 70 56 61 72 3b 20 20 20 20 20 20  Mem *pVar;      
7d10: 20 2f 2a 20 56 61 6c 75 65 20 62 65 69 6e 67 20   /* Value being 
7d20: 74 72 61 6e 73 66 65 72 72 65 64 20 2a 2f 0a 0a  transferred */..
7d30: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
7d40: 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d  1>0 && pOp->p1<=
7d50: 70 2d 3e 6e 56 61 72 20 29 3b 0a 20 20 61 73 73  p->nVar );.  ass
7d60: 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d  ert( pOp->p4.z==
7d70: 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d  0 || pOp->p4.z==
7d80: 70 2d 3e 61 7a 56 61 72 5b 70 4f 70 2d 3e 70 31  p->azVar[pOp->p1
7d90: 2d 31 5d 20 29 3b 0a 20 20 70 56 61 72 20 3d 20  -1] );.  pVar = 
7da0: 26 70 2d 3e 61 56 61 72 5b 70 4f 70 2d 3e 70 31  &p->aVar[pOp->p1
7db0: 20 2d 20 31 5d 3b 0a 20 20 69 66 28 20 73 71 6c   - 1];.  if( sql
7dc0: 69 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69  ite3VdbeMemTooBi
7dd0: 67 28 70 56 61 72 29 20 29 7b 0a 20 20 20 20 67  g(pVar) ){.    g
7de0: 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
7df0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
7e00: 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75  mShallowCopy(pOu
7e10: 74 2c 20 70 56 61 72 2c 20 4d 45 4d 5f 53 74 61  t, pVar, MEM_Sta
7e20: 74 69 63 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d  tic);.  UPDATE_M
7e30: 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74  AX_BLOBSIZE(pOut
7e40: 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
7e50: 2a 20 4f 70 63 6f 64 65 3a 20 4d 6f 76 65 20 50  * Opcode: Move P
7e60: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
7e70: 2a 20 4d 6f 76 65 20 74 68 65 20 76 61 6c 75 65  * Move the value
7e80: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  s in register P1
7e90: 2e 2e 50 31 2b 50 33 2d 31 20 6f 76 65 72 20 69  ..P1+P3-1 over i
7ea0: 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 73  nto.** registers
7eb0: 20 50 32 2e 2e 50 32 2b 50 33 2d 31 2e 20 20 52   P2..P2+P3-1.  R
7ec0: 65 67 69 73 74 65 72 73 20 50 31 2e 2e 50 31 2b  egisters P1..P1+
7ed0: 50 31 2d 31 20 61 72 65 0a 2a 2a 20 6c 65 66 74  P1-1 are.** left
7ee0: 20 68 6f 6c 64 69 6e 67 20 61 20 4e 55 4c 4c 2e   holding a NULL.
7ef0: 20 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72    It is an error
7f00: 20 66 6f 72 20 72 65 67 69 73 74 65 72 20 72 61   for register ra
7f10: 6e 67 65 73 0a 2a 2a 20 50 31 2e 2e 50 31 2b 50  nges.** P1..P1+P
7f20: 33 2d 31 20 61 6e 64 20 50 32 2e 2e 50 32 2b 50  3-1 and P2..P2+P
7f30: 33 2d 31 20 74 6f 20 6f 76 65 72 6c 61 70 2e 0a  3-1 to overlap..
7f40: 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 6f 76 65 3a  */.case OP_Move:
7f50: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 6c 6c   {.  char *zMall
7f60: 6f 63 3b 20 20 20 2f 2a 20 48 6f 6c 64 69 6e 67  oc;   /* Holding
7f70: 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 61 6c   variable for al
7f80: 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a  located memory *
7f90: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
7fa0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7fb0: 66 20 72 65 67 69 73 74 65 72 73 20 6c 65 66 74  f registers left
7fc0: 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e   to copy */.  in
7fd0: 74 20 70 31 3b 20 20 20 20 20 20 20 20 20 20 2f  t p1;          /
7fe0: 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20 63 6f  * Register to co
7ff0: 70 79 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  py from */.  int
8000: 20 70 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   p2;          /*
8010: 20 52 65 67 69 73 74 65 72 20 74 6f 20 63 6f 70   Register to cop
8020: 79 20 74 6f 20 2a 2f 0a 0a 20 20 6e 20 3d 20 70  y to */..  n = p
8030: 4f 70 2d 3e 70 33 3b 0a 20 20 70 31 20 3d 20 70  Op->p3;.  p1 = p
8040: 4f 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70  Op->p1;.  p2 = p
8050: 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74  Op->p2;.  assert
8060: 28 20 6e 3e 30 20 26 26 20 70 31 3e 30 20 26 26  ( n>0 && p1>0 &&
8070: 20 70 32 3e 30 20 29 3b 0a 20 20 61 73 73 65 72   p2>0 );.  asser
8080: 74 28 20 70 31 2b 6e 3c 3d 70 32 20 7c 7c 20 70  t( p1+n<=p2 || p
8090: 32 2b 6e 3c 3d 70 31 20 29 3b 0a 0a 20 20 70 49  2+n<=p1 );..  pI
80a0: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 31 5d 3b 0a  n1 = &aMem[p1];.
80b0: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
80c0: 32 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d  2];.  while( n--
80d0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
80e0: 70 4f 75 74 3c 3d 26 61 4d 65 6d 5b 70 2d 3e 6e  pOut<=&aMem[p->n
80f0: 4d 65 6d 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  Mem] );.    asse
8100: 72 74 28 20 70 49 6e 31 3c 3d 26 61 4d 65 6d 5b  rt( pIn1<=&aMem[
8110: 70 2d 3e 6e 4d 65 6d 5d 20 29 3b 0a 20 20 20 20  p->nMem] );.    
8120: 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
8130: 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 20 20  id(pIn1) );.    
8140: 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
8150: 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 7a  (p, pOut);.    z
8160: 4d 61 6c 6c 6f 63 20 3d 20 70 4f 75 74 2d 3e 7a  Malloc = pOut->z
8170: 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 70 4f 75 74  Malloc;.    pOut
8180: 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  ->zMalloc = 0;. 
8190: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
81a0: 6d 4d 6f 76 65 28 70 4f 75 74 2c 20 70 49 6e 31  mMove(pOut, pIn1
81b0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
81c0: 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70  _DEBUG.    if( p
81d0: 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3e  Out->pScopyFrom>
81e0: 3d 26 61 4d 65 6d 5b 70 31 5d 20 26 26 20 70 4f  =&aMem[p1] && pO
81f0: 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3c 26  ut->pScopyFrom<&
8200: 61 4d 65 6d 5b 70 31 2b 70 4f 70 2d 3e 70 33 5d  aMem[p1+pOp->p3]
8210: 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e   ){.      pOut->
8220: 70 53 63 6f 70 79 46 72 6f 6d 20 2b 3d 20 70 31  pScopyFrom += p1
8230: 20 2d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   - pOp->p2;.    
8240: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 49 6e  }.#endif.    pIn
8250: 31 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 7a 4d 61  1->zMalloc = zMa
8260: 6c 6c 6f 63 3b 0a 20 20 20 20 52 45 47 49 53 54  lloc;.    REGIST
8270: 45 52 5f 54 52 41 43 45 28 70 32 2b 2b 2c 20 70  ER_TRACE(p2++, p
8280: 4f 75 74 29 3b 0a 20 20 20 20 70 49 6e 31 2b 2b  Out);.    pIn1++
8290: 3b 0a 20 20 20 20 70 4f 75 74 2b 2b 3b 0a 20 20  ;.    pOut++;.  
82a0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
82b0: 20 4f 70 63 6f 64 65 3a 20 43 6f 70 79 20 50 31   Opcode: Copy P1
82c0: 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
82d0: 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 72  Make a copy of r
82e0: 65 67 69 73 74 65 72 20 50 31 20 69 6e 74 6f 20  egister P1 into 
82f0: 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a  register P2..**.
8300: 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  ** This instruct
8310: 69 6f 6e 20 6d 61 6b 65 73 20 61 20 64 65 65 70  ion makes a deep
8320: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 76 61 6c   copy of the val
8330: 75 65 2e 20 20 41 20 64 75 70 6c 69 63 61 74 65  ue.  A duplicate
8340: 0a 2a 2a 20 69 73 20 6d 61 64 65 20 6f 66 20 61  .** is made of a
8350: 6e 79 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f  ny string or blo
8360: 62 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65  b constant.  See
8370: 20 61 6c 73 6f 20 4f 50 5f 53 43 6f 70 79 2e 0a   also OP_SCopy..
8380: 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 70 79 3a  */.case OP_Copy:
8390: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   {             /
83a0: 2a 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20  * in1, out2 */. 
83b0: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
83c0: 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d  p->p1];.  pOut =
83d0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
83e0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 75 74 21  .  assert( pOut!
83f0: 3d 70 49 6e 31 20 29 3b 0a 20 20 73 71 6c 69 74  =pIn1 );.  sqlit
8400: 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
8410: 43 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 31 2c  Copy(pOut, pIn1,
8420: 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 44   MEM_Ephem);.  D
8430: 65 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 70 4f  eephemeralize(pO
8440: 75 74 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f  ut);.  REGISTER_
8450: 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70  TRACE(pOp->p2, p
8460: 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  Out);.  break;.}
8470: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 43 6f  ../* Opcode: SCo
8480: 70 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  py P1 P2 * * *.*
8490: 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 73 68 61 6c  *.** Make a shal
84a0: 6c 6f 77 20 63 6f 70 79 20 6f 66 20 72 65 67 69  low copy of regi
84b0: 73 74 65 72 20 50 31 20 69 6e 74 6f 20 72 65 67  ster P1 into reg
84c0: 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  ister P2..**.** 
84d0: 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  This instruction
84e0: 20 6d 61 6b 65 73 20 61 20 73 68 61 6c 6c 6f 77   makes a shallow
84f0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 76 61 6c   copy of the val
8500: 75 65 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75  ue.  If the valu
8510: 65 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67  e.** is a string
8520: 20 6f 72 20 62 6c 6f 62 2c 20 74 68 65 6e 20 74   or blob, then t
8530: 68 65 20 63 6f 70 79 20 69 73 20 6f 6e 6c 79 20  he copy is only 
8540: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
8550: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 61 6e 64  .** original and
8560: 20 68 65 6e 63 65 20 69 66 20 74 68 65 20 6f 72   hence if the or
8570: 69 67 69 6e 61 6c 20 63 68 61 6e 67 65 73 20 73  iginal changes s
8580: 6f 20 77 69 6c 6c 20 74 68 65 20 63 6f 70 79 2e  o will the copy.
8590: 0a 2a 2a 20 57 6f 72 73 65 2c 20 69 66 20 74 68  .** Worse, if th
85a0: 65 20 6f 72 69 67 69 6e 61 6c 20 69 73 20 64 65  e original is de
85b0: 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 20 63  allocated, the c
85c0: 6f 70 79 20 62 65 63 6f 6d 65 73 20 69 6e 76 61  opy becomes inva
85d0: 6c 69 64 2e 0a 2a 2a 20 54 68 75 73 20 74 68 65  lid..** Thus the
85e0: 20 70 72 6f 67 72 61 6d 20 6d 75 73 74 20 67 75   program must gu
85f0: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
8600: 20 6f 72 69 67 69 6e 61 6c 20 77 69 6c 6c 20 6e   original will n
8610: 6f 74 20 63 68 61 6e 67 65 0a 2a 2a 20 64 75 72  ot change.** dur
8620: 69 6e 67 20 74 68 65 20 6c 69 66 65 74 69 6d 65  ing the lifetime
8630: 20 6f 66 20 74 68 65 20 63 6f 70 79 2e 20 20 55   of the copy.  U
8640: 73 65 20 4f 50 5f 43 6f 70 79 20 74 6f 20 6d 61  se OP_Copy to ma
8650: 6b 65 20 61 20 63 6f 6d 70 6c 65 74 65 0a 2a 2a  ke a complete.**
8660: 20 63 6f 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f   copy..*/.case O
8670: 50 5f 53 43 6f 70 79 3a 20 7b 20 20 20 20 20 20  P_SCopy: {      
8680: 20 20 20 20 20 20 2f 2a 20 69 6e 31 2c 20 6f 75        /* in1, ou
8690: 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  t2 */.  pIn1 = &
86a0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
86b0: 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
86c0: 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74  p->p2];.  assert
86d0: 28 20 70 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a  ( pOut!=pIn1 );.
86e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
86f0: 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74  ShallowCopy(pOut
8700: 2c 20 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65  , pIn1, MEM_Ephe
8710: 6d 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m);.#ifdef SQLIT
8720: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 4f  E_DEBUG.  if( pO
8730: 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3d 3d  ut->pScopyFrom==
8740: 30 20 29 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79  0 ) pOut->pScopy
8750: 46 72 6f 6d 20 3d 20 70 49 6e 31 3b 0a 23 65 6e  From = pIn1;.#en
8760: 64 69 66 0a 20 20 52 45 47 49 53 54 45 52 5f 54  dif.  REGISTER_T
8770: 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f  RACE(pOp->p2, pO
8780: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
8790: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 75  ./* Opcode: Resu
87a0: 6c 74 52 6f 77 20 50 31 20 50 32 20 2a 20 2a 20  ltRow P1 P2 * * 
87b0: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69  *.**.** The regi
87c0: 73 74 65 72 73 20 50 31 20 74 68 72 6f 75 67 68  sters P1 through
87d0: 20 50 31 2b 50 32 2d 31 20 63 6f 6e 74 61 69 6e   P1+P2-1 contain
87e0: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
87f0: 0a 2a 2a 20 72 65 73 75 6c 74 73 2e 20 54 68 69  .** results. Thi
8800: 73 20 6f 70 63 6f 64 65 20 63 61 75 73 65 73 20  s opcode causes 
8810: 74 68 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  the sqlite3_step
8820: 28 29 20 63 61 6c 6c 20 74 6f 20 74 65 72 6d 69  () call to termi
8830: 6e 61 74 65 0a 2a 2a 20 77 69 74 68 20 61 6e 20  nate.** with an 
8840: 53 51 4c 49 54 45 5f 52 4f 57 20 72 65 74 75 72  SQLITE_ROW retur
8850: 6e 20 63 6f 64 65 20 61 6e 64 20 69 74 20 73 65  n code and it se
8860: 74 73 20 75 70 20 74 68 65 20 73 71 6c 69 74 65  ts up the sqlite
8870: 33 5f 73 74 6d 74 0a 2a 2a 20 73 74 72 75 63 74  3_stmt.** struct
8880: 75 72 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61  ure to provide a
8890: 63 63 65 73 73 20 74 6f 20 74 68 65 20 74 6f 70  ccess to the top
88a0: 20 50 31 20 76 61 6c 75 65 73 20 61 73 20 74 68   P1 values as th
88b0: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 6f 77 2e  e result.** row.
88c0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 75  .*/.case OP_Resu
88d0: 6c 74 52 6f 77 3a 20 7b 0a 20 20 4d 65 6d 20 2a  ltRow: {.  Mem *
88e0: 70 4d 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pMem;.  int i;. 
88f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 73   assert( p->nRes
8900: 43 6f 6c 75 6d 6e 3d 3d 70 4f 70 2d 3e 70 32 20  Column==pOp->p2 
8910: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
8920: 2d 3e 70 31 3e 30 20 29 3b 0a 20 20 61 73 73 65  ->p1>0 );.  asse
8930: 72 74 28 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d  rt( pOp->p1+pOp-
8940: 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29  >p2<=p->nMem+1 )
8950: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
8960: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 76 69  statement has vi
8970: 6f 6c 61 74 65 64 20 69 6d 6d 65 64 69 61 74 65  olated immediate
8980: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
8990: 73 74 72 61 69 6e 74 73 2c 20 64 6f 0a 20 20 2a  straints, do.  *
89a0: 2a 20 6e 6f 74 20 72 65 74 75 72 6e 20 74 68 65  * not return the
89b0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
89c0: 6d 6f 64 69 66 69 65 64 2e 20 41 6e 64 20 64 6f  modified. And do
89d0: 20 6e 6f 74 20 52 45 4c 45 41 53 45 20 74 68 65   not RELEASE the
89e0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
89f0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20  transaction. It 
8a00: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
8a10: 65 64 20 62 61 63 6b 2e 20 20 2a 2f 0a 20 20 69  ed back.  */.  i
8a20: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
8a30: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
8a40: 68 65 63 6b 46 6b 28 70 2c 20 30 29 29 20 29 7b  heckFk(p, 0)) ){
8a50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
8a60: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6f  >flags&SQLITE_Co
8a70: 75 6e 74 52 6f 77 73 20 29 3b 0a 20 20 20 20 61  untRows );.    a
8a80: 73 73 65 72 74 28 20 70 2d 3e 75 73 65 73 53 74  ssert( p->usesSt
8a90: 6d 74 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  mtJournal );.   
8aa0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
8ab0: 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
8ac0: 43 6f 75 6e 74 52 6f 77 73 20 66 6c 61 67 20 69  CountRows flag i
8ad0: 73 20 73 65 74 20 69 6e 20 73 71 6c 69 74 65 33  s set in sqlite3
8ae0: 2e 66 6c 61 67 73 20 6d 61 73 6b 2c 20 74 68 65  .flags mask, the
8af0: 6e 20 0a 20 20 2a 2a 20 44 4d 4c 20 73 74 61 74  n .  ** DML stat
8b00: 65 6d 65 6e 74 73 20 69 6e 76 6f 6b 65 20 74 68  ements invoke th
8b10: 69 73 20 6f 70 63 6f 64 65 20 74 6f 20 72 65 74  is opcode to ret
8b20: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
8b30: 66 20 72 6f 77 73 20 0a 20 20 2a 2a 20 6d 6f 64  f rows .  ** mod
8b40: 69 66 69 65 64 20 74 6f 20 74 68 65 20 75 73 65  ified to the use
8b50: 72 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 6f  r. This is the o
8b60: 6e 6c 79 20 77 61 79 20 74 68 61 74 20 61 20 56  nly way that a V
8b70: 4d 20 74 68 61 74 0a 20 20 2a 2a 20 6f 70 65 6e  M that.  ** open
8b80: 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  s a statement tr
8b90: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 69 6e  ansaction may in
8ba0: 76 6f 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65  voke this opcode
8bb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63  ..  **.  ** In c
8bc0: 61 73 65 20 74 68 69 73 20 69 73 20 73 75 63 68  ase this is such
8bd0: 20 61 20 73 74 61 74 65 6d 65 6e 74 2c 20 63 6c   a statement, cl
8be0: 6f 73 65 20 61 6e 79 20 73 74 61 74 65 6d 65 6e  ose any statemen
8bf0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  t transaction.  
8c00: 2a 2a 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69  ** opened by thi
8c10: 73 20 56 4d 20 62 65 66 6f 72 65 20 72 65 74 75  s VM before retu
8c20: 72 6e 69 6e 67 20 63 6f 6e 74 72 6f 6c 20 74 6f  rning control to
8c30: 20 74 68 65 20 75 73 65 72 2e 20 54 68 69 73 20   the user. This 
8c40: 69 73 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72  is to.  ** ensur
8c50: 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
8c60: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  -transactions ar
8c70: 65 20 61 6c 77 61 79 73 20 6e 65 73 74 65 64 2c  e always nested,
8c80: 20 6e 6f 74 20 6f 76 65 72 6c 61 70 70 69 6e 67   not overlapping
8c90: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70  ..  ** If the op
8ca0: 65 6e 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  en statement-tra
8cb0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20  nsaction is not 
8cc0: 63 6c 6f 73 65 64 20 68 65 72 65 2c 20 74 68 65  closed here, the
8cd0: 6e 20 74 68 65 20 75 73 65 72 0a 20 20 2a 2a 20  n the user.  ** 
8ce0: 6d 61 79 20 73 74 65 70 20 61 6e 6f 74 68 65 72  may step another
8cf0: 20 56 4d 20 74 68 61 74 20 6f 70 65 6e 73 20 69   VM that opens i
8d00: 74 73 20 6f 77 6e 20 73 74 61 74 65 6d 65 6e 74  ts own statement
8d10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
8d20: 69 73 0a 20 20 2a 2a 20 6d 61 79 20 6c 65 61 64  is.  ** may lead
8d30: 20 74 6f 20 6f 76 65 72 6c 61 70 70 69 6e 67 20   to overlapping 
8d40: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
8d50: 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ctions..  **.  *
8d60: 2a 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * The statement 
8d70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
8d80: 65 76 65 72 20 61 20 74 6f 70 2d 6c 65 76 65 6c  ever a top-level
8d90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 48   transaction.  H
8da0: 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 52 45  ence.  ** the RE
8db0: 4c 45 41 53 45 20 63 61 6c 6c 20 62 65 6c 6f 77  LEASE call below
8dc0: 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e   can never fail.
8dd0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
8de0: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30  p->iStatement==0
8df0: 20 7c 7c 20 64 62 2d 3e 66 6c 61 67 73 26 53 51   || db->flags&SQ
8e00: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29  LITE_CountRows )
8e10: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8e20: 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
8e30: 6e 74 28 70 2c 20 53 41 56 45 50 4f 49 4e 54 5f  nt(p, SAVEPOINT_
8e40: 52 45 4c 45 41 53 45 29 3b 0a 20 20 69 66 28 20  RELEASE);.  if( 
8e50: 4e 45 56 45 52 28 72 63 21 3d 53 51 4c 49 54 45  NEVER(rc!=SQLITE
8e60: 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 62 72 65 61  _OK) ){.    brea
8e70: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 76  k;.  }..  /* Inv
8e80: 61 6c 69 64 61 74 65 20 61 6c 6c 20 65 70 68 65  alidate all ephe
8e90: 6d 65 72 61 6c 20 63 75 72 73 6f 72 20 72 6f 77  meral cursor row
8ea0: 20 63 61 63 68 65 73 20 2a 2f 0a 20 20 70 2d 3e   caches */.  p->
8eb0: 63 61 63 68 65 43 74 72 20 3d 20 28 70 2d 3e 63  cacheCtr = (p->c
8ec0: 61 63 68 65 43 74 72 20 2b 20 32 29 7c 31 3b 0a  acheCtr + 2)|1;.
8ed0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
8ee0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
8ef0: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 61  he current row a
8f00: 72 65 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  re \000 terminat
8f10: 65 64 0a 20 20 2a 2a 20 61 6e 64 20 68 61 76 65  ed.  ** and have
8f20: 20 61 6e 20 61 73 73 69 67 6e 65 64 20 74 79 70   an assigned typ
8f30: 65 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  e.  The results 
8f40: 61 72 65 20 64 65 2d 65 70 68 65 6d 65 72 61 6c  are de-ephemeral
8f50: 69 7a 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 73  ized as.  ** a s
8f60: 69 64 65 20 65 66 66 65 63 74 2e 0a 20 20 2a 2f  ide effect..  */
8f70: 0a 20 20 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65  .  pMem = p->pRe
8f80: 73 75 6c 74 53 65 74 20 3d 20 26 61 4d 65 6d 5b  sultSet = &aMem[
8f90: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 66 6f 72 28  pOp->p1];.  for(
8fa0: 69 3d 30 3b 20 69 3c 70 4f 70 2d 3e 70 32 3b 20  i=0; i<pOp->p2; 
8fb0: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
8fc0: 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 70 4d  ( memIsValid(&pM
8fd0: 65 6d 5b 69 5d 29 20 29 3b 0a 20 20 20 20 44 65  em[i]) );.    De
8fe0: 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 26 70 4d  ephemeralize(&pM
8ff0: 65 6d 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65  em[i]);.    asse
9000: 72 74 28 20 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61  rt( (pMem[i].fla
9010: 67 73 20 26 20 4d 45 4d 5f 45 70 68 65 6d 29 3d  gs & MEM_Ephem)=
9020: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =0.            |
9030: 7c 20 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73  | (pMem[i].flags
9040: 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f   & (MEM_Str|MEM_
9050: 42 6c 6f 62 29 29 3d 3d 30 20 29 3b 0a 20 20 20  Blob))==0 );.   
9060: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e   sqlite3VdbeMemN
9070: 75 6c 54 65 72 6d 69 6e 61 74 65 28 26 70 4d 65  ulTerminate(&pMe
9080: 6d 5b 69 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74  m[i]);.    sqlit
9090: 65 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79  e3VdbeMemStoreTy
90a0: 70 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20  pe(&pMem[i]);.  
90b0: 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
90c0: 28 70 4f 70 2d 3e 70 31 2b 69 2c 20 26 70 4d 65  (pOp->p1+i, &pMe
90d0: 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  m[i]);.  }.  if(
90e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
90f0: 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  d ) goto no_mem;
9100: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 53 51  ..  /* Return SQ
9110: 4c 49 54 45 5f 52 4f 57 0a 20 20 2a 2f 0a 20 20  LITE_ROW.  */.  
9120: 70 2d 3e 70 63 20 3d 20 70 63 20 2b 20 31 3b 0a  p->pc = pc + 1;.
9130: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
9140: 57 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 72  W;.  goto vdbe_r
9150: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  eturn;.}../* Opc
9160: 6f 64 65 3a 20 43 6f 6e 63 61 74 20 50 31 20 50  ode: Concat P1 P
9170: 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41  2 P3 * *.**.** A
9180: 64 64 20 74 68 65 20 74 65 78 74 20 69 6e 20 72  dd the text in r
9190: 65 67 69 73 74 65 72 20 50 31 20 6f 6e 74 6f 20  egister P1 onto 
91a0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74  the end of the t
91b0: 65 78 74 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74  ext in.** regist
91c0: 65 72 20 50 32 20 61 6e 64 20 73 74 6f 72 65 20  er P2 and store 
91d0: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65  the result in re
91e0: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66  gister P3..** If
91f0: 20 65 69 74 68 65 72 20 74 68 65 20 50 31 20 6f   either the P1 o
9200: 72 20 50 32 20 74 65 78 74 20 61 72 65 20 4e 55  r P2 text are NU
9210: 4c 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 4e 55  LL then store NU
9220: 4c 4c 20 69 6e 20 50 33 2e 0a 2a 2a 0a 2a 2a 20  LL in P3..**.** 
9230: 20 20 50 33 20 3d 20 50 32 20 7c 7c 20 50 31 0a    P3 = P2 || P1.
9240: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  **.** It is ille
9250: 67 61 6c 20 66 6f 72 20 50 31 20 61 6e 64 20 50  gal for P1 and P
9260: 33 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  3 to be the same
9270: 20 72 65 67 69 73 74 65 72 2e 20 53 6f 6d 65 74   register. Somet
9280: 69 6d 65 73 2c 0a 2a 2a 20 69 66 20 50 33 20 69  imes,.** if P3 i
9290: 73 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73  s the same regis
92a0: 74 65 72 20 61 73 20 50 32 2c 20 74 68 65 20 69  ter as P2, the i
92b0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
92c0: 20 61 62 6c 65 0a 2a 2a 20 74 6f 20 61 76 6f 69   able.** to avoi
92d0: 64 20 61 20 6d 65 6d 63 70 79 28 29 2e 0a 2a 2f  d a memcpy()..*/
92e0: 0a 63 61 73 65 20 4f 50 5f 43 6f 6e 63 61 74 3a  .case OP_Concat:
92f0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {           /* 
9300: 73 61 6d 65 20 61 73 20 54 4b 5f 43 4f 4e 43 41  same as TK_CONCA
9310: 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  T, in1, in2, out
9320: 33 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74 65  3 */.  i64 nByte
9330: 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  ;..  pIn1 = &aMe
9340: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49  m[pOp->p1];.  pI
9350: 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n2 = &aMem[pOp->
9360: 70 32 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61  p2];.  pOut = &a
9370: 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
9380: 61 73 73 65 72 74 28 20 70 49 6e 31 21 3d 70 4f  assert( pIn1!=pO
9390: 75 74 20 29 3b 0a 20 20 69 66 28 20 28 70 49 6e  ut );.  if( (pIn
93a0: 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d  1->flags | pIn2-
93b0: 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 4e 75  >flags) & MEM_Nu
93c0: 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ll ){.    sqlite
93d0: 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
93e0: 70 4f 75 74 29 3b 0a 20 20 20 20 62 72 65 61 6b  pOut);.    break
93f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 61  ;.  }.  if( Expa
9400: 6e 64 42 6c 6f 62 28 70 49 6e 31 29 20 7c 7c 20  ndBlob(pIn1) || 
9410: 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29  ExpandBlob(pIn2)
9420: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
9430: 20 20 53 74 72 69 6e 67 69 66 79 28 70 49 6e 31    Stringify(pIn1
9440: 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 53  , encoding);.  S
9450: 74 72 69 6e 67 69 66 79 28 70 49 6e 32 2c 20 65  tringify(pIn2, e
9460: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 6e 42 79 74  ncoding);.  nByt
9470: 65 20 3d 20 70 49 6e 31 2d 3e 6e 20 2b 20 70 49  e = pIn1->n + pI
9480: 6e 32 2d 3e 6e 3b 0a 20 20 69 66 28 20 6e 42 79  n2->n;.  if( nBy
9490: 74 65 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  te>db->aLimit[SQ
94a0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
94b0: 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  H] ){.    goto t
94c0: 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 4d 65  oo_big;.  }.  Me
94d0: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
94e0: 74 2c 20 4d 45 4d 5f 53 74 72 29 3b 0a 20 20 69  t, MEM_Str);.  i
94f0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
9500: 6d 47 72 6f 77 28 70 4f 75 74 2c 20 28 69 6e 74  mGrow(pOut, (int
9510: 29 6e 42 79 74 65 2b 32 2c 20 70 4f 75 74 3d 3d  )nByte+2, pOut==
9520: 70 49 6e 32 29 20 29 7b 0a 20 20 20 20 67 6f 74  pIn2) ){.    got
9530: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20  o no_mem;.  }.  
9540: 69 66 28 20 70 4f 75 74 21 3d 70 49 6e 32 20 29  if( pOut!=pIn2 )
9550: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75  {.    memcpy(pOu
9560: 74 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 7a 2c 20 70  t->z, pIn2->z, p
9570: 49 6e 32 2d 3e 6e 29 3b 0a 20 20 7d 0a 20 20 6d  In2->n);.  }.  m
9580: 65 6d 63 70 79 28 26 70 4f 75 74 2d 3e 7a 5b 70  emcpy(&pOut->z[p
9590: 49 6e 32 2d 3e 6e 5d 2c 20 70 49 6e 31 2d 3e 7a  In2->n], pIn1->z
95a0: 2c 20 70 49 6e 31 2d 3e 6e 29 3b 0a 20 20 70 4f  , pIn1->n);.  pO
95b0: 75 74 2d 3e 7a 5b 6e 42 79 74 65 5d 20 3d 20 30  ut->z[nByte] = 0
95c0: 3b 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74  ;.  pOut->z[nByt
95d0: 65 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 4f 75 74  e+1] = 0;.  pOut
95e0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54  ->flags |= MEM_T
95f0: 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d  erm;.  pOut->n =
9600: 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a 20 20 70   (int)nByte;.  p
9610: 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64  Out->enc = encod
9620: 69 6e 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  ing;.  UPDATE_MA
9630: 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29  X_BLOBSIZE(pOut)
9640: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
9650: 20 4f 70 63 6f 64 65 3a 20 41 64 64 20 50 31 20   Opcode: Add P1 
9660: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
9670: 41 64 64 20 74 68 65 20 76 61 6c 75 65 20 69 6e  Add the value in
9680: 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20   register P1 to 
9690: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
96a0: 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20  ister P2.** and 
96b0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
96c0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
96d0: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e  .** If either in
96e0: 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  put is NULL, the
96f0: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
9700: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d  .*/./* Opcode: M
9710: 75 6c 74 69 70 6c 79 20 50 31 20 50 32 20 50 33  ultiply P1 P2 P3
9720: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4d 75   * *.**.**.** Mu
9730: 6c 74 69 70 6c 79 20 74 68 65 20 76 61 6c 75 65  ltiply the value
9740: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
9750: 62 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  by the value in 
9760: 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61  register P2.** a
9770: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
9780: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ult in register 
9790: 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  P3..** If either
97a0: 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20   input is NULL, 
97b0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
97c0: 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  LL..*/./* Opcode
97d0: 3a 20 53 75 62 74 72 61 63 74 20 50 31 20 50 32  : Subtract P1 P2
97e0: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 75   P3 * *.**.** Su
97f0: 62 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  btract the value
9800: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
9810: 66 72 6f 6d 20 74 68 65 20 76 61 6c 75 65 20 69  from the value i
9820: 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a  n register P2.**
9830: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
9840: 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65  esult in registe
9850: 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68  r P3..** If eith
9860: 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c  er input is NULL
9870: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
9880: 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  NULL..*/./* Opco
9890: 64 65 3a 20 44 69 76 69 64 65 20 50 31 20 50 32  de: Divide P1 P2
98a0: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 69   P3 * *.**.** Di
98b0: 76 69 64 65 20 74 68 65 20 76 61 6c 75 65 20 69  vide the value i
98c0: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 62 79  n register P1 by
98d0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
98e0: 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64  gister P2.** and
98f0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
9900: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  t in register P3
9910: 20 28 50 33 3d 50 32 2f 50 31 29 2e 20 49 66 20   (P3=P2/P1). If 
9920: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 0a 2a 2a  the value in .**
9930: 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20   register P1 is 
9940: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 72  zero, then the r
9950: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 49  esult is NULL. I
9960: 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69  f either input i
9970: 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20  s .** NULL, the 
9980: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
9990: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  */./* Opcode: Re
99a0: 6d 61 69 6e 64 65 72 20 50 31 20 50 32 20 50 33  mainder P1 P2 P3
99b0: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75   * *.**.** Compu
99c0: 74 65 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  te the remainder
99d0: 20 61 66 74 65 72 20 69 6e 74 65 67 65 72 20 64   after integer d
99e0: 69 76 69 73 69 6f 6e 20 6f 66 20 74 68 65 20 76  ivision of the v
99f0: 61 6c 75 65 20 69 6e 0a 2a 2a 20 72 65 67 69 73  alue in.** regis
9a00: 74 65 72 20 50 31 20 62 79 20 74 68 65 20 76 61  ter P1 by the va
9a10: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
9a20: 50 32 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  P2 and store the
9a30: 20 72 65 73 75 6c 74 20 69 6e 20 50 33 2e 20 0a   result in P3. .
9a40: 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  ** If the value 
9a50: 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 20 69  in register P2 i
9a60: 73 20 7a 65 72 6f 20 74 68 65 20 72 65 73 75 6c  s zero the resul
9a70: 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 66  t is NULL..** If
9a80: 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
9a90: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
9aa0: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
9ab0: 63 61 73 65 20 4f 50 5f 41 64 64 3a 20 20 20 20  case OP_Add:    
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9ad0: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 50 4c 55  * same as TK_PLU
9ae0: 53 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  S, in1, in2, out
9af0: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 75 62  3 */.case OP_Sub
9b00: 74 72 61 63 74 3a 20 20 20 20 20 20 20 20 20 20  tract:          
9b10: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
9b20: 4b 5f 4d 49 4e 55 53 2c 20 69 6e 31 2c 20 69 6e  K_MINUS, in1, in
9b30: 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
9b40: 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20  OP_Multiply:    
9b50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
9b60: 65 20 61 73 20 54 4b 5f 53 54 41 52 2c 20 69 6e  e as TK_STAR, in
9b70: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
9b80: 63 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20  case OP_Divide: 
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9ba0: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 4c 41  * same as TK_SLA
9bb0: 53 48 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  SH, in1, in2, ou
9bc0: 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65  t3 */.case OP_Re
9bd0: 6d 61 69 6e 64 65 72 3a 20 7b 20 20 20 20 20 20  mainder: {      
9be0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
9bf0: 54 4b 5f 52 45 4d 2c 20 69 6e 31 2c 20 69 6e 32  TK_REM, in1, in2
9c00: 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 6e 74 20  , out3 */.  int 
9c10: 66 6c 61 67 73 3b 20 20 20 20 20 20 2f 2a 20 43  flags;      /* C
9c20: 6f 6d 62 69 6e 65 64 20 4d 45 4d 5f 2a 20 66 6c  ombined MEM_* fl
9c30: 61 67 73 20 66 72 6f 6d 20 62 6f 74 68 20 69 6e  ags from both in
9c40: 70 75 74 73 20 2a 2f 0a 20 20 69 36 34 20 69 41  puts */.  i64 iA
9c50: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74  ;         /* Int
9c60: 65 67 65 72 20 76 61 6c 75 65 20 6f 66 20 6c 65  eger value of le
9c70: 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ft operand */.  
9c80: 69 36 34 20 69 42 3b 20 20 20 20 20 20 20 20 20  i64 iB;         
9c90: 2f 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65  /* Integer value
9ca0: 20 6f 66 20 72 69 67 68 74 20 6f 70 65 72 61 6e   of right operan
9cb0: 64 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 41  d */.  double rA
9cc0: 3b 20 20 20 20 20 20 2f 2a 20 52 65 61 6c 20 76  ;      /* Real v
9cd0: 61 6c 75 65 20 6f 66 20 6c 65 66 74 20 6f 70 65  alue of left ope
9ce0: 72 61 6e 64 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  rand */.  double
9cf0: 20 72 42 3b 20 20 20 20 20 20 2f 2a 20 52 65 61   rB;      /* Rea
9d00: 6c 20 76 61 6c 75 65 20 6f 66 20 72 69 67 68 74  l value of right
9d10: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 0a 20 20 70   operand */..  p
9d20: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
9d30: 3e 70 31 5d 3b 0a 20 20 61 70 70 6c 79 4e 75 6d  >p1];.  applyNum
9d40: 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 49 6e  ericAffinity(pIn
9d50: 31 29 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d  1);.  pIn2 = &aM
9d60: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61  em[pOp->p2];.  a
9d70: 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e  pplyNumericAffin
9d80: 69 74 79 28 70 49 6e 32 29 3b 0a 20 20 70 4f 75  ity(pIn2);.  pOu
9d90: 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
9da0: 33 5d 3b 0a 20 20 66 6c 61 67 73 20 3d 20 70 49  3];.  flags = pI
9db0: 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32  n1->flags | pIn2
9dc0: 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 28  ->flags;.  if( (
9dd0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
9de0: 29 21 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74  )!=0 ) goto arit
9df0: 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73  hmetic_result_is
9e00: 5f 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 28 70 49  _null;.  if( (pI
9e10: 6e 31 2d 3e 66 6c 61 67 73 20 26 20 70 49 6e 32  n1->flags & pIn2
9e20: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
9e30: 74 29 3d 3d 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  t)==MEM_Int ){. 
9e40: 20 20 20 69 41 20 3d 20 70 49 6e 31 2d 3e 75 2e     iA = pIn1->u.
9e50: 69 3b 0a 20 20 20 20 69 42 20 3d 20 70 49 6e 32  i;.    iB = pIn2
9e60: 2d 3e 75 2e 69 3b 0a 20 20 20 20 73 77 69 74 63  ->u.i;.    switc
9e70: 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29  h( pOp->opcode )
9e80: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  {.      case OP_
9e90: 41 64 64 3a 20 20 20 20 20 20 20 69 66 28 20 73  Add:       if( s
9ea0: 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28 26  qlite3AddInt64(&
9eb0: 69 42 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 70  iB,iA) ) goto fp
9ec0: 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20  _math;  break;. 
9ed0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 75 62       case OP_Sub
9ee0: 74 72 61 63 74 3a 20 20 69 66 28 20 73 71 6c 69  tract:  if( sqli
9ef0: 74 65 33 53 75 62 49 6e 74 36 34 28 26 69 42 2c  te3SubInt64(&iB,
9f00: 69 41 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61  iA) ) goto fp_ma
9f10: 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  th;  break;.    
9f20: 20 20 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70    case OP_Multip
9f30: 6c 79 3a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ly:  if( sqlite3
9f40: 4d 75 6c 49 6e 74 36 34 28 26 69 42 2c 69 41 29  MulInt64(&iB,iA)
9f50: 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b   ) goto fp_math;
9f60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9f70: 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 7b  ase OP_Divide: {
9f80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d  .        if( iA=
9f90: 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d  =0 ) goto arithm
9fa0: 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e  etic_result_is_n
9fb0: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ull;.        if(
9fc0: 20 69 41 3d 3d 2d 31 20 26 26 20 69 42 3d 3d 53   iA==-1 && iB==S
9fd0: 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29 20  MALLEST_INT64 ) 
9fe0: 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 0a 20 20  goto fp_math;.  
9ff0: 20 20 20 20 20 20 69 42 20 2f 3d 20 69 41 3b 0a        iB /= iA;.
a000: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a010: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
a020: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
a030: 69 66 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f  if( iA==0 ) goto
a040: 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75   arithmetic_resu
a050: 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20  lt_is_null;.    
a060: 20 20 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 29      if( iA==-1 )
a070: 20 69 41 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   iA = 1;.       
a080: 20 69 42 20 25 3d 20 69 41 3b 0a 20 20 20 20 20   iB %= iA;.     
a090: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a0a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74  }.    }.    pOut
a0b0: 2d 3e 75 2e 69 20 3d 20 69 42 3b 0a 20 20 20 20  ->u.i = iB;.    
a0c0: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
a0d0: 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20  Out, MEM_Int);. 
a0e0: 20 7d 65 6c 73 65 7b 0a 66 70 5f 6d 61 74 68 3a   }else{.fp_math:
a0f0: 0a 20 20 20 20 72 41 20 3d 20 73 71 6c 69 74 65  .    rA = sqlite
a100: 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28 70  3VdbeRealValue(p
a110: 49 6e 31 29 3b 0a 20 20 20 20 72 42 20 3d 20 73  In1);.    rB = s
a120: 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56 61  qlite3VdbeRealVa
a130: 6c 75 65 28 70 49 6e 32 29 3b 0a 20 20 20 20 73  lue(pIn2);.    s
a140: 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f  witch( pOp->opco
a150: 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  de ){.      case
a160: 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20 20   OP_Add:        
a170: 20 72 42 20 2b 3d 20 72 41 3b 20 20 20 20 20 20   rB += rA;      
a180: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a190: 73 65 20 4f 50 5f 53 75 62 74 72 61 63 74 3a 20  se OP_Subtract: 
a1a0: 20 20 20 72 42 20 2d 3d 20 72 41 3b 20 20 20 20     rB -= rA;    
a1b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a1c0: 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79  case OP_Multiply
a1d0: 3a 20 20 20 20 72 42 20 2a 3d 20 72 41 3b 20 20  :    rB *= rA;  
a1e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a1f0: 20 20 63 61 73 65 20 4f 50 5f 44 69 76 69 64 65    case OP_Divide
a200: 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 28  : {.        /* (
a210: 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65  double)0 In case
a220: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   of SQLITE_OMIT_
a230: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e  FLOATING_POINT..
a240: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
a250: 20 72 41 3d 3d 28 64 6f 75 62 6c 65 29 30 20 29   rA==(double)0 )
a260: 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63   goto arithmetic
a270: 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b  _result_is_null;
a280: 0a 20 20 20 20 20 20 20 20 72 42 20 2f 3d 20 72  .        rB /= r
a290: 41 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  A;.        break
a2a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a2b0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
a2c0: 20 20 20 69 41 20 3d 20 28 69 36 34 29 72 41 3b     iA = (i64)rA;
a2d0: 0a 20 20 20 20 20 20 20 20 69 42 20 3d 20 28 69  .        iB = (i
a2e0: 36 34 29 72 42 3b 0a 20 20 20 20 20 20 20 20 69  64)rB;.        i
a2f0: 66 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20  f( iA==0 ) goto 
a300: 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c  arithmetic_resul
a310: 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20  t_is_null;.     
a320: 20 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 29 20     if( iA==-1 ) 
a330: 69 41 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  iA = 1;.        
a340: 72 42 20 3d 20 28 64 6f 75 62 6c 65 29 28 69 42  rB = (double)(iB
a350: 20 25 20 69 41 29 3b 0a 20 20 20 20 20 20 20 20   % iA);.        
a360: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
a370: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
a380: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
a390: 5f 50 4f 49 4e 54 0a 20 20 20 20 70 4f 75 74 2d  _POINT.    pOut-
a3a0: 3e 75 2e 69 20 3d 20 72 42 3b 0a 20 20 20 20 4d  >u.i = rB;.    M
a3b0: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
a3c0: 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 23 65  ut, MEM_Int);.#e
a3d0: 6c 73 65 0a 20 20 20 20 69 66 28 20 73 71 6c 69  lse.    if( sqli
a3e0: 74 65 33 49 73 4e 61 4e 28 72 42 29 20 29 7b 0a  te3IsNaN(rB) ){.
a3f0: 20 20 20 20 20 20 67 6f 74 6f 20 61 72 69 74 68        goto arith
a400: 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f  metic_result_is_
a410: 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  null;.    }.    
a420: 70 4f 75 74 2d 3e 72 20 3d 20 72 42 3b 0a 20 20  pOut->r = rB;.  
a430: 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
a440: 28 70 4f 75 74 2c 20 4d 45 4d 5f 52 65 61 6c 29  (pOut, MEM_Real)
a450: 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
a460: 20 26 20 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20   & MEM_Real)==0 
a470: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a480: 56 64 62 65 49 6e 74 65 67 65 72 41 66 66 69 6e  VdbeIntegerAffin
a490: 69 74 79 28 70 4f 75 74 29 3b 0a 20 20 20 20 7d  ity(pOut);.    }
a4a0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 62 72  .#endif.  }.  br
a4b0: 65 61 6b 3b 0a 0a 61 72 69 74 68 6d 65 74 69 63  eak;..arithmetic
a4c0: 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3a  _result_is_null:
a4d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
a4e0: 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a  mSetNull(pOut);.
a4f0: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
a500: 70 63 6f 64 65 3a 20 43 6f 6c 6c 53 65 71 20 50  pcode: CollSeq P
a510: 31 20 2a 20 2a 20 50 34 0a 2a 2a 0a 2a 2a 20 50  1 * * P4.**.** P
a520: 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
a530: 6f 20 61 20 43 6f 6c 6c 53 65 71 20 73 74 72 75  o a CollSeq stru
a540: 63 74 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20  ct. If the next 
a550: 63 61 6c 6c 20 74 6f 20 61 20 75 73 65 72 20 66  call to a user f
a560: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6f 72 20 61 67  unction.** or ag
a570: 67 72 65 67 61 74 65 20 63 61 6c 6c 73 20 73 71  gregate calls sq
a580: 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c  lite3GetFuncColl
a590: 53 65 71 28 29 2c 20 74 68 69 73 20 63 6f 6c 6c  Seq(), this coll
a5a0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
a5b0: 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72 6e  ill.** be return
a5c0: 65 64 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  ed. This is used
a5d0: 20 62 79 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   by the built-in
a5e0: 20 6d 69 6e 28 29 2c 20 6d 61 78 28 29 20 61 6e   min(), max() an
a5f0: 64 20 6e 75 6c 6c 69 66 28 29 0a 2a 2a 20 66 75  d nullif().** fu
a600: 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  nctions..**.** I
a610: 66 20 50 31 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f P1 is not zero
a620: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 72  , then it is a r
a630: 65 67 69 73 74 65 72 20 74 68 61 74 20 61 20 73  egister that a s
a640: 75 62 73 65 71 75 65 6e 74 20 6d 69 6e 28 29 20  ubsequent min() 
a650: 6f 72 0a 2a 2a 20 6d 61 78 28 29 20 61 67 67 72  or.** max() aggr
a660: 65 67 61 74 65 20 77 69 6c 6c 20 73 65 74 20 74  egate will set t
a670: 6f 20 31 20 69 66 20 74 68 65 20 63 75 72 72 65  o 1 if the curre
a680: 6e 74 20 72 6f 77 20 69 73 20 6e 6f 74 20 74 68  nt row is not th
a690: 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 0a 2a 2a 20  e minimum or.** 
a6a0: 6d 61 78 69 6d 75 6d 2e 20 20 54 68 65 20 50 31  maximum.  The P1
a6b0: 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69   register is ini
a6c0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 30 20 62 79  tialized to 0 by
a6d0: 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
a6e0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  n..**.** The int
a6f0: 65 72 66 61 63 65 20 75 73 65 64 20 62 79 20 74  erface used by t
a700: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
a710: 6e 20 6f 66 20 74 68 65 20 61 66 6f 72 65 6d 65  n of the aforeme
a720: 6e 74 69 6f 6e 65 64 20 66 75 6e 63 74 69 6f 6e  ntioned function
a730: 73 0a 2a 2a 20 74 6f 20 72 65 74 72 69 65 76 65  s.** to retrieve
a740: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
a750: 65 71 75 65 6e 63 65 20 73 65 74 20 62 79 20 74  equence set by t
a760: 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6e 6f  his opcode is no
a770: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 70  t available.** p
a780: 75 62 6c 69 63 6c 79 2c 20 6f 6e 6c 79 20 74 6f  ublicly, only to
a790: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 20   user functions 
a7a0: 64 65 66 69 6e 65 64 20 69 6e 20 66 75 6e 63 2e  defined in func.
a7b0: 63 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f  c..*/.case OP_Co
a7c0: 6c 6c 53 65 71 3a 20 7b 0a 20 20 61 73 73 65 72  llSeq: {.  asser
a7d0: 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
a7e0: 50 34 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20  P4_COLLSEQ );.  
a7f0: 69 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20  if( pOp->p1 ){. 
a800: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
a810: 6d 53 65 74 49 6e 74 36 34 28 26 61 4d 65 6d 5b  mSetInt64(&aMem[
a820: 70 4f 70 2d 3e 70 31 5d 2c 20 30 29 3b 0a 20 20  pOp->p1], 0);.  
a830: 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
a840: 20 4f 70 63 6f 64 65 3a 20 46 75 6e 63 74 69 6f   Opcode: Functio
a850: 6e 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  n P1 P2 P3 P4 P5
a860: 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 61 20  .**.** Invoke a 
a870: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 50  user function (P
a880: 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
a890: 6f 20 61 20 46 75 6e 63 74 69 6f 6e 20 73 74 72  o a Function str
a8a0: 75 63 74 75 72 65 20 74 68 61 74 0a 2a 2a 20 64  ucture that.** d
a8b0: 65 66 69 6e 65 73 20 74 68 65 20 66 75 6e 63 74  efines the funct
a8c0: 69 6f 6e 29 20 77 69 74 68 20 50 35 20 61 72 67  ion) with P5 arg
a8d0: 75 6d 65 6e 74 73 20 74 61 6b 65 6e 20 66 72 6f  uments taken fro
a8e0: 6d 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e  m register P2 an
a8f0: 64 0a 2a 2a 20 73 75 63 63 65 73 73 6f 72 73 2e  d.** successors.
a900: 20 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20    The result of 
a910: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
a920: 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
a930: 65 72 20 50 33 2e 0a 2a 2a 20 52 65 67 69 73 74  er P3..** Regist
a940: 65 72 20 50 33 20 6d 75 73 74 20 6e 6f 74 20 62  er P3 must not b
a950: 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 75 6e  e one of the fun
a960: 63 74 69 6f 6e 20 69 6e 70 75 74 73 2e 0a 2a 2a  ction inputs..**
a970: 0a 2a 2a 20 50 31 20 69 73 20 61 20 33 32 2d 62  .** P1 is a 32-b
a980: 69 74 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63  it bitmask indic
a990: 61 74 69 6e 67 20 77 68 65 74 68 65 72 20 6f 72  ating whether or
a9a0: 20 6e 6f 74 20 65 61 63 68 20 61 72 67 75 6d 65   not each argume
a9b0: 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66 75  nt to the .** fu
a9c0: 6e 63 74 69 6f 6e 20 77 61 73 20 64 65 74 65 72  nction was deter
a9d0: 6d 69 6e 65 64 20 74 6f 20 62 65 20 63 6f 6e 73  mined to be cons
a9e0: 74 61 6e 74 20 61 74 20 63 6f 6d 70 69 6c 65 20  tant at compile 
a9f0: 74 69 6d 65 2e 20 49 66 20 74 68 65 20 66 69 72  time. If the fir
aa00: 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 77  st.** argument w
aa10: 61 73 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e  as constant then
aa20: 20 62 69 74 20 30 20 6f 66 20 50 31 20 69 73 20   bit 0 of P1 is 
aa30: 73 65 74 2e 20 54 68 69 73 20 69 73 20 75 73 65  set. This is use
aa40: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a  d to determine.*
aa50: 2a 20 77 68 65 74 68 65 72 20 6d 65 74 61 20 64  * whether meta d
aa60: 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
aa70: 69 74 68 20 61 20 75 73 65 72 20 66 75 6e 63 74  ith a user funct
aa80: 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 75 73 69  ion argument usi
aa90: 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  ng the.** sqlite
aaa0: 33 5f 73 65 74 5f 61 75 78 64 61 74 61 28 29 20  3_set_auxdata() 
aab0: 41 50 49 20 6d 61 79 20 62 65 20 73 61 66 65 6c  API may be safel
aac0: 79 20 72 65 74 61 69 6e 65 64 20 75 6e 74 69 6c  y retained until
aad0: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 76   the next.** inv
aae0: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ocation of this 
aaf0: 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 65  opcode..**.** Se
ab00: 65 20 61 6c 73 6f 3a 20 41 67 67 53 74 65 70 20  e also: AggStep 
ab10: 61 6e 64 20 41 67 67 46 69 6e 61 6c 0a 2a 2f 0a  and AggFinal.*/.
ab20: 63 61 73 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  case OP_Function
ab30: 3a 20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  : {.  int i;.  M
ab40: 65 6d 20 2a 70 41 72 67 3b 0a 20 20 73 71 6c 69  em *pArg;.  sqli
ab50: 74 65 33 5f 63 6f 6e 74 65 78 74 20 63 74 78 3b  te3_context ctx;
ab60: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
ab70: 20 2a 2a 61 70 56 61 6c 3b 0a 20 20 69 6e 74 20   **apVal;.  int 
ab80: 6e 3b 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70  n;..  n = pOp->p
ab90: 35 3b 0a 20 20 61 70 56 61 6c 20 3d 20 70 2d 3e  5;.  apVal = p->
aba0: 61 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28  apArg;.  assert(
abb0: 20 61 70 56 61 6c 20 7c 7c 20 6e 3d 3d 30 20 29   apVal || n==0 )
abc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
abd0: 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33  >p3>0 && pOp->p3
abe0: 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70  <=p->nMem );.  p
abf0: 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
ac00: 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74  >p3];.  memAbout
ac10: 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74  ToChange(p, pOut
ac20: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 3d  );..  assert( n=
ac30: 3d 30 20 7c 7c 20 28 70 4f 70 2d 3e 70 32 3e 30  =0 || (pOp->p2>0
ac40: 20 26 26 20 70 4f 70 2d 3e 70 32 2b 6e 3c 3d 70   && pOp->p2+n<=p
ac50: 2d 3e 6e 4d 65 6d 2b 31 29 20 29 3b 0a 20 20 61  ->nMem+1) );.  a
ac60: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70  ssert( pOp->p3<p
ac70: 4f 70 2d 3e 70 32 20 7c 7c 20 70 4f 70 2d 3e 70  Op->p2 || pOp->p
ac80: 33 3e 3d 70 4f 70 2d 3e 70 32 2b 6e 20 29 3b 0a  3>=pOp->p2+n );.
ac90: 20 20 70 41 72 67 20 3d 20 26 61 4d 65 6d 5b 70    pArg = &aMem[p
aca0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 66 6f 72 28 69  Op->p2];.  for(i
acb0: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 41  =0; i<n; i++, pA
acc0: 72 67 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72  rg++){.    asser
acd0: 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 41  t( memIsValid(pA
ace0: 72 67 29 20 29 3b 0a 20 20 20 20 61 70 56 61 6c  rg) );.    apVal
acf0: 5b 69 5d 20 3d 20 70 41 72 67 3b 0a 20 20 20 20  [i] = pArg;.    
ad00: 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 70  Deephemeralize(p
ad10: 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
ad20: 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70  3VdbeMemStoreTyp
ad30: 65 28 70 41 72 67 29 3b 0a 20 20 20 20 52 45 47  e(pArg);.    REG
ad40: 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
ad50: 3e 70 32 2b 69 2c 20 70 41 72 67 29 3b 0a 20 20  >p2+i, pArg);.  
ad60: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  }..  assert( pOp
ad70: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e  ->p4type==P4_FUN
ad80: 43 44 45 46 20 7c 7c 20 70 4f 70 2d 3e 70 34 74  CDEF || pOp->p4t
ad90: 79 70 65 3d 3d 50 34 5f 56 44 42 45 46 55 4e 43  ype==P4_VDBEFUNC
ada0: 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   );.  if( pOp->p
adb0: 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43 44 45  4type==P4_FUNCDE
adc0: 46 20 29 7b 0a 20 20 20 20 63 74 78 2e 70 46 75  F ){.    ctx.pFu
add0: 6e 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75  nc = pOp->p4.pFu
ade0: 6e 63 3b 0a 20 20 20 20 63 74 78 2e 70 56 64 62  nc;.    ctx.pVdb
adf0: 65 46 75 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  eFunc = 0;.  }el
ae00: 73 65 7b 0a 20 20 20 20 63 74 78 2e 70 56 64 62  se{.    ctx.pVdb
ae10: 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e  eFunc = (VdbeFun
ae20: 63 2a 29 70 4f 70 2d 3e 70 34 2e 70 56 64 62 65  c*)pOp->p4.pVdbe
ae30: 46 75 6e 63 3b 0a 20 20 20 20 63 74 78 2e 70 46  Func;.    ctx.pF
ae40: 75 6e 63 20 3d 20 63 74 78 2e 70 56 64 62 65 46  unc = ctx.pVdbeF
ae50: 75 6e 63 2d 3e 70 46 75 6e 63 3b 0a 20 20 7d 0a  unc->pFunc;.  }.
ae60: 0a 20 20 63 74 78 2e 73 2e 66 6c 61 67 73 20 3d  .  ctx.s.flags =
ae70: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 63 74 78   MEM_Null;.  ctx
ae80: 2e 73 2e 64 62 20 3d 20 64 62 3b 0a 20 20 63 74  .s.db = db;.  ct
ae90: 78 2e 73 2e 78 44 65 6c 20 3d 20 30 3b 0a 20 20  x.s.xDel = 0;.  
aea0: 63 74 78 2e 73 2e 7a 4d 61 6c 6c 6f 63 20 3d 20  ctx.s.zMalloc = 
aeb0: 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6f 75 74  0;..  /* The out
aec0: 70 75 74 20 63 65 6c 6c 20 6d 61 79 20 61 6c 72  put cell may alr
aed0: 65 61 64 79 20 68 61 76 65 20 61 20 62 75 66 66  eady have a buff
aee0: 65 72 20 61 6c 6c 6f 63 61 74 65 64 2e 20 4d 6f  er allocated. Mo
aef0: 76 65 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  ve.  ** the poin
af00: 74 65 72 20 74 6f 20 63 74 78 2e 73 20 73 6f 20  ter to ctx.s so 
af10: 69 6e 20 63 61 73 65 20 74 68 65 20 75 73 65 72  in case the user
af20: 2d 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 75 73  -function can us
af30: 65 0a 20 20 2a 2a 20 74 68 65 20 61 6c 72 65 61  e.  ** the alrea
af40: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  dy allocated buf
af50: 66 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 61  fer instead of a
af60: 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
af70: 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  one..  */.  sqli
af80: 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 26  te3VdbeMemMove(&
af90: 63 74 78 2e 73 2c 20 70 4f 75 74 29 3b 0a 20 20  ctx.s, pOut);.  
afa0: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 26  MemSetTypeFlag(&
afb0: 63 74 78 2e 73 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  ctx.s, MEM_Null)
afc0: 3b 0a 0a 20 20 63 74 78 2e 69 73 45 72 72 6f 72  ;..  ctx.isError
afd0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 74 78 2e   = 0;.  if( ctx.
afe0: 70 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26 20 53  pFunc->flags & S
aff0: 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
b000: 4f 4c 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OLL ){.    asser
b010: 74 28 20 70 4f 70 3e 61 4f 70 20 29 3b 0a 20 20  t( pOp>aOp );.  
b020: 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31    assert( pOp[-1
b030: 5d 2e 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c  ].p4type==P4_COL
b040: 4c 53 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65  LSEQ );.    asse
b050: 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f  rt( pOp[-1].opco
b060: 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71 20 29  de==OP_CollSeq )
b070: 3b 0a 20 20 20 20 63 74 78 2e 70 43 6f 6c 6c 20  ;.    ctx.pColl 
b080: 3d 20 70 4f 70 5b 2d 31 5d 2e 70 34 2e 70 43 6f  = pOp[-1].p4.pCo
b090: 6c 6c 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c 61  ll;.  }.  db->la
b0a0: 73 74 52 6f 77 69 64 20 3d 20 6c 61 73 74 52 6f  stRowid = lastRo
b0b0: 77 69 64 3b 0a 20 20 28 2a 63 74 78 2e 70 46 75  wid;.  (*ctx.pFu
b0c0: 6e 63 2d 3e 78 46 75 6e 63 29 28 26 63 74 78 2c  nc->xFunc)(&ctx,
b0d0: 20 6e 2c 20 61 70 56 61 6c 29 3b 20 2f 2a 20 49   n, apVal); /* I
b0e0: 4d 50 3a 20 52 2d 32 34 35 30 35 2d 32 33 32 33  MP: R-24505-2323
b0f0: 30 20 2a 2f 0a 20 20 6c 61 73 74 52 6f 77 69 64  0 */.  lastRowid
b100: 20 3d 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64   = db->lastRowid
b110: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 61  ;..  /* If any a
b120: 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 66 75  uxiliary data fu
b130: 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65  nctions have bee
b140: 6e 20 63 61 6c 6c 65 64 20 62 79 20 74 68 69 73  n called by this
b150: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2c 0a   user function,.
b160: 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
b170: 20 63 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75   call the destru
b180: 63 74 6f 72 20 66 6f 72 20 61 6e 79 20 6e 6f 6e  ctor for any non
b190: 2d 73 74 61 74 69 63 20 76 61 6c 75 65 73 2e 0a  -static values..
b1a0: 20 20 2a 2f 0a 20 20 69 66 28 20 63 74 78 2e 70    */.  if( ctx.p
b1b0: 56 64 62 65 46 75 6e 63 20 29 7b 0a 20 20 20 20  VdbeFunc ){.    
b1c0: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
b1d0: 65 41 75 78 44 61 74 61 28 63 74 78 2e 70 56 64  eAuxData(ctx.pVd
b1e0: 62 65 46 75 6e 63 2c 20 70 4f 70 2d 3e 70 31 29  beFunc, pOp->p1)
b1f0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 56  ;.    pOp->p4.pV
b200: 64 62 65 46 75 6e 63 20 3d 20 63 74 78 2e 70 56  dbeFunc = ctx.pV
b210: 64 62 65 46 75 6e 63 3b 0a 20 20 20 20 70 4f 70  dbeFunc;.    pOp
b220: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56 44  ->p4type = P4_VD
b230: 42 45 46 55 4e 43 3b 0a 20 20 7d 0a 0a 20 20 69  BEFUNC;.  }..  i
b240: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
b250: 6c 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 45 76  led ){.    /* Ev
b260: 65 6e 20 74 68 6f 75 67 68 20 61 20 6d 61 6c 6c  en though a mall
b270: 6f 63 28 29 20 68 61 73 20 66 61 69 6c 65 64 2c  oc() has failed,
b280: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
b290: 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ion of the.    *
b2a0: 2a 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20  * user function 
b2b0: 6d 61 79 20 68 61 76 65 20 63 61 6c 6c 65 64 20  may have called 
b2c0: 61 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  an sqlite3_resul
b2d0: 74 5f 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  t_XXX() function
b2e0: 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 74 75 72  .    ** to retur
b2f0: 6e 20 61 20 76 61 6c 75 65 2e 20 54 68 65 20 66  n a value. The f
b300: 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 72 65  ollowing call re
b310: 6c 65 61 73 65 73 20 61 6e 79 20 72 65 73 6f 75  leases any resou
b320: 72 63 65 73 0a 20 20 20 20 2a 2a 20 61 73 73 6f  rces.    ** asso
b330: 63 69 61 74 65 64 20 77 69 74 68 20 73 75 63 68  ciated with such
b340: 20 61 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f   a value..    */
b350: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b360: 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 74 78 2e  MemRelease(&ctx.
b370: 73 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  s);.    goto no_
b380: 6d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  mem;.  }..  /* I
b390: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72  f the function r
b3a0: 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
b3b0: 2c 20 74 68 72 6f 77 20 61 6e 20 65 78 63 65 70  , throw an excep
b3c0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 63 74  tion */.  if( ct
b3d0: 78 2e 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20  x.isError ){.   
b3e0: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
b3f0: 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  g(&p->zErrMsg, d
b400: 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  b, "%s", sqlite3
b410: 5f 76 61 6c 75 65 5f 74 65 78 74 28 26 63 74 78  _value_text(&ctx
b420: 2e 73 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  .s));.    rc = c
b430: 74 78 2e 69 73 45 72 72 6f 72 3b 0a 20 20 7d 0a  tx.isError;.  }.
b440: 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72  .  /* Copy the r
b450: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e  esult of the fun
b460: 63 74 69 6f 6e 20 69 6e 74 6f 20 72 65 67 69 73  ction into regis
b470: 74 65 72 20 50 33 20 2a 2f 0a 20 20 73 71 6c 69  ter P3 */.  sqli
b480: 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
b490: 6f 64 69 6e 67 28 26 63 74 78 2e 73 2c 20 65 6e  oding(&ctx.s, en
b4a0: 63 6f 64 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74  coding);.  sqlit
b4b0: 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 70 4f  e3VdbeMemMove(pO
b4c0: 75 74 2c 20 26 63 74 78 2e 73 29 3b 0a 20 20 69  ut, &ctx.s);.  i
b4d0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
b4e0: 6d 54 6f 6f 42 69 67 28 70 4f 75 74 29 20 29 7b  mTooBig(pOut) ){
b4f0: 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69  .    goto too_bi
b500: 67 3b 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20  g;.  }..#if 0.  
b510: 2f 2a 20 54 68 65 20 61 70 70 2d 64 65 66 69 6e  /* The app-defin
b520: 65 64 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ed function has 
b530: 64 6f 6e 65 20 73 6f 6d 65 74 68 69 6e 67 20 74  done something t
b540: 68 61 74 20 61 73 20 63 61 75 73 65 64 20 74 68  hat as caused th
b550: 69 73 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  is.  ** statemen
b560: 74 20 74 6f 20 65 78 70 69 72 65 2e 20 20 28 50  t to expire.  (P
b570: 65 72 68 61 70 73 20 74 68 65 20 66 75 6e 63 74  erhaps the funct
b580: 69 6f 6e 20 63 61 6c 6c 65 64 20 73 71 6c 69 74  ion called sqlit
b590: 65 33 5f 65 78 65 63 28 29 0a 20 20 2a 2a 20 77  e3_exec().  ** w
b5a0: 69 74 68 20 61 20 43 52 45 41 54 45 20 54 41 42  ith a CREATE TAB
b5b0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 29 0a 20  LE statement.). 
b5c0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 65 78 70   */.  if( p->exp
b5d0: 69 72 65 64 20 29 20 72 63 20 3d 20 53 51 4c 49  ired ) rc = SQLI
b5e0: 54 45 5f 41 42 4f 52 54 3b 0a 23 65 6e 64 69 66  TE_ABORT;.#endif
b5f0: 0a 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41  ..  REGISTER_TRA
b600: 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4f 75 74  CE(pOp->p3, pOut
b610: 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  );.  UPDATE_MAX_
b620: 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a  BLOBSIZE(pOut);.
b630: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
b640: 70 63 6f 64 65 3a 20 42 69 74 41 6e 64 20 50 31  pcode: BitAnd P1
b650: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
b660: 20 54 61 6b 65 20 74 68 65 20 62 69 74 2d 77 69   Take the bit-wi
b670: 73 65 20 41 4e 44 20 6f 66 20 74 68 65 20 76 61  se AND of the va
b680: 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72  lues in register
b690: 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a   P1 and P2 and.*
b6a0: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
b6b0: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
b6c0: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
b6d0: 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74  input is NULL, t
b6e0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
b6f0: 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  L..*/./* Opcode:
b700: 20 42 69 74 4f 72 20 50 31 20 50 32 20 50 33 20   BitOr P1 P2 P3 
b710: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74  * *.**.** Take t
b720: 68 65 20 62 69 74 2d 77 69 73 65 20 4f 52 20 6f  he bit-wise OR o
b730: 66 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20  f the values in 
b740: 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64 20  register P1 and 
b750: 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20  P2 and.** store 
b760: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65  the result in re
b770: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66  gister P3..** If
b780: 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73   either input is
b790: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c   NULL, the resul
b7a0: 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a  t is NULL..*/./*
b7b0: 20 4f 70 63 6f 64 65 3a 20 53 68 69 66 74 4c 65   Opcode: ShiftLe
b7c0: 66 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  ft P1 P2 P3 * *.
b7d0: 2a 2a 0a 2a 2a 20 53 68 69 66 74 20 74 68 65 20  **.** Shift the 
b7e0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69 6e  integer value in
b7f0: 20 72 65 67 69 73 74 65 72 20 50 32 20 74 6f 20   register P2 to 
b800: 74 68 65 20 6c 65 66 74 20 62 79 20 74 68 65 0a  the left by the.
b810: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  ** number of bit
b820: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
b830: 68 65 20 69 6e 74 65 67 65 72 20 69 6e 20 72 65  he integer in re
b840: 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20 53 74  gister P1..** St
b850: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
b860: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
b870: 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75  * If either inpu
b880: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  t is NULL, the r
b890: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
b8a0: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68 69  /./* Opcode: Shi
b8b0: 66 74 52 69 67 68 74 20 50 31 20 50 32 20 50 33  ftRight P1 P2 P3
b8c0: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74   * *.**.** Shift
b8d0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
b8e0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
b8f0: 32 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 62  2 to the right b
b900: 79 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  y the.** number 
b910: 6f 66 20 62 69 74 73 20 73 70 65 63 69 66 69 65  of bits specifie
b920: 64 20 62 79 20 74 68 65 20 69 6e 74 65 67 65 72  d by the integer
b930: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
b940: 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65  .** Store the re
b950: 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72  sult in register
b960: 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65   P3..** If eithe
b970: 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c  r input is NULL,
b980: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
b990: 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ULL..*/.case OP_
b9a0: 42 69 74 41 6e 64 3a 20 20 20 20 20 20 20 20 20  BitAnd:         
b9b0: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
b9c0: 61 73 20 54 4b 5f 42 49 54 41 4e 44 2c 20 69 6e  as TK_BITAND, in
b9d0: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
b9e0: 63 61 73 65 20 4f 50 5f 42 69 74 4f 72 3a 20 20  case OP_BitOr:  
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 42 49  /* same as TK_BI
ba10: 54 4f 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  TOR, in1, in2, o
ba20: 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  ut3 */.case OP_S
ba30: 68 69 66 74 4c 65 66 74 3a 20 20 20 20 20 20 20  hiftLeft:       
ba40: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
ba50: 73 20 54 4b 5f 4c 53 48 49 46 54 2c 20 69 6e 31  s TK_LSHIFT, in1
ba60: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63  , in2, out3 */.c
ba70: 61 73 65 20 4f 50 5f 53 68 69 66 74 52 69 67 68  ase OP_ShiftRigh
ba80: 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f  t: {           /
ba90: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 52 53 48  * same as TK_RSH
baa0: 49 46 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  IFT, in1, in2, o
bab0: 75 74 33 20 2a 2f 0a 20 20 69 36 34 20 69 41 3b  ut3 */.  i64 iA;
bac0: 0a 20 20 75 36 34 20 75 41 3b 0a 20 20 69 36 34  .  u64 uA;.  i64
bad0: 20 69 42 3b 0a 20 20 75 38 20 6f 70 3b 0a 0a 20   iB;.  u8 op;.. 
bae0: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
baf0: 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d  p->p1];.  pIn2 =
bb00: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
bb10: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
bb20: 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20  pOp->p3];.  if( 
bb30: 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70  (pIn1->flags | p
bb40: 49 6e 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45  In2->flags) & ME
bb50: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73 71  M_Null ){.    sq
bb60: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
bb70: 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20 62  ull(pOut);.    b
bb80: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 41 20 3d  reak;.  }.  iA =
bb90: 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56   sqlite3VdbeIntV
bba0: 61 6c 75 65 28 70 49 6e 32 29 3b 0a 20 20 69 42  alue(pIn2);.  iB
bbb0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e   = sqlite3VdbeIn
bbc0: 74 56 61 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20  tValue(pIn1);.  
bbd0: 6f 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  op = pOp->opcode
bbe0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 42  ;.  if( op==OP_B
bbf0: 69 74 41 6e 64 20 29 7b 0a 20 20 20 20 69 41 20  itAnd ){.    iA 
bc00: 26 3d 20 69 42 3b 0a 20 20 7d 65 6c 73 65 20 69  &= iB;.  }else i
bc10: 66 28 20 6f 70 3d 3d 4f 50 5f 42 69 74 4f 72 20  f( op==OP_BitOr 
bc20: 29 7b 0a 20 20 20 20 69 41 20 7c 3d 20 69 42 3b  ){.    iA |= iB;
bc30: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 42 21  .  }else if( iB!
bc40: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
bc50: 28 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 52 69  ( op==OP_ShiftRi
bc60: 67 68 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68  ght || op==OP_Sh
bc70: 69 66 74 4c 65 66 74 20 29 3b 0a 0a 20 20 20 20  iftLeft );..    
bc80: 2f 2a 20 49 66 20 73 68 69 66 74 69 6e 67 20 62  /* If shifting b
bc90: 79 20 61 20 6e 65 67 61 74 69 76 65 20 61 6d 6f  y a negative amo
bca0: 75 6e 74 2c 20 73 68 69 66 74 20 69 6e 20 74 68  unt, shift in th
bcb0: 65 20 6f 74 68 65 72 20 64 69 72 65 63 74 69 6f  e other directio
bcc0: 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 42 3c  n */.    if( iB<
bcd0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
bce0: 74 28 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74  t( OP_ShiftRight
bcf0: 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 2b 31  ==OP_ShiftLeft+1
bd00: 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 32   );.      op = 2
bd10: 2a 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 2b 20  *OP_ShiftLeft + 
bd20: 31 20 2d 20 6f 70 3b 0a 20 20 20 20 20 20 69 42  1 - op;.      iB
bd30: 20 3d 20 69 42 3e 28 2d 36 34 29 20 3f 20 2d 69   = iB>(-64) ? -i
bd40: 42 20 3a 20 36 34 3b 0a 20 20 20 20 7d 0a 0a 20  B : 64;.    }.. 
bd50: 20 20 20 69 66 28 20 69 42 3e 3d 36 34 20 29 7b     if( iB>=64 ){
bd60: 0a 20 20 20 20 20 20 69 41 20 3d 20 28 69 41 3e  .      iA = (iA>
bd70: 3d 30 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68 69  =0 || op==OP_Shi
bd80: 66 74 4c 65 66 74 29 20 3f 20 30 20 3a 20 2d 31  ftLeft) ? 0 : -1
bd90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
bda0: 20 20 20 6d 65 6d 63 70 79 28 26 75 41 2c 20 26     memcpy(&uA, &
bdb0: 69 41 2c 20 73 69 7a 65 6f 66 28 75 41 29 29 3b  iA, sizeof(uA));
bdc0: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 4f  .      if( op==O
bdd0: 50 5f 53 68 69 66 74 4c 65 66 74 20 29 7b 0a 20  P_ShiftLeft ){. 
bde0: 20 20 20 20 20 20 20 75 41 20 3c 3c 3d 20 69 42         uA <<= iB
bdf0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
be00: 20 20 20 20 20 20 20 75 41 20 3e 3e 3d 20 69 42         uA >>= iB
be10: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 67  ;.        /* Sig
be20: 6e 2d 65 78 74 65 6e 64 20 6f 6e 20 61 20 72 69  n-extend on a ri
be30: 67 68 74 20 73 68 69 66 74 20 6f 66 20 61 20 6e  ght shift of a n
be40: 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 2a  egative number *
be50: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41  /.        if( iA
be60: 3c 30 20 29 20 75 41 20 7c 3d 20 28 28 28 28 75  <0 ) uA |= ((((u
be70: 36 34 29 30 78 66 66 66 66 66 66 66 66 29 3c 3c  64)0xffffffff)<<
be80: 33 32 29 7c 30 78 66 66 66 66 66 66 66 66 29 20  32)|0xffffffff) 
be90: 3c 3c 20 28 36 34 2d 69 42 29 3b 0a 20 20 20 20  << (64-iB);.    
bea0: 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79    }.      memcpy
beb0: 28 26 69 41 2c 20 26 75 41 2c 20 73 69 7a 65 6f  (&iA, &uA, sizeo
bec0: 66 28 69 41 29 29 3b 0a 20 20 20 20 7d 0a 20 20  f(iA));.    }.  
bed0: 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  }.  pOut->u.i = 
bee0: 69 41 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65  iA;.  MemSetType
bef0: 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49  Flag(pOut, MEM_I
bf00: 6e 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  nt);.  break;.}.
bf10: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 64 64 49  ./* Opcode: AddI
bf20: 6d 6d 20 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  mm  P1 P2 * * *.
bf30: 2a 2a 20 0a 2a 2a 20 41 64 64 20 74 68 65 20 63  ** .** Add the c
bf40: 6f 6e 73 74 61 6e 74 20 50 32 20 74 6f 20 74 68  onstant P2 to th
bf50: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
bf60: 74 65 72 20 50 31 2e 0a 2a 2a 20 54 68 65 20 72  ter P1..** The r
bf70: 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73 20  esult is always 
bf80: 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  an integer..**.*
bf90: 2a 20 54 6f 20 66 6f 72 63 65 20 61 6e 79 20 72  * To force any r
bfa0: 65 67 69 73 74 65 72 20 74 6f 20 62 65 20 61 6e  egister to be an
bfb0: 20 69 6e 74 65 67 65 72 2c 20 6a 75 73 74 20 61   integer, just a
bfc0: 64 64 20 30 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  dd 0..*/.case OP
bfd0: 5f 41 64 64 49 6d 6d 3a 20 7b 20 20 20 20 20 20  _AddImm: {      
bfe0: 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a        /* in1 */.
bff0: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
c000: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 6d 65 6d 41 62  Op->p1];.  memAb
c010: 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70  outToChange(p, p
c020: 49 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  In1);.  sqlite3V
c030: 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79  dbeMemIntegerify
c040: 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e 31 2d 3e  (pIn1);.  pIn1->
c050: 75 2e 69 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a  u.i += pOp->p2;.
c060: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
c070: 70 63 6f 64 65 3a 20 4d 75 73 74 42 65 49 6e 74  pcode: MustBeInt
c080: 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
c090: 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61  .** Force the va
c0a0: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
c0b0: 50 31 20 74 6f 20 62 65 20 61 6e 20 69 6e 74 65  P1 to be an inte
c0c0: 67 65 72 2e 20 20 49 66 20 74 68 65 20 76 61 6c  ger.  If the val
c0d0: 75 65 0a 2a 2a 20 69 6e 20 50 31 20 69 73 20 6e  ue.** in P1 is n
c0e0: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e  ot an integer an
c0f0: 64 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76  d cannot be conv
c100: 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e  erted into an in
c110: 74 65 67 65 72 0a 2a 2a 20 77 69 74 68 6f 75 74  teger.** without
c120: 20 64 61 74 61 20 6c 6f 73 73 2c 20 74 68 65 6e   data loss, then
c130: 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
c140: 79 20 74 6f 20 50 32 2c 20 6f 72 20 69 66 20 50  y to P2, or if P
c150: 32 3d 3d 30 0a 2a 2a 20 72 61 69 73 65 20 61 6e  2==0.** raise an
c160: 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48   SQLITE_MISMATCH
c170: 20 65 78 63 65 70 74 69 6f 6e 2e 0a 2a 2f 0a 63   exception..*/.c
c180: 61 73 65 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  ase OP_MustBeInt
c190: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
c1a0: 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20  * jump, in1 */. 
c1b0: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
c1c0: 70 2d 3e 70 31 5d 3b 0a 20 20 61 70 70 6c 79 41  p->p1];.  applyA
c1d0: 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 53 51  ffinity(pIn1, SQ
c1e0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
c1f0: 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 69  , encoding);.  i
c200: 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
c210: 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b  & MEM_Int)==0 ){
c220: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32  .    if( pOp->p2
c230: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
c240: 3d 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  = SQLITE_MISMATC
c250: 48 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62  H;.      goto ab
c260: 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
c270: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c280: 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
c290: 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  - 1;.    }.  }el
c2a0: 73 65 7b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79  se{.    MemSetTy
c2b0: 70 65 46 6c 61 67 28 70 49 6e 31 2c 20 4d 45 4d  peFlag(pIn1, MEM
c2c0: 5f 49 6e 74 29 3b 0a 20 20 7d 0a 20 20 62 72 65  _Int);.  }.  bre
c2d0: 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ak;.}..#ifndef S
c2e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
c2f0: 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 20 4f 70 63  ING_POINT./* Opc
c300: 6f 64 65 3a 20 52 65 61 6c 41 66 66 69 6e 69 74  ode: RealAffinit
c310: 79 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  y P1 * * * *.**.
c320: 2a 2a 20 49 66 20 72 65 67 69 73 74 65 72 20 50  ** If register P
c330: 31 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65 67  1 holds an integ
c340: 65 72 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f  er convert it to
c350: 20 61 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a 2a   a real value..*
c360: 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
c370: 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 65 78   is used when ex
c380: 74 72 61 63 74 69 6e 67 20 69 6e 66 6f 72 6d 61  tracting informa
c390: 74 69 6f 6e 20 66 72 6f 6d 20 61 20 63 6f 6c 75  tion from a colu
c3a0: 6d 6e 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 52  mn that.** has R
c3b0: 45 41 4c 20 61 66 66 69 6e 69 74 79 2e 20 20 53  EAL affinity.  S
c3c0: 75 63 68 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  uch column value
c3d0: 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 73  s may still be s
c3e0: 74 6f 72 65 64 20 61 73 0a 2a 2a 20 69 6e 74 65  tored as.** inte
c3f0: 67 65 72 73 2c 20 66 6f 72 20 73 70 61 63 65 20  gers, for space 
c400: 65 66 66 69 63 69 65 6e 63 79 2c 20 62 75 74 20  efficiency, but 
c410: 61 66 74 65 72 20 65 78 74 72 61 63 74 69 6f 6e  after extraction
c420: 20 77 65 20 77 61 6e 74 20 74 68 65 6d 0a 2a 2a   we want them.**
c430: 20 74 6f 20 68 61 76 65 20 6f 6e 6c 79 20 61 20   to have only a 
c440: 72 65 61 6c 20 76 61 6c 75 65 2e 0a 2a 2f 0a 63  real value..*/.c
c450: 61 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  ase OP_RealAffin
c460: 69 74 79 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ity: {          
c470: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a          /* in1 *
c480: 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
c490: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28  [pOp->p1];.  if(
c4a0: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn1->flags & M
c4b0: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 73 71  EM_Int ){.    sq
c4c0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 61 6c  lite3VdbeMemReal
c4d0: 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20  ify(pIn1);.  }. 
c4e0: 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
c4f0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c500: 5f 4f 4d 49 54 5f 43 41 53 54 0a 2f 2a 20 4f 70  _OMIT_CAST./* Op
c510: 63 6f 64 65 3a 20 54 6f 54 65 78 74 20 50 31 20  code: ToText P1 
c520: 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f  * * * *.**.** Fo
c530: 72 63 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  rce the value in
c540: 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20   register P1 to 
c550: 62 65 20 74 65 78 74 2e 0a 2a 2a 20 49 66 20 74  be text..** If t
c560: 68 65 20 76 61 6c 75 65 20 69 73 20 6e 75 6d 65  he value is nume
c570: 72 69 63 2c 20 63 6f 6e 76 65 72 74 20 69 74 20  ric, convert it 
c580: 74 6f 20 61 20 73 74 72 69 6e 67 20 75 73 69 6e  to a string usin
c590: 67 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c  g the.** equival
c5a0: 65 6e 74 20 6f 66 20 70 72 69 6e 74 66 28 29 2e  ent of printf().
c5b0: 20 20 42 6c 6f 62 20 76 61 6c 75 65 73 20 61 72    Blob values ar
c5c0: 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a  e unchanged and.
c5d0: 2a 2a 20 61 72 65 20 61 66 74 65 72 77 61 72 64  ** are afterward
c5e0: 73 20 73 69 6d 70 6c 79 20 69 6e 74 65 72 70 72  s simply interpr
c5f0: 65 74 65 64 20 61 73 20 74 65 78 74 2e 0a 2a 2a  eted as text..**
c600: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65  .** A NULL value
c610: 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20   is not changed 
c620: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
c630: 20 20 49 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c    It remains NUL
c640: 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f  L..*/.case OP_To
c650: 54 65 78 74 3a 20 7b 20 20 20 20 20 20 20 20 20  Text: {         
c660: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
c670: 20 61 73 20 54 4b 5f 54 4f 5f 54 45 58 54 2c 20   as TK_TO_TEXT, 
c680: 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  in1 */.  pIn1 = 
c690: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
c6a0: 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
c6b0: 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20 20 69  ge(p, pIn1);.  i
c6c0: 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  f( pIn1->flags &
c6d0: 20 4d 45 4d 5f 4e 75 6c 6c 20 29 20 62 72 65 61   MEM_Null ) brea
c6e0: 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d  k;.  assert( MEM
c6f0: 5f 53 74 72 3d 3d 28 4d 45 4d 5f 42 6c 6f 62 3e  _Str==(MEM_Blob>
c700: 3e 33 29 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 66  >3) );.  pIn1->f
c710: 6c 61 67 73 20 7c 3d 20 28 70 49 6e 31 2d 3e 66  lags |= (pIn1->f
c720: 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 29 3e 3e  lags&MEM_Blob)>>
c730: 33 3b 0a 20 20 61 70 70 6c 79 41 66 66 69 6e 69  3;.  applyAffini
c740: 74 79 28 70 49 6e 31 2c 20 53 51 4c 49 54 45 5f  ty(pIn1, SQLITE_
c750: 41 46 46 5f 54 45 58 54 2c 20 65 6e 63 6f 64 69  AFF_TEXT, encodi
c760: 6e 67 29 3b 0a 20 20 72 63 20 3d 20 45 78 70 61  ng);.  rc = Expa
c770: 6e 64 42 6c 6f 62 28 70 49 6e 31 29 3b 0a 20 20  ndBlob(pIn1);.  
c780: 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c  assert( pIn1->fl
c790: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 7c 7c  ags & MEM_Str ||
c7a0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
c7b0: 64 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61  d );.  pIn1->fla
c7c0: 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 49 6e 74 7c  gs &= ~(MEM_Int|
c7d0: 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 42 6c 6f  MEM_Real|MEM_Blo
c7e0: 62 7c 4d 45 4d 5f 5a 65 72 6f 29 3b 0a 20 20 55  b|MEM_Zero);.  U
c7f0: 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49  PDATE_MAX_BLOBSI
c800: 5a 45 28 70 49 6e 31 29 3b 0a 20 20 62 72 65 61  ZE(pIn1);.  brea
c810: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
c820: 20 54 6f 42 6c 6f 62 20 50 31 20 2a 20 2a 20 2a   ToBlob P1 * * *
c830: 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20 74   *.**.** Force t
c840: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
c850: 73 74 65 72 20 50 31 20 74 6f 20 62 65 20 61 20  ster P1 to be a 
c860: 42 4c 4f 42 2e 0a 2a 2a 20 49 66 20 74 68 65 20  BLOB..** If the 
c870: 76 61 6c 75 65 20 69 73 20 6e 75 6d 65 72 69 63  value is numeric
c880: 2c 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f 20  , convert it to 
c890: 61 20 73 74 72 69 6e 67 20 66 69 72 73 74 2e 0a  a string first..
c8a0: 2a 2a 20 53 74 72 69 6e 67 73 20 61 72 65 20 73  ** Strings are s
c8b0: 69 6d 70 6c 79 20 72 65 69 6e 74 65 72 70 72 65  imply reinterpre
c8c0: 74 65 64 20 61 73 20 62 6c 6f 62 73 20 77 69 74  ted as blobs wit
c8d0: 68 20 6e 6f 20 63 68 61 6e 67 65 0a 2a 2a 20 74  h no change.** t
c8e0: 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  o the underlying
c8f0: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e   data..**.** A N
c900: 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f 74  ULL value is not
c910: 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73   changed by this
c920: 20 72 6f 75 74 69 6e 65 2e 20 20 49 74 20 72 65   routine.  It re
c930: 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63  mains NULL..*/.c
c940: 61 73 65 20 4f 50 5f 54 6f 42 6c 6f 62 3a 20 7b  ase OP_ToBlob: {
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c960: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
c970: 54 4f 5f 42 4c 4f 42 2c 20 69 6e 31 20 2a 2f 0a  TO_BLOB, in1 */.
c980: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
c990: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70  Op->p1];.  if( p
c9a0: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
c9b0: 5f 4e 75 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20  _Null ) break;. 
c9c0: 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
c9d0: 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 29 3d 3d 30  s & MEM_Blob)==0
c9e0: 20 29 7b 0a 20 20 20 20 61 70 70 6c 79 41 66 66   ){.    applyAff
c9f0: 69 6e 69 74 79 28 70 49 6e 31 2c 20 53 51 4c 49  inity(pIn1, SQLI
ca00: 54 45 5f 41 46 46 5f 54 45 58 54 2c 20 65 6e 63  TE_AFF_TEXT, enc
ca10: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 61 73 73 65  oding);.    asse
ca20: 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  rt( pIn1->flags 
ca30: 26 20 4d 45 4d 5f 53 74 72 20 7c 7c 20 64 62 2d  & MEM_Str || db-
ca40: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
ca50: 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46  .    MemSetTypeF
ca60: 6c 61 67 28 70 49 6e 31 2c 20 4d 45 4d 5f 42 6c  lag(pIn1, MEM_Bl
ca70: 6f 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ob);.  }else{.  
ca80: 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 3d    pIn1->flags &=
ca90: 20 7e 28 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 26   ~(MEM_TypeMask&
caa0: 7e 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 20 20 7d 0a  ~MEM_Blob);.  }.
cab0: 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
cac0: 42 53 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20 62  BSIZE(pIn1);.  b
cad0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
cae0: 64 65 3a 20 54 6f 4e 75 6d 65 72 69 63 20 50 31  de: ToNumeric P1
caf0: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46   * * * *.**.** F
cb00: 6f 72 63 65 20 74 68 65 20 76 61 6c 75 65 20 69  orce the value i
cb10: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f  n register P1 to
cb20: 20 62 65 20 6e 75 6d 65 72 69 63 20 28 65 69 74   be numeric (eit
cb30: 68 65 72 20 61 6e 0a 2a 2a 20 69 6e 74 65 67 65  her an.** intege
cb40: 72 20 6f 72 20 61 20 66 6c 6f 61 74 69 6e 67 2d  r or a floating-
cb50: 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 29 0a 2a  point number.).*
cb60: 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69  * If the value i
cb70: 73 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 2c 20  s text or blob, 
cb80: 74 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 69  try to convert i
cb90: 74 20 74 6f 20 61 6e 20 75 73 69 6e 67 20 74 68  t to an using th
cba0: 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  e.** equivalent 
cbb0: 6f 66 20 61 74 6f 69 28 29 20 6f 72 20 61 74 6f  of atoi() or ato
cbc0: 66 28 29 20 61 6e 64 20 73 74 6f 72 65 20 30 20  f() and store 0 
cbd0: 69 66 20 6e 6f 20 73 75 63 68 20 63 6f 6e 76 65  if no such conve
cbe0: 72 73 69 6f 6e 20 0a 2a 2a 20 69 73 20 70 6f 73  rsion .** is pos
cbf0: 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e  sible..**.** A N
cc00: 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f 74  ULL value is not
cc10: 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73   changed by this
cc20: 20 72 6f 75 74 69 6e 65 2e 20 20 49 74 20 72 65   routine.  It re
cc30: 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63  mains NULL..*/.c
cc40: 61 73 65 20 4f 50 5f 54 6f 4e 75 6d 65 72 69 63  ase OP_ToNumeric
cc50: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
cc60: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
cc70: 54 4b 5f 54 4f 5f 4e 55 4d 45 52 49 43 2c 20 69  TK_TO_NUMERIC, i
cc80: 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
cc90: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
cca0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e   sqlite3VdbeMemN
ccb0: 75 6d 65 72 69 66 79 28 70 49 6e 31 29 3b 0a 20  umerify(pIn1);. 
ccc0: 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
ccd0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
cce0: 43 41 53 54 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f  CAST */../* Opco
ccf0: 64 65 3a 20 54 6f 49 6e 74 20 50 31 20 2a 20 2a  de: ToInt P1 * *
cd00: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65   * *.**.** Force
cd10: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
cd20: 67 69 73 74 65 72 20 50 31 20 74 6f 20 62 65 20  gister P1 to be 
cd30: 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66 0a  an integer.  If.
cd40: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 73 20  ** The value is 
cd50: 63 75 72 72 65 6e 74 6c 79 20 61 20 72 65 61 6c  currently a real
cd60: 20 6e 75 6d 62 65 72 2c 20 64 72 6f 70 20 69 74   number, drop it
cd70: 73 20 66 72 61 63 74 69 6f 6e 61 6c 20 70 61 72  s fractional par
cd80: 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c  t..** If the val
cd90: 75 65 20 69 73 20 74 65 78 74 20 6f 72 20 62 6c  ue is text or bl
cda0: 6f 62 2c 20 74 72 79 20 74 6f 20 63 6f 6e 76 65  ob, try to conve
cdb0: 72 74 20 69 74 20 74 6f 20 61 6e 20 69 6e 74 65  rt it to an inte
cdc0: 67 65 72 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a  ger using the.**
cdd0: 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 61   equivalent of a
cde0: 74 6f 69 28 29 20 61 6e 64 20 73 74 6f 72 65 20  toi() and store 
cdf0: 30 20 69 66 20 6e 6f 20 73 75 63 68 20 63 6f 6e  0 if no such con
ce00: 76 65 72 73 69 6f 6e 20 69 73 20 70 6f 73 73 69  version is possi
ce10: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  ble..**.** A NUL
ce20: 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 63  L value is not c
ce30: 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 72  hanged by this r
ce40: 6f 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d 61  outine.  It rema
ce50: 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73  ins NULL..*/.cas
ce60: 65 20 4f 50 5f 54 6f 49 6e 74 3a 20 7b 20 20 20  e OP_ToInt: {   
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ce80: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 54 4f 5f  * same as TK_TO_
ce90: 49 4e 54 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49  INT, in1 */.  pI
cea0: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
ceb0: 70 31 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31  p1];.  if( (pIn1
cec0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
ced0: 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ll)==0 ){.    sq
cee0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65  lite3VdbeMemInte
cef0: 67 65 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20  gerify(pIn1);.  
cf00: 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69  }.  break;.}..#i
cf10: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
cf20: 45 5f 4f 4d 49 54 5f 43 41 53 54 29 20 26 26 20  E_OMIT_CAST) && 
cf30: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
cf40: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
cf50: 49 4e 54 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  INT)./* Opcode: 
cf60: 54 6f 52 65 61 6c 20 50 31 20 2a 20 2a 20 2a 20  ToReal P1 * * * 
cf70: 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20 74 68  *.**.** Force th
cf80: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
cf90: 74 65 72 20 50 31 20 74 6f 20 62 65 20 61 20 66  ter P1 to be a f
cfa0: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75  loating point nu
cfb0: 6d 62 65 72 2e 0a 2a 2a 20 49 66 20 54 68 65 20  mber..** If The 
cfc0: 76 61 6c 75 65 20 69 73 20 63 75 72 72 65 6e 74  value is current
cfd0: 6c 79 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 63  ly an integer, c
cfe0: 6f 6e 76 65 72 74 20 69 74 2e 0a 2a 2a 20 49 66  onvert it..** If
cff0: 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 74 65   the value is te
d000: 78 74 20 6f 72 20 62 6c 6f 62 2c 20 74 72 79 20  xt or blob, try 
d010: 74 6f 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f  to convert it to
d020: 20 61 6e 20 69 6e 74 65 67 65 72 20 75 73 69 6e   an integer usin
d030: 67 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c  g the.** equival
d040: 65 6e 74 20 6f 66 20 61 74 6f 69 28 29 20 61 6e  ent of atoi() an
d050: 64 20 73 74 6f 72 65 20 30 2e 30 20 69 66 20 6e  d store 0.0 if n
d060: 6f 20 73 75 63 68 20 63 6f 6e 76 65 72 73 69 6f  o such conversio
d070: 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  n is possible..*
d080: 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75  *.** A NULL valu
d090: 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
d0a0: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
d0b0: 2e 20 20 49 74 20 72 65 6d 61 69 6e 73 20 4e 55  .  It remains NU
d0c0: 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54  LL..*/.case OP_T
d0d0: 6f 52 65 61 6c 3a 20 7b 20 20 20 20 20 20 20 20  oReal: {        
d0e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
d0f0: 65 20 61 73 20 54 4b 5f 54 4f 5f 52 45 41 4c 2c  e as TK_TO_REAL,
d100: 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
d110: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
d120: 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61  .  memAboutToCha
d130: 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20 20  nge(p, pIn1);.  
d140: 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
d150: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20   & MEM_Null)==0 
d160: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
d170: 62 65 4d 65 6d 52 65 61 6c 69 66 79 28 70 49 6e  beMemRealify(pIn
d180: 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  1);.  }.  break;
d190: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
d1a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d1b0: 54 5f 43 41 53 54 29 20 26 26 20 21 64 65 66 69  T_CAST) && !defi
d1c0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d1d0: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 20  FLOATING_POINT) 
d1e0: 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c  */../* Opcode: L
d1f0: 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  t P1 P2 P3 P4 P5
d200: 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  .**.** Compare t
d210: 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67  he values in reg
d220: 69 73 74 65 72 20 50 31 20 61 6e 64 20 50 33 2e  ister P1 and P3.
d230: 20 20 49 66 20 72 65 67 28 50 33 29 3c 72 65 67    If reg(P3)<reg
d240: 28 50 31 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d  (P1) then.** jum
d250: 70 20 74 6f 20 61 64 64 72 65 73 73 20 50 32 2e  p to address P2.
d260: 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
d270: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
d280: 4c 20 62 69 74 20 6f 66 20 50 35 20 69 73 20 73  L bit of P5 is s
d290: 65 74 20 61 6e 64 20 65 69 74 68 65 72 20 72 65  et and either re
d2a0: 67 28 50 31 29 20 6f 72 0a 2a 2a 20 72 65 67 28  g(P1) or.** reg(
d2b0: 50 33 29 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  P3) is NULL then
d2c0: 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 2e 20   take the jump. 
d2d0: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4a   If the SQLITE_J
d2e0: 55 4d 50 49 46 4e 55 4c 4c 20 0a 2a 2a 20 62 69  UMPIFNULL .** bi
d2f0: 74 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  t is clear then 
d300: 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20  fall through if 
d310: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
d320: 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
d330: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53  e SQLITE_AFF_MAS
d340: 4b 20 70 6f 72 74 69 6f 6e 20 6f 66 20 50 35 20  K portion of P5 
d350: 6d 75 73 74 20 62 65 20 61 6e 20 61 66 66 69 6e  must be an affin
d360: 69 74 79 20 63 68 61 72 61 63 74 65 72 20 2d 0a  ity character -.
d370: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  ** SQLITE_AFF_TE
d380: 58 54 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  XT, SQLITE_AFF_I
d390: 4e 54 45 47 45 52 2c 20 61 6e 64 20 73 6f 20 66  NTEGER, and so f
d3a0: 6f 72 74 68 2e 20 41 6e 20 61 74 74 65 6d 70 74  orth. An attempt
d3b0: 20 69 73 20 6d 61 64 65 20 0a 2a 2a 20 74 6f 20   is made .** to 
d3c0: 63 6f 65 72 63 65 20 62 6f 74 68 20 69 6e 70 75  coerce both inpu
d3d0: 74 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ts according to 
d3e0: 74 68 69 73 20 61 66 66 69 6e 69 74 79 20 62 65  this affinity be
d3f0: 66 6f 72 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70  fore the.** comp
d400: 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 2e 20  arison is made. 
d410: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  If the SQLITE_AF
d420: 46 5f 4d 41 53 4b 20 69 73 20 30 78 30 30 2c 20  F_MASK is 0x00, 
d430: 74 68 65 6e 20 6e 75 6d 65 72 69 63 0a 2a 2a 20  then numeric.** 
d440: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
d450: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  . Note that the 
d460: 61 66 66 69 6e 69 74 79 20 63 6f 6e 76 65 72 73  affinity convers
d470: 69 6f 6e 73 20 61 72 65 20 73 74 6f 72 65 64 0a  ions are stored.
d480: 2a 2a 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ** back into the
d490: 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 73   input registers
d4a0: 20 50 31 20 61 6e 64 20 50 33 2e 20 20 53 6f 20   P1 and P3.  So 
d4b0: 74 68 69 73 20 6f 70 63 6f 64 65 20 63 61 6e 20  this opcode can 
d4c0: 63 61 75 73 65 0a 2a 2a 20 70 65 72 73 69 73 74  cause.** persist
d4d0: 65 6e 74 20 63 68 61 6e 67 65 73 20 74 6f 20 72  ent changes to r
d4e0: 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20  egisters P1 and 
d4f0: 50 33 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  P3..**.** Once a
d500: 6e 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 68  ny conversions h
d510: 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63 65 2c  ave taken place,
d520: 20 61 6e 64 20 6e 65 69 74 68 65 72 20 76 61 6c   and neither val
d530: 75 65 20 69 73 20 4e 55 4c 4c 2c 20 0a 2a 2a 20  ue is NULL, .** 
d540: 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 63  the values are c
d550: 6f 6d 70 61 72 65 64 2e 20 49 66 20 62 6f 74 68  ompared. If both
d560: 20 76 61 6c 75 65 73 20 61 72 65 20 62 6c 6f 62   values are blob
d570: 73 20 74 68 65 6e 20 6d 65 6d 63 6d 70 28 29 20  s then memcmp() 
d580: 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 64 65  is.** used to de
d590: 74 65 72 6d 69 6e 65 20 74 68 65 20 72 65 73 75  termine the resu
d5a0: 6c 74 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  lts of the compa
d5b0: 72 69 73 6f 6e 2e 20 20 49 66 20 62 6f 74 68 20  rison.  If both 
d5c0: 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 74 65  values.** are te
d5d0: 78 74 2c 20 74 68 65 6e 20 74 68 65 20 61 70 70  xt, then the app
d5e0: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
d5f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 73 70 65 63  ng function spec
d600: 69 66 69 65 64 20 69 6e 0a 2a 2a 20 50 34 20 69  ified in.** P4 i
d610: 73 20 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68  s  used to do th
d620: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49  e comparison.  I
d630: 66 20 50 34 20 69 73 20 6e 6f 74 20 73 70 65 63  f P4 is not spec
d640: 69 66 69 65 64 20 74 68 65 6e 0a 2a 2a 20 6d 65  ified then.** me
d650: 6d 63 6d 70 28 29 20 69 73 20 75 73 65 64 20 74  mcmp() is used t
d660: 6f 20 63 6f 6d 70 61 72 65 20 74 65 78 74 20 73  o compare text s
d670: 74 72 69 6e 67 2e 20 20 49 66 20 62 6f 74 68 20  tring.  If both 
d680: 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 6e 75  values are.** nu
d690: 6d 65 72 69 63 2c 20 74 68 65 6e 20 61 20 6e 75  meric, then a nu
d6a0: 6d 65 72 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e  meric comparison
d6b0: 20 69 73 20 75 73 65 64 2e 20 49 66 20 74 68 65   is used. If the
d6c0: 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61   two values.** a
d6d0: 72 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  re of different 
d6e0: 74 79 70 65 73 2c 20 74 68 65 6e 20 6e 75 6d 62  types, then numb
d6f0: 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ers are consider
d700: 65 64 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20  ed less than.** 
d710: 73 74 72 69 6e 67 73 20 61 6e 64 20 73 74 72 69  strings and stri
d720: 6e 67 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ngs are consider
d730: 65 64 20 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f  ed less than blo
d740: 62 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  bs..**.** If the
d750: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
d760: 62 69 74 20 6f 66 20 50 35 20 69 73 20 73 65 74  bit of P5 is set
d770: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6a 75  , then do not ju
d780: 6d 70 2e 20 20 49 6e 73 74 65 61 64 2c 0a 2a 2a  mp.  Instead,.**
d790: 20 73 74 6f 72 65 20 61 20 62 6f 6f 6c 65 61 6e   store a boolean
d7a0: 20 72 65 73 75 6c 74 20 28 65 69 74 68 65 72 20   result (either 
d7b0: 30 2c 20 6f 72 20 31 2c 20 6f 72 20 4e 55 4c 4c  0, or 1, or NULL
d7c0: 29 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  ) in register P2
d7d0: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
d7e0: 4e 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50  Ne P1 P2 P3 P4 P
d7f0: 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  5.**.** This wor
d800: 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65  ks just like the
d810: 20 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70   Lt opcode excep
d820: 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20  t that the jump 
d830: 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74  is taken if.** t
d840: 68 65 20 6f 70 65 72 61 6e 64 73 20 69 6e 20 72  he operands in r
d850: 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20  egisters P1 and 
d860: 50 33 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c  P3 are not equal
d870: 2e 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70  .  See the Lt op
d880: 63 6f 64 65 20 66 6f 72 0a 2a 2a 20 61 64 64 69  code for.** addi
d890: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
d8a0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  on..**.** If SQL
d8b0: 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 73 65  ITE_NULLEQ is se
d8c0: 74 20 69 6e 20 50 35 20 74 68 65 6e 20 74 68 65  t in P5 then the
d8d0: 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   result of compa
d8e0: 72 69 73 6f 6e 20 69 73 20 61 6c 77 61 79 73 20  rison is always 
d8f0: 65 69 74 68 65 72 0a 2a 2a 20 74 72 75 65 20 6f  either.** true o
d900: 72 20 66 61 6c 73 65 20 61 6e 64 20 69 73 20 6e  r false and is n
d910: 65 76 65 72 20 4e 55 4c 4c 2e 20 20 49 66 20 62  ever NULL.  If b
d920: 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65  oth operands are
d930: 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72   NULL then the r
d940: 65 73 75 6c 74 0a 2a 2a 20 6f 66 20 63 6f 6d 70  esult.** of comp
d950: 61 72 69 73 6f 6e 20 69 73 20 66 61 6c 73 65 2e  arison is false.
d960: 20 20 49 66 20 65 69 74 68 65 72 20 6f 70 65 72    If either oper
d970: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  and is NULL then
d980: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   the result is t
d990: 72 75 65 2e 0a 2a 2a 20 49 66 20 6e 65 69 74 68  rue..** If neith
d9a0: 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55  er operand is NU
d9b0: 4c 4c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  LL the result is
d9c0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 69 74 20   the same as it 
d9d0: 77 6f 75 6c 64 20 62 65 20 69 66 0a 2a 2a 20 74  would be if.** t
d9e0: 68 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  he SQLITE_NULLEQ
d9f0: 20 66 6c 61 67 20 77 65 72 65 20 6f 6d 69 74 74   flag were omitt
da00: 65 64 20 66 72 6f 6d 20 50 35 2e 0a 2a 2f 0a 2f  ed from P5..*/./
da10: 2a 20 4f 70 63 6f 64 65 3a 20 45 71 20 50 31 20  * Opcode: Eq P1 
da20: 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
da30: 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
da40: 74 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70  t like the Lt op
da50: 63 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74  code except that
da60: 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
da70: 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 6f 70 65  en if.** the ope
da80: 72 61 6e 64 73 20 69 6e 20 72 65 67 69 73 74 65  rands in registe
da90: 72 73 20 50 31 20 61 6e 64 20 50 33 20 61 72 65  rs P1 and P3 are
daa0: 20 65 71 75 61 6c 2e 0a 2a 2a 20 53 65 65 20 74   equal..** See t
dab0: 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72  he Lt opcode for
dac0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
dad0: 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  rmation..**.** I
dae0: 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20  f SQLITE_NULLEQ 
daf0: 69 73 20 73 65 74 20 69 6e 20 50 35 20 74 68 65  is set in P5 the
db00: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
db10: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 6c  comparison is al
db20: 77 61 79 73 20 65 69 74 68 65 72 0a 2a 2a 20 74  ways either.** t
db30: 72 75 65 20 6f 72 20 66 61 6c 73 65 20 61 6e 64  rue or false and
db40: 20 69 73 20 6e 65 76 65 72 20 4e 55 4c 4c 2e 20   is never NULL. 
db50: 20 49 66 20 62 6f 74 68 20 6f 70 65 72 61 6e 64   If both operand
db60: 73 20 61 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20  s are NULL then 
db70: 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 66  the result.** of
db80: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
db90: 72 75 65 2e 20 20 49 66 20 65 69 74 68 65 72 20  rue.  If either 
dba0: 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20  operand is NULL 
dbb0: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
dbc0: 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20 49 66 20  is false..** If 
dbd0: 6e 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20  neither operand 
dbe0: 69 73 20 4e 55 4c 4c 20 74 68 65 20 72 65 73 75  is NULL the resu
dbf0: 6c 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  lt is the same a
dc00: 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 66  s it would be if
dc10: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  .** the SQLITE_N
dc20: 55 4c 4c 45 51 20 66 6c 61 67 20 77 65 72 65 20  ULLEQ flag were 
dc30: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 50 35 2e  omitted from P5.
dc40: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c  .*/./* Opcode: L
dc50: 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  e P1 P2 P3 P4 P5
dc60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
dc70: 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20  s just like the 
dc80: 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74  Lt opcode except
dc90: 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69   that the jump i
dca0: 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68  s taken if.** th
dcb0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67  e content of reg
dcc0: 69 73 74 65 72 20 50 33 20 69 73 20 6c 65 73 73  ister P3 is less
dcd0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
dce0: 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  o the content of
dcf0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 2e  .** register P1.
dd00: 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63    See the Lt opc
dd10: 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ode for addition
dd20: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
dd30: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 74  */./* Opcode: Gt
dd40: 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
dd50: 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
dd60: 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 4c   just like the L
dd70: 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20  t opcode except 
dd80: 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73  that the jump is
dd90: 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65   taken if.** the
dda0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69   content of regi
ddb0: 73 74 65 72 20 50 33 20 69 73 20 67 72 65 61 74  ster P3 is great
ddc0: 65 72 20 74 68 61 6e 20 74 68 65 20 63 6f 6e 74  er than the cont
ddd0: 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74  ent of.** regist
dde0: 65 72 20 50 31 2e 20 20 53 65 65 20 74 68 65 20  er P1.  See the 
ddf0: 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 64  Lt opcode for ad
de00: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
de10: 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  tion..*/./* Opco
de20: 64 65 3a 20 47 65 20 50 31 20 50 32 20 50 33 20  de: Ge 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 63 6f 6e 74 65 6e 74 20 6f  ** the content o
de90: 66 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73  f register P3 is
dea0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
deb0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 63 6f   equal to the co
dec0: 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69  ntent of.** regi
ded0: 73 74 65 72 20 50 31 2e 20 20 53 65 65 20 74 68  ster P1.  See th
dee0: 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20  e Lt opcode for 
def0: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
df00: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  mation..*/.case 
df10: 4f 50 5f 45 71 3a 20 20 20 20 20 20 20 20 20 20  OP_Eq:          
df20: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
df30: 54 4b 5f 45 51 2c 20 6a 75 6d 70 2c 20 69 6e 31  TK_EQ, jump, in1
df40: 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
df50: 5f 4e 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  _Ne:            
df60: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
df70: 5f 4e 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20  _NE, jump, in1, 
df80: 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c  in3 */.case OP_L
df90: 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t:              
dfa0: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c   /* same as TK_L
dfb0: 54 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e  T, jump, in1, in
dfc0: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 65 3a  3 */.case OP_Le:
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dfe0: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c 45 2c  * same as TK_LE,
dff0: 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20   jump, in1, in3 
e000: 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 74 3a 20 20  */.case OP_Gt:  
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e020: 73 61 6d 65 20 61 73 20 54 4b 5f 47 54 2c 20 6a  same as TK_GT, j
e030: 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f  ump, in1, in3 */
e040: 0a 63 61 73 65 20 4f 50 5f 47 65 3a 20 7b 20 20  .case OP_Ge: {  
e050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
e060: 6d 65 20 61 73 20 54 4b 5f 47 45 2c 20 6a 75 6d  me as TK_GE, jum
e070: 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 20  p, in1, in3 */. 
e080: 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20   int res;       
e090: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
e0a0: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
e0b0: 20 6f 66 20 70 49 6e 31 20 61 67 61 69 6e 73 74   of pIn1 against
e0c0: 20 70 49 6e 33 20 2a 2f 0a 20 20 63 68 61 72 20   pIn3 */.  char 
e0d0: 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 2f  affinity;      /
e0e0: 2a 20 41 66 66 69 6e 69 74 79 20 74 6f 20 75 73  * Affinity to us
e0f0: 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  e for comparison
e100: 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73 31   */.  u16 flags1
e110: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  ;         /* Cop
e120: 79 20 6f 66 20 69 6e 69 74 69 61 6c 20 76 61 6c  y of initial val
e130: 75 65 20 6f 66 20 70 49 6e 31 2d 3e 66 6c 61 67  ue of pIn1->flag
e140: 73 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73  s */.  u16 flags
e150: 33 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  3;         /* Co
e160: 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 20 76 61  py of initial va
e170: 6c 75 65 20 6f 66 20 70 49 6e 33 2d 3e 66 6c 61  lue of pIn3->fla
e180: 67 73 20 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d 20  gs */..  pIn1 = 
e190: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
e1a0: 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
e1b0: 4f 70 2d 3e 70 33 5d 3b 0a 20 20 66 6c 61 67 73  Op->p3];.  flags
e1c0: 31 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73 3b  1 = pIn1->flags;
e1d0: 0a 20 20 66 6c 61 67 73 33 20 3d 20 70 49 6e 33  .  flags3 = pIn3
e1e0: 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 28  ->flags;.  if( (
e1f0: 66 6c 61 67 73 31 20 7c 20 66 6c 61 67 73 33 29  flags1 | flags3)
e200: 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
e210: 20 2f 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20   /* One or both 
e220: 6f 70 65 72 61 6e 64 73 20 61 72 65 20 4e 55 4c  operands are NUL
e230: 4c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 70  L */.    if( pOp
e240: 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4e 55  ->p5 & SQLITE_NU
e250: 4c 4c 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a  LLEQ ){.      /*
e260: 20 49 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45   If SQLITE_NULLE
e270: 51 20 69 73 20 73 65 74 20 28 77 68 69 63 68 20  Q is set (which 
e280: 77 69 6c 6c 20 6f 6e 6c 79 20 68 61 70 70 65 6e  will only happen
e290: 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   if the operator
e2a0: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 4f 50 5f   is.      ** OP_
e2b0: 45 71 20 6f 72 20 4f 50 5f 4e 65 29 20 74 68 65  Eq or OP_Ne) the
e2c0: 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  n take the jump 
e2d0: 6f 72 20 6e 6f 74 20 64 65 70 65 6e 64 69 6e 67  or not depending
e2e0: 20 6f 6e 20 77 68 65 74 68 65 72 0a 20 20 20 20   on whether.    
e2f0: 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 62 6f 74 68    ** or not both
e300: 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 6e 75   operands are nu
e310: 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ll..      */.   
e320: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
e330: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 20 7c 7c  opcode==OP_Eq ||
e340: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
e350: 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 72 65 73  _Ne );.      res
e360: 20 3d 20 28 66 6c 61 67 73 31 20 26 20 66 6c 61   = (flags1 & fla
e370: 67 73 33 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d  gs3 & MEM_Null)=
e380: 3d 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  =0;.    }else{. 
e390: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e       /* SQLITE_N
e3a0: 55 4c 4c 45 51 20 69 73 20 63 6c 65 61 72 20 61  ULLEQ is clear a
e3b0: 6e 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  nd at least one 
e3c0: 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c  operand is NULL,
e3d0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
e3e0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77  he result is alw
e3f0: 61 79 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20  ays NULL..      
e400: 2a 2a 20 54 68 65 20 6a 75 6d 70 20 69 73 20 74  ** The jump is t
e410: 61 6b 65 6e 20 69 66 20 74 68 65 20 53 51 4c 49  aken if the SQLI
e420: 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 62 69  TE_JUMPIFNULL bi
e430: 74 20 69 73 20 73 65 74 2e 0a 20 20 20 20 20 20  t is set..      
e440: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  */.      if( pOp
e450: 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54  ->p5 & SQLITE_ST
e460: 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 20 20 20  OREP2 ){.       
e470: 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
e480: 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 20 20 20 20  p->p2];.        
e490: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
e4a0: 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  Out, MEM_Null);.
e4b0: 20 20 20 20 20 20 20 20 52 45 47 49 53 54 45 52          REGISTER
e4c0: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20  _TRACE(pOp->p2, 
e4d0: 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pOut);.      }el
e4e0: 73 65 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26  se if( pOp->p5 &
e4f0: 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
e500: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 63  LL ){.        pc
e510: 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20   = pOp->p2-1;.  
e520: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
e530: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
e540: 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72  {.    /* Neither
e550: 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c   operand is NULL
e560: 2e 20 20 44 6f 20 61 20 63 6f 6d 70 61 72 69 73  .  Do a comparis
e570: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 61 66 66 69 6e  on. */.    affin
e580: 69 74 79 20 3d 20 70 4f 70 2d 3e 70 35 20 26 20  ity = pOp->p5 & 
e590: 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 3b  SQLITE_AFF_MASK;
e5a0: 0a 20 20 20 20 69 66 28 20 61 66 66 69 6e 69 74  .    if( affinit
e5b0: 79 20 29 7b 0a 20 20 20 20 20 20 61 70 70 6c 79  y ){.      apply
e5c0: 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 61  Affinity(pIn1, a
e5d0: 66 66 69 6e 69 74 79 2c 20 65 6e 63 6f 64 69 6e  ffinity, encodin
e5e0: 67 29 3b 0a 20 20 20 20 20 20 61 70 70 6c 79 41  g);.      applyA
e5f0: 66 66 69 6e 69 74 79 28 70 49 6e 33 2c 20 61 66  ffinity(pIn3, af
e600: 66 69 6e 69 74 79 2c 20 65 6e 63 6f 64 69 6e 67  finity, encoding
e610: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
e620: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
e630: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
e640: 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
e650: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
e660: 43 4f 4c 4c 53 45 51 20 7c 7c 20 70 4f 70 2d 3e  COLLSEQ || pOp->
e670: 70 34 2e 70 43 6f 6c 6c 3d 3d 30 20 29 3b 0a 20  p4.pColl==0 );. 
e680: 20 20 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49     ExpandBlob(pI
e690: 6e 31 29 3b 0a 20 20 20 20 45 78 70 61 6e 64 42  n1);.    ExpandB
e6a0: 6c 6f 62 28 70 49 6e 33 29 3b 0a 20 20 20 20 72  lob(pIn3);.    r
e6b0: 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  es = sqlite3MemC
e6c0: 6f 6d 70 61 72 65 28 70 49 6e 33 2c 20 70 49 6e  ompare(pIn3, pIn
e6d0: 31 2c 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c  1, pOp->p4.pColl
e6e0: 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  );.  }.  switch(
e6f0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a   pOp->opcode ){.
e700: 20 20 20 20 63 61 73 65 20 4f 50 5f 45 71 3a 20      case OP_Eq: 
e710: 20 20 20 72 65 73 20 3d 20 72 65 73 3d 3d 30 3b     res = res==0;
e720: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e730: 63 61 73 65 20 4f 50 5f 4e 65 3a 20 20 20 20 72  case OP_Ne:    r
e740: 65 73 20 3d 20 72 65 73 21 3d 30 3b 20 20 20 20  es = res!=0;    
e750: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
e760: 20 4f 50 5f 4c 74 3a 20 20 20 20 72 65 73 20 3d   OP_Lt:    res =
e770: 20 72 65 73 3c 30 3b 20 20 20 20 20 20 62 72 65   res<0;      bre
e780: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f  ak;.    case OP_
e790: 4c 65 3a 20 20 20 20 72 65 73 20 3d 20 72 65 73  Le:    res = res
e7a0: 3c 3d 30 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  <=0;     break;.
e7b0: 20 20 20 20 63 61 73 65 20 4f 50 5f 47 74 3a 20      case OP_Gt: 
e7c0: 20 20 20 72 65 73 20 3d 20 72 65 73 3e 30 3b 20     res = res>0; 
e7d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e7e0: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 72  default:       r
e7f0: 65 73 20 3d 20 72 65 73 3e 3d 30 3b 20 20 20 20  es = res>=0;    
e800: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69   break;.  }..  i
e810: 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  f( pOp->p5 & SQL
e820: 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20  ITE_STOREP2 ){. 
e830: 20 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b     pOut = &aMem[
e840: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 6d 65  pOp->p2];.    me
e850: 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
e860: 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 4d 65 6d  , pOut);.    Mem
e870: 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
e880: 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 20 20  , MEM_Int);.    
e890: 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 65 73 3b  pOut->u.i = res;
e8a0: 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52  .    REGISTER_TR
e8b0: 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75  ACE(pOp->p2, pOu
e8c0: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
e8d0: 72 65 73 20 29 7b 0a 20 20 20 20 70 63 20 3d 20  res ){.    pc = 
e8e0: 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d 0a 0a  pOp->p2-1;.  }..
e8f0: 20 20 2f 2a 20 55 6e 64 6f 20 61 6e 79 20 63 68    /* Undo any ch
e900: 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 61 70  anges made by ap
e910: 70 6c 79 41 66 66 69 6e 69 74 79 28 29 20 74 6f  plyAffinity() to
e920: 20 74 68 65 20 69 6e 70 75 74 20 72 65 67 69 73   the input regis
e930: 74 65 72 73 2e 20 2a 2f 0a 20 20 70 49 6e 31 2d  ters. */.  pIn1-
e940: 3e 66 6c 61 67 73 20 3d 20 28 70 49 6e 31 2d 3e  >flags = (pIn1->
e950: 66 6c 61 67 73 26 7e 4d 45 4d 5f 54 79 70 65 4d  flags&~MEM_TypeM
e960: 61 73 6b 29 20 7c 20 28 66 6c 61 67 73 31 26 4d  ask) | (flags1&M
e970: 45 4d 5f 54 79 70 65 4d 61 73 6b 29 3b 0a 20 20  EM_TypeMask);.  
e980: 70 49 6e 33 2d 3e 66 6c 61 67 73 20 3d 20 28 70  pIn3->flags = (p
e990: 49 6e 33 2d 3e 66 6c 61 67 73 26 7e 4d 45 4d 5f  In3->flags&~MEM_
e9a0: 54 79 70 65 4d 61 73 6b 29 20 7c 20 28 66 6c 61  TypeMask) | (fla
e9b0: 67 73 33 26 4d 45 4d 5f 54 79 70 65 4d 61 73 6b  gs3&MEM_TypeMask
e9c0: 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
e9d0: 2a 20 4f 70 63 6f 64 65 3a 20 50 65 72 6d 75 74  * Opcode: Permut
e9e0: 61 74 69 6f 6e 20 2a 20 2a 20 2a 20 50 34 20 2a  ation * * * P4 *
e9f0: 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  .**.** Set the p
ea00: 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20  ermutation used 
ea10: 62 79 20 74 68 65 20 4f 50 5f 43 6f 6d 70 61 72  by the OP_Compar
ea20: 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65  e operator to be
ea30: 20 74 68 65 20 61 72 72 61 79 0a 2a 2a 20 6f 66   the array.** of
ea40: 20 69 6e 74 65 67 65 72 73 20 69 6e 20 50 34 2e   integers in P4.
ea50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 6d 75  .**.** The permu
ea60: 74 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 76  tation is only v
ea70: 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 6e  alid until the n
ea80: 65 78 74 20 4f 50 5f 50 65 72 6d 75 74 61 74 69  ext OP_Permutati
ea90: 6f 6e 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 0a  on, OP_Compare,.
eaa0: 2a 2a 20 4f 50 5f 48 61 6c 74 2c 20 6f 72 20 4f  ** OP_Halt, or O
eab0: 50 5f 52 65 73 75 6c 74 52 6f 77 2e 20 20 54 79  P_ResultRow.  Ty
eac0: 70 69 63 61 6c 6c 79 20 74 68 65 20 4f 50 5f 50  pically the OP_P
ead0: 65 72 6d 75 74 61 74 69 6f 6e 20 73 68 6f 75 6c  ermutation shoul
eae0: 64 20 6f 63 63 75 72 0a 2a 2a 20 69 6d 6d 65 64  d occur.** immed
eaf0: 69 61 74 65 6c 79 20 70 72 69 6f 72 20 74 6f 20  iately prior to 
eb00: 74 68 65 20 4f 50 5f 43 6f 6d 70 61 72 65 2e 0a  the OP_Compare..
eb10: 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 65 72 6d 75  */.case OP_Permu
eb20: 74 61 74 69 6f 6e 3a 20 7b 0a 20 20 61 73 73 65  tation: {.  asse
eb30: 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
eb40: 3d 50 34 5f 49 4e 54 41 52 52 41 59 20 29 3b 0a  =P4_INTARRAY );.
eb50: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
eb60: 34 2e 61 69 20 29 3b 0a 20 20 61 50 65 72 6d 75  4.ai );.  aPermu
eb70: 74 65 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b  te = pOp->p4.ai;
eb80: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
eb90: 4f 70 63 6f 64 65 3a 20 43 6f 6d 70 61 72 65 20  Opcode: Compare 
eba0: 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a  P1 P2 P3 P4 *.**
ebb0: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
ebc0: 76 65 63 74 6f 72 73 20 6f 66 20 72 65 67 69 73  vectors of regis
ebd0: 74 65 72 73 20 69 6e 20 72 65 67 28 50 31 29 2e  ters in reg(P1).
ebe0: 2e 72 65 67 28 50 31 2b 50 33 2d 31 29 20 28 63  .reg(P1+P3-1) (c
ebf0: 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 76 65 63 74  all this.** vect
ec00: 6f 72 20 22 41 22 29 20 61 6e 64 20 69 6e 20 72  or "A") and in r
ec10: 65 67 28 50 32 29 2e 2e 72 65 67 28 50 32 2b 50  eg(P2)..reg(P2+P
ec20: 33 2d 31 29 20 28 22 42 22 29 2e 20 20 53 61 76  3-1) ("B").  Sav
ec30: 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  e the result of.
ec40: 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ** the compariso
ec50: 6e 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  n for use by the
ec60: 20 6e 65 78 74 20 4f 50 5f 4a 75 6d 70 20 69 6e   next OP_Jump in
ec70: 73 74 72 75 63 74 2e 0a 2a 2a 0a 2a 2a 20 50 34  struct..**.** P4
ec80: 20 69 73 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   is a KeyInfo st
ec90: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66  ructure that def
eca0: 69 6e 65 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ines collating s
ecb0: 65 71 75 65 6e 63 65 73 20 61 6e 64 20 73 6f 72  equences and sor
ecc0: 74 0a 2a 2a 20 6f 72 64 65 72 73 20 66 6f 72 20  t.** orders for 
ecd0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  the comparison. 
ece0: 20 54 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   The permutation
ecf0: 20 61 70 70 6c 69 65 73 20 74 6f 20 72 65 67 69   applies to regi
ed00: 73 74 65 72 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 20  sters.** only.  
ed10: 54 68 65 20 4b 65 79 49 6e 66 6f 20 65 6c 65 6d  The KeyInfo elem
ed20: 65 6e 74 73 20 61 72 65 20 75 73 65 64 20 73 65  ents are used se
ed30: 71 75 65 6e 74 69 61 6c 6c 79 2e 0a 2a 2a 0a 2a  quentially..**.*
ed40: 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
ed50: 20 69 73 20 61 20 73 6f 72 74 20 63 6f 6d 70 61   is a sort compa
ed60: 72 69 73 6f 6e 2c 20 73 6f 20 4e 55 4c 4c 73 20  rison, so NULLs 
ed70: 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 2c 0a 2a  compare equal,.*
ed80: 2a 20 4e 55 4c 4c 73 20 61 72 65 20 6c 65 73 73  * NULLs are less
ed90: 20 74 68 61 6e 20 6e 75 6d 62 65 72 73 2c 20 6e   than numbers, n
eda0: 75 6d 62 65 72 73 20 61 72 65 20 6c 65 73 73 20  umbers are less 
edb0: 74 68 61 6e 20 73 74 72 69 6e 67 73 2c 0a 2a 2a  than strings,.**
edc0: 20 61 6e 64 20 73 74 72 69 6e 67 73 20 61 72 65   and strings are
edd0: 20 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f 62 73   less than blobs
ede0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6d  ..*/.case OP_Com
edf0: 70 61 72 65 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b  pare: {.  int n;
ee00: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
ee10: 70 31 3b 0a 20 20 69 6e 74 20 70 32 3b 0a 20 20  p1;.  int p2;.  
ee20: 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70  const KeyInfo *p
ee30: 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 69  KeyInfo;.  int i
ee40: 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  dx;.  CollSeq *p
ee50: 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c  Coll;    /* Coll
ee60: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
ee70: 6f 20 75 73 65 20 6f 6e 20 74 68 69 73 20 74 65  o use on this te
ee80: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  rm */.  int bRev
ee90: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
eea0: 75 65 20 66 6f 72 20 44 45 53 43 45 4e 44 49 4e  ue for DESCENDIN
eeb0: 47 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a  G sort order */.
eec0: 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a  .  n = pOp->p3;.
eed0: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70    pKeyInfo = pOp
eee0: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
eef0: 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a   assert( n>0 );.
ef00: 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
ef10: 66 6f 21 3d 30 20 29 3b 0a 20 20 70 31 20 3d 20  fo!=0 );.  p1 = 
ef20: 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20  pOp->p1;.  p2 = 
ef30: 70 4f 70 2d 3e 70 32 3b 0a 23 69 66 20 53 51 4c  pOp->p2;.#if SQL
ef40: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
ef50: 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20  aPermute ){.    
ef60: 69 6e 74 20 6b 2c 20 6d 78 20 3d 20 30 3b 0a 20  int k, mx = 0;. 
ef70: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 3b     for(k=0; k<n;
ef80: 20 6b 2b 2b 29 20 69 66 28 20 61 50 65 72 6d 75   k++) if( aPermu
ef90: 74 65 5b 6b 5d 3e 6d 78 20 29 20 6d 78 20 3d 20  te[k]>mx ) mx = 
efa0: 61 50 65 72 6d 75 74 65 5b 6b 5d 3b 0a 20 20 20  aPermute[k];.   
efb0: 20 61 73 73 65 72 74 28 20 70 31 3e 30 20 26 26   assert( p1>0 &&
efc0: 20 70 31 2b 6d 78 3c 3d 70 2d 3e 6e 4d 65 6d 2b   p1+mx<=p->nMem+
efd0: 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
efe0: 20 70 32 3e 30 20 26 26 20 70 32 2b 6d 78 3c 3d   p2>0 && p2+mx<=
eff0: 70 2d 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 20 20 7d  p->nMem+1 );.  }
f000: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
f010: 28 20 70 31 3e 30 20 26 26 20 70 31 2b 6e 3c 3d  ( p1>0 && p1+n<=
f020: 70 2d 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 20 20 20  p->nMem+1 );.   
f030: 20 61 73 73 65 72 74 28 20 70 32 3e 30 20 26 26   assert( p2>0 &&
f040: 20 70 32 2b 6e 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31   p2+n<=p->nMem+1
f050: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   );.  }.#endif /
f060: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
f070: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
f080: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 64 78 20  ; i++){.    idx 
f090: 3d 20 61 50 65 72 6d 75 74 65 20 3f 20 61 50 65  = aPermute ? aPe
f0a0: 72 6d 75 74 65 5b 69 5d 20 3a 20 69 3b 0a 20 20  rmute[i] : i;.  
f0b0: 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
f0c0: 61 6c 69 64 28 26 61 4d 65 6d 5b 70 31 2b 69 64  alid(&aMem[p1+id
f0d0: 78 5d 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  x]) );.    asser
f0e0: 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61  t( memIsValid(&a
f0f0: 4d 65 6d 5b 70 32 2b 69 64 78 5d 29 20 29 3b 0a  Mem[p2+idx]) );.
f100: 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
f110: 43 45 28 70 31 2b 69 64 78 2c 20 26 61 4d 65 6d  CE(p1+idx, &aMem
f120: 5b 70 31 2b 69 64 78 5d 29 3b 0a 20 20 20 20 52  [p1+idx]);.    R
f130: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 32  EGISTER_TRACE(p2
f140: 2b 69 64 78 2c 20 26 61 4d 65 6d 5b 70 32 2b 69  +idx, &aMem[p2+i
f150: 64 78 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dx]);.    assert
f160: 28 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  ( i<pKeyInfo->nF
f170: 69 65 6c 64 20 29 3b 0a 20 20 20 20 70 43 6f 6c  ield );.    pCol
f180: 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
f190: 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 62 52 65 76  oll[i];.    bRev
f1a0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f   = pKeyInfo->aSo
f1b0: 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20  rtOrder[i];.    
f1c0: 69 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74  iCompare = sqlit
f1d0: 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 61 4d  e3MemCompare(&aM
f1e0: 65 6d 5b 70 31 2b 69 64 78 5d 2c 20 26 61 4d 65  em[p1+idx], &aMe
f1f0: 6d 5b 70 32 2b 69 64 78 5d 2c 20 70 43 6f 6c 6c  m[p2+idx], pColl
f200: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6d 70  );.    if( iComp
f210: 61 72 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  are ){.      if(
f220: 20 62 52 65 76 20 29 20 69 43 6f 6d 70 61 72 65   bRev ) iCompare
f230: 20 3d 20 2d 69 43 6f 6d 70 61 72 65 3b 0a 20 20   = -iCompare;.  
f240: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f250: 0a 20 20 7d 0a 20 20 61 50 65 72 6d 75 74 65 20  .  }.  aPermute 
f260: 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  = 0;.  break;.}.
f270: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4a 75 6d 70  ./* Opcode: Jump
f280: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
f290: 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20  .** Jump to the 
f2a0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20 61  instruction at a
f2b0: 64 64 72 65 73 73 20 50 31 2c 20 50 32 2c 20 6f  ddress P1, P2, o
f2c0: 72 20 50 33 20 64 65 70 65 6e 64 69 6e 67 20 6f  r P3 depending o
f2d0: 6e 20 77 68 65 74 68 65 72 0a 2a 2a 20 69 6e 20  n whether.** in 
f2e0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
f2f0: 4f 50 5f 43 6f 6d 70 61 72 65 20 69 6e 73 74 72  OP_Compare instr
f300: 75 63 74 69 6f 6e 20 74 68 65 20 50 31 20 76 65  uction the P1 ve
f310: 63 74 6f 72 20 77 61 73 20 6c 65 73 73 20 74 68  ctor was less th
f320: 61 6e 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20  an.** equal to, 
f330: 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
f340: 74 68 65 20 50 32 20 76 65 63 74 6f 72 2c 20 72  the P2 vector, r
f350: 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a  espectively..*/.
f360: 63 61 73 65 20 4f 50 5f 4a 75 6d 70 3a 20 7b 20  case OP_Jump: { 
f370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
f380: 75 6d 70 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f  ump */.  if( iCo
f390: 6d 70 61 72 65 3c 30 20 29 7b 0a 20 20 20 20 70  mpare<0 ){.    p
f3a0: 63 20 3d 20 70 4f 70 2d 3e 70 31 20 2d 20 31 3b  c = pOp->p1 - 1;
f3b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f  .  }else if( iCo
f3c0: 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mpare==0 ){.    
f3d0: 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
f3e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
f3f0: 63 20 3d 20 70 4f 70 2d 3e 70 33 20 2d 20 31 3b  c = pOp->p3 - 1;
f400: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
f410: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 6e 64 20  ./* Opcode: And 
f420: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
f430: 2a 2a 20 54 61 6b 65 20 74 68 65 20 6c 6f 67 69  ** Take the logi
f440: 63 61 6c 20 41 4e 44 20 6f 66 20 74 68 65 20 76  cal AND of the v
f450: 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65  alues in registe
f460: 72 73 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64  rs P1 and P2 and
f470: 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 72 65  .** write the re
f480: 73 75 6c 74 20 69 6e 74 6f 20 72 65 67 69 73 74  sult into regist
f490: 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  er P3..**.** If 
f4a0: 65 69 74 68 65 72 20 50 31 20 6f 72 20 50 32 20  either P1 or P2 
f4b0: 69 73 20 30 20 28 66 61 6c 73 65 29 20 74 68 65  is 0 (false) the
f4c0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
f4d0: 30 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  0 even if.** the
f4e0: 20 6f 74 68 65 72 20 69 6e 70 75 74 20 69 73 20   other input is 
f4f0: 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c 20 61 6e  NULL.  A NULL an
f500: 64 20 74 72 75 65 20 6f 72 20 74 77 6f 20 4e 55  d true or two NU
f510: 4c 4c 73 20 67 69 76 65 0a 2a 2a 20 61 20 4e 55  LLs give.** a NU
f520: 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 2f 2a  LL output..*/./*
f530: 20 4f 70 63 6f 64 65 3a 20 4f 72 20 50 31 20 50   Opcode: Or P1 P
f540: 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  2 P3 * *.**.** T
f550: 61 6b 65 20 74 68 65 20 6c 6f 67 69 63 61 6c 20  ake the logical 
f560: 4f 52 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73  OR of the values
f570: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
f580: 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73 74  and P2 and.** st
f590: 6f 72 65 20 74 68 65 20 61 6e 73 77 65 72 20 69  ore the answer i
f5a0: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
f5b0: 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 50  *.** If either P
f5c0: 31 20 6f 72 20 50 32 20 69 73 20 6e 6f 6e 7a 65  1 or P2 is nonze
f5d0: 72 6f 20 28 74 72 75 65 29 20 74 68 65 6e 20 74  ro (true) then t
f5e0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 31 20 28  he result is 1 (
f5f0: 74 72 75 65 29 0a 2a 2a 20 65 76 65 6e 20 69 66  true).** even if
f600: 20 74 68 65 20 6f 74 68 65 72 20 69 6e 70 75 74   the other input
f610: 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c   is NULL.  A NUL
f620: 4c 20 61 6e 64 20 66 61 6c 73 65 20 6f 72 20 74  L and false or t
f630: 77 6f 20 4e 55 4c 4c 73 0a 2a 2a 20 67 69 76 65  wo NULLs.** give
f640: 20 61 20 4e 55 4c 4c 20 6f 75 74 70 75 74 2e 0a   a NULL output..
f650: 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 6e 64 3a 20  */.case OP_And: 
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f670: 73 61 6d 65 20 61 73 20 54 4b 5f 41 4e 44 2c 20  same as TK_AND, 
f680: 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a  in1, in2, out3 *
f690: 2f 0a 63 61 73 65 20 4f 50 5f 4f 72 3a 20 7b 20  /.case OP_Or: { 
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
f6b0: 61 6d 65 20 61 73 20 54 4b 5f 4f 52 2c 20 69 6e  ame as TK_OR, in
f6c0: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
f6d0: 20 20 69 6e 74 20 76 31 3b 20 20 20 20 2f 2a 20    int v1;    /* 
f6e0: 4c 65 66 74 20 6f 70 65 72 61 6e 64 3a 20 20 30  Left operand:  0
f6f0: 3d 3d 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55 45  ==FALSE, 1==TRUE
f700: 2c 20 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20  , 2==UNKNOWN or 
f710: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 76 32  NULL */.  int v2
f720: 3b 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70  ;    /* Right op
f730: 65 72 61 6e 64 3a 20 30 3d 3d 46 41 4c 53 45 2c  erand: 0==FALSE,
f740: 20 31 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e 4b   1==TRUE, 2==UNK
f750: 4e 4f 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  NOWN or NULL */.
f760: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
f770: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20  pOp->p1];.  if( 
f780: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
f790: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 76 31  M_Null ){.    v1
f7a0: 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 2;.  }else{. 
f7b0: 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56     v1 = sqlite3V
f7c0: 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31  dbeIntValue(pIn1
f7d0: 29 21 3d 30 3b 0a 20 20 7d 0a 20 20 70 49 6e 32  )!=0;.  }.  pIn2
f7e0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
f7f0: 5d 3b 0a 20 20 69 66 28 20 70 49 6e 32 2d 3e 66  ];.  if( pIn2->f
f800: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
f810: 29 7b 0a 20 20 20 20 76 32 20 3d 20 32 3b 0a 20  ){.    v2 = 2;. 
f820: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 32 20 3d   }else{.    v2 =
f830: 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56   sqlite3VdbeIntV
f840: 61 6c 75 65 28 70 49 6e 32 29 21 3d 30 3b 0a 20  alue(pIn2)!=0;. 
f850: 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70   }.  if( pOp->op
f860: 63 6f 64 65 3d 3d 4f 50 5f 41 6e 64 20 29 7b 0a  code==OP_And ){.
f870: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
f880: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
f890: 6e 64 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20 30  nd_logic[] = { 0
f8a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 32 2c  , 0, 0, 0, 1, 2,
f8b0: 20 30 2c 20 32 2c 20 32 20 7d 3b 0a 20 20 20 20   0, 2, 2 };.    
f8c0: 76 31 20 3d 20 61 6e 64 5f 6c 6f 67 69 63 5b 76  v1 = and_logic[v
f8d0: 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d 65 6c 73 65  1*3+v2];.  }else
f8e0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
f8f0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
f900: 20 6f 72 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20   or_logic[] = { 
f910: 30 2c 20 31 2c 20 32 2c 20 31 2c 20 31 2c 20 31  0, 1, 2, 1, 1, 1
f920: 2c 20 32 2c 20 31 2c 20 32 20 7d 3b 0a 20 20 20  , 2, 1, 2 };.   
f930: 20 76 31 20 3d 20 6f 72 5f 6c 6f 67 69 63 5b 76   v1 = or_logic[v
f940: 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d 0a 20 20 70  1*3+v2];.  }.  p
f950: 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
f960: 3e 70 33 5d 3b 0a 20 20 69 66 28 20 76 31 3d 3d  >p3];.  if( v1==
f970: 32 20 29 7b 0a 20 20 20 20 4d 65 6d 53 65 74 54  2 ){.    MemSetT
f980: 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45  ypeFlag(pOut, ME
f990: 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65  M_Null);.  }else
f9a0: 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20  {.    pOut->u.i 
f9b0: 3d 20 76 31 3b 0a 20 20 20 20 4d 65 6d 53 65 74  = v1;.    MemSet
f9c0: 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d  TypeFlag(pOut, M
f9d0: 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 20 20 62  EM_Int);.  }.  b
f9e0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
f9f0: 64 65 3a 20 4e 6f 74 20 50 31 20 50 32 20 2a 20  de: Not P1 P2 * 
fa00: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70  * *.**.** Interp
fa10: 72 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ret the value in
fa20: 20 72 65 67 69 73 74 65 72 20 50 31 20 61 73 20   register P1 as 
fa30: 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e  a boolean value.
fa40: 20 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20 62    Store the.** b
fa50: 6f 6f 6c 65 61 6e 20 63 6f 6d 70 6c 65 6d 65 6e  oolean complemen
fa60: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  t in register P2
fa70: 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  .  If the value 
fa80: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69  in register P1 i
fa90: 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e  s .** NULL, then
faa0: 20 61 20 4e 55 4c 4c 20 69 73 20 73 74 6f 72 65   a NULL is store
fab0: 64 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  d in P2..*/.case
fac0: 20 4f 50 5f 4e 6f 74 3a 20 7b 20 20 20 20 20 20   OP_Not: {      
fad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
fae0: 65 20 61 73 20 54 4b 5f 4e 4f 54 2c 20 69 6e 31  e as TK_NOT, in1
faf0: 2c 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31  , out2 */.  pIn1
fb00: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
fb10: 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65  ];.  pOut = &aMe
fb20: 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69 66  m[pOp->p2];.  if
fb30: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20  ( pIn1->flags & 
fb40: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
fb50: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
fb60: 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 7d  tNull(pOut);.  }
fb70: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
fb80: 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34  3VdbeMemSetInt64
fb90: 28 70 4f 75 74 2c 20 21 73 71 6c 69 74 65 33 56  (pOut, !sqlite3V
fba0: 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31  dbeIntValue(pIn1
fbb0: 29 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  ));.  }.  break;
fbc0: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42  .}../* Opcode: B
fbd0: 69 74 4e 6f 74 20 50 31 20 50 32 20 2a 20 2a 20  itNot P1 P2 * * 
fbe0: 2a 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  *.**.** Interpre
fbf0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
fc00: 20 72 65 67 69 73 74 65 72 20 50 31 20 61 73 20   register P1 as 
fc10: 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 53 74 6f  an integer.  Sto
fc20: 72 65 20 74 68 65 0a 2a 2a 20 6f 6e 65 73 2d 63  re the.** ones-c
fc30: 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  omplement of the
fc40: 20 50 31 20 76 61 6c 75 65 20 69 6e 74 6f 20 72   P1 value into r
fc50: 65 67 69 73 74 65 72 20 50 32 2e 20 20 49 66 20  egister P2.  If 
fc60: 50 31 20 68 6f 6c 64 73 0a 2a 2a 20 61 20 4e 55  P1 holds.** a NU
fc70: 4c 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 61 20  LL then store a 
fc80: 4e 55 4c 4c 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63  NULL in P2..*/.c
fc90: 61 73 65 20 4f 50 5f 42 69 74 4e 6f 74 3a 20 7b  ase OP_BitNot: {
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fcb0: 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 4e 4f  same as TK_BITNO
fcc0: 54 2c 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a  T, in1, out2 */.
fcd0: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
fce0: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20  Op->p1];.  pOut 
fcf0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
fd00: 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c  ;.  if( pIn1->fl
fd10: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
fd20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
fd30: 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74  eMemSetNull(pOut
fd40: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
fd50: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
fd60: 74 49 6e 74 36 34 28 70 4f 75 74 2c 20 7e 73 71  tInt64(pOut, ~sq
fd70: 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
fd80: 65 28 70 49 6e 31 29 29 3b 0a 20 20 7d 0a 20 20  e(pIn1));.  }.  
fd90: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
fda0: 6f 64 65 3a 20 4f 6e 63 65 20 50 31 20 50 32 20  ode: Once P1 P2 
fdb0: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  * * *.**.** Chec
fdc0: 6b 20 69 66 20 4f 50 5f 4f 6e 63 65 20 66 6c 61  k if OP_Once fla
fdd0: 67 20 50 31 20 69 73 20 73 65 74 2e 20 49 66 20  g P1 is set. If 
fde0: 73 6f 2c 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74  so, jump to inst
fdf0: 72 75 63 74 69 6f 6e 20 50 32 2e 20 4f 74 68 65  ruction P2. Othe
fe00: 72 77 69 73 65 2c 0a 2a 2a 20 73 65 74 20 74 68  rwise,.** set th
fe10: 65 20 66 6c 61 67 20 61 6e 64 20 66 61 6c 6c 20  e flag and fall 
fe20: 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
fe30: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ext instruction.
fe40: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
fe50: 20 4a 75 6d 70 4f 6e 63 65 0a 2a 2f 0a 63 61 73   JumpOnce.*/.cas
fe60: 65 20 4f 50 5f 4f 6e 63 65 3a 20 7b 20 20 20 20  e OP_Once: {    
fe70: 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
fe80: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f   */.  assert( pO
fe90: 70 2d 3e 70 31 3c 70 2d 3e 6e 4f 6e 63 65 46 6c  p->p1<p->nOnceFl
fea0: 61 67 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  ag );.  if( p->a
feb0: 4f 6e 63 65 46 6c 61 67 5b 70 4f 70 2d 3e 70 31  OnceFlag[pOp->p1
fec0: 5d 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f  ] ){.    pc = pO
fed0: 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d 65 6c 73 65  p->p2-1;.  }else
fee0: 7b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c  {.    p->aOnceFl
fef0: 61 67 5b 70 4f 70 2d 3e 70 31 5d 20 3d 20 31 3b  ag[pOp->p1] = 1;
ff00: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
ff10: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 20 50  ./* Opcode: If P
ff20: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
ff30: 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20  * Jump to P2 if 
ff40: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
ff50: 69 73 74 65 72 20 50 31 20 69 73 20 74 72 75 65  ister P1 is true
ff60: 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20  .  The value.** 
ff70: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 72  is considered tr
ff80: 75 65 20 69 66 20 69 74 20 69 73 20 6e 75 6d 65  ue if it is nume
ff90: 72 69 63 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f  ric and non-zero
ffa0: 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a  .  If the value.
ffb0: 2a 2a 20 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c  ** in P1 is NULL
ffc0: 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a   then take the j
ffd0: 75 6d 70 20 69 66 20 50 33 20 69 73 20 6e 6f 6e  ump if P3 is non
ffe0: 2d 7a 65 72 6f 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  -zero..*/./* Opc
fff0: 6f 64 65 3a 20 49 66 4e 6f 74 20 50 31 20 50 32  ode: IfNot P1 P2
10000 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75   P3 * *.**.** Ju
10010 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 20  mp to P2 if the 
10020 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
10030 72 20 50 31 20 69 73 20 46 61 6c 73 65 2e 20 20  r P1 is False.  
10040 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  The value.** is 
10050 63 6f 6e 73 69 64 65 72 65 64 20 66 61 6c 73 65  considered false
10060 20 69 66 20 69 74 20 68 61 73 20 61 20 6e 75 6d   if it has a num
10070 65 72 69 63 20 76 61 6c 75 65 20 6f 66 20 7a 65  eric value of ze
10080 72 6f 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75  ro.  If the valu
10090 65 0a 2a 2a 20 69 6e 20 50 31 20 69 73 20 4e 55  e.** in P1 is NU
100a0 4c 4c 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65  LL then take the
100b0 20 6a 75 6d 70 20 69 66 20 50 33 20 69 73 20 7a   jump if P3 is z
100c0 65 72 6f 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ero..*/.case OP_
100d0 49 66 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  If:             
100e0 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31      /* jump, in1
100f0 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 4e 6f   */.case OP_IfNo
10100 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  t: {            
10110 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a  /* jump, in1 */.
10120 20 20 69 6e 74 20 63 3b 0a 20 20 70 49 6e 31 20    int c;.  pIn1 
10130 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
10140 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c  ;.  if( pIn1->fl
10150 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
10160 7b 0a 20 20 20 20 63 20 3d 20 70 4f 70 2d 3e 70  {.    c = pOp->p
10170 33 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64  3;.  }else{.#ifd
10180 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
10190 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
101a0 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
101b0 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 21  eIntValue(pIn1)!
101c0 3d 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 20  =0;.#else.    c 
101d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 61  = sqlite3VdbeRea
101e0 6c 56 61 6c 75 65 28 70 49 6e 31 29 21 3d 30 2e  lValue(pIn1)!=0.
101f0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  0;.#endif.    if
10200 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
10210 50 5f 49 66 4e 6f 74 20 29 20 63 20 3d 20 21 63  P_IfNot ) c = !c
10220 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 20 29 7b  ;.  }.  if( c ){
10230 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70  .    pc = pOp->p
10240 32 2d 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  2-1;.  }.  break
10250 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
10260 49 73 4e 75 6c 6c 20 50 31 20 50 32 20 2a 20 2a  IsNull P1 P2 * *
10270 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f   *.**.** Jump to
10280 20 50 32 20 69 66 20 74 68 65 20 76 61 6c 75 65   P2 if the value
10290 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
102a0 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65  is NULL..*/.case
102b0 20 4f 50 5f 49 73 4e 75 6c 6c 3a 20 7b 20 20 20   OP_IsNull: {   
102c0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
102d0 20 61 73 20 54 4b 5f 49 53 4e 55 4c 4c 2c 20 6a   as TK_ISNULL, j
102e0 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49  ump, in1 */.  pI
102f0 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
10300 70 31 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31  p1];.  if( (pIn1
10310 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
10320 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 63  ll)!=0 ){.    pc
10330 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
10340 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
10350 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 4e 75  /* Opcode: NotNu
10360 6c 6c 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  ll P1 P2 * * *.*
10370 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20  *.** Jump to P2 
10380 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  if the value in 
10390 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 6e  register P1 is n
103a0 6f 74 20 4e 55 4c 4c 2e 20 20 0a 2a 2f 0a 63 61  ot NULL.  .*/.ca
103b0 73 65 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3a 20 7b  se OP_NotNull: {
103c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
103d0 61 6d 65 20 61 73 20 54 4b 5f 4e 4f 54 4e 55 4c  ame as TK_NOTNUL
103e0 4c 2c 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a  L, jump, in1 */.
103f0 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
10400 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 28  Op->p1];.  if( (
10410 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
10420 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20  M_Null)==0 ){.  
10430 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
10440 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   1;.  }.  break;
10450 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  .}../* Opcode: C
10460 6f 6c 75 6d 6e 20 50 31 20 50 32 20 50 33 20 50  olumn P1 P2 P3 P
10470 34 20 50 35 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72  4 P5.**.** Inter
10480 70 72 65 74 20 74 68 65 20 64 61 74 61 20 74 68  pret the data th
10490 61 74 20 63 75 72 73 6f 72 20 50 31 20 70 6f 69  at cursor P1 poi
104a0 6e 74 73 20 74 6f 20 61 73 20 61 20 73 74 72 75  nts to as a stru
104b0 63 74 75 72 65 20 62 75 69 6c 74 20 75 73 69 6e  cture built usin
104c0 67 0a 2a 2a 20 74 68 65 20 4d 61 6b 65 52 65 63  g.** the MakeRec
104d0 6f 72 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ord instruction.
104e0 20 20 28 53 65 65 20 74 68 65 20 4d 61 6b 65 52    (See the MakeR
104f0 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 66 6f 72  ecord opcode for
10500 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69   additional.** i
10510 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
10520 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 74   the format of t
10530 68 65 20 64 61 74 61 2e 29 20 20 45 78 74 72 61  he data.)  Extra
10540 63 74 20 74 68 65 20 50 32 2d 74 68 20 63 6f 6c  ct the P2-th col
10550 75 6d 6e 0a 2a 2a 20 66 72 6f 6d 20 74 68 69 73  umn.** from this
10560 20 72 65 63 6f 72 64 2e 20 20 49 66 20 74 68 65   record.  If the
10570 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61 74  re are less that
10580 20 28 50 32 2b 31 29 20 0a 2a 2a 20 76 61 6c 75   (P2+1) .** valu
10590 65 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  es in the record
105a0 2c 20 65 78 74 72 61 63 74 20 61 20 4e 55 4c 4c  , extract a NULL
105b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
105c0 65 20 65 78 74 72 61 63 74 65 64 20 69 73 20 73  e extracted is s
105d0 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
105e0 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  r P3..**.** If t
105f0 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  he column contai
10600 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20 50 32  ns fewer than P2
10610 20 66 69 65 6c 64 73 2c 20 74 68 65 6e 20 65 78   fields, then ex
10620 74 72 61 63 74 20 61 20 4e 55 4c 4c 2e 20 20 4f  tract a NULL.  O
10630 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 50 34 20  r,.** if the P4 
10640 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 50 34  argument is a P4
10650 5f 4d 45 4d 20 75 73 65 20 74 68 65 20 76 61 6c  _MEM use the val
10660 75 65 20 6f 66 20 74 68 65 20 50 34 20 61 72 67  ue of the P4 arg
10670 75 6d 65 6e 74 20 61 73 0a 2a 2a 20 74 68 65 20  ument as.** the 
10680 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  result..**.** If
10690 20 74 68 65 20 4f 50 46 4c 41 47 5f 43 4c 45 41   the OPFLAG_CLEA
106a0 52 43 41 43 48 45 20 62 69 74 20 69 73 20 73 65  RCACHE bit is se
106b0 74 20 6f 6e 20 50 35 20 61 6e 64 20 50 31 20 69  t on P5 and P1 i
106c0 73 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  s a pseudo-table
106d0 20 63 75 72 73 6f 72 2c 0a 2a 2a 20 74 68 65 6e   cursor,.** then
106e0 20 74 68 65 20 63 61 63 68 65 20 6f 66 20 74 68   the cache of th
106f0 65 20 63 75 72 73 6f 72 20 69 73 20 72 65 73 65  e cursor is rese
10700 74 20 70 72 69 6f 72 20 74 6f 20 65 78 74 72 61  t prior to extra
10710 63 74 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e  cting the column
10720 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 4f  ..** The first O
10730 50 5f 43 6f 6c 75 6d 6e 20 61 67 61 69 6e 73 74  P_Column against
10740 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20   a pseudo-table 
10750 61 66 74 65 72 20 74 68 65 20 76 61 6c 75 65 20  after the value 
10760 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a  of the content.*
10770 2a 20 72 65 67 69 73 74 65 72 20 68 61 73 20 63  * register has c
10780 68 61 6e 67 65 64 20 73 68 6f 75 6c 64 20 68 61  hanged should ha
10790 76 65 20 74 68 69 73 20 62 69 74 20 73 65 74 2e  ve this bit set.
107a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50  .**.** If the OP
107b0 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 61  FLAG_LENGTHARG a
107c0 6e 64 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  nd OPFLAG_TYPEOF
107d0 41 52 47 20 62 69 74 73 20 61 72 65 20 73 65 74  ARG bits are set
107e0 20 6f 6e 20 50 35 20 77 68 65 6e 0a 2a 2a 20 74   on P5 when.** t
107f0 68 65 20 72 65 73 75 6c 74 20 69 73 20 67 75 61  he result is gua
10800 72 61 6e 74 65 65 64 20 74 6f 20 6f 6e 6c 79 20  ranteed to only 
10810 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 61  be used as the a
10820 72 67 75 6d 65 6e 74 20 6f 66 20 61 20 6c 65 6e  rgument of a len
10830 67 74 68 28 29 0a 2a 2a 20 6f 72 20 74 79 70 65  gth().** or type
10840 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 2c 20 72  of() function, r
10850 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68  espectively.  Th
10860 65 20 6c 6f 61 64 69 6e 67 20 6f 66 20 6c 61 72  e loading of lar
10870 67 65 20 62 6c 6f 62 73 20 63 61 6e 20 62 65 0a  ge blobs can be.
10880 2a 2a 20 73 6b 69 70 70 65 64 20 66 6f 72 20 6c  ** skipped for l
10890 65 6e 67 74 68 28 29 20 61 6e 64 20 61 6c 6c 20  ength() and all 
108a0 63 6f 6e 74 65 6e 74 20 6c 6f 61 64 69 6e 67 20  content loading 
108b0 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 20 66  can be skipped f
108c0 6f 72 20 74 79 70 65 6f 66 28 29 2e 0a 2a 2f 0a  or typeof()..*/.
108d0 63 61 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 3a 20  case OP_Column: 
108e0 7b 0a 20 20 75 33 32 20 70 61 79 6c 6f 61 64 53  {.  u32 payloadS
108f0 69 7a 65 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ize;   /* Number
10900 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
10910 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 36 34   record */.  i64
10920 20 70 61 79 6c 6f 61 64 53 69 7a 65 36 34 3b 20   payloadSize64; 
10930 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
10940 65 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  es in the record
10950 20 2a 2f 0a 20 20 69 6e 74 20 70 31 3b 20 20 20   */.  int p1;   
10960 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 76           /* P1 v
10970 61 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f  alue of the opco
10980 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 32 3b 20  de */.  int p2; 
10990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f             /* co
109a0 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 74 6f 20 72  lumn number to r
109b0 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 56 64 62  etrieve */.  Vdb
109c0 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 20  eCursor *pC;    
109d0 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
109e0 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52  or */.  char *zR
109f0 65 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ec;        /* Po
10a00 69 6e 74 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  inter to complet
10a10 65 20 72 65 63 6f 72 64 2d 64 61 74 61 20 2a 2f  e record-data */
10a20 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72  .  BtCursor *pCr
10a30 73 72 3b 20 20 20 2f 2a 20 54 68 65 20 42 54 72  sr;   /* The BTr
10a40 65 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 75  ee cursor */.  u
10a50 33 32 20 2a 61 54 79 70 65 3b 20 20 20 20 20 20  32 *aType;      
10a60 20 20 2f 2a 20 61 54 79 70 65 5b 69 5d 20 68 6f    /* aType[i] ho
10a70 6c 64 73 20 74 68 65 20 6e 75 6d 65 72 69 63 20  lds the numeric 
10a80 74 79 70 65 20 6f 66 20 74 68 65 20 69 2d 74 68  type of the i-th
10a90 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 75 33 32   column */.  u32
10aa0 20 2a 61 4f 66 66 73 65 74 3b 20 20 20 20 20 20   *aOffset;      
10ab0 2f 2a 20 61 4f 66 66 73 65 74 5b 69 5d 20 69 73  /* aOffset[i] is
10ac0 20 6f 66 66 73 65 74 20 74 6f 20 73 74 61 72 74   offset to start
10ad0 20 6f 66 20 64 61 74 61 20 66 6f 72 20 69 2d 74   of data for i-t
10ae0 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  h column */.  in
10af0 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20  t nField;       
10b00 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 66 69   /* number of fi
10b10 65 6c 64 73 20 69 6e 20 74 68 65 20 72 65 63 6f  elds in the reco
10b20 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b  rd */.  int len;
10b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10b40 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
10b50 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
10b60 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a  for the column *
10b70 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
10b80 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
10b90 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 63 68 61 72  ounter */.  char
10ba0 20 2a 7a 44 61 74 61 3b 20 20 20 20 20 20 20 2f   *zData;       /
10bb0 2a 20 50 61 72 74 20 6f 66 20 74 68 65 20 72 65  * Part of the re
10bc0 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64  cord being decod
10bd0 65 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 44 65  ed */.  Mem *pDe
10be0 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68  st;        /* Wh
10bf0 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ere to write the
10c00 20 65 78 74 72 61 63 74 65 64 20 76 61 6c 75 65   extracted value
10c10 20 2a 2f 0a 20 20 4d 65 6d 20 73 4d 65 6d 3b 20   */.  Mem sMem; 
10c20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
10c30 73 74 6f 72 69 6e 67 20 74 68 65 20 72 65 63 6f  storing the reco
10c40 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64  rd being decoded
10c50 20 2a 2f 0a 20 20 75 38 20 2a 7a 49 64 78 3b 20   */.  u8 *zIdx; 
10c60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
10c70 78 20 69 6e 74 6f 20 68 65 61 64 65 72 20 2a 2f  x into header */
10c80 0a 20 20 75 38 20 2a 7a 45 6e 64 48 64 72 3b 20  .  u8 *zEndHdr; 
10c90 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
10ca0 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 61   to first byte a
10cb0 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 20  fter the header 
10cc0 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 3b  */.  u32 offset;
10cd0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
10ce0 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  t into the data 
10cf0 2a 2f 0a 20 20 75 33 32 20 73 7a 46 69 65 6c 64  */.  u32 szField
10d00 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
10d10 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
10d20 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 66  e content of a f
10d30 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ield */.  int sz
10d40 48 64 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Hdr;         /* 
10d50 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
10d60 65 72 20 73 69 7a 65 20 66 69 65 6c 64 20 61 74  er size field at
10d70 20 73 74 61 72 74 20 6f 66 20 72 65 63 6f 72 64   start of record
10d80 20 2a 2f 0a 20 20 69 6e 74 20 61 76 61 69 6c 3b   */.  int avail;
10d90 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10da0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
10db0 76 61 69 6c 61 62 6c 65 20 64 61 74 61 20 2a 2f  vailable data */
10dc0 0a 20 20 75 33 32 20 74 3b 20 20 20 20 20 20 20  .  u32 t;       
10dd0 20 20 20 20 20 20 2f 2a 20 41 20 74 79 70 65 20        /* A type 
10de0 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 72 65  code from the re
10df0 63 6f 72 64 20 68 65 61 64 65 72 20 2a 2f 0a 20  cord header */. 
10e00 20 4d 65 6d 20 2a 70 52 65 67 3b 20 20 20 20 20   Mem *pReg;     
10e10 20 20 20 20 2f 2a 20 50 73 65 75 64 6f 54 61 62      /* PseudoTab
10e20 6c 65 20 69 6e 70 75 74 20 72 65 67 69 73 74 65  le input registe
10e30 72 20 2a 2f 0a 0a 0a 20 20 70 31 20 3d 20 70 4f  r */...  p1 = pO
10e40 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70 4f  p->p1;.  p2 = pO
10e50 70 2d 3e 70 32 3b 0a 20 20 70 43 20 3d 20 30 3b  p->p2;.  pC = 0;
10e60 0a 20 20 6d 65 6d 73 65 74 28 26 73 4d 65 6d 2c  .  memset(&sMem,
10e70 20 30 2c 20 73 69 7a 65 6f 66 28 73 4d 65 6d 29   0, sizeof(sMem)
10e80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 3c  );.  assert( p1<
10e90 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
10ea0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
10eb0 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d  0 && pOp->p3<=p-
10ec0 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 44 65 73 74  >nMem );.  pDest
10ed0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
10ee0 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43  ];.  memAboutToC
10ef0 68 61 6e 67 65 28 70 2c 20 70 44 65 73 74 29 3b  hange(p, pDest);
10f00 0a 20 20 7a 52 65 63 20 3d 20 30 3b 0a 0a 20 20  .  zRec = 0;..  
10f10 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  /* This block se
10f20 74 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  ts the variable 
10f30 70 61 79 6c 6f 61 64 53 69 7a 65 20 74 6f 20 62  payloadSize to b
10f40 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  e the total numb
10f50 65 72 20 6f 66 0a 20 20 2a 2a 20 62 79 74 65 73  er of.  ** bytes
10f60 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 2e 0a   in the record..
10f70 20 20 2a 2a 0a 20 20 2a 2a 20 7a 52 65 63 20 69    **.  ** zRec i
10f80 73 20 73 65 74 20 74 6f 20 62 65 20 74 68 65 20  s set to be the 
10f90 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
10fa0 20 74 68 65 20 72 65 63 6f 72 64 20 69 66 20 69   the record if i
10fb0 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  t is available..
10fc0 20 20 2a 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    ** The complet
10fd0 65 20 72 65 63 6f 72 64 20 74 65 78 74 20 69 73  e record text is
10fe0 20 61 6c 77 61 79 73 20 61 76 61 69 6c 61 62 6c   always availabl
10ff0 65 20 66 6f 72 20 70 73 65 75 64 6f 2d 74 61 62  e for pseudo-tab
11000 6c 65 73 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  les.  ** If the 
11010 72 65 63 6f 72 64 20 69 73 20 73 74 6f 72 65 64  record is stored
11020 20 69 6e 20 61 20 63 75 72 73 6f 72 2c 20 74 68   in a cursor, th
11030 65 20 63 6f 6d 70 6c 65 74 65 20 72 65 63 6f 72  e complete recor
11040 64 20 74 65 78 74 0a 20 20 2a 2a 20 6d 69 67 68  d text.  ** migh
11050 74 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20 69  t be available i
11060 6e 20 74 68 65 20 20 70 43 2d 3e 61 52 6f 77 20  n the  pC->aRow 
11070 63 61 63 68 65 2e 20 20 4f 72 20 69 74 20 6d 69  cache.  Or it mi
11080 67 68 74 20 6e 6f 74 20 62 65 2e 0a 20 20 2a 2a  ght not be..  **
11090 20 49 66 20 74 68 65 20 64 61 74 61 20 69 73 20   If the data is 
110a0 75 6e 61 76 61 69 6c 61 62 6c 65 2c 20 20 7a 52  unavailable,  zR
110b0 65 63 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ec is set to NUL
110c0 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  L..  **.  ** We 
110d0 61 6c 73 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  also compute the
110e0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
110f0 6e 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ns in the record
11100 2e 20 20 46 6f 72 20 63 75 72 73 6f 72 73 2c 0a  .  For cursors,.
11110 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
11120 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 73 20 73 74  of columns is st
11130 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62 65  ored in the Vdbe
11140 43 75 72 73 6f 72 2e 6e 46 69 65 6c 64 20 65 6c  Cursor.nField el
11150 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 43  ement..  */.  pC
11160 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 31 5d 3b   = p->apCsr[p1];
11170 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
11180 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
11190 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
111a0 41 42 4c 45 0a 20 20 61 73 73 65 72 74 28 20 70  ABLE.  assert( p
111b0 43 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3d 3d  C->pVtabCursor==
111c0 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 43  0 );.#endif.  pC
111d0 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  rsr = pC->pCurso
111e0 72 3b 0a 20 20 69 66 28 20 70 43 72 73 72 21 3d  r;.  if( pCrsr!=
111f0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
11200 72 65 63 6f 72 64 20 69 73 20 73 74 6f 72 65 64  record is stored
11210 20 69 6e 20 61 20 42 2d 54 72 65 65 20 2a 2f 0a   in a B-Tree */.
11220 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11230 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
11240 28 70 43 29 3b 0a 20 20 20 20 69 66 28 20 72 63  (pC);.    if( rc
11250 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
11260 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
11270 69 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20  if( pC->nullRow 
11280 29 7b 0a 20 20 20 20 20 20 70 61 79 6c 6f 61 64  ){.      payload
11290 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Size = 0;.    }e
112a0 6c 73 65 20 69 66 28 20 70 43 2d 3e 63 61 63 68  lse if( pC->cach
112b0 65 53 74 61 74 75 73 3d 3d 70 2d 3e 63 61 63 68  eStatus==p->cach
112c0 65 43 74 72 20 29 7b 0a 20 20 20 20 20 20 70 61  eCtr ){.      pa
112d0 79 6c 6f 61 64 53 69 7a 65 20 3d 20 70 43 2d 3e  yloadSize = pC->
112e0 70 61 79 6c 6f 61 64 53 69 7a 65 3b 0a 20 20 20  payloadSize;.   
112f0 20 20 20 7a 52 65 63 20 3d 20 28 63 68 61 72 2a     zRec = (char*
11300 29 70 43 2d 3e 61 52 6f 77 3b 0a 20 20 20 20 7d  )pC->aRow;.    }
11310 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 69 73 49  else if( pC->isI
11320 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 61 73  ndex ){.      as
11330 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
11340 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
11350 70 43 72 73 72 29 20 29 3b 0a 20 20 20 20 20 20  pCrsr) );.      
11360 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73  VVA_ONLY(rc =) s
11370 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
11380 7a 65 28 70 43 72 73 72 2c 20 26 70 61 79 6c 6f  ze(pCrsr, &paylo
11390 61 64 53 69 7a 65 36 34 29 3b 0a 20 20 20 20 20  adSize64);.     
113a0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
113b0 49 54 45 5f 4f 4b 20 29 3b 20 20 20 2f 2a 20 54  ITE_OK );   /* T
113c0 72 75 65 20 62 65 63 61 75 73 65 20 6f 66 20 43  rue because of C
113d0 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29 20 63 61  ursorMoveto() ca
113e0 6c 6c 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20  ll above */.    
113f0 20 20 2f 2a 20 73 71 6c 69 74 65 33 42 74 72 65    /* sqlite3Btre
11400 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
11410 75 73 65 73 20 67 65 74 56 61 72 69 6e 74 33 32  uses getVarint32
11420 28 29 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  () to extract th
11430 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 79 6c 6f  e.      ** paylo
11440 61 64 20 73 69 7a 65 2c 20 73 6f 20 69 74 20 69  ad size, so it i
11450 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72  s impossible for
11460 20 70 61 79 6c 6f 61 64 53 69 7a 65 36 34 20 74   payloadSize64 t
11470 6f 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61  o be.      ** la
11480 72 67 65 72 20 74 68 61 6e 20 33 32 20 62 69 74  rger than 32 bit
11490 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  s. */.      asse
114a0 72 74 28 20 28 70 61 79 6c 6f 61 64 53 69 7a 65  rt( (payloadSize
114b0 36 34 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f  64 & SQLITE_MAX_
114c0 55 33 32 29 3d 3d 28 75 36 34 29 70 61 79 6c 6f  U32)==(u64)paylo
114d0 61 64 53 69 7a 65 36 34 20 29 3b 0a 20 20 20 20  adSize64 );.    
114e0 20 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20    payloadSize = 
114f0 28 75 33 32 29 70 61 79 6c 6f 61 64 53 69 7a 65  (u32)payloadSize
11500 36 34 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  64;.    }else{. 
11510 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
11520 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
11530 73 56 61 6c 69 64 28 70 43 72 73 72 29 20 29 3b  sValid(pCrsr) );
11540 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28  .      VVA_ONLY(
11550 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72  rc =) sqlite3Btr
11560 65 65 44 61 74 61 53 69 7a 65 28 70 43 72 73 72  eeDataSize(pCrsr
11570 2c 20 26 70 61 79 6c 6f 61 64 53 69 7a 65 29 3b  , &payloadSize);
11580 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
11590 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
115a0 20 20 2f 2a 20 44 61 74 61 53 69 7a 65 28 29 20    /* DataSize() 
115b0 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20  cannot fail */. 
115c0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
115d0 20 41 4c 57 41 59 53 28 70 43 2d 3e 70 73 65 75   ALWAYS(pC->pseu
115e0 64 6f 54 61 62 6c 65 52 65 67 3e 30 29 20 29 7b  doTableReg>0) ){
115f0 0a 20 20 20 20 70 52 65 67 20 3d 20 26 61 4d 65  .    pReg = &aMe
11600 6d 5b 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c  m[pC->pseudoTabl
11610 65 52 65 67 5d 3b 0a 20 20 20 20 61 73 73 65 72  eReg];.    asser
11620 74 28 20 70 52 65 67 2d 3e 66 6c 61 67 73 20 26  t( pReg->flags &
11630 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20   MEM_Blob );.   
11640 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
11650 6c 69 64 28 70 52 65 67 29 20 29 3b 0a 20 20 20  lid(pReg) );.   
11660 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 70   payloadSize = p
11670 52 65 67 2d 3e 6e 3b 0a 20 20 20 20 7a 52 65 63  Reg->n;.    zRec
11680 20 3d 20 70 52 65 67 2d 3e 7a 3b 0a 20 20 20 20   = pReg->z;.    
11690 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
116a0 3d 20 28 70 4f 70 2d 3e 70 35 26 4f 50 46 4c 41  = (pOp->p5&OPFLA
116b0 47 5f 43 4c 45 41 52 43 41 43 48 45 29 20 3f 20  G_CLEARCACHE) ? 
116c0 43 41 43 48 45 5f 53 54 41 4c 45 20 3a 20 70 2d  CACHE_STALE : p-
116d0 3e 63 61 63 68 65 43 74 72 3b 0a 20 20 20 20 61  >cacheCtr;.    a
116e0 73 73 65 72 74 28 20 70 61 79 6c 6f 61 64 53 69  ssert( payloadSi
116f0 7a 65 3d 3d 30 20 7c 7c 20 7a 52 65 63 21 3d 30  ze==0 || zRec!=0
11700 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
11710 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65   /* Consider the
11720 20 72 6f 77 20 74 6f 20 62 65 20 4e 55 4c 4c 20   row to be NULL 
11730 2a 2f 0a 20 20 20 20 70 61 79 6c 6f 61 64 53 69  */.    payloadSi
11740 7a 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ze = 0;.  }..  /
11750 2a 20 49 66 20 70 61 79 6c 6f 61 64 53 69 7a 65  * If payloadSize
11760 20 69 73 20 30 2c 20 74 68 65 6e 20 6a 75 73 74   is 0, then just
11770 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c 2e 20 20   store a NULL.  
11780 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  This can happen 
11790 62 65 63 61 75 73 65 20 6f 66 0a 20 20 2a 2a 20  because of.  ** 
117a0 6e 75 6c 6c 52 6f 77 20 6f 72 20 62 65 63 61 75  nullRow or becau
117b0 73 65 20 6f 66 20 61 20 63 6f 72 72 75 70 74 20  se of a corrupt 
117c0 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20 69  database. */.  i
117d0 66 28 20 70 61 79 6c 6f 61 64 53 69 7a 65 3d 3d  f( payloadSize==
117e0 30 20 29 7b 0a 20 20 20 20 4d 65 6d 53 65 74 54  0 ){.    MemSetT
117f0 79 70 65 46 6c 61 67 28 70 44 65 73 74 2c 20 4d  ypeFlag(pDest, M
11800 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 67 6f  EM_Null);.    go
11810 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74  to op_column_out
11820 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
11830 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
11840 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3e  E_LIMIT_LENGTH]>
11850 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 61 79 6c  =0 );.  if( payl
11860 6f 61 64 53 69 7a 65 20 3e 20 28 75 33 32 29 64  oadSize > (u32)d
11870 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
11880 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29  _LIMIT_LENGTH] )
11890 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62  {.    goto too_b
118a0 69 67 3b 0a 20 20 7d 0a 0a 20 20 6e 46 69 65 6c  ig;.  }..  nFiel
118b0 64 20 3d 20 70 43 2d 3e 6e 46 69 65 6c 64 3b 0a  d = pC->nField;.
118c0 20 20 61 73 73 65 72 74 28 20 70 32 3c 6e 46 69    assert( p2<nFi
118d0 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  eld );..  /* Rea
118e0 64 20 61 6e 64 20 70 61 72 73 65 20 74 68 65 20  d and parse the 
118f0 74 61 62 6c 65 20 68 65 61 64 65 72 2e 20 20 53  table header.  S
11900 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
11910 20 6f 66 20 74 68 65 20 70 61 72 73 65 0a 20 20   of the parse.  
11920 2a 2a 20 69 6e 74 6f 20 74 68 65 20 72 65 63 6f  ** into the reco
11930 72 64 20 68 65 61 64 65 72 20 63 61 63 68 65 20  rd header cache 
11940 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 63 75  fields of the cu
11950 72 73 6f 72 2e 0a 20 20 2a 2f 0a 20 20 61 54 79  rsor..  */.  aTy
11960 70 65 20 3d 20 70 43 2d 3e 61 54 79 70 65 3b 0a  pe = pC->aType;.
11970 20 20 69 66 28 20 70 43 2d 3e 63 61 63 68 65 53    if( pC->cacheS
11980 74 61 74 75 73 3d 3d 70 2d 3e 63 61 63 68 65 43  tatus==p->cacheC
11990 74 72 20 29 7b 0a 20 20 20 20 61 4f 66 66 73 65  tr ){.    aOffse
119a0 74 20 3d 20 70 43 2d 3e 61 4f 66 66 73 65 74 3b  t = pC->aOffset;
119b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
119c0 73 65 72 74 28 61 54 79 70 65 29 3b 0a 20 20 20  sert(aType);.   
119d0 20 61 76 61 69 6c 20 3d 20 30 3b 0a 20 20 20 20   avail = 0;.    
119e0 70 43 2d 3e 61 4f 66 66 73 65 74 20 3d 20 61 4f  pC->aOffset = aO
119f0 66 66 73 65 74 20 3d 20 26 61 54 79 70 65 5b 6e  ffset = &aType[n
11a00 46 69 65 6c 64 5d 3b 0a 20 20 20 20 70 43 2d 3e  Field];.    pC->
11a10 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 70 61  payloadSize = pa
11a20 79 6c 6f 61 64 53 69 7a 65 3b 0a 20 20 20 20 70  yloadSize;.    p
11a30 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  C->cacheStatus =
11a40 20 70 2d 3e 63 61 63 68 65 43 74 72 3b 0a 0a 20   p->cacheCtr;.. 
11a50 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
11a60 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20   how many bytes 
11a70 61 72 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  are in the heade
11a80 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 52 65  r */.    if( zRe
11a90 63 20 29 7b 0a 20 20 20 20 20 20 7a 44 61 74 61  c ){.      zData
11aa0 20 3d 20 7a 52 65 63 3b 0a 20 20 20 20 7d 65 6c   = zRec;.    }el
11ab0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  se{.      if( pC
11ac0 2d 3e 69 73 49 6e 64 65 78 20 29 7b 0a 20 20 20  ->isIndex ){.   
11ad0 20 20 20 20 20 7a 44 61 74 61 20 3d 20 28 63 68       zData = (ch
11ae0 61 72 2a 29 73 71 6c 69 74 65 33 42 74 72 65 65  ar*)sqlite3Btree
11af0 4b 65 79 46 65 74 63 68 28 70 43 72 73 72 2c 20  KeyFetch(pCrsr, 
11b00 26 61 76 61 69 6c 29 3b 0a 20 20 20 20 20 20 7d  &avail);.      }
11b10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 44  else{.        zD
11b20 61 74 61 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  ata = (char*)sql
11b30 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
11b40 63 68 28 70 43 72 73 72 2c 20 26 61 76 61 69 6c  ch(pCrsr, &avail
11b50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11b60 20 2f 2a 20 49 66 20 4b 65 79 46 65 74 63 68 28   /* If KeyFetch(
11b70 29 2f 44 61 74 61 46 65 74 63 68 28 29 20 6d 61  )/DataFetch() ma
11b80 6e 61 67 65 64 20 74 6f 20 67 65 74 20 74 68 65  naged to get the
11b90 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 2c   entire payload,
11ba0 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 65 20 74  .      ** save t
11bb0 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 20 74 68  he payload in th
11bc0 65 20 70 43 2d 3e 61 52 6f 77 20 63 61 63 68 65  e pC->aRow cache
11bd0 2e 20 20 54 68 61 74 20 77 69 6c 6c 20 73 61 76  .  That will sav
11be0 65 20 75 73 20 66 72 6f 6d 0a 20 20 20 20 20 20  e us from.      
11bf0 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 6b  ** having to mak
11c00 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 61 6c  e additional cal
11c10 6c 73 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  ls to fetch the 
11c20 63 6f 6e 74 65 6e 74 20 70 6f 72 74 69 6f 6e 20  content portion 
11c30 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
11c40 72 65 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f  record..      */
11c50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
11c60 76 61 69 6c 3e 3d 30 20 29 3b 0a 20 20 20 20 20  vail>=0 );.     
11c70 20 69 66 28 20 70 61 79 6c 6f 61 64 53 69 7a 65   if( payloadSize
11c80 20 3c 3d 20 28 75 33 32 29 61 76 61 69 6c 20 29   <= (u32)avail )
11c90 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 63 20 3d  {.        zRec =
11ca0 20 7a 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20   zData;.        
11cb0 70 43 2d 3e 61 52 6f 77 20 3d 20 28 75 38 2a 29  pC->aRow = (u8*)
11cc0 7a 44 61 74 61 3b 0a 20 20 20 20 20 20 7d 65 6c  zData;.      }el
11cd0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e  se{.        pC->
11ce0 61 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20 20  aRow = 0;.      
11cf0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 54  }.    }.    /* T
11d00 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
11d10 65 72 74 20 69 73 20 74 72 75 65 20 69 6e 20 61  ert is true in a
11d20 6c 6c 20 63 61 73 65 73 20 65 78 63 65 70 74 20  ll cases except 
11d30 77 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  when.    ** the 
11d40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
11d50 73 20 62 65 65 6e 20 63 6f 72 72 75 70 74 65 64  s been corrupted
11d60 20 65 78 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 20   externally..   
11d70 20 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 7a   **    assert( z
11d80 52 65 63 21 3d 30 20 7c 7c 20 61 76 61 69 6c 3e  Rec!=0 || avail>
11d90 3d 70 61 79 6c 6f 61 64 53 69 7a 65 20 7c 7c 20  =payloadSize || 
11da0 61 76 61 69 6c 3e 3d 39 20 29 3b 20 2a 2f 0a 20  avail>=9 ); */. 
11db0 20 20 20 73 7a 48 64 72 20 3d 20 67 65 74 56 61     szHdr = getVa
11dc0 72 69 6e 74 33 32 28 28 75 38 2a 29 7a 44 61 74  rint32((u8*)zDat
11dd0 61 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20  a, offset);..   
11de0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 20   /* Make sure a 
11df0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
11e00 20 68 61 73 20 6e 6f 74 20 67 69 76 65 6e 20 75   has not given u
11e10 73 20 61 6e 20 6f 76 65 72 73 69 7a 65 20 68 65  s an oversize he
11e20 61 64 65 72 2e 0a 20 20 20 20 2a 2a 20 44 6f 20  ader..    ** Do 
11e30 74 68 69 73 20 6e 6f 77 20 74 6f 20 61 76 6f 69  this now to avoi
11e40 64 20 61 6e 20 6f 76 65 72 73 69 7a 65 20 6d 65  d an oversize me
11e50 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  mory allocation.
11e60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
11e70 79 70 65 20 65 6e 74 72 69 65 73 20 63 61 6e 20  ype entries can 
11e80 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  be between 1 and
11e90 20 35 20 62 79 74 65 73 20 65 61 63 68 2e 20 20   5 bytes each.  
11ea0 42 75 74 20 34 20 61 6e 64 20 35 20 62 79 74 65  But 4 and 5 byte
11eb0 0a 20 20 20 20 2a 2a 20 74 79 70 65 73 20 75 73  .    ** types us
11ec0 65 20 73 6f 20 6d 75 63 68 20 64 61 74 61 20 73  e so much data s
11ed0 70 61 63 65 20 74 68 61 74 20 74 68 65 72 65 20  pace that there 
11ee0 63 61 6e 20 6f 6e 6c 79 20 62 65 20 34 30 39 36  can only be 4096
11ef0 20 61 6e 64 20 33 32 20 6f 66 0a 20 20 20 20 2a   and 32 of.    *
11f00 2a 20 74 68 65 6d 2c 20 72 65 73 70 65 63 74 69  * them, respecti
11f10 76 65 6c 79 2e 20 20 53 6f 20 74 68 65 20 6d 61  vely.  So the ma
11f20 78 69 6d 75 6d 20 68 65 61 64 65 72 20 6c 65 6e  ximum header len
11f30 67 74 68 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  gth results from
11f40 20 61 0a 20 20 20 20 2a 2a 20 33 2d 62 79 74 65   a.    ** 3-byte
11f50 20 74 79 70 65 20 66 6f 72 20 65 61 63 68 20 6f   type for each o
11f60 66 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  f the maximum of
11f70 20 33 32 37 36 38 20 63 6f 6c 75 6d 6e 73 20 70   32768 columns p
11f80 6c 75 73 20 74 68 72 65 65 0a 20 20 20 20 2a 2a  lus three.    **
11f90 20 65 78 74 72 61 20 62 79 74 65 73 20 66 6f 72   extra bytes for
11fa0 20 74 68 65 20 68 65 61 64 65 72 20 6c 65 6e 67   the header leng
11fb0 74 68 20 69 74 73 65 6c 66 2e 20 20 33 32 37 36  th itself.  3276
11fc0 38 2a 33 20 2b 20 33 20 3d 20 39 38 33 30 37 2e  8*3 + 3 = 98307.
11fd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11fe0 6f 66 66 73 65 74 20 3e 20 39 38 33 30 37 20 29  offset > 98307 )
11ff0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
12000 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
12010 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f  ;.      goto op_
12020 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20 20  column_out;.    
12030 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  }..    /* Comput
12040 65 20 69 6e 20 6c 65 6e 20 74 68 65 20 6e 75 6d  e in len the num
12050 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
12060 64 61 74 61 20 77 65 20 6e 65 65 64 20 74 6f 20  data we need to 
12070 72 65 61 64 20 69 6e 20 6f 72 64 65 72 0a 20 20  read in order.  
12080 20 20 2a 2a 20 74 6f 20 67 65 74 20 6e 46 69 65    ** to get nFie
12090 6c 64 20 74 79 70 65 20 76 61 6c 75 65 73 2e 20  ld type values. 
120a0 20 6f 66 66 73 65 74 20 69 73 20 61 6e 20 75 70   offset is an up
120b0 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 69  per bound on thi
120c0 73 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 6e  s.  But.    ** n
120d0 46 69 65 6c 64 20 6d 69 67 68 74 20 62 65 20 73  Field might be s
120e0 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 6c 65 73  ignificantly les
120f0 73 20 74 68 61 6e 20 74 68 65 20 74 72 75 65 20  s than the true 
12100 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
12110 73 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  s.    ** in the 
12120 74 61 62 6c 65 2c 20 61 6e 64 20 69 6e 20 74 68  table, and in th
12130 61 74 20 63 61 73 65 2c 20 35 2a 6e 46 69 65 6c  at case, 5*nFiel
12140 64 2b 33 20 6d 69 67 68 74 20 62 65 20 73 6d 61  d+3 might be sma
12150 6c 6c 65 72 20 74 68 61 6e 20 6f 66 66 73 65 74  ller than offset
12160 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 61 6e 74  ..    ** We want
12170 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 6c 65 6e   to minimize len
12180 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6c 69 6d   in order to lim
12190 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  it the size of t
121a0 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  he memory.    **
121b0 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 65 73 70   allocation, esp
121c0 65 63 69 61 6c 6c 79 20 69 66 20 61 20 63 6f 72  ecially if a cor
121d0 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
121e0 6c 65 20 68 61 73 20 63 61 75 73 65 64 20 6f 66  le has caused of
121f0 66 73 65 74 0a 20 20 20 20 2a 2a 20 74 6f 20 62  fset.    ** to b
12200 65 20 6f 76 65 72 73 69 7a 65 64 2e 20 4f 66 66  e oversized. Off
12210 73 65 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74  set is limited t
12220 6f 20 39 38 33 30 37 20 61 62 6f 76 65 2e 20 20  o 98307 above.  
12230 42 75 74 20 39 38 33 30 37 20 6d 69 67 68 74 0a  But 98307 might.
12240 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 65 78 63      ** still exc
12250 65 65 64 20 52 6f 62 73 6f 6e 20 6d 65 6d 6f 72  eed Robson memor
12260 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6c 69 6d  y allocation lim
12270 69 74 73 20 6f 6e 20 73 6f 6d 65 20 63 6f 6e 66  its on some conf
12280 69 67 75 72 61 74 69 6f 6e 73 2e 0a 20 20 20 20  igurations..    
12290 2a 2a 20 4f 6e 20 73 79 73 74 65 6d 73 20 74 68  ** On systems th
122a0 61 74 20 63 61 6e 6e 6f 74 20 74 6f 6c 65 72 61  at cannot tolera
122b0 74 65 20 6c 61 72 67 65 20 6d 65 6d 6f 72 79 20  te large memory 
122c0 61 6c 6c 6f 63 61 74 69 6f 6e 73 2c 20 6e 46 69  allocations, nFi
122d0 65 6c 64 2a 35 2b 33 0a 20 20 20 20 2a 2a 20 77  eld*5+3.    ** w
122e0 69 6c 6c 20 6c 69 6b 65 6c 79 20 62 65 20 6d 75  ill likely be mu
122f0 63 68 20 73 6d 61 6c 6c 65 72 20 73 69 6e 63 65  ch smaller since
12300 20 6e 46 69 65 6c 64 20 77 69 6c 6c 20 6c 69 6b   nField will lik
12310 65 6c 79 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ely be less than
12320 0a 20 20 20 20 2a 2a 20 32 30 20 6f 72 20 73 6f  .    ** 20 or so
12330 2e 20 20 54 68 69 73 20 69 6e 73 75 72 65 73 20  .  This insures 
12340 74 68 61 74 20 52 6f 62 73 6f 6e 20 6d 65 6d 6f  that Robson memo
12350 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6c 69  ry allocation li
12360 6d 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  mits are.    ** 
12370 6e 6f 74 20 65 78 63 65 65 64 65 64 20 65 76 65  not exceeded eve
12380 6e 20 66 6f 72 20 63 6f 72 72 75 70 74 20 64 61  n for corrupt da
12390 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 20 20  tabase files..  
123a0 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 6e    */.    len = n
123b0 46 69 65 6c 64 2a 35 20 2b 20 33 3b 0a 20 20 20  Field*5 + 3;.   
123c0 20 69 66 28 20 6c 65 6e 20 3e 20 28 69 6e 74 29   if( len > (int)
123d0 6f 66 66 73 65 74 20 29 20 6c 65 6e 20 3d 20 28  offset ) len = (
123e0 69 6e 74 29 6f 66 66 73 65 74 3b 0a 0a 20 20 20  int)offset;..   
123f0 20 2f 2a 20 54 68 65 20 4b 65 79 46 65 74 63 68   /* The KeyFetch
12400 28 29 20 6f 72 20 44 61 74 61 46 65 74 63 68 28  () or DataFetch(
12410 29 20 61 62 6f 76 65 20 61 72 65 20 66 61 73 74  ) above are fast
12420 20 61 6e 64 20 77 69 6c 6c 20 67 65 74 20 74 68   and will get th
12430 65 20 65 6e 74 69 72 65 0a 20 20 20 20 2a 2a 20  e entire.    ** 
12440 72 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e  record header in
12450 20 6d 6f 73 74 20 63 61 73 65 73 2e 20 20 42 75   most cases.  Bu
12460 74 20 74 68 65 79 20 77 69 6c 6c 20 66 61 69 6c  t they will fail
12470 20 74 6f 20 67 65 74 20 74 68 65 20 63 6f 6d 70   to get the comp
12480 6c 65 74 65 0a 20 20 20 20 2a 2a 20 72 65 63 6f  lete.    ** reco
12490 72 64 20 68 65 61 64 65 72 20 69 66 20 74 68 65  rd header if the
124a0 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20 64   record header d
124b0 6f 65 73 20 6e 6f 74 20 66 69 74 20 6f 6e 20 61  oes not fit on a
124c0 20 73 69 6e 67 6c 65 20 70 61 67 65 0a 20 20 20   single page.   
124d0 20 2a 2a 20 69 6e 20 74 68 65 20 42 2d 54 72 65   ** in the B-Tre
124e0 65 2e 20 20 57 68 65 6e 20 74 68 61 74 20 68 61  e.  When that ha
124f0 70 70 65 6e 73 2c 20 75 73 65 20 73 71 6c 69 74  ppens, use sqlit
12500 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
12510 65 65 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 61  ee() to.    ** a
12520 63 71 75 69 72 65 20 74 68 65 20 63 6f 6d 70 6c  cquire the compl
12530 65 74 65 20 68 65 61 64 65 72 20 74 65 78 74 2e  ete header text.
12540 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12550 21 7a 52 65 63 20 26 26 20 61 76 61 69 6c 3c 6c  !zRec && avail<l
12560 65 6e 20 29 7b 0a 20 20 20 20 20 20 73 4d 65 6d  en ){.      sMem
12570 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  .flags = 0;.    
12580 20 20 73 4d 65 6d 2e 64 62 20 3d 20 30 3b 0a 20    sMem.db = 0;. 
12590 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
125a0 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
125b0 65 28 70 43 72 73 72 2c 20 30 2c 20 6c 65 6e 2c  e(pCrsr, 0, len,
125c0 20 70 43 2d 3e 69 73 49 6e 64 65 78 2c 20 26 73   pC->isIndex, &s
125d0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Mem);.      if( 
125e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
125f0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  .        goto op
12600 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20  _column_out;.   
12610 20 20 20 7d 0a 20 20 20 20 20 20 7a 44 61 74 61     }.      zData
12620 20 3d 20 73 4d 65 6d 2e 7a 3b 0a 20 20 20 20 7d   = sMem.z;.    }
12630 0a 20 20 20 20 7a 45 6e 64 48 64 72 20 3d 20 28  .    zEndHdr = (
12640 75 38 20 2a 29 26 7a 44 61 74 61 5b 6c 65 6e 5d  u8 *)&zData[len]
12650 3b 0a 20 20 20 20 7a 49 64 78 20 3d 20 28 75 38  ;.    zIdx = (u8
12660 20 2a 29 26 7a 44 61 74 61 5b 73 7a 48 64 72 5d   *)&zData[szHdr]
12670 3b 0a 0a 20 20 20 20 2f 2a 20 53 63 61 6e 20 74  ;..    /* Scan t
12680 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 75 73  he header and us
12690 65 20 69 74 20 74 6f 20 66 69 6c 6c 20 69 6e 20  e it to fill in 
126a0 74 68 65 20 61 54 79 70 65 5b 5d 20 61 6e 64 20  the aType[] and 
126b0 61 4f 66 66 73 65 74 5b 5d 0a 20 20 20 20 2a 2a  aOffset[].    **
126c0 20 61 72 72 61 79 73 2e 20 20 61 54 79 70 65 5b   arrays.  aType[
126d0 69 5d 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  i] will contain 
126e0 74 68 65 20 74 79 70 65 20 69 6e 74 65 67 65 72  the type integer
126f0 20 66 6f 72 20 74 68 65 20 69 2d 74 68 0a 20 20   for the i-th.  
12700 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 61 6e 64 20    ** column and 
12710 61 4f 66 66 73 65 74 5b 69 5d 20 77 69 6c 6c 20  aOffset[i] will 
12720 63 6f 6e 74 61 69 6e 20 74 68 65 20 6f 66 66 73  contain the offs
12730 65 74 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  et from the begi
12740 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20  nning.    ** of 
12750 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 74 68  the record to th
12760 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 64  e start of the d
12770 61 74 61 20 66 6f 72 20 74 68 65 20 69 2d 74 68  ata for the i-th
12780 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20   column.    */. 
12790 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46     for(i=0; i<nF
127a0 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ield; i++){.    
127b0 20 20 69 66 28 20 7a 49 64 78 3c 7a 45 6e 64 48    if( zIdx<zEndH
127c0 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4f  dr ){.        aO
127d0 66 66 73 65 74 5b 69 5d 20 3d 20 6f 66 66 73 65  ffset[i] = offse
127e0 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  t;.        if( z
127f0 49 64 78 5b 30 5d 3c 30 78 38 30 20 29 7b 0a 20  Idx[0]<0x80 ){. 
12800 20 20 20 20 20 20 20 20 20 74 20 3d 20 7a 49 64           t = zId
12810 78 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  x[0];.          
12820 7a 49 64 78 2b 2b 3b 0a 20 20 20 20 20 20 20 20  zIdx++;.        
12830 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12840 20 7a 49 64 78 20 2b 3d 20 73 71 6c 69 74 65 33   zIdx += sqlite3
12850 47 65 74 56 61 72 69 6e 74 33 32 28 7a 49 64 78  GetVarint32(zIdx
12860 2c 20 26 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  , &t);.        }
12870 0a 20 20 20 20 20 20 20 20 61 54 79 70 65 5b 69  .        aType[i
12880 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 73  ] = t;.        s
12890 7a 46 69 65 6c 64 20 3d 20 73 71 6c 69 74 65 33  zField = sqlite3
128a0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
128b0 6e 28 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  n(t);.        of
128c0 66 73 65 74 20 2b 3d 20 73 7a 46 69 65 6c 64 3b  fset += szField;
128d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 66 66  .        if( off
128e0 73 65 74 3c 73 7a 46 69 65 6c 64 20 29 7b 20 20  set<szField ){  
128f0 2f 2a 20 54 72 75 65 20 69 66 20 6f 66 66 73 65  /* True if offse
12900 74 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  t overflows */. 
12910 20 20 20 20 20 20 20 20 20 7a 49 64 78 20 3d 20           zIdx = 
12920 26 7a 45 6e 64 48 64 72 5b 31 5d 3b 20 20 2f 2a  &zEndHdr[1];  /*
12930 20 46 6f 72 63 65 73 20 53 51 4c 49 54 45 5f 43   Forces SQLITE_C
12940 4f 52 52 55 50 54 20 72 65 74 75 72 6e 20 62 65  ORRUPT return be
12950 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  low */.         
12960 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
12970 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
12980 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 20 69         /* If i i
12990 73 20 6c 65 73 73 20 74 68 61 74 20 6e 46 69 65  s less that nFie
129a0 6c 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 61  ld, then there a
129b0 72 65 20 66 65 77 65 72 20 66 69 65 6c 64 73 20  re fewer fields 
129c0 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  in this.        
129d0 2a 2a 20 72 65 63 6f 72 64 20 74 68 61 6e 20 53  ** record than S
129e0 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20 69 6e 64  etNumColumns ind
129f0 69 63 61 74 65 64 20 74 68 65 72 65 20 61 72 65  icated there are
12a00 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
12a10 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
12a20 2e 20 53 65 74 20 74 68 65 20 6f 66 66 73 65 74  . Set the offset
12a30 20 66 6f 72 20 61 6e 79 20 65 78 74 72 61 20 63   for any extra c
12a40 6f 6c 75 6d 6e 73 20 6e 6f 74 20 70 72 65 73 65  olumns not prese
12a50 6e 74 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  nt in.        **
12a60 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 30   the record to 0
12a70 2e 20 54 68 69 73 20 74 65 6c 6c 73 20 63 6f 64  . This tells cod
12a80 65 20 62 65 6c 6f 77 20 74 6f 20 73 74 6f 72 65  e below to store
12a90 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
12aa0 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  ue.        ** fo
12ab0 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 73  r the column ins
12ac0 74 65 61 64 20 6f 66 20 64 65 73 65 72 69 61 6c  tead of deserial
12ad0 69 7a 69 6e 67 20 61 20 76 61 6c 75 65 20 66 72  izing a value fr
12ae0 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 0a 20  om the record.. 
12af0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
12b00 20 20 61 4f 66 66 73 65 74 5b 69 5d 20 3d 20 30    aOffset[i] = 0
12b10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12b20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
12b30 65 6d 52 65 6c 65 61 73 65 28 26 73 4d 65 6d 29  emRelease(&sMem)
12b40 3b 0a 20 20 20 20 73 4d 65 6d 2e 66 6c 61 67 73  ;.    sMem.flags
12b50 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 0a 20 20   = MEM_Null;..  
12b60 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
12b70 72 65 61 64 20 6d 6f 72 65 20 68 65 61 64 65 72  read more header
12b80 20 64 61 74 61 20 74 68 61 6e 20 77 61 73 20 63   data than was c
12b90 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
12ba0 68 65 61 64 65 72 2c 0a 20 20 20 20 2a 2a 20 6f  header,.    ** o
12bb0 72 20 69 66 20 74 68 65 20 65 6e 64 20 6f 66 20  r if the end of 
12bc0 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 61  the last field a
12bd0 70 70 65 61 72 73 20 74 6f 20 62 65 20 70 61 73  ppears to be pas
12be0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
12bf0 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2c 20  .    ** record, 
12c00 6f 72 20 69 66 20 74 68 65 20 65 6e 64 20 6f 66  or if the end of
12c10 20 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20   the last field 
12c20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 62 65  appears to be be
12c30 66 6f 72 65 20 74 68 65 20 65 6e 64 0a 20 20 20  fore the end.   
12c40 20 2a 2a 20 6f 66 20 74 68 65 20 72 65 63 6f 72   ** of the recor
12c50 64 20 28 77 68 65 6e 20 61 6c 6c 20 66 69 65 6c  d (when all fiel
12c60 64 73 20 70 72 65 73 65 6e 74 29 2c 20 74 68 65  ds present), the
12c70 6e 20 77 65 20 6d 75 73 74 20 62 65 20 64 65 61  n we must be dea
12c80 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 77 69 74  ling .    ** wit
12c90 68 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  h a corrupt data
12ca0 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  base..    */.   
12cb0 20 69 66 28 20 28 7a 49 64 78 20 3e 20 7a 45 6e   if( (zIdx > zEn
12cc0 64 48 64 72 29 20 7c 7c 20 28 6f 66 66 73 65 74  dHdr) || (offset
12cd0 20 3e 20 70 61 79 6c 6f 61 64 53 69 7a 65 29 0a   > payloadSize).
12ce0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 7a 49 64           || (zId
12cf0 78 3d 3d 7a 45 6e 64 48 64 72 20 26 26 20 6f 66  x==zEndHdr && of
12d00 66 73 65 74 21 3d 70 61 79 6c 6f 61 64 53 69 7a  fset!=payloadSiz
12d10 65 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  e) ){.      rc =
12d20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
12d30 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
12d40 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a   op_column_out;.
12d50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12d60 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  Get the column i
12d70 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 49 66 20 61  nformation. If a
12d80 4f 66 66 73 65 74 5b 70 32 5d 20 69 73 20 6e 6f  Offset[p2] is no
12d90 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 0a 20 20  n-zero, then .  
12da0 2a 2a 20 64 65 73 65 72 69 61 6c 69 7a 65 20 74  ** deserialize t
12db0 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
12dc0 65 20 72 65 63 6f 72 64 2e 20 49 66 20 61 4f 66  e record. If aOf
12dd0 66 73 65 74 5b 70 32 5d 20 69 73 20 7a 65 72 6f  fset[p2] is zero
12de0 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72  ,.  ** then ther
12df0 65 20 61 72 65 20 6e 6f 74 20 65 6e 6f 75 67 68  e are not enough
12e00 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 72   fields in the r
12e10 65 63 6f 72 64 20 74 6f 20 73 61 74 69 73 66 79  ecord to satisfy
12e20 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73   the.  ** reques
12e30 74 2e 20 20 49 6e 20 74 68 69 73 20 63 61 73 65  t.  In this case
12e40 2c 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  , set the value 
12e50 4e 55 4c 4c 20 6f 72 20 74 6f 20 50 34 20 69 66  NULL or to P4 if
12e60 20 50 34 20 69 73 0a 20 20 2a 2a 20 61 20 70 6f   P4 is.  ** a po
12e70 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 20 6f  inter to a Mem o
12e80 62 6a 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  bject..  */.  if
12e90 28 20 61 4f 66 66 73 65 74 5b 70 32 5d 20 29 7b  ( aOffset[p2] ){
12ea0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
12eb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
12ec0 20 20 69 66 28 20 7a 52 65 63 20 29 7b 0a 20 20    if( zRec ){.  
12ed0 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
12ee0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
12ef0 68 65 72 65 20 74 68 65 20 77 68 6f 6c 65 20 72  here the whole r
12f00 6f 77 20 66 69 74 73 20 6f 6e 20 61 20 73 69 6e  ow fits on a sin
12f10 67 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  gle page */.    
12f20 20 20 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65    VdbeMemRelease
12f30 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 73  (pDest);.      s
12f40 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
12f50 47 65 74 28 28 75 38 20 2a 29 26 7a 52 65 63 5b  Get((u8 *)&zRec[
12f60 61 4f 66 66 73 65 74 5b 70 32 5d 5d 2c 20 61 54  aOffset[p2]], aT
12f70 79 70 65 5b 70 32 5d 2c 20 70 44 65 73 74 29 3b  ype[p2], pDest);
12f80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12f90 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
12fa0 20 68 61 70 70 65 6e 73 20 6f 6e 6c 79 20 77 68   happens only wh
12fb0 65 6e 20 74 68 65 20 72 6f 77 20 6f 76 65 72 66  en the row overf
12fc0 6c 6f 77 73 20 6f 6e 74 6f 20 6d 75 6c 74 69 70  lows onto multip
12fd0 6c 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20  le pages */.    
12fe0 20 20 74 20 3d 20 61 54 79 70 65 5b 70 32 5d 3b    t = aType[p2];
12ff0 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f 70 2d  .      if( (pOp-
13000 3e 70 35 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45  >p5 & (OPFLAG_LE
13010 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54  NGTHARG|OPFLAG_T
13020 59 50 45 4f 46 41 52 47 29 29 21 3d 30 0a 20 20  YPEOFARG))!=0.  
13030 20 20 20 20 20 26 26 20 28 28 74 3e 3d 31 32 20       && ((t>=12 
13040 26 26 20 28 74 26 31 29 3d 3d 30 29 20 7c 7c 20  && (t&1)==0) || 
13050 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41  (pOp->p5 & OPFLA
13060 47 5f 54 59 50 45 4f 46 41 52 47 29 21 3d 30 29  G_TYPEOFARG)!=0)
13070 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
13080 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 69 73 20    /* Content is 
13090 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 74  irrelevant for t
130a0 68 65 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63  he typeof() func
130b0 74 69 6f 6e 20 61 6e 64 20 66 6f 72 0a 20 20 20  tion and for.   
130c0 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 6e 67       ** the leng
130d0 74 68 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69  th(X) function i
130e0 66 20 58 20 69 73 20 61 20 62 6c 6f 62 2e 20 20  f X is a blob.  
130f0 53 6f 20 77 65 20 6d 69 67 68 74 20 61 73 20 77  So we might as w
13100 65 6c 6c 20 75 73 65 0a 20 20 20 20 20 20 20 20  ell use.        
13110 2a 2a 20 62 6f 67 75 73 20 63 6f 6e 74 65 6e 74  ** bogus content
13120 20 72 61 74 68 65 72 20 74 68 61 6e 20 72 65 61   rather than rea
13130 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ding content fro
13140 6d 20 64 69 73 6b 2e 20 20 4e 55 4c 4c 20 77 6f  m disk.  NULL wo
13150 72 6b 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  rks.        ** f
13160 6f 72 20 74 65 78 74 20 61 6e 64 20 62 6c 6f 62  or text and blob
13170 20 61 6e 64 20 77 68 61 74 65 76 65 72 20 69 73   and whatever is
13180 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 53   in the payloadS
13190 69 7a 65 36 34 20 76 61 72 69 61 62 6c 65 0a 20  ize64 variable. 
131a0 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 77         ** will w
131b0 6f 72 6b 20 66 6f 72 20 65 76 65 72 79 74 68 69  ork for everythi
131c0 6e 67 20 65 6c 73 65 2e 20 2a 2f 0a 20 20 20 20  ng else. */.    
131d0 20 20 20 20 7a 44 61 74 61 20 3d 20 74 3c 31 32      zData = t<12
131e0 20 3f 20 28 63 68 61 72 2a 29 26 70 61 79 6c 6f   ? (char*)&paylo
131f0 61 64 53 69 7a 65 36 34 20 3a 20 30 3b 0a 20 20  adSize64 : 0;.  
13200 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13210 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33     len = sqlite3
13220 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
13230 6e 28 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n(t);.        sq
13240 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65  lite3VdbeMemMove
13250 28 26 73 4d 65 6d 2c 20 70 44 65 73 74 29 3b 0a  (&sMem, pDest);.
13260 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13270 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
13280 74 72 65 65 28 70 43 72 73 72 2c 20 61 4f 66 66  tree(pCrsr, aOff
13290 73 65 74 5b 70 32 5d 2c 20 6c 65 6e 2c 20 20 70  set[p2], len,  p
132a0 43 2d 3e 69 73 49 6e 64 65 78 2c 0a 20 20 20 20  C->isIndex,.    
132b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132d0 20 26 73 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20   &sMem);.       
132e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
132f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
13300 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f  goto op_column_o
13310 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
13320 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 73 4d        zData = sM
13330 65 6d 2e 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20  em.z;.      }.  
13340 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
13350 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 7a 44  erialGet((u8*)zD
13360 61 74 61 2c 20 74 2c 20 70 44 65 73 74 29 3b 0a  ata, t, pDest);.
13370 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73 74 2d      }.    pDest-
13380 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b  >enc = encoding;
13390 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
133a0 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
133b0 34 5f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73  4_MEM ){.      s
133c0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
133d0 6c 6c 6f 77 43 6f 70 79 28 70 44 65 73 74 2c 20  llowCopy(pDest, 
133e0 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 2c 20 4d 45  pOp->p4.pMem, ME
133f0 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 7d  M_Static);.    }
13400 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65 6d 53  else{.      MemS
13410 65 74 54 79 70 65 46 6c 61 67 28 70 44 65 73 74  etTypeFlag(pDest
13420 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
13430 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
13440 77 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61  we dynamically a
13450 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20 74  llocated space t
13460 6f 20 68 6f 6c 64 20 74 68 65 20 64 61 74 61 20  o hold the data 
13470 28 69 6e 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  (in the.  ** sql
13480 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
13490 74 72 65 65 28 29 20 63 61 6c 6c 20 61 62 6f 76  tree() call abov
134a0 65 29 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  e) then transfer
134b0 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 74 68 61 74   control of that
134c0 0a 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c  .  ** dynamicall
134d0 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  y allocated spac
134e0 65 20 6f 76 65 72 20 74 6f 20 74 68 65 20 70 44  e over to the pD
134f0 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 20  est structure.. 
13500 20 2a 2a 20 54 68 69 73 20 70 72 65 76 65 6e 74   ** This prevent
13510 73 20 61 20 6d 65 6d 6f 72 79 20 63 6f 70 79 2e  s a memory copy.
13520 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 4d 65 6d  .  */.  if( sMem
13530 2e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  .zMalloc ){.    
13540 61 73 73 65 72 74 28 20 73 4d 65 6d 2e 7a 3d 3d  assert( sMem.z==
13550 73 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63 20 29 3b 0a  sMem.zMalloc );.
13560 20 20 20 20 61 73 73 65 72 74 28 20 21 28 70 44      assert( !(pD
13570 65 73 74 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  est->flags & MEM
13580 5f 44 79 6e 29 20 29 3b 0a 20 20 20 20 61 73 73  _Dyn) );.    ass
13590 65 72 74 28 20 21 28 70 44 65 73 74 2d 3e 66 6c  ert( !(pDest->fl
135a0 61 67 73 20 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c  ags & (MEM_Blob|
135b0 4d 45 4d 5f 53 74 72 29 29 20 7c 7c 20 70 44 65  MEM_Str)) || pDe
135c0 73 74 2d 3e 7a 3d 3d 73 4d 65 6d 2e 7a 20 29 3b  st->z==sMem.z );
135d0 0a 20 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67  .    pDest->flag
135e0 73 20 26 3d 20 7e 28 4d 45 4d 5f 45 70 68 65 6d  s &= ~(MEM_Ephem
135f0 7c 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20  |MEM_Static);.  
13600 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 7c    pDest->flags |
13610 3d 20 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  = MEM_Term;.    
13620 70 44 65 73 74 2d 3e 7a 20 3d 20 73 4d 65 6d 2e  pDest->z = sMem.
13630 7a 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 7a 4d  z;.    pDest->zM
13640 61 6c 6c 6f 63 20 3d 20 73 4d 65 6d 2e 7a 4d 61  alloc = sMem.zMa
13650 6c 6c 6f 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  lloc;.  }..  rc 
13660 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
13670 4d 61 6b 65 57 72 69 74 65 61 62 6c 65 28 70 44  MakeWriteable(pD
13680 65 73 74 29 3b 0a 0a 6f 70 5f 63 6f 6c 75 6d 6e  est);..op_column
13690 5f 6f 75 74 3a 0a 20 20 55 50 44 41 54 45 5f 4d  _out:.  UPDATE_M
136a0 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 44 65 73  AX_BLOBSIZE(pDes
136b0 74 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54  t);.  REGISTER_T
136c0 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 44  RACE(pOp->p3, pD
136d0 65 73 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  est);.  break;.}
136e0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 66 66  ../* Opcode: Aff
136f0 69 6e 69 74 79 20 50 31 20 50 32 20 2a 20 50 34  inity P1 P2 * P4
13700 20 2a 0a 2a 2a 0a 2a 2a 20 41 70 70 6c 79 20 61   *.**.** Apply a
13710 66 66 69 6e 69 74 69 65 73 20 74 6f 20 61 20 72  ffinities to a r
13720 61 6e 67 65 20 6f 66 20 50 32 20 72 65 67 69 73  ange of P2 regis
13730 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69  ters starting wi
13740 74 68 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20  th P1..**.** P4 
13750 69 73 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  is a string that
13760 20 69 73 20 50 32 20 63 68 61 72 61 63 74 65 72   is P2 character
13770 73 20 6c 6f 6e 67 2e 20 54 68 65 20 6e 74 68 20  s long. The nth 
13780 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
13790 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 64 69 63  .** string indic
137a0 61 74 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  ates the column 
137b0 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
137c0 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
137d0 20 74 68 65 20 6e 74 68 0a 2a 2a 20 6d 65 6d 6f   the nth.** memo
137e0 72 79 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 72  ry cell in the r
137f0 61 6e 67 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ange..*/.case OP
13800 5f 41 66 66 69 6e 69 74 79 3a 20 7b 0a 20 20 63  _Affinity: {.  c
13810 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 66 66 69  onst char *zAffi
13820 6e 69 74 79 3b 20 20 20 2f 2a 20 54 68 65 20 61  nity;   /* The a
13830 66 66 69 6e 69 74 79 20 74 6f 20 62 65 20 61 70  ffinity to be ap
13840 70 6c 69 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  plied */.  char 
13850 63 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  cAff;           
13860 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
13870 63 68 61 72 61 63 74 65 72 20 6f 66 20 61 66 66  character of aff
13880 69 6e 69 74 79 20 2a 2f 0a 0a 20 20 7a 41 66 66  inity */..  zAff
13890 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34 2e  inity = pOp->p4.
138a0 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66  z;.  assert( zAf
138b0 66 69 6e 69 74 79 21 3d 30 20 29 3b 0a 20 20 61  finity!=0 );.  a
138c0 73 73 65 72 74 28 20 7a 41 66 66 69 6e 69 74 79  ssert( zAffinity
138d0 5b 70 4f 70 2d 3e 70 32 5d 3d 3d 30 20 29 3b 0a  [pOp->p2]==0 );.
138e0 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
138f0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 77 68 69 6c 65  Op->p1];.  while
13900 28 20 28 63 41 66 66 20 3d 20 2a 28 7a 41 66 66  ( (cAff = *(zAff
13910 69 6e 69 74 79 2b 2b 29 29 21 3d 30 20 29 7b 0a  inity++))!=0 ){.
13920 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 31      assert( pIn1
13930 20 3c 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 2d 3e   <= &p->aMem[p->
13940 6e 4d 65 6d 5d 20 29 3b 0a 20 20 20 20 61 73 73  nMem] );.    ass
13950 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
13960 70 49 6e 31 29 20 29 3b 0a 20 20 20 20 45 78 70  pIn1) );.    Exp
13970 61 6e 64 42 6c 6f 62 28 70 49 6e 31 29 3b 0a 20  andBlob(pIn1);. 
13980 20 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79     applyAffinity
13990 28 70 49 6e 31 2c 20 63 41 66 66 2c 20 65 6e 63  (pIn1, cAff, enc
139a0 6f 64 69 6e 67 29 3b 0a 20 20 20 20 70 49 6e 31  oding);.    pIn1
139b0 2b 2b 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  ++;.  }.  break;
139c0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d  .}../* Opcode: M
139d0 61 6b 65 52 65 63 6f 72 64 20 50 31 20 50 32 20  akeRecord P1 P2 
139e0 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f  P3 P4 *.**.** Co
139f0 6e 76 65 72 74 20 50 32 20 72 65 67 69 73 74 65  nvert P2 registe
13a00 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  rs beginning wit
13a10 68 20 50 31 20 69 6e 74 6f 20 74 68 65 20 5b 72  h P1 into the [r
13a20 65 63 6f 72 64 20 66 6f 72 6d 61 74 5d 0a 2a 2a  ecord format].**
13a30 20 75 73 65 20 61 73 20 61 20 64 61 74 61 20 72   use as a data r
13a40 65 63 6f 72 64 20 69 6e 20 61 20 64 61 74 61 62  ecord in a datab
13a50 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 73 20  ase table or as 
13a60 61 20 6b 65 79 0a 2a 2a 20 69 6e 20 61 6e 20 69  a key.** in an i
13a70 6e 64 65 78 2e 20 20 54 68 65 20 4f 50 5f 43 6f  ndex.  The OP_Co
13a80 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 63 61 6e 20  lumn opcode can 
13a90 64 65 63 6f 64 65 20 74 68 65 20 72 65 63 6f 72  decode the recor
13aa0 64 20 6c 61 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 50  d later..**.** P
13ab0 34 20 6d 61 79 20 62 65 20 61 20 73 74 72 69 6e  4 may be a strin
13ac0 67 20 74 68 61 74 20 69 73 20 50 32 20 63 68 61  g that is P2 cha
13ad0 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20 20 54  racters long.  T
13ae0 68 65 20 6e 74 68 20 63 68 61 72 61 63 74 65 72  he nth character
13af0 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e   of the.** strin
13b00 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  g indicates the 
13b10 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  column affinity 
13b20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75  that should be u
13b30 73 65 64 20 66 6f 72 20 74 68 65 20 6e 74 68 0a  sed for the nth.
13b40 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
13b50 69 6e 64 65 78 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  index key..**.**
13b60 20 54 68 65 20 6d 61 70 70 69 6e 67 20 66 72 6f   The mapping fro
13b70 6d 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 61  m character to a
13b80 66 66 69 6e 69 74 79 20 69 73 20 67 69 76 65 6e  ffinity is given
13b90 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 41   by the SQLITE_A
13ba0 46 46 5f 0a 2a 2a 20 6d 61 63 72 6f 73 20 64 65  FF_.** macros de
13bb0 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
13bc0 6e 74 2e 68 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  nt.h..**.** If P
13bd0 34 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  4 is NULL then a
13be0 6c 6c 20 69 6e 64 65 78 20 66 69 65 6c 64 73 20  ll index fields 
13bf0 68 61 76 65 20 74 68 65 20 61 66 66 69 6e 69 74  have the affinit
13c00 79 20 4e 4f 4e 45 2e 0a 2a 2f 0a 63 61 73 65 20  y NONE..*/.case 
13c10 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 3a 20 7b  OP_MakeRecord: {
13c20 0a 20 20 75 38 20 2a 7a 4e 65 77 52 65 63 6f 72  .  u8 *zNewRecor
13c30 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62  d;        /* A b
13c40 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
13c50 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 6e  e data for the n
13c60 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d  ew record */.  M
13c70 65 6d 20 2a 70 52 65 63 3b 20 20 20 20 20 20 20  em *pRec;       
13c80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
13c90 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 75 36 34   record */.  u64
13ca0 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20   nData;         
13cb0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13cc0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 73   bytes of data s
13cd0 70 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48  pace */.  int nH
13ce0 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
13cf0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
13d00 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 70  tes of header sp
13d10 61 63 65 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79  ace */.  i64 nBy
13d20 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
13d30 2f 2a 20 44 61 74 61 20 73 70 61 63 65 20 72 65  /* Data space re
13d40 71 75 69 72 65 64 20 66 6f 72 20 74 68 69 73 20  quired for this 
13d50 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
13d60 6e 5a 65 72 6f 3b 20 20 20 20 20 20 20 20 20 20  nZero;          
13d70 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13d80 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68  zero bytes at th
13d90 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 63  e end of the rec
13da0 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  ord */.  int nVa
13db0 72 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rint;           
13dc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
13dd0 65 73 20 69 6e 20 61 20 76 61 72 69 6e 74 20 2a  es in a varint *
13de0 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
13df0 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 79  ype;       /* Ty
13e00 70 65 20 66 69 65 6c 64 20 2a 2f 0a 20 20 4d 65  pe field */.  Me
13e10 6d 20 2a 70 44 61 74 61 30 3b 20 20 20 20 20 20  m *pData0;      
13e20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66 69       /* First fi
13e30 65 6c 64 20 74 6f 20 62 65 20 63 6f 6d 62 69 6e  eld to be combin
13e40 65 64 20 69 6e 74 6f 20 74 68 65 20 72 65 63 6f  ed into the reco
13e50 72 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4c 61  rd */.  Mem *pLa
13e60 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
13e70 2a 20 4c 61 73 74 20 66 69 65 6c 64 20 6f 66 20  * Last field of 
13e80 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
13e90 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20  int nField;     
13ea0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
13eb0 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74 68   of fields in th
13ec0 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68  e record */.  ch
13ed0 61 72 20 2a 7a 41 66 66 69 6e 69 74 79 3b 20 20  ar *zAffinity;  
13ee0 20 20 20 20 20 2f 2a 20 54 68 65 20 61 66 66 69       /* The affi
13ef0 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20  nity string for 
13f00 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
13f10 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3b  int file_format;
13f20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 66         /* File f
13f30 6f 72 6d 61 74 20 74 6f 20 75 73 65 20 66 6f 72  ormat to use for
13f40 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69   encoding */.  i
13f50 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
13f60 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 75        /* Space u
13f70 73 65 64 20 69 6e 20 7a 4e 65 77 52 65 63 6f 72  sed in zNewRecor
13f80 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e  d[] */.  int len
13f90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13fa0 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 61 20 66  /* Length of a f
13fb0 69 65 6c 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 73  ield */..  /* As
13fc0 73 75 6d 69 6e 67 20 74 68 65 20 72 65 63 6f 72  suming the recor
13fd0 64 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65  d contains N fie
13fe0 6c 64 73 2c 20 74 68 65 20 72 65 63 6f 72 64 20  lds, the record 
13ff0 66 6f 72 6d 61 74 20 6c 6f 6f 6b 73 0a 20 20 2a  format looks.  *
14000 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a  * like this:.  *
14010 2a 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.  ** ---------
14020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
14060 20 20 2a 2a 20 7c 20 68 64 72 2d 73 69 7a 65 20    ** | hdr-size 
14070 7c 20 74 79 70 65 20 30 20 7c 20 74 79 70 65 20  | type 0 | type 
14080 31 20 7c 20 2e 2e 2e 20 7c 20 74 79 70 65 20 4e  1 | ... | type N
14090 2d 31 20 7c 20 64 61 74 61 30 20 7c 20 2e 2e 2e  -1 | data0 | ...
140a0 20 7c 20 64 61 74 61 20 4e 2d 31 20 7c 20 0a 20   | data N-1 | . 
140b0 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ** ------------
140c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
140d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
140e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
140f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a  ------------.  *
14100 2a 0a 20 20 2a 2a 20 44 61 74 61 28 30 29 20 69  *.  ** Data(0) i
14110 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67  s taken from reg
14120 69 73 74 65 72 20 50 31 2e 20 20 44 61 74 61 28  ister P1.  Data(
14130 31 29 20 63 6f 6d 65 73 20 66 72 6f 6d 20 72 65  1) comes from re
14140 67 69 73 74 65 72 20 50 31 2b 31 0a 20 20 2a 2a  gister P1+1.  **
14150 20 61 6e 64 20 73 6f 20 66 72 6f 74 68 2e 0a 20   and so froth.. 
14160 20 2a 2a 0a 20 20 2a 2a 20 45 61 63 68 20 74 79   **.  ** Each ty
14170 70 65 20 66 69 65 6c 64 20 69 73 20 61 20 76 61  pe field is a va
14180 72 69 6e 74 20 72 65 70 72 65 73 65 6e 74 69 6e  rint representin
14190 67 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  g the serial typ
141a0 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 63  e of the .  ** c
141b0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74  orresponding dat
141c0 61 20 65 6c 65 6d 65 6e 74 20 28 73 65 65 20 73  a element (see s
141d0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
141e0 54 79 70 65 28 29 29 2e 20 54 68 65 0a 20 20 2a  Type()). The.  *
141f0 2a 20 68 64 72 2d 73 69 7a 65 20 66 69 65 6c 64  * hdr-size field
14200 20 69 73 20 61 6c 73 6f 20 61 20 76 61 72 69 6e   is also a varin
14210 74 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6f  t which is the o
14220 66 66 73 65 74 20 66 72 6f 6d 20 74 68 65 20 62  ffset from the b
14230 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66  eginning.  ** of
14240 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 64   the record to d
14250 61 74 61 30 2e 0a 20 20 2a 2f 0a 20 20 6e 44 61  ata0..  */.  nDa
14260 74 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ta = 0;         
14270 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
14280 65 73 20 6f 66 20 64 61 74 61 20 73 70 61 63 65  es of data space
14290 20 2a 2f 0a 20 20 6e 48 64 72 20 3d 20 30 3b 20   */.  nHdr = 0; 
142a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
142b0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 68  er of bytes of h
142c0 65 61 64 65 72 20 73 70 61 63 65 20 2a 2f 0a 20  eader space */. 
142d0 20 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20   nZero = 0;     
142e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
142f0 20 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74   zero bytes at t
14300 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65  he end of the re
14310 63 6f 72 64 20 2a 2f 0a 20 20 6e 46 69 65 6c 64  cord */.  nField
14320 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 41   = pOp->p1;.  zA
14330 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70  ffinity = pOp->p
14340 34 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  4.z;.  assert( n
14350 46 69 65 6c 64 3e 30 20 26 26 20 70 4f 70 2d 3e  Field>0 && pOp->
14360 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b  p2>0 && pOp->p2+
14370 6e 46 69 65 6c 64 3c 3d 70 2d 3e 6e 4d 65 6d 2b  nField<=p->nMem+
14380 31 20 29 3b 0a 20 20 70 44 61 74 61 30 20 3d 20  1 );.  pData0 = 
14390 26 61 4d 65 6d 5b 6e 46 69 65 6c 64 5d 3b 0a 20  &aMem[nField];. 
143a0 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70   nField = pOp->p
143b0 32 3b 0a 20 20 70 4c 61 73 74 20 3d 20 26 70 44  2;.  pLast = &pD
143c0 61 74 61 30 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a  ata0[nField-1];.
143d0 20 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20    file_format = 
143e0 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
143f0 6f 72 6d 61 74 3b 0a 0a 20 20 2f 2a 20 49 64 65  ormat;..  /* Ide
14400 6e 74 69 66 79 20 74 68 65 20 6f 75 74 70 75 74  ntify the output
14410 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 61   register */.  a
14420 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70  ssert( pOp->p3<p
14430 4f 70 2d 3e 70 31 20 7c 7c 20 70 4f 70 2d 3e 70  Op->p1 || pOp->p
14440 33 3e 3d 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e  3>=pOp->p1+pOp->
14450 70 32 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26  p2 );.  pOut = &
14460 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
14470 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
14480 65 28 70 2c 20 70 4f 75 74 29 3b 0a 0a 20 20 2f  e(p, pOut);..  /
14490 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  * Loop through t
144a0 68 65 20 65 6c 65 6d 65 6e 74 73 20 74 68 61 74  he elements that
144b0 20 77 69 6c 6c 20 6d 61 6b 65 20 75 70 20 74 68   will make up th
144c0 65 20 72 65 63 6f 72 64 20 74 6f 20 66 69 67 75  e record to figu
144d0 72 65 0a 20 20 2a 2a 20 6f 75 74 20 68 6f 77 20  re.  ** out how 
144e0 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65  much space is re
144f0 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 6e  quired for the n
14500 65 77 20 72 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a  ew record..  */.
14510 20 20 66 6f 72 28 70 52 65 63 3d 70 44 61 74 61    for(pRec=pData
14520 30 3b 20 70 52 65 63 3c 3d 70 4c 61 73 74 3b 20  0; pRec<=pLast; 
14530 70 52 65 63 2b 2b 29 7b 0a 20 20 20 20 61 73 73  pRec++){.    ass
14540 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
14550 70 52 65 63 29 20 29 3b 0a 20 20 20 20 69 66 28  pRec) );.    if(
14560 20 7a 41 66 66 69 6e 69 74 79 20 29 7b 0a 20 20   zAffinity ){.  
14570 20 20 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74      applyAffinit
14580 79 28 70 52 65 63 2c 20 7a 41 66 66 69 6e 69 74  y(pRec, zAffinit
14590 79 5b 70 52 65 63 2d 70 44 61 74 61 30 5d 2c 20  y[pRec-pData0], 
145a0 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 7d  encoding);.    }
145b0 0a 20 20 20 20 69 66 28 20 70 52 65 63 2d 3e 66  .    if( pRec->f
145c0 6c 61 67 73 26 4d 45 4d 5f 5a 65 72 6f 20 26 26  lags&MEM_Zero &&
145d0 20 70 52 65 63 2d 3e 6e 3e 30 20 29 7b 0a 20 20   pRec->n>0 ){.  
145e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
145f0 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28 70 52 65  emExpandBlob(pRe
14600 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65  c);.    }.    se
14610 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69  rial_type = sqli
14620 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
14630 65 28 70 52 65 63 2c 20 66 69 6c 65 5f 66 6f 72  e(pRec, file_for
14640 6d 61 74 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  mat);.    len = 
14650 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
14660 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
14670 74 79 70 65 29 3b 0a 20 20 20 20 6e 44 61 74 61  type);.    nData
14680 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 6e 48 64   += len;.    nHd
14690 72 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69  r += sqlite3Vari
146a0 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  ntLen(serial_typ
146b0 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 63  e);.    if( pRec
146c0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
146d0 72 6f 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  ro ){.      /* O
146e0 6e 6c 79 20 70 75 72 65 20 7a 65 72 6f 2d 66 69  nly pure zero-fi
146f0 6c 6c 65 64 20 42 4c 4f 42 73 20 63 61 6e 20 62  lled BLOBs can b
14700 65 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20  e input to this 
14710 4f 70 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2a  Opcode..      **
14720 20 57 65 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77   We do not allow
14730 20 62 6c 6f 62 73 20 77 69 74 68 20 61 20 70 72   blobs with a pr
14740 65 66 69 78 20 61 6e 64 20 61 20 7a 65 72 6f 2d  efix and a zero-
14750 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 2a 2f 0a  filled tail. */.
14760 20 20 20 20 20 20 6e 5a 65 72 6f 20 2b 3d 20 70        nZero += p
14770 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Rec->u.nZero;.  
14780 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 6e 20    }else if( len 
14790 29 7b 0a 20 20 20 20 20 20 6e 5a 65 72 6f 20 3d  ){.      nZero =
147a0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
147b0 20 2f 2a 20 41 64 64 20 74 68 65 20 69 6e 69 74   /* Add the init
147c0 69 61 6c 20 68 65 61 64 65 72 20 76 61 72 69 6e  ial header varin
147d0 74 20 61 6e 64 20 74 6f 74 61 6c 20 74 68 65 20  t and total the 
147e0 73 69 7a 65 20 2a 2f 0a 20 20 6e 48 64 72 20 2b  size */.  nHdr +
147f0 3d 20 6e 56 61 72 69 6e 74 20 3d 20 73 71 6c 69  = nVarint = sqli
14800 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 6e 48 64  te3VarintLen(nHd
14810 72 29 3b 0a 20 20 69 66 28 20 6e 56 61 72 69 6e  r);.  if( nVarin
14820 74 3c 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c  t<sqlite3VarintL
14830 65 6e 28 6e 48 64 72 29 20 29 7b 0a 20 20 20 20  en(nHdr) ){.    
14840 6e 48 64 72 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 42  nHdr++;.  }.  nB
14850 79 74 65 20 3d 20 6e 48 64 72 2b 6e 44 61 74 61  yte = nHdr+nData
14860 2d 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 6e 42  -nZero;.  if( nB
14870 79 74 65 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  yte>db->aLimit[S
14880 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
14890 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  TH] ){.    goto 
148a0 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a 20 20  too_big;.  }..  
148b0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
148c0 20 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72   output register
148d0 20 68 61 73 20 61 20 62 75 66 66 65 72 20 6c 61   has a buffer la
148e0 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 73 74  rge enough to st
148f0 6f 72 65 20 0a 20 20 2a 2a 20 74 68 65 20 6e 65  ore .  ** the ne
14900 77 20 72 65 63 6f 72 64 2e 20 54 68 65 20 6f 75  w record. The ou
14910 74 70 75 74 20 72 65 67 69 73 74 65 72 20 28 70  tput register (p
14920 4f 70 2d 3e 70 33 29 20 69 73 20 6e 6f 74 20 61  Op->p3) is not a
14930 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 2a 2a 20 62  llowed to.  ** b
14940 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 70  e one of the inp
14950 75 74 20 72 65 67 69 73 74 65 72 73 20 28 62 65  ut registers (be
14960 63 61 75 73 65 20 74 68 65 20 66 6f 6c 6c 6f 77  cause the follow
14970 69 6e 67 20 63 61 6c 6c 20 74 6f 0a 20 20 2a 2a  ing call to.  **
14980 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
14990 72 6f 77 28 29 20 63 6f 75 6c 64 20 63 6c 6f 62  row() could clob
149a0 62 65 72 20 74 68 65 20 76 61 6c 75 65 20 62 65  ber the value be
149b0 66 6f 72 65 20 69 74 20 69 73 20 75 73 65 64 29  fore it is used)
149c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
149d0 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
149e0 70 4f 75 74 2c 20 28 69 6e 74 29 6e 42 79 74 65  pOut, (int)nByte
149f0 2c 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  , 0) ){.    goto
14a00 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 7a   no_mem;.  }.  z
14a10 4e 65 77 52 65 63 6f 72 64 20 3d 20 28 75 38 20  NewRecord = (u8 
14a20 2a 29 70 4f 75 74 2d 3e 7a 3b 0a 0a 20 20 2f 2a  *)pOut->z;..  /*
14a30 20 57 72 69 74 65 20 74 68 65 20 72 65 63 6f 72   Write the recor
14a40 64 20 2a 2f 0a 20 20 69 20 3d 20 70 75 74 56 61  d */.  i = putVa
14a50 72 69 6e 74 33 32 28 7a 4e 65 77 52 65 63 6f 72  rint32(zNewRecor
14a60 64 2c 20 6e 48 64 72 29 3b 0a 20 20 66 6f 72 28  d, nHdr);.  for(
14a70 70 52 65 63 3d 70 44 61 74 61 30 3b 20 70 52 65  pRec=pData0; pRe
14a80 63 3c 3d 70 4c 61 73 74 3b 20 70 52 65 63 2b 2b  c<=pLast; pRec++
14a90 29 7b 0a 20 20 20 20 73 65 72 69 61 6c 5f 74 79  ){.    serial_ty
14aa0 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pe = sqlite3Vdbe
14ab0 53 65 72 69 61 6c 54 79 70 65 28 70 52 65 63 2c  SerialType(pRec,
14ac0 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20   file_format);. 
14ad0 20 20 20 69 20 2b 3d 20 70 75 74 56 61 72 69 6e     i += putVarin
14ae0 74 33 32 28 26 7a 4e 65 77 52 65 63 6f 72 64 5b  t32(&zNewRecord[
14af0 69 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  i], serial_type)
14b00 3b 20 20 20 20 20 20 2f 2a 20 73 65 72 69 61 6c  ;      /* serial
14b10 20 74 79 70 65 20 2a 2f 0a 20 20 7d 0a 20 20 66   type */.  }.  f
14b20 6f 72 28 70 52 65 63 3d 70 44 61 74 61 30 3b 20  or(pRec=pData0; 
14b30 70 52 65 63 3c 3d 70 4c 61 73 74 3b 20 70 52 65  pRec<=pLast; pRe
14b40 63 2b 2b 29 7b 20 20 2f 2a 20 73 65 72 69 61 6c  c++){  /* serial
14b50 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 69 20 2b   data */.    i +
14b60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
14b70 69 61 6c 50 75 74 28 26 7a 4e 65 77 52 65 63 6f  ialPut(&zNewReco
14b80 72 64 5b 69 5d 2c 20 28 69 6e 74 29 28 6e 42 79  rd[i], (int)(nBy
14b90 74 65 2d 69 29 2c 20 70 52 65 63 2c 66 69 6c 65  te-i), pRec,file
14ba0 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 7d 0a 20 20  _format);.  }.  
14bb0 61 73 73 65 72 74 28 20 69 3d 3d 6e 42 79 74 65  assert( i==nByte
14bc0 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
14bd0 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d  Op->p3>0 && pOp-
14be0 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a  >p3<=p->nMem );.
14bf0 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 28 69 6e 74    pOut->n = (int
14c00 29 6e 42 79 74 65 3b 0a 20 20 70 4f 75 74 2d 3e  )nByte;.  pOut->
14c10 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62  flags = MEM_Blob
14c20 20 7c 20 4d 45 4d 5f 44 79 6e 3b 0a 20 20 70 4f   | MEM_Dyn;.  pO
14c30 75 74 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20  ut->xDel = 0;.  
14c40 69 66 28 20 6e 5a 65 72 6f 20 29 7b 0a 20 20 20  if( nZero ){.   
14c50 20 70 4f 75 74 2d 3e 75 2e 6e 5a 65 72 6f 20 3d   pOut->u.nZero =
14c60 20 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4f 75 74   nZero;.    pOut
14c70 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 5a  ->flags |= MEM_Z
14c80 65 72 6f 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d  ero;.  }.  pOut-
14c90 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
14ca0 46 38 3b 20 20 2f 2a 20 49 6e 20 63 61 73 65 20  F8;  /* In case 
14cb0 74 68 65 20 62 6c 6f 62 20 69 73 20 65 76 65 72  the blob is ever
14cc0 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 74 65   converted to te
14cd0 78 74 20 2a 2f 0a 20 20 52 45 47 49 53 54 45 52  xt */.  REGISTER
14ce0 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20  _TRACE(pOp->p3, 
14cf0 70 4f 75 74 29 3b 0a 20 20 55 50 44 41 54 45 5f  pOut);.  UPDATE_
14d00 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75  MAX_BLOBSIZE(pOu
14d10 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
14d20 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 75 6e 74  /* Opcode: Count
14d30 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
14d40 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 6e 75 6d  ** Store the num
14d50 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 28  ber of entries (
14d60 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
14d70 29 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  ) in the table o
14d80 72 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 70 65 6e  r index .** open
14d90 65 64 20 62 79 20 63 75 72 73 6f 72 20 50 31 20  ed by cursor P1 
14da0 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a  in register P2.*
14db0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
14dc0 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
14dd0 0a 63 61 73 65 20 4f 50 5f 43 6f 75 6e 74 3a 20  .case OP_Count: 
14de0 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74  {         /* out
14df0 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a  2-prerelease */.
14e00 20 20 69 36 34 20 6e 45 6e 74 72 79 3b 0a 20 20    i64 nEntry;.  
14e10 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
14e20 0a 0a 20 20 70 43 72 73 72 20 3d 20 70 2d 3e 61  ..  pCrsr = p->a
14e30 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 70  pCsr[pOp->p1]->p
14e40 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 41 4c  Cursor;.  if( AL
14e50 57 41 59 53 28 70 43 72 73 72 29 20 29 7b 0a 20  WAYS(pCrsr) ){. 
14e60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
14e70 74 72 65 65 43 6f 75 6e 74 28 70 43 72 73 72 2c  treeCount(pCrsr,
14e80 20 26 6e 45 6e 74 72 79 29 3b 0a 20 20 7d 65 6c   &nEntry);.  }el
14e90 73 65 7b 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d  se{.    nEntry =
14ea0 20 30 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e   0;.  }.  pOut->
14eb0 75 2e 69 20 3d 20 6e 45 6e 74 72 79 3b 0a 20 20  u.i = nEntry;.  
14ec0 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  break;.}.#endif.
14ed0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 61 76 65  ./* Opcode: Save
14ee0 70 6f 69 6e 74 20 50 31 20 2a 20 2a 20 50 34 20  point P1 * * P4 
14ef0 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 2c 20 72 65  *.**.** Open, re
14f00 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
14f10 6b 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  k the savepoint 
14f20 6e 61 6d 65 64 20 62 79 20 70 61 72 61 6d 65 74  named by paramet
14f30 65 72 20 50 34 2c 20 64 65 70 65 6e 64 69 6e 67  er P4, depending
14f40 0a 2a 2a 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  .** on the value
14f50 20 6f 66 20 50 31 2e 20 54 6f 20 6f 70 65 6e 20   of P1. To open 
14f60 61 20 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 2c  a new savepoint,
14f70 20 50 31 3d 3d 30 2e 20 54 6f 20 72 65 6c 65 61   P1==0. To relea
14f80 73 65 20 28 63 6f 6d 6d 69 74 29 20 61 6e 0a 2a  se (commit) an.*
14f90 2a 20 65 78 69 73 74 69 6e 67 20 73 61 76 65 70  * existing savep
14fa0 6f 69 6e 74 2c 20 50 31 3d 3d 31 2c 20 6f 72 20  oint, P1==1, or 
14fb0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 65  to rollback an e
14fc0 78 69 73 74 69 6e 67 20 73 61 76 65 70 6f 69 6e  xisting savepoin
14fd0 74 20 50 31 3d 3d 32 2e 0a 2a 2f 0a 63 61 73 65  t P1==2..*/.case
14fe0 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b   OP_Savepoint: {
14ff0 0a 20 20 69 6e 74 20 70 31 3b 20 20 20 20 20 20  .  int p1;      
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15010 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 50     /* Value of P
15020 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  1 operand */.  c
15030 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
15040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15050 2a 20 4e 61 6d 65 20 6f 66 20 73 61 76 65 70 6f  * Name of savepo
15060 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  int */.  int nNa
15070 6d 65 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20  me;.  Savepoint 
15080 2a 70 4e 65 77 3b 0a 20 20 53 61 76 65 70 6f 69  *pNew;.  Savepoi
15090 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 3b 0a  nt *pSavepoint;.
150a0 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d    Savepoint *pTm
150b0 70 3b 0a 20 20 69 6e 74 20 69 53 61 76 65 70 6f  p;.  int iSavepo
150c0 69 6e 74 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a  int;.  int ii;..
150d0 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a    p1 = pOp->p1;.
150e0 20 20 7a 4e 61 6d 65 20 3d 20 70 4f 70 2d 3e 70    zName = pOp->p
150f0 34 2e 7a 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  4.z;..  /* Asser
15100 74 20 74 68 61 74 20 74 68 65 20 70 31 20 70 61  t that the p1 pa
15110 72 61 6d 65 74 65 72 20 69 73 20 76 61 6c 69 64  rameter is valid
15120 2e 20 41 6c 73 6f 20 74 68 61 74 20 69 66 20 74  . Also that if t
15130 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 0a  here is no open.
15140 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
15150 2c 20 74 68 65 6e 20 74 68 65 72 65 20 63 61 6e  , then there can
15160 6e 6f 74 20 62 65 20 61 6e 79 20 73 61 76 65 70  not be any savep
15170 6f 69 6e 74 73 2e 20 0a 20 20 2a 2f 0a 20 20 61  oints. .  */.  a
15180 73 73 65 72 74 28 20 64 62 2d 3e 70 53 61 76 65  ssert( db->pSave
15190 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e  point==0 || db->
151a0 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 3b  autoCommit==0 );
151b0 0a 20 20 61 73 73 65 72 74 28 20 70 31 3d 3d 53  .  assert( p1==S
151c0 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 7c 7c  AVEPOINT_BEGIN||
151d0 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  p1==SAVEPOINT_RE
151e0 4c 45 41 53 45 7c 7c 70 31 3d 3d 53 41 56 45 50  LEASE||p1==SAVEP
151f0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
15200 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
15210 53 61 76 65 70 6f 69 6e 74 20 7c 7c 20 64 62 2d  Savepoint || db-
15220 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
15230 76 65 70 6f 69 6e 74 3d 3d 30 20 29 3b 0a 20 20  vepoint==0 );.  
15240 61 73 73 65 72 74 28 20 63 68 65 63 6b 53 61 76  assert( checkSav
15250 65 70 6f 69 6e 74 43 6f 75 6e 74 28 64 62 29 20  epointCount(db) 
15260 29 3b 0a 0a 20 20 69 66 28 20 70 31 3d 3d 53 41  );..  if( p1==SA
15270 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 29 7b  VEPOINT_BEGIN ){
15280 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 77 72 69  .    if( db->wri
15290 74 65 56 64 62 65 43 6e 74 3e 30 20 29 7b 0a 20  teVdbeCnt>0 ){. 
152a0 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 61       /* A new sa
152b0 76 65 70 6f 69 6e 74 20 63 61 6e 6e 6f 74 20 62  vepoint cannot b
152c0 65 20 63 72 65 61 74 65 64 20 69 66 20 74 68 65  e created if the
152d0 72 65 20 61 72 65 20 61 63 74 69 76 65 20 77 72  re are active wr
152e0 69 74 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 74  ite .      ** st
152f0 61 74 65 6d 65 6e 74 73 20 28 69 2e 65 2e 20 6f  atements (i.e. o
15300 70 65 6e 20 72 65 61 64 2f 77 72 69 74 65 20 69  pen read/write i
15310 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
15320 68 61 6e 64 6c 65 73 29 2e 0a 20 20 20 20 20 20  handles)..      
15330 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
15340 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
15350 72 72 4d 73 67 2c 20 64 62 2c 20 22 63 61 6e 6e  rrMsg, db, "cann
15360 6f 74 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ot open savepoin
15370 74 20 2d 20 22 0a 20 20 20 20 20 20 20 20 22 53  t - ".        "S
15380 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  QL statements in
15390 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20 20   progress");.   
153a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
153b0 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  USY;.    }else{.
153c0 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71        nName = sq
153d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
153e0 61 6d 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ame);..#ifndef S
153f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
15400 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a  ALTABLE.      /*
15410 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 4f 6b   This call is Ok
15420 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 73 61   even if this sa
15430 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 75 61  vepoint is actua
15440 6c 6c 79 20 61 20 74 72 61 6e 73 61 63 74 69 6f  lly a transactio
15450 6e 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 65 70  n.      ** savep
15460 6f 69 6e 74 20 28 61 6e 64 20 74 68 65 72 65 66  oint (and theref
15470 6f 72 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 70  ore should not p
15480 72 6f 6d 70 74 20 78 53 61 76 65 70 6f 69 6e 74  rompt xSavepoint
15490 28 29 29 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ()) callbacks.. 
154a0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
154b0 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
154c0 20 73 61 76 65 70 6f 69 6e 74 20 62 65 69 6e 67   savepoint being
154d0 20 6f 70 65 6e 65 64 2c 20 69 74 20 69 73 20 67   opened, it is g
154e0 75 61 72 61 6e 74 65 65 64 0a 20 20 20 20 20 20  uaranteed.      
154f0 2a 2a 20 74 68 61 74 20 74 68 65 20 64 62 2d 3e  ** that the db->
15500 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 20  aVTrans[] array 
15510 69 73 20 65 6d 70 74 79 2e 20 20 2a 2f 0a 20 20  is empty.  */.  
15520 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
15530 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c  autoCommit==0 ||
15540 20 64 62 2d 3e 6e 56 54 72 61 6e 73 3d 3d 30 20   db->nVTrans==0 
15550 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
15560 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
15570 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
15580 5f 42 45 47 49 4e 2c 0a 20 20 20 20 20 20 20 20  _BEGIN,.        
15590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155a0 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61          db->nSta
155b0 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65  tement+db->nSave
155c0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  point);.      if
155d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
155e0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
155f0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23 65 6e 64 69  _to_error;.#endi
15600 66 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  f..      /* Crea
15610 74 65 20 61 20 6e 65 77 20 73 61 76 65 70 6f 69  te a new savepoi
15620 6e 74 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  nt structure. */
15630 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
15640 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
15650 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 61 76 65  (db, sizeof(Save
15660 70 6f 69 6e 74 29 2b 6e 4e 61 6d 65 2b 31 29 3b  point)+nName+1);
15670 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
15680 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
15690 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a  >zName = (char *
156a0 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20  )&pNew[1];.     
156b0 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e     memcpy(pNew->
156c0 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  zName, zName, nN
156d0 61 6d 65 2b 31 29 3b 0a 20 20 20 20 0a 20 20 20  ame+1);.    .   
156e0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
156f0 20 69 73 20 6e 6f 20 6f 70 65 6e 20 74 72 61 6e   is no open tran
15700 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6d 61  saction, then ma
15710 72 6b 20 74 68 69 73 20 61 73 20 61 20 73 70 65  rk this as a spe
15720 63 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  cial.        ** 
15730 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76  "transaction sav
15740 65 70 6f 69 6e 74 22 2e 20 2a 2f 0a 20 20 20 20  epoint". */.    
15750 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f      if( db->auto
15760 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
15770 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
15780 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
15790 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74    db->isTransact
157a0 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 31  ionSavepoint = 1
157b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
157c0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
157d0 53 61 76 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20  Savepoint++;.   
157e0 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20       }.    .    
157f0 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20      /* Link the 
15800 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20 69 6e  new savepoint in
15810 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
15820 68 61 6e 64 6c 65 27 73 20 6c 69 73 74 2e 20 2a  handle's list. *
15830 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
15840 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 53 61 76  pNext = db->pSav
15850 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20 20  epoint;.        
15860 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
15870 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70   pNew;.        p
15880 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f  New->nDeferredCo
15890 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72  ns = db->nDeferr
158a0 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 7d 0a  edCons;.      }.
158b0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
158c0 20 20 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20     iSavepoint = 
158d0 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20  0;..    /* Find 
158e0 74 68 65 20 6e 61 6d 65 64 20 73 61 76 65 70 6f  the named savepo
158f0 69 6e 74 2e 20 49 66 20 74 68 65 72 65 20 69 73  int. If there is
15900 20 6e 6f 20 73 75 63 68 20 73 61 76 65 70 6f 69   no such savepoi
15910 6e 74 2c 20 74 68 65 6e 20 61 6e 0a 20 20 20 20  nt, then an.    
15920 2a 2a 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  ** an error is r
15930 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
15940 73 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ser.  */.    for
15950 28 0a 20 20 20 20 20 20 70 53 61 76 65 70 6f 69  (.      pSavepoi
15960 6e 74 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f  nt = db->pSavepo
15970 69 6e 74 3b 20 0a 20 20 20 20 20 20 70 53 61 76  int; .      pSav
15980 65 70 6f 69 6e 74 20 26 26 20 73 71 6c 69 74 65  epoint && sqlite
15990 33 53 74 72 49 43 6d 70 28 70 53 61 76 65 70 6f  3StrICmp(pSavepo
159a0 69 6e 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  int->zName, zNam
159b0 65 29 3b 0a 20 20 20 20 20 20 70 53 61 76 65 70  e);.      pSavep
159c0 6f 69 6e 74 20 3d 20 70 53 61 76 65 70 6f 69 6e  oint = pSavepoin
159d0 74 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 7b 0a  t->pNext.    ){.
159e0 20 20 20 20 20 20 69 53 61 76 65 70 6f 69 6e 74        iSavepoint
159f0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
15a00 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  ( !pSavepoint ){
15a10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
15a20 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
15a30 4d 73 67 2c 20 64 62 2c 20 22 6e 6f 20 73 75 63  Msg, db, "no suc
15a40 68 20 73 61 76 65 70 6f 69 6e 74 3a 20 25 73 22  h savepoint: %s"
15a50 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
15a60 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
15a70 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
15a80 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e   db->writeVdbeCn
15a90 74 3e 30 20 26 26 20 70 31 3d 3d 53 41 56 45 50  t>0 && p1==SAVEP
15aa0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a  OINT_RELEASE ){.
15ab0 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e        /* It is n
15ac0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72  ot possible to r
15ad0 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20  elease (commit) 
15ae0 61 20 73 61 76 65 70 6f 69 6e 74 20 69 66 20 74  a savepoint if t
15af0 68 65 72 65 20 61 72 65 20 0a 20 20 20 20 20 20  here are .      
15b00 2a 2a 20 61 63 74 69 76 65 20 77 72 69 74 65 20  ** active write 
15b10 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20  statements..    
15b20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
15b30 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
15b40 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 0a 20 20  zErrMsg, db, .  
15b50 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 72 65        "cannot re
15b60 6c 65 61 73 65 20 73 61 76 65 70 6f 69 6e 74 20  lease savepoint 
15b70 2d 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  - SQL statements
15b80 20 69 6e 20 70 72 6f 67 72 65 73 73 22 0a 20 20   in progress".  
15b90 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 63 20      );.      rc 
15ba0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
15bb0 20 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 20     }else{..     
15bc0 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68   /* Determine wh
15bd0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69  ether or not thi
15be0 73 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  s is a transacti
15bf0 6f 6e 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66  on savepoint. If
15c00 20 73 6f 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6e   so,.      ** an
15c10 64 20 74 68 69 73 20 69 73 20 61 20 52 45 4c 45  d this is a RELE
15c20 41 53 45 20 63 6f 6d 6d 61 6e 64 2c 20 74 68 65  ASE command, the
15c30 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
15c40 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 20  ansaction .     
15c50 20 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64   ** is committed
15c60 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
15c70 20 20 69 6e 74 20 69 73 54 72 61 6e 73 61 63 74    int isTransact
15c80 69 6f 6e 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  ion = pSavepoint
15c90 2d 3e 70 4e 65 78 74 3d 3d 30 20 26 26 20 64 62  ->pNext==0 && db
15ca0 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53  ->isTransactionS
15cb0 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20  avepoint;.      
15cc0 69 66 28 20 69 73 54 72 61 6e 73 61 63 74 69 6f  if( isTransactio
15cd0 6e 20 26 26 20 70 31 3d 3d 53 41 56 45 50 4f 49  n && p1==SAVEPOI
15ce0 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20 20  NT_RELEASE ){.  
15cf0 20 20 20 20 20 20 69 66 28 20 28 72 63 20 3d 20        if( (rc = 
15d00 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
15d10 46 6b 28 70 2c 20 31 29 29 21 3d 53 51 4c 49 54  Fk(p, 1))!=SQLIT
15d20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15d30 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75    goto vdbe_retu
15d40 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rn;.        }.  
15d50 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
15d60 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
15d70 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
15d80 65 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45  eHalt(p)==SQLITE
15d90 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
15da0 20 20 20 70 2d 3e 70 63 20 3d 20 70 63 3b 0a 20     p->pc = pc;. 
15db0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
15dc0 6f 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20  oCommit = 0;.   
15dd0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
15de0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
15df0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
15e00 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20  vdbe_return;.   
15e10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
15e20 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  b->isTransaction
15e30 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
15e40 20 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e 72         rc = p->r
15e50 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  c;.      }else{.
15e60 20 20 20 20 20 20 20 20 69 53 61 76 65 70 6f 69          iSavepoi
15e70 6e 74 20 3d 20 64 62 2d 3e 6e 53 61 76 65 70 6f  nt = db->nSavepo
15e80 69 6e 74 20 2d 20 69 53 61 76 65 70 6f 69 6e 74  int - iSavepoint
15e90 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66   - 1;.        if
15ea0 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( p1==SAVEPOINT_
15eb0 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
15ec0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
15ed0 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b  ii<db->nDb; ii++
15ee0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
15ef0 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
15f00 6c 6c 43 75 72 73 6f 72 73 28 64 62 2d 3e 61 44  llCursors(db->aD
15f10 62 5b 69 69 5d 2e 70 42 74 2c 20 53 51 4c 49 54  b[ii].pBt, SQLIT
15f20 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20 20 20  E_ABORT);.      
15f30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
15f40 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30          for(ii=0
15f50 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69  ; ii<db->nDb; ii
15f60 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ++){.          r
15f70 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
15f80 53 61 76 65 70 6f 69 6e 74 28 64 62 2d 3e 61 44  Savepoint(db->aD
15f90 62 5b 69 69 5d 2e 70 42 74 2c 20 70 31 2c 20 69  b[ii].pBt, p1, i
15fa0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
15fb0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
15fc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15fd0 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72         goto abor
15fe0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
15ff0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16000 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
16010 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( p1==SAVEPOINT_
16020 52 4f 4c 4c 42 41 43 4b 20 26 26 20 28 64 62 2d  ROLLBACK && (db-
16030 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e  >flags&SQLITE_In
16040 74 65 72 6e 43 68 61 6e 67 65 73 29 21 3d 30 20  ternChanges)!=0 
16050 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
16060 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
16070 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
16080 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
16090 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d  te3ResetAllSchem
160a0 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64  asOfConnection(d
160b0 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  b);.          db
160c0 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66  ->flags = (db->f
160d0 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e  lags | SQLITE_In
160e0 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20  ternChanges);.  
160f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16100 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 67 61    .      /* Rega
16110 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
16120 72 20 74 68 69 73 20 69 73 20 61 20 52 45 4c 45  r this is a RELE
16130 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2c  ASE or ROLLBACK,
16140 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 0a 20 20   destroy all .  
16150 20 20 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74      ** savepoint
16160 73 20 6e 65 73 74 65 64 20 69 6e 73 69 64 65 20  s nested inside 
16170 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  of the savepoint
16180 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64 20   being operated 
16190 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  on. */.      whi
161a0 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  le( db->pSavepoi
161b0 6e 74 21 3d 70 53 61 76 65 70 6f 69 6e 74 20 29  nt!=pSavepoint )
161c0 7b 0a 20 20 20 20 20 20 20 20 70 54 6d 70 20 3d  {.        pTmp =
161d0 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b   db->pSavepoint;
161e0 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53 61  .        db->pSa
161f0 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e  vepoint = pTmp->
16200 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73  pNext;.        s
16210 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16220 20 70 54 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   pTmp);.        
16230 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2d 2d  db->nSavepoint--
16240 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
16250 20 2f 2a 20 49 66 20 69 74 20 69 73 20 61 20 52   /* If it is a R
16260 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 64 65 73  ELEASE, then des
16270 74 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69  troy the savepoi
16280 6e 74 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65  nt being operate
16290 64 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74  d on .      ** t
162a0 6f 6f 2e 20 49 66 20 69 74 20 69 73 20 61 20 52  oo. If it is a R
162b0 4f 4c 4c 42 41 43 4b 20 54 4f 2c 20 74 68 65 6e  OLLBACK TO, then
162c0 20 73 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   set the number 
162d0 6f 66 20 64 65 66 65 72 72 65 64 20 0a 20 20 20  of deferred .   
162e0 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
162f0 20 76 69 6f 6c 61 74 69 6f 6e 73 20 70 72 65 73   violations pres
16300 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
16310 61 73 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ase to the value
16320 20 73 74 6f 72 65 64 0a 20 20 20 20 20 20 2a 2a   stored.      **
16330 20 77 68 65 6e 20 74 68 65 20 73 61 76 65 70 6f   when the savepo
16340 69 6e 74 20 77 61 73 20 63 72 65 61 74 65 64 2e  int was created.
16350 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
16360 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  1==SAVEPOINT_REL
16370 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20  EASE ){.        
16380 61 73 73 65 72 74 28 20 70 53 61 76 65 70 6f 69  assert( pSavepoi
16390 6e 74 3d 3d 64 62 2d 3e 70 53 61 76 65 70 6f 69  nt==db->pSavepoi
163a0 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20 64 62  nt );.        db
163b0 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  ->pSavepoint = p
163c0 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74  Savepoint->pNext
163d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
163e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 61 76  3DbFree(db, pSav
163f0 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  epoint);.       
16400 20 69 66 28 20 21 69 73 54 72 61 6e 73 61 63 74   if( !isTransact
16410 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ion ){.         
16420 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2d   db->nSavepoint-
16430 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  -;.        }.   
16440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16450 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
16460 6f 6e 73 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  ons = pSavepoint
16470 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3b  ->nDeferredCons;
16480 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
16490 69 66 28 20 21 69 73 54 72 61 6e 73 61 63 74 69  if( !isTransacti
164a0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  on ){.        rc
164b0 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
164c0 76 65 70 6f 69 6e 74 28 64 62 2c 20 70 31 2c 20  vepoint(db, p1, 
164d0 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
164e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
164f0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62  ITE_OK ) goto ab
16500 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
16510 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16520 20 20 7d 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a    }..  break;.}.
16530 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 75 74 6f  ./* Opcode: Auto
16540 43 6f 6d 6d 69 74 20 50 31 20 50 32 20 2a 20 2a  Commit P1 P2 * *
16550 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65   *.**.** Set the
16560 20 64 61 74 61 62 61 73 65 20 61 75 74 6f 2d 63   database auto-c
16570 6f 6d 6d 69 74 20 66 6c 61 67 20 74 6f 20 50 31  ommit flag to P1
16580 20 28 31 20 6f 72 20 30 29 2e 20 49 66 20 50 32   (1 or 0). If P2
16590 20 69 73 20 74 72 75 65 2c 20 72 6f 6c 6c 0a 2a   is true, roll.*
165a0 2a 20 62 61 63 6b 20 61 6e 79 20 63 75 72 72 65  * back any curre
165b0 6e 74 6c 79 20 61 63 74 69 76 65 20 62 74 72 65  ntly active btre
165c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20  e transactions. 
165d0 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
165e0 20 61 63 74 69 76 65 0a 2a 2a 20 56 4d 73 20 28   active.** VMs (
165f0 61 70 61 72 74 20 66 72 6f 6d 20 74 68 69 73 20  apart from this 
16600 6f 6e 65 29 2c 20 74 68 65 6e 20 61 20 52 4f 4c  one), then a ROL
16610 4c 42 41 43 4b 20 66 61 69 6c 73 2e 20 20 41 20  LBACK fails.  A 
16620 43 4f 4d 4d 49 54 20 66 61 69 6c 73 20 69 66 0a  COMMIT fails if.
16630 2a 2a 20 74 68 65 72 65 20 61 72 65 20 61 63 74  ** there are act
16640 69 76 65 20 77 72 69 74 69 6e 67 20 56 4d 73 20  ive writing VMs 
16650 6f 72 20 61 63 74 69 76 65 20 56 4d 73 20 74 68  or active VMs th
16660 61 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61  at use shared ca
16670 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  che..**.** This 
16680 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 61 75 73  instruction caus
16690 65 73 20 74 68 65 20 56 4d 20 74 6f 20 68 61 6c  es the VM to hal
166a0 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 75  t..*/.case OP_Au
166b0 74 6f 43 6f 6d 6d 69 74 3a 20 7b 0a 20 20 69 6e  toCommit: {.  in
166c0 74 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  t desiredAutoCom
166d0 6d 69 74 3b 0a 20 20 69 6e 74 20 69 52 6f 6c 6c  mit;.  int iRoll
166e0 62 61 63 6b 3b 0a 20 20 69 6e 74 20 74 75 72 6e  back;.  int turn
166f0 4f 6e 41 43 3b 0a 0a 20 20 64 65 73 69 72 65 64  OnAC;..  desired
16700 41 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 70 4f 70  AutoCommit = pOp
16710 2d 3e 70 31 3b 0a 20 20 69 52 6f 6c 6c 62 61 63  ->p1;.  iRollbac
16720 6b 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 74  k = pOp->p2;.  t
16730 75 72 6e 4f 6e 41 43 20 3d 20 64 65 73 69 72 65  urnOnAC = desire
16740 64 41 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 21  dAutoCommit && !
16750 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a  db->autoCommit;.
16760 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72 65    assert( desire
16770 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 7c  dAutoCommit==1 |
16780 7c 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  | desiredAutoCom
16790 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  mit==0 );.  asse
167a0 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f 43  rt( desiredAutoC
167b0 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 69 52 6f 6c  ommit==1 || iRol
167c0 6c 62 61 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  lback==0 );.  as
167d0 73 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65  sert( db->active
167e0 56 64 62 65 43 6e 74 3e 30 20 29 3b 20 20 2f 2a  VdbeCnt>0 );  /*
167f0 20 41 74 20 6c 65 61 73 74 20 74 68 69 73 20 6f   At least this o
16800 6e 65 20 56 4d 20 69 73 20 61 63 74 69 76 65 20  ne VM is active 
16810 2a 2f 0a 0a 23 69 66 20 30 0a 20 20 69 66 28 20  */..#if 0.  if( 
16820 74 75 72 6e 4f 6e 41 43 20 26 26 20 69 52 6f 6c  turnOnAC && iRol
16830 6c 62 61 63 6b 20 26 26 20 64 62 2d 3e 61 63 74  lback && db->act
16840 69 76 65 56 64 62 65 43 6e 74 3e 31 20 29 7b 0a  iveVdbeCnt>1 ){.
16850 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
16860 6e 73 74 72 75 63 74 69 6f 6e 20 69 6d 70 6c 65  nstruction imple
16870 6d 65 6e 74 73 20 61 20 52 4f 4c 4c 42 41 43 4b  ments a ROLLBACK
16880 20 61 6e 64 20 6f 74 68 65 72 20 56 4d 73 20 61   and other VMs a
16890 72 65 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20  re.    ** still 
168a0 72 75 6e 6e 69 6e 67 2c 20 61 6e 64 20 61 20 74  running, and a t
168b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
168c0 74 69 76 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  tive, return an 
168d0 65 72 72 6f 72 20 69 6e 64 69 63 61 74 69 6e 67  error indicating
168e0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
168f0 20 6f 74 68 65 72 20 56 4d 73 20 6d 75 73 74 20   other VMs must 
16900 63 6f 6d 70 6c 65 74 65 20 66 69 72 73 74 2e 20  complete first. 
16910 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
16920 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
16930 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 63  >zErrMsg, db, "c
16940 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 74  annot rollback t
16950 72 61 6e 73 61 63 74 69 6f 6e 20 2d 20 22 0a 20  ransaction - ". 
16960 20 20 20 20 20 20 20 22 53 51 4c 20 73 74 61 74         "SQL stat
16970 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65  ements in progre
16980 73 73 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ss");.    rc = S
16990 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
169a0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  lse.#endif.  if(
169b0 20 74 75 72 6e 4f 6e 41 43 20 26 26 20 21 69 52   turnOnAC && !iR
169c0 6f 6c 6c 62 61 63 6b 20 26 26 20 64 62 2d 3e 77  ollback && db->w
169d0 72 69 74 65 56 64 62 65 43 6e 74 3e 30 20 29 7b  riteVdbeCnt>0 ){
169e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
169f0 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6d 70 6c  instruction impl
16a00 65 6d 65 6e 74 73 20 61 20 43 4f 4d 4d 49 54 20  ements a COMMIT 
16a10 61 6e 64 20 6f 74 68 65 72 20 56 4d 73 20 61 72  and other VMs ar
16a20 65 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a  e writing.    **
16a30 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
16a40 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
16a50 20 74 68 65 20 6f 74 68 65 72 20 56 4d 73 20 6d   the other VMs m
16a60 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 66 69 72  ust complete fir
16a70 73 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  st. .    */.    
16a80 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
16a90 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
16aa0 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74  , "cannot commit
16ab0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2d 20 22   transaction - "
16ac0 0a 20 20 20 20 20 20 20 20 22 53 51 4c 20 73 74  .        "SQL st
16ad0 61 74 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67  atements in prog
16ae0 72 65 73 73 22 29 3b 0a 20 20 20 20 72 63 20 3d  ress");.    rc =
16af0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
16b00 7d 65 6c 73 65 20 69 66 28 20 64 65 73 69 72 65  }else if( desire
16b10 64 41 75 74 6f 43 6f 6d 6d 69 74 21 3d 64 62 2d  dAutoCommit!=db-
16b20 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
16b30 20 20 20 69 66 28 20 69 52 6f 6c 6c 62 61 63 6b     if( iRollback
16b40 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
16b50 28 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  ( desiredAutoCom
16b60 6d 69 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  mit==1 );.      
16b70 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
16b80 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
16b90 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
16ba0 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
16bb0 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  mit = 1;.    }el
16bc0 73 65 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c  se if( (rc = sql
16bd0 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
16be0 70 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f  p, 1))!=SQLITE_O
16bf0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
16c00 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20  vdbe_return;.   
16c10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
16c20 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 28  ->autoCommit = (
16c30 75 38 29 64 65 73 69 72 65 64 41 75 74 6f 43 6f  u8)desiredAutoCo
16c40 6d 6d 69 74 3b 0a 20 20 20 20 20 20 69 66 28 20  mmit;.      if( 
16c50 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
16c60 70 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  p)==SQLITE_BUSY 
16c70 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 63  ){.        p->pc
16c80 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 20 20 64   = pc;.        d
16c90 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
16ca0 28 75 38 29 28 31 2d 64 65 73 69 72 65 64 41 75  (u8)(1-desiredAu
16cb0 74 6f 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20  toCommit);.     
16cc0 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20     p->rc = rc = 
16cd0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
16ce0 20 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72       goto vdbe_r
16cf0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
16d00 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
16d10 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d   db->nStatement=
16d20 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
16d30 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
16d40 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  (db);.    if( p-
16d50 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
16d60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
16d70 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 65  ITE_DONE;.    }e
16d80 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
16d90 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
16da0 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 76 64 62    }.    goto vdb
16db0 65 5f 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73  e_return;.  }els
16dc0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  e{.    sqlite3Se
16dd0 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
16de0 4d 73 67 2c 20 64 62 2c 0a 20 20 20 20 20 20 20  Msg, db,.       
16df0 20 28 21 64 65 73 69 72 65 64 41 75 74 6f 43 6f   (!desiredAutoCo
16e00 6d 6d 69 74 29 3f 22 63 61 6e 6e 6f 74 20 73 74  mmit)?"cannot st
16e10 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
16e20 6e 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  n within a trans
16e30 61 63 74 69 6f 6e 22 3a 28 0a 20 20 20 20 20 20  action":(.      
16e40 20 20 28 69 52 6f 6c 6c 62 61 63 6b 29 3f 22 63    (iRollback)?"c
16e50 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 2d  annot rollback -
16e60 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   no transaction 
16e70 69 73 20 61 63 74 69 76 65 22 3a 0a 20 20 20 20  is active":.    
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
16e90 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d 20  cannot commit - 
16ea0 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  no transaction i
16eb0 73 20 61 63 74 69 76 65 22 29 29 3b 0a 20 20 20  s active"));.   
16ec0 20 20 20 20 20 20 0a 20 20 20 20 72 63 20 3d 20        .    rc = 
16ed0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
16ee0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
16ef0 20 4f 70 63 6f 64 65 3a 20 54 72 61 6e 73 61 63   Opcode: Transac
16f00 74 69 6f 6e 20 50 31 20 50 32 20 2a 20 2a 20 2a  tion P1 P2 * * *
16f10 0a 2a 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74  .**.** Begin a t
16f20 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68 65  ransaction.  The
16f30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 65 6e 64   transaction end
16f40 73 20 77 68 65 6e 20 61 20 43 6f 6d 6d 69 74 20  s when a Commit 
16f50 6f 72 20 52 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f  or Rollback.** o
16f60 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74  pcode is encount
16f70 65 72 65 64 2e 20 20 44 65 70 65 6e 64 69 6e 67  ered.  Depending
16f80 20 6f 6e 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c   on the ON CONFL
16f90 49 43 54 20 73 65 74 74 69 6e 67 2c 20 74 68 65  ICT setting, the
16fa0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
16fb0 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 72 6f  might also be ro
16fc0 6c 6c 65 64 20 62 61 63 6b 20 69 66 20 61 6e 20  lled back if an 
16fd0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
16fe0 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69  ered..**.** P1 i
16ff0 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
17000 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17010 20 6f 6e 20 77 68 69 63 68 20 74 68 65 20 74 72   on which the tr
17020 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20  ansaction is.** 
17030 73 74 61 72 74 65 64 2e 20 20 49 6e 64 65 78 20  started.  Index 
17040 30 20 69 73 20 74 68 65 20 6d 61 69 6e 20 64 61  0 is the main da
17050 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
17060 69 6e 64 65 78 20 31 20 69 73 20 74 68 65 0a 2a  index 1 is the.*
17070 2a 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  * file used for 
17080 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
17090 2e 20 20 49 6e 64 69 63 65 73 20 6f 66 20 32 20  .  Indices of 2 
170a0 6f 72 20 6d 6f 72 65 20 61 72 65 20 75 73 65 64  or more are used
170b0 20 66 6f 72 0a 2a 2a 20 61 74 74 61 63 68 65 64   for.** attached
170c0 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a   databases..**.*
170d0 2a 20 49 66 20 50 32 20 69 73 20 6e 6f 6e 2d 7a  * If P2 is non-z
170e0 65 72 6f 2c 20 74 68 65 6e 20 61 20 77 72 69 74  ero, then a writ
170f0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
17100 20 73 74 61 72 74 65 64 2e 20 20 41 20 52 45 53   started.  A RES
17110 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 0a 2a 2a  ERVED lock is.**
17120 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
17130 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
17140 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
17150 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
17160 65 64 2e 20 20 4e 6f 0a 2a 2a 20 6f 74 68 65 72  ed.  No.** other
17170 20 70 72 6f 63 65 73 73 20 63 61 6e 20 73 74 61   process can sta
17180 72 74 20 61 6e 6f 74 68 65 72 20 77 72 69 74 65  rt another write
17190 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 68 69   transaction whi
171a0 6c 65 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  le this transact
171b0 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e 64 65 72 77  ion is.** underw
171c0 61 79 2e 20 20 53 74 61 72 74 69 6e 67 20 61 20  ay.  Starting a 
171d0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
171e0 6e 20 61 6c 73 6f 20 63 72 65 61 74 65 73 20 61  n also creates a
171f0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
17200 6c 2e 20 41 0a 2a 2a 20 77 72 69 74 65 20 74 72  l. A.** write tr
17210 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
17220 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
17230 20 61 6e 79 20 63 68 61 6e 67 65 73 20 63 61 6e   any changes can
17240 20 62 65 20 6d 61 64 65 20 74 6f 20 74 68 65 0a   be made to the.
17250 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  ** database.  If
17260 20 50 32 20 69 73 20 32 20 6f 72 20 67 72 65 61   P2 is 2 or grea
17270 74 65 72 20 74 68 65 6e 20 61 6e 20 45 58 43 4c  ter then an EXCL
17280 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 61 6c  USIVE lock is al
17290 73 6f 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f  so obtained.** o
172a0 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
172b0 2a 20 49 66 20 61 20 77 72 69 74 65 2d 74 72 61  * If a write-tra
172c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
172d0 74 65 64 20 61 6e 64 20 74 68 65 20 56 64 62 65  ted and the Vdbe
172e0 2e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  .usesStmtJournal
172f0 20 66 6c 61 67 20 69 73 0a 2a 2a 20 74 72 75 65   flag is.** true
17300 20 28 74 68 69 73 20 66 6c 61 67 20 69 73 20 73   (this flag is s
17310 65 74 20 69 66 20 74 68 65 20 56 64 62 65 20 6d  et if the Vdbe m
17320 61 79 20 6d 6f 64 69 66 79 20 6d 6f 72 65 20 74  ay modify more t
17330 68 61 6e 20 6f 6e 65 20 72 6f 77 20 61 6e 64 20  han one row and 
17340 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20  may.** throw an 
17350 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f 6e 29  ABORT exception)
17360 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  , a statement tr
17370 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 61 6c  ansaction may al
17380 73 6f 20 62 65 20 6f 70 65 6e 65 64 2e 0a 2a 2a  so be opened..**
17390 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c   More specifical
173a0 6c 79 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ly, a statement 
173b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
173c0 70 65 6e 65 64 20 69 66 66 20 74 68 65 20 64 61  pened iff the da
173d0 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
173e0 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
173f0 79 20 6e 6f 74 20 69 6e 20 61 75 74 6f 63 6f 6d  y not in autocom
17400 6d 69 74 20 6d 6f 64 65 2c 20 6f 72 20 69 66 20  mit mode, or if 
17410 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 0a  there are other.
17420 2a 2a 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  ** active statem
17430 65 6e 74 73 2e 20 41 20 73 74 61 74 65 6d 65 6e  ents. A statemen
17440 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c  t transaction al
17450 6c 6f 77 73 20 74 68 65 20 63 68 61 6e 67 65 73  lows the changes
17460 20 6d 61 64 65 20 62 79 20 74 68 69 73 0a 2a 2a   made by this.**
17470 20 56 44 42 45 20 74 6f 20 62 65 20 72 6f 6c 6c   VDBE to be roll
17480 65 64 20 62 61 63 6b 20 61 66 74 65 72 20 61 6e  ed back after an
17490 20 65 72 72 6f 72 20 77 69 74 68 6f 75 74 20 68   error without h
174a0 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 62 61  aving to roll ba
174b0 63 6b 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65  ck the.** entire
174c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
174d0 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 65 6e 63   no error is enc
174e0 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 20 73 74  ountered, the st
174f0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
17500 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 61 75 74 6f  ion.** will auto
17510 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69 74  matically commit
17520 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 68   when the VDBE h
17530 61 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  alts..**.** If P
17540 32 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  2 is zero, then 
17550 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f  a read-lock is o
17560 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64  btained on the d
17570 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
17580 0a 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63  .case OP_Transac
17590 74 69 6f 6e 3a 20 7b 0a 20 20 42 74 72 65 65 20  tion: {.  Btree 
175a0 2a 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pBt;..  assert(
175b0 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
175c0 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29  Op->p1<db->nDb )
175d0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  ;.  assert( (p->
175e0 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79  btreeMask & (((y
175f0 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e  DbMask)1)<<pOp->
17600 70 31 29 29 21 3d 30 20 29 3b 0a 20 20 70 42 74  p1))!=0 );.  pBt
17610 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e   = db->aDb[pOp->
17620 70 31 5d 2e 70 42 74 3b 0a 0a 20 20 69 66 28 20  p1].pBt;..  if( 
17630 70 42 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pBt ){.    rc = 
17640 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
17650 6e 54 72 61 6e 73 28 70 42 74 2c 20 70 4f 70 2d  nTrans(pBt, pOp-
17660 3e 70 32 29 3b 0a 20 20 20 20 69 66 28 20 72 63  >p2);.    if( rc
17670 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
17680 0a 20 20 20 20 20 20 70 2d 3e 70 63 20 3d 20 70  .      p->pc = p
17690 63 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  c;.      p->rc =
176a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
176b0 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 76 64  Y;.      goto vd
176c0 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d  be_return;.    }
176d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
176e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
176f0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
17700 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a  o_error;.    }..
17710 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20      if( pOp->p2 
17720 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  && p->usesStmtJo
17730 75 72 6e 61 6c 20 0a 20 20 20 20 20 26 26 20 28  urnal .     && (
17740 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
17750 30 20 7c 7c 20 64 62 2d 3e 61 63 74 69 76 65 56  0 || db->activeV
17760 64 62 65 43 6e 74 3e 31 29 20 0a 20 20 20 20 29  dbeCnt>1) .    )
17770 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
17780 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
17790 54 72 61 6e 73 28 70 42 74 29 20 29 3b 0a 20 20  Trans(pBt) );.  
177a0 20 20 20 20 69 66 28 20 70 2d 3e 69 53 74 61 74      if( p->iStat
177b0 65 6d 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ement==0 ){.    
177c0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
177d0 6e 53 74 61 74 65 6d 65 6e 74 3e 3d 30 20 26 26  nStatement>=0 &&
177e0 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e   db->nSavepoint>
177f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 64 62  =0 );.        db
17800 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 2b 3b 20  ->nStatement++; 
17810 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 53 74 61  .        p->iSta
17820 74 65 6d 65 6e 74 20 3d 20 64 62 2d 3e 6e 53 61  tement = db->nSa
17830 76 65 70 6f 69 6e 74 20 2b 20 64 62 2d 3e 6e 53  vepoint + db->nS
17840 74 61 74 65 6d 65 6e 74 3b 0a 20 20 20 20 20 20  tatement;.      
17850 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  }..      rc = sq
17860 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
17870 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
17880 5f 42 45 47 49 4e 2c 20 70 2d 3e 69 53 74 61 74  _BEGIN, p->iStat
17890 65 6d 65 6e 74 2d 31 29 3b 0a 20 20 20 20 20 20  ement-1);.      
178a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
178b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
178c0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
178d0 67 69 6e 53 74 6d 74 28 70 42 74 2c 20 70 2d 3e  ginStmt(pBt, p->
178e0 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20  iStatement);.   
178f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53     }..      /* S
17900 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
17910 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
17920 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64  tabase handles d
17930 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
17940 6e 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e  nt.      ** coun
17950 74 65 72 2e 20 49 66 20 74 68 65 20 73 74 61 74  ter. If the stat
17960 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
17970 6e 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  n needs to be ro
17980 6c 6c 65 64 20 62 61 63 6b 2c 0a 20 20 20 20 20  lled back,.     
17990 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
179a0 20 74 68 69 73 20 63 6f 75 6e 74 65 72 20 6e 65   this counter ne
179b0 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eds to be restor
179c0 65 64 20 74 6f 6f 2e 20 20 2a 2f 0a 20 20 20 20  ed too.  */.    
179d0 20 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e    p->nStmtDefCon
179e0 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72 65  s = db->nDeferre
179f0 64 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  dCons;.    }.  }
17a00 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
17a10 4f 70 63 6f 64 65 3a 20 52 65 61 64 43 6f 6f 6b  Opcode: ReadCook
17a20 69 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  ie P1 P2 P3 * *.
17a30 2a 2a 0a 2a 2a 20 52 65 61 64 20 63 6f 6f 6b 69  **.** Read cooki
17a40 65 20 6e 75 6d 62 65 72 20 50 33 20 66 72 6f 6d  e number P3 from
17a50 20 64 61 74 61 62 61 73 65 20 50 31 20 61 6e 64   database P1 and
17a60 20 77 72 69 74 65 20 69 74 20 69 6e 74 6f 20 72   write it into r
17a70 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 20 50  egister P2..** P
17a80 33 3d 3d 31 20 69 73 20 74 68 65 20 73 63 68 65  3==1 is the sche
17a90 6d 61 20 76 65 72 73 69 6f 6e 2e 20 20 50 33 3d  ma version.  P3=
17aa0 3d 32 20 69 73 20 74 68 65 20 64 61 74 61 62 61  =2 is the databa
17ab0 73 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 50 33  se format..** P3
17ac0 3d 3d 33 20 69 73 20 74 68 65 20 72 65 63 6f 6d  ==3 is the recom
17ad0 6d 65 6e 64 65 64 20 70 61 67 65 72 20 63 61 63  mended pager cac
17ae0 68 65 20 73 69 7a 65 2c 20 61 6e 64 20 73 6f 20  he size, and so 
17af0 66 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20 69 73  forth.  P1==0 is
17b00 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64 61 74  .** the main dat
17b10 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 50  abase file and P
17b20 31 3d 3d 31 20 69 73 20 74 68 65 20 64 61 74 61  1==1 is the data
17b30 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 74  base file used t
17b40 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f  o store.** tempo
17b50 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  rary tables..**.
17b60 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
17b70 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
17b80 74 68 65 20 64 61 74 61 62 61 73 65 20 28 65 69  the database (ei
17b90 74 68 65 72 20 61 20 74 72 61 6e 73 61 63 74 69  ther a transacti
17ba0 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 73 74  on.** must be st
17bb0 61 72 74 65 64 20 6f 72 20 74 68 65 72 65 20 6d  arted or there m
17bc0 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63  ust be an open c
17bd0 75 72 73 6f 72 29 20 62 65 66 6f 72 65 0a 2a 2a  ursor) before.**
17be0 20 65 78 65 63 75 74 69 6e 67 20 74 68 69 73 20   executing this 
17bf0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
17c00 63 61 73 65 20 4f 50 5f 52 65 61 64 43 6f 6f 6b  case OP_ReadCook
17c10 69 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ie: {           
17c20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72      /* out2-prer
17c30 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
17c40 69 4d 65 74 61 3b 0a 20 20 69 6e 74 20 69 44 62  iMeta;.  int iDb
17c50 3b 0a 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b  ;.  int iCookie;
17c60 0a 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70  ..  iDb = pOp->p
17c70 31 3b 0a 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70  1;.  iCookie = p
17c80 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72 74  Op->p3;.  assert
17c90 28 20 70 4f 70 2d 3e 70 33 3c 53 51 4c 49 54 45  ( pOp->p3<SQLITE
17ca0 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20 29 3b  _N_BTREE_META );
17cb0 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
17cc0 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
17cd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
17ce0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d  ->aDb[iDb].pBt!=
17cf0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
17d00 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28  p->btreeMask & (
17d10 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44  ((yDbMask)1)<<iD
17d20 62 29 29 21 3d 30 20 29 3b 0a 0a 20 20 73 71 6c  b))!=0 );..  sql
17d30 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
17d40 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42  (db->aDb[iDb].pB
17d50 74 2c 20 69 43 6f 6f 6b 69 65 2c 20 28 75 33 32  t, iCookie, (u32
17d60 20 2a 29 26 69 4d 65 74 61 29 3b 0a 20 20 70 4f   *)&iMeta);.  pO
17d70 75 74 2d 3e 75 2e 69 20 3d 20 69 4d 65 74 61 3b  ut->u.i = iMeta;
17d80 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
17d90 4f 70 63 6f 64 65 3a 20 53 65 74 43 6f 6f 6b 69  Opcode: SetCooki
17da0 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  e P1 P2 P3 * *.*
17db0 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 63  *.** Write the c
17dc0 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74  ontent of regist
17dd0 65 72 20 50 33 20 28 69 6e 74 65 72 70 72 65 74  er P3 (interpret
17de0 65 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  ed as an integer
17df0 29 0a 2a 2a 20 69 6e 74 6f 20 63 6f 6f 6b 69 65  ).** into cookie
17e00 20 6e 75 6d 62 65 72 20 50 32 20 6f 66 20 64 61   number P2 of da
17e10 74 61 62 61 73 65 20 50 31 2e 20 20 50 32 3d 3d  tabase P1.  P2==
17e20 31 20 69 73 20 74 68 65 20 73 63 68 65 6d 61 20  1 is the schema 
17e30 76 65 72 73 69 6f 6e 2e 20 20 0a 2a 2a 20 50 32  version.  .** P2
17e40 3d 3d 32 20 69 73 20 74 68 65 20 64 61 74 61 62  ==2 is the datab
17e50 61 73 65 20 66 6f 72 6d 61 74 2e 20 50 32 3d 3d  ase format. P2==
17e60 33 20 69 73 20 74 68 65 20 72 65 63 6f 6d 6d 65  3 is the recomme
17e70 6e 64 65 64 20 70 61 67 65 72 20 63 61 63 68 65  nded pager cache
17e80 20 0a 2a 2a 20 73 69 7a 65 2c 20 61 6e 64 20 73   .** size, and s
17e90 6f 20 66 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20  o forth.  P1==0 
17ea0 69 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  is the main data
17eb0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 50 31  base file and P1
17ec0 3d 3d 31 20 69 73 20 74 68 65 20 0a 2a 2a 20 64  ==1 is the .** d
17ed0 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
17ee0 64 20 74 6f 20 73 74 6f 72 65 20 74 65 6d 70 6f  d to store tempo
17ef0 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  rary tables..**.
17f00 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** A transaction
17f10 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
17f20 20 62 65 66 6f 72 65 20 65 78 65 63 75 74 69 6e   before executin
17f30 67 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a  g this opcode..*
17f40 2f 0a 63 61 73 65 20 4f 50 5f 53 65 74 43 6f 6f  /.case OP_SetCoo
17f50 6b 69 65 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20  kie: {       /* 
17f60 69 6e 33 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62  in3 */.  Db *pDb
17f70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
17f80 3e 70 32 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52  >p2<SQLITE_N_BTR
17f90 45 45 5f 4d 45 54 41 20 29 3b 0a 20 20 61 73 73  EE_META );.  ass
17fa0 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
17fb0 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e  && pOp->p1<db->n
17fc0 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
17fd0 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20  (p->btreeMask & 
17fe0 28 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70  (((yDbMask)1)<<p
17ff0 4f 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a 20  Op->p1))!=0 );. 
18000 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
18010 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
18020 72 74 28 20 70 44 62 2d 3e 70 42 74 21 3d 30 20  rt( pDb->pBt!=0 
18030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
18040 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
18050 65 6c 64 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c  eld(db, pOp->p1,
18060 20 30 29 20 29 3b 0a 20 20 70 49 6e 33 20 3d 20   0) );.  pIn3 = 
18070 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
18080 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
18090 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 33 29  Integerify(pIn3)
180a0 3b 0a 20 20 2f 2a 20 53 65 65 20 6e 6f 74 65 20  ;.  /* See note 
180b0 61 62 6f 75 74 20 69 6e 64 65 78 20 73 68 69 66  about index shif
180c0 74 69 6e 67 20 6f 6e 20 4f 50 5f 52 65 61 64 43  ting on OP_ReadC
180d0 6f 6f 6b 69 65 20 2a 2f 0a 20 20 72 63 20 3d 20  ookie */.  rc = 
180e0 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
180f0 74 65 4d 65 74 61 28 70 44 62 2d 3e 70 42 74 2c  teMeta(pDb->pBt,
18100 20 70 4f 70 2d 3e 70 32 2c 20 28 69 6e 74 29 70   pOp->p2, (int)p
18110 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 69 66 28  In3->u.i);.  if(
18120 20 70 4f 70 2d 3e 70 32 3d 3d 42 54 52 45 45 5f   pOp->p2==BTREE_
18130 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 20 29  SCHEMA_VERSION )
18140 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68  {.    /* When th
18150 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
18160 63 68 61 6e 67 65 73 2c 20 72 65 63 6f 72 64 20  changes, record 
18170 74 68 65 20 6e 65 77 20 63 6f 6f 6b 69 65 20 69  the new cookie i
18180 6e 74 65 72 6e 61 6c 6c 79 20 2a 2f 0a 20 20 20  nternally */.   
18190 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 73   pDb->pSchema->s
181a0 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 28  chema_cookie = (
181b0 69 6e 74 29 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20  int)pIn3->u.i;. 
181c0 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
181d0 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
181e0 6e 67 65 73 3b 0a 20 20 7d 65 6c 73 65 20 69 66  nges;.  }else if
181f0 28 20 70 4f 70 2d 3e 70 32 3d 3d 42 54 52 45 45  ( pOp->p2==BTREE
18200 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 20 29 7b 0a  _FILE_FORMAT ){.
18210 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 63 68      /* Record ch
18220 61 6e 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  anges in the fil
18230 65 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20  e format */.    
18240 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  pDb->pSchema->fi
18250 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 28 75 38 29  le_format = (u8)
18260 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20  pIn3->u.i;.  }. 
18270 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 31 20   if( pOp->p1==1 
18280 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 76 61 6c 69  ){.    /* Invali
18290 64 61 74 65 20 61 6c 6c 20 70 72 65 70 61 72 65  date all prepare
182a0 64 20 73 74 61 74 65 6d 65 6e 74 73 20 77 68 65  d statements whe
182b0 6e 65 76 65 72 20 74 68 65 20 54 45 4d 50 20 64  never the TEMP d
182c0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 73  atabase.    ** s
182d0 63 68 65 6d 61 20 69 73 20 63 68 61 6e 67 65 64  chema is changed
182e0 2e 20 20 54 69 63 6b 65 74 20 23 31 36 34 34 20  .  Ticket #1644 
182f0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
18300 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
18310 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
18320 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
18330 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
18340 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 65 72 69 66  /* Opcode: Verif
18350 79 43 6f 6f 6b 69 65 20 50 31 20 50 32 20 50 33  yCookie P1 P2 P3
18360 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   * *.**.** Check
18370 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 67 6c   the value of gl
18380 6f 62 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  obal database pa
18390 72 61 6d 65 74 65 72 20 6e 75 6d 62 65 72 20 30  rameter number 0
183a0 20 28 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20   (the.** schema 
183b0 76 65 72 73 69 6f 6e 29 20 61 6e 64 20 6d 61 6b  version) and mak
183c0 65 20 73 75 72 65 20 69 74 20 69 73 20 65 71 75  e sure it is equ
183d0 61 6c 20 74 6f 20 50 32 20 61 6e 64 20 74 68 61  al to P2 and tha
183e0 74 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 74  t the.** generat
183f0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 6f 6e 20 74  ion counter on t
18400 68 65 20 6c 6f 63 61 6c 20 73 63 68 65 6d 61 20  he local schema 
18410 70 61 72 73 65 20 65 71 75 61 6c 73 20 50 33 2e  parse equals P3.
18420 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65  .**.** P1 is the
18430 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
18440 20 77 68 69 63 68 20 69 73 20 30 20 66 6f 72 20   which is 0 for 
18450 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
18460 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 31 20  e file.** and 1 
18470 66 6f 72 20 74 68 65 20 66 69 6c 65 20 68 6f 6c  for the file hol
18480 64 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ding temporary t
18490 61 62 6c 65 73 20 61 6e 64 20 73 6f 6d 65 20 68  ables and some h
184a0 69 67 68 65 72 20 6e 75 6d 62 65 72 0a 2a 2a 20  igher number.** 
184b0 66 6f 72 20 61 75 78 69 6c 69 61 72 79 20 64 61  for auxiliary da
184c0 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  tabases..**.** T
184d0 68 65 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65  he cookie change
184e0 73 20 69 74 73 20 76 61 6c 75 65 20 77 68 65 6e  s its value when
184f0 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73  ever the databas
18500 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
18510 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74  ..** This operat
18520 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 64  ion is used to d
18530 65 74 65 63 74 20 77 68 65 6e 20 74 68 61 74 20  etect when that 
18540 74 68 65 20 63 6f 6f 6b 69 65 20 68 61 73 20 63  the cookie has c
18550 68 61 6e 67 65 64 0a 2a 2a 20 61 6e 64 20 74 68  hanged.** and th
18560 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  at the current p
18570 72 6f 63 65 73 73 20 6e 65 65 64 73 20 74 6f 20  rocess needs to 
18580 72 65 72 65 61 64 20 74 68 65 20 73 63 68 65 6d  reread the schem
18590 61 2e 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20  a..**.** Either 
185a0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  a transaction ne
185b0 65 64 73 20 74 6f 20 68 61 76 65 20 62 65 65 6e  eds to have been
185c0 20 73 74 61 72 74 65 64 20 6f 72 20 61 6e 20 4f   started or an O
185d0 50 5f 4f 70 65 6e 20 6e 65 65 64 73 0a 2a 2a 20  P_Open needs.** 
185e0 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 20 28  to be executed (
185f0 74 6f 20 65 73 74 61 62 6c 69 73 68 20 61 20 72  to establish a r
18600 65 61 64 20 6c 6f 63 6b 29 20 62 65 66 6f 72 65  ead lock) before
18610 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 0a   this opcode is.
18620 2a 2a 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 63  ** invoked..*/.c
18630 61 73 65 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f  ase OP_VerifyCoo
18640 6b 69 65 3a 20 7b 0a 20 20 69 6e 74 20 69 4d 65  kie: {.  int iMe
18650 74 61 3b 0a 20 20 69 6e 74 20 69 47 65 6e 3b 0a  ta;.  int iGen;.
18660 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 0a 20    Btree *pBt;.. 
18670 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
18680 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64  >=0 && pOp->p1<d
18690 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
186a0 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73  rt( (p->btreeMas
186b0 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31  k & (((yDbMask)1
186c0 29 3c 3c 70 4f 70 2d 3e 70 31 29 29 21 3d 30 20  )<<pOp->p1))!=0 
186d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
186e0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
186f0 65 6c 64 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c  eld(db, pOp->p1,
18700 20 30 29 20 29 3b 0a 20 20 70 42 74 20 3d 20 64   0) );.  pBt = d
18710 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e  b->aDb[pOp->p1].
18720 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74 20 29  pBt;.  if( pBt )
18730 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
18740 65 65 47 65 74 4d 65 74 61 28 70 42 74 2c 20 42  eeGetMeta(pBt, B
18750 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53  TREE_SCHEMA_VERS
18760 49 4f 4e 2c 20 28 75 33 32 20 2a 29 26 69 4d 65  ION, (u32 *)&iMe
18770 74 61 29 3b 0a 20 20 20 20 69 47 65 6e 20 3d 20  ta);.    iGen = 
18780 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d  db->aDb[pOp->p1]
18790 2e 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72  .pSchema->iGener
187a0 61 74 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ation;.  }else{.
187b0 20 20 20 20 69 47 65 6e 20 3d 20 69 4d 65 74 61      iGen = iMeta
187c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
187d0 69 4d 65 74 61 21 3d 70 4f 70 2d 3e 70 32 20 7c  iMeta!=pOp->p2 |
187e0 7c 20 69 47 65 6e 21 3d 70 4f 70 2d 3e 70 33 20  | iGen!=pOp->p3 
187f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
18800 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
18810 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
18820 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62  rMsg = sqlite3Db
18830 53 74 72 44 75 70 28 64 62 2c 20 22 64 61 74 61  StrDup(db, "data
18840 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20  base schema has 
18850 63 68 61 6e 67 65 64 22 29 3b 0a 20 20 20 20 2f  changed");.    /
18860 2a 20 49 66 20 74 68 65 20 73 63 68 65 6d 61 2d  * If the schema-
18870 63 6f 6f 6b 69 65 20 66 72 6f 6d 20 74 68 65 20  cookie from the 
18880 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61  database file ma
18890 74 63 68 65 73 20 74 68 65 20 63 6f 6f 6b 69 65  tches the cookie
188a0 20 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20   .    ** stored 
188b0 77 69 74 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  with the in-memo
188c0 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
188d0 6e 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2c  n of the schema,
188e0 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72   do.    ** not r
188f0 65 6c 6f 61 64 20 74 68 65 20 73 63 68 65 6d 61  eload the schema
18900 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
18910 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  se file..    **.
18920 20 20 20 20 2a 2a 20 49 66 20 76 69 72 74 75 61      ** If virtua
18930 6c 2d 74 61 62 6c 65 73 20 61 72 65 20 69 6e 20  l-tables are in 
18940 75 73 65 2c 20 74 68 69 73 20 69 73 20 6e 6f 74  use, this is not
18950 20 6a 75 73 74 20 61 6e 20 6f 70 74 69 6d 69 7a   just an optimiz
18960 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 4f 66  ation..    ** Of
18970 74 65 6e 2c 20 76 2d 74 61 62 6c 65 73 20 73 74  ten, v-tables st
18980 6f 72 65 20 74 68 65 69 72 20 64 61 74 61 20 69  ore their data i
18990 6e 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20 74  n other SQLite t
189a0 61 62 6c 65 73 2c 20 77 68 69 63 68 0a 20 20 20  ables, which.   
189b0 20 2a 2a 20 61 72 65 20 71 75 65 72 69 65 64 20   ** are queried 
189c0 66 72 6f 6d 20 77 69 74 68 69 6e 20 78 4e 65 78  from within xNex
189d0 74 28 29 20 61 6e 64 20 6f 74 68 65 72 20 76 2d  t() and other v-
189e0 74 61 62 6c 65 20 6d 65 74 68 6f 64 73 20 75 73  table methods us
189f0 69 6e 67 0a 20 20 20 20 2a 2a 20 70 72 65 70 61  ing.    ** prepa
18a00 72 65 64 20 71 75 65 72 69 65 73 2e 20 49 66 20  red queries. If 
18a10 73 75 63 68 20 61 20 71 75 65 72 79 20 69 73 20  such a query is 
18a20 6f 75 74 2d 6f 66 2d 64 61 74 65 2c 20 77 65 20  out-of-date, we 
18a30 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 0a 20  do not want to. 
18a40 20 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68     ** discard th
18a50 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
18a60 61 2c 20 61 73 20 74 68 65 20 75 73 65 72 20 63  a, as the user c
18a70 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  ode implementing
18a80 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 2d 74 61   the.    ** v-ta
18a90 62 6c 65 20 77 6f 75 6c 64 20 68 61 76 65 20 74  ble would have t
18aa0 6f 20 62 65 20 72 65 61 64 79 20 66 6f 72 20 74  o be ready for t
18ab0 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  he sqlite3_vtab 
18ac0 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
18ad0 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e  .    ** to be in
18ae0 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e 65 76  validated whenev
18af0 65 72 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  er sqlite3_step(
18b00 29 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  ) is called from
18b10 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20   within .    ** 
18b20 61 20 76 2d 74 61 62 6c 65 20 6d 65 74 68 6f 64  a v-table method
18b30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
18b40 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31   db->aDb[pOp->p1
18b50 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ].pSchema->schem
18b60 61 5f 63 6f 6f 6b 69 65 21 3d 69 4d 65 74 61 20  a_cookie!=iMeta 
18b70 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18b80 52 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 64  ResetOneSchema(d
18b90 62 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20  b, pOp->p1);.   
18ba0 20 7d 0a 0a 20 20 20 20 70 2d 3e 65 78 70 69 72   }..    p->expir
18bb0 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d  ed = 1;.    rc =
18bc0 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3b 0a   SQLITE_SCHEMA;.
18bd0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
18be0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 52  /* Opcode: OpenR
18bf0 65 61 64 20 50 31 20 50 32 20 50 33 20 50 34 20  ead P1 P2 P3 P4 
18c00 50 35 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  P5.**.** Open a 
18c10 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
18c20 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
18c30 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20 72 6f  e table whose ro
18c40 6f 74 20 70 61 67 65 20 69 73 0a 2a 2a 20 50 32  ot page is.** P2
18c50 20 69 6e 20 61 20 64 61 74 61 62 61 73 65 20 66   in a database f
18c60 69 6c 65 2e 20 20 54 68 65 20 64 61 74 61 62 61  ile.  The databa
18c70 73 65 20 66 69 6c 65 20 69 73 20 64 65 74 65 72  se file is deter
18c80 6d 69 6e 65 64 20 62 79 20 50 33 2e 20 0a 2a 2a  mined by P3. .**
18c90 20 50 33 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65   P3==0 means the
18ca0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2c 20   main database, 
18cb0 50 33 3d 3d 31 20 6d 65 61 6e 73 20 74 68 65 20  P3==1 means the 
18cc0 64 61 74 61 62 61 73 65 20 75 73 65 64 20 66 6f  database used fo
18cd0 72 20 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  r .** temporary 
18ce0 74 61 62 6c 65 73 2c 20 61 6e 64 20 50 33 3e 31  tables, and P3>1
18cf0 20 6d 65 61 6e 73 20 75 73 65 64 20 74 68 65 20   means used the 
18d00 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 74  corresponding at
18d10 74 61 63 68 65 64 0a 2a 2a 20 64 61 74 61 62 61  tached.** databa
18d20 73 65 2e 20 20 47 69 76 65 20 74 68 65 20 6e 65  se.  Give the ne
18d30 77 20 63 75 72 73 6f 72 20 61 6e 20 69 64 65 6e  w cursor an iden
18d40 74 69 66 69 65 72 20 6f 66 20 50 31 2e 20 20 54  tifier of P1.  T
18d50 68 65 20 50 31 0a 2a 2a 20 76 61 6c 75 65 73 20  he P1.** values 
18d60 6e 65 65 64 20 6e 6f 74 20 62 65 20 63 6f 6e 74  need not be cont
18d70 69 67 75 6f 75 73 20 62 75 74 20 61 6c 6c 20 50  iguous but all P
18d80 31 20 76 61 6c 75 65 73 20 73 68 6f 75 6c 64 20  1 values should 
18d90 62 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72  be small integer
18da0 73 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20 65  s..** It is an e
18db0 72 72 6f 72 20 66 6f 72 20 50 31 20 74 6f 20 62  rror for P1 to b
18dc0 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  e negative..**.*
18dd0 2a 20 49 66 20 50 35 21 3d 30 20 74 68 65 6e 20  * If P5!=0 then 
18de0 75 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  use the content 
18df0 6f 66 20 72 65 67 69 73 74 65 72 20 50 32 20 61  of register P2 a
18e00 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c  s the root page,
18e10 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 76 61 6c 75   not.** the valu
18e20 65 20 6f 66 20 50 32 20 69 74 73 65 6c 66 2e 0a  e of P2 itself..
18e30 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 77 69 6c 6c  **.** There will
18e40 20 62 65 20 61 20 72 65 61 64 20 6c 6f 63 6b 20   be a read lock 
18e50 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
18e60 77 68 65 6e 65 76 65 72 20 74 68 65 72 65 20 69  whenever there i
18e70 73 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 63 75 72  s an.** open cur
18e80 73 6f 72 2e 20 20 49 66 20 74 68 65 20 64 61 74  sor.  If the dat
18e90 61 62 61 73 65 20 77 61 73 20 75 6e 6c 6f 63 6b  abase was unlock
18ea0 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  ed prior to this
18eb0 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20   instruction.** 
18ec0 74 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b  then a read lock
18ed0 20 69 73 20 61 63 71 75 69 72 65 64 20 61 73 20   is acquired as 
18ee0 70 61 72 74 20 6f 66 20 74 68 69 73 20 69 6e 73  part of this ins
18ef0 74 72 75 63 74 69 6f 6e 2e 20 20 41 20 72 65 61  truction.  A rea
18f00 64 0a 2a 2a 20 6c 6f 63 6b 20 61 6c 6c 6f 77 73  d.** lock allows
18f10 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
18f20 20 74 6f 20 72 65 61 64 20 74 68 65 20 64 61 74   to read the dat
18f30 61 62 61 73 65 20 62 75 74 20 70 72 6f 68 69 62  abase but prohib
18f40 69 74 73 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72  its.** any other
18f50 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20 6d 6f   process from mo
18f60 64 69 66 79 69 6e 67 20 74 68 65 20 64 61 74 61  difying the data
18f70 62 61 73 65 2e 20 20 54 68 65 20 72 65 61 64 20  base.  The read 
18f80 6c 6f 63 6b 20 69 73 0a 2a 2a 20 72 65 6c 65 61  lock is.** relea
18f90 73 65 64 20 77 68 65 6e 20 61 6c 6c 20 63 75 72  sed when all cur
18fa0 73 6f 72 73 20 61 72 65 20 63 6c 6f 73 65 64 2e  sors are closed.
18fb0 20 20 49 66 20 74 68 69 73 20 69 6e 73 74 72 75    If this instru
18fc0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 0a 2a  ction attempts.*
18fd0 2a 20 74 6f 20 67 65 74 20 61 20 72 65 61 64 20  * to get a read 
18fe0 6c 6f 63 6b 20 62 75 74 20 66 61 69 6c 73 2c 20  lock but fails, 
18ff0 74 68 65 20 73 63 72 69 70 74 20 74 65 72 6d 69  the script termi
19000 6e 61 74 65 73 20 77 69 74 68 20 61 6e 0a 2a 2a  nates with an.**
19010 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
19020 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  or code..**.** T
19030 68 65 20 50 34 20 76 61 6c 75 65 20 6d 61 79 20  he P4 value may 
19040 62 65 20 65 69 74 68 65 72 20 61 6e 20 69 6e 74  be either an int
19050 65 67 65 72 20 28 50 34 5f 49 4e 54 33 32 29 20  eger (P4_INT32) 
19060 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  or a pointer to.
19070 2a 2a 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  ** a KeyInfo str
19080 75 63 74 75 72 65 20 28 50 34 5f 4b 45 59 49 4e  ucture (P4_KEYIN
19090 46 4f 29 2e 20 49 66 20 69 74 20 69 73 20 61 20  FO). If it is a 
190a0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79  pointer to a Key
190b0 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75  Info .** structu
190c0 72 65 2c 20 74 68 65 6e 20 73 61 69 64 20 73 74  re, then said st
190d0 72 75 63 74 75 72 65 20 64 65 66 69 6e 65 73 20  ructure defines 
190e0 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  the content and 
190f0 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a 2a 20 73 65  collating .** se
19100 71 75 65 6e 63 65 20 6f 66 20 74 68 65 20 69 6e  quence of the in
19110 64 65 78 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  dex being opened
19120 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
19130 50 34 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  P4 is an integer
19140 20 0a 2a 2a 20 76 61 6c 75 65 2c 20 69 74 20 69   .** value, it i
19150 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
19160 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
19170 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  n the table..**.
19180 2a 2a 20 53 65 65 20 61 6c 73 6f 20 4f 70 65 6e  ** See also Open
19190 57 72 69 74 65 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  Write..*/./* Opc
191a0 6f 64 65 3a 20 4f 70 65 6e 57 72 69 74 65 20 50  ode: OpenWrite P
191b0 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
191c0 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2f  .** Open a read/
191d0 77 72 69 74 65 20 63 75 72 73 6f 72 20 6e 61 6d  write cursor nam
191e0 65 64 20 50 31 20 6f 6e 20 74 68 65 20 74 61 62  ed P1 on the tab
191f0 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68 6f 73  le or index whos
19200 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69  e root.** page i
19210 73 20 50 32 2e 20 20 4f 72 20 69 66 20 50 35 21  s P2.  Or if P5!
19220 3d 30 20 75 73 65 20 74 68 65 20 63 6f 6e 74 65  =0 use the conte
19230 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
19240 32 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a  2 to find the.**
19250 20 72 6f 6f 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a   root page..**.*
19260 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65 20 6d  * The P4 value m
19270 61 79 20 62 65 20 65 69 74 68 65 72 20 61 6e 20  ay be either an 
19280 69 6e 74 65 67 65 72 20 28 50 34 5f 49 4e 54 33  integer (P4_INT3
19290 32 29 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20  2) or a pointer 
192a0 74 6f 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f 20  to.** a KeyInfo 
192b0 73 74 72 75 63 74 75 72 65 20 28 50 34 5f 4b 45  structure (P4_KE
192c0 59 49 4e 46 4f 29 2e 20 49 66 20 69 74 20 69 73  YINFO). If it is
192d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
192e0 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75  KeyInfo .** stru
192f0 63 74 75 72 65 2c 20 74 68 65 6e 20 73 61 69 64  cture, then said
19300 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69 6e   structure defin
19310 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61  es the content a
19320 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a 2a  nd collating .**
19330 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65   sequence of the
19340 20 69 6e 64 65 78 20 62 65 69 6e 67 20 6f 70 65   index being ope
19350 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
19360 69 66 20 50 34 20 69 73 20 61 6e 20 69 6e 74 65  if P4 is an inte
19370 67 65 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20 69  ger .** value, i
19380 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
19390 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
193a0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20  s in the table, 
193b0 6f 72 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 61 72  or to the.** lar
193c0 67 65 73 74 20 69 6e 64 65 78 20 6f 66 20 61 6e  gest index of an
193d0 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  y column of the 
193e0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 61 63  table that is ac
193f0 74 75 61 6c 6c 79 20 75 73 65 64 2e 0a 2a 2a 0a  tually used..**.
19400 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  ** This instruct
19410 69 6f 6e 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  ion works just l
19420 69 6b 65 20 4f 70 65 6e 52 65 61 64 20 65 78 63  ike OpenRead exc
19430 65 70 74 20 74 68 61 74 20 69 74 20 6f 70 65 6e  ept that it open
19440 73 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  s the cursor.** 
19450 69 6e 20 72 65 61 64 2f 77 72 69 74 65 20 6d 6f  in read/write mo
19460 64 65 2e 20 20 46 6f 72 20 61 20 67 69 76 65 6e  de.  For a given
19470 20 74 61 62 6c 65 2c 20 74 68 65 72 65 20 63 61   table, there ca
19480 6e 20 62 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  n be one or more
19490 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75   read-only.** cu
194a0 72 73 6f 72 73 20 6f 72 20 61 20 73 69 6e 67 6c  rsors or a singl
194b0 65 20 72 65 61 64 2f 77 72 69 74 65 20 63 75 72  e read/write cur
194c0 73 6f 72 20 62 75 74 20 6e 6f 74 20 62 6f 74 68  sor but not both
194d0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
194e0 20 4f 70 65 6e 52 65 61 64 2e 0a 2a 2f 0a 63 61   OpenRead..*/.ca
194f0 73 65 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3a 0a  se OP_OpenRead:.
19500 63 61 73 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74  case OP_OpenWrit
19510 65 3a 20 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c  e: {.  int nFiel
19520 64 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  d;.  KeyInfo *pK
19530 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 70 32  eyInfo;.  int p2
19540 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69  ;.  int iDb;.  i
19550 6e 74 20 77 72 46 6c 61 67 3b 0a 20 20 42 74 72  nt wrFlag;.  Btr
19560 65 65 20 2a 70 58 3b 0a 20 20 56 64 62 65 43 75  ee *pX;.  VdbeCu
19570 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 44 62  rsor *pCur;.  Db
19580 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74   *pDb;..  assert
19590 28 20 28 70 4f 70 2d 3e 70 35 26 28 4f 50 46 4c  ( (pOp->p5&(OPFL
195a0 41 47 5f 50 32 49 53 52 45 47 7c 4f 50 46 4c 41  AG_P2ISREG|OPFLA
195b0 47 5f 42 55 4c 4b 43 53 52 29 29 3d 3d 70 4f 70  G_BULKCSR))==pOp
195c0 2d 3e 70 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ->p5 );.  assert
195d0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
195e0 50 5f 4f 70 65 6e 57 72 69 74 65 20 7c 7c 20 70  P_OpenWrite || p
195f0 4f 70 2d 3e 70 35 3d 3d 30 20 29 3b 0a 0a 20 20  Op->p5==0 );..  
19600 69 66 28 20 70 2d 3e 65 78 70 69 72 65 64 20 29  if( p->expired )
19610 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19620 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20 62 72 65  E_ABORT;.    bre
19630 61 6b 3b 0a 20 20 7d 0a 0a 20 20 6e 46 69 65 6c  ak;.  }..  nFiel
19640 64 20 3d 20 30 3b 0a 20 20 70 4b 65 79 49 6e 66  d = 0;.  pKeyInf
19650 6f 20 3d 20 30 3b 0a 20 20 70 32 20 3d 20 70 4f  o = 0;.  p2 = pO
19660 70 2d 3e 70 32 3b 0a 20 20 69 44 62 20 3d 20 70  p->p2;.  iDb = p
19670 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72 74  Op->p3;.  assert
19680 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
19690 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
196a0 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61  ert( (p->btreeMa
196b0 73 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29  sk & (((yDbMask)
196c0 31 29 3c 3c 69 44 62 29 29 21 3d 30 20 29 3b 0a  1)<<iDb))!=0 );.
196d0 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
196e0 5b 69 44 62 5d 3b 0a 20 20 70 58 20 3d 20 70 44  [iDb];.  pX = pD
196f0 62 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  b->pBt;.  assert
19700 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( pX!=0 );.  if(
19710 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
19720 5f 4f 70 65 6e 57 72 69 74 65 20 29 7b 0a 20 20  _OpenWrite ){.  
19730 20 20 77 72 46 6c 61 67 20 3d 20 31 3b 0a 20 20    wrFlag = 1;.  
19740 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
19750 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
19760 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
19770 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63      if( pDb->pSc
19780 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  hema->file_forma
19790 74 20 3c 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46  t < p->minWriteF
197a0 69 6c 65 46 6f 72 6d 61 74 20 29 7b 0a 20 20 20  ileFormat ){.   
197b0 20 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69     p->minWriteFi
197c0 6c 65 46 6f 72 6d 61 74 20 3d 20 70 44 62 2d 3e  leFormat = pDb->
197d0 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f  pSchema->file_fo
197e0 72 6d 61 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rmat;.    }.  }e
197f0 6c 73 65 7b 0a 20 20 20 20 77 72 46 6c 61 67 20  lse{.    wrFlag 
19800 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
19810 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
19820 50 32 49 53 52 45 47 20 29 7b 0a 20 20 20 20 61  P2ISREG ){.    a
19830 73 73 65 72 74 28 20 70 32 3e 30 20 29 3b 0a 20  ssert( p2>0 );. 
19840 20 20 20 61 73 73 65 72 74 28 20 70 32 3c 3d 70     assert( p2<=p
19850 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 70 49  ->nMem );.    pI
19860 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a  n2 = &aMem[p2];.
19870 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
19880 73 56 61 6c 69 64 28 70 49 6e 32 29 20 29 3b 0a  sValid(pIn2) );.
19890 20 20 20 20 61 73 73 65 72 74 28 20 28 70 49 6e      assert( (pIn
198a0 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  2->flags & MEM_I
198b0 6e 74 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 71  nt)!=0 );.    sq
198c0 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65  lite3VdbeMemInte
198d0 67 65 72 69 66 79 28 70 49 6e 32 29 3b 0a 20 20  gerify(pIn2);.  
198e0 20 20 70 32 20 3d 20 28 69 6e 74 29 70 49 6e 32    p2 = (int)pIn2
198f0 2d 3e 75 2e 69 3b 0a 20 20 20 20 2f 2a 20 54 68  ->u.i;.    /* Th
19900 65 20 70 32 20 76 61 6c 75 65 20 61 6c 77 61 79  e p2 value alway
19910 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61 20 70  s comes from a p
19920 72 69 6f 72 20 4f 50 5f 43 72 65 61 74 65 54 61  rior OP_CreateTa
19930 62 6c 65 20 6f 70 63 6f 64 65 20 61 6e 64 0a 20  ble opcode and. 
19940 20 20 20 2a 2a 20 74 68 61 74 20 6f 70 63 6f 64     ** that opcod
19950 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 73 65  e will always se
19960 74 20 74 68 65 20 70 32 20 76 61 6c 75 65 20 74  t the p2 value t
19970 6f 20 32 20 6f 72 20 6d 6f 72 65 20 6f 72 20 65  o 2 or more or e
19980 6c 73 65 20 66 61 69 6c 2e 0a 20 20 20 20 2a 2a  lse fail..    **
19990 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 61   If there were a
199a0 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 70 72   failure, the pr
199b0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
199c0 20 77 6f 75 6c 64 20 68 61 76 65 20 68 61 6c 74   would have halt
199d0 65 64 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  ed.    ** before
199e0 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 69   reaching this i
199f0 6e 73 74 72 75 63 74 69 6f 6e 2e 20 2a 2f 0a 20  nstruction. */. 
19a00 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 32 3c     if( NEVER(p2<
19a10 32 29 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20  2) ) {.      rc 
19a20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
19a30 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
19a40 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
19a50 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
19a60 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
19a70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b  e==P4_KEYINFO ){
19a80 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
19a90 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
19aa0 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e  ;.    pKeyInfo->
19ab0 65 6e 63 20 3d 20 45 4e 43 28 70 2d 3e 64 62 29  enc = ENC(p->db)
19ac0 3b 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 70  ;.    nField = p
19ad0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
19ae0 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
19af0 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49  Op->p4type==P4_I
19b00 4e 54 33 32 20 29 7b 0a 20 20 20 20 6e 46 69 65  NT32 ){.    nFie
19b10 6c 64 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  ld = pOp->p4.i;.
19b20 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4f    }.  assert( pO
19b30 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 70 43  p->p1>=0 );.  pC
19b40 75 72 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72  ur = allocateCur
19b50 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20  sor(p, pOp->p1, 
19b60 6e 46 69 65 6c 64 2c 20 69 44 62 2c 20 31 29 3b  nField, iDb, 1);
19b70 0a 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29  .  if( pCur==0 )
19b80 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
19b90 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20  pCur->nullRow = 
19ba0 31 3b 0a 20 20 70 43 75 72 2d 3e 69 73 4f 72 64  1;.  pCur->isOrd
19bb0 65 72 65 64 20 3d 20 31 3b 0a 20 20 72 63 20 3d  ered = 1;.  rc =
19bc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
19bd0 73 6f 72 28 70 58 2c 20 70 32 2c 20 77 72 46 6c  sor(pX, p2, wrFl
19be0 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
19bf0 75 72 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20  ur->pCursor);.  
19c00 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
19c10 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73   pKeyInfo;.  ass
19c20 65 72 74 28 20 4f 50 46 4c 41 47 5f 42 55 4c 4b  ert( OPFLAG_BULK
19c30 43 53 52 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c  CSR==BTREE_BULKL
19c40 4f 41 44 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  OAD );.  sqlite3
19c50 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74 73  BtreeCursorHints
19c60 28 70 43 75 72 2d 3e 70 43 75 72 73 6f 72 2c 20  (pCur->pCursor, 
19c70 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41  (pOp->p5 & OPFLA
19c80 47 5f 42 55 4c 4b 43 53 52 29 29 3b 0a 0a 20 20  G_BULKCSR));..  
19c90 2f 2a 20 53 69 6e 63 65 20 69 74 20 70 65 72 66  /* Since it perf
19ca0 6f 72 6d 73 20 6e 6f 20 6d 65 6d 6f 72 79 20 61  orms no memory a
19cb0 6c 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 49 4f 2c  llocation or IO,
19cc0 20 74 68 65 20 6f 6e 6c 79 20 76 61 6c 75 65 20   the only value 
19cd0 74 68 61 74 0a 20 20 2a 2a 20 73 71 6c 69 74 65  that.  ** sqlite
19ce0 33 42 74 72 65 65 43 75 72 73 6f 72 28 29 20 6d  3BtreeCursor() m
19cf0 61 79 20 72 65 74 75 72 6e 20 69 73 20 53 51 4c  ay return is SQL
19d00 49 54 45 5f 4f 4b 2e 20 2a 2f 0a 20 20 61 73 73  ITE_OK. */.  ass
19d10 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
19d20 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  OK );..  /* Set 
19d30 74 68 65 20 56 64 62 65 43 75 72 73 6f 72 2e 69  the VdbeCursor.i
19d40 73 54 61 62 6c 65 20 61 6e 64 20 69 73 49 6e 64  sTable and isInd
19d50 65 78 20 76 61 72 69 61 62 6c 65 73 2e 20 50 72  ex variables. Pr
19d60 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20  evious versions 
19d70 6f 66 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 75  of.  ** SQLite u
19d80 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20  sed to check if 
19d90 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 66 6c  the root-page fl
19da0 61 67 73 20 77 65 72 65 20 73 61 6e 65 20 61 74  ags were sane at
19db0 20 74 68 69 73 20 70 6f 69 6e 74 0a 20 20 2a 2a   this point.  **
19dc0 20 61 6e 64 20 72 65 70 6f 72 74 20 64 61 74 61   and report data
19dd0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
19de0 69 66 20 74 68 65 79 20 77 65 72 65 20 6e 6f 74  if they were not
19df0 2c 20 62 75 74 20 74 68 69 73 20 63 68 65 63 6b  , but this check
19e00 20 68 61 73 0a 20 20 2a 2a 20 73 69 6e 63 65 20   has.  ** since 
19e10 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20 62  moved into the b
19e20 74 72 65 65 20 6c 61 79 65 72 2e 20 20 2a 2f 20  tree layer.  */ 
19e30 20 0a 20 20 70 43 75 72 2d 3e 69 73 54 61 62 6c   .  pCur->isTabl
19e40 65 20 3d 20 70 4f 70 2d 3e 70 34 74 79 70 65 21  e = pOp->p4type!
19e50 3d 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 70  =P4_KEYINFO;.  p
19e60 43 75 72 2d 3e 69 73 49 6e 64 65 78 20 3d 20 21  Cur->isIndex = !
19e70 70 43 75 72 2d 3e 69 73 54 61 62 6c 65 3b 0a 20  pCur->isTable;. 
19e80 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
19e90 63 6f 64 65 3a 20 4f 70 65 6e 45 70 68 65 6d 65  code: OpenEpheme
19ea0 72 61 6c 20 50 31 20 50 32 20 2a 20 50 34 20 50  ral P1 P2 * P4 P
19eb0 35 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  5.**.** Open a n
19ec0 65 77 20 63 75 72 73 6f 72 20 50 31 20 74 6f 20  ew cursor P1 to 
19ed0 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
19ee0 65 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  e..** The cursor
19ef0 20 69 73 20 61 6c 77 61 79 73 20 6f 70 65 6e 65   is always opene
19f00 64 20 72 65 61 64 2f 77 72 69 74 65 20 65 76 65  d read/write eve
19f10 6e 20 69 66 20 0a 2a 2a 20 74 68 65 20 6d 61 69  n if .** the mai
19f20 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  n database is re
19f30 61 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 65 70  ad-only.  The ep
19f40 68 65 6d 65 72 61 6c 0a 2a 2a 20 74 61 62 6c 65  hemeral.** table
19f50 20 69 73 20 64 65 6c 65 74 65 64 20 61 75 74 6f   is deleted auto
19f60 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
19f70 68 65 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  he cursor is clo
19f80 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73  sed..**.** P2 is
19f90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
19fa0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 65 70  olumns in the ep
19fb0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 2a  hemeral table..*
19fc0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69  * The cursor poi
19fd0 6e 74 73 20 74 6f 20 61 20 42 54 72 65 65 20 74  nts to a BTree t
19fe0 61 62 6c 65 20 69 66 20 50 34 3d 3d 30 20 61 6e  able if P4==0 an
19ff0 64 20 74 6f 20 61 20 42 54 72 65 65 20 69 6e 64  d to a BTree ind
1a000 65 78 0a 2a 2a 20 69 66 20 50 34 20 69 73 20 6e  ex.** if P4 is n
1a010 6f 74 20 30 2e 20 20 49 66 20 50 34 20 69 73 20  ot 0.  If P4 is 
1a020 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69  not NULL, it poi
1a030 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  nts to a KeyInfo
1a040 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68   structure.** th
1a050 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 66  at defines the f
1a060 6f 72 6d 61 74 20 6f 66 20 6b 65 79 73 20 69 6e  ormat of keys in
1a070 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a   the index..**.*
1a080 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 61  * This opcode wa
1a090 73 20 6f 6e 63 65 20 63 61 6c 6c 65 64 20 4f 70  s once called Op
1a0a0 65 6e 54 65 6d 70 2e 20 20 42 75 74 20 74 68 61  enTemp.  But tha
1a0b0 74 20 63 72 65 61 74 65 64 0a 2a 2a 20 63 6f 6e  t created.** con
1a0c0 66 75 73 69 6f 6e 20 62 65 63 61 75 73 65 20 74  fusion because t
1a0d0 68 65 20 74 65 72 6d 20 22 74 65 6d 70 20 74 61  he term "temp ta
1a0e0 62 6c 65 22 2c 20 6d 69 67 68 74 20 72 65 66 65  ble", might refe
1a0f0 72 20 65 69 74 68 65 72 0a 2a 2a 20 74 6f 20 61  r either.** to a
1a100 20 54 45 4d 50 20 74 61 62 6c 65 20 61 74 20 74   TEMP table at t
1a110 68 65 20 53 51 4c 20 6c 65 76 65 6c 2c 20 6f 72  he SQL level, or
1a120 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 70 65 6e   to a table open
1a130 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 6f 70  ed by.** this op
1a140 63 6f 64 65 2e 20 20 54 68 65 6e 20 74 68 69 73  code.  Then this
1a150 20 6f 70 63 6f 64 65 20 77 61 73 20 63 61 6c 6c   opcode was call
1a160 20 4f 70 65 6e 56 69 72 74 75 61 6c 2e 20 20 42   OpenVirtual.  B
1a170 75 74 0a 2a 2a 20 74 68 61 74 20 63 72 65 61 74  ut.** that creat
1a180 65 64 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74  ed confusion wit
1a190 68 20 74 68 65 20 77 68 6f 6c 65 20 76 69 72 74  h the whole virt
1a1a0 75 61 6c 2d 74 61 62 6c 65 20 69 64 65 61 2e 0a  ual-table idea..
1a1b0 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 70 61 72  **.** The P5 par
1a1c0 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20 61 20  ameter can be a 
1a1d0 6d 61 73 6b 20 6f 66 20 74 68 65 20 42 54 52 45  mask of the BTRE
1a1e0 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65  E_* flags define
1a1f0 64 0a 2a 2a 20 69 6e 20 62 74 72 65 65 2e 68 2e  d.** in btree.h.
1a200 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 63 6f    These flags co
1a210 6e 74 72 6f 6c 20 61 73 70 65 63 74 73 20 6f 66  ntrol aspects of
1a220 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f   the operation o
1a230 66 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 2e 20  f.** the btree. 
1a240 20 54 68 65 20 42 54 52 45 45 5f 4f 4d 49 54 5f   The BTREE_OMIT_
1a250 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 42 54 52 45  JOURNAL and BTRE
1a260 45 5f 53 49 4e 47 4c 45 20 66 6c 61 67 73 20 61  E_SINGLE flags a
1a270 72 65 0a 2a 2a 20 61 64 64 65 64 20 61 75 74 6f  re.** added auto
1a280 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 2f 2a  matically..*/./*
1a290 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 41 75 74   Opcode: OpenAut
1a2a0 6f 69 6e 64 65 78 20 50 31 20 50 32 20 2a 20 50  oindex P1 P2 * P
1a2b0 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  4 *.**.** This o
1a2c0 70 63 6f 64 65 20 77 6f 72 6b 73 20 74 68 65 20  pcode works the 
1a2d0 73 61 6d 65 20 61 73 20 4f 50 5f 4f 70 65 6e 45  same as OP_OpenE
1a2e0 70 68 65 6d 65 72 61 6c 2e 20 20 49 74 20 68 61  phemeral.  It ha
1a2f0 73 20 61 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74  s a.** different
1a300 20 6e 61 6d 65 20 74 6f 20 64 69 73 74 69 6e 67   name to disting
1a310 75 69 73 68 20 69 74 73 20 75 73 65 2e 20 20 54  uish its use.  T
1a320 61 62 6c 65 73 20 63 72 65 61 74 65 64 20 75 73  ables created us
1a330 69 6e 67 0a 2a 2a 20 62 79 20 74 68 69 73 20 6f  ing.** by this o
1a340 70 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 75 73  pcode will be us
1a350 65 64 20 66 6f 72 20 61 75 74 6f 6d 61 74 69 63  ed for automatic
1a360 61 6c 6c 79 20 63 72 65 61 74 65 64 20 74 72 61  ally created tra
1a370 6e 73 69 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 65  nsient.** indice
1a380 73 20 69 6e 20 6a 6f 69 6e 73 2e 0a 2a 2f 0a 63  s in joins..*/.c
1a390 61 73 65 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69  ase OP_OpenAutoi
1a3a0 6e 64 65 78 3a 20 0a 63 61 73 65 20 4f 50 5f 4f  ndex: .case OP_O
1a3b0 70 65 6e 45 70 68 65 6d 65 72 61 6c 3a 20 7b 0a  penEphemeral: {.
1a3c0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
1a3d0 78 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  x;.  static cons
1a3e0 74 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 3d  t int vfsFlags =
1a3f0 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f   .      SQLITE_O
1a400 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a  PEN_READWRITE |.
1a410 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1a420 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
1a430 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
1a440 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 53  LUSIVE |.      S
1a450 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
1a460 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20  EONCLOSE |.     
1a470 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41   SQLITE_OPEN_TRA
1a480 4e 53 49 45 4e 54 5f 44 42 3b 0a 0a 20 20 61 73  NSIENT_DB;..  as
1a490 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
1a4a0 20 29 3b 0a 20 20 70 43 78 20 3d 20 61 6c 6c 6f   );.  pCx = allo
1a4b0 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f  cateCursor(p, pO
1a4c0 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20  p->p1, pOp->p2, 
1a4d0 2d 31 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43  -1, 1);.  if( pC
1a4e0 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  x==0 ) goto no_m
1a4f0 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c 52  em;.  pCx->nullR
1a500 6f 77 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73  ow = 1;.  rc = s
1a510 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
1a520 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c  db->pVfs, 0, db,
1a530 20 26 70 43 78 2d 3e 70 42 74 2c 20 0a 20 20 20   &pCx->pBt, .   
1a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a550 20 20 20 20 20 42 54 52 45 45 5f 4f 4d 49 54 5f       BTREE_OMIT_
1a560 4a 4f 55 52 4e 41 4c 20 7c 20 42 54 52 45 45 5f  JOURNAL | BTREE_
1a570 53 49 4e 47 4c 45 20 7c 20 70 4f 70 2d 3e 70 35  SINGLE | pOp->p5
1a580 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 69  , vfsFlags);.  i
1a590 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a5a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1a5b0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
1a5c0 61 6e 73 28 70 43 78 2d 3e 70 42 74 2c 20 31 29  ans(pCx->pBt, 1)
1a5d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1a5e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a5f0 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 69 65   /* If a transie
1a600 6e 74 20 69 6e 64 65 78 20 69 73 20 72 65 71 75  nt index is requ
1a610 69 72 65 64 2c 20 63 72 65 61 74 65 20 69 74 20  ired, create it 
1a620 62 79 20 63 61 6c 6c 69 6e 67 0a 20 20 20 20 2a  by calling.    *
1a630 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72  * sqlite3BtreeCr
1a640 65 61 74 65 54 61 62 6c 65 28 29 20 77 69 74 68  eateTable() with
1a650 20 74 68 65 20 42 54 52 45 45 5f 42 4c 4f 42 4b   the BTREE_BLOBK
1a660 45 59 20 66 6c 61 67 20 62 65 66 6f 72 65 0a 20  EY flag before. 
1a670 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 69 74     ** opening it
1a680 2e 20 49 66 20 61 20 74 72 61 6e 73 69 65 6e 74  . If a transient
1a690 20 74 61 62 6c 65 20 69 73 20 72 65 71 75 69 72   table is requir
1a6a0 65 64 2c 20 6a 75 73 74 20 75 73 65 20 74 68 65  ed, just use the
1a6b0 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
1a6c0 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 74 61  cally created ta
1a6d0 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
1a6e0 67 65 20 31 20 28 61 6e 20 42 4c 4f 42 5f 49 4e  ge 1 (an BLOB_IN
1a6f0 54 4b 45 59 20 74 61 62 6c 65 29 2e 0a 20 20 20  TKEY table)..   
1a700 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 70 2d   */.    if( pOp-
1a710 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  >p4.pKeyInfo ){.
1a720 20 20 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a        int pgno;.
1a730 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
1a740 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45  p->p4type==P4_KE
1a750 59 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20 72  YINFO );.      r
1a760 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1a770 43 72 65 61 74 65 54 61 62 6c 65 28 70 43 78 2d  CreateTable(pCx-
1a780 3e 70 42 74 2c 20 26 70 67 6e 6f 2c 20 42 54 52  >pBt, &pgno, BTR
1a790 45 45 5f 42 4c 4f 42 4b 45 59 20 7c 20 70 4f 70  EE_BLOBKEY | pOp
1a7a0 2d 3e 70 35 29 3b 20 0a 20 20 20 20 20 20 69 66  ->p5); .      if
1a7b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a7c0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1a7d0 74 28 20 70 67 6e 6f 3d 3d 4d 41 53 54 45 52 5f  t( pgno==MASTER_
1a7e0 52 4f 4f 54 2b 31 20 29 3b 0a 20 20 20 20 20 20  ROOT+1 );.      
1a7f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1a800 72 65 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70  reeCursor(pCx->p
1a810 42 74 2c 20 70 67 6e 6f 2c 20 31 2c 20 0a 20 20  Bt, pgno, 1, .  
1a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4b                (K
1a840 65 79 49 6e 66 6f 2a 29 70 4f 70 2d 3e 70 34 2e  eyInfo*)pOp->p4.
1a850 7a 2c 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  z, pCx->pCursor)
1a860 3b 0a 20 20 20 20 20 20 20 20 70 43 78 2d 3e 70  ;.        pCx->p
1a870 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
1a880 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
1a890 20 20 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66      pCx->pKeyInf
1a8a0 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 70 2d 3e  o->enc = ENC(p->
1a8b0 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  db);.      }.   
1a8c0 20 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 20     pCx->isTable 
1a8d0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1a8e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1a8f0 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 70 43  e3BtreeCursor(pC
1a900 78 2d 3e 70 42 74 2c 20 4d 41 53 54 45 52 5f 52  x->pBt, MASTER_R
1a910 4f 4f 54 2c 20 31 2c 20 30 2c 20 70 43 78 2d 3e  OOT, 1, 0, pCx->
1a920 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  pCursor);.      
1a930 70 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20 31  pCx->isTable = 1
1a940 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43  ;.    }.  }.  pC
1a950 78 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 28  x->isOrdered = (
1a960 70 4f 70 2d 3e 70 35 21 3d 42 54 52 45 45 5f 55  pOp->p5!=BTREE_U
1a970 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 70 43 78  NORDERED);.  pCx
1a980 2d 3e 69 73 49 6e 64 65 78 20 3d 20 21 70 43 78  ->isIndex = !pCx
1a990 2d 3e 69 73 54 61 62 6c 65 3b 0a 20 20 62 72 65  ->isTable;.  bre
1a9a0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1a9b0 3a 20 4f 70 65 6e 53 6f 72 74 65 72 20 50 31 20  : OpenSorter P1 
1a9c0 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  P2 * P4 *.**.** 
1a9d0 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b  This opcode work
1a9e0 73 20 6c 69 6b 65 20 4f 50 5f 4f 70 65 6e 45 70  s like OP_OpenEp
1a9f0 68 65 6d 65 72 61 6c 20 65 78 63 65 70 74 20 74  hemeral except t
1aa00 68 61 74 20 69 74 20 6f 70 65 6e 73 0a 2a 2a 20  hat it opens.** 
1aa10 61 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65  a transient inde
1aa20 78 20 74 68 61 74 20 69 73 20 73 70 65 63 69 66  x that is specif
1aa30 69 63 61 6c 6c 79 20 64 65 73 69 67 6e 65 64 20  ically designed 
1aa40 74 6f 20 73 6f 72 74 20 6c 61 72 67 65 0a 2a 2a  to sort large.**
1aa50 20 74 61 62 6c 65 73 20 75 73 69 6e 67 20 61 6e   tables using an
1aa60 20 65 78 74 65 72 6e 61 6c 20 6d 65 72 67 65 2d   external merge-
1aa70 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 2e 0a  sort algorithm..
1aa80 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65  */.case OP_Sorte
1aa90 72 4f 70 65 6e 3a 20 7b 0a 20 20 56 64 62 65 43  rOpen: {.  VdbeC
1aaa0 75 72 73 6f 72 20 2a 70 43 78 3b 0a 0a 23 69 66  ursor *pCx;..#if
1aab0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1aac0 5f 4d 45 52 47 45 5f 53 4f 52 54 0a 20 20 70 43  _MERGE_SORT.  pC
1aad0 78 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  x = allocateCurs
1aae0 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  or(p, pOp->p1, p
1aaf0 4f 70 2d 3e 70 32 2c 20 2d 31 2c 20 31 29 3b 0a  Op->p2, -1, 1);.
1ab00 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20 67    if( pCx==0 ) g
1ab10 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43  oto no_mem;.  pC
1ab20 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f  x->pKeyInfo = pO
1ab30 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
1ab40 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d    pCx->pKeyInfo-
1ab50 3e 65 6e 63 20 3d 20 45 4e 43 28 70 2d 3e 64 62  >enc = ENC(p->db
1ab60 29 3b 0a 20 20 70 43 78 2d 3e 69 73 53 6f 72 74  );.  pCx->isSort
1ab70 65 72 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73  er = 1;.  rc = s
1ab80 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
1ab90 49 6e 69 74 28 64 62 2c 20 70 43 78 29 3b 0a 23  Init(db, pCx);.#
1aba0 65 6c 73 65 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f  else.  pOp->opco
1abb0 64 65 20 3d 20 4f 50 5f 4f 70 65 6e 45 70 68 65  de = OP_OpenEphe
1abc0 6d 65 72 61 6c 3b 0a 20 20 70 63 2d 2d 3b 0a 23  meral;.  pc--;.#
1abd0 65 6e 64 69 66 0a 20 20 62 72 65 61 6b 3b 0a 7d  endif.  break;.}
1abe0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65  ../* Opcode: Ope
1abf0 6e 50 73 65 75 64 6f 20 50 31 20 50 32 20 50 33  nPseudo P1 P2 P3
1ac00 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20   * *.**.** Open 
1ac10 61 20 6e 65 77 20 63 75 72 73 6f 72 20 74 68 61  a new cursor tha
1ac20 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 61  t points to a fa
1ac30 6b 65 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f  ke table that co
1ac40 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 0a  ntains a single.
1ac50 2a 2a 20 72 6f 77 20 6f 66 20 64 61 74 61 2e 20  ** row of data. 
1ac60 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
1ac70 74 68 61 74 20 6f 6e 65 20 72 6f 77 20 69 6e 20  that one row in 
1ac80 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6d  the content of m
1ac90 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 73 74 65  emory.** registe
1aca0 72 20 50 32 2e 20 20 49 6e 20 6f 74 68 65 72 20  r P2.  In other 
1acb0 77 6f 72 64 73 2c 20 63 75 72 73 6f 72 20 50 31  words, cursor P1
1acc0 20 62 65 63 6f 6d 65 73 20 61 6e 20 61 6c 69 61   becomes an alia
1acd0 73 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 4d 45  s for the .** ME
1ace0 4d 5f 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 20 63  M_Blob content c
1acf0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 72 65 67 69  ontained in regi
1ad00 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 41  ster P2..**.** A
1ad10 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 63 72   pseudo-table cr
1ad20 65 61 74 65 64 20 62 79 20 74 68 69 73 20 6f 70  eated by this op
1ad30 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20  code is used to 
1ad40 68 6f 6c 64 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  hold a single.**
1ad50 20 72 6f 77 20 6f 75 74 70 75 74 20 66 72 6f 6d   row output from
1ad60 20 74 68 65 20 73 6f 72 74 65 72 20 73 6f 20 74   the sorter so t
1ad70 68 61 74 20 74 68 65 20 72 6f 77 20 63 61 6e 20  hat the row can 
1ad80 62 65 20 64 65 63 6f 6d 70 6f 73 65 64 20 69 6e  be decomposed in
1ad90 74 6f 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  to.** individual
1ada0 20 63 6f 6c 75 6d 6e 73 20 75 73 69 6e 67 20 74   columns using t
1adb0 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63  he OP_Column opc
1adc0 6f 64 65 2e 20 20 54 68 65 20 4f 50 5f 43 6f 6c  ode.  The OP_Col
1add0 75 6d 6e 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73  umn opcode.** is
1ade0 20 74 68 65 20 6f 6e 6c 79 20 63 75 72 73 6f 72   the only cursor
1adf0 20 6f 70 63 6f 64 65 20 74 68 61 74 20 77 6f 72   opcode that wor
1ae00 6b 73 20 77 69 74 68 20 61 20 70 73 65 75 64 6f  ks with a pseudo
1ae10 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 50 33  -table..**.** P3
1ae20 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1ae30 66 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  f fields in the 
1ae40 72 65 63 6f 72 64 73 20 74 68 61 74 20 77 69 6c  records that wil
1ae50 6c 20 62 65 20 73 74 6f 72 65 64 20 62 79 0a 2a  l be stored by.*
1ae60 2a 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62  * the pseudo-tab
1ae70 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f  le..*/.case OP_O
1ae80 70 65 6e 50 73 65 75 64 6f 3a 20 7b 0a 20 20 56  penPseudo: {.  V
1ae90 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a  dbeCursor *pCx;.
1aea0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1aeb0 70 31 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20 3d  p1>=0 );.  pCx =
1aec0 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
1aed0 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  p, pOp->p1, pOp-
1aee0 3e 70 33 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 69  >p3, -1, 0);.  i
1aef0 66 28 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f  f( pCx==0 ) goto
1af00 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e   no_mem;.  pCx->
1af10 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70  nullRow = 1;.  p
1af20 43 78 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52  Cx->pseudoTableR
1af30 65 67 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  eg = pOp->p2;.  
1af40 70 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20 31  pCx->isTable = 1
1af50 3b 0a 20 20 70 43 78 2d 3e 69 73 49 6e 64 65 78  ;.  pCx->isIndex
1af60 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d   = 0;.  break;.}
1af70 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6c 6f  ../* Opcode: Clo
1af80 73 65 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  se P1 * * * *.**
1af90 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
1afa0 6f 72 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70  or previously op
1afb0 65 6e 65 64 20 61 73 20 50 31 2e 20 20 49 66 20  ened as P1.  If 
1afc0 50 31 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 75 72  P1 is not.** cur
1afd0 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 74 68 69  rently open, thi
1afe0 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  s instruction is
1aff0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63 61 73   a no-op..*/.cas
1b000 65 20 4f 50 5f 43 6c 6f 73 65 3a 20 7b 0a 20 20  e OP_Close: {.  
1b010 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
1b020 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
1b030 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 73 71  >nCursor );.  sq
1b040 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
1b050 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43 73 72 5b  sor(p, p->apCsr[
1b060 70 4f 70 2d 3e 70 31 5d 29 3b 0a 20 20 70 2d 3e  pOp->p1]);.  p->
1b070 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 20 3d  apCsr[pOp->p1] =
1b080 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   0;.  break;.}..
1b090 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 47  /* Opcode: SeekG
1b0a0 65 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  e P1 P2 P3 P4 *.
1b0b0 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20  **.** If cursor 
1b0c0 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20  P1 refers to an 
1b0d0 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65  SQL table (B-Tre
1b0e0 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74 65  e that uses inte
1b0f0 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75  ger keys), .** u
1b100 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  se the value in 
1b110 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20 74  register P3 as t
1b120 68 65 20 6b 65 79 2e 20 20 49 66 20 63 75 72 73  he key.  If curs
1b130 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a  or P1 refers .**
1b140 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
1b150 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 65  , then P3 is the
1b160 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   first in an arr
1b170 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 65  ay of P4 registe
1b180 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  rs .** that are 
1b190 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63  used as an unpac
1b1a0 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a  ked index key. .
1b1b0 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e  **.** Reposition
1b1c0 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68   cursor P1 so th
1b1d0 61 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  at  it points to
1b1e0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e   the smallest en
1b1f0 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20  try that .** is 
1b200 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1b210 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79  equal to the key
1b220 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65   value. If there
1b230 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20   are no records 
1b240 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
1b250 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1b260 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e   key and P2 is n
1b270 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75  ot zero, then ju
1b280 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  mp to P2..**.** 
1b290 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c  See also: Found,
1b2a0 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73 74 69   NotFound, Disti
1b2b0 6e 63 74 2c 20 53 65 65 6b 4c 74 2c 20 53 65 65  nct, SeekLt, See
1b2c0 6b 47 74 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f  kGt, SeekLe.*/./
1b2d0 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 47 74  * Opcode: SeekGt
1b2e0 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a   P1 P2 P3 P4 *.*
1b2f0 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50  *.** If cursor P
1b300 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53  1 refers to an S
1b310 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65  QL table (B-Tree
1b320 20 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67   that uses integ
1b330 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73  er keys), .** us
1b340 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  e the value in r
1b350 65 67 69 73 74 65 72 20 50 33 20 61 73 20 61 20  egister P3 as a 
1b360 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72 20 50  key. If cursor P
1b370 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20  1 refers .** to 
1b380 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68  an SQL index, th
1b390 65 6e 20 50 33 20 69 73 20 74 68 65 20 66 69 72  en P3 is the fir
1b3a0 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  st in an array o
1b3b0 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20 0a  f P4 registers .
1b3c0 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ** that are used
1b3d0 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20   as an unpacked 
1b3e0 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a  index key. .**.*
1b3f0 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72  * Reposition cur
1b400 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 20  sor P1 so that  
1b410 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
1b420 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72 79 20   smallest entry 
1b430 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72 65 61  that .** is grea
1b440 74 65 72 20 74 68 61 6e 20 74 68 65 20 6b 65 79  ter than the key
1b450 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65   value. If there
1b460 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20   are no records 
1b470 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a  greater than .**
1b480 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20   the key and P2 
1b490 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
1b4a0 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a  n jump to P2..**
1b4b0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f  .** See also: Fo
1b4c0 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44  und, NotFound, D
1b4d0 69 73 74 69 6e 63 74 2c 20 53 65 65 6b 4c 74 2c  istinct, SeekLt,
1b4e0 20 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a   SeekGe, SeekLe.
1b4f0 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65  */./* Opcode: Se
1b500 65 6b 4c 74 20 50 31 20 50 32 20 50 33 20 50 34  ekLt P1 P2 P3 P4
1b510 20 2a 20 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72   * .**.** If cur
1b520 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f  sor P1 refers to
1b530 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42   an SQL table (B
1b540 2d 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20  -Tree that uses 
1b550 69 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a  integer keys), .
1b560 2a 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65  ** use the value
1b570 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20   in register P3 
1b580 61 73 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72  as a key. If cur
1b590 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a  sor P1 refers .*
1b5a0 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  * to an SQL inde
1b5b0 78 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68  x, then P3 is th
1b5c0 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
1b5d0 72 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74  ray of P4 regist
1b5e0 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65  ers .** that are
1b5f0 20 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61   used as an unpa
1b600 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20  cked index key. 
1b610 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f  .**.** Repositio
1b620 6e 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74  n cursor P1 so t
1b630 68 61 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74  hat  it points t
1b640 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e  o the largest en
1b650 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20  try that .** is 
1b660 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6b 65  less than the ke
1b670 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72  y value. If ther
1b680 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73  e are no records
1b690 20 6c 65 73 73 20 74 68 61 6e 20 0a 2a 2a 20 74   less than .** t
1b6a0 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73  he key and P2 is
1b6b0 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
1b6c0 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a  jump to P2..**.*
1b6d0 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e  * See also: Foun
1b6e0 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73  d, NotFound, Dis
1b6f0 74 69 6e 63 74 2c 20 53 65 65 6b 47 74 2c 20 53  tinct, SeekGt, S
1b700 65 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f  eekGe, SeekLe.*/
1b710 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b  ./* Opcode: Seek
1b720 4c 65 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  Le P1 P2 P3 P4 *
1b730 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  .**.** If cursor
1b740 20 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e   P1 refers to an
1b750 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72   SQL table (B-Tr
1b760 65 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74  ee that uses int
1b770 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20  eger keys), .** 
1b780 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  use the value in
1b790 20 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20   register P3 as 
1b7a0 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72  a key. If cursor
1b7b0 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74   P1 refers .** t
1b7c0 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20  o an SQL index, 
1b7d0 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66  then P3 is the f
1b7e0 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
1b7f0 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73   of P4 registers
1b800 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73   .** that are us
1b810 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65  ed as an unpacke
1b820 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a  d index key. .**
1b830 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63  .** Reposition c
1b840 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
1b850 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
1b860 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20  e largest entry 
1b870 74 68 61 74 20 0a 2a 2a 20 69 73 20 6c 65 73 73  that .** is less
1b880 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1b890 6f 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e  o the key value.
1b8a0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1b8b0 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 6c 65 73   records .** les
1b8c0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
1b8d0 74 6f 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50  to the key and P
1b8e0 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  2 is not zero, t
1b8f0 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a  hen jump to P2..
1b900 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1b910 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c  Found, NotFound,
1b920 20 44 69 73 74 69 6e 63 74 2c 20 53 65 65 6b 47   Distinct, SeekG
1b930 74 2c 20 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c  t, SeekGe, SeekL
1b940 74 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65  t.*/.case OP_See
1b950 6b 4c 74 3a 20 20 20 20 20 20 20 20 20 2f 2a 20  kLt:         /* 
1b960 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73  jump, in3 */.cas
1b970 65 20 4f 50 5f 53 65 65 6b 4c 65 3a 20 20 20 20  e OP_SeekLe:    
1b980 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
1b990 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65  3 */.case OP_See
1b9a0 6b 47 65 3a 20 20 20 20 20 20 20 20 20 2f 2a 20  kGe:         /* 
1b9b0 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73  jump, in3 */.cas
1b9c0 65 20 4f 50 5f 53 65 65 6b 47 74 3a 20 7b 20 20  e OP_SeekGt: {  
1b9d0 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
1b9e0 33 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 0a  3 */.  int res;.
1b9f0 20 20 69 6e 74 20 6f 63 3b 0a 20 20 56 64 62 65    int oc;.  Vdbe
1ba00 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 55 6e  Cursor *pC;.  Un
1ba10 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a  packedRecord r;.
1ba20 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20    int nField;.  
1ba30 69 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 2f  i64 iKey;      /
1ba40 2a 20 54 68 65 20 72 6f 77 69 64 20 77 65 20 61  * The rowid we a
1ba50 72 65 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f  re to seek to */
1ba60 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
1ba70 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
1ba80 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
1ba90 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1baa0 32 21 3d 30 20 29 3b 0a 20 20 70 43 20 3d 20 70  2!=0 );.  pC = p
1bab0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
1bac0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
1bad0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1bae0 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65  C->pseudoTableRe
1baf0 67 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  g==0 );.  assert
1bb00 28 20 4f 50 5f 53 65 65 6b 4c 65 20 3d 3d 20 4f  ( OP_SeekLe == O
1bb10 50 5f 53 65 65 6b 4c 74 2b 31 20 29 3b 0a 20 20  P_SeekLt+1 );.  
1bb20 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 47  assert( OP_SeekG
1bb30 65 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c 74 2b 32  e == OP_SeekLt+2
1bb40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50   );.  assert( OP
1bb50 5f 53 65 65 6b 47 74 20 3d 3d 20 4f 50 5f 53 65  _SeekGt == OP_Se
1bb60 65 6b 4c 74 2b 33 20 29 3b 0a 20 20 61 73 73 65  ekLt+3 );.  asse
1bb70 72 74 28 20 70 43 2d 3e 69 73 4f 72 64 65 72 65  rt( pC->isOrdere
1bb80 64 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  d );.  if( ALWAY
1bb90 53 28 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30  S(pC->pCursor!=0
1bba0 29 20 29 7b 0a 20 20 20 20 6f 63 20 3d 20 70 4f  ) ){.    oc = pO
1bbb0 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70  p->opcode;.    p
1bbc0 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a  C->nullRow = 0;.
1bbd0 20 20 20 20 69 66 28 20 70 43 2d 3e 69 73 54 61      if( pC->isTa
1bbe0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ble ){.      /* 
1bbf0 54 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 20  The input value 
1bc00 69 6e 20 50 33 20 6d 69 67 68 74 20 62 65 20 6f  in P3 might be o
1bc10 66 20 61 6e 79 20 74 79 70 65 3a 20 69 6e 74 65  f any type: inte
1bc20 67 65 72 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e  ger, real, strin
1bc30 67 2c 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 62  g,.      ** blob
1bc40 2c 20 6f 72 20 4e 55 4c 4c 2e 20 20 42 75 74 20  , or NULL.  But 
1bc50 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  it needs to be a
1bc60 6e 20 69 6e 74 65 67 65 72 20 62 65 66 6f 72 65  n integer before
1bc70 20 77 65 20 63 61 6e 20 64 6f 0a 20 20 20 20 20   we can do.     
1bc80 20 2a 2a 20 74 68 65 20 73 65 65 6b 2c 20 73 6f   ** the seek, so
1bc90 20 63 6f 76 65 72 74 20 69 74 2e 20 2a 2f 0a 20   covert it. */. 
1bca0 20 20 20 20 20 70 49 6e 33 20 3d 20 26 61 4d 65       pIn3 = &aMe
1bcb0 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20  m[pOp->p3];.    
1bcc0 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66    applyNumericAf
1bcd0 66 69 6e 69 74 79 28 70 49 6e 33 29 3b 0a 20 20  finity(pIn3);.  
1bce0 20 20 20 20 69 4b 65 79 20 3d 20 73 71 6c 69 74      iKey = sqlit
1bcf0 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70  e3VdbeIntValue(p
1bd00 49 6e 33 29 3b 0a 20 20 20 20 20 20 70 43 2d 3e  In3);.      pC->
1bd10 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30  rowidIsValid = 0
1bd20 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
1bd30 68 65 20 50 33 20 76 61 6c 75 65 20 63 6f 75 6c  he P3 value coul
1bd40 64 20 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74  d not be convert
1bd50 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67  ed into an integ
1bd60 65 72 20 77 69 74 68 6f 75 74 0a 20 20 20 20 20  er without.     
1bd70 20 2a 2a 20 6c 6f 73 73 20 6f 66 20 69 6e 66 6f   ** loss of info
1bd80 72 6d 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73 70  rmation, then sp
1bd90 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ecial processing
1bda0 20 69 73 20 72 65 71 75 69 72 65 64 2e 2e 2e 20   is required... 
1bdb0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 49  */.      if( (pI
1bdc0 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n3->flags & MEM_
1bdd0 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Int)==0 ){.     
1bde0 20 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c     if( (pIn3->fl
1bdf0 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 29 3d  ags & MEM_Real)=
1be00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1be10 2f 2a 20 49 66 20 74 68 65 20 50 33 20 76 61 6c  /* If the P3 val
1be20 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e  ue cannot be con
1be30 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 79 20  verted into any 
1be40 6b 69 6e 64 20 6f 66 20 61 20 6e 75 6d 62 65 72  kind of a number
1be50 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  ,.          ** t
1be60 68 65 6e 20 74 68 65 20 73 65 65 6b 20 69 73 20  hen the seek is 
1be70 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20 73 6f  not possible, so
1be80 20 6a 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20   jump to P2 */. 
1be90 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 70 4f           pc = pO
1bea0 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20  p->p2 - 1;.     
1beb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bec0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
1bed0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
1bee0 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68  s point, then th
1bef0 65 20 50 33 20 76 61 6c 75 65 20 6d 75 73 74 20  e P3 value must 
1bf00 62 65 20 61 20 66 6c 6f 61 74 69 6e 67 0a 20 20  be a floating.  
1bf10 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 20 6e        ** point n
1bf20 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  umber. */.      
1bf30 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 33 2d    assert( (pIn3-
1bf40 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
1bf50 6c 29 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  l)!=0 );..      
1bf60 20 20 69 66 28 20 69 4b 65 79 3d 3d 53 4d 41 4c    if( iKey==SMAL
1bf70 4c 45 53 54 5f 49 4e 54 36 34 20 26 26 20 28 70  LEST_INT64 && (p
1bf80 49 6e 33 2d 3e 72 3c 28 64 6f 75 62 6c 65 29 69  In3->r<(double)i
1bf90 4b 65 79 20 7c 7c 20 70 49 6e 33 2d 3e 72 3e 30  Key || pIn3->r>0
1bfa0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
1bfb0 2a 20 54 68 65 20 50 33 20 76 61 6c 75 65 20 69  * The P3 value i
1bfc0 73 20 74 6f 6f 20 6c 61 72 67 65 20 69 6e 20 6d  s too large in m
1bfd0 61 67 6e 69 74 75 64 65 20 74 6f 20 62 65 20 65  agnitude to be e
1bfe0 78 70 72 65 73 73 65 64 20 61 73 20 61 6e 0a 20  xpressed as an. 
1bff0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65           ** inte
1c000 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ger. */.        
1c010 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 20    res = 1;.     
1c020 20 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e 72       if( pIn3->r
1c030 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
1c040 20 20 69 66 28 20 6f 63 3e 3d 4f 50 5f 53 65 65    if( oc>=OP_See
1c050 6b 47 65 20 29 7b 20 20 61 73 73 65 72 74 28 20  kGe ){  assert( 
1c060 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 7c 7c  oc==OP_SeekGe ||
1c070 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29   oc==OP_SeekGt )
1c080 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1c090 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1c0a0 65 46 69 72 73 74 28 70 43 2d 3e 70 43 75 72 73  eFirst(pC->pCurs
1c0b0 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20  or, &res);.     
1c0c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1c0d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1c0e0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
1c0f0 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
1c100 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
1c110 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1c120 20 69 66 28 20 6f 63 3c 3d 4f 50 5f 53 65 65 6b   if( oc<=OP_Seek
1c130 4c 65 20 29 7b 20 20 61 73 73 65 72 74 28 20 6f  Le ){  assert( o
1c140 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 7c 7c 20  c==OP_SeekLt || 
1c150 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b  oc==OP_SeekLe );
1c160 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
1c170 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1c180 4c 61 73 74 28 70 43 2d 3e 70 43 75 72 73 6f 72  Last(pC->pCursor
1c190 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20  , &res);.       
1c1a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1c1b0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1c1c0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
1c1d0 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  or;.            
1c1e0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1c1f0 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 20          if( res 
1c200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1c210 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
1c220 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1c230 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1c240 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c250 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 7c 7c  oc==OP_SeekLt ||
1c260 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29   oc==OP_SeekGe )
1c270 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  {.          /* U
1c280 73 65 20 74 68 65 20 63 65 69 6c 69 6e 67 28 29  se the ceiling()
1c290 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 6f 6e   function to con
1c2a0 76 65 72 74 20 72 65 61 6c 2d 3e 69 6e 74 20 2a  vert real->int *
1c2b0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
1c2c0 70 49 6e 33 2d 3e 72 20 3e 20 28 64 6f 75 62 6c  pIn3->r > (doubl
1c2d0 65 29 69 4b 65 79 20 29 20 69 4b 65 79 2b 2b 3b  e)iKey ) iKey++;
1c2e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1c2f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
1c300 20 74 68 65 20 66 6c 6f 6f 72 28 29 20 66 75 6e   the floor() fun
1c310 63 74 69 6f 6e 20 74 6f 20 63 6f 6e 76 65 72 74  ction to convert
1c320 20 72 65 61 6c 2d 3e 69 6e 74 20 2a 2f 0a 20 20   real->int */.  
1c330 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c340 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 7c 7c  oc==OP_SeekLe ||
1c350 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29   oc==OP_SeekGt )
1c360 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1c370 70 49 6e 33 2d 3e 72 20 3c 20 28 64 6f 75 62 6c  pIn3->r < (doubl
1c380 65 29 69 4b 65 79 20 29 20 69 4b 65 79 2d 2d 3b  e)iKey ) iKey--;
1c390 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c3a0 20 7d 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73   } .      rc = s
1c3b0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
1c3c0 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 70 43  oUnpacked(pC->pC
1c3d0 75 72 73 6f 72 2c 20 30 2c 20 28 75 36 34 29 69  ursor, 0, (u64)i
1c3e0 4b 65 79 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  Key, 0, &res);. 
1c3f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1c400 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c410 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
1c420 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
1c430 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 73   }.      if( res
1c440 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1c450 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  C->rowidIsValid 
1c460 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 2d  = 1;.        pC-
1c470 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 69 4b 65  >lastRowid = iKe
1c480 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  y;.      }.    }
1c490 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 46 69 65  else{.      nFie
1c4a0 6c 64 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  ld = pOp->p4.i;.
1c4b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
1c4c0 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
1c4d0 54 33 32 20 29 3b 0a 20 20 20 20 20 20 61 73 73  T32 );.      ass
1c4e0 65 72 74 28 20 6e 46 69 65 6c 64 3e 30 20 29 3b  ert( nField>0 );
1c4f0 0a 20 20 20 20 20 20 72 2e 70 4b 65 79 49 6e 66  .      r.pKeyInf
1c500 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f  o = pC->pKeyInfo
1c510 3b 0a 20 20 20 20 20 20 72 2e 6e 46 69 65 6c 64  ;.      r.nField
1c520 20 3d 20 28 75 31 36 29 6e 46 69 65 6c 64 3b 0a   = (u16)nField;.
1c530 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  .      /* The ne
1c540 78 74 20 6c 69 6e 65 20 6f 66 20 63 6f 64 65 20  xt line of code 
1c550 63 6f 6d 70 75 74 65 73 20 61 73 20 66 6f 6c 6c  computes as foll
1c560 6f 77 73 2c 20 6f 6e 6c 79 20 66 61 73 74 65 72  ows, only faster
1c570 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20 69 66 28  :.      **   if(
1c580 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 7c   oc==OP_SeekGt |
1c590 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20  | oc==OP_SeekLe 
1c5a0 29 7b 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  ){.      **     
1c5b0 72 2e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b  r.flags = UNPACK
1c5c0 45 44 5f 49 4e 43 52 4b 45 59 3b 0a 20 20 20 20  ED_INCRKEY;.    
1c5d0 20 20 2a 2a 20 20 20 7d 65 6c 73 65 7b 0a 20 20    **   }else{.  
1c5e0 20 20 20 20 2a 2a 20 20 20 20 20 72 2e 66 6c 61      **     r.fla
1c5f0 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 2a  gs = 0;.      **
1c600 20 20 20 7d 0a 20 20 20 20 20 20 2a 2f 0a 20 20     }.      */.  
1c610 20 20 20 20 72 2e 66 6c 61 67 73 20 3d 20 28 75      r.flags = (u
1c620 31 36 29 28 55 4e 50 41 43 4b 45 44 5f 49 4e 43  16)(UNPACKED_INC
1c630 52 4b 45 59 20 2a 20 28 31 20 26 20 28 6f 63 20  RKEY * (1 & (oc 
1c640 2d 20 4f 50 5f 53 65 65 6b 4c 74 29 29 29 3b 0a  - OP_SeekLt)));.
1c650 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63        assert( oc
1c660 21 3d 4f 50 5f 53 65 65 6b 47 74 20 7c 7c 20 72  !=OP_SeekGt || r
1c670 2e 66 6c 61 67 73 3d 3d 55 4e 50 41 43 4b 45 44  .flags==UNPACKED
1c680 5f 49 4e 43 52 4b 45 59 20 29 3b 0a 20 20 20 20  _INCRKEY );.    
1c690 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50    assert( oc!=OP
1c6a0 5f 53 65 65 6b 4c 65 20 7c 7c 20 72 2e 66 6c 61  _SeekLe || r.fla
1c6b0 67 73 3d 3d 55 4e 50 41 43 4b 45 44 5f 49 4e 43  gs==UNPACKED_INC
1c6c0 52 4b 45 59 20 29 3b 0a 20 20 20 20 20 20 61 73  RKEY );.      as
1c6d0 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65  sert( oc!=OP_See
1c6e0 6b 47 65 20 7c 7c 20 72 2e 66 6c 61 67 73 3d 3d  kGe || r.flags==
1c6f0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1c700 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 4c 74  t( oc!=OP_SeekLt
1c710 20 7c 7c 20 72 2e 66 6c 61 67 73 3d 3d 30 20 29   || r.flags==0 )
1c720 3b 0a 0a 20 20 20 20 20 20 72 2e 61 4d 65 6d 20  ;..      r.aMem 
1c730 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
1c740 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1c750 44 45 42 55 47 0a 20 20 20 20 20 20 7b 20 69 6e  DEBUG.      { in
1c760 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t i; for(i=0; i<
1c770 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20 61  r.nField; i++) a
1c780 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
1c790 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b  d(&r.aMem[i]) );
1c7a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
1c7b0 45 78 70 61 6e 64 42 6c 6f 62 28 72 2e 61 4d 65  ExpandBlob(r.aMe
1c7c0 6d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  m);.      rc = s
1c7d0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
1c7e0 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 70 43  oUnpacked(pC->pC
1c7f0 75 72 73 6f 72 2c 20 26 72 2c 20 30 2c 20 30 2c  ursor, &r, 0, 0,
1c800 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66   &res);.      if
1c810 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c820 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1c830 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
1c840 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
1c850 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c    pC->rowidIsVal
1c860 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  id = 0;.    }.  
1c870 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f    pC->deferredMo
1c880 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 43  veto = 0;.    pC
1c890 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
1c8a0 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 23 69 66  CACHE_STALE;.#if
1c8b0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1c8c0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72      sqlite3_sear
1c8d0 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
1c8e0 69 66 0a 20 20 20 20 69 66 28 20 6f 63 3e 3d 4f  if.    if( oc>=O
1c8f0 50 5f 53 65 65 6b 47 65 20 29 7b 20 20 61 73 73  P_SeekGe ){  ass
1c900 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  ert( oc==OP_Seek
1c910 47 65 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65  Ge || oc==OP_See
1c920 6b 47 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  kGt );.      if(
1c930 20 72 65 73 3c 30 20 7c 7c 20 28 72 65 73 3d 3d   res<0 || (res==
1c940 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  0 && oc==OP_Seek
1c950 47 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Gt) ){.        r
1c960 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1c970 4e 65 78 74 28 70 43 2d 3e 70 43 75 72 73 6f 72  Next(pC->pCursor
1c980 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20  , &res);.       
1c990 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c9a0 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  OK ) goto abort_
1c9b0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
1c9c0 20 20 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49        pC->rowidI
1c9d0 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  sValid = 0;.    
1c9e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c9f0 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20   res = 0;.      
1ca00 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1ca10 20 20 20 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f     assert( oc==O
1ca20 50 5f 53 65 65 6b 4c 74 20 7c 7c 20 6f 63 3d 3d  P_SeekLt || oc==
1ca30 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20  OP_SeekLe );.   
1ca40 20 20 20 69 66 28 20 72 65 73 3e 30 20 7c 7c 20     if( res>0 || 
1ca50 28 72 65 73 3d 3d 30 20 26 26 20 6f 63 3d 3d 4f  (res==0 && oc==O
1ca60 50 5f 53 65 65 6b 4c 74 29 20 29 7b 0a 20 20 20  P_SeekLt) ){.   
1ca70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ca80 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
1ca90 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73  C->pCursor, &res
1caa0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1cab0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1cac0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1cad0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  _error;.        
1cae0 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64  pC->rowidIsValid
1caf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
1cb00 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 72 65  e{.        /* re
1cb10 73 20 6d 69 67 68 74 20 62 65 20 6e 65 67 61 74  s might be negat
1cb20 69 76 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ive because the 
1cb30 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 20  table is empty. 
1cb40 20 43 68 65 63 6b 20 74 6f 0a 20 20 20 20 20 20   Check to.      
1cb50 20 20 2a 2a 20 73 65 65 20 69 66 20 74 68 69 73    ** see if this
1cb60 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
1cb70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1cb80 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 42 74   res = sqlite3Bt
1cb90 72 65 65 45 6f 66 28 70 43 2d 3e 70 43 75 72 73  reeEof(pC->pCurs
1cba0 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
1cbb0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1cbc0 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20  Op->p2>0 );.    
1cbd0 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
1cbe0 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
1cbf0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
1cc00 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
1cc10 70 70 65 6e 73 20 77 68 65 6e 20 61 74 74 65 6d  ppens when attem
1cc20 70 74 69 6e 67 20 74 6f 20 6f 70 65 6e 20 74 68  pting to open th
1cc30 65 20 73 71 6c 69 74 65 33 5f 6d 61 73 74 65 72  e sqlite3_master
1cc40 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 66 6f   table.    ** fo
1cc50 72 20 72 65 61 64 20 61 63 63 65 73 73 20 72 65  r read access re
1cc60 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 4d 50  turns SQLITE_EMP
1cc70 54 59 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  TY. In this case
1cc80 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 74   always.    ** t
1cc90 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 28 73 69  ake the jump (si
1cca0 6e 63 65 20 74 68 65 72 65 20 61 72 65 20 6e 6f  nce there are no
1ccb0 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   records in the 
1ccc0 74 61 62 6c 65 29 2e 0a 20 20 20 20 2a 2f 0a 20  table)..    */. 
1ccd0 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
1cce0 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  - 1;.  }.  break
1ccf0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1cd00 53 65 65 6b 20 50 31 20 50 32 20 2a 20 2a 20 2a  Seek P1 P2 * * *
1cd10 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 6e 20  .**.** P1 is an 
1cd20 6f 70 65 6e 20 74 61 62 6c 65 20 63 75 72 73 6f  open table curso
1cd30 72 20 61 6e 64 20 50 32 20 69 73 20 61 20 72 6f  r and P2 is a ro
1cd40 77 69 64 20 69 6e 74 65 67 65 72 2e 20 20 41 72  wid integer.  Ar
1cd50 72 61 6e 67 65 0a 2a 2a 20 66 6f 72 20 50 31 20  range.** for P1 
1cd60 74 6f 20 6d 6f 76 65 20 73 6f 20 74 68 61 74 20  to move so that 
1cd70 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
1cd80 20 72 6f 77 69 64 20 67 69 76 65 6e 20 62 79 20   rowid given by 
1cd90 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  P2..**.** This i
1cda0 73 20 61 63 74 75 61 6c 6c 79 20 61 20 64 65 66  s actually a def
1cdb0 65 72 72 65 64 20 73 65 65 6b 2e 20 20 4e 6f 74  erred seek.  Not
1cdc0 68 69 6e 67 20 61 63 74 75 61 6c 6c 79 20 68 61  hing actually ha
1cdd0 70 70 65 6e 73 20 75 6e 74 69 6c 0a 2a 2a 20 74  ppens until.** t
1cde0 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65  he cursor is use
1cdf0 64 20 74 6f 20 72 65 61 64 20 61 20 72 65 63 6f  d to read a reco
1ce00 72 64 2e 20 20 54 68 61 74 20 77 61 79 2c 20 69  rd.  That way, i
1ce10 66 20 6e 6f 20 72 65 61 64 73 0a 2a 2a 20 6f 63  f no reads.** oc
1ce20 63 75 72 2c 20 6e 6f 20 75 6e 6e 65 63 65 73 73  cur, no unnecess
1ce30 61 72 79 20 49 2f 4f 20 68 61 70 70 65 6e 73 2e  ary I/O happens.
1ce40 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b  .*/.case OP_Seek
1ce50 3a 20 7b 20 20 20 20 2f 2a 20 69 6e 32 20 2a 2f  : {    /* in2 */
1ce60 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
1ce70 43 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  C;..  assert( pO
1ce80 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
1ce90 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
1cea0 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
1ceb0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
1cec0 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
1ced0 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 2d 3e   if( ALWAYS(pC->
1cee0 70 43 75 72 73 6f 72 21 3d 30 29 20 29 7b 0a 20  pCursor!=0) ){. 
1cef0 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
1cf00 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 70 43  sTable );.    pC
1cf10 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20  ->nullRow = 0;. 
1cf20 20 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b     pIn2 = &aMem[
1cf30 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 70 43  pOp->p2];.    pC
1cf40 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 20 3d  ->movetoTarget =
1cf50 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56   sqlite3VdbeIntV
1cf60 61 6c 75 65 28 70 49 6e 32 29 3b 0a 20 20 20 20  alue(pIn2);.    
1cf70 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64  pC->rowidIsValid
1cf80 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 64 65   = 0;.    pC->de
1cf90 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 31  ferredMoveto = 1
1cfa0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
1cfb0 0a 20 20 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  .  ../* Opcode: 
1cfc0 46 6f 75 6e 64 20 50 31 20 50 32 20 50 33 20 50  Found P1 P2 P3 P
1cfd0 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d  4 *.**.** If P4=
1cfe0 3d 30 20 74 68 65 6e 20 72 65 67 69 73 74 65 72  =0 then register
1cff0 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f 62   P3 holds a blob
1d000 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
1d010 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 49 66 0a  MakeRecord.  If.
1d020 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20 72 65 67  ** P4>0 then reg
1d030 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65 20  ister P3 is the 
1d040 66 69 72 73 74 20 6f 66 20 50 34 20 72 65 67 69  first of P4 regi
1d050 73 74 65 72 73 20 74 68 61 74 20 66 6f 72 6d 20  sters that form 
1d060 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 72  an unpacked.** r
1d070 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 43 75 72  ecord..**.** Cur
1d080 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61 6e 20  sor P1 is on an 
1d090 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20 49 66  index btree.  If
1d0a0 20 74 68 65 20 72 65 63 6f 72 64 20 69 64 65 6e   the record iden
1d0b0 74 69 66 69 65 64 20 62 79 20 50 33 20 61 6e 64  tified by P3 and
1d0c0 20 50 34 0a 2a 2a 20 69 73 20 61 20 70 72 65 66   P4.** is a pref
1d0d0 69 78 20 6f 66 20 61 6e 79 20 65 6e 74 72 79 20  ix of any entry 
1d0e0 69 6e 20 50 31 20 74 68 65 6e 20 61 20 6a 75 6d  in P1 then a jum
1d0f0 70 20 69 73 20 6d 61 64 65 20 74 6f 20 50 32 20  p is made to P2 
1d100 61 6e 64 0a 2a 2a 20 50 31 20 69 73 20 6c 65 66  and.** P1 is lef
1d110 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
1d120 65 20 6d 61 74 63 68 69 6e 67 20 65 6e 74 72 79  e matching entry
1d130 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
1d140 4e 6f 74 46 6f 75 6e 64 20 50 31 20 50 32 20 50  NotFound P1 P2 P
1d150 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20  3 P4 *.**.** If 
1d160 50 34 3d 3d 30 20 74 68 65 6e 20 72 65 67 69 73  P4==0 then regis
1d170 74 65 72 20 50 33 20 68 6f 6c 64 73 20 61 20 62  ter P3 holds a b
1d180 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20  lob constructed 
1d190 62 79 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20  by MakeRecord.  
1d1a0 49 66 0a 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20  If.** P4>0 then 
1d1b0 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20 74  register P3 is t
1d1c0 68 65 20 66 69 72 73 74 20 6f 66 20 50 34 20 72  he first of P4 r
1d1d0 65 67 69 73 74 65 72 73 20 74 68 61 74 20 66 6f  egisters that fo
1d1e0 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a  rm an unpacked.*
1d1f0 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 0a 2a 2a  * record..** .**
1d200 20 43 75 72 73 6f 72 20 50 31 20 69 73 20 6f 6e   Cursor P1 is on
1d210 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2e   an index btree.
1d220 20 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20    If the record 
1d230 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 50 33  identified by P3
1d240 20 61 6e 64 20 50 34 0a 2a 2a 20 69 73 20 6e 6f   and P4.** is no
1d250 74 20 74 68 65 20 70 72 65 66 69 78 20 6f 66 20  t the prefix of 
1d260 61 6e 79 20 65 6e 74 72 79 20 69 6e 20 50 31 20  any entry in P1 
1d270 74 68 65 6e 20 61 20 6a 75 6d 70 20 69 73 20 6d  then a jump is m
1d280 61 64 65 20 74 6f 20 50 32 2e 20 20 49 66 20 50  ade to P2.  If P
1d290 31 20 0a 2a 2a 20 64 6f 65 73 20 63 6f 6e 74 61  1 .** does conta
1d2a0 69 6e 20 61 6e 20 65 6e 74 72 79 20 77 68 6f 73  in an entry whos
1d2b0 65 20 70 72 65 66 69 78 20 6d 61 74 63 68 65 73  e prefix matches
1d2c0 20 74 68 65 20 50 33 2f 50 34 20 72 65 63 6f 72   the P3/P4 recor
1d2d0 64 20 74 68 65 6e 20 63 6f 6e 74 72 6f 6c 0a 2a  d then control.*
1d2e0 2a 20 66 61 6c 6c 73 20 74 68 72 6f 75 67 68 20  * falls through 
1d2f0 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
1d300 72 75 63 74 69 6f 6e 20 61 6e 64 20 50 31 20 69  ruction and P1 i
1d310 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
1d320 61 74 20 74 68 65 0a 2a 2a 20 6d 61 74 63 68 69  at the.** matchi
1d330 6e 67 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ng entry..**.** 
1d340 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c  See also: Found,
1d350 20 4e 6f 74 45 78 69 73 74 73 2c 20 49 73 55 6e   NotExists, IsUn
1d360 69 71 75 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ique.*/.case OP_
1d370 4e 6f 74 46 6f 75 6e 64 3a 20 20 20 20 20 20 20  NotFound:       
1d380 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a  /* jump, in3 */.
1d390 63 61 73 65 20 4f 50 5f 46 6f 75 6e 64 3a 20 7b  case OP_Found: {
1d3a0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
1d3b0 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 61 6c   in3 */.  int al
1d3c0 72 65 61 64 79 45 78 69 73 74 73 3b 0a 20 20 56  readyExists;.  V
1d3d0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
1d3e0 20 69 6e 74 20 72 65 73 3b 0a 20 20 63 68 61 72   int res;.  char
1d3f0 20 2a 70 46 72 65 65 3b 0a 20 20 55 6e 70 61 63   *pFree;.  Unpac
1d400 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b  kedRecord *pIdxK
1d410 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  ey;.  UnpackedRe
1d420 63 6f 72 64 20 72 3b 0a 20 20 63 68 61 72 20 61  cord r;.  char a
1d430 54 65 6d 70 52 65 63 5b 52 4f 55 4e 44 38 28 73  TempRec[ROUND8(s
1d440 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
1d450 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28  cord)) + sizeof(
1d460 4d 65 6d 29 2a 33 20 2b 20 37 5d 3b 0a 0a 23 69  Mem)*3 + 7];..#i
1d470 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1d480 0a 20 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64  .  sqlite3_found
1d490 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
1d4a0 0a 0a 20 20 61 6c 72 65 61 64 79 45 78 69 73 74  ..  alreadyExist
1d4b0 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  s = 0;.  assert(
1d4c0 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
1d4d0 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
1d4e0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
1d4f0 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49  Op->p4type==P4_I
1d500 4e 54 33 32 20 29 3b 0a 20 20 70 43 20 3d 20 70  NT32 );.  pC = p
1d510 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
1d520 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
1d530 30 20 29 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61  0 );.  pIn3 = &a
1d540 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
1d550 69 66 28 20 41 4c 57 41 59 53 28 70 43 2d 3e 70  if( ALWAYS(pC->p
1d560 43 75 72 73 6f 72 21 3d 30 29 20 29 7b 0a 0a 20  Cursor!=0) ){.. 
1d570 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
1d580 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  sTable==0 );.   
1d590 20 69 66 28 20 70 4f 70 2d 3e 70 34 2e 69 3e 30   if( pOp->p4.i>0
1d5a0 20 29 7b 0a 20 20 20 20 20 20 72 2e 70 4b 65 79   ){.      r.pKey
1d5b0 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49  Info = pC->pKeyI
1d5c0 6e 66 6f 3b 0a 20 20 20 20 20 20 72 2e 6e 46 69  nfo;.      r.nFi
1d5d0 65 6c 64 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e  eld = (u16)pOp->
1d5e0 70 34 2e 69 3b 0a 20 20 20 20 20 20 72 2e 61 4d  p4.i;.      r.aM
1d5f0 65 6d 20 3d 20 70 49 6e 33 3b 0a 23 69 66 64 65  em = pIn3;.#ifde
1d600 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1d610 20 20 20 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f       { int i; fo
1d620 72 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c  r(i=0; i<r.nFiel
1d630 64 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  d; i++) assert( 
1d640 6d 65 6d 49 73 56 61 6c 69 64 28 26 72 2e 61 4d  memIsValid(&r.aM
1d650 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64  em[i]) ); }.#end
1d660 69 66 0a 20 20 20 20 20 20 72 2e 66 6c 61 67 73  if.      r.flags
1d670 20 3d 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46   = UNPACKED_PREF
1d680 49 58 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  IX_MATCH;.      
1d690 70 49 64 78 4b 65 79 20 3d 20 26 72 3b 0a 20 20  pIdxKey = &r;.  
1d6a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1d6b0 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
1d6c0 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
1d6d0 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20  dRecord(.       
1d6e0 20 20 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c     pC->pKeyInfo,
1d6f0 20 61 54 65 6d 70 52 65 63 2c 20 73 69 7a 65 6f   aTempRec, sizeo
1d700 66 28 61 54 65 6d 70 52 65 63 29 2c 20 26 70 46  f(aTempRec), &pF
1d710 72 65 65 0a 20 20 20 20 20 20 29 3b 20 0a 20 20  ree.      ); .  
1d720 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d      if( pIdxKey=
1d730 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
1d740 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d750 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
1d760 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  M_Blob );.      
1d770 61 73 73 65 72 74 28 20 28 70 49 6e 33 2d 3e 66  assert( (pIn3->f
1d780 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
1d790 3d 3d 30 20 29 3b 20 20 2f 2a 20 7a 65 72 6f 62  ==0 );  /* zerob
1d7a0 6c 6f 62 73 20 61 6c 72 65 61 64 79 20 65 78 70  lobs already exp
1d7b0 61 6e 64 65 64 20 2a 2f 0a 20 20 20 20 20 20 73  anded */.      s
1d7c0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1d7d0 55 6e 70 61 63 6b 28 70 43 2d 3e 70 4b 65 79 49  Unpack(pC->pKeyI
1d7e0 6e 66 6f 2c 20 70 49 6e 33 2d 3e 6e 2c 20 70 49  nfo, pIn3->n, pI
1d7f0 6e 33 2d 3e 7a 2c 20 70 49 64 78 4b 65 79 29 3b  n3->z, pIdxKey);
1d800 0a 20 20 20 20 20 20 70 49 64 78 4b 65 79 2d 3e  .      pIdxKey->
1d810 66 6c 61 67 73 20 7c 3d 20 55 4e 50 41 43 4b 45  flags |= UNPACKE
1d820 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 3b 0a  D_PREFIX_MATCH;.
1d830 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
1d840 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
1d850 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 70 43  oUnpacked(pC->pC
1d860 75 72 73 6f 72 2c 20 70 49 64 78 4b 65 79 2c 20  ursor, pIdxKey, 
1d870 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20  0, 0, &res);.   
1d880 20 69 66 28 20 70 4f 70 2d 3e 70 34 2e 69 3d 3d   if( pOp->p4.i==
1d890 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1d8a0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 72  e3DbFree(db, pFr
1d8b0 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ee);.    }.    i
1d8c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d8d0 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
1d8e0 0a 20 20 20 20 7d 0a 20 20 20 20 61 6c 72 65 61  .    }.    alrea
1d8f0 64 79 45 78 69 73 74 73 20 3d 20 28 72 65 73 3d  dyExists = (res=
1d900 3d 30 29 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66  =0);.    pC->def
1d910 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
1d920 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74  .    pC->cacheSt
1d930 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
1d940 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f  LE;.  }.  if( pO
1d950 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6f  p->opcode==OP_Fo
1d960 75 6e 64 20 29 7b 0a 20 20 20 20 69 66 28 20 61  und ){.    if( a
1d970 6c 72 65 61 64 79 45 78 69 73 74 73 20 29 20 70  lreadyExists ) p
1d980 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
1d990 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
1d9a0 28 20 21 61 6c 72 65 61 64 79 45 78 69 73 74 73  ( !alreadyExists
1d9b0 20 29 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20   ) pc = pOp->p2 
1d9c0 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  - 1;.  }.  break
1d9d0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1d9e0 49 73 55 6e 69 71 75 65 20 50 31 20 50 32 20 50  IsUnique P1 P2 P
1d9f0 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 43 75 72  3 P4 *.**.** Cur
1da00 73 6f 72 20 50 31 20 69 73 20 6f 70 65 6e 20 6f  sor P1 is open o
1da10 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
1da20 65 20 2d 20 74 68 61 74 20 69 73 20 74 6f 20 73  e - that is to s
1da30 61 79 2c 20 61 20 62 74 72 65 65 20 77 68 69 63  ay, a btree whic
1da40 68 0a 2a 2a 20 6e 6f 20 64 61 74 61 20 61 6e 64  h.** no data and
1da50 20 77 68 65 72 65 20 74 68 65 20 6b 65 79 20 61   where the key a
1da60 72 65 20 72 65 63 6f 72 64 73 20 67 65 6e 65 72  re records gener
1da70 61 74 65 64 20 62 79 20 4f 50 5f 4d 61 6b 65 52  ated by OP_MakeR
1da80 65 63 6f 72 64 20 77 69 74 68 0a 2a 2a 20 74 68  ecord with.** th
1da90 65 20 6c 69 73 74 20 66 69 65 6c 64 20 62 65 69  e list field bei
1daa0 6e 67 20 74 68 65 20 69 6e 74 65 67 65 72 20 52  ng the integer R
1dab0 4f 57 49 44 20 6f 66 20 74 68 65 20 65 6e 74 72  OWID of the entr
1dac0 79 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  y that the index
1dad0 0a 2a 2a 20 65 6e 74 72 79 20 72 65 66 65 72 73  .** entry refers
1dae0 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50   to..**.** The P
1daf0 33 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 61  3 register conta
1db00 69 6e 73 20 61 6e 20 69 6e 74 65 67 65 72 20 72  ins an integer r
1db10 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20 43 61  ecord number. Ca
1db20 6c 6c 20 74 68 69 73 20 72 65 63 6f 72 64 20 0a  ll this record .
1db30 2a 2a 20 6e 75 6d 62 65 72 20 52 2e 20 52 65 67  ** number R. Reg
1db40 69 73 74 65 72 20 50 34 20 69 73 20 74 68 65 20  ister P4 is the 
1db50 66 69 72 73 74 20 69 6e 20 61 20 73 65 74 20 6f  first in a set o
1db60 66 20 4e 20 63 6f 6e 74 69 67 75 6f 75 73 20 72  f N contiguous r
1db70 65 67 69 73 74 65 72 73 0a 2a 2a 20 74 68 61 74  egisters.** that
1db80 20 6d 61 6b 65 20 75 70 20 61 6e 20 75 6e 70 61   make up an unpa
1db90 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 74  cked index key t
1dba0 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
1dbb0 77 69 74 68 20 63 75 72 73 6f 72 20 50 31 2e 0a  with cursor P1..
1dbc0 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
1dbd0 4e 20 63 61 6e 20 62 65 20 69 6e 66 65 72 72 65  N can be inferre
1dbe0 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 73 6f  d from the curso
1dbf0 72 2e 20 4e 20 69 6e 63 6c 75 64 65 73 20 74 68  r. N includes th
1dc00 65 20 72 6f 77 69 64 0a 2a 2a 20 76 61 6c 75 65  e rowid.** value
1dc10 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
1dc20 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
1dc30 78 20 72 65 63 6f 72 64 2e 20 54 68 69 73 20 72  x record. This r
1dc40 6f 77 69 64 20 76 61 6c 75 65 20 6d 61 79 0a 2a  owid value may.*
1dc50 2a 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  * or may not be 
1dc60 74 68 65 20 73 61 6d 65 20 61 73 20 52 2e 0a 2a  the same as R..*
1dc70 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74  *.** If any of t
1dc80 68 65 20 4e 20 72 65 67 69 73 74 65 72 73 20 62  he N registers b
1dc90 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 72 65  eginning with re
1dca0 67 69 73 74 65 72 20 50 34 20 63 6f 6e 74 61 69  gister P4 contai
1dcb0 6e 73 20 61 20 4e 55 4c 4c 0a 2a 2a 20 76 61 6c  ns a NULL.** val
1dcc0 75 65 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ue, jump immedia
1dcd0 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a  tely to P2..**.*
1dce0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69  * Otherwise, thi
1dcf0 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 68  s instruction ch
1dd00 65 63 6b 73 20 69 66 20 63 75 72 73 6f 72 20 50  ecks if cursor P
1dd10 31 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e  1 contains an en
1dd20 74 72 79 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  try.** where the
1dd30 20 66 69 72 73 74 20 28 4e 2d 31 29 20 66 69 65   first (N-1) fie
1dd40 6c 64 73 20 6d 61 74 63 68 20 62 75 74 20 74 68  lds match but th
1dd50 65 20 72 6f 77 69 64 20 76 61 6c 75 65 20 61 74  e rowid value at
1dd60 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 74   the end.** of t
1dd70 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69  he index entry i
1dd80 73 20 6e 6f 74 20 52 2e 20 49 66 20 74 68 65 72  s not R. If ther
1dd90 65 20 69 73 20 6e 6f 20 73 75 63 68 20 65 6e 74  e is no such ent
1dda0 72 79 2c 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70  ry, control jump
1ddb0 73 0a 2a 2a 20 74 6f 20 69 6e 73 74 72 75 63 74  s.** to instruct
1ddc0 69 6f 6e 20 50 32 2e 20 4f 74 68 65 72 77 69 73  ion P2. Otherwis
1ddd0 65 2c 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  e, the rowid of 
1dde0 74 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  the conflicting 
1ddf0 69 6e 64 65 78 0a 2a 2a 20 65 6e 74 72 79 20 69  index.** entry i
1de00 73 20 63 6f 70 69 65 64 20 74 6f 20 72 65 67 69  s copied to regi
1de10 73 74 65 72 20 50 33 20 61 6e 64 20 63 6f 6e 74  ster P3 and cont
1de20 72 6f 6c 20 66 61 6c 6c 73 20 74 68 72 6f 75 67  rol falls throug
1de30 68 20 74 6f 20 74 68 65 20 6e 65 78 74 0a 2a 2a  h to the next.**
1de40 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
1de50 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 4e 6f  .** See also: No
1de60 74 46 6f 75 6e 64 2c 20 4e 6f 74 45 78 69 73 74  tFound, NotExist
1de70 73 2c 20 46 6f 75 6e 64 0a 2a 2f 0a 63 61 73 65  s, Found.*/.case
1de80 20 4f 50 5f 49 73 55 6e 69 71 75 65 3a 20 7b 20   OP_IsUnique: { 
1de90 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
1dea0 69 6e 33 20 2a 2f 0a 20 20 75 31 36 20 69 69 3b  in3 */.  u16 ii;
1deb0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
1dec0 43 78 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  Cx;.  BtCursor *
1ded0 70 43 72 73 72 3b 0a 20 20 75 31 36 20 6e 46 69  pCrsr;.  u16 nFi
1dee0 65 6c 64 3b 0a 20 20 4d 65 6d 20 2a 61 4d 78 3b  eld;.  Mem *aMx;
1def0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1df00 64 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  d r;            
1df10 20 20 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20        /* B-Tree 
1df20 69 6e 64 65 78 20 73 65 61 72 63 68 20 6b 65 79  index search key
1df30 20 2a 2f 0a 20 20 69 36 34 20 52 3b 20 20 20 20   */.  i64 R;    
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
1df60 64 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  d stored in regi
1df70 73 74 65 72 20 50 33 20 2a 2f 0a 0a 20 20 70 49  ster P3 */..  pI
1df80 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n3 = &aMem[pOp->
1df90 70 33 5d 3b 0a 20 20 61 4d 78 20 3d 20 26 61 4d  p3];.  aMx = &aM
1dfa0 65 6d 5b 70 4f 70 2d 3e 70 34 2e 69 5d 3b 0a 20  em[pOp->p4.i];. 
1dfb0 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
1dfc0 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 70 61  the values of pa
1dfd0 72 61 6d 65 74 65 72 73 20 50 31 20 61 6e 64 20  rameters P1 and 
1dfe0 50 34 20 61 72 65 20 69 6e 20 72 61 6e 67 65 2e  P4 are in range.
1dff0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f   */.  assert( pO
1e000 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
1e010 54 33 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  T32 );.  assert(
1e020 20 70 4f 70 2d 3e 70 34 2e 69 3e 30 20 26 26 20   pOp->p4.i>0 && 
1e030 70 4f 70 2d 3e 70 34 2e 69 3c 3d 70 2d 3e 6e 4d  pOp->p4.i<=p->nM
1e040 65 6d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  em );.  assert( 
1e050 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
1e060 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
1e070 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74   );..  /* Find t
1e080 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 2e  he index cursor.
1e090 20 2a 2f 0a 20 20 70 43 78 20 3d 20 70 2d 3e 61   */.  pCx = p->a
1e0a0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
1e0b0 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 64 65   assert( pCx->de
1e0c0 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20  ferredMoveto==0 
1e0d0 29 3b 0a 20 20 70 43 78 2d 3e 73 65 65 6b 52 65  );.  pCx->seekRe
1e0e0 73 75 6c 74 20 3d 20 30 3b 0a 20 20 70 43 78 2d  sult = 0;.  pCx-
1e0f0 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
1e100 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 70 43  ACHE_STALE;.  pC
1e110 72 73 72 20 3d 20 70 43 78 2d 3e 70 43 75 72 73  rsr = pCx->pCurs
1e120 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79  or;..  /* If any
1e130 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 61   of the values a
1e140 72 65 20 4e 55 4c 4c 2c 20 74 61 6b 65 20 74 68  re NULL, take th
1e150 65 20 6a 75 6d 70 2e 20 2a 2f 0a 20 20 6e 46 69  e jump. */.  nFi
1e160 65 6c 64 20 3d 20 70 43 78 2d 3e 70 4b 65 79 49  eld = pCx->pKeyI
1e170 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 66  nfo->nField;.  f
1e180 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 46 69 65  or(ii=0; ii<nFie
1e190 6c 64 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  ld; ii++){.    i
1e1a0 66 28 20 61 4d 78 5b 69 69 5d 2e 66 6c 61 67 73  f( aMx[ii].flags
1e1b0 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
1e1c0 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70       pc = pOp->p
1e1d0 32 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 43 72  2 - 1;.      pCr
1e1e0 73 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  sr = 0;.      br
1e1f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1e200 20 61 73 73 65 72 74 28 20 28 61 4d 78 5b 6e 46   assert( (aMx[nF
1e210 69 65 6c 64 5d 2e 66 6c 61 67 73 20 26 20 4d 45  ield].flags & ME
1e220 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 0a 20  M_Null)==0 );.. 
1e230 20 69 66 28 20 70 43 72 73 72 21 3d 30 20 29 7b   if( pCrsr!=0 ){
1e240 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
1e250 20 74 68 65 20 69 6e 64 65 78 20 73 65 61 72 63   the index searc
1e260 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 72 2e  h key. */.    r.
1e270 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 78 2d 3e  pKeyInfo = pCx->
1e280 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 72 2e  pKeyInfo;.    r.
1e290 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 20  nField = nField 
1e2a0 2b 20 31 3b 0a 20 20 20 20 72 2e 66 6c 61 67 73  + 1;.    r.flags
1e2b0 20 3d 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46   = UNPACKED_PREF
1e2c0 49 58 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 72  IX_SEARCH;.    r
1e2d0 2e 61 4d 65 6d 20 3d 20 61 4d 78 3b 0a 23 69 66  .aMem = aMx;.#if
1e2e0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1e2f0 0a 20 20 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f  .    { int i; fo
1e300 72 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c  r(i=0; i<r.nFiel
1e310 64 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  d; i++) assert( 
1e320 6d 65 6d 49 73 56 61 6c 69 64 28 26 72 2e 61 4d  memIsValid(&r.aM
1e330 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64  em[i]) ); }.#end
1e340 69 66 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61  if..    /* Extra
1e350 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ct the value of 
1e360 52 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20  R from register 
1e370 50 33 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  P3. */.    sqlit
1e380 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72  e3VdbeMemInteger
1e390 69 66 79 28 70 49 6e 33 29 3b 0a 20 20 20 20 52  ify(pIn3);.    R
1e3a0 20 3d 20 70 49 6e 33 2d 3e 75 2e 69 3b 0a 0a 20   = pIn3->u.i;.. 
1e3b0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65     /* Search the
1e3c0 20 42 2d 54 72 65 65 20 69 6e 64 65 78 2e 20 49   B-Tree index. I
1e3d0 66 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 69 6e 67  f no conflicting
1e3e0 20 72 65 63 6f 72 64 20 69 73 20 66 6f 75 6e 64   record is found
1e3f0 2c 20 6a 75 6d 70 0a 20 20 20 20 2a 2a 20 74 6f  , jump.    ** to
1e400 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20   P2. Otherwise, 
1e410 63 6f 70 79 20 74 68 65 20 72 6f 77 69 64 20 6f  copy the rowid o
1e420 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e  f the conflictin
1e430 67 20 72 65 63 6f 72 64 20 74 6f 0a 20 20 20 20  g record to.    
1e440 2a 2a 20 72 65 67 69 73 74 65 72 20 50 33 20 61  ** register P3 a
1e450 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  nd fall through 
1e460 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
1e470 72 75 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  ruction.  */.   
1e480 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1e490 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
1e4a0 28 70 43 72 73 72 2c 20 26 72 2c 20 30 2c 20 30  (pCrsr, &r, 0, 0
1e4b0 2c 20 26 70 43 78 2d 3e 73 65 65 6b 52 65 73 75  , &pCx->seekResu
1e4c0 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 28 72 2e  lt);.    if( (r.
1e4d0 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
1e4e0 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48 29 20  _PREFIX_SEARCH) 
1e4f0 7c 7c 20 72 2e 72 6f 77 69 64 3d 3d 52 20 29 7b  || r.rowid==R ){
1e500 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  .      pc = pOp-
1e510 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c  >p2 - 1;.    }el
1e520 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 33 2d 3e  se{.      pIn3->
1e530 75 2e 69 20 3d 20 72 2e 72 6f 77 69 64 3b 0a 20  u.i = r.rowid;. 
1e540 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
1e550 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1e560 4e 6f 74 45 78 69 73 74 73 20 50 31 20 50 32 20  NotExists P1 P2 
1e570 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 55 73 65  P3 * *.**.** Use
1e580 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1e590 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20 61  register P3 as a
1e5a0 6e 20 69 6e 74 65 67 65 72 20 6b 65 79 2e 20 20  n integer key.  
1e5b0 49 66 20 61 20 72 65 63 6f 72 64 20 0a 2a 2a 20  If a record .** 
1e5c0 77 69 74 68 20 74 68 61 74 20 6b 65 79 20 64 6f  with that key do
1e5d0 65 73 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 20  es not exist in 
1e5e0 74 61 62 6c 65 20 6f 66 20 50 31 2c 20 74 68 65  table of P1, the
1e5f0 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 0a 2a  n jump to P2. .*
1e600 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
1e610 64 6f 65 73 20 65 78 69 73 74 2c 20 74 68 65 6e  does exist, then
1e620 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 20 20   fall through.  
1e630 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1e640 66 74 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  ft .** pointing 
1e650 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20 69 66  to the record if
1e660 20 69 74 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a   it exists..**.*
1e670 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
1e680 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 6f 70   between this op
1e690 65 72 61 74 69 6f 6e 20 61 6e 64 20 4e 6f 74 46  eration and NotF
1e6a0 6f 75 6e 64 20 69 73 20 74 68 61 74 20 74 68 69  ound is that thi
1e6b0 73 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 61  s.** operation a
1e6c0 73 73 75 6d 65 73 20 74 68 65 20 6b 65 79 20 69  ssumes the key i
1e6d0 73 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64  s an integer and
1e6e0 20 74 68 61 74 20 50 31 20 69 73 20 61 20 74 61   that P1 is a ta
1e6f0 62 6c 65 20 77 68 65 72 65 61 73 0a 2a 2a 20 4e  ble whereas.** N
1e700 6f 74 46 6f 75 6e 64 20 61 73 73 75 6d 65 73 20  otFound assumes 
1e710 6b 65 79 20 69 73 20 61 20 62 6c 6f 62 20 63 6f  key is a blob co
1e720 6e 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 4d  nstructed from M
1e730 61 6b 65 52 65 63 6f 72 64 20 61 6e 64 0a 2a 2a  akeRecord and.**
1e740 20 50 31 20 69 73 20 61 6e 20 69 6e 64 65 78 2e   P1 is an index.
1e750 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
1e760 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64   Found, NotFound
1e770 2c 20 49 73 55 6e 69 71 75 65 0a 2a 2f 0a 63 61  , IsUnique.*/.ca
1e780 73 65 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 3a  se OP_NotExists:
1e790 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
1e7a0 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 56 64 62 65  p, in3 */.  Vdbe
1e7b0 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74  Cursor *pC;.  Bt
1e7c0 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20  Cursor *pCrsr;. 
1e7d0 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 36 34 20   int res;.  u64 
1e7e0 69 4b 65 79 3b 0a 0a 20 20 70 49 6e 33 20 3d 20  iKey;..  pIn3 = 
1e7f0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
1e800 20 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e    assert( pIn3->
1e810 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
1e820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
1e830 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
1e840 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
1e850 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
1e860 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
1e870 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
1e880 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61  assert( pC->isTa
1e890 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ble );.  assert(
1e8a0 20 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65   pC->pseudoTable
1e8b0 52 65 67 3d 3d 30 20 29 3b 0a 20 20 70 43 72 73  Reg==0 );.  pCrs
1e8c0 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b  r = pC->pCursor;
1e8d0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43  .  if( ALWAYS(pC
1e8e0 72 73 72 21 3d 30 29 20 29 7b 0a 20 20 20 20 72  rsr!=0) ){.    r
1e8f0 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 4b 65 79  es = 0;.    iKey
1e900 20 3d 20 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20   = pIn3->u.i;.  
1e910 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1e920 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
1e930 64 28 70 43 72 73 72 2c 20 30 2c 20 69 4b 65 79  d(pCrsr, 0, iKey
1e940 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  , 0, &res);.    
1e950 70 43 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  pC->lastRowid = 
1e960 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 20 20 70  pIn3->u.i;.    p
1e970 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  C->rowidIsValid 
1e980 3d 20 72 65 73 3d 3d 30 20 3f 31 3a 30 3b 0a 20  = res==0 ?1:0;. 
1e990 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d     pC->nullRow =
1e9a0 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68   0;.    pC->cach
1e9b0 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
1e9c0 53 54 41 4c 45 3b 0a 20 20 20 20 70 43 2d 3e 64  STALE;.    pC->d
1e9d0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
1e9e0 30 3b 0a 20 20 20 20 69 66 28 20 72 65 73 21 3d  0;.    if( res!=
1e9f0 30 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20  0 ){.      pc = 
1ea00 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20  pOp->p2 - 1;.   
1ea10 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 72     assert( pC->r
1ea20 6f 77 69 64 49 73 56 61 6c 69 64 3d 3d 30 20 29  owidIsValid==0 )
1ea30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e  ;.    }.    pC->
1ea40 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 72 65 73  seekResult = res
1ea50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1ea60 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77  * This happens w
1ea70 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 74  hen an attempt t
1ea80 6f 20 6f 70 65 6e 20 61 20 72 65 61 64 20 63 75  o open a read cu
1ea90 72 73 6f 72 20 6f 6e 20 74 68 65 20 0a 20 20 20  rsor on the .   
1eaa0 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   ** sqlite_maste
1eab0 72 20 74 61 62 6c 65 20 72 65 74 75 72 6e 73 20  r table returns 
1eac0 53 51 4c 49 54 45 5f 45 4d 50 54 59 2e 0a 20 20  SQLITE_EMPTY..  
1ead0 20 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 70 4f    */.    pc = pO
1eae0 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 61  p->p2 - 1;.    a
1eaf0 73 73 65 72 74 28 20 70 43 2d 3e 72 6f 77 69 64  ssert( pC->rowid
1eb00 49 73 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20  IsValid==0 );.  
1eb10 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74    pC->seekResult
1eb20 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 62 72 65 61   = 0;.  }.  brea
1eb30 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
1eb40 20 53 65 71 75 65 6e 63 65 20 50 31 20 50 32 20   Sequence P1 P2 
1eb50 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 69 6e 64  * * *.**.** Find
1eb60 20 74 68 65 20 6e 65 78 74 20 61 76 61 69 6c 61   the next availa
1eb70 62 6c 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d  ble sequence num
1eb80 62 65 72 20 66 6f 72 20 63 75 72 73 6f 72 20 50  ber for cursor P
1eb90 31 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  1..** Write the 
1eba0 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20  sequence number 
1ebb0 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  into register P2
1ebc0 2e 0a 2a 2a 20 54 68 65 20 73 65 71 75 65 6e 63  ..** The sequenc
1ebd0 65 20 6e 75 6d 62 65 72 20 6f 6e 20 74 68 65 20  e number on the 
1ebe0 63 75 72 73 6f 72 20 69 73 20 69 6e 63 72 65 6d  cursor is increm
1ebf0 65 6e 74 65 64 20 61 66 74 65 72 20 74 68 69 73  ented after this
1ec00 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  .** instruction.
1ec10 20 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65    .*/.case OP_Se
1ec20 71 75 65 6e 63 65 3a 20 7b 20 20 20 20 20 20 20  quence: {       
1ec30 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72      /* out2-prer
1ec40 65 6c 65 61 73 65 20 2a 2f 0a 20 20 61 73 73 65  elease */.  asse
1ec50 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
1ec60 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
1ec70 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74  rsor );.  assert
1ec80 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  ( p->apCsr[pOp->
1ec90 70 31 5d 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74  p1]!=0 );.  pOut
1eca0 2d 3e 75 2e 69 20 3d 20 70 2d 3e 61 70 43 73 72  ->u.i = p->apCsr
1ecb0 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 73 65 71 43 6f  [pOp->p1]->seqCo
1ecc0 75 6e 74 2b 2b 3b 0a 20 20 62 72 65 61 6b 3b 0a  unt++;.  break;.
1ecd0 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  }.../* Opcode: N
1ece0 65 77 52 6f 77 69 64 20 50 31 20 50 32 20 50 33  ewRowid P1 P2 P3
1ecf0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61   * *.**.** Get a
1ed00 20 6e 65 77 20 69 6e 74 65 67 65 72 20 72 65 63   new integer rec
1ed10 6f 72 64 20 6e 75 6d 62 65 72 20 28 61 2e 6b 2e  ord number (a.k.
1ed20 61 20 22 72 6f 77 69 64 22 29 20 75 73 65 64 20  a "rowid") used 
1ed30 61 73 20 74 68 65 20 6b 65 79 20 74 6f 20 61 20  as the key to a 
1ed40 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 72 65  table..** The re
1ed50 63 6f 72 64 20 6e 75 6d 62 65 72 20 69 73 20 6e  cord number is n
1ed60 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 75 73  ot previously us
1ed70 65 64 20 61 73 20 61 20 6b 65 79 20 69 6e 20 74  ed as a key in t
1ed80 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  he database.** t
1ed90 61 62 6c 65 20 74 68 61 74 20 63 75 72 73 6f 72  able that cursor
1eda0 20 50 31 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20   P1 points to.  
1edb0 54 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 6e  The new record n
1edc0 75 6d 62 65 72 20 69 73 20 77 72 69 74 74 65 6e  umber is written
1edd0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 72  .** written to r
1ede0 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
1edf0 2a 20 49 66 20 50 33 3e 30 20 74 68 65 6e 20 50  * If P3>0 then P
1ee00 33 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  3 is a register 
1ee10 69 6e 20 74 68 65 20 72 6f 6f 74 20 66 72 61 6d  in the root fram
1ee20 65 20 6f 66 20 74 68 69 73 20 56 44 42 45 20 74  e of this VDBE t
1ee30 68 61 74 20 68 6f 6c 64 73 20 0a 2a 2a 20 74 68  hat holds .** th
1ee40 65 20 6c 61 72 67 65 73 74 20 70 72 65 76 69 6f  e largest previo
1ee50 75 73 6c 79 20 67 65 6e 65 72 61 74 65 64 20 72  usly generated r
1ee60 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20 4e 6f  ecord number. No
1ee70 20 6e 65 77 20 72 65 63 6f 72 64 20 6e 75 6d 62   new record numb
1ee80 65 72 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77  ers are.** allow
1ee90 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
1eea0 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57  an this value. W
1eeb0 68 65 6e 20 74 68 69 73 20 76 61 6c 75 65 20 72  hen this value r
1eec0 65 61 63 68 65 73 20 69 74 73 20 6d 61 78 69 6d  eaches its maxim
1eed0 75 6d 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 49 54  um, .** an SQLIT
1eee0 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 69 73 20  E_FULL error is 
1eef0 67 65 6e 65 72 61 74 65 64 2e 20 54 68 65 20 50  generated. The P
1ef00 33 20 72 65 67 69 73 74 65 72 20 69 73 20 75 70  3 register is up
1ef10 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20 27  dated with the '
1ef20 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 72 65  .** generated re
1ef30 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20 54 68 69  cord number. Thi
1ef40 73 20 50 33 20 6d 65 63 68 61 6e 69 73 6d 20 69  s P3 mechanism i
1ef50 73 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20 69  s used to help i
1ef60 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  mplement the.** 
1ef70 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 66 65  AUTOINCREMENT fe
1ef80 61 74 75 72 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ature..*/.case O
1ef90 50 5f 4e 65 77 52 6f 77 69 64 3a 20 7b 20 20 20  P_NewRowid: {   
1efa0 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
1efb0 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
1efc0 69 36 34 20 76 3b 20 20 20 20 20 20 20 20 20 20  i64 v;          
1efd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
1efe0 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20 56 64 62  w rowid */.  Vdb
1eff0 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 20  eCursor *pC;    
1f000 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66      /* Cursor of
1f010 20 74 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68   table to get th
1f020 65 20 6e 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20  e new rowid */. 
1f030 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20   int res;       
1f040 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1f050 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 42  t of an sqlite3B
1f060 74 72 65 65 4c 61 73 74 28 29 20 2a 2f 0a 20 20  treeLast() */.  
1f070 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20  int cnt;        
1f080 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
1f090 72 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e  r to limit the n
1f0a0 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 65  umber of searche
1f0b0 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  s */.  Mem *pMem
1f0c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1f0d0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
1f0e0 67 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20  g largest rowid 
1f0f0 66 6f 72 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  for AUTOINCREMEN
1f100 54 20 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d 65  T */.  VdbeFrame
1f110 20 2a 70 46 72 61 6d 65 3b 20 20 20 20 20 2f 2a   *pFrame;     /*
1f120 20 52 6f 6f 74 20 66 72 61 6d 65 20 6f 66 20 56   Root frame of V
1f130 44 42 45 20 2a 2f 0a 0a 20 20 76 20 3d 20 30 3b  DBE */..  v = 0;
1f140 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 61 73  .  res = 0;.  as
1f150 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
1f160 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
1f170 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
1f180 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
1f190 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
1f1a0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  !=0 );.  if( NEV
1f1b0 45 52 28 70 43 2d 3e 70 43 75 72 73 6f 72 3d 3d  ER(pC->pCursor==
1f1c0 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  0) ){.    /* The
1f1d0 20 7a 65 72 6f 20 69 6e 69 74 69 61 6c 69 7a 61   zero initializa
1f1e0 74 69 6f 6e 20 61 62 6f 76 65 20 69 73 20 61 6c  tion above is al
1f1f0 6c 20 74 68 61 74 20 69 73 20 6e 65 65 64 65 64  l that is needed
1f200 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
1f210 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 77   /* The next row
1f220 69 64 20 6f 72 20 72 65 63 6f 72 64 20 6e 75 6d  id or record num
1f230 62 65 72 20 28 64 69 66 66 65 72 65 6e 74 20 74  ber (different t
1f240 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73 61 6d  erms for the sam
1f250 65 0a 20 20 20 20 2a 2a 20 74 68 69 6e 67 29 20  e.    ** thing) 
1f260 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 61  is obtained in a
1f270 20 74 77 6f 2d 73 74 65 70 20 61 6c 67 6f 72 69   two-step algori
1f280 74 68 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  thm..    **.    
1f290 2a 2a 20 46 69 72 73 74 20 77 65 20 61 74 74 65  ** First we atte
1f2a0 6d 70 74 20 74 6f 20 66 69 6e 64 20 74 68 65 20  mpt to find the 
1f2b0 6c 61 72 67 65 73 74 20 65 78 69 73 74 69 6e 67  largest existing
1f2c0 20 72 6f 77 69 64 20 61 6e 64 20 61 64 64 20 6f   rowid and add o
1f2d0 6e 65 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 61  ne.    ** to tha
1f2e0 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6c  t.  But if the l
1f2f0 61 72 67 65 73 74 20 65 78 69 73 74 69 6e 67 20  argest existing 
1f300 72 6f 77 69 64 20 69 73 20 61 6c 72 65 61 64 79  rowid is already
1f310 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 20 20 20   the maximum.   
1f320 20 2a 2a 20 70 6f 73 69 74 69 76 65 20 69 6e 74   ** positive int
1f330 65 67 65 72 2c 20 77 65 20 68 61 76 65 20 74 6f  eger, we have to
1f340 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
1f350 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20   the second.    
1f360 2a 2a 20 70 72 6f 62 61 62 69 6c 69 73 74 69 63  ** probabilistic
1f370 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20 20 20 2a   algorithm.    *
1f380 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63  *.    ** The sec
1f390 6f 6e 64 20 61 6c 67 6f 72 69 74 68 6d 20 69 73  ond algorithm is
1f3a0 20 74 6f 20 73 65 6c 65 63 74 20 61 20 72 6f 77   to select a row
1f3b0 69 64 20 61 74 20 72 61 6e 64 6f 6d 20 61 6e 64  id at random and
1f3c0 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 69   see if.    ** i
1f3d0 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  t already exists
1f3e0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
1f3f0 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  If it does not e
1f400 78 69 73 74 2c 20 77 65 20 68 61 76 65 0a 20 20  xist, we have.  
1f410 20 20 2a 2a 20 73 75 63 63 65 65 64 65 64 2e 20    ** succeeded. 
1f420 20 49 66 20 74 68 65 20 72 61 6e 64 6f 6d 20 72   If the random r
1f430 6f 77 69 64 20 64 6f 65 73 20 65 78 69 73 74 2c  owid does exist,
1f440 20 77 65 20 73 65 6c 65 63 74 20 61 20 6e 65 77   we select a new
1f450 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20   one.    ** and 
1f460 74 72 79 20 61 67 61 69 6e 2c 20 75 70 20 74 6f  try again, up to
1f470 20 31 30 30 20 74 69 6d 65 73 2e 0a 20 20 20 20   100 times..    
1f480 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1f490 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 0a 23  C->isTable );..#
1f4a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 33 32 42  ifdef SQLITE_32B
1f4b0 49 54 5f 52 4f 57 49 44 0a 23 20 20 20 64 65 66  IT_ROWID.#   def
1f4c0 69 6e 65 20 4d 41 58 5f 52 4f 57 49 44 20 30 78  ine MAX_ROWID 0x
1f4d0 37 66 66 66 66 66 66 66 0a 23 65 6c 73 65 0a 20  7fffffff.#else. 
1f4e0 20 20 20 2f 2a 20 53 6f 6d 65 20 63 6f 6d 70 69     /* Some compi
1f4f0 6c 65 72 73 20 63 6f 6d 70 6c 61 69 6e 20 61 62  lers complain ab
1f500 6f 75 74 20 63 6f 6e 73 74 61 6e 74 73 20 6f 66  out constants of
1f510 20 74 68 65 20 66 6f 72 6d 20 30 78 37 66 66 66   the form 0x7fff
1f520 66 66 66 66 66 66 66 66 66 66 66 66 2e 0a 20 20  ffffffffffff..  
1f530 20 20 2a 2a 20 4f 74 68 65 72 73 20 63 6f 6d 70    ** Others comp
1f540 6c 61 69 6e 20 61 62 6f 75 74 20 30 78 37 66 66  lain about 0x7ff
1f550 66 66 66 66 66 66 66 66 66 66 66 66 66 66 4c 4c  ffffffffffffffLL
1f560 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
1f570 20 6d 61 63 72 6f 20 73 65 65 6d 73 0a 20 20 20   macro seems.   
1f580 20 2a 2a 20 74 6f 20 70 72 6f 76 69 64 65 20 74   ** to provide t
1f590 68 65 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 6c  he constant whil
1f5a0 65 20 6d 61 6b 69 6e 67 20 61 6c 6c 20 63 6f 6d  e making all com
1f5b0 70 69 6c 65 72 73 20 68 61 70 70 79 2e 0a 20 20  pilers happy..  
1f5c0 20 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20    */.#   define 
1f5d0 4d 41 58 5f 52 4f 57 49 44 20 20 28 69 36 34 29  MAX_ROWID  (i64)
1f5e0 28 20 28 28 28 75 36 34 29 30 78 37 66 66 66 66  ( (((u64)0x7ffff
1f5f0 66 66 66 29 3c 3c 33 32 29 20 7c 20 28 75 36 34  fff)<<32) | (u64
1f600 29 30 78 66 66 66 66 66 66 66 66 20 29 0a 23 65  )0xffffffff ).#e
1f610 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 21 70  ndif..    if( !p
1f620 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69  C->useRandomRowi
1f630 64 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 73  d ){.      v = s
1f640 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 43 61  qlite3BtreeGetCa
1f650 63 68 65 64 52 6f 77 69 64 28 70 43 2d 3e 70 43  chedRowid(pC->pC
1f660 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66  ursor);.      if
1f670 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( v==0 ){.      
1f680 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1f690 72 65 65 4c 61 73 74 28 70 43 2d 3e 70 43 75 72  reeLast(pC->pCur
1f6a0 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  sor, &res);.    
1f6b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f6c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f6d0 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
1f6e0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
1f6f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1f700 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20  ( res ){.       
1f710 20 20 20 76 20 3d 20 31 3b 20 20 20 2f 2a 20 49     v = 1;   /* I
1f720 4d 50 3a 20 52 2d 36 31 39 31 34 2d 34 38 30 37  MP: R-61914-4807
1f730 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  4 */.        }el
1f740 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
1f750 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1f760 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
1f770 70 43 2d 3e 70 43 75 72 73 6f 72 29 20 29 3b 0a  pC->pCursor) );.
1f780 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1f790 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
1f7a0 7a 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ze(pC->pCursor, 
1f7b0 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  &v);.          a
1f7c0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
1f7d0 45 5f 4f 4b 20 29 3b 20 20 20 2f 2a 20 43 61 6e  E_OK );   /* Can
1f7e0 6e 6f 74 20 66 61 69 6c 20 66 6f 6c 6c 6f 77 69  not fail followi
1f7f0 6e 67 20 42 74 72 65 65 4c 61 73 74 28 29 20 2a  ng BtreeLast() *
1f800 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
1f810 76 3e 3d 4d 41 58 5f 52 4f 57 49 44 20 29 7b 0a  v>=MAX_ROWID ){.
1f820 20 20 20 20 20 20 20 20 20 20 20 20 70 43 2d 3e              pC->
1f830 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 3d  useRandomRowid =
1f840 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   1;.          }e
1f850 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1f860 20 76 2b 2b 3b 20 20 20 2f 2a 20 49 4d 50 3a 20   v++;   /* IMP: 
1f870 52 2d 32 39 35 33 38 2d 33 34 39 38 37 20 2a 2f  R-29538-34987 */
1f880 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1f890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
1f8a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f8b0 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
1f8c0 54 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  T.      if( pOp-
1f8d0 3e 70 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  >p3 ){.        /
1f8e0 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 50 33  * Assert that P3
1f8f0 20 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f   is a valid memo
1f900 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20  ry cell. */.    
1f910 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
1f920 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  >p3>0 );.       
1f930 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29   if( p->pFrame )
1f940 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
1f950 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
1f960 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  ; pFrame->pParen
1f970 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
1f980 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
1f990 20 20 20 20 20 20 2f 2a 20 41 73 73 65 72 74 20        /* Assert 
1f9a0 74 68 61 74 20 50 33 20 69 73 20 61 20 76 61 6c  that P3 is a val
1f9b0 69 64 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20  id memory cell. 
1f9c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
1f9d0 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 70 46  ert( pOp->p3<=pF
1f9e0 72 61 6d 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  rame->nMem );.  
1f9f0 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 26          pMem = &
1fa00 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70  pFrame->aMem[pOp
1fa10 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20 20 20 7d  ->p3];.        }
1fa20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1fa30 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 50  /* Assert that P
1fa40 33 20 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d  3 is a valid mem
1fa50 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20  ory cell. */.   
1fa60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1fa70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20  Op->p3<=p->nMem 
1fa80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 65  );.          pMe
1fa90 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  m = &aMem[pOp->p
1faa0 33 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  3];.          me
1fab0 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
1fac0 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  , pMem);.       
1fad0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
1fae0 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 4d  t( memIsValid(pM
1faf0 65 6d 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  em) );..        
1fb00 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
1fb10 4f 70 2d 3e 70 33 2c 20 70 4d 65 6d 29 3b 0a 20  Op->p3, pMem);. 
1fb20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1fb30 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28  beMemIntegerify(
1fb40 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 61  pMem);.        a
1fb50 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c  ssert( (pMem->fl
1fb60 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d  ags & MEM_Int)!=
1fb70 30 20 29 3b 20 20 2f 2a 20 6d 65 6d 28 50 33 29  0 );  /* mem(P3)
1fb80 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65 67 65   holds an intege
1fb90 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  r */.        if(
1fba0 20 70 4d 65 6d 2d 3e 75 2e 69 3d 3d 4d 41 58 5f   pMem->u.i==MAX_
1fbb0 52 4f 57 49 44 20 7c 7c 20 70 43 2d 3e 75 73 65  ROWID || pC->use
1fbc0 52 61 6e 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20  RandomRowid ){. 
1fbd0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1fbe0 4c 49 54 45 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20  LITE_FULL;   /* 
1fbf0 49 4d 50 3a 20 52 2d 31 32 32 37 35 2d 36 31 33  IMP: R-12275-613
1fc00 33 38 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  38 */.          
1fc10 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
1fc20 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  o_error;.       
1fc30 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 76   }.        if( v
1fc40 3c 70 4d 65 6d 2d 3e 75 2e 69 2b 31 20 29 7b 0a  <pMem->u.i+1 ){.
1fc50 20 20 20 20 20 20 20 20 20 20 76 20 3d 20 70 4d            v = pM
1fc60 65 6d 2d 3e 75 2e 69 20 2b 20 31 3b 0a 20 20 20  em->u.i + 1;.   
1fc70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1fc80 4d 65 6d 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20  Mem->u.i = v;.  
1fc90 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1fca0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1fcb0 53 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 70  SetCachedRowid(p
1fcc0 43 2d 3e 70 43 75 72 73 6f 72 2c 20 76 3c 4d 41  C->pCursor, v<MA
1fcd0 58 5f 52 4f 57 49 44 20 3f 20 76 2b 31 20 3a 20  X_ROWID ? v+1 : 
1fce0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
1fcf0 28 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52  ( pC->useRandomR
1fd00 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a  owid ){.      /*
1fd10 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
1fd20 4f 46 3a 20 52 2d 30 37 36 37 37 2d 34 31 38 38  OF: R-07677-4188
1fd30 31 20 49 66 20 74 68 65 20 6c 61 72 67 65 73 74  1 If the largest
1fd40 20 52 4f 57 49 44 20 69 73 20 65 71 75 61 6c 20   ROWID is equal 
1fd50 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
1fd60 6c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65  largest possible
1fd70 20 69 6e 74 65 67 65 72 20 28 39 32 32 33 33 37   integer (922337
1fd80 32 30 33 36 38 35 34 37 37 35 38 30 37 29 20 74  2036854775807) t
1fd90 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
1fda0 0a 20 20 20 20 20 20 2a 2a 20 65 6e 67 69 6e 65  .      ** engine
1fdb0 20 73 74 61 72 74 73 20 70 69 63 6b 69 6e 67 20   starts picking 
1fdc0 70 6f 73 69 74 69 76 65 20 63 61 6e 64 69 64 61  positive candida
1fdd0 74 65 20 52 4f 57 49 44 73 20 61 74 20 72 61 6e  te ROWIDs at ran
1fde0 64 6f 6d 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  dom until.      
1fdf0 2a 2a 20 69 74 20 66 69 6e 64 73 20 6f 6e 65 20  ** it finds one 
1fe00 74 68 61 74 20 69 73 20 6e 6f 74 20 70 72 65 76  that is not prev
1fe10 69 6f 75 73 6c 79 20 75 73 65 64 2e 20 2a 2f 0a  iously used. */.
1fe20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
1fe30 70 2d 3e 70 33 3d 3d 30 20 29 3b 20 20 2f 2a 20  p->p3==0 );  /* 
1fe40 57 65 20 63 61 6e 6e 6f 74 20 62 65 20 69 6e 20  We cannot be in 
1fe50 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20 6d 6f 64  random rowid mod
1fe60 65 20 69 66 20 74 68 69 73 20 69 73 0a 20 20 20  e if this is.   
1fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20            ** an 
1fe90 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 74 61  AUTOINCREMENT ta
1fea0 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  ble. */.      /*
1feb0 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 61 74   on the first at
1fec0 74 65 6d 70 74 2c 20 73 69 6d 70 6c 79 20 64 6f  tempt, simply do
1fed0 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 70   one more than p
1fee0 72 65 76 69 6f 75 73 20 2a 2f 0a 20 20 20 20 20  revious */.     
1fef0 20 76 20 3d 20 6c 61 73 74 52 6f 77 69 64 3b 0a   v = lastRowid;.
1ff00 20 20 20 20 20 20 76 20 26 3d 20 28 4d 41 58 5f        v &= (MAX_
1ff10 52 4f 57 49 44 3e 3e 31 29 3b 20 2f 2a 20 65 6e  ROWID>>1); /* en
1ff20 73 75 72 65 20 64 6f 65 73 6e 27 74 20 67 6f 20  sure doesn't go 
1ff30 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 20 20  negative */.    
1ff40 20 20 76 2b 2b 3b 20 2f 2a 20 65 6e 73 75 72 65    v++; /* ensure
1ff50 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20   non-zero */.   
1ff60 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20     cnt = 0;.    
1ff70 20 20 77 68 69 6c 65 28 20 20 20 28 28 72 63 20    while(   ((rc 
1ff80 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
1ff90 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d  vetoUnpacked(pC-
1ffa0 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 36  >pCursor, 0, (u6
1ffb0 34 29 76 2c 0a 20 20 20 20 20 20 20 20 20 20 20  4)v,.           
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffe0 20 20 20 20 20 20 30 2c 20 26 72 65 73 29 29 3d        0, &res))=
1fff0 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20  =SQLITE_OK).    
20000 20 20 20 20 20 20 20 20 26 26 20 28 72 65 73 3d          && (res=
20010 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0).            
20020 26 26 20 28 2b 2b 63 6e 74 3c 31 30 30 29 29 7b  && (++cnt<100)){
20030 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6c 6c  .        /* coll
20040 69 73 69 6f 6e 20 2d 20 74 72 79 20 61 6e 6f 74  ision - try anot
20050 68 65 72 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64  her random rowid
20060 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
20070 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
20080 69 7a 65 6f 66 28 76 29 2c 20 26 76 29 3b 0a 20  izeof(v), &v);. 
20090 20 20 20 20 20 20 20 69 66 28 20 63 6e 74 3c 35         if( cnt<5
200a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
200b0 20 74 72 79 20 22 73 6d 61 6c 6c 22 20 72 61 6e   try "small" ran
200c0 64 6f 6d 20 72 6f 77 69 64 73 20 66 6f 72 20 74  dom rowids for t
200d0 68 65 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  he initial attem
200e0 70 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  pts */.         
200f0 20 76 20 26 3d 20 30 78 66 66 66 66 66 66 3b 0a   v &= 0xffffff;.
20100 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20110 20 20 20 20 20 20 20 20 20 76 20 26 3d 20 28 4d           v &= (M
20120 41 58 5f 52 4f 57 49 44 3e 3e 31 29 3b 20 2f 2a  AX_ROWID>>1); /*
20130 20 65 6e 73 75 72 65 20 64 6f 65 73 6e 27 74 20   ensure doesn't 
20140 67 6f 20 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20  go negative */. 
20150 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20160 20 76 2b 2b 3b 20 2f 2a 20 65 6e 73 75 72 65 20   v++; /* ensure 
20170 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20  non-zero */.    
20180 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
20190 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
201a0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
201b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
201c0 4c 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33  L;   /* IMP: R-3
201d0 38 32 31 39 2d 35 33 30 30 32 20 2a 2f 0a 20 20  8219-53002 */.  
201e0 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74        goto abort
201f0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
20200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
20210 65 72 74 28 20 76 3e 30 20 29 3b 20 20 2f 2a 20  ert( v>0 );  /* 
20220 45 56 3a 20 52 2d 34 30 38 31 32 2d 30 33 35 37  EV: R-40812-0357
20230 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70  0 */.    }.    p
20240 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  C->rowidIsValid 
20250 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66  = 0;.    pC->def
20260 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
20270 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74  .    pC->cacheSt
20280 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
20290 4c 45 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e  LE;.  }.  pOut->
202a0 75 2e 69 20 3d 20 76 3b 0a 20 20 62 72 65 61 6b  u.i = v;.  break
202b0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
202c0 49 6e 73 65 72 74 20 50 31 20 50 32 20 50 33 20  Insert P1 P2 P3 
202d0 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 57 72 69 74  P4 P5.**.** Writ
202e0 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
202f0 74 68 65 20 74 61 62 6c 65 20 6f 66 20 63 75 72  the table of cur
20300 73 6f 72 20 50 31 2e 20 20 41 20 6e 65 77 20 65  sor P1.  A new e
20310 6e 74 72 79 20 69 73 0a 2a 2a 20 63 72 65 61 74  ntry is.** creat
20320 65 64 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74  ed if it doesn't
20330 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 20 6f   already exist o
20340 72 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 61  r the data for a
20350 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 65 6e  n existing.** en
20360 74 72 79 20 69 73 20 6f 76 65 72 77 72 69 74 74  try is overwritt
20370 65 6e 2e 20 20 54 68 65 20 64 61 74 61 20 69 73  en.  The data is
20380 20 74 68 65 20 76 61 6c 75 65 20 4d 45 4d 5f 42   the value MEM_B
20390 6c 6f 62 20 73 74 6f 72 65 64 20 69 6e 20 72 65  lob stored in re
203a0 67 69 73 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72  gister.** number
203b0 20 50 32 2e 20 54 68 65 20 6b 65 79 20 69 73 20   P2. The key is 
203c0 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
203d0 65 72 20 50 33 2e 20 54 68 65 20 6b 65 79 20 6d  er P3. The key m
203e0 75 73 74 0a 2a 2a 20 62 65 20 61 20 4d 45 4d 5f  ust.** be a MEM_
203f0 49 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  Int..**.** If th
20400 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45  e OPFLAG_NCHANGE
20410 20 66 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73   flag of P5 is s
20420 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77  et, then the row
20430 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20 69 73   change count is
20440 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64 20  .** incremented 
20450 28 6f 74 68 65 72 77 69 73 65 20 6e 6f 74 29 2e  (otherwise not).
20460 20 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f    If the OPFLAG_
20470 4c 41 53 54 52 4f 57 49 44 20 66 6c 61 67 20 6f  LASTROWID flag o
20480 66 20 50 35 20 69 73 20 73 65 74 2c 0a 2a 2a 20  f P5 is set,.** 
20490 74 68 65 6e 20 72 6f 77 69 64 20 69 73 20 73 74  then rowid is st
204a0 6f 72 65 64 20 66 6f 72 20 73 75 62 73 65 71 75  ored for subsequ
204b0 65 6e 74 20 72 65 74 75 72 6e 20 62 79 20 74 68  ent return by th
204c0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 61 73  e.** sqlite3_las
204d0 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29  t_insert_rowid()
204e0 20 66 75 6e 63 74 69 6f 6e 20 28 6f 74 68 65 72   function (other
204f0 77 69 73 65 20 69 74 20 69 73 20 75 6e 6d 6f 64  wise it is unmod
20500 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ified)..**.** If
20510 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53   the OPFLAG_USES
20520 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6f  EEKRESULT flag o
20530 66 20 50 35 20 69 73 20 73 65 74 20 61 6e 64 20  f P5 is set and 
20540 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  if the result of
20550 0a 2a 2a 20 74 68 65 20 6c 61 73 74 20 73 65 65  .** the last see
20560 6b 20 6f 70 65 72 61 74 69 6f 6e 20 28 4f 50 5f  k operation (OP_
20570 4e 6f 74 45 78 69 73 74 73 29 20 77 61 73 20 61  NotExists) was a
20580 20 73 75 63 63 65 73 73 2c 20 74 68 65 6e 20 74   success, then t
20590 68 69 73 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  his.** operation
205a0 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70   will not attemp
205b0 74 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61 70  t to find the ap
205c0 70 72 6f 70 72 69 61 74 65 20 72 6f 77 20 62 65  propriate row be
205d0 66 6f 72 65 20 64 6f 69 6e 67 0a 2a 2a 20 74 68  fore doing.** th
205e0 65 20 69 6e 73 65 72 74 20 62 75 74 20 77 69 6c  e insert but wil
205f0 6c 20 69 6e 73 74 65 61 64 20 6f 76 65 72 77 72  l instead overwr
20600 69 74 65 20 74 68 65 20 72 6f 77 20 74 68 61 74  ite the row that
20610 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a 2a   the cursor is.*
20620 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  * currently poin
20630 74 69 6e 67 20 74 6f 2e 20 20 50 72 65 73 75 6d  ting to.  Presum
20640 61 62 6c 79 2c 20 74 68 65 20 70 72 69 6f 72 20  ably, the prior 
20650 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f 70 63  OP_NotExists opc
20660 6f 64 65 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  ode.** has alrea
20670 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 74 68  dy positioned th
20680 65 20 63 75 72 73 6f 72 20 63 6f 72 72 65 63 74  e cursor correct
20690 6c 79 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20  ly.  This is an 
206a0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
206b0 74 68 61 74 20 62 6f 6f 73 74 73 20 70 65 72 66  that boosts perf
206c0 6f 72 6d 61 6e 63 65 20 62 79 20 61 76 6f 69 64  ormance by avoid
206d0 69 6e 67 20 72 65 64 75 6e 64 61 6e 74 20 73 65  ing redundant se
206e0 65 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eks..**.** If th
206f0 65 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54  e OPFLAG_ISUPDAT
20700 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
20710 68 65 6e 20 74 68 69 73 20 6f 70 63 6f 64 65 20  hen this opcode 
20720 69 73 20 70 61 72 74 20 6f 66 20 61 6e 0a 2a 2a  is part of an.**
20730 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f   UPDATE operatio
20740 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 20 28 69  n.  Otherwise (i
20750 66 20 74 68 65 20 66 6c 61 67 20 69 73 20 63 6c  f the flag is cl
20760 65 61 72 29 20 74 68 65 6e 20 74 68 69 73 20 6f  ear) then this o
20770 70 63 6f 64 65 0a 2a 2a 20 69 73 20 70 61 72 74  pcode.** is part
20780 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 6f 70   of an INSERT op
20790 65 72 61 74 69 6f 6e 2e 20 20 54 68 65 20 64 69  eration.  The di
207a0 66 66 65 72 65 6e 63 65 20 69 73 20 6f 6e 6c 79  fference is only
207b0 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 0a 2a 2a   important to.**
207c0 20 74 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b   the update hook
207d0 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
207e0 72 20 50 34 20 6d 61 79 20 70 6f 69 6e 74 20 74  r P4 may point t
207f0 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  o a string conta
20800 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2d  ining the table-
20810 6e 61 6d 65 2c 20 6f 72 0a 2a 2a 20 6d 61 79 20  name, or.** may 
20820 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69  be NULL. If it i
20830 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
20840 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b   the update-hook
20850 20 0a 2a 2a 20 28 73 71 6c 69 74 65 33 2e 78 55   .** (sqlite3.xU
20860 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 29 20 69  pdateCallback) i
20870 73 20 69 6e 76 6f 6b 65 64 20 66 6f 6c 6c 6f 77  s invoked follow
20880 69 6e 67 20 61 20 73 75 63 63 65 73 73 66 75 6c  ing a successful
20890 20 69 6e 73 65 72 74 2e 0a 2a 2a 0a 2a 2a 20 28   insert..**.** (
208a0 57 41 52 4e 49 4e 47 2f 54 4f 44 4f 3a 20 49 66  WARNING/TODO: If
208b0 20 50 31 20 69 73 20 61 20 70 73 65 75 64 6f 2d   P1 is a pseudo-
208c0 63 75 72 73 6f 72 20 61 6e 64 20 50 32 20 69 73  cursor and P2 is
208d0 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
208e0 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 6e 20  allocated, then 
208f0 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 50 32 20  ownership of P2 
20900 69 73 20 74 72 61 6e 73 66 65 72 72 65 64 20 74  is transferred t
20910 6f 20 74 68 65 20 70 73 65 75 64 6f 2d 63 75 72  o the pseudo-cur
20920 73 6f 72 0a 2a 2a 20 61 6e 64 20 72 65 67 69 73  sor.** and regis
20930 74 65 72 20 50 32 20 62 65 63 6f 6d 65 73 20 65  ter P2 becomes e
20940 70 68 65 6d 65 72 61 6c 2e 20 20 49 66 20 74 68  phemeral.  If th
20950 65 20 63 75 72 73 6f 72 20 69 73 20 63 68 61 6e  e cursor is chan
20960 67 65 64 2c 20 74 68 65 0a 2a 2a 20 76 61 6c 75  ged, the.** valu
20970 65 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 32  e of register P2
20980 20 77 69 6c 6c 20 74 68 65 6e 20 63 68 61 6e 67   will then chang
20990 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  e.  Make sure th
209a0 69 73 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63  is does not.** c
209b0 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
209c0 73 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  s.).**.** This i
209d0 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20  nstruction only 
209e0 77 6f 72 6b 73 20 6f 6e 20 74 61 62 6c 65 73 2e  works on tables.
209f0 20 20 54 68 65 20 65 71 75 69 76 61 6c 65 6e 74    The equivalent
20a00 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20   instruction.** 
20a10 66 6f 72 20 69 6e 64 69 63 65 73 20 69 73 20 4f  for indices is O
20a20 50 5f 49 64 78 49 6e 73 65 72 74 2e 0a 2a 2f 0a  P_IdxInsert..*/.
20a30 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 73 65 72  /* Opcode: Inser
20a40 74 49 6e 74 20 50 31 20 50 32 20 50 33 20 50 34  tInt P1 P2 P3 P4
20a50 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77   P5.**.** This w
20a60 6f 72 6b 73 20 65 78 61 63 74 6c 79 20 6c 69 6b  orks exactly lik
20a70 65 20 4f 50 5f 49 6e 73 65 72 74 20 65 78 63 65  e OP_Insert exce
20a80 70 74 20 74 68 61 74 20 74 68 65 20 6b 65 79 20  pt that the key 
20a90 69 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65  is the.** intege
20aa0 72 20 76 61 6c 75 65 20 50 33 2c 20 6e 6f 74 20  r value P3, not 
20ab0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
20ac0 20 69 6e 74 65 67 65 72 20 73 74 6f 72 65 64 20   integer stored 
20ad0 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
20ae0 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65 72  */.case OP_Inser
20af0 74 3a 20 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65  t: .case OP_Inse
20b00 72 74 49 6e 74 3a 20 7b 0a 20 20 4d 65 6d 20 2a  rtInt: {.  Mem *
20b10 70 44 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  pData;       /* 
20b20 4d 45 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67  MEM cell holding
20b30 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65   data for the re
20b40 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72  cord to be inser
20b50 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4b  ted */.  Mem *pK
20b60 65 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 45  ey;        /* ME
20b70 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 6b  M cell holding k
20b80 65 79 20 20 66 6f 72 20 74 68 65 20 72 65 63 6f  ey  for the reco
20b90 72 64 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79  rd */.  i64 iKey
20ba0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
20bb0 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20 6f   integer ROWID o
20bc0 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 65  r key for the re
20bd0 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72  cord to be inser
20be0 74 65 64 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ted */.  VdbeCur
20bf0 73 6f 72 20 2a 70 43 3b 20 20 20 2f 2a 20 43 75  sor *pC;   /* Cu
20c00 72 73 6f 72 20 74 6f 20 74 61 62 6c 65 20 69 6e  rsor to table in
20c10 74 6f 20 77 68 69 63 68 20 69 6e 73 65 72 74 20  to which insert 
20c20 69 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  is written */.  
20c30 69 6e 74 20 6e 5a 65 72 6f 3b 20 20 20 20 20 20  int nZero;      
20c40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a    /* Number of z
20c50 65 72 6f 2d 62 79 74 65 73 20 74 6f 20 61 70 70  ero-bytes to app
20c60 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65  end */.  int see
20c70 6b 52 65 73 75 6c 74 3b 20 20 20 2f 2a 20 52 65  kResult;   /* Re
20c80 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20 73 65  sult of prior se
20c90 65 6b 20 6f 72 20 30 20 69 66 20 6e 6f 20 55 53  ek or 0 if no US
20ca0 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67  ESEEKRESULT flag
20cb0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
20cc0 20 2a 7a 44 62 3b 20 20 2f 2a 20 64 61 74 61 62   *zDb;  /* datab
20cd0 61 73 65 20 6e 61 6d 65 20 2d 20 75 73 65 64 20  ase name - used 
20ce0 62 79 20 74 68 65 20 75 70 64 61 74 65 20 68 6f  by the update ho
20cf0 6f 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ok */.  const ch
20d00 61 72 20 2a 7a 54 62 6c 3b 20 2f 2a 20 54 61 62  ar *zTbl; /* Tab
20d10 6c 65 20 6e 61 6d 65 20 2d 20 75 73 65 64 20 62  le name - used b
20d20 79 20 74 68 65 20 6f 70 64 61 74 65 20 68 6f 6f  y the opdate hoo
20d30 6b 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  k */.  int op;  
20d40 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
20d50 64 65 20 66 6f 72 20 75 70 64 61 74 65 20 68 6f  de for update ho
20d60 6f 6b 3a 20 53 51 4c 49 54 45 5f 55 50 44 41 54  ok: SQLITE_UPDAT
20d70 45 20 6f 72 20 53 51 4c 49 54 45 5f 49 4e 53 45  E or SQLITE_INSE
20d80 52 54 20 2a 2f 0a 0a 20 20 70 44 61 74 61 20 3d  RT */..  pData =
20d90 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
20da0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
20db0 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
20dc0 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
20dd0 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
20de0 6c 69 64 28 70 44 61 74 61 29 20 29 3b 0a 20 20  lid(pData) );.  
20df0 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
20e00 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
20e10 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
20e20 65 72 74 28 20 70 43 2d 3e 70 43 75 72 73 6f 72  ert( pC->pCursor
20e30 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
20e40 20 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65   pC->pseudoTable
20e50 52 65 67 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Reg==0 );.  asse
20e60 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20  rt( pC->isTable 
20e70 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  );.  REGISTER_TR
20e80 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 44 61  ACE(pOp->p2, pDa
20e90 74 61 29 3b 0a 0a 20 20 69 66 28 20 70 4f 70 2d  ta);..  if( pOp-
20ea0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 73 65  >opcode==OP_Inse
20eb0 72 74 20 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d  rt ){.    pKey =
20ec0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
20ed0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65  .    assert( pKe
20ee0 79 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  y->flags & MEM_I
20ef0 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nt );.    assert
20f00 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 4b 65  ( memIsValid(pKe
20f10 79 29 20 29 3b 0a 20 20 20 20 52 45 47 49 53 54  y) );.    REGIST
20f20 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
20f30 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 69 4b 65  , pKey);.    iKe
20f40 79 20 3d 20 70 4b 65 79 2d 3e 75 2e 69 3b 0a 20  y = pKey->u.i;. 
20f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
20f60 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  rt( pOp->opcode=
20f70 3d 4f 50 5f 49 6e 73 65 72 74 49 6e 74 20 29 3b  =OP_InsertInt );
20f80 0a 20 20 20 20 69 4b 65 79 20 3d 20 70 4f 70 2d  .    iKey = pOp-
20f90 3e 70 33 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  >p3;.  }..  if( 
20fa0 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
20fb0 5f 4e 43 48 41 4e 47 45 20 29 20 70 2d 3e 6e 43  _NCHANGE ) p->nC
20fc0 68 61 6e 67 65 2b 2b 3b 0a 20 20 69 66 28 20 70  hange++;.  if( p
20fd0 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
20fe0 4c 41 53 54 52 4f 57 49 44 20 29 20 64 62 2d 3e  LASTROWID ) db->
20ff0 6c 61 73 74 52 6f 77 69 64 20 3d 20 6c 61 73 74  lastRowid = last
21000 52 6f 77 69 64 20 3d 20 69 4b 65 79 3b 0a 20 20  Rowid = iKey;.  
21010 69 66 28 20 70 44 61 74 61 2d 3e 66 6c 61 67 73  if( pData->flags
21020 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
21030 20 20 20 70 44 61 74 61 2d 3e 7a 20 3d 20 30 3b     pData->z = 0;
21040 0a 20 20 20 20 70 44 61 74 61 2d 3e 6e 20 3d 20  .    pData->n = 
21050 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
21060 61 73 73 65 72 74 28 20 70 44 61 74 61 2d 3e 66  assert( pData->f
21070 6c 61 67 73 20 26 20 28 4d 45 4d 5f 42 6c 6f 62  lags & (MEM_Blob
21080 7c 4d 45 4d 5f 53 74 72 29 20 29 3b 0a 20 20 7d  |MEM_Str) );.  }
21090 0a 20 20 73 65 65 6b 52 65 73 75 6c 74 20 3d 20  .  seekResult = 
210a0 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c  ((pOp->p5 & OPFL
210b0 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
210c0 29 20 3f 20 70 43 2d 3e 73 65 65 6b 52 65 73 75  ) ? pC->seekResu
210d0 6c 74 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 70  lt : 0);.  if( p
210e0 44 61 74 61 2d 3e 66 6c 61 67 73 20 26 20 4d 45  Data->flags & ME
210f0 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 5a  M_Zero ){.    nZ
21100 65 72 6f 20 3d 20 70 44 61 74 61 2d 3e 75 2e 6e  ero = pData->u.n
21110 5a 65 72 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Zero;.  }else{. 
21120 20 20 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20     nZero = 0;.  
21130 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
21140 53 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 70  SetCachedRowid(p
21150 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 29 3b 0a  C->pCursor, 0);.
21160 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
21170 72 65 65 49 6e 73 65 72 74 28 70 43 2d 3e 70 43  reeInsert(pC->pC
21180 75 72 73 6f 72 2c 20 30 2c 20 69 4b 65 79 2c 0a  ursor, 0, iKey,.
21190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211a0 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 2d            pData-
211b0 3e 7a 2c 20 70 44 61 74 61 2d 3e 6e 2c 20 6e 5a  >z, pData->n, nZ
211c0 65 72 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ero,.           
211d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
211e0 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
211f0 41 50 50 45 4e 44 2c 20 73 65 65 6b 52 65 73 75  APPEND, seekResu
21200 6c 74 0a 20 20 29 3b 0a 20 20 70 43 2d 3e 72 6f  lt.  );.  pC->ro
21210 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a  widIsValid = 0;.
21220 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f    pC->deferredMo
21230 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43 2d 3e  veto = 0;.  pC->
21240 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
21250 43 48 45 5f 53 54 41 4c 45 3b 0a 0a 20 20 2f 2a  CHE_STALE;..  /*
21260 20 49 6e 76 6f 6b 65 20 74 68 65 20 75 70 64 61   Invoke the upda
21270 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65 71 75 69  te-hook if requi
21280 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  red. */.  if( rc
21290 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64  ==SQLITE_OK && d
212a0 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61  b->xUpdateCallba
212b0 63 6b 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 20  ck && pOp->p4.z 
212c0 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20 64 62 2d  ){.    zDb = db-
212d0 3e 61 44 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a 4e  >aDb[pC->iDb].zN
212e0 61 6d 65 3b 0a 20 20 20 20 7a 54 62 6c 20 3d 20  ame;.    zTbl = 
212f0 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 6f  pOp->p4.z;.    o
21300 70 20 3d 20 28 28 70 4f 70 2d 3e 70 35 20 26 20  p = ((pOp->p5 & 
21310 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 29  OPFLAG_ISUPDATE)
21320 20 3f 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45   ? SQLITE_UPDATE
21330 20 3a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54   : SQLITE_INSERT
21340 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21350 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  C->isTable );.  
21360 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c    db->xUpdateCal
21370 6c 62 61 63 6b 28 64 62 2d 3e 70 55 70 64 61 74  lback(db->pUpdat
21380 65 41 72 67 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a  eArg, op, zDb, z
21390 54 62 6c 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20  Tbl, iKey);.    
213a0 61 73 73 65 72 74 28 20 70 43 2d 3e 69 44 62 3e  assert( pC->iDb>
213b0 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  =0 );.  }.  brea
213c0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
213d0 20 44 65 6c 65 74 65 20 50 31 20 50 32 20 2a 20   Delete P1 P2 * 
213e0 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74  P4 *.**.** Delet
213f0 65 20 74 68 65 20 72 65 63 6f 72 64 20 61 74 20  e the record at 
21400 77 68 69 63 68 20 74 68 65 20 50 31 20 63 75 72  which the P1 cur
21410 73 6f 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  sor is currently
21420 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
21430 20 54 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c   The cursor will
21440 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   be left pointin
21450 67 20 61 74 20 65 69 74 68 65 72 20 74 68 65 20  g at either the 
21460 6e 65 78 74 20 6f 72 20 74 68 65 20 70 72 65 76  next or the prev
21470 69 6f 75 73 0a 2a 2a 20 72 65 63 6f 72 64 20 69  ious.** record i
21480 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20  n the table. If 
21490 69 74 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  it is left point
214a0 69 6e 67 20 61 74 20 74 68 65 20 6e 65 78 74 20  ing at the next 
214b0 72 65 63 6f 72 64 2c 20 74 68 65 6e 0a 2a 2a 20  record, then.** 
214c0 74 68 65 20 6e 65 78 74 20 4e 65 78 74 20 69 6e  the next Next in
214d0 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
214e0 65 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 65 6e 63  e a no-op.  Henc
214f0 65 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 64 65  e it is OK to de
21500 6c 65 74 65 0a 2a 2a 20 61 20 72 65 63 6f 72 64  lete.** a record
21510 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20   from within an 
21520 4e 65 78 74 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a  Next loop..**.**
21530 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e   If the OPFLAG_N
21540 43 48 41 4e 47 45 20 66 6c 61 67 20 6f 66 20 50  CHANGE flag of P
21550 32 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  2 is set, then t
21560 68 65 20 72 6f 77 20 63 68 61 6e 67 65 20 63 6f  he row change co
21570 75 6e 74 20 69 73 0a 2a 2a 20 69 6e 63 72 65 6d  unt is.** increm
21580 65 6e 74 65 64 20 28 6f 74 68 65 72 77 69 73 65  ented (otherwise
21590 20 6e 6f 74 29 2e 0a 2a 2a 0a 2a 2a 20 50 31 20   not)..**.** P1 
215a0 6d 75 73 74 20 6e 6f 74 20 62 65 20 70 73 65 75  must not be pseu
215b0 64 6f 2d 74 61 62 6c 65 2e 20 20 49 74 20 68 61  do-table.  It ha
215c0 73 20 74 6f 20 62 65 20 61 20 72 65 61 6c 20 74  s to be a real t
215d0 61 62 6c 65 20 77 69 74 68 0a 2a 2a 20 6d 75 6c  able with.** mul
215e0 74 69 70 6c 65 20 72 6f 77 73 2e 0a 2a 2a 0a 2a  tiple rows..**.*
215f0 2a 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20 4e  * If P4 is not N
21600 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
21610 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
21620 74 61 62 6c 65 20 74 68 61 74 20 50 31 20 69 73  table that P1 is
21630 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e  .** pointing to.
21640 20 20 54 68 65 20 75 70 64 61 74 65 20 68 6f 6f    The update hoo
21650 6b 20 77 69 6c 6c 20 62 65 20 69 6e 76 6f 6b 65  k will be invoke
21660 64 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  d, if it exists.
21670 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 6e 6f 74  .** If P4 is not
21680 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 50   NULL then the P
21690 31 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  1 cursor must ha
216a0 76 65 20 62 65 65 6e 20 70 6f 73 69 74 69 6f 6e  ve been position
216b0 65 64 0a 2a 2a 20 75 73 69 6e 67 20 4f 50 5f 4e  ed.** using OP_N
216c0 6f 74 46 6f 75 6e 64 20 70 72 69 6f 72 20 74 6f  otFound prior to
216d0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 6f   invoking this o
216e0 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  pcode..*/.case O
216f0 50 5f 44 65 6c 65 74 65 3a 20 7b 0a 20 20 69 36  P_Delete: {.  i6
21700 34 20 69 4b 65 79 3b 0a 20 20 56 64 62 65 43 75  4 iKey;.  VdbeCu
21710 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 69 4b 65  rsor *pC;..  iKe
21720 79 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  y = 0;.  assert(
21730 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
21740 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
21750 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  r );.  pC = p->a
21760 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
21770 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
21780 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
21790 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 20 20 2f  pCursor!=0 );  /
217a0 2a 20 4f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72  * Only valid for
217b0 20 72 65 61 6c 20 74 61 62 6c 65 73 2c 20 6e 6f   real tables, no
217c0 20 70 73 65 75 64 6f 74 61 62 6c 65 73 20 2a 2f   pseudotables */
217d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 70  ..  /* If the up
217e0 64 61 74 65 2d 68 6f 6f 6b 20 77 69 6c 6c 20 62  date-hook will b
217f0 65 20 69 6e 76 6f 6b 65 64 2c 20 73 65 74 20 69  e invoked, set i
21800 4b 65 79 20 74 6f 20 74 68 65 20 72 6f 77 69 64  Key to the rowid
21810 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77   of the.  ** row
21820 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a   being deleted..
21830 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78    */.  if( db->x
21840 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26  UpdateCallback &
21850 26 20 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20  & pOp->p4.z ){. 
21860 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
21870 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 61 73  sTable );.    as
21880 73 65 72 74 28 20 70 43 2d 3e 72 6f 77 69 64 49  sert( pC->rowidI
21890 73 56 61 6c 69 64 20 29 3b 20 20 2f 2a 20 6c 61  sValid );  /* la
218a0 73 74 52 6f 77 69 64 20 73 65 74 20 62 79 20 70  stRowid set by p
218b0 72 65 76 69 6f 75 73 20 4f 50 5f 4e 6f 74 46 6f  revious OP_NotFo
218c0 75 6e 64 20 2a 2f 0a 20 20 20 20 69 4b 65 79 20  und */.    iKey 
218d0 3d 20 70 43 2d 3e 6c 61 73 74 52 6f 77 69 64 3b  = pC->lastRowid;
218e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 4f  .  }..  /* The O
218f0 50 5f 44 65 6c 65 74 65 20 6f 70 63 6f 64 65 20  P_Delete opcode 
21900 61 6c 77 61 79 73 20 66 6f 6c 6c 6f 77 73 20 61  always follows a
21910 6e 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f  n OP_NotExists o
21920 72 20 4f 50 5f 4c 61 73 74 20 6f 72 0a 20 20 2a  r OP_Last or.  *
21930 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 6e 20 74  * OP_Column on t
21940 68 65 20 73 61 6d 65 20 74 61 62 6c 65 20 77 69  he same table wi
21950 74 68 6f 75 74 20 61 6e 79 20 69 6e 74 65 72 76  thout any interv
21960 65 6e 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  ening operations
21970 20 74 68 61 74 0a 20 20 2a 2a 20 6d 69 67 68 74   that.  ** might
21980 20 6d 6f 76 65 20 6f 72 20 69 6e 76 61 6c 69 64   move or invalid
21990 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ate the cursor. 
219a0 20 48 65 6e 63 65 20 63 75 72 73 6f 72 20 70 43   Hence cursor pC
219b0 20 69 73 20 61 6c 77 61 79 73 20 70 6f 69 6e 74   is always point
219c0 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ing.  ** to the 
219d0 72 6f 77 20 74 6f 20 62 65 20 64 65 6c 65 74 65  row to be delete
219e0 64 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65  d and the sqlite
219f0 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
21a00 6f 28 29 20 6f 70 65 72 61 74 69 6f 6e 0a 20 20  o() operation.  
21a10 2a 2a 20 62 65 6c 6f 77 20 69 73 20 61 6c 77 61  ** below is alwa
21a20 79 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 63  ys a no-op and c
21a30 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 57 65 20  annot fail.  We 
21a40 77 69 6c 6c 20 72 75 6e 20 69 74 20 61 6e 79 68  will run it anyh
21a50 6f 77 2c 20 74 68 6f 75 67 68 2c 0a 20 20 2a 2a  ow, though,.  **
21a60 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
21a70 74 20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73  t future changes
21a80 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
21a90 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 2f 0a 20 20  erator..  **/.  
21aa0 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65  assert( pC->defe
21ab0 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
21ac0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
21ad0 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
21ae0 70 43 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  pC);.  if( NEVER
21af0 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc!=SQLITE_OK) 
21b00 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
21b10 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 73 71  _to_error;..  sq
21b20 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
21b30 68 65 64 52 6f 77 69 64 28 70 43 2d 3e 70 43 75  hedRowid(pC->pCu
21b40 72 73 6f 72 2c 20 30 29 3b 0a 20 20 72 63 20 3d  rsor, 0);.  rc =
21b50 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
21b60 65 74 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 29  ete(pC->pCursor)
21b70 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61  ;.  pC->cacheSta
21b80 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
21b90 45 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  E;..  /* Invoke 
21ba0 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20  the update-hook 
21bb0 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
21bc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21bd0 5f 4f 4b 20 26 26 20 64 62 2d 3e 78 55 70 64 61  _OK && db->xUpda
21be0 74 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 70 4f  teCallback && pO
21bf0 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20 20 63  p->p4.z ){.    c
21c00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
21c10 20 64 62 2d 3e 61 44 62 5b 70 43 2d 3e 69 44 62   db->aDb[pC->iDb
21c20 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
21c30 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20  st char *zTbl = 
21c40 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 64  pOp->p4.z;.    d
21c50 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61  b->xUpdateCallba
21c60 63 6b 28 64 62 2d 3e 70 55 70 64 61 74 65 41 72  ck(db->pUpdateAr
21c70 67 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  g, SQLITE_DELETE
21c80 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65  , zDb, zTbl, iKe
21c90 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
21ca0 70 43 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20  pC->iDb>=0 );.  
21cb0 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20  }.  if( pOp->p2 
21cc0 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45  & OPFLAG_NCHANGE
21cd0 20 29 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b   ) p->nChange++;
21ce0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 2f 2a 20 4f  .  break;.}./* O
21cf0 70 63 6f 64 65 3a 20 52 65 73 65 74 43 6f 75 6e  pcode: ResetCoun
21d00 74 20 2a 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  t * * * * *.**.*
21d10 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * The value of t
21d20 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
21d30 72 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74  r is copied to t
21d40 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
21d50 6c 65 0a 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75  le.** change cou
21d60 6e 74 65 72 20 28 72 65 74 75 72 6e 65 64 20 62  nter (returned b
21d70 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
21d80 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 68  ls to sqlite3_ch
21d90 61 6e 67 65 73 28 29 29 2e 0a 2a 2a 20 54 68 65  anges())..** The
21da0 6e 20 74 68 65 20 56 4d 73 20 69 6e 74 65 72 6e  n the VMs intern
21db0 61 6c 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  al change counte
21dc0 72 20 72 65 73 65 74 73 20 74 6f 20 30 2e 0a 2a  r resets to 0..*
21dd0 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62  * This is used b
21de0 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  y trigger progra
21df0 6d 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  ms..*/.case OP_R
21e00 65 73 65 74 43 6f 75 6e 74 3a 20 7b 0a 20 20 73  esetCount: {.  s
21e10 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
21e20 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
21e30 6e 67 65 29 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e  nge);.  p->nChan
21e40 67 65 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b  ge = 0;.  break;
21e50 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .}../* Opcode: S
21e60 6f 72 74 65 72 43 6f 6d 70 61 72 65 20 50 31 20  orterCompare P1 
21e70 50 32 20 50 33 0a 2a 2a 0a 2a 2a 20 50 31 20 69  P2 P3.**.** P1 i
21e80 73 20 61 20 73 6f 72 74 65 72 20 63 75 72 73 6f  s a sorter curso
21e90 72 2e 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  r. This instruct
21ea0 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
21eb0 20 72 65 63 6f 72 64 20 62 6c 6f 62 20 69 6e 20   record blob in 
21ec0 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 33 20  .** register P3 
21ed0 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74  with the entry t
21ee0 68 61 74 20 74 68 65 20 73 6f 72 74 65 72 20 63  hat the sorter c
21ef0 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
21f00 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 20 49 66  points to..** If
21f10 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20  , excluding the 
21f20 72 6f 77 69 64 20 66 69 65 6c 64 73 20 61 74 20  rowid fields at 
21f30 74 68 65 20 65 6e 64 2c 20 74 68 65 20 74 77 6f  the end, the two
21f40 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 20 6d   records are a m
21f50 61 74 63 68 2c 0a 2a 2a 20 66 61 6c 6c 20 74 68  atch,.** fall th
21f60 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
21f70 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 4f  t instruction. O
21f80 74 68 65 72 77 69 73 65 2c 20 6a 75 6d 70 20 74  therwise, jump t
21f90 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32  o instruction P2
21fa0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72  ..*/.case OP_Sor
21fb0 74 65 72 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20  terCompare: {.  
21fc0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
21fd0 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 70 43    int res;..  pC
21fe0 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
21ff0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
22000 69 73 53 6f 72 74 65 72 28 70 43 29 20 29 3b 0a  isSorter(pC) );.
22010 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
22020 4f 70 2d 3e 70 33 5d 3b 0a 20 20 72 63 20 3d 20  Op->p3];.  rc = 
22030 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
22040 72 43 6f 6d 70 61 72 65 28 70 43 2c 20 70 49 6e  rCompare(pC, pIn
22050 33 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20  3, &res);.  if( 
22060 72 65 73 20 29 7b 0a 20 20 20 20 70 63 20 3d 20  res ){.    pc = 
22070 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d 0a 20  pOp->p2-1;.  }. 
22080 20 62 72 65 61 6b 3b 0a 7d 3b 0a 0a 2f 2a 20 4f   break;.};../* O
22090 70 63 6f 64 65 3a 20 53 6f 72 74 65 72 44 61 74  pcode: SorterDat
220a0 61 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  a P1 P2 * * *.**
220b0 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 72  .** Write into r
220c0 65 67 69 73 74 65 72 20 50 32 20 74 68 65 20 63  egister P2 the c
220d0 75 72 72 65 6e 74 20 73 6f 72 74 65 72 20 64 61  urrent sorter da
220e0 74 61 20 66 6f 72 20 73 6f 72 74 65 72 20 63 75  ta for sorter cu
220f0 72 73 6f 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65  rsor P1..*/.case
22100 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 3a 20   OP_SorterData: 
22110 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
22120 70 43 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  pC;..#ifndef SQL
22130 49 54 45 5f 4f 4d 49 54 5f 4d 45 52 47 45 5f 53  ITE_OMIT_MERGE_S
22140 4f 52 54 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d  ORT.  pOut = &aM
22150 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70  em[pOp->p2];.  p
22160 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
22170 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
22180 20 70 43 2d 3e 69 73 53 6f 72 74 65 72 20 29 3b   pC->isSorter );
22190 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
221a0 64 62 65 53 6f 72 74 65 72 52 6f 77 6b 65 79 28  dbeSorterRowkey(
221b0 70 43 2c 20 70 4f 75 74 29 3b 0a 23 65 6c 73 65  pC, pOut);.#else
221c0 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
221d0 20 4f 50 5f 52 6f 77 4b 65 79 3b 0a 20 20 70 63   OP_RowKey;.  pc
221e0 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 62 72 65  --;.#endif.  bre
221f0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
22200 3a 20 52 6f 77 44 61 74 61 20 50 31 20 50 32 20  : RowData P1 P2 
22210 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74  * * *.**.** Writ
22220 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  e into register 
22230 50 32 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  P2 the complete 
22240 72 6f 77 20 64 61 74 61 20 66 6f 72 20 63 75 72  row data for cur
22250 73 6f 72 20 50 31 2e 0a 2a 2a 20 54 68 65 72 65  sor P1..** There
22260 20 69 73 20 6e 6f 20 69 6e 74 65 72 70 72 65 74   is no interpret
22270 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
22280 61 2e 20 20 0a 2a 2a 20 49 74 20 69 73 20 6a 75  a.  .** It is ju
22290 73 74 20 63 6f 70 69 65 64 20 6f 6e 74 6f 20 74  st copied onto t
222a0 68 65 20 50 32 20 72 65 67 69 73 74 65 72 20 65  he P2 register e
222b0 78 61 63 74 6c 79 20 61 73 20 0a 2a 2a 20 69 74  xactly as .** it
222c0 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   is found in the
222d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
222e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20  **.** If the P1 
222f0 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 20 70  cursor must be p
22300 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c  ointing to a val
22310 69 64 20 72 6f 77 20 28 6e 6f 74 20 61 20 4e 55  id row (not a NU
22320 4c 4c 20 72 6f 77 29 0a 2a 2a 20 6f 66 20 61 20  LL row).** of a 
22330 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20  real table, not 
22340 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a  a pseudo-table..
22350 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f  */./* Opcode: Ro
22360 77 4b 65 79 20 50 31 20 50 32 20 2a 20 2a 20 2a  wKey P1 P2 * * *
22370 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74  .**.** Write int
22380 6f 20 72 65 67 69 73 74 65 72 20 50 32 20 74 68  o register P2 th
22390 65 20 63 6f 6d 70 6c 65 74 65 20 72 6f 77 20 6b  e complete row k
223a0 65 79 20 66 6f 72 20 63 75 72 73 6f 72 20 50 31  ey for cursor P1
223b0 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f  ..** There is no
223c0 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20   interpretation 
223d0 6f 66 20 74 68 65 20 64 61 74 61 2e 20 20 0a 2a  of the data.  .*
223e0 2a 20 54 68 65 20 6b 65 79 20 69 73 20 63 6f 70  * The key is cop
223f0 69 65 64 20 6f 6e 74 6f 20 74 68 65 20 50 33 20  ied onto the P3 
22400 72 65 67 69 73 74 65 72 20 65 78 61 63 74 6c 79  register exactly
22410 20 61 73 20 0a 2a 2a 20 69 74 20 69 73 20 66 6f   as .** it is fo
22420 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  und in the datab
22430 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
22440 49 66 20 74 68 65 20 50 31 20 63 75 72 73 6f 72  If the P1 cursor
22450 20 6d 75 73 74 20 62 65 20 70 6f 69 6e 74 69 6e   must be pointin
22460 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  g to a valid row
22470 20 28 6e 6f 74 20 61 20 4e 55 4c 4c 20 72 6f 77   (not a NULL row
22480 29 0a 2a 2a 20 6f 66 20 61 20 72 65 61 6c 20 74  ).** of a real t
22490 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65 75  able, not a pseu
224a0 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73  do-table..*/.cas
224b0 65 20 4f 50 5f 52 6f 77 4b 65 79 3a 0a 63 61 73  e OP_RowKey:.cas
224c0 65 20 4f 50 5f 52 6f 77 44 61 74 61 3a 20 7b 0a  e OP_RowData: {.
224d0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
224e0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
224f0 72 73 72 3b 0a 20 20 75 33 32 20 6e 3b 0a 20 20  rsr;.  u32 n;.  
22500 69 36 34 20 6e 36 34 3b 0a 0a 20 20 70 4f 75 74  i64 n64;..  pOut
22510 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
22520 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43  ];.  memAboutToC
22530 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a  hange(p, pOut);.
22540 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  /* Note that 
22550 52 6f 77 4b 65 79 20 61 6e 64 20 52 6f 77 44 61  RowKey and RowDa
22560 74 61 20 61 72 65 20 72 65 61 6c 6c 79 20 65 78  ta are really ex
22570 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 69  actly the same i
22580 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
22590 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
225a0 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
225b0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
225c0 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
225d0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
225e0 70 43 2d 3e 69 73 53 6f 72 74 65 72 3d 3d 30 20  pC->isSorter==0 
225f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
22600 3e 69 73 54 61 62 6c 65 20 7c 7c 20 70 4f 70 2d  >isTable || pOp-
22610 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 52 6f 77 44  >opcode!=OP_RowD
22620 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
22630 20 70 43 2d 3e 69 73 49 6e 64 65 78 20 7c 7c 20   pC->isIndex || 
22640 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
22650 52 6f 77 44 61 74 61 20 29 3b 0a 20 20 61 73 73  RowData );.  ass
22660 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
22670 61 73 73 65 72 74 28 20 70 43 2d 3e 6e 75 6c 6c  assert( pC->null
22680 52 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Row==0 );.  asse
22690 72 74 28 20 70 43 2d 3e 70 73 65 75 64 6f 54 61  rt( pC->pseudoTa
226a0 62 6c 65 52 65 67 3d 3d 30 20 29 3b 0a 20 20 61  bleReg==0 );.  a
226b0 73 73 65 72 74 28 20 70 43 2d 3e 70 43 75 72 73  ssert( pC->pCurs
226c0 6f 72 21 3d 30 20 29 3b 0a 20 20 70 43 72 73 72  or!=0 );.  pCrsr
226d0 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a   = pC->pCursor;.
226e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
226f0 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
22700 6c 69 64 28 70 43 72 73 72 29 20 29 3b 0a 0a 20  lid(pCrsr) );.. 
22710 20 2f 2a 20 54 68 65 20 4f 50 5f 52 6f 77 4b 65   /* The OP_RowKe
22720 79 20 61 6e 64 20 4f 50 5f 52 6f 77 44 61 74 61  y and OP_RowData
22730 20 6f 70 63 6f 64 65 73 20 61 6c 77 61 79 73 20   opcodes always 
22740 66 6f 6c 6c 6f 77 20 4f 50 5f 4e 6f 74 45 78 69  follow OP_NotExi
22750 73 74 73 20 6f 72 0a 20 20 2a 2a 20 4f 50 5f 52  sts or.  ** OP_R
22760 65 77 69 6e 64 2f 4f 70 5f 4e 65 78 74 20 77 69  ewind/Op_Next wi
22770 74 68 20 6e 6f 20 69 6e 74 65 72 76 65 6e 69 6e  th no intervenin
22780 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74  g instructions t
22790 68 61 74 20 6d 69 67 68 74 20 69 6e 76 61 6c 69  hat might invali
227a0 64 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 63 75  date.  ** the cu
227b0 72 73 6f 72 2e 20 20 48 65 6e 63 65 20 74 68 65  rsor.  Hence the
227c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
227d0 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
227e0 74 6f 28 29 20 63 61 6c 6c 20 69 73 20 61 6c 77  to() call is alw
227f0 61 79 73 0a 20 20 2a 2a 20 61 20 6e 6f 2d 6f 70  ays.  ** a no-op
22800 20 61 6e 64 20 63 61 6e 20 6e 65 76 65 72 20 66   and can never f
22810 61 69 6c 2e 20 20 42 75 74 20 77 65 20 6c 65 61  ail.  But we lea
22820 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20 61  ve it in place a
22830 73 20 61 20 73 61 66 65 74 79 2e 0a 20 20 2a 2f  s a safety..  */
22840 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64  .  assert( pC->d
22850 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30  eferredMoveto==0
22860 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
22870 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
22880 74 6f 28 70 43 29 3b 0a 20 20 69 66 28 20 4e 45  to(pC);.  if( NE
22890 56 45 52 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f  VER(rc!=SQLITE_O
228a0 4b 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  K) ) goto abort_
228b0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20  due_to_error;.. 
228c0 20 69 66 28 20 70 43 2d 3e 69 73 49 6e 64 65 78   if( pC->isIndex
228d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
228e0 21 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a  !pC->isTable );.
228f0 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20      VVA_ONLY(rc 
22900 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  =) sqlite3BtreeK
22910 65 79 53 69 7a 65 28 70 43 72 73 72 2c 20 26 6e  eySize(pCrsr, &n
22920 36 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  64);.    assert(
22930 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22940 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 62 65 63  ;    /* True bec
22950 61 75 73 65 20 6f 66 20 43 75 72 73 6f 72 4d 6f  ause of CursorMo
22960 76 65 74 6f 28 29 20 63 61 6c 6c 20 61 62 6f 76  veto() call abov
22970 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 36 34  e */.    if( n64
22980 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
22990 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
229a0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74   ){.      goto t
229b0 6f 6f 5f 62 69 67 3b 0a 20 20 20 20 7d 0a 20 20  oo_big;.    }.  
229c0 20 20 6e 20 3d 20 28 75 33 32 29 6e 36 34 3b 0a    n = (u32)n64;.
229d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 56 41    }else{.    VVA
229e0 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69  _ONLY(rc =) sqli
229f0 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
22a00 28 70 43 72 73 72 2c 20 26 6e 29 3b 0a 20 20 20  (pCrsr, &n);.   
22a10 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
22a20 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20  ITE_OK );    /* 
22a30 44 61 74 61 53 69 7a 65 28 29 20 63 61 6e 6e 6f  DataSize() canno
22a40 74 20 66 61 69 6c 20 2a 2f 0a 20 20 20 20 69 66  t fail */.    if
22a50 28 20 6e 3e 28 75 33 32 29 64 62 2d 3e 61 4c 69  ( n>(u32)db->aLi
22a60 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
22a70 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20  _LENGTH] ){.    
22a80 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a    goto too_big;.
22a90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
22aa0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72  sqlite3VdbeMemGr
22ab0 6f 77 28 70 4f 75 74 2c 20 6e 2c 20 30 29 20 29  ow(pOut, n, 0) )
22ac0 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65  {.    goto no_me
22ad0 6d 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 6e  m;.  }.  pOut->n
22ae0 20 3d 20 6e 3b 0a 20 20 4d 65 6d 53 65 74 54 79   = n;.  MemSetTy
22af0 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d  peFlag(pOut, MEM
22b00 5f 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 70 43  _Blob);.  if( pC
22b10 2d 3e 69 73 49 6e 64 65 78 20 29 7b 0a 20 20 20  ->isIndex ){.   
22b20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
22b30 65 65 4b 65 79 28 70 43 72 73 72 2c 20 30 2c 20  eeKey(pCrsr, 0, 
22b40 6e 2c 20 70 4f 75 74 2d 3e 7a 29 3b 0a 20 20 7d  n, pOut->z);.  }
22b50 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
22b60 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28  qlite3BtreeData(
22b70 70 43 72 73 72 2c 20 30 2c 20 6e 2c 20 70 4f 75  pCrsr, 0, n, pOu
22b80 74 2d 3e 7a 29 3b 0a 20 20 7d 0a 20 20 70 4f 75  t->z);.  }.  pOu
22b90 74 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  t->enc = SQLITE_
22ba0 55 54 46 38 3b 20 20 2f 2a 20 49 6e 20 63 61 73  UTF8;  /* In cas
22bb0 65 20 74 68 65 20 62 6c 6f 62 20 69 73 20 65 76  e the blob is ev
22bc0 65 72 20 63 61 73 74 20 74 6f 20 74 65 78 74 20  er cast to text 
22bd0 2a 2f 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  */.  UPDATE_MAX_
22be0 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a  BLOBSIZE(pOut);.
22bf0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
22c00 70 63 6f 64 65 3a 20 52 6f 77 69 64 20 50 31 20  pcode: Rowid P1 
22c10 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53  P2 * * *.**.** S
22c20 74 6f 72 65 20 69 6e 20 72 65 67 69 73 74 65 72  tore in register
22c30 20 50 32 20 61 6e 20 69 6e 74 65 67 65 72 20 77   P2 an integer w
22c40 68 69 63 68 20 69 73 20 74 68 65 20 6b 65 79 20  hich is the key 
22c50 6f 66 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  of the table ent
22c60 72 79 20 74 68 61 74 0a 2a 2a 20 50 31 20 69 73  ry that.** P1 is
22c70 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
22c80 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 63 61   to..**.** P1 ca
22c90 6e 20 62 65 20 65 69 74 68 65 72 20 61 6e 20 6f  n be either an o
22ca0 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
22cb0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
22cc0 2e 20 20 54 68 65 72 65 20 75 73 65 64 20 74 6f  .  There used to
22cd0 0a 2a 2a 20 62 65 20 61 20 73 65 70 61 72 61 74  .** be a separat
22ce0 65 20 4f 50 5f 56 52 6f 77 69 64 20 6f 70 63 6f  e OP_VRowid opco
22cf0 64 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  de for use with 
22d00 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20  virtual tables, 
22d10 62 75 74 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 20  but this.** one 
22d20 6f 70 63 6f 64 65 20 6e 6f 77 20 77 6f 72 6b 73  opcode now works
22d30 20 66 6f 72 20 62 6f 74 68 20 74 61 62 6c 65 20   for both table 
22d40 74 79 70 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f  types..*/.case O
22d50 50 5f 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20  P_Rowid: {      
22d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
22d70 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f  t2-prerelease */
22d80 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
22d90 43 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 73 71  C;.  i64 v;.  sq
22da0 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
22db0 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  b;.  const sqlit
22dc0 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
22dd0 6c 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  le;..  assert( p
22de0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
22df0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
22e00 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
22e10 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
22e20 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
22e30 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70 73    assert( pC->ps
22e40 65 75 64 6f 54 61 62 6c 65 52 65 67 3d 3d 30 20  eudoTableReg==0 
22e50 29 3b 0a 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c  );.  if( pC->nul
22e60 6c 52 6f 77 20 29 7b 0a 20 20 20 20 70 4f 75 74  lRow ){.    pOut
22e70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
22e80 6c 6c 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ll;.    break;. 
22e90 20 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 64   }else if( pC->d
22ea0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
22eb0 0a 20 20 20 20 76 20 3d 20 70 43 2d 3e 6d 6f 76  .    v = pC->mov
22ec0 65 74 6f 54 61 72 67 65 74 3b 0a 23 69 66 6e 64  etoTarget;.#ifnd
22ed0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
22ee0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 7d 65  IRTUALTABLE.  }e
22ef0 6c 73 65 20 69 66 28 20 70 43 2d 3e 70 56 74 61  lse if( pC->pVta
22f00 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 70  bCursor ){.    p
22f10 56 74 61 62 20 3d 20 70 43 2d 3e 70 56 74 61 62  Vtab = pC->pVtab
22f20 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20  Cursor->pVtab;. 
22f30 20 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74     pModule = pVt
22f40 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  ab->pModule;.   
22f50 20 61 73 73 65 72 74 28 20 70 4d 6f 64 75 6c 65   assert( pModule
22f60 2d 3e 78 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  ->xRowid );.    
22f70 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 52  rc = pModule->xR
22f80 6f 77 69 64 28 70 43 2d 3e 70 56 74 61 62 43 75  owid(pC->pVtabCu
22f90 72 73 6f 72 2c 20 26 76 29 3b 0a 20 20 20 20 69  rsor, &v);.    i
22fa0 6d 70 6f 72 74 56 74 61 62 45 72 72 4d 73 67 28  mportVtabErrMsg(
22fb0 70 2c 20 70 56 74 61 62 29 3b 0a 23 65 6e 64 69  p, pVtab);.#endi
22fc0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
22fd0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
22fe0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
22ff0 73 65 72 74 28 20 70 43 2d 3e 70 43 75 72 73 6f  sert( pC->pCurso
23000 72 21 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  r!=0 );.    rc =
23010 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
23020 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20  orMoveto(pC);.  
23030 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
23040 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
23050 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e  or;.    if( pC->
23060 72 6f 77 69 64 49 73 56 61 6c 69 64 20 29 7b 0a  rowidIsValid ){.
23070 20 20 20 20 20 20 76 20 3d 20 70 43 2d 3e 6c 61        v = pC->la
23080 73 74 52 6f 77 69 64 3b 0a 20 20 20 20 7d 65 6c  stRowid;.    }el
23090 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
230a0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
230b0 7a 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ze(pC->pCursor, 
230c0 26 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  &v);.      asser
230d0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
230e0 20 29 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 73   );  /* Always s
230f0 6f 20 62 65 63 61 75 73 65 20 6f 66 20 43 75 72  o because of Cur
23100 73 6f 72 4d 6f 76 65 74 6f 28 29 20 61 62 6f 76  sorMoveto() abov
23110 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e */.    }.  }. 
23120 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 3b 0a   pOut->u.i = v;.
23130 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
23140 70 63 6f 64 65 3a 20 4e 75 6c 6c 52 6f 77 20 50  pcode: NullRow P
23150 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  1 * * * *.**.** 
23160 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
23170 50 31 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  P1 to a null row
23180 2e 20 20 41 6e 79 20 4f 50 5f 43 6f 6c 75 6d 6e  .  Any OP_Column
23190 20 6f 70 65 72 61 74 69 6f 6e 73 0a 2a 2a 20 74   operations.** t
231a0 68 61 74 20 6f 63 63 75 72 20 77 68 69 6c 65 20  hat occur while 
231b0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 6e  the cursor is on
231c0 20 74 68 65 20 6e 75 6c 6c 20 72 6f 77 20 77 69   the null row wi
231d0 6c 6c 20 61 6c 77 61 79 73 0a 2a 2a 20 77 72 69  ll always.** wri
231e0 74 65 20 61 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61  te a NULL..*/.ca
231f0 73 65 20 4f 50 5f 4e 75 6c 6c 52 6f 77 3a 20 7b  se OP_NullRow: {
23200 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
23210 43 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  C;..  assert( pO
23220 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
23230 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
23240 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
23250 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
23260 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
23270 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31   pC->nullRow = 1
23280 3b 0a 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56  ;.  pC->rowidIsV
23290 61 6c 69 64 20 3d 20 30 3b 0a 20 20 61 73 73 65  alid = 0;.  asse
232a0 72 74 28 20 70 43 2d 3e 70 43 75 72 73 6f 72 20  rt( pC->pCursor 
232b0 7c 7c 20 70 43 2d 3e 70 56 74 61 62 43 75 72 73  || pC->pVtabCurs
232c0 6f 72 20 29 3b 0a 20 20 69 66 28 20 70 43 2d 3e  or );.  if( pC->
232d0 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  pCursor ){.    s
232e0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
232f0 43 75 72 73 6f 72 28 70 43 2d 3e 70 43 75 72 73  Cursor(pC->pCurs
23300 6f 72 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  or);.  }.  break
23310 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
23320 4c 61 73 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  Last P1 P2 * * *
23330 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  .**.** The next 
23340 75 73 65 20 6f 66 20 74 68 65 20 52 6f 77 69 64  use of the Rowid
23350 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72 20 4e 65   or Column or Ne
23360 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66  xt instruction f
23370 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c 6c 20 72  or P1 .** will r
23380 65 66 65 72 20 74 6f 20 74 68 65 20 6c 61 73 74  efer to the last
23390 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
233a0 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
233b0 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74 68 65  index..** If the
233c0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
233d0 69 73 20 65 6d 70 74 79 20 61 6e 64 20 50 32 3e  is empty and P2>
233e0 30 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d  0, then jump imm
233f0 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a  ediately to P2..
23400 2a 2a 20 49 66 20 50 32 20 69 73 20 30 20 6f 72  ** If P2 is 0 or
23410 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   if the table or
23420 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 65 6d   index is not em
23430 70 74 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  pty, fall throug
23440 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c  h.** to the foll
23450 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f  owing instructio
23460 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 61  n..*/.case OP_La
23470 73 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  st: {        /* 
23480 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43 75  jump */.  VdbeCu
23490 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75  rsor *pC;.  BtCu
234a0 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 69  rsor *pCrsr;.  i
234b0 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72  nt res;..  asser
234c0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
234d0 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
234e0 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
234f0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
23500 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
23510 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43   );.  pCrsr = pC
23520 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 72 65 73  ->pCursor;.  res
23530 20 3d 20 30 3b 0a 20 20 69 66 28 20 41 4c 57 41   = 0;.  if( ALWA
23540 59 53 28 70 43 72 73 72 21 3d 30 29 20 29 7b 0a  YS(pCrsr!=0) ){.
23550 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23560 42 74 72 65 65 4c 61 73 74 28 70 43 72 73 72 2c  BtreeLast(pCrsr,
23570 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43   &res);.  }.  pC
23580 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29  ->nullRow = (u8)
23590 72 65 73 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72  res;.  pC->defer
235a0 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
235b0 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69   pC->rowidIsVali
235c0 64 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63  d = 0;.  pC->cac
235d0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
235e0 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 70 4f  _STALE;.  if( pO
235f0 70 2d 3e 70 32 3e 30 20 26 26 20 72 65 73 20 29  p->p2>0 && res )
23600 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e  {.    pc = pOp->
23610 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72  p2 - 1;.  }.  br
23620 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f  eak;.}.../* Opco
23630 64 65 3a 20 53 6f 72 74 20 50 31 20 50 32 20 2a  de: Sort P1 P2 *
23640 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   * *.**.** This 
23650 6f 70 63 6f 64 65 20 64 6f 65 73 20 65 78 61 63  opcode does exac
23660 74 6c 79 20 74 68 65 20 73 61 6d 65 20 74 68 69  tly the same thi
23670 6e 67 20 61 73 20 4f 50 5f 52 65 77 69 6e 64 20  ng as OP_Rewind 
23680 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 69  except that.** i
23690 74 20 69 6e 63 72 65 6d 65 6e 74 73 20 61 6e 20  t increments an 
236a0 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 67 6c 6f  undocumented glo
236b0 62 61 6c 20 76 61 72 69 61 62 6c 65 20 75 73 65  bal variable use
236c0 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a  d for testing..*
236d0 2a 0a 2a 2a 20 53 6f 72 74 69 6e 67 20 69 73 20  *.** Sorting is 
236e0 61 63 63 6f 6d 70 6c 69 73 68 65 64 20 62 79 20  accomplished by 
236f0 77 72 69 74 69 6e 67 20 72 65 63 6f 72 64 73 20  writing records 
23700 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
23710 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  ndex,.** then re
23720 77 69 6e 64 69 6e 67 20 74 68 61 74 20 69 6e 64  winding that ind
23730 65 78 20 61 6e 64 20 70 6c 61 79 69 6e 67 20 69  ex and playing i
23740 74 20 62 61 63 6b 20 66 72 6f 6d 20 62 65 67 69  t back from begi
23750 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 65 6e 64 2e  nning to.** end.
23760 20 20 57 65 20 75 73 65 20 74 68 65 20 4f 50 5f    We use the OP_
23770 53 6f 72 74 20 6f 70 63 6f 64 65 20 69 6e 73 74  Sort opcode inst
23780 65 61 64 20 6f 66 20 4f 50 5f 52 65 77 69 6e 64  ead of OP_Rewind
23790 20 74 6f 20 64 6f 20 74 68 65 0a 2a 2a 20 72 65   to do the.** re
237a0 77 69 6e 64 69 6e 67 20 73 6f 20 74 68 61 74 20  winding so that 
237b0 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  the global varia
237c0 62 6c 65 20 77 69 6c 6c 20 62 65 20 69 6e 63 72  ble will be incr
237d0 65 6d 65 6e 74 65 64 20 61 6e 64 0a 2a 2a 20 72  emented and.** r
237e0 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20  egression tests 
237f0 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20 77 68  can determine wh
23800 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
23810 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 0a 2a 2a   optimizer is.**
23820 20 63 6f 72 72 65 63 74 6c 79 20 6f 70 74 69 6d   correctly optim
23830 69 7a 69 6e 67 20 6f 75 74 20 73 6f 72 74 73 2e  izing out sorts.
23840 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74  .*/.case OP_Sort
23850 65 72 53 6f 72 74 3a 20 20 20 20 2f 2a 20 6a 75  erSort:    /* ju
23860 6d 70 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  mp */.#ifdef SQL
23870 49 54 45 5f 4f 4d 49 54 5f 4d 45 52 47 45 5f 53  ITE_OMIT_MERGE_S
23880 4f 52 54 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64  ORT.  pOp->opcod
23890 65 20 3d 20 4f 50 5f 53 6f 72 74 3b 0a 23 65 6e  e = OP_Sort;.#en
238a0 64 69 66 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74  dif.case OP_Sort
238b0 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
238c0 6d 70 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  mp */.#ifdef SQL
238d0 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
238e0 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2b 2b 3b  e3_sort_count++;
238f0 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  .  sqlite3_searc
23900 68 5f 63 6f 75 6e 74 2d 2d 3b 0a 23 65 6e 64 69  h_count--;.#endi
23910 66 0a 20 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b  f.  p->aCounter[
23920 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
23930 53 5f 53 4f 52 54 2d 31 5d 2b 2b 3b 0a 20 20 2f  S_SORT-1]++;.  /
23940 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  * Fall through i
23950 6e 74 6f 20 4f 50 5f 52 65 77 69 6e 64 20 2a 2f  nto OP_Rewind */
23960 0a 7d 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  .}./* Opcode: Re
23970 77 69 6e 64 20 50 31 20 50 32 20 2a 20 2a 20 2a  wind P1 P2 * * *
23980 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  .**.** The next 
23990 75 73 65 20 6f 66 20 74 68 65 20 52 6f 77 69 64  use of the Rowid
239a0 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72 20 4e 65   or Column or Ne
239b0 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66  xt instruction f
239c0 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c 6c 20 72  or P1 .** will r
239d0 65 66 65 72 20 74 6f 20 74 68 65 20 66 69 72 73  efer to the firs
239e0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
239f0 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
23a00 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74 68   index..** If th
23a10 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
23a20 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20 50 32   is empty and P2
23a30 3e 30 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d  >0, then jump im
23a40 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
23a50 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 30 20 6f  .** If P2 is 0 o
23a60 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f  r if the table o
23a70 72 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 65  r index is not e
23a80 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75  mpty, fall throu
23a90 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c  gh.** to the fol
23aa0 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69  lowing instructi
23ab0 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  on..*/.case OP_R
23ac0 65 77 69 6e 64 3a 20 7b 20 20 20 20 20 20 20 20  ewind: {        
23ad0 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62  /* jump */.  Vdb
23ae0 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42  eCursor *pC;.  B
23af0 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a  tCursor *pCrsr;.
23b00 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73    int res;..  as
23b10 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
23b20 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
23b30 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
23b40 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
23b50 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
23b60 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
23b70 20 70 43 2d 3e 69 73 53 6f 72 74 65 72 3d 3d 28   pC->isSorter==(
23b80 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
23b90 53 6f 72 74 65 72 53 6f 72 74 29 20 29 3b 0a 20  SorterSort) );. 
23ba0 20 72 65 73 20 3d 20 31 3b 0a 20 20 69 66 28 20   res = 1;.  if( 
23bb0 69 73 53 6f 72 74 65 72 28 70 43 29 20 29 7b 0a  isSorter(pC) ){.
23bc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23bd0 56 64 62 65 53 6f 72 74 65 72 52 65 77 69 6e 64  VdbeSorterRewind
23be0 28 64 62 2c 20 70 43 2c 20 26 72 65 73 29 3b 0a  (db, pC, &res);.
23bf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 72    }else{.    pCr
23c00 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72  sr = pC->pCursor
23c10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
23c20 72 73 72 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  rsr );.    rc = 
23c30 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73  sqlite3BtreeFirs
23c40 74 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b 0a  t(pCrsr, &res);.
23c50 20 20 20 20 70 43 2d 3e 61 74 46 69 72 73 74 20      pC->atFirst 
23c60 3d 20 72 65 73 3d 3d 30 20 3f 31 3a 30 3b 0a 20  = res==0 ?1:0;. 
23c70 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d     pC->deferredM
23c80 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70  oveto = 0;.    p
23c90 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  C->cacheStatus =
23ca0 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
23cb0 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c    pC->rowidIsVal
23cc0 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43  id = 0;.  }.  pC
23cd0 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29  ->nullRow = (u8)
23ce0 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70  res;.  assert( p
23cf0 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d  Op->p2>0 && pOp-
23d00 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  >p2<p->nOp );.  
23d10 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 70  if( res ){.    p
23d20 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
23d30 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
23d40 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 78 74  ./* Opcode: Next
23d50 20 50 31 20 50 32 20 2a 20 50 34 20 50 35 0a 2a   P1 P2 * P4 P5.*
23d60 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 63 75 72  *.** Advance cur
23d70 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 69  sor P1 so that i
23d80 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
23d90 6e 65 78 74 20 6b 65 79 2f 64 61 74 61 20 70 61  next key/data pa
23da0 69 72 20 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62  ir in its.** tab
23db0 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 49 66  le or index.  If
23dc0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
23dd0 72 65 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69  re key/value pai
23de0 72 73 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  rs then fall thr
23df0 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ough.** to the f
23e00 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63  ollowing instruc
23e10 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 20 74 68  tion.  But if th
23e20 65 20 63 75 72 73 6f 72 20 61 64 76 61 6e 63 65  e cursor advance
23e30 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c   was successful,
23e40 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  .** jump immedia
23e50 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a  tely to P2..**.*
23e60 2a 20 54 68 65 20 50 31 20 63 75 72 73 6f 72 20  * The P1 cursor 
23e70 6d 75 73 74 20 62 65 20 66 6f 72 20 61 20 72 65  must be for a re
23e80 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  al table, not a 
23e90 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a  pseudo-table..**
23ea0 0a 2a 2a 20 50 34 20 69 73 20 61 6c 77 61 79 73  .** P4 is always
23eb0 20 6f 66 20 74 79 70 65 20 50 34 5f 41 44 56 41   of type P4_ADVA
23ec0 4e 43 45 2e 20 54 68 65 20 66 75 6e 63 74 69 6f  NCE. The functio
23ed0 6e 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  n pointer points
23ee0 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74   to.** sqlite3Bt
23ef0 72 65 65 4e 65 78 74 28 29 2e 0a 2a 2a 0a 2a 2a  reeNext()..**.**
23f00 20 49 66 20 50 35 20 69 73 20 70 6f 73 69 74 69   If P5 is positi
23f10 76 65 20 61 6e 64 20 74 68 65 20 6a 75 6d 70 20  ve and the jump 
23f20 69 73 20 74 61 6b 65 6e 2c 20 74 68 65 6e 20 65  is taken, then e
23f30 76 65 6e 74 20 63 6f 75 6e 74 65 72 0a 2a 2a 20  vent counter.** 
23f40 6e 75 6d 62 65 72 20 50 35 2d 31 20 69 6e 20 74  number P5-1 in t
23f50 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
23f60 65 6d 65 6e 74 20 69 73 20 69 6e 63 72 65 6d 65  ement is increme
23f70 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  nted..**.** See 
23f80 61 6c 73 6f 3a 20 50 72 65 76 0a 2a 2f 0a 2f 2a  also: Prev.*/./*
23f90 20 4f 70 63 6f 64 65 3a 20 50 72 65 76 20 50 31   Opcode: Prev P1
23fa0 20 50 32 20 2a 20 2a 20 50 35 0a 2a 2a 0a 2a 2a   P2 * * P5.**.**
23fb0 20 42 61 63 6b 20 75 70 20 63 75 72 73 6f 72 20   Back up cursor 
23fc0 50 31 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  P1 so that it po
23fd0 69 6e 74 73 20 74 6f 20 74 68 65 20 70 72 65 76  ints to the prev
23fe0 69 6f 75 73 20 6b 65 79 2f 64 61 74 61 20 70 61  ious key/data pa
23ff0 69 72 20 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62  ir in its.** tab
24000 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 49 66  le or index.  If
24010 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 72 65   there is no pre
24020 76 69 6f 75 73 20 6b 65 79 2f 76 61 6c 75 65 20  vious key/value 
24030 70 61 69 72 73 20 74 68 65 6e 20 66 61 6c 6c 20  pairs then fall 
24040 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68  through.** to th
24050 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74  e following inst
24060 72 75 63 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  ruction.  But if
24070 20 74 68 65 20 63 75 72 73 6f 72 20 62 61 63 6b   the cursor back
24080 75 70 20 77 61 73 20 73 75 63 63 65 73 73 66 75  up was successfu
24090 6c 2c 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64  l,.** jump immed
240a0 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a  iately to P2..**
240b0 0a 2a 2a 20 54 68 65 20 50 31 20 63 75 72 73 6f  .** The P1 curso
240c0 72 20 6d 75 73 74 20 62 65 20 66 6f 72 20 61 20  r must be for a 
240d0 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20  real table, not 
240e0 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a  a pseudo-table..
240f0 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 6c 77 61  **.** P4 is alwa
24100 79 73 20 6f 66 20 74 79 70 65 20 50 34 5f 41 44  ys of type P4_AD
24110 56 41 4e 43 45 2e 20 54 68 65 20 66 75 6e 63 74  VANCE. The funct
24120 69 6f 6e 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  ion pointer poin
24130 74 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ts to.** sqlite3
24140 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e  BtreePrevious().
24150 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20  .**.** If P5 is 
24160 70 6f 73 69 74 69 76 65 20 61 6e 64 20 74 68 65  positive and the
24170 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20   jump is taken, 
24180 74 68 65 6e 20 65 76 65 6e 74 20 63 6f 75 6e 74  then event count
24190 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 35 2d  er.** number P5-
241a0 31 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  1 in the prepare
241b0 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 69  d statement is i
241c0 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 63  ncremented..*/.c
241d0 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  ase OP_SorterNex
241e0 74 3a 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f  t:    /* jump */
241f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
24200 4d 49 54 5f 4d 45 52 47 45 5f 53 4f 52 54 0a 20  MIT_MERGE_SORT. 
24210 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
24220 50 5f 4e 65 78 74 3b 0a 23 65 6e 64 69 66 0a 63  P_Next;.#endif.c
24230 61 73 65 20 4f 50 5f 50 72 65 76 3a 20 20 20 20  ase OP_Prev:    
24240 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
24250 0a 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 20 7b  .case OP_Next: {
24260 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
24270 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
24280 2a 70 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  *pC;.  int res;.
24290 0a 20 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54  .  CHECK_FOR_INT
242a0 45 52 52 55 50 54 3b 0a 20 20 61 73 73 65 72 74  ERRUPT;.  assert
242b0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
242c0 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
242d0 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  or );.  assert( 
242e0 70 4f 70 2d 3e 70 35 3c 3d 41 72 72 61 79 53 69  pOp->p5<=ArraySi
242f0 7a 65 28 70 2d 3e 61 43 6f 75 6e 74 65 72 29 20  ze(p->aCounter) 
24300 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
24310 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69  sr[pOp->p1];.  i
24320 66 28 20 70 43 3d 3d 30 20 29 7b 0a 20 20 20 20  f( pC==0 ){.    
24330 62 72 65 61 6b 3b 20 20 2f 2a 20 53 65 65 20 74  break;  /* See t
24340 69 63 6b 65 74 20 23 32 32 37 33 20 2a 2f 0a 20  icket #2273 */. 
24350 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d   }.  assert( pC-
24360 3e 69 73 53 6f 72 74 65 72 3d 3d 28 70 4f 70 2d  >isSorter==(pOp-
24370 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74  >opcode==OP_Sort
24380 65 72 4e 65 78 74 29 20 29 3b 0a 20 20 69 66 28  erNext) );.  if(
24390 20 69 73 53 6f 72 74 65 72 28 70 43 29 20 29 7b   isSorter(pC) ){
243a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
243b0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72  ->opcode==OP_Sor
243c0 74 65 72 4e 65 78 74 20 29 3b 0a 20 20 20 20 72  terNext );.    r
243d0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  c = sqlite3VdbeS
243e0 6f 72 74 65 72 4e 65 78 74 28 64 62 2c 20 70 43  orterNext(db, pC
243f0 2c 20 26 72 65 73 29 3b 0a 20 20 7d 65 6c 73 65  , &res);.  }else
24400 7b 0a 20 20 20 20 72 65 73 20 3d 20 31 3b 0a 20  {.    res = 1;. 
24410 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64     assert( pC->d
24420 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30  eferredMoveto==0
24430 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
24440 70 43 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  pC->pCursor );. 
24450 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
24460 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 20  opcode!=OP_Next 
24470 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61  || pOp->p4.xAdva
24480 6e 63 65 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  nce==sqlite3Btre
24490 65 4e 65 78 74 20 29 3b 0a 20 20 20 20 61 73 73  eNext );.    ass
244a0 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
244b0 21 3d 4f 50 5f 50 72 65 76 20 7c 7c 20 70 4f 70  !=OP_Prev || pOp
244c0 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d 73  ->p4.xAdvance==s
244d0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
244e0 6f 75 73 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ous );.    rc = 
244f0 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
24500 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72  (pC->pCursor, &r
24510 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 2d 3e 6e  es);.  }.  pC->n
24520 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29 72 65 73  ullRow = (u8)res
24530 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61  ;.  pC->cacheSta
24540 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
24550 45 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  E;.  if( res==0 
24560 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  ){.    pc = pOp-
24570 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 69 66 28  >p2 - 1;.    if(
24580 20 70 4f 70 2d 3e 70 35 20 29 20 70 2d 3e 61 43   pOp->p5 ) p->aC
24590 6f 75 6e 74 65 72 5b 70 4f 70 2d 3e 70 35 2d 31  ounter[pOp->p5-1
245a0 5d 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ]++;.#ifdef SQLI
245b0 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69  TE_TEST.    sqli
245c0 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
245d0 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  ++;.#endif.  }. 
245e0 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69   pC->rowidIsVali
245f0 64 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a  d = 0;.  break;.
24600 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64  }../* Opcode: Id
24610 78 49 6e 73 65 72 74 20 50 31 20 50 32 20 50 33  xInsert P1 P2 P3
24620 20 2a 20 50 35 0a 2a 2a 0a 2a 2a 20 52 65 67 69   * P5.**.** Regi
24630 73 74 65 72 20 50 32 20 68 6f 6c 64 73 20 61 6e  ster P2 holds an
24640 20 53 51 4c 20 69 6e 64 65 78 20 6b 65 79 20 6d   SQL index key m
24650 61 64 65 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a  ade using the.**
24660 20 4d 61 6b 65 52 65 63 6f 72 64 20 69 6e 73 74   MakeRecord inst
24670 72 75 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20  ructions.  This 
24680 6f 70 63 6f 64 65 20 77 72 69 74 65 73 20 74 68  opcode writes th
24690 61 74 20 6b 65 79 0a 2a 2a 20 69 6e 74 6f 20 74  at key.** into t
246a0 68 65 20 69 6e 64 65 78 20 50 31 2e 20 20 44 61  he index P1.  Da
246b0 74 61 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ta for the entry
246c0 20 69 73 20 6e 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50   is nil..**.** P
246d0 33 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74  3 is a flag that
246e0 20 70 72 6f 76 69 64 65 73 20 61 20 68 69 6e 74   provides a hint
246f0 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20 6c   to the b-tree l
24700 61 79 65 72 20 74 68 61 74 20 74 68 69 73 0a 2a  ayer that this.*
24710 2a 20 69 6e 73 65 72 74 20 69 73 20 6c 69 6b 65  * insert is like
24720 6c 79 20 74 6f 20 62 65 20 61 6e 20 61 70 70 65  ly to be an appe
24730 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  nd..**.** This i
24740 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20  nstruction only 
24750 77 6f 72 6b 73 20 66 6f 72 20 69 6e 64 69 63 65  works for indice
24760 73 2e 20 20 54 68 65 20 65 71 75 69 76 61 6c 65  s.  The equivale
24770 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  nt instruction.*
24780 2a 20 66 6f 72 20 74 61 62 6c 65 73 20 69 73 20  * for tables is 
24790 4f 50 5f 49 6e 73 65 72 74 2e 0a 2a 2f 0a 63 61  OP_Insert..*/.ca
247a0 73 65 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  se OP_SorterInse
247b0 72 74 3a 20 20 20 20 20 20 20 2f 2a 20 69 6e 32  rt:       /* in2
247c0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
247d0 45 5f 4f 4d 49 54 5f 4d 45 52 47 45 5f 53 4f 52  E_OMIT_MERGE_SOR
247e0 54 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  T.  pOp->opcode 
247f0 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a  = OP_IdxInsert;.
24800 23 65 6e 64 69 66 0a 63 61 73 65 20 4f 50 5f 49  #endif.case OP_I
24810 64 78 49 6e 73 65 72 74 3a 20 7b 20 20 20 20 20  dxInsert: {     
24820 20 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56     /* in2 */.  V
24830 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
24840 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72   BtCursor *pCrsr
24850 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20  ;.  int nKey;.  
24860 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79  const char *zKey
24870 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
24880 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
24890 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
248a0 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
248b0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
248c0 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
248d0 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 53 6f  assert( pC->isSo
248e0 72 74 65 72 3d 3d 28 70 4f 70 2d 3e 6f 70 63 6f  rter==(pOp->opco
248f0 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 49 6e 73  de==OP_SorterIns
24900 65 72 74 29 20 29 3b 0a 20 20 70 49 6e 32 20 3d  ert) );.  pIn2 =
24910 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
24920 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 32 2d  .  assert( pIn2-
24930 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
24940 62 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70  b );.  pCrsr = p
24950 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  C->pCursor;.  if
24960 28 20 41 4c 57 41 59 53 28 70 43 72 73 72 21 3d  ( ALWAYS(pCrsr!=
24970 30 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  0) ){.    assert
24980 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30  ( pC->isTable==0
24990 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 45 78 70   );.    rc = Exp
249a0 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29 3b 0a 20  andBlob(pIn2);. 
249b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
249c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
249d0 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 20 29  ( isSorter(pC) )
249e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
249f0 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
24a00 57 72 69 74 65 28 64 62 2c 20 70 43 2c 20 70 49  Write(db, pC, pI
24a10 6e 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n2);.      }else
24a20 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 20 3d  {.        nKey =
24a30 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 20 20 20 20   pIn2->n;.      
24a40 20 20 7a 4b 65 79 20 3d 20 70 49 6e 32 2d 3e 7a    zKey = pIn2->z
24a50 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
24a60 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
24a70 74 28 70 43 72 73 72 2c 20 7a 4b 65 79 2c 20 6e  t(pCrsr, zKey, n
24a80 4b 65 79 2c 20 22 22 2c 20 30 2c 20 30 2c 20 70  Key, "", 0, 0, p
24a90 4f 70 2d 3e 70 33 2c 20 0a 20 20 20 20 20 20 20  Op->p3, .       
24aa0 20 20 20 20 20 28 28 70 4f 70 2d 3e 70 35 20 26       ((pOp->p5 &
24ab0 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
24ac0 45 53 55 4c 54 29 20 3f 20 70 43 2d 3e 73 65 65  ESULT) ? pC->see
24ad0 6b 52 65 73 75 6c 74 20 3a 20 30 29 0a 20 20 20  kResult : 0).   
24ae0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
24af0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
24b00 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d  deferredMoveto==
24b10 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43 2d  0 );.        pC-
24b20 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
24b30 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20  ACHE_STALE;.    
24b40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
24b50 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
24b60 6f 64 65 3a 20 49 64 78 44 65 6c 65 74 65 20 50  ode: IdxDelete P
24b70 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
24b80 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
24b90 20 50 33 20 72 65 67 69 73 74 65 72 73 20 73 74   P3 registers st
24ba0 61 72 74 69 6e 67 20 61 74 20 72 65 67 69 73 74  arting at regist
24bb0 65 72 20 50 32 20 66 6f 72 6d 0a 2a 2a 20 61 6e  er P2 form.** an
24bc0 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
24bd0 6b 65 79 2e 20 54 68 69 73 20 6f 70 63 6f 64 65  key. This opcode
24be0 20 72 65 6d 6f 76 65 73 20 74 68 61 74 20 65 6e   removes that en
24bf0 74 72 79 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  try from the .**
24c00 20 69 6e 64 65 78 20 6f 70 65 6e 65 64 20 62 79   index opened by
24c10 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2f 0a 63   cursor P1..*/.c
24c20 61 73 65 20 4f 50 5f 49 64 78 44 65 6c 65 74 65  ase OP_IdxDelete
24c30 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
24c40 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
24c50 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72   *pCrsr;.  int r
24c60 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  es;.  UnpackedRe
24c70 63 6f 72 64 20 72 3b 0a 0a 20 20 61 73 73 65 72  cord r;..  asser
24c80 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a  t( pOp->p3>0 );.
24c90 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
24ca0 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70  2>0 && pOp->p2+p
24cb0 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 2b  Op->p3<=p->nMem+
24cc0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
24cd0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
24ce0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
24cf0 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
24d00 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
24d10 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
24d20 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 70 43    pCrsr = pC->pC
24d30 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 41 4c 57  ursor;.  if( ALW
24d40 41 59 53 28 70 43 72 73 72 21 3d 30 29 20 29 7b  AYS(pCrsr!=0) ){
24d50 0a 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20  .    r.pKeyInfo 
24d60 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  = pC->pKeyInfo;.
24d70 20 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28      r.nField = (
24d80 75 31 36 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20  u16)pOp->p3;.   
24d90 20 72 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20   r.flags = 0;.  
24da0 20 20 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d    r.aMem = &aMem
24db0 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 23 69 66 64 65  [pOp->p2];.#ifde
24dc0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
24dd0 20 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28     { int i; for(
24de0 69 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b  i=0; i<r.nField;
24df0 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 6d 65   i++) assert( me
24e00 6d 49 73 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d  mIsValid(&r.aMem
24e10 5b 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66  [i]) ); }.#endif
24e20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24e30 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
24e40 63 6b 65 64 28 70 43 72 73 72 2c 20 26 72 2c 20  cked(pCrsr, &r, 
24e50 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20  0, 0, &res);.   
24e60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24e70 4f 4b 20 26 26 20 72 65 73 3d 3d 30 20 29 7b 0a  OK && res==0 ){.
24e80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24e90 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 70 43  e3BtreeDelete(pC
24ea0 72 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rsr);.    }.    
24eb0 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65  assert( pC->defe
24ec0 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
24ed0 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74  .    pC->cacheSt
24ee0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
24ef0 4c 45 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  LE;.  }.  break;
24f00 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .}../* Opcode: I
24f10 64 78 52 6f 77 69 64 20 50 31 20 50 32 20 2a 20  dxRowid P1 P2 * 
24f20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  * *.**.** Write 
24f30 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  into register P2
24f40 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
24f50 68 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e  h is the last en
24f60 74 72 79 20 69 6e 20 74 68 65 20 72 65 63 6f 72  try in the recor
24f70 64 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20  d at.** the end 
24f80 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79  of the index key
24f90 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63   pointed to by c
24fa0 75 72 73 6f 72 20 50 31 2e 20 20 54 68 69 73 20  ursor P1.  This 
24fb0 69 6e 74 65 67 65 72 20 73 68 6f 75 6c 64 20 62  integer should b
24fc0 65 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 20 6f  e.** the rowid o
24fd0 66 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  f the table entr
24fe0 79 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20  y to which this 
24ff0 69 6e 64 65 78 20 65 6e 74 72 79 20 70 6f 69 6e  index entry poin
25000 74 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ts..**.** See al
25010 73 6f 3a 20 52 6f 77 69 64 2c 20 4d 61 6b 65 52  so: Rowid, MakeR
25020 65 63 6f 72 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ecord..*/.case O
25030 50 5f 49 64 78 52 6f 77 69 64 3a 20 7b 20 20 20  P_IdxRowid: {   
25040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
25050 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f  t2-prerelease */
25060 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72  .  BtCursor *pCr
25070 73 72 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  sr;.  VdbeCursor
25080 20 2a 70 43 3b 0a 20 20 69 36 34 20 72 6f 77 69   *pC;.  i64 rowi
25090 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  d;..  assert( pO
250a0 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
250b0 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
250c0 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
250d0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
250e0 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
250f0 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75   pCrsr = pC->pCu
25100 72 73 6f 72 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c  rsor;.  pOut->fl
25110 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
25120 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 72    if( ALWAYS(pCr
25130 73 72 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 63  sr!=0) ){.    rc
25140 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
25150 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a  rsorMoveto(pC);.
25160 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 72 63      if( NEVER(rc
25170 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  ) ) goto abort_d
25180 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
25190 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66   assert( pC->def
251a0 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29  erredMoveto==0 )
251b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
251c0 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  ->isTable==0 );.
251d0 20 20 20 20 69 66 28 20 21 70 43 2d 3e 6e 75 6c      if( !pC->nul
251e0 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 72 63  lRow ){.      rc
251f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 64   = sqlite3VdbeId
25200 78 52 6f 77 69 64 28 64 62 2c 20 70 43 72 73 72  xRowid(db, pCrsr
25210 2c 20 26 72 6f 77 69 64 29 3b 0a 20 20 20 20 20  , &rowid);.     
25220 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25230 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
25240 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
25250 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20  error;.      }. 
25260 20 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d       pOut->u.i =
25270 20 72 6f 77 69 64 3b 0a 20 20 20 20 20 20 70 4f   rowid;.      pO
25280 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ut->flags = MEM_
25290 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Int;.    }.  }. 
252a0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
252b0 63 6f 64 65 3a 20 49 64 78 47 45 20 50 31 20 50  code: IdxGE P1 P
252c0 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
252d0 20 54 68 65 20 50 34 20 72 65 67 69 73 74 65 72   The P4 register
252e0 20 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e   values beginnin
252f0 67 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20 61  g with P3 form a
25300 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  n unpacked index
25310 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d   .** key that om
25320 69 74 73 20 74 68 65 20 52 4f 57 49 44 2e 20 20  its the ROWID.  
25330 43 6f 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79  Compare this key
25340 20 76 61 6c 75 65 20 61 67 61 69 6e 73 74 20 74   value against t
25350 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 74 68 61  he index .** tha
25360 74 20 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c  t P1 is currentl
25370 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69  y pointing to, i
25380 67 6e 6f 72 69 6e 67 20 74 68 65 20 52 4f 57 49  gnoring the ROWI
25390 44 20 6f 6e 20 74 68 65 20 50 31 20 69 6e 64 65  D on the P1 inde
253a0 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  x..**.** If the 
253b0 50 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69  P1 index entry i
253c0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
253d0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b  r equal to the k
253e0 65 79 20 76 61 6c 75 65 0a 2a 2a 20 74 68 65 6e  ey value.** then
253f0 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20 4f 74   jump to P2.  Ot
25400 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68 72  herwise fall thr
25410 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
25420 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
25430 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 6e  .** If P5 is non
25440 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 65 20 6b  -zero then the k
25450 65 79 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72  ey value is incr
25460 65 61 73 65 64 20 62 79 20 61 6e 20 65 70 73 69  eased by an epsi
25470 6c 6f 6e 20 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  lon .** prior to
25480 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
25490 20 20 54 68 69 73 20 6d 61 6b 65 20 74 68 65 20    This make the 
254a0 6f 70 63 6f 64 65 20 77 6f 72 6b 20 6c 69 6b 65  opcode work like
254b0 20 49 64 78 47 54 20 65 78 63 65 70 74 0a 2a 2a   IdxGT except.**
254c0 20 74 68 61 74 20 69 66 20 74 68 65 20 6b 65 79   that if the key
254d0 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50   from register P
254e0 33 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  3 is a prefix of
254f0 20 74 68 65 20 6b 65 79 20 69 6e 20 74 68 65 20   the key in the 
25500 63 75 72 73 6f 72 2c 0a 2a 2a 20 74 68 65 20 72  cursor,.** the r
25510 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65 20 77  esult is false w
25520 68 65 72 65 61 73 20 69 74 20 77 6f 75 6c 64 20  hereas it would 
25530 62 65 20 74 72 75 65 20 77 69 74 68 20 49 64 78  be true with Idx
25540 47 54 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  GT..*/./* Opcode
25550 3a 20 49 64 78 4c 54 20 50 31 20 50 32 20 50 33  : IdxLT P1 P2 P3
25560 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 65   P4 P5.**.** The
25570 20 50 34 20 72 65 67 69 73 74 65 72 20 76 61 6c   P4 register val
25580 75 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  ues beginning wi
25590 74 68 20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e  th P3 form an un
255a0 70 61 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a  packed index .**
255b0 20 6b 65 79 20 74 68 61 74 20 6f 6d 69 74 73 20   key that omits 
255c0 74 68 65 20 52 4f 57 49 44 2e 20 20 43 6f 6d 70  the ROWID.  Comp
255d0 61 72 65 20 74 68 69 73 20 6b 65 79 20 76 61 6c  are this key val
255e0 75 65 20 61 67 61 69 6e 73 74 20 74 68 65 20 69  ue against the i
255f0 6e 64 65 78 20 0a 2a 2a 20 74 68 61 74 20 50 31  ndex .** that P1
25600 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
25610 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72  inting to, ignor
25620 69 6e 67 20 74 68 65 20 52 4f 57 49 44 20 6f 6e  ing the ROWID on
25630 20 74 68 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a   the P1 index..*
25640 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69  *.** If the P1 i
25650 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 6c 65  ndex entry is le
25660 73 73 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20  ss than the key 
25670 76 61 6c 75 65 20 74 68 65 6e 20 6a 75 6d 70 20  value then jump 
25680 74 6f 20 50 32 2e 0a 2a 2a 20 4f 74 68 65 72 77  to P2..** Otherw
25690 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  ise fall through
256a0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
256b0 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
256c0 49 66 20 50 35 20 69 73 20 6e 6f 6e 2d 7a 65 72  If P5 is non-zer
256d0 6f 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20 76  o then the key v
256e0 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65  alue is increase
256f0 64 20 62 79 20 61 6e 20 65 70 73 69 6c 6f 6e 20  d by an epsilon 
25700 70 72 69 6f 72 20 0a 2a 2a 20 74 6f 20 74 68 65  prior .** to the
25710 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
25720 69 73 20 6d 61 6b 65 73 20 74 68 65 20 6f 70 63  is makes the opc
25730 6f 64 65 20 77 6f 72 6b 20 6c 69 6b 65 20 49 64  ode work like Id
25740 78 4c 45 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  xLE..*/.case OP_
25750 49 64 78 4c 54 3a 20 20 20 20 20 20 20 20 20 20  IdxLT:          
25760 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20  /* jump */.case 
25770 4f 50 5f 49 64 78 47 45 3a 20 7b 20 20 20 20 20  OP_IdxGE: {     
25780 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
25790 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
257a0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 55 6e 70    int res;.  Unp
257b0 61 63 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a 0a  ackedRecord r;..
257c0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
257d0 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
257e0 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
257f0 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
25800 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
25810 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
25820 65 72 74 28 20 70 43 2d 3e 69 73 4f 72 64 65 72  ert( pC->isOrder
25830 65 64 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  ed );.  if( ALWA
25840 59 53 28 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d  YS(pC->pCursor!=
25850 30 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  0) ){.    assert
25860 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f  ( pC->deferredMo
25870 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 61  veto==0 );.    a
25880 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d  ssert( pOp->p5==
25890 30 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 31 20  0 || pOp->p5==1 
258a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
258b0 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49  Op->p4type==P4_I
258c0 4e 54 33 32 20 29 3b 0a 20 20 20 20 72 2e 70 4b  NT32 );.    r.pK
258d0 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65  eyInfo = pC->pKe
258e0 79 49 6e 66 6f 3b 0a 20 20 20 20 72 2e 6e 46 69  yInfo;.    r.nFi
258f0 65 6c 64 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e  eld = (u16)pOp->
25900 70 34 2e 69 3b 0a 20 20 20 20 69 66 28 20 70 4f  p4.i;.    if( pO
25910 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 20 20 72  p->p5 ){.      r
25920 2e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45  .flags = UNPACKE
25930 44 5f 49 4e 43 52 4b 45 59 20 7c 20 55 4e 50 41  D_INCRKEY | UNPA
25940 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43  CKED_PREFIX_MATC
25950 48 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  H;.    }else{.  
25960 20 20 20 20 72 2e 66 6c 61 67 73 20 3d 20 55 4e      r.flags = UN
25970 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41  PACKED_PREFIX_MA
25980 54 43 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  TCH;.    }.    r
25990 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f  .aMem = &aMem[pO
259a0 70 2d 3e 70 33 5d 3b 0a 23 69 66 64 65 66 20 53  p->p3];.#ifdef S
259b0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
259c0 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30  { int i; for(i=0
259d0 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b  ; i<r.nField; i+
259e0 2b 29 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73  +) assert( memIs
259f0 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d  Valid(&r.aMem[i]
25a00 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20  ) ); }.#endif.  
25a10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
25a20 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28  beIdxKeyCompare(
25a30 70 43 2c 20 26 72 2c 20 26 72 65 73 29 3b 0a 20  pC, &r, &res);. 
25a40 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
25a50 64 65 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 7b 0a  de==OP_IdxLT ){.
25a60 20 20 20 20 20 20 72 65 73 20 3d 20 2d 72 65 73        res = -res
25a70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25a80 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
25a90 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 45  opcode==OP_IdxGE
25aa0 20 29 3b 0a 20 20 20 20 20 20 72 65 73 2b 2b 3b   );.      res++;
25ab0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
25ac0 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 63  es>0 ){.      pc
25ad0 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 20 3b   = pOp->p2 - 1 ;
25ae0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
25af0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
25b00 3a 20 44 65 73 74 72 6f 79 20 50 31 20 50 32 20  : Destroy P1 P2 
25b10 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c  P3 * *.**.** Del
25b20 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 64 61  ete an entire da
25b30 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
25b40 69 6e 64 65 78 20 77 68 6f 73 65 20 72 6f 6f 74  index whose root
25b50 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
25b60 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
25b70 20 67 69 76 65 6e 20 62 79 20 50 31 2e 0a 2a 2a   given by P1..**
25b80 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65  .** The table be
25b90 69 6e 67 20 64 65 73 74 72 6f 79 65 64 20 69 73  ing destroyed is
25ba0 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
25bb0 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 33  abase file if P3
25bc0 3d 3d 30 2e 20 20 49 66 0a 2a 2a 20 50 33 3d 3d  ==0.  If.** P3==
25bd0 31 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65  1 then the table
25be0 20 74 6f 20 62 65 20 63 6c 65 61 72 20 69 73 20   to be clear is 
25bf0 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
25c00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
25c10 2a 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74  * that is used t
25c20 6f 20 73 74 6f 72 65 20 74 61 62 6c 65 73 20 63  o store tables c
25c30 72 65 61 74 65 20 75 73 69 6e 67 20 43 52 45 41  reate using CREA
25c40 54 45 20 54 45 4d 50 4f 52 41 52 59 20 54 41 42  TE TEMPORARY TAB
25c50 4c 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54  LE..**.** If AUT
25c60 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62 6c  OVACUUM is enabl
25c70 65 64 20 74 68 65 6e 20 69 74 20 69 73 20 70 6f  ed then it is po
25c80 73 73 69 62 6c 65 20 74 68 61 74 20 61 6e 6f 74  ssible that anot
25c90 68 65 72 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a  her root page.**
25ca0 20 6d 69 67 68 74 20 62 65 20 6d 6f 76 65 64 20   might be moved 
25cb0 69 6e 74 6f 20 74 68 65 20 6e 65 77 6c 79 20 64  into the newly d
25cc0 65 6c 65 74 65 64 20 72 6f 6f 74 20 70 61 67 65  eleted root page
25cd0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
25ce0 70 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61  p all.** root pa
25cf0 67 65 73 20 63 6f 6e 74 69 67 75 6f 75 73 20 61  ges contiguous a
25d00 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
25d10 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
25d20 20 20 54 68 65 20 66 6f 72 6d 65 72 0a 2a 2a 20    The former.** 
25d30 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f 6f  value of the roo
25d40 74 20 70 61 67 65 20 74 68 61 74 20 6d 6f 76 65  t page that move
25d50 64 20 2d 20 69 74 73 20 76 61 6c 75 65 20 62 65  d - its value be
25d60 66 6f 72 65 20 74 68 65 20 6d 6f 76 65 20 6f 63  fore the move oc
25d70 63 75 72 72 65 64 20 2d 0a 2a 2a 20 69 73 20 73  curred -.** is s
25d80 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
25d90 72 20 50 32 2e 20 20 49 66 20 6e 6f 20 70 61 67  r P2.  If no pag
25da0 65 20 0a 2a 2a 20 6d 6f 76 65 6d 65 6e 74 20 77  e .** movement w
25db0 61 73 20 72 65 71 75 69 72 65 64 20 28 62 65 63  as required (bec
25dc0 61 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 62  ause the table b
25dd0 65 69 6e 67 20 64 72 6f 70 70 65 64 20 77 61 73  eing dropped was
25de0 20 61 6c 72 65 61 64 79 20 0a 2a 2a 20 74 68 65   already .** the
25df0 20 6c 61 73 74 20 6f 6e 65 20 69 6e 20 74 68 65   last one in the
25e00 20 64 61 74 61 62 61 73 65 29 20 74 68 65 6e 20   database) then 
25e10 61 20 7a 65 72 6f 20 69 73 20 73 74 6f 72 65 64  a zero is stored
25e20 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
25e30 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55  .** If AUTOVACUU
25e40 4d 20 69 73 20 64 69 73 61 62 6c 65 64 20 74 68  M is disabled th
25e50 65 6e 20 61 20 7a 65 72 6f 20 69 73 20 73 74 6f  en a zero is sto
25e60 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
25e70 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  P2..**.** See al
25e80 73 6f 3a 20 43 6c 65 61 72 0a 2a 2f 0a 63 61 73  so: Clear.*/.cas
25e90 65 20 4f 50 5f 44 65 73 74 72 6f 79 3a 20 7b 20  e OP_Destroy: { 
25ea0 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72      /* out2-prer
25eb0 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
25ec0 69 4d 6f 76 65 64 3b 0a 20 20 69 6e 74 20 69 43  iMoved;.  int iC
25ed0 6e 74 3b 0a 20 20 56 64 62 65 20 2a 70 56 64 62  nt;.  Vdbe *pVdb
25ee0 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 23  e;.  int iDb;..#
25ef0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
25f00 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
25f10 20 20 69 43 6e 74 20 3d 20 30 3b 0a 20 20 66 6f    iCnt = 0;.  fo
25f20 72 28 70 56 64 62 65 3d 64 62 2d 3e 70 56 64 62  r(pVdbe=db->pVdb
25f30 65 3b 20 70 56 64 62 65 3b 20 70 56 64 62 65 20  e; pVdbe; pVdbe 
25f40 3d 20 70 56 64 62 65 2d 3e 70 4e 65 78 74 29 7b  = pVdbe->pNext){
25f50 0a 20 20 20 20 69 66 28 20 70 56 64 62 65 2d 3e  .    if( pVdbe->
25f60 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
25f70 43 5f 52 55 4e 20 26 26 20 70 56 64 62 65 2d 3e  C_RUN && pVdbe->
25f80 69 6e 56 74 61 62 4d 65 74 68 6f 64 3c 32 20 26  inVtabMethod<2 &
25f90 26 20 70 56 64 62 65 2d 3e 70 63 3e 3d 30 20 29  & pVdbe->pc>=0 )
25fa0 7b 0a 20 20 20 20 20 20 69 43 6e 74 2b 2b 3b 0a  {.      iCnt++;.
25fb0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
25fc0 20 20 69 43 6e 74 20 3d 20 64 62 2d 3e 61 63 74    iCnt = db->act
25fd0 69 76 65 56 64 62 65 43 6e 74 3b 0a 23 65 6e 64  iveVdbeCnt;.#end
25fe0 69 66 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  if.  pOut->flags
25ff0 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 69   = MEM_Null;.  i
26000 66 28 20 69 43 6e 74 3e 31 20 29 7b 0a 20 20 20  f( iCnt>1 ){.   
26010 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
26020 4b 45 44 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f  KED;.    p->erro
26030 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
26040 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rt;.  }else{.   
26050 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a   iDb = pOp->p3;.
26060 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6e 74      assert( iCnt
26070 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
26080 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  t( (p->btreeMask
26090 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31 29   & (((yDbMask)1)
260a0 3c 3c 69 44 62 29 29 21 3d 30 20 29 3b 0a 20 20  <<iDb))!=0 );.  
260b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
260c0 72 65 65 44 72 6f 70 54 61 62 6c 65 28 64 62 2d  reeDropTable(db-
260d0 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20 70  >aDb[iDb].pBt, p
260e0 4f 70 2d 3e 70 31 2c 20 26 69 4d 6f 76 65 64 29  Op->p1, &iMoved)
260f0 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67  ;.    pOut->flag
26100 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
26110 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 4d 6f   pOut->u.i = iMo
26120 76 65 64 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ved;.#ifndef SQL
26130 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
26140 55 55 4d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  UUM.    if( rc==
26150 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4d 6f  SQLITE_OK && iMo
26160 76 65 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ved!=0 ){.      
26170 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d  sqlite3RootPageM
26180 6f 76 65 64 28 64 62 2c 20 69 44 62 2c 20 69 4d  oved(db, iDb, iM
26190 6f 76 65 64 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a  oved, pOp->p1);.
261a0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 4f 50 5f        /* All OP_
261b0 44 65 73 74 72 6f 79 20 6f 70 65 72 61 74 69 6f  Destroy operatio
261c0 6e 73 20 6f 63 63 75 72 20 6f 6e 20 74 68 65 20  ns occur on the 
261d0 73 61 6d 65 20 62 74 72 65 65 20 2a 2f 0a 20 20  same btree */.  
261e0 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73 65      assert( rese
261f0 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 3d 3d  tSchemaOnFault==
26200 30 20 7c 7c 20 72 65 73 65 74 53 63 68 65 6d 61  0 || resetSchema
26210 4f 6e 46 61 75 6c 74 3d 3d 69 44 62 2b 31 20 29  OnFault==iDb+1 )
26220 3b 0a 20 20 20 20 20 20 72 65 73 65 74 53 63 68  ;.      resetSch
26230 65 6d 61 4f 6e 46 61 75 6c 74 20 3d 20 69 44 62  emaOnFault = iDb
26240 2b 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  +1;.    }.#endif
26250 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
26260 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6c 65 61  ./* Opcode: Clea
26270 72 20 50 31 20 50 32 20 50 33 0a 2a 2a 0a 2a 2a  r P1 P2 P3.**.**
26280 20 44 65 6c 65 74 65 20 61 6c 6c 20 63 6f 6e 74   Delete all cont
26290 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
262a0 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  base table or in
262b0 64 65 78 20 77 68 6f 73 65 20 72 6f 6f 74 20 70  dex whose root p
262c0 61 67 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61  age.** in the da
262d0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 67  tabase file is g
262e0 69 76 65 6e 20 62 79 20 50 31 2e 20 20 42 75 74  iven by P1.  But
262f0 2c 20 75 6e 6c 69 6b 65 20 44 65 73 74 72 6f 79  , unlike Destroy
26300 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 72 65 6d 6f  , do not.** remo
26310 76 65 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  ve the table or 
26320 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 64  index from the d
26330 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
26340 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65  .** The table be
26350 69 6e 67 20 63 6c 65 61 72 20 69 73 20 69 6e 20  ing clear is in 
26360 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
26370 65 20 66 69 6c 65 20 69 66 20 50 32 3d 3d 30 2e  e file if P2==0.
26380 20 20 49 66 0a 2a 2a 20 50 32 3d 3d 31 20 74 68    If.** P2==1 th
26390 65 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  en the table to 
263a0 62 65 20 63 6c 65 61 72 20 69 73 20 69 6e 20 74  be clear is in t
263b0 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
263c0 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74 68  abase file.** th
263d0 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  at is used to st
263e0 6f 72 65 20 74 61 62 6c 65 73 20 63 72 65 61 74  ore tables creat
263f0 65 20 75 73 69 6e 67 20 43 52 45 41 54 45 20 54  e using CREATE T
26400 45 4d 50 4f 52 41 52 59 20 54 41 42 4c 45 2e 0a  EMPORARY TABLE..
26410 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 33 20  **.** If the P3 
26420 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  value is non-zer
26430 6f 2c 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c  o, then the tabl
26440 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 6d 75  e referred to mu
26450 73 74 20 62 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b  st be an.** intk
26460 65 79 20 74 61 62 6c 65 20 28 61 6e 20 53 51 4c  ey table (an SQL
26470 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 6e 20 69   table, not an i
26480 6e 64 65 78 29 2e 20 49 6e 20 74 68 69 73 20 63  ndex). In this c
26490 61 73 65 20 74 68 65 20 72 6f 77 20 63 68 61 6e  ase the row chan
264a0 67 65 20 0a 2a 2a 20 63 6f 75 6e 74 20 69 73 20  ge .** count is 
264b0 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74  incremented by t
264c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
264d0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 62  s in the table b
264e0 65 69 6e 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a  eing cleared. .*
264f0 2a 20 49 66 20 50 33 20 69 73 20 67 72 65 61 74  * If P3 is great
26500 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
26510 65 6e 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  en the value sto
26520 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
26530 50 33 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 69 6e  P3 is.** also in
26540 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65  cremented by the
26550 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
26560 69 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  in the table bei
26570 6e 67 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a  ng cleared..**.*
26580 2a 20 53 65 65 20 61 6c 73 6f 3a 20 44 65 73 74  * See also: Dest
26590 72 6f 79 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  roy.*/.case OP_C
265a0 6c 65 61 72 3a 20 7b 0a 20 20 69 6e 74 20 6e 43  lear: {.  int nC
265b0 68 61 6e 67 65 3b 0a 20 0a 20 20 6e 43 68 61 6e  hange;. .  nChan
265c0 67 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ge = 0;.  assert
265d0 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  ( (p->btreeMask 
265e0 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31 29 3c  & (((yDbMask)1)<
265f0 3c 70 4f 70 2d 3e 70 32 29 29 21 3d 30 20 29 3b  <pOp->p2))!=0 );
26600 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
26610 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 0a  treeClearTable(.
26620 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 70 4f        db->aDb[pO
26630 70 2d 3e 70 32 5d 2e 70 42 74 2c 20 70 4f 70 2d  p->p2].pBt, pOp-
26640 3e 70 31 2c 20 28 70 4f 70 2d 3e 70 33 20 3f 20  >p1, (pOp->p3 ? 
26650 26 6e 43 68 61 6e 67 65 20 3a 20 30 29 0a 20 20  &nChange : 0).  
26660 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33  );.  if( pOp->p3
26670 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 43 68 61 6e   ){.    p->nChan
26680 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  ge += nChange;. 
26690 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 3e 30     if( pOp->p3>0
266a0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
266b0 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d  ( memIsValid(&aM
266c0 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a  em[pOp->p3]) );.
266d0 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f        memAboutTo
266e0 43 68 61 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b  Change(p, &aMem[
266f0 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 20  pOp->p3]);.     
26700 20 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2e 75   aMem[pOp->p3].u
26710 2e 69 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  .i += nChange;. 
26720 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
26730 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
26740 43 72 65 61 74 65 54 61 62 6c 65 20 50 31 20 50  CreateTable P1 P
26750 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 6c  2 * * *.**.** Al
26760 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 74 61 62  locate a new tab
26770 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  le in the main d
26780 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
26790 50 31 3d 3d 30 20 6f 72 20 69 6e 20 74 68 65 0a  P1==0 or in the.
267a0 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ** auxiliary dat
267b0 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 31  abase file if P1
267c0 3d 3d 31 20 6f 72 20 69 6e 20 61 6e 20 61 74 74  ==1 or in an att
267d0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20 69  ached database i
267e0 66 0a 2a 2a 20 50 31 3e 31 2e 20 20 57 72 69 74  f.** P1>1.  Writ
267f0 65 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  e the root page 
26800 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
26810 77 20 74 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20  w table into.** 
26820 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 0a 2a  register P2.**.*
26830 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
26840 20 62 65 74 77 65 65 6e 20 61 20 74 61 62 6c 65   between a table
26850 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 69 73   and an index is
26860 20 74 68 69 73 3a 20 20 41 20 74 61 62 6c 65 20   this:  A table 
26870 6d 75 73 74 0a 2a 2a 20 68 61 76 65 20 61 20 34  must.** have a 4
26880 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6b 65  -byte integer ke
26890 79 20 61 6e 64 20 63 61 6e 20 68 61 76 65 20 61  y and can have a
268a0 72 62 69 74 72 61 72 79 20 64 61 74 61 2e 20 20  rbitrary data.  
268b0 41 6e 20 69 6e 64 65 78 0a 2a 2a 20 68 61 73 20  An index.** has 
268c0 61 6e 20 61 72 62 69 74 72 61 72 79 20 6b 65 79  an arbitrary key
268d0 20 62 75 74 20 6e 6f 20 64 61 74 61 2e 0a 2a 2a   but no data..**
268e0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 43 72  .** See also: Cr
268f0 65 61 74 65 49 6e 64 65 78 0a 2a 2f 0a 2f 2a 20  eateIndex.*/./* 
26900 4f 70 63 6f 64 65 3a 20 43 72 65 61 74 65 49 6e  Opcode: CreateIn
26910 64 65 78 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  dex P1 P2 * * *.
26920 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  **.** Allocate a
26930 20 6e 65 77 20 69 6e 64 65 78 20 69 6e 20 74 68   new index in th
26940 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
26950 66 69 6c 65 20 69 66 20 50 31 3d 3d 30 20 6f 72  file if P1==0 or
26960 20 69 6e 20 74 68 65 0a 2a 2a 20 61 75 78 69 6c   in the.** auxil
26970 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  iary database fi
26980 6c 65 20 69 66 20 50 31 3d 3d 31 20 6f 72 20 69  le if P1==1 or i
26990 6e 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  n an attached da
269a0 74 61 62 61 73 65 20 69 66 0a 2a 2a 20 50 31 3e  tabase if.** P1>
269b0 31 2e 20 20 57 72 69 74 65 20 74 68 65 20 72 6f  1.  Write the ro
269c0 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
269d0 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
269e0 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72  into.** register
269f0 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 64   P2..**.** See d
26a00 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6f 6e 20  ocumentation on 
26a10 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 66  OP_CreateTable f
26a20 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
26a30 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  formation..*/.ca
26a40 73 65 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  se OP_CreateInde
26a50 78 3a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x:            /*
26a60 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65   out2-prerelease
26a70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 72 65 61   */.case OP_Crea
26a80 74 65 54 61 62 6c 65 3a 20 7b 20 20 20 20 20 20  teTable: {      
26a90 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72      /* out2-prer
26aa0 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
26ab0 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 66 6c 61 67  pgno;.  int flag
26ac0 73 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  s;.  Db *pDb;.. 
26ad0 20 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 61 73 73   pgno = 0;.  ass
26ae0 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
26af0 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e  && pOp->p1<db->n
26b00 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
26b10 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20  (p->btreeMask & 
26b20 28 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70  (((yDbMask)1)<<p
26b30 4f 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a 20  Op->p1))!=0 );. 
26b40 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
26b50 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
26b60 72 74 28 20 70 44 62 2d 3e 70 42 74 21 3d 30 20  rt( pDb->pBt!=0 
26b70 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  );.  if( pOp->op
26b80 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 54  code==OP_CreateT
26b90 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 66  able ){.    /* f
26ba0 6c 61 67 73 20 3d 20 42 54 52 45 45 5f 49 4e 54  lags = BTREE_INT
26bb0 4b 45 59 3b 20 2a 2f 0a 20 20 20 20 66 6c 61 67  KEY; */.    flag
26bc0 73 20 3d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59  s = BTREE_INTKEY
26bd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
26be0 6c 61 67 73 20 3d 20 42 54 52 45 45 5f 42 4c 4f  lags = BTREE_BLO
26bf0 42 4b 45 59 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  BKEY;.  }.  rc =
26c00 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
26c10 61 74 65 54 61 62 6c 65 28 70 44 62 2d 3e 70 42  ateTable(pDb->pB
26c20 74 2c 20 26 70 67 6e 6f 2c 20 66 6c 61 67 73 29  t, &pgno, flags)
26c30 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  ;.  pOut->u.i = 
26c40 70 67 6e 6f 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  pgno;.  break;.}
26c50 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61 72  ../* Opcode: Par
26c60 73 65 53 63 68 65 6d 61 20 50 31 20 2a 20 2a 20  seSchema P1 * * 
26c70 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20  P4 *.**.** Read 
26c80 61 6e 64 20 70 61 72 73 65 20 61 6c 6c 20 65 6e  and parse all en
26c90 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20 53  tries from the S
26ca0 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
26cb0 6c 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 50  le of database P
26cc0 31 0a 2a 2a 20 74 68 61 74 20 6d 61 74 63 68 20  1.** that match 
26cd0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
26ce0 20 50 34 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73   P4. .**.** This
26cf0 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20   opcode invokes 
26d00 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 63 72  the parser to cr
26d10 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75  eate a new virtu
26d20 61 6c 20 6d 61 63 68 69 6e 65 2c 0a 2a 2a 20 74  al machine,.** t
26d30 68 65 6e 20 72 75 6e 73 20 74 68 65 20 6e 65 77  hen runs the new
26d40 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
26d50 2e 20 20 49 74 20 69 73 20 74 68 75 73 20 61 20  .  It is thus a 
26d60 72 65 2d 65 6e 74 72 61 6e 74 20 6f 70 63 6f 64  re-entrant opcod
26d70 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 61  e..*/.case OP_Pa
26d80 72 73 65 53 63 68 65 6d 61 3a 20 7b 0a 20 20 69  rseSchema: {.  i
26d90 6e 74 20 69 44 62 3b 0a 20 20 63 6f 6e 73 74 20  nt iDb;.  const 
26da0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 3b 0a 20  char *zMaster;. 
26db0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 49   char *zSql;.  I
26dc0 6e 69 74 44 61 74 61 20 69 6e 69 74 44 61 74 61  nitData initData
26dd0 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 70 72 65 70  ;..  /* Any prep
26de0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 74  ared statement t
26df0 68 61 74 20 69 6e 76 6f 6b 65 73 20 74 68 69 73  hat invokes this
26e00 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 68 6f 6c   opcode will hol
26e10 64 20 6d 75 74 65 78 65 73 0a 20 20 2a 2a 20 6f  d mutexes.  ** o
26e20 6e 20 65 76 65 72 79 20 62 74 72 65 65 2e 20 20  n every btree.  
26e30 54 68 69 73 20 69 73 20 61 20 70 72 65 72 65 71  This is a prereq
26e40 75 69 73 69 74 65 20 66 6f 72 20 69 6e 76 6f 6b  uisite for invok
26e50 69 6e 67 20 0a 20 20 2a 2a 20 73 71 6c 69 74 65  ing .  ** sqlite
26e60 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b 28 29 2e  3InitCallback().
26e70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
26e80 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
26e90 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e  iDb=0; iDb<db->n
26ea0 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20  Db; iDb++){.    
26eb0 61 73 73 65 72 74 28 20 69 44 62 3d 3d 31 20 7c  assert( iDb==1 |
26ec0 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  | sqlite3BtreeHo
26ed0 6c 64 73 4d 75 74 65 78 28 64 62 2d 3e 61 44 62  ldsMutex(db->aDb
26ee0 5b 69 44 62 5d 2e 70 42 74 29 20 29 3b 0a 20 20  [iDb].pBt) );.  
26ef0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 44 62 20  }.#endif..  iDb 
26f00 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 61 73 73  = pOp->p1;.  ass
26f10 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
26f20 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
26f30 61 73 73 65 72 74 28 20 44 62 48 61 73 50 72 6f  assert( DbHasPro
26f40 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44  perty(db, iDb, D
26f50 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20  B_SchemaLoaded) 
26f60 29 3b 0a 20 20 2f 2a 20 55 73 65 64 20 74 6f 20  );.  /* Used to 
26f70 62 65 20 61 20 63 6f 6e 64 69 74 69 6f 6e 61 6c  be a conditional
26f80 20 2a 2f 20 7b 0a 20 20 20 20 7a 4d 61 73 74 65   */ {.    zMaste
26f90 72 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  r = SCHEMA_TABLE
26fa0 28 69 44 62 29 3b 0a 20 20 20 20 69 6e 69 74 44  (iDb);.    initD
26fb0 61 74 61 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  ata.db = db;.   
26fc0 20 69 6e 69 74 44 61 74 61 2e 69 44 62 20 3d 20   initData.iDb = 
26fd0 70 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 69 6e 69  pOp->p1;.    ini
26fe0 74 44 61 74 61 2e 70 7a 45 72 72 4d 73 67 20 3d  tData.pzErrMsg =
26ff0 20 26 70 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20   &p->zErrMsg;.  
27000 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
27010 4d 50 72 69 6e 74 66 28 64 62 2c 0a 20 20 20 20  MPrintf(db,.    
27020 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c     "SELECT name,
27030 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c 20 46   rootpage, sql F
27040 52 4f 4d 20 27 25 71 27 2e 25 73 20 57 48 45 52  ROM '%q'.%s WHER
27050 45 20 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f  E %s ORDER BY ro
27060 77 69 64 22 2c 0a 20 20 20 20 20 20 20 64 62 2d  wid",.       db-
27070 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
27080 20 7a 4d 61 73 74 65 72 2c 20 70 4f 70 2d 3e 70   zMaster, pOp->p
27090 34 2e 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  4.z);.    if( zS
270a0 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ql==0 ){.      r
270b0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
270c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
270d0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
270e0 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20  nit.busy==0 );. 
270f0 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75       db->init.bu
27100 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e  sy = 1;.      in
27110 69 74 44 61 74 61 2e 72 63 20 3d 20 53 51 4c 49  itData.rc = SQLI
27120 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 61 73 73  TE_OK;.      ass
27130 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
27140 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
27150 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
27160 63 28 64 62 2c 20 7a 53 71 6c 2c 20 73 71 6c 69  c(db, zSql, sqli
27170 74 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b 2c  te3InitCallback,
27180 20 26 69 6e 69 74 44 61 74 61 2c 20 30 29 3b 0a   &initData, 0);.
27190 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
271a0 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 69  LITE_OK ) rc = i
271b0 6e 69 74 44 61 74 61 2e 72 63 3b 0a 20 20 20 20  nitData.rc;.    
271c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
271d0 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  db, zSql);.     
271e0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d   db->init.busy =
271f0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
27200 69 66 28 20 72 63 20 29 20 73 71 6c 69 74 65 33  if( rc ) sqlite3
27210 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
27220 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b  fConnection(db);
27230 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
27240 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 67  E_NOMEM ){.    g
27250 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a  oto no_mem;.  }.
27260 20 20 62 72 65 61 6b 3b 20 20 0a 7d 0a 0a 23 69    break;  .}..#i
27270 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
27280 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 29 0a  E_OMIT_ANALYZE).
27290 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 6f 61 64 41  /* Opcode: LoadA
272a0 6e 61 6c 79 73 69 73 20 50 31 20 2a 20 2a 20 2a  nalysis P1 * * *
272b0 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 74 68   *.**.** Read th
272c0 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  e sqlite_stat1 t
272d0 61 62 6c 65 20 66 6f 72 20 64 61 74 61 62 61 73  able for databas
272e0 65 20 50 31 20 61 6e 64 20 6c 6f 61 64 20 74 68  e P1 and load th
272f0 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20  e content.** of 
27300 74 68 61 74 20 74 61 62 6c 65 20 69 6e 74 6f 20  that table into 
27310 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 69 6e 64  the internal ind
27320 65 78 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  ex hash table.  
27330 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 0a  This will cause.
27340 2a 2a 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  ** the analysis 
27350 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  to be used when 
27360 70 72 65 70 61 72 69 6e 67 20 61 6c 6c 20 73 75  preparing all su
27370 62 73 65 71 75 65 6e 74 20 71 75 65 72 69 65 73  bsequent queries
27380 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 6f 61  ..*/.case OP_Loa
27390 64 41 6e 61 6c 79 73 69 73 3a 20 7b 0a 20 20 61  dAnalysis: {.  a
273a0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
273b0 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d  0 && pOp->p1<db-
273c0 3e 6e 44 62 20 29 3b 0a 20 20 72 63 20 3d 20 73  >nDb );.  rc = s
273d0 71 6c 69 74 65 33 41 6e 61 6c 79 73 69 73 4c 6f  qlite3AnalysisLo
273e0 61 64 28 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b  ad(db, pOp->p1);
273f0 0a 20 20 62 72 65 61 6b 3b 20 20 0a 7d 0a 23 65  .  break;  .}.#e
27400 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
27410 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41  (SQLITE_OMIT_ANA
27420 4c 59 5a 45 29 20 2a 2f 0a 0a 2f 2a 20 4f 70 63  LYZE) */../* Opc
27430 6f 64 65 3a 20 44 72 6f 70 54 61 62 6c 65 20 50  ode: DropTable P
27440 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  1 * * P4 *.**.**
27450 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 74 65   Remove the inte
27460 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29  rnal (in-memory)
27470 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
27480 20 74 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a   that describe.*
27490 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
274a0 64 20 50 34 20 69 6e 20 64 61 74 61 62 61 73 65  d P4 in database
274b0 20 50 31 2e 20 20 54 68 69 73 20 69 73 20 63 61   P1.  This is ca
274c0 6c 6c 65 64 20 61 66 74 65 72 20 61 20 74 61 62  lled after a tab
274d0 6c 65 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65 64  le.** is dropped
274e0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
274f0 70 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72  p the internal r
27500 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
27510 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63   the.** schema c
27520 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 77  onsistent with w
27530 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a  hat is on disk..
27540 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70 54  */.case OP_DropT
27550 61 62 6c 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65  able: {.  sqlite
27560 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
27570 54 61 62 6c 65 28 64 62 2c 20 70 4f 70 2d 3e 70  Table(db, pOp->p
27580 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  1, pOp->p4.z);. 
27590 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
275a0 63 6f 64 65 3a 20 44 72 6f 70 49 6e 64 65 78 20  code: DropIndex 
275b0 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
275c0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 74  * Remove the int
275d0 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79  ernal (in-memory
275e0 29 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  ) data structure
275f0 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 0a  s that describe.
27600 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  ** the index nam
27610 65 64 20 50 34 20 69 6e 20 64 61 74 61 62 61 73  ed P4 in databas
27620 65 20 50 31 2e 20 20 54 68 69 73 20 69 73 20 63  e P1.  This is c
27630 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20 69  alled after an i
27640 6e 64 65 78 0a 2a 2a 20 69 73 20 64 72 6f 70 70  ndex.** is dropp
27650 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  ed in order to k
27660 65 65 70 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  eep the internal
27670 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
27680 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61  of the.** schema
27690 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
276a0 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b   what is on disk
276b0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f  ..*/.case OP_Dro
276c0 70 49 6e 64 65 78 3a 20 7b 0a 20 20 73 71 6c 69  pIndex: {.  sqli
276d0 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
276e0 74 65 49 6e 64 65 78 28 64 62 2c 20 70 4f 70 2d  teIndex(db, pOp-
276f0 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  >p1, pOp->p4.z);
27700 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
27710 4f 70 63 6f 64 65 3a 20 44 72 6f 70 54 72 69 67  Opcode: DropTrig
27720 67 65 72 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a  ger P1 * * P4 *.
27730 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  **.** Remove the
27740 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65   internal (in-me
27750 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72 75 63  mory) data struc
27760 74 75 72 65 73 20 74 68 61 74 20 64 65 73 63 72  tures that descr
27770 69 62 65 0a 2a 2a 20 74 68 65 20 74 72 69 67 67  ibe.** the trigg
27780 65 72 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64  er named P4 in d
27790 61 74 61 62 61 73 65 20 50 31 2e 20 20 54 68 69  atabase P1.  Thi
277a0 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  s is called afte
277b0 72 20 61 20 74 72 69 67 67 65 72 0a 2a 2a 20 69  r a trigger.** i
277c0 73 20 64 72 6f 70 70 65 64 20 69 6e 20 6f 72 64  s dropped in ord
277d0 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 69  er to keep the i
277e0 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e  nternal represen
277f0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  tation of the.**
27800 20 73 63 68 65 6d 61 20 63 6f 6e 73 69 73 74 65   schema consiste
27810 6e 74 20 77 69 74 68 20 77 68 61 74 20 69 73 20  nt with what is 
27820 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65  on disk..*/.case
27830 20 4f 50 5f 44 72 6f 70 54 72 69 67 67 65 72 3a   OP_DropTrigger:
27840 20 7b 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69   {.  sqlite3Unli
27850 6e 6b 41 6e 64 44 65 6c 65 74 65 54 72 69 67 67  nkAndDeleteTrigg
27860 65 72 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20  er(db, pOp->p1, 
27870 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72  pOp->p4.z);.  br
27880 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  eak;.}...#ifndef
27890 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
278a0 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 20  EGRITY_CHECK./* 
278b0 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67 72 69 74  Opcode: Integrit
278c0 79 43 6b 20 50 31 20 50 32 20 50 33 20 2a 20 50  yCk P1 P2 P3 * P
278d0 35 0a 2a 2a 0a 2a 2a 20 44 6f 20 61 6e 20 61 6e  5.**.** Do an an
278e0 61 6c 79 73 69 73 20 6f 66 20 74 68 65 20 63 75  alysis of the cu
278f0 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74  rrently open dat
27900 61 62 61 73 65 2e 20 20 53 74 6f 72 65 20 69 6e  abase.  Store in
27910 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 20  .** register P1 
27920 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65  the text of an e
27930 72 72 6f 72 20 6d 65 73 73 61 67 65 20 64 65 73  rror message des
27940 63 72 69 62 69 6e 67 20 61 6e 79 20 70 72 6f 62  cribing any prob
27950 6c 65 6d 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 70  lems..** If no p
27960 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e  roblems are foun
27970 64 2c 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c 20  d, store a NULL 
27980 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a  in register P1..
27990 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74  **.** The regist
279a0 65 72 20 50 33 20 63 6f 6e 74 61 69 6e 73 20 74  er P3 contains t
279b0 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
279c0 72 20 6f 66 20 61 6c 6c 6f 77 65 64 20 65 72 72  r of allowed err
279d0 6f 72 73 2e 0a 2a 2a 20 41 74 20 6d 6f 73 74 20  ors..** At most 
279e0 72 65 67 28 50 33 29 20 65 72 72 6f 72 73 20 77  reg(P3) errors w
279f0 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 2e  ill be reported.
27a00 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
27a10 64 73 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73  ds, the analysis
27a20 20 73 74 6f 70 73 20 61 73 20 73 6f 6f 6e 20 61   stops as soon a
27a30 73 20 72 65 67 28 50 31 29 20 65 72 72 6f 72 73  s reg(P1) errors
27a40 20 61 72 65 20 0a 2a 2a 20 73 65 65 6e 2e 20 20   are .** seen.  
27a50 52 65 67 28 50 31 29 20 69 73 20 75 70 64 61 74  Reg(P1) is updat
27a60 65 64 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62  ed with the numb
27a70 65 72 20 6f 66 20 65 72 72 6f 72 73 20 72 65 6d  er of errors rem
27a80 61 69 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  aining..**.** Th
27a90 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
27aa0 65 72 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ers of all table
27ab0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
27ac0 65 20 61 72 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e are integer.**
27ad0 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 28 50   stored in reg(P
27ae0 31 29 2c 20 72 65 67 28 50 31 2b 31 29 2c 20 72  1), reg(P1+1), r
27af0 65 67 28 50 31 2b 32 29 2c 20 2e 2e 2e 2e 20 20  eg(P1+2), ....  
27b00 54 68 65 72 65 20 61 72 65 20 50 32 20 74 61 62  There are P2 tab
27b10 6c 65 73 0a 2a 2a 20 74 6f 74 61 6c 2e 0a 2a 2a  les.** total..**
27b20 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 74  .** If P5 is not
27b30 20 7a 65 72 6f 2c 20 74 68 65 20 63 68 65 63 6b   zero, the check
27b40 20 69 73 20 64 6f 6e 65 20 6f 6e 20 74 68 65 20   is done on the 
27b50 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
27b60 73 65 0a 2a 2a 20 66 69 6c 65 2c 20 6e 6f 74 20  se.** file, not 
27b70 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
27b80 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
27b90 69 73 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  is opcode is use
27ba0 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
27bb0 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
27bc0 63 6b 20 70 72 61 67 6d 61 2e 0a 2a 2f 0a 63 61  ck pragma..*/.ca
27bd0 73 65 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43  se OP_IntegrityC
27be0 6b 3a 20 7b 0a 20 20 69 6e 74 20 6e 52 6f 6f 74  k: {.  int nRoot
27bf0 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
27c00 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 63 68   of tables to ch
27c10 65 63 6b 2e 20 20 28 4e 75 6d 62 65 72 20 6f 66  eck.  (Number of
27c20 20 72 6f 6f 74 20 70 61 67 65 73 2e 29 20 2a 2f   root pages.) */
27c30 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 20 20  .  int *aRoot;  
27c40 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72     /* Array of r
27c50 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 73 20  ootpage numbers 
27c60 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 62 65  for tables to be
27c70 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e   checked */.  in
27c80 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  t j;          /*
27c90 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
27ca0 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20  .  int nErr;    
27cb0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
27cc0 65 72 72 6f 72 73 20 72 65 70 6f 72 74 65 64 20  errors reported 
27cd0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  */.  char *z;   
27ce0 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
27cf0 74 68 65 20 65 72 72 6f 72 20 72 65 70 6f 72 74  the error report
27d00 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 6e 45 72 72   */.  Mem *pnErr
27d10 3b 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65  ;     /* Registe
27d20 72 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20  r keeping track 
27d30 6f 66 20 65 72 72 6f 72 73 20 72 65 6d 61 69 6e  of errors remain
27d40 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 6e 52 6f 6f  ing */.  .  nRoo
27d50 74 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61  t = pOp->p2;.  a
27d60 73 73 65 72 74 28 20 6e 52 6f 6f 74 3e 30 20 29  ssert( nRoot>0 )
27d70 3b 0a 20 20 61 52 6f 6f 74 20 3d 20 73 71 6c 69  ;.  aRoot = sqli
27d80 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
27d90 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28  b, sizeof(int)*(
27da0 6e 52 6f 6f 74 2b 31 29 20 29 3b 0a 20 20 69 66  nRoot+1) );.  if
27db0 28 20 61 52 6f 6f 74 3d 3d 30 20 29 20 67 6f 74  ( aRoot==0 ) got
27dc0 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 61 73 73 65  o no_mem;.  asse
27dd0 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26  rt( pOp->p3>0 &&
27de0 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65   pOp->p3<=p->nMe
27df0 6d 20 29 3b 0a 20 20 70 6e 45 72 72 20 3d 20 26  m );.  pnErr = &
27e00 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
27e10 20 61 73 73 65 72 74 28 20 28 70 6e 45 72 72 2d   assert( (pnErr-
27e20 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
27e30 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
27e40 28 20 28 70 6e 45 72 72 2d 3e 66 6c 61 67 73 20  ( (pnErr->flags 
27e50 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  & (MEM_Str|MEM_B
27e60 6c 6f 62 29 29 3d 3d 30 20 29 3b 0a 20 20 70 49  lob))==0 );.  pI
27e70 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
27e80 70 31 5d 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  p1];.  for(j=0; 
27e90 6a 3c 6e 52 6f 6f 74 3b 20 6a 2b 2b 29 7b 0a 20  j<nRoot; j++){. 
27ea0 20 20 20 61 52 6f 6f 74 5b 6a 5d 20 3d 20 28 69     aRoot[j] = (i
27eb0 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 49 6e  nt)sqlite3VdbeIn
27ec0 74 56 61 6c 75 65 28 26 70 49 6e 31 5b 6a 5d 29  tValue(&pIn1[j])
27ed0 3b 0a 20 20 7d 0a 20 20 61 52 6f 6f 74 5b 6a 5d  ;.  }.  aRoot[j]
27ee0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
27ef0 70 4f 70 2d 3e 70 35 3c 64 62 2d 3e 6e 44 62 20  pOp->p5<db->nDb 
27f00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
27f10 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28  >btreeMask & (((
27f20 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70 2d  yDbMask)1)<<pOp-
27f30 3e 70 35 29 29 21 3d 30 20 29 3b 0a 20 20 7a 20  >p5))!=0 );.  z 
27f40 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
27f50 74 65 67 72 69 74 79 43 68 65 63 6b 28 64 62 2d  tegrityCheck(db-
27f60 3e 61 44 62 5b 70 4f 70 2d 3e 70 35 5d 2e 70 42  >aDb[pOp->p5].pB
27f70 74 2c 20 61 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c  t, aRoot, nRoot,
27f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fa0 20 20 28 69 6e 74 29 70 6e 45 72 72 2d 3e 75 2e    (int)pnErr->u.
27fb0 69 2c 20 26 6e 45 72 72 29 3b 0a 20 20 73 71 6c  i, &nErr);.  sql
27fc0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
27fd0 52 6f 6f 74 29 3b 0a 20 20 70 6e 45 72 72 2d 3e  Root);.  pnErr->
27fe0 75 2e 69 20 2d 3d 20 6e 45 72 72 3b 0a 20 20 73  u.i -= nErr;.  s
27ff0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
28000 4e 75 6c 6c 28 70 49 6e 31 29 3b 0a 20 20 69 66  Null(pIn1);.  if
28010 28 20 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ( nErr==0 ){.   
28020 20 61 73 73 65 72 74 28 20 7a 3d 3d 30 20 29 3b   assert( z==0 );
28030 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 3d 3d  .  }else if( z==
28040 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f  0 ){.    goto no
28050 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _mem;.  }else{. 
28060 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
28070 6d 53 65 74 53 74 72 28 70 49 6e 31 2c 20 7a 2c  mSetStr(pIn1, z,
28080 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
28090 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
280a0 0a 20 20 7d 0a 20 20 55 50 44 41 54 45 5f 4d 41  .  }.  UPDATE_MA
280b0 58 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31 29  X_BLOBSIZE(pIn1)
280c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
280d0 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 49  hangeEncoding(pI
280e0 6e 31 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  n1, encoding);. 
280f0 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
28100 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
28110 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
28120 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  */../* Opcode: R
28130 6f 77 53 65 74 41 64 64 20 50 31 20 50 32 20 2a  owSetAdd P1 P2 *
28140 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 73 65 72   * *.**.** Inser
28150 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  t the integer va
28160 6c 75 65 20 68 65 6c 64 20 62 79 20 72 65 67 69  lue held by regi
28170 73 74 65 72 20 50 32 20 69 6e 74 6f 20 61 20 62  ster P2 into a b
28180 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  oolean index.** 
28190 68 65 6c 64 20 69 6e 20 72 65 67 69 73 74 65 72  held in register
281a0 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 61 73   P1..**.** An as
281b0 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
281c0 20 50 32 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e   P2 is not an in
281d0 74 65 67 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f  teger..*/.case O
281e0 50 5f 52 6f 77 53 65 74 41 64 64 3a 20 7b 20 20  P_RowSetAdd: {  
281f0 20 20 20 20 20 2f 2a 20 69 6e 31 2c 20 69 6e 32       /* in1, in2
28200 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
28210 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70  em[pOp->p1];.  p
28220 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In2 = &aMem[pOp-
28230 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p2];.  assert( 
28240 28 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn2->flags & M
28250 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20  EM_Int)!=0 );.  
28260 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
28270 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d   & MEM_RowSet)==
28280 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
28290 56 64 62 65 4d 65 6d 53 65 74 52 6f 77 53 65 74  VdbeMemSetRowSet
282a0 28 70 49 6e 31 29 3b 0a 20 20 20 20 69 66 28 20  (pIn1);.    if( 
282b0 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn1->flags & M
282c0 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 20  EM_RowSet)==0 ) 
282d0 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
282e0 0a 20 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74  .  sqlite3RowSet
282f0 49 6e 73 65 72 74 28 70 49 6e 31 2d 3e 75 2e 70  Insert(pIn1->u.p
28300 52 6f 77 53 65 74 2c 20 70 49 6e 32 2d 3e 75 2e  RowSet, pIn2->u.
28310 69 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  i);.  break;.}..
28320 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65  /* Opcode: RowSe
28330 74 52 65 61 64 20 50 31 20 50 32 20 50 33 20 2a  tRead P1 P2 P3 *
28340 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 74 72 61 63 74   *.**.** Extract
28350 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 76 61   the smallest va
28360 6c 75 65 20 66 72 6f 6d 20 62 6f 6f 6c 65 61 6e  lue from boolean
28370 20 69 6e 64 65 78 20 50 31 20 61 6e 64 20 70 75   index P1 and pu
28380 74 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e 74  t that value int
28390 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 33  o.** register P3
283a0 2e 20 20 4f 72 2c 20 69 66 20 62 6f 6f 6c 65 61  .  Or, if boolea
283b0 6e 20 69 6e 64 65 78 20 50 31 20 69 73 20 69 6e  n index P1 is in
283c0 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2c 20 6c  itially empty, l
283d0 65 61 76 65 20 50 33 0a 2a 2a 20 75 6e 63 68 61  eave P3.** uncha
283e0 6e 67 65 64 20 61 6e 64 20 6a 75 6d 70 20 74 6f  nged and jump to
283f0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e   instruction P2.
28400 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53  .*/.case OP_RowS
28410 65 74 52 65 61 64 3a 20 7b 20 20 20 20 20 20 20  etRead: {       
28420 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 6f 75  /* jump, in1, ou
28430 74 33 20 2a 2f 0a 20 20 69 36 34 20 76 61 6c 3b  t3 */.  i64 val;
28440 0a 20 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54  .  CHECK_FOR_INT
28450 45 52 52 55 50 54 3b 0a 20 20 70 49 6e 31 20 3d  ERRUPT;.  pIn1 =
28460 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
28470 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
28480 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
28490 29 3d 3d 30 20 0a 20 20 20 7c 7c 20 73 71 6c 69  )==0 .   || sqli
284a0 74 65 33 52 6f 77 53 65 74 4e 65 78 74 28 70 49  te3RowSetNext(pI
284b0 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20 26  n1->u.pRowSet, &
284c0 76 61 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  val)==0.  ){.   
284d0 20 2f 2a 20 54 68 65 20 62 6f 6f 6c 65 61 6e 20   /* The boolean 
284e0 69 6e 64 65 78 20 69 73 20 65 6d 70 74 79 20 2a  index is empty *
284f0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
28500 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 49 6e 31  eMemSetNull(pIn1
28510 29 3b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  );.    pc = pOp-
28520 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 65 6c 73 65  >p2 - 1;.  }else
28530 7b 0a 20 20 20 20 2f 2a 20 41 20 76 61 6c 75 65  {.    /* A value
28540 20 77 61 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d   was pulled from
28550 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
28560 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
28570 53 65 74 49 6e 74 36 34 28 26 61 4d 65 6d 5b 70  SetInt64(&aMem[p
28580 4f 70 2d 3e 70 33 5d 2c 20 76 61 6c 29 3b 0a 20  Op->p3], val);. 
28590 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
285a0 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65 74  * Opcode: RowSet
285b0 54 65 73 74 20 50 31 20 50 32 20 50 33 20 50 34  Test P1 P2 P3 P4
285c0 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  .**.** Register 
285d0 50 33 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  P3 is assumed to
285e0 20 68 6f 6c 64 20 61 20 36 34 2d 62 69 74 20 69   hold a 64-bit i
285f0 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 20 49 66  nteger value. If
28600 20 72 65 67 69 73 74 65 72 20 50 31 0a 2a 2a 20   register P1.** 
28610 63 6f 6e 74 61 69 6e 73 20 61 20 52 6f 77 53 65  contains a RowSe
28620 74 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61  t object and tha
28630 74 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20  t RowSet object 
28640 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20  contains.** the 
28650 76 61 6c 75 65 20 68 65 6c 64 20 69 6e 20 50 33  value held in P3
28660 2c 20 6a 75 6d 70 20 74 6f 20 72 65 67 69 73 74  , jump to regist
28670 65 72 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65  er P2. Otherwise
28680 2c 20 69 6e 73 65 72 74 20 74 68 65 0a 2a 2a 20  , insert the.** 
28690 69 6e 74 65 67 65 72 20 69 6e 20 50 33 20 69 6e  integer in P3 in
286a0 74 6f 20 74 68 65 20 52 6f 77 53 65 74 20 61 6e  to the RowSet an
286b0 64 20 63 6f 6e 74 69 6e 75 65 20 6f 6e 20 74 6f  d continue on to
286c0 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 6f 70 63   the.** next opc
286d0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52  ode..**.** The R
286e0 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 69 73 20  owSet object is 
286f0 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72 20 74 68  optimized for th
28700 65 20 63 61 73 65 20 77 68 65 72 65 20 73 75 63  e case where suc
28710 63 65 73 73 69 76 65 20 73 65 74 73 0a 2a 2a 20  cessive sets.** 
28720 6f 66 20 69 6e 74 65 67 65 72 73 2c 20 77 68 65  of integers, whe
28730 72 65 20 65 61 63 68 20 73 65 74 20 63 6f 6e 74  re each set cont
28740 61 69 6e 73 20 6e 6f 20 64 75 70 6c 69 63 61 74  ains no duplicat
28750 65 73 2e 20 45 61 63 68 20 73 65 74 0a 2a 2a 20  es. Each set.** 
28760 6f 66 20 76 61 6c 75 65 73 20 69 73 20 69 64 65  of values is ide
28770 6e 74 69 66 69 65 64 20 62 79 20 61 20 75 6e 69  ntified by a uni
28780 71 75 65 20 50 34 20 76 61 6c 75 65 2e 20 54 68  que P4 value. Th
28790 65 20 66 69 72 73 74 20 73 65 74 0a 2a 2a 20 6d  e first set.** m
287a0 75 73 74 20 68 61 76 65 20 50 34 3d 3d 30 2c 20  ust have P4==0, 
287b0 74 68 65 20 66 69 6e 61 6c 20 73 65 74 20 50 34  the final set P4
287c0 3d 2d 31 2e 20 20 50 34 20 6d 75 73 74 20 62 65  =-1.  P4 must be
287d0 20 65 69 74 68 65 72 20 2d 31 20 6f 72 0a 2a 2a   either -1 or.**
287e0 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 20 20   non-negative.  
287f0 46 6f 72 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  For non-negative
28800 20 76 61 6c 75 65 73 20 6f 66 20 50 34 20 6f 6e   values of P4 on
28810 6c 79 20 74 68 65 20 6c 6f 77 65 72 20 34 0a 2a  ly the lower 4.*
28820 2a 20 62 69 74 73 20 61 72 65 20 73 69 67 6e 69  * bits are signi
28830 66 69 63 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ficant..**.** Th
28840 69 73 20 61 6c 6c 6f 77 73 20 6f 70 74 69 6d 69  is allows optimi
28850 7a 61 74 69 6f 6e 73 3a 20 28 61 29 20 77 68 65  zations: (a) whe
28860 6e 20 50 34 3d 3d 30 20 74 68 65 72 65 20 69 73  n P4==0 there is
28870 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74   no need to test
28880 0a 2a 2a 20 74 68 65 20 72 6f 77 73 65 74 20 6f  .** the rowset o
28890 62 6a 65 63 74 20 66 6f 72 20 50 33 2c 20 61 73  bject for P3, as
288a0 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
288b0 64 20 6e 6f 74 20 74 6f 20 63 6f 6e 74 61 69 6e  d not to contain
288c0 20 69 74 2c 0a 2a 2a 20 28 62 29 20 77 68 65 6e   it,.** (b) when
288d0 20 50 34 3d 3d 2d 31 20 74 68 65 72 65 20 69 73   P4==-1 there is
288e0 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 73 65   no need to inse
288f0 72 74 20 74 68 65 20 76 61 6c 75 65 2c 20 61 73  rt the value, as
28900 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 6e 65 76 65   it will.** neve
28910 72 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 2c  r be tested for,
28920 20 61 6e 64 20 28 63 29 20 77 68 65 6e 20 61 20   and (c) when a 
28930 76 61 6c 75 65 20 74 68 61 74 20 69 73 20 70 61  value that is pa
28940 72 74 20 6f 66 20 73 65 74 20 58 20 69 73 0a 2a  rt of set X is.*
28950 2a 20 69 6e 73 65 72 74 65 64 2c 20 74 68 65 72  * inserted, ther
28960 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
28970 73 65 61 72 63 68 20 74 6f 20 73 65 65 20 69 66  search to see if
28980 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
28990 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c  was.** previousl
289a0 79 20 69 6e 73 65 72 74 65 64 20 61 73 20 70 61  y inserted as pa
289b0 72 74 20 6f 66 20 73 65 74 20 58 20 28 6f 6e 6c  rt of set X (onl
289c0 79 20 69 66 20 69 74 20 77 61 73 20 70 72 65 76  y if it was prev
289d0 69 6f 75 73 6c 79 0a 2a 2a 20 69 6e 73 65 72 74  iously.** insert
289e0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 73 6f  ed as part of so
289f0 6d 65 20 6f 74 68 65 72 20 73 65 74 29 2e 0a 2a  me other set)..*
28a00 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65 74  /.case OP_RowSet
28a10 54 65 73 74 3a 20 7b 20 20 20 20 20 20 20 20 20  Test: {         
28a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
28a30 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f  ump, in1, in3 */
28a40 0a 20 20 69 6e 74 20 69 53 65 74 3b 0a 20 20 69  .  int iSet;.  i
28a50 6e 74 20 65 78 69 73 74 73 3b 0a 0a 20 20 70 49  nt exists;..  pI
28a60 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
28a70 70 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61  p1];.  pIn3 = &a
28a80 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
28a90 69 53 65 74 20 3d 20 70 4f 70 2d 3e 70 34 2e 69  iSet = pOp->p4.i
28aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 33  ;.  assert( pIn3
28ab0 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ->flags&MEM_Int 
28ac0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
28ad0 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74  e is anything ot
28ae0 68 65 72 20 74 68 61 6e 20 61 20 72 6f 77 73 65  her than a rowse
28af0 74 20 6f 62 6a 65 63 74 20 69 6e 20 6d 65 6d 6f  t object in memo
28b00 72 79 20 63 65 6c 6c 20 50 31 2c 0a 20 20 2a 2a  ry cell P1,.  **
28b10 20 64 65 6c 65 74 65 20 69 74 20 6e 6f 77 20 61   delete it now a
28b20 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 50 31  nd initialize P1
28b30 20 77 69 74 68 20 61 6e 20 65 6d 70 74 79 20 72   with an empty r
28b40 6f 77 73 65 74 0a 20 20 2a 2f 0a 20 20 69 66 28  owset.  */.  if(
28b50 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
28b60 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29  MEM_RowSet)==0 )
28b70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
28b80 65 4d 65 6d 53 65 74 52 6f 77 53 65 74 28 70 49  eMemSetRowSet(pI
28b90 6e 31 29 3b 0a 20 20 20 20 69 66 28 20 28 70 49  n1);.    if( (pI
28ba0 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
28bb0 52 6f 77 53 65 74 29 3d 3d 30 20 29 20 67 6f 74  RowSet)==0 ) got
28bc0 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 0a 20  o no_mem;.  }.. 
28bd0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
28be0 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29  type==P4_INT32 )
28bf0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 65 74  ;.  assert( iSet
28c00 3d 3d 2d 31 20 7c 7c 20 69 53 65 74 3e 3d 30 20  ==-1 || iSet>=0 
28c10 29 3b 0a 20 20 69 66 28 20 69 53 65 74 20 29 7b  );.  if( iSet ){
28c20 0a 20 20 20 20 65 78 69 73 74 73 20 3d 20 73 71  .    exists = sq
28c30 6c 69 74 65 33 52 6f 77 53 65 74 54 65 73 74 28  lite3RowSetTest(
28c40 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c  pIn1->u.pRowSet,
28c50 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
28c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c70 20 28 75 38 29 28 69 53 65 74 3e 3d 30 20 3f 20   (u8)(iSet>=0 ? 
28c80 69 53 65 74 20 26 20 30 78 66 20 3a 20 30 78 66  iSet & 0xf : 0xf
28c90 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  f),.            
28ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cb0 20 20 20 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20     pIn3->u.i);. 
28cc0 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
28cd0 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  .      pc = pOp-
28ce0 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20 20 62  >p2 - 1;.      b
28cf0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
28d00 20 20 69 66 28 20 69 53 65 74 3e 3d 30 20 29 7b    if( iSet>=0 ){
28d10 0a 20 20 20 20 73 71 6c 69 74 65 33 52 6f 77 53  .    sqlite3RowS
28d20 65 74 49 6e 73 65 72 74 28 70 49 6e 31 2d 3e 75  etInsert(pIn1->u
28d30 2e 70 52 6f 77 53 65 74 2c 20 70 49 6e 33 2d 3e  .pRowSet, pIn3->
28d40 75 2e 69 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  u.i);.  }.  brea
28d50 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  k;.}...#ifndef S
28d60 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
28d70 45 52 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50  ER../* Opcode: P
28d80 72 6f 67 72 61 6d 20 50 31 20 50 32 20 50 33 20  rogram P1 P2 P3 
28d90 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75  P4 *.**.** Execu
28da0 74 65 20 74 68 65 20 74 72 69 67 67 65 72 20 70  te the trigger p
28db0 72 6f 67 72 61 6d 20 70 61 73 73 65 64 20 61 73  rogram passed as
28dc0 20 50 34 20 28 74 79 70 65 20 50 34 5f 53 55 42   P4 (type P4_SUB
28dd0 50 52 4f 47 52 41 4d 29 2e 20 0a 2a 2a 0a 2a 2a  PROGRAM). .**.**
28de0 20 50 31 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   P1 contains the
28df0 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
28e00 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74  memory cell that
28e10 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69   contains the fi
28e20 72 73 74 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63  rst memory .** c
28e30 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72 61 79 20  ell in an array 
28e40 6f 66 20 76 61 6c 75 65 73 20 75 73 65 64 20 61  of values used a
28e50 73 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  s arguments to t
28e60 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 2e 20  he sub-program. 
28e70 50 32 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  P2 .** contains 
28e80 74 68 65 20 61 64 64 72 65 73 73 20 74 6f 20 6a  the address to j
28e90 75 6d 70 20 74 6f 20 69 66 20 74 68 65 20 73 75  ump to if the su
28ea0 62 2d 70 72 6f 67 72 61 6d 20 74 68 72 6f 77 73  b-program throws
28eb0 20 61 6e 20 49 47 4e 4f 52 45 20 0a 2a 2a 20 65   an IGNORE .** e
28ec0 78 63 65 70 74 69 6f 6e 20 75 73 69 6e 67 20 74  xception using t
28ed0 68 65 20 52 41 49 53 45 28 29 20 66 75 6e 63 74  he RAISE() funct
28ee0 69 6f 6e 2e 20 52 65 67 69 73 74 65 72 20 50 33  ion. Register P3
28ef0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 64   contains the ad
28f00 64 72 65 73 73 20 0a 2a 2a 20 6f 66 20 61 20 6d  dress .** of a m
28f10 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74 68  emory cell in th
28f20 69 73 20 28 74 68 65 20 70 61 72 65 6e 74 29 20  is (the parent) 
28f30 56 4d 20 74 68 61 74 20 69 73 20 75 73 65 64 20  VM that is used 
28f40 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  to allocate the 
28f50 0a 2a 2a 20 6d 65 6d 6f 72 79 20 72 65 71 75 69  .** memory requi
28f60 72 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 76  red by the sub-v
28f70 64 62 65 20 61 74 20 72 75 6e 74 69 6d 65 2e 0a  dbe at runtime..
28f80 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f  **.** P4 is a po
28f90 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56 4d 20  inter to the VM 
28fa0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
28fb0 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2e 0a  rigger program..
28fc0 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 72 6f 67 72  */.case OP_Progr
28fd0 61 6d 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  am: {        /* 
28fe0 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  jump */.  int nM
28ff0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
29000 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
29010 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 20  emory registers 
29020 66 6f 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  for sub-program 
29030 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
29040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29050 42 79 74 65 73 20 6f 66 20 72 75 6e 74 69 6d 65  Bytes of runtime
29060 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
29070 66 6f 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  for sub-program 
29080 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 74 3b 20 20  */.  Mem *pRt;  
29090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
290a0 52 65 67 69 73 74 65 72 20 74 6f 20 61 6c 6c 6f  Register to allo
290b0 63 61 74 65 20 72 75 6e 74 69 6d 65 20 73 70 61  cate runtime spa
290c0 63 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ce */.  Mem *pMe
290d0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
290e0 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
290f0 74 65 20 74 68 72 6f 75 67 68 20 6d 65 6d 6f 72  te through memor
29100 79 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 4d 65 6d  y cells */.  Mem
29110 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *pEnd;         
29120 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6d 65 6d       /* Last mem
29130 6f 72 79 20 63 65 6c 6c 20 69 6e 20 6e 65 77 20  ory cell in new 
29140 61 72 72 61 79 20 2a 2f 0a 20 20 56 64 62 65 46  array */.  VdbeF
29150 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 20 20 20  rame *pFrame;   
29160 20 20 20 2f 2a 20 4e 65 77 20 76 64 62 65 20 66     /* New vdbe f
29170 72 61 6d 65 20 74 6f 20 65 78 65 63 75 74 65 20  rame to execute 
29180 69 6e 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72  in */.  SubProgr
29190 61 6d 20 2a 70 50 72 6f 67 72 61 6d 3b 20 20 20  am *pProgram;   
291a0 2f 2a 20 53 75 62 2d 70 72 6f 67 72 61 6d 20 74  /* Sub-program t
291b0 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 76  o execute */.  v
291c0 6f 69 64 20 2a 74 3b 20 20 20 20 20 20 20 20 20  oid *t;         
291d0 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20         /* Token 
291e0 69 64 65 6e 74 69 66 79 69 6e 67 20 74 72 69 67  identifying trig
291f0 67 65 72 20 2a 2f 0a 0a 20 20 70 50 72 6f 67 72  ger */..  pProgr
29200 61 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72  am = pOp->p4.pPr
29210 6f 67 72 61 6d 3b 0a 20 20 70 52 74 20 3d 20 26  ogram;.  pRt = &
29220 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
29230 20 61 73 73 65 72 74 28 20 70 50 72 6f 67 72 61   assert( pProgra
29240 6d 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 0a 20  m->nOp>0 );.  . 
29250 20 2f 2a 20 49 66 20 74 68 65 20 70 35 20 66 6c   /* If the p5 fl
29260 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65  ag is clear, the
29270 6e 20 72 65 63 75 72 73 69 76 65 20 69 6e 76 6f  n recursive invo
29280 63 61 74 69 6f 6e 20 6f 66 20 74 72 69 67 67 65  cation of trigge
29290 72 73 20 69 73 20 0a 20 20 2a 2a 20 64 69 73 61  rs is .  ** disa
292a0 62 6c 65 64 20 66 6f 72 20 62 61 63 6b 77 61 72  bled for backwar
292b0 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
292c0 20 28 70 35 20 69 73 20 73 65 74 20 69 66 20 74   (p5 is set if t
292d0 68 69 73 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a  his sub-program.
292e0 20 20 2a 2a 20 69 73 20 72 65 61 6c 6c 79 20 61    ** is really a
292f0 20 74 72 69 67 67 65 72 2c 20 6e 6f 74 20 61 20   trigger, not a 
29300 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63 74 69  foreign key acti
29310 6f 6e 2c 20 61 6e 64 20 74 68 65 20 66 6c 61 67  on, and the flag
29320 20 73 65 74 0a 20 20 2a 2a 20 61 6e 64 20 63 6c   set.  ** and cl
29330 65 61 72 65 64 20 62 79 20 74 68 65 20 22 50 52  eared by the "PR
29340 41 47 4d 41 20 72 65 63 75 72 73 69 76 65 5f 74  AGMA recursive_t
29350 72 69 67 67 65 72 73 22 20 63 6f 6d 6d 61 6e 64  riggers" command
29360 20 69 73 20 63 6c 65 61 72 29 2e 0a 20 20 2a 2a   is clear)..  **
29370 20 0a 20 20 2a 2a 20 49 74 20 69 73 20 72 65 63   .  ** It is rec
29380 75 72 73 69 76 65 20 69 6e 76 6f 63 61 74 69 6f  ursive invocatio
29390 6e 20 6f 66 20 74 72 69 67 67 65 72 73 2c 20 61  n of triggers, a
293a0 74 20 74 68 65 20 53 51 4c 20 6c 65 76 65 6c 2c  t the SQL level,
293b0 20 74 68 61 74 20 69 73 20 0a 20 20 2a 2a 20 64   that is .  ** d
293c0 69 73 61 62 6c 65 64 2e 20 49 6e 20 73 6f 6d 65  isabled. In some
293d0 20 63 61 73 65 73 20 61 20 73 69 6e 67 6c 65 20   cases a single 
293e0 74 72 69 67 67 65 72 20 6d 61 79 20 67 65 6e 65  trigger may gene
293f0 72 61 74 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f  rate more than o
29400 6e 65 20 0a 20 20 2a 2a 20 53 75 62 50 72 6f 67  ne .  ** SubProg
29410 72 61 6d 20 28 69 66 20 74 68 65 20 74 72 69 67  ram (if the trig
29420 67 65 72 20 6d 61 79 20 62 65 20 65 78 65 63 75  ger may be execu
29430 74 65 64 20 77 69 74 68 20 6d 6f 72 65 20 74 68  ted with more th
29440 61 6e 20 6f 6e 65 20 64 69 66 66 65 72 65 6e 74  an one different
29450 20 0a 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49   .  ** ON CONFLI
29460 43 54 20 61 6c 67 6f 72 69 74 68 6d 29 2e 20 53  CT algorithm). S
29470 75 62 50 72 6f 67 72 61 6d 20 73 74 72 75 63 74  ubProgram struct
29480 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
29490 77 69 74 68 20 61 0a 20 20 2a 2a 20 73 69 6e 67  with a.  ** sing
294a0 6c 65 20 74 72 69 67 67 65 72 20 61 6c 6c 20 68  le trigger all h
294b0 61 76 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c  ave the same val
294c0 75 65 20 66 6f 72 20 74 68 65 20 53 75 62 50 72  ue for the SubPr
294d0 6f 67 72 61 6d 2e 74 6f 6b 65 6e 20 0a 20 20 2a  ogram.token .  *
294e0 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a  * variable.  */.
294f0 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b    if( pOp->p5 ){
29500 0a 20 20 20 20 74 20 3d 20 70 50 72 6f 67 72 61  .    t = pProgra
29510 6d 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 66 6f  m->token;.    fo
29520 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61  r(pFrame=p->pFra
29530 6d 65 3b 20 70 46 72 61 6d 65 20 26 26 20 70 46  me; pFrame && pF
29540 72 61 6d 65 2d 3e 74 6f 6b 65 6e 21 3d 74 3b 20  rame->token!=t; 
29550 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70  pFrame=pFrame->p
29560 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  Parent);.    if(
29570 20 70 46 72 61 6d 65 20 29 20 62 72 65 61 6b 3b   pFrame ) break;
29580 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e  .  }..  if( p->n
29590 46 72 61 6d 65 3e 3d 64 62 2d 3e 61 4c 69 6d 69  Frame>=db->aLimi
295a0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54  t[SQLITE_LIMIT_T
295b0 52 49 47 47 45 52 5f 44 45 50 54 48 5d 20 29 7b  RIGGER_DEPTH] ){
295c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
295d0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
295e0 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
295f0 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 74  >zErrMsg, db, "t
29600 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f  oo many levels o
29610 66 20 74 72 69 67 67 65 72 20 72 65 63 75 72 73  f trigger recurs
29620 69 6f 6e 22 29 3b 0a 20 20 20 20 62 72 65 61 6b  ion");.    break
29630 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69  ;.  }..  /* Regi
29640 73 74 65 72 20 70 52 74 20 69 73 20 75 73 65 64  ster pRt is used
29650 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6d 65   to store the me
29660 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 74 6f  mory required to
29670 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65 0a   save the state.
29680 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 75 72 72    ** of the curr
29690 65 6e 74 20 70 72 6f 67 72 61 6d 2c 20 61 6e 64  ent program, and
296a0 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75   the memory requ
296b0 69 72 65 64 20 61 74 20 72 75 6e 74 69 6d 65 20  ired at runtime 
296c0 74 6f 20 65 78 65 63 75 74 65 0a 20 20 2a 2a 20  to execute.  ** 
296d0 74 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67  the trigger prog
296e0 72 61 6d 2e 20 49 66 20 74 68 69 73 20 74 72 69  ram. If this tri
296f0 67 67 65 72 20 68 61 73 20 62 65 65 6e 20 66 69  gger has been fi
29700 72 65 64 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  red before, then
29710 20 70 52 74 20 0a 20 20 2a 2a 20 69 73 20 61 6c   pRt .  ** is al
29720 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 2e  ready allocated.
29730 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d   Otherwise, it m
29740 75 73 74 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ust be initializ
29750 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  ed.  */.  if( (p
29760 52 74 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 46 72  Rt->flags&MEM_Fr
29770 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ame)==0 ){.    /
29780 2a 20 53 75 62 50 72 6f 67 72 61 6d 2e 6e 4d 65  * SubProgram.nMe
29790 6d 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  m is set to the 
297a0 6e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79  number of memory
297b0 20 63 65 6c 6c 73 20 75 73 65 64 20 62 79 20 74   cells used by t
297c0 68 65 20 0a 20 20 20 20 2a 2a 20 70 72 6f 67 72  he .    ** progr
297d0 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 53 75 62  am stored in Sub
297e0 50 72 6f 67 72 61 6d 2e 61 4f 70 2e 20 41 73 20  Program.aOp. As 
297f0 77 65 6c 6c 20 61 73 20 74 68 65 73 65 2c 20 6f  well as these, o
29800 6e 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  ne memory.    **
29810 20 63 65 6c 6c 20 69 73 20 72 65 71 75 69 72 65   cell is require
29820 64 20 66 6f 72 20 65 61 63 68 20 63 75 72 73 6f  d for each curso
29830 72 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  r used by the pr
29840 6f 67 72 61 6d 2e 20 53 65 74 20 6c 6f 63 61 6c  ogram. Set local
29850 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
29860 20 6e 4d 65 6d 20 28 61 6e 64 20 6c 61 74 65 72   nMem (and later
29870 2c 20 56 64 62 65 46 72 61 6d 65 2e 6e 43 68 69  , VdbeFrame.nChi
29880 6c 64 4d 65 6d 29 20 74 6f 20 74 68 69 73 20 76  ldMem) to this v
29890 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  alue..    */.   
298a0 20 6e 4d 65 6d 20 3d 20 70 50 72 6f 67 72 61 6d   nMem = pProgram
298b0 2d 3e 6e 4d 65 6d 20 2b 20 70 50 72 6f 67 72 61  ->nMem + pProgra
298c0 6d 2d 3e 6e 43 73 72 3b 0a 20 20 20 20 6e 42 79  m->nCsr;.    nBy
298d0 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
298e0 6f 66 28 56 64 62 65 46 72 61 6d 65 29 29 0a 20  of(VdbeFrame)). 
298f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 6e               + n
29900 4d 65 6d 20 2a 20 73 69 7a 65 6f 66 28 4d 65 6d  Mem * sizeof(Mem
29910 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
29920 2b 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72  + pProgram->nCsr
29930 20 2a 20 73 69 7a 65 6f 66 28 56 64 62 65 43 75   * sizeof(VdbeCu
29940 72 73 6f 72 20 2a 29 0a 20 20 20 20 20 20 20 20  rsor *).        
29950 20 20 20 20 20 20 2b 20 70 50 72 6f 67 72 61 6d        + pProgram
29960 2d 3e 6e 4f 6e 63 65 20 2a 20 73 69 7a 65 6f 66  ->nOnce * sizeof
29970 28 75 38 29 3b 0a 20 20 20 20 70 46 72 61 6d 65  (u8);.    pFrame
29980 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
29990 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
299a0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 46 72 61  );.    if( !pFra
299b0 6d 65 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  me ){.      goto
299c0 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
299d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
299e0 6d 52 65 6c 65 61 73 65 28 70 52 74 29 3b 0a 20  mRelease(pRt);. 
299f0 20 20 20 70 52 74 2d 3e 66 6c 61 67 73 20 3d 20     pRt->flags = 
29a00 4d 45 4d 5f 46 72 61 6d 65 3b 0a 20 20 20 20 70  MEM_Frame;.    p
29a10 52 74 2d 3e 75 2e 70 46 72 61 6d 65 20 3d 20 70  Rt->u.pFrame = p
29a20 46 72 61 6d 65 3b 0a 0a 20 20 20 20 70 46 72 61  Frame;..    pFra
29a30 6d 65 2d 3e 76 20 3d 20 70 3b 0a 20 20 20 20 70  me->v = p;.    p
29a40 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d  Frame->nChildMem
29a50 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 70 46 72   = nMem;.    pFr
29a60 61 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72 20 3d  ame->nChildCsr =
29a70 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b   pProgram->nCsr;
29a80 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 70 63 20  .    pFrame->pc 
29a90 3d 20 70 63 3b 0a 20 20 20 20 70 46 72 61 6d 65  = pc;.    pFrame
29aa0 2d 3e 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d  ->aMem = p->aMem
29ab0 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 4d  ;.    pFrame->nM
29ac0 65 6d 20 3d 20 70 2d 3e 6e 4d 65 6d 3b 0a 20 20  em = p->nMem;.  
29ad0 20 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 20    pFrame->apCsr 
29ae0 3d 20 70 2d 3e 61 70 43 73 72 3b 0a 20 20 20 20  = p->apCsr;.    
29af0 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 20  pFrame->nCursor 
29b00 3d 20 70 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20  = p->nCursor;.  
29b10 20 20 70 46 72 61 6d 65 2d 3e 61 4f 70 20 3d 20    pFrame->aOp = 
29b20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 70 46 72 61  p->aOp;.    pFra
29b30 6d 65 2d 3e 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  me->nOp = p->nOp
29b40 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 74 6f  ;.    pFrame->to
29b50 6b 65 6e 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e  ken = pProgram->
29b60 74 6f 6b 65 6e 3b 0a 20 20 20 20 70 46 72 61 6d  token;.    pFram
29b70 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70  e->aOnceFlag = p
29b80 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 20  ->aOnceFlag;.   
29b90 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c   pFrame->nOnceFl
29ba0 61 67 20 3d 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61  ag = p->nOnceFla
29bb0 67 3b 0a 0a 20 20 20 20 70 45 6e 64 20 3d 20 26  g;..    pEnd = &
29bc0 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 46 72  VdbeFrameMem(pFr
29bd0 61 6d 65 29 5b 70 46 72 61 6d 65 2d 3e 6e 43 68  ame)[pFrame->nCh
29be0 69 6c 64 4d 65 6d 5d 3b 0a 20 20 20 20 66 6f 72  ildMem];.    for
29bf0 28 70 4d 65 6d 3d 56 64 62 65 46 72 61 6d 65 4d  (pMem=VdbeFrameM
29c00 65 6d 28 70 46 72 61 6d 65 29 3b 20 70 4d 65 6d  em(pFrame); pMem
29c10 21 3d 70 45 6e 64 3b 20 70 4d 65 6d 2b 2b 29 7b  !=pEnd; pMem++){
29c20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
29c30 67 73 20 3d 20 4d 45 4d 5f 49 6e 76 61 6c 69 64  gs = MEM_Invalid
29c40 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 64 62  ;.      pMem->db
29c50 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d   = db;.    }.  }
29c60 65 6c 73 65 7b 0a 20 20 20 20 70 46 72 61 6d 65  else{.    pFrame
29c70 20 3d 20 70 52 74 2d 3e 75 2e 70 46 72 61 6d 65   = pRt->u.pFrame
29c80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
29c90 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 2b 70 50 72  rogram->nMem+pPr
29ca0 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 70 46 72  ogram->nCsr==pFr
29cb0 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 20 29  ame->nChildMem )
29cc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
29cd0 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 70 46  rogram->nCsr==pF
29ce0 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72 20  rame->nChildCsr 
29cf0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
29d00 63 3d 3d 70 46 72 61 6d 65 2d 3e 70 63 20 29 3b  c==pFrame->pc );
29d10 0a 20 20 7d 0a 0a 20 20 70 2d 3e 6e 46 72 61 6d  .  }..  p->nFram
29d20 65 2b 2b 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70  e++;.  pFrame->p
29d30 50 61 72 65 6e 74 20 3d 20 70 2d 3e 70 46 72 61  Parent = p->pFra
29d40 6d 65 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 6c 61  me;.  pFrame->la
29d50 73 74 52 6f 77 69 64 20 3d 20 6c 61 73 74 52 6f  stRowid = lastRo
29d60 77 69 64 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 6e  wid;.  pFrame->n
29d70 43 68 61 6e 67 65 20 3d 20 70 2d 3e 6e 43 68 61  Change = p->nCha
29d80 6e 67 65 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67  nge;.  p->nChang
29d90 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 46 72 61  e = 0;.  p->pFra
29da0 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a 20 20 70  me = pFrame;.  p
29db0 2d 3e 61 4d 65 6d 20 3d 20 61 4d 65 6d 20 3d 20  ->aMem = aMem = 
29dc0 26 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 46  &VdbeFrameMem(pF
29dd0 72 61 6d 65 29 5b 2d 31 5d 3b 0a 20 20 70 2d 3e  rame)[-1];.  p->
29de0 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  nMem = pFrame->n
29df0 43 68 69 6c 64 4d 65 6d 3b 0a 20 20 70 2d 3e 6e  ChildMem;.  p->n
29e00 43 75 72 73 6f 72 20 3d 20 28 75 31 36 29 70 46  Cursor = (u16)pF
29e10 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72 3b  rame->nChildCsr;
29e20 0a 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 56  .  p->apCsr = (V
29e30 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d  dbeCursor **)&aM
29e40 65 6d 5b 70 2d 3e 6e 4d 65 6d 2b 31 5d 3b 0a 20  em[p->nMem+1];. 
29e50 20 70 2d 3e 61 4f 70 20 3d 20 61 4f 70 20 3d 20   p->aOp = aOp = 
29e60 70 50 72 6f 67 72 61 6d 2d 3e 61 4f 70 3b 0a 20  pProgram->aOp;. 
29e70 20 70 2d 3e 6e 4f 70 20 3d 20 70 50 72 6f 67 72   p->nOp = pProgr
29e80 61 6d 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f  am->nOp;.  p->aO
29e90 6e 63 65 46 6c 61 67 20 3d 20 28 75 38 20 2a 29  nceFlag = (u8 *)
29ea0 26 70 2d 3e 61 70 43 73 72 5b 70 2d 3e 6e 43 75  &p->apCsr[p->nCu
29eb0 72 73 6f 72 5d 3b 0a 20 20 70 2d 3e 6e 4f 6e 63  rsor];.  p->nOnc
29ec0 65 46 6c 61 67 20 3d 20 70 50 72 6f 67 72 61 6d  eFlag = pProgram
29ed0 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 70 63 20 3d 20  ->nOnce;.  pc = 
29ee0 2d 31 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2d 3e  -1;.  memset(p->
29ef0 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d  aOnceFlag, 0, p-
29f00 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 0a 20 20  >nOnceFlag);..  
29f10 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
29f20 6f 64 65 3a 20 50 61 72 61 6d 20 50 31 20 50 32  ode: Param P1 P2
29f30 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69   * * *.**.** Thi
29f40 73 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79  s opcode is only
29f50 20 65 76 65 72 20 70 72 65 73 65 6e 74 20 69 6e   ever present in
29f60 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63 61   sub-programs ca
29f70 6c 6c 65 64 20 76 69 61 20 74 68 65 20 0a 2a 2a  lled via the .**
29f80 20 4f 50 5f 50 72 6f 67 72 61 6d 20 69 6e 73 74   OP_Program inst
29f90 72 75 63 74 69 6f 6e 2e 20 43 6f 70 79 20 61 20  ruction. Copy a 
29fa0 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20  value currently 
29fb0 73 74 6f 72 65 64 20 69 6e 20 61 20 6d 65 6d 6f  stored in a memo
29fc0 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 6f 66 20 74  ry .** cell of t
29fd0 68 65 20 63 61 6c 6c 69 6e 67 20 28 70 61 72 65  he calling (pare
29fe0 6e 74 29 20 66 72 61 6d 65 20 74 6f 20 63 65 6c  nt) frame to cel
29ff0 6c 20 50 32 20 69 6e 20 74 68 65 20 63 75 72 72  l P2 in the curr
2a000 65 6e 74 20 66 72 61 6d 65 73 20 0a 2a 2a 20 61  ent frames .** a
2a010 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 54 68  ddress space. Th
2a020 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74 72  is is used by tr
2a030 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 20 74  igger programs t
2a040 6f 20 61 63 63 65 73 73 20 74 68 65 20 6e 65 77  o access the new
2a050 2e 2a 20 0a 2a 2a 20 61 6e 64 20 6f 6c 64 2e 2a  .* .** and old.*
2a060 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   values..**.** T
2a070 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2a080 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61  e cell in the pa
2a090 72 65 6e 74 20 66 72 61 6d 65 20 69 73 20 64 65  rent frame is de
2a0a0 74 65 72 6d 69 6e 65 64 20 62 79 20 61 64 64 69  termined by addi
2a0b0 6e 67 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  ng.** the value 
2a0c0 6f 66 20 74 68 65 20 50 31 20 61 72 67 75 6d 65  of the P1 argume
2a0d0 6e 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  nt to the value 
2a0e0 6f 66 20 74 68 65 20 50 31 20 61 72 67 75 6d 65  of the P1 argume
2a0f0 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c  nt to the.** cal
2a100 6c 69 6e 67 20 4f 50 5f 50 72 6f 67 72 61 6d 20  ling OP_Program 
2a110 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
2a120 63 61 73 65 20 4f 50 5f 50 61 72 61 6d 3a 20 7b  case OP_Param: {
2a130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
2a140 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f  t2-prerelease */
2a150 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46  .  VdbeFrame *pF
2a160 72 61 6d 65 3b 0a 20 20 4d 65 6d 20 2a 70 49 6e  rame;.  Mem *pIn
2a170 3b 0a 20 20 70 46 72 61 6d 65 20 3d 20 70 2d 3e  ;.  pFrame = p->
2a180 70 46 72 61 6d 65 3b 0a 20 20 70 49 6e 20 3d 20  pFrame;.  pIn = 
2a190 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f  &pFrame->aMem[pO
2a1a0 70 2d 3e 70 31 20 2b 20 70 46 72 61 6d 65 2d 3e  p->p1 + pFrame->
2a1b0 61 4f 70 5b 70 46 72 61 6d 65 2d 3e 70 63 5d 2e  aOp[pFrame->pc].
2a1c0 70 31 5d 3b 20 20 20 0a 20 20 73 71 6c 69 74 65  p1];   .  sqlite
2a1d0 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
2a1e0 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 2c 20 4d  opy(pOut, pIn, M
2a1f0 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 62 72 65  EM_Ephem);.  bre
2a200 61 6b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  ak;.}..#endif /*
2a210 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
2a220 4f 4d 49 54 5f 54 52 49 47 47 45 52 20 2a 2f 0a  OMIT_TRIGGER */.
2a230 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2a240 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
2a250 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6b 43 6f  ./* Opcode: FkCo
2a260 75 6e 74 65 72 20 50 31 20 50 32 20 2a 20 2a 20  unter P1 P2 * * 
2a270 2a 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  *.**.** Incremen
2a280 74 20 61 20 22 63 6f 6e 73 74 72 61 69 6e 74 20  t a "constraint 
2a290 63 6f 75 6e 74 65 72 22 20 62 79 20 50 32 20 28  counter" by P2 (
2a2a0 50 32 20 6d 61 79 20 62 65 20 6e 65 67 61 74 69  P2 may be negati
2a2b0 76 65 20 6f 72 20 70 6f 73 69 74 69 76 65 29 2e  ve or positive).
2a2c0 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 6f 6e  .** If P1 is non
2a2d0 2d 7a 65 72 6f 2c 20 74 68 65 20 64 61 74 61 62  -zero, the datab
2a2e0 61 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  ase constraint c
2a2f0 6f 75 6e 74 65 72 20 69 73 20 69 6e 63 72 65 6d  ounter is increm
2a300 65 6e 74 65 64 20 0a 2a 2a 20 28 64 65 66 65 72  ented .** (defer
2a310 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
2a320 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e 20 4f 74  constraints). Ot
2a330 68 65 72 77 69 73 65 2c 20 69 66 20 50 31 20 69  herwise, if P1 i
2a340 73 20 7a 65 72 6f 2c 20 74 68 65 20 0a 2a 2a 20  s zero, the .** 
2a350 73 74 61 74 65 6d 65 6e 74 20 63 6f 75 6e 74 65  statement counte
2a360 72 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  r is incremented
2a370 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65   (immediate fore
2a380 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
2a390 6e 74 73 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  nts)..*/.case OP
2a3a0 5f 46 6b 43 6f 75 6e 74 65 72 3a 20 7b 0a 20 20  _FkCounter: {.  
2a3b0 69 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20  if( pOp->p1 ){. 
2a3c0 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
2a3d0 43 6f 6e 73 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b  Cons += pOp->p2;
2a3e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
2a3f0 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 2b  >nFkConstraint +
2a400 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d 0a 20  = pOp->p2;.  }. 
2a410 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
2a420 63 6f 64 65 3a 20 46 6b 49 66 5a 65 72 6f 20 50  code: FkIfZero P
2a430 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
2a440 20 54 68 69 73 20 6f 70 63 6f 64 65 20 74 65 73   This opcode tes
2a450 74 73 20 69 66 20 61 20 66 6f 72 65 69 67 6e 20  ts if a foreign 
2a460 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63  key constraint-c
2a470 6f 75 6e 74 65 72 20 69 73 20 63 75 72 72 65 6e  ounter is curren
2a480 74 6c 79 20 7a 65 72 6f 2e 0a 2a 2a 20 49 66 20  tly zero..** If 
2a490 73 6f 2c 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74  so, jump to inst
2a4a0 72 75 63 74 69 6f 6e 20 50 32 2e 20 4f 74 68 65  ruction P2. Othe
2a4b0 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 6f  rwise, fall thro
2a4c0 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
2a4d0 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  .** instruction.
2a4e0 0a 2a 2a 0a 2a 2a 20 49 66 20 50 31 20 69 73 20  .**.** If P1 is 
2a4f0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
2a500 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
2a510 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2a520 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e   constraint-coun
2a530 74 65 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 28  ter.** is zero (
2a540 74 68 65 20 6f 6e 65 20 74 68 61 74 20 63 6f 75  the one that cou
2a550 6e 74 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e  nts deferred con
2a560 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
2a570 6e 73 29 2e 20 49 66 20 50 31 20 69 73 0a 2a 2a  ns). If P1 is.**
2a580 20 7a 65 72 6f 2c 20 74 68 65 20 6a 75 6d 70 20   zero, the jump 
2a590 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20  is taken if the 
2a5a0 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 73 74 72  statement constr
2a5b0 61 69 6e 74 2d 63 6f 75 6e 74 65 72 20 69 73 20  aint-counter is 
2a5c0 7a 65 72 6f 0a 2a 2a 20 28 69 6d 6d 65 64 69 61  zero.** (immedia
2a5d0 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  te foreign key c
2a5e0 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
2a5f0 69 6f 6e 73 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ions)..*/.case O
2a600 50 5f 46 6b 49 66 5a 65 72 6f 3a 20 7b 20 20 20  P_FkIfZero: {   
2a610 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
2a620 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 20 29  .  if( pOp->p1 )
2a630 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 44  {.    if( db->nD
2a640 65 66 65 72 72 65 64 43 6f 6e 73 3d 3d 30 20 29  eferredCons==0 )
2a650 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b   pc = pOp->p2-1;
2a660 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
2a670 28 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69  ( p->nFkConstrai
2a680 6e 74 3d 3d 30 20 29 20 70 63 20 3d 20 70 4f 70  nt==0 ) pc = pOp
2a690 2d 3e 70 32 2d 31 3b 0a 20 20 7d 0a 20 20 62 72  ->p2-1;.  }.  br
2a6a0 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
2a6b0 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
2a6c0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
2a6d0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
2a6e0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
2a6f0 52 45 4d 45 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65  REMENT./* Opcode
2a700 3a 20 4d 65 6d 4d 61 78 20 50 31 20 50 32 20 2a  : MemMax P1 P2 *
2a710 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73   * *.**.** P1 is
2a720 20 61 20 72 65 67 69 73 74 65 72 20 69 6e 20 74   a register in t
2a730 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 6f 66  he root frame of
2a740 20 74 68 69 73 20 56 4d 20 28 74 68 65 20 72 6f   this VM (the ro
2a750 6f 74 20 66 72 61 6d 65 20 69 73 0a 2a 2a 20 64  ot frame is.** d
2a760 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
2a770 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 20  e current frame 
2a780 69 66 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  if this instruct
2a790 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 65 78 65  ion is being exe
2a7a0 63 75 74 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  cuted.** within 
2a7b0 61 20 73 75 62 2d 70 72 6f 67 72 61 6d 29 2e 20  a sub-program). 
2a7c0 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
2a7d0 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20   register P1 to 
2a7e0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 0a  the maximum of .
2a7f0 2a 2a 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  ** its current v
2a800 61 6c 75 65 20 61 6e 64 20 74 68 65 20 76 61 6c  alue and the val
2a810 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
2a820 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  2..**.** This in
2a830 73 74 72 75 63 74 69 6f 6e 20 74 68 72 6f 77 73  struction throws
2a840 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
2a850 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 73 20   memory cell is 
2a860 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 0a 2a 2a  not initially.**
2a870 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a   an integer..*/.
2a880 63 61 73 65 20 4f 50 5f 4d 65 6d 4d 61 78 3a 20  case OP_MemMax: 
2a890 7b 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 32 20  {        /* in2 
2a8a0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 31 3b 0a  */.  Mem *pIn1;.
2a8b0 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72    VdbeFrame *pFr
2a8c0 61 6d 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 46  ame;.  if( p->pF
2a8d0 72 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  rame ){.    for(
2a8e0 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
2a8f0 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  ; pFrame->pParen
2a900 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
2a910 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
2a920 70 49 6e 31 20 3d 20 26 70 46 72 61 6d 65 2d 3e  pIn1 = &pFrame->
2a930 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
2a940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 31   }else{.    pIn1
2a950 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
2a960 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  ];.  }.  assert(
2a970 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e 31   memIsValid(pIn1
2a980 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ) );.  sqlite3Vd
2a990 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28  beMemIntegerify(
2a9a0 70 49 6e 31 29 3b 0a 20 20 70 49 6e 32 20 3d 20  pIn1);.  pIn2 = 
2a9b0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
2a9c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
2a9d0 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 32 29  Integerify(pIn2)
2a9e0 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e  ;.  if( pIn1->u.
2a9f0 69 3c 70 49 6e 32 2d 3e 75 2e 69 29 7b 0a 20 20  i<pIn2->u.i){.  
2aa00 20 20 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 70 49    pIn1->u.i = pI
2aa10 6e 32 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 62  n2->u.i;.  }.  b
2aa20 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
2aa30 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
2aa40 54 4f 49 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 0a  TOINCREMENT */..
2aa50 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 50 6f 73  /* Opcode: IfPos
2aa60 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
2aa70 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  ** If the value 
2aa80 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69  of register P1 i
2aa90 73 20 31 20 6f 72 20 67 72 65 61 74 65 72 2c 20  s 1 or greater, 
2aaa0 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a  jump to P2..**.*
2aab0 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
2aac0 74 6f 20 75 73 65 20 74 68 69 73 20 69 6e 73 74  to use this inst
2aad0 72 75 63 74 69 6f 6e 20 6f 6e 20 61 20 72 65 67  ruction on a reg
2aae0 69 73 74 65 72 20 74 68 61 74 20 64 6f 65 73 0a  ister that does.
2aaf0 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
2ab00 6e 20 69 6e 74 65 67 65 72 2e 20 20 41 6e 20 61  n integer.  An a
2ab10 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77  ssertion fault w
2ab20 69 6c 6c 20 72 65 73 75 6c 74 20 69 66 20 79 6f  ill result if yo
2ab30 75 20 74 72 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f  u try..*/.case O
2ab40 50 5f 49 66 50 6f 73 3a 20 7b 20 20 20 20 20 20  P_IfPos: {      
2ab50 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a    /* jump, in1 *
2ab60 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
2ab70 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
2ab80 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ert( pIn1->flags
2ab90 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 69 66  &MEM_Int );.  if
2aba0 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 30 20 29 7b  ( pIn1->u.i>0 ){
2abb0 0a 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e  .     pc = pOp->
2abc0 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72  p2 - 1;.  }.  br
2abd0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
2abe0 65 3a 20 49 66 4e 65 67 20 50 31 20 50 32 20 2a  e: IfNeg P1 P2 *
2abf0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   * *.**.** If th
2ac00 65 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73  e value of regis
2ac10 74 65 72 20 50 31 20 69 73 20 6c 65 73 73 20 74  ter P1 is less t
2ac20 68 61 6e 20 7a 65 72 6f 2c 20 6a 75 6d 70 20 74  han zero, jump t
2ac30 6f 20 50 32 2e 20 0a 2a 2a 0a 2a 2a 20 49 74 20  o P2. .**.** It 
2ac40 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 75 73  is illegal to us
2ac50 65 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  e this instructi
2ac60 6f 6e 20 6f 6e 20 61 20 72 65 67 69 73 74 65 72  on on a register
2ac70 20 74 68 61 74 20 64 6f 65 73 0a 2a 2a 20 6e 6f   that does.** no
2ac80 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74  t contain an int
2ac90 65 67 65 72 2e 20 20 41 6e 20 61 73 73 65 72 74  eger.  An assert
2aca0 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c 20 72  ion fault will r
2acb0 65 73 75 6c 74 20 69 66 20 79 6f 75 20 74 72 79  esult if you try
2acc0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 4e  ..*/.case OP_IfN
2acd0 65 67 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  eg: {        /* 
2ace0 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70  jump, in1 */.  p
2acf0 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
2ad00 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
2ad10 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pIn1->flags&MEM_
2ad20 49 6e 74 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  Int );.  if( pIn
2ad30 31 2d 3e 75 2e 69 3c 30 20 29 7b 0a 20 20 20 20  1->u.i<0 ){.    
2ad40 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
2ad50 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  1;.  }.  break;.
2ad60 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66  }../* Opcode: If
2ad70 5a 65 72 6f 20 50 31 20 50 32 20 50 33 20 2a 20  Zero P1 P2 P3 * 
2ad80 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69  *.**.** The regi
2ad90 73 74 65 72 20 50 31 20 6d 75 73 74 20 63 6f 6e  ster P1 must con
2ada0 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e  tain an integer.
2adb0 20 20 41 64 64 20 6c 69 74 65 72 61 6c 20 50 33    Add literal P3
2adc0 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65   to the.** value
2add0 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
2ade0 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20    If the result 
2adf0 69 73 20 65 78 61 63 74 6c 79 20 30 2c 20 6a 75  is exactly 0, ju
2ae00 6d 70 20 74 6f 20 50 32 2e 20 0a 2a 2a 0a 2a 2a  mp to P2. .**.**
2ae10 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
2ae20 6f 20 75 73 65 20 74 68 69 73 20 69 6e 73 74 72  o use this instr
2ae30 75 63 74 69 6f 6e 20 6f 6e 20 61 20 72 65 67 69  uction on a regi
2ae40 73 74 65 72 20 74 68 61 74 20 64 6f 65 73 0a 2a  ster that does.*
2ae50 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  * not contain an
2ae60 20 69 6e 74 65 67 65 72 2e 20 20 41 6e 20 61 73   integer.  An as
2ae70 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69  sertion fault wi
2ae80 6c 6c 20 72 65 73 75 6c 74 20 69 66 20 79 6f 75  ll result if you
2ae90 20 74 72 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50   try..*/.case OP
2aea0 5f 49 66 5a 65 72 6f 3a 20 7b 20 20 20 20 20 20  _IfZero: {      
2aeb0 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a    /* jump, in1 *
2aec0 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
2aed0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
2aee0 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ert( pIn1->flags
2aef0 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 70 49  &MEM_Int );.  pI
2af00 6e 31 2d 3e 75 2e 69 20 2b 3d 20 70 4f 70 2d 3e  n1->u.i += pOp->
2af10 70 33 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e  p3;.  if( pIn1->
2af20 75 2e 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 70  u.i==0 ){.     p
2af30 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
2af40 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
2af50 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67 53  ./* Opcode: AggS
2af60 74 65 70 20 2a 20 50 32 20 50 33 20 50 34 20 50  tep * P2 P3 P4 P
2af70 35 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  5.**.** Execute 
2af80 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
2af90 6e 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  n for an aggrega
2afa0 74 65 2e 20 20 54 68 65 0a 2a 2a 20 66 75 6e 63  te.  The.** func
2afb0 74 69 6f 6e 20 68 61 73 20 50 35 20 61 72 67 75  tion has P5 argu
2afc0 6d 65 6e 74 73 2e 20 20 20 50 34 20 69 73 20 61  ments.   P4 is a
2afd0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2afe0 46 75 6e 63 44 65 66 0a 2a 2a 20 73 74 72 75 63  FuncDef.** struc
2aff0 74 75 72 65 20 74 68 61 74 20 73 70 65 63 69 66  ture that specif
2b000 69 65 73 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ies the function
2b010 2e 20 20 55 73 65 20 72 65 67 69 73 74 65 72 0a  .  Use register.
2b020 2a 2a 20 50 33 20 61 73 20 74 68 65 20 61 63 63  ** P3 as the acc
2b030 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  umulator..**.** 
2b040 54 68 65 20 50 35 20 61 72 67 75 6d 65 6e 74 73  The P5 arguments
2b050 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20   are taken from 
2b060 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 64 20  register P2 and 
2b070 69 74 73 0a 2a 2a 20 73 75 63 63 65 73 73 6f 72  its.** successor
2b080 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 67  s..*/.case OP_Ag
2b090 67 53 74 65 70 3a 20 7b 0a 20 20 69 6e 74 20 6e  gStep: {.  int n
2b0a0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d  ;.  int i;.  Mem
2b0b0 20 2a 70 4d 65 6d 3b 0a 20 20 4d 65 6d 20 2a 70   *pMem;.  Mem *p
2b0c0 52 65 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63  Rec;.  sqlite3_c
2b0d0 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 73 71  ontext ctx;.  sq
2b0e0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2b0f0 56 61 6c 3b 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d  Val;..  n = pOp-
2b100 3e 70 35 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  >p5;.  assert( n
2b110 3e 3d 30 20 29 3b 0a 20 20 70 52 65 63 20 3d 20  >=0 );.  pRec = 
2b120 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
2b130 20 20 61 70 56 61 6c 20 3d 20 70 2d 3e 61 70 41    apVal = p->apA
2b140 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70  rg;.  assert( ap
2b150 56 61 6c 20 7c 7c 20 6e 3d 3d 30 20 29 3b 0a 20  Val || n==0 );. 
2b160 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
2b170 2b 2b 2c 20 70 52 65 63 2b 2b 29 7b 0a 20 20 20  ++, pRec++){.   
2b180 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
2b190 6c 69 64 28 70 52 65 63 29 20 29 3b 0a 20 20 20  lid(pRec) );.   
2b1a0 20 61 70 56 61 6c 5b 69 5d 20 3d 20 70 52 65 63   apVal[i] = pRec
2b1b0 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f  ;.    memAboutTo
2b1c0 43 68 61 6e 67 65 28 70 2c 20 70 52 65 63 29 3b  Change(p, pRec);
2b1d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2b1e0 4d 65 6d 53 74 6f 72 65 54 79 70 65 28 70 52 65  MemStoreType(pRe
2b1f0 63 29 3b 0a 20 20 7d 0a 20 20 63 74 78 2e 70 46  c);.  }.  ctx.pF
2b200 75 6e 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46  unc = pOp->p4.pF
2b210 75 6e 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  unc;.  assert( p
2b220 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d  Op->p3>0 && pOp-
2b230 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a  >p3<=p->nMem );.
2b240 20 20 63 74 78 2e 70 4d 65 6d 20 3d 20 70 4d 65    ctx.pMem = pMe
2b250 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  m = &aMem[pOp->p
2b260 33 5d 3b 0a 20 20 70 4d 65 6d 2d 3e 6e 2b 2b 3b  3];.  pMem->n++;
2b270 0a 20 20 63 74 78 2e 73 2e 66 6c 61 67 73 20 3d  .  ctx.s.flags =
2b280 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 63 74 78   MEM_Null;.  ctx
2b290 2e 73 2e 7a 20 3d 20 30 3b 0a 20 20 63 74 78 2e  .s.z = 0;.  ctx.
2b2a0 73 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  s.zMalloc = 0;. 
2b2b0 20 63 74 78 2e 73 2e 78 44 65 6c 20 3d 20 30 3b   ctx.s.xDel = 0;
2b2c0 0a 20 20 63 74 78 2e 73 2e 64 62 20 3d 20 64 62  .  ctx.s.db = db
2b2d0 3b 0a 20 20 63 74 78 2e 69 73 45 72 72 6f 72 20  ;.  ctx.isError 
2b2e0 3d 20 30 3b 0a 20 20 63 74 78 2e 70 43 6f 6c 6c  = 0;.  ctx.pColl
2b2f0 20 3d 20 30 3b 0a 20 20 63 74 78 2e 73 6b 69 70   = 0;.  ctx.skip
2b300 46 6c 61 67 20 3d 20 30 3b 0a 20 20 69 66 28 20  Flag = 0;.  if( 
2b310 63 74 78 2e 70 46 75 6e 63 2d 3e 66 6c 61 67 73  ctx.pFunc->flags
2b320 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
2b330 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 61  EEDCOLL ){.    a
2b340 73 73 65 72 74 28 20 70 4f 70 3e 70 2d 3e 61 4f  ssert( pOp>p->aO
2b350 70 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  p );.    assert(
2b360 20 70 4f 70 5b 2d 31 5d 2e 70 34 74 79 70 65 3d   pOp[-1].p4type=
2b370 3d 50 34 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20  =P4_COLLSEQ );. 
2b380 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
2b390 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  1].opcode==OP_Co
2b3a0 6c 6c 53 65 71 20 29 3b 0a 20 20 20 20 63 74 78  llSeq );.    ctx
2b3b0 2e 70 43 6f 6c 6c 20 3d 20 70 4f 70 5b 2d 31 5d  .pColl = pOp[-1]
2b3c0 2e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 20  .p4.pColl;.  }. 
2b3d0 20 28 63 74 78 2e 70 46 75 6e 63 2d 3e 78 53 74   (ctx.pFunc->xSt
2b3e0 65 70 29 28 26 63 74 78 2c 20 6e 2c 20 61 70 56  ep)(&ctx, n, apV
2b3f0 61 6c 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  al); /* IMP: R-2
2b400 34 35 30 35 2d 32 33 32 33 30 20 2a 2f 0a 20 20  4505-23230 */.  
2b410 69 66 28 20 63 74 78 2e 69 73 45 72 72 6f 72 20  if( ctx.isError 
2b420 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
2b430 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
2b440 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73  Msg, db, "%s", s
2b450 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
2b460 74 28 26 63 74 78 2e 73 29 29 3b 0a 20 20 20 20  t(&ctx.s));.    
2b470 72 63 20 3d 20 63 74 78 2e 69 73 45 72 72 6f 72  rc = ctx.isError
2b480 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 74 78 2e  ;.  }.  if( ctx.
2b490 73 6b 69 70 46 6c 61 67 20 29 7b 0a 20 20 20 20  skipFlag ){.    
2b4a0 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
2b4b0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53  opcode==OP_CollS
2b4c0 65 71 20 29 3b 0a 20 20 20 20 69 20 3d 20 70 4f  eq );.    i = pO
2b4d0 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 69 66  p[-1].p1;.    if
2b4e0 28 20 69 20 29 20 73 71 6c 69 74 65 33 56 64 62  ( i ) sqlite3Vdb
2b4f0 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d  eMemSetInt64(&aM
2b500 65 6d 5b 69 5d 2c 20 31 29 3b 0a 20 20 7d 0a 0a  em[i], 1);.  }..
2b510 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
2b520 52 65 6c 65 61 73 65 28 26 63 74 78 2e 73 29 3b  Release(&ctx.s);
2b530 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ..  break;.}../*
2b540 20 4f 70 63 6f 64 65 3a 20 41 67 67 46 69 6e 61   Opcode: AggFina
2b550 6c 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a  l P1 P2 * P4 *.*
2b560 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65  *.** Execute the
2b570 20 66 69 6e 61 6c 69 7a 65 72 20 66 75 6e 63 74   finalizer funct
2b580 69 6f 6e 20 66 6f 72 20 61 6e 20 61 67 67 72 65  ion for an aggre
2b590 67 61 74 65 2e 20 20 50 31 20 69 73 0a 2a 2a 20  gate.  P1 is.** 
2b5a0 74 68 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  the memory locat
2b5b0 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20  ion that is the 
2b5c0 61 63 63 75 6d 75 6c 61 74 6f 72 20 66 6f 72 20  accumulator for 
2b5d0 74 68 65 20 61 67 67 72 65 67 61 74 65 2e 0a 2a  the aggregate..*
2b5e0 2a 0a 2a 2a 20 50 32 20 69 73 20 74 68 65 20 6e  *.** P2 is the n
2b5f0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2b600 74 73 20 74 68 61 74 20 74 68 65 20 73 74 65 70  ts that the step
2b610 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20   function takes 
2b620 61 6e 64 0a 2a 2a 20 50 34 20 69 73 20 61 20 70  and.** P4 is a p
2b630 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75  ointer to the Fu
2b640 6e 63 44 65 66 20 66 6f 72 20 74 68 69 73 20 66  ncDef for this f
2b650 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 50 32  unction.  The P2
2b660 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20  .** argument is 
2b670 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 69 73  not used by this
2b680 20 6f 70 63 6f 64 65 2e 20 20 49 74 20 69 73 20   opcode.  It is 
2b690 6f 6e 6c 79 20 74 68 65 72 65 20 74 6f 20 64 69  only there to di
2b6a0 73 61 6d 62 69 67 75 61 74 65 0a 2a 2a 20 66 75  sambiguate.** fu
2b6b0 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 63 61 6e  nctions that can
2b6c0 20 74 61 6b 65 20 76 61 72 79 69 6e 67 20 6e 75   take varying nu
2b6d0 6d 62 65 72 73 20 6f 66 20 61 72 67 75 6d 65 6e  mbers of argumen
2b6e0 74 73 2e 20 20 54 68 65 0a 2a 2a 20 50 34 20 61  ts.  The.** P4 a
2b6f0 72 67 75 6d 65 6e 74 20 69 73 20 6f 6e 6c 79 20  rgument is only 
2b700 6e 65 65 64 65 64 20 66 6f 72 20 74 68 65 20 64  needed for the d
2b710 65 67 65 6e 65 72 61 74 65 20 63 61 73 65 20 77  egenerate case w
2b720 68 65 72 65 0a 2a 2a 20 74 68 65 20 73 74 65 70  here.** the step
2b730 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 6e 6f   function was no
2b740 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  t previously cal
2b750 6c 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  led..*/.case OP_
2b760 41 67 67 46 69 6e 61 6c 3a 20 7b 0a 20 20 4d 65  AggFinal: {.  Me
2b770 6d 20 2a 70 4d 65 6d 3b 0a 20 20 61 73 73 65 72  m *pMem;.  asser
2b780 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20  t( pOp->p1>0 && 
2b790 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p1<=p->nMem
2b7a0 20 29 3b 0a 20 20 70 4d 65 6d 20 3d 20 26 61 4d   );.  pMem = &aM
2b7b0 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  em[pOp->p1];.  a
2b7c0 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c  ssert( (pMem->fl
2b7d0 61 67 73 20 26 20 7e 28 4d 45 4d 5f 4e 75 6c 6c  ags & ~(MEM_Null
2b7e0 7c 4d 45 4d 5f 41 67 67 29 29 3d 3d 30 20 29 3b  |MEM_Agg))==0 );
2b7f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
2b800 64 62 65 4d 65 6d 46 69 6e 61 6c 69 7a 65 28 70  dbeMemFinalize(p
2b810 4d 65 6d 2c 20 70 4f 70 2d 3e 70 34 2e 70 46 75  Mem, pOp->p4.pFu
2b820 6e 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  nc);.  if( rc ){
2b830 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
2b840 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
2b850 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c  g, db, "%s", sql
2b860 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
2b870 70 4d 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 73 71  pMem));.  }.  sq
2b880 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45  lite3VdbeChangeE
2b890 6e 63 6f 64 69 6e 67 28 70 4d 65 6d 2c 20 65 6e  ncoding(pMem, en
2b8a0 63 6f 64 69 6e 67 29 3b 0a 20 20 55 50 44 41 54  coding);.  UPDAT
2b8b0 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70  E_MAX_BLOBSIZE(p
2b8c0 4d 65 6d 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  Mem);.  if( sqli
2b8d0 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67  te3VdbeMemTooBig
2b8e0 28 70 4d 65 6d 29 20 29 7b 0a 20 20 20 20 67 6f  (pMem) ){.    go
2b8f0 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a  to too_big;.  }.
2b900 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e    break;.}..#ifn
2b910 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b920 57 41 4c 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  WAL./* Opcode: C
2b930 68 65 63 6b 70 6f 69 6e 74 20 50 31 20 50 32 20  heckpoint P1 P2 
2b940 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 65  P3 * *.**.** Che
2b950 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65  ckpoint database
2b960 20 50 31 2e 20 54 68 69 73 20 69 73 20 61 20 6e   P1. This is a n
2b970 6f 2d 6f 70 20 69 66 20 50 31 20 69 73 20 6e 6f  o-op if P1 is no
2b980 74 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a  t currently in.*
2b990 2a 20 57 41 4c 20 6d 6f 64 65 2e 20 50 61 72 61  * WAL mode. Para
2b9a0 6d 65 74 65 72 20 50 32 20 69 73 20 6f 6e 65 20  meter P2 is one 
2b9b0 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  of SQLITE_CHECKP
2b9c0 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55  OINT_PASSIVE, FU
2b9d0 4c 4c 0a 2a 2a 20 6f 72 20 52 45 53 54 41 52 54  LL.** or RESTART
2b9e0 2e 20 20 57 72 69 74 65 20 31 20 6f 72 20 30 20  .  Write 1 or 0 
2b9f0 69 6e 74 6f 20 6d 65 6d 5b 50 33 5d 20 69 66 20  into mem[P3] if 
2ba00 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 72  the checkpoint r
2ba10 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45  eturns.** SQLITE
2ba20 5f 42 55 53 59 20 6f 72 20 6e 6f 74 2c 20 72 65  _BUSY or not, re
2ba30 73 70 65 63 74 69 76 65 6c 79 2e 20 20 57 72 69  spectively.  Wri
2ba40 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
2ba50 20 70 61 67 65 73 20 69 6e 20 74 68 65 0a 2a 2a   pages in the.**
2ba60 20 57 41 4c 20 61 66 74 65 72 20 74 68 65 20 63   WAL after the c
2ba70 68 65 63 6b 70 6f 69 6e 74 20 69 6e 74 6f 20 6d  heckpoint into m
2ba80 65 6d 5b 50 33 2b 31 5d 20 61 6e 64 20 74 68 65  em[P3+1] and the
2ba90 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
2baa0 0a 2a 2a 20 69 6e 20 74 68 65 20 57 41 4c 20 74  .** in the WAL t
2bab0 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 63 68  hat have been ch
2bac0 65 63 6b 70 6f 69 6e 74 65 64 20 61 66 74 65 72  eckpointed after
2bad0 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 0a   the checkpoint.
2bae0 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 20 69 6e 74  ** completes int
2baf0 6f 20 6d 65 6d 5b 50 33 2b 32 5d 2e 20 20 48 6f  o mem[P3+2].  Ho
2bb00 77 65 76 65 72 20 6f 6e 20 61 6e 20 65 72 72 6f  wever on an erro
2bb10 72 2c 20 6d 65 6d 5b 50 33 2b 31 5d 20 61 6e 64  r, mem[P3+1] and
2bb20 0a 2a 2a 20 6d 65 6d 5b 50 33 2b 32 5d 20 61 72  .** mem[P3+2] ar
2bb30 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
2bb40 20 2d 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   -1..*/.case OP_
2bb50 43 68 65 63 6b 70 6f 69 6e 74 3a 20 7b 0a 20 20  Checkpoint: {.  
2bb60 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
2bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb80 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2bb90 2a 2f 0a 20 20 69 6e 74 20 61 52 65 73 5b 33 5d  */.  int aRes[3]
2bba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2bbb0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
2bbc0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 20  */.  Mem *pMem; 
2bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbe0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
2bbf0 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 0a 20  sults here */.. 
2bc00 20 61 52 65 73 5b 30 5d 20 3d 20 30 3b 0a 20 20   aRes[0] = 0;.  
2bc10 61 52 65 73 5b 31 5d 20 3d 20 61 52 65 73 5b 32  aRes[1] = aRes[2
2bc20 5d 20 3d 20 2d 31 3b 0a 20 20 61 73 73 65 72 74  ] = -1;.  assert
2bc30 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54  ( pOp->p2==SQLIT
2bc40 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
2bc50 53 49 56 45 0a 20 20 20 20 20 20 20 7c 7c 20 70  SIVE.       || p
2bc60 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43  Op->p2==SQLITE_C
2bc70 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 0a 20  HECKPOINT_FULL. 
2bc80 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 32        || pOp->p2
2bc90 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ==SQLITE_CHECKPO
2bca0 49 4e 54 5f 52 45 53 54 41 52 54 0a 20 20 29 3b  INT_RESTART.  );
2bcb0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43  .  rc = sqlite3C
2bcc0 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 70 4f  heckpoint(db, pO
2bcd0 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20  p->p1, pOp->p2, 
2bce0 26 61 52 65 73 5b 31 5d 2c 20 26 61 52 65 73 5b  &aRes[1], &aRes[
2bcf0 32 5d 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  2]);.  if( rc==S
2bd00 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
2bd10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2bd20 3b 0a 20 20 20 20 61 52 65 73 5b 30 5d 20 3d 20  ;.    aRes[0] = 
2bd30 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  1;.  }.  for(i=0
2bd40 2c 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70  , pMem = &aMem[p
2bd50 4f 70 2d 3e 70 33 5d 3b 20 69 3c 33 3b 20 69 2b  Op->p3]; i<3; i+
2bd60 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20  +, pMem++){.    
2bd70 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
2bd80 74 49 6e 74 36 34 28 70 4d 65 6d 2c 20 28 69 36  tInt64(pMem, (i6
2bd90 34 29 61 52 65 73 5b 69 5d 29 3b 0a 20 20 7d 20  4)aRes[i]);.  } 
2bda0 20 20 20 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 20     .  break;.}; 
2bdb0 20 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65   .#endif..#ifnde
2bdc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
2bdd0 41 47 4d 41 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  AGMA./* Opcode: 
2bde0 4a 6f 75 72 6e 61 6c 4d 6f 64 65 20 50 31 20 50  JournalMode P1 P
2bdf0 32 20 50 33 20 2a 20 50 35 0a 2a 2a 0a 2a 2a 20  2 P3 * P5.**.** 
2be00 43 68 61 6e 67 65 20 74 68 65 20 6a 6f 75 72 6e  Change the journ
2be10 61 6c 20 6d 6f 64 65 20 6f 66 20 64 61 74 61 62  al mode of datab
2be20 61 73 65 20 50 31 20 74 6f 20 50 33 2e 20 50 33  ase P1 to P3. P3
2be30 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
2be40 74 68 65 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55  the.** PAGER_JOU
2be50 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 76 61 6c  RNALMODE_XXX val
2be60 75 65 73 2e 20 49 66 20 63 68 61 6e 67 69 6e 67  ues. If changing
2be70 20 62 65 74 77 65 65 6e 20 74 68 65 20 76 61 72   between the var
2be80 69 6f 75 73 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  ious rollback.**
2be90 20 6d 6f 64 65 73 20 28 64 65 6c 65 74 65 2c 20   modes (delete, 
2bea0 74 72 75 6e 63 61 74 65 2c 20 70 65 72 73 69 73  truncate, persis
2beb0 74 2c 20 6f 66 66 20 61 6e 64 20 6d 65 6d 6f 72  t, off and memor
2bec0 79 29 2c 20 74 68 69 73 20 69 73 20 61 20 73 69  y), this is a si
2bed0 6d 70 6c 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  mple.** operatio
2bee0 6e 2e 20 4e 6f 20 49 4f 20 69 73 20 72 65 71 75  n. No IO is requ
2bef0 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63  ired..**.** If c
2bf00 68 61 6e 67 69 6e 67 20 69 6e 74 6f 20 6f 72 20  hanging into or 
2bf10 6f 75 74 20 6f 66 20 57 41 4c 20 6d 6f 64 65 20  out of WAL mode 
2bf20 74 68 65 20 70 72 6f 63 65 64 75 72 65 20 69 73  the procedure is
2bf30 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65   more complicate
2bf40 64 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61  d..**.** Write a
2bf50 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
2bf60 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 6a 6f 75  ng the final jou
2bf70 72 6e 61 6c 2d 6d 6f 64 65 20 74 6f 20 72 65 67  rnal-mode to reg
2bf80 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73  ister P2..*/.cas
2bf90 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65  e OP_JournalMode
2bfa0 3a 20 7b 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70  : {    /* out2-p
2bfb0 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 42  rerelease */.  B
2bfc0 74 72 65 65 20 2a 70 42 74 3b 20 20 20 20 20 20  tree *pBt;      
2bfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bfe0 2a 20 42 74 72 65 65 20 74 6f 20 63 68 61 6e 67  * Btree to chang
2bff0 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6f  e journal mode o
2c000 66 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50  f */.  Pager *pP
2c010 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
2c020 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
2c030 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2c040 70 42 74 20 2a 2f 0a 20 20 69 6e 74 20 65 4e 65  pBt */.  int eNe
2c050 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
2c060 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
2c070 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a  journal mode */.
2c080 20 20 69 6e 74 20 65 4f 6c 64 3b 20 20 20 20 20    int eOld;     
2c090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0a0 20 20 2f 2a 20 54 68 65 20 6f 6c 64 20 6a 6f 75    /* The old jou
2c0b0 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 23 69 66  rnal mode */.#if
2c0c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2c0d0 5f 57 41 4c 0a 20 20 63 6f 6e 73 74 20 63 68 61  _WAL.  const cha
2c0e0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
2c0f0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2c100 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2c110 66 6f 72 20 70 50 61 67 65 72 20 2a 2f 0a 23 65  for pPager */.#e
2c120 6e 64 69 66 0a 0a 20 20 65 4e 65 77 20 3d 20 70  ndif..  eNew = p
2c130 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72 74  Op->p3;.  assert
2c140 28 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f  ( eNew==PAGER_JO
2c150 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
2c160 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77   .       || eNew
2c170 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2c180 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 0a 20 20  ODE_TRUNCATE .  
2c190 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41       || eNew==PA
2c1a0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2c1b0 50 45 52 53 49 53 54 20 0a 20 20 20 20 20 20 20  PERSIST .       
2c1c0 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a  || eNew==PAGER_J
2c1d0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 20  OURNALMODE_OFF. 
2c1e0 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50        || eNew==P
2c1f0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2c200 5f 4d 45 4d 4f 52 59 0a 20 20 20 20 20 20 20 7c  _MEMORY.       |
2c210 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f  | eNew==PAGER_JO
2c220 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 20 20  URNALMODE_WAL.  
2c230 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41       || eNew==PA
2c240 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2c250 51 55 45 52 59 0a 20 20 29 3b 0a 20 20 61 73 73  QUERY.  );.  ass
2c260 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
2c270 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e  && pOp->p1<db->n
2c280 44 62 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20 64  Db );..  pBt = d
2c290 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e  b->aDb[pOp->p1].
2c2a0 70 42 74 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  pBt;.  pPager = 
2c2b0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
2c2c0 72 28 70 42 74 29 3b 0a 20 20 65 4f 6c 64 20 3d  r(pBt);.  eOld =
2c2d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2c2e0 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67  JournalMode(pPag
2c2f0 65 72 29 3b 0a 20 20 69 66 28 20 65 4e 65 77 3d  er);.  if( eNew=
2c300 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2c310 44 45 5f 51 55 45 52 59 20 29 20 65 4e 65 77 20  DE_QUERY ) eNew 
2c320 3d 20 65 4f 6c 64 3b 0a 20 20 69 66 28 20 21 73  = eOld;.  if( !s
2c330 71 6c 69 74 65 33 50 61 67 65 72 4f 6b 54 6f 43  qlite3PagerOkToC
2c340 68 61 6e 67 65 4a 6f 75 72 6e 61 6c 4d 6f 64 65  hangeJournalMode
2c350 28 70 50 61 67 65 72 29 20 29 20 65 4e 65 77 20  (pPager) ) eNew 
2c360 3d 20 65 4f 6c 64 3b 0a 0a 23 69 66 6e 64 65 66  = eOld;..#ifndef
2c370 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
2c380 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73  .  zFilename = s
2c390 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
2c3a0 61 6d 65 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ame(pPager, 1);.
2c3b0 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c  .  /* Do not all
2c3c0 6f 77 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 20  ow a transition 
2c3d0 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  to journal_mode=
2c3e0 57 41 4c 20 66 6f 72 20 61 20 64 61 74 61 62 61  WAL for a databa
2c3f0 73 65 0a 20 20 2a 2a 20 69 6e 20 74 65 6d 70 6f  se.  ** in tempo
2c400 72 61 72 79 20 73 74 6f 72 61 67 65 20 6f 72 20  rary storage or 
2c410 69 66 20 74 68 65 20 56 46 53 20 64 6f 65 73 20  if the VFS does 
2c420 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72  not support shar
2c430 65 64 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2f 0a  ed memory .  */.
2c440 20 20 69 66 28 20 65 4e 65 77 3d 3d 50 41 47 45    if( eNew==PAGE
2c450 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
2c460 4c 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33  L.   && (sqlite3
2c470 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
2c480 6d 65 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20  me)==0          
2c490 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 20 2a 2f   /* Temp file */
2c4a0 0a 20 20 20 20 20 20 20 7c 7c 20 21 73 71 6c 69  .       || !sqli
2c4b0 74 65 33 50 61 67 65 72 57 61 6c 53 75 70 70 6f  te3PagerWalSuppo
2c4c0 72 74 65 64 28 70 50 61 67 65 72 29 29 20 20 20  rted(pPager))   
2c4d0 2f 2a 20 4e 6f 20 73 68 61 72 65 64 2d 6d 65 6d  /* No shared-mem
2c4e0 6f 72 79 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20  ory support */. 
2c4f0 20 29 7b 0a 20 20 20 20 65 4e 65 77 20 3d 20 65   ){.    eNew = e
2c500 4f 6c 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  Old;.  }..  if( 
2c510 28 65 4e 65 77 21 3d 65 4f 6c 64 29 0a 20 20 20  (eNew!=eOld).   
2c520 26 26 20 28 65 4f 6c 64 3d 3d 50 41 47 45 52 5f  && (eOld==PAGER_
2c530 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
2c540 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a  || eNew==PAGER_J
2c550 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
2c560 20 20 29 7b 0a 20 20 20 20 69 66 28 20 21 64 62    ){.    if( !db
2c570 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 7c 7c 20  ->autoCommit || 
2c580 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
2c590 74 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20  t>1 ){.      rc 
2c5a0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2c5b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
2c5c0 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
2c5d0 73 67 2c 20 64 62 2c 20 0a 20 20 20 20 20 20 20  sg, db, .       
2c5e0 20 20 20 22 63 61 6e 6e 6f 74 20 63 68 61 6e 67     "cannot chang
2c5f0 65 20 25 73 20 77 61 6c 20 6d 6f 64 65 20 66 72  e %s wal mode fr
2c600 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  om within a tran
2c610 73 61 63 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20  saction",.      
2c620 20 20 20 20 28 65 4e 65 77 3d 3d 50 41 47 45 52      (eNew==PAGER
2c630 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2c640 20 3f 20 22 69 6e 74 6f 22 20 3a 20 22 6f 75 74   ? "into" : "out
2c650 20 6f 66 22 29 0a 20 20 20 20 20 20 29 3b 0a 20   of").      );. 
2c660 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2c670 7d 65 6c 73 65 7b 0a 20 0a 20 20 20 20 20 20 69  }else{. .      i
2c680 66 28 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a  f( eOld==PAGER_J
2c690 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29  OURNALMODE_WAL )
2c6a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
2c6b0 6c 65 61 76 69 6e 67 20 57 41 4c 20 6d 6f 64 65  leaving WAL mode
2c6c0 2c 20 63 6c 6f 73 65 20 74 68 65 20 6c 6f 67 20  , close the log 
2c6d0 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
2c6e0 66 75 6c 2c 20 74 68 65 20 63 61 6c 6c 0a 20 20  ful, the call.  
2c6f0 20 20 20 20 20 20 2a 2a 20 74 6f 20 50 61 67 65        ** to Page
2c700 72 43 6c 6f 73 65 57 61 6c 28 29 20 63 68 65 63  rCloseWal() chec
2c710 6b 70 6f 69 6e 74 73 20 61 6e 64 20 64 65 6c 65  kpoints and dele
2c720 74 65 73 20 74 68 65 20 77 72 69 74 65 2d 61 68  tes the write-ah
2c730 65 61 64 2d 6c 6f 67 20 0a 20 20 20 20 20 20 20  ead-log .       
2c740 20 2a 2a 20 66 69 6c 65 2e 20 41 6e 20 45 58 43   ** file. An EXC
2c750 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6d 61 79 20  LUSIVE lock may 
2c760 73 74 69 6c 6c 20 62 65 20 68 65 6c 64 20 6f 6e  still be held on
2c770 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c780 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  le .        ** a
2c790 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
2c7a0 6c 20 72 65 74 75 72 6e 2e 20 0a 20 20 20 20 20  l return. .     
2c7b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
2c7c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
2c7d0 6c 6f 73 65 57 61 6c 28 70 50 61 67 65 72 29 3b  loseWal(pPager);
2c7e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2c7f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c800 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
2c810 61 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f  agerSetJournalMo
2c820 64 65 28 70 50 61 67 65 72 2c 20 65 4e 65 77 29  de(pPager, eNew)
2c830 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c840 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 6c 64    }else if( eOld
2c850 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2c860 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
2c870 20 20 20 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20        /* Cannot 
2c880 74 72 61 6e 73 69 74 69 6f 6e 20 64 69 72 65 63  transition direc
2c890 74 6c 79 20 66 72 6f 6d 20 4d 45 4d 4f 52 59 20  tly from MEMORY 
2c8a0 74 6f 20 57 41 4c 2e 20 20 55 73 65 20 6d 6f 64  to WAL.  Use mod
2c8b0 65 20 4f 46 46 0a 20 20 20 20 20 20 20 20 2a 2a  e OFF.        **
2c8c0 20 61 73 20 61 6e 20 69 6e 74 65 72 6d 65 64 69   as an intermedi
2c8d0 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  ate */.        s
2c8e0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4a 6f  qlite3PagerSetJo
2c8f0 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72  urnalMode(pPager
2c900 2c 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  , PAGER_JOURNALM
2c910 4f 44 45 5f 4f 46 46 29 3b 0a 20 20 20 20 20 20  ODE_OFF);.      
2c920 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70  }.  .      /* Op
2c930 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
2c940 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2c950 20 66 69 6c 65 2e 20 52 65 67 61 72 64 6c 65 73   file. Regardles
2c960 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
2c970 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20  .      ** mode, 
2c980 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
2c990 20 61 6c 77 61 79 73 20 75 73 65 73 20 61 20 72   always uses a r
2c9a0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
2c9b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2c9c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2c9d0 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
2c9e0 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  t)==0 );.      i
2c9f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ca00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2ca10 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
2ca20 56 65 72 73 69 6f 6e 28 70 42 74 2c 20 28 65 4e  Version(pBt, (eN
2ca30 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ew==PAGER_JOURNA
2ca40 4c 4d 4f 44 45 5f 57 41 4c 20 3f 20 32 20 3a 20  LMODE_WAL ? 2 : 
2ca50 31 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  1));.      }.   
2ca60 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
2ca70 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
2ca80 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 20 20 69 66  MIT_WAL */..  if
2ca90 28 20 72 63 20 29 7b 0a 20 20 20 20 65 4e 65 77  ( rc ){.    eNew
2caa0 20 3d 20 65 4f 6c 64 3b 0a 20 20 7d 0a 20 20 65   = eOld;.  }.  e
2cab0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 61 67  New = sqlite3Pag
2cac0 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65  erSetJournalMode
2cad0 28 70 50 61 67 65 72 2c 20 65 4e 65 77 29 3b 0a  (pPager, eNew);.
2cae0 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
2caf0 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75 74  pOp->p2];.  pOut
2cb00 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
2cb10 72 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d  r|MEM_Static|MEM
2cb20 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e 7a  _Term;.  pOut->z
2cb30 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
2cb40 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e 61 6d  e3JournalModenam
2cb50 65 28 65 4e 65 77 29 3b 0a 20 20 70 4f 75 74 2d  e(eNew);.  pOut-
2cb60 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
2cb70 65 6e 33 30 28 70 4f 75 74 2d 3e 7a 29 3b 0a 20  en30(pOut->z);. 
2cb80 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 53 51 4c   pOut->enc = SQL
2cb90 49 54 45 5f 55 54 46 38 3b 0a 20 20 73 71 6c 69  ITE_UTF8;.  sqli
2cba0 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
2cbb0 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65 6e 63 6f  oding(pOut, enco
2cbc0 64 69 6e 67 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  ding);.  break;.
2cbd0 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  };.#endif /* SQL
2cbe0 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 20  ITE_OMIT_PRAGMA 
2cbf0 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
2cc00 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
2cc10 55 55 4d 29 20 26 26 20 21 64 65 66 69 6e 65 64  UUM) && !defined
2cc20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54  (SQLITE_OMIT_ATT
2cc30 41 43 48 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ACH)./* Opcode: 
2cc40 56 61 63 75 75 6d 20 2a 20 2a 20 2a 20 2a 20 2a  Vacuum * * * * *
2cc50 0a 2a 2a 0a 2a 2a 20 56 61 63 75 75 6d 20 74 68  .**.** Vacuum th
2cc60 65 20 65 6e 74 69 72 65 20 64 61 74 61 62 61 73  e entire databas
2cc70 65 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20  e.  This opcode 
2cc80 77 69 6c 6c 20 63 61 75 73 65 20 6f 74 68 65 72  will cause other
2cc90 20 76 69 72 74 75 61 6c 0a 2a 2a 20 6d 61 63 68   virtual.** mach
2cca0 69 6e 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ines to be creat
2ccb0 65 64 20 61 6e 64 20 72 75 6e 2e 20 20 49 74 20  ed and run.  It 
2ccc0 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  may not be calle
2ccd0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a  d from within.**
2cce0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
2ccf0 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 61 63 75 75  */.case OP_Vacuu
2cd00 6d 3a 20 7b 0a 20 20 72 63 20 3d 20 73 71 6c 69  m: {.  rc = sqli
2cd10 74 65 33 52 75 6e 56 61 63 75 75 6d 28 26 70 2d  te3RunVacuum(&p-
2cd20 3e 7a 45 72 72 4d 73 67 2c 20 64 62 29 3b 0a 20  >zErrMsg, db);. 
2cd30 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
2cd40 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
2cd50 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2cd60 41 43 55 55 4d 29 0a 2f 2a 20 4f 70 63 6f 64 65  ACUUM)./* Opcode
2cd70 3a 20 49 6e 63 72 56 61 63 75 75 6d 20 50 31 20  : IncrVacuum P1 
2cd80 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50  P2 * * *.**.** P
2cd90 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
2cda0 73 74 65 70 20 6f 66 20 74 68 65 20 69 6e 63 72  step of the incr
2cdb0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 70  emental vacuum p
2cdc0 72 6f 63 65 64 75 72 65 20 6f 6e 0a 2a 2a 20 74  rocedure on.** t
2cdd0 68 65 20 50 31 20 64 61 74 61 62 61 73 65 2e 20  he P1 database. 
2cde0 49 66 20 74 68 65 20 76 61 63 75 75 6d 20 68 61  If the vacuum ha
2cdf0 73 20 66 69 6e 69 73 68 65 64 2c 20 6a 75 6d 70  s finished, jump
2ce00 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a   to instruction.
2ce10 2a 2a 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65  ** P2. Otherwise
2ce20 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  , fall through t
2ce30 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
2ce40 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  uction..*/.case 
2ce50 4f 50 5f 49 6e 63 72 56 61 63 75 75 6d 3a 20 7b  OP_IncrVacuum: {
2ce60 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
2ce70 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  */.  Btree *pBt;
2ce80 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
2ce90 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
2cea0 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  1<db->nDb );.  a
2ceb0 73 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65  ssert( (p->btree
2cec0 4d 61 73 6b 20 26 20 28 28 28 79 44 62 4d 61 73  Mask & (((yDbMas
2ced0 6b 29 31 29 3c 3c 70 4f 70 2d 3e 70 31 29 29 21  k)1)<<pOp->p1))!
2cee0 3d 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 64 62  =0 );.  pBt = db
2cef0 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70  ->aDb[pOp->p1].p
2cf00 42 74 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  Bt;.  rc = sqlit
2cf10 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
2cf20 6d 28 70 42 74 29 3b 0a 20 20 69 66 28 20 72 63  m(pBt);.  if( rc
2cf30 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
2cf40 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70  .    pc = pOp->p
2cf50 32 20 2d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20  2 - 1;.    rc = 
2cf60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
2cf70 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
2cf80 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 78 70  ../* Opcode: Exp
2cf90 69 72 65 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a  ire P1 * * * *.*
2cfa0 2a 0a 2a 2a 20 43 61 75 73 65 20 70 72 65 63 6f  *.** Cause preco
2cfb0 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
2cfc0 73 20 74 6f 20 62 65 63 6f 6d 65 20 65 78 70 69  s to become expi
2cfd0 72 65 64 2e 20 41 6e 20 65 78 70 69 72 65 64 20  red. An expired 
2cfe0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 66 61 69  statement.** fai
2cff0 6c 73 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ls with an error
2d000 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f   code of SQLITE_
2d010 53 43 48 45 4d 41 20 69 66 20 69 74 20 69 73 20  SCHEMA if it is 
2d020 65 76 65 72 20 65 78 65 63 75 74 65 64 20 0a 2a  ever executed .*
2d030 2a 20 28 76 69 61 20 73 71 6c 69 74 65 33 5f 73  * (via sqlite3_s
2d040 74 65 70 28 29 29 2e 0a 2a 2a 20 0a 2a 2a 20 49  tep())..** .** I
2d050 66 20 50 31 20 69 73 20 30 2c 20 74 68 65 6e 20  f P1 is 0, then 
2d060 61 6c 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  all SQL statemen
2d070 74 73 20 62 65 63 6f 6d 65 20 65 78 70 69 72 65  ts become expire
2d080 64 2e 20 49 66 20 50 31 20 69 73 20 6e 6f 6e 2d  d. If P1 is non-
2d090 7a 65 72 6f 2c 0a 2a 2a 20 74 68 65 6e 20 6f 6e  zero,.** then on
2d0a0 6c 79 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  ly the currently
2d0b0 20 65 78 65 63 75 74 69 6e 67 20 73 74 61 74 65   executing state
2d0c0 6d 65 6e 74 20 69 73 20 61 66 66 65 63 74 65 64  ment is affected
2d0d0 2e 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 78  . .*/.case OP_Ex
2d0e0 70 69 72 65 3a 20 7b 0a 20 20 69 66 28 20 21 70  pire: {.  if( !p
2d0f0 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 73 71  Op->p1 ){.    sq
2d100 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
2d110 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
2d120 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2d130 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a  p->expired = 1;.
2d140 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
2d150 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d160 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
2d170 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 61 62 6c  ./* Opcode: Tabl
2d180 65 4c 6f 63 6b 20 50 31 20 50 32 20 50 33 20 50  eLock P1 P2 P3 P
2d190 34 20 2a 0a 2a 2a 0a 2a 2a 20 4f 62 74 61 69 6e  4 *.**.** Obtain
2d1a0 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 70 61 72   a lock on a par
2d1b0 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 54  ticular table. T
2d1c0 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
2d1d0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  is only used whe
2d1e0 6e 0a 2a 2a 20 74 68 65 20 73 68 61 72 65 64 2d  n.** the shared-
2d1f0 63 61 63 68 65 20 66 65 61 74 75 72 65 20 69 73  cache feature is
2d200 20 65 6e 61 62 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a   enabled. .**.**
2d210 20 50 31 20 69 73 20 74 68 65 20 69 6e 64 65 78   P1 is the index
2d220 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2d230 20 69 6e 20 73 71 6c 69 74 65 33 2e 61 44 62 5b   in sqlite3.aDb[
2d240 5d 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  ] of the databas
2d250 65 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20 74 68  e.** on which th
2d260 65 20 6c 6f 63 6b 20 69 73 20 61 63 71 75 69 72  e lock is acquir
2d270 65 64 2e 20 20 41 20 72 65 61 64 6c 6f 63 6b 20  ed.  A readlock 
2d280 69 73 20 6f 62 74 61 69 6e 65 64 20 69 66 20 50  is obtained if P
2d290 33 3d 3d 30 20 6f 72 0a 2a 2a 20 61 20 77 72 69  3==0 or.** a wri
2d2a0 74 65 20 6c 6f 63 6b 20 69 66 20 50 33 3d 3d 31  te lock if P3==1
2d2b0 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 63 6f 6e 74 61  ..**.** P2 conta
2d2c0 69 6e 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  ins the root-pag
2d2d0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
2d2e0 6f 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 50 34  o lock..**.** P4
2d2f0 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
2d300 74 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  ter to the name 
2d310 6f 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  of the table bei
2d320 6e 67 20 6c 6f 63 6b 65 64 2e 20 54 68 69 73 20  ng locked. This 
2d330 69 73 20 6f 6e 6c 79 0a 2a 2a 20 75 73 65 64 20  is only.** used 
2d340 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65  to generate an e
2d350 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20  rror message if 
2d360 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  the lock cannot 
2d370 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a  be obtained..*/.
2d380 63 61 73 65 20 4f 50 5f 54 61 62 6c 65 4c 6f 63  case OP_TableLoc
2d390 6b 3a 20 7b 0a 20 20 75 38 20 69 73 57 72 69 74  k: {.  u8 isWrit
2d3a0 65 4c 6f 63 6b 20 3d 20 28 75 38 29 70 4f 70 2d  eLock = (u8)pOp-
2d3b0 3e 70 33 3b 0a 20 20 69 66 28 20 69 73 57 72 69  >p3;.  if( isWri
2d3c0 74 65 4c 6f 63 6b 20 7c 7c 20 30 3d 3d 28 64 62  teLock || 0==(db
2d3d0 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
2d3e0 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20  eadUncommitted) 
2d3f0 29 7b 0a 20 20 20 20 69 6e 74 20 70 31 20 3d 20  ){.    int p1 = 
2d400 70 4f 70 2d 3e 70 31 3b 20 0a 20 20 20 20 61 73  pOp->p1; .    as
2d410 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
2d420 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  1<db->nDb );.   
2d430 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74 72   assert( (p->btr
2d440 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44 62 4d  eeMask & (((yDbM
2d450 61 73 6b 29 31 29 3c 3c 70 31 29 29 21 3d 30 20  ask)1)<<p1))!=0 
2d460 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
2d470 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 30 20 7c 7c  sWriteLock==0 ||
2d480 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 31 20   isWriteLock==1 
2d490 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2d4a0 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c  te3BtreeLockTabl
2d4b0 65 28 64 62 2d 3e 61 44 62 5b 70 31 5d 2e 70 42  e(db->aDb[p1].pB
2d4c0 74 2c 20 70 4f 70 2d 3e 70 32 2c 20 69 73 57 72  t, pOp->p2, isWr
2d4d0 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  iteLock);.    if
2d4e0 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
2d4f0 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  ITE_LOCKED ){.  
2d500 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2d510 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  z = pOp->p4.z;. 
2d520 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53       sqlite3SetS
2d530 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
2d540 67 2c 20 64 62 2c 20 22 64 61 74 61 62 61 73 65  g, db, "database
2d550 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64   table is locked
2d560 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 7d  : %s", z);.    }
2d570 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
2d580 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2d590 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2d5a0 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2d5b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2d5c0 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64  ALTABLE./* Opcod
2d5d0 65 3a 20 56 42 65 67 69 6e 20 2a 20 2a 20 2a 20  e: VBegin * * * 
2d5e0 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61  P4 *.**.** P4 ma
2d5f0 79 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  y be a pointer t
2d600 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61  o an sqlite3_vta
2d610 62 20 73 74 72 75 63 74 75 72 65 2e 20 49 66 20  b structure. If 
2d620 73 6f 2c 20 63 61 6c 6c 20 74 68 65 20 0a 2a 2a  so, call the .**
2d630 20 78 42 65 67 69 6e 20 6d 65 74 68 6f 64 20 66   xBegin method f
2d640 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a  or that table..*
2d650 2a 0a 2a 2a 20 41 6c 73 6f 2c 20 77 68 65 74 68  *.** Also, wheth
2d660 65 72 20 6f 72 20 6e 6f 74 20 50 34 20 69 73 20  er or not P4 is 
2d670 73 65 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20  set, check that 
2d680 74 68 69 73 20 69 73 20 6e 6f 74 20 62 65 69 6e  this is not bein
2d690 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 0a 2a 2a  g called from.**
2d6a0 20 77 69 74 68 69 6e 20 61 20 63 61 6c 6c 62 61   within a callba
2d6b0 63 6b 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20  ck to a virtual 
2d6c0 74 61 62 6c 65 20 78 53 79 6e 63 28 29 20 6d 65  table xSync() me
2d6d0 74 68 6f 64 2e 20 49 66 20 69 74 20 69 73 2c 20  thod. If it is, 
2d6e0 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
2d6f0 65 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  e will be set to
2d700 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
2d710 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 42 65 67 69  */.case OP_VBegi
2d720 6e 3a 20 7b 0a 20 20 56 54 61 62 6c 65 20 2a 70  n: {.  VTable *p
2d730 56 54 61 62 3b 0a 20 20 70 56 54 61 62 20 3d 20  VTab;.  pVTab = 
2d740 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20  pOp->p4.pVtab;. 
2d750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
2d760 62 42 65 67 69 6e 28 64 62 2c 20 70 56 54 61 62  bBegin(db, pVTab
2d770 29 3b 0a 20 20 69 66 28 20 70 56 54 61 62 20 29  );.  if( pVTab )
2d780 20 69 6d 70 6f 72 74 56 74 61 62 45 72 72 4d 73   importVtabErrMs
2d790 67 28 70 2c 20 70 56 54 61 62 2d 3e 70 56 74 61  g(p, pVTab->pVta
2d7a0 62 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  b);.  break;.}.#
2d7b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2d7c0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2d7d0 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2d7e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2d7f0 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65  LTABLE./* Opcode
2d800 3a 20 56 43 72 65 61 74 65 20 50 31 20 2a 20 2a  : VCreate P1 * *
2d810 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69   P4 *.**.** P4 i
2d820 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
2d830 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
2d840 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 43 61   database P1. Ca
2d850 6c 6c 20 74 68 65 20 78 43 72 65 61 74 65 20 6d  ll the xCreate m
2d860 65 74 68 6f 64 0a 2a 2a 20 66 6f 72 20 74 68 61  ethod.** for tha
2d870 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65  t table..*/.case
2d880 20 4f 50 5f 56 43 72 65 61 74 65 3a 20 7b 0a 20   OP_VCreate: {. 
2d890 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
2d8a0 62 43 61 6c 6c 43 72 65 61 74 65 28 64 62 2c 20  bCallCreate(db, 
2d8b0 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34  pOp->p1, pOp->p4
2d8c0 2e 7a 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29  .z, &p->zErrMsg)
2d8d0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
2d8e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2d8f0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
2d900 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
2d910 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2d920 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ABLE./* Opcode: 
2d930 56 44 65 73 74 72 6f 79 20 50 31 20 2a 20 2a 20  VDestroy P1 * * 
2d940 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  P4 *.**.** P4 is
2d950 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76   the name of a v
2d960 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20  irtual table in 
2d970 64 61 74 61 62 61 73 65 20 50 31 2e 20 20 43 61  database P1.  Ca
2d980 6c 6c 20 74 68 65 20 78 44 65 73 74 72 6f 79 20  ll the xDestroy 
2d990 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 61  method.** of tha
2d9a0 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65  t table..*/.case
2d9b0 20 4f 50 5f 56 44 65 73 74 72 6f 79 3a 20 7b 0a   OP_VDestroy: {.
2d9c0 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f    p->inVtabMetho
2d9d0 64 20 3d 20 32 3b 0a 20 20 72 63 20 3d 20 73 71  d = 2;.  rc = sq
2d9e0 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 44 65 73  lite3VtabCallDes
2d9f0 74 72 6f 79 28 64 62 2c 20 70 4f 70 2d 3e 70 31  troy(db, pOp->p1
2da00 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
2da10 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
2da20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  = 0;.  break;.}.
2da30 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2da40 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2da50 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  LE */..#ifndef S
2da60 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2da70 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64  ALTABLE./* Opcod
2da80 65 3a 20 56 4f 70 65 6e 20 50 31 20 2a 20 2a 20  e: VOpen P1 * * 
2da90 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  P4 *.**.** P4 is
2daa0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2dab0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62  virtual table ob
2dac0 6a 65 63 74 2c 20 61 6e 20 73 71 6c 69 74 65 33  ject, an sqlite3
2dad0 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e  _vtab structure.
2dae0 0a 2a 2a 20 50 31 20 69 73 20 61 20 63 75 72 73  .** P1 is a curs
2daf0 6f 72 20 6e 75 6d 62 65 72 2e 20 20 54 68 69 73  or number.  This
2db00 20 6f 70 63 6f 64 65 20 6f 70 65 6e 73 20 61 20   opcode opens a 
2db10 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 76 69  cursor to the vi
2db20 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 61  rtual.** table a
2db30 6e 64 20 73 74 6f 72 65 73 20 74 68 61 74 20 63  nd stores that c
2db40 75 72 73 6f 72 20 69 6e 20 50 31 2e 0a 2a 2f 0a  ursor in P1..*/.
2db50 63 61 73 65 20 4f 50 5f 56 4f 70 65 6e 3a 20 7b  case OP_VOpen: {
2db60 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
2db70 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  Cur;.  sqlite3_v
2db80 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
2db90 62 43 75 72 73 6f 72 3b 0a 20 20 73 71 6c 69 74  bCursor;.  sqlit
2dba0 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a  e3_vtab *pVtab;.
2dbb0 20 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65    sqlite3_module
2dbc0 20 2a 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 70 43   *pModule;..  pC
2dbd0 75 72 20 3d 20 30 3b 0a 20 20 70 56 74 61 62 43  ur = 0;.  pVtabC
2dbe0 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 56 74  ursor = 0;.  pVt
2dbf0 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74  ab = pOp->p4.pVt
2dc00 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f  ab->pVtab;.  pMo
2dc10 64 75 6c 65 20 3d 20 28 73 71 6c 69 74 65 33 5f  dule = (sqlite3_
2dc20 6d 6f 64 75 6c 65 20 2a 29 70 56 74 61 62 2d 3e  module *)pVtab->
2dc30 70 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65 72  pModule;.  asser
2dc40 74 28 70 56 74 61 62 20 26 26 20 70 4d 6f 64 75  t(pVtab && pModu
2dc50 6c 65 29 3b 0a 20 20 72 63 20 3d 20 70 4d 6f 64  le);.  rc = pMod
2dc60 75 6c 65 2d 3e 78 4f 70 65 6e 28 70 56 74 61 62  ule->xOpen(pVtab
2dc70 2c 20 26 70 56 74 61 62 43 75 72 73 6f 72 29 3b  , &pVtabCursor);
2dc80 0a 20 20 69 6d 70 6f 72 74 56 74 61 62 45 72 72  .  importVtabErr
2dc90 4d 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20  Msg(p, pVtab);. 
2dca0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
2dcb0 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  rc ){.    /* Ini
2dcc0 74 69 61 6c 69 7a 65 20 73 71 6c 69 74 65 33 5f  tialize sqlite3_
2dcd0 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65  vtab_cursor base
2dce0 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20 20 70 56   class */.    pV
2dcf0 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  tabCursor->pVtab
2dd00 20 3d 20 70 56 74 61 62 3b 0a 0a 20 20 20 20 2f   = pVtab;..    /
2dd10 2a 20 49 6e 69 74 69 61 6c 69 73 65 20 76 64 62  * Initialise vdb
2dd20 65 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  e cursor object 
2dd30 2a 2f 0a 20 20 20 20 70 43 75 72 20 3d 20 61 6c  */.    pCur = al
2dd40 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20  locateCursor(p, 
2dd50 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 2d 31 2c 20  pOp->p1, 0, -1, 
2dd60 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  0);.    if( pCur
2dd70 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
2dd80 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 56  pVtabCursor = pV
2dd90 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  tabCursor;.     
2dda0 20 70 43 75 72 2d 3e 70 4d 6f 64 75 6c 65 20 3d   pCur->pModule =
2ddb0 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56   pVtabCursor->pV
2ddc0 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  tab->pModule;.  
2ddd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
2dde0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2ddf0 3d 20 31 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75  = 1;.      pModu
2de00 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62  le->xClose(pVtab
2de10 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  Cursor);.    }. 
2de20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65   }.  break;.}.#e
2de30 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2de40 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2de50 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
2de60 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2de70 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a  TABLE./* Opcode:
2de80 20 56 46 69 6c 74 65 72 20 50 31 20 50 32 20 50   VFilter P1 P2 P
2de90 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 31 20  3 P4 *.**.** P1 
2dea0 69 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e  is a cursor open
2deb0 65 64 20 75 73 69 6e 67 20 56 4f 70 65 6e 2e 20  ed using VOpen. 
2dec0 20 50 32 20 69 73 20 61 6e 20 61 64 64 72 65 73   P2 is an addres
2ded0 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66 0a  s to jump to if.
2dee0 2a 2a 20 74 68 65 20 66 69 6c 74 65 72 65 64 20  ** the filtered 
2def0 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 65 6d  result set is em
2df00 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  pty..**.** P4 is
2df10 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20   either NULL or 
2df20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 77 61  a string that wa
2df30 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
2df40 68 65 20 78 42 65 73 74 49 6e 64 65 78 0a 2a 2a  he xBestIndex.**
2df50 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 6d   method of the m
2df60 6f 64 75 6c 65 2e 20 20 54 68 65 20 69 6e 74 65  odule.  The inte
2df70 72 70 72 65 74 61 74 69 6f 6e 20 6f 66 20 74 68  rpretation of th
2df80 65 20 50 34 20 73 74 72 69 6e 67 20 69 73 20 6c  e P4 string is l
2df90 65 66 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6d 6f  eft.** to the mo
2dfa0 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  dule implementat
2dfb0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
2dfc0 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74  opcode invokes t
2dfd0 68 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f  he xFilter metho
2dfe0 64 20 6f 6e 20 74 68 65 20 76 69 72 74 75 61 6c  d on the virtual
2dff0 20 74 61 62 6c 65 20 73 70 65 63 69 66 69 65 64   table specified
2e000 0a 2a 2a 20 62 79 20 50 31 2e 20 20 54 68 65 20  .** by P1.  The 
2e010 69 6e 74 65 67 65 72 20 71 75 65 72 79 20 70 6c  integer query pl
2e020 61 6e 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  an parameter to 
2e030 78 46 69 6c 74 65 72 20 69 73 20 73 74 6f 72 65  xFilter is store
2e040 64 20 69 6e 20 72 65 67 69 73 74 65 72 0a 2a 2a  d in register.**
2e050 20 50 33 2e 20 52 65 67 69 73 74 65 72 20 50 33   P3. Register P3
2e060 2b 31 20 73 74 6f 72 65 73 20 74 68 65 20 61 72  +1 stores the ar
2e070 67 63 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  gc parameter to 
2e080 62 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  be passed to the
2e090 0a 2a 2a 20 78 46 69 6c 74 65 72 20 6d 65 74 68  .** xFilter meth
2e0a0 6f 64 2e 20 52 65 67 69 73 74 65 72 73 20 50 33  od. Registers P3
2e0b0 2b 32 2e 2e 50 33 2b 31 2b 61 72 67 63 20 61 72  +2..P3+1+argc ar
2e0c0 65 20 74 68 65 20 61 72 67 63 0a 2a 2a 20 61 64  e the argc.** ad
2e0d0 64 69 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74  ditional paramet
2e0e0 65 72 73 20 77 68 69 63 68 20 61 72 65 20 70 61  ers which are pa
2e0f0 73 73 65 64 20 74 6f 0a 2a 2a 20 78 46 69 6c 74  ssed to.** xFilt
2e100 65 72 20 61 73 20 61 72 67 76 2e 20 52 65 67 69  er as argv. Regi
2e110 73 74 65 72 20 50 33 2b 32 20 62 65 63 6f 6d 65  ster P3+2 become
2e120 73 20 61 72 67 76 5b 30 5d 20 77 68 65 6e 20 70  s argv[0] when p
2e130 61 73 73 65 64 20 74 6f 20 78 46 69 6c 74 65 72  assed to xFilter
2e140 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 69  ..**.** A jump i
2e150 73 20 6d 61 64 65 20 74 6f 20 50 32 20 69 66 20  s made to P2 if 
2e160 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
2e170 66 74 65 72 20 66 69 6c 74 65 72 69 6e 67 20 77  fter filtering w
2e180 6f 75 6c 64 20 62 65 20 65 6d 70 74 79 2e 0a 2a  ould be empty..*
2e190 2f 0a 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65  /.case OP_VFilte
2e1a0 72 3a 20 7b 20 20 20 2f 2a 20 6a 75 6d 70 20 2a  r: {   /* jump *
2e1b0 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20  /.  int nArg;.  
2e1c0 69 6e 74 20 69 51 75 65 72 79 3b 0a 20 20 63 6f  int iQuery;.  co
2e1d0 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
2e1e0 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 4d  le *pModule;.  M
2e1f0 65 6d 20 2a 70 51 75 65 72 79 3b 0a 20 20 4d 65  em *pQuery;.  Me
2e200 6d 20 2a 70 41 72 67 63 3b 0a 20 20 73 71 6c 69  m *pArgc;.  sqli
2e210 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
2e220 2a 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  *pVtabCursor;.  
2e230 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
2e240 74 61 62 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  tab;.  VdbeCurso
2e250 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72  r *pCur;.  int r
2e260 65 73 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  es;.  int i;.  M
2e270 65 6d 20 2a 2a 61 70 41 72 67 3b 0a 0a 20 20 70  em **apArg;..  p
2e280 51 75 65 72 79 20 3d 20 26 61 4d 65 6d 5b 70 4f  Query = &aMem[pO
2e290 70 2d 3e 70 33 5d 3b 0a 20 20 70 41 72 67 63 20  p->p3];.  pArgc 
2e2a0 3d 20 26 70 51 75 65 72 79 5b 31 5d 3b 0a 20 20  = &pQuery[1];.  
2e2b0 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b  pCur = p->apCsr[
2e2c0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
2e2d0 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70  rt( memIsValid(p
2e2e0 51 75 65 72 79 29 20 29 3b 0a 20 20 52 45 47 49  Query) );.  REGI
2e2f0 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
2e300 70 33 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 61  p3, pQuery);.  a
2e310 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 56 74  ssert( pCur->pVt
2e320 61 62 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 56  abCursor );.  pV
2e330 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 75 72  tabCursor = pCur
2e340 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  ->pVtabCursor;. 
2e350 20 70 56 74 61 62 20 3d 20 70 56 74 61 62 43 75   pVtab = pVtabCu
2e360 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70  rsor->pVtab;.  p
2e370 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e  Module = pVtab->
2e380 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 2f 2a 20 47  pModule;..  /* G
2e390 72 61 62 20 74 68 65 20 69 6e 64 65 78 20 6e 75  rab the index nu
2e3a0 6d 62 65 72 20 61 6e 64 20 61 72 67 63 20 70 61  mber and argc pa
2e3b0 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73  rameters */.  as
2e3c0 73 65 72 74 28 20 28 70 51 75 65 72 79 2d 3e 66  sert( (pQuery->f
2e3d0 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 29 21 3d 30  lags&MEM_Int)!=0
2e3e0 20 26 26 20 70 41 72 67 63 2d 3e 66 6c 61 67 73   && pArgc->flags
2e3f0 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 6e  ==MEM_Int );.  n
2e400 41 72 67 20 3d 20 28 69 6e 74 29 70 41 72 67 63  Arg = (int)pArgc
2e410 2d 3e 75 2e 69 3b 0a 20 20 69 51 75 65 72 79 20  ->u.i;.  iQuery 
2e420 3d 20 28 69 6e 74 29 70 51 75 65 72 79 2d 3e 75  = (int)pQuery->u
2e430 2e 69 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65  .i;..  /* Invoke
2e440 20 74 68 65 20 78 46 69 6c 74 65 72 20 6d 65 74   the xFilter met
2e450 68 6f 64 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 72  hod */.  {.    r
2e460 65 73 20 3d 20 30 3b 0a 20 20 20 20 61 70 41 72  es = 0;.    apAr
2e470 67 20 3d 20 70 2d 3e 61 70 41 72 67 3b 0a 20 20  g = p->apArg;.  
2e480 20 20 66 6f 72 28 69 20 3d 20 30 3b 20 69 3c 6e    for(i = 0; i<n
2e490 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
2e4a0 20 61 70 41 72 67 5b 69 5d 20 3d 20 26 70 41 72   apArg[i] = &pAr
2e4b0 67 63 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 73  gc[i+1];.      s
2e4c0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f  qlite3VdbeMemSto
2e4d0 72 65 54 79 70 65 28 61 70 41 72 67 5b 69 5d 29  reType(apArg[i])
2e4e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  ;.    }..    p->
2e4f0 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31  inVtabMethod = 1
2e500 3b 0a 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75  ;.    rc = pModu
2e510 6c 65 2d 3e 78 46 69 6c 74 65 72 28 70 56 74 61  le->xFilter(pVta
2e520 62 43 75 72 73 6f 72 2c 20 69 51 75 65 72 79 2c  bCursor, iQuery,
2e530 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 6e 41 72 67   pOp->p4.z, nArg
2e540 2c 20 61 70 41 72 67 29 3b 0a 20 20 20 20 70 2d  , apArg);.    p-
2e550 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20  >inVtabMethod = 
2e560 30 3b 0a 20 20 20 20 69 6d 70 6f 72 74 56 74 61  0;.    importVta
2e570 62 45 72 72 4d 73 67 28 70 2c 20 70 56 74 61 62  bErrMsg(p, pVtab
2e580 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2e590 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e5a0 20 20 72 65 73 20 3d 20 70 4d 6f 64 75 6c 65 2d    res = pModule-
2e5b0 3e 78 45 6f 66 28 70 56 74 61 62 43 75 72 73 6f  >xEof(pVtabCurso
2e5c0 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  r);.    }..    i
2e5d0 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
2e5e0 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
2e5f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43  ;.    }.  }.  pC
2e600 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b  ur->nullRow = 0;
2e610 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ..  break;.}.#en
2e620 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2e630 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
2e640 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
2e650 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2e660 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ABLE./* Opcode: 
2e670 56 43 6f 6c 75 6d 6e 20 50 31 20 50 32 20 50 33  VColumn P1 P2 P3
2e680 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65   * *.**.** Store
2e690 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2e6a0 65 20 50 32 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  e P2-th column o
2e6b0 66 0a 2a 2a 20 74 68 65 20 72 6f 77 20 6f 66 20  f.** the row of 
2e6c0 74 68 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c  the virtual-tabl
2e6d0 65 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 50  e that the .** P
2e6e0 31 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  1 cursor is poin
2e6f0 74 69 6e 67 20 74 6f 20 69 6e 74 6f 20 72 65 67  ting to into reg
2e700 69 73 74 65 72 20 50 33 2e 0a 2a 2f 0a 63 61 73  ister P3..*/.cas
2e710 65 20 4f 50 5f 56 43 6f 6c 75 6d 6e 3a 20 7b 0a  e OP_VColumn: {.
2e720 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
2e730 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73  pVtab;.  const s
2e740 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
2e750 4d 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d 20 2a 70  Module;.  Mem *p
2e760 44 65 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Dest;.  sqlite3_
2e770 63 6f 6e 74 65 78 74 20 73 43 6f 6e 74 65 78 74  context sContext
2e780 3b 0a 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  ;..  VdbeCursor 
2e790 2a 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72  *pCur = p->apCsr
2e7a0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
2e7b0 65 72 74 28 20 70 43 75 72 2d 3e 70 56 74 61 62  ert( pCur->pVtab
2e7c0 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65  Cursor );.  asse
2e7d0 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26  rt( pOp->p3>0 &&
2e7e0 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65   pOp->p3<=p->nMe
2e7f0 6d 20 29 3b 0a 20 20 70 44 65 73 74 20 3d 20 26  m );.  pDest = &
2e800 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
2e810 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
2e820 65 28 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 69  e(p, pDest);.  i
2e830 66 28 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77  f( pCur->nullRow
2e840 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
2e850 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 44  dbeMemSetNull(pD
2e860 65 73 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  est);.    break;
2e870 0a 20 20 7d 0a 20 20 70 56 74 61 62 20 3d 20 70  .  }.  pVtab = p
2e880 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  Cur->pVtabCursor
2e890 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64 75  ->pVtab;.  pModu
2e8a0 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  le = pVtab->pMod
2e8b0 75 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ule;.  assert( p
2e8c0 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d 6e 20  Module->xColumn 
2e8d0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 43 6f  );.  memset(&sCo
2e8e0 6e 74 65 78 74 2c 20 30 2c 20 73 69 7a 65 6f 66  ntext, 0, sizeof
2e8f0 28 73 43 6f 6e 74 65 78 74 29 29 3b 0a 0a 20 20  (sContext));..  
2e900 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 63 65  /* The output ce
2e910 6c 6c 20 6d 61 79 20 61 6c 72 65 61 64 79 20 68  ll may already h
2e920 61 76 65 20 61 20 62 75 66 66 65 72 20 61 6c 6c  ave a buffer all
2e930 6f 63 61 74 65 64 2e 20 4d 6f 76 65 0a 20 20 2a  ocated. Move.  *
2e940 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  * the current co
2e950 6e 74 65 6e 74 73 20 74 6f 20 73 43 6f 6e 74 65  ntents to sConte
2e960 78 74 2e 73 20 73 6f 20 69 6e 20 63 61 73 65 20  xt.s so in case 
2e970 74 68 65 20 75 73 65 72 2d 66 75 6e 63 74 69 6f  the user-functio
2e980 6e 20 0a 20 20 2a 2a 20 63 61 6e 20 75 73 65 20  n .  ** can use 
2e990 74 68 65 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f  the already allo
2e9a0 63 61 74 65 64 20 62 75 66 66 65 72 20 69 6e 73  cated buffer ins
2e9b0 74 65 61 64 20 6f 66 20 61 6c 6c 6f 63 61 74 69  tead of allocati
2e9c0 6e 67 20 61 20 0a 20 20 2a 2a 20 6e 65 77 20 6f  ng a .  ** new o
2e9d0 6e 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ne..  */.  sqlit
2e9e0 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 26 73  e3VdbeMemMove(&s
2e9f0 43 6f 6e 74 65 78 74 2e 73 2c 20 70 44 65 73 74  Context.s, pDest
2ea00 29 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46  );.  MemSetTypeF
2ea10 6c 61 67 28 26 73 43 6f 6e 74 65 78 74 2e 73 2c  lag(&sContext.s,
2ea20 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 0a 20 20 72   MEM_Null);..  r
2ea30 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f  c = pModule->xCo
2ea40 6c 75 6d 6e 28 70 43 75 72 2d 3e 70 56 74 61 62  lumn(pCur->pVtab
2ea50 43 75 72 73 6f 72 2c 20 26 73 43 6f 6e 74 65 78  Cursor, &sContex
2ea60 74 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 69  t, pOp->p2);.  i
2ea70 6d 70 6f 72 74 56 74 61 62 45 72 72 4d 73 67 28  mportVtabErrMsg(
2ea80 70 2c 20 70 56 74 61 62 29 3b 0a 20 20 69 66 28  p, pVtab);.  if(
2ea90 20 73 43 6f 6e 74 65 78 74 2e 69 73 45 72 72 6f   sContext.isErro
2eaa0 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 43  r ){.    rc = sC
2eab0 6f 6e 74 65 78 74 2e 69 73 45 72 72 6f 72 3b 0a  ontext.isError;.
2eac0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74    }..  /* Copy t
2ead0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
2eae0 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 65   function to the
2eaf0 20 50 33 20 72 65 67 69 73 74 65 72 2e 20 57 65   P3 register. We
2eb00 0a 20 20 2a 2a 20 64 6f 20 74 68 69 73 20 72 65  .  ** do this re
2eb10 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
2eb20 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72  her or not an er
2eb30 72 6f 72 20 6f 63 63 75 72 72 65 64 20 74 6f 20  ror occurred to 
2eb40 65 6e 73 75 72 65 20 61 6e 79 0a 20 20 2a 2a 20  ensure any.  ** 
2eb50 64 79 6e 61 6d 69 63 20 61 6c 6c 6f 63 61 74 69  dynamic allocati
2eb60 6f 6e 20 69 6e 20 73 43 6f 6e 74 65 78 74 2e 73  on in sContext.s
2eb70 20 28 61 20 4d 65 6d 20 73 74 72 75 63 74 29 20   (a Mem struct) 
2eb80 69 73 20 20 72 65 6c 65 61 73 65 64 2e 0a 20 20  is  released..  
2eb90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
2eba0 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 26  ChangeEncoding(&
2ebb0 73 43 6f 6e 74 65 78 74 2e 73 2c 20 65 6e 63 6f  sContext.s, enco
2ebc0 64 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  ding);.  sqlite3
2ebd0 56 64 62 65 4d 65 6d 4d 6f 76 65 28 70 44 65 73  VdbeMemMove(pDes
2ebe0 74 2c 20 26 73 43 6f 6e 74 65 78 74 2e 73 29 3b  t, &sContext.s);
2ebf0 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
2ec00 45 28 70 4f 70 2d 3e 70 33 2c 20 70 44 65 73 74  E(pOp->p3, pDest
2ec10 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  );.  UPDATE_MAX_
2ec20 42 4c 4f 42 53 49 5a 45 28 70 44 65 73 74 29 3b  BLOBSIZE(pDest);
2ec30 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56  ..  if( sqlite3V
2ec40 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 44 65  dbeMemTooBig(pDe
2ec50 73 74 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  st) ){.    goto 
2ec60 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 62  too_big;.  }.  b
2ec70 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
2ec80 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
2ec90 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
2eca0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2ecb0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2ecc0 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 4e 65 78 74  /* Opcode: VNext
2ecd0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
2ece0 2a 2a 20 41 64 76 61 6e 63 65 20 76 69 72 74 75  ** Advance virtu
2ecf0 61 6c 20 74 61 62 6c 65 20 50 31 20 74 6f 20 74  al table P1 to t
2ed00 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 69  he next row in i
2ed10 74 73 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  ts result set an
2ed20 64 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 69 6e 73  d.** jump to ins
2ed30 74 72 75 63 74 69 6f 6e 20 50 32 2e 20 20 4f 72  truction P2.  Or
2ed40 2c 20 69 66 20 74 68 65 20 76 69 72 74 75 61 6c  , if the virtual
2ed50 20 74 61 62 6c 65 20 68 61 73 20 72 65 61 63 68   table has reach
2ed60 65 64 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  ed.** the end of
2ed70 20 69 74 73 20 72 65 73 75 6c 74 20 73 65 74 2c   its result set,
2ed80 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
2ed90 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
2eda0 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  nstruction..*/.c
2edb0 61 73 65 20 4f 50 5f 56 4e 65 78 74 3a 20 7b 20  ase OP_VNext: { 
2edc0 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 73    /* jump */.  s
2edd0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
2ede0 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  ab;.  const sqli
2edf0 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
2ee00 75 6c 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  ule;.  int res;.
2ee10 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
2ee20 75 72 3b 0a 0a 20 20 72 65 73 20 3d 20 30 3b 0a  ur;..  res = 0;.
2ee30 20 20 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73    pCur = p->apCs
2ee40 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
2ee50 73 65 72 74 28 20 70 43 75 72 2d 3e 70 56 74 61  sert( pCur->pVta
2ee60 62 43 75 72 73 6f 72 20 29 3b 0a 20 20 69 66 28  bCursor );.  if(
2ee70 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 29   pCur->nullRow )
2ee80 7b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  {.    break;.  }
2ee90 0a 20 20 70 56 74 61 62 20 3d 20 70 43 75 72 2d  .  pVtab = pCur-
2eea0 3e 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56  >pVtabCursor->pV
2eeb0 74 61 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d  tab;.  pModule =
2eec0 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b   pVtab->pModule;
2eed0 0a 20 20 61 73 73 65 72 74 28 20 70 4d 6f 64 75  .  assert( pModu
2eee0 6c 65 2d 3e 78 4e 65 78 74 20 29 3b 0a 0a 20 20  le->xNext );..  
2eef0 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 4e  /* Invoke the xN
2ef00 65 78 74 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  ext() method of 
2ef10 74 68 65 20 6d 6f 64 75 6c 65 2e 20 54 68 65 72  the module. Ther
2ef20 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20  e is no way for 
2ef30 74 68 65 0a 20 20 2a 2a 20 75 6e 64 65 72 6c 79  the.  ** underly
2ef40 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ing implementati
2ef50 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  on to return an 
2ef60 65 72 72 6f 72 20 69 66 20 6f 6e 65 20 6f 63 63  error if one occ
2ef70 75 72 73 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20  urs during.  ** 
2ef80 78 4e 65 78 74 28 29 2e 20 49 6e 73 74 65 61 64  xNext(). Instead
2ef90 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
2efa0 63 75 72 73 2c 20 74 72 75 65 20 69 73 20 72 65  curs, true is re
2efb0 74 75 72 6e 65 64 20 28 69 6e 64 69 63 61 74 69  turned (indicati
2efc0 6e 67 20 74 68 61 74 20 0a 20 20 2a 2a 20 64 61  ng that .  ** da
2efd0 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 29  ta is available)
2efe0 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
2eff0 6f 64 65 20 72 65 74 75 72 6e 65 64 20 77 68 65  ode returned whe
2f000 6e 20 78 43 6f 6c 75 6d 6e 20 6f 72 0a 20 20 2a  n xColumn or.  *
2f010 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 6d 65 74  * some other met
2f020 68 6f 64 20 69 73 20 6e 65 78 74 20 69 6e 76 6f  hod is next invo
2f030 6b 65 64 20 6f 6e 20 74 68 65 20 73 61 76 65 20  ked on the save 
2f040 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75  virtual table cu
2f050 72 73 6f 72 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  rsor..  */.  p->
2f060 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31  inVtabMethod = 1
2f070 3b 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65  ;.  rc = pModule
2f080 2d 3e 78 4e 65 78 74 28 70 43 75 72 2d 3e 70 56  ->xNext(pCur->pV
2f090 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 70 2d  tabCursor);.  p-
2f0a0 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20  >inVtabMethod = 
2f0b0 30 3b 0a 20 20 69 6d 70 6f 72 74 56 74 61 62 45  0;.  importVtabE
2f0c0 72 72 4d 73 67 28 70 2c 20 70 56 74 61 62 29 3b  rrMsg(p, pVtab);
2f0d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2f0e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 73 20  E_OK ){.    res 
2f0f0 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66 28  = pModule->xEof(
2f100 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f  pCur->pVtabCurso
2f110 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  r);.  }..  if( !
2f120 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  res ){.    /* If
2f130 20 74 68 65 72 65 20 69 73 20 64 61 74 61 2c 20   there is data, 
2f140 6a 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20 20  jump to P2 */.  
2f150 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
2f160 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   1;.  }.  break;
2f170 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2f180 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2f190 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  TABLE */..#ifnde
2f1a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2f1b0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70  RTUALTABLE./* Op
2f1c0 63 6f 64 65 3a 20 56 52 65 6e 61 6d 65 20 50 31  code: VRename P1
2f1d0 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20   * * P4 *.**.** 
2f1e0 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P4 is a pointer 
2f1f0 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  to a virtual tab
2f200 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73 71  le object, an sq
2f210 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63  lite3_vtab struc
2f220 74 75 72 65 2e 0a 2a 2a 20 54 68 69 73 20 6f 70  ture..** This op
2f230 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65  code invokes the
2f240 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 78   corresponding x
2f250 52 65 6e 61 6d 65 20 6d 65 74 68 6f 64 2e 20 54  Rename method. T
2f260 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 72  he value.** in r
2f270 65 67 69 73 74 65 72 20 50 31 20 69 73 20 70 61  egister P1 is pa
2f280 73 73 65 64 20 61 73 20 74 68 65 20 7a 4e 61 6d  ssed as the zNam
2f290 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
2f2a0 65 20 78 52 65 6e 61 6d 65 20 6d 65 74 68 6f 64  e xRename method
2f2b0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 52 65  ..*/.case OP_VRe
2f2c0 6e 61 6d 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65  name: {.  sqlite
2f2d0 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20  3_vtab *pVtab;. 
2f2e0 20 4d 65 6d 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20   Mem *pName;..  
2f2f0 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e  pVtab = pOp->p4.
2f300 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20  pVtab->pVtab;.  
2f310 70 4e 61 6d 65 20 3d 20 26 61 4d 65 6d 5b 70 4f  pName = &aMem[pO
2f320 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
2f330 28 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  ( pVtab->pModule
2f340 2d 3e 78 52 65 6e 61 6d 65 20 29 3b 0a 20 20 61  ->xRename );.  a
2f350 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
2f360 64 28 70 4e 61 6d 65 29 20 29 3b 0a 20 20 52 45  d(pName) );.  RE
2f370 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
2f380 2d 3e 70 31 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  ->p1, pName);.  
2f390 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 66  assert( pName->f
2f3a0 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
2f3b0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4e  ;.  testcase( pN
2f3c0 61 6d 65 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  ame->enc==SQLITE
2f3d0 5f 55 54 46 38 20 29 3b 0a 20 20 74 65 73 74 63  _UTF8 );.  testc
2f3e0 61 73 65 28 20 70 4e 61 6d 65 2d 3e 65 6e 63 3d  ase( pName->enc=
2f3f0 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  =SQLITE_UTF16BE 
2f400 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2f410 4e 61 6d 65 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Name->enc==SQLIT
2f420 45 5f 55 54 46 31 36 4c 45 20 29 3b 0a 20 20 72  E_UTF16LE );.  r
2f430 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
2f440 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4e  hangeEncoding(pN
2f450 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ame, SQLITE_UTF8
2f460 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2f470 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
2f480 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c   = pVtab->pModul
2f490 65 2d 3e 78 52 65 6e 61 6d 65 28 70 56 74 61 62  e->xRename(pVtab
2f4a0 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20  , pName->z);.   
2f4b0 20 69 6d 70 6f 72 74 56 74 61 62 45 72 72 4d 73   importVtabErrMs
2f4c0 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20 20  g(p, pVtab);.   
2f4d0 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b   p->expired = 0;
2f4e0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
2f4f0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
2f500 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2f510 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f  UALTABLE./* Opco
2f520 64 65 3a 20 56 55 70 64 61 74 65 20 50 31 20 50  de: VUpdate P1 P
2f530 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  2 P3 P4 *.**.** 
2f540 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P4 is a pointer 
2f550 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  to a virtual tab
2f560 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73 71  le object, an sq
2f570 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63  lite3_vtab struc
2f580 74 75 72 65 2e 0a 2a 2a 20 54 68 69 73 20 6f 70  ture..** This op
2f590 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65  code invokes the
2f5a0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 78   corresponding x
2f5b0 55 70 64 61 74 65 20 6d 65 74 68 6f 64 2e 20 50  Update method. P
2f5c0 32 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20  2 values.** are 
2f5d0 63 6f 6e 74 69 67 75 6f 75 73 20 6d 65 6d 6f 72  contiguous memor
2f5e0 79 20 63 65 6c 6c 73 20 73 74 61 72 74 69 6e 67  y cells starting
2f5f0 20 61 74 20 50 33 20 74 6f 20 70 61 73 73 20 74   at P3 to pass t
2f600 6f 20 74 68 65 20 78 55 70 64 61 74 65 20 0a 2a  o the xUpdate .*
2f610 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 54 68  * invocation. Th
2f620 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
2f630 74 65 72 20 28 50 33 2b 50 32 2d 31 29 20 63 6f  ter (P3+P2-1) co
2f640 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
2f650 20 0a 2a 2a 20 70 32 74 68 20 65 6c 65 6d 65 6e   .** p2th elemen
2f660 74 20 6f 66 20 74 68 65 20 61 72 67 76 20 61 72  t of the argv ar
2f670 72 61 79 20 70 61 73 73 65 64 20 74 6f 20 78 55  ray passed to xU
2f680 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  pdate..**.** The
2f690 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64 20   xUpdate method 
2f6a0 77 69 6c 6c 20 64 6f 20 61 20 44 45 4c 45 54 45  will do a DELETE
2f6b0 20 6f 72 20 61 6e 20 49 4e 53 45 52 54 20 6f 72   or an INSERT or
2f6c0 20 62 6f 74 68 2e 0a 2a 2a 20 54 68 65 20 61 72   both..** The ar
2f6d0 67 76 5b 30 5d 20 65 6c 65 6d 65 6e 74 20 28 77  gv[0] element (w
2f6e0 68 69 63 68 20 63 6f 72 72 65 73 70 6f 6e 64 73  hich corresponds
2f6f0 20 74 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   to memory cell 
2f700 50 33 29 0a 2a 2a 20 69 73 20 74 68 65 20 72 6f  P3).** is the ro
2f710 77 69 64 20 6f 66 20 61 20 72 6f 77 20 74 6f 20  wid of a row to 
2f720 64 65 6c 65 74 65 2e 20 20 49 66 20 61 72 67 76  delete.  If argv
2f730 5b 30 5d 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  [0] is NULL then
2f740 20 6e 6f 20 0a 2a 2a 20 64 65 6c 65 74 69 6f 6e   no .** deletion
2f750 20 6f 63 63 75 72 73 2e 20 20 54 68 65 20 61 72   occurs.  The ar
2f760 67 76 5b 31 5d 20 65 6c 65 6d 65 6e 74 20 69 73  gv[1] element is
2f770 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
2f780 65 20 6e 65 77 20 0a 2a 2a 20 72 6f 77 2e 20 20  e new .** row.  
2f790 54 68 69 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c  This can be NULL
2f7a0 20 74 6f 20 68 61 76 65 20 74 68 65 20 76 69 72   to have the vir
2f7b0 74 75 61 6c 20 74 61 62 6c 65 20 73 65 6c 65 63  tual table selec
2f7c0 74 20 74 68 65 20 6e 65 77 20 0a 2a 2a 20 72 6f  t the new .** ro
2f7d0 77 69 64 20 66 6f 72 20 69 74 73 65 6c 66 2e 20  wid for itself. 
2f7e0 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   The subsequent 
2f7f0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
2f800 61 72 72 61 79 20 61 72 65 20 0a 2a 2a 20 74 68  array are .** th
2f810 65 20 76 61 6c 75 65 73 20 6f 66 20 63 6f 6c 75  e values of colu
2f820 6d 6e 73 20 69 6e 20 74 68 65 20 6e 65 77 20 72  mns in the new r
2f830 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32 3d  ow..**.** If P2=
2f840 3d 31 20 74 68 65 6e 20 6e 6f 20 69 6e 73 65 72  =1 then no inser
2f850 74 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20  t is performed. 
2f860 20 61 72 67 76 5b 30 5d 20 69 73 20 74 68 65 20   argv[0] is the 
2f870 72 6f 77 69 64 20 6f 66 0a 2a 2a 20 61 20 72 6f  rowid of.** a ro
2f880 77 20 74 6f 20 64 65 6c 65 74 65 2e 0a 2a 2a 0a  w to delete..**.
2f890 2a 2a 20 50 31 20 69 73 20 61 20 62 6f 6f 6c 65  ** P1 is a boole
2f8a0 61 6e 20 66 6c 61 67 2e 20 49 66 20 69 74 20 69  an flag. If it i
2f8b0 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61 6e  s set to true an
2f8c0 64 20 74 68 65 20 78 55 70 64 61 74 65 20 63 61  d the xUpdate ca
2f8d0 6c 6c 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73  ll.** is success
2f8e0 66 75 6c 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ful, then the va
2f8f0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
2f900 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
2f910 65 72 74 5f 72 6f 77 69 64 28 29 20 0a 2a 2a 20  ert_rowid() .** 
2f920 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
2f930 6c 75 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  lue of the rowid
2f940 20 66 6f 72 20 74 68 65 20 72 6f 77 20 6a 75 73   for the row jus
2f950 74 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 63  t inserted..*/.c
2f960 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20  ase OP_VUpdate: 
2f970 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
2f980 20 2a 70 56 74 61 62 3b 0a 20 20 73 71 6c 69 74   *pVtab;.  sqlit
2f990 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
2f9a0 6c 65 3b 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a  le;.  int nArg;.
2f9b0 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
2f9c0 65 5f 69 6e 74 36 34 20 72 6f 77 69 64 3b 0a 20  e_int64 rowid;. 
2f9d0 20 4d 65 6d 20 2a 2a 61 70 41 72 67 3b 0a 20 20   Mem **apArg;.  
2f9e0 4d 65 6d 20 2a 70 58 3b 0a 0a 20 20 61 73 73 65  Mem *pX;..  asse
2f9f0 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 20  rt( pOp->p2==1  
2fa00 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 35        || pOp->p5
2fa10 3d 3d 4f 45 5f 46 61 69 6c 20 20 20 7c 7c 20 70  ==OE_Fail   || p
2fa20 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 52 6f 6c 6c 62  Op->p5==OE_Rollb
2fa30 61 63 6b 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ack .       || p
2fa40 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 41 62 6f 72 74  Op->p5==OE_Abort
2fa50 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f   || pOp->p5==OE_
2fa60 49 67 6e 6f 72 65 20 7c 7c 20 70 4f 70 2d 3e 70  Ignore || pOp->p
2fa70 35 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 0a 20 20  5==OE_Replace.  
2fa80 29 3b 0a 20 20 70 56 74 61 62 20 3d 20 70 4f 70  );.  pVtab = pOp
2fa90 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
2faa0 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20 28  b;.  pModule = (
2fab0 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
2fac0 29 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b  )pVtab->pModule;
2fad0 0a 20 20 6e 41 72 67 20 3d 20 70 4f 70 2d 3e 70  .  nArg = pOp->p
2fae0 32 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  2;.  assert( pOp
2faf0 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 56 54 41  ->p4type==P4_VTA
2fb00 42 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  B );.  if( ALWAY
2fb10 53 28 70 4d 6f 64 75 6c 65 2d 3e 78 55 70 64 61  S(pModule->xUpda
2fb20 74 65 29 20 29 7b 0a 20 20 20 20 75 38 20 76 74  te) ){.    u8 vt
2fb30 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 20 3d 20 64  abOnConflict = d
2fb40 62 2d 3e 76 74 61 62 4f 6e 43 6f 6e 66 6c 69 63  b->vtabOnConflic
2fb50 74 3b 0a 20 20 20 20 61 70 41 72 67 20 3d 20 70  t;.    apArg = p
2fb60 2d 3e 61 70 41 72 67 3b 0a 20 20 20 20 70 58 20  ->apArg;.    pX 
2fb70 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
2fb80 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2fb90 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
2fba0 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
2fbb0 56 61 6c 69 64 28 70 58 29 20 29 3b 0a 20 20 20  Valid(pX) );.   
2fbc0 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61     memAboutToCha
2fbd0 6e 67 65 28 70 2c 20 70 58 29 3b 0a 20 20 20 20  nge(p, pX);.    
2fbe0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
2fbf0 53 74 6f 72 65 54 79 70 65 28 70 58 29 3b 0a 20  StoreType(pX);. 
2fc00 20 20 20 20 20 61 70 41 72 67 5b 69 5d 20 3d 20       apArg[i] = 
2fc10 70 58 3b 0a 20 20 20 20 20 20 70 58 2b 2b 3b 0a  pX;.      pX++;.
2fc20 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 76 74      }.    db->vt
2fc30 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 20 3d 20 70  abOnConflict = p
2fc40 4f 70 2d 3e 70 35 3b 0a 20 20 20 20 72 63 20 3d  Op->p5;.    rc =
2fc50 20 70 4d 6f 64 75 6c 65 2d 3e 78 55 70 64 61 74   pModule->xUpdat
2fc60 65 28 70 56 74 61 62 2c 20 6e 41 72 67 2c 20 61  e(pVtab, nArg, a
2fc70 70 41 72 67 2c 20 26 72 6f 77 69 64 29 3b 0a 20  pArg, &rowid);. 
2fc80 20 20 20 64 62 2d 3e 76 74 61 62 4f 6e 43 6f 6e     db->vtabOnCon
2fc90 66 6c 69 63 74 20 3d 20 76 74 61 62 4f 6e 43 6f  flict = vtabOnCo
2fca0 6e 66 6c 69 63 74 3b 0a 20 20 20 20 69 6d 70 6f  nflict;.    impo
2fcb0 72 74 56 74 61 62 45 72 72 4d 73 67 28 70 2c 20  rtVtabErrMsg(p, 
2fcc0 70 56 74 61 62 29 3b 0a 20 20 20 20 69 66 28 20  pVtab);.    if( 
2fcd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2fce0 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20   pOp->p1 ){.    
2fcf0 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3e 31    assert( nArg>1
2fd00 20 26 26 20 61 70 41 72 67 5b 30 5d 20 26 26 20   && apArg[0] && 
2fd10 28 61 70 41 72 67 5b 30 5d 2d 3e 66 6c 61 67 73  (apArg[0]->flags
2fd20 26 4d 45 4d 5f 4e 75 6c 6c 29 20 29 3b 0a 20 20  &MEM_Null) );.  
2fd30 20 20 20 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69      db->lastRowi
2fd40 64 20 3d 20 6c 61 73 74 52 6f 77 69 64 20 3d 20  d = lastRowid = 
2fd50 72 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 20 20 20  rowid;.    }.   
2fd60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2fd70 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f  CONSTRAINT && pO
2fd80 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 62 43 6f  p->p4.pVtab->bCo
2fd90 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20  nstraint ){.    
2fda0 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3d 3d 4f    if( pOp->p5==O
2fdb0 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20  E_Ignore ){.    
2fdc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2fdd0 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OK;.      }else{
2fde0 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 72 72 6f  .        p->erro
2fdf0 72 41 63 74 69 6f 6e 20 3d 20 28 28 70 4f 70 2d  rAction = ((pOp-
2fe00 3e 70 35 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29  >p5==OE_Replace)
2fe10 20 3f 20 4f 45 5f 41 62 6f 72 74 20 3a 20 70 4f   ? OE_Abort : pO
2fe20 70 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 7d 0a  p->p5);.      }.
2fe30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fe40 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20   p->nChange++;. 
2fe50 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
2fe60 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2fe70 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2fe80 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64  LTABLE */..#ifnd
2fe90 65 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ef  SQLITE_OMIT_
2fea0 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f 2a  PAGER_PRAGMAS./*
2feb0 20 4f 70 63 6f 64 65 3a 20 50 61 67 65 63 6f 75   Opcode: Pagecou
2fec0 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  nt P1 P2 * * *.*
2fed0 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 63  *.** Write the c
2fee0 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  urrent number of
2fef0 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
2ff00 73 65 20 50 31 20 74 6f 20 6d 65 6d 6f 72 79 20  se P1 to memory 
2ff10 63 65 6c 6c 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  cell P2..*/.case
2ff20 20 4f 50 5f 50 61 67 65 63 6f 75 6e 74 3a 20 7b   OP_Pagecount: {
2ff30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
2ff40 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a  ut2-prerelease *
2ff50 2f 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  /.  pOut->u.i = 
2ff60 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
2ff70 50 61 67 65 28 64 62 2d 3e 61 44 62 5b 70 4f 70  Page(db->aDb[pOp
2ff80 2d 3e 70 31 5d 2e 70 42 74 29 3b 0a 20 20 62 72  ->p1].pBt);.  br
2ff90 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  eak;.}.#endif...
2ffa0 23 69 66 6e 64 65 66 20 20 53 51 4c 49 54 45 5f  #ifndef  SQLITE_
2ffb0 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
2ffc0 41 53 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 61  AS./* Opcode: Ma
2ffd0 78 50 67 63 6e 74 20 50 31 20 50 32 20 50 33 20  xPgcnt P1 P2 P3 
2ffe0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f  * *.**.** Try to
2fff0 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
30000 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
30010 64 61 74 61 62 61 73 65 20 50 31 20 74 6f 20 74  database P1 to t
30020 68 65 20 76 61 6c 75 65 20 69 6e 20 50 33 2e 0a  he value in P3..
30030 2a 2a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68  ** Do not let th
30040 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
30050 6f 75 6e 74 20 66 61 6c 6c 20 62 65 6c 6f 77 20  ount fall below 
30060 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
30070 20 63 6f 75 6e 74 20 61 6e 64 0a 2a 2a 20 64 6f   count and.** do
30080 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
30090 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
300a0 6e 74 20 76 61 6c 75 65 20 69 66 20 50 33 3d 3d  nt value if P3==
300b0 30 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 74  0..**.** Store t
300c0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
300d0 63 6f 75 6e 74 20 61 66 74 65 72 20 74 68 65 20  count after the 
300e0 63 68 61 6e 67 65 20 69 6e 20 72 65 67 69 73 74  change in regist
300f0 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f  er P2..*/.case O
30100 50 5f 4d 61 78 50 67 63 6e 74 3a 20 7b 20 20 20  P_MaxPgcnt: {   
30110 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
30120 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20  -prerelease */. 
30130 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65   unsigned int ne
30140 77 4d 61 78 3b 0a 20 20 42 74 72 65 65 20 2a 70  wMax;.  Btree *p
30150 42 74 3b 0a 0a 20 20 70 42 74 20 3d 20 64 62 2d  Bt;..  pBt = db-
30160 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42  >aDb[pOp->p1].pB
30170 74 3b 0a 20 20 6e 65 77 4d 61 78 20 3d 20 30 3b  t;.  newMax = 0;
30180 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 20 29  .  if( pOp->p3 )
30190 7b 0a 20 20 20 20 6e 65 77 4d 61 78 20 3d 20 73  {.    newMax = s
301a0 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50  qlite3BtreeLastP
301b0 61 67 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66  age(pBt);.    if
301c0 28 20 6e 65 77 4d 61 78 20 3c 20 28 75 6e 73 69  ( newMax < (unsi
301d0 67 6e 65 64 29 70 4f 70 2d 3e 70 33 20 29 20 6e  gned)pOp->p3 ) n
301e0 65 77 4d 61 78 20 3d 20 28 75 6e 73 69 67 6e 65  ewMax = (unsigne
301f0 64 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 0a 20  d)pOp->p3;.  }. 
30200 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 73 71 6c   pOut->u.i = sql
30210 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65  ite3BtreeMaxPage
30220 43 6f 75 6e 74 28 70 42 74 2c 20 6e 65 77 4d 61  Count(pBt, newMa
30230 78 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  x);.  break;.}.#
30240 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
30250 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
30260 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 72 61  E./* Opcode: Tra
30270 63 65 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  ce * * * P4 *.**
30280 0a 2a 2a 20 49 66 20 74 72 61 63 69 6e 67 20 69  .** If tracing i
30290 73 20 65 6e 61 62 6c 65 64 20 28 62 79 20 74 68  s enabled (by th
302a0 65 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28  e sqlite3_trace(
302b0 29 29 20 69 6e 74 65 72 66 61 63 65 2c 20 74 68  )) interface, th
302c0 65 6e 0a 2a 2a 20 74 68 65 20 55 54 46 2d 38 20  en.** the UTF-8 
302d0 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 65 64  string contained
302e0 20 69 6e 20 50 34 20 69 73 20 65 6d 69 74 74 65   in P4 is emitte
302f0 64 20 6f 6e 20 74 68 65 20 74 72 61 63 65 20 63  d on the trace c
30300 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 63 61 73 65  allback..*/.case
30310 20 4f 50 5f 54 72 61 63 65 3a 20 7b 0a 20 20 63   OP_Trace: {.  c
30320 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 63  har *zTrace;.  c
30330 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 64  har *z;..  if( d
30340 62 2d 3e 78 54 72 61 63 65 0a 20 20 20 26 26 20  b->xTrace.   && 
30350 21 70 2d 3e 64 6f 69 6e 67 52 65 72 75 6e 0a 20  !p->doingRerun. 
30360 20 20 26 26 20 28 7a 54 72 61 63 65 20 3d 20 28    && (zTrace = (
30370 70 4f 70 2d 3e 70 34 2e 7a 20 3f 20 70 4f 70 2d  pOp->p4.z ? pOp-
30380 3e 70 34 2e 7a 20 3a 20 70 2d 3e 7a 53 71 6c 29  >p4.z : p->zSql)
30390 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 7a 20  )!=0.  ){.    z 
303a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  = sqlite3VdbeExp
303b0 61 6e 64 53 71 6c 28 70 2c 20 7a 54 72 61 63 65  andSql(p, zTrace
303c0 29 3b 0a 20 20 20 20 64 62 2d 3e 78 54 72 61 63  );.    db->xTrac
303d0 65 28 64 62 2d 3e 70 54 72 61 63 65 41 72 67 2c  e(db->pTraceArg,
303e0 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   z);.    sqlite3
303f0 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
30400 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
30410 5f 44 45 42 55 47 0a 20 20 69 66 28 20 28 64 62  _DEBUG.  if( (db
30420 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
30430 5f 53 71 6c 54 72 61 63 65 29 21 3d 30 0a 20 20  _SqlTrace)!=0.  
30440 20 26 26 20 28 7a 54 72 61 63 65 20 3d 20 28 70   && (zTrace = (p
30450 4f 70 2d 3e 70 34 2e 7a 20 3f 20 70 4f 70 2d 3e  Op->p4.z ? pOp->
30460 70 34 2e 7a 20 3a 20 70 2d 3e 7a 53 71 6c 29 29  p4.z : p->zSql))
30470 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  !=0.  ){.    sql
30480 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
30490 22 53 51 4c 2d 74 72 61 63 65 3a 20 25 73 5c 6e  "SQL-trace: %s\n
304a0 22 2c 20 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a  ", zTrace);.  }.
304b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
304c0 5f 44 45 42 55 47 20 2a 2f 0a 20 20 62 72 65 61  _DEBUG */.  brea
304d0 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  k;.}.#endif.../*
304e0 20 4f 70 63 6f 64 65 3a 20 4e 6f 6f 70 20 2a 20   Opcode: Noop * 
304f0 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 6f  * * * *.**.** Do
30500 20 6e 6f 74 68 69 6e 67 2e 20 20 54 68 69 73 20   nothing.  This 
30510 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6f  instruction is o
30520 66 74 65 6e 20 75 73 65 66 75 6c 20 61 73 20 61  ften useful as a
30530 20 6a 75 6d 70 0a 2a 2a 20 64 65 73 74 69 6e 61   jump.** destina
30540 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 54  tion..*/./*.** T
30550 68 65 20 6d 61 67 69 63 20 45 78 70 6c 61 69 6e  he magic Explain
30560 20 6f 70 63 6f 64 65 20 61 72 65 20 6f 6e 6c 79   opcode are only
30570 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e 20 65   inserted when e
30580 78 70 6c 61 69 6e 3d 3d 32 20 28 77 68 69 63 68  xplain==2 (which
30590 0a 2a 2a 20 69 73 20 74 6f 20 73 61 79 20 77 68  .** is to say wh
305a0 65 6e 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51  en the EXPLAIN Q
305b0 55 45 52 59 20 50 4c 41 4e 20 73 79 6e 74 61 78  UERY PLAN syntax
305c0 20 69 73 20 75 73 65 64 2e 29 0a 2a 2a 20 54 68   is used.).** Th
305d0 69 73 20 6f 70 63 6f 64 65 20 72 65 63 6f 72 64  is opcode record
305e0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  s information fr
305f0 6f 6d 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72  om the optimizer
30600 2e 20 20 49 74 20 69 73 20 74 68 65 0a 2a 2a 20  .  It is the.** 
30610 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 6e 6f  the same as a no
30620 2d 6f 70 2e 20 20 54 68 69 73 20 6f 70 63 6f 64  -op.  This opcod
30630 65 73 6e 65 76 65 72 20 61 70 70 65 61 72 73 20  esnever appears 
30640 69 6e 20 61 20 72 65 61 6c 20 56 4d 20 70 72 6f  in a real VM pro
30650 67 72 61 6d 2e 0a 2a 2f 0a 64 65 66 61 75 6c 74  gram..*/.default
30660 3a 20 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  : {          /* 
30670 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20 4f  This is really O
30680 50 5f 4e 6f 6f 70 20 61 6e 64 20 4f 50 5f 45 78  P_Noop and OP_Ex
30690 70 6c 61 69 6e 20 2a 2f 0a 20 20 61 73 73 65 72  plain */.  asser
306a0 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  t( pOp->opcode==
306b0 4f 50 5f 4e 6f 6f 70 20 7c 7c 20 70 4f 70 2d 3e  OP_Noop || pOp->
306c0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 78 70 6c 61  opcode==OP_Expla
306d0 69 6e 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  in );.  break;.}
306e0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
306f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30730 0a 2a 2a 20 54 68 65 20 63 61 73 65 73 20 6f 66  .** The cases of
30740 20 74 68 65 20 73 77 69 74 63 68 20 73 74 61 74   the switch stat
30750 65 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 69 73  ement above this
30760 20 6c 69 6e 65 20 73 68 6f 75 6c 64 20 61 6c 6c   line should all
30770 20 62 65 20 69 6e 64 65 6e 74 65 64 0a 2a 2a 20   be indented.** 
30780 62 79 20 36 20 73 70 61 63 65 73 2e 20 20 42 75  by 6 spaces.  Bu
30790 74 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  t the left-most 
307a0 36 20 73 70 61 63 65 73 20 68 61 76 65 20 62 65  6 spaces have be
307b0 65 6e 20 72 65 6d 6f 76 65 64 20 74 6f 20 69 6d  en removed to im
307c0 70 72 6f 76 65 20 74 68 65 0a 2a 2a 20 72 65 61  prove the.** rea
307d0 64 61 62 69 6c 69 74 79 2e 20 20 46 72 6f 6d 20  dability.  From 
307e0 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e 20 64 6f  this point on do
307f0 77 6e 2c 20 74 68 65 20 6e 6f 72 6d 61 6c 20 69  wn, the normal i
30800 6e 64 65 6e 74 61 74 69 6f 6e 20 72 75 6c 65 73  ndentation rules
30810 20 61 72 65 0a 2a 2a 20 72 65 73 74 6f 72 65 64   are.** restored
30820 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**************
30830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
30870 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 56  .    }..#ifdef V
30880 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 20 20  DBE_PROFILE.    
30890 7b 0a 20 20 20 20 20 20 75 36 34 20 65 6c 61 70  {.      u64 elap
308a0 73 65 64 20 3d 20 73 71 6c 69 74 65 33 48 77 74  sed = sqlite3Hwt
308b0 69 6d 65 28 29 20 2d 20 73 74 61 72 74 3b 0a 20  ime() - start;. 
308c0 20 20 20 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73       pOp->cycles
308d0 20 2b 3d 20 65 6c 61 70 73 65 64 3b 0a 20 20 20   += elapsed;.   
308e0 20 20 20 70 4f 70 2d 3e 63 6e 74 2b 2b 3b 0a 23     pOp->cnt++;.#
308f0 69 66 20 30 0a 20 20 20 20 20 20 20 20 66 70 72  if 0.        fpr
30900 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25 31  intf(stdout, "%1
30910 30 6c 6c 75 20 22 2c 20 65 6c 61 70 73 65 64 29  0llu ", elapsed)
30920 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
30930 33 56 64 62 65 50 72 69 6e 74 4f 70 28 73 74 64  3VdbePrintOp(std
30940 6f 75 74 2c 20 6f 72 69 67 50 63 2c 20 26 61 4f  out, origPc, &aO
30950 70 5b 6f 72 69 67 50 63 5d 29 3b 0a 23 65 6e 64  p[origPc]);.#end
30960 69 66 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  if.    }.#endif.
30970 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
30980 6f 77 69 6e 67 20 63 6f 64 65 20 61 64 64 73 20  owing code adds 
30990 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 65 20 61  nothing to the a
309a0 63 74 75 61 6c 20 66 75 6e 63 74 69 6f 6e 61 6c  ctual functional
309b0 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ity.    ** of th
309c0 65 20 70 72 6f 67 72 61 6d 2e 20 20 49 74 20 69  e program.  It i
309d0 73 20 6f 6e 6c 79 20 68 65 72 65 20 66 6f 72 20  s only here for 
309e0 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
309f0 67 67 69 6e 67 2e 0a 20 20 20 20 2a 2a 20 4f 6e  gging..    ** On
30a00 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
30a10 20 69 74 20 64 6f 65 73 20 62 75 72 6e 20 43 50   it does burn CP
30a20 55 20 63 79 63 6c 65 73 20 65 76 65 72 79 20 74  U cycles every t
30a30 69 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 20 20  ime through.    
30a40 2a 2a 20 74 68 65 20 65 76 61 6c 75 61 74 6f 72  ** the evaluator
30a50 20 6c 6f 6f 70 2e 20 20 53 6f 20 77 65 20 63 61   loop.  So we ca
30a60 6e 20 6c 65 61 76 65 20 69 74 20 6f 75 74 20 77  n leave it out w
30a70 68 65 6e 20 4e 44 45 42 55 47 20 69 73 20 64 65  hen NDEBUG is de
30a80 66 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 69  fined..    */.#i
30a90 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
30aa0 20 61 73 73 65 72 74 28 20 70 63 3e 3d 2d 31 20   assert( pc>=-1 
30ab0 26 26 20 70 63 3c 70 2d 3e 6e 4f 70 20 29 3b 0a  && pc<p->nOp );.
30ac0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
30ad0 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 2d 3e  EBUG.    if( p->
30ae0 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 69  trace ){.      i
30af0 66 28 20 72 63 21 3d 30 20 29 20 66 70 72 69 6e  f( rc!=0 ) fprin
30b00 74 66 28 70 2d 3e 74 72 61 63 65 2c 22 72 63 3d  tf(p->trace,"rc=
30b10 25 64 5c 6e 22 2c 72 63 29 3b 0a 20 20 20 20 20  %d\n",rc);.     
30b20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 66 6c 61 67   if( pOp->opflag
30b30 73 20 26 20 28 4f 50 46 4c 47 5f 4f 55 54 32 5f  s & (OPFLG_OUT2_
30b40 50 52 45 52 45 4c 45 41 53 45 7c 4f 50 46 4c 47  PRERELEASE|OPFLG
30b50 5f 4f 55 54 32 29 20 29 7b 0a 20 20 20 20 20 20  _OUT2) ){.      
30b60 20 20 72 65 67 69 73 74 65 72 54 72 61 63 65 28    registerTrace(
30b70 70 2d 3e 74 72 61 63 65 2c 20 70 4f 70 2d 3e 70  p->trace, pOp->p
30b80 32 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32  2, &aMem[pOp->p2
30b90 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
30ba0 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 66 6c 61    if( pOp->opfla
30bb0 67 73 20 26 20 4f 50 46 4c 47 5f 4f 55 54 33 20  gs & OPFLG_OUT3 
30bc0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 67 69 73  ){.        regis
30bd0 74 65 72 54 72 61 63 65 28 70 2d 3e 74 72 61 63  terTrace(p->trac
30be0 65 2c 20 70 4f 70 2d 3e 70 33 2c 20 26 61 4d 65  e, pOp->p3, &aMe
30bf0 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20  m[pOp->p3]);.   
30c00 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
30c10 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  f  /* SQLITE_DEB
30c20 55 47 20 2a 2f 0a 23 65 6e 64 69 66 20 20 2f 2a  UG */.#endif  /*
30c30 20 4e 44 45 42 55 47 20 2a 2f 0a 20 20 7d 20 20   NDEBUG */.  }  
30c40 2f 2a 20 54 68 65 20 65 6e 64 20 6f 66 20 74 68  /* The end of th
30c50 65 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 20 74  e for(;;) loop t
30c60 68 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  he loops through
30c70 20 6f 70 63 6f 64 65 73 20 2a 2f 0a 0a 20 20 2f   opcodes */..  /
30c80 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
30c90 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
30ca0 6e 73 20 74 68 61 74 20 65 78 65 63 75 74 69 6f  ns that executio
30cb0 6e 20 69 73 20 66 69 6e 69 73 68 65 64 20 77 69  n is finished wi
30cc0 74 68 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  th.  ** an error
30cd0 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 0a 20   of some kind.. 
30ce0 20 2a 2f 0a 76 64 62 65 5f 65 72 72 6f 72 5f 68   */.vdbe_error_h
30cf0 61 6c 74 3a 0a 20 20 61 73 73 65 72 74 28 20 72  alt:.  assert( r
30d00 63 20 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 72  c );.  p->rc = r
30d10 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  c;.  testcase( s
30d20 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
30d30 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
30d40 73 71 6c 69 74 65 33 5f 6c 6f 67 28 72 63 2c 20  sqlite3_log(rc, 
30d50 22 73 74 61 74 65 6d 65 6e 74 20 61 62 6f 72 74  "statement abort
30d60 73 20 61 74 20 25 64 3a 20 5b 25 73 5d 20 25 73  s at %d: [%s] %s
30d70 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
30d80 20 20 20 20 20 20 20 70 63 2c 20 70 2d 3e 7a 53         pc, p->zS
30d90 71 6c 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  ql, p->zErrMsg);
30da0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  .  sqlite3VdbeHa
30db0 6c 74 28 70 29 3b 0a 20 20 69 66 28 20 72 63 3d  lt(p);.  if( rc=
30dc0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
30dd0 4d 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63  MEM ) db->malloc
30de0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 72 63  Failed = 1;.  rc
30df0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
30e00 0a 20 20 69 66 28 20 72 65 73 65 74 53 63 68 65  .  if( resetSche
30e10 6d 61 4f 6e 46 61 75 6c 74 3e 30 20 29 7b 0a 20  maOnFault>0 ){. 
30e20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f     sqlite3ResetO
30e30 6e 65 53 63 68 65 6d 61 28 64 62 2c 20 72 65 73  neSchema(db, res
30e40 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 2d  etSchemaOnFault-
30e50 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  1);.  }..  /* Th
30e60 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  is is the only w
30e70 61 79 20 6f 75 74 20 6f 66 20 74 68 69 73 20 70  ay out of this p
30e80 72 6f 63 65 64 75 72 65 2e 20 20 57 65 20 68 61  rocedure.  We ha
30e90 76 65 20 74 6f 0a 20 20 2a 2a 20 72 65 6c 65 61  ve to.  ** relea
30ea0 73 65 20 74 68 65 20 6d 75 74 65 78 65 73 20 6f  se the mutexes o
30eb0 6e 20 62 74 72 65 65 73 20 74 68 61 74 20 77 65  n btrees that we
30ec0 72 65 20 61 63 71 75 69 72 65 64 20 61 74 20 74  re acquired at t
30ed0 68 65 0a 20 20 2a 2a 20 74 6f 70 2e 20 2a 2f 0a  he.  ** top. */.
30ee0 76 64 62 65 5f 72 65 74 75 72 6e 3a 0a 20 20 64  vdbe_return:.  d
30ef0 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6c  b->lastRowid = l
30f00 61 73 74 52 6f 77 69 64 3b 0a 20 20 73 71 6c 69  astRowid;.  sqli
30f10 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
30f20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20  .  return rc;.. 
30f30 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
30f40 20 69 66 20 61 20 73 74 72 69 6e 67 20 6f 72 20   if a string or 
30f50 62 6c 6f 62 20 6c 61 72 67 65 72 20 74 68 61 6e  blob larger than
30f60 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
30f70 54 48 0a 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75  TH.  ** is encou
30f80 6e 74 65 72 65 64 2e 0a 20 20 2a 2f 0a 74 6f 6f  ntered..  */.too
30f90 5f 62 69 67 3a 0a 20 20 73 71 6c 69 74 65 33 53  _big:.  sqlite3S
30fa0 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
30fb0 72 4d 73 67 2c 20 64 62 2c 20 22 73 74 72 69 6e  rMsg, db, "strin
30fc0 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69  g or blob too bi
30fd0 67 22 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49  g");.  rc = SQLI
30fe0 54 45 5f 54 4f 4f 42 49 47 3b 0a 20 20 67 6f 74  TE_TOOBIG;.  got
30ff0 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c  o vdbe_error_hal
31000 74 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  t;..  /* Jump to
31010 20 68 65 72 65 20 69 66 20 61 20 6d 61 6c 6c 6f   here if a mallo
31020 63 28 29 20 66 61 69 6c 73 2e 0a 20 20 2a 2f 0a  c() fails..  */.
31030 6e 6f 5f 6d 65 6d 3a 0a 20 20 64 62 2d 3e 6d 61  no_mem:.  db->ma
31040 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
31050 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
31060 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
31070 64 62 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  db, "out of memo
31080 72 79 22 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c  ry");.  rc = SQL
31090 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 67 6f 74  ITE_NOMEM;.  got
310a0 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c  o vdbe_error_hal
310b0 74 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  t;..  /* Jump to
310c0 20 68 65 72 65 20 66 6f 72 20 61 6e 79 20 6f 74   here for any ot
310d0 68 65 72 20 6b 69 6e 64 20 6f 66 20 66 61 74 61  her kind of fata
310e0 6c 20 65 72 72 6f 72 2e 20 20 54 68 65 20 22 72  l error.  The "r
310f0 63 22 20 76 61 72 69 61 62 6c 65 0a 20 20 2a 2a  c" variable.  **
31100 20 73 68 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65   should hold the
31110 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 2e 0a 20   error number.. 
31120 20 2a 2f 0a 61 62 6f 72 74 5f 64 75 65 5f 74 6f   */.abort_due_to
31130 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74  _error:.  assert
31140 28 20 70 2d 3e 7a 45 72 72 4d 73 67 3d 3d 30 20  ( p->zErrMsg==0 
31150 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
31160 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 63 20 3d  locFailed ) rc =
31170 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
31180 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31190 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  IOERR_NOMEM ){. 
311a0 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
311b0 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
311c0 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74   db, "%s", sqlit
311d0 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20  e3ErrStr(rc));. 
311e0 20 7d 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 65   }.  goto vdbe_e
311f0 72 72 6f 72 5f 68 61 6c 74 3b 0a 0a 20 20 2f 2a  rror_halt;..  /*
31200 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66   Jump to here if
31210 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 74   the sqlite3_int
31220 65 72 72 75 70 74 28 29 20 41 50 49 20 73 65 74  errupt() API set
31230 73 20 74 68 65 20 69 6e 74 65 72 72 75 70 74 0a  s the interrupt.
31240 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20 2a 2f 0a    ** flag..  */.
31250 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 69 6e 74  abort_due_to_int
31260 65 72 72 75 70 74 3a 0a 20 20 61 73 73 65 72 74  errupt:.  assert
31270 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72  ( db->u1.isInter
31280 72 75 70 74 65 64 20 29 3b 0a 20 20 72 63 20 3d  rupted );.  rc =
31290 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
312a0 54 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b  T;.  p->rc = rc;
312b0 0a 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72  .  sqlite3SetStr
312c0 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
312d0 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74   db, "%s", sqlit
312e0 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20  e3ErrStr(rc));. 
312f0 20 67 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f 72   goto vdbe_error
31300 5f 68 61 6c 74 3b 0a 7d 0a                       _halt;.}.