/ Hex Artifact Content
Login

Artifact b4d29f875ff2c8506783c6831b2d539cdeb39b91:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ******.** The co
0180: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
0190: 69 6d 70 6c 65 6d 65 6e 74 73 20 65 78 65 63 75  implements execu
01a0: 74 69 6f 6e 20 6d 65 74 68 6f 64 20 6f 66 20 74  tion method of t
01b0: 68 65 20 0a 2a 2a 20 56 69 72 74 75 61 6c 20 44  he .** Virtual D
01c0: 61 74 61 62 61 73 65 20 45 6e 67 69 6e 65 20 28  atabase Engine (
01d0: 56 44 42 45 29 2e 20 20 41 20 73 65 70 61 72 61  VDBE).  A separa
01e0: 74 65 20 66 69 6c 65 20 28 22 76 64 62 65 61 75  te file ("vdbeau
01f0: 78 2e 63 22 29 0a 2a 2a 20 68 61 6e 64 6c 65 73  x.c").** handles
0200: 20 68 6f 75 73 65 6b 65 65 70 69 6e 67 20 64 65   housekeeping de
0210: 74 61 69 6c 73 20 73 75 63 68 20 61 73 20 63 72  tails such as cr
0220: 65 61 74 69 6e 67 20 61 6e 64 20 64 65 6c 65 74  eating and delet
0230: 69 6e 67 0a 2a 2a 20 56 44 42 45 20 69 6e 73 74  ing.** VDBE inst
0240: 61 6e 63 65 73 2e 20 20 54 68 69 73 20 66 69 6c  ances.  This fil
0250: 65 20 69 73 20 73 6f 6c 65 6c 79 20 69 6e 74 65  e is solely inte
0260: 72 65 73 74 65 64 20 69 6e 20 65 78 65 63 75 74  rested in execut
0270: 69 6e 67 0a 2a 2a 20 74 68 65 20 56 44 42 45 20  ing.** the VDBE 
0280: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
0290: 6e 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 69  n the external i
02a0: 6e 74 65 72 66 61 63 65 2c 20 61 6e 20 22 73 71  nterface, an "sq
02b0: 6c 69 74 65 33 5f 73 74 6d 74 2a 22 20 69 73 20  lite3_stmt*" is 
02c0: 61 6e 20 6f 70 61 71 75 65 20 70 6f 69 6e 74 65  an opaque pointe
02d0: 72 0a 2a 2a 20 74 6f 20 61 20 56 44 42 45 2e 0a  r.** to a VDBE..
02e0: 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 20 70 61  **.** The SQL pa
02f0: 72 73 65 72 20 67 65 6e 65 72 61 74 65 73 20 61  rser generates a
0300: 20 70 72 6f 67 72 61 6d 20 77 68 69 63 68 20 69   program which i
0310: 73 20 74 68 65 6e 20 65 78 65 63 75 74 65 64 20  s then executed 
0320: 62 79 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 74  by.** the VDBE t
0330: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
0340: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
0350: 6e 74 2e 20 20 56 44 42 45 20 70 72 6f 67 72 61  nt.  VDBE progra
0360: 6d 73 20 61 72 65 20 0a 2a 2a 20 73 69 6d 69 6c  ms are .** simil
0370: 61 72 20 69 6e 20 66 6f 72 6d 20 74 6f 20 61 73  ar in form to as
0380: 73 65 6d 62 6c 79 20 6c 61 6e 67 75 61 67 65 2e  sembly language.
0390: 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 63 6f    The program co
03a0: 6e 73 69 73 74 73 20 6f 66 0a 2a 2a 20 61 20 6c  nsists of.** a l
03b0: 69 6e 65 61 72 20 73 65 71 75 65 6e 63 65 20 6f  inear sequence o
03c0: 66 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 45  f operations.  E
03d0: 61 63 68 20 6f 70 65 72 61 74 69 6f 6e 20 68 61  ach operation ha
03e0: 73 20 61 6e 20 6f 70 63 6f 64 65 20 0a 2a 2a 20  s an opcode .** 
03f0: 61 6e 64 20 35 20 6f 70 65 72 61 6e 64 73 2e 20  and 5 operands. 
0400: 20 4f 70 65 72 61 6e 64 73 20 50 31 2c 20 50 32   Operands P1, P2
0410: 2c 20 61 6e 64 20 50 33 20 61 72 65 20 69 6e 74  , and P3 are int
0420: 65 67 65 72 73 2e 20 20 4f 70 65 72 61 6e 64 20  egers.  Operand 
0430: 50 34 20 0a 2a 2a 20 69 73 20 61 20 6e 75 6c 6c  P4 .** is a null
0440: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
0450: 6e 67 2e 20 20 4f 70 65 72 61 6e 64 20 50 35 20  ng.  Operand P5 
0460: 69 73 20 61 6e 20 75 6e 73 69 67 6e 65 64 20 63  is an unsigned c
0470: 68 61 72 61 63 74 65 72 2e 0a 2a 2a 20 46 65 77  haracter..** Few
0480: 20 6f 70 63 6f 64 65 73 20 75 73 65 20 61 6c 6c   opcodes use all
0490: 20 35 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2a 0a   5 operands..**.
04a0: 2a 2a 20 43 6f 6d 70 75 74 61 74 69 6f 6e 20 72  ** Computation r
04b0: 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
04c0: 64 20 6f 6e 20 61 20 73 65 74 20 6f 66 20 72 65  d on a set of re
04d0: 67 69 73 74 65 72 73 20 6e 75 6d 62 65 72 65 64  gisters numbered
04e0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69   beginning.** wi
04f0: 74 68 20 31 20 61 6e 64 20 67 6f 69 6e 67 20 75  th 1 and going u
0500: 70 20 74 6f 20 56 64 62 65 2e 6e 4d 65 6d 2e 20  p to Vdbe.nMem. 
0510: 20 45 61 63 68 20 72 65 67 69 73 74 65 72 20 63   Each register c
0520: 61 6e 20 73 74 6f 72 65 0a 2a 2a 20 65 69 74 68  an store.** eith
0530: 65 72 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61  er an integer, a
0540: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
0550: 20 73 74 72 69 6e 67 2c 20 61 20 66 6c 6f 61 74   string, a float
0560: 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d  ing point.** num
0570: 62 65 72 2c 20 6f 72 20 74 68 65 20 53 51 4c 20  ber, or the SQL 
0580: 22 4e 55 4c 4c 22 20 76 61 6c 75 65 2e 20 20 41  "NULL" value.  A
0590: 6e 20 69 6d 70 6c 69 63 69 74 20 63 6f 6e 76 65  n implicit conve
05a0: 72 73 69 6f 6e 20 66 72 6f 6d 20 6f 6e 65 0a 2a  rsion from one.*
05b0: 2a 20 74 79 70 65 20 74 6f 20 74 68 65 20 6f 74  * type to the ot
05c0: 68 65 72 20 6f 63 63 75 72 73 20 61 73 20 6e 65  her occurs as ne
05d0: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 0a 2a 2a 20  cessary..** .** 
05e0: 4d 6f 73 74 20 6f 66 20 74 68 65 20 63 6f 64 65  Most of the code
05f0: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69 73   in this file is
0600: 20 74 61 6b 65 6e 20 75 70 20 62 79 20 74 68 65   taken up by the
0610: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
0620: 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  ().** function w
0630: 68 69 63 68 20 64 6f 65 73 20 74 68 65 20 77 6f  hich does the wo
0640: 72 6b 20 6f 66 20 69 6e 74 65 72 70 72 65 74 69  rk of interpreti
0650: 6e 67 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  ng a VDBE progra
0660: 6d 2e 0a 2a 2a 20 42 75 74 20 6f 74 68 65 72 20  m..** But other 
0670: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 73  routines are als
0680: 6f 20 70 72 6f 76 69 64 65 64 20 74 6f 20 68 65  o provided to he
0690: 6c 70 20 69 6e 20 62 75 69 6c 64 69 6e 67 20 75  lp in building u
06a0: 70 0a 2a 2a 20 61 20 70 72 6f 67 72 61 6d 20 69  p.** a program i
06b0: 6e 73 74 72 75 63 74 69 6f 6e 20 62 79 20 69 6e  nstruction by in
06c0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
06d0: 20 56 61 72 69 6f 75 73 20 73 63 72 69 70 74 73   Various scripts
06e0: 20 73 63 61 6e 20 74 68 69 73 20 73 6f 75 72 63   scan this sourc
06f0: 65 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  e file in order 
0700: 74 6f 20 67 65 6e 65 72 61 74 65 20 48 54 4d 4c  to generate HTML
0710: 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .** documentatio
0720: 6e 2c 20 68 65 61 64 65 72 73 20 66 69 6c 65 73  n, headers files
0730: 2c 20 6f 72 20 6f 74 68 65 72 20 64 65 72 69 76  , or other deriv
0740: 65 64 20 66 69 6c 65 73 2e 20 20 54 68 65 20 66  ed files.  The f
0750: 6f 72 6d 61 74 74 69 6e 67 0a 2a 2a 20 6f 66 20  ormatting.** of 
0760: 74 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73  the code in this
0770: 20 66 69 6c 65 20 69 73 2c 20 74 68 65 72 65 66   file is, theref
0780: 6f 72 65 2c 20 69 6d 70 6f 72 74 61 6e 74 2e 20  ore, important. 
0790: 20 53 65 65 20 6f 74 68 65 72 20 63 6f 6d 6d 65   See other comme
07a0: 6e 74 73 0a 2a 2a 20 69 6e 20 74 68 69 73 20 66  nts.** in this f
07b0: 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ile for details.
07c0: 20 20 49 66 20 69 6e 20 64 6f 75 62 74 2c 20 64    If in doubt, d
07d0: 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72  o not deviate fr
07e0: 6f 6d 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 63  om existing.** c
07f0: 6f 6d 6d 65 6e 74 69 6e 67 20 61 6e 64 20 69 6e  ommenting and in
0800: 64 65 6e 74 61 74 69 6f 6e 20 70 72 61 63 74 69  dentation practi
0810: 63 65 73 20 77 68 65 6e 20 63 68 61 6e 67 69 6e  ces when changin
0820: 67 20 6f 72 20 61 64 64 69 6e 67 20 63 6f 64 65  g or adding code
0830: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
0840: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0850: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
0860: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
0870: 68 69 73 20 6d 61 63 72 6f 20 6f 6e 20 6d 65 6d  his macro on mem
0880: 6f 72 79 20 63 65 6c 6c 73 20 6a 75 73 74 20 70  ory cells just p
0890: 72 69 6f 72 20 74 6f 20 63 68 61 6e 67 69 6e 67  rior to changing
08a0: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
08b0: 20 74 68 65 20 63 65 6c 6c 2e 20 20 54 68 69 73   the cell.  This
08c0: 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73 20   macro verifies 
08d0: 74 68 61 74 20 73 68 61 6c 6c 6f 77 20 63 6f 70  that shallow cop
08e0: 69 65 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 6d  ies are.** not m
08f0: 69 73 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65  isused..*/.#ifde
0900: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 23  f SQLITE_DEBUG.#
0910: 20 64 65 66 69 6e 65 20 6d 65 6d 41 62 6f 75 74   define memAbout
0920: 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 20 73 71  ToChange(P,M) sq
0930: 6c 69 74 65 33 56 64 62 65 4d 65 6d 41 62 6f 75  lite3VdbeMemAbou
0940: 74 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 0a 23  tToChange(P,M).#
0950: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6d 65  else.# define me
0960: 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 50  mAboutToChange(P
0970: 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,M).#endif../*.*
0980: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
0990: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
09a0: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 65  is incremented e
09b0: 76 65 72 79 20 74 69 6d 65 20 61 20 63 75 72 73  very time a curs
09c0: 6f 72 0a 2a 2a 20 6d 6f 76 65 73 2c 20 65 69 74  or.** moves, eit
09d0: 68 65 72 20 62 79 20 74 68 65 20 4f 50 5f 53 65  her by the OP_Se
09e0: 65 6b 58 58 2c 20 4f 50 5f 4e 65 78 74 2c 20 6f  ekXX, OP_Next, o
09f0: 72 20 4f 50 5f 50 72 65 76 20 6f 70 63 6f 64 65  r OP_Prev opcode
0a00: 73 2e 20 20 54 68 65 20 74 65 73 74 0a 2a 2a 20  s.  The test.** 
0a10: 70 72 6f 63 65 64 75 72 65 73 20 75 73 65 20 74  procedures use t
0a20: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
0a30: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
0a40: 74 20 69 6e 64 69 63 65 73 20 61 72 65 0a 2a 2a  t indices are.**
0a50: 20 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 74   working correct
0a60: 6c 79 2e 20 20 54 68 69 73 20 76 61 72 69 61 62  ly.  This variab
0a70: 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69  le has no functi
0a80: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f  on other than to
0a90: 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79 20  .** help verify 
0aa0: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
0ab0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62  ation of the lib
0ac0: 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  rary..*/.#ifdef 
0ad0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
0ae0: 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
0af0: 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
0b00: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
0b10: 73 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  s global variabl
0b20: 65 20 69 73 20 70 6f 73 69 74 69 76 65 2c 20 69  e is positive, i
0b30: 74 20 67 65 74 73 20 64 65 63 72 65 6d 65 6e 74  t gets decrement
0b40: 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 0a 2a  ed once before.*
0b50: 2a 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  * each instructi
0b60: 6f 6e 20 69 6e 20 74 68 65 20 56 44 42 45 2e 20  on in the VDBE. 
0b70: 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
0b80: 20 7a 65 72 6f 2c 20 74 68 65 20 75 31 2e 69 73   zero, the u1.is
0b90: 49 6e 74 65 72 72 75 70 74 65 64 0a 2a 2a 20 66  Interrupted.** f
0ba0: 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69  ield of the sqli
0bb0: 74 65 33 20 73 74 72 75 63 74 75 72 65 20 69 73  te3 structure is
0bc0: 20 73 65 74 20 69 6e 20 6f 72 64 65 72 20 74 6f   set in order to
0bd0: 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6e 74   simulate an int
0be0: 65 72 72 75 70 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  errupt..**.** Th
0bf0: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 75  is facility is u
0c00: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
0c10: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
0c20: 49 74 20 64 6f 65 73 20 6e 6f 74 20 66 75 6e 63  It does not func
0c30: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 6e 20 6f 72  tion.** in an or
0c40: 64 69 6e 61 72 79 20 62 75 69 6c 64 2e 0a 2a 2f  dinary build..*/
0c50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
0c60: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
0c70: 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 20  interrupt_count 
0c80: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
0c90: 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f 62  ** The next glob
0ca0: 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
0cb0: 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68 20  ncremented each 
0cc0: 74 79 70 65 20 74 68 65 20 4f 50 5f 53 6f 72 74  type the OP_Sort
0cd0: 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65 78   opcode.** is ex
0ce0: 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65 73  ecuted.  The tes
0cf0: 74 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 65  t procedures use
0d00: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
0d10: 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  n to make sure t
0d20: 68 61 74 0a 2a 2a 20 73 6f 72 74 69 6e 67 20 69  hat.** sorting i
0d30: 73 20 6f 63 63 75 72 72 69 6e 67 20 6f 72 20 6e  s occurring or n
0d40: 6f 74 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20  ot occurring at 
0d50: 61 70 70 72 6f 70 72 69 61 74 65 20 74 69 6d 65  appropriate time
0d60: 73 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62  s.   This variab
0d70: 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75 6e  le.** has no fun
0d80: 63 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ction other than
0d90: 20 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79 20   to help verify 
0da0: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
0db0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
0dc0: 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64  library..*/.#ifd
0dd0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
0de0: 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f  nt sqlite3_sort_
0df0: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0e00: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  f../*.** The nex
0e10: 74 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  t global variabl
0e20: 65 20 72 65 63 6f 72 64 73 20 74 68 65 20 73 69  e records the si
0e30: 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73  ze of the larges
0e40: 74 20 4d 45 4d 5f 42 6c 6f 62 0a 2a 2a 20 6f 72  t MEM_Blob.** or
0e50: 20 4d 45 4d 5f 53 74 72 20 74 68 61 74 20 68 61   MEM_Str that ha
0e60: 73 20 62 65 65 6e 20 75 73 65 64 20 62 79 20 61  s been used by a
0e70: 20 56 44 42 45 20 6f 70 63 6f 64 65 2e 20 20 54   VDBE opcode.  T
0e80: 68 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72  he test procedur
0e90: 65 73 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 69  es.** use this i
0ea0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6d 61  nformation to ma
0eb0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
0ec0: 20 7a 65 72 6f 2d 62 6c 6f 62 20 66 75 6e 63 74   zero-blob funct
0ed0: 69 6f 6e 61 6c 69 74 79 0a 2a 2a 20 69 73 20 77  ionality.** is w
0ee0: 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 74 6c 79  orking correctly
0ef0: 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62 6c  .   This variabl
0f00: 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69 6f  e has no functio
0f10: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f 0a  n other than to.
0f20: 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79 20 74  ** help verify t
0f30: 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
0f40: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62 72  tion of the libr
0f50: 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ary..*/.#ifdef S
0f60: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
0f70: 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73  qlite3_max_blobs
0f80: 69 7a 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ize = 0;.static 
0f90: 76 6f 69 64 20 75 70 64 61 74 65 4d 61 78 42 6c  void updateMaxBl
0fa0: 6f 62 73 69 7a 65 28 4d 65 6d 20 2a 70 29 7b 0a  obsize(Mem *p){.
0fb0: 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20    if( (p->flags 
0fc0: 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  & (MEM_Str|MEM_B
0fd0: 6c 6f 62 29 29 21 3d 30 20 26 26 20 70 2d 3e 6e  lob))!=0 && p->n
0fe0: 3e 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f  >sqlite3_max_blo
0ff0: 62 73 69 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c  bsize ){.    sql
1000: 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a  ite3_max_blobsiz
1010: 65 20 3d 20 70 2d 3e 6e 3b 0a 20 20 7d 0a 7d 0a  e = p->n;.  }.}.
1020: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1030: 65 20 6e 65 78 74 20 67 6c 6f 62 61 6c 20 76 61  e next global va
1040: 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
1050: 65 6e 74 65 64 20 65 61 63 68 20 74 79 70 65 20  ented each type 
1060: 74 68 65 20 4f 50 5f 46 6f 75 6e 64 20 6f 70 63  the OP_Found opc
1070: 6f 64 65 0a 2a 2a 20 69 73 20 65 78 65 63 75 74  ode.** is execut
1080: 65 64 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  ed. This is used
1090: 20 74 6f 20 74 65 73 74 20 77 68 65 74 68 65 72   to test whether
10a0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 66 6f 72 65   or not the fore
10b0: 69 67 6e 20 6b 65 79 0a 2a 2a 20 6f 70 65 72 61  ign key.** opera
10c0: 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  tion implemented
10d0: 20 75 73 69 6e 67 20 4f 50 5f 46 6b 49 73 5a 65   using OP_FkIsZe
10e0: 72 6f 20 69 73 20 77 6f 72 6b 69 6e 67 2e 20 54  ro is working. T
10f0: 68 69 73 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  his variable.** 
1100: 68 61 73 20 6e 6f 20 66 75 6e 63 74 69 6f 6e 20  has no function 
1110: 6f 74 68 65 72 20 74 68 61 6e 20 74 6f 20 68 65  other than to he
1120: 6c 70 20 76 65 72 69 66 79 20 74 68 65 20 63 6f  lp verify the co
1130: 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
1140: 6f 66 20 74 68 65 0a 2a 2a 20 6c 69 62 72 61 72  of the.** librar
1150: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
1160: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
1170: 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74  ite3_found_count
1180: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
1190: 0a 2a 2a 20 54 65 73 74 20 61 20 72 65 67 69 73  .** Test a regis
11a0: 74 65 72 20 74 6f 20 73 65 65 20 69 66 20 69 74  ter to see if it
11b0: 20 65 78 63 65 65 64 73 20 74 68 65 20 63 75 72   exceeds the cur
11c0: 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 62 6c 6f  rent maximum blo
11d0: 62 20 73 69 7a 65 2e 0a 2a 2a 20 49 66 20 69 74  b size..** If it
11e0: 20 64 6f 65 73 2c 20 72 65 63 6f 72 64 20 74 68   does, record th
11f0: 65 20 6e 65 77 20 6d 61 78 69 6d 75 6d 20 62 6c  e new maximum bl
1200: 6f 62 20 73 69 7a 65 2e 0a 2a 2f 0a 23 69 66 20  ob size..*/.#if 
1210: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1220: 45 53 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  EST) && !defined
1230: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49  (SQLITE_OMIT_BUI
1240: 4c 54 49 4e 5f 54 45 53 54 29 0a 23 20 64 65 66  LTIN_TEST).# def
1250: 69 6e 65 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ine UPDATE_MAX_B
1260: 4c 4f 42 53 49 5a 45 28 50 29 20 20 75 70 64 61  LOBSIZE(P)  upda
1270: 74 65 4d 61 78 42 6c 6f 62 73 69 7a 65 28 50 29  teMaxBlobsize(P)
1280: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1290: 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
12a0: 49 5a 45 28 50 29 0a 23 65 6e 64 69 66 0a 0a 2f  IZE(P).#endif../
12b0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65  *.** Convert the
12c0: 20 67 69 76 65 6e 20 72 65 67 69 73 74 65 72 20   given register 
12d0: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 69 66  into a string if
12e0: 20 69 74 20 69 73 6e 27 74 20 6f 6e 65 0a 2a 2a   it isn't one.**
12f0: 20 61 6c 72 65 61 64 79 2e 20 52 65 74 75 72 6e   already. Return
1300: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 6d   non-zero if a m
1310: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
1320: 2f 0a 23 64 65 66 69 6e 65 20 53 74 72 69 6e 67  /.#define String
1330: 69 66 79 28 50 2c 20 65 6e 63 29 20 5c 0a 20 20  ify(P, enc) \.  
1340: 20 69 66 28 28 28 50 29 2d 3e 66 6c 61 67 73 26   if(((P)->flags&
1350: 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
1360: 62 29 29 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  b))==0 && sqlite
1370: 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67 69 66  3VdbeMemStringif
1380: 79 28 50 2c 65 6e 63 29 29 20 5c 0a 20 20 20 20  y(P,enc)) \.    
1390: 20 7b 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 20   { goto no_mem; 
13a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 65 70 68 65  }../*.** An ephe
13b0: 6d 65 72 61 6c 20 73 74 72 69 6e 67 20 76 61 6c  meral string val
13c0: 75 65 20 28 73 69 67 6e 69 66 69 65 64 20 62 79  ue (signified by
13d0: 20 74 68 65 20 4d 45 4d 5f 45 70 68 65 6d 20 66   the MEM_Ephem f
13e0: 6c 61 67 29 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  lag) contains.**
13f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1400: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
1410: 63 61 74 65 64 20 73 74 72 69 6e 67 20 77 68 65  cated string whe
1420: 72 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 6e  re some other en
1430: 74 69 74 79 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tity.** is respo
1440: 6e 73 69 62 6c 65 20 66 6f 72 20 64 65 61 6c 6c  nsible for deall
1450: 6f 63 61 74 69 6e 67 20 74 68 61 74 20 73 74 72  ocating that str
1460: 69 6e 67 2e 20 20 42 65 63 61 75 73 65 20 74 68  ing.  Because th
1470: 65 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 64 6f  e register.** do
1480: 65 73 20 6e 6f 74 20 63 6f 6e 74 72 6f 6c 20 74  es not control t
1490: 68 65 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 69  he string, it mi
14a0: 67 68 74 20 62 65 20 64 65 6c 65 74 65 64 20 77  ght be deleted w
14b0: 69 74 68 6f 75 74 20 74 68 65 20 72 65 67 69 73  ithout the regis
14c0: 74 65 72 0a 2a 2a 20 6b 6e 6f 77 69 6e 67 20 69  ter.** knowing i
14d0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
14e0: 75 74 69 6e 65 20 63 6f 6e 76 65 72 74 73 20 61  utine converts a
14f0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69  n ephemeral stri
1500: 6e 67 20 69 6e 74 6f 20 61 20 64 79 6e 61 6d 69  ng into a dynami
1510: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 0a  cally allocated.
1520: 2a 2a 20 73 74 72 69 6e 67 20 74 68 61 74 20 74  ** string that t
1530: 68 65 20 72 65 67 69 73 74 65 72 20 69 74 73 65  he register itse
1540: 6c 66 20 63 6f 6e 74 72 6f 6c 73 2e 20 20 49 6e  lf controls.  In
1550: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74   other words, it
1560: 0a 2a 2a 20 63 6f 6e 76 65 72 74 73 20 61 6e 20  .** converts an 
1570: 4d 45 4d 5f 45 70 68 65 6d 20 73 74 72 69 6e 67  MEM_Ephem string
1580: 20 69 6e 74 6f 20 61 6e 20 4d 45 4d 5f 44 79 6e   into an MEM_Dyn
1590: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 23 64 65 66   string..*/.#def
15a0: 69 6e 65 20 44 65 65 70 68 65 6d 65 72 61 6c 69  ine Deephemerali
15b0: 7a 65 28 50 29 20 5c 0a 20 20 20 69 66 28 20 28  ze(P) \.   if( (
15c0: 28 50 29 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 45  (P)->flags&MEM_E
15d0: 70 68 65 6d 29 21 3d 30 20 5c 0a 20 20 20 20 20  phem)!=0 \.     
15e0: 20 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65    && sqlite3Vdbe
15f0: 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c 65  MemMakeWriteable
1600: 28 50 29 20 29 7b 20 67 6f 74 6f 20 6e 6f 5f 6d  (P) ){ goto no_m
1610: 65 6d 3b 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  em;}../* Return 
1620: 74 72 75 65 20 69 66 20 74 68 65 20 63 75 72 73  true if the curs
1630: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 75 73  or was opened us
1640: 69 6e 67 20 74 68 65 20 4f 50 5f 4f 70 65 6e 53  ing the OP_OpenS
1650: 6f 72 74 65 72 20 6f 70 63 6f 64 65 2e 20 2a 2f  orter opcode. */
1660: 0a 23 20 64 65 66 69 6e 65 20 69 73 53 6f 72 74  .# define isSort
1670: 65 72 28 78 29 20 28 28 78 29 2d 3e 70 53 6f 72  er(x) ((x)->pSor
1680: 74 65 72 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 41  ter!=0)../*.** A
1690: 72 67 75 6d 65 6e 74 20 70 4d 65 6d 20 70 6f 69  rgument pMem poi
16a0: 6e 74 73 20 61 74 20 61 20 72 65 67 69 73 74 65  nts at a registe
16b0: 72 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 70  r that will be p
16c0: 61 73 73 65 64 20 74 6f 20 61 0a 2a 2a 20 75 73  assed to a.** us
16d0: 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
16e0: 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 65 64 20  ion or returned 
16f0: 74 6f 20 74 68 65 20 75 73 65 72 20 61 73 20 74  to the user as t
1700: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 71  he result of a q
1710: 75 65 72 79 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  uery..** This ro
1720: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 70  utine sets the p
1730: 4d 65 6d 2d 3e 74 79 70 65 20 76 61 72 69 61 62  Mem->type variab
1740: 6c 65 20 75 73 65 64 20 62 79 20 74 68 65 20 73  le used by the s
1750: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 2a 28 29  qlite3_value_*()
1760: 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 2e 0a 2a   .** routines..*
1770: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
1780: 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28 4d  beMemStoreType(M
1790: 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e 74  em *pMem){.  int
17a0: 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66   flags = pMem->f
17b0: 6c 61 67 73 3b 0a 20 20 69 66 28 20 66 6c 61 67  lags;.  if( flag
17c0: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
17d0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
17e0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20   SQLITE_NULL;.  
17f0: 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 66 6c 61  }.  else if( fla
1800: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
1810: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
1820: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
1830: 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20  .  }.  else if( 
1840: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
1850: 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   ){.    pMem->ty
1860: 70 65 20 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  pe = SQLITE_FLOA
1870: 54 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  T;.  }.  else if
1880: 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ( flags & MEM_St
1890: 72 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  r ){.    pMem->t
18a0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
18b0: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
18c0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
18d0: 49 54 45 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 7d 0a  ITE_BLOB;.  }.}.
18e0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
18f0: 56 64 62 65 43 75 72 73 6f 72 20 6e 75 6d 62 65  VdbeCursor numbe
1900: 72 20 69 43 75 72 2e 20 20 52 65 74 75 72 6e 20  r iCur.  Return 
1910: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e  a pointer to it.
1920: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a    Return NULL.**
1930: 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
1940: 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  f memory..*/.sta
1950: 74 69 63 20 56 64 62 65 43 75 72 73 6f 72 20 2a  tic VdbeCursor *
1960: 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 0a  allocateCursor(.
1970: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
1980: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
1990: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a  irtual machine *
19a0: 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
19b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
19c0: 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 56 64  ex of the new Vd
19d0: 62 65 43 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e  beCursor */.  in
19e0: 74 20 6e 46 69 65 6c 64 2c 20 20 20 20 20 20 20  t nField,       
19f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a00: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 74   fields in the t
1a10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
1a20: 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20  .  int iDb,     
1a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1a40: 62 61 73 65 20 74 68 65 20 63 75 72 73 6f 72 20  base the cursor 
1a50: 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 6f 72 20 2d  belongs to, or -
1a60: 31 20 2a 2f 0a 20 20 69 6e 74 20 69 73 42 74 72  1 */.  int isBtr
1a70: 65 65 43 75 72 73 6f 72 20 20 20 20 20 2f 2a 20  eeCursor     /* 
1a80: 54 72 75 65 20 66 6f 72 20 42 2d 54 72 65 65 2e  True for B-Tree.
1a90: 20 20 46 61 6c 73 65 20 66 6f 72 20 70 73 65 75    False for pseu
1aa0: 64 6f 2d 74 61 62 6c 65 20 6f 72 20 76 74 61 62  do-table or vtab
1ab0: 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 46 69 6e 64   */.){.  /* Find
1ac0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
1ad0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
1ae0: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
1af0: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 0a 20  blob of memory. 
1b00: 20 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72   ** required for
1b10: 20 74 68 69 73 20 56 64 62 65 43 75 72 73 6f 72   this VdbeCursor
1b20: 20 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69   structure. It i
1b30: 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20  s convenient to 
1b40: 75 73 65 20 61 20 0a 20 20 2a 2a 20 76 64 62 65  use a .  ** vdbe
1b50: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   memory cell to 
1b60: 6d 61 6e 61 67 65 20 74 68 65 20 6d 65 6d 6f 72  manage the memor
1b70: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 65 71  y allocation req
1b80: 75 69 72 65 64 20 66 6f 72 20 61 0a 20 20 2a 2a  uired for a.  **
1b90: 20 56 64 62 65 43 75 72 73 6f 72 20 73 74 72 75   VdbeCursor stru
1ba0: 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 66 6f  cture for the fo
1bb0: 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a  llowing reasons:
1bc0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 53  .  **.  **   * S
1bd0: 6f 6d 65 74 69 6d 65 73 20 63 75 72 73 6f 72 20  ometimes cursor 
1be0: 6e 75 6d 62 65 72 73 20 61 72 65 20 75 73 65 64  numbers are used
1bf0: 20 66 6f 72 20 61 20 63 6f 75 70 6c 65 20 6f 66   for a couple of
1c00: 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20   different.  ** 
1c10: 20 20 20 20 70 75 72 70 6f 73 65 73 20 69 6e 20      purposes in 
1c20: 61 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20  a vdbe program. 
1c30: 54 68 65 20 64 69 66 66 65 72 65 6e 74 20 75 73  The different us
1c40: 65 73 20 6d 69 67 68 74 20 72 65 71 75 69 72 65  es might require
1c50: 0a 20 20 2a 2a 20 20 20 20 20 64 69 66 66 65 72  .  **     differ
1c60: 65 6e 74 20 73 69 7a 65 64 20 61 6c 6c 6f 63 61  ent sized alloca
1c70: 74 69 6f 6e 73 2e 20 4d 65 6d 6f 72 79 20 63 65  tions. Memory ce
1c80: 6c 6c 73 20 70 72 6f 76 69 64 65 20 67 72 6f 77  lls provide grow
1c90: 61 62 6c 65 0a 20 20 2a 2a 20 20 20 20 20 61 6c  able.  **     al
1ca0: 6c 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a  locations..  **.
1cb0: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 75 73    **   * When us
1cc0: 69 6e 67 20 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ing ENABLE_MEMOR
1cd0: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 2c 20 6d 65  Y_MANAGEMENT, me
1ce0: 6d 6f 72 79 20 63 65 6c 6c 20 62 75 66 66 65 72  mory cell buffer
1cf0: 73 20 63 61 6e 0a 20 20 2a 2a 20 20 20 20 20 62  s can.  **     b
1d00: 65 20 66 72 65 65 64 20 6c 61 7a 69 6c 79 20 76  e freed lazily v
1d10: 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 5f 72  ia the sqlite3_r
1d20: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20  elease_memory() 
1d30: 41 50 49 2e 20 54 68 69 73 0a 20 20 2a 2a 20 20  API. This.  **  
1d40: 20 20 20 6d 69 6e 69 6d 69 7a 65 73 20 74 68 65     minimizes the
1d50: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 6c 6c 6f   number of mallo
1d60: 63 20 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 20  c calls made by 
1d70: 74 68 65 20 73 79 73 74 65 6d 2e 0a 20 20 2a 2a  the system..  **
1d80: 0a 20 20 2a 2a 20 4d 65 6d 6f 72 79 20 63 65 6c  .  ** Memory cel
1d90: 6c 73 20 66 6f 72 20 63 75 72 73 6f 72 73 20 61  ls for cursors a
1da0: 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  re allocated at 
1db0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 61  the top of the a
1dc0: 64 64 72 65 73 73 0a 20 20 2a 2a 20 73 70 61 63  ddress.  ** spac
1dd0: 65 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28  e. Memory cell (
1de0: 70 2d 3e 6e 4d 65 6d 29 20 63 6f 72 72 65 73 70  p->nMem) corresp
1df0: 6f 6e 64 73 20 74 6f 20 63 75 72 73 6f 72 20 30  onds to cursor 0
1e00: 2e 20 53 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a  . Space for.  **
1e10: 20 63 75 72 73 6f 72 20 31 20 69 73 20 6d 61 6e   cursor 1 is man
1e20: 61 67 65 64 20 62 79 20 6d 65 6d 6f 72 79 20 63  aged by memory c
1e30: 65 6c 6c 20 28 70 2d 3e 6e 4d 65 6d 2d 31 29 2c  ell (p->nMem-1),
1e40: 20 65 74 63 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d   etc..  */.  Mem
1e50: 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65   *pMem = &p->aMe
1e60: 6d 5b 70 2d 3e 6e 4d 65 6d 2d 69 43 75 72 5d 3b  m[p->nMem-iCur];
1e70: 0a 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ..  int nByte;. 
1e80: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78   VdbeCursor *pCx
1e90: 20 3d 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20   = 0;.  nByte = 
1ea0: 0a 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69  .      ROUND8(si
1eb0: 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 29  zeof(VdbeCursor)
1ec0: 29 20 2b 20 0a 20 20 20 20 20 20 28 69 73 42 74  ) + .      (isBt
1ed0: 72 65 65 43 75 72 73 6f 72 3f 73 71 6c 69 74 65  reeCursor?sqlite
1ee0: 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
1ef0: 28 29 3a 30 29 20 2b 20 0a 20 20 20 20 20 20 32  ():0) + .      2
1f00: 2a 6e 46 69 65 6c 64 2a 73 69 7a 65 6f 66 28 75  *nField*sizeof(u
1f10: 33 32 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  32);..  assert( 
1f20: 69 43 75 72 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  iCur<p->nCursor 
1f30: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  );.  if( p->apCs
1f40: 72 5b 69 43 75 72 5d 20 29 7b 0a 20 20 20 20 73  r[iCur] ){.    s
1f50: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
1f60: 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43 73 72  rsor(p, p->apCsr
1f70: 5b 69 43 75 72 5d 29 3b 0a 20 20 20 20 70 2d 3e  [iCur]);.    p->
1f80: 61 70 43 73 72 5b 69 43 75 72 5d 20 3d 20 30 3b  apCsr[iCur] = 0;
1f90: 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
1fa0: 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62  E_OK==sqlite3Vdb
1fb0: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 6e  eMemGrow(pMem, n
1fc0: 42 79 74 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  Byte, 0) ){.    
1fd0: 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20 3d  p->apCsr[iCur] =
1fe0: 20 70 43 78 20 3d 20 28 56 64 62 65 43 75 72 73   pCx = (VdbeCurs
1ff0: 6f 72 2a 29 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20  or*)pMem->z;.   
2000: 20 6d 65 6d 73 65 74 28 70 43 78 2c 20 30 2c 20   memset(pCx, 0, 
2010: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
2020: 72 29 29 3b 0a 20 20 20 20 70 43 78 2d 3e 69 44  r));.    pCx->iD
2030: 62 20 3d 20 69 44 62 3b 0a 20 20 20 20 70 43 78  b = iDb;.    pCx
2040: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
2050: 64 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 65 6c  d;.    if( nFiel
2060: 64 20 29 7b 0a 20 20 20 20 20 20 70 43 78 2d 3e  d ){.      pCx->
2070: 61 54 79 70 65 20 3d 20 28 75 33 32 20 2a 29 26  aType = (u32 *)&
2080: 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38 28 73  pMem->z[ROUND8(s
2090: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
20a0: 29 29 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ))];.    }.    i
20b0: 66 28 20 69 73 42 74 72 65 65 43 75 72 73 6f 72  f( isBtreeCursor
20c0: 20 29 7b 0a 20 20 20 20 20 20 70 43 78 2d 3e 70   ){.      pCx->p
20d0: 43 75 72 73 6f 72 20 3d 20 28 42 74 43 75 72 73  Cursor = (BtCurs
20e0: 6f 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20 26  or*).          &
20f0: 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38 28 73  pMem->z[ROUND8(s
2100: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
2110: 29 29 2b 32 2a 6e 46 69 65 6c 64 2a 73 69 7a 65  ))+2*nField*size
2120: 6f 66 28 75 33 32 29 5d 3b 0a 20 20 20 20 20 20  of(u32)];.      
2130: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
2140: 6f 72 5a 65 72 6f 28 70 43 78 2d 3e 70 43 75 72  orZero(pCx->pCur
2150: 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  sor);.    }.  }.
2160: 20 20 72 65 74 75 72 6e 20 70 43 78 3b 0a 7d 0a    return pCx;.}.
2170: 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 63 6f  ./*.** Try to co
2180: 6e 76 65 72 74 20 61 20 76 61 6c 75 65 20 69 6e  nvert a value in
2190: 74 6f 20 61 20 6e 75 6d 65 72 69 63 20 72 65 70  to a numeric rep
21a0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 66 20 77  resentation if w
21b0: 65 20 63 61 6e 0a 2a 2a 20 64 6f 20 73 6f 20 77  e can.** do so w
21c0: 69 74 68 6f 75 74 20 6c 6f 73 73 20 6f 66 20 69  ithout loss of i
21d0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 6e 20  nformation.  In 
21e0: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
21f0: 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 6f  the string.** lo
2200: 6f 6b 73 20 6c 69 6b 65 20 61 20 6e 75 6d 62 65  oks like a numbe
2210: 72 2c 20 63 6f 6e 76 65 72 74 20 69 74 20 69 6e  r, convert it in
2220: 74 6f 20 61 20 6e 75 6d 62 65 72 2e 20 20 49 66  to a number.  If
2230: 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20   it does not.** 
2240: 6c 6f 6f 6b 20 6c 69 6b 65 20 61 20 6e 75 6d 62  look like a numb
2250: 65 72 2c 20 6c 65 61 76 65 20 69 74 20 61 6c 6f  er, leave it alo
2260: 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ne..*/.static vo
2270: 69 64 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41  id applyNumericA
2280: 66 66 69 6e 69 74 79 28 4d 65 6d 20 2a 70 52 65  ffinity(Mem *pRe
2290: 63 29 7b 0a 20 20 69 66 28 20 28 70 52 65 63 2d  c){.  if( (pRec-
22a0: 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65  >flags & (MEM_Re
22b0: 61 6c 7c 4d 45 4d 5f 49 6e 74 29 29 3d 3d 30 20  al|MEM_Int))==0 
22c0: 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 56  ){.    double rV
22d0: 61 6c 75 65 3b 0a 20 20 20 20 69 36 34 20 69 56  alue;.    i64 iV
22e0: 61 6c 75 65 3b 0a 20 20 20 20 75 38 20 65 6e 63  alue;.    u8 enc
22f0: 20 3d 20 70 52 65 63 2d 3e 65 6e 63 3b 0a 20 20   = pRec->enc;.  
2300: 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66 6c 61    if( (pRec->fla
2310: 67 73 26 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29  gs&MEM_Str)==0 )
2320: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28   return;.    if(
2330: 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 52 65   sqlite3AtoF(pRe
2340: 63 2d 3e 7a 2c 20 26 72 56 61 6c 75 65 2c 20 70  c->z, &rValue, p
2350: 52 65 63 2d 3e 6e 2c 20 65 6e 63 29 3d 3d 30 20  Rec->n, enc)==0 
2360: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
2370: 28 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69  ( 0==sqlite3Atoi
2380: 36 34 28 70 52 65 63 2d 3e 7a 2c 20 26 69 56 61  64(pRec->z, &iVa
2390: 6c 75 65 2c 20 70 52 65 63 2d 3e 6e 2c 20 65 6e  lue, pRec->n, en
23a0: 63 29 20 29 7b 0a 20 20 20 20 20 20 70 52 65 63  c) ){.      pRec
23b0: 2d 3e 75 2e 69 20 3d 20 69 56 61 6c 75 65 3b 0a  ->u.i = iValue;.
23c0: 20 20 20 20 20 20 70 52 65 63 2d 3e 66 6c 61 67        pRec->flag
23d0: 73 20 7c 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  s |= MEM_Int;.  
23e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
23f0: 52 65 63 2d 3e 72 20 3d 20 72 56 61 6c 75 65 3b  Rec->r = rValue;
2400: 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 66 6c 61  .      pRec->fla
2410: 67 73 20 7c 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a  gs |= MEM_Real;.
2420: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
2430: 2a 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 69 73  ** Processing is
2440: 20 64 65 74 65 72 6d 69 6e 65 20 62 79 20 74 68   determine by th
2450: 65 20 61 66 66 69 6e 69 74 79 20 70 61 72 61 6d  e affinity param
2460: 65 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  eter:.**.** SQLI
2470: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3a 0a  TE_AFF_INTEGER:.
2480: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  ** SQLITE_AFF_RE
2490: 41 4c 3a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  AL:.** SQLITE_AF
24a0: 46 5f 4e 55 4d 45 52 49 43 3a 0a 2a 2a 20 20 20  F_NUMERIC:.**   
24b0: 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20   Try to convert 
24c0: 70 52 65 63 20 74 6f 20 61 6e 20 69 6e 74 65 67  pRec to an integ
24d0: 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  er representatio
24e0: 6e 20 6f 72 20 61 20 0a 2a 2a 20 20 20 20 66 6c  n or a .**    fl
24f0: 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 72 65 70  oating-point rep
2500: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 66 20 61  resentation if a
2510: 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73  n integer repres
2520: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 69  entation.**    i
2530: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
2540: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 69   Note that the i
2550: 6e 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74  nteger represent
2560: 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 20 20 20 61  ation is.**    a
2570: 6c 77 61 79 73 20 70 72 65 66 65 72 72 65 64 2c  lways preferred,
2580: 20 65 76 65 6e 20 69 66 20 74 68 65 20 61 66 66   even if the aff
2590: 69 6e 69 74 79 20 69 73 20 52 45 41 4c 2c 20 62  inity is REAL, b
25a0: 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 61 6e 20  ecause.**    an 
25b0: 69 6e 74 65 67 65 72 20 72 65 70 72 65 73 65 6e  integer represen
25c0: 74 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 73  tation is more s
25d0: 70 61 63 65 20 65 66 66 69 63 69 65 6e 74 20 6f  pace efficient o
25e0: 6e 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 53 51  n disk..**.** SQ
25f0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 2a  LITE_AFF_TEXT:.*
2600: 2a 20 20 20 20 43 6f 6e 76 65 72 74 20 70 52 65  *    Convert pRe
2610: 63 20 74 6f 20 61 20 74 65 78 74 20 72 65 70 72  c to a text repr
2620: 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  esentation..**.*
2630: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
2640: 45 3a 0a 2a 2a 20 20 20 20 4e 6f 2d 6f 70 2e 20  E:.**    No-op. 
2650: 20 70 52 65 63 20 69 73 20 75 6e 63 68 61 6e 67   pRec is unchang
2660: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
2670: 69 64 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79  id applyAffinity
2680: 28 0a 20 20 4d 65 6d 20 2a 70 52 65 63 2c 20 20  (.  Mem *pRec,  
2690: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
26a0: 61 6c 75 65 20 74 6f 20 61 70 70 6c 79 20 61 66  alue to apply af
26b0: 66 69 6e 69 74 79 20 74 6f 20 2a 2f 0a 20 20 63  finity to */.  c
26c0: 68 61 72 20 61 66 66 69 6e 69 74 79 2c 20 20 20  har affinity,   
26d0: 20 20 20 2f 2a 20 54 68 65 20 61 66 66 69 6e 69     /* The affini
26e0: 74 79 20 74 6f 20 62 65 20 61 70 70 6c 69 65 64  ty to be applied
26f0: 20 2a 2f 0a 20 20 75 38 20 65 6e 63 20 20 20 20   */.  u8 enc    
2700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2710: 20 74 68 69 73 20 74 65 78 74 20 65 6e 63 6f 64   this text encod
2720: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ing */.){.  if( 
2730: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
2740: 5f 41 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20  _AFF_TEXT ){.   
2750: 20 2f 2a 20 4f 6e 6c 79 20 61 74 74 65 6d 70 74   /* Only attempt
2760: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
2770: 74 6f 20 54 45 58 54 20 69 66 20 74 68 65 72 65  to TEXT if there
2780: 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6f   is an integer o
2790: 72 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 72 65  r real.    ** re
27a0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 28 62 6c  presentation (bl
27b0: 6f 62 20 61 6e 64 20 4e 55 4c 4c 20 64 6f 20 6e  ob and NULL do n
27c0: 6f 74 20 67 65 74 20 63 6f 6e 76 65 72 74 65 64  ot get converted
27d0: 29 20 62 75 74 20 6e 6f 20 73 74 72 69 6e 67 0a  ) but no string.
27e0: 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74      ** represent
27f0: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
2800: 20 20 69 66 28 20 30 3d 3d 28 70 52 65 63 2d 3e    if( 0==(pRec->
2810: 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 20 26  flags&MEM_Str) &
2820: 26 20 28 70 52 65 63 2d 3e 66 6c 61 67 73 26 28  & (pRec->flags&(
2830: 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74  MEM_Real|MEM_Int
2840: 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  )) ){.      sqli
2850: 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67  te3VdbeMemString
2860: 69 66 79 28 70 52 65 63 2c 20 65 6e 63 29 3b 0a  ify(pRec, enc);.
2870: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 63 2d 3e      }.    pRec->
2880: 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 52  flags &= ~(MEM_R
2890: 65 61 6c 7c 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20  eal|MEM_Int);.  
28a0: 7d 65 6c 73 65 20 69 66 28 20 61 66 66 69 6e 69  }else if( affini
28b0: 74 79 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ty!=SQLITE_AFF_N
28c0: 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ONE ){.    asser
28d0: 74 28 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  t( affinity==SQL
28e0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
28f0: 7c 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  || affinity==SQL
2900: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20  ITE_AFF_REAL.   
2910: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 61 66 66            || aff
2920: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
2930: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
2940: 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66   applyNumericAff
2950: 69 6e 69 74 79 28 70 52 65 63 29 3b 0a 20 20 20  inity(pRec);.   
2960: 20 69 66 28 20 70 52 65 63 2d 3e 66 6c 61 67 73   if( pRec->flags
2970: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
2980: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2990: 49 6e 74 65 67 65 72 41 66 66 69 6e 69 74 79 28  IntegerAffinity(
29a0: 70 52 65 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pRec);.    }.  }
29b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
29c0: 20 63 6f 6e 76 65 72 74 20 74 68 65 20 74 79 70   convert the typ
29d0: 65 20 6f 66 20 61 20 66 75 6e 63 74 69 6f 6e 20  e of a function 
29e0: 61 72 67 75 6d 65 6e 74 20 6f 72 20 61 20 72 65  argument or a re
29f0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69  sult column.** i
2a00: 6e 74 6f 20 61 20 6e 75 6d 65 72 69 63 20 72 65  nto a numeric re
2a10: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 55  presentation.  U
2a20: 73 65 20 65 69 74 68 65 72 20 49 4e 54 45 47 45  se either INTEGE
2a30: 52 20 6f 72 20 52 45 41 4c 20 77 68 69 63 68 65  R or REAL whiche
2a40: 76 65 72 0a 2a 2a 20 69 73 20 61 70 70 72 6f 70  ver.** is approp
2a50: 72 69 61 74 65 2e 20 20 42 75 74 20 6f 6e 6c 79  riate.  But only
2a60: 20 64 6f 20 74 68 65 20 63 6f 6e 76 65 72 73 69   do the conversi
2a70: 6f 6e 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  on if it is poss
2a80: 69 62 6c 65 20 77 69 74 68 6f 75 74 0a 2a 2a 20  ible without.** 
2a90: 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72 6d 61 74  loss of informat
2aa0: 69 6f 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ion and return t
2ab0: 68 65 20 72 65 76 69 73 65 64 20 74 79 70 65 20  he revised type 
2ac0: 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  of the argument.
2ad0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
2ae0: 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79  value_numeric_ty
2af0: 70 65 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  pe(sqlite3_value
2b00: 20 2a 70 56 61 6c 29 7b 0a 20 20 4d 65 6d 20 2a   *pVal){.  Mem *
2b10: 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 70 56 61  pMem = (Mem*)pVa
2b20: 6c 3b 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 74  l;.  if( pMem->t
2b30: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype==SQLITE_TEXT
2b40: 20 29 7b 0a 20 20 20 20 61 70 70 6c 79 4e 75 6d   ){.    applyNum
2b50: 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 4d 65  ericAffinity(pMe
2b60: 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  m);.    sqlite3V
2b70: 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28  dbeMemStoreType(
2b80: 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pMem);.  }.  ret
2b90: 75 72 6e 20 70 4d 65 6d 2d 3e 74 79 70 65 3b 0a  urn pMem->type;.
2ba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6f 72 74 65  }../*.** Exporte
2bb0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 61 70 70  d version of app
2bc0: 6c 79 41 66 66 69 6e 69 74 79 28 29 2e 20 54 68  lyAffinity(). Th
2bd0: 69 73 20 6f 6e 65 20 77 6f 72 6b 73 20 6f 6e 20  is one works on 
2be0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20  sqlite3_value*, 
2bf0: 0a 2a 2a 20 6e 6f 74 20 74 68 65 20 69 6e 74 65  .** not the inte
2c00: 72 6e 61 6c 20 4d 65 6d 2a 20 74 79 70 65 2e 0a  rnal Mem* type..
2c10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2c20: 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74  alueApplyAffinit
2c30: 79 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  y(.  sqlite3_val
2c40: 75 65 20 2a 70 56 61 6c 2c 20 0a 20 20 75 38 20  ue *pVal, .  u8 
2c50: 61 66 66 69 6e 69 74 79 2c 20 0a 20 20 75 38 20  affinity, .  u8 
2c60: 65 6e 63 0a 29 7b 0a 20 20 61 70 70 6c 79 41 66  enc.){.  applyAf
2c70: 66 69 6e 69 74 79 28 28 4d 65 6d 20 2a 29 70 56  finity((Mem *)pV
2c80: 61 6c 2c 20 61 66 66 69 6e 69 74 79 2c 20 65 6e  al, affinity, en
2c90: 63 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  c);.}..#ifdef SQ
2ca0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
2cb0: 20 57 72 69 74 65 20 61 20 6e 69 63 65 20 73 74   Write a nice st
2cc0: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
2cd0: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  ion of the conte
2ce0: 6e 74 73 20 6f 66 20 63 65 6c 6c 20 70 4d 65 6d  nts of cell pMem
2cf0: 0a 2a 2a 20 69 6e 74 6f 20 62 75 66 66 65 72 20  .** into buffer 
2d00: 7a 42 75 66 2c 20 6c 65 6e 67 74 68 20 6e 42 75  zBuf, length nBu
2d10: 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  f..*/.void sqlit
2d20: 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79 50  e3VdbeMemPrettyP
2d30: 72 69 6e 74 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  rint(Mem *pMem, 
2d40: 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 63  char *zBuf){.  c
2d50: 68 61 72 20 2a 7a 43 73 72 20 3d 20 7a 42 75 66  har *zCsr = zBuf
2d60: 3b 0a 20 20 69 6e 74 20 66 20 3d 20 70 4d 65 6d  ;.  int f = pMem
2d70: 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20 73 74 61 74  ->flags;..  stat
2d80: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
2d90: 6f 6e 73 74 20 65 6e 63 6e 61 6d 65 73 5b 5d 20  onst encnames[] 
2da0: 3d 20 7b 22 28 58 29 22 2c 20 22 28 38 29 22 2c  = {"(X)", "(8)",
2db0: 20 22 28 31 36 4c 45 29 22 2c 20 22 28 31 36 42   "(16LE)", "(16B
2dc0: 45 29 22 7d 3b 0a 0a 20 20 69 66 28 20 66 26 4d  E)"};..  if( f&M
2dd0: 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 69  EM_Blob ){.    i
2de0: 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 63  nt i;.    char c
2df0: 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d 45  ;.    if( f & ME
2e00: 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 63  M_Dyn ){.      c
2e10: 20 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20 61 73   = 'z';.      as
2e20: 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f  sert( (f & (MEM_
2e30: 53 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68 65 6d  Static|MEM_Ephem
2e40: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c  ))==0 );.    }el
2e50: 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 53  se if( f & MEM_S
2e60: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 63  tatic ){.      c
2e70: 20 3d 20 27 74 27 3b 0a 20 20 20 20 20 20 61 73   = 't';.      as
2e80: 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f  sert( (f & (MEM_
2e90: 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d  Dyn|MEM_Ephem))=
2ea0: 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  =0 );.    }else 
2eb0: 69 66 28 20 66 20 26 20 4d 45 4d 5f 45 70 68 65  if( f & MEM_Ephe
2ec0: 6d 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 27  m ){.      c = '
2ed0: 65 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e';.      assert
2ee0: 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74  ( (f & (MEM_Stat
2ef0: 69 63 7c 4d 45 4d 5f 44 79 6e 29 29 3d 3d 30 20  ic|MEM_Dyn))==0 
2f00: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2f10: 20 20 20 20 63 20 3d 20 27 73 27 3b 0a 20 20 20      c = 's';.   
2f20: 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
2f30: 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43  snprintf(100, zC
2f40: 73 72 2c 20 22 25 63 22 2c 20 63 29 3b 0a 20 20  sr, "%c", c);.  
2f50: 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65    zCsr += sqlite
2f60: 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b  3Strlen30(zCsr);
2f70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2f80: 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72 2c  rintf(100, zCsr,
2f90: 20 22 25 64 5b 22 2c 20 70 4d 65 6d 2d 3e 6e 29   "%d[", pMem->n)
2fa0: 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71  ;.    zCsr += sq
2fb0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
2fc0: 73 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  sr);.    for(i=0
2fd0: 3b 20 69 3c 31 36 20 26 26 20 69 3c 70 4d 65 6d  ; i<16 && i<pMem
2fe0: 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ->n; i++){.     
2ff0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
3000: 66 28 31 30 30 2c 20 7a 43 73 72 2c 20 22 25 30  f(100, zCsr, "%0
3010: 32 58 22 2c 20 28 28 69 6e 74 29 70 4d 65 6d 2d  2X", ((int)pMem-
3020: 3e 7a 5b 69 5d 20 26 20 30 78 46 46 29 29 3b 0a  >z[i] & 0xFF));.
3030: 20 20 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71        zCsr += sq
3040: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
3050: 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  sr);.    }.    f
3060: 6f 72 28 69 3d 30 3b 20 69 3c 31 36 20 26 26 20  or(i=0; i<16 && 
3070: 69 3c 70 4d 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b  i<pMem->n; i++){
3080: 0a 20 20 20 20 20 20 63 68 61 72 20 7a 20 3d 20  .      char z = 
3090: 70 4d 65 6d 2d 3e 7a 5b 69 5d 3b 0a 20 20 20 20  pMem->z[i];.    
30a0: 20 20 69 66 28 20 7a 3c 33 32 20 7c 7c 20 7a 3e    if( z<32 || z>
30b0: 31 32 36 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20  126 ) *zCsr++ = 
30c0: 27 2e 27 3b 0a 20 20 20 20 20 20 65 6c 73 65 20  '.';.      else 
30d0: 2a 7a 43 73 72 2b 2b 20 3d 20 7a 3b 0a 20 20 20  *zCsr++ = z;.   
30e0: 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
30f0: 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43  snprintf(100, zC
3100: 73 72 2c 20 22 5d 25 73 22 2c 20 65 6e 63 6e 61  sr, "]%s", encna
3110: 6d 65 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d 29 3b  mes[pMem->enc]);
3120: 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c  .    zCsr += sql
3130: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73  ite3Strlen30(zCs
3140: 72 29 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20  r);.    if( f & 
3150: 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
3160: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
3170: 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 22 2b 25  tf(100, zCsr,"+%
3180: 64 7a 22 2c 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  dz",pMem->u.nZer
3190: 6f 29 3b 0a 20 20 20 20 20 20 7a 43 73 72 20 2b  o);.      zCsr +
31a0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
31b0: 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20  0(zCsr);.    }. 
31c0: 20 20 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b     *zCsr = '\0';
31d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26  .  }else if( f &
31e0: 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
31f0: 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20 20 20 7a 42  int j, k;.    zB
3200: 75 66 5b 30 5d 20 3d 20 27 20 27 3b 0a 20 20 20  uf[0] = ' ';.   
3210: 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 44 79 6e   if( f & MEM_Dyn
3220: 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31   ){.      zBuf[1
3230: 5d 20 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20 61  ] = 'z';.      a
3240: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
3250: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68 65  _Static|MEM_Ephe
3260: 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65  m))==0 );.    }e
3270: 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f  lse if( f & MEM_
3280: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
3290: 7a 42 75 66 5b 31 5d 20 3d 20 27 74 27 3b 0a 20  zBuf[1] = 't';. 
32a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 66 20       assert( (f 
32b0: 26 20 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45  & (MEM_Dyn|MEM_E
32c0: 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20  phem))==0 );.   
32d0: 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d   }else if( f & M
32e0: 45 4d 5f 45 70 68 65 6d 20 29 7b 0a 20 20 20 20  EM_Ephem ){.    
32f0: 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 65 27 3b    zBuf[1] = 'e';
3300: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
3310: 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c  f & (MEM_Static|
3320: 4d 45 4d 5f 44 79 6e 29 29 3d 3d 30 20 29 3b 0a  MEM_Dyn))==0 );.
3330: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3340: 20 7a 42 75 66 5b 31 5d 20 3d 20 27 73 27 3b 0a   zBuf[1] = 's';.
3350: 20 20 20 20 7d 0a 20 20 20 20 6b 20 3d 20 32 3b      }.    k = 2;
3360: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
3370: 72 69 6e 74 66 28 31 30 30 2c 20 26 7a 42 75 66  rintf(100, &zBuf
3380: 5b 6b 5d 2c 20 22 25 64 22 2c 20 70 4d 65 6d 2d  [k], "%d", pMem-
3390: 3e 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  >n);.    k += sq
33a0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
33b0: 42 75 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a 42 75  Buf[k]);.    zBu
33c0: 66 5b 6b 2b 2b 5d 20 3d 20 27 5b 27 3b 0a 20 20  f[k++] = '[';.  
33d0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31 35 20    for(j=0; j<15 
33e0: 26 26 20 6a 3c 70 4d 65 6d 2d 3e 6e 3b 20 6a 2b  && j<pMem->n; j+
33f0: 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 63 20 3d  +){.      u8 c =
3400: 20 70 4d 65 6d 2d 3e 7a 5b 6a 5d 3b 0a 20 20 20   pMem->z[j];.   
3410: 20 20 20 69 66 28 20 63 3e 3d 30 78 32 30 20 26     if( c>=0x20 &
3420: 26 20 63 3c 30 78 37 66 20 29 7b 0a 20 20 20 20  & c<0x7f ){.    
3430: 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20      zBuf[k++] = 
3440: 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  c;.      }else{.
3450: 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6b 2b 2b          zBuf[k++
3460: 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20 7d  ] = '.';.      }
3470: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b  .    }.    zBuf[
3480: 6b 2b 2b 5d 20 3d 20 27 5d 27 3b 0a 20 20 20 20  k++] = ']';.    
3490: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
34a0: 28 31 30 30 2c 26 7a 42 75 66 5b 6b 5d 2c 20 65  (100,&zBuf[k], e
34b0: 6e 63 6e 61 6d 65 73 5b 70 4d 65 6d 2d 3e 65 6e  ncnames[pMem->en
34c0: 63 5d 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  c]);.    k += sq
34d0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
34e0: 42 75 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a 42 75  Buf[k]);.    zBu
34f0: 66 5b 6b 2b 2b 5d 20 3d 20 30 3b 0a 20 20 7d 0a  f[k++] = 0;.  }.
3500: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
3510: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
3520: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 76 61  .** Print the va
3530: 6c 75 65 20 6f 66 20 61 20 72 65 67 69 73 74 65  lue of a registe
3540: 72 20 66 6f 72 20 74 72 61 63 69 6e 67 20 70 75  r for tracing pu
3550: 72 70 6f 73 65 73 3a 0a 2a 2f 0a 73 74 61 74 69  rposes:.*/.stati
3560: 63 20 76 6f 69 64 20 6d 65 6d 54 72 61 63 65 50  c void memTraceP
3570: 72 69 6e 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20  rint(FILE *out, 
3580: 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  Mem *p){.  if( p
3590: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
35a0: 76 61 6c 69 64 20 29 7b 0a 20 20 20 20 66 70 72  valid ){.    fpr
35b0: 69 6e 74 66 28 6f 75 74 2c 20 22 20 75 6e 64 65  intf(out, " unde
35c0: 66 69 6e 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65  fined");.  }else
35d0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
35e0: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
35f0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 4e  fprintf(out, " N
3600: 55 4c 4c 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ULL");.  }else i
3610: 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 28  f( (p->flags & (
3620: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 53 74 72 29  MEM_Int|MEM_Str)
3630: 29 3d 3d 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f  )==(MEM_Int|MEM_
3640: 53 74 72 29 20 29 7b 0a 20 20 20 20 66 70 72 69  Str) ){.    fpri
3650: 6e 74 66 28 6f 75 74 2c 20 22 20 73 69 3a 25 6c  ntf(out, " si:%l
3660: 6c 64 22 2c 20 70 2d 3e 75 2e 69 29 3b 0a 20 20  ld", p->u.i);.  
3670: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61  }else if( p->fla
3680: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
3690: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
36a0: 20 22 20 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75   " i:%lld", p->u
36b0: 2e 69 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  .i);.#ifndef SQL
36c0: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
36d0: 47 5f 50 4f 49 4e 54 0a 20 20 7d 65 6c 73 65 20  G_POINT.  }else 
36e0: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  if( p->flags & M
36f0: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 66  EM_Real ){.    f
3700: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 72 3a  printf(out, " r:
3710: 25 67 22 2c 20 70 2d 3e 72 29 3b 0a 23 65 6e 64  %g", p->r);.#end
3720: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  if.  }else if( p
3730: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
3740: 77 53 65 74 20 29 7b 0a 20 20 20 20 66 70 72 69  wSet ){.    fpri
3750: 6e 74 66 28 6f 75 74 2c 20 22 20 28 72 6f 77 73  ntf(out, " (rows
3760: 65 74 29 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  et)");.  }else{.
3770: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30      char zBuf[20
3780: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0];.    sqlite3V
3790: 64 62 65 4d 65 6d 50 72 65 74 74 79 50 72 69 6e  dbeMemPrettyPrin
37a0: 74 28 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20  t(p, zBuf);.    
37b0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 22  fprintf(out, " "
37c0: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
37d0: 75 74 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b  ut, "%s", zBuf);
37e0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
37f0: 69 64 20 72 65 67 69 73 74 65 72 54 72 61 63 65  id registerTrace
3800: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e 74 20  (FILE *out, int 
3810: 69 52 65 67 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20  iReg, Mem *p){. 
3820: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 52   fprintf(out, "R
3830: 45 47 5b 25 64 5d 20 3d 20 22 2c 20 69 52 65 67  EG[%d] = ", iReg
3840: 29 3b 0a 20 20 6d 65 6d 54 72 61 63 65 50 72 69  );.  memTracePri
3850: 6e 74 28 6f 75 74 2c 20 70 29 3b 0a 20 20 66 70  nt(out, p);.  fp
3860: 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
3870: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
3880: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
3890: 23 20 20 64 65 66 69 6e 65 20 52 45 47 49 53 54  #  define REGIST
38a0: 45 52 5f 54 52 41 43 45 28 52 2c 4d 29 20 69 66  ER_TRACE(R,M) if
38b0: 28 70 2d 3e 74 72 61 63 65 29 72 65 67 69 73 74  (p->trace)regist
38c0: 65 72 54 72 61 63 65 28 70 2d 3e 74 72 61 63 65  erTrace(p->trace
38d0: 2c 52 2c 4d 29 0a 23 65 6c 73 65 0a 23 20 20 64  ,R,M).#else.#  d
38e0: 65 66 69 6e 65 20 52 45 47 49 53 54 45 52 5f 54  efine REGISTER_T
38f0: 52 41 43 45 28 52 2c 4d 29 0a 23 65 6e 64 69 66  RACE(R,M).#endif
3900: 0a 0a 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  ...#ifdef VDBE_P
3910: 52 4f 46 49 4c 45 0a 0a 2f 2a 20 0a 2a 2a 20 68  ROFILE../* .** h
3920: 77 74 69 6d 65 2e 68 20 63 6f 6e 74 61 69 6e 73  wtime.h contains
3930: 20 69 6e 6c 69 6e 65 20 61 73 73 65 6d 62 6c 65   inline assemble
3940: 72 20 63 6f 64 65 20 66 6f 72 20 69 6d 70 6c 65  r code for imple
3950: 6d 65 6e 74 69 6e 67 20 0a 2a 2a 20 68 69 67 68  menting .** high
3960: 2d 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 69 6d  -performance tim
3970: 69 6e 67 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f  ing routines..*/
3980: 0a 23 69 6e 63 6c 75 64 65 20 22 68 77 74 69 6d  .#include "hwtim
3990: 65 2e 68 22 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a  e.h"..#endif../*
39a0: 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 46 4f  .** The CHECK_FO
39b0: 52 5f 49 4e 54 45 52 52 55 50 54 20 6d 61 63 72  R_INTERRUPT macr
39c0: 6f 20 64 65 66 69 6e 65 64 20 68 65 72 65 20 6c  o defined here l
39d0: 6f 6f 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ooks to see if t
39e0: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e  he.** sqlite3_in
39f0: 74 65 72 72 75 70 74 28 29 20 72 6f 75 74 69 6e  terrupt() routin
3a00: 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  e has been calle
3a10: 64 2e 20 20 49 66 20 69 74 20 68 61 73 20 62 65  d.  If it has be
3a20: 65 6e 2c 20 74 68 65 6e 0a 2a 2a 20 70 72 6f 63  en, then.** proc
3a30: 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 56 44  essing of the VD
3a40: 42 45 20 70 72 6f 67 72 61 6d 20 69 73 20 69 6e  BE program is in
3a50: 74 65 72 72 75 70 74 65 64 2e 0a 2a 2a 0a 2a 2a  terrupted..**.**
3a60: 20 54 68 69 73 20 6d 61 63 72 6f 20 61 64 64 65   This macro adde
3a70: 64 20 74 6f 20 65 76 65 72 79 20 69 6e 73 74 72  d to every instr
3a80: 75 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73  uction that does
3a90: 20 61 20 6a 75 6d 70 20 69 6e 20 6f 72 64 65 72   a jump in order
3aa0: 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
3ab0: 20 61 20 6c 6f 6f 70 2e 20 20 54 68 69 73 20 74   a loop.  This t
3ac0: 65 73 74 20 75 73 65 64 20 74 6f 20 62 65 20 6f  est used to be o
3ad0: 6e 20 65 76 65 72 79 20 73 69 6e 67 6c 65 20 69  n every single i
3ae0: 6e 73 74 72 75 63 74 69 6f 6e 2c 0a 2a 2a 20 62  nstruction,.** b
3af0: 75 74 20 74 68 61 74 20 6d 65 61 6e 74 20 77 65  ut that meant we
3b00: 20 6d 6f 72 65 20 74 65 73 74 69 6e 67 20 74 68   more testing th
3b10: 61 6e 20 77 65 20 6e 65 65 64 65 64 2e 20 20 42  an we needed.  B
3b20: 79 20 6f 6e 6c 79 20 74 65 73 74 69 6e 67 20 74  y only testing t
3b30: 68 65 0a 2a 2a 20 66 6c 61 67 20 6f 6e 20 6a 75  he.** flag on ju
3b40: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2c  mp instructions,
3b50: 20 77 65 20 67 65 74 20 61 20 28 73 6d 61 6c 6c   we get a (small
3b60: 29 20 73 70 65 65 64 20 69 6d 70 72 6f 76 65 6d  ) speed improvem
3b70: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
3b80: 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52 52  CHECK_FOR_INTERR
3b90: 55 50 54 20 5c 0a 20 20 20 69 66 28 20 64 62 2d  UPT \.   if( db-
3ba0: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
3bb0: 64 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  d ) goto abort_d
3bc0: 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70 74 3b  ue_to_interrupt;
3bd0: 0a 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ...#ifndef NDEBU
3be0: 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  G./*.** This fun
3bf0: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
3c00: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
3c10: 20 61 6e 20 61 73 73 65 72 74 28 29 20 65 78 70   an assert() exp
3c20: 72 65 73 73 69 6f 6e 2e 20 49 74 0a 2a 2a 20 63  ression. It.** c
3c30: 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73  hecks that the s
3c40: 71 6c 69 74 65 33 2e 6e 54 72 61 6e 73 61 63 74  qlite3.nTransact
3c50: 69 6f 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20  ion variable is 
3c60: 63 6f 72 72 65 63 74 6c 79 20 73 65 74 20 74 6f  correctly set to
3c70: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
3c80: 66 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f  f non-transactio
3c90: 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 63 75 72  n savepoints cur
3ca0: 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 0a 2a  rently in the .*
3cb0: 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  * linked list st
3cc0: 61 72 74 69 6e 67 20 61 74 20 73 71 6c 69 74 65  arting at sqlite
3cd0: 33 2e 70 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a  3.pSavepoint..**
3ce0: 20 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a   .** Usage:.**.*
3cf0: 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 63 68  *     assert( ch
3d00: 65 63 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e  eckSavepointCoun
3d10: 74 28 64 62 29 20 29 3b 0a 2a 2f 0a 73 74 61 74  t(db) );.*/.stat
3d20: 69 63 20 69 6e 74 20 63 68 65 63 6b 53 61 76 65  ic int checkSave
3d30: 70 6f 69 6e 74 43 6f 75 6e 74 28 73 71 6c 69 74  pointCount(sqlit
3d40: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6e  e3 *db){.  int n
3d50: 20 3d 20 30 3b 0a 20 20 53 61 76 65 70 6f 69 6e   = 0;.  Savepoin
3d60: 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 64 62  t *p;.  for(p=db
3d70: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 20 70 3b  ->pSavepoint; p;
3d80: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 20 6e 2b 2b   p=p->pNext) n++
3d90: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 28  ;.  assert( n==(
3da0: 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b  db->nSavepoint +
3db0: 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69   db->isTransacti
3dc0: 6f 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a  onSavepoint) );.
3dd0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
3de0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  ndif../*.** Tran
3df0: 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61  sfer error messa
3e00: 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20  ge text from an 
3e10: 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72  sqlite3_vtab.zEr
3e20: 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
3e30: 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
3e40: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
3e50: 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74  ite3_malloc) int
3e60: 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67  o a Vdbe.zErrMsg
3e70: 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
3e80: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
3e90: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
3ea0: 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 73 74  DbMalloc)..*/.st
3eb0: 61 74 69 63 20 76 6f 69 64 20 69 6d 70 6f 72 74  atic void import
3ec0: 56 74 61 62 45 72 72 4d 73 67 28 56 64 62 65 20  VtabErrMsg(Vdbe 
3ed0: 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  *p, sqlite3_vtab
3ee0: 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71 6c 69   *pVtab){.  sqli
3ef0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
3f00: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
3f10: 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
3f20: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
3f30: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
3f40: 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  (db, pVtab->zErr
3f50: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Msg);.  sqlite3_
3f60: 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72  free(pVtab->zErr
3f70: 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a  Msg);.  pVtab->z
3f80: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a 0a 0a  ErrMsg = 0;.}...
3f90: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 73  /*.** Execute as
3fa0: 20 6d 75 63 68 20 6f 66 20 61 20 56 44 42 45 20   much of a VDBE 
3fb0: 70 72 6f 67 72 61 6d 20 61 73 20 77 65 20 63 61  program as we ca
3fc0: 6e 20 74 68 65 6e 20 72 65 74 75 72 6e 2e 0a 2a  n then return..*
3fd0: 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  *.** sqlite3Vdbe
3fe0: 4d 61 6b 65 52 65 61 64 79 28 29 20 6d 75 73 74  MakeReady() must
3ff0: 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
4000: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
4010: 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 63 6c  n order to.** cl
4020: 6f 73 65 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ose the program 
4030: 77 69 74 68 20 61 20 66 69 6e 61 6c 20 4f 50 5f  with a final OP_
4040: 48 61 6c 74 20 61 6e 64 20 74 6f 20 73 65 74 20  Halt and to set 
4050: 75 70 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73  up the callbacks
4060: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 72 72 6f  .** and the erro
4070: 72 20 6d 65 73 73 61 67 65 20 70 6f 69 6e 74 65  r message pointe
4080: 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 65 76 65  r..**.** Wheneve
4090: 72 20 61 20 72 6f 77 20 6f 72 20 72 65 73 75 6c  r a row or resul
40a0: 74 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61  t data is availa
40b0: 62 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ble, this routin
40c0: 65 20 77 69 6c 6c 20 65 69 74 68 65 72 0a 2a 2a  e will either.**
40d0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 65 73 75   invoke the resu
40e0: 6c 74 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  lt callback (if 
40f0: 74 68 65 72 65 20 69 73 20 6f 6e 65 29 20 6f 72  there is one) or
4100: 20 72 65 74 75 72 6e 20 77 69 74 68 0a 2a 2a 20   return with.** 
4110: 53 51 4c 49 54 45 5f 52 4f 57 2e 0a 2a 2a 0a 2a  SQLITE_ROW..**.*
4120: 2a 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20  * If an attempt 
4130: 69 73 20 6d 61 64 65 20 74 6f 20 6f 70 65 6e 20  is made to open 
4140: 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62 61 73  a locked databas
4150: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
4160: 74 69 6e 65 0a 2a 2a 20 77 69 6c 6c 20 65 69 74  tine.** will eit
4170: 68 65 72 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  her invoke the b
4180: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  usy callback (if
4190: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 29 20 6f   there is one) o
41a0: 72 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 72 65 74  r it will.** ret
41b0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
41c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
41d0: 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
41e0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77  ror message is w
41f0: 72 69 74 74 65 6e 20 74 6f 20 6d 65 6d 6f 72 79  ritten to memory
4200: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
4210: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
4220: 28 29 20 61 6e 64 20 70 2d 3e 7a 45 72 72 4d 73  () and p->zErrMs
4230: 67 20 69 73 20 6d 61 64 65 20 74 6f 20 70 6f 69  g is made to poi
4240: 6e 74 20 74 6f 20 74 68 61 74 20 6d 65 6d 6f 72  nt to that memor
4250: 79 2e 0a 2a 2a 20 54 68 65 20 65 72 72 6f 72 20  y..** The error 
4260: 63 6f 64 65 20 69 73 20 73 74 6f 72 65 64 20 69  code is stored i
4270: 6e 20 70 2d 3e 72 63 20 61 6e 64 20 74 68 69 73  n p->rc and this
4280: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
4290: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a   SQLITE_ERROR..*
42a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c  *.** If the call
42b0: 62 61 63 6b 20 65 76 65 72 20 72 65 74 75 72 6e  back ever return
42c0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
42d0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 65 78 69   the program exi
42e0: 74 73 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ts.** immediatel
42f0: 79 2e 20 20 54 68 65 72 65 20 77 69 6c 6c 20 62  y.  There will b
4300: 65 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61  e no error messa
4310: 67 65 20 62 75 74 20 74 68 65 20 70 2d 3e 72 63  ge but the p->rc
4320: 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 73 65 74   field is.** set
4330: 20 74 6f 20 53 51 4c 49 54 45 5f 41 42 4f 52 54   to SQLITE_ABORT
4340: 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
4350: 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 53 51  e will return SQ
4360: 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a  LITE_ERROR..**.*
4370: 2a 20 41 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  * A memory alloc
4380: 61 74 69 6f 6e 20 65 72 72 6f 72 20 63 61 75 73  ation error caus
4390: 65 73 20 70 2d 3e 72 63 20 74 6f 20 62 65 20 73  es p->rc to be s
43a0: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d  et to SQLITE_NOM
43b0: 45 4d 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 72  EM and this.** r
43c0: 6f 75 74 69 6e 65 20 74 6f 20 72 65 74 75 72 6e  outine to return
43d0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a   SQLITE_ERROR..*
43e0: 2a 0a 2a 2a 20 4f 74 68 65 72 20 66 61 74 61 6c  *.** Other fatal
43f0: 20 65 72 72 6f 72 73 20 72 65 74 75 72 6e 20 53   errors return S
4400: 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a  QLITE_ERROR..**.
4410: 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
4420: 75 74 69 6e 65 20 68 61 73 20 66 69 6e 69 73 68  utine has finish
4430: 65 64 2c 20 73 71 6c 69 74 65 33 56 64 62 65 46  ed, sqlite3VdbeF
4440: 69 6e 61 6c 69 7a 65 28 29 20 73 68 6f 75 6c 64  inalize() should
4450: 20 62 65 0a 2a 2a 20 75 73 65 64 20 74 6f 20 63   be.** used to c
4460: 6c 65 61 6e 20 75 70 20 74 68 65 20 6d 65 73 73  lean up the mess
4470: 20 74 68 61 74 20 77 61 73 20 6c 65 66 74 20 62   that was left b
4480: 65 68 69 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ehind..*/.int sq
4490: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 0a 20  lite3VdbeExec(. 
44a0: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20   Vdbe *p        
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
44c0: 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20  he VDBE */.){.  
44d0: 69 6e 74 20 70 63 3d 30 3b 20 20 20 20 20 20 20  int pc=0;       
44e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
44f0: 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  e program counte
4500: 72 20 2a 2f 0a 20 20 4f 70 20 2a 61 4f 70 20 3d  r */.  Op *aOp =
4510: 20 70 2d 3e 61 4f 70 3b 20 20 20 20 20 20 20 20   p->aOp;        
4520: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 2d 3e    /* Copy of p->
4530: 61 4f 70 20 2a 2f 0a 20 20 4f 70 20 2a 70 4f 70  aOp */.  Op *pOp
4540: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4550: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
4560: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
4570: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
4580: 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  ;        /* Valu
4590: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
45a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
45b0: 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 54  ->db;       /* T
45c0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
45d0: 20 75 38 20 72 65 73 65 74 53 63 68 65 6d 61 4f   u8 resetSchemaO
45e0: 6e 46 61 75 6c 74 20 3d 20 30 3b 20 2f 2a 20 52  nFault = 0; /* R
45f0: 65 73 65 74 20 73 63 68 65 6d 61 20 61 66 74 65  eset schema afte
4600: 72 20 61 6e 20 65 72 72 6f 72 20 69 66 20 70 6f  r an error if po
4610: 73 69 74 69 76 65 20 2a 2f 0a 20 20 75 38 20 65  sitive */.  u8 e
4620: 6e 63 6f 64 69 6e 67 20 3d 20 45 4e 43 28 64 62  ncoding = ENC(db
4630: 29 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  );     /* The da
4640: 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20  tabase encoding 
4650: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6d 70 61 72  */.  int iCompar
4660: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
4670: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 6c 61 73  /* Result of las
4680: 74 20 4f 50 5f 43 6f 6d 70 61 72 65 20 6f 70 65  t OP_Compare ope
4690: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69  ration */.  unsi
46a0: 67 6e 65 64 20 6e 56 6d 53 74 65 70 20 3d 20 30  gned nVmStep = 0
46b0: 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
46c0: 20 6f 66 20 76 69 72 74 75 61 6c 20 6d 61 63 68   of virtual mach
46d0: 69 6e 65 20 73 74 65 70 73 20 2a 2f 0a 23 69 66  ine steps */.#if
46e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
46f0: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
4700: 43 4b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6e 50  CK.  unsigned nP
4710: 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 20  rogressOps = 0; 
4720: 2f 2a 20 6e 56 6d 53 74 65 70 20 61 74 20 6c 61  /* nVmStep at la
4730: 73 74 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  st progress call
4740: 62 61 63 6b 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  back. */.#endif.
4750: 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 70 2d    Mem *aMem = p-
4760: 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20  >aMem;       /* 
4770: 43 6f 70 79 20 6f 66 20 70 2d 3e 61 4d 65 6d 20  Copy of p->aMem 
4780: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 31 20 3d  */.  Mem *pIn1 =
4790: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
47a0: 2f 2a 20 31 73 74 20 69 6e 70 75 74 20 6f 70 65  /* 1st input ope
47b0: 72 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  rand */.  Mem *p
47c0: 49 6e 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  In2 = 0;        
47d0: 20 20 20 20 20 2f 2a 20 32 6e 64 20 69 6e 70 75       /* 2nd inpu
47e0: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d  t operand */.  M
47f0: 65 6d 20 2a 70 49 6e 33 20 3d 20 30 3b 20 20 20  em *pIn3 = 0;   
4800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 72 64            /* 3rd
4810: 20 69 6e 70 75 74 20 6f 70 65 72 61 6e 64 20 2a   input operand *
4820: 2f 0a 20 20 4d 65 6d 20 2a 70 4f 75 74 20 3d 20  /.  Mem *pOut = 
4830: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
4840: 2a 20 4f 75 74 70 75 74 20 6f 70 65 72 61 6e 64  * Output operand
4850: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d   */.  int *aPerm
4860: 75 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ute = 0;        
4870: 20 2f 2a 20 50 65 72 6d 75 74 61 74 69 6f 6e 20   /* Permutation 
4880: 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 4f  of columns for O
4890: 50 5f 43 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69  P_Compare */.  i
48a0: 36 34 20 6c 61 73 74 52 6f 77 69 64 20 3d 20 64  64 lastRowid = d
48b0: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 20 20 2f  b->lastRowid;  /
48c0: 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
48d0: 20 74 68 65 20 6c 61 73 74 20 69 6e 73 65 72 74   the last insert
48e0: 20 52 4f 57 49 44 20 2a 2f 0a 23 69 66 64 65 66   ROWID */.#ifdef
48f0: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
4900: 75 36 34 20 73 74 61 72 74 3b 20 20 20 20 20 20  u64 start;      
4910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 50             /* CP
4920: 55 20 63 6c 6f 63 6b 20 63 6f 75 6e 74 20 61 74  U clock count at
4930: 20 73 74 61 72 74 20 6f 66 20 6f 70 63 6f 64 65   start of opcode
4940: 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 50 63   */.  int origPc
4950: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4960: 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e   /* Program coun
4970: 74 65 72 20 61 74 20 73 74 61 72 74 20 6f 66 20  ter at start of 
4980: 6f 70 63 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66  opcode */.#endif
4990: 0a 20 20 2f 2a 2a 2a 20 49 4e 53 45 52 54 20 53  .  /*** INSERT S
49a0: 54 41 43 4b 20 55 4e 49 4f 4e 20 48 45 52 45 20  TACK UNION HERE 
49b0: 2a 2a 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  ***/..  assert( 
49c0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
49d0: 41 47 49 43 5f 52 55 4e 20 29 3b 20 20 2f 2a 20  AGIC_RUN );  /* 
49e0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 76  sqlite3_step() v
49f0: 65 72 69 66 69 65 73 20 74 68 69 73 20 2a 2f 0a  erifies this */.
4a00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74    sqlite3VdbeEnt
4a10: 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  er(p);.  if( p->
4a20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
4a30: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
4a40: 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c  happens if a mal
4a50: 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63  loc() inside a c
4a60: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  all to sqlite3_c
4a70: 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a  olumn_text() or.
4a80: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
4a90: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66  olumn_text16() f
4aa0: 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 67  ailed.  */.    g
4ab0: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a  oto no_mem;.  }.
4ac0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
4ad0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
4ae0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
4af0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
4b00: 3e 62 49 73 52 65 61 64 65 72 20 7c 7c 20 70 2d  >bIsReader || p-
4b10: 3e 72 65 61 64 4f 6e 6c 79 21 3d 30 20 29 3b 0a  >readOnly!=0 );.
4b20: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
4b30: 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
4b40: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 29 3b 0a  ->explain==0 );.
4b50: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
4b60: 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  = 0;.  db->busyH
4b70: 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
4b80: 3b 0a 20 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e  ;.  CHECK_FOR_IN
4b90: 54 45 52 52 55 50 54 3b 0a 20 20 73 71 6c 69 74  TERRUPT;.  sqlit
4ba0: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
4bb0: 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  (p);.#ifdef SQLI
4bc0: 54 45 5f 44 45 42 55 47 0a 20 20 73 71 6c 69 74  TE_DEBUG.  sqlit
4bd0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
4be0: 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 70 2d 3e  loc();.  if( p->
4bf0: 70 63 3d 3d 30 20 20 26 26 20 28 70 2d 3e 64 62  pc==0  && (p->db
4c00: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
4c10: 5f 56 64 62 65 4c 69 73 74 69 6e 67 29 21 3d 30  _VdbeListing)!=0
4c20: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4c30: 20 20 20 70 72 69 6e 74 66 28 22 56 44 42 45 20     printf("VDBE 
4c40: 50 72 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67 3a  Program Listing:
4c50: 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  \n");.    sqlite
4c60: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 70 29  3VdbePrintSql(p)
4c70: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
4c80: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
4c90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4ca0: 50 72 69 6e 74 4f 70 28 73 74 64 6f 75 74 2c 20  PrintOp(stdout, 
4cb0: 69 2c 20 26 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  i, &aOp[i]);.   
4cc0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
4cd0: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
4ce0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28  );.#endif.  for(
4cf0: 70 63 3d 70 2d 3e 70 63 3b 20 72 63 3d 3d 53 51  pc=p->pc; rc==SQ
4d00: 4c 49 54 45 5f 4f 4b 3b 20 70 63 2b 2b 29 7b 0a  LITE_OK; pc++){.
4d10: 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d      assert( pc>=
4d20: 30 20 26 26 20 70 63 3c 70 2d 3e 6e 4f 70 20 29  0 && pc<p->nOp )
4d30: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
4d40: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
4d50: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 23 69 66 64 65 66  o no_mem;.#ifdef
4d60: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
4d70: 20 20 6f 72 69 67 50 63 20 3d 20 70 63 3b 0a 20    origPc = pc;. 
4d80: 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
4d90: 65 33 48 77 74 69 6d 65 28 29 3b 0a 23 65 6e 64  e3Hwtime();.#end
4da0: 69 66 0a 20 20 20 20 6e 56 6d 53 74 65 70 2b 2b  if.    nVmStep++
4db0: 3b 0a 20 20 20 20 70 4f 70 20 3d 20 26 61 4f 70  ;.    pOp = &aOp
4dc0: 5b 70 63 5d 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e  [pc];..    /* On
4dd0: 6c 79 20 61 6c 6c 6f 77 20 74 72 61 63 69 6e 67  ly allow tracing
4de0: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
4df0: 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20 20   is defined..   
4e00: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
4e10: 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20  E_DEBUG.    if( 
4e20: 70 2d 3e 74 72 61 63 65 20 29 7b 0a 20 20 20 20  p->trace ){.    
4e30: 20 20 69 66 28 20 70 63 3d 3d 30 20 29 7b 0a 20    if( pc==0 ){. 
4e40: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 56         printf("V
4e50: 44 42 45 20 45 78 65 63 75 74 69 6f 6e 20 54 72  DBE Execution Tr
4e60: 61 63 65 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ace:\n");.      
4e70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
4e80: 6e 74 53 71 6c 28 70 29 3b 0a 20 20 20 20 20 20  ntSql(p);.      
4e90: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
4ea0: 64 62 65 50 72 69 6e 74 4f 70 28 70 2d 3e 74 72  dbePrintOp(p->tr
4eb0: 61 63 65 2c 20 70 63 2c 20 70 4f 70 29 3b 0a 20  ace, pc, pOp);. 
4ec0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
4ed0: 20 20 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b    ..    /* Check
4ee0: 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
4ef0: 65 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  ed to simulate a
4f00: 6e 20 69 6e 74 65 72 72 75 70 74 2e 20 20 54 68  n interrupt.  Th
4f10: 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 0a  is only happens.
4f20: 20 20 20 20 2a 2a 20 69 66 20 77 65 20 68 61 76      ** if we hav
4f30: 65 20 61 20 73 70 65 63 69 61 6c 20 74 65 73 74  e a special test
4f40: 20 62 75 69 6c 64 2e 0a 20 20 20 20 2a 2f 0a 23   build..    */.#
4f50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
4f60: 54 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  T.    if( sqlite
4f70: 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e  3_interrupt_coun
4f80: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  t>0 ){.      sql
4f90: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63  ite3_interrupt_c
4fa0: 6f 75 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 69 66  ount--;.      if
4fb0: 28 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  ( sqlite3_interr
4fc0: 75 70 74 5f 63 6f 75 6e 74 3d 3d 30 20 29 7b 0a  upt_count==0 ){.
4fd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
4fe0: 69 6e 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20  interrupt(db);. 
4ff0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
5000: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 4f 6e 20 61  dif..    /* On a
5010: 6e 79 20 6f 70 63 6f 64 65 20 77 69 74 68 20 74  ny opcode with t
5020: 68 65 20 22 6f 75 74 32 2d 70 72 65 72 65 6c 65  he "out2-prerele
5030: 61 73 65 22 20 74 61 67 2c 20 66 72 65 65 20 61  ase" tag, free a
5040: 6e 79 0a 20 20 20 20 2a 2a 20 65 78 74 65 72 6e  ny.    ** extern
5050: 61 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f  al allocations o
5060: 75 74 20 6f 66 20 6d 65 6d 5b 70 32 5d 20 61 6e  ut of mem[p2] an
5070: 64 20 73 65 74 20 6d 65 6d 5b 70 32 5d 20 74 6f  d set mem[p2] to
5080: 20 62 65 0a 20 20 20 20 2a 2a 20 61 6e 20 75 6e   be.    ** an un
5090: 64 65 66 69 6e 65 64 20 69 6e 74 65 67 65 72 2e  defined integer.
50a0: 20 20 4f 70 63 6f 64 65 73 20 77 69 6c 6c 20 65    Opcodes will e
50b0: 69 74 68 65 72 20 66 69 6c 6c 20 69 6e 20 74 68  ither fill in th
50c0: 65 20 69 6e 74 65 67 65 72 0a 20 20 20 20 2a 2a  e integer.    **
50d0: 20 76 61 6c 75 65 20 6f 72 20 63 6f 6e 76 65 72   value or conver
50e0: 74 20 6d 65 6d 5b 70 32 5d 20 74 6f 20 61 20 64  t mem[p2] to a d
50f0: 69 66 66 65 72 65 6e 74 20 74 79 70 65 2e 0a 20  ifferent type.. 
5100: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
5110: 28 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 3d 3d  ( pOp->opflags==
5120: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
5130: 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64  perty[pOp->opcod
5140: 65 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  e] );.    if( pO
5150: 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46  p->opflags & OPF
5160: 4c 47 5f 4f 55 54 32 5f 50 52 45 52 45 4c 45 41  LG_OUT2_PRERELEA
5170: 53 45 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  SE ){.      asse
5180: 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b  rt( pOp->p2>0 );
5190: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
51a0: 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d 20  Op->p2<=p->nMem 
51b0: 29 3b 0a 20 20 20 20 20 20 70 4f 75 74 20 3d 20  );.      pOut = 
51c0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
51d0: 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f        memAboutTo
51e0: 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b  Change(p, pOut);
51f0: 0a 20 20 20 20 20 20 56 64 62 65 4d 65 6d 52 65  .      VdbeMemRe
5200: 6c 65 61 73 65 28 70 4f 75 74 29 3b 0a 20 20 20  lease(pOut);.   
5210: 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d     pOut->flags =
5220: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 7d 0a   MEM_Int;.    }.
5230: 0a 20 20 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  .    /* Sanity c
5240: 68 65 63 6b 69 6e 67 20 6f 6e 20 6f 74 68 65 72  hecking on other
5250: 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 23 69 66   operands */.#if
5260: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
5270: 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f  .    if( (pOp->o
5280: 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 49  pflags & OPFLG_I
5290: 4e 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  N1)!=0 ){.      
52a0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
52b0: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
52c0: 74 28 20 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e  t( pOp->p1<=p->n
52d0: 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Mem );.      ass
52e0: 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
52f0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20  &aMem[pOp->p1]) 
5300: 29 3b 0a 20 20 20 20 20 20 52 45 47 49 53 54 45  );.      REGISTE
5310: 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c  R_TRACE(pOp->p1,
5320: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29   &aMem[pOp->p1])
5330: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5340: 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20  (pOp->opflags & 
5350: 4f 50 46 4c 47 5f 49 4e 32 29 21 3d 30 20 29 7b  OPFLG_IN2)!=0 ){
5360: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
5370: 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20  Op->p2>0 );.    
5380: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
5390: 32 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  2<=p->nMem );.  
53a0: 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
53b0: 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70  sValid(&aMem[pOp
53c0: 2d 3e 70 32 5d 29 20 29 3b 0a 20 20 20 20 20 20  ->p2]) );.      
53d0: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
53e0: 4f 70 2d 3e 70 32 2c 20 26 61 4d 65 6d 5b 70 4f  Op->p2, &aMem[pO
53f0: 70 2d 3e 70 32 5d 29 3b 0a 20 20 20 20 7d 0a 20  p->p2]);.    }. 
5400: 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66     if( (pOp->opf
5410: 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 49 4e 33  lags & OPFLG_IN3
5420: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  )!=0 ){.      as
5430: 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20  sert( pOp->p3>0 
5440: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
5450: 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65   pOp->p3<=p->nMe
5460: 6d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  m );.      asser
5470: 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61  t( memIsValid(&a
5480: 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20 29 3b  Mem[pOp->p3]) );
5490: 0a 20 20 20 20 20 20 52 45 47 49 53 54 45 52 5f  .      REGISTER_
54a0: 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 26  TRACE(pOp->p3, &
54b0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a  aMem[pOp->p3]);.
54c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
54d0: 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50  Op->opflags & OP
54e0: 46 4c 47 5f 4f 55 54 32 29 21 3d 30 20 29 7b 0a  FLG_OUT2)!=0 ){.
54f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
5500: 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20 20  p->p2>0 );.     
5510: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
5520: 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20  <=p->nMem );.   
5530: 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61     memAboutToCha
5540: 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70  nge(p, &aMem[pOp
5550: 2d 3e 70 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ->p2]);.    }.  
5560: 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c    if( (pOp->opfl
5570: 61 67 73 20 26 20 4f 50 46 4c 47 5f 4f 55 54 33  ags & OPFLG_OUT3
5580: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  )!=0 ){.      as
5590: 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20  sert( pOp->p3>0 
55a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
55b0: 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65   pOp->p3<=p->nMe
55c0: 6d 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62  m );.      memAb
55d0: 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 26  outToChange(p, &
55e0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a  aMem[pOp->p3]);.
55f0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a      }.#endif.  .
5600: 20 20 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d      switch( pOp-
5610: 3e 6f 70 63 6f 64 65 20 29 7b 0a 0a 2f 2a 2a 2a  >opcode ){../***
5620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 57 68  **********.** Wh
5670: 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 61 20  at follows is a 
5680: 6d 61 73 73 69 76 65 20 73 77 69 74 63 68 20 73  massive switch s
5690: 74 61 74 65 6d 65 6e 74 20 77 68 65 72 65 20 65  tatement where e
56a0: 61 63 68 20 63 61 73 65 20 69 6d 70 6c 65 6d 65  ach case impleme
56b0: 6e 74 73 20 61 0a 2a 2a 20 73 65 70 61 72 61 74  nts a.** separat
56c0: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e  e instruction in
56d0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
56e0: 68 69 6e 65 2e 20 20 49 66 20 77 65 20 66 6f 6c  hine.  If we fol
56f0: 6c 6f 77 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a  low the usual.**
5700: 20 69 6e 64 65 6e 74 61 74 69 6f 6e 20 63 6f 6e   indentation con
5710: 76 65 6e 74 69 6f 6e 73 2c 20 65 61 63 68 20 63  ventions, each c
5720: 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ase should be in
5730: 64 65 6e 74 65 64 20 62 79 20 36 20 73 70 61 63  dented by 6 spac
5740: 65 73 2e 20 20 42 75 74 0a 2a 2a 20 74 68 61 74  es.  But.** that
5750: 20 69 73 20 61 20 6c 6f 74 20 6f 66 20 77 61 73   is a lot of was
5760: 74 65 64 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ted space on the
5770: 20 6c 65 66 74 20 6d 61 72 67 69 6e 2e 20 20 53   left margin.  S
5780: 6f 20 74 68 65 20 63 6f 64 65 20 77 69 74 68 69  o the code withi
5790: 6e 0a 2a 2a 20 74 68 65 20 73 77 69 74 63 68 20  n.** the switch 
57a0: 73 74 61 74 65 6d 65 6e 74 20 77 69 6c 6c 20 62  statement will b
57b0: 72 65 61 6b 20 77 69 74 68 20 63 6f 6e 76 65 6e  reak with conven
57c0: 74 69 6f 6e 20 61 6e 64 20 62 65 20 66 6c 75 73  tion and be flus
57d0: 68 2d 6c 65 66 74 2e 20 41 6e 6f 74 68 65 72 0a  h-left. Another.
57e0: 2a 2a 20 62 69 67 20 63 6f 6d 6d 65 6e 74 20 28  ** big comment (
57f0: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 69 73 20  similar to this 
5800: 6f 6e 65 29 20 77 69 6c 6c 20 6d 61 72 6b 20 74  one) will mark t
5810: 68 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  he point in the 
5820: 63 6f 64 65 20 77 68 65 72 65 0a 2a 2a 20 77 65  code where.** we
5830: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
5840: 20 74 6f 20 6e 6f 72 6d 61 6c 20 69 6e 64 65 6e   to normal inden
5850: 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  tation..**.** Th
5860: 65 20 66 6f 72 6d 61 74 74 69 6e 67 20 6f 66 20  e formatting of 
5870: 65 61 63 68 20 63 61 73 65 20 69 73 20 69 6d 70  each case is imp
5880: 6f 72 74 61 6e 74 2e 20 20 54 68 65 20 6d 61 6b  ortant.  The mak
5890: 65 66 69 6c 65 20 66 6f 72 20 53 51 4c 69 74 65  efile for SQLite
58a0: 0a 2a 2a 20 67 65 6e 65 72 61 74 65 73 20 74 77  .** generates tw
58b0: 6f 20 43 20 66 69 6c 65 73 20 22 6f 70 63 6f 64  o C files "opcod
58c0: 65 73 2e 68 22 20 61 6e 64 20 22 6f 70 63 6f 64  es.h" and "opcod
58d0: 65 73 2e 63 22 20 62 79 20 73 63 61 6e 6e 69 6e  es.c" by scannin
58e0: 67 20 74 68 69 73 0a 2a 2a 20 66 69 6c 65 20 6c  g this.** file l
58f0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 6c 69 6e 65 73  ooking for lines
5900: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
5910: 20 22 63 61 73 65 20 4f 50 5f 22 2e 20 20 54 68   "case OP_".  Th
5920: 65 20 6f 70 63 6f 64 65 73 2e 68 20 66 69 6c 65  e opcodes.h file
5930: 73 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 66 69 6c  s.** will be fil
5940: 6c 65 64 20 77 69 74 68 20 23 64 65 66 69 6e 65  led with #define
5950: 73 20 74 68 61 74 20 67 69 76 65 20 75 6e 69 71  s that give uniq
5960: 75 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  ue integer value
5970: 73 20 74 6f 20 65 61 63 68 0a 2a 2a 20 6f 70 63  s to each.** opc
5980: 6f 64 65 20 61 6e 64 20 74 68 65 20 6f 70 63 6f  ode and the opco
5990: 64 65 73 2e 63 20 66 69 6c 65 20 69 73 20 66 69  des.c file is fi
59a0: 6c 6c 65 64 20 77 69 74 68 20 61 6e 20 61 72 72  lled with an arr
59b0: 61 79 20 6f 66 20 73 74 72 69 6e 67 73 20 77 68  ay of strings wh
59c0: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 74 72 69  ere.** each stri
59d0: 6e 67 20 69 73 20 74 68 65 20 73 79 6d 62 6f 6c  ng is the symbol
59e0: 69 63 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ic name for the 
59f0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6f 70  corresponding op
5a00: 63 6f 64 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a  code.  If the.**
5a10: 20 63 61 73 65 20 73 74 61 74 65 6d 65 6e 74 20   case statement 
5a20: 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  is followed by a
5a30: 20 63 6f 6d 6d 65 6e 74 20 6f 66 20 74 68 65 20   comment of the 
5a40: 66 6f 72 6d 20 22 2f 23 20 73 61 6d 65 20 61 73  form "/# same as
5a50: 20 2e 2e 2e 20 23 2f 22 0a 2a 2a 20 74 68 61 74   ... #/".** that
5a60: 20 63 6f 6d 6d 65 6e 74 20 69 73 20 75 73 65 64   comment is used
5a70: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
5a80: 65 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c  e particular val
5a90: 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  ue of the opcode
5aa0: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 20 6b 65  ..**.** Other ke
5ab0: 79 77 6f 72 64 73 20 69 6e 20 74 68 65 20 63 6f  ywords in the co
5ac0: 6d 6d 65 6e 74 20 74 68 61 74 20 66 6f 6c 6c 6f  mment that follo
5ad0: 77 73 20 65 61 63 68 20 63 61 73 65 20 61 72 65  ws each case are
5ae0: 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e 73   used to.** cons
5af0: 74 72 75 63 74 20 74 68 65 20 4f 50 46 4c 47 5f  truct the OPFLG_
5b00: 49 4e 49 54 49 41 4c 49 5a 45 52 20 76 61 6c 75  INITIALIZER valu
5b10: 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a  e that initializ
5b20: 65 73 20 6f 70 63 6f 64 65 50 72 6f 70 65 72 74  es opcodePropert
5b30: 79 5b 5d 2e 0a 2a 2a 20 4b 65 79 77 6f 72 64 73  y[]..** Keywords
5b40: 20 69 6e 63 6c 75 64 65 3a 20 69 6e 31 2c 20 69   include: in1, i
5b50: 6e 32 2c 20 69 6e 33 2c 20 6f 75 74 32 5f 70 72  n2, in3, out2_pr
5b60: 65 72 65 6c 65 61 73 65 2c 20 6f 75 74 32 2c 20  erelease, out2, 
5b70: 6f 75 74 33 2e 20 20 53 65 65 0a 2a 2a 20 74 68  out3.  See.** th
5b80: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
5b90: 73 63 72 69 70 74 20 66 6f 72 20 61 64 64 69 74  script for addit
5ba0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
5bb0: 6e 2e 0a 2a 2a 0a 2a 2a 20 44 6f 63 75 6d 65 6e  n..**.** Documen
5bc0: 74 61 74 69 6f 6e 20 61 62 6f 75 74 20 56 44 42  tation about VDB
5bd0: 45 20 6f 70 63 6f 64 65 73 20 69 73 20 67 65 6e  E opcodes is gen
5be0: 65 72 61 74 65 64 20 62 79 20 73 63 61 6e 6e 69  erated by scanni
5bf0: 6e 67 20 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20  ng this file.** 
5c00: 66 6f 72 20 6c 69 6e 65 73 20 6f 66 20 74 68 61  for lines of tha
5c10: 74 20 63 6f 6e 74 61 69 6e 20 22 4f 70 63 6f 64  t contain "Opcod
5c20: 65 3a 22 2e 20 20 54 68 61 74 20 6c 69 6e 65 20  e:".  That line 
5c30: 61 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  and all subseque
5c40: 6e 74 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 6c 69  nt.** comment li
5c50: 6e 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20  nes are used in 
5c60: 74 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f  the generation o
5c70: 66 20 74 68 65 20 6f 70 63 6f 64 65 2e 68 74 6d  f the opcode.htm
5c80: 6c 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 0a  l documentation.
5c90: 2a 2a 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  ** file..**.** S
5ca0: 55 4d 4d 41 52 59 3a 0a 2a 2a 0a 2a 2a 20 20 20  UMMARY:.**.**   
5cb0: 20 20 46 6f 72 6d 61 74 74 69 6e 67 20 69 73 20    Formatting is 
5cc0: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 63 72  important to scr
5cd0: 69 70 74 73 20 74 68 61 74 20 73 63 61 6e 20 74  ipts that scan t
5ce0: 68 69 73 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  his file..**    
5cf0: 20 44 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20   Do not deviate 
5d00: 66 72 6f 6d 20 74 68 65 20 66 6f 72 6d 61 74 74  from the formatt
5d10: 69 6e 67 20 73 74 79 6c 65 20 63 75 72 72 65 6e  ing style curren
5d20: 74 6c 79 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  tly in use..**.*
5d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
5d80: 2a 20 4f 70 63 6f 64 65 3a 20 20 47 6f 74 6f 20  * Opcode:  Goto 
5d90: 2a 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  * P2 * * *.**.**
5da0: 20 41 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61   An unconditiona
5db0: 6c 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73  l jump to addres
5dc0: 73 20 50 32 2e 0a 2a 2a 20 54 68 65 20 6e 65 78  s P2..** The nex
5dd0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 78  t instruction ex
5de0: 65 63 75 74 65 64 20 77 69 6c 6c 20 62 65 20 0a  ecuted will be .
5df0: 2a 2a 20 74 68 65 20 6f 6e 65 20 61 74 20 69 6e  ** the one at in
5e00: 64 65 78 20 50 32 20 66 72 6f 6d 20 74 68 65 20  dex P2 from the 
5e10: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
5e20: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  the program..*/.
5e30: 63 61 73 65 20 4f 50 5f 47 6f 74 6f 3a 20 7b 20  case OP_Goto: { 
5e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
5e50: 75 6d 70 20 2a 2f 0a 20 20 70 63 20 3d 20 70 4f  ump */.  pc = pO
5e60: 70 2d 3e 70 32 20 2d 20 31 3b 0a 0a 20 20 2f 2a  p->p2 - 1;..  /*
5e70: 20 4f 70 63 6f 64 65 73 20 74 68 61 74 20 61 72   Opcodes that ar
5e80: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 62 6f  e used as the bo
5e90: 74 74 6f 6d 20 6f 66 20 61 20 6c 6f 6f 70 20 28  ttom of a loop (
5ea0: 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76  OP_Next, OP_Prev
5eb0: 2c 0a 20 20 2a 2a 20 4f 50 5f 56 4e 65 78 74 2c  ,.  ** OP_VNext,
5ec0: 20 4f 50 5f 52 6f 77 53 65 74 4e 65 78 74 2c 20   OP_RowSetNext, 
5ed0: 6f 72 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  or OP_SorterNext
5ee0: 29 20 61 6c 6c 20 6a 75 6d 70 20 68 65 72 65 20  ) all jump here 
5ef0: 75 70 6f 6e 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65  upon.  ** comple
5f00: 74 69 6f 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20  tion.  Check to 
5f10: 73 65 65 20 69 66 20 73 71 6c 69 74 65 33 5f 69  see if sqlite3_i
5f20: 6e 74 65 72 72 75 70 74 28 29 20 68 61 73 20 62  nterrupt() has b
5f30: 65 65 6e 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20  een called.  ** 
5f40: 6f 72 20 69 66 20 74 68 65 20 70 72 6f 67 72 65  or if the progre
5f50: 73 73 20 63 61 6c 6c 62 61 63 6b 20 6e 65 65 64  ss callback need
5f60: 73 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e  s to be invoked.
5f70: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
5f80: 20 63 6f 64 65 20 75 73 65 73 20 75 6e 73 74 72   code uses unstr
5f90: 75 63 74 75 72 65 64 20 22 67 6f 74 6f 22 20 73  uctured "goto" s
5fa0: 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 64 6f  tatements and do
5fb0: 65 73 20 6e 6f 74 20 6c 6f 6f 6b 20 63 6c 65 61  es not look clea
5fc0: 6e 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 61 74  n..  ** But that
5fd0: 20 69 73 20 6e 6f 74 20 64 75 65 20 74 6f 20 73   is not due to s
5fe0: 6c 6f 70 70 79 20 63 6f 64 69 6e 67 20 68 61 62  loppy coding hab
5ff0: 69 74 73 2e 20 54 68 65 20 63 6f 64 65 20 69 73  its. The code is
6000: 20 77 72 69 74 74 65 6e 20 74 68 69 73 0a 20 20   written this.  
6010: 2a 2a 20 77 61 79 20 66 6f 72 20 70 65 72 66 6f  ** way for perfo
6020: 72 6d 61 6e 63 65 2c 20 74 6f 20 61 76 6f 69 64  rmance, to avoid
6030: 20 68 61 76 69 6e 67 20 74 6f 20 72 75 6e 20 74   having to run t
6040: 68 65 20 69 6e 74 65 72 72 75 70 74 20 61 6e 64  he interrupt and
6050: 20 70 72 6f 67 72 65 73 73 0a 20 20 2a 2a 20 63   progress.  ** c
6060: 68 65 63 6b 73 20 6f 6e 20 65 76 65 72 79 20 6f  hecks on every o
6070: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 68 65 6c  pcode.  This hel
6080: 70 73 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  ps sqlite3_step(
6090: 29 20 74 6f 20 72 75 6e 20 61 62 6f 75 74 20 31  ) to run about 1
60a0: 2e 35 25 0a 20 20 2a 2a 20 66 61 73 74 65 72 20  .5%.  ** faster 
60b0: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 22 76 61  according to "va
60c0: 6c 67 72 69 6e 64 20 2d 2d 74 6f 6f 6c 3d 63 61  lgrind --tool=ca
60d0: 63 68 65 67 72 69 6e 64 22 20 2a 2f 0a 63 68 65  chegrind" */.che
60e0: 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70 74  ck_for_interrupt
60f0: 3a 0a 20 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e  :.  CHECK_FOR_IN
6100: 54 45 52 52 55 50 54 3b 0a 23 69 66 6e 64 65 66  TERRUPT;.#ifndef
6110: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
6120: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20  GRESS_CALLBACK. 
6130: 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20 70 72 6f   /* Call the pro
6140: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 69  gress callback i
6150: 66 20 69 74 20 69 73 20 63 6f 6e 66 69 67 75 72  f it is configur
6160: 65 64 20 61 6e 64 20 74 68 65 20 72 65 71 75 69  ed and the requi
6170: 72 65 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  red number.  ** 
6180: 6f 66 20 56 44 42 45 20 6f 70 73 20 68 61 76 65  of VDBE ops have
6190: 20 62 65 65 6e 20 65 78 65 63 75 74 65 64 20 28   been executed (
61a0: 65 69 74 68 65 72 20 73 69 6e 63 65 20 74 68 69  either since thi
61b0: 73 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 0a  s invocation of.
61c0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
61d0: 45 78 65 63 28 29 20 6f 72 20 73 69 6e 63 65 20  Exec() or since 
61e0: 6c 61 73 74 20 74 69 6d 65 20 74 68 65 20 70 72  last time the pr
61f0: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
6200: 77 61 73 20 63 61 6c 6c 65 64 29 2e 0a 20 20 2a  was called)..  *
6210: 2a 20 49 66 20 74 68 65 20 70 72 6f 67 72 65 73  * If the progres
6220: 73 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  s callback retur
6230: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 65 78 69  ns non-zero, exi
6240: 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  t the virtual ma
6250: 63 68 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20  chine with.  ** 
6260: 61 20 72 65 74 75 72 6e 20 63 6f 64 65 20 53 51  a return code SQ
6270: 4c 49 54 45 5f 41 42 4f 52 54 2e 0a 20 20 2a 2f  LITE_ABORT..  */
6280: 0a 20 20 69 66 28 20 64 62 2d 3e 78 50 72 6f 67  .  if( db->xProg
6290: 72 65 73 73 21 3d 30 20 26 26 20 28 6e 56 6d 53  ress!=0 && (nVmS
62a0: 74 65 70 20 2d 20 6e 50 72 6f 67 72 65 73 73 4f  tep - nProgressO
62b0: 70 73 29 3e 3d 64 62 2d 3e 6e 50 72 6f 67 72 65  ps)>=db->nProgre
62c0: 73 73 4f 70 73 20 29 7b 0a 20 20 20 20 69 6e 74  ssOps ){.    int
62d0: 20 70 72 63 3b 0a 20 20 20 20 70 72 63 20 3d 20   prc;.    prc = 
62e0: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 28 64 62  db->xProgress(db
62f0: 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 29 3b  ->pProgressArg);
6300: 0a 20 20 20 20 69 66 28 20 70 72 63 21 3d 30 20  .    if( prc!=0 
6310: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
6320: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
6330: 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f        goto vdbe_
6340: 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 20 20 20 20  error_halt;.    
6350: 7d 0a 20 20 20 20 6e 50 72 6f 67 72 65 73 73 4f  }.    nProgressO
6360: 70 73 20 3d 20 6e 56 6d 53 74 65 70 3b 0a 20 20  ps = nVmStep;.  
6370: 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 62 72  }.#endif.  .  br
6380: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
6390: 65 3a 20 20 47 6f 73 75 62 20 50 31 20 50 32 20  e:  Gosub P1 P2 
63a0: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74  * * *.**.** Writ
63b0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 64  e the current ad
63c0: 64 72 65 73 73 20 6f 6e 74 6f 20 72 65 67 69 73  dress onto regis
63d0: 74 65 72 20 50 31 0a 2a 2a 20 61 6e 64 20 74 68  ter P1.** and th
63e0: 65 6e 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65  en jump to addre
63f0: 73 73 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ss P2..*/.case O
6400: 50 5f 47 6f 73 75 62 3a 20 7b 20 20 20 20 20 20  P_Gosub: {      
6410: 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
6420: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
6430: 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  p1>0 && pOp->p1<
6440: 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 49  =p->nMem );.  pI
6450: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
6460: 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  p1];.  assert( (
6470: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
6480: 4d 5f 44 79 6e 29 3d 3d 30 20 29 3b 0a 20 20 6d  M_Dyn)==0 );.  m
6490: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
64a0: 70 2c 20 70 49 6e 31 29 3b 0a 20 20 70 49 6e 31  p, pIn1);.  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 49 6e 31 2d 3e 75 2e 69 20 3d  t;.  pIn1->u.i =
64d0: 20 70 63 3b 0a 20 20 52 45 47 49 53 54 45 52 5f   pc;.  REGISTER_
64e0: 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70  TRACE(pOp->p1, p
64f0: 49 6e 31 29 3b 0a 20 20 70 63 20 3d 20 70 4f 70  In1);.  pc = pOp
6500: 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 62 72 65 61  ->p2 - 1;.  brea
6510: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
6520: 20 20 52 65 74 75 72 6e 20 50 31 20 2a 20 2a 20    Return P1 * * 
6530: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74  * *.**.** Jump t
6540: 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
6550: 75 63 74 69 6f 6e 20 61 66 74 65 72 20 74 68 65  uction after the
6560: 20 61 64 64 72 65 73 73 20 69 6e 20 72 65 67 69   address in regi
6570: 73 74 65 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65  ster P1..*/.case
6580: 20 4f 50 5f 52 65 74 75 72 6e 3a 20 7b 20 20 20   OP_Return: {   
6590: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a          /* in1 *
65a0: 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
65b0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
65c0: 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ert( pIn1->flags
65d0: 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20   & MEM_Int );.  
65e0: 70 63 20 3d 20 28 69 6e 74 29 70 49 6e 31 2d 3e  pc = (int)pIn1->
65f0: 75 2e 69 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  u.i;.  break;.}.
6600: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 59 69 65  ./* Opcode:  Yie
6610: 6c 64 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  ld P1 * * * *.**
6620: 0a 2a 2a 20 53 77 61 70 20 74 68 65 20 70 72 6f  .** Swap the pro
6630: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 77 69 74  gram counter wit
6640: 68 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  h the value in r
6650: 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2f 0a 63  egister P1..*/.c
6660: 61 73 65 20 4f 50 5f 59 69 65 6c 64 3a 20 7b 20  ase OP_Yield: { 
6670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
6680: 31 20 2a 2f 0a 20 20 69 6e 74 20 70 63 44 65 73  1 */.  int pcDes
6690: 74 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  t;.  pIn1 = &aMe
66a0: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  m[pOp->p1];.  as
66b0: 73 65 72 74 28 20 28 70 49 6e 31 2d 3e 66 6c 61  sert( (pIn1->fla
66c0: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d 30  gs & MEM_Dyn)==0
66d0: 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67   );.  pIn1->flag
66e0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 70  s = MEM_Int;.  p
66f0: 63 44 65 73 74 20 3d 20 28 69 6e 74 29 70 49 6e  cDest = (int)pIn
6700: 31 2d 3e 75 2e 69 3b 0a 20 20 70 49 6e 31 2d 3e  1->u.i;.  pIn1->
6710: 75 2e 69 20 3d 20 70 63 3b 0a 20 20 52 45 47 49  u.i = pc;.  REGI
6720: 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
6730: 70 31 2c 20 70 49 6e 31 29 3b 0a 20 20 70 63 20  p1, pIn1);.  pc 
6740: 3d 20 70 63 44 65 73 74 3b 0a 20 20 62 72 65 61  = pcDest;.  brea
6750: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
6760: 20 20 48 61 6c 74 49 66 4e 75 6c 6c 20 20 50 31    HaltIfNull  P1
6770: 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a   P2 P3 P4 *.**.*
6780: 2a 20 43 68 65 63 6b 20 74 68 65 20 76 61 6c 75  * Check the valu
6790: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  e in register P3
67a0: 2e 20 20 49 66 20 69 74 20 69 73 20 4e 55 4c 4c  .  If it is NULL
67b0: 20 74 68 65 6e 20 48 61 6c 74 20 75 73 69 6e 67   then Halt using
67c0: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 50 31  .** parameter P1
67d0: 2c 20 50 32 2c 20 61 6e 64 20 50 34 20 61 73 20  , P2, and P4 as 
67e0: 69 66 20 74 68 69 73 20 77 65 72 65 20 61 20 48  if this were a H
67f0: 61 6c 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  alt instruction.
6800: 20 20 49 66 20 74 68 65 0a 2a 2a 20 76 61 6c 75    If the.** valu
6810: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  e in register P3
6820: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
6830: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
6840: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63  is a no-op..*/.c
6850: 61 73 65 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c  ase OP_HaltIfNul
6860: 6c 3a 20 7b 20 20 20 20 20 20 2f 2a 20 69 6e 33  l: {      /* in3
6870: 20 2a 2f 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d   */.  pIn3 = &aM
6880: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69  em[pOp->p3];.  i
6890: 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20  f( (pIn3->flags 
68a0: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
68b0: 20 62 72 65 61 6b 3b 0a 20 20 2f 2a 20 46 61 6c   break;.  /* Fal
68c0: 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f  l through into O
68d0: 50 5f 48 61 6c 74 20 2a 2f 0a 7d 0a 0a 2f 2a 20  P_Halt */.}../* 
68e0: 4f 70 63 6f 64 65 3a 20 20 48 61 6c 74 20 50 31  Opcode:  Halt P1
68f0: 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a   P2 * P4 *.**.**
6900: 20 45 78 69 74 20 69 6d 6d 65 64 69 61 74 65 6c   Exit immediatel
6910: 79 2e 20 20 41 6c 6c 20 6f 70 65 6e 20 63 75 72  y.  All open cur
6920: 73 6f 72 73 2c 20 65 74 63 20 61 72 65 20 63 6c  sors, etc are cl
6930: 6f 73 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  osed.** automati
6940: 63 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50 31 20  cally..**.** P1 
6950: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  is the result co
6960: 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  de returned by s
6970: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2c 20 73  qlite3_exec(), s
6980: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 2c 0a  qlite3_reset(),.
6990: 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 5f 66 69  ** or sqlite3_fi
69a0: 6e 61 6c 69 7a 65 28 29 2e 20 20 46 6f 72 20 61  nalize().  For a
69b0: 20 6e 6f 72 6d 61 6c 20 68 61 6c 74 2c 20 74 68   normal halt, th
69c0: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 53 51 4c  is should be SQL
69d0: 49 54 45 5f 4f 4b 20 28 30 29 2e 0a 2a 2a 20 46  ITE_OK (0)..** F
69e0: 6f 72 20 65 72 72 6f 72 73 2c 20 69 74 20 63 61  or errors, it ca
69f0: 6e 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  n be some other 
6a00: 76 61 6c 75 65 2e 20 20 49 66 20 50 31 21 3d 30  value.  If P1!=0
6a10: 20 74 68 65 6e 20 50 32 20 77 69 6c 6c 20 64 65   then P2 will de
6a20: 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68  termine.** wheth
6a30: 65 72 20 6f 72 20 6e 6f 74 20 74 6f 20 72 6f 6c  er or not to rol
6a40: 6c 62 61 63 6b 20 74 68 65 20 63 75 72 72 65 6e  lback the curren
6a50: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  t transaction.  
6a60: 44 6f 20 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 0a  Do not rollback.
6a70: 2a 2a 20 69 66 20 50 32 3d 3d 4f 45 5f 46 61 69  ** if P2==OE_Fai
6a80: 6c 2e 20 44 6f 20 74 68 65 20 72 6f 6c 6c 62 61  l. Do the rollba
6a90: 63 6b 20 69 66 20 50 32 3d 3d 4f 45 5f 52 6f 6c  ck if P2==OE_Rol
6aa0: 6c 62 61 63 6b 2e 20 20 49 66 20 50 32 3d 3d 4f  lback.  If P2==O
6ab0: 45 5f 41 62 6f 72 74 2c 0a 2a 2a 20 74 68 65 6e  E_Abort,.** then
6ac0: 20 62 61 63 6b 20 6f 75 74 20 61 6c 6c 20 63 68   back out all ch
6ad0: 61 6e 67 65 73 20 74 68 61 74 20 68 61 76 65 20  anges that have 
6ae0: 6f 63 63 75 72 72 65 64 20 64 75 72 69 6e 67 20  occurred during 
6af0: 74 68 69 73 20 65 78 65 63 75 74 69 6f 6e 20 6f  this execution o
6b00: 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 2c 20 62  f the.** VDBE, b
6b10: 75 74 20 64 6f 20 6e 6f 74 20 72 6f 6c 6c 62 61  ut do not rollba
6b20: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
6b30: 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34  on. .**.** If P4
6b40: 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 74 68 65   is not null the
6b50: 6e 20 69 74 20 69 73 20 61 6e 20 65 72 72 6f 72  n it is an error
6b60: 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e   message string.
6b70: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
6b80: 61 6e 20 69 6d 70 6c 69 65 64 20 22 48 61 6c 74  an implied "Halt
6b90: 20 30 20 30 20 30 22 20 69 6e 73 74 72 75 63 74   0 0 0" instruct
6ba0: 69 6f 6e 20 69 6e 73 65 72 74 65 64 20 61 74 20  ion inserted at 
6bb0: 74 68 65 20 76 65 72 79 20 65 6e 64 20 6f 66 0a  the very end of.
6bc0: 2a 2a 20 65 76 65 72 79 20 70 72 6f 67 72 61 6d  ** every program
6bd0: 2e 20 20 53 6f 20 61 20 6a 75 6d 70 20 70 61 73  .  So a jump pas
6be0: 74 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74 72  t the last instr
6bf0: 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 72  uction of the pr
6c00: 6f 67 72 61 6d 0a 2a 2a 20 69 73 20 74 68 65 20  ogram.** is the 
6c10: 73 61 6d 65 20 61 73 20 65 78 65 63 75 74 69 6e  same as executin
6c20: 67 20 48 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20  g Halt..*/.case 
6c30: 4f 50 5f 48 61 6c 74 3a 20 7b 0a 20 20 69 66 28  OP_Halt: {.  if(
6c40: 20 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45   pOp->p1==SQLITE
6c50: 5f 4f 4b 20 26 26 20 70 2d 3e 70 46 72 61 6d 65  _OK && p->pFrame
6c60: 20 29 7b 0a 20 20 20 20 2f 2a 20 48 61 6c 74 20   ){.    /* Halt 
6c70: 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 2e  the sub-program.
6c80: 20 52 65 74 75 72 6e 20 63 6f 6e 74 72 6f 6c 20   Return control 
6c90: 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 66 72  to the parent fr
6ca0: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 56 64 62 65  ame. */.    Vdbe
6cb0: 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 20 3d 20  Frame *pFrame = 
6cc0: 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 20 20 70  p->pFrame;.    p
6cd0: 2d 3e 70 46 72 61 6d 65 20 3d 20 70 46 72 61 6d  ->pFrame = pFram
6ce0: 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20  e->pParent;.    
6cf0: 70 2d 3e 6e 46 72 61 6d 65 2d 2d 3b 0a 20 20 20  p->nFrame--;.   
6d00: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
6d10: 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43  hanges(db, p->nC
6d20: 68 61 6e 67 65 29 3b 0a 20 20 20 20 70 63 20 3d  hange);.    pc =
6d30: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
6d40: 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29  eRestore(pFrame)
6d50: 3b 0a 20 20 20 20 6c 61 73 74 52 6f 77 69 64 20  ;.    lastRowid 
6d60: 3d 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b  = db->lastRowid;
6d70: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32  .    if( pOp->p2
6d80: 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20  ==OE_Ignore ){. 
6d90: 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74       /* Instruct
6da0: 69 6f 6e 20 70 63 20 69 73 20 74 68 65 20 4f 50  ion pc is the OP
6db0: 5f 50 72 6f 67 72 61 6d 20 74 68 61 74 20 69 6e  _Program that in
6dc0: 76 6f 6b 65 64 20 74 68 65 20 73 75 62 2d 70 72  voked the sub-pr
6dd0: 6f 67 72 61 6d 20 0a 20 20 20 20 20 20 2a 2a 20  ogram .      ** 
6de0: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
6df0: 68 61 6c 74 65 64 2e 20 49 66 20 74 68 65 20 70  halted. If the p
6e00: 32 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66  2 instruction of
6e10: 20 74 68 69 73 20 4f 50 5f 48 61 6c 74 0a 20 20   this OP_Halt.  
6e20: 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
6e30: 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 4f 45 5f  on is set to OE_
6e40: 49 67 6e 6f 72 65 2c 20 74 68 65 6e 20 74 68 65  Ignore, then the
6e50: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20   sub-program is 
6e60: 74 68 72 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a  throwing.      *
6e70: 2a 20 61 6e 20 49 47 4e 4f 52 45 20 65 78 63 65  * an IGNORE exce
6e80: 70 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63  ption. In this c
6e90: 61 73 65 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  ase jump to the 
6ea0: 61 64 64 72 65 73 73 20 73 70 65 63 69 66 69 65  address specifie
6eb0: 64 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 74 68  d.      ** as th
6ec0: 65 20 70 32 20 6f 66 20 74 68 65 20 63 61 6c 6c  e p2 of the call
6ed0: 69 6e 67 20 4f 50 5f 50 72 6f 67 72 61 6d 2e 20  ing OP_Program. 
6ee0: 20 2a 2f 0a 20 20 20 20 20 20 70 63 20 3d 20 70   */.      pc = p
6ef0: 2d 3e 61 4f 70 5b 70 63 5d 2e 70 32 2d 31 3b 0a  ->aOp[pc].p2-1;.
6f00: 20 20 20 20 7d 0a 20 20 20 20 61 4f 70 20 3d 20      }.    aOp = 
6f10: 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 61 4d 65 6d  p->aOp;.    aMem
6f20: 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20   = p->aMem;.    
6f30: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 70 2d  break;.  }..  p-
6f40: 3e 72 63 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20  >rc = pOp->p1;. 
6f50: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
6f60: 3d 20 28 75 38 29 70 4f 70 2d 3e 70 32 3b 0a 20  = (u8)pOp->p2;. 
6f70: 20 70 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20 69   p->pc = pc;.  i
6f80: 66 28 20 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a  f( pOp->p4.z ){.
6f90: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
6fa0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
6fb0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
6fc0: 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
6fd0: 2c 20 64 62 2c 20 22 25 73 22 2c 20 70 4f 70 2d  , db, "%s", pOp-
6fe0: 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 74 65 73 74  >p4.z);.    test
6ff0: 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
7000: 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
7010: 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
7020: 5f 6c 6f 67 28 70 4f 70 2d 3e 70 31 2c 20 22 61  _log(pOp->p1, "a
7030: 62 6f 72 74 20 61 74 20 25 64 20 69 6e 20 5b 25  bort at %d in [%
7040: 73 5d 3a 20 25 73 22 2c 20 70 63 2c 20 70 2d 3e  s]: %s", pc, p->
7050: 7a 53 71 6c 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  zSql, pOp->p4.z)
7060: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
7070: 3e 72 63 20 29 7b 0a 20 20 20 20 74 65 73 74 63  >rc ){.    testc
7080: 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
7090: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
70a0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
70b0: 6c 6f 67 28 70 4f 70 2d 3e 70 31 2c 20 22 63 6f  log(pOp->p1, "co
70c0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 20  nstraint failed 
70d0: 61 74 20 25 64 20 69 6e 20 5b 25 73 5d 22 2c 20  at %d in [%s]", 
70e0: 70 63 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20  pc, p->zSql);.  
70f0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
7100: 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 61  VdbeHalt(p);.  a
7110: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
7120: 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51  E_BUSY || rc==SQ
7130: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
7140: 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
7150: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7160: 42 55 53 59 20 29 7b 0a 20 20 20 20 70 2d 3e 72  BUSY ){.    p->r
7170: 63 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  c = rc = SQLITE_
7180: 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
7190: 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
71a0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
71b0: 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
71c0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20  _CONSTRAINT );. 
71d0: 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
71e0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 64 62 2d 3e  QLITE_OK || db->
71f0: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3e 30 20  nDeferredCons>0 
7200: 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 72  );.    rc = p->r
7210: 63 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c ? SQLITE_ERROR
7220: 20 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   : SQLITE_DONE;.
7230: 20 20 7d 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f    }.  goto vdbe_
7240: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70  return;.}../* Op
7250: 63 6f 64 65 3a 20 49 6e 74 65 67 65 72 20 50 31  code: Integer P1
7260: 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
7270: 54 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67  The 32-bit integ
7280: 65 72 20 76 61 6c 75 65 20 50 31 20 69 73 20 77  er value P1 is w
7290: 72 69 74 74 65 6e 20 69 6e 74 6f 20 72 65 67 69  ritten into regi
72a0: 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  ster P2..*/.case
72b0: 20 4f 50 5f 49 6e 74 65 67 65 72 3a 20 7b 20 20   OP_Integer: {  
72c0: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70         /* out2-p
72d0: 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 70  rerelease */.  p
72e0: 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Out->u.i = pOp->
72f0: 70 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  p1;.  break;.}..
7300: 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 36 34  /* Opcode: Int64
7310: 20 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a   * P2 * P4 *.**.
7320: 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74  ** P4 is a point
7330: 65 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20 69  er to a 64-bit i
7340: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2a  nteger value..**
7350: 20 57 72 69 74 65 20 74 68 61 74 20 76 61 6c 75   Write that valu
7360: 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  e into register 
7370: 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  P2..*/.case OP_I
7380: 6e 74 36 34 3a 20 7b 20 20 20 20 20 20 20 20 20  nt64: {         
7390: 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c    /* out2-prerel
73a0: 65 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ease */.  assert
73b0: 28 20 70 4f 70 2d 3e 70 34 2e 70 49 36 34 21 3d  ( pOp->p4.pI64!=
73c0: 30 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69  0 );.  pOut->u.i
73d0: 20 3d 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34   = *pOp->p4.pI64
73e0: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69  ;.  break;.}..#i
73f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7400: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
7410: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 61 6c  ./* Opcode: Real
7420: 20 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a   * P2 * P4 *.**.
7430: 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74  ** P4 is a point
7440: 65 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20 66  er to a 64-bit f
7450: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
7460: 6c 75 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68  lue..** Write th
7470: 61 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65  at value into re
7480: 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61  gister P2..*/.ca
7490: 73 65 20 4f 50 5f 52 65 61 6c 3a 20 7b 20 20 20  se OP_Real: {   
74a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
74b0: 20 61 73 20 54 4b 5f 46 4c 4f 41 54 2c 20 6f 75   as TK_FLOAT, ou
74c0: 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f  t2-prerelease */
74d0: 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d  .  pOut->flags =
74e0: 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 61 73 73   MEM_Real;.  ass
74f0: 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e  ert( !sqlite3IsN
7500: 61 4e 28 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61  aN(*pOp->p4.pRea
7510: 6c 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 72 20  l) );.  pOut->r 
7520: 3d 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c  = *pOp->p4.pReal
7530: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
7540: 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  dif../* Opcode: 
7550: 53 74 72 69 6e 67 38 20 2a 20 50 32 20 2a 20 50  String8 * P2 * P
7560: 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69  4 *.**.** P4 poi
7570: 6e 74 73 20 74 6f 20 61 20 6e 75 6c 20 74 65 72  nts to a nul ter
7580: 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73 74  minated UTF-8 st
7590: 72 69 6e 67 2e 20 54 68 69 73 20 6f 70 63 6f 64  ring. This opcod
75a0: 65 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64  e is transformed
75b0: 20 0a 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f   .** into an OP_
75c0: 53 74 72 69 6e 67 20 62 65 66 6f 72 65 20 69 74  String before it
75d0: 20 69 73 20 65 78 65 63 75 74 65 64 20 66 6f 72   is executed for
75e0: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 2e   the first time.
75f0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 74 72 69  .*/.case OP_Stri
7600: 6e 67 38 3a 20 7b 20 20 20 20 20 20 20 20 20 2f  ng8: {         /
7610: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 54 52  * same as TK_STR
7620: 49 4e 47 2c 20 6f 75 74 32 2d 70 72 65 72 65 6c  ING, out2-prerel
7630: 65 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ease */.  assert
7640: 28 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  ( pOp->p4.z!=0 )
7650: 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ;.  pOp->opcode 
7660: 3d 20 4f 50 5f 53 74 72 69 6e 67 3b 0a 20 20 70  = OP_String;.  p
7670: 4f 70 2d 3e 70 31 20 3d 20 73 71 6c 69 74 65 33  Op->p1 = sqlite3
7680: 53 74 72 6c 65 6e 33 30 28 70 4f 70 2d 3e 70 34  Strlen30(pOp->p4
7690: 2e 7a 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  .z);..#ifndef SQ
76a0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
76b0: 20 20 69 66 28 20 65 6e 63 6f 64 69 6e 67 21 3d    if( encoding!=
76c0: 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20  SQLITE_UTF8 ){. 
76d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
76e0: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4f 75  dbeMemSetStr(pOu
76f0: 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 2d 31  t, pOp->p4.z, -1
7700: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
7710: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
7720: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
7730: 45 5f 54 4f 4f 42 49 47 20 29 20 67 6f 74 6f 20  E_TOOBIG ) goto 
7740: 74 6f 6f 5f 62 69 67 3b 0a 20 20 20 20 69 66 28  too_big;.    if(
7750: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
7760: 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
7770: 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65 6e 63 6f  oding(pOut, enco
7780: 64 69 6e 67 29 20 29 20 67 6f 74 6f 20 6e 6f 5f  ding) ) goto no_
7790: 6d 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  mem;.    assert(
77a0: 20 70 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d   pOut->zMalloc==
77b0: 70 4f 75 74 2d 3e 7a 20 29 3b 0a 20 20 20 20 61  pOut->z );.    a
77c0: 73 73 65 72 74 28 20 70 4f 75 74 2d 3e 66 6c 61  ssert( pOut->fla
77d0: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a  gs & MEM_Dyn );.
77e0: 20 20 20 20 70 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f      pOut->zMallo
77f0: 63 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d  c = 0;.    pOut-
7800: 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 53 74  >flags |= MEM_St
7810: 61 74 69 63 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  atic;.    pOut->
7820: 66 6c 61 67 73 20 26 3d 20 7e 4d 45 4d 5f 44 79  flags &= ~MEM_Dy
7830: 6e 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  n;.    if( pOp->
7840: 70 34 74 79 70 65 3d 3d 50 34 5f 44 59 4e 41 4d  p4type==P4_DYNAM
7850: 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  IC ){.      sqli
7860: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f  te3DbFree(db, pO
7870: 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 7d 0a  p->p4.z);.    }.
7880: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
7890: 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20  = P4_DYNAMIC;.  
78a0: 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 70 4f    pOp->p4.z = pO
78b0: 75 74 2d 3e 7a 3b 0a 20 20 20 20 70 4f 70 2d 3e  ut->z;.    pOp->
78c0: 70 31 20 3d 20 70 4f 75 74 2d 3e 6e 3b 0a 20 20  p1 = pOut->n;.  
78d0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
78e0: 4f 70 2d 3e 70 31 3e 64 62 2d 3e 61 4c 69 6d 69  Op->p1>db->aLimi
78f0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
7900: 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f  ENGTH] ){.    go
7910: 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a  to too_big;.  }.
7920: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
7930: 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61  h to the next ca
7940: 73 65 2c 20 4f 50 5f 53 74 72 69 6e 67 20 2a 2f  se, OP_String */
7950: 0a 7d 0a 20 20 0a 2f 2a 20 4f 70 63 6f 64 65 3a  .}.  ./* Opcode:
7960: 20 53 74 72 69 6e 67 20 50 31 20 50 32 20 2a 20   String P1 P2 * 
7970: 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  P4 *.**.** The s
7980: 74 72 69 6e 67 20 76 61 6c 75 65 20 50 34 20 6f  tring value P4 o
7990: 66 20 6c 65 6e 67 74 68 20 50 31 20 28 62 79 74  f length P1 (byt
79a0: 65 73 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e  es) is stored in
79b0: 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f   register P2..*/
79c0: 0a 63 61 73 65 20 4f 50 5f 53 74 72 69 6e 67 3a  .case OP_String:
79d0: 20 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f   {          /* o
79e0: 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a  ut2-prerelease *
79f0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  /.  assert( pOp-
7a00: 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a 20 20 70 4f  >p4.z!=0 );.  pO
7a10: 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ut->flags = MEM_
7a20: 53 74 72 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  Str|MEM_Static|M
7a30: 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d  EM_Term;.  pOut-
7a40: 3e 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  >z = pOp->p4.z;.
7a50: 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 70 4f 70 2d    pOut->n = pOp-
7a60: 3e 70 31 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63  >p1;.  pOut->enc
7a70: 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55   = encoding;.  U
7a80: 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49  PDATE_MAX_BLOBSI
7a90: 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61  ZE(pOut);.  brea
7aa0: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
7ab0: 20 4e 75 6c 6c 20 50 31 20 50 32 20 50 33 20 2a   Null P1 P2 P3 *
7ac0: 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61   *.**.** Write a
7ad0: 20 4e 55 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73   NULL into regis
7ae0: 74 65 72 73 20 50 32 2e 20 20 49 66 20 50 33 20  ters P2.  If P3 
7af0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 32 2c  greater than P2,
7b00: 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65   then also write
7b10: 0a 2a 2a 20 4e 55 4c 4c 20 69 6e 74 6f 20 72 65  .** NULL into re
7b20: 67 69 73 74 65 72 20 50 33 20 61 6e 64 20 65 76  gister P3 and ev
7b30: 65 72 79 20 72 65 67 69 73 74 65 72 20 69 6e 20  ery register in 
7b40: 62 65 74 77 65 65 6e 20 50 32 20 61 6e 64 20 50  between P2 and P
7b50: 33 2e 20 20 49 66 20 50 33 0a 2a 2a 20 69 73 20  3.  If P3.** is 
7b60: 6c 65 73 73 20 74 68 61 6e 20 50 32 20 28 74 79  less than P2 (ty
7b70: 70 69 63 61 6c 6c 79 20 50 33 20 69 73 20 7a 65  pically P3 is ze
7b80: 72 6f 29 20 74 68 65 6e 20 6f 6e 6c 79 20 72 65  ro) then only re
7b90: 67 69 73 74 65 72 20 50 32 20 69 73 0a 2a 2a 20  gister P2 is.** 
7ba0: 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
7bb0: 2a 2a 20 49 66 20 74 68 65 20 50 31 20 76 61 6c  ** If the P1 val
7bc0: 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ue is non-zero, 
7bd0: 74 68 65 6e 20 61 6c 73 6f 20 73 65 74 20 74 68  then also set th
7be0: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 66 6c  e MEM_Cleared fl
7bf0: 61 67 20 73 6f 20 74 68 61 74 0a 2a 2a 20 4e 55  ag so that.** NU
7c00: 4c 4c 20 76 61 6c 75 65 73 20 77 69 6c 6c 20 6e  LL values will n
7c10: 6f 74 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c  ot compare equal
7c20: 20 65 76 65 6e 20 69 66 20 53 51 4c 49 54 45 5f   even if SQLITE_
7c30: 4e 55 4c 4c 45 51 20 69 73 20 73 65 74 20 6f 6e  NULLEQ is set on
7c40: 0a 2a 2a 20 4f 50 5f 4e 65 20 6f 72 20 4f 50 5f  .** OP_Ne or OP_
7c50: 45 71 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e  Eq..*/.case OP_N
7c60: 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ull: {          
7c70: 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65   /* out2-prerele
7c80: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ase */.  int cnt
7c90: 3b 0a 20 20 75 31 36 20 6e 75 6c 6c 46 6c 61 67  ;.  u16 nullFlag
7ca0: 3b 0a 20 20 63 6e 74 20 3d 20 70 4f 70 2d 3e 70  ;.  cnt = pOp->p
7cb0: 33 2d 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73  3-pOp->p2;.  ass
7cc0: 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d  ert( pOp->p3<=p-
7cd0: 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 4f 75 74 2d  >nMem );.  pOut-
7ce0: 3e 66 6c 61 67 73 20 3d 20 6e 75 6c 6c 46 6c 61  >flags = nullFla
7cf0: 67 20 3d 20 70 4f 70 2d 3e 70 31 20 3f 20 28 4d  g = pOp->p1 ? (M
7d00: 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 43 6c 65 61  EM_Null|MEM_Clea
7d10: 72 65 64 29 20 3a 20 4d 45 4d 5f 4e 75 6c 6c 3b  red) : MEM_Null;
7d20: 0a 20 20 77 68 69 6c 65 28 20 63 6e 74 3e 30 20  .  while( cnt>0 
7d30: 29 7b 0a 20 20 20 20 70 4f 75 74 2b 2b 3b 0a 20  ){.    pOut++;. 
7d40: 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61     memAboutToCha
7d50: 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20  nge(p, pOut);.  
7d60: 20 20 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65    VdbeMemRelease
7d70: 28 70 4f 75 74 29 3b 0a 20 20 20 20 70 4f 75 74  (pOut);.    pOut
7d80: 2d 3e 66 6c 61 67 73 20 3d 20 6e 75 6c 6c 46 6c  ->flags = nullFl
7d90: 61 67 3b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20  ag;.    cnt--;. 
7da0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a   }.  break;.}...
7db0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 6c 6f 62 20  /* Opcode: Blob 
7dc0: 50 31 20 50 32 20 2a 20 50 34 0a 2a 2a 0a 2a 2a  P1 P2 * P4.**.**
7dd0: 20 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20   P4 points to a 
7de0: 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 50 31 20  blob of data P1 
7df0: 62 79 74 65 73 20 6c 6f 6e 67 2e 20 20 53 74 6f  bytes long.  Sto
7e00: 72 65 20 74 68 69 73 0a 2a 2a 20 62 6c 6f 62 20  re this.** blob 
7e10: 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  in register P2..
7e20: 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 6c 6f 62 3a  */.case OP_Blob:
7e30: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
7e40: 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c    /* out2-prerel
7e50: 65 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ease */.  assert
7e60: 28 20 70 4f 70 2d 3e 70 31 20 3c 3d 20 53 51 4c  ( pOp->p1 <= SQL
7e70: 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29  ITE_MAX_LENGTH )
7e80: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
7e90: 65 6d 53 65 74 53 74 72 28 70 4f 75 74 2c 20 70  emSetStr(pOut, p
7ea0: 4f 70 2d 3e 70 34 2e 7a 2c 20 70 4f 70 2d 3e 70  Op->p4.z, pOp->p
7eb0: 31 2c 20 30 2c 20 30 29 3b 0a 20 20 70 4f 75 74  1, 0, 0);.  pOut
7ec0: 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67  ->enc = encoding
7ed0: 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
7ee0: 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20  LOBSIZE(pOut);. 
7ef0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
7f00: 63 6f 64 65 3a 20 56 61 72 69 61 62 6c 65 20 50  code: Variable P
7f10: 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  1 P2 * P4 *.**.*
7f20: 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 76  * Transfer the v
7f30: 61 6c 75 65 73 20 6f 66 20 62 6f 75 6e 64 20 70  alues of bound p
7f40: 61 72 61 6d 65 74 65 72 20 50 31 20 69 6e 74 6f  arameter P1 into
7f50: 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 0a   register P2.**.
7f60: 2a 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  ** If the parame
7f70: 74 65 72 20 69 73 20 6e 61 6d 65 64 2c 20 74 68  ter is named, th
7f80: 65 6e 20 69 74 73 20 6e 61 6d 65 20 61 70 70 65  en its name appe
7f90: 61 72 73 20 69 6e 20 50 34 20 61 6e 64 20 50 33  ars in P4 and P3
7fa0: 3d 3d 31 2e 0a 2a 2a 20 54 68 65 20 50 34 20 76  ==1..** The P4 v
7fb0: 61 6c 75 65 20 69 73 20 75 73 65 64 20 62 79 20  alue is used by 
7fc0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
7fd0: 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 2e 0a 2a  ameter_name()..*
7fe0: 2f 0a 63 61 73 65 20 4f 50 5f 56 61 72 69 61 62  /.case OP_Variab
7ff0: 6c 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  le: {           
8000: 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65   /* out2-prerele
8010: 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 56  ase */.  Mem *pV
8020: 61 72 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  ar;       /* Val
8030: 75 65 20 62 65 69 6e 67 20 74 72 61 6e 73 66 65  ue being transfe
8040: 72 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  rred */..  asser
8050: 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20  t( pOp->p1>0 && 
8060: 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 56 61 72  pOp->p1<=p->nVar
8070: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
8080: 70 2d 3e 70 34 2e 7a 3d 3d 30 20 7c 7c 20 70 4f  p->p4.z==0 || pO
8090: 70 2d 3e 70 34 2e 7a 3d 3d 70 2d 3e 61 7a 56 61  p->p4.z==p->azVa
80a0: 72 5b 70 4f 70 2d 3e 70 31 2d 31 5d 20 29 3b 0a  r[pOp->p1-1] );.
80b0: 20 20 70 56 61 72 20 3d 20 26 70 2d 3e 61 56 61    pVar = &p->aVa
80c0: 72 5b 70 4f 70 2d 3e 70 31 20 2d 20 31 5d 3b 0a  r[pOp->p1 - 1];.
80d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
80e0: 65 4d 65 6d 54 6f 6f 42 69 67 28 70 56 61 72 29  eMemTooBig(pVar)
80f0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f   ){.    goto too
8100: 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  _big;.  }.  sqli
8110: 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
8120: 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 56 61 72  wCopy(pOut, pVar
8130: 2c 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20  , MEM_Static);. 
8140: 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42   UPDATE_MAX_BLOB
8150: 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72  SIZE(pOut);.  br
8160: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
8170: 65 3a 20 4d 6f 76 65 20 50 31 20 50 32 20 50 33  e: Move P1 P2 P3
8180: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20   * *.**.** Move 
8190: 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65  the values in re
81a0: 67 69 73 74 65 72 20 50 31 2e 2e 50 31 2b 50 33  gister P1..P1+P3
81b0: 20 6f 76 65 72 20 69 6e 74 6f 0a 2a 2a 20 72 65   over into.** re
81c0: 67 69 73 74 65 72 73 20 50 32 2e 2e 50 32 2b 50  gisters P2..P2+P
81d0: 33 2e 20 20 52 65 67 69 73 74 65 72 73 20 50 31  3.  Registers P1
81e0: 2e 2e 50 31 2b 50 33 20 61 72 65 0a 2a 2a 20 6c  ..P1+P3 are.** l
81f0: 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 20 4e 55  eft holding a NU
8200: 4c 4c 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72  LL.  It is an er
8210: 72 6f 72 20 66 6f 72 20 72 65 67 69 73 74 65 72  ror for register
8220: 20 72 61 6e 67 65 73 0a 2a 2a 20 50 31 2e 2e 50   ranges.** P1..P
8230: 31 2b 50 33 20 61 6e 64 20 50 32 2e 2e 50 32 2b  1+P3 and P2..P2+
8240: 50 33 20 74 6f 20 6f 76 65 72 6c 61 70 2e 0a 2a  P3 to overlap..*
8250: 2f 0a 63 61 73 65 20 4f 50 5f 4d 6f 76 65 3a 20  /.case OP_Move: 
8260: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 6c 6c 6f  {.  char *zMallo
8270: 63 3b 20 20 20 2f 2a 20 48 6f 6c 64 69 6e 67 20  c;   /* Holding 
8280: 76 61 72 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c  variable for all
8290: 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  ocated memory */
82a0: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
82b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
82c0: 20 72 65 67 69 73 74 65 72 73 20 6c 65 66 74 20   registers left 
82d0: 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
82e0: 20 70 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   p1;          /*
82f0: 20 52 65 67 69 73 74 65 72 20 74 6f 20 63 6f 70   Register to cop
8300: 79 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  y from */.  int 
8310: 70 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p2;          /* 
8320: 52 65 67 69 73 74 65 72 20 74 6f 20 63 6f 70 79  Register to copy
8330: 20 74 6f 20 2a 2f 0a 0a 20 20 6e 20 3d 20 70 4f   to */..  n = pO
8340: 70 2d 3e 70 33 20 2b 20 31 3b 0a 20 20 70 31 20  p->p3 + 1;.  p1 
8350: 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 32 20  = pOp->p1;.  p2 
8360: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73  = pOp->p2;.  ass
8370: 65 72 74 28 20 6e 3e 30 20 26 26 20 70 31 3e 30  ert( n>0 && p1>0
8380: 20 26 26 20 70 32 3e 30 20 29 3b 0a 20 20 61 73   && p2>0 );.  as
8390: 73 65 72 74 28 20 70 31 2b 6e 3c 3d 70 32 20 7c  sert( p1+n<=p2 |
83a0: 7c 20 70 32 2b 6e 3c 3d 70 31 20 29 3b 0a 0a 20  | p2+n<=p1 );.. 
83b0: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 31   pIn1 = &aMem[p1
83c0: 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65  ];.  pOut = &aMe
83d0: 6d 5b 70 32 5d 3b 0a 20 20 77 68 69 6c 65 28 20  m[p2];.  while( 
83e0: 6e 2d 2d 20 29 7b 0a 20 20 20 20 61 73 73 65 72  n-- ){.    asser
83f0: 74 28 20 70 4f 75 74 3c 3d 26 61 4d 65 6d 5b 70  t( pOut<=&aMem[p
8400: 2d 3e 6e 4d 65 6d 5d 20 29 3b 0a 20 20 20 20 61  ->nMem] );.    a
8410: 73 73 65 72 74 28 20 70 49 6e 31 3c 3d 26 61 4d  ssert( pIn1<=&aM
8420: 65 6d 5b 70 2d 3e 6e 4d 65 6d 5d 20 29 3b 0a 20  em[p->nMem] );. 
8430: 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
8440: 56 61 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20  Valid(pIn1) );. 
8450: 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61     memAboutToCha
8460: 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20  nge(p, pOut);.  
8470: 20 20 7a 4d 61 6c 6c 6f 63 20 3d 20 70 4f 75 74    zMalloc = pOut
8480: 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 70  ->zMalloc;.    p
8490: 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30  Out->zMalloc = 0
84a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
84b0: 65 4d 65 6d 4d 6f 76 65 28 70 4f 75 74 2c 20 70  eMemMove(pOut, p
84c0: 49 6e 31 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  In1);.#ifdef SQL
84d0: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66  ITE_DEBUG.    if
84e0: 28 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72  ( pOut->pScopyFr
84f0: 6f 6d 3e 3d 26 61 4d 65 6d 5b 70 31 5d 20 26 26  om>=&aMem[p1] &&
8500: 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f   pOut->pScopyFro
8510: 6d 3c 26 61 4d 65 6d 5b 70 31 2b 70 4f 70 2d 3e  m<&aMem[p1+pOp->
8520: 70 33 5d 20 29 7b 0a 20 20 20 20 20 20 70 4f 75  p3] ){.      pOu
8530: 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20 2b 3d  t->pScopyFrom +=
8540: 20 70 31 20 2d 20 70 4f 70 2d 3e 70 32 3b 0a 20   p1 - pOp->p2;. 
8550: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
8560: 70 49 6e 31 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20  pIn1->zMalloc = 
8570: 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 52 45 47  zMalloc;.    REG
8580: 49 53 54 45 52 5f 54 52 41 43 45 28 70 32 2b 2b  ISTER_TRACE(p2++
8590: 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 70 49 6e  , pOut);.    pIn
85a0: 31 2b 2b 3b 0a 20 20 20 20 70 4f 75 74 2b 2b 3b  1++;.    pOut++;
85b0: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
85c0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 70 79  ./* Opcode: Copy
85d0: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
85e0: 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20  .** Make a copy 
85f0: 6f 66 20 72 65 67 69 73 74 65 72 73 20 50 31 2e  of registers P1.
8600: 2e 50 31 2b 50 33 20 69 6e 74 6f 20 72 65 67 69  .P1+P3 into regi
8610: 73 74 65 72 73 20 50 32 2e 2e 50 32 2b 50 33 2e  sters P2..P2+P3.
8620: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74  .**.** This inst
8630: 72 75 63 74 69 6f 6e 20 6d 61 6b 65 73 20 61 20  ruction makes a 
8640: 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65  deep copy of the
8650: 20 76 61 6c 75 65 2e 20 20 41 20 64 75 70 6c 69   value.  A dupli
8660: 63 61 74 65 0a 2a 2a 20 69 73 20 6d 61 64 65 20  cate.** is made 
8670: 6f 66 20 61 6e 79 20 73 74 72 69 6e 67 20 6f 72  of any string or
8680: 20 62 6c 6f 62 20 63 6f 6e 73 74 61 6e 74 2e 20   blob constant. 
8690: 20 53 65 65 20 61 6c 73 6f 20 4f 50 5f 53 43 6f   See also OP_SCo
86a0: 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  py..*/.case OP_C
86b0: 6f 70 79 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a  opy: {.  int n;.
86c0: 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a  .  n = pOp->p3;.
86d0: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
86e0: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20  Op->p1];.  pOut 
86f0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
8700: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 75 74  ;.  assert( pOut
8710: 21 3d 70 49 6e 31 20 29 3b 0a 20 20 77 68 69 6c  !=pIn1 );.  whil
8720: 65 28 20 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  e( 1 ){.    sqli
8730: 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
8740: 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 31  wCopy(pOut, pIn1
8750: 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20  , MEM_Ephem);.  
8760: 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65    Deephemeralize
8770: 28 70 4f 75 74 29 3b 0a 23 69 66 64 65 66 20 53  (pOut);.#ifdef S
8780: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
8790: 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d  pOut->pScopyFrom
87a0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
87b0: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
87c0: 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2d  pOp->p2+pOp->p3-
87d0: 6e 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 69 66  n, pOut);.    if
87e0: 28 20 28 6e 2d 2d 29 3d 3d 30 20 29 20 62 72 65  ( (n--)==0 ) bre
87f0: 61 6b 3b 0a 20 20 20 20 70 4f 75 74 2b 2b 3b 0a  ak;.    pOut++;.
8800: 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20 20 7d 0a      pIn1++;.  }.
8810: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
8820: 70 63 6f 64 65 3a 20 53 43 6f 70 79 20 50 31 20  pcode: SCopy P1 
8830: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d  P2 * * *.**.** M
8840: 61 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f  ake a shallow co
8850: 70 79 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  py of register P
8860: 31 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  1 into register 
8870: 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  P2..**.** This i
8880: 6e 73 74 72 75 63 74 69 6f 6e 20 6d 61 6b 65 73  nstruction makes
8890: 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20   a shallow copy 
88a0: 6f 66 20 74 68 65 20 76 61 6c 75 65 2e 20 20 49  of the value.  I
88b0: 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69  f the value.** i
88c0: 73 20 61 20 73 74 72 69 6e 67 20 6f 72 20 62 6c  s a string or bl
88d0: 6f 62 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 70  ob, then the cop
88e0: 79 20 69 73 20 6f 6e 6c 79 20 61 20 70 6f 69 6e  y is only a poin
88f0: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 6f 72  ter to the.** or
8900: 69 67 69 6e 61 6c 20 61 6e 64 20 68 65 6e 63 65  iginal and hence
8910: 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   if the original
8920: 20 63 68 61 6e 67 65 73 20 73 6f 20 77 69 6c 6c   changes so will
8930: 20 74 68 65 20 63 6f 70 79 2e 0a 2a 2a 20 57 6f   the copy..** Wo
8940: 72 73 65 2c 20 69 66 20 74 68 65 20 6f 72 69 67  rse, if the orig
8950: 69 6e 61 6c 20 69 73 20 64 65 61 6c 6c 6f 63 61  inal is dealloca
8960: 74 65 64 2c 20 74 68 65 20 63 6f 70 79 20 62 65  ted, the copy be
8970: 63 6f 6d 65 73 20 69 6e 76 61 6c 69 64 2e 0a 2a  comes invalid..*
8980: 2a 20 54 68 75 73 20 74 68 65 20 70 72 6f 67 72  * Thus the progr
8990: 61 6d 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  am must guarante
89a0: 65 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  e that the origi
89b0: 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 63 68 61  nal will not cha
89c0: 6e 67 65 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68  nge.** during th
89d0: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 20 74 68  e lifetime of th
89e0: 65 20 63 6f 70 79 2e 20 20 55 73 65 20 4f 50 5f  e copy.  Use OP_
89f0: 43 6f 70 79 20 74 6f 20 6d 61 6b 65 20 61 20 63  Copy to make a c
8a00: 6f 6d 70 6c 65 74 65 0a 2a 2a 20 63 6f 70 79 2e  omplete.** copy.
8a10: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 43 6f 70  .*/.case OP_SCop
8a20: 79 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  y: {            
8a30: 2f 2a 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a  /* in1, out2 */.
8a40: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
8a50: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20  Op->p1];.  pOut 
8a60: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
8a70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 75 74  ;.  assert( pOut
8a80: 21 3d 70 49 6e 31 20 29 3b 0a 20 20 73 71 6c 69  !=pIn1 );.  sqli
8a90: 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
8aa0: 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 31  wCopy(pOut, pIn1
8ab0: 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 23 69  , MEM_Ephem);.#i
8ac0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8ad0: 47 0a 20 20 69 66 28 20 70 4f 75 74 2d 3e 70 53  G.  if( pOut->pS
8ae0: 63 6f 70 79 46 72 6f 6d 3d 3d 30 20 29 20 70 4f  copyFrom==0 ) pO
8af0: 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20 3d  ut->pScopyFrom =
8b00: 20 70 49 6e 31 3b 0a 23 65 6e 64 69 66 0a 20 20   pIn1;.#endif.  
8b10: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
8b20: 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20  Op->p2, pOut);. 
8b30: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
8b40: 63 6f 64 65 3a 20 52 65 73 75 6c 74 52 6f 77 20  code: ResultRow 
8b50: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
8b60: 2a 20 54 68 65 20 72 65 67 69 73 74 65 72 73 20  * The registers 
8b70: 50 31 20 74 68 72 6f 75 67 68 20 50 31 2b 50 32  P1 through P1+P2
8b80: 2d 31 20 63 6f 6e 74 61 69 6e 20 61 20 73 69 6e  -1 contain a sin
8b90: 67 6c 65 20 72 6f 77 20 6f 66 0a 2a 2a 20 72 65  gle row of.** re
8ba0: 73 75 6c 74 73 2e 20 54 68 69 73 20 6f 70 63 6f  sults. This opco
8bb0: 64 65 20 63 61 75 73 65 73 20 74 68 65 20 73 71  de causes the sq
8bc0: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c  lite3_step() cal
8bd0: 6c 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 0a 2a  l to terminate.*
8be0: 2a 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45  * with an SQLITE
8bf0: 5f 52 4f 57 20 72 65 74 75 72 6e 20 63 6f 64 65  _ROW return code
8c00: 20 61 6e 64 20 69 74 20 73 65 74 73 20 75 70 20   and it sets up 
8c10: 74 68 65 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  the sqlite3_stmt
8c20: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f  .** structure to
8c30: 20 70 72 6f 76 69 64 65 20 61 63 63 65 73 73 20   provide access 
8c40: 74 6f 20 74 68 65 20 74 6f 70 20 50 31 20 76 61  to the top P1 va
8c50: 6c 75 65 73 20 61 73 20 74 68 65 20 72 65 73 75  lues as the resu
8c60: 6c 74 0a 2a 2a 20 72 6f 77 2e 0a 2a 2f 0a 63 61  lt.** row..*/.ca
8c70: 73 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 3a  se OP_ResultRow:
8c80: 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a   {.  Mem *pMem;.
8c90: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
8ca0: 74 28 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  t( p->nResColumn
8cb0: 3d 3d 70 4f 70 2d 3e 70 32 20 29 3b 0a 20 20 61  ==pOp->p2 );.  a
8cc0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30  ssert( pOp->p1>0
8cd0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
8ce0: 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 32 3c 3d 70  p->p1+pOp->p2<=p
8cf0: 2d 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 0a 20 20 2f  ->nMem+1 );..  /
8d00: 2a 20 49 66 20 74 68 69 73 20 73 74 61 74 65 6d  * If this statem
8d10: 65 6e 74 20 68 61 73 20 76 69 6f 6c 61 74 65 64  ent has violated
8d20: 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69   immediate forei
8d30: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
8d40: 74 73 2c 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20  ts, do.  ** not 
8d50: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
8d60: 72 20 6f 66 20 72 6f 77 73 20 6d 6f 64 69 66 69  r of rows modifi
8d70: 65 64 2e 20 41 6e 64 20 64 6f 20 6e 6f 74 20 52  ed. And do not R
8d80: 45 4c 45 41 53 45 20 74 68 65 20 73 74 61 74 65  ELEASE the state
8d90: 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ment.  ** transa
8da0: 63 74 69 6f 6e 2e 20 49 74 20 6e 65 65 64 73 20  ction. It needs 
8db0: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
8dc0: 6b 2e 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  k.  */.  if( SQL
8dd0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
8de0: 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
8df0: 28 70 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 61  (p, 0)) ){.    a
8e00: 73 73 65 72 74 28 20 64 62 2d 3e 66 6c 61 67 73  ssert( db->flags
8e10: 26 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77  &SQLITE_CountRow
8e20: 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
8e30: 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
8e40: 6e 61 6c 20 29 3b 0a 20 20 20 20 62 72 65 61 6b  nal );.    break
8e50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
8e60: 68 65 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52  he SQLITE_CountR
8e70: 6f 77 73 20 66 6c 61 67 20 69 73 20 73 65 74 20  ows flag is set 
8e80: 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73  in sqlite3.flags
8e90: 20 6d 61 73 6b 2c 20 74 68 65 6e 20 0a 20 20 2a   mask, then .  *
8ea0: 2a 20 44 4d 4c 20 73 74 61 74 65 6d 65 6e 74 73  * DML statements
8eb0: 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 6f 70 63   invoke this opc
8ec0: 6f 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74 68  ode to return th
8ed0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
8ee0: 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20   .  ** modified 
8ef0: 74 6f 20 74 68 65 20 75 73 65 72 2e 20 54 68 69  to the user. Thi
8f00: 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  s is the only wa
8f10: 79 20 74 68 61 74 20 61 20 56 4d 20 74 68 61 74  y that a VM that
8f20: 0a 20 20 2a 2a 20 6f 70 65 6e 73 20 61 20 73 74  .  ** opens a st
8f30: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
8f40: 69 6f 6e 20 6d 61 79 20 69 6e 76 6f 6b 65 20 74  ion may invoke t
8f50: 68 69 73 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2a  his opcode..  **
8f60: 0a 20 20 2a 2a 20 49 6e 20 63 61 73 65 20 74 68  .  ** In case th
8f70: 69 73 20 69 73 20 73 75 63 68 20 61 20 73 74 61  is is such a sta
8f80: 74 65 6d 65 6e 74 2c 20 63 6c 6f 73 65 20 61 6e  tement, close an
8f90: 79 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  y statement tran
8fa0: 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65  saction.  ** ope
8fb0: 6e 65 64 20 62 79 20 74 68 69 73 20 56 4d 20 62  ned by this VM b
8fc0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
8fd0: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 75  control to the u
8fe0: 73 65 72 2e 20 54 68 69 73 20 69 73 20 74 6f 0a  ser. This is to.
8ff0: 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74    ** ensure that
9000: 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
9010: 61 63 74 69 6f 6e 73 20 61 72 65 20 61 6c 77 61  actions are alwa
9020: 79 73 20 6e 65 73 74 65 64 2c 20 6e 6f 74 20 6f  ys nested, not o
9030: 76 65 72 6c 61 70 70 69 6e 67 2e 0a 20 20 2a 2a  verlapping..  **
9040: 20 49 66 20 74 68 65 20 6f 70 65 6e 20 73 74 61   If the open sta
9050: 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
9060: 6f 6e 20 69 73 20 6e 6f 74 20 63 6c 6f 73 65 64  on is not closed
9070: 20 68 65 72 65 2c 20 74 68 65 6e 20 74 68 65 20   here, then the 
9080: 75 73 65 72 0a 20 20 2a 2a 20 6d 61 79 20 73 74  user.  ** may st
9090: 65 70 20 61 6e 6f 74 68 65 72 20 56 4d 20 74 68  ep another VM th
90a0: 61 74 20 6f 70 65 6e 73 20 69 74 73 20 6f 77 6e  at opens its own
90b0: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
90c0: 61 63 74 69 6f 6e 2e 20 54 68 69 73 0a 20 20 2a  action. This.  *
90d0: 2a 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 6f 76  * may lead to ov
90e0: 65 72 6c 61 70 70 69 6e 67 20 73 74 61 74 65 6d  erlapping statem
90f0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent transactions
9100: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
9110: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
9120: 63 74 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 61  ction is never a
9130: 20 74 6f 70 2d 6c 65 76 65 6c 20 74 72 61 6e 73   top-level trans
9140: 61 63 74 69 6f 6e 2e 20 20 48 65 6e 63 65 0a 20  action.  Hence. 
9150: 20 2a 2a 20 74 68 65 20 52 45 4c 45 41 53 45 20   ** the RELEASE 
9160: 63 61 6c 6c 20 62 65 6c 6f 77 20 63 61 6e 20 6e  call below can n
9170: 65 76 65 72 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a  ever fail..  */.
9180: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74    assert( p->iSt
9190: 61 74 65 6d 65 6e 74 3d 3d 30 20 7c 7c 20 64 62  atement==0 || db
91a0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43  ->flags&SQLITE_C
91b0: 6f 75 6e 74 52 6f 77 73 20 29 3b 0a 20 20 72 63  ountRows );.  rc
91c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c   = sqlite3VdbeCl
91d0: 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20  oseStatement(p, 
91e0: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
91f0: 45 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  E);.  if( NEVER(
9200: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  rc!=SQLITE_OK) )
9210: 7b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  {.    break;.  }
9220: 0a 0a 20 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74  ..  /* Invalidat
9230: 65 20 61 6c 6c 20 65 70 68 65 6d 65 72 61 6c 20  e all ephemeral 
9240: 63 75 72 73 6f 72 20 72 6f 77 20 63 61 63 68 65  cursor row cache
9250: 73 20 2a 2f 0a 20 20 70 2d 3e 63 61 63 68 65 43  s */.  p->cacheC
9260: 74 72 20 3d 20 28 70 2d 3e 63 61 63 68 65 43 74  tr = (p->cacheCt
9270: 72 20 2b 20 32 29 7c 31 3b 0a 0a 20 20 2f 2a 20  r + 2)|1;..  /* 
9280: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 72 65  Make sure the re
9290: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 63 75 72  sults of the cur
92a0: 72 65 6e 74 20 72 6f 77 20 61 72 65 20 5c 30 30  rent row are \00
92b0: 30 20 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 2a  0 terminated.  *
92c0: 2a 20 61 6e 64 20 68 61 76 65 20 61 6e 20 61 73  * and have an as
92d0: 73 69 67 6e 65 64 20 74 79 70 65 2e 20 20 54 68  signed type.  Th
92e0: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 65  e results are de
92f0: 2d 65 70 68 65 6d 65 72 61 6c 69 7a 65 64 20 61  -ephemeralized a
9300: 73 0a 20 20 2a 2a 20 61 20 73 69 64 65 20 65 66  s.  ** a side ef
9310: 66 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 70 4d 65  fect..  */.  pMe
9320: 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  m = p->pResultSe
9330: 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
9340: 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  1];.  for(i=0; i
9350: 3c 70 4f 70 2d 3e 70 32 3b 20 69 2b 2b 29 7b 0a  <pOp->p2; i++){.
9360: 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
9370: 73 56 61 6c 69 64 28 26 70 4d 65 6d 5b 69 5d 29  sValid(&pMem[i])
9380: 20 29 3b 0a 20 20 20 20 44 65 65 70 68 65 6d 65   );.    Deepheme
9390: 72 61 6c 69 7a 65 28 26 70 4d 65 6d 5b 69 5d 29  ralize(&pMem[i])
93a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
93b0: 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20 26 20 4d  Mem[i].flags & M
93c0: 45 4d 5f 45 70 68 65 6d 29 3d 3d 30 0a 20 20 20  EM_Ephem)==0.   
93d0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 65           || (pMe
93e0: 6d 5b 69 5d 2e 66 6c 61 67 73 20 26 20 28 4d 45  m[i].flags & (ME
93f0: 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29  M_Str|MEM_Blob))
9400: 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
9410: 65 33 56 64 62 65 4d 65 6d 4e 75 6c 54 65 72 6d  e3VdbeMemNulTerm
9420: 69 6e 61 74 65 28 26 70 4d 65 6d 5b 69 5d 29 3b  inate(&pMem[i]);
9430: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9440: 4d 65 6d 53 74 6f 72 65 54 79 70 65 28 26 70 4d  MemStoreType(&pM
9450: 65 6d 5b 69 5d 29 3b 0a 20 20 20 20 52 45 47 49  em[i]);.    REGI
9460: 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
9470: 70 31 2b 69 2c 20 26 70 4d 65 6d 5b 69 5d 29 3b  p1+i, &pMem[i]);
9480: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d  .  }.  if( db->m
9490: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
94a0: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 0a 20 20 2f 2a  to no_mem;..  /*
94b0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   Return SQLITE_R
94c0: 4f 57 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 63 20  OW.  */.  p->pc 
94d0: 3d 20 70 63 20 2b 20 31 3b 0a 20 20 72 63 20 3d  = pc + 1;.  rc =
94e0: 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 67   SQLITE_ROW;.  g
94f0: 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b  oto vdbe_return;
9500: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  .}../* Opcode: C
9510: 6f 6e 63 61 74 20 50 31 20 50 32 20 50 33 20 2a  oncat P1 P2 P3 *
9520: 20 2a 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 68 65   *.**.** Add the
9530: 20 74 65 78 74 20 69 6e 20 72 65 67 69 73 74 65   text in registe
9540: 72 20 50 31 20 6f 6e 74 6f 20 74 68 65 20 65 6e  r P1 onto the en
9550: 64 20 6f 66 20 74 68 65 20 74 65 78 74 20 69 6e  d of the text in
9560: 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 32 20  .** register P2 
9570: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
9580: 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72  sult in register
9590: 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65   P3..** If eithe
95a0: 72 20 74 68 65 20 50 31 20 6f 72 20 50 32 20 74  r the P1 or P2 t
95b0: 65 78 74 20 61 72 65 20 4e 55 4c 4c 20 74 68 65  ext are NULL the
95c0: 6e 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20  n store NULL in 
95d0: 50 33 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 33 20 3d  P3..**.**   P3 =
95e0: 20 50 32 20 7c 7c 20 50 31 0a 2a 2a 0a 2a 2a 20   P2 || P1.**.** 
95f0: 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f  It is illegal fo
9600: 72 20 50 31 20 61 6e 64 20 50 33 20 74 6f 20 62  r P1 and P3 to b
9610: 65 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73  e the same regis
9620: 74 65 72 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 0a  ter. Sometimes,.
9630: 2a 2a 20 69 66 20 50 33 20 69 73 20 74 68 65 20  ** if P3 is the 
9640: 73 61 6d 65 20 72 65 67 69 73 74 65 72 20 61 73  same register as
9650: 20 50 32 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65   P2, the impleme
9660: 6e 74 61 74 69 6f 6e 20 69 73 20 61 62 6c 65 0a  ntation is able.
9670: 2a 2a 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  ** to avoid a me
9680: 6d 63 70 79 28 29 2e 0a 2a 2f 0a 63 61 73 65 20  mcpy()..*/.case 
9690: 4f 50 5f 43 6f 6e 63 61 74 3a 20 7b 20 20 20 20  OP_Concat: {    
96a0: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
96b0: 73 20 54 4b 5f 43 4f 4e 43 41 54 2c 20 69 6e 31  s TK_CONCAT, in1
96c0: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20  , in2, out3 */. 
96d0: 20 69 36 34 20 6e 42 79 74 65 3b 0a 0a 20 20 70   i64 nByte;..  p
96e0: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
96f0: 3e 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26  >p1];.  pIn2 = &
9700: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
9710: 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
9720: 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74  p->p3];.  assert
9730: 28 20 70 49 6e 31 21 3d 70 4f 75 74 20 29 3b 0a  ( pIn1!=pOut );.
9740: 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
9750: 67 73 20 7c 20 70 49 6e 32 2d 3e 66 6c 61 67 73  gs | pIn2->flags
9760: 29 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ) & MEM_Null ){.
9770: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
9780: 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b  emSetNull(pOut);
9790: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
97a0: 20 20 69 66 28 20 45 78 70 61 6e 64 42 6c 6f 62    if( ExpandBlob
97b0: 28 70 49 6e 31 29 20 7c 7c 20 45 78 70 61 6e 64  (pIn1) || Expand
97c0: 42 6c 6f 62 28 70 49 6e 32 29 20 29 20 67 6f 74  Blob(pIn2) ) got
97d0: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 53 74 72 69  o no_mem;.  Stri
97e0: 6e 67 69 66 79 28 70 49 6e 31 2c 20 65 6e 63 6f  ngify(pIn1, enco
97f0: 64 69 6e 67 29 3b 0a 20 20 53 74 72 69 6e 67 69  ding);.  Stringi
9800: 66 79 28 70 49 6e 32 2c 20 65 6e 63 6f 64 69 6e  fy(pIn2, encodin
9810: 67 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 70 49  g);.  nByte = pI
9820: 6e 31 2d 3e 6e 20 2b 20 70 49 6e 32 2d 3e 6e 3b  n1->n + pIn2->n;
9830: 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 64 62 2d  .  if( nByte>db-
9840: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
9850: 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a  IMIT_LENGTH] ){.
9860: 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67      goto too_big
9870: 3b 0a 20 20 7d 0a 20 20 4d 65 6d 53 65 74 54 79  ;.  }.  MemSetTy
9880: 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d  peFlag(pOut, MEM
9890: 5f 53 74 72 29 3b 0a 20 20 69 66 28 20 73 71 6c  _Str);.  if( sql
98a0: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
98b0: 70 4f 75 74 2c 20 28 69 6e 74 29 6e 42 79 74 65  pOut, (int)nByte
98c0: 2b 32 2c 20 70 4f 75 74 3d 3d 70 49 6e 32 29 20  +2, pOut==pIn2) 
98d0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  ){.    goto no_m
98e0: 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f  em;.  }.  if( pO
98f0: 75 74 21 3d 70 49 6e 32 20 29 7b 0a 20 20 20 20  ut!=pIn2 ){.    
9900: 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e 7a 2c 20  memcpy(pOut->z, 
9910: 70 49 6e 32 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 6e  pIn2->z, pIn2->n
9920: 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  );.  }.  memcpy(
9930: 26 70 4f 75 74 2d 3e 7a 5b 70 49 6e 32 2d 3e 6e  &pOut->z[pIn2->n
9940: 5d 2c 20 70 49 6e 31 2d 3e 7a 2c 20 70 49 6e 31  ], pIn1->z, pIn1
9950: 2d 3e 6e 29 3b 0a 20 20 70 4f 75 74 2d 3e 7a 5b  ->n);.  pOut->z[
9960: 6e 42 79 74 65 5d 20 3d 20 30 3b 0a 20 20 70 4f  nByte] = 0;.  pO
9970: 75 74 2d 3e 7a 5b 6e 42 79 74 65 2b 31 5d 20 3d  ut->z[nByte+1] =
9980: 20 30 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67   0;.  pOut->flag
9990: 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d 3b 0a 20  s |= MEM_Term;. 
99a0: 20 70 4f 75 74 2d 3e 6e 20 3d 20 28 69 6e 74 29   pOut->n = (int)
99b0: 6e 42 79 74 65 3b 0a 20 20 70 4f 75 74 2d 3e 65  nByte;.  pOut->e
99c0: 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20  nc = encoding;. 
99d0: 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42   UPDATE_MAX_BLOB
99e0: 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72  SIZE(pOut);.  br
99f0: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
9a00: 65 3a 20 41 64 64 20 50 31 20 50 32 20 50 33 20  e: Add P1 P2 P3 
9a10: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 68  * *.**.** Add th
9a20: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
9a30: 74 65 72 20 50 31 20 74 6f 20 74 68 65 20 76 61  ter P1 to the va
9a40: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
9a50: 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20  P2.** and store 
9a60: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65  the result in re
9a70: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66  gister P3..** If
9a80: 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73   either input is
9a90: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c   NULL, the resul
9aa0: 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a  t is NULL..*/./*
9ab0: 20 4f 70 63 6f 64 65 3a 20 4d 75 6c 74 69 70 6c   Opcode: Multipl
9ac0: 79 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  y P1 P2 P3 * *.*
9ad0: 2a 0a 2a 2a 0a 2a 2a 20 4d 75 6c 74 69 70 6c 79  *.**.** Multiply
9ae0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
9af0: 67 69 73 74 65 72 20 50 31 20 62 79 20 74 68 65  gister P1 by the
9b00: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
9b10: 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f  er P2.** and sto
9b20: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
9b30: 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
9b40: 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74   If either input
9b50: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   is NULL, the re
9b60: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  sult is NULL..*/
9b70: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 75 62 74  ./* Opcode: Subt
9b80: 72 61 63 74 20 50 31 20 50 32 20 50 33 20 2a 20  ract P1 P2 P3 * 
9b90: 2a 0a 2a 2a 0a 2a 2a 20 53 75 62 74 72 61 63 74  *.**.** Subtract
9ba0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
9bb0: 67 69 73 74 65 72 20 50 31 20 66 72 6f 6d 20 74  gister P1 from t
9bc0: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
9bd0: 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73  ster P2.** and s
9be0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
9bf0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
9c00: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70  ** If either inp
9c10: 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  ut is NULL, the 
9c20: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
9c30: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 69  */./* Opcode: Di
9c40: 76 69 64 65 20 50 31 20 50 32 20 50 33 20 2a 20  vide P1 P2 P3 * 
9c50: 2a 0a 2a 2a 0a 2a 2a 20 44 69 76 69 64 65 20 74  *.**.** Divide t
9c60: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
9c70: 73 74 65 72 20 50 31 20 62 79 20 74 68 65 20 76  ster P1 by the v
9c80: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
9c90: 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65   P2.** and store
9ca0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72   the result in r
9cb0: 65 67 69 73 74 65 72 20 50 33 20 28 50 33 3d 50  egister P3 (P3=P
9cc0: 32 2f 50 31 29 2e 20 49 66 20 74 68 65 20 76 61  2/P1). If the va
9cd0: 6c 75 65 20 69 6e 20 0a 2a 2a 20 72 65 67 69 73  lue in .** regis
9ce0: 74 65 72 20 50 31 20 69 73 20 7a 65 72 6f 2c 20  ter P1 is zero, 
9cf0: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
9d00: 69 73 20 4e 55 4c 4c 2e 20 49 66 20 65 69 74 68  is NULL. If eith
9d10: 65 72 20 69 6e 70 75 74 20 69 73 20 0a 2a 2a 20  er input is .** 
9d20: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74  NULL, the result
9d30: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20   is NULL..*/./* 
9d40: 4f 70 63 6f 64 65 3a 20 52 65 6d 61 69 6e 64 65  Opcode: Remainde
9d50: 72 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  r P1 P2 P3 * *.*
9d60: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
9d70: 20 72 65 6d 61 69 6e 64 65 72 20 61 66 74 65 72   remainder after
9d80: 20 69 6e 74 65 67 65 72 20 64 69 76 69 73 69 6f   integer divisio
9d90: 6e 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 69  n of the value i
9da0: 6e 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31  n.** register P1
9db0: 20 62 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e   by the value in
9dc0: 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 64   register P2 and
9dd0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
9de0: 74 20 69 6e 20 50 33 2e 20 0a 2a 2a 20 49 66 20  t in P3. .** If 
9df0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
9e00: 69 73 74 65 72 20 50 32 20 69 73 20 7a 65 72 6f  ister P2 is zero
9e10: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
9e20: 55 4c 4c 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65  ULL..** If eithe
9e30: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
9e40: 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  L, the result is
9e50: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f   NULL..*/.case O
9e60: 50 5f 41 64 64 3a 20 20 20 20 20 20 20 20 20 20  P_Add:          
9e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
9e80: 20 61 73 20 54 4b 5f 50 4c 55 53 2c 20 69 6e 31   as TK_PLUS, in1
9e90: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63  , in2, out3 */.c
9ea0: 61 73 65 20 4f 50 5f 53 75 62 74 72 61 63 74 3a  ase OP_Subtract:
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9ec0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 4d 49 4e 55   same as TK_MINU
9ed0: 53 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  S, in1, in2, out
9ee0: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 75 6c  3 */.case OP_Mul
9ef0: 74 69 70 6c 79 3a 20 20 20 20 20 20 20 20 20 20  tiply:          
9f00: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
9f10: 4b 5f 53 54 41 52 2c 20 69 6e 31 2c 20 69 6e 32  K_STAR, in1, in2
9f20: 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f  , out3 */.case O
9f30: 50 5f 44 69 76 69 64 65 3a 20 20 20 20 20 20 20  P_Divide:       
9f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
9f50: 20 61 73 20 54 4b 5f 53 4c 41 53 48 2c 20 69 6e   as TK_SLASH, in
9f60: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
9f70: 63 61 73 65 20 4f 50 5f 52 65 6d 61 69 6e 64 65  case OP_Remainde
9f80: 72 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f  r: {           /
9f90: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 52 45 4d  * same as TK_REM
9fa0: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
9fb0: 20 2a 2f 0a 20 20 63 68 61 72 20 62 49 6e 74 69   */.  char bInti
9fc0: 6e 74 3b 20 20 20 2f 2a 20 53 74 61 72 74 65 64  nt;   /* Started
9fd0: 20 6f 75 74 20 61 73 20 74 77 6f 20 69 6e 74 65   out as two inte
9fe0: 67 65 72 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a  ger operands */.
9ff0: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
a000: 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 4d 45    /* Combined ME
a010: 4d 5f 2a 20 66 6c 61 67 73 20 66 72 6f 6d 20 62  M_* flags from b
a020: 6f 74 68 20 69 6e 70 75 74 73 20 2a 2f 0a 20 20  oth inputs */.  
a030: 69 36 34 20 69 41 3b 20 20 20 20 20 20 20 20 20  i64 iA;         
a040: 2f 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65  /* Integer value
a050: 20 6f 66 20 6c 65 66 74 20 6f 70 65 72 61 6e 64   of left operand
a060: 20 2a 2f 0a 20 20 69 36 34 20 69 42 3b 20 20 20   */.  i64 iB;   
a070: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
a080: 20 76 61 6c 75 65 20 6f 66 20 72 69 67 68 74 20   value of right 
a090: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f 75  operand */.  dou
a0a0: 62 6c 65 20 72 41 3b 20 20 20 20 20 20 2f 2a 20  ble rA;      /* 
a0b0: 52 65 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 65  Real value of le
a0c0: 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ft operand */.  
a0d0: 64 6f 75 62 6c 65 20 72 42 3b 20 20 20 20 20 20  double rB;      
a0e0: 2f 2a 20 52 65 61 6c 20 76 61 6c 75 65 20 6f 66  /* Real value of
a0f0: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   right operand *
a100: 2f 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  /..  pIn1 = &aMe
a110: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 70  m[pOp->p1];.  ap
a120: 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  plyNumericAffini
a130: 74 79 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e 32  ty(pIn1);.  pIn2
a140: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
a150: 5d 3b 0a 20 20 61 70 70 6c 79 4e 75 6d 65 72 69  ];.  applyNumeri
a160: 63 41 66 66 69 6e 69 74 79 28 70 49 6e 32 29 3b  cAffinity(pIn2);
a170: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
a180: 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 66 6c 61 67  pOp->p3];.  flag
a190: 73 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  s = pIn1->flags 
a1a0: 7c 20 70 49 6e 32 2d 3e 66 6c 61 67 73 3b 0a 20  | pIn2->flags;. 
a1b0: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45   if( (flags & ME
a1c0: 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29 20 67 6f 74  M_Null)!=0 ) got
a1d0: 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73  o arithmetic_res
a1e0: 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 69  ult_is_null;.  i
a1f0: 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
a200: 26 20 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20  & pIn2->flags & 
a210: 4d 45 4d 5f 49 6e 74 29 3d 3d 4d 45 4d 5f 49 6e  MEM_Int)==MEM_In
a220: 74 20 29 7b 0a 20 20 20 20 69 41 20 3d 20 70 49  t ){.    iA = pI
a230: 6e 31 2d 3e 75 2e 69 3b 0a 20 20 20 20 69 42 20  n1->u.i;.    iB 
a240: 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20  = pIn2->u.i;.   
a250: 20 62 49 6e 74 69 6e 74 20 3d 20 31 3b 0a 20 20   bIntint = 1;.  
a260: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f    switch( pOp->o
a270: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63  pcode ){.      c
a280: 61 73 65 20 4f 50 5f 41 64 64 3a 20 20 20 20 20  ase OP_Add:     
a290: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 64 64    if( sqlite3Add
a2a0: 49 6e 74 36 34 28 26 69 42 2c 69 41 29 20 29 20  Int64(&iB,iA) ) 
a2b0: 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 20 20 62  goto fp_math;  b
a2c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a2d0: 20 4f 50 5f 53 75 62 74 72 61 63 74 3a 20 20 69   OP_Subtract:  i
a2e0: 66 28 20 73 71 6c 69 74 65 33 53 75 62 49 6e 74  f( sqlite3SubInt
a2f0: 36 34 28 26 69 42 2c 69 41 29 20 29 20 67 6f 74  64(&iB,iA) ) got
a300: 6f 20 66 70 5f 6d 61 74 68 3b 20 20 62 72 65 61  o fp_math;  brea
a310: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
a320: 5f 4d 75 6c 74 69 70 6c 79 3a 20 20 69 66 28 20  _Multiply:  if( 
a330: 73 71 6c 69 74 65 33 4d 75 6c 49 6e 74 36 34 28  sqlite3MulInt64(
a340: 26 69 42 2c 69 41 29 20 29 20 67 6f 74 6f 20 66  &iB,iA) ) goto f
a350: 70 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a  p_math;  break;.
a360: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 44 69        case OP_Di
a370: 76 69 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  vide: {.        
a380: 69 66 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f  if( iA==0 ) goto
a390: 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75   arithmetic_resu
a3a0: 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20  lt_is_null;.    
a3b0: 20 20 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 26      if( iA==-1 &
a3c0: 26 20 69 42 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49  & iB==SMALLEST_I
a3d0: 4e 54 36 34 20 29 20 67 6f 74 6f 20 66 70 5f 6d  NT64 ) goto fp_m
a3e0: 61 74 68 3b 0a 20 20 20 20 20 20 20 20 69 42 20  ath;.        iB 
a3f0: 2f 3d 20 69 41 3b 0a 20 20 20 20 20 20 20 20 62  /= iA;.        b
a400: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
a410: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
a420: 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d 30         if( iA==0
a430: 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74   ) goto arithmet
a440: 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c  ic_result_is_nul
a450: 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  l;.        if( i
a460: 41 3d 3d 2d 31 20 29 20 69 41 20 3d 20 31 3b 0a  A==-1 ) iA = 1;.
a470: 20 20 20 20 20 20 20 20 69 42 20 25 3d 20 69 41          iB %= iA
a480: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
a490: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a4a0: 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69     pOut->u.i = i
a4b0: 42 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70  B;.    MemSetTyp
a4c0: 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f  eFlag(pOut, MEM_
a4d0: 49 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Int);.  }else{. 
a4e0: 20 20 20 62 49 6e 74 69 6e 74 20 3d 20 30 3b 0a     bIntint = 0;.
a4f0: 66 70 5f 6d 61 74 68 3a 0a 20 20 20 20 72 41 20  fp_math:.    rA 
a500: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 61  = sqlite3VdbeRea
a510: 6c 56 61 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20  lValue(pIn1);.  
a520: 20 20 72 42 20 3d 20 73 71 6c 69 74 65 33 56 64    rB = sqlite3Vd
a530: 62 65 52 65 61 6c 56 61 6c 75 65 28 70 49 6e 32  beRealValue(pIn2
a540: 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  );.    switch( p
a550: 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20  Op->opcode ){.  
a560: 20 20 20 20 63 61 73 65 20 4f 50 5f 41 64 64 3a      case OP_Add:
a570: 20 20 20 20 20 20 20 20 20 72 42 20 2b 3d 20 72           rB += r
a580: 41 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  A;       break;.
a590: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 75        case OP_Su
a5a0: 62 74 72 61 63 74 3a 20 20 20 20 72 42 20 2d 3d  btract:    rB -=
a5b0: 20 72 41 3b 20 20 20 20 20 20 20 62 72 65 61 6b   rA;       break
a5c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  ;.      case OP_
a5d0: 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20 72 42 20  Multiply:    rB 
a5e0: 2a 3d 20 72 41 3b 20 20 20 20 20 20 20 62 72 65  *= rA;       bre
a5f0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
a600: 50 5f 44 69 76 69 64 65 3a 20 7b 0a 20 20 20 20  P_Divide: {.    
a610: 20 20 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30      /* (double)0
a620: 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49   In case of SQLI
a630: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
a640: 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20  _POINT... */.   
a650: 20 20 20 20 20 69 66 28 20 72 41 3d 3d 28 64 6f       if( rA==(do
a660: 75 62 6c 65 29 30 20 29 20 67 6f 74 6f 20 61 72  uble)0 ) goto ar
a670: 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f  ithmetic_result_
a680: 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20  is_null;.       
a690: 20 72 42 20 2f 3d 20 72 41 3b 0a 20 20 20 20 20   rB /= rA;.     
a6a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a6b0: 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
a6c0: 20 7b 0a 20 20 20 20 20 20 20 20 69 41 20 3d 20   {.        iA = 
a6d0: 28 69 36 34 29 72 41 3b 0a 20 20 20 20 20 20 20  (i64)rA;.       
a6e0: 20 69 42 20 3d 20 28 69 36 34 29 72 42 3b 0a 20   iB = (i64)rB;. 
a6f0: 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d 30         if( iA==0
a700: 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74   ) goto arithmet
a710: 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c  ic_result_is_nul
a720: 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  l;.        if( i
a730: 41 3d 3d 2d 31 20 29 20 69 41 20 3d 20 31 3b 0a  A==-1 ) iA = 1;.
a740: 20 20 20 20 20 20 20 20 72 42 20 3d 20 28 64 6f          rB = (do
a750: 75 62 6c 65 29 28 69 42 20 25 20 69 41 29 3b 0a  uble)(iB % iA);.
a760: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a770: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
a780: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a790: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
a7a0: 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72     pOut->u.i = r
a7b0: 42 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70  B;.    MemSetTyp
a7c0: 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f  eFlag(pOut, MEM_
a7d0: 49 6e 74 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Int);.#else.    
a7e0: 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  if( sqlite3IsNaN
a7f0: 28 72 42 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  (rB) ){.      go
a800: 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65  to arithmetic_re
a810: 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20  sult_is_null;.  
a820: 20 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 72 20    }.    pOut->r 
a830: 3d 20 72 42 3b 0a 20 20 20 20 4d 65 6d 53 65 74  = rB;.    MemSet
a840: 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d  TypeFlag(pOut, M
a850: 45 4d 5f 52 65 61 6c 29 3b 0a 20 20 20 20 69 66  EM_Real);.    if
a860: 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  ( (flags & MEM_R
a870: 65 61 6c 29 3d 3d 30 20 26 26 20 21 62 49 6e 74  eal)==0 && !bInt
a880: 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  int ){.      sql
a890: 69 74 65 33 56 64 62 65 49 6e 74 65 67 65 72 41  ite3VdbeIntegerA
a8a0: 66 66 69 6e 69 74 79 28 70 4f 75 74 29 3b 0a 20  ffinity(pOut);. 
a8b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
a8c0: 20 20 62 72 65 61 6b 3b 0a 0a 61 72 69 74 68 6d    break;..arithm
a8d0: 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e  etic_result_is_n
a8e0: 75 6c 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56 64  ull:.  sqlite3Vd
a8f0: 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75  beMemSetNull(pOu
a900: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
a910: 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6c 6c 53  /* Opcode: CollS
a920: 65 71 20 50 31 20 2a 20 2a 20 50 34 0a 2a 2a 0a  eq P1 * * P4.**.
a930: 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74  ** P4 is a point
a940: 65 72 20 74 6f 20 61 20 43 6f 6c 6c 53 65 71 20  er to a CollSeq 
a950: 73 74 72 75 63 74 2e 20 49 66 20 74 68 65 20 6e  struct. If the n
a960: 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 20 75 73  ext call to a us
a970: 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6f  er function.** o
a980: 72 20 61 67 67 72 65 67 61 74 65 20 63 61 6c 6c  r aggregate call
a990: 73 20 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63  s sqlite3GetFunc
a9a0: 43 6f 6c 6c 53 65 71 28 29 2c 20 74 68 69 73 20  CollSeq(), this 
a9b0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
a9c0: 63 65 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72 65  ce will.** be re
a9d0: 74 75 72 6e 65 64 2e 20 54 68 69 73 20 69 73 20  turned. This is 
a9e0: 75 73 65 64 20 62 79 20 74 68 65 20 62 75 69 6c  used by the buil
a9f0: 74 2d 69 6e 20 6d 69 6e 28 29 2c 20 6d 61 78 28  t-in min(), max(
aa00: 29 20 61 6e 64 20 6e 75 6c 6c 69 66 28 29 0a 2a  ) and nullif().*
aa10: 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a  * functions..**.
aa20: 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 6f 74 20  ** If P1 is not 
aa30: 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73  zero, then it is
aa40: 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
aa50: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6d 69   a subsequent mi
aa60: 6e 28 29 20 6f 72 0a 2a 2a 20 6d 61 78 28 29 20  n() or.** max() 
aa70: 61 67 67 72 65 67 61 74 65 20 77 69 6c 6c 20 73  aggregate will s
aa80: 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 20 63  et to 1 if the c
aa90: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 6e 6f  urrent row is no
aaa0: 74 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72  t the minimum or
aab0: 0a 2a 2a 20 6d 61 78 69 6d 75 6d 2e 20 20 54 68  .** maximum.  Th
aac0: 65 20 50 31 20 72 65 67 69 73 74 65 72 20 69 73  e P1 register is
aad0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
aae0: 30 20 62 79 20 74 68 69 73 20 69 6e 73 74 72 75  0 by this instru
aaf0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
ab00: 20 69 6e 74 65 72 66 61 63 65 20 75 73 65 64 20   interface used 
ab10: 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  by the implement
ab20: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 61 66 6f  ation of the afo
ab30: 72 65 6d 65 6e 74 69 6f 6e 65 64 20 66 75 6e 63  rementioned func
ab40: 74 69 6f 6e 73 0a 2a 2a 20 74 6f 20 72 65 74 72  tions.** to retr
ab50: 69 65 76 65 20 74 68 65 20 63 6f 6c 6c 61 74 69  ieve the collati
ab60: 6f 6e 20 73 65 71 75 65 6e 63 65 20 73 65 74 20  on sequence set 
ab70: 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69  by this opcode i
ab80: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a  s not available.
ab90: 2a 2a 20 70 75 62 6c 69 63 6c 79 2c 20 6f 6e 6c  ** publicly, onl
aba0: 79 20 74 6f 20 75 73 65 72 20 66 75 6e 63 74 69  y to user functi
abb0: 6f 6e 73 20 64 65 66 69 6e 65 64 20 69 6e 20 66  ons defined in f
abc0: 75 6e 63 2e 63 2e 0a 2a 2f 0a 63 61 73 65 20 4f  unc.c..*/.case O
abd0: 50 5f 43 6f 6c 6c 53 65 71 3a 20 7b 0a 20 20 61  P_CollSeq: {.  a
abe0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79  ssert( pOp->p4ty
abf0: 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51 20 29  pe==P4_COLLSEQ )
ac00: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 20  ;.  if( pOp->p1 
ac10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
ac20: 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 26 61  beMemSetInt64(&a
ac30: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 2c 20 30 29  Mem[pOp->p1], 0)
ac40: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
ac50: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 75 6e  ../* Opcode: Fun
ac60: 63 74 69 6f 6e 20 50 31 20 50 32 20 50 33 20 50  ction P1 P2 P3 P
ac70: 34 20 50 35 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b  4 P5.**.** Invok
ac80: 65 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f  e a user functio
ac90: 6e 20 28 50 34 20 69 73 20 61 20 70 6f 69 6e 74  n (P4 is a point
aca0: 65 72 20 74 6f 20 61 20 46 75 6e 63 74 69 6f 6e  er to a Function
acb0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 0a   structure that.
acc0: 2a 2a 20 64 65 66 69 6e 65 73 20 74 68 65 20 66  ** defines the f
acd0: 75 6e 63 74 69 6f 6e 29 20 77 69 74 68 20 50 35  unction) with P5
ace0: 20 61 72 67 75 6d 65 6e 74 73 20 74 61 6b 65 6e   arguments taken
acf0: 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50   from register P
ad00: 32 20 61 6e 64 0a 2a 2a 20 73 75 63 63 65 73 73  2 and.** success
ad10: 6f 72 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ors.  The result
ad20: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
ad30: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
ad40: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 52 65  gister P3..** Re
ad50: 67 69 73 74 65 72 20 50 33 20 6d 75 73 74 20 6e  gister P3 must n
ad60: 6f 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  ot be one of the
ad70: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 70 75 74 73   function inputs
ad80: 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20  ..**.** P1 is a 
ad90: 33 32 2d 62 69 74 20 62 69 74 6d 61 73 6b 20 69  32-bit bitmask i
ada0: 6e 64 69 63 61 74 69 6e 67 20 77 68 65 74 68 65  ndicating whethe
adb0: 72 20 6f 72 20 6e 6f 74 20 65 61 63 68 20 61 72  r or not each ar
adc0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 0a 2a  gument to the .*
add0: 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 64  * function was d
ade0: 65 74 65 72 6d 69 6e 65 64 20 74 6f 20 62 65 20  etermined to be 
adf0: 63 6f 6e 73 74 61 6e 74 20 61 74 20 63 6f 6d 70  constant at comp
ae00: 69 6c 65 20 74 69 6d 65 2e 20 49 66 20 74 68 65  ile time. If the
ae10: 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
ae20: 6e 74 20 77 61 73 20 63 6f 6e 73 74 61 6e 74 20  nt was constant 
ae30: 74 68 65 6e 20 62 69 74 20 30 20 6f 66 20 50 31  then bit 0 of P1
ae40: 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 69 73   is set. This is
ae50: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
ae60: 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6d 65  ne.** whether me
ae70: 74 61 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta data associat
ae80: 65 64 20 77 69 74 68 20 61 20 75 73 65 72 20 66  ed with a user f
ae90: 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
aea0: 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71   using the.** sq
aeb0: 6c 69 74 65 33 5f 73 65 74 5f 61 75 78 64 61 74  lite3_set_auxdat
aec0: 61 28 29 20 41 50 49 20 6d 61 79 20 62 65 20 73  a() API may be s
aed0: 61 66 65 6c 79 20 72 65 74 61 69 6e 65 64 20 75  afely retained u
aee0: 6e 74 69 6c 20 74 68 65 20 6e 65 78 74 0a 2a 2a  ntil the next.**
aef0: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
af00: 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  his opcode..**.*
af10: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 41 67 67 53  * See also: AggS
af20: 74 65 70 20 61 6e 64 20 41 67 67 46 69 6e 61 6c  tep and AggFinal
af30: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 75 6e 63  .*/.case OP_Func
af40: 74 69 6f 6e 3a 20 7b 0a 20 20 69 6e 74 20 69 3b  tion: {.  int i;
af50: 0a 20 20 4d 65 6d 20 2a 70 41 72 67 3b 0a 20 20  .  Mem *pArg;.  
af60: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
af70: 63 74 78 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ctx;.  sqlite3_v
af80: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 3b 0a 20 20  alue **apVal;.  
af90: 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70 4f  int n;..  n = pO
afa0: 70 2d 3e 70 35 3b 0a 20 20 61 70 56 61 6c 20 3d  p->p5;.  apVal =
afb0: 20 70 2d 3e 61 70 41 72 67 3b 0a 20 20 61 73 73   p->apArg;.  ass
afc0: 65 72 74 28 20 61 70 56 61 6c 20 7c 7c 20 6e 3d  ert( apVal || n=
afd0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
afe0: 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70  pOp->p3>0 && pOp
aff0: 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b  ->p3<=p->nMem );
b000: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
b010: 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41  pOp->p3];.  memA
b020: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
b030: 70 4f 75 74 29 3b 0a 0a 20 20 61 73 73 65 72 74  pOut);..  assert
b040: 28 20 6e 3d 3d 30 20 7c 7c 20 28 70 4f 70 2d 3e  ( n==0 || (pOp->
b050: 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b  p2>0 && pOp->p2+
b060: 6e 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 29 20 29 3b  n<=p->nMem+1) );
b070: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
b080: 70 33 3c 70 4f 70 2d 3e 70 32 20 7c 7c 20 70 4f  p3<pOp->p2 || pO
b090: 70 2d 3e 70 33 3e 3d 70 4f 70 2d 3e 70 32 2b 6e  p->p3>=pOp->p2+n
b0a0: 20 29 3b 0a 20 20 70 41 72 67 20 3d 20 26 61 4d   );.  pArg = &aM
b0b0: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 66  em[pOp->p2];.  f
b0c0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
b0d0: 2c 20 70 41 72 67 2b 2b 29 7b 0a 20 20 20 20 61  , pArg++){.    a
b0e0: 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
b0f0: 64 28 70 41 72 67 29 20 29 3b 0a 20 20 20 20 61  d(pArg) );.    a
b100: 70 56 61 6c 5b 69 5d 20 3d 20 70 41 72 67 3b 0a  pVal[i] = pArg;.
b110: 20 20 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69      Deephemerali
b120: 7a 65 28 70 41 72 67 29 3b 0a 20 20 20 20 73 71  ze(pArg);.    sq
b130: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f 72  lite3VdbeMemStor
b140: 65 54 79 70 65 28 70 41 72 67 29 3b 0a 20 20 20  eType(pArg);.   
b150: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
b160: 70 4f 70 2d 3e 70 32 2b 69 2c 20 70 41 72 67 29  pOp->p2+i, pArg)
b170: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
b180: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
b190: 5f 46 55 4e 43 44 45 46 20 7c 7c 20 70 4f 70 2d  _FUNCDEF || pOp-
b1a0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 56 44 42 45  >p4type==P4_VDBE
b1b0: 46 55 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 4f  FUNC );.  if( pO
b1c0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55  p->p4type==P4_FU
b1d0: 4e 43 44 45 46 20 29 7b 0a 20 20 20 20 63 74 78  NCDEF ){.    ctx
b1e0: 2e 70 46 75 6e 63 20 3d 20 70 4f 70 2d 3e 70 34  .pFunc = pOp->p4
b1f0: 2e 70 46 75 6e 63 3b 0a 20 20 20 20 63 74 78 2e  .pFunc;.    ctx.
b200: 70 56 64 62 65 46 75 6e 63 20 3d 20 30 3b 0a 20  pVdbeFunc = 0;. 
b210: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 74 78 2e   }else{.    ctx.
b220: 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62  pVdbeFunc = (Vdb
b230: 65 46 75 6e 63 2a 29 70 4f 70 2d 3e 70 34 2e 70  eFunc*)pOp->p4.p
b240: 56 64 62 65 46 75 6e 63 3b 0a 20 20 20 20 63 74  VdbeFunc;.    ct
b250: 78 2e 70 46 75 6e 63 20 3d 20 63 74 78 2e 70 56  x.pFunc = ctx.pV
b260: 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 3b 0a  dbeFunc->pFunc;.
b270: 20 20 7d 0a 0a 20 20 63 74 78 2e 73 2e 66 6c 61    }..  ctx.s.fla
b280: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
b290: 20 63 74 78 2e 73 2e 64 62 20 3d 20 64 62 3b 0a   ctx.s.db = db;.
b2a0: 20 20 63 74 78 2e 73 2e 78 44 65 6c 20 3d 20 30    ctx.s.xDel = 0
b2b0: 3b 0a 20 20 63 74 78 2e 73 2e 7a 4d 61 6c 6c 6f  ;.  ctx.s.zMallo
b2c0: 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65  c = 0;..  /* The
b2d0: 20 6f 75 74 70 75 74 20 63 65 6c 6c 20 6d 61 79   output cell may
b2e0: 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
b2f0: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
b300: 2e 20 4d 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20  . Move.  ** the 
b310: 70 6f 69 6e 74 65 72 20 74 6f 20 63 74 78 2e 73  pointer to ctx.s
b320: 20 73 6f 20 69 6e 20 63 61 73 65 20 74 68 65 20   so in case the 
b330: 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 63 61  user-function ca
b340: 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 61  n use.  ** the a
b350: 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64  lready allocated
b360: 20 62 75 66 66 65 72 20 69 6e 73 74 65 61 64 20   buffer instead 
b370: 6f 66 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  of allocating a 
b380: 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  new one..  */.  
b390: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f  sqlite3VdbeMemMo
b3a0: 76 65 28 26 63 74 78 2e 73 2c 20 70 4f 75 74 29  ve(&ctx.s, pOut)
b3b0: 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c  ;.  MemSetTypeFl
b3c0: 61 67 28 26 63 74 78 2e 73 2c 20 4d 45 4d 5f 4e  ag(&ctx.s, MEM_N
b3d0: 75 6c 6c 29 3b 0a 0a 20 20 63 74 78 2e 69 73 45  ull);..  ctx.isE
b3e0: 72 72 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  rror = 0;.  if( 
b3f0: 63 74 78 2e 70 46 75 6e 63 2d 3e 66 6c 61 67 73  ctx.pFunc->flags
b400: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
b410: 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 61  EEDCOLL ){.    a
b420: 73 73 65 72 74 28 20 70 4f 70 3e 61 4f 70 20 29  ssert( pOp>aOp )
b430: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
b440: 70 5b 2d 31 5d 2e 70 34 74 79 70 65 3d 3d 50 34  p[-1].p4type==P4
b450: 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 20 20  _COLLSEQ );.    
b460: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
b470: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53  opcode==OP_CollS
b480: 65 71 20 29 3b 0a 20 20 20 20 63 74 78 2e 70 43  eq );.    ctx.pC
b490: 6f 6c 6c 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 34  oll = pOp[-1].p4
b4a0: 2e 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 64 62  .pColl;.  }.  db
b4b0: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6c 61  ->lastRowid = la
b4c0: 73 74 52 6f 77 69 64 3b 0a 20 20 28 2a 63 74 78  stRowid;.  (*ctx
b4d0: 2e 70 46 75 6e 63 2d 3e 78 46 75 6e 63 29 28 26  .pFunc->xFunc)(&
b4e0: 63 74 78 2c 20 6e 2c 20 61 70 56 61 6c 29 3b 20  ctx, n, apVal); 
b4f0: 2f 2a 20 49 4d 50 3a 20 52 2d 32 34 35 30 35 2d  /* IMP: R-24505-
b500: 32 33 32 33 30 20 2a 2f 0a 20 20 6c 61 73 74 52  23230 */.  lastR
b510: 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61 73 74 52  owid = db->lastR
b520: 6f 77 69 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  owid;..  /* If a
b530: 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ny auxiliary dat
b540: 61 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65  a functions have
b550: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 62 79 20   been called by 
b560: 74 68 69 73 20 75 73 65 72 20 66 75 6e 63 74 69  this user functi
b570: 6f 6e 2c 0a 20 20 2a 2a 20 69 6d 6d 65 64 69 61  on,.  ** immedia
b580: 74 65 6c 79 20 63 61 6c 6c 20 74 68 65 20 64 65  tely call the de
b590: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61 6e 79  structor for any
b5a0: 20 6e 6f 6e 2d 73 74 61 74 69 63 20 76 61 6c 75   non-static valu
b5b0: 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  es..  */.  if( c
b5c0: 74 78 2e 70 56 64 62 65 46 75 6e 63 20 29 7b 0a  tx.pVdbeFunc ){.
b5d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44      sqlite3VdbeD
b5e0: 65 6c 65 74 65 41 75 78 44 61 74 61 28 63 74 78  eleteAuxData(ctx
b5f0: 2e 70 56 64 62 65 46 75 6e 63 2c 20 70 4f 70 2d  .pVdbeFunc, pOp-
b600: 3e 70 31 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  >p1);.    pOp->p
b610: 34 2e 70 56 64 62 65 46 75 6e 63 20 3d 20 63 74  4.pVdbeFunc = ct
b620: 78 2e 70 56 64 62 65 46 75 6e 63 3b 0a 20 20 20  x.pVdbeFunc;.   
b630: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
b640: 34 5f 56 44 42 45 46 55 4e 43 3b 0a 20 20 7d 0a  4_VDBEFUNC;.  }.
b650: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
b660: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 2f  cFailed ){.    /
b670: 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 61 20  * Even though a 
b680: 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 66 61 69  malloc() has fai
b690: 6c 65 64 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65  led, the impleme
b6a0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  ntation of the. 
b6b0: 20 20 20 2a 2a 20 75 73 65 72 20 66 75 6e 63 74     ** user funct
b6c0: 69 6f 6e 20 6d 61 79 20 68 61 76 65 20 63 61 6c  ion may have cal
b6d0: 6c 65 64 20 61 6e 20 73 71 6c 69 74 65 33 5f 72  led an sqlite3_r
b6e0: 65 73 75 6c 74 5f 58 58 58 28 29 20 66 75 6e 63  esult_XXX() func
b6f0: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 6f 20 72  tion.    ** to r
b700: 65 74 75 72 6e 20 61 20 76 61 6c 75 65 2e 20 54  eturn a value. T
b710: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
b720: 6c 20 72 65 6c 65 61 73 65 73 20 61 6e 79 20 72  l releases any r
b730: 65 73 6f 75 72 63 65 73 0a 20 20 20 20 2a 2a 20  esources.    ** 
b740: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
b750: 73 75 63 68 20 61 20 76 61 6c 75 65 2e 0a 20 20  such a value..  
b760: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
b770: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
b780: 63 74 78 2e 73 29 3b 0a 20 20 20 20 67 6f 74 6f  ctx.s);.    goto
b790: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 0a 20 20   no_mem;.  }..  
b7a0: 2f 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  /* If the functi
b7b0: 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  on returned an e
b7c0: 72 72 6f 72 2c 20 74 68 72 6f 77 20 61 6e 20 65  rror, throw an e
b7d0: 78 63 65 70 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  xception */.  if
b7e0: 28 20 63 74 78 2e 69 73 45 72 72 6f 72 20 29 7b  ( ctx.isError ){
b7f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
b800: 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
b810: 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c  g, db, "%s", sql
b820: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
b830: 26 63 74 78 2e 73 29 29 3b 0a 20 20 20 20 72 63  &ctx.s));.    rc
b840: 20 3d 20 63 74 78 2e 69 73 45 72 72 6f 72 3b 0a   = ctx.isError;.
b850: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74    }..  /* Copy t
b860: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
b870: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 74 6f 20 72   function into r
b880: 65 67 69 73 74 65 72 20 50 33 20 2a 2f 0a 20 20  egister P3 */.  
b890: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
b8a0: 65 45 6e 63 6f 64 69 6e 67 28 26 63 74 78 2e 73  eEncoding(&ctx.s
b8b0: 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 73  , encoding);.  s
b8c0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76  qlite3VdbeMemMov
b8d0: 65 28 70 4f 75 74 2c 20 26 63 74 78 2e 73 29 3b  e(pOut, &ctx.s);
b8e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  .  if( sqlite3Vd
b8f0: 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 4f 75 74  beMemTooBig(pOut
b900: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f  ) ){.    goto to
b910: 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a 23 69 66 20  o_big;.  }..#if 
b920: 30 0a 20 20 2f 2a 20 54 68 65 20 61 70 70 2d 64  0.  /* The app-d
b930: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 20  efined function 
b940: 68 61 73 20 64 6f 6e 65 20 73 6f 6d 65 74 68 69  has done somethi
b950: 6e 67 20 74 68 61 74 20 61 73 20 63 61 75 73 65  ng that as cause
b960: 64 20 74 68 69 73 0a 20 20 2a 2a 20 73 74 61 74  d this.  ** stat
b970: 65 6d 65 6e 74 20 74 6f 20 65 78 70 69 72 65 2e  ement to expire.
b980: 20 20 28 50 65 72 68 61 70 73 20 74 68 65 20 66    (Perhaps the f
b990: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 73  unction called s
b9a0: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 20 20  qlite3_exec().  
b9b0: 2a 2a 20 77 69 74 68 20 61 20 43 52 45 41 54 45  ** with a CREATE
b9c0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
b9d0: 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  .).  */.  if( p-
b9e0: 3e 65 78 70 69 72 65 64 20 29 20 72 63 20 3d 20  >expired ) rc = 
b9f0: 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 23 65  SQLITE_ABORT;.#e
ba00: 6e 64 69 66 0a 0a 20 20 52 45 47 49 53 54 45 52  ndif..  REGISTER
ba10: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20  _TRACE(pOp->p3, 
ba20: 70 4f 75 74 29 3b 0a 20 20 55 50 44 41 54 45 5f  pOut);.  UPDATE_
ba30: 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75  MAX_BLOBSIZE(pOu
ba40: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
ba50: 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69 74 41 6e  /* Opcode: BitAn
ba60: 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  d P1 P2 P3 * *.*
ba70: 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 62 69  *.** Take the bi
ba80: 74 2d 77 69 73 65 20 41 4e 44 20 6f 66 20 74 68  t-wise AND of th
ba90: 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69  e values in regi
baa0: 73 74 65 72 20 50 31 20 61 6e 64 20 50 32 20 61  ster P1 and P2 a
bab0: 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20  nd.** store the 
bac0: 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74  result in regist
bad0: 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74  er P3..** If eit
bae0: 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c  her input is NUL
baf0: 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  L, the result is
bb00: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63   NULL..*/./* Opc
bb10: 6f 64 65 3a 20 42 69 74 4f 72 20 50 31 20 50 32  ode: BitOr P1 P2
bb20: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 61   P3 * *.**.** Ta
bb30: 6b 65 20 74 68 65 20 62 69 74 2d 77 69 73 65 20  ke the bit-wise 
bb40: 4f 52 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73  OR of the values
bb50: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
bb60: 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73 74  and P2 and.** st
bb70: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
bb80: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
bb90: 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75  * If either inpu
bba0: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  t is NULL, the r
bbb0: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
bbc0: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68 69  /./* Opcode: Shi
bbd0: 66 74 4c 65 66 74 20 50 31 20 50 32 20 50 33 20  ftLeft P1 P2 P3 
bbe0: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74 20  * *.**.** Shift 
bbf0: 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
bc00: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
bc10: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 62 79 20   to the left by 
bc20: 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
bc30: 20 62 69 74 73 20 73 70 65 63 69 66 69 65 64 20   bits specified 
bc40: 62 79 20 74 68 65 20 69 6e 74 65 67 65 72 20 69  by the integer i
bc50: 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a  n register P1..*
bc60: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
bc70: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
bc80: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
bc90: 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74  input is NULL, t
bca0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
bcb0: 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  L..*/./* Opcode:
bcc0: 20 53 68 69 66 74 52 69 67 68 74 20 50 31 20 50   ShiftRight P1 P
bcd0: 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53  2 P3 * *.**.** S
bce0: 68 69 66 74 20 74 68 65 20 69 6e 74 65 67 65 72  hift the integer
bcf0: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
bd00: 65 72 20 50 32 20 74 6f 20 74 68 65 20 72 69 67  er P2 to the rig
bd10: 68 74 20 62 79 20 74 68 65 0a 2a 2a 20 6e 75 6d  ht by the.** num
bd20: 62 65 72 20 6f 66 20 62 69 74 73 20 73 70 65 63  ber of bits spec
bd30: 69 66 69 65 64 20 62 79 20 74 68 65 20 69 6e 74  ified by the int
bd40: 65 67 65 72 20 69 6e 20 72 65 67 69 73 74 65 72  eger in register
bd50: 20 50 31 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68   P1..** Store th
bd60: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
bd70: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
bd80: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
bd90: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
bda0: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65  is NULL..*/.case
bdb0: 20 4f 50 5f 42 69 74 41 6e 64 3a 20 20 20 20 20   OP_BitAnd:     
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
bdd0: 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 41 4e 44  ame as TK_BITAND
bde0: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
bdf0: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74 4f   */.case OP_BitO
be00: 72 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r:              
be10: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
be20: 4b 5f 42 49 54 4f 52 2c 20 69 6e 31 2c 20 69 6e  K_BITOR, in1, in
be30: 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
be40: 4f 50 5f 53 68 69 66 74 4c 65 66 74 3a 20 20 20  OP_ShiftLeft:   
be50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
be60: 6d 65 20 61 73 20 54 4b 5f 4c 53 48 49 46 54 2c  me as TK_LSHIFT,
be70: 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
be80: 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 68 69 66 74  */.case OP_Shift
be90: 52 69 67 68 74 3a 20 7b 20 20 20 20 20 20 20 20  Right: {        
bea0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
beb0: 5f 52 53 48 49 46 54 2c 20 69 6e 31 2c 20 69 6e  _RSHIFT, in1, in
bec0: 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34  2, out3 */.  i64
bed0: 20 69 41 3b 0a 20 20 75 36 34 20 75 41 3b 0a 20   iA;.  u64 uA;. 
bee0: 20 69 36 34 20 69 42 3b 0a 20 20 75 38 20 6f 70   i64 iB;.  u8 op
bef0: 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  ;..  pIn1 = &aMe
bf00: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49  m[pOp->p1];.  pI
bf10: 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n2 = &aMem[pOp->
bf20: 70 32 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61  p2];.  pOut = &a
bf30: 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
bf40: 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
bf50: 20 7c 20 70 49 6e 32 2d 3e 66 6c 61 67 73 29 20   | pIn2->flags) 
bf60: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
bf70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
bf80: 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
bf90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
bfa0: 69 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  iA = sqlite3Vdbe
bfb0: 49 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 3b 0a  IntValue(pIn2);.
bfc0: 20 20 69 42 20 3d 20 73 71 6c 69 74 65 33 56 64    iB = sqlite3Vd
bfd0: 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29  beIntValue(pIn1)
bfe0: 3b 0a 20 20 6f 70 20 3d 20 70 4f 70 2d 3e 6f 70  ;.  op = pOp->op
bff0: 63 6f 64 65 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  code;.  if( op==
c000: 4f 50 5f 42 69 74 41 6e 64 20 29 7b 0a 20 20 20  OP_BitAnd ){.   
c010: 20 69 41 20 26 3d 20 69 42 3b 0a 20 20 7d 65 6c   iA &= iB;.  }el
c020: 73 65 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 42 69  se if( op==OP_Bi
c030: 74 4f 72 20 29 7b 0a 20 20 20 20 69 41 20 7c 3d  tOr ){.    iA |=
c040: 20 69 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   iB;.  }else if(
c050: 20 69 42 21 3d 30 20 29 7b 0a 20 20 20 20 61 73   iB!=0 ){.    as
c060: 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 53 68 69  sert( op==OP_Shi
c070: 66 74 52 69 67 68 74 20 7c 7c 20 6f 70 3d 3d 4f  ftRight || op==O
c080: 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 0a  P_ShiftLeft );..
c090: 20 20 20 20 2f 2a 20 49 66 20 73 68 69 66 74 69      /* If shifti
c0a0: 6e 67 20 62 79 20 61 20 6e 65 67 61 74 69 76 65  ng by a negative
c0b0: 20 61 6d 6f 75 6e 74 2c 20 73 68 69 66 74 20 69   amount, shift i
c0c0: 6e 20 74 68 65 20 6f 74 68 65 72 20 64 69 72 65  n the other dire
c0d0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28  ction */.    if(
c0e0: 20 69 42 3c 30 20 29 7b 0a 20 20 20 20 20 20 61   iB<0 ){.      a
c0f0: 73 73 65 72 74 28 20 4f 50 5f 53 68 69 66 74 52  ssert( OP_ShiftR
c100: 69 67 68 74 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  ight==OP_ShiftLe
c110: 66 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 6f 70  ft+1 );.      op
c120: 20 3d 20 32 2a 4f 50 5f 53 68 69 66 74 4c 65 66   = 2*OP_ShiftLef
c130: 74 20 2b 20 31 20 2d 20 6f 70 3b 0a 20 20 20 20  t + 1 - op;.    
c140: 20 20 69 42 20 3d 20 69 42 3e 28 2d 36 34 29 20    iB = iB>(-64) 
c150: 3f 20 2d 69 42 20 3a 20 36 34 3b 0a 20 20 20 20  ? -iB : 64;.    
c160: 7d 0a 0a 20 20 20 20 69 66 28 20 69 42 3e 3d 36  }..    if( iB>=6
c170: 34 20 29 7b 0a 20 20 20 20 20 20 69 41 20 3d 20  4 ){.      iA = 
c180: 28 69 41 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 4f 50  (iA>=0 || op==OP
c190: 5f 53 68 69 66 74 4c 65 66 74 29 20 3f 20 30 20  _ShiftLeft) ? 0 
c1a0: 3a 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  : -1;.    }else{
c1b0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 75  .      memcpy(&u
c1c0: 41 2c 20 26 69 41 2c 20 73 69 7a 65 6f 66 28 75  A, &iA, sizeof(u
c1d0: 41 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  A));.      if( o
c1e0: 70 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  p==OP_ShiftLeft 
c1f0: 29 7b 0a 20 20 20 20 20 20 20 20 75 41 20 3c 3c  ){.        uA <<
c200: 3d 20 69 42 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = iB;.      }els
c210: 65 7b 0a 20 20 20 20 20 20 20 20 75 41 20 3e 3e  e{.        uA >>
c220: 3d 20 69 42 3b 0a 20 20 20 20 20 20 20 20 2f 2a  = iB;.        /*
c230: 20 53 69 67 6e 2d 65 78 74 65 6e 64 20 6f 6e 20   Sign-extend on 
c240: 61 20 72 69 67 68 74 20 73 68 69 66 74 20 6f 66  a right shift of
c250: 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
c260: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  er */.        if
c270: 28 20 69 41 3c 30 20 29 20 75 41 20 7c 3d 20 28  ( iA<0 ) uA |= (
c280: 28 28 28 75 36 34 29 30 78 66 66 66 66 66 66 66  (((u64)0xfffffff
c290: 66 29 3c 3c 33 32 29 7c 30 78 66 66 66 66 66 66  f)<<32)|0xffffff
c2a0: 66 66 29 20 3c 3c 20 28 36 34 2d 69 42 29 3b 0a  ff) << (64-iB);.
c2b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
c2c0: 6d 63 70 79 28 26 69 41 2c 20 26 75 41 2c 20 73  mcpy(&iA, &uA, s
c2d0: 69 7a 65 6f 66 28 69 41 29 29 3b 0a 20 20 20 20  izeof(iA));.    
c2e0: 7d 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e  }.  }.  pOut->u.
c2f0: 69 20 3d 20 69 41 3b 0a 20 20 4d 65 6d 53 65 74  i = iA;.  MemSet
c300: 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d  TypeFlag(pOut, M
c310: 45 4d 5f 49 6e 74 29 3b 0a 20 20 62 72 65 61 6b  EM_Int);.  break
c320: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
c330: 41 64 64 49 6d 6d 20 20 50 31 20 50 32 20 2a 20  AddImm  P1 P2 * 
c340: 2a 20 2a 0a 2a 2a 20 0a 2a 2a 20 41 64 64 20 74  * *.** .** Add t
c350: 68 65 20 63 6f 6e 73 74 61 6e 74 20 50 32 20 74  he constant P2 t
c360: 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  o the value in r
c370: 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20 54  egister P1..** T
c380: 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77  he result is alw
c390: 61 79 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a  ays an integer..
c3a0: 2a 2a 0a 2a 2a 20 54 6f 20 66 6f 72 63 65 20 61  **.** To force a
c3b0: 6e 79 20 72 65 67 69 73 74 65 72 20 74 6f 20 62  ny register to b
c3c0: 65 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 6a 75  e an integer, ju
c3d0: 73 74 20 61 64 64 20 30 2e 0a 2a 2f 0a 63 61 73  st add 0..*/.cas
c3e0: 65 20 4f 50 5f 41 64 64 49 6d 6d 3a 20 7b 20 20  e OP_AddImm: {  
c3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31            /* in1
c400: 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
c410: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 6d  em[pOp->p1];.  m
c420: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
c430: 70 2c 20 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69  p, pIn1);.  sqli
c440: 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65  te3VdbeMemIntege
c450: 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 70 49  rify(pIn1);.  pI
c460: 6e 31 2d 3e 75 2e 69 20 2b 3d 20 70 4f 70 2d 3e  n1->u.i += pOp->
c470: 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  p2;.  break;.}..
c480: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 75 73 74 42  /* Opcode: MustB
c490: 65 49 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  eInt P1 P2 * * *
c4a0: 0a 2a 2a 20 0a 2a 2a 20 46 6f 72 63 65 20 74 68  .** .** Force th
c4b0: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
c4c0: 74 65 72 20 50 31 20 74 6f 20 62 65 20 61 6e 20  ter P1 to be an 
c4d0: 69 6e 74 65 67 65 72 2e 20 20 49 66 20 74 68 65  integer.  If the
c4e0: 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20   value.** in P1 
c4f0: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
c500: 72 20 61 6e 64 20 63 61 6e 6e 6f 74 20 62 65 20  r and cannot be 
c510: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
c520: 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20 77 69 74  n integer.** wit
c530: 68 6f 75 74 20 64 61 74 61 20 6c 6f 73 73 2c 20  hout data loss, 
c540: 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69  then jump immedi
c550: 61 74 65 6c 79 20 74 6f 20 50 32 2c 20 6f 72 20  ately to P2, or 
c560: 69 66 20 50 32 3d 3d 30 0a 2a 2a 20 72 61 69 73  if P2==0.** rais
c570: 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53 4d  e an SQLITE_MISM
c580: 41 54 43 48 20 65 78 63 65 70 74 69 6f 6e 2e 0a  ATCH exception..
c590: 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 75 73 74 42  */.case OP_MustB
c5a0: 65 49 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20  eInt: {         
c5b0: 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20     /* jump, in1 
c5c0: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
c5d0: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 70  m[pOp->p1];.  ap
c5e0: 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e 31  plyAffinity(pIn1
c5f0: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  , SQLITE_AFF_NUM
c600: 45 52 49 43 2c 20 65 6e 63 6f 64 69 6e 67 29 3b  ERIC, encoding);
c610: 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
c620: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d  ags & MEM_Int)==
c630: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70  0 ){.    if( pOp
c640: 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->p2==0 ){.     
c650: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53   rc = SQLITE_MIS
c660: 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 67 6f 74  MATCH;.      got
c670: 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
c680: 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rror;.    }else{
c690: 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  .      pc = pOp-
c6a0: 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20  >p2 - 1;.    }. 
c6b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4d 65 6d 53   }else{.    MemS
c6c0: 65 74 54 79 70 65 46 6c 61 67 28 70 49 6e 31 2c  etTypeFlag(pIn1,
c6d0: 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 20   MEM_Int);.  }. 
c6e0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64   break;.}..#ifnd
c6f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
c700: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
c710: 20 4f 70 63 6f 64 65 3a 20 52 65 61 6c 41 66 66   Opcode: RealAff
c720: 69 6e 69 74 79 20 50 31 20 2a 20 2a 20 2a 20 2a  inity P1 * * * *
c730: 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 69 73 74  .**.** If regist
c740: 65 72 20 50 31 20 68 6f 6c 64 73 20 61 6e 20 69  er P1 holds an i
c750: 6e 74 65 67 65 72 20 63 6f 6e 76 65 72 74 20 69  nteger convert i
c760: 74 20 74 6f 20 61 20 72 65 61 6c 20 76 61 6c 75  t to a real valu
c770: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  e..**.** This op
c780: 63 6f 64 65 20 69 73 20 75 73 65 64 20 77 68 65  code is used whe
c790: 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69 6e 66  n extracting inf
c7a0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20  ormation from a 
c7b0: 63 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 68  column that.** h
c7c0: 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79  as REAL affinity
c7d0: 2e 20 20 53 75 63 68 20 63 6f 6c 75 6d 6e 20 76  .  Such column v
c7e0: 61 6c 75 65 73 20 6d 61 79 20 73 74 69 6c 6c 20  alues may still 
c7f0: 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20  be stored as.** 
c800: 69 6e 74 65 67 65 72 73 2c 20 66 6f 72 20 73 70  integers, for sp
c810: 61 63 65 20 65 66 66 69 63 69 65 6e 63 79 2c 20  ace efficiency, 
c820: 62 75 74 20 61 66 74 65 72 20 65 78 74 72 61 63  but after extrac
c830: 74 69 6f 6e 20 77 65 20 77 61 6e 74 20 74 68 65  tion we want the
c840: 6d 0a 2a 2a 20 74 6f 20 68 61 76 65 20 6f 6e 6c  m.** to have onl
c850: 79 20 61 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a  y a real value..
c860: 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61 6c 41  */.case OP_RealA
c870: 66 66 69 6e 69 74 79 3a 20 7b 20 20 20 20 20 20  ffinity: {      
c880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
c890: 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
c8a0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
c8b0: 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73   if( pIn1->flags
c8c0: 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
c8d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
c8e0: 52 65 61 6c 69 66 79 28 70 49 6e 31 29 3b 0a 20  Realify(pIn1);. 
c8f0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65   }.  break;.}.#e
c900: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
c910: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 2f  LITE_OMIT_CAST./
c920: 2a 20 4f 70 63 6f 64 65 3a 20 54 6f 54 65 78 74  * Opcode: ToText
c930: 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
c940: 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75  * Force the valu
c950: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
c960: 20 74 6f 20 62 65 20 74 65 78 74 2e 0a 2a 2a 20   to be text..** 
c970: 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  If the value is 
c980: 6e 75 6d 65 72 69 63 2c 20 63 6f 6e 76 65 72 74  numeric, convert
c990: 20 69 74 20 74 6f 20 61 20 73 74 72 69 6e 67 20   it to a string 
c9a0: 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 65 71 75  using the.** equ
c9b0: 69 76 61 6c 65 6e 74 20 6f 66 20 70 72 69 6e 74  ivalent of print
c9c0: 66 28 29 2e 20 20 42 6c 6f 62 20 76 61 6c 75 65  f().  Blob value
c9d0: 73 20 61 72 65 20 75 6e 63 68 61 6e 67 65 64 20  s are unchanged 
c9e0: 61 6e 64 0a 2a 2a 20 61 72 65 20 61 66 74 65 72  and.** are after
c9f0: 77 61 72 64 73 20 73 69 6d 70 6c 79 20 69 6e 74  wards simply int
ca00: 65 72 70 72 65 74 65 64 20 61 73 20 74 65 78 74  erpreted as text
ca10: 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76  ..**.** A NULL v
ca20: 61 6c 75 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  alue is not chan
ca30: 67 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ged by this rout
ca40: 69 6e 65 2e 20 20 49 74 20 72 65 6d 61 69 6e 73  ine.  It remains
ca50: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f   NULL..*/.case O
ca60: 50 5f 54 6f 54 65 78 74 3a 20 7b 20 20 20 20 20  P_ToText: {     
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ca80: 73 61 6d 65 20 61 73 20 54 4b 5f 54 4f 5f 54 45  same as TK_TO_TE
ca90: 58 54 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e  XT, in1 */.  pIn
caa0: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
cab0: 31 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f  1];.  memAboutTo
cac0: 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b  Change(p, pIn1);
cad0: 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61  .  if( pIn1->fla
cae0: 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 20  gs & MEM_Null ) 
caf0: 62 72 65 61 6b 3b 0a 20 20 61 73 73 65 72 74 28  break;.  assert(
cb00: 20 4d 45 4d 5f 53 74 72 3d 3d 28 4d 45 4d 5f 42   MEM_Str==(MEM_B
cb10: 6c 6f 62 3e 3e 33 29 20 29 3b 0a 20 20 70 49 6e  lob>>3) );.  pIn
cb20: 31 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 49 6e  1->flags |= (pIn
cb30: 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f  1->flags&MEM_Blo
cb40: 62 29 3e 3e 33 3b 0a 20 20 61 70 70 6c 79 41 66  b)>>3;.  applyAf
cb50: 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 53 51 4c  finity(pIn1, SQL
cb60: 49 54 45 5f 41 46 46 5f 54 45 58 54 2c 20 65 6e  ITE_AFF_TEXT, en
cb70: 63 6f 64 69 6e 67 29 3b 0a 20 20 72 63 20 3d 20  coding);.  rc = 
cb80: 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31 29  ExpandBlob(pIn1)
cb90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31  ;.  assert( pIn1
cba0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
cbb0: 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
cbc0: 61 69 6c 65 64 20 29 3b 0a 20 20 70 49 6e 31 2d  ailed );.  pIn1-
cbd0: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f  >flags &= ~(MEM_
cbe0: 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d  Int|MEM_Real|MEM
cbf0: 5f 42 6c 6f 62 7c 4d 45 4d 5f 5a 65 72 6f 29 3b  _Blob|MEM_Zero);
cc00: 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c  .  UPDATE_MAX_BL
cc10: 4f 42 53 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20  OBSIZE(pIn1);.  
cc20: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
cc30: 6f 64 65 3a 20 54 6f 42 6c 6f 62 20 50 31 20 2a  ode: ToBlob P1 *
cc40: 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72   * * *.**.** For
cc50: 63 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ce the value in 
cc60: 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20 62  register P1 to b
cc70: 65 20 61 20 42 4c 4f 42 2e 0a 2a 2a 20 49 66 20  e a BLOB..** If 
cc80: 74 68 65 20 76 61 6c 75 65 20 69 73 20 6e 75 6d  the value is num
cc90: 65 72 69 63 2c 20 63 6f 6e 76 65 72 74 20 69 74  eric, convert it
cca0: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 66 69 72   to a string fir
ccb0: 73 74 2e 0a 2a 2a 20 53 74 72 69 6e 67 73 20 61  st..** Strings a
ccc0: 72 65 20 73 69 6d 70 6c 79 20 72 65 69 6e 74 65  re simply reinte
ccd0: 72 70 72 65 74 65 64 20 61 73 20 62 6c 6f 62 73  rpreted as blobs
cce0: 20 77 69 74 68 20 6e 6f 20 63 68 61 6e 67 65 0a   with no change.
ccf0: 2a 2a 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c  ** to the underl
cd00: 79 69 6e 67 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  ying data..**.**
cd10: 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73   A NULL value is
cd20: 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 62 79 20   not changed by 
cd30: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 49  this routine.  I
cd40: 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a  t remains NULL..
cd50: 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f 42 6c 6f  */.case OP_ToBlo
cd60: 62 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  b: {            
cd70: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
cd80: 20 54 4b 5f 54 4f 5f 42 4c 4f 42 2c 20 69 6e 31   TK_TO_BLOB, in1
cd90: 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
cda0: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69  em[pOp->p1];.  i
cdb0: 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  f( pIn1->flags &
cdc0: 20 4d 45 4d 5f 4e 75 6c 6c 20 29 20 62 72 65 61   MEM_Null ) brea
cdd0: 6b 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  k;.  if( (pIn1->
cde0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
cdf0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 70 70 6c  )==0 ){.    appl
ce00: 79 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 20  yAffinity(pIn1, 
ce10: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 2c  SQLITE_AFF_TEXT,
ce20: 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20   encoding);.    
ce30: 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c  assert( pIn1->fl
ce40: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 7c 7c  ags & MEM_Str ||
ce50: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
ce60: 64 20 29 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54  d );.    MemSetT
ce70: 79 70 65 46 6c 61 67 28 70 49 6e 31 2c 20 4d 45  ypeFlag(pIn1, ME
ce80: 4d 5f 42 6c 6f 62 29 3b 0a 20 20 7d 65 6c 73 65  M_Blob);.  }else
ce90: 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 66 6c 61 67  {.    pIn1->flag
cea0: 73 20 26 3d 20 7e 28 4d 45 4d 5f 54 79 70 65 4d  s &= ~(MEM_TypeM
ceb0: 61 73 6b 26 7e 4d 45 4d 5f 42 6c 6f 62 29 3b 0a  ask&~MEM_Blob);.
cec0: 20 20 7d 0a 20 20 55 50 44 41 54 45 5f 4d 41 58    }.  UPDATE_MAX
ced0: 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31 29 3b  _BLOBSIZE(pIn1);
cee0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
cef0: 4f 70 63 6f 64 65 3a 20 54 6f 4e 75 6d 65 72 69  Opcode: ToNumeri
cf00: 63 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  c P1 * * * *.**.
cf10: 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c  ** Force the val
cf20: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
cf30: 31 20 74 6f 20 62 65 20 6e 75 6d 65 72 69 63 20  1 to be numeric 
cf40: 28 65 69 74 68 65 72 20 61 6e 0a 2a 2a 20 69 6e  (either an.** in
cf50: 74 65 67 65 72 20 6f 72 20 61 20 66 6c 6f 61 74  teger or a float
cf60: 69 6e 67 2d 70 6f 69 6e 74 20 6e 75 6d 62 65 72  ing-point number
cf70: 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c  .).** If the val
cf80: 75 65 20 69 73 20 74 65 78 74 20 6f 72 20 62 6c  ue is text or bl
cf90: 6f 62 2c 20 74 72 79 20 74 6f 20 63 6f 6e 76 65  ob, try to conve
cfa0: 72 74 20 69 74 20 74 6f 20 61 6e 20 75 73 69 6e  rt it to an usin
cfb0: 67 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c  g the.** equival
cfc0: 65 6e 74 20 6f 66 20 61 74 6f 69 28 29 20 6f 72  ent of atoi() or
cfd0: 20 61 74 6f 66 28 29 20 61 6e 64 20 73 74 6f 72   atof() and stor
cfe0: 65 20 30 20 69 66 20 6e 6f 20 73 75 63 68 20 63  e 0 if no such c
cff0: 6f 6e 76 65 72 73 69 6f 6e 20 0a 2a 2a 20 69 73  onversion .** is
d000: 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a   possible..**.**
d010: 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73   A NULL value is
d020: 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 62 79 20   not changed by 
d030: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 49  this routine.  I
d040: 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a  t remains NULL..
d050: 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f 4e 75 6d  */.case OP_ToNum
d060: 65 72 69 63 3a 20 7b 20 20 20 20 20 20 20 20 20  eric: {         
d070: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
d080: 20 61 73 20 54 4b 5f 54 4f 5f 4e 55 4d 45 52 49   as TK_TO_NUMERI
d090: 43 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31  C, in1 */.  pIn1
d0a0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
d0b0: 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ];.  sqlite3Vdbe
d0c0: 4d 65 6d 4e 75 6d 65 72 69 66 79 28 70 49 6e 31  MemNumerify(pIn1
d0d0: 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  );.  break;.}.#e
d0e0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
d0f0: 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 0a 2f 2a 20  MIT_CAST */../* 
d100: 4f 70 63 6f 64 65 3a 20 54 6f 49 6e 74 20 50 31  Opcode: ToInt P1
d110: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46   * * * *.**.** F
d120: 6f 72 63 65 20 74 68 65 20 76 61 6c 75 65 20 69  orce the value i
d130: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f  n register P1 to
d140: 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   be an integer. 
d150: 20 49 66 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65   If.** The value
d160: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 20   is currently a 
d170: 72 65 61 6c 20 6e 75 6d 62 65 72 2c 20 64 72 6f  real number, dro
d180: 70 20 69 74 73 20 66 72 61 63 74 69 6f 6e 61 6c  p its fractional
d190: 20 70 61 72 74 2e 0a 2a 2a 20 49 66 20 74 68 65   part..** If the
d1a0: 20 76 61 6c 75 65 20 69 73 20 74 65 78 74 20 6f   value is text o
d1b0: 72 20 62 6c 6f 62 2c 20 74 72 79 20 74 6f 20 63  r blob, try to c
d1c0: 6f 6e 76 65 72 74 20 69 74 20 74 6f 20 61 6e 20  onvert it to an 
d1d0: 69 6e 74 65 67 65 72 20 75 73 69 6e 67 20 74 68  integer using th
d1e0: 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  e.** equivalent 
d1f0: 6f 66 20 61 74 6f 69 28 29 20 61 6e 64 20 73 74  of atoi() and st
d200: 6f 72 65 20 30 20 69 66 20 6e 6f 20 73 75 63 68  ore 0 if no such
d210: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 70   conversion is p
d220: 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  ossible..**.** A
d230: 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e   NULL value is n
d240: 6f 74 20 63 68 61 6e 67 65 64 20 62 79 20 74 68  ot changed by th
d250: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 49 74 20  is routine.  It 
d260: 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f  remains NULL..*/
d270: 0a 63 61 73 65 20 4f 50 5f 54 6f 49 6e 74 3a 20  .case OP_ToInt: 
d280: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
d290: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
d2a0: 5f 54 4f 5f 49 4e 54 2c 20 69 6e 31 20 2a 2f 0a  _TO_INT, in1 */.
d2b0: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
d2c0: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 28  Op->p1];.  if( (
d2d0: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
d2e0: 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20  M_Null)==0 ){.  
d2f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
d300: 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 31 29  Integerify(pIn1)
d310: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
d320: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
d330: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 29  QLITE_OMIT_CAST)
d340: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
d350: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
d360: 47 5f 50 4f 49 4e 54 29 0a 2f 2a 20 4f 70 63 6f  G_POINT)./* Opco
d370: 64 65 3a 20 54 6f 52 65 61 6c 20 50 31 20 2a 20  de: ToReal P1 * 
d380: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72 63  * * *.**.** Forc
d390: 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  e the value in r
d3a0: 65 67 69 73 74 65 72 20 50 31 20 74 6f 20 62 65  egister P1 to be
d3b0: 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e   a floating poin
d3c0: 74 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 49 66 20  t number..** If 
d3d0: 54 68 65 20 76 61 6c 75 65 20 69 73 20 63 75 72  The value is cur
d3e0: 72 65 6e 74 6c 79 20 61 6e 20 69 6e 74 65 67 65  rently an intege
d3f0: 72 2c 20 63 6f 6e 76 65 72 74 20 69 74 2e 0a 2a  r, convert it..*
d400: 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69  * If the value i
d410: 73 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 2c 20  s text or blob, 
d420: 74 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 69  try to convert i
d430: 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  t to an integer 
d440: 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 65 71 75  using the.** equ
d450: 69 76 61 6c 65 6e 74 20 6f 66 20 61 74 6f 69 28  ivalent of atoi(
d460: 29 20 61 6e 64 20 73 74 6f 72 65 20 30 2e 30 20  ) and store 0.0 
d470: 69 66 20 6e 6f 20 73 75 63 68 20 63 6f 6e 76 65  if no such conve
d480: 72 73 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c  rsion is possibl
d490: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20  e..**.** A NULL 
d4a0: 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 63 68 61  value is not cha
d4b0: 6e 67 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  nged by this rou
d4c0: 74 69 6e 65 2e 20 20 49 74 20 72 65 6d 61 69 6e  tine.  It remain
d4d0: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20  s NULL..*/.case 
d4e0: 4f 50 5f 54 6f 52 65 61 6c 3a 20 7b 20 20 20 20  OP_ToReal: {    
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d500: 20 73 61 6d 65 20 61 73 20 54 4b 5f 54 4f 5f 52   same as TK_TO_R
d510: 45 41 4c 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49  EAL, in1 */.  pI
d520: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
d530: 70 31 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54  p1];.  memAboutT
d540: 6f 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29  oChange(p, pIn1)
d550: 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66  ;.  if( (pIn1->f
d560: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
d570: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
d580: 65 33 56 64 62 65 4d 65 6d 52 65 61 6c 69 66 79  e3VdbeMemRealify
d590: 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72  (pIn1);.  }.  br
d5a0: 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
d5b0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d5c0: 5f 4f 4d 49 54 5f 43 41 53 54 29 20 26 26 20 21  _OMIT_CAST) && !
d5d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
d5e0: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
d5f0: 4e 54 29 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64  NT) */../* Opcod
d600: 65 3a 20 4c 74 20 50 31 20 50 32 20 50 33 20 50  e: Lt P1 P2 P3 P
d610: 34 20 50 35 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61  4 P5.**.** Compa
d620: 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  re the values in
d630: 20 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64   register P1 and
d640: 20 50 33 2e 20 20 49 66 20 72 65 67 28 50 33 29   P3.  If reg(P3)
d650: 3c 72 65 67 28 50 31 29 20 74 68 65 6e 0a 2a 2a  <reg(P1) then.**
d660: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73   jump to address
d670: 20 50 32 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20   P2.  .**.** If 
d680: 74 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  the SQLITE_JUMPI
d690: 46 4e 55 4c 4c 20 62 69 74 20 6f 66 20 50 35 20  FNULL bit of P5 
d6a0: 69 73 20 73 65 74 20 61 6e 64 20 65 69 74 68 65  is set and eithe
d6b0: 72 20 72 65 67 28 50 31 29 20 6f 72 0a 2a 2a 20  r reg(P1) or.** 
d6c0: 72 65 67 28 50 33 29 20 69 73 20 4e 55 4c 4c 20  reg(P3) is NULL 
d6d0: 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75  then take the ju
d6e0: 6d 70 2e 20 20 49 66 20 74 68 65 20 53 51 4c 49  mp.  If the SQLI
d6f0: 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 0a 2a  TE_JUMPIFNULL .*
d700: 2a 20 62 69 74 20 69 73 20 63 6c 65 61 72 20 74  * bit is clear t
d710: 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
d720: 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72 61   if either opera
d730: 6e 64 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  nd is NULL..**.*
d740: 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 41 46 46  * The SQLITE_AFF
d750: 5f 4d 41 53 4b 20 70 6f 72 74 69 6f 6e 20 6f 66  _MASK portion of
d760: 20 50 35 20 6d 75 73 74 20 62 65 20 61 6e 20 61   P5 must be an a
d770: 66 66 69 6e 69 74 79 20 63 68 61 72 61 63 74 65  ffinity characte
d780: 72 20 2d 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  r -.** SQLITE_AF
d790: 46 5f 54 45 58 54 2c 20 53 51 4c 49 54 45 5f 41  F_TEXT, SQLITE_A
d7a0: 46 46 5f 49 4e 54 45 47 45 52 2c 20 61 6e 64 20  FF_INTEGER, and 
d7b0: 73 6f 20 66 6f 72 74 68 2e 20 41 6e 20 61 74 74  so forth. An att
d7c0: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 0a 2a 2a  empt is made .**
d7d0: 20 74 6f 20 63 6f 65 72 63 65 20 62 6f 74 68 20   to coerce both 
d7e0: 69 6e 70 75 74 73 20 61 63 63 6f 72 64 69 6e 67  inputs according
d7f0: 20 74 6f 20 74 68 69 73 20 61 66 66 69 6e 69 74   to this affinit
d800: 79 20 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20  y before the.** 
d810: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61  comparison is ma
d820: 64 65 2e 20 49 66 20 74 68 65 20 53 51 4c 49 54  de. If the SQLIT
d830: 45 5f 41 46 46 5f 4d 41 53 4b 20 69 73 20 30 78  E_AFF_MASK is 0x
d840: 30 30 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  00, then numeric
d850: 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 69 73 20  .** affinity is 
d860: 75 73 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  used. Note that 
d870: 74 68 65 20 61 66 66 69 6e 69 74 79 20 63 6f 6e  the affinity con
d880: 76 65 72 73 69 6f 6e 73 20 61 72 65 20 73 74 6f  versions are sto
d890: 72 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 74 6f  red.** back into
d8a0: 20 74 68 65 20 69 6e 70 75 74 20 72 65 67 69 73   the input regis
d8b0: 74 65 72 73 20 50 31 20 61 6e 64 20 50 33 2e 20  ters P1 and P3. 
d8c0: 20 53 6f 20 74 68 69 73 20 6f 70 63 6f 64 65 20   So this opcode 
d8d0: 63 61 6e 20 63 61 75 73 65 0a 2a 2a 20 70 65 72  can cause.** per
d8e0: 73 69 73 74 65 6e 74 20 63 68 61 6e 67 65 73 20  sistent changes 
d8f0: 74 6f 20 72 65 67 69 73 74 65 72 73 20 50 31 20  to registers P1 
d900: 61 6e 64 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  and P3..**.** On
d910: 63 65 20 61 6e 79 20 63 6f 6e 76 65 72 73 69 6f  ce any conversio
d920: 6e 73 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c  ns have taken pl
d930: 61 63 65 2c 20 61 6e 64 20 6e 65 69 74 68 65 72  ace, and neither
d940: 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20   value is NULL, 
d950: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61  .** the values a
d960: 72 65 20 63 6f 6d 70 61 72 65 64 2e 20 49 66 20  re compared. If 
d970: 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65 20  both values are 
d980: 62 6c 6f 62 73 20 74 68 65 6e 20 6d 65 6d 63 6d  blobs then memcm
d990: 70 28 29 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  p() is.** used t
d9a0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
d9b0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 63  results of the c
d9c0: 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66 20 62  omparison.  If b
d9d0: 6f 74 68 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72  oth values.** ar
d9e0: 65 20 74 65 78 74 2c 20 74 68 65 6e 20 74 68 65  e text, then the
d9f0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
da00: 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
da10: 73 70 65 63 69 66 69 65 64 20 69 6e 0a 2a 2a 20  specified in.** 
da20: 50 34 20 69 73 20 20 75 73 65 64 20 74 6f 20 64  P4 is  used to d
da30: 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
da40: 2e 20 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20  .  If P4 is not 
da50: 73 70 65 63 69 66 69 65 64 20 74 68 65 6e 0a 2a  specified then.*
da60: 2a 20 6d 65 6d 63 6d 70 28 29 20 69 73 20 75 73  * memcmp() is us
da70: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 65  ed to compare te
da80: 78 74 20 73 74 72 69 6e 67 2e 20 20 49 66 20 62  xt string.  If b
da90: 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65 0a 2a  oth values are.*
daa0: 2a 20 6e 75 6d 65 72 69 63 2c 20 74 68 65 6e 20  * numeric, then 
dab0: 61 20 6e 75 6d 65 72 69 63 20 63 6f 6d 70 61 72  a numeric compar
dac0: 69 73 6f 6e 20 69 73 20 75 73 65 64 2e 20 49 66  ison is used. If
dad0: 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a   the two values.
dae0: 2a 2a 20 61 72 65 20 6f 66 20 64 69 66 66 65 72  ** are of differ
daf0: 65 6e 74 20 74 79 70 65 73 2c 20 74 68 65 6e 20  ent types, then 
db00: 6e 75 6d 62 65 72 73 20 61 72 65 20 63 6f 6e 73  numbers are cons
db10: 69 64 65 72 65 64 20 6c 65 73 73 20 74 68 61 6e  idered less than
db20: 0a 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e 64 20  .** strings and 
db30: 73 74 72 69 6e 67 73 20 61 72 65 20 63 6f 6e 73  strings are cons
db40: 69 64 65 72 65 64 20 6c 65 73 73 20 74 68 61 6e  idered less than
db50: 20 62 6c 6f 62 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   blobs..**.** If
db60: 20 74 68 65 20 53 51 4c 49 54 45 5f 53 54 4f 52   the SQLITE_STOR
db70: 45 50 32 20 62 69 74 20 6f 66 20 50 35 20 69 73  EP2 bit of P5 is
db80: 20 73 65 74 2c 20 74 68 65 6e 20 64 6f 20 6e 6f   set, then do no
db90: 74 20 6a 75 6d 70 2e 20 20 49 6e 73 74 65 61 64  t jump.  Instead
dba0: 2c 0a 2a 2a 20 73 74 6f 72 65 20 61 20 62 6f 6f  ,.** store a boo
dbb0: 6c 65 61 6e 20 72 65 73 75 6c 74 20 28 65 69 74  lean result (eit
dbc0: 68 65 72 20 30 2c 20 6f 72 20 31 2c 20 6f 72 20  her 0, or 1, or 
dbd0: 4e 55 4c 4c 29 20 69 6e 20 72 65 67 69 73 74 65  NULL) in registe
dbe0: 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  r P2..**.** If t
dbf0: 68 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  he SQLITE_NULLEQ
dc00: 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 50   bit is set in P
dc10: 35 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 76 61 6c  5, then NULL val
dc20: 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ues are consider
dc30: 65 64 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 6f  ed.** equal to o
dc40: 6e 65 20 61 6e 6f 74 68 65 72 2c 20 70 72 6f 76  ne another, prov
dc50: 69 64 65 64 20 74 68 61 74 20 74 68 65 79 20 64  ided that they d
dc60: 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 69 72  o not have their
dc70: 20 4d 45 4d 5f 43 6c 65 61 72 65 64 0a 2a 2a 20   MEM_Cleared.** 
dc80: 62 69 74 20 73 65 74 2e 0a 2a 2f 0a 2f 2a 20 4f  bit set..*/./* O
dc90: 70 63 6f 64 65 3a 20 4e 65 20 50 31 20 50 32 20  pcode: Ne P1 P2 
dca0: 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54  P3 P4 P5.**.** T
dcb0: 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
dcc0: 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64  ike the Lt opcod
dcd0: 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  e except that th
dce0: 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20  e jump is taken 
dcf0: 69 66 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 6e  if.** the operan
dd00: 64 73 20 69 6e 20 72 65 67 69 73 74 65 72 73 20  ds in registers 
dd10: 50 31 20 61 6e 64 20 50 33 20 61 72 65 20 6e 6f  P1 and P3 are no
dd20: 74 20 65 71 75 61 6c 2e 20 20 53 65 65 20 74 68  t equal.  See th
dd30: 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 0a  e Lt opcode for.
dd40: 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  ** additional in
dd50: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
dd60: 20 49 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45   If SQLITE_NULLE
dd70: 51 20 69 73 20 73 65 74 20 69 6e 20 50 35 20 74  Q is set in P5 t
dd80: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f  hen the result o
dd90: 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  f comparison is 
dda0: 61 6c 77 61 79 73 20 65 69 74 68 65 72 0a 2a 2a  always either.**
ddb0: 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65 20 61   true or false a
ddc0: 6e 64 20 69 73 20 6e 65 76 65 72 20 4e 55 4c 4c  nd is never NULL
ddd0: 2e 20 20 49 66 20 62 6f 74 68 20 6f 70 65 72 61  .  If both opera
dde0: 6e 64 73 20 61 72 65 20 4e 55 4c 4c 20 74 68 65  nds are NULL the
ddf0: 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  n the result.** 
de00: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  of comparison is
de10: 20 66 61 6c 73 65 2e 20 20 49 66 20 65 69 74 68   false.  If eith
de20: 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55  er operand is NU
de30: 4c 4c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  LL then the resu
de40: 6c 74 20 69 73 20 74 72 75 65 2e 0a 2a 2a 20 49  lt is true..** I
de50: 66 20 6e 65 69 74 68 65 72 20 6f 70 65 72 61 6e  f neither operan
de60: 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 20 72 65  d is NULL the re
de70: 73 75 6c 74 20 69 73 20 74 68 65 20 73 61 6d 65  sult is the same
de80: 20 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20   as it would be 
de90: 69 66 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  if.** the SQLITE
dea0: 5f 4e 55 4c 4c 45 51 20 66 6c 61 67 20 77 65 72  _NULLEQ flag wer
deb0: 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 50  e omitted from P
dec0: 35 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  5..*/./* Opcode:
ded0: 20 45 71 20 50 31 20 50 32 20 50 33 20 50 34 20   Eq P1 P2 P3 P4 
dee0: 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  P5.**.** This wo
def0: 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68  rks just like th
df00: 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65  e Lt opcode exce
df10: 70 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70  pt that the jump
df20: 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20   is taken if.** 
df30: 74 68 65 20 6f 70 65 72 61 6e 64 73 20 69 6e 20  the operands in 
df40: 72 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64  registers P1 and
df50: 20 50 33 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a   P3 are equal..*
df60: 2a 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63  * See the Lt opc
df70: 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ode for addition
df80: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
df90: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
dfa0: 4e 55 4c 4c 45 51 20 69 73 20 73 65 74 20 69 6e  NULLEQ is set in
dfb0: 20 50 35 20 74 68 65 6e 20 74 68 65 20 72 65 73   P5 then the res
dfc0: 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
dfd0: 6e 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68  n is always eith
dfe0: 65 72 0a 2a 2a 20 74 72 75 65 20 6f 72 20 66 61  er.** true or fa
dff0: 6c 73 65 20 61 6e 64 20 69 73 20 6e 65 76 65 72  lse and is never
e000: 20 4e 55 4c 4c 2e 20 20 49 66 20 62 6f 74 68 20   NULL.  If both 
e010: 6f 70 65 72 61 6e 64 73 20 61 72 65 20 4e 55 4c  operands are NUL
e020: 4c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  L then the resul
e030: 74 0a 2a 2a 20 6f 66 20 63 6f 6d 70 61 72 69 73  t.** of comparis
e040: 6f 6e 20 69 73 20 74 72 75 65 2e 20 20 49 66 20  on is true.  If 
e050: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
e060: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20  s NULL then the 
e070: 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65 2e  result is false.
e080: 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 6f  .** If neither o
e090: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74  perand is NULL t
e0a0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65  he result is the
e0b0: 20 73 61 6d 65 20 61 73 20 69 74 20 77 6f 75 6c   same as it woul
e0c0: 64 20 62 65 20 69 66 0a 2a 2a 20 74 68 65 20 53  d be if.** the S
e0d0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 66 6c 61  QLITE_NULLEQ fla
e0e0: 67 20 77 65 72 65 20 6f 6d 69 74 74 65 64 20 66  g were omitted f
e0f0: 72 6f 6d 20 50 35 2e 0a 2a 2f 0a 2f 2a 20 4f 70  rom P5..*/./* Op
e100: 63 6f 64 65 3a 20 4c 65 20 50 31 20 50 32 20 50  code: Le P1 P2 P
e110: 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68  3 P4 P5.**.** Th
e120: 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  is works just li
e130: 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65  ke the Lt opcode
e140: 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
e150: 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69   jump is taken i
e160: 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  f.** the content
e170: 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20   of register P3 
e180: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
e190: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 63 6f 6e  equal to the con
e1a0: 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69 73  tent of.** regis
e1b0: 74 65 72 20 50 31 2e 20 20 53 65 65 20 74 68 65  ter P1.  See the
e1c0: 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20 61   Lt opcode for a
e1d0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
e1e0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  ation..*/./* Opc
e1f0: 6f 64 65 3a 20 47 74 20 50 31 20 50 32 20 50 33  ode: Gt P1 P2 P3
e200: 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69   P4 P5.**.** Thi
e210: 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  s works just lik
e220: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20  e the Lt opcode 
e230: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
e240: 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
e250: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
e260: 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20 69  of register P3 i
e270: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
e280: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a  he content of.**
e290: 20 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 53   register P1.  S
e2a0: 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65  ee the Lt opcode
e2b0: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
e2c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
e2d0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 65 20 50 31  /* Opcode: Ge P1
e2e0: 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a   P2 P3 P4 P5.**.
e2f0: 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75  ** This works ju
e300: 73 74 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f  st like the Lt o
e310: 70 63 6f 64 65 20 65 78 63 65 70 74 20 74 68 61  pcode except tha
e320: 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61  t the jump is ta
e330: 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ken if.** the co
e340: 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65  ntent of registe
e350: 72 20 50 33 20 69 73 20 67 72 65 61 74 65 72 20  r P3 is greater 
e360: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
e370: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
e380: 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 2e 20  ** register P1. 
e390: 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f   See the Lt opco
e3a0: 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  de for additiona
e3b0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
e3c0: 2f 0a 63 61 73 65 20 4f 50 5f 45 71 3a 20 20 20  /.case OP_Eq:   
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
e3e0: 61 6d 65 20 61 73 20 54 4b 5f 45 51 2c 20 6a 75  ame as TK_EQ, ju
e3f0: 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a  mp, in1, in3 */.
e400: 63 61 73 65 20 4f 50 5f 4e 65 3a 20 20 20 20 20  case OP_Ne:     
e410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
e420: 65 20 61 73 20 54 4b 5f 4e 45 2c 20 6a 75 6d 70  e as TK_NE, jump
e430: 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61  , in1, in3 */.ca
e440: 73 65 20 4f 50 5f 4c 74 3a 20 20 20 20 20 20 20  se OP_Lt:       
e450: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
e460: 61 73 20 54 4b 5f 4c 54 2c 20 6a 75 6d 70 2c 20  as TK_LT, jump, 
e470: 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65  in1, in3 */.case
e480: 20 4f 50 5f 4c 65 3a 20 20 20 20 20 20 20 20 20   OP_Le:         
e490: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
e4a0: 20 54 4b 5f 4c 45 2c 20 6a 75 6d 70 2c 20 69 6e   TK_LE, jump, in
e4b0: 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  1, in3 */.case O
e4c0: 50 5f 47 74 3a 20 20 20 20 20 20 20 20 20 20 20  P_Gt:           
e4d0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
e4e0: 4b 5f 47 54 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c  K_GT, jump, in1,
e4f0: 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in3 */.case OP_
e500: 47 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  Ge: {           
e510: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
e520: 47 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69  GE, jump, in1, i
e530: 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b  n3 */.  int res;
e540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
e550: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d  esult of the com
e560: 70 61 72 69 73 6f 6e 20 6f 66 20 70 49 6e 31 20  parison of pIn1 
e570: 61 67 61 69 6e 73 74 20 70 49 6e 33 20 2a 2f 0a  against pIn3 */.
e580: 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
e590: 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
e5a0: 79 20 74 6f 20 75 73 65 20 66 6f 72 20 63 6f 6d  y to use for com
e5b0: 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 75 31 36  parison */.  u16
e5c0: 20 66 6c 61 67 73 31 3b 20 20 20 20 20 20 20 20   flags1;        
e5d0: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 6e 69 74   /* Copy of init
e5e0: 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 49 6e  ial value of pIn
e5f0: 31 2d 3e 66 6c 61 67 73 20 2a 2f 0a 20 20 75 31  1->flags */.  u1
e600: 36 20 66 6c 61 67 73 33 3b 20 20 20 20 20 20 20  6 flags3;       
e610: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 6e 69    /* Copy of ini
e620: 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 49  tial value of pI
e630: 6e 33 2d 3e 66 6c 61 67 73 20 2a 2f 0a 0a 20 20  n3->flags */..  
e640: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
e650: 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20  ->p1];.  pIn3 = 
e660: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
e670: 20 20 66 6c 61 67 73 31 20 3d 20 70 49 6e 31 2d    flags1 = pIn1-
e680: 3e 66 6c 61 67 73 3b 0a 20 20 66 6c 61 67 73 33  >flags;.  flags3
e690: 20 3d 20 70 49 6e 33 2d 3e 66 6c 61 67 73 3b 0a   = pIn3->flags;.
e6a0: 20 20 69 66 28 20 28 66 6c 61 67 73 31 20 7c 20    if( (flags1 | 
e6b0: 66 6c 61 67 73 33 29 26 4d 45 4d 5f 4e 75 6c 6c  flags3)&MEM_Null
e6c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f   ){.    /* One o
e6d0: 72 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20  r both operands 
e6e0: 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20  are NULL */.    
e6f0: 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51  if( pOp->p5 & SQ
e700: 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 29 7b 0a 20  LITE_NULLEQ ){. 
e710: 20 20 20 20 20 2f 2a 20 49 66 20 53 51 4c 49 54       /* If SQLIT
e720: 45 5f 4e 55 4c 4c 45 51 20 69 73 20 73 65 74 20  E_NULLEQ is set 
e730: 28 77 68 69 63 68 20 77 69 6c 6c 20 6f 6e 6c 79  (which will only
e740: 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6f   happen if the o
e750: 70 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20 20  perator is.     
e760: 20 2a 2a 20 4f 50 5f 45 71 20 6f 72 20 4f 50 5f   ** OP_Eq or OP_
e770: 4e 65 29 20 74 68 65 6e 20 74 61 6b 65 20 74 68  Ne) then take th
e780: 65 20 6a 75 6d 70 20 6f 72 20 6e 6f 74 20 64 65  e jump or not de
e790: 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
e7a0: 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 6e  er.      ** or n
e7b0: 6f 74 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73  ot both operands
e7c0: 20 61 72 65 20 6e 75 6c 6c 2e 0a 20 20 20 20 20   are null..     
e7d0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
e7e0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
e7f0: 50 5f 45 71 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63  P_Eq || pOp->opc
e800: 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  ode==OP_Ne );.  
e810: 20 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61      assert( (fla
e820: 67 73 31 20 26 20 4d 45 4d 5f 43 6c 65 61 72 65  gs1 & MEM_Cleare
e830: 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  d)==0 );.      i
e840: 66 28 20 28 66 6c 61 67 73 31 26 4d 45 4d 5f 4e  f( (flags1&MEM_N
e850: 75 6c 6c 29 21 3d 30 0a 20 20 20 20 20 20 20 26  ull)!=0.       &
e860: 26 20 28 66 6c 61 67 73 33 26 4d 45 4d 5f 4e 75  & (flags3&MEM_Nu
e870: 6c 6c 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26  ll)!=0.       &&
e880: 20 28 66 6c 61 67 73 33 26 4d 45 4d 5f 43 6c 65   (flags3&MEM_Cle
e890: 61 72 65 64 29 3d 3d 30 0a 20 20 20 20 20 20 29  ared)==0.      )
e8a0: 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
e8b0: 30 3b 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 61  0;  /* Results a
e8c0: 72 65 20 65 71 75 61 6c 20 2a 2f 0a 20 20 20 20  re equal */.    
e8d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e8e0: 20 72 65 73 20 3d 20 31 3b 20 20 2f 2a 20 52 65   res = 1;  /* Re
e8f0: 73 75 6c 74 73 20 61 72 65 20 6e 6f 74 20 65 71  sults are not eq
e900: 75 61 6c 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ual */.      }. 
e910: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e920: 2f 2a 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  /* SQLITE_NULLEQ
e930: 20 69 73 20 63 6c 65 61 72 20 61 6e 64 20 61 74   is clear and at
e940: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 65 72 61   least one opera
e950: 6e 64 20 69 73 20 4e 55 4c 4c 2c 0a 20 20 20 20  nd is NULL,.    
e960: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65    ** then the re
e970: 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73 20 4e  sult is always N
e980: 55 4c 4c 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ULL..      ** Th
e990: 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20  e jump is taken 
e9a0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4a 55  if the SQLITE_JU
e9b0: 4d 50 49 46 4e 55 4c 4c 20 62 69 74 20 69 73 20  MPIFNULL bit is 
e9c0: 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  set..      */.  
e9d0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20      if( pOp->p5 
e9e0: 26 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  & SQLITE_STOREP2
e9f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74   ){.        pOut
ea00: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
ea10: 5d 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 53 65  ];.        MemSe
ea20: 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20  tTypeFlag(pOut, 
ea30: 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  MEM_Null);.     
ea40: 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
ea50: 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29  E(pOp->p2, pOut)
ea60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
ea70: 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49  ( pOp->p5 & SQLI
ea80: 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 29 7b  TE_JUMPIFNULL ){
ea90: 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 70 4f  .        pc = pO
eaa0: 70 2d 3e 70 32 2d 31 3b 0a 20 20 20 20 20 20 7d  p->p2-1;.      }
eab0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
eac0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
ead0: 20 2f 2a 20 4e 65 69 74 68 65 72 20 6f 70 65 72   /* Neither oper
eae0: 61 6e 64 20 69 73 20 4e 55 4c 4c 2e 20 20 44 6f  and is NULL.  Do
eaf0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 2a   a comparison. *
eb00: 2f 0a 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d  /.    affinity =
eb10: 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54   pOp->p5 & SQLIT
eb20: 45 5f 41 46 46 5f 4d 41 53 4b 3b 0a 20 20 20 20  E_AFF_MASK;.    
eb30: 69 66 28 20 61 66 66 69 6e 69 74 79 20 29 7b 0a  if( affinity ){.
eb40: 20 20 20 20 20 20 61 70 70 6c 79 41 66 66 69 6e        applyAffin
eb50: 69 74 79 28 70 49 6e 31 2c 20 61 66 66 69 6e 69  ity(pIn1, affini
eb60: 74 79 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  ty, encoding);. 
eb70: 20 20 20 20 20 61 70 70 6c 79 41 66 66 69 6e 69       applyAffini
eb80: 74 79 28 70 49 6e 33 2c 20 61 66 66 69 6e 69 74  ty(pIn3, affinit
eb90: 79 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  y, encoding);.  
eba0: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
ebb0: 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
ebc0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 0a 20  no_mem;.    }.. 
ebd0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
ebe0: 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53  p4type==P4_COLLS
ebf0: 45 51 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 70 43  EQ || pOp->p4.pC
ec00: 6f 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 45 78  oll==0 );.    Ex
ec10: 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31 29 3b 0a  pandBlob(pIn1);.
ec20: 20 20 20 20 45 78 70 61 6e 64 42 6c 6f 62 28 70      ExpandBlob(p
ec30: 49 6e 33 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  In3);.    res = 
ec40: 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
ec50: 65 28 70 49 6e 33 2c 20 70 49 6e 31 2c 20 70 4f  e(pIn3, pIn1, pO
ec60: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 29 3b 0a 20 20  p->p4.pColl);.  
ec70: 7d 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d  }.  switch( pOp-
ec80: 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 63  >opcode ){.    c
ec90: 61 73 65 20 4f 50 5f 45 71 3a 20 20 20 20 72 65  ase OP_Eq:    re
eca0: 73 20 3d 20 72 65 73 3d 3d 30 3b 20 20 20 20 20  s = res==0;     
ecb0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
ecc0: 4f 50 5f 4e 65 3a 20 20 20 20 72 65 73 20 3d 20  OP_Ne:    res = 
ecd0: 72 65 73 21 3d 30 3b 20 20 20 20 20 62 72 65 61  res!=0;     brea
ece0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 4c  k;.    case OP_L
ecf0: 74 3a 20 20 20 20 72 65 73 20 3d 20 72 65 73 3c  t:    res = res<
ed00: 30 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  0;      break;. 
ed10: 20 20 20 63 61 73 65 20 4f 50 5f 4c 65 3a 20 20     case OP_Le:  
ed20: 20 20 72 65 73 20 3d 20 72 65 73 3c 3d 30 3b 20    res = res<=0; 
ed30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
ed40: 61 73 65 20 4f 50 5f 47 74 3a 20 20 20 20 72 65  ase OP_Gt:    re
ed50: 73 20 3d 20 72 65 73 3e 30 3b 20 20 20 20 20 20  s = res>0;      
ed60: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
ed70: 6c 74 3a 20 20 20 20 20 20 20 72 65 73 20 3d 20  lt:       res = 
ed80: 72 65 73 3e 3d 30 3b 20 20 20 20 20 62 72 65 61  res>=0;     brea
ed90: 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f  k;.  }..  if( pO
eda0: 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53  p->p5 & SQLITE_S
edb0: 54 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 70 4f  TOREP2 ){.    pO
edc0: 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
edd0: 70 32 5d 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75  p2];.    memAbou
ede0: 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75  tToChange(p, pOu
edf0: 74 29 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79  t);.    MemSetTy
ee00: 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d  peFlag(pOut, MEM
ee10: 5f 49 6e 74 29 3b 0a 20 20 20 20 70 4f 75 74 2d  _Int);.    pOut-
ee20: 3e 75 2e 69 20 3d 20 72 65 73 3b 0a 20 20 20 20  >u.i = res;.    
ee30: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
ee40: 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20  Op->p2, pOut);. 
ee50: 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 20 29   }else if( res )
ee60: 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e  {.    pc = pOp->
ee70: 70 32 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  p2-1;.  }..  /* 
ee80: 55 6e 64 6f 20 61 6e 79 20 63 68 61 6e 67 65 73  Undo any changes
ee90: 20 6d 61 64 65 20 62 79 20 61 70 70 6c 79 41 66   made by applyAf
eea0: 66 69 6e 69 74 79 28 29 20 74 6f 20 74 68 65 20  finity() to the 
eeb0: 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 73 2e  input registers.
eec0: 20 2a 2f 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67   */.  pIn1->flag
eed0: 73 20 3d 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  s = (pIn1->flags
eee0: 26 7e 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 20  &~MEM_TypeMask) 
eef0: 7c 20 28 66 6c 61 67 73 31 26 4d 45 4d 5f 54 79  | (flags1&MEM_Ty
ef00: 70 65 4d 61 73 6b 29 3b 0a 20 20 70 49 6e 33 2d  peMask);.  pIn3-
ef10: 3e 66 6c 61 67 73 20 3d 20 28 70 49 6e 33 2d 3e  >flags = (pIn3->
ef20: 66 6c 61 67 73 26 7e 4d 45 4d 5f 54 79 70 65 4d  flags&~MEM_TypeM
ef30: 61 73 6b 29 20 7c 20 28 66 6c 61 67 73 33 26 4d  ask) | (flags3&M
ef40: 45 4d 5f 54 79 70 65 4d 61 73 6b 29 3b 0a 20 20  EM_TypeMask);.  
ef50: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
ef60: 6f 64 65 3a 20 50 65 72 6d 75 74 61 74 69 6f 6e  ode: Permutation
ef70: 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a   * * * P4 *.**.*
ef80: 2a 20 53 65 74 20 74 68 65 20 70 65 72 6d 75 74  * Set the permut
ef90: 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  ation used by th
efa0: 65 20 4f 50 5f 43 6f 6d 70 61 72 65 20 6f 70 65  e OP_Compare ope
efb0: 72 61 74 6f 72 20 74 6f 20 62 65 20 74 68 65 20  rator to be the 
efc0: 61 72 72 61 79 0a 2a 2a 20 6f 66 20 69 6e 74 65  array.** of inte
efd0: 67 65 72 73 20 69 6e 20 50 34 2e 0a 2a 2a 0a 2a  gers in P4..**.*
efe0: 2a 20 54 68 65 20 70 65 72 6d 75 74 61 74 69 6f  * The permutatio
eff0: 6e 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20  n is only valid 
f000: 75 6e 74 69 6c 20 74 68 65 20 6e 65 78 74 20 4f  until the next O
f010: 50 5f 43 6f 6d 70 61 72 65 20 74 68 61 74 20 68  P_Compare that h
f020: 61 73 0a 2a 2a 20 74 68 65 20 4f 50 46 4c 41 47  as.** the OPFLAG
f030: 5f 50 45 52 4d 55 54 45 20 62 69 74 20 73 65 74  _PERMUTE bit set
f040: 20 69 6e 20 50 35 2e 20 54 79 70 69 63 61 6c 6c   in P5. Typicall
f050: 79 20 74 68 65 20 4f 50 5f 50 65 72 6d 75 74 61  y the OP_Permuta
f060: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 0a 2a 2a 20  tion should .** 
f070: 6f 63 63 75 72 20 69 6d 6d 65 64 69 61 74 65 6c  occur immediatel
f080: 79 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 4f  y prior to the O
f090: 50 5f 43 6f 6d 70 61 72 65 2e 0a 2a 2f 0a 63 61  P_Compare..*/.ca
f0a0: 73 65 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f  se OP_Permutatio
f0b0: 6e 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70  n: {.  assert( p
f0c0: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49  Op->p4type==P4_I
f0d0: 4e 54 41 52 52 41 59 20 29 3b 0a 20 20 61 73 73  NTARRAY );.  ass
f0e0: 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 61 69 20  ert( pOp->p4.ai 
f0f0: 29 3b 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20  );.  aPermute = 
f100: 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 62 72  pOp->p4.ai;.  br
f110: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
f120: 65 3a 20 43 6f 6d 70 61 72 65 20 50 31 20 50 32  e: Compare P1 P2
f130: 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20   P3 P4 P5.**.** 
f140: 43 6f 6d 70 61 72 65 20 74 77 6f 20 76 65 63 74  Compare two vect
f150: 6f 72 73 20 6f 66 20 72 65 67 69 73 74 65 72 73  ors of registers
f160: 20 69 6e 20 72 65 67 28 50 31 29 2e 2e 72 65 67   in reg(P1)..reg
f170: 28 50 31 2b 50 33 2d 31 29 20 28 63 61 6c 6c 20  (P1+P3-1) (call 
f180: 74 68 69 73 0a 2a 2a 20 76 65 63 74 6f 72 20 22  this.** vector "
f190: 41 22 29 20 61 6e 64 20 69 6e 20 72 65 67 28 50  A") and in reg(P
f1a0: 32 29 2e 2e 72 65 67 28 50 32 2b 50 33 2d 31 29  2)..reg(P2+P3-1)
f1b0: 20 28 22 42 22 29 2e 20 20 53 61 76 65 20 74 68   ("B").  Save th
f1c0: 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 74  e result of.** t
f1d0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 6f  he comparison fo
f1e0: 72 20 75 73 65 20 62 79 20 74 68 65 20 6e 65 78  r use by the nex
f1f0: 74 20 4f 50 5f 4a 75 6d 70 20 69 6e 73 74 72 75  t OP_Jump instru
f200: 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20  ct..**.** If P5 
f210: 68 61 73 20 74 68 65 20 4f 50 46 4c 41 47 5f 50  has the OPFLAG_P
f220: 45 52 4d 55 54 45 20 62 69 74 20 73 65 74 2c 20  ERMUTE bit set, 
f230: 74 68 65 6e 20 74 68 65 20 6f 72 64 65 72 20 6f  then the order o
f240: 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 0a  f comparison is.
f250: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
f260: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
f270: 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 20   OP_Permutation 
f280: 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 74 68  operator.  If th
f290: 65 0a 2a 2a 20 4f 50 46 4c 41 47 5f 50 45 52 4d  e.** OPFLAG_PERM
f2a0: 55 54 45 20 62 69 74 20 69 73 20 63 6c 65 61 72  UTE bit is clear
f2b0: 2c 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20  , then register 
f2c0: 61 72 65 20 63 6f 6d 70 61 72 65 64 20 69 6e 20  are compared in 
f2d0: 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 6f 72  sequential.** or
f2e0: 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  der..**.** P4 is
f2f0: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
f300: 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65  ture that define
f310: 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  s collating sequ
f320: 65 6e 63 65 73 20 61 6e 64 20 73 6f 72 74 0a 2a  ences and sort.*
f330: 2a 20 6f 72 64 65 72 73 20 66 6f 72 20 74 68 65  * orders for the
f340: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
f350: 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 70  e permutation ap
f360: 70 6c 69 65 73 20 74 6f 20 72 65 67 69 73 74 65  plies to registe
f370: 72 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 20 54 68 65  rs.** only.  The
f380: 20 4b 65 79 49 6e 66 6f 20 65 6c 65 6d 65 6e 74   KeyInfo element
f390: 73 20 61 72 65 20 75 73 65 64 20 73 65 71 75 65  s are used seque
f3a0: 6e 74 69 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  ntially..**.** T
f3b0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
f3c0: 20 61 20 73 6f 72 74 20 63 6f 6d 70 61 72 69 73   a sort comparis
f3d0: 6f 6e 2c 20 73 6f 20 4e 55 4c 4c 73 20 63 6f 6d  on, so NULLs com
f3e0: 70 61 72 65 20 65 71 75 61 6c 2c 0a 2a 2a 20 4e  pare equal,.** N
f3f0: 55 4c 4c 73 20 61 72 65 20 6c 65 73 73 20 74 68  ULLs are less th
f400: 61 6e 20 6e 75 6d 62 65 72 73 2c 20 6e 75 6d 62  an numbers, numb
f410: 65 72 73 20 61 72 65 20 6c 65 73 73 20 74 68 61  ers are less tha
f420: 6e 20 73 74 72 69 6e 67 73 2c 0a 2a 2a 20 61 6e  n strings,.** an
f430: 64 20 73 74 72 69 6e 67 73 20 61 72 65 20 6c 65  d strings are le
f440: 73 73 20 74 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a  ss than blobs..*
f450: 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6d 70 61 72  /.case OP_Compar
f460: 65 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  e: {.  int n;.  
f470: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 70 31 3b  int i;.  int p1;
f480: 0a 20 20 69 6e 74 20 70 32 3b 0a 20 20 63 6f 6e  .  int p2;.  con
f490: 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  st KeyInfo *pKey
f4a0: 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Info;.  int idx;
f4b0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
f4c0: 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69  l;    /* Collati
f4d0: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 75  ng sequence to u
f4e0: 73 65 20 6f 6e 20 74 68 69 73 20 74 65 72 6d 20  se on this term 
f4f0: 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20  */.  int bRev;  
f500: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
f510: 66 6f 72 20 44 45 53 43 45 4e 44 49 4e 47 20 73  for DESCENDING s
f520: 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 0a 20 20  ort order */..  
f530: 69 66 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f  if( (pOp->p5 & O
f540: 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3d 3d  PFLAG_PERMUTE)==
f550: 30 20 29 20 61 50 65 72 6d 75 74 65 20 3d 20 30  0 ) aPermute = 0
f560: 3b 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b  ;.  n = pOp->p3;
f570: 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f  .  pKeyInfo = pO
f580: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
f590: 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b    assert( n>0 );
f5a0: 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
f5b0: 6e 66 6f 21 3d 30 20 29 3b 0a 20 20 70 31 20 3d  nfo!=0 );.  p1 =
f5c0: 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d   pOp->p1;.  p2 =
f5d0: 20 70 4f 70 2d 3e 70 32 3b 0a 23 69 66 20 53 51   pOp->p2;.#if SQ
f5e0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
f5f0: 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20   aPermute ){.   
f600: 20 69 6e 74 20 6b 2c 20 6d 78 20 3d 20 30 3b 0a   int k, mx = 0;.
f610: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
f620: 3b 20 6b 2b 2b 29 20 69 66 28 20 61 50 65 72 6d  ; k++) if( aPerm
f630: 75 74 65 5b 6b 5d 3e 6d 78 20 29 20 6d 78 20 3d  ute[k]>mx ) mx =
f640: 20 61 50 65 72 6d 75 74 65 5b 6b 5d 3b 0a 20 20   aPermute[k];.  
f650: 20 20 61 73 73 65 72 74 28 20 70 31 3e 30 20 26    assert( p1>0 &
f660: 26 20 70 31 2b 6d 78 3c 3d 70 2d 3e 6e 4d 65 6d  & p1+mx<=p->nMem
f670: 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +1 );.    assert
f680: 28 20 70 32 3e 30 20 26 26 20 70 32 2b 6d 78 3c  ( p2>0 && p2+mx<
f690: 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 20 20  =p->nMem+1 );.  
f6a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
f6b0: 74 28 20 70 31 3e 30 20 26 26 20 70 31 2b 6e 3c  t( p1>0 && p1+n<
f6c0: 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 20 20  =p->nMem+1 );.  
f6d0: 20 20 61 73 73 65 72 74 28 20 70 32 3e 30 20 26    assert( p2>0 &
f6e0: 26 20 70 32 2b 6e 3c 3d 70 2d 3e 6e 4d 65 6d 2b  & p2+n<=p->nMem+
f6f0: 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  1 );.  }.#endif 
f700: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
f710: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
f720: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 64 78  n; i++){.    idx
f730: 20 3d 20 61 50 65 72 6d 75 74 65 20 3f 20 61 50   = aPermute ? aP
f740: 65 72 6d 75 74 65 5b 69 5d 20 3a 20 69 3b 0a 20  ermute[i] : i;. 
f750: 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
f760: 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 31 2b 69  Valid(&aMem[p1+i
f770: 64 78 5d 29 20 29 3b 0a 20 20 20 20 61 73 73 65  dx]) );.    asse
f780: 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26  rt( memIsValid(&
f790: 61 4d 65 6d 5b 70 32 2b 69 64 78 5d 29 20 29 3b  aMem[p2+idx]) );
f7a0: 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52  .    REGISTER_TR
f7b0: 41 43 45 28 70 31 2b 69 64 78 2c 20 26 61 4d 65  ACE(p1+idx, &aMe
f7c0: 6d 5b 70 31 2b 69 64 78 5d 29 3b 0a 20 20 20 20  m[p1+idx]);.    
f7d0: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
f7e0: 32 2b 69 64 78 2c 20 26 61 4d 65 6d 5b 70 32 2b  2+idx, &aMem[p2+
f7f0: 69 64 78 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  idx]);.    asser
f800: 74 28 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  t( i<pKeyInfo->n
f810: 46 69 65 6c 64 20 29 3b 0a 20 20 20 20 70 43 6f  Field );.    pCo
f820: 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ll = pKeyInfo->a
f830: 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 62 52 65  Coll[i];.    bRe
f840: 76 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  v = pKeyInfo->aS
f850: 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20  ortOrder[i];.   
f860: 20 69 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69   iCompare = sqli
f870: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 61  te3MemCompare(&a
f880: 4d 65 6d 5b 70 31 2b 69 64 78 5d 2c 20 26 61 4d  Mem[p1+idx], &aM
f890: 65 6d 5b 70 32 2b 69 64 78 5d 2c 20 70 43 6f 6c  em[p2+idx], pCol
f8a0: 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6d  l);.    if( iCom
f8b0: 70 61 72 65 20 29 7b 0a 20 20 20 20 20 20 69 66  pare ){.      if
f8c0: 28 20 62 52 65 76 20 29 20 69 43 6f 6d 70 61 72  ( bRev ) iCompar
f8d0: 65 20 3d 20 2d 69 43 6f 6d 70 61 72 65 3b 0a 20  e = -iCompare;. 
f8e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f8f0: 7d 0a 20 20 7d 0a 20 20 61 50 65 72 6d 75 74 65  }.  }.  aPermute
f900: 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d   = 0;.  break;.}
f910: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4a 75 6d  ../* Opcode: Jum
f920: 70 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  p P1 P2 P3 * *.*
f930: 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65  *.** Jump to the
f940: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20   instruction at 
f950: 61 64 64 72 65 73 73 20 50 31 2c 20 50 32 2c 20  address P1, P2, 
f960: 6f 72 20 50 33 20 64 65 70 65 6e 64 69 6e 67 20  or P3 depending 
f970: 6f 6e 20 77 68 65 74 68 65 72 0a 2a 2a 20 69 6e  on whether.** in
f980: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
f990: 20 4f 50 5f 43 6f 6d 70 61 72 65 20 69 6e 73 74   OP_Compare inst
f9a0: 72 75 63 74 69 6f 6e 20 74 68 65 20 50 31 20 76  ruction the P1 v
f9b0: 65 63 74 6f 72 20 77 61 73 20 6c 65 73 73 20 74  ector was less t
f9c0: 68 61 6e 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c  han.** equal to,
f9d0: 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
f9e0: 20 74 68 65 20 50 32 20 76 65 63 74 6f 72 2c 20   the P2 vector, 
f9f0: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2f  respectively..*/
fa00: 0a 63 61 73 65 20 4f 50 5f 4a 75 6d 70 3a 20 7b  .case OP_Jump: {
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fa20: 6a 75 6d 70 20 2a 2f 0a 20 20 69 66 28 20 69 43  jump */.  if( iC
fa30: 6f 6d 70 61 72 65 3c 30 20 29 7b 0a 20 20 20 20  ompare<0 ){.    
fa40: 70 63 20 3d 20 70 4f 70 2d 3e 70 31 20 2d 20 31  pc = pOp->p1 - 1
fa50: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43  ;.  }else if( iC
fa60: 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20  ompare==0 ){.   
fa70: 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
fa80: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
fa90: 70 63 20 3d 20 70 4f 70 2d 3e 70 33 20 2d 20 31  pc = pOp->p3 - 1
faa0: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
fab0: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 6e 64  ../* Opcode: And
fac0: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
fad0: 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 6c 6f 67  .** Take the log
fae0: 69 63 61 6c 20 41 4e 44 20 6f 66 20 74 68 65 20  ical AND of the 
faf0: 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74  values in regist
fb00: 65 72 73 20 50 31 20 61 6e 64 20 50 32 20 61 6e  ers P1 and P2 an
fb10: 64 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 72  d.** write the r
fb20: 65 73 75 6c 74 20 69 6e 74 6f 20 72 65 67 69 73  esult into regis
fb30: 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66  ter P3..**.** If
fb40: 20 65 69 74 68 65 72 20 50 31 20 6f 72 20 50 32   either P1 or P2
fb50: 20 69 73 20 30 20 28 66 61 6c 73 65 29 20 74 68   is 0 (false) th
fb60: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
fb70: 20 30 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68   0 even if.** th
fb80: 65 20 6f 74 68 65 72 20 69 6e 70 75 74 20 69 73  e other input is
fb90: 20 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c 20 61   NULL.  A NULL a
fba0: 6e 64 20 74 72 75 65 20 6f 72 20 74 77 6f 20 4e  nd true or two N
fbb0: 55 4c 4c 73 20 67 69 76 65 0a 2a 2a 20 61 20 4e  ULLs give.** a N
fbc0: 55 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 2f  ULL output..*/./
fbd0: 2a 20 4f 70 63 6f 64 65 3a 20 4f 72 20 50 31 20  * Opcode: Or P1 
fbe0: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
fbf0: 54 61 6b 65 20 74 68 65 20 6c 6f 67 69 63 61 6c  Take the logical
fc00: 20 4f 52 20 6f 66 20 74 68 65 20 76 61 6c 75 65   OR of the value
fc10: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  s in register P1
fc20: 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73   and P2 and.** s
fc30: 74 6f 72 65 20 74 68 65 20 61 6e 73 77 65 72 20  tore the answer 
fc40: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
fc50: 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
fc60: 50 31 20 6f 72 20 50 32 20 69 73 20 6e 6f 6e 7a  P1 or P2 is nonz
fc70: 65 72 6f 20 28 74 72 75 65 29 20 74 68 65 6e 20  ero (true) then 
fc80: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 31 20  the result is 1 
fc90: 28 74 72 75 65 29 0a 2a 2a 20 65 76 65 6e 20 69  (true).** even i
fca0: 66 20 74 68 65 20 6f 74 68 65 72 20 69 6e 70 75  f the other inpu
fcb0: 74 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20 4e 55  t is NULL.  A NU
fcc0: 4c 4c 20 61 6e 64 20 66 61 6c 73 65 20 6f 72 20  LL and false or 
fcd0: 74 77 6f 20 4e 55 4c 4c 73 0a 2a 2a 20 67 69 76  two NULLs.** giv
fce0: 65 20 61 20 4e 55 4c 4c 20 6f 75 74 70 75 74 2e  e a NULL output.
fcf0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 6e 64 3a  .*/.case OP_And:
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fd10: 20 73 61 6d 65 20 61 73 20 54 4b 5f 41 4e 44 2c   same as TK_AND,
fd20: 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
fd30: 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 72 3a 20 7b  */.case OP_Or: {
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fd50: 73 61 6d 65 20 61 73 20 54 4b 5f 4f 52 2c 20 69  same as TK_OR, i
fd60: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
fd70: 0a 20 20 69 6e 74 20 76 31 3b 20 20 20 20 2f 2a  .  int v1;    /*
fd80: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 3a 20 20   Left operand:  
fd90: 30 3d 3d 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55  0==FALSE, 1==TRU
fda0: 45 2c 20 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72  E, 2==UNKNOWN or
fdb0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 76   NULL */.  int v
fdc0: 32 3b 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f  2;    /* Right o
fdd0: 70 65 72 61 6e 64 3a 20 30 3d 3d 46 41 4c 53 45  perand: 0==FALSE
fde0: 2c 20 31 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e  , 1==TRUE, 2==UN
fdf0: 4b 4e 4f 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f  KNOWN or NULL */
fe00: 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ..  pIn1 = &aMem
fe10: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28  [pOp->p1];.  if(
fe20: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn1->flags & M
fe30: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 76  EM_Null ){.    v
fe40: 31 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  1 = 2;.  }else{.
fe50: 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33      v1 = sqlite3
fe60: 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e  VdbeIntValue(pIn
fe70: 31 29 21 3d 30 3b 0a 20 20 7d 0a 20 20 70 49 6e  1)!=0;.  }.  pIn
fe80: 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  2 = &aMem[pOp->p
fe90: 32 5d 3b 0a 20 20 69 66 28 20 70 49 6e 32 2d 3e  2];.  if( pIn2->
fea0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
feb0: 20 29 7b 0a 20 20 20 20 76 32 20 3d 20 32 3b 0a   ){.    v2 = 2;.
fec0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 32 20    }else{.    v2 
fed0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74  = sqlite3VdbeInt
fee0: 56 61 6c 75 65 28 70 49 6e 32 29 21 3d 30 3b 0a  Value(pIn2)!=0;.
fef0: 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f    }.  if( pOp->o
ff00: 70 63 6f 64 65 3d 3d 4f 50 5f 41 6e 64 20 29 7b  pcode==OP_And ){
ff10: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
ff20: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
ff30: 61 6e 64 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20  and_logic[] = { 
ff40: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 32  0, 0, 0, 0, 1, 2
ff50: 2c 20 30 2c 20 32 2c 20 32 20 7d 3b 0a 20 20 20  , 0, 2, 2 };.   
ff60: 20 76 31 20 3d 20 61 6e 64 5f 6c 6f 67 69 63 5b   v1 = and_logic[
ff70: 76 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d 65 6c 73  v1*3+v2];.  }els
ff80: 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  e{.    static co
ff90: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
ffa0: 72 20 6f 72 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b  r or_logic[] = {
ffb0: 20 30 2c 20 31 2c 20 32 2c 20 31 2c 20 31 2c 20   0, 1, 2, 1, 1, 
ffc0: 31 2c 20 32 2c 20 31 2c 20 32 20 7d 3b 0a 20 20  1, 2, 1, 2 };.  
ffd0: 20 20 76 31 20 3d 20 6f 72 5f 6c 6f 67 69 63 5b    v1 = or_logic[
ffe0: 76 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d 0a 20 20  v1*3+v2];.  }.  
fff0: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
10000 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 76 31 3d  ->p3];.  if( v1=
10010 3d 32 20 29 7b 0a 20 20 20 20 4d 65 6d 53 65 74  =2 ){.    MemSet
10020 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d  TypeFlag(pOut, M
10030 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73  EM_Null);.  }els
10040 65 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69  e{.    pOut->u.i
10050 20 3d 20 76 31 3b 0a 20 20 20 20 4d 65 6d 53 65   = v1;.    MemSe
10060 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20  tTypeFlag(pOut, 
10070 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 20 20  MEM_Int);.  }.  
10080 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
10090 6f 64 65 3a 20 4e 6f 74 20 50 31 20 50 32 20 2a  ode: Not P1 P2 *
100a0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72   * *.**.** Inter
100b0 70 72 65 74 20 74 68 65 20 76 61 6c 75 65 20 69  pret the value i
100c0 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 61 73  n register P1 as
100d0 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
100e0 2e 20 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20  .  Store the.** 
100f0 62 6f 6f 6c 65 61 6e 20 63 6f 6d 70 6c 65 6d 65  boolean compleme
10100 6e 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  nt in register P
10110 32 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65  2.  If the value
10120 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
10130 69 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65  is .** NULL, the
10140 6e 20 61 20 4e 55 4c 4c 20 69 73 20 73 74 6f 72  n a NULL is stor
10150 65 64 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73  ed in P2..*/.cas
10160 65 20 4f 50 5f 4e 6f 74 3a 20 7b 20 20 20 20 20  e OP_Not: {     
10170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
10180 6d 65 20 61 73 20 54 4b 5f 4e 4f 54 2c 20 69 6e  me as TK_NOT, in
10190 31 2c 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e  1, out2 */.  pIn
101a0 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
101b0 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d  1];.  pOut = &aM
101c0 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69  em[pOp->p2];.  i
101d0 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  f( pIn1->flags &
101e0 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   MEM_Null ){.   
101f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
10200 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20  etNull(pOut);.  
10210 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
10220 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36  e3VdbeMemSetInt6
10230 34 28 70 4f 75 74 2c 20 21 73 71 6c 69 74 65 33  4(pOut, !sqlite3
10240 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e  VdbeIntValue(pIn
10250 31 29 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  1));.  }.  break
10260 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
10270 42 69 74 4e 6f 74 20 50 31 20 50 32 20 2a 20 2a  BitNot P1 P2 * *
10280 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72   *.**.** Interpr
10290 65 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  et the content o
102a0 66 20 72 65 67 69 73 74 65 72 20 50 31 20 61 73  f register P1 as
102b0 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 53 74   an integer.  St
102c0 6f 72 65 20 74 68 65 0a 2a 2a 20 6f 6e 65 73 2d  ore the.** ones-
102d0 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 74 68  complement of th
102e0 65 20 50 31 20 76 61 6c 75 65 20 69 6e 74 6f 20  e P1 value into 
102f0 72 65 67 69 73 74 65 72 20 50 32 2e 20 20 49 66  register P2.  If
10300 20 50 31 20 68 6f 6c 64 73 0a 2a 2a 20 61 20 4e   P1 holds.** a N
10310 55 4c 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 61  ULL then store a
10320 20 4e 55 4c 4c 20 69 6e 20 50 32 2e 0a 2a 2f 0a   NULL in P2..*/.
10330 63 61 73 65 20 4f 50 5f 42 69 74 4e 6f 74 3a 20  case OP_BitNot: 
10340 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {             /*
10350 20 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 4e   same as TK_BITN
10360 4f 54 2c 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f  OT, in1, out2 */
10370 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
10380 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74  pOp->p1];.  pOut
10390 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
103a0 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66  ];.  if( pIn1->f
103b0 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
103c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
103d0 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75  beMemSetNull(pOu
103e0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
103f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
10400 65 74 49 6e 74 36 34 28 70 4f 75 74 2c 20 7e 73  etInt64(pOut, ~s
10410 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c  qlite3VdbeIntVal
10420 75 65 28 70 49 6e 31 29 29 3b 0a 20 20 7d 0a 20  ue(pIn1));.  }. 
10430 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
10440 63 6f 64 65 3a 20 4f 6e 63 65 20 50 31 20 50 32  code: Once P1 P2
10450 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 65   * * *.**.** Che
10460 63 6b 20 69 66 20 4f 50 5f 4f 6e 63 65 20 66 6c  ck if OP_Once fl
10470 61 67 20 50 31 20 69 73 20 73 65 74 2e 20 49 66  ag P1 is set. If
10480 20 73 6f 2c 20 6a 75 6d 70 20 74 6f 20 69 6e 73   so, jump to ins
10490 74 72 75 63 74 69 6f 6e 20 50 32 2e 20 4f 74 68  truction P2. Oth
104a0 65 72 77 69 73 65 2c 0a 2a 2a 20 73 65 74 20 74  erwise,.** set t
104b0 68 65 20 66 6c 61 67 20 61 6e 64 20 66 61 6c 6c  he flag and fall
104c0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
104d0 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
104e0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 6e 63  ..*/.case OP_Onc
104f0 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  e: {            
10500 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73   /* jump */.  as
10510 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3c 70 2d  sert( pOp->p1<p-
10520 3e 6e 4f 6e 63 65 46 6c 61 67 20 29 3b 0a 20 20  >nOnceFlag );.  
10530 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67  if( p->aOnceFlag
10540 5b 70 4f 70 2d 3e 70 31 5d 20 29 7b 0a 20 20 20  [pOp->p1] ){.   
10550 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b   pc = pOp->p2-1;
10560 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
10570 3e 61 4f 6e 63 65 46 6c 61 67 5b 70 4f 70 2d 3e  >aOnceFlag[pOp->
10580 70 31 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 62  p1] = 1;.  }.  b
10590 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
105a0 64 65 3a 20 49 66 20 50 31 20 50 32 20 50 33 20  de: If P1 P2 P3 
105b0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74  * *.**.** Jump t
105c0 6f 20 50 32 20 69 66 20 74 68 65 20 76 61 6c 75  o P2 if the valu
105d0 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
105e0 20 69 73 20 74 72 75 65 2e 20 20 54 68 65 20 76   is true.  The v
105f0 61 6c 75 65 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  alue.** is consi
10600 64 65 72 65 64 20 74 72 75 65 20 69 66 20 69 74  dered true if it
10610 20 69 73 20 6e 75 6d 65 72 69 63 20 61 6e 64 20   is numeric and 
10620 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 74 68  non-zero.  If th
10630 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31  e value.** in P1
10640 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 61   is NULL then ta
10650 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 50  ke the jump if P
10660 33 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  3 is non-zero..*
10670 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 4e  /./* Opcode: IfN
10680 6f 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  ot P1 P2 P3 * *.
10690 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32  **.** Jump to P2
106a0 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e   if the value in
106b0 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20   register P1 is 
106c0 46 61 6c 73 65 2e 20 20 54 68 65 20 76 61 6c 75  False.  The valu
106d0 65 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  e.** is consider
106e0 65 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 68  ed false if it h
106f0 61 73 20 61 20 6e 75 6d 65 72 69 63 20 76 61 6c  as a numeric val
10700 75 65 20 6f 66 20 7a 65 72 6f 2e 20 20 49 66 20  ue of zero.  If 
10710 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20  the value.** in 
10720 50 31 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  P1 is NULL then 
10730 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
10740 20 50 33 20 69 73 20 7a 65 72 6f 2e 0a 2a 2f 0a   P3 is zero..*/.
10750 63 61 73 65 20 4f 50 5f 49 66 3a 20 20 20 20 20  case OP_If:     
10760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
10770 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 63 61 73 65  ump, in1 */.case
10780 20 4f 50 5f 49 66 4e 6f 74 3a 20 7b 20 20 20 20   OP_IfNot: {    
10790 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
107a0 20 69 6e 31 20 2a 2f 0a 20 20 69 6e 74 20 63 3b   in1 */.  int c;
107b0 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
107c0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20  pOp->p1];.  if( 
107d0 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
107e0 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 63 20  M_Null ){.    c 
107f0 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 65 6c  = pOp->p3;.  }el
10800 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
10810 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
10820 50 4f 49 4e 54 0a 20 20 20 20 63 20 3d 20 73 71  POINT.    c = sq
10830 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
10840 65 28 70 49 6e 31 29 21 3d 30 3b 0a 23 65 6c 73  e(pIn1)!=0;.#els
10850 65 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65  e.    c = sqlite
10860 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28 70  3VdbeRealValue(p
10870 49 6e 31 29 21 3d 30 2e 30 3b 0a 23 65 6e 64 69  In1)!=0.0;.#endi
10880 66 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  f.    if( pOp->o
10890 70 63 6f 64 65 3d 3d 4f 50 5f 49 66 4e 6f 74 20  pcode==OP_IfNot 
108a0 29 20 63 20 3d 20 21 63 3b 0a 20 20 7d 0a 20 20  ) c = !c;.  }.  
108b0 69 66 28 20 63 20 29 7b 0a 20 20 20 20 70 63 20  if( c ){.    pc 
108c0 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d  = pOp->p2-1;.  }
108d0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
108e0 4f 70 63 6f 64 65 3a 20 49 73 4e 75 6c 6c 20 50  Opcode: IsNull P
108f0 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
10900 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74   Jump to P2 if t
10910 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
10920 73 74 65 72 20 50 31 20 69 73 20 4e 55 4c 4c 2e  ster P1 is NULL.
10930 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 73 4e 75  .*/.case OP_IsNu
10940 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ll: {           
10950 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 49   /* same as TK_I
10960 53 4e 55 4c 4c 2c 20 6a 75 6d 70 2c 20 69 6e 31  SNULL, jump, in1
10970 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
10980 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69  em[pOp->p1];.  i
10990 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
109a0 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29  & MEM_Null)!=0 )
109b0 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e  {.    pc = pOp->
109c0 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72  p2 - 1;.  }.  br
109d0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
109e0 65 3a 20 4e 6f 74 4e 75 6c 6c 20 50 31 20 50 32  e: NotNull P1 P2
109f0 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d   * * *.**.** Jum
10a00 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 76  p to P2 if the v
10a10 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
10a20 20 50 31 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e   P1 is not NULL.
10a30 20 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f    .*/.case OP_No
10a40 74 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20  tNull: {        
10a50 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
10a60 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 6a 75 6d 70 2c  K_NOTNULL, jump,
10a70 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
10a80 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
10a90 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
10aa0 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d  ags & MEM_Null)=
10ab0 3d 30 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70  =0 ){.    pc = p
10ac0 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a  Op->p2 - 1;.  }.
10ad0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
10ae0 70 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e 20 50 31  pcode: Column P1
10af0 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a   P2 P3 P4 P5.**.
10b00 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
10b10 20 64 61 74 61 20 74 68 61 74 20 63 75 72 73 6f   data that curso
10b20 72 20 50 31 20 70 6f 69 6e 74 73 20 74 6f 20 61  r P1 points to a
10b30 73 20 61 20 73 74 72 75 63 74 75 72 65 20 62 75  s a structure bu
10b40 69 6c 74 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65  ilt using.** the
10b50 20 4d 61 6b 65 52 65 63 6f 72 64 20 69 6e 73 74   MakeRecord inst
10b60 72 75 63 74 69 6f 6e 2e 20 20 28 53 65 65 20 74  ruction.  (See t
10b70 68 65 20 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  he MakeRecord op
10b80 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f  code for additio
10b90 6e 61 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  nal.** informati
10ba0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 6f 72  on about the for
10bb0 6d 61 74 20 6f 66 20 74 68 65 20 64 61 74 61 2e  mat of the data.
10bc0 29 20 20 45 78 74 72 61 63 74 20 74 68 65 20 50  )  Extract the P
10bd0 32 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 66  2-th column.** f
10be0 72 6f 6d 20 74 68 69 73 20 72 65 63 6f 72 64 2e  rom this record.
10bf0 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6c    If there are l
10c00 65 73 73 20 74 68 61 74 20 28 50 32 2b 31 29 20  ess that (P2+1) 
10c10 0a 2a 2a 20 76 61 6c 75 65 73 20 69 6e 20 74 68  .** values in th
10c20 65 20 72 65 63 6f 72 64 2c 20 65 78 74 72 61 63  e record, extrac
10c30 74 20 61 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  t a NULL..**.** 
10c40 54 68 65 20 76 61 6c 75 65 20 65 78 74 72 61 63  The value extrac
10c50 74 65 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ted is stored in
10c60 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
10c70 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d  .** If the colum
10c80 6e 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72  n contains fewer
10c90 20 74 68 61 6e 20 50 32 20 66 69 65 6c 64 73 2c   than P2 fields,
10ca0 20 74 68 65 6e 20 65 78 74 72 61 63 74 20 61 20   then extract a 
10cb0 4e 55 4c 4c 2e 20 20 4f 72 2c 0a 2a 2a 20 69 66  NULL.  Or,.** if
10cc0 20 74 68 65 20 50 34 20 61 72 67 75 6d 65 6e 74   the P4 argument
10cd0 20 69 73 20 61 20 50 34 5f 4d 45 4d 20 75 73 65   is a P4_MEM use
10ce0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
10cf0 65 20 50 34 20 61 72 67 75 6d 65 6e 74 20 61 73  e P4 argument as
10d00 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  .** the result..
10d10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46  **.** If the OPF
10d20 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 20 62  LAG_CLEARCACHE b
10d30 69 74 20 69 73 20 73 65 74 20 6f 6e 20 50 35 20  it is set on P5 
10d40 61 6e 64 20 50 31 20 69 73 20 61 20 70 73 65 75  and P1 is a pseu
10d50 64 6f 2d 74 61 62 6c 65 20 63 75 72 73 6f 72 2c  do-table cursor,
10d60 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61 63  .** then the cac
10d70 68 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  he of the cursor
10d80 20 69 73 20 72 65 73 65 74 20 70 72 69 6f 72 20   is reset prior 
10d90 74 6f 20 65 78 74 72 61 63 74 69 6e 67 20 74 68  to extracting th
10da0 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65  e column..** The
10db0 20 66 69 72 73 74 20 4f 50 5f 43 6f 6c 75 6d 6e   first OP_Column
10dc0 20 61 67 61 69 6e 73 74 20 61 20 70 73 65 75 64   against a pseud
10dd0 6f 2d 74 61 62 6c 65 20 61 66 74 65 72 20 74 68  o-table after th
10de0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
10df0 6f 6e 74 65 6e 74 0a 2a 2a 20 72 65 67 69 73 74  ontent.** regist
10e00 65 72 20 68 61 73 20 63 68 61 6e 67 65 64 20 73  er has changed s
10e10 68 6f 75 6c 64 20 68 61 76 65 20 74 68 69 73 20  hould have this 
10e20 62 69 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49  bit set..**.** I
10e30 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4c 45 4e  f the OPFLAG_LEN
10e40 47 54 48 41 52 47 20 61 6e 64 20 4f 50 46 4c 41  GTHARG and OPFLA
10e50 47 5f 54 59 50 45 4f 46 41 52 47 20 62 69 74 73  G_TYPEOFARG bits
10e60 20 61 72 65 20 73 65 74 20 6f 6e 20 50 35 20 77   are set on P5 w
10e70 68 65 6e 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  hen.** the resul
10e80 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
10e90 74 6f 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  to only be used 
10ea0 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  as the argument 
10eb0 6f 66 20 61 20 6c 65 6e 67 74 68 28 29 0a 2a 2a  of a length().**
10ec0 20 6f 72 20 74 79 70 65 6f 66 28 29 20 66 75 6e   or typeof() fun
10ed0 63 74 69 6f 6e 2c 20 72 65 73 70 65 63 74 69 76  ction, respectiv
10ee0 65 6c 79 2e 20 20 54 68 65 20 6c 6f 61 64 69 6e  ely.  The loadin
10ef0 67 20 6f 66 20 6c 61 72 67 65 20 62 6c 6f 62 73  g of large blobs
10f00 20 63 61 6e 20 62 65 0a 2a 2a 20 73 6b 69 70 70   can be.** skipp
10f10 65 64 20 66 6f 72 20 6c 65 6e 67 74 68 28 29 20  ed for length() 
10f20 61 6e 64 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20  and all content 
10f30 6c 6f 61 64 69 6e 67 20 63 61 6e 20 62 65 20 73  loading can be s
10f40 6b 69 70 70 65 64 20 66 6f 72 20 74 79 70 65 6f  kipped for typeo
10f50 66 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  f()..*/.case OP_
10f60 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 75 33 32 20  Column: {.  u32 
10f70 70 61 79 6c 6f 61 64 53 69 7a 65 3b 20 20 20 2f  payloadSize;   /
10f80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
10f90 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20  s in the record 
10fa0 2a 2f 0a 20 20 69 36 34 20 70 61 79 6c 6f 61 64  */.  i64 payload
10fb0 53 69 7a 65 36 34 3b 20 2f 2a 20 4e 75 6d 62 65  Size64; /* Numbe
10fc0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
10fd0 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  e record */.  in
10fe0 74 20 70 31 3b 20 20 20 20 20 20 20 20 20 20 20  t p1;           
10ff0 20 2f 2a 20 50 31 20 76 61 6c 75 65 20 6f 66 20   /* P1 value of 
11000 74 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  the opcode */.  
11010 69 6e 74 20 70 32 3b 20 20 20 20 20 20 20 20 20  int p2;         
11020 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d     /* column num
11030 62 65 72 20 74 6f 20 72 65 74 72 69 65 76 65 20  ber to retrieve 
11040 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
11050 2a 70 43 3b 20 20 20 20 2f 2a 20 54 68 65 20 56  *pC;    /* The V
11060 44 42 45 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  DBE cursor */.  
11070 63 68 61 72 20 2a 7a 52 65 63 3b 20 20 20 20 20  char *zRec;     
11080 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
11090 20 63 6f 6d 70 6c 65 74 65 20 72 65 63 6f 72 64   complete record
110a0 2d 64 61 74 61 20 2a 2f 0a 20 20 42 74 43 75 72  -data */.  BtCur
110b0 73 6f 72 20 2a 70 43 72 73 72 3b 20 20 20 2f 2a  sor *pCrsr;   /*
110c0 20 54 68 65 20 42 54 72 65 65 20 63 75 72 73 6f   The BTree curso
110d0 72 20 2a 2f 0a 20 20 75 33 32 20 2a 61 54 79 70  r */.  u32 *aTyp
110e0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 61 54 79  e;        /* aTy
110f0 70 65 5b 69 5d 20 68 6f 6c 64 73 20 74 68 65 20  pe[i] holds the 
11100 6e 75 6d 65 72 69 63 20 74 79 70 65 20 6f 66 20  numeric type of 
11110 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20  the i-th column 
11120 2a 2f 0a 20 20 75 33 32 20 2a 61 4f 66 66 73 65  */.  u32 *aOffse
11130 74 3b 20 20 20 20 20 20 2f 2a 20 61 4f 66 66 73  t;      /* aOffs
11140 65 74 5b 69 5d 20 69 73 20 6f 66 66 73 65 74 20  et[i] is offset 
11150 74 6f 20 73 74 61 72 74 20 6f 66 20 64 61 74 61  to start of data
11160 20 66 6f 72 20 69 2d 74 68 20 63 6f 6c 75 6d 6e   for i-th column
11170 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   */.  int nField
11180 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62  ;        /* numb
11190 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
111a0 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
111b0 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  int len;        
111c0 20 20 20 2f 2a 20 54 68 65 20 6c 65 6e 67 74 68     /* The length
111d0 20 6f 66 20 74 68 65 20 73 65 72 69 61 6c 69 7a   of the serializ
111e0 65 64 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ed data for the 
111f0 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
11200 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  i;             /
11210 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
11220 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61 3b  /.  char *zData;
11230 20 20 20 20 20 20 20 2f 2a 20 50 61 72 74 20 6f         /* Part o
11240 66 20 74 68 65 20 72 65 63 6f 72 64 20 62 65 69  f the record bei
11250 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20  ng decoded */.  
11260 4d 65 6d 20 2a 70 44 65 73 74 3b 20 20 20 20 20  Mem *pDest;     
11270 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
11280 72 69 74 65 20 74 68 65 20 65 78 74 72 61 63 74  rite the extract
11290 65 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65  ed value */.  Me
112a0 6d 20 73 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  m sMem;         
112b0 20 2f 2a 20 46 6f 72 20 73 74 6f 72 69 6e 67 20   /* For storing 
112c0 74 68 65 20 72 65 63 6f 72 64 20 62 65 69 6e 67  the record being
112d0 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 75 38   decoded */.  u8
112e0 20 2a 7a 49 64 78 3b 20 20 20 20 20 20 20 20 20   *zIdx;         
112f0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 68   /* Index into h
11300 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a  eader */.  u8 *z
11310 45 6e 64 48 64 72 3b 20 20 20 20 20 20 20 2f 2a  EndHdr;       /*
11320 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73   Pointer to firs
11330 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65  t byte after the
11340 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
11350 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
11360 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74  /* Offset into t
11370 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 33 32  he data */.  u32
11380 20 73 7a 46 69 65 6c 64 3b 20 20 20 20 20 20 20   szField;       
11390 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
113a0 65 73 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  es in the conten
113b0 74 20 6f 66 20 61 20 66 69 65 6c 64 20 2a 2f 0a  t of a field */.
113c0 20 20 69 6e 74 20 73 7a 48 64 72 3b 20 20 20 20    int szHdr;    
113d0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
113e0 74 68 65 20 68 65 61 64 65 72 20 73 69 7a 65 20  the header size 
113f0 66 69 65 6c 64 20 61 74 20 73 74 61 72 74 20 6f  field at start o
11400 66 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  f record */.  in
11410 74 20 61 76 61 69 6c 3b 20 20 20 20 20 20 20 20  t avail;        
11420 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
11430 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
11440 20 64 61 74 61 20 2a 2f 0a 20 20 75 33 32 20 74   data */.  u32 t
11450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11460 20 41 20 74 79 70 65 20 63 6f 64 65 20 66 72 6f   A type code fro
11470 6d 20 74 68 65 20 72 65 63 6f 72 64 20 68 65 61  m the record hea
11480 64 65 72 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52  der */.  Mem *pR
11490 65 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  eg;         /* P
114a0 73 65 75 64 6f 54 61 62 6c 65 20 69 6e 70 75 74  seudoTable input
114b0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 0a 20   register */... 
114c0 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20   p1 = pOp->p1;. 
114d0 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20   p2 = pOp->p2;. 
114e0 20 70 43 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65   pC = 0;.  memse
114f0 74 28 26 73 4d 65 6d 2c 20 30 2c 20 73 69 7a 65  t(&sMem, 0, size
11500 6f 66 28 73 4d 65 6d 29 29 3b 0a 20 20 61 73 73  of(sMem));.  ass
11510 65 72 74 28 20 70 31 3c 70 2d 3e 6e 43 75 72 73  ert( p1<p->nCurs
11520 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  or );.  assert( 
11530 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70  pOp->p3>0 && pOp
11540 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b  ->p3<=p->nMem );
11550 0a 20 20 70 44 65 73 74 20 3d 20 26 61 4d 65 6d  .  pDest = &aMem
11560 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d  [pOp->p3];.  mem
11570 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
11580 20 70 44 65 73 74 29 3b 0a 20 20 7a 52 65 63 20   pDest);.  zRec 
11590 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  = 0;..  /* This 
115a0 62 6c 6f 63 6b 20 73 65 74 73 20 74 68 65 20 76  block sets the v
115b0 61 72 69 61 62 6c 65 20 70 61 79 6c 6f 61 64 53  ariable payloadS
115c0 69 7a 65 20 74 6f 20 62 65 20 74 68 65 20 74 6f  ize to be the to
115d0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  tal number of.  
115e0 2a 2a 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  ** bytes in the 
115f0 72 65 63 6f 72 64 2e 0a 20 20 2a 2a 0a 20 20 2a  record..  **.  *
11600 2a 20 7a 52 65 63 20 69 73 20 73 65 74 20 74 6f  * zRec is set to
11610 20 62 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   be the complete
11620 20 74 65 78 74 20 6f 66 20 74 68 65 20 72 65 63   text of the rec
11630 6f 72 64 20 69 66 20 69 74 20 69 73 20 61 76 61  ord if it is ava
11640 69 6c 61 62 6c 65 2e 0a 20 20 2a 2a 20 54 68 65  ilable..  ** The
11650 20 63 6f 6d 70 6c 65 74 65 20 72 65 63 6f 72 64   complete record
11660 20 74 65 78 74 20 69 73 20 61 6c 77 61 79 73 20   text is always 
11670 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 70 73  available for ps
11680 65 75 64 6f 2d 74 61 62 6c 65 73 0a 20 20 2a 2a  eudo-tables.  **
11690 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
116a0 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 63 75  s stored in a cu
116b0 72 73 6f 72 2c 20 74 68 65 20 63 6f 6d 70 6c 65  rsor, the comple
116c0 74 65 20 72 65 63 6f 72 64 20 74 65 78 74 0a 20  te record text. 
116d0 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 61 76 61   ** might be ava
116e0 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 20 70  ilable in the  p
116f0 43 2d 3e 61 52 6f 77 20 63 61 63 68 65 2e 20 20  C->aRow cache.  
11700 4f 72 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  Or it might not 
11710 62 65 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  be..  ** If the 
11720 64 61 74 61 20 69 73 20 75 6e 61 76 61 69 6c 61  data is unavaila
11730 62 6c 65 2c 20 20 7a 52 65 63 20 69 73 20 73 65  ble,  zRec is se
11740 74 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a  t to NULL..  **.
11750 20 20 2a 2a 20 57 65 20 61 6c 73 6f 20 63 6f 6d    ** We also com
11760 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
11770 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
11780 65 20 72 65 63 6f 72 64 2e 20 20 46 6f 72 20 63  e record.  For c
11790 75 72 73 6f 72 73 2c 0a 20 20 2a 2a 20 74 68 65  ursors,.  ** the
117a0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
117b0 6e 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ns is stored in 
117c0 74 68 65 20 56 64 62 65 43 75 72 73 6f 72 2e 6e  the VdbeCursor.n
117d0 46 69 65 6c 64 20 65 6c 65 6d 65 6e 74 2e 0a 20  Field element.. 
117e0 20 2a 2f 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   */.  pC = p->ap
117f0 43 73 72 5b 70 31 5d 3b 0a 20 20 61 73 73 65 72  Csr[p1];.  asser
11800 74 28 20 70 43 21 3d 30 20 29 3b 0a 23 69 66 6e  t( pC!=0 );.#ifn
11810 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11820 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 61  VIRTUALTABLE.  a
11830 73 73 65 72 74 28 20 70 43 2d 3e 70 56 74 61 62  ssert( pC->pVtab
11840 43 75 72 73 6f 72 3d 3d 30 20 29 3b 0a 23 65 6e  Cursor==0 );.#en
11850 64 69 66 0a 20 20 70 43 72 73 72 20 3d 20 70 43  dif.  pCrsr = pC
11860 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  ->pCursor;.  if(
11870 20 70 43 72 73 72 21 3d 30 20 29 7b 0a 20 20 20   pCrsr!=0 ){.   
11880 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 69   /* The record i
11890 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 42 2d  s stored in a B-
118a0 54 72 65 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  Tree */.    rc =
118b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
118c0 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20  orMoveto(pC);.  
118d0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
118e0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
118f0 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e  or;.    if( pC->
11900 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20  nullRow ){.     
11910 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 30   payloadSize = 0
11920 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
11930 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 3d  pC->cacheStatus=
11940 3d 70 2d 3e 63 61 63 68 65 43 74 72 20 29 7b 0a  =p->cacheCtr ){.
11950 20 20 20 20 20 20 70 61 79 6c 6f 61 64 53 69 7a        payloadSiz
11960 65 20 3d 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53  e = pC->payloadS
11970 69 7a 65 3b 0a 20 20 20 20 20 20 7a 52 65 63 20  ize;.      zRec 
11980 3d 20 28 63 68 61 72 2a 29 70 43 2d 3e 61 52 6f  = (char*)pC->aRo
11990 77 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  w;.    }else if(
119a0 20 70 43 2d 3e 69 73 49 6e 64 65 78 20 29 7b 0a   pC->isIndex ){.
119b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
119c0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
119d0 49 73 56 61 6c 69 64 28 70 43 72 73 72 29 20 29  IsValid(pCrsr) )
119e0 3b 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59  ;.      VVA_ONLY
119f0 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74  (rc =) sqlite3Bt
11a00 72 65 65 4b 65 79 53 69 7a 65 28 70 43 72 73 72  reeKeySize(pCrsr
11a10 2c 20 26 70 61 79 6c 6f 61 64 53 69 7a 65 36 34  , &payloadSize64
11a20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11a30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11a40 3b 20 20 20 2f 2a 20 54 72 75 65 20 62 65 63 61  ;   /* True beca
11a50 75 73 65 20 6f 66 20 43 75 72 73 6f 72 4d 6f 76  use of CursorMov
11a60 65 74 6f 28 29 20 63 61 6c 6c 20 61 62 6f 76 65  eto() call above
11a70 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c   */.      /* sql
11a80 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
11a90 6c 6c 50 74 72 28 29 20 75 73 65 73 20 67 65 74  llPtr() uses get
11aa0 56 61 72 69 6e 74 33 32 28 29 20 74 6f 20 65 78  Varint32() to ex
11ab0 74 72 61 63 74 20 74 68 65 0a 20 20 20 20 20 20  tract the.      
11ac0 2a 2a 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 2c  ** payload size,
11ad0 20 73 6f 20 69 74 20 69 73 20 69 6d 70 6f 73 73   so it is imposs
11ae0 69 62 6c 65 20 66 6f 72 20 70 61 79 6c 6f 61 64  ible for payload
11af0 53 69 7a 65 36 34 20 74 6f 20 62 65 0a 20 20 20  Size64 to be.   
11b00 20 20 20 2a 2a 20 6c 61 72 67 65 72 20 74 68 61     ** larger tha
11b10 6e 20 33 32 20 62 69 74 73 2e 20 2a 2f 0a 20 20  n 32 bits. */.  
11b20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 79      assert( (pay
11b30 6c 6f 61 64 53 69 7a 65 36 34 20 26 20 53 51 4c  loadSize64 & SQL
11b40 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75  ITE_MAX_U32)==(u
11b50 36 34 29 70 61 79 6c 6f 61 64 53 69 7a 65 36 34  64)payloadSize64
11b60 20 29 3b 0a 20 20 20 20 20 20 70 61 79 6c 6f 61   );.      payloa
11b70 64 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 79  dSize = (u32)pay
11b80 6c 6f 61 64 53 69 7a 65 36 34 3b 0a 20 20 20 20  loadSize64;.    
11b90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
11ba0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
11bb0 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
11bc0 43 72 73 72 29 20 29 3b 0a 20 20 20 20 20 20 56  Crsr) );.      V
11bd0 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71  VA_ONLY(rc =) sq
11be0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69  lite3BtreeDataSi
11bf0 7a 65 28 70 43 72 73 72 2c 20 26 70 61 79 6c 6f  ze(pCrsr, &paylo
11c00 61 64 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 61  adSize);.      a
11c10 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
11c20 45 5f 4f 4b 20 29 3b 20 20 20 2f 2a 20 44 61 74  E_OK );   /* Dat
11c30 61 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66  aSize() cannot f
11c40 61 69 6c 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  ail */.    }.  }
11c50 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
11c60 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52  pC->pseudoTableR
11c70 65 67 3e 30 29 20 29 7b 0a 20 20 20 20 70 52 65  eg>0) ){.    pRe
11c80 67 20 3d 20 26 61 4d 65 6d 5b 70 43 2d 3e 70 73  g = &aMem[pC->ps
11c90 65 75 64 6f 54 61 62 6c 65 52 65 67 5d 3b 0a 20  eudoTableReg];. 
11ca0 20 20 20 69 66 28 20 70 43 2d 3e 6d 75 6c 74 69     if( pC->multi
11cb0 50 73 65 75 64 6f 20 29 7b 0a 20 20 20 20 20 20  Pseudo ){.      
11cc0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
11cd0 61 6c 6c 6f 77 43 6f 70 79 28 70 44 65 73 74 2c  allowCopy(pDest,
11ce0 20 70 52 65 67 2b 70 32 2c 20 4d 45 4d 5f 45 70   pReg+p2, MEM_Ep
11cf0 68 65 6d 29 3b 0a 20 20 20 20 20 20 44 65 65 70  hem);.      Deep
11d00 68 65 6d 65 72 61 6c 69 7a 65 28 70 44 65 73 74  hemeralize(pDest
11d10 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  );.      goto op
11d20 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20  _column_out;.   
11d30 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
11d40 52 65 67 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Reg->flags & MEM
11d50 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 61 73 73  _Blob );.    ass
11d60 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
11d70 70 52 65 67 29 20 29 3b 0a 20 20 20 20 70 61 79  pReg) );.    pay
11d80 6c 6f 61 64 53 69 7a 65 20 3d 20 70 52 65 67 2d  loadSize = pReg-
11d90 3e 6e 3b 0a 20 20 20 20 7a 52 65 63 20 3d 20 70  >n;.    zRec = p
11da0 52 65 67 2d 3e 7a 3b 0a 20 20 20 20 70 43 2d 3e  Reg->z;.    pC->
11db0 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 28 70  cacheStatus = (p
11dc0 4f 70 2d 3e 70 35 26 4f 50 46 4c 41 47 5f 43 4c  Op->p5&OPFLAG_CL
11dd0 45 41 52 43 41 43 48 45 29 20 3f 20 43 41 43 48  EARCACHE) ? CACH
11de0 45 5f 53 54 41 4c 45 20 3a 20 70 2d 3e 63 61 63  E_STALE : p->cac
11df0 68 65 43 74 72 3b 0a 20 20 20 20 61 73 73 65 72  heCtr;.    asser
11e00 74 28 20 70 61 79 6c 6f 61 64 53 69 7a 65 3d 3d  t( payloadSize==
11e10 30 20 7c 7c 20 7a 52 65 63 21 3d 30 20 29 3b 0a  0 || zRec!=0 );.
11e20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
11e30 43 6f 6e 73 69 64 65 72 20 74 68 65 20 72 6f 77  Consider the row
11e40 20 74 6f 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20   to be NULL */. 
11e50 20 20 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d     payloadSize =
11e60 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
11e70 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 69 73 20   payloadSize is 
11e80 30 2c 20 74 68 65 6e 20 6a 75 73 74 20 73 74 6f  0, then just sto
11e90 72 65 20 61 20 4e 55 4c 4c 2e 20 20 54 68 69 73  re a NULL.  This
11ea0 20 63 61 6e 20 68 61 70 70 65 6e 20 62 65 63 61   can happen beca
11eb0 75 73 65 20 6f 66 0a 20 20 2a 2a 20 6e 75 6c 6c  use of.  ** null
11ec0 52 6f 77 20 6f 72 20 62 65 63 61 75 73 65 20 6f  Row or because o
11ed0 66 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  f a corrupt data
11ee0 62 61 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  base. */.  if( p
11ef0 61 79 6c 6f 61 64 53 69 7a 65 3d 3d 30 20 29 7b  ayloadSize==0 ){
11f00 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46  .    MemSetTypeF
11f10 6c 61 67 28 70 44 65 73 74 2c 20 4d 45 4d 5f 4e  lag(pDest, MEM_N
11f20 75 6c 6c 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f  ull);.    goto o
11f30 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20  p_column_out;.  
11f40 7d 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  }.  assert( db->
11f50 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
11f60 4d 49 54 5f 4c 45 4e 47 54 48 5d 3e 3d 30 20 29  MIT_LENGTH]>=0 )
11f70 3b 0a 20 20 69 66 28 20 70 61 79 6c 6f 61 64 53  ;.  if( payloadS
11f80 69 7a 65 20 3e 20 28 75 33 32 29 64 62 2d 3e 61  ize > (u32)db->a
11f90 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
11fa0 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
11fb0 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a    goto too_big;.
11fc0 20 20 7d 0a 0a 20 20 6e 46 69 65 6c 64 20 3d 20    }..  nField = 
11fd0 70 43 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 61 73  pC->nField;.  as
11fe0 73 65 72 74 28 20 70 32 3c 6e 46 69 65 6c 64 20  sert( p2<nField 
11ff0 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 61 6e  );..  /* Read an
12000 64 20 70 61 72 73 65 20 74 68 65 20 74 61 62 6c  d parse the tabl
12010 65 20 68 65 61 64 65 72 2e 20 20 53 74 6f 72 65  e header.  Store
12020 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
12030 74 68 65 20 70 61 72 73 65 0a 20 20 2a 2a 20 69  the parse.  ** i
12040 6e 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20 68  nto the record h
12050 65 61 64 65 72 20 63 61 63 68 65 20 66 69 65 6c  eader cache fiel
12060 64 73 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ds of the cursor
12070 2e 0a 20 20 2a 2f 0a 20 20 61 54 79 70 65 20 3d  ..  */.  aType =
12080 20 70 43 2d 3e 61 54 79 70 65 3b 0a 20 20 69 66   pC->aType;.  if
12090 28 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75  ( pC->cacheStatu
120a0 73 3d 3d 70 2d 3e 63 61 63 68 65 43 74 72 20 29  s==p->cacheCtr )
120b0 7b 0a 20 20 20 20 61 4f 66 66 73 65 74 20 3d 20  {.    aOffset = 
120c0 70 43 2d 3e 61 4f 66 66 73 65 74 3b 0a 20 20 7d  pC->aOffset;.  }
120d0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
120e0 28 61 54 79 70 65 29 3b 0a 20 20 20 20 61 76 61  (aType);.    ava
120f0 69 6c 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e  il = 0;.    pC->
12100 61 4f 66 66 73 65 74 20 3d 20 61 4f 66 66 73 65  aOffset = aOffse
12110 74 20 3d 20 26 61 54 79 70 65 5b 6e 46 69 65 6c  t = &aType[nFiel
12120 64 5d 3b 0a 20 20 20 20 70 43 2d 3e 70 61 79 6c  d];.    pC->payl
12130 6f 61 64 53 69 7a 65 20 3d 20 70 61 79 6c 6f 61  oadSize = payloa
12140 64 53 69 7a 65 3b 0a 20 20 20 20 70 43 2d 3e 63  dSize;.    pC->c
12150 61 63 68 65 53 74 61 74 75 73 20 3d 20 70 2d 3e  acheStatus = p->
12160 63 61 63 68 65 43 74 72 3b 0a 0a 20 20 20 20 2f  cacheCtr;..    /
12170 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
12180 20 6d 61 6e 79 20 62 79 74 65 73 20 61 72 65 20   many bytes are 
12190 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  in the header */
121a0 0a 20 20 20 20 69 66 28 20 7a 52 65 63 20 29 7b  .    if( zRec ){
121b0 0a 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 7a  .      zData = z
121c0 52 65 63 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Rec;.    }else{.
121d0 20 20 20 20 20 20 69 66 28 20 70 43 2d 3e 69 73        if( pC->is
121e0 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Index ){.       
121f0 20 7a 44 61 74 61 20 3d 20 28 63 68 61 72 2a 29   zData = (char*)
12200 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46  sqlite3BtreeKeyF
12210 65 74 63 68 28 70 43 72 73 72 2c 20 26 61 76 61  etch(pCrsr, &ava
12220 69 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  il);.      }else
12230 7b 0a 20 20 20 20 20 20 20 20 7a 44 61 74 61 20  {.        zData 
12240 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
12250 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28 70  BtreeDataFetch(p
12260 43 72 73 72 2c 20 26 61 76 61 69 6c 29 3b 0a 20  Crsr, &avail);. 
12270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
12280 49 66 20 4b 65 79 46 65 74 63 68 28 29 2f 44 61  If KeyFetch()/Da
12290 74 61 46 65 74 63 68 28 29 20 6d 61 6e 61 67 65  taFetch() manage
122a0 64 20 74 6f 20 67 65 74 20 74 68 65 20 65 6e 74  d to get the ent
122b0 69 72 65 20 70 61 79 6c 6f 61 64 2c 0a 20 20 20  ire payload,.   
122c0 20 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 70     ** save the p
122d0 61 79 6c 6f 61 64 20 69 6e 20 74 68 65 20 70 43  ayload in the pC
122e0 2d 3e 61 52 6f 77 20 63 61 63 68 65 2e 20 20 54  ->aRow cache.  T
122f0 68 61 74 20 77 69 6c 6c 20 73 61 76 65 20 75 73  hat will save us
12300 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68   from.      ** h
12310 61 76 69 6e 67 20 74 6f 20 6d 61 6b 65 20 61 64  aving to make ad
12320 64 69 74 69 6f 6e 61 6c 20 63 61 6c 6c 73 20 74  ditional calls t
12330 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74  o fetch the cont
12340 65 6e 74 20 70 6f 72 74 69 6f 6e 20 6f 66 0a 20  ent portion of. 
12350 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 63 6f       ** the reco
12360 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rd..      */.   
12370 20 20 20 61 73 73 65 72 74 28 20 61 76 61 69 6c     assert( avail
12380 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
12390 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 3c 3d 20   payloadSize <= 
123a0 28 75 33 32 29 61 76 61 69 6c 20 29 7b 0a 20 20  (u32)avail ){.  
123b0 20 20 20 20 20 20 7a 52 65 63 20 3d 20 7a 44 61        zRec = zDa
123c0 74 61 3b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e  ta;.        pC->
123d0 61 52 6f 77 20 3d 20 28 75 38 2a 29 7a 44 61 74  aRow = (u8*)zDat
123e0 61 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  a;.      }else{.
123f0 20 20 20 20 20 20 20 20 70 43 2d 3e 61 52 6f 77          pC->aRow
12400 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
12410 20 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 66    }.    /* The f
12420 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
12430 69 73 20 74 72 75 65 20 69 6e 20 61 6c 6c 20 63  is true in all c
12440 61 73 65 73 20 65 78 63 65 70 74 20 77 68 65 6e  ases except when
12450 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
12460 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
12470 65 6e 20 63 6f 72 72 75 70 74 65 64 20 65 78 74  en corrupted ext
12480 65 72 6e 61 6c 6c 79 2e 0a 20 20 20 20 2a 2a 20  ernally..    ** 
12490 20 20 20 61 73 73 65 72 74 28 20 7a 52 65 63 21     assert( zRec!
124a0 3d 30 20 7c 7c 20 61 76 61 69 6c 3e 3d 70 61 79  =0 || avail>=pay
124b0 6c 6f 61 64 53 69 7a 65 20 7c 7c 20 61 76 61 69  loadSize || avai
124c0 6c 3e 3d 39 20 29 3b 20 2a 2f 0a 20 20 20 20 73  l>=9 ); */.    s
124d0 7a 48 64 72 20 3d 20 67 65 74 56 61 72 69 6e 74  zHdr = getVarint
124e0 33 32 28 28 75 38 2a 29 7a 44 61 74 61 2c 20 6f  32((u8*)zData, o
124f0 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  ffset);..    /* 
12500 4d 61 6b 65 20 73 75 72 65 20 61 20 63 6f 72 72  Make sure a corr
12510 75 70 74 20 64 61 74 61 62 61 73 65 20 68 61 73  upt database has
12520 20 6e 6f 74 20 67 69 76 65 6e 20 75 73 20 61 6e   not given us an
12530 20 6f 76 65 72 73 69 7a 65 20 68 65 61 64 65 72   oversize header
12540 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
12550 20 6e 6f 77 20 74 6f 20 61 76 6f 69 64 20 61 6e   now to avoid an
12560 20 6f 76 65 72 73 69 7a 65 20 6d 65 6d 6f 72 79   oversize memory
12570 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   allocation..   
12580 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 79 70 65 20   **.    ** Type 
12590 65 6e 74 72 69 65 73 20 63 61 6e 20 62 65 20 62  entries can be b
125a0 65 74 77 65 65 6e 20 31 20 61 6e 64 20 35 20 62  etween 1 and 5 b
125b0 79 74 65 73 20 65 61 63 68 2e 20 20 42 75 74 20  ytes each.  But 
125c0 34 20 61 6e 64 20 35 20 62 79 74 65 0a 20 20 20  4 and 5 byte.   
125d0 20 2a 2a 20 74 79 70 65 73 20 75 73 65 20 73 6f   ** types use so
125e0 20 6d 75 63 68 20 64 61 74 61 20 73 70 61 63 65   much data space
125f0 20 74 68 61 74 20 74 68 65 72 65 20 63 61 6e 20   that there can 
12600 6f 6e 6c 79 20 62 65 20 34 30 39 36 20 61 6e 64  only be 4096 and
12610 20 33 32 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68   32 of.    ** th
12620 65 6d 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  em, respectively
12630 2e 20 20 53 6f 20 74 68 65 20 6d 61 78 69 6d 75  .  So the maximu
12640 6d 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20  m header length 
12650 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 61 0a 20  results from a. 
12660 20 20 20 2a 2a 20 33 2d 62 79 74 65 20 74 79 70     ** 3-byte typ
12670 65 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68  e for each of th
12680 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 33 32 37  e maximum of 327
12690 36 38 20 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 20  68 columns plus 
126a0 74 68 72 65 65 0a 20 20 20 20 2a 2a 20 65 78 74  three.    ** ext
126b0 72 61 20 62 79 74 65 73 20 66 6f 72 20 74 68 65  ra bytes for the
126c0 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20 69   header length i
126d0 74 73 65 6c 66 2e 20 20 33 32 37 36 38 2a 33 20  tself.  32768*3 
126e0 2b 20 33 20 3d 20 39 38 33 30 37 2e 0a 20 20 20  + 3 = 98307..   
126f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73   */.    if( offs
12700 65 74 20 3e 20 39 38 33 30 37 20 29 7b 0a 20 20  et > 98307 ){.  
12710 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12720 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
12730 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75      goto op_colu
12740 6d 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  mn_out;.    }.. 
12750 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 69 6e     /* Compute in
12760 20 6c 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20   len the number 
12770 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
12780 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 61 64   we need to read
12790 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a   in order.    **
127a0 20 74 6f 20 67 65 74 20 6e 46 69 65 6c 64 20 74   to get nField t
127b0 79 70 65 20 76 61 6c 75 65 73 2e 20 20 6f 66 66  ype values.  off
127c0 73 65 74 20 69 73 20 61 6e 20 75 70 70 65 72 20  set is an upper 
127d0 62 6f 75 6e 64 20 6f 6e 20 74 68 69 73 2e 20 20  bound on this.  
127e0 42 75 74 0a 20 20 20 20 2a 2a 20 6e 46 69 65 6c  But.    ** nFiel
127f0 64 20 6d 69 67 68 74 20 62 65 20 73 69 67 6e 69  d might be signi
12800 66 69 63 61 6e 74 6c 79 20 6c 65 73 73 20 74 68  ficantly less th
12810 61 6e 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62  an the true numb
12820 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 20 20  er of columns.  
12830 20 20 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c    ** in the tabl
12840 65 2c 20 61 6e 64 20 69 6e 20 74 68 61 74 20 63  e, and in that c
12850 61 73 65 2c 20 35 2a 6e 46 69 65 6c 64 2b 33 20  ase, 5*nField+3 
12860 6d 69 67 68 74 20 62 65 20 73 6d 61 6c 6c 65 72  might be smaller
12870 20 74 68 61 6e 20 6f 66 66 73 65 74 2e 0a 20 20   than offset..  
12880 20 20 2a 2a 20 57 65 20 77 61 6e 74 20 74 6f 20    ** We want to 
12890 6d 69 6e 69 6d 69 7a 65 20 6c 65 6e 20 69 6e 20  minimize len in 
128a0 6f 72 64 65 72 20 74 6f 20 6c 69 6d 69 74 20 74  order to limit t
128b0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  he size of the m
128c0 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 61 6c 6c  emory.    ** all
128d0 6f 63 61 74 69 6f 6e 2c 20 65 73 70 65 63 69 61  ocation, especia
128e0 6c 6c 79 20 69 66 20 61 20 63 6f 72 72 75 70 74  lly if a corrupt
128f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
12900 61 73 20 63 61 75 73 65 64 20 6f 66 66 73 65 74  as caused offset
12910 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 6f 76  .    ** to be ov
12920 65 72 73 69 7a 65 64 2e 20 4f 66 66 73 65 74 20  ersized. Offset 
12930 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20 39 38  is limited to 98
12940 33 30 37 20 61 62 6f 76 65 2e 20 20 42 75 74 20  307 above.  But 
12950 39 38 33 30 37 20 6d 69 67 68 74 0a 20 20 20 20  98307 might.    
12960 2a 2a 20 73 74 69 6c 6c 20 65 78 63 65 65 64 20  ** still exceed 
12970 52 6f 62 73 6f 6e 20 6d 65 6d 6f 72 79 20 61 6c  Robson memory al
12980 6c 6f 63 61 74 69 6f 6e 20 6c 69 6d 69 74 73 20  location limits 
12990 6f 6e 20 73 6f 6d 65 20 63 6f 6e 66 69 67 75 72  on some configur
129a0 61 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 4f  ations..    ** O
129b0 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 63  n systems that c
129c0 61 6e 6e 6f 74 20 74 6f 6c 65 72 61 74 65 20 6c  annot tolerate l
129d0 61 72 67 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  arge memory allo
129e0 63 61 74 69 6f 6e 73 2c 20 6e 46 69 65 6c 64 2a  cations, nField*
129f0 35 2b 33 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  5+3.    ** will 
12a00 6c 69 6b 65 6c 79 20 62 65 20 6d 75 63 68 20 73  likely be much s
12a10 6d 61 6c 6c 65 72 20 73 69 6e 63 65 20 6e 46 69  maller since nFi
12a20 65 6c 64 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  eld will likely 
12a30 62 65 20 6c 65 73 73 20 74 68 61 6e 0a 20 20 20  be less than.   
12a40 20 2a 2a 20 32 30 20 6f 72 20 73 6f 2e 20 20 54   ** 20 or so.  T
12a50 68 69 73 20 69 6e 73 75 72 65 73 20 74 68 61 74  his insures that
12a60 20 52 6f 62 73 6f 6e 20 6d 65 6d 6f 72 79 20 61   Robson memory a
12a70 6c 6c 6f 63 61 74 69 6f 6e 20 6c 69 6d 69 74 73  llocation limits
12a80 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   are.    ** not 
12a90 65 78 63 65 65 64 65 64 20 65 76 65 6e 20 66 6f  exceeded even fo
12aa0 72 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  r corrupt databa
12ab0 73 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f  se files..    */
12ac0 0a 20 20 20 20 6c 65 6e 20 3d 20 6e 46 69 65 6c  .    len = nFiel
12ad0 64 2a 35 20 2b 20 33 3b 0a 20 20 20 20 69 66 28  d*5 + 3;.    if(
12ae0 20 6c 65 6e 20 3e 20 28 69 6e 74 29 6f 66 66 73   len > (int)offs
12af0 65 74 20 29 20 6c 65 6e 20 3d 20 28 69 6e 74 29  et ) len = (int)
12b00 6f 66 66 73 65 74 3b 0a 0a 20 20 20 20 2f 2a 20  offset;..    /* 
12b10 54 68 65 20 4b 65 79 46 65 74 63 68 28 29 20 6f  The KeyFetch() o
12b20 72 20 44 61 74 61 46 65 74 63 68 28 29 20 61 62  r DataFetch() ab
12b30 6f 76 65 20 61 72 65 20 66 61 73 74 20 61 6e 64  ove are fast and
12b40 20 77 69 6c 6c 20 67 65 74 20 74 68 65 20 65 6e   will get the en
12b50 74 69 72 65 0a 20 20 20 20 2a 2a 20 72 65 63 6f  tire.    ** reco
12b60 72 64 20 68 65 61 64 65 72 20 69 6e 20 6d 6f 73  rd header in mos
12b70 74 20 63 61 73 65 73 2e 20 20 42 75 74 20 74 68  t cases.  But th
12b80 65 79 20 77 69 6c 6c 20 66 61 69 6c 20 74 6f 20  ey will fail to 
12b90 67 65 74 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  get the complete
12ba0 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 20 68  .    ** record h
12bb0 65 61 64 65 72 20 69 66 20 74 68 65 20 72 65 63  eader if the rec
12bc0 6f 72 64 20 68 65 61 64 65 72 20 64 6f 65 73 20  ord header does 
12bd0 6e 6f 74 20 66 69 74 20 6f 6e 20 61 20 73 69 6e  not fit on a sin
12be0 67 6c 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  gle page.    ** 
12bf0 69 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 20  in the B-Tree.  
12c00 57 68 65 6e 20 74 68 61 74 20 68 61 70 70 65 6e  When that happen
12c10 73 2c 20 75 73 65 20 73 71 6c 69 74 65 33 56 64  s, use sqlite3Vd
12c20 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 29  beMemFromBtree()
12c30 20 74 6f 0a 20 20 20 20 2a 2a 20 61 63 71 75 69   to.    ** acqui
12c40 72 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  re the complete 
12c50 68 65 61 64 65 72 20 74 65 78 74 2e 0a 20 20 20  header text..   
12c60 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 7a 52 65   */.    if( !zRe
12c70 63 20 26 26 20 61 76 61 69 6c 3c 6c 65 6e 20 29  c && avail<len )
12c80 7b 0a 20 20 20 20 20 20 73 4d 65 6d 2e 66 6c 61  {.      sMem.fla
12c90 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 4d  gs = 0;.      sM
12ca0 65 6d 2e 64 62 20 3d 20 30 3b 0a 20 20 20 20 20  em.db = 0;.     
12cb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
12cc0 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
12cd0 72 73 72 2c 20 30 2c 20 6c 65 6e 2c 20 70 43 2d  rsr, 0, len, pC-
12ce0 3e 69 73 49 6e 64 65 78 2c 20 26 73 4d 65 6d 29  >isIndex, &sMem)
12cf0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
12d00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12d10 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c       goto op_col
12d20 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  umn_out;.      }
12d30 0a 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 73  .      zData = s
12d40 4d 65 6d 2e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  Mem.z;.    }.   
12d50 20 7a 45 6e 64 48 64 72 20 3d 20 28 75 38 20 2a   zEndHdr = (u8 *
12d60 29 26 7a 44 61 74 61 5b 6c 65 6e 5d 3b 0a 20 20  )&zData[len];.  
12d70 20 20 7a 49 64 78 20 3d 20 28 75 38 20 2a 29 26    zIdx = (u8 *)&
12d80 7a 44 61 74 61 5b 73 7a 48 64 72 5d 3b 0a 0a 20  zData[szHdr];.. 
12d90 20 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 68     /* Scan the h
12da0 65 61 64 65 72 20 61 6e 64 20 75 73 65 20 69 74  eader and use it
12db0 20 74 6f 20 66 69 6c 6c 20 69 6e 20 74 68 65 20   to fill in the 
12dc0 61 54 79 70 65 5b 5d 20 61 6e 64 20 61 4f 66 66  aType[] and aOff
12dd0 73 65 74 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72  set[].    ** arr
12de0 61 79 73 2e 20 20 61 54 79 70 65 5b 69 5d 20 77  ays.  aType[i] w
12df0 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  ill contain the 
12e00 74 79 70 65 20 69 6e 74 65 67 65 72 20 66 6f 72  type integer for
12e10 20 74 68 65 20 69 2d 74 68 0a 20 20 20 20 2a 2a   the i-th.    **
12e20 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 61 4f 66 66   column and aOff
12e30 73 65 74 5b 69 5d 20 77 69 6c 6c 20 63 6f 6e 74  set[i] will cont
12e40 61 69 6e 20 74 68 65 20 6f 66 66 73 65 74 20 66  ain the offset f
12e50 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
12e60 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  g.    ** of the 
12e70 72 65 63 6f 72 64 20 74 6f 20 74 68 65 20 73 74  record to the st
12e80 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
12e90 66 6f 72 20 74 68 65 20 69 2d 74 68 20 63 6f 6c  for the i-th col
12ea0 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  umn.    */.    f
12eb0 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64  or(i=0; i<nField
12ec0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
12ed0 28 20 7a 49 64 78 3c 7a 45 6e 64 48 64 72 20 29  ( zIdx<zEndHdr )
12ee0 7b 0a 20 20 20 20 20 20 20 20 61 4f 66 66 73 65  {.        aOffse
12ef0 74 5b 69 5d 20 3d 20 6f 66 66 73 65 74 3b 0a 20  t[i] = offset;. 
12f00 20 20 20 20 20 20 20 69 66 28 20 7a 49 64 78 5b         if( zIdx[
12f10 30 5d 3c 30 78 38 30 20 29 7b 0a 20 20 20 20 20  0]<0x80 ){.     
12f20 20 20 20 20 20 74 20 3d 20 7a 49 64 78 5b 30 5d       t = zIdx[0]
12f30 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 49 64 78  ;.          zIdx
12f40 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
12f50 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 49 64  e{.          zId
12f60 78 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56  x += sqlite3GetV
12f70 61 72 69 6e 74 33 32 28 7a 49 64 78 2c 20 26 74  arint32(zIdx, &t
12f80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
12f90 20 20 20 20 20 61 54 79 70 65 5b 69 5d 20 3d 20       aType[i] = 
12fa0 74 3b 0a 20 20 20 20 20 20 20 20 73 7a 46 69 65  t;.        szFie
12fb0 6c 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ld = sqlite3Vdbe
12fc0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 29  SerialTypeLen(t)
12fd0 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
12fe0 20 2b 3d 20 73 7a 46 69 65 6c 64 3b 0a 20 20 20   += szField;.   
12ff0 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c       if( offset<
13000 73 7a 46 69 65 6c 64 20 29 7b 20 20 2f 2a 20 54  szField ){  /* T
13010 72 75 65 20 69 66 20 6f 66 66 73 65 74 20 6f 76  rue if offset ov
13020 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20  erflows */.     
13030 20 20 20 20 20 7a 49 64 78 20 3d 20 26 7a 45 6e       zIdx = &zEn
13040 64 48 64 72 5b 31 5d 3b 20 20 2f 2a 20 46 6f 72  dHdr[1];  /* For
13050 63 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ces SQLITE_CORRU
13060 50 54 20 72 65 74 75 72 6e 20 62 65 6c 6f 77 20  PT return below 
13070 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  */.          bre
13080 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
13090 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
130a0 20 20 20 2f 2a 20 49 66 20 69 20 69 73 20 6c 65     /* If i is le
130b0 73 73 20 74 68 61 74 20 6e 46 69 65 6c 64 2c 20  ss that nField, 
130c0 74 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 66  then there are f
130d0 65 77 65 72 20 66 69 65 6c 64 73 20 69 6e 20 74  ewer fields in t
130e0 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  his.        ** r
130f0 65 63 6f 72 64 20 74 68 61 6e 20 53 65 74 4e 75  ecord than SetNu
13100 6d 43 6f 6c 75 6d 6e 73 20 69 6e 64 69 63 61 74  mColumns indicat
13110 65 64 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c  ed there are col
13120 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20  umns in the.    
13130 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 53 65      ** table. Se
13140 74 20 74 68 65 20 6f 66 66 73 65 74 20 66 6f 72  t the offset for
13150 20 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d   any extra colum
13160 6e 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  ns not present i
13170 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
13180 20 72 65 63 6f 72 64 20 74 6f 20 30 2e 20 54 68   record to 0. Th
13190 69 73 20 74 65 6c 6c 73 20 63 6f 64 65 20 62 65  is tells code be
131a0 6c 6f 77 20 74 6f 20 73 74 6f 72 65 20 74 68 65  low to store the
131b0 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 0a 20   default value. 
131c0 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68         ** for th
131d0 65 20 63 6f 6c 75 6d 6e 20 69 6e 73 74 65 61 64  e column instead
131e0 20 6f 66 20 64 65 73 65 72 69 61 6c 69 7a 69 6e   of deserializin
131f0 67 20 61 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  g a value from t
13200 68 65 20 72 65 63 6f 72 64 2e 0a 20 20 20 20 20  he record..     
13210 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 4f     */.        aO
13220 66 66 73 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  ffset[i] = 0;.  
13230 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13240 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
13250 6c 65 61 73 65 28 26 73 4d 65 6d 29 3b 0a 20 20  lease(&sMem);.  
13260 20 20 73 4d 65 6d 2e 66 6c 61 67 73 20 3d 20 4d    sMem.flags = M
13270 45 4d 5f 4e 75 6c 6c 3b 0a 0a 20 20 20 20 2f 2a  EM_Null;..    /*
13280 20 49 66 20 77 65 20 68 61 76 65 20 72 65 61 64   If we have read
13290 20 6d 6f 72 65 20 68 65 61 64 65 72 20 64 61 74   more header dat
132a0 61 20 74 68 61 6e 20 77 61 73 20 63 6f 6e 74 61  a than was conta
132b0 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65 61 64  ined in the head
132c0 65 72 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66  er,.    ** or if
132d0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
132e0 6c 61 73 74 20 66 69 65 6c 64 20 61 70 70 65 61  last field appea
132f0 72 73 20 74 6f 20 62 65 20 70 61 73 74 20 74 68  rs to be past th
13300 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  e end of the.   
13310 20 2a 2a 20 72 65 63 6f 72 64 2c 20 6f 72 20 69   ** record, or i
13320 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
13330 20 6c 61 73 74 20 66 69 65 6c 64 20 61 70 70 65   last field appe
13340 61 72 73 20 74 6f 20 62 65 20 62 65 66 6f 72 65  ars to be before
13350 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20   the end.    ** 
13360 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 28 77  of the record (w
13370 68 65 6e 20 61 6c 6c 20 66 69 65 6c 64 73 20 70  hen all fields p
13380 72 65 73 65 6e 74 29 2c 20 74 68 65 6e 20 77 65  resent), then we
13390 20 6d 75 73 74 20 62 65 20 64 65 61 6c 69 6e 67   must be dealing
133a0 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61 20   .    ** with a 
133b0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
133c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
133d0 20 28 7a 49 64 78 20 3e 20 7a 45 6e 64 48 64 72   (zIdx > zEndHdr
133e0 29 20 7c 7c 20 28 6f 66 66 73 65 74 20 3e 20 70  ) || (offset > p
133f0 61 79 6c 6f 61 64 53 69 7a 65 29 0a 20 20 20 20  ayloadSize).    
13400 20 20 20 20 20 7c 7c 20 28 7a 49 64 78 3d 3d 7a       || (zIdx==z
13410 45 6e 64 48 64 72 20 26 26 20 6f 66 66 73 65 74  EndHdr && offset
13420 21 3d 70 61 79 6c 6f 61 64 53 69 7a 65 29 20 29  !=payloadSize) )
13430 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
13440 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
13450 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f  ;.      goto op_
13460 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20 20  column_out;.    
13470 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  }.  }..  /* Get 
13480 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 66 6f 72  the column infor
13490 6d 61 74 69 6f 6e 2e 20 49 66 20 61 4f 66 66 73  mation. If aOffs
134a0 65 74 5b 70 32 5d 20 69 73 20 6e 6f 6e 2d 7a 65  et[p2] is non-ze
134b0 72 6f 2c 20 74 68 65 6e 20 0a 20 20 2a 2a 20 64  ro, then .  ** d
134c0 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 76  eserialize the v
134d0 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 72 65  alue from the re
134e0 63 6f 72 64 2e 20 49 66 20 61 4f 66 66 73 65 74  cord. If aOffset
134f0 5b 70 32 5d 20 69 73 20 7a 65 72 6f 2c 0a 20 20  [p2] is zero,.  
13500 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 61 72  ** then there ar
13510 65 20 6e 6f 74 20 65 6e 6f 75 67 68 20 66 69 65  e not enough fie
13520 6c 64 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72  lds in the recor
13530 64 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  d to satisfy the
13540 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 2e 20 20  .  ** request.  
13550 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65  In this case, se
13560 74 20 74 68 65 20 76 61 6c 75 65 20 4e 55 4c 4c  t the value NULL
13570 20 6f 72 20 74 6f 20 50 34 20 69 66 20 50 34 20   or to P4 if P4 
13580 69 73 0a 20 20 2a 2a 20 61 20 70 6f 69 6e 74 65  is.  ** a pointe
13590 72 20 74 6f 20 61 20 4d 65 6d 20 6f 62 6a 65 63  r to a Mem objec
135a0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 4f  t..  */.  if( aO
135b0 66 66 73 65 74 5b 70 32 5d 20 29 7b 0a 20 20 20  ffset[p2] ){.   
135c0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
135d0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66  ITE_OK );.    if
135e0 28 20 7a 52 65 63 20 29 7b 0a 20 20 20 20 20 20  ( zRec ){.      
135f0 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63  /* This is the c
13600 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
13610 20 74 68 65 20 77 68 6f 6c 65 20 72 6f 77 20 66   the whole row f
13620 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
13630 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 56 64  page */.      Vd
13640 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 44 65  beMemRelease(pDe
13650 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
13660 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
13670 28 75 38 20 2a 29 26 7a 52 65 63 5b 61 4f 66 66  (u8 *)&zRec[aOff
13680 73 65 74 5b 70 32 5d 5d 2c 20 61 54 79 70 65 5b  set[p2]], aType[
13690 70 32 5d 2c 20 70 44 65 73 74 29 3b 0a 20 20 20  p2], pDest);.   
136a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
136b0 20 54 68 69 73 20 62 72 61 6e 63 68 20 68 61 70   This branch hap
136c0 70 65 6e 73 20 6f 6e 6c 79 20 77 68 65 6e 20 74  pens only when t
136d0 68 65 20 72 6f 77 20 6f 76 65 72 66 6c 6f 77 73  he row overflows
136e0 20 6f 6e 74 6f 20 6d 75 6c 74 69 70 6c 65 20 70   onto multiple p
136f0 61 67 65 73 20 2a 2f 0a 20 20 20 20 20 20 74 20  ages */.      t 
13700 3d 20 61 54 79 70 65 5b 70 32 5d 3b 0a 20 20 20  = aType[p2];.   
13710 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 70 35 20     if( (pOp->p5 
13720 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  & (OPFLAG_LENGTH
13730 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f  ARG|OPFLAG_TYPEO
13740 46 41 52 47 29 29 21 3d 30 0a 20 20 20 20 20 20  FARG))!=0.      
13750 20 26 26 20 28 28 74 3e 3d 31 32 20 26 26 20 28   && ((t>=12 && (
13760 74 26 31 29 3d 3d 30 29 20 7c 7c 20 28 70 4f 70  t&1)==0) || (pOp
13770 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 54 59  ->p5 & OPFLAG_TY
13780 50 45 4f 46 41 52 47 29 21 3d 30 29 0a 20 20 20  PEOFARG)!=0).   
13790 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
137a0 20 43 6f 6e 74 65 6e 74 20 69 73 20 69 72 72 65   Content is irre
137b0 6c 65 76 61 6e 74 20 66 6f 72 20 74 68 65 20 74  levant for the t
137c0 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e  ypeof() function
137d0 20 61 6e 64 20 66 6f 72 0a 20 20 20 20 20 20 20   and for.       
137e0 20 2a 2a 20 74 68 65 20 6c 65 6e 67 74 68 28 58   ** the length(X
137f0 29 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 58 20  ) function if X 
13800 69 73 20 61 20 62 6c 6f 62 2e 20 20 53 6f 20 77  is a blob.  So w
13810 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c 6c 20  e might as well 
13820 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  use.        ** b
13830 6f 67 75 73 20 63 6f 6e 74 65 6e 74 20 72 61 74  ogus content rat
13840 68 65 72 20 74 68 61 6e 20 72 65 61 64 69 6e 67  her than reading
13850 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
13860 73 6b 2e 20 20 4e 55 4c 4c 20 77 6f 72 6b 73 0a  sk.  NULL works.
13870 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74          ** for t
13880 65 78 74 20 61 6e 64 20 62 6c 6f 62 20 61 6e 64  ext and blob and
13890 20 77 68 61 74 65 76 65 72 20 69 73 20 69 6e 20   whatever is in 
138a0 74 68 65 20 70 61 79 6c 6f 61 64 53 69 7a 65 36  the payloadSize6
138b0 34 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20  4 variable.     
138c0 20 20 20 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20     ** will work 
138d0 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65  for everything e
138e0 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  lse. */.        
138f0 7a 44 61 74 61 20 3d 20 74 3c 31 32 20 3f 20 28  zData = t<12 ? (
13900 63 68 61 72 2a 29 26 70 61 79 6c 6f 61 64 53 69  char*)&payloadSi
13910 7a 65 36 34 20 3a 20 30 3b 0a 20 20 20 20 20 20  ze64 : 0;.      
13920 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6c  }else{.        l
13930 65 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  en = sqlite3Vdbe
13940 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 29  SerialTypeLen(t)
13950 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13960 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 26 73 4d  3VdbeMemMove(&sM
13970 65 6d 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20  em, pDest);.    
13980 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13990 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
139a0 28 70 43 72 73 72 2c 20 61 4f 66 66 73 65 74 5b  (pCrsr, aOffset[
139b0 70 32 5d 2c 20 6c 65 6e 2c 20 20 70 43 2d 3e 69  p2], len,  pC->i
139c0 73 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 20  sIndex,.        
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 4d               &sM
139f0 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  em);.        if(
13a00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13a10 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
13a20 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a   op_column_out;.
13a30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13a40 20 20 7a 44 61 74 61 20 3d 20 73 4d 65 6d 2e 7a    zData = sMem.z
13a50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13a60 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
13a70 6c 47 65 74 28 28 75 38 2a 29 7a 44 61 74 61 2c  lGet((u8*)zData,
13a80 20 74 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20   t, pDest);.    
13a90 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 65 6e 63  }.    pDest->enc
13aa0 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 7d   = encoding;.  }
13ab0 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 4f  else{.    if( pO
13ac0 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4d 45  p->p4type==P4_ME
13ad0 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  M ){.      sqlit
13ae0 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
13af0 43 6f 70 79 28 70 44 65 73 74 2c 20 70 4f 70 2d  Copy(pDest, pOp-
13b00 3e 70 34 2e 70 4d 65 6d 2c 20 4d 45 4d 5f 53 74  >p4.pMem, MEM_St
13b10 61 74 69 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65  atic);.    }else
13b20 7b 0a 20 20 20 20 20 20 4d 65 6d 53 65 74 54 79  {.      MemSetTy
13b30 70 65 46 6c 61 67 28 70 44 65 73 74 2c 20 4d 45  peFlag(pDest, ME
13b40 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  M_Null);.    }. 
13b50 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 64   }..  /* If we d
13b60 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
13b70 61 74 65 64 20 73 70 61 63 65 20 74 6f 20 68 6f  ated space to ho
13b80 6c 64 20 74 68 65 20 64 61 74 61 20 28 69 6e 20  ld the data (in 
13b90 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  the.  ** sqlite3
13ba0 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
13bb0 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 29 20 74  () call above) t
13bc0 68 65 6e 20 74 72 61 6e 73 66 65 72 20 63 6f 6e  hen transfer con
13bd0 74 72 6f 6c 20 6f 66 20 74 68 61 74 0a 20 20 2a  trol of that.  *
13be0 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  * dynamically al
13bf0 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20 6f 76  located space ov
13c00 65 72 20 74 6f 20 74 68 65 20 70 44 65 73 74 20  er to the pDest 
13c10 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
13c20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 61 20  This prevents a 
13c30 6d 65 6d 6f 72 79 20 63 6f 70 79 2e 0a 20 20 2a  memory copy..  *
13c40 2f 0a 20 20 69 66 28 20 73 4d 65 6d 2e 7a 4d 61  /.  if( sMem.zMa
13c50 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 61 73 73 65  lloc ){.    asse
13c60 72 74 28 20 73 4d 65 6d 2e 7a 3d 3d 73 4d 65 6d  rt( sMem.z==sMem
13c70 2e 7a 4d 61 6c 6c 6f 63 20 29 3b 0a 20 20 20 20  .zMalloc );.    
13c80 61 73 73 65 72 74 28 20 21 28 70 44 65 73 74 2d  assert( !(pDest-
13c90 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e  >flags & MEM_Dyn
13ca0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
13cb0 20 21 28 70 44 65 73 74 2d 3e 66 6c 61 67 73 20   !(pDest->flags 
13cc0 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f  & (MEM_Blob|MEM_
13cd0 53 74 72 29 29 20 7c 7c 20 70 44 65 73 74 2d 3e  Str)) || pDest->
13ce0 7a 3d 3d 73 4d 65 6d 2e 7a 20 29 3b 0a 20 20 20  z==sMem.z );.   
13cf0 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 26 3d   pDest->flags &=
13d00 20 7e 28 4d 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d   ~(MEM_Ephem|MEM
13d10 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 70 44  _Static);.    pD
13d20 65 73 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45  est->flags |= ME
13d30 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 70 44 65 73  M_Term;.    pDes
13d40 74 2d 3e 7a 20 3d 20 73 4d 65 6d 2e 7a 3b 0a 20  t->z = sMem.z;. 
13d50 20 20 20 70 44 65 73 74 2d 3e 7a 4d 61 6c 6c 6f     pDest->zMallo
13d60 63 20 3d 20 73 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63  c = sMem.zMalloc
13d70 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
13d80 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 61 6b 65  lite3VdbeMemMake
13d90 57 72 69 74 65 61 62 6c 65 28 70 44 65 73 74 29  Writeable(pDest)
13da0 3b 0a 0a 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74  ;..op_column_out
13db0 3a 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  :.  UPDATE_MAX_B
13dc0 4c 4f 42 53 49 5a 45 28 70 44 65 73 74 29 3b 0a  LOBSIZE(pDest);.
13dd0 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
13de0 28 70 4f 70 2d 3e 70 33 2c 20 70 44 65 73 74 29  (pOp->p3, pDest)
13df0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
13e00 20 4f 70 63 6f 64 65 3a 20 41 66 66 69 6e 69 74   Opcode: Affinit
13e10 79 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a  y P1 P2 * P4 *.*
13e20 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 66 66 69 6e  *.** Apply affin
13e30 69 74 69 65 73 20 74 6f 20 61 20 72 61 6e 67 65  ities to a range
13e40 20 6f 66 20 50 32 20 72 65 67 69 73 74 65 72 73   of P2 registers
13e50 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 50   starting with P
13e60 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61  1..**.** P4 is a
13e70 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
13e80 50 32 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f  P2 characters lo
13e90 6e 67 2e 20 54 68 65 20 6e 74 68 20 63 68 61 72  ng. The nth char
13ea0 61 63 74 65 72 20 6f 66 20 74 68 65 0a 2a 2a 20  acter of the.** 
13eb0 73 74 72 69 6e 67 20 69 6e 64 69 63 61 74 65 73  string indicates
13ec0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
13ed0 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64  nity that should
13ee0 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
13ef0 20 6e 74 68 0a 2a 2a 20 6d 65 6d 6f 72 79 20 63   nth.** memory c
13f00 65 6c 6c 20 69 6e 20 74 68 65 20 72 61 6e 67 65  ell in the range
13f10 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 66 66  ..*/.case OP_Aff
13f20 69 6e 69 74 79 3a 20 7b 0a 20 20 63 6f 6e 73 74  inity: {.  const
13f30 20 63 68 61 72 20 2a 7a 41 66 66 69 6e 69 74 79   char *zAffinity
13f40 3b 20 20 20 2f 2a 20 54 68 65 20 61 66 66 69 6e  ;   /* The affin
13f50 69 74 79 20 74 6f 20 62 65 20 61 70 70 6c 69 65  ity to be applie
13f60 64 20 2a 2f 0a 20 20 63 68 61 72 20 63 41 66 66  d */.  char cAff
13f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13f80 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 68 61 72  /* A single char
13f90 61 63 74 65 72 20 6f 66 20 61 66 66 69 6e 69 74  acter of affinit
13fa0 79 20 2a 2f 0a 0a 20 20 7a 41 66 66 69 6e 69 74  y */..  zAffinit
13fb0 79 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  y = pOp->p4.z;. 
13fc0 20 61 73 73 65 72 74 28 20 7a 41 66 66 69 6e 69   assert( zAffini
13fd0 74 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ty!=0 );.  asser
13fe0 74 28 20 7a 41 66 66 69 6e 69 74 79 5b 70 4f 70  t( zAffinity[pOp
13ff0 2d 3e 70 32 5d 3d 3d 30 20 29 3b 0a 20 20 70 49  ->p2]==0 );.  pI
14000 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
14010 70 31 5d 3b 0a 20 20 77 68 69 6c 65 28 20 28 63  p1];.  while( (c
14020 41 66 66 20 3d 20 2a 28 7a 41 66 66 69 6e 69 74  Aff = *(zAffinit
14030 79 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  y++))!=0 ){.    
14040 61 73 73 65 72 74 28 20 70 49 6e 31 20 3c 3d 20  assert( pIn1 <= 
14050 26 70 2d 3e 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d  &p->aMem[p->nMem
14060 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ] );.    assert(
14070 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e 31   memIsValid(pIn1
14080 29 20 29 3b 0a 20 20 20 20 45 78 70 61 6e 64 42  ) );.    ExpandB
14090 6c 6f 62 28 70 49 6e 31 29 3b 0a 20 20 20 20 61  lob(pIn1);.    a
140a0 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e  pplyAffinity(pIn
140b0 31 2c 20 63 41 66 66 2c 20 65 6e 63 6f 64 69 6e  1, cAff, encodin
140c0 67 29 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a  g);.    pIn1++;.
140d0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
140e0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 61 6b 65 52  /* Opcode: MakeR
140f0 65 63 6f 72 64 20 50 31 20 50 32 20 50 33 20 50  ecord P1 P2 P3 P
14100 34 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76 65 72  4 *.**.** Conver
14110 74 20 50 32 20 72 65 67 69 73 74 65 72 73 20 62  t P2 registers b
14120 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 50 31  eginning with P1
14130 20 69 6e 74 6f 20 74 68 65 20 5b 72 65 63 6f 72   into the [recor
14140 64 20 66 6f 72 6d 61 74 5d 0a 2a 2a 20 75 73 65  d format].** use
14150 20 61 73 20 61 20 64 61 74 61 20 72 65 63 6f 72   as a data recor
14160 64 20 69 6e 20 61 20 64 61 74 61 62 61 73 65 20  d in a database 
14170 74 61 62 6c 65 20 6f 72 20 61 73 20 61 20 6b 65  table or as a ke
14180 79 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e 64 65 78  y.** in an index
14190 2e 20 20 54 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e  .  The OP_Column
141a0 20 6f 70 63 6f 64 65 20 63 61 6e 20 64 65 63 6f   opcode can deco
141b0 64 65 20 74 68 65 20 72 65 63 6f 72 64 20 6c 61  de the record la
141c0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61  ter..**.** P4 ma
141d0 79 20 62 65 20 61 20 73 74 72 69 6e 67 20 74 68  y be a string th
141e0 61 74 20 69 73 20 50 32 20 63 68 61 72 61 63 74  at is P2 charact
141f0 65 72 73 20 6c 6f 6e 67 2e 20 20 54 68 65 20 6e  ers long.  The n
14200 74 68 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  th character of 
14210 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e  the.** string in
14220 64 69 63 61 74 65 73 20 74 68 65 20 63 6f 6c 75  dicates the colu
14230 6d 6e 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  mn affinity that
14240 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
14250 66 6f 72 20 74 68 65 20 6e 74 68 0a 2a 2a 20 66  for the nth.** f
14260 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65  ield of the inde
14270 78 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  x key..**.** The
14280 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 63 68   mapping from ch
14290 61 72 61 63 74 65 72 20 74 6f 20 61 66 66 69 6e  aracter to affin
142a0 69 74 79 20 69 73 20 67 69 76 65 6e 20 62 79 20  ity is given by 
142b0 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 0a  the SQLITE_AFF_.
142c0 2a 2a 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65  ** macros define
142d0 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  d in sqliteInt.h
142e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73  ..**.** If P4 is
142f0 20 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 20 69   NULL then all i
14300 6e 64 65 78 20 66 69 65 6c 64 73 20 68 61 76 65  ndex fields have
14310 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 4e 4f   the affinity NO
14320 4e 45 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d  NE..*/.case OP_M
14330 61 6b 65 52 65 63 6f 72 64 3a 20 7b 0a 20 20 75  akeRecord: {.  u
14340 38 20 2a 7a 4e 65 77 52 65 63 6f 72 64 3b 20 20  8 *zNewRecord;  
14350 20 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65        /* A buffe
14360 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 64 61  r to hold the da
14370 74 61 20 66 6f 72 20 74 68 65 20 6e 65 77 20 72  ta for the new r
14380 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a  ecord */.  Mem *
14390 70 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  pRec;           
143a0 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 65 63    /* The new rec
143b0 6f 72 64 20 2a 2f 0a 20 20 75 36 34 20 6e 44 61  ord */.  u64 nDa
143c0 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
143d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
143e0 65 73 20 6f 66 20 64 61 74 61 20 73 70 61 63 65  es of data space
143f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 64 72 3b 20   */.  int nHdr; 
14400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14410 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
14420 6f 66 20 68 65 61 64 65 72 20 73 70 61 63 65 20  of header space 
14430 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74 65 3b 20  */.  i64 nByte; 
14440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
14450 61 74 61 20 73 70 61 63 65 20 72 65 71 75 69 72  ata space requir
14460 65 64 20 66 6f 72 20 74 68 69 73 20 72 65 63 6f  ed for this reco
14470 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72  rd */.  int nZer
14480 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  o;             /
14490 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a 65 72 6f  * Number of zero
144a0 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65 6e   bytes at the en
144b0 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  d of the record 
144c0 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 69 6e 74  */.  int nVarint
144d0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
144e0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
144f0 6e 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20  n a varint */.  
14500 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
14510 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 66         /* Type f
14520 69 65 6c 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  ield */.  Mem *p
14530 44 61 74 61 30 3b 20 20 20 20 20 20 20 20 20 20  Data0;          
14540 20 2f 2a 20 46 69 72 73 74 20 66 69 65 6c 64 20   /* First field 
14550 74 6f 20 62 65 20 63 6f 6d 62 69 6e 65 64 20 69  to be combined i
14560 6e 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20 2a  nto the record *
14570 2f 0a 20 20 4d 65 6d 20 2a 70 4c 61 73 74 3b 20  /.  Mem *pLast; 
14580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
14590 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  st field of the 
145a0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
145b0 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20 20  nField;         
145c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
145d0 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 72 65  fields in the re
145e0 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cord */.  char *
145f0 7a 41 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20  zAffinity;      
14600 20 2f 2a 20 54 68 65 20 61 66 66 69 6e 69 74 79   /* The affinity
14610 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20   string for the 
14620 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
14630 66 69 6c 65 5f 66 6f 72 6d 61 74 3b 20 20 20 20  file_format;    
14640 20 20 20 2f 2a 20 46 69 6c 65 20 66 6f 72 6d 61     /* File forma
14650 74 20 74 6f 20 75 73 65 20 66 6f 72 20 65 6e 63  t to use for enc
14660 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  oding */.  int i
14670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14680 20 20 2f 2a 20 53 70 61 63 65 20 75 73 65 64 20    /* Space used 
14690 69 6e 20 7a 4e 65 77 52 65 63 6f 72 64 5b 5d 20  in zNewRecord[] 
146a0 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20  */.  int len;   
146b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
146c0 65 6e 67 74 68 20 6f 66 20 61 20 66 69 65 6c 64  ength of a field
146d0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 73 73 75 6d 69   */..  /* Assumi
146e0 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  ng the record co
146f0 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c  ntains N fields,
14700 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d   the record form
14710 61 74 20 6c 6f 6f 6b 73 0a 20 20 2a 2a 20 6c 69  at looks.  ** li
14720 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
14730 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
14740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a  -----------.  **
14780 20 7c 20 68 64 72 2d 73 69 7a 65 20 7c 20 74 79   | hdr-size | ty
14790 70 65 20 30 20 7c 20 74 79 70 65 20 31 20 7c 20  pe 0 | type 1 | 
147a0 2e 2e 2e 20 7c 20 74 79 70 65 20 4e 2d 31 20 7c  ... | type N-1 |
147b0 20 64 61 74 61 30 20 7c 20 2e 2e 2e 20 7c 20 64   data0 | ... | d
147c0 61 74 61 20 4e 2d 31 20 7c 20 0a 20 20 2a 2a 20  ata N-1 | .  ** 
147d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
147e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
147f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14810 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 0a 20 20  --------.  **.  
14820 2a 2a 20 44 61 74 61 28 30 29 20 69 73 20 74 61  ** Data(0) is ta
14830 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69 73 74 65  ken from registe
14840 72 20 50 31 2e 20 20 44 61 74 61 28 31 29 20 63  r P1.  Data(1) c
14850 6f 6d 65 73 20 66 72 6f 6d 20 72 65 67 69 73 74  omes from regist
14860 65 72 20 50 31 2b 31 0a 20 20 2a 2a 20 61 6e 64  er P1+1.  ** and
14870 20 73 6f 20 66 72 6f 74 68 2e 0a 20 20 2a 2a 0a   so froth..  **.
14880 20 20 2a 2a 20 45 61 63 68 20 74 79 70 65 20 66    ** Each type f
14890 69 65 6c 64 20 69 73 20 61 20 76 61 72 69 6e 74  ield is a varint
148a0 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
148b0 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66  e serial type of
148c0 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 72 72 65   the .  ** corre
148d0 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 20 65 6c  sponding data el
148e0 65 6d 65 6e 74 20 28 73 65 65 20 73 71 6c 69 74  ement (see sqlit
148f0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
14900 28 29 29 2e 20 54 68 65 0a 20 20 2a 2a 20 68 64  ()). The.  ** hd
14910 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  r-size field is 
14920 61 6c 73 6f 20 61 20 76 61 72 69 6e 74 20 77 68  also a varint wh
14930 69 63 68 20 69 73 20 74 68 65 20 6f 66 66 73 65  ich is the offse
14940 74 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  t from the begin
14950 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ning.  ** of the
14960 20 72 65 63 6f 72 64 20 74 6f 20 64 61 74 61 30   record to data0
14970 2e 0a 20 20 2a 2f 0a 20 20 6e 44 61 74 61 20 3d  ..  */.  nData =
14980 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;         /* N
14990 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
149a0 66 20 64 61 74 61 20 73 70 61 63 65 20 2a 2f 0a  f data space */.
149b0 20 20 6e 48 64 72 20 3d 20 30 3b 20 20 20 20 20    nHdr = 0;     
149c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
149d0 66 20 62 79 74 65 73 20 6f 66 20 68 65 61 64 65  f bytes of heade
149e0 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 6e 5a 65  r space */.  nZe
149f0 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ro = 0;         
14a00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a 65 72  /* Number of zer
14a10 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65  o bytes at the e
14a20 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  nd of the record
14a30 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70   */.  nField = p
14a40 4f 70 2d 3e 70 31 3b 0a 20 20 7a 41 66 66 69 6e  Op->p1;.  zAffin
14a50 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  ity = pOp->p4.z;
14a60 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c  .  assert( nFiel
14a70 64 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 3e 30  d>0 && pOp->p2>0
14a80 20 26 26 20 70 4f 70 2d 3e 70 32 2b 6e 46 69 65   && pOp->p2+nFie
14a90 6c 64 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29 3b  ld<=p->nMem+1 );
14aa0 0a 20 20 70 44 61 74 61 30 20 3d 20 26 61 4d 65  .  pData0 = &aMe
14ab0 6d 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 6e 46 69  m[nField];.  nFi
14ac0 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  eld = pOp->p2;. 
14ad0 20 70 4c 61 73 74 20 3d 20 26 70 44 61 74 61 30   pLast = &pData0
14ae0 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a 20 20 66 69  [nField-1];.  fi
14af0 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 70 2d 3e 6d  le_format = p->m
14b00 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61  inWriteFileForma
14b10 74 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66  t;..  /* Identif
14b20 79 20 74 68 65 20 6f 75 74 70 75 74 20 72 65 67  y the output reg
14b30 69 73 74 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  ister */.  asser
14b40 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e  t( pOp->p3<pOp->
14b50 70 31 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70  p1 || pOp->p3>=p
14b60 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 32 20 29  Op->p1+pOp->p2 )
14b70 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  ;.  pOut = &aMem
14b80 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d  [pOp->p3];.  mem
14b90 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
14ba0 20 70 4f 75 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f   pOut);..  /* Lo
14bb0 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  op through the e
14bc0 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 77 69 6c  lements that wil
14bd0 6c 20 6d 61 6b 65 20 75 70 20 74 68 65 20 72 65  l make up the re
14be0 63 6f 72 64 20 74 6f 20 66 69 67 75 72 65 0a 20  cord to figure. 
14bf0 20 2a 2a 20 6f 75 74 20 68 6f 77 20 6d 75 63 68   ** out how much
14c00 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72   space is requir
14c10 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 72  ed for the new r
14c20 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ecord..  */.  fo
14c30 72 28 70 52 65 63 3d 70 44 61 74 61 30 3b 20 70  r(pRec=pData0; p
14c40 52 65 63 3c 3d 70 4c 61 73 74 3b 20 70 52 65 63  Rec<=pLast; pRec
14c50 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
14c60 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 52 65 63   memIsValid(pRec
14c70 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 41 66  ) );.    if( zAf
14c80 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20  finity ){.      
14c90 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52  applyAffinity(pR
14ca0 65 63 2c 20 7a 41 66 66 69 6e 69 74 79 5b 70 52  ec, zAffinity[pR
14cb0 65 63 2d 70 44 61 74 61 30 5d 2c 20 65 6e 63 6f  ec-pData0], enco
14cc0 64 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ding);.    }.   
14cd0 20 69 66 28 20 70 52 65 63 2d 3e 66 6c 61 67 73   if( pRec->flags
14ce0 26 4d 45 4d 5f 5a 65 72 6f 20 26 26 20 70 52 65  &MEM_Zero && pRe
14cf0 63 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  c->n>0 ){.      
14d00 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 45 78  sqlite3VdbeMemEx
14d10 70 61 6e 64 42 6c 6f 62 28 70 52 65 63 29 3b 0a  pandBlob(pRec);.
14d20 20 20 20 20 7d 0a 20 20 20 20 73 65 72 69 61 6c      }.    serial
14d30 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56  _type = sqlite3V
14d40 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 52  dbeSerialType(pR
14d50 65 63 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  ec, file_format)
14d60 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69  ;.    len = sqli
14d70 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
14d80 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
14d90 29 3b 0a 20 20 20 20 6e 44 61 74 61 20 2b 3d 20  );.    nData += 
14da0 6c 65 6e 3b 0a 20 20 20 20 6e 48 64 72 20 2b 3d  len;.    nHdr +=
14db0 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65   sqlite3VarintLe
14dc0 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
14dd0 20 20 20 20 69 66 28 20 70 52 65 63 2d 3e 66 6c      if( pRec->fl
14de0 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
14df0 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20  {.      /* Only 
14e00 70 75 72 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  pure zero-filled
14e10 20 42 4c 4f 42 73 20 63 61 6e 20 62 65 20 69 6e   BLOBs can be in
14e20 70 75 74 20 74 6f 20 74 68 69 73 20 4f 70 63 6f  put to this Opco
14e30 64 65 2e 0a 20 20 20 20 20 20 2a 2a 20 57 65 20  de..      ** We 
14e40 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 62 6c 6f  do not allow blo
14e50 62 73 20 77 69 74 68 20 61 20 70 72 65 66 69 78  bs with a prefix
14e60 20 61 6e 64 20 61 20 7a 65 72 6f 2d 66 69 6c 6c   and a zero-fill
14e70 65 64 20 74 61 69 6c 2e 20 2a 2f 0a 20 20 20 20  ed tail. */.    
14e80 20 20 6e 5a 65 72 6f 20 2b 3d 20 70 52 65 63 2d    nZero += pRec-
14e90 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 65  >u.nZero;.    }e
14ea0 6c 73 65 20 69 66 28 20 6c 65 6e 20 29 7b 0a 20  lse if( len ){. 
14eb0 20 20 20 20 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a       nZero = 0;.
14ec0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14ed0 41 64 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20  Add the initial 
14ee0 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 6e  header varint an
14ef0 64 20 74 6f 74 61 6c 20 74 68 65 20 73 69 7a 65  d total the size
14f00 20 2a 2f 0a 20 20 6e 48 64 72 20 2b 3d 20 6e 56   */.  nHdr += nV
14f10 61 72 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  arint = sqlite3V
14f20 61 72 69 6e 74 4c 65 6e 28 6e 48 64 72 29 3b 0a  arintLen(nHdr);.
14f30 20 20 69 66 28 20 6e 56 61 72 69 6e 74 3c 73 71    if( nVarint<sq
14f40 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 6e  lite3VarintLen(n
14f50 48 64 72 29 20 29 7b 0a 20 20 20 20 6e 48 64 72  Hdr) ){.    nHdr
14f60 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20  ++;.  }.  nByte 
14f70 3d 20 6e 48 64 72 2b 6e 44 61 74 61 2d 6e 5a 65  = nHdr+nData-nZe
14f80 72 6f 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e  ro;.  if( nByte>
14f90 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
14fa0 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20  E_LIMIT_LENGTH] 
14fb0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f  ){.    goto too_
14fc0 62 69 67 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  big;.  }..  /* M
14fd0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 75 74  ake sure the out
14fe0 70 75 74 20 72 65 67 69 73 74 65 72 20 68 61 73  put register has
14ff0 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20   a buffer large 
15000 65 6e 6f 75 67 68 20 74 6f 20 73 74 6f 72 65 20  enough to store 
15010 0a 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 72 65  .  ** the new re
15020 63 6f 72 64 2e 20 54 68 65 20 6f 75 74 70 75 74  cord. The output
15030 20 72 65 67 69 73 74 65 72 20 28 70 4f 70 2d 3e   register (pOp->
15040 70 33 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  p3) is not allow
15050 65 64 20 74 6f 0a 20 20 2a 2a 20 62 65 20 6f 6e  ed to.  ** be on
15060 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 72  e of the input r
15070 65 67 69 73 74 65 72 73 20 28 62 65 63 61 75 73  egisters (becaus
15080 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
15090 63 61 6c 6c 20 74 6f 0a 20 20 2a 2a 20 73 71 6c  call to.  ** sql
150a0 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
150b0 29 20 63 6f 75 6c 64 20 63 6c 6f 62 62 65 72 20  ) could clobber 
150c0 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65  the value before
150d0 20 69 74 20 69 73 20 75 73 65 64 29 2e 0a 20 20   it is used)..  
150e0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
150f0 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4f 75 74  VdbeMemGrow(pOut
15100 2c 20 28 69 6e 74 29 6e 42 79 74 65 2c 20 30 29  , (int)nByte, 0)
15110 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f   ){.    goto no_
15120 6d 65 6d 3b 0a 20 20 7d 0a 20 20 7a 4e 65 77 52  mem;.  }.  zNewR
15130 65 63 6f 72 64 20 3d 20 28 75 38 20 2a 29 70 4f  ecord = (u8 *)pO
15140 75 74 2d 3e 7a 3b 0a 0a 20 20 2f 2a 20 57 72 69  ut->z;..  /* Wri
15150 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  te the record */
15160 0a 20 20 69 20 3d 20 70 75 74 56 61 72 69 6e 74  .  i = putVarint
15170 33 32 28 7a 4e 65 77 52 65 63 6f 72 64 2c 20 6e  32(zNewRecord, n
15180 48 64 72 29 3b 0a 20 20 66 6f 72 28 70 52 65 63  Hdr);.  for(pRec
15190 3d 70 44 61 74 61 30 3b 20 70 52 65 63 3c 3d 70  =pData0; pRec<=p
151a0 4c 61 73 74 3b 20 70 52 65 63 2b 2b 29 7b 0a 20  Last; pRec++){. 
151b0 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
151c0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
151d0 61 6c 54 79 70 65 28 70 52 65 63 2c 20 66 69 6c  alType(pRec, fil
151e0 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 69  e_format);.    i
151f0 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28   += putVarint32(
15200 26 7a 4e 65 77 52 65 63 6f 72 64 5b 69 5d 2c 20  &zNewRecord[i], 
15210 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 20 20 20  serial_type);   
15220 20 20 20 2f 2a 20 73 65 72 69 61 6c 20 74 79 70     /* serial typ
15230 65 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 70  e */.  }.  for(p
15240 52 65 63 3d 70 44 61 74 61 30 3b 20 70 52 65 63  Rec=pData0; pRec
15250 3c 3d 70 4c 61 73 74 3b 20 70 52 65 63 2b 2b 29  <=pLast; pRec++)
15260 7b 20 20 2f 2a 20 73 65 72 69 61 6c 20 64 61 74  {  /* serial dat
15270 61 20 2a 2f 0a 20 20 20 20 69 20 2b 3d 20 73 71  a */.    i += sq
15280 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
15290 75 74 28 26 7a 4e 65 77 52 65 63 6f 72 64 5b 69  ut(&zNewRecord[i
152a0 5d 2c 20 28 69 6e 74 29 28 6e 42 79 74 65 2d 69  ], (int)(nByte-i
152b0 29 2c 20 70 52 65 63 2c 66 69 6c 65 5f 66 6f 72  ), pRec,file_for
152c0 6d 61 74 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  mat);.  }.  asse
152d0 72 74 28 20 69 3d 3d 6e 42 79 74 65 20 29 3b 0a  rt( i==nByte );.
152e0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
152f0 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c  p3>0 && pOp->p3<
15300 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 4f  =p->nMem );.  pO
15310 75 74 2d 3e 6e 20 3d 20 28 69 6e 74 29 6e 42 79  ut->n = (int)nBy
15320 74 65 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67  te;.  pOut->flag
15330 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d  s = MEM_Blob | M
15340 45 4d 5f 44 79 6e 3b 0a 20 20 70 4f 75 74 2d 3e  EM_Dyn;.  pOut->
15350 78 44 65 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20  xDel = 0;.  if( 
15360 6e 5a 65 72 6f 20 29 7b 0a 20 20 20 20 70 4f 75  nZero ){.    pOu
15370 74 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20 6e 5a 65  t->u.nZero = nZe
15380 72 6f 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c  ro;.    pOut->fl
15390 61 67 73 20 7c 3d 20 4d 45 4d 5f 5a 65 72 6f 3b  ags |= MEM_Zero;
153a0 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 65 6e 63  .  }.  pOut->enc
153b0 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 20   = SQLITE_UTF8; 
153c0 20 2f 2a 20 49 6e 20 63 61 73 65 20 74 68 65 20   /* In case the 
153d0 62 6c 6f 62 20 69 73 20 65 76 65 72 20 63 6f 6e  blob is ever con
153e0 76 65 72 74 65 64 20 74 6f 20 74 65 78 74 20 2a  verted to text *
153f0 2f 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41  /.  REGISTER_TRA
15400 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4f 75 74  CE(pOp->p3, pOut
15410 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  );.  UPDATE_MAX_
15420 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a  BLOBSIZE(pOut);.
15430 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
15440 70 63 6f 64 65 3a 20 43 6f 75 6e 74 20 50 31 20  pcode: Count P1 
15450 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53  P2 * * *.**.** S
15460 74 6f 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  tore the number 
15470 6f 66 20 65 6e 74 72 69 65 73 20 28 61 6e 20 69  of entries (an i
15480 6e 74 65 67 65 72 20 76 61 6c 75 65 29 20 69 6e  nteger value) in
15490 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
154a0 64 65 78 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 62  dex .** opened b
154b0 79 20 63 75 72 73 6f 72 20 50 31 20 69 6e 20 72  y cursor P1 in r
154c0 65 67 69 73 74 65 72 20 50 32 0a 2a 2f 0a 23 69  egister P2.*/.#i
154d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
154e0 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 63 61 73  T_BTREECOUNT.cas
154f0 65 20 4f 50 5f 43 6f 75 6e 74 3a 20 7b 20 20 20  e OP_Count: {   
15500 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72        /* out2-pr
15510 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 36  erelease */.  i6
15520 34 20 6e 45 6e 74 72 79 3b 0a 20 20 42 74 43 75  4 nEntry;.  BtCu
15530 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 0a 20 20  rsor *pCrsr;..  
15540 70 43 72 73 72 20 3d 20 70 2d 3e 61 70 43 73 72  pCrsr = p->apCsr
15550 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 70 43 75 72 73  [pOp->p1]->pCurs
15560 6f 72 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  or;.  if( ALWAYS
15570 28 70 43 72 73 72 29 20 29 7b 0a 20 20 20 20 72  (pCrsr) ){.    r
15580 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
15590 43 6f 75 6e 74 28 70 43 72 73 72 2c 20 26 6e 45  Count(pCrsr, &nE
155a0 6e 74 72 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ntry);.  }else{.
155b0 20 20 20 20 6e 45 6e 74 72 79 20 3d 20 30 3b 0a      nEntry = 0;.
155c0 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20    }.  pOut->u.i 
155d0 3d 20 6e 45 6e 74 72 79 3b 0a 20 20 62 72 65 61  = nEntry;.  brea
155e0 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  k;.}.#endif../* 
155f0 4f 70 63 6f 64 65 3a 20 53 61 76 65 70 6f 69 6e  Opcode: Savepoin
15600 74 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  t P1 * * P4 *.**
15610 0a 2a 2a 20 4f 70 65 6e 2c 20 72 65 6c 65 61 73  .** Open, releas
15620 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 74 68  e or rollback th
15630 65 20 73 61 76 65 70 6f 69 6e 74 20 6e 61 6d 65  e savepoint name
15640 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 50  d by parameter P
15650 34 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20  4, depending.** 
15660 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
15670 50 31 2e 20 54 6f 20 6f 70 65 6e 20 61 20 6e 65  P1. To open a ne
15680 77 20 73 61 76 65 70 6f 69 6e 74 2c 20 50 31 3d  w savepoint, P1=
15690 3d 30 2e 20 54 6f 20 72 65 6c 65 61 73 65 20 28  =0. To release (
156a0 63 6f 6d 6d 69 74 29 20 61 6e 0a 2a 2a 20 65 78  commit) an.** ex
156b0 69 73 74 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  isting savepoint
156c0 2c 20 50 31 3d 3d 31 2c 20 6f 72 20 74 6f 20 72  , P1==1, or to r
156d0 6f 6c 6c 62 61 63 6b 20 61 6e 20 65 78 69 73 74  ollback an exist
156e0 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20 50 31  ing savepoint P1
156f0 3d 3d 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ==2..*/.case OP_
15700 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 69  Savepoint: {.  i
15710 6e 74 20 70 31 3b 20 20 20 20 20 20 20 20 20 20  nt p1;          
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15730 2a 20 56 61 6c 75 65 20 6f 66 20 50 31 20 6f 70  * Value of P1 op
15740 65 72 61 6e 64 20 2a 2f 0a 20 20 63 68 61 72 20  erand */.  char 
15750 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
15760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
15770 6d 65 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 20  me of savepoint 
15780 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  */.  int nName;.
15790 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 4e 65    Savepoint *pNe
157a0 77 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  w;.  Savepoint *
157b0 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 53 61  pSavepoint;.  Sa
157c0 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 3b 0a 20  vepoint *pTmp;. 
157d0 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 3b   int iSavepoint;
157e0 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 70 31  .  int ii;..  p1
157f0 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 4e   = pOp->p1;.  zN
15800 61 6d 65 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  ame = pOp->p4.z;
15810 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
15820 61 74 20 74 68 65 20 70 31 20 70 61 72 61 6d 65  at the p1 parame
15830 74 65 72 20 69 73 20 76 61 6c 69 64 2e 20 41 6c  ter is valid. Al
15840 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 72 65  so that if there
15850 20 69 73 20 6e 6f 20 6f 70 65 6e 0a 20 20 2a 2a   is no open.  **
15860 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
15870 65 6e 20 74 68 65 72 65 20 63 61 6e 6e 6f 74 20  en there cannot 
15880 62 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74  be any savepoint
15890 73 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s. .  */.  asser
158a0 74 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e  t( db->pSavepoin
158b0 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  t==0 || db->auto
158c0 43 6f 6d 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61  Commit==0 );.  a
158d0 73 73 65 72 74 28 20 70 31 3d 3d 53 41 56 45 50  ssert( p1==SAVEP
158e0 4f 49 4e 54 5f 42 45 47 49 4e 7c 7c 70 31 3d 3d  OINT_BEGIN||p1==
158f0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
15900 45 7c 7c 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54  E||p1==SAVEPOINT
15910 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61  _ROLLBACK );.  a
15920 73 73 65 72 74 28 20 64 62 2d 3e 70 53 61 76 65  ssert( db->pSave
15930 70 6f 69 6e 74 20 7c 7c 20 64 62 2d 3e 69 73 54  point || db->isT
15940 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f  ransactionSavepo
15950 69 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  int==0 );.  asse
15960 72 74 28 20 63 68 65 63 6b 53 61 76 65 70 6f 69  rt( checkSavepoi
15970 6e 74 43 6f 75 6e 74 28 64 62 29 20 29 3b 0a 20  ntCount(db) );. 
15980 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52   assert( p->bIsR
15990 65 61 64 65 72 20 29 3b 0a 0a 20 20 69 66 28 20  eader );..  if( 
159a0 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45  p1==SAVEPOINT_BE
159b0 47 49 4e 20 29 7b 0a 20 20 20 20 69 66 28 20 64  GIN ){.    if( d
159c0 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 30 20  b->nVdbeWrite>0 
159d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 65  ){.      /* A ne
159e0 77 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 6e  w savepoint cann
159f0 6f 74 20 62 65 20 63 72 65 61 74 65 64 20 69 66  ot be created if
15a00 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
15a10 65 20 77 72 69 74 65 20 0a 20 20 20 20 20 20 2a  e write .      *
15a20 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 28 69 2e  * statements (i.
15a30 65 2e 20 6f 70 65 6e 20 72 65 61 64 2f 77 72 69  e. open read/wri
15a40 74 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  te incremental b
15a50 6c 6f 62 20 68 61 6e 64 6c 65 73 29 2e 0a 20 20  lob handles)..  
15a60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
15a70 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
15a80 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
15a90 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 61 76 65  cannot open save
15aa0 70 6f 69 6e 74 20 2d 20 22 0a 20 20 20 20 20 20  point - ".      
15ab0 20 20 22 53 51 4c 20 73 74 61 74 65 6d 65 6e 74    "SQL statement
15ac0 73 20 69 6e 20 70 72 6f 67 72 65 73 73 22 29 3b  s in progress");
15ad0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
15ae0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c  TE_BUSY;.    }el
15af0 73 65 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20  se{.      nName 
15b00 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
15b10 30 28 7a 4e 61 6d 65 29 3b 0a 0a 23 69 66 6e 64  0(zName);..#ifnd
15b20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
15b30 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
15b40 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69    /* This call i
15b50 73 20 4f 6b 20 65 76 65 6e 20 69 66 20 74 68 69  s Ok even if thi
15b60 73 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  s savepoint is a
15b70 63 74 75 61 6c 6c 79 20 61 20 74 72 61 6e 73 61  ctually a transa
15b80 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 73  ction.      ** s
15b90 61 76 65 70 6f 69 6e 74 20 28 61 6e 64 20 74 68  avepoint (and th
15ba0 65 72 65 66 6f 72 65 20 73 68 6f 75 6c 64 20 6e  erefore should n
15bb0 6f 74 20 70 72 6f 6d 70 74 20 78 53 61 76 65 70  ot prompt xSavep
15bc0 6f 69 6e 74 28 29 29 20 63 61 6c 6c 62 61 63 6b  oint()) callback
15bd0 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  s..      ** If t
15be0 68 69 73 20 69 73 20 61 20 74 72 61 6e 73 61 63  his is a transac
15bf0 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 62  tion savepoint b
15c00 65 69 6e 67 20 6f 70 65 6e 65 64 2c 20 69 74 20  eing opened, it 
15c10 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20  is guaranteed.  
15c20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20      ** that the 
15c30 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72  db->aVTrans[] ar
15c40 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20 20 2a  ray is empty.  *
15c50 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
15c60 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
15c70 30 20 7c 7c 20 64 62 2d 3e 6e 56 54 72 61 6e 73  0 || db->nVTrans
15c80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
15c90 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
15ca0 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
15cb0 4f 49 4e 54 5f 42 45 47 49 4e 2c 0a 20 20 20 20  OINT_BEGIN,.    
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
15ce0 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e  nStatement+db->n
15cf0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
15d00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15d10 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  _OK ) goto abort
15d20 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23  _due_to_error;.#
15d30 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
15d40 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 61 76  Create a new sav
15d50 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65  epoint structure
15d60 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 20  . */.      pNew 
15d70 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
15d80 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
15d90 53 61 76 65 70 6f 69 6e 74 29 2b 6e 4e 61 6d 65  Savepoint)+nName
15da0 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  +1);.      if( p
15db0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 70  New ){.        p
15dc0 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68  New->zName = (ch
15dd0 61 72 20 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  ar *)&pNew[1];. 
15de0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e         memcpy(pN
15df0 65 77 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ew->zName, zName
15e00 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  , nName+1);.    
15e10 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
15e20 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20  here is no open 
15e30 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
15e40 6e 20 6d 61 72 6b 20 74 68 69 73 20 61 73 20 61  n mark this as a
15e50 20 73 70 65 63 69 61 6c 0a 20 20 20 20 20 20 20   special.       
15e60 20 2a 2a 20 22 74 72 61 6e 73 61 63 74 69 6f 6e   ** "transaction
15e70 20 73 61 76 65 70 6f 69 6e 74 22 2e 20 2a 2f 0a   savepoint". */.
15e80 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
15e90 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
15ea0 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
15eb0 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  Commit = 0;.    
15ec0 20 20 20 20 20 20 64 62 2d 3e 69 73 54 72 61 6e        db->isTran
15ed0 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74  sactionSavepoint
15ee0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
15ef0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64  lse{.          d
15f00 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2b 2b 3b  b->nSavepoint++;
15f10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 0a  .        }.    .
15f20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 20          /* Link 
15f30 74 68 65 20 6e 65 77 20 73 61 76 65 70 6f 69 6e  the new savepoin
15f40 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  t into the datab
15f50 61 73 65 20 68 61 6e 64 6c 65 27 73 20 6c 69 73  ase handle's lis
15f60 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  t. */.        pN
15f70 65 77 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e  ew->pNext = db->
15f80 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  pSavepoint;.    
15f90 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69      db->pSavepoi
15fa0 6e 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  nt = pNew;.     
15fb0 20 20 20 70 4e 65 77 2d 3e 6e 44 65 66 65 72 72     pNew->nDeferr
15fc0 65 64 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65  edCons = db->nDe
15fd0 66 65 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20  ferredCons;.    
15fe0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
15ff0 65 7b 0a 20 20 20 20 69 53 61 76 65 70 6f 69 6e  e{.    iSavepoin
16000 74 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46  t = 0;..    /* F
16010 69 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 73 61  ind the named sa
16020 76 65 70 6f 69 6e 74 2e 20 49 66 20 74 68 65 72  vepoint. If ther
16030 65 20 69 73 20 6e 6f 20 73 75 63 68 20 73 61 76  e is no such sav
16040 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 6e 0a  epoint, then an.
16050 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20      ** an error 
16060 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
16070 68 65 20 75 73 65 72 2e 20 20 2a 2f 0a 20 20 20  he user.  */.   
16080 20 66 6f 72 28 0a 20 20 20 20 20 20 70 53 61 76   for(.      pSav
16090 65 70 6f 69 6e 74 20 3d 20 64 62 2d 3e 70 53 61  epoint = db->pSa
160a0 76 65 70 6f 69 6e 74 3b 20 0a 20 20 20 20 20 20  vepoint; .      
160b0 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 73 71  pSavepoint && sq
160c0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 53 61  lite3StrICmp(pSa
160d0 76 65 70 6f 69 6e 74 2d 3e 7a 4e 61 6d 65 2c 20  vepoint->zName, 
160e0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 53  zName);.      pS
160f0 61 76 65 70 6f 69 6e 74 20 3d 20 70 53 61 76 65  avepoint = pSave
16100 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 0a 20 20 20  point->pNext.   
16110 20 29 7b 0a 20 20 20 20 20 20 69 53 61 76 65 70   ){.      iSavep
16120 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  oint++;.    }.  
16130 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e    if( !pSavepoin
16140 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
16150 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
16160 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 6e 6f  zErrMsg, db, "no
16170 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 3a   such savepoint:
16180 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
16190 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
161a0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
161b0 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 57 72   if( db->nVdbeWr
161c0 69 74 65 3e 30 20 26 26 20 70 31 3d 3d 53 41 56  ite>0 && p1==SAV
161d0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29  EPOINT_RELEASE )
161e0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
161f0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
16200 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74   release (commit
16210 29 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 66  ) a savepoint if
16220 20 74 68 65 72 65 20 61 72 65 20 0a 20 20 20 20   there are .    
16230 20 20 2a 2a 20 61 63 74 69 76 65 20 77 72 69 74    ** active writ
16240 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  e statements..  
16250 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
16260 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
16270 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 0a  ->zErrMsg, db, .
16280 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
16290 72 65 6c 65 61 73 65 20 73 61 76 65 70 6f 69 6e  release savepoin
162a0 74 20 2d 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  t - SQL statemen
162b0 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73 22 0a  ts in progress".
162c0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
162d0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
162e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20  .    }else{..   
162f0 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20     /* Determine 
16300 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
16310 68 69 73 20 69 73 20 61 20 74 72 61 6e 73 61 63  his is a transac
16320 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 2e 20  tion savepoint. 
16330 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 2a 2a 20  If so,.      ** 
16340 61 6e 64 20 74 68 69 73 20 69 73 20 61 20 52 45  and this is a RE
16350 4c 45 41 53 45 20 63 6f 6d 6d 61 6e 64 2c 20 74  LEASE command, t
16360 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
16370 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20  transaction .   
16380 20 20 20 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74     ** is committ
16390 65 64 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ed. .      */.  
163a0 20 20 20 20 69 6e 74 20 69 73 54 72 61 6e 73 61      int isTransa
163b0 63 74 69 6f 6e 20 3d 20 70 53 61 76 65 70 6f 69  ction = pSavepoi
163c0 6e 74 2d 3e 70 4e 65 78 74 3d 3d 30 20 26 26 20  nt->pNext==0 && 
163d0 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f  db->isTransactio
163e0 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  nSavepoint;.    
163f0 20 20 69 66 28 20 69 73 54 72 61 6e 73 61 63 74    if( isTransact
16400 69 6f 6e 20 26 26 20 70 31 3d 3d 53 41 56 45 50  ion && p1==SAVEP
16410 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a  OINT_RELEASE ){.
16420 20 20 20 20 20 20 20 20 69 66 28 20 28 72 63 20          if( (rc 
16430 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
16440 63 6b 46 6b 28 70 2c 20 31 29 29 21 3d 53 51 4c  ckFk(p, 1))!=SQL
16450 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16460 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65      goto vdbe_re
16470 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
16480 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
16490 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
164a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
164b0 64 62 65 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49  dbeHalt(p)==SQLI
164c0 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
164d0 20 20 20 20 20 70 2d 3e 70 63 20 3d 20 70 63 3b       p->pc = pc;
164e0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  .          db->a
164f0 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20  utoCommit = 0;. 
16500 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
16510 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
16520 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  Y;.          got
16530 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20  o vdbe_return;. 
16540 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16550 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69   db->isTransacti
16560 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  onSavepoint = 0;
16570 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 2d  .        rc = p-
16580 3e 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >rc;.      }else
16590 7b 0a 20 20 20 20 20 20 20 20 69 53 61 76 65 70  {.        iSavep
165a0 6f 69 6e 74 20 3d 20 64 62 2d 3e 6e 53 61 76 65  oint = db->nSave
165b0 70 6f 69 6e 74 20 2d 20 69 53 61 76 65 70 6f 69  point - iSavepoi
165c0 6e 74 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  nt - 1;.        
165d0 69 66 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e  if( p1==SAVEPOIN
165e0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
165f0 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30          for(ii=0
16600 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69  ; ii<db->nDb; ii
16610 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
16620 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
16630 70 41 6c 6c 43 75 72 73 6f 72 73 28 64 62 2d 3e  pAllCursors(db->
16640 61 44 62 5b 69 69 5d 2e 70 42 74 2c 20 53 51 4c  aDb[ii].pBt, SQL
16650 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20  ITE_ABORT);.    
16660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16670 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69  }.        for(ii
16680 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20  =0; ii<db->nDb; 
16690 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ii++){.         
166a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
166b0 65 65 53 61 76 65 70 6f 69 6e 74 28 64 62 2d 3e  eeSavepoint(db->
166c0 61 44 62 5b 69 69 5d 2e 70 42 74 2c 20 70 31 2c  aDb[ii].pBt, p1,
166d0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
166e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
166f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16700 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62           goto ab
16710 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
16720 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16740 69 66 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e  if( p1==SAVEPOIN
16750 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20 28 64  T_ROLLBACK && (d
16760 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
16770 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21 3d  InternChanges)!=
16780 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
16790 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
167a0 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
167b0 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  b);.          sq
167c0 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
167d0 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
167e0 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
167f0 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d  db->flags = (db-
16800 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f  >flags | SQLITE_
16810 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a  InternChanges);.
16820 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16830 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65  }.  .      /* Re
16840 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
16850 68 65 72 20 74 68 69 73 20 69 73 20 61 20 52 45  her this is a RE
16860 4c 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43  LEASE or ROLLBAC
16870 4b 2c 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 0a  K, destroy all .
16880 20 20 20 20 20 20 2a 2a 20 73 61 76 65 70 6f 69        ** savepoi
16890 6e 74 73 20 6e 65 73 74 65 64 20 69 6e 73 69 64  nts nested insid
168a0 65 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  e of the savepoi
168b0 6e 74 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65  nt being operate
168c0 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 77  d on. */.      w
168d0 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70  hile( db->pSavep
168e0 6f 69 6e 74 21 3d 70 53 61 76 65 70 6f 69 6e 74  oint!=pSavepoint
168f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 6d 70   ){.        pTmp
16900 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
16910 74 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 70  t;.        db->p
16920 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70  Savepoint = pTmp
16930 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
16940 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16950 62 2c 20 70 54 6d 70 29 3b 0a 20 20 20 20 20 20  b, pTmp);.      
16960 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74    db->nSavepoint
16970 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  --;.      }..   
16980 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 61     /* If it is a
16990 20 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 64   RELEASE, then d
169a0 65 73 74 72 6f 79 20 74 68 65 20 73 61 76 65 70  estroy the savep
169b0 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70 65 72 61  oint being opera
169c0 74 65 64 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a  ted on .      **
169d0 20 74 6f 6f 2e 20 49 66 20 69 74 20 69 73 20 61   too. If it is a
169e0 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 2c 20 74 68   ROLLBACK TO, th
169f0 65 6e 20 73 65 74 20 74 68 65 20 6e 75 6d 62 65  en set the numbe
16a00 72 20 6f 66 20 64 65 66 65 72 72 65 64 20 0a 20  r of deferred . 
16a10 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
16a20 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 70 72  nt violations pr
16a30 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
16a40 61 62 61 73 65 20 74 6f 20 74 68 65 20 76 61 6c  abase to the val
16a50 75 65 20 73 74 6f 72 65 64 0a 20 20 20 20 20 20  ue stored.      
16a60 2a 2a 20 77 68 65 6e 20 74 68 65 20 73 61 76 65  ** when the save
16a70 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74 65  point was create
16a80 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
16a90 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   p1==SAVEPOINT_R
16aa0 45 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20  ELEASE ){.      
16ab0 20 20 61 73 73 65 72 74 28 20 70 53 61 76 65 70    assert( pSavep
16ac0 6f 69 6e 74 3d 3d 64 62 2d 3e 70 53 61 76 65 70  oint==db->pSavep
16ad0 6f 69 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20  oint );.        
16ae0 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
16af0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65   pSavepoint->pNe
16b00 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  xt;.        sqli
16b10 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
16b20 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
16b30 20 20 20 69 66 28 20 21 69 73 54 72 61 6e 73 61     if( !isTransa
16b40 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
16b50 20 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e     db->nSavepoin
16b60 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t--;.        }. 
16b70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16b80 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
16b90 64 43 6f 6e 73 20 3d 20 70 53 61 76 65 70 6f 69  dCons = pSavepoi
16ba0 6e 74 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  nt->nDeferredCon
16bb0 73 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  s;.      }..    
16bc0 20 20 69 66 28 20 21 69 73 54 72 61 6e 73 61 63    if( !isTransac
16bd0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  tion ){.        
16be0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
16bf0 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 70 31  Savepoint(db, p1
16c00 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
16c10 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
16c20 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
16c30 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
16c40 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
16c50 7d 0a 20 20 7d 0a 0a 20 20 62 72 65 61 6b 3b 0a  }.  }..  break;.
16c60 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 75  }../* Opcode: Au
16c70 74 6f 43 6f 6d 6d 69 74 20 50 31 20 50 32 20 2a  toCommit P1 P2 *
16c80 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74   * *.**.** Set t
16c90 68 65 20 64 61 74 61 62 61 73 65 20 61 75 74 6f  he database auto
16ca0 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 74 6f 20  -commit flag to 
16cb0 50 31 20 28 31 20 6f 72 20 30 29 2e 20 49 66 20  P1 (1 or 0). If 
16cc0 50 32 20 69 73 20 74 72 75 65 2c 20 72 6f 6c 6c  P2 is true, roll
16cd0 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 75 72  .** back any cur
16ce0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 62 74  rently active bt
16cf0 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ree transactions
16d00 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  . If there are a
16d10 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 56 4d 73  ny active.** VMs
16d20 20 28 61 70 61 72 74 20 66 72 6f 6d 20 74 68 69   (apart from thi
16d30 73 20 6f 6e 65 29 2c 20 74 68 65 6e 20 61 20 52  s one), then a R
16d40 4f 4c 4c 42 41 43 4b 20 66 61 69 6c 73 2e 20 20  OLLBACK fails.  
16d50 41 20 43 4f 4d 4d 49 54 20 66 61 69 6c 73 20 69  A COMMIT fails i
16d60 66 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 61  f.** there are a
16d70 63 74 69 76 65 20 77 72 69 74 69 6e 67 20 56 4d  ctive writing VM
16d80 73 20 6f 72 20 61 63 74 69 76 65 20 56 4d 73 20  s or active VMs 
16d90 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20  that use shared 
16da0 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  cache..**.** Thi
16db0 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 61  s instruction ca
16dc0 75 73 65 73 20 74 68 65 20 56 4d 20 74 6f 20 68  uses the VM to h
16dd0 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  alt..*/.case OP_
16de0 41 75 74 6f 43 6f 6d 6d 69 74 3a 20 7b 0a 20 20  AutoCommit: {.  
16df0 69 6e 74 20 64 65 73 69 72 65 64 41 75 74 6f 43  int desiredAutoC
16e00 6f 6d 6d 69 74 3b 0a 20 20 69 6e 74 20 69 52 6f  ommit;.  int iRo
16e10 6c 6c 62 61 63 6b 3b 0a 20 20 69 6e 74 20 74 75  llback;.  int tu
16e20 72 6e 4f 6e 41 43 3b 0a 0a 20 20 64 65 73 69 72  rnOnAC;..  desir
16e30 65 64 41 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 70  edAutoCommit = p
16e40 4f 70 2d 3e 70 31 3b 0a 20 20 69 52 6f 6c 6c 62  Op->p1;.  iRollb
16e50 61 63 6b 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  ack = pOp->p2;. 
16e60 20 74 75 72 6e 4f 6e 41 43 20 3d 20 64 65 73 69   turnOnAC = desi
16e70 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 20 26 26  redAutoCommit &&
16e80 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   !db->autoCommit
16e90 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65 73 69  ;.  assert( desi
16ea0 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31  redAutoCommit==1
16eb0 20 7c 7c 20 64 65 73 69 72 65 64 41 75 74 6f 43   || desiredAutoC
16ec0 6f 6d 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61 73  ommit==0 );.  as
16ed0 73 65 72 74 28 20 64 65 73 69 72 65 64 41 75 74  sert( desiredAut
16ee0 6f 43 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 69 52  oCommit==1 || iR
16ef0 6f 6c 6c 62 61 63 6b 3d 3d 30 20 29 3b 0a 20 20  ollback==0 );.  
16f00 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
16f10 65 41 63 74 69 76 65 3e 30 20 29 3b 20 20 2f 2a  eActive>0 );  /*
16f20 20 41 74 20 6c 65 61 73 74 20 74 68 69 73 20 6f   At least this o
16f30 6e 65 20 56 4d 20 69 73 20 61 63 74 69 76 65 20  ne VM is active 
16f40 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
16f50 62 49 73 52 65 61 64 65 72 20 29 3b 0a 0a 23 69  bIsReader );..#i
16f60 66 20 30 0a 20 20 69 66 28 20 74 75 72 6e 4f 6e  f 0.  if( turnOn
16f70 41 43 20 26 26 20 69 52 6f 6c 6c 62 61 63 6b 20  AC && iRollback 
16f80 26 26 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  && db->nVdbeActi
16f90 76 65 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ve>1 ){.    /* I
16fa0 66 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  f this instructi
16fb0 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20  on implements a 
16fc0 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 6f 74 68  ROLLBACK and oth
16fd0 65 72 20 56 4d 73 20 61 72 65 0a 20 20 20 20 2a  er VMs are.    *
16fe0 2a 20 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 2c  * still running,
16ff0 20 61 6e 64 20 61 20 74 72 61 6e 73 61 63 74 69   and a transacti
17000 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 72 65  on is active, re
17010 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e  turn an error in
17020 64 69 63 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20  dicating.    ** 
17030 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 56  that the other V
17040 4d 73 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  Ms must complete
17050 20 66 69 72 73 74 2e 20 0a 20 20 20 20 2a 2f 0a   first. .    */.
17060 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
17070 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
17080 2c 20 64 62 2c 20 22 63 61 6e 6e 6f 74 20 72 6f  , db, "cannot ro
17090 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69  llback transacti
170a0 6f 6e 20 2d 20 22 0a 20 20 20 20 20 20 20 20 22  on - ".        "
170b0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69  SQL statements i
170c0 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20  n progress");.  
170d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
170e0 53 59 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  SY;.  }else.#end
170f0 69 66 0a 20 20 69 66 28 20 74 75 72 6e 4f 6e 41  if.  if( turnOnA
17100 43 20 26 26 20 21 69 52 6f 6c 6c 62 61 63 6b 20  C && !iRollback 
17110 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  && db->nVdbeWrit
17120 65 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  e>0 ){.    /* If
17130 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
17140 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 43  n implements a C
17150 4f 4d 4d 49 54 20 61 6e 64 20 6f 74 68 65 72 20  OMMIT and other 
17160 56 4d 73 20 61 72 65 20 77 72 69 74 69 6e 67 0a  VMs are writing.
17170 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e      ** return an
17180 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74 69 6e   error indicatin
17190 67 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72  g that the other
171a0 20 56 4d 73 20 6d 75 73 74 20 63 6f 6d 70 6c 65   VMs must comple
171b0 74 65 20 66 69 72 73 74 2e 20 0a 20 20 20 20 2a  te first. .    *
171c0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  /.    sqlite3Set
171d0 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
171e0 73 67 2c 20 64 62 2c 20 22 63 61 6e 6e 6f 74 20  sg, db, "cannot 
171f0 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63 74 69  commit transacti
17200 6f 6e 20 2d 20 22 0a 20 20 20 20 20 20 20 20 22  on - ".        "
17210 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69  SQL statements i
17220 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20  n progress");.  
17230 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
17240 53 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  SY;.  }else if( 
17250 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69  desiredAutoCommi
17260 74 21 3d 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  t!=db->autoCommi
17270 74 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52 6f  t ){.    if( iRo
17280 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
17290 61 73 73 65 72 74 28 20 64 65 73 69 72 65 64 41  assert( desiredA
172a0 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 29 3b 0a  utoCommit==1 );.
172b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
172c0 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
172d0 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
172e0 43 4b 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61  CK);.      db->a
172f0 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
17300 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63     }else if( (rc
17310 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
17320 65 63 6b 46 6b 28 70 2c 20 31 29 29 21 3d 53 51  eckFk(p, 1))!=SQ
17330 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17340 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72   goto vdbe_retur
17350 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  n;.    }else{.  
17360 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
17370 69 74 20 3d 20 28 75 38 29 64 65 73 69 72 65 64  it = (u8)desired
17380 41 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20 20 20  AutoCommit;.    
17390 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
173a0 65 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45  eHalt(p)==SQLITE
173b0 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
173c0 20 70 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20 20   p->pc = pc;.   
173d0 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
173e0 6d 69 74 20 3d 20 28 75 38 29 28 31 2d 64 65 73  mit = (u8)(1-des
173f0 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 29 3b  iredAutoCommit);
17400 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
17410 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
17420 59 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  Y;.        goto 
17430 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20  vdbe_return;.   
17440 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
17450 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74  ssert( db->nStat
17460 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20  ement==0 );.    
17470 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
17480 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
17490 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
174a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
174b0 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
174c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
174d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
174e0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  OR;.    }.    go
174f0 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a  to vdbe_return;.
17500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
17510 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
17520 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 0a 20  ->zErrMsg, db,. 
17530 20 20 20 20 20 20 20 28 21 64 65 73 69 72 65 64         (!desired
17540 41 75 74 6f 43 6f 6d 6d 69 74 29 3f 22 63 61 6e  AutoCommit)?"can
17550 6e 6f 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  not start a tran
17560 73 61 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61  saction within a
17570 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 3a 28 0a   transaction":(.
17580 20 20 20 20 20 20 20 20 28 69 52 6f 6c 6c 62 61          (iRollba
17590 63 6b 29 3f 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c  ck)?"cannot roll
175a0 62 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61  back - no transa
175b0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22  ction is active"
175c0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
175d0 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 6f 6d       "cannot com
175e0 6d 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63  mit - no transac
175f0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29  tion is active")
17600 29 3b 0a 20 20 20 20 20 20 20 20 20 0a 20 20 20  );.         .   
17610 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
17620 4f 52 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  OR;.  }.  break;
17630 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54  .}../* Opcode: T
17640 72 61 6e 73 61 63 74 69 6f 6e 20 50 31 20 50 32  ransaction P1 P2
17650 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 42 65 67   * * *.**.** Beg
17660 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
17670 2e 20 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  .  The transacti
17680 6f 6e 20 65 6e 64 73 20 77 68 65 6e 20 61 20 43  on ends when a C
17690 6f 6d 6d 69 74 20 6f 72 20 52 6f 6c 6c 62 61 63  ommit or Rollbac
176a0 6b 0a 2a 2a 20 6f 70 63 6f 64 65 20 69 73 20 65  k.** opcode is e
176b0 6e 63 6f 75 6e 74 65 72 65 64 2e 20 20 44 65 70  ncountered.  Dep
176c0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 4f 4e  ending on the ON
176d0 20 43 4f 4e 46 4c 49 43 54 20 73 65 74 74 69 6e   CONFLICT settin
176e0 67 2c 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61  g, the.** transa
176f0 63 74 69 6f 6e 20 6d 69 67 68 74 20 61 6c 73 6f  ction might also
17700 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
17710 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  if an error is e
17720 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ncountered..**.*
17730 2a 20 50 31 20 69 73 20 74 68 65 20 69 6e 64 65  * P1 is the inde
17740 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
17750 65 20 66 69 6c 65 20 6f 6e 20 77 68 69 63 68 20  e file on which 
17760 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
17770 69 73 0a 2a 2a 20 73 74 61 72 74 65 64 2e 20 20  is.** started.  
17780 49 6e 64 65 78 20 30 20 69 73 20 74 68 65 20 6d  Index 0 is the m
17790 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
177a0 65 20 61 6e 64 20 69 6e 64 65 78 20 31 20 69 73  e and index 1 is
177b0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 75 73 65   the.** file use
177c0 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
177d0 74 61 62 6c 65 73 2e 20 20 49 6e 64 69 63 65 73  tables.  Indices
177e0 20 6f 66 20 32 20 6f 72 20 6d 6f 72 65 20 61 72   of 2 or more ar
177f0 65 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 61 74  e used for.** at
17800 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
17810 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32 20 69 73  ..**.** If P2 is
17820 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
17830 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
17840 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2e 20  ion is started. 
17850 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   A RESERVED lock
17860 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20   is.** obtained 
17870 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
17880 66 69 6c 65 20 77 68 65 6e 20 61 20 77 72 69 74  file when a writ
17890 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
178a0 20 73 74 61 72 74 65 64 2e 20 20 4e 6f 0a 2a 2a   started.  No.**
178b0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
178c0 61 6e 20 73 74 61 72 74 20 61 6e 6f 74 68 65 72  an start another
178d0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
178e0 6f 6e 20 77 68 69 6c 65 20 74 68 69 73 20 74 72  on while this tr
178f0 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20  ansaction is.** 
17900 75 6e 64 65 72 77 61 79 2e 20 20 53 74 61 72 74  underway.  Start
17910 69 6e 67 20 61 20 77 72 69 74 65 20 74 72 61 6e  ing a write tran
17920 73 61 63 74 69 6f 6e 20 61 6c 73 6f 20 63 72 65  saction also cre
17930 61 74 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  ates a rollback 
17940 6a 6f 75 72 6e 61 6c 2e 20 41 0a 2a 2a 20 77 72  journal. A.** wr
17950 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
17960 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
17970 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
17980 65 73 20 63 61 6e 20 62 65 20 6d 61 64 65 20 74  es can be made t
17990 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  o the.** databas
179a0 65 2e 20 20 49 66 20 50 32 20 69 73 20 67 72 65  e.  If P2 is gre
179b0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
179c0 61 6c 20 74 6f 20 32 20 74 68 65 6e 20 61 6e 20  al to 2 then an 
179d0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69  EXCLUSIVE lock i
179e0 73 0a 2a 2a 20 61 6c 73 6f 20 6f 62 74 61 69 6e  s.** also obtain
179f0 65 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ed on the file..
17a00 2a 2a 0a 2a 2a 20 49 66 20 61 20 77 72 69 74 65  **.** If a write
17a10 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
17a20 73 74 61 72 74 65 64 20 61 6e 64 20 74 68 65 20  started and the 
17a30 56 64 62 65 2e 75 73 65 73 53 74 6d 74 4a 6f 75  Vdbe.usesStmtJou
17a40 72 6e 61 6c 20 66 6c 61 67 20 69 73 0a 2a 2a 20  rnal flag is.** 
17a50 74 72 75 65 20 28 74 68 69 73 20 66 6c 61 67 20  true (this flag 
17a60 69 73 20 73 65 74 20 69 66 20 74 68 65 20 56 64  is set if the Vd
17a70 62 65 20 6d 61 79 20 6d 6f 64 69 66 79 20 6d 6f  be may modify mo
17a80 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20  re than one row 
17a90 61 6e 64 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77  and may.** throw
17aa0 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74   an ABORT except
17ab0 69 6f 6e 29 2c 20 61 20 73 74 61 74 65 6d 65 6e  ion), a statemen
17ac0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  t transaction ma
17ad0 79 20 61 6c 73 6f 20 62 65 20 6f 70 65 6e 65 64  y also be opened
17ae0 2e 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  ..** More specif
17af0 69 63 61 6c 6c 79 2c 20 61 20 73 74 61 74 65 6d  ically, a statem
17b00 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
17b10 69 73 20 6f 70 65 6e 65 64 20 69 66 66 20 74 68  is opened iff th
17b20 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
17b30 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nnection is curr
17b40 65 6e 74 6c 79 20 6e 6f 74 20 69 6e 20 61 75 74  ently not in aut
17b50 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 6f 72  ocommit mode, or
17b60 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   if there are ot
17b70 68 65 72 0a 2a 2a 20 61 63 74 69 76 65 20 73 74  her.** active st
17b80 61 74 65 6d 65 6e 74 73 2e 20 41 20 73 74 61 74  atements. A stat
17b90 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
17ba0 6e 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 61  n allows the cha
17bb0 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
17bc0 73 0a 2a 2a 20 56 44 42 45 20 74 6f 20 62 65 20  s.** VDBE to be 
17bd0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65  rolled back afte
17be0 72 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 6f  r an error witho
17bf0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
17c00 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 65 6e  l back the.** en
17c10 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
17c20 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 69 73  . If no error is
17c30 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
17c40 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
17c50 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
17c60 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f  automatically co
17c70 6d 6d 69 74 20 77 68 65 6e 20 74 68 65 20 56 44  mmit when the VD
17c80 42 45 20 68 61 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20  BE halts..**.** 
17c90 49 66 20 50 32 20 69 73 20 7a 65 72 6f 2c 20 74  If P2 is zero, t
17ca0 68 65 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  hen a read-lock 
17cb0 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  is obtained on t
17cc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17cd0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 72 61  ..*/.case OP_Tra
17ce0 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 42 74  nsaction: {.  Bt
17cf0 72 65 65 20 2a 70 42 74 3b 0a 0a 20 20 61 73 73  ree *pBt;..  ass
17d00 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65  ert( p->bIsReade
17d10 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
17d20 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 7c 7c  ->readOnly==0 ||
17d30 20 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 3b 0a 20   pOp->p2==0 );. 
17d40 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
17d50 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64  >=0 && pOp->p1<d
17d60 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
17d70 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73  rt( (p->btreeMas
17d80 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31  k & (((yDbMask)1
17d90 29 3c 3c 70 4f 70 2d 3e 70 31 29 29 21 3d 30 20  )<<pOp->p1))!=0 
17da0 29 3b 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61  );.  pBt = db->a
17db0 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b  Db[pOp->p1].pBt;
17dc0 0a 0a 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20  ..  if( pBt ){. 
17dd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
17de0 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
17df0 42 74 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20  Bt, pOp->p2);.  
17e00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17e10 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 70  _BUSY ){.      p
17e20 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 20  ->pc = pc;.     
17e30 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53 51   p->rc = rc = SQ
17e40 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
17e50 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72   goto vdbe_retur
17e60 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
17e70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17e80 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f  {.      goto abo
17e90 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
17ea0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
17eb0 70 4f 70 2d 3e 70 32 20 26 26 20 70 2d 3e 75 73  pOp->p2 && p->us
17ec0 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 0a 20  esStmtJournal . 
17ed0 20 20 20 20 26 26 20 28 64 62 2d 3e 61 75 74 6f      && (db->auto
17ee0 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
17ef0 3e 6e 56 64 62 65 52 65 61 64 3e 31 29 20 0a 20  >nVdbeRead>1) . 
17f00 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
17f10 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
17f20 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
17f30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  ;.      if( p->i
17f40 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 7b 0a  Statement==0 ){.
17f50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17f60 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 3d  db->nStatement>=
17f70 30 20 26 26 20 64 62 2d 3e 6e 53 61 76 65 70 6f  0 && db->nSavepo
17f80 69 6e 74 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  int>=0 );.      
17f90 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
17fa0 2b 2b 3b 20 0a 20 20 20 20 20 20 20 20 70 2d 3e  ++; .        p->
17fb0 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 64 62 2d  iStatement = db-
17fc0 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20 64 62  >nSavepoint + db
17fd0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3b 0a 20 20  ->nStatement;.  
17fe0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20      }..      rc 
17ff0 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
18000 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
18010 4f 49 4e 54 5f 42 45 47 49 4e 2c 20 70 2d 3e 69  OINT_BEGIN, p->i
18020 53 74 61 74 65 6d 65 6e 74 2d 31 29 3b 0a 20 20  Statement-1);.  
18030 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18040 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18050 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
18060 65 65 42 65 67 69 6e 53 74 6d 74 28 70 42 74 2c  eeBeginStmt(pBt,
18070 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 29 3b   p->iStatement);
18080 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18090 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 63 75 72  /* Store the cur
180a0 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
180b0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
180c0 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  es deferred cons
180d0 74 72 61 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20  traint.      ** 
180e0 63 6f 75 6e 74 65 72 2e 20 49 66 20 74 68 65 20  counter. If the 
180f0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
18100 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 62  ction needs to b
18110 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 0a 20  e rolled back,. 
18120 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
18130 65 20 6f 66 20 74 68 69 73 20 63 6f 75 6e 74 65  e of this counte
18140 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  r needs to be re
18150 73 74 6f 72 65 64 20 74 6f 6f 2e 20 20 2a 2f 0a  stored too.  */.
18160 20 20 20 20 20 20 70 2d 3e 6e 53 74 6d 74 44 65        p->nStmtDe
18170 66 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66  fCons = db->nDef
18180 65 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 7d  erredCons;.    }
18190 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
181a0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 61 64  ./* Opcode: Read
181b0 43 6f 6f 6b 69 65 20 50 31 20 50 32 20 50 33 20  Cookie P1 P2 P3 
181c0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 63  * *.**.** Read c
181d0 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20 50 33 20  ookie number P3 
181e0 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 50 31  from database P1
181f0 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 69 6e   and write it in
18200 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
18210 2a 2a 20 50 33 3d 3d 31 20 69 73 20 74 68 65 20  ** P3==1 is the 
18220 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 2e 20  schema version. 
18230 20 50 33 3d 3d 32 20 69 73 20 74 68 65 20 64 61   P3==2 is the da
18240 74 61 62 61 73 65 20 66 6f 72 6d 61 74 2e 0a 2a  tabase format..*
18250 2a 20 50 33 3d 3d 33 20 69 73 20 74 68 65 20 72  * P3==3 is the r
18260 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61 67 65 72  ecommended pager
18270 20 63 61 63 68 65 20 73 69 7a 65 2c 20 61 6e 64   cache size, and
18280 20 73 6f 20 66 6f 72 74 68 2e 20 20 50 31 3d 3d   so forth.  P1==
18290 30 20 69 73 0a 2a 2a 20 74 68 65 20 6d 61 69 6e  0 is.** the main
182a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
182b0 6e 64 20 50 31 3d 3d 31 20 69 73 20 74 68 65 20  nd P1==1 is the 
182c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
182d0 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74  ed to store.** t
182e0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
182f0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
18300 74 20 62 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b  t be a read-lock
18310 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
18320 20 28 65 69 74 68 65 72 20 61 20 74 72 61 6e 73   (either a trans
18330 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62  action.** must b
18340 65 20 73 74 61 72 74 65 64 20 6f 72 20 74 68 65  e started or the
18350 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  re must be an op
18360 65 6e 20 63 75 72 73 6f 72 29 20 62 65 66 6f 72  en cursor) befor
18370 65 0a 2a 2a 20 65 78 65 63 75 74 69 6e 67 20 74  e.** executing t
18380 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  his instruction.
18390 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61 64  .*/.case OP_Read
183a0 43 6f 6f 6b 69 65 3a 20 7b 20 20 20 20 20 20 20  Cookie: {       
183b0 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
183c0 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
183d0 69 6e 74 20 69 4d 65 74 61 3b 0a 20 20 69 6e 74  int iMeta;.  int
183e0 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 43 6f 6f   iDb;.  int iCoo
183f0 6b 69 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  kie;..  assert( 
18400 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a  p->bIsReader );.
18410 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b    iDb = pOp->p1;
18420 0a 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 4f 70  .  iCookie = pOp
18430 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p3;.  assert( 
18440 70 4f 70 2d 3e 70 33 3c 53 51 4c 49 54 45 5f 4e  pOp->p3<SQLITE_N
18450 5f 42 54 52 45 45 5f 4d 45 54 41 20 29 3b 0a 20  _BTREE_META );. 
18460 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
18470 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
18480 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
18490 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20  aDb[iDb].pBt!=0 
184a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
184b0 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28  >btreeMask & (((
184c0 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62 29  yDbMask)1)<<iDb)
184d0 29 21 3d 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74  )!=0 );..  sqlit
184e0 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 64  e3BtreeGetMeta(d
184f0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 2c  b->aDb[iDb].pBt,
18500 20 69 43 6f 6f 6b 69 65 2c 20 28 75 33 32 20 2a   iCookie, (u32 *
18510 29 26 69 4d 65 74 61 29 3b 0a 20 20 70 4f 75 74  )&iMeta);.  pOut
18520 2d 3e 75 2e 69 20 3d 20 69 4d 65 74 61 3b 0a 20  ->u.i = iMeta;. 
18530 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
18540 63 6f 64 65 3a 20 53 65 74 43 6f 6f 6b 69 65 20  code: SetCookie 
18550 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
18560 2a 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e  ** Write the con
18570 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72  tent of register
18580 20 50 33 20 28 69 6e 74 65 72 70 72 65 74 65 64   P3 (interpreted
18590 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 29 0a   as an integer).
185a0 2a 2a 20 69 6e 74 6f 20 63 6f 6f 6b 69 65 20 6e  ** into cookie n
185b0 75 6d 62 65 72 20 50 32 20 6f 66 20 64 61 74 61  umber P2 of data
185c0 62 61 73 65 20 50 31 2e 20 20 50 32 3d 3d 31 20  base P1.  P2==1 
185d0 69 73 20 74 68 65 20 73 63 68 65 6d 61 20 76 65  is the schema ve
185e0 72 73 69 6f 6e 2e 20 20 0a 2a 2a 20 50 32 3d 3d  rsion.  .** P2==
185f0 32 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73  2 is the databas
18600 65 20 66 6f 72 6d 61 74 2e 20 50 32 3d 3d 33 20  e format. P2==3 
18610 69 73 20 74 68 65 20 72 65 63 6f 6d 6d 65 6e 64  is the recommend
18620 65 64 20 70 61 67 65 72 20 63 61 63 68 65 20 0a  ed pager cache .
18630 2a 2a 20 73 69 7a 65 2c 20 61 6e 64 20 73 6f 20  ** size, and so 
18640 66 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20 69 73  forth.  P1==0 is
18650 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
18660 73 65 20 66 69 6c 65 20 61 6e 64 20 50 31 3d 3d  se file and P1==
18670 31 20 69 73 20 74 68 65 20 0a 2a 2a 20 64 61 74  1 is the .** dat
18680 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20  abase file used 
18690 74 6f 20 73 74 6f 72 65 20 74 65 6d 70 6f 72 61  to store tempora
186a0 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ry tables..**.**
186b0 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d   A transaction m
186c0 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
186d0 65 66 6f 72 65 20 65 78 65 63 75 74 69 6e 67 20  efore executing 
186e0 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a  this opcode..*/.
186f0 63 61 73 65 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  case OP_SetCooki
18700 65 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 69 6e  e: {       /* in
18710 33 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 0a  3 */.  Db *pDb;.
18720 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
18730 32 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45  2<SQLITE_N_BTREE
18740 5f 4d 45 54 41 20 29 3b 0a 20 20 61 73 73 65 72  _META );.  asser
18750 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
18760 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62   pOp->p1<db->nDb
18770 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
18780 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28  ->btreeMask & ((
18790 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70  (yDbMask)1)<<pOp
187a0 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a 20 20 61  ->p1))!=0 );.  a
187b0 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e  ssert( p->readOn
187c0 6c 79 3d 3d 30 20 29 3b 0a 20 20 70 44 62 20 3d  ly==0 );.  pDb =
187d0 20 26 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70   &db->aDb[pOp->p
187e0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44  1];.  assert( pD
187f0 62 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  b->pBt!=0 );.  a
18800 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
18810 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
18820 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 29 20 29 3b  , pOp->p1, 0) );
18830 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b  .  pIn3 = &aMem[
18840 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 73 71 6c 69  pOp->p3];.  sqli
18850 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65  te3VdbeMemIntege
18860 72 69 66 79 28 70 49 6e 33 29 3b 0a 20 20 2f 2a  rify(pIn3);.  /*
18870 20 53 65 65 20 6e 6f 74 65 20 61 62 6f 75 74 20   See note about 
18880 69 6e 64 65 78 20 73 68 69 66 74 69 6e 67 20 6f  index shifting o
18890 6e 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 20  n OP_ReadCookie 
188a0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
188b0 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
188c0 28 70 44 62 2d 3e 70 42 74 2c 20 70 4f 70 2d 3e  (pDb->pBt, pOp->
188d0 70 32 2c 20 28 69 6e 74 29 70 49 6e 33 2d 3e 75  p2, (int)pIn3->u
188e0 2e 69 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  .i);.  if( pOp->
188f0 70 32 3d 3d 42 54 52 45 45 5f 53 43 48 45 4d 41  p2==BTREE_SCHEMA
18900 5f 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20  _VERSION ){.    
18910 2f 2a 20 57 68 65 6e 20 74 68 65 20 73 63 68 65  /* When the sche
18920 6d 61 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65  ma cookie change
18930 73 2c 20 72 65 63 6f 72 64 20 74 68 65 20 6e 65  s, record the ne
18940 77 20 63 6f 6f 6b 69 65 20 69 6e 74 65 72 6e 61  w cookie interna
18950 6c 6c 79 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e  lly */.    pDb->
18960 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f  pSchema->schema_
18970 63 6f 6f 6b 69 65 20 3d 20 28 69 6e 74 29 70 49  cookie = (int)pI
18980 6e 33 2d 3e 75 2e 69 3b 0a 20 20 20 20 64 62 2d  n3->u.i;.    db-
18990 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
189a0 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
189b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
189c0 3e 70 32 3d 3d 42 54 52 45 45 5f 46 49 4c 45 5f  >p2==BTREE_FILE_
189d0 46 4f 52 4d 41 54 20 29 7b 0a 20 20 20 20 2f 2a  FORMAT ){.    /*
189e0 20 52 65 63 6f 72 64 20 63 68 61 6e 67 65 73 20   Record changes 
189f0 69 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  in the file form
18a00 61 74 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 70  at */.    pDb->p
18a10 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72  Schema->file_for
18a20 6d 61 74 20 3d 20 28 75 38 29 70 49 6e 33 2d 3e  mat = (u8)pIn3->
18a30 75 2e 69 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  u.i;.  }.  if( p
18a40 4f 70 2d 3e 70 31 3d 3d 31 20 29 7b 0a 20 20 20  Op->p1==1 ){.   
18a50 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 61   /* Invalidate a
18a60 6c 6c 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ll prepared stat
18a70 65 6d 65 6e 74 73 20 77 68 65 6e 65 76 65 72 20  ements whenever 
18a80 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73  the TEMP databas
18a90 65 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 20  e.    ** schema 
18aa0 69 73 20 63 68 61 6e 67 65 64 2e 20 20 54 69 63  is changed.  Tic
18ab0 6b 65 74 20 23 31 36 34 34 20 2a 2f 0a 20 20 20  ket #1644 */.   
18ac0 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
18ad0 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
18ae0 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 65 78 70  (db);.    p->exp
18af0 69 72 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ired = 0;.  }.  
18b00 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
18b10 6f 64 65 3a 20 56 65 72 69 66 79 43 6f 6f 6b 69  ode: VerifyCooki
18b20 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  e P1 P2 P3 * *.*
18b30 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 76  *.** Check the v
18b40 61 6c 75 65 20 6f 66 20 67 6c 6f 62 61 6c 20 64  alue of global d
18b50 61 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65  atabase paramete
18b60 72 20 6e 75 6d 62 65 72 20 30 20 28 74 68 65 0a  r number 0 (the.
18b70 2a 2a 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f  ** schema versio
18b80 6e 29 20 61 6e 64 20 6d 61 6b 65 20 73 75 72 65  n) and make sure
18b90 20 69 74 20 69 73 20 65 71 75 61 6c 20 74 6f 20   it is equal to 
18ba0 50 32 20 61 6e 64 20 74 68 61 74 20 74 68 65 0a  P2 and that the.
18bb0 2a 2a 20 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f  ** generation co
18bc0 75 6e 74 65 72 20 6f 6e 20 74 68 65 20 6c 6f 63  unter on the loc
18bd0 61 6c 20 73 63 68 65 6d 61 20 70 61 72 73 65 20  al schema parse 
18be0 65 71 75 61 6c 73 20 50 33 2e 0a 2a 2a 0a 2a 2a  equals P3..**.**
18bf0 20 50 31 20 69 73 20 74 68 65 20 64 61 74 61 62   P1 is the datab
18c00 61 73 65 20 6e 75 6d 62 65 72 20 77 68 69 63 68  ase number which
18c10 20 69 73 20 30 20 66 6f 72 20 74 68 65 20 6d 61   is 0 for the ma
18c20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
18c30 0a 2a 2a 20 61 6e 64 20 31 20 66 6f 72 20 74 68  .** and 1 for th
18c40 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74  e file holding t
18c50 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
18c60 61 6e 64 20 73 6f 6d 65 20 68 69 67 68 65 72 20  and some higher 
18c70 6e 75 6d 62 65 72 0a 2a 2a 20 66 6f 72 20 61 75  number.** for au
18c80 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
18c90 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6f  s..**.** The coo
18ca0 6b 69 65 20 63 68 61 6e 67 65 73 20 69 74 73 20  kie changes its 
18cb0 76 61 6c 75 65 20 77 68 65 6e 65 76 65 72 20 74  value whenever t
18cc0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
18cd0 6d 61 20 63 68 61 6e 67 65 73 2e 0a 2a 2a 20 54  ma changes..** T
18ce0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  his operation is
18cf0 20 75 73 65 64 20 74 6f 20 64 65 74 65 63 74 20   used to detect 
18d00 77 68 65 6e 20 74 68 61 74 20 74 68 65 20 63 6f  when that the co
18d10 6f 6b 69 65 20 68 61 73 20 63 68 61 6e 67 65 64  okie has changed
18d20 0a 2a 2a 20 61 6e 64 20 74 68 61 74 20 74 68 65  .** and that the
18d30 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
18d40 20 6e 65 65 64 73 20 74 6f 20 72 65 72 65 61 64   needs to reread
18d50 20 74 68 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a   the schema..**.
18d60 2a 2a 20 45 69 74 68 65 72 20 61 20 74 72 61 6e  ** Either a tran
18d70 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
18d80 20 68 61 76 65 20 62 65 65 6e 20 73 74 61 72 74   have been start
18d90 65 64 20 6f 72 20 61 6e 20 4f 50 5f 4f 70 65 6e  ed or an OP_Open
18da0 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
18db0 65 78 65 63 75 74 65 64 20 28 74 6f 20 65 73 74  executed (to est
18dc0 61 62 6c 69 73 68 20 61 20 72 65 61 64 20 6c 6f  ablish a read lo
18dd0 63 6b 29 20 62 65 66 6f 72 65 20 74 68 69 73 20  ck) before this 
18de0 6f 70 63 6f 64 65 20 69 73 0a 2a 2a 20 69 6e 76  opcode is.** inv
18df0 6f 6b 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  oked..*/.case OP
18e00 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 3a 20 7b  _VerifyCookie: {
18e10 0a 20 20 69 6e 74 20 69 4d 65 74 61 3b 0a 20 20  .  int iMeta;.  
18e20 69 6e 74 20 69 47 65 6e 3b 0a 20 20 42 74 72 65  int iGen;.  Btre
18e30 65 20 2a 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  e *pBt;..  asser
18e40 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
18e50 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62   pOp->p1<db->nDb
18e60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
18e70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28  ->btreeMask & ((
18e80 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70  (yDbMask)1)<<pOp
18e90 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a 20 20 61  ->p1))!=0 );.  a
18ea0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
18eb0 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
18ec0 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 29 20 29 3b  , pOp->p1, 0) );
18ed0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49  .  assert( p->bI
18ee0 73 52 65 61 64 65 72 20 29 3b 0a 20 20 70 42 74  sReader );.  pBt
18ef0 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e   = db->aDb[pOp->
18f00 70 31 5d 2e 70 42 74 3b 0a 20 20 69 66 28 20 70  p1].pBt;.  if( p
18f10 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Bt ){.    sqlite
18f20 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 42  3BtreeGetMeta(pB
18f30 74 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f  t, BTREE_SCHEMA_
18f40 56 45 52 53 49 4f 4e 2c 20 28 75 33 32 20 2a 29  VERSION, (u32 *)
18f50 26 69 4d 65 74 61 29 3b 0a 20 20 20 20 69 47 65  &iMeta);.    iGe
18f60 6e 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d  n = db->aDb[pOp-
18f70 3e 70 31 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 47  >p1].pSchema->iG
18f80 65 6e 65 72 61 74 69 6f 6e 3b 0a 20 20 7d 65 6c  eneration;.  }el
18f90 73 65 7b 0a 20 20 20 20 69 47 65 6e 20 3d 20 69  se{.    iGen = i
18fa0 4d 65 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Meta = 0;.  }.  
18fb0 69 66 28 20 69 4d 65 74 61 21 3d 70 4f 70 2d 3e  if( iMeta!=pOp->
18fc0 70 32 20 7c 7c 20 69 47 65 6e 21 3d 70 4f 70 2d  p2 || iGen!=pOp-
18fd0 3e 70 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >p3 ){.    sqlit
18fe0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
18ff0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
19000 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  >zErrMsg = sqlit
19010 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 22  e3DbStrDup(db, "
19020 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
19030 68 61 73 20 63 68 61 6e 67 65 64 22 29 3b 0a 20  has changed");. 
19040 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 63 68     /* If the sch
19050 65 6d 61 2d 63 6f 6f 6b 69 65 20 66 72 6f 6d 20  ema-cookie from 
19060 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19070 65 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 6f  e matches the co
19080 6f 6b 69 65 20 0a 20 20 20 20 2a 2a 20 73 74 6f  okie .    ** sto
19090 72 65 64 20 77 69 74 68 20 74 68 65 20 69 6e 2d  red with the in-
190a0 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
190b0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 68  ation of the sch
190c0 65 6d 61 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e  ema, do.    ** n
190d0 6f 74 20 72 65 6c 6f 61 64 20 74 68 65 20 73 63  ot reload the sc
190e0 68 65 6d 61 20 66 72 6f 6d 20 74 68 65 20 64 61  hema from the da
190f0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
19100 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 76 69   **.    ** If vi
19110 72 74 75 61 6c 2d 74 61 62 6c 65 73 20 61 72 65  rtual-tables are
19120 20 69 6e 20 75 73 65 2c 20 74 68 69 73 20 69 73   in use, this is
19130 20 6e 6f 74 20 6a 75 73 74 20 61 6e 20 6f 70 74   not just an opt
19140 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  imization..    *
19150 2a 20 4f 66 74 65 6e 2c 20 76 2d 74 61 62 6c 65  * Often, v-table
19160 73 20 73 74 6f 72 65 20 74 68 65 69 72 20 64 61  s store their da
19170 74 61 20 69 6e 20 6f 74 68 65 72 20 53 51 4c 69  ta in other SQLi
19180 74 65 20 74 61 62 6c 65 73 2c 20 77 68 69 63 68  te tables, which
19190 0a 20 20 20 20 2a 2a 20 61 72 65 20 71 75 65 72  .    ** are quer
191a0 69 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ied from within 
191b0 78 4e 65 78 74 28 29 20 61 6e 64 20 6f 74 68 65  xNext() and othe
191c0 72 20 76 2d 74 61 62 6c 65 20 6d 65 74 68 6f 64  r v-table method
191d0 73 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 70  s using.    ** p
191e0 72 65 70 61 72 65 64 20 71 75 65 72 69 65 73 2e  repared queries.
191f0 20 49 66 20 73 75 63 68 20 61 20 71 75 65 72 79   If such a query
19200 20 69 73 20 6f 75 74 2d 6f 66 2d 64 61 74 65 2c   is out-of-date,
19210 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   we do not want 
19220 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72  to.    ** discar
19230 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
19240 63 68 65 6d 61 2c 20 61 73 20 74 68 65 20 75 73  chema, as the us
19250 65 72 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e  er code implemen
19260 74 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  ting the.    ** 
19270 76 2d 74 61 62 6c 65 20 77 6f 75 6c 64 20 68 61  v-table would ha
19280 76 65 20 74 6f 20 62 65 20 72 65 61 64 79 20 66  ve to be ready f
19290 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  or the sqlite3_v
192a0 74 61 62 20 73 74 72 75 63 74 75 72 65 20 69 74  tab structure it
192b0 73 65 6c 66 0a 20 20 20 20 2a 2a 20 74 6f 20 62  self.    ** to b
192c0 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 77 68  e invalidated wh
192d0 65 6e 65 76 65 72 20 73 71 6c 69 74 65 33 5f 73  enever sqlite3_s
192e0 74 65 70 28 29 20 69 73 20 63 61 6c 6c 65 64 20  tep() is called 
192f0 66 72 6f 6d 20 77 69 74 68 69 6e 20 0a 20 20 20  from within .   
19300 20 2a 2a 20 61 20 76 2d 74 61 62 6c 65 20 6d 65   ** a v-table me
19310 74 68 6f 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  thod..    */.   
19320 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 70 4f 70   if( db->aDb[pOp
19330 2d 3e 70 31 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  ->p1].pSchema->s
19340 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 21 3d 69 4d  chema_cookie!=iM
19350 65 74 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  eta ){.      sql
19360 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65  ite3ResetOneSche
19370 6d 61 28 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b  ma(db, pOp->p1);
19380 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 65  .    }..    p->e
19390 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  xpired = 1;.    
193a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 53 43 48 45  rc = SQLITE_SCHE
193b0 4d 41 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  MA;.  }.  break;
193c0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .}../* Opcode: O
193d0 70 65 6e 52 65 61 64 20 50 31 20 50 32 20 50 33  penRead P1 P2 P3
193e0 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 4f 70 65   P4 P5.**.** Ope
193f0 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  n a read-only cu
19400 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74  rsor for the dat
19410 61 62 61 73 65 20 74 61 62 6c 65 20 77 68 6f 73  abase table whos
19420 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 0a 2a  e root page is.*
19430 2a 20 50 32 20 69 6e 20 61 20 64 61 74 61 62 61  * P2 in a databa
19440 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 64 61  se file.  The da
19450 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 64  tabase file is d
19460 65 74 65 72 6d 69 6e 65 64 20 62 79 20 50 33 2e  etermined by P3.
19470 20 0a 2a 2a 20 50 33 3d 3d 30 20 6d 65 61 6e 73   .** P3==0 means
19480 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
19490 73 65 2c 20 50 33 3d 3d 31 20 6d 65 61 6e 73 20  se, P3==1 means 
194a0 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65  the database use
194b0 64 20 66 6f 72 20 0a 2a 2a 20 74 65 6d 70 6f 72  d for .** tempor
194c0 61 72 79 20 74 61 62 6c 65 73 2c 20 61 6e 64 20  ary tables, and 
194d0 50 33 3e 31 20 6d 65 61 6e 73 20 75 73 65 64 20  P3>1 means used 
194e0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
194f0 67 20 61 74 74 61 63 68 65 64 0a 2a 2a 20 64 61  g attached.** da
19500 74 61 62 61 73 65 2e 20 20 47 69 76 65 20 74 68  tabase.  Give th
19510 65 20 6e 65 77 20 63 75 72 73 6f 72 20 61 6e 20  e new cursor an 
19520 69 64 65 6e 74 69 66 69 65 72 20 6f 66 20 50 31  identifier of P1
19530 2e 20 20 54 68 65 20 50 31 0a 2a 2a 20 76 61 6c  .  The P1.** val
19540 75 65 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20  ues need not be 
19550 63 6f 6e 74 69 67 75 6f 75 73 20 62 75 74 20 61  contiguous but a
19560 6c 6c 20 50 31 20 76 61 6c 75 65 73 20 73 68 6f  ll P1 values sho
19570 75 6c 64 20 62 65 20 73 6d 61 6c 6c 20 69 6e 74  uld be small int
19580 65 67 65 72 73 2e 0a 2a 2a 20 49 74 20 69 73 20  egers..** It is 
19590 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 50 31 20  an error for P1 
195a0 74 6f 20 62 65 20 6e 65 67 61 74 69 76 65 2e 0a  to be negative..
195b0 2a 2a 0a 2a 2a 20 49 66 20 50 35 21 3d 30 20 74  **.** If P5!=0 t
195c0 68 65 6e 20 75 73 65 20 74 68 65 20 63 6f 6e 74  hen use the cont
195d0 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20  ent of register 
195e0 50 32 20 61 73 20 74 68 65 20 72 6f 6f 74 20 70  P2 as the root p
195f0 61 67 65 2c 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  age, not.** the 
19600 76 61 6c 75 65 20 6f 66 20 50 32 20 69 74 73 65  value of P2 itse
19610 6c 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  lf..**.** There 
19620 77 69 6c 6c 20 62 65 20 61 20 72 65 61 64 20 6c  will be a read l
19630 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
19640 61 73 65 20 77 68 65 6e 65 76 65 72 20 74 68 65  ase whenever the
19650 72 65 20 69 73 20 61 6e 0a 2a 2a 20 6f 70 65 6e  re is an.** open
19660 20 63 75 72 73 6f 72 2e 20 20 49 66 20 74 68 65   cursor.  If the
19670 20 64 61 74 61 62 61 73 65 20 77 61 73 20 75 6e   database was un
19680 6c 6f 63 6b 65 64 20 70 72 69 6f 72 20 74 6f 20  locked prior to 
19690 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
196a0 0a 2a 2a 20 74 68 65 6e 20 61 20 72 65 61 64 20  .** then a read 
196b0 6c 6f 63 6b 20 69 73 20 61 63 71 75 69 72 65 64  lock is acquired
196c0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73   as part of this
196d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 41   instruction.  A
196e0 20 72 65 61 64 0a 2a 2a 20 6c 6f 63 6b 20 61 6c   read.** lock al
196f0 6c 6f 77 73 20 6f 74 68 65 72 20 70 72 6f 63 65  lows other proce
19700 73 73 65 73 20 74 6f 20 72 65 61 64 20 74 68 65  sses to read the
19710 20 64 61 74 61 62 61 73 65 20 62 75 74 20 70 72   database but pr
19720 6f 68 69 62 69 74 73 0a 2a 2a 20 61 6e 79 20 6f  ohibits.** any o
19730 74 68 65 72 20 70 72 6f 63 65 73 73 20 66 72 6f  ther process fro
19740 6d 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  m modifying the 
19750 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72  database.  The r
19760 65 61 64 20 6c 6f 63 6b 20 69 73 0a 2a 2a 20 72  ead lock is.** r
19770 65 6c 65 61 73 65 64 20 77 68 65 6e 20 61 6c 6c  eleased when all
19780 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6c 6f   cursors are clo
19790 73 65 64 2e 20 20 49 66 20 74 68 69 73 20 69 6e  sed.  If this in
197a0 73 74 72 75 63 74 69 6f 6e 20 61 74 74 65 6d 70  struction attemp
197b0 74 73 0a 2a 2a 20 74 6f 20 67 65 74 20 61 20 72  ts.** to get a r
197c0 65 61 64 20 6c 6f 63 6b 20 62 75 74 20 66 61 69  ead lock but fai
197d0 6c 73 2c 20 74 68 65 20 73 63 72 69 70 74 20 74  ls, the script t
197e0 65 72 6d 69 6e 61 74 65 73 20 77 69 74 68 20 61  erminates with a
197f0 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  n.** SQLITE_BUSY
19800 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
19810 2a 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65 20  ** The P4 value 
19820 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 6e  may be either an
19830 20 69 6e 74 65 67 65 72 20 28 50 34 5f 49 4e 54   integer (P4_INT
19840 33 32 29 20 6f 72 20 61 20 70 6f 69 6e 74 65 72  32) or a pointer
19850 20 74 6f 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f   to.** a KeyInfo
19860 20 73 74 72 75 63 74 75 72 65 20 28 50 34 5f 4b   structure (P4_K
19870 45 59 49 4e 46 4f 29 2e 20 49 66 20 69 74 20 69  EYINFO). If it i
19880 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
19890 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
198a0 75 63 74 75 72 65 2c 20 74 68 65 6e 20 73 61 69  ucture, then sai
198b0 64 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69  d structure defi
198c0 6e 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nes the content 
198d0 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a  and collating .*
198e0 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  * sequence of th
198f0 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 6f 70  e index being op
19900 65 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ened. Otherwise,
19910 20 69 66 20 50 34 20 69 73 20 61 6e 20 69 6e 74   if P4 is an int
19920 65 67 65 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20  eger .** value, 
19930 69 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  it is set to the
19940 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
19950 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ns in the table.
19960 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
19970 4f 70 65 6e 57 72 69 74 65 2e 0a 2a 2f 0a 2f 2a  OpenWrite..*/./*
19980 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 57 72 69   Opcode: OpenWri
19990 74 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50  te P1 P2 P3 P4 P
199a0 35 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72  5.**.** Open a r
199b0 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72  ead/write cursor
199c0 20 6e 61 6d 65 64 20 50 31 20 6f 6e 20 74 68 65   named P1 on the
199d0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
199e0 77 68 6f 73 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  whose root.** pa
199f0 67 65 20 69 73 20 50 32 2e 20 20 4f 72 20 69 66  ge is P2.  Or if
19a00 20 50 35 21 3d 30 20 75 73 65 20 74 68 65 20 63   P5!=0 use the c
19a10 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74  ontent of regist
19a20 65 72 20 50 32 20 74 6f 20 66 69 6e 64 20 74 68  er P2 to find th
19a30 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 0a  e.** root page..
19a40 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 76 61 6c  **.** The P4 val
19a50 75 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  ue may be either
19a60 20 61 6e 20 69 6e 74 65 67 65 72 20 28 50 34 5f   an integer (P4_
19a70 49 4e 54 33 32 29 20 6f 72 20 61 20 70 6f 69 6e  INT32) or a poin
19a80 74 65 72 20 74 6f 0a 2a 2a 20 61 20 4b 65 79 49  ter to.** a KeyI
19a90 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 28 50  nfo structure (P
19aa0 34 5f 4b 45 59 49 4e 46 4f 29 2e 20 49 66 20 69  4_KEYINFO). If i
19ab0 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
19ac0 6f 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20  o a KeyInfo .** 
19ad0 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 20  structure, then 
19ae0 73 61 69 64 20 73 74 72 75 63 74 75 72 65 20 64  said structure d
19af0 65 66 69 6e 65 73 20 74 68 65 20 63 6f 6e 74 65  efines the conte
19b00 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  nt and collating
19b10 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66   .** sequence of
19b20 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
19b30 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65 72 77 69   opened. Otherwi
19b40 73 65 2c 20 69 66 20 50 34 20 69 73 20 61 6e 20  se, if P4 is an 
19b50 69 6e 74 65 67 65 72 20 0a 2a 2a 20 76 61 6c 75  integer .** valu
19b60 65 2c 20 69 74 20 69 73 20 73 65 74 20 74 6f 20  e, it is set to 
19b70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
19b80 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
19b90 6c 65 2c 20 6f 72 20 74 6f 20 74 68 65 0a 2a 2a  le, or to the.**
19ba0 20 6c 61 72 67 65 73 74 20 69 6e 64 65 78 20 6f   largest index o
19bb0 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  f any column of 
19bc0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
19bd0 73 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 2e  s actually used.
19be0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74  .**.** This inst
19bf0 72 75 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6a 75  ruction works ju
19c00 73 74 20 6c 69 6b 65 20 4f 70 65 6e 52 65 61 64  st like OpenRead
19c10 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20   except that it 
19c20 6f 70 65 6e 73 20 74 68 65 20 63 75 72 73 6f 72  opens the cursor
19c30 0a 2a 2a 20 69 6e 20 72 65 61 64 2f 77 72 69 74  .** in read/writ
19c40 65 20 6d 6f 64 65 2e 20 20 46 6f 72 20 61 20 67  e mode.  For a g
19c50 69 76 65 6e 20 74 61 62 6c 65 2c 20 74 68 65 72  iven table, ther
19c60 65 20 63 61 6e 20 62 65 20 6f 6e 65 20 6f 72 20  e can be one or 
19c70 6d 6f 72 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a  more read-only.*
19c80 2a 20 63 75 72 73 6f 72 73 20 6f 72 20 61 20 73  * cursors or a s
19c90 69 6e 67 6c 65 20 72 65 61 64 2f 77 72 69 74 65  ingle read/write
19ca0 20 63 75 72 73 6f 72 20 62 75 74 20 6e 6f 74 20   cursor but not 
19cb0 62 6f 74 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  both..**.** See 
19cc0 61 6c 73 6f 20 4f 70 65 6e 52 65 61 64 2e 0a 2a  also OpenRead..*
19cd0 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 52 65  /.case OP_OpenRe
19ce0 61 64 3a 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e  ad:.case OP_Open
19cf0 57 72 69 74 65 3a 20 7b 0a 20 20 69 6e 74 20 6e  Write: {.  int n
19d00 46 69 65 6c 64 3b 0a 20 20 4b 65 79 49 6e 66 6f  Field;.  KeyInfo
19d10 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e   *pKeyInfo;.  in
19d20 74 20 70 32 3b 0a 20 20 69 6e 74 20 69 44 62 3b  t p2;.  int iDb;
19d30 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 3b 0a 20  .  int wrFlag;. 
19d40 20 42 74 72 65 65 20 2a 70 58 3b 0a 20 20 56 64   Btree *pX;.  Vd
19d50 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  beCursor *pCur;.
19d60 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73    Db *pDb;..  as
19d70 73 65 72 74 28 20 28 70 4f 70 2d 3e 70 35 26 28  sert( (pOp->p5&(
19d80 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 7c 4f  OPFLAG_P2ISREG|O
19d90 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 29 29 3d  PFLAG_BULKCSR))=
19da0 3d 70 4f 70 2d 3e 70 35 20 29 3b 0a 20 20 61 73  =pOp->p5 );.  as
19db0 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
19dc0 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20  e==OP_OpenWrite 
19dd0 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 29 3b  || pOp->p5==0 );
19de0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49  .  assert( p->bI
19df0 73 52 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73  sReader );.  ass
19e00 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
19e10 3d 3d 4f 50 5f 4f 70 65 6e 52 65 61 64 20 7c 7c  ==OP_OpenRead ||
19e20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
19e30 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 65 78 70  );..  if( p->exp
19e40 69 72 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  ired ){.    rc =
19e50 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
19e60 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
19e70 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 70   nField = 0;.  p
19e80 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 70  KeyInfo = 0;.  p
19e90 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69  2 = pOp->p2;.  i
19ea0 44 62 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  Db = pOp->p3;.  
19eb0 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
19ec0 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
19ed0 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62  .  assert( (p->b
19ee0 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44  treeMask & (((yD
19ef0 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62 29 29 21  bMask)1)<<iDb))!
19f00 3d 30 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  =0 );.  pDb = &d
19f10 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
19f20 58 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20  X = pDb->pBt;.  
19f30 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
19f40 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
19f50 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65  de==OP_OpenWrite
19f60 20 29 7b 0a 20 20 20 20 77 72 46 6c 61 67 20 3d   ){.    wrFlag =
19f70 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   1;.    assert( 
19f80 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
19f90 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
19fa0 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 44  0) );.    if( pD
19fb0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
19fc0 5f 66 6f 72 6d 61 74 20 3c 20 70 2d 3e 6d 69 6e  _format < p->min
19fd0 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20  WriteFileFormat 
19fe0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 69 6e 57  ){.      p->minW
19ff0 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d  riteFileFormat =
1a000 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66   pDb->pSchema->f
1a010 69 6c 65 5f 66 6f 72 6d 61 74 3b 0a 20 20 20 20  ile_format;.    
1a020 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  }.  }else{.    w
1a030 72 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20  rFlag = 0;.  }. 
1a040 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f   if( pOp->p5 & O
1a050 50 46 4c 41 47 5f 50 32 49 53 52 45 47 20 29 7b  PFLAG_P2ISREG ){
1a060 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 32 3e  .    assert( p2>
1a070 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1a080 20 70 32 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a   p2<=p->nMem );.
1a090 20 20 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d      pIn2 = &aMem
1a0a0 5b 70 32 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  [p2];.    assert
1a0b0 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e  ( memIsValid(pIn
1a0c0 32 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  2) );.    assert
1a0d0 28 20 28 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26  ( (pIn2->flags &
1a0e0 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a   MEM_Int)!=0 );.
1a0f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1a100 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e  emIntegerify(pIn
1a110 32 29 3b 0a 20 20 20 20 70 32 20 3d 20 28 69 6e  2);.    p2 = (in
1a120 74 29 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20  t)pIn2->u.i;.   
1a130 20 2f 2a 20 54 68 65 20 70 32 20 76 61 6c 75 65   /* The p2 value
1a140 20 61 6c 77 61 79 73 20 63 6f 6d 65 73 20 66 72   always comes fr
1a150 6f 6d 20 61 20 70 72 69 6f 72 20 4f 50 5f 43 72  om a prior OP_Cr
1a160 65 61 74 65 54 61 62 6c 65 20 6f 70 63 6f 64 65  eateTable opcode
1a170 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 61 74   and.    ** that
1a180 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 61 6c 77   opcode will alw
1a190 61 79 73 20 73 65 74 20 74 68 65 20 70 32 20 76  ays set the p2 v
1a1a0 61 6c 75 65 20 74 6f 20 32 20 6f 72 20 6d 6f 72  alue to 2 or mor
1a1b0 65 20 6f 72 20 65 6c 73 65 20 66 61 69 6c 2e 0a  e or else fail..
1a1c0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
1a1d0 77 65 72 65 20 61 20 66 61 69 6c 75 72 65 2c 20  were a failure, 
1a1e0 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
1a1f0 74 65 6d 65 6e 74 20 77 6f 75 6c 64 20 68 61 76  tement would hav
1a200 65 20 68 61 6c 74 65 64 0a 20 20 20 20 2a 2a 20  e halted.    ** 
1a210 62 65 66 6f 72 65 20 72 65 61 63 68 69 6e 67 20  before reaching 
1a220 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
1a230 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56  . */.    if( NEV
1a240 45 52 28 70 32 3c 32 29 20 29 20 7b 0a 20 20 20  ER(p2<2) ) {.   
1a250 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1a260 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1a270 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
1a280 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
1a290 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d  }.  }.  if( pOp-
1a2a0 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49  >p4type==P4_KEYI
1a2b0 4e 46 4f 20 29 7b 0a 20 20 20 20 70 4b 65 79 49  NFO ){.    pKeyI
1a2c0 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  nfo = pOp->p4.pK
1a2d0 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79  eyInfo;.    pKey
1a2e0 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  Info->enc = ENC(
1a2f0 70 2d 3e 64 62 29 3b 0a 20 20 20 20 6e 46 69 65  p->db);.    nFie
1a300 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
1a310 46 69 65 6c 64 2b 31 3b 0a 20 20 7d 65 6c 73 65  Field+1;.  }else
1a320 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
1a330 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20  ==P4_INT32 ){.  
1a340 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e    nField = pOp->
1a350 70 34 2e 69 3b 0a 20 20 7d 0a 20 20 61 73 73 65  p4.i;.  }.  asse
1a360 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29  rt( pOp->p1>=0 )
1a370 3b 0a 20 20 70 43 75 72 20 3d 20 61 6c 6c 6f 63  ;.  pCur = alloc
1a380 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70  ateCursor(p, pOp
1a390 2d 3e 70 31 2c 20 6e 46 69 65 6c 64 2c 20 69 44  ->p1, nField, iD
1a3a0 62 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 75  b, 1);.  if( pCu
1a3b0 72 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  r==0 ) goto no_m
1a3c0 65 6d 3b 0a 20 20 70 43 75 72 2d 3e 6e 75 6c 6c  em;.  pCur->null
1a3d0 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 75 72 2d  Row = 1;.  pCur-
1a3e0 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a  >isOrdered = 1;.
1a3f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1a400 72 65 65 43 75 72 73 6f 72 28 70 58 2c 20 70 32  reeCursor(pX, p2
1a410 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e  , wrFlag, pKeyIn
1a420 66 6f 2c 20 70 43 75 72 2d 3e 70 43 75 72 73 6f  fo, pCur->pCurso
1a430 72 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  r);.  pCur->pKey
1a440 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
1a450 0a 20 20 61 73 73 65 72 74 28 20 4f 50 46 4c 41  .  assert( OPFLA
1a460 47 5f 42 55 4c 4b 43 53 52 3d 3d 42 54 52 45 45  G_BULKCSR==BTREE
1a470 5f 42 55 4c 4b 4c 4f 41 44 20 29 3b 0a 20 20 73  _BULKLOAD );.  s
1a480 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1a490 72 48 69 6e 74 73 28 70 43 75 72 2d 3e 70 43 75  rHints(pCur->pCu
1a4a0 72 73 6f 72 2c 20 28 70 4f 70 2d 3e 70 35 20 26  rsor, (pOp->p5 &
1a4b0 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 29   OPFLAG_BULKCSR)
1a4c0 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65 20 69  );..  /* Since i
1a4d0 74 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20 6d 65  t performs no me
1a4e0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1a4f0 6f 72 20 49 4f 2c 20 74 68 65 20 6f 6e 6c 79 20  or IO, the only 
1a500 76 61 6c 75 65 20 74 68 61 74 0a 20 20 2a 2a 20  value that.  ** 
1a510 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1a520 6f 72 28 29 20 6d 61 79 20 72 65 74 75 72 6e 20  or() may return 
1a530 69 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 2a 2f  is SQLITE_OK. */
1a540 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
1a550 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f  QLITE_OK );..  /
1a560 2a 20 53 65 74 20 74 68 65 20 56 64 62 65 43 75  * Set the VdbeCu
1a570 72 73 6f 72 2e 69 73 54 61 62 6c 65 20 61 6e 64  rsor.isTable and
1a580 20 69 73 49 6e 64 65 78 20 76 61 72 69 61 62 6c   isIndex variabl
1a590 65 73 2e 20 50 72 65 76 69 6f 75 73 20 76 65 72  es. Previous ver
1a5a0 73 69 6f 6e 73 20 6f 66 0a 20 20 2a 2a 20 53 51  sions of.  ** SQ
1a5b0 4c 69 74 65 20 75 73 65 64 20 74 6f 20 63 68 65  Lite used to che
1a5c0 63 6b 20 69 66 20 74 68 65 20 72 6f 6f 74 2d 70  ck if the root-p
1a5d0 61 67 65 20 66 6c 61 67 73 20 77 65 72 65 20 73  age flags were s
1a5e0 61 6e 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ane at this poin
1a5f0 74 0a 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72  t.  ** and repor
1a600 74 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  t database corru
1a610 70 74 69 6f 6e 20 69 66 20 74 68 65 79 20 77 65  ption if they we
1a620 72 65 20 6e 6f 74 2c 20 62 75 74 20 74 68 69 73  re not, but this
1a630 20 63 68 65 63 6b 20 68 61 73 0a 20 20 2a 2a 20   check has.  ** 
1a640 73 69 6e 63 65 20 6d 6f 76 65 64 20 69 6e 74 6f  since moved into
1a650 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
1a660 2e 20 20 2a 2f 20 20 0a 20 20 70 43 75 72 2d 3e  .  */  .  pCur->
1a670 69 73 54 61 62 6c 65 20 3d 20 70 4f 70 2d 3e 70  isTable = pOp->p
1a680 34 74 79 70 65 21 3d 50 34 5f 4b 45 59 49 4e 46  4type!=P4_KEYINF
1a690 4f 3b 0a 20 20 70 43 75 72 2d 3e 69 73 49 6e 64  O;.  pCur->isInd
1a6a0 65 78 20 3d 20 21 70 43 75 72 2d 3e 69 73 54 61  ex = !pCur->isTa
1a6b0 62 6c 65 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ble;.  break;.}.
1a6c0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e  ./* Opcode: Open
1a6d0 45 70 68 65 6d 65 72 61 6c 20 50 31 20 50 32 20  Ephemeral P1 P2 
1a6e0 2a 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 4f 70  * P4 P5.**.** Op
1a6f0 65 6e 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  en a new cursor 
1a700 50 31 20 74 6f 20 61 20 74 72 61 6e 73 69 65 6e  P1 to a transien
1a710 74 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20  t table..** The 
1a720 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
1a730 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69   opened read/wri
1a740 74 65 20 65 76 65 6e 20 69 66 20 0a 2a 2a 20 74  te even if .** t
1a750 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1a760 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20   is read-only.  
1a770 54 68 65 20 65 70 68 65 6d 65 72 61 6c 0a 2a 2a  The ephemeral.**
1a780 20 74 61 62 6c 65 20 69 73 20 64 65 6c 65 74 65   table is delete
1a790 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
1a7a0 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  when the cursor 
1a7b0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
1a7c0 20 50 32 20 69 73 20 74 68 65 20 6e 75 6d 62 65   P2 is the numbe
1a7d0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
1a7e0 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
1a7f0 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73  ble..** The curs
1a800 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 42  or points to a B
1a810 54 72 65 65 20 74 61 62 6c 65 20 69 66 20 50 34  Tree table if P4
1a820 3d 3d 30 20 61 6e 64 20 74 6f 20 61 20 42 54 72  ==0 and to a BTr
1a830 65 65 20 69 6e 64 65 78 0a 2a 2a 20 69 66 20 50  ee index.** if P
1a840 34 20 69 73 20 6e 6f 74 20 30 2e 20 20 49 66 20  4 is not 0.  If 
1a850 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  P4 is not NULL, 
1a860 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b  it points to a K
1a870 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
1a880 0a 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 73  .** that defines
1a890 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 6b   the format of k
1a8a0 65 79 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  eys in the index
1a8b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
1a8c0 6f 64 65 20 77 61 73 20 6f 6e 63 65 20 63 61 6c  ode was once cal
1a8d0 6c 65 64 20 4f 70 65 6e 54 65 6d 70 2e 20 20 42  led OpenTemp.  B
1a8e0 75 74 20 74 68 61 74 20 63 72 65 61 74 65 64 0a  ut that created.
1a8f0 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 62 65 63  ** confusion bec
1a900 61 75 73 65 20 74 68 65 20 74 65 72 6d 20 22 74  ause the term "t
1a910 65 6d 70 20 74 61 62 6c 65 22 2c 20 6d 69 67 68  emp table", migh
1a920 74 20 72 65 66 65 72 20 65 69 74 68 65 72 0a 2a  t refer either.*
1a930 2a 20 74 6f 20 61 20 54 45 4d 50 20 74 61 62 6c  * to a TEMP tabl
1a940 65 20 61 74 20 74 68 65 20 53 51 4c 20 6c 65 76  e at the SQL lev
1a950 65 6c 2c 20 6f 72 20 74 6f 20 61 20 74 61 62 6c  el, or to a tabl
1a960 65 20 6f 70 65 6e 65 64 20 62 79 0a 2a 2a 20 74  e opened by.** t
1a970 68 69 73 20 6f 70 63 6f 64 65 2e 20 20 54 68 65  his opcode.  The
1a980 6e 20 74 68 69 73 20 6f 70 63 6f 64 65 20 77 61  n this opcode wa
1a990 73 20 63 61 6c 6c 20 4f 70 65 6e 56 69 72 74 75  s call OpenVirtu
1a9a0 61 6c 2e 20 20 42 75 74 0a 2a 2a 20 74 68 61 74  al.  But.** that
1a9b0 20 63 72 65 61 74 65 64 20 63 6f 6e 66 75 73 69   created confusi
1a9c0 6f 6e 20 77 69 74 68 20 74 68 65 20 77 68 6f 6c  on with the whol
1a9d0 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20  e virtual-table 
1a9e0 69 64 65 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  idea..**.** The 
1a9f0 50 35 20 70 61 72 61 6d 65 74 65 72 20 63 61 6e  P5 parameter can
1aa00 20 62 65 20 61 20 6d 61 73 6b 20 6f 66 20 74 68   be a mask of th
1aa10 65 20 42 54 52 45 45 5f 2a 20 66 6c 61 67 73 20  e BTREE_* flags 
1aa20 64 65 66 69 6e 65 64 0a 2a 2a 20 69 6e 20 62 74  defined.** in bt
1aa30 72 65 65 2e 68 2e 20 20 54 68 65 73 65 20 66 6c  ree.h.  These fl
1aa40 61 67 73 20 63 6f 6e 74 72 6f 6c 20 61 73 70 65  ags control aspe
1aa50 63 74 73 20 6f 66 20 74 68 65 20 6f 70 65 72 61  cts of the opera
1aa60 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 62  tion of.** the b
1aa70 74 72 65 65 2e 20 20 54 68 65 20 42 54 52 45 45  tree.  The BTREE
1aa80 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e  _OMIT_JOURNAL an
1aa90 64 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 66  d BTREE_SINGLE f
1aaa0 6c 61 67 73 20 61 72 65 0a 2a 2a 20 61 64 64 65  lags are.** adde
1aab0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  d automatically.
1aac0 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .*/./* Opcode: O
1aad0 70 65 6e 41 75 74 6f 69 6e 64 65 78 20 50 31 20  penAutoindex P1 
1aae0 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  P2 * P4 *.**.** 
1aaf0 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b  This opcode work
1ab00 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 4f 50  s the same as OP
1ab10 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2e 20  _OpenEphemeral. 
1ab20 20 49 74 20 68 61 73 20 61 0a 2a 2a 20 64 69 66   It has a.** dif
1ab30 66 65 72 65 6e 74 20 6e 61 6d 65 20 74 6f 20 64  ferent name to d
1ab40 69 73 74 69 6e 67 75 69 73 68 20 69 74 73 20 75  istinguish its u
1ab50 73 65 2e 20 20 54 61 62 6c 65 73 20 63 72 65 61  se.  Tables crea
1ab60 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 62 79 20  ted using.** by 
1ab70 74 68 69 73 20 6f 70 63 6f 64 65 20 77 69 6c 6c  this opcode will
1ab80 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 75 74   be used for aut
1ab90 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74  omatically creat
1aba0 65 64 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20  ed transient.** 
1abb0 69 6e 64 69 63 65 73 20 69 6e 20 6a 6f 69 6e 73  indices in joins
1abc0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65  ..*/.case OP_Ope
1abd0 6e 41 75 74 6f 69 6e 64 65 78 3a 20 0a 63 61 73  nAutoindex: .cas
1abe0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
1abf0 61 6c 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73  al: {.  VdbeCurs
1ac00 6f 72 20 2a 70 43 78 3b 0a 20 20 73 74 61 74 69  or *pCx;.  stati
1ac10 63 20 63 6f 6e 73 74 20 69 6e 74 20 76 66 73 46  c const int vfsF
1ac20 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20 53 51  lags = .      SQ
1ac30 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1ac40 49 54 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49  ITE |.      SQLI
1ac50 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
1ac60 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  .      SQLITE_OP
1ac70 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
1ac80 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1ac90 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c  _DELETEONCLOSE |
1aca0 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  .      SQLITE_OP
1acb0 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 3b  EN_TRANSIENT_DB;
1acc0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
1acd0 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20  >p1>=0 );.  pCx 
1ace0 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  = allocateCursor
1acf0 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  (p, pOp->p1, pOp
1ad00 2d 3e 70 32 2c 20 2d 31 2c 20 31 29 3b 0a 20 20  ->p2, -1, 1);.  
1ad10 69 66 28 20 70 43 78 3d 3d 30 20 29 20 67 6f 74  if( pCx==0 ) got
1ad20 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d  o no_mem;.  pCx-
1ad30 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
1ad40 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1ad50 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20  eOpen(db->pVfs, 
1ad60 30 2c 20 64 62 2c 20 26 70 43 78 2d 3e 70 42 74  0, db, &pCx->pBt
1ad70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1ad80 20 20 20 20 20 20 20 20 20 20 20 42 54 52 45 45             BTREE
1ad90 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 7c 20  _OMIT_JOURNAL | 
1ada0 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 7c 20 70  BTREE_SINGLE | p
1adb0 4f 70 2d 3e 70 35 2c 20 76 66 73 46 6c 61 67 73  Op->p5, vfsFlags
1adc0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1add0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1ade0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
1adf0 65 67 69 6e 54 72 61 6e 73 28 70 43 78 2d 3e 70  eginTrans(pCx->p
1ae00 42 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66  Bt, 1);.  }.  if
1ae10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ae20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  ){.    /* If a t
1ae30 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 69  ransient index i
1ae40 73 20 72 65 71 75 69 72 65 64 2c 20 63 72 65 61  s required, crea
1ae50 74 65 20 69 74 20 62 79 20 63 61 6c 6c 69 6e 67  te it by calling
1ae60 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42  .    ** sqlite3B
1ae70 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
1ae80 29 20 77 69 74 68 20 74 68 65 20 42 54 52 45 45  ) with the BTREE
1ae90 5f 42 4c 4f 42 4b 45 59 20 66 6c 61 67 20 62 65  _BLOBKEY flag be
1aea0 66 6f 72 65 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  fore.    ** open
1aeb0 69 6e 67 20 69 74 2e 20 49 66 20 61 20 74 72 61  ing it. If a tra
1aec0 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 69 73 20  nsient table is 
1aed0 72 65 71 75 69 72 65 64 2c 20 6a 75 73 74 20 75  required, just u
1aee0 73 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 61 75  se the.    ** au
1aef0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61  tomatically crea
1af00 74 65 64 20 74 61 62 6c 65 20 77 69 74 68 20 72  ted table with r
1af10 6f 6f 74 2d 70 61 67 65 20 31 20 28 61 6e 20 42  oot-page 1 (an B
1af20 4c 4f 42 5f 49 4e 54 4b 45 59 20 74 61 62 6c 65  LOB_INTKEY table
1af30 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
1af40 28 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  ( pOp->p4.pKeyIn
1af50 66 6f 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  fo ){.      int 
1af60 70 67 6e 6f 3b 0a 20 20 20 20 20 20 61 73 73 65  pgno;.      asse
1af70 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
1af80 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a 20  =P4_KEYINFO );. 
1af90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1afa0 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
1afb0 65 28 70 43 78 2d 3e 70 42 74 2c 20 26 70 67 6e  e(pCx->pBt, &pgn
1afc0 6f 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59  o, BTREE_BLOBKEY
1afd0 20 7c 20 70 4f 70 2d 3e 70 35 29 3b 20 0a 20 20   | pOp->p5); .  
1afe0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1aff0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b000 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d 4d   assert( pgno==M
1b010 41 53 54 45 52 5f 52 4f 4f 54 2b 31 20 29 3b 0a  ASTER_ROOT+1 );.
1b020 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1b030 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
1b040 70 43 78 2d 3e 70 42 74 2c 20 70 67 6e 6f 2c 20  pCx->pBt, pgno, 
1b050 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  1, .            
1b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b070 20 20 20 20 28 4b 65 79 49 6e 66 6f 2a 29 70 4f      (KeyInfo*)pO
1b080 70 2d 3e 70 34 2e 7a 2c 20 70 43 78 2d 3e 70 43  p->p4.z, pCx->pC
1b090 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
1b0a0 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  pCx->pKeyInfo = 
1b0b0 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
1b0c0 3b 0a 20 20 20 20 20 20 20 20 70 43 78 2d 3e 70  ;.        pCx->p
1b0d0 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45  KeyInfo->enc = E
1b0e0 4e 43 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  NC(p->db);.     
1b0f0 20 7d 0a 20 20 20 20 20 20 70 43 78 2d 3e 69 73   }.      pCx->is
1b100 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d  Table = 0;.    }
1b110 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1b120 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1b130 73 6f 72 28 70 43 78 2d 3e 70 42 74 2c 20 4d 41  sor(pCx->pBt, MA
1b140 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 30 2c  STER_ROOT, 1, 0,
1b150 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a   pCx->pCursor);.
1b160 20 20 20 20 20 20 70 43 78 2d 3e 69 73 54 61 62        pCx->isTab
1b170 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  le = 1;.    }.  
1b180 7d 0a 20 20 70 43 78 2d 3e 69 73 4f 72 64 65 72  }.  pCx->isOrder
1b190 65 64 20 3d 20 28 70 4f 70 2d 3e 70 35 21 3d 42  ed = (pOp->p5!=B
1b1a0 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
1b1b0 0a 20 20 70 43 78 2d 3e 69 73 49 6e 64 65 78 20  .  pCx->isIndex 
1b1c0 3d 20 21 70 43 78 2d 3e 69 73 54 61 62 6c 65 3b  = !pCx->isTable;
1b1d0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
1b1e0 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65 72 4f 70  Opcode: SorterOp
1b1f0 65 6e 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a  en P1 P2 * P4 *.
1b200 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
1b210 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 4f 50 5f  e works like OP_
1b220 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 65 78  OpenEphemeral ex
1b230 63 65 70 74 20 74 68 61 74 20 69 74 20 6f 70 65  cept that it ope
1b240 6e 73 0a 2a 2a 20 61 20 74 72 61 6e 73 69 65 6e  ns.** a transien
1b250 74 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  t index that is 
1b260 73 70 65 63 69 66 69 63 61 6c 6c 79 20 64 65 73  specifically des
1b270 69 67 6e 65 64 20 74 6f 20 73 6f 72 74 20 6c 61  igned to sort la
1b280 72 67 65 0a 2a 2a 20 74 61 62 6c 65 73 20 75 73  rge.** tables us
1b290 69 6e 67 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  ing an external 
1b2a0 6d 65 72 67 65 2d 73 6f 72 74 20 61 6c 67 6f 72  merge-sort algor
1b2b0 69 74 68 6d 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ithm..*/.case OP
1b2c0 5f 53 6f 72 74 65 72 4f 70 65 6e 3a 20 7b 0a 20  _SorterOpen: {. 
1b2d0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78   VdbeCursor *pCx
1b2e0 3b 0a 0a 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63  ;..  pCx = alloc
1b2f0 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70  ateCursor(p, pOp
1b300 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d  ->p1, pOp->p2, -
1b310 31 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 78  1, 1);.  if( pCx
1b320 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
1b330 6d 3b 0a 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e  m;.  pCx->pKeyIn
1b340 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  fo = pOp->p4.pKe
1b350 79 49 6e 66 6f 3b 0a 20 20 70 43 78 2d 3e 70 4b  yInfo;.  pCx->pK
1b360 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e  eyInfo->enc = EN
1b370 43 28 70 2d 3e 64 62 29 3b 0a 20 20 70 43 78 2d  C(p->db);.  pCx-
1b380 3e 69 73 53 6f 72 74 65 72 20 3d 20 31 3b 0a 20  >isSorter = 1;. 
1b390 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
1b3a0 65 53 6f 72 74 65 72 49 6e 69 74 28 64 62 2c 20  eSorterInit(db, 
1b3b0 70 43 78 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  pCx);.  break;.}
1b3c0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65  ../* Opcode: Ope
1b3d0 6e 50 73 65 75 64 6f 20 50 31 20 50 32 20 50 33  nPseudo P1 P2 P3
1b3e0 20 2a 20 50 35 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e   * P5.**.** Open
1b3f0 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 74 68   a new cursor th
1b400 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66  at points to a f
1b410 61 6b 65 20 74 61 62 6c 65 20 74 68 61 74 20 63  ake table that c
1b420 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65  ontains a single
1b430 0a 2a 2a 20 72 6f 77 20 6f 66 20 64 61 74 61 2e  .** row of data.
1b440 20 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66    The content of
1b450 20 74 68 61 74 20 6f 6e 65 20 72 6f 77 20 69 6e   that one row in
1b460 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1b470 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 73 74  memory.** regist
1b480 65 72 20 50 32 20 77 68 65 6e 20 50 35 3d 3d 30  er P2 when P5==0
1b490 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1b4a0 73 2c 20 63 75 72 73 6f 72 20 50 31 20 62 65 63  s, cursor P1 bec
1b4b0 6f 6d 65 73 20 61 6e 20 61 6c 69 61 73 20 66 6f  omes an alias fo
1b4c0 72 20 74 68 65 20 0a 2a 2a 20 4d 45 4d 5f 42 6c  r the .** MEM_Bl
1b4d0 6f 62 20 63 6f 6e 74 65 6e 74 20 63 6f 6e 74 61  ob content conta
1b4e0 69 6e 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ined in register
1b4f0 20 50 32 2e 20 20 57 68 65 6e 20 50 35 3d 3d 31   P2.  When P5==1
1b500 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 72 6f  , then the.** ro
1b510 77 20 69 73 20 72 65 70 72 65 73 65 6e 74 65 64  w is represented
1b520 20 62 79 20 50 33 20 63 6f 6e 73 65 63 75 74 69   by P3 consecuti
1b530 76 65 20 72 65 67 69 73 74 65 72 73 20 62 65 67  ve registers beg
1b540 69 6e 6e 69 6e 67 20 77 69 74 68 20 50 32 2e 0a  inning with P2..
1b550 2a 2a 0a 2a 2a 20 41 20 70 73 65 75 64 6f 2d 74  **.** A pseudo-t
1b560 61 62 6c 65 20 63 72 65 61 74 65 64 20 62 79 20  able created by 
1b570 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 75  this opcode is u
1b580 73 65 64 20 74 6f 20 68 6f 6c 64 20 61 20 73 69  sed to hold a si
1b590 6e 67 6c 65 0a 2a 2a 20 72 6f 77 20 6f 75 74 70  ngle.** row outp
1b5a0 75 74 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74  ut from the sort
1b5b0 65 72 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  er so that the r
1b5c0 6f 77 20 63 61 6e 20 62 65 20 64 65 63 6f 6d 70  ow can be decomp
1b5d0 6f 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 69 6e 64  osed into.** ind
1b5e0 69 76 69 64 75 61 6c 20 63 6f 6c 75 6d 6e 73 20  ividual columns 
1b5f0 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 43 6f 6c  using the OP_Col
1b600 75 6d 6e 20 6f 70 63 6f 64 65 2e 20 20 54 68 65  umn opcode.  The
1b610 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64   OP_Column opcod
1b620 65 0a 2a 2a 20 69 73 20 74 68 65 20 6f 6e 6c 79  e.** is the only
1b630 20 63 75 72 73 6f 72 20 6f 70 63 6f 64 65 20 74   cursor opcode t
1b640 68 61 74 20 77 6f 72 6b 73 20 77 69 74 68 20 61  hat works with a
1b650 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a   pseudo-table..*
1b660 2a 0a 2a 2a 20 50 33 20 69 73 20 74 68 65 20 6e  *.** P3 is the n
1b670 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
1b680 69 6e 20 74 68 65 20 72 65 63 6f 72 64 73 20 74  in the records t
1b690 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  hat will be stor
1b6a0 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 73 65  ed by.** the pse
1b6b0 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61  udo-table..*/.ca
1b6c0 73 65 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  se OP_OpenPseudo
1b6d0 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
1b6e0 20 2a 70 43 78 3b 0a 0a 20 20 61 73 73 65 72 74   *pCx;..  assert
1b6f0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a  ( pOp->p1>=0 );.
1b700 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65    pCx = allocate
1b710 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70  Cursor(p, pOp->p
1b720 31 2c 20 70 4f 70 2d 3e 70 33 2c 20 2d 31 2c 20  1, pOp->p3, -1, 
1b730 30 29 3b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  0);.  if( pCx==0
1b740 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
1b750 20 20 70 43 78 2d 3e 6e 75 6c 6c 52 6f 77 20 3d    pCx->nullRow =
1b760 20 31 3b 0a 20 20 70 43 78 2d 3e 70 73 65 75 64   1;.  pCx->pseud
1b770 6f 54 61 62 6c 65 52 65 67 20 3d 20 70 4f 70 2d  oTableReg = pOp-
1b780 3e 70 32 3b 0a 20 20 70 43 78 2d 3e 69 73 54 61  >p2;.  pCx->isTa
1b790 62 6c 65 20 3d 20 31 3b 0a 20 20 70 43 78 2d 3e  ble = 1;.  pCx->
1b7a0 69 73 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70  isIndex = 0;.  p
1b7b0 43 78 2d 3e 6d 75 6c 74 69 50 73 65 75 64 6f 20  Cx->multiPseudo 
1b7c0 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 62 72 65  = pOp->p5;.  bre
1b7d0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1b7e0 3a 20 43 6c 6f 73 65 20 50 31 20 2a 20 2a 20 2a  : Close P1 * * *
1b7f0 20 2a 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61   *.**.** Close a
1b800 20 63 75 72 73 6f 72 20 70 72 65 76 69 6f 75 73   cursor previous
1b810 6c 79 20 6f 70 65 6e 65 64 20 61 73 20 50 31 2e  ly opened as P1.
1b820 20 20 49 66 20 50 31 20 69 73 20 6e 6f 74 0a 2a    If P1 is not.*
1b830 2a 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  * currently open
1b840 2c 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  , this instructi
1b850 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
1b860 2f 0a 63 61 73 65 20 4f 50 5f 43 6c 6f 73 65 3a  /.case OP_Close:
1b870 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70   {.  assert( pOp
1b880 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
1b890 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
1b8a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  .  sqlite3VdbeFr
1b8b0 65 65 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61  eeCursor(p, p->a
1b8c0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 29 3b 0a  pCsr[pOp->p1]);.
1b8d0 20 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e    p->apCsr[pOp->
1b8e0 70 31 5d 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b  p1] = 0;.  break
1b8f0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1b900 53 65 65 6b 47 65 20 50 31 20 50 32 20 50 33 20  SeekGe P1 P2 P3 
1b910 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75  P4 *.**.** If cu
1b920 72 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 74  rsor P1 refers t
1b930 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28  o an SQL table (
1b940 42 2d 54 72 65 65 20 74 68 61 74 20 75 73 65 73  B-Tree that uses
1b950 20 69 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20   integer keys), 
1b960 0a 2a 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75  .** use the valu
1b970 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  e in register P3
1b980 20 61 73 20 74 68 65 20 6b 65 79 2e 20 20 49 66   as the key.  If
1b990 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72   cursor P1 refer
1b9a0 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20  s .** to an SQL 
1b9b0 69 6e 64 65 78 2c 20 74 68 65 6e 20 50 33 20 69  index, then P3 i
1b9c0 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  s the first in a
1b9d0 6e 20 61 72 72 61 79 20 6f 66 20 50 34 20 72 65  n array of P4 re
1b9e0 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74  gisters .** that
1b9f0 20 61 72 65 20 75 73 65 64 20 61 73 20 61 6e 20   are used as an 
1ba00 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  unpacked index k
1ba10 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73  ey. .**.** Repos
1ba20 69 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20  ition cursor P1 
1ba30 73 6f 20 74 68 61 74 20 20 69 74 20 70 6f 69 6e  so that  it poin
1ba40 74 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65  ts to the smalle
1ba50 73 74 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a  st entry that .*
1ba60 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
1ba70 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
1ba80 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20  e key value. If 
1ba90 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63  there are no rec
1baa0 6f 72 64 73 20 0a 2a 2a 20 67 72 65 61 74 65 72  ords .** greater
1bab0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1bac0 6f 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32  o the key and P2
1bad0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
1bae0 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a  en jump to P2..*
1baf0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46  *.** See also: F
1bb00 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20  ound, NotFound, 
1bb10 44 69 73 74 69 6e 63 74 2c 20 53 65 65 6b 4c 74  Distinct, SeekLt
1bb20 2c 20 53 65 65 6b 47 74 2c 20 53 65 65 6b 4c 65  , SeekGt, SeekLe
1bb30 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .*/./* Opcode: S
1bb40 65 65 6b 47 74 20 50 31 20 50 32 20 50 33 20 50  eekGt P1 P2 P3 P
1bb50 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72  4 *.**.** If cur
1bb60 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f  sor P1 refers to
1bb70 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42   an SQL table (B
1bb80 2d 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20  -Tree that uses 
1bb90 69 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a  integer keys), .
1bba0 2a 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65  ** use the value
1bbb0 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20   in register P3 
1bbc0 61 73 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72  as a key. If cur
1bbd0 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a  sor P1 refers .*
1bbe0 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  * to an SQL inde
1bbf0 78 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68  x, then P3 is th
1bc00 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
1bc10 72 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74  ray of P4 regist
1bc20 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65  ers .** that are
1bc30 20 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61   used as an unpa
1bc40 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20  cked index key. 
1bc50 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f  .**.** Repositio
1bc60 6e 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74  n cursor P1 so t
1bc70 68 61 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74  hat  it points t
1bc80 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 65  o the smallest e
1bc90 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73  ntry that .** is
1bca0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1bcb0 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20  e key value. If 
1bcc0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63  there are no rec
1bcd0 6f 72 64 73 20 67 72 65 61 74 65 72 20 74 68 61  ords greater tha
1bce0 6e 20 0a 2a 2a 20 74 68 65 20 6b 65 79 20 61 6e  n .** the key an
1bcf0 64 20 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f  d P2 is not zero
1bd00 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50  , then jump to P
1bd10 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  2..**.** See als
1bd20 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75  o: Found, NotFou
1bd30 6e 64 2c 20 44 69 73 74 69 6e 63 74 2c 20 53 65  nd, Distinct, Se
1bd40 65 6b 4c 74 2c 20 53 65 65 6b 47 65 2c 20 53 65  ekLt, SeekGe, Se
1bd50 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ekLe.*/./* Opcod
1bd60 65 3a 20 53 65 65 6b 4c 74 20 50 31 20 50 32 20  e: SeekLt P1 P2 
1bd70 50 33 20 50 34 20 2a 20 0a 2a 2a 0a 2a 2a 20 49  P3 P4 * .**.** I
1bd80 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65  f cursor P1 refe
1bd90 72 73 20 74 6f 20 61 6e 20 53 51 4c 20 74 61 62  rs to an SQL tab
1bda0 6c 65 20 28 42 2d 54 72 65 65 20 74 68 61 74 20  le (B-Tree that 
1bdb0 75 73 65 73 20 69 6e 74 65 67 65 72 20 6b 65 79  uses integer key
1bdc0 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65 20  s), .** use the 
1bdd0 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
1bde0 72 20 50 33 20 61 73 20 61 20 6b 65 79 2e 20 49  r P3 as a key. I
1bdf0 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65  f cursor P1 refe
1be00 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c  rs .** to an SQL
1be10 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 50 33 20   index, then P3 
1be20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  is the first in 
1be30 61 6e 20 61 72 72 61 79 20 6f 66 20 50 34 20 72  an array of P4 r
1be40 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61  egisters .** tha
1be50 74 20 61 72 65 20 75 73 65 64 20 61 73 20 61 6e  t are used as an
1be60 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
1be70 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f  key. .**.** Repo
1be80 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31  sition cursor P1
1be90 20 73 6f 20 74 68 61 74 20 20 69 74 20 70 6f 69   so that  it poi
1bea0 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 72 67 65  nts to the large
1beb0 73 74 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a  st entry that .*
1bec0 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74  * is less than t
1bed0 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66  he key value. If
1bee0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65   there are no re
1bef0 63 6f 72 64 73 20 6c 65 73 73 20 74 68 61 6e 20  cords less than 
1bf00 0a 2a 2a 20 74 68 65 20 6b 65 79 20 61 6e 64 20  .** the key and 
1bf10 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  P2 is not zero, 
1bf20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e  then jump to P2.
1bf30 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
1bf40 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64   Found, NotFound
1bf50 2c 20 44 69 73 74 69 6e 63 74 2c 20 53 65 65 6b  , Distinct, Seek
1bf60 47 74 2c 20 53 65 65 6b 47 65 2c 20 53 65 65 6b  Gt, SeekGe, Seek
1bf70 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  Le.*/./* Opcode:
1bf80 20 53 65 65 6b 4c 65 20 50 31 20 50 32 20 50 33   SeekLe P1 P2 P3
1bf90 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 63   P4 *.**.** If c
1bfa0 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73 20  ursor P1 refers 
1bfb0 74 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20  to an SQL table 
1bfc0 28 42 2d 54 72 65 65 20 74 68 61 74 20 75 73 65  (B-Tree that use
1bfd0 73 20 69 6e 74 65 67 65 72 20 6b 65 79 73 29 2c  s integer keys),
1bfe0 20 0a 2a 2a 20 75 73 65 20 74 68 65 20 76 61 6c   .** use the val
1bff0 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
1c000 33 20 61 73 20 61 20 6b 65 79 2e 20 49 66 20 63  3 as a key. If c
1c010 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73 20  ursor P1 refers 
1c020 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e  .** to an SQL in
1c030 64 65 78 2c 20 74 68 65 6e 20 50 33 20 69 73 20  dex, then P3 is 
1c040 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
1c050 61 72 72 61 79 20 6f 66 20 50 34 20 72 65 67 69  array of P4 regi
1c060 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 61  sters .** that a
1c070 72 65 20 75 73 65 64 20 61 73 20 61 6e 20 75 6e  re used as an un
1c080 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
1c090 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74  . .**.** Reposit
1c0a0 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 73 6f  ion cursor P1 so
1c0b0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
1c0c0 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  to the largest e
1c0d0 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73  ntry that .** is
1c0e0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
1c0f0 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76  ual to the key v
1c100 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61  alue. If there a
1c110 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a 2a  re no records .*
1c120 2a 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  * less than or e
1c130 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20  qual to the key 
1c140 61 6e 64 20 50 32 20 69 73 20 6e 6f 74 20 7a 65  and P2 is not ze
1c150 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  ro, then jump to
1c160 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61   P2..**.** See a
1c170 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46  lso: Found, NotF
1c180 6f 75 6e 64 2c 20 44 69 73 74 69 6e 63 74 2c 20  ound, Distinct, 
1c190 53 65 65 6b 47 74 2c 20 53 65 65 6b 47 65 2c 20  SeekGt, SeekGe, 
1c1a0 53 65 65 6b 4c 74 0a 2a 2f 0a 63 61 73 65 20 4f  SeekLt.*/.case O
1c1b0 50 5f 53 65 65 6b 4c 74 3a 20 20 20 20 20 20 20  P_SeekLt:       
1c1c0 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
1c1d0 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 4c 65  /.case OP_SeekLe
1c1e0 3a 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d  :         /* jum
1c1f0 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  p, in3 */.case O
1c200 50 5f 53 65 65 6b 47 65 3a 20 20 20 20 20 20 20  P_SeekGe:       
1c210 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
1c220 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 47 74  /.case OP_SeekGt
1c230 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d  : {       /* jum
1c240 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20  p, in3 */.  int 
1c250 72 65 73 3b 0a 20 20 69 6e 74 20 6f 63 3b 0a 20  res;.  int oc;. 
1c260 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
1c270 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1c280 64 20 72 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c  d r;.  int nFiel
1c290 64 3b 0a 20 20 69 36 34 20 69 4b 65 79 3b 20 20  d;.  i64 iKey;  
1c2a0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64      /* The rowid
1c2b0 20 77 65 20 61 72 65 20 74 6f 20 73 65 65 6b 20   we are to seek 
1c2c0 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
1c2d0 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
1c2e0 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
1c2f0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
1c300 4f 70 2d 3e 70 32 21 3d 30 20 29 3b 0a 20 20 70  Op->p2!=0 );.  p
1c310 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
1c320 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
1c330 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
1c340 72 74 28 20 70 43 2d 3e 70 73 65 75 64 6f 54 61  rt( pC->pseudoTa
1c350 62 6c 65 52 65 67 3d 3d 30 20 29 3b 0a 20 20 61  bleReg==0 );.  a
1c360 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 4c 65  ssert( OP_SeekLe
1c370 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c 74 2b 31 20   == OP_SeekLt+1 
1c380 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50 5f  );.  assert( OP_
1c390 53 65 65 6b 47 65 20 3d 3d 20 4f 50 5f 53 65 65  SeekGe == OP_See
1c3a0 6b 4c 74 2b 32 20 29 3b 0a 20 20 61 73 73 65 72  kLt+2 );.  asser
1c3b0 74 28 20 4f 50 5f 53 65 65 6b 47 74 20 3d 3d 20  t( OP_SeekGt == 
1c3c0 4f 50 5f 53 65 65 6b 4c 74 2b 33 20 29 3b 0a 20  OP_SeekLt+3 );. 
1c3d0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 4f   assert( pC->isO
1c3e0 72 64 65 72 65 64 20 29 3b 0a 20 20 69 66 28 20  rdered );.  if( 
1c3f0 41 4c 57 41 59 53 28 70 43 2d 3e 70 43 75 72 73  ALWAYS(pC->pCurs
1c400 6f 72 21 3d 30 29 20 29 7b 0a 20 20 20 20 6f 63  or!=0) ){.    oc
1c410 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
1c420 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20      pC->nullRow 
1c430 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 43 2d  = 0;.    if( pC-
1c440 3e 69 73 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  >isTable ){.    
1c450 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 76    /* The input v
1c460 61 6c 75 65 20 69 6e 20 50 33 20 6d 69 67 68 74  alue in P3 might
1c470 20 62 65 20 6f 66 20 61 6e 79 20 74 79 70 65 3a   be of any type:
1c480 20 69 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c 20   integer, real, 
1c490 73 74 72 69 6e 67 2c 0a 20 20 20 20 20 20 2a 2a  string,.      **
1c4a0 20 62 6c 6f 62 2c 20 6f 72 20 4e 55 4c 4c 2e 20   blob, or NULL. 
1c4b0 20 42 75 74 20 69 74 20 6e 65 65 64 73 20 74 6f   But it needs to
1c4c0 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 62   be an integer b
1c4d0 65 66 6f 72 65 20 77 65 20 63 61 6e 20 64 6f 0a  efore we can do.
1c4e0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 65        ** the see
1c4f0 6b 2c 20 73 6f 20 63 6f 76 65 72 74 20 69 74 2e  k, so covert it.
1c500 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e 33 20 3d   */.      pIn3 =
1c510 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
1c520 0a 20 20 20 20 20 20 61 70 70 6c 79 4e 75 6d 65  .      applyNume
1c530 72 69 63 41 66 66 69 6e 69 74 79 28 70 49 6e 33  ricAffinity(pIn3
1c540 29 3b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20  );.      iKey = 
1c550 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
1c560 6c 75 65 28 70 49 6e 33 29 3b 0a 20 20 20 20 20  lue(pIn3);.     
1c570 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69   pC->rowidIsVali
1c580 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  d = 0;..      /*
1c590 20 49 66 20 74 68 65 20 50 33 20 76 61 6c 75 65   If the P3 value
1c5a0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6f   could not be co
1c5b0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20  nverted into an 
1c5c0 69 6e 74 65 67 65 72 20 77 69 74 68 6f 75 74 0a  integer without.
1c5d0 20 20 20 20 20 20 2a 2a 20 6c 6f 73 73 20 6f 66        ** loss of
1c5e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20 74 68   information, th
1c5f0 65 6e 20 73 70 65 63 69 61 6c 20 70 72 6f 63 65  en special proce
1c600 73 73 69 6e 67 20 69 73 20 72 65 71 75 69 72 65  ssing is require
1c610 64 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  d... */.      if
1c620 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26  ( (pIn3->flags &
1c630 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a   MEM_Int)==0 ){.
1c640 20 20 20 20 20 20 20 20 69 66 28 20 28 70 49 6e          if( (pIn
1c650 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  3->flags & MEM_R
1c660 65 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  eal)==0 ){.     
1c670 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50       /* If the P
1c680 33 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62  3 value cannot b
1c690 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
1c6a0 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 61 20 6e   any kind of a n
1c6b0 75 6d 62 65 72 2c 0a 20 20 20 20 20 20 20 20 20  umber,.         
1c6c0 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 73 65 65   ** then the see
1c6d0 6b 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  k is not possibl
1c6e0 65 2c 20 73 6f 20 6a 75 6d 70 20 74 6f 20 50 32  e, so jump to P2
1c6f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 63   */.          pc
1c700 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
1c710 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c720 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c730 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
1c740 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  h this point, th
1c750 65 6e 20 74 68 65 20 50 33 20 76 61 6c 75 65 20  en the P3 value 
1c760 6d 75 73 74 20 62 65 20 61 20 66 6c 6f 61 74 69  must be a floati
1c770 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  ng.        ** po
1c780 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20  int number. */. 
1c790 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
1c7a0 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
1c7b0 4d 5f 52 65 61 6c 29 21 3d 30 20 29 3b 0a 0a 20  M_Real)!=0 );.. 
1c7c0 20 20 20 20 20 20 20 69 66 28 20 69 4b 65 79 3d         if( iKey=
1c7d0 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20  =SMALLEST_INT64 
1c7e0 26 26 20 28 70 49 6e 33 2d 3e 72 3c 28 64 6f 75  && (pIn3->r<(dou
1c7f0 62 6c 65 29 69 4b 65 79 20 7c 7c 20 70 49 6e 33  ble)iKey || pIn3
1c800 2d 3e 72 3e 30 29 20 29 7b 0a 20 20 20 20 20 20  ->r>0) ){.      
1c810 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 76 61      /* The P3 va
1c820 6c 75 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  lue is too large
1c830 20 69 6e 20 6d 61 67 6e 69 74 75 64 65 20 74 6f   in magnitude to
1c840 20 62 65 20 65 78 70 72 65 73 73 65 64 20 61 73   be expressed as
1c850 20 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   an.          **
1c860 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
1c870 20 20 20 20 20 20 20 72 65 73 20 3d 20 31 3b 0a         res = 1;.
1c880 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
1c890 6e 33 2d 3e 72 3c 30 20 29 7b 0a 20 20 20 20 20  n3->r<0 ){.     
1c8a0 20 20 20 20 20 20 20 69 66 28 20 6f 63 3e 3d 4f         if( oc>=O
1c8b0 50 5f 53 65 65 6b 47 65 20 29 7b 20 20 61 73 73  P_SeekGe ){  ass
1c8c0 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  ert( oc==OP_Seek
1c8d0 47 65 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65  Ge || oc==OP_See
1c8e0 6b 47 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  kGt );.         
1c8f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c900 33 42 74 72 65 65 46 69 72 73 74 28 70 43 2d 3e  3BtreeFirst(pC->
1c910 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a  pCursor, &res);.
1c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1c930 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c940 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
1c950 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
1c960 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c970 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c980 20 20 20 20 20 20 69 66 28 20 6f 63 3c 3d 4f 50        if( oc<=OP
1c990 5f 53 65 65 6b 4c 65 20 29 7b 20 20 61 73 73 65  _SeekLe ){  asse
1c9a0 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c  rt( oc==OP_SeekL
1c9b0 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  t || oc==OP_Seek
1c9c0 4c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Le );.          
1c9d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c9e0 42 74 72 65 65 4c 61 73 74 28 70 43 2d 3e 70 43  BtreeLast(pC->pC
1c9f0 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20  ursor, &res);.  
1ca00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ca10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1ca20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
1ca30 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  o_error;.       
1ca40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1ca50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
1ca60 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20   res ){.        
1ca70 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
1ca80 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
1ca90 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
1caa0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1cab0 20 69 66 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b   if( oc==OP_Seek
1cac0 4c 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65  Lt || oc==OP_See
1cad0 6b 47 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  kGe ){.         
1cae0 20 2f 2a 20 55 73 65 20 74 68 65 20 63 65 69 6c   /* Use the ceil
1caf0 69 6e 67 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  ing() function t
1cb00 6f 20 63 6f 6e 76 65 72 74 20 72 65 61 6c 2d 3e  o convert real->
1cb10 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  int */.         
1cb20 20 69 66 28 20 70 49 6e 33 2d 3e 72 20 3e 20 28   if( pIn3->r > (
1cb30 64 6f 75 62 6c 65 29 69 4b 65 79 20 29 20 69 4b  double)iKey ) iK
1cb40 65 79 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  ey++;.        }e
1cb50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1cb60 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 6f 72 28  * Use the floor(
1cb70 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 6f  ) function to co
1cb80 6e 76 65 72 74 20 72 65 61 6c 2d 3e 69 6e 74 20  nvert real->int 
1cb90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
1cba0 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  ert( oc==OP_Seek
1cbb0 4c 65 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65  Le || oc==OP_See
1cbc0 6b 47 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  kGt );.         
1cbd0 20 69 66 28 20 70 49 6e 33 2d 3e 72 20 3c 20 28   if( pIn3->r < (
1cbe0 64 6f 75 62 6c 65 29 69 4b 65 79 20 29 20 69 4b  double)iKey ) iK
1cbf0 65 79 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ey--;.        }.
1cc00 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 72        } .      r
1cc10 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1cc20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
1cc30 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28  C->pCursor, 0, (
1cc40 75 36 34 29 69 4b 65 79 2c 20 30 2c 20 26 72 65  u64)iKey, 0, &re
1cc50 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
1cc60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1cc70 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72         goto abor
1cc80 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
1cc90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1cca0 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
1ccb0 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56      pC->rowidIsV
1ccc0 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  alid = 1;.      
1ccd0 20 20 70 43 2d 3e 6c 61 73 74 52 6f 77 69 64 20    pC->lastRowid 
1cce0 3d 20 69 4b 65 79 3b 0a 20 20 20 20 20 20 7d 0a  = iKey;.      }.
1ccf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cd00 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70   nField = pOp->p
1cd10 34 2e 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72  4.i;.      asser
1cd20 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
1cd30 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 20 20  P4_INT32 );.    
1cd40 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64    assert( nField
1cd50 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 2e 70 4b  >0 );.      r.pK
1cd60 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65  eyInfo = pC->pKe
1cd70 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 72 2e 6e  yInfo;.      r.n
1cd80 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 46 69  Field = (u16)nFi
1cd90 65 6c 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  eld;..      /* T
1cda0 68 65 20 6e 65 78 74 20 6c 69 6e 65 20 6f 66 20  he next line of 
1cdb0 63 6f 64 65 20 63 6f 6d 70 75 74 65 73 20 61 73  code computes as
1cdc0 20 66 6f 6c 6c 6f 77 73 2c 20 6f 6e 6c 79 20 66   follows, only f
1cdd0 61 73 74 65 72 3a 0a 20 20 20 20 20 20 2a 2a 20  aster:.      ** 
1cde0 20 20 69 66 28 20 6f 63 3d 3d 4f 50 5f 53 65 65    if( oc==OP_See
1cdf0 6b 47 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65  kGt || oc==OP_Se
1ce00 65 6b 4c 65 20 29 7b 0a 20 20 20 20 20 20 2a 2a  ekLe ){.      **
1ce10 20 20 20 20 20 72 2e 66 6c 61 67 73 20 3d 20 55       r.flags = U
1ce20 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 3b  NPACKED_INCRKEY;
1ce30 0a 20 20 20 20 20 20 2a 2a 20 20 20 7d 65 6c 73  .      **   }els
1ce40 65 7b 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  e{.      **     
1ce50 72 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  r.flags = 0;.   
1ce60 20 20 20 2a 2a 20 20 20 7d 0a 20 20 20 20 20 20     **   }.      
1ce70 2a 2f 0a 20 20 20 20 20 20 72 2e 66 6c 61 67 73  */.      r.flags
1ce80 20 3d 20 28 75 38 29 28 55 4e 50 41 43 4b 45 44   = (u8)(UNPACKED
1ce90 5f 49 4e 43 52 4b 45 59 20 2a 20 28 31 20 26 20  _INCRKEY * (1 & 
1cea0 28 6f 63 20 2d 20 4f 50 5f 53 65 65 6b 4c 74 29  (oc - OP_SeekLt)
1ceb0 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
1cec0 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 47 74 20  ( oc!=OP_SeekGt 
1ced0 7c 7c 20 72 2e 66 6c 61 67 73 3d 3d 55 4e 50 41  || r.flags==UNPA
1cee0 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 29 3b 0a  CKED_INCRKEY );.
1cef0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63        assert( oc
1cf00 21 3d 4f 50 5f 53 65 65 6b 4c 65 20 7c 7c 20 72  !=OP_SeekLe || r
1cf10 2e 66 6c 61 67 73 3d 3d 55 4e 50 41 43 4b 45 44  .flags==UNPACKED
1cf20 5f 49 4e 43 52 4b 45 59 20 29 3b 0a 20 20 20 20  _INCRKEY );.    
1cf30 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50    assert( oc!=OP
1cf40 5f 53 65 65 6b 47 65 20 7c 7c 20 72 2e 66 6c 61  _SeekGe || r.fla
1cf50 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  gs==0 );.      a
1cf60 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65  ssert( oc!=OP_Se
1cf70 65 6b 4c 74 20 7c 7c 20 72 2e 66 6c 61 67 73 3d  ekLt || r.flags=
1cf80 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 72 2e 61  =0 );..      r.a
1cf90 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Mem = &aMem[pOp-
1cfa0 3e 70 33 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c  >p3];.#ifdef SQL
1cfb0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
1cfc0 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30  { int i; for(i=0
1cfd0 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b  ; i<r.nField; i+
1cfe0 2b 29 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73  +) assert( memIs
1cff0 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d  Valid(&r.aMem[i]
1d000 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20  ) ); }.#endif.  
1d010 20 20 20 20 45 78 70 61 6e 64 42 6c 6f 62 28 72      ExpandBlob(r
1d020 2e 61 4d 65 6d 29 3b 0a 20 20 20 20 20 20 72 63  .aMem);.      rc
1d030 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
1d040 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
1d050 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 2c 20 30  ->pCursor, &r, 0
1d060 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  , 0, &res);.    
1d070 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d080 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1d090 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1d0a0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a  _error;.      }.
1d0b0 20 20 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49        pC->rowidI
1d0c0 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  sValid = 0;.    
1d0d0 7d 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72  }.    pC->deferr
1d0e0 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
1d0f0 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
1d100 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
1d110 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1d120 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
1d130 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
1d140 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6f  #endif.    if( o
1d150 63 3e 3d 4f 50 5f 53 65 65 6b 47 65 20 29 7b 20  c>=OP_SeekGe ){ 
1d160 20 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f   assert( oc==OP_
1d170 53 65 65 6b 47 65 20 7c 7c 20 6f 63 3d 3d 4f 50  SeekGe || oc==OP
1d180 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 20  _SeekGt );.     
1d190 20 69 66 28 20 72 65 73 3c 30 20 7c 7c 20 28 72   if( res<0 || (r
1d1a0 65 73 3d 3d 30 20 26 26 20 6f 63 3d 3d 4f 50 5f  es==0 && oc==OP_
1d1b0 53 65 65 6b 47 74 29 20 29 7b 0a 20 20 20 20 20  SeekGt) ){.     
1d1c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1d1d0 74 72 65 65 4e 65 78 74 28 70 43 2d 3e 70 43 75  treeNext(pC->pCu
1d1e0 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20  rsor, &res);.   
1d1f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d200 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62  ITE_OK ) goto ab
1d210 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
1d220 3b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 72 6f  ;.        pC->ro
1d230 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a  widIsValid = 0;.
1d240 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d250 20 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20       res = 0;.  
1d260 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
1d270 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
1d280 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 7c 7c 20  c==OP_SeekLt || 
1d290 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b  oc==OP_SeekLe );
1d2a0 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 30  .      if( res>0
1d2b0 20 7c 7c 20 28 72 65 73 3d 3d 30 20 26 26 20 6f   || (res==0 && o
1d2c0 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74 29 20 29 7b  c==OP_SeekLt) ){
1d2d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1d2e0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
1d2f0 75 73 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  us(pC->pCursor, 
1d300 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69  &res);.        i
1d310 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d320 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
1d330 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
1d340 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56      pC->rowidIsV
1d350 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  alid = 0;.      
1d360 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1d370 2a 20 72 65 73 20 6d 69 67 68 74 20 62 65 20 6e  * res might be n
1d380 65 67 61 74 69 76 65 20 62 65 63 61 75 73 65 20  egative because 
1d390 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1d3a0 74 79 2e 20 20 43 68 65 63 6b 20 74 6f 0a 20 20  ty.  Check to.  
1d3b0 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20        ** see if 
1d3c0 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
1d3d0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1d3e0 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74       res = sqlit
1d3f0 65 33 42 74 72 65 65 45 6f 66 28 70 43 2d 3e 70  e3BtreeEof(pC->p
1d400 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
1d410 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1d420 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a  t( pOp->p2>0 );.
1d430 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
1d440 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70       pc = pOp->p
1d450 32 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  2 - 1;.    }.  }
1d460 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
1d470 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61  s happens when a
1d480 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f 70 65  ttempting to ope
1d490 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 61  n the sqlite3_ma
1d4a0 73 74 65 72 20 74 61 62 6c 65 0a 20 20 20 20 2a  ster table.    *
1d4b0 2a 20 66 6f 72 20 72 65 61 64 20 61 63 63 65 73  * for read acces
1d4c0 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  s returns SQLITE
1d4d0 5f 45 4d 50 54 59 2e 20 49 6e 20 74 68 69 73 20  _EMPTY. In this 
1d4e0 63 61 73 65 20 61 6c 77 61 79 73 0a 20 20 20 20  case always.    
1d4f0 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  ** take the jump
1d500 20 28 73 69 6e 63 65 20 74 68 65 72 65 20 61 72   (since there ar
1d510 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 69 6e 20  e no records in 
1d520 74 68 65 20 74 61 62 6c 65 29 2e 0a 20 20 20 20  the table)..    
1d530 2a 2f 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  */.    pc = pOp-
1d540 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62  >p2 - 1;.  }.  b
1d550 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
1d560 64 65 3a 20 53 65 65 6b 20 50 31 20 50 32 20 2a  de: Seek P1 P2 *
1d570 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73   * *.**.** P1 is
1d580 20 61 6e 20 6f 70 65 6e 20 74 61 62 6c 65 20 63   an open table c
1d590 75 72 73 6f 72 20 61 6e 64 20 50 32 20 69 73 20  ursor and P2 is 
1d5a0 61 20 72 6f 77 69 64 20 69 6e 74 65 67 65 72 2e  a rowid integer.
1d5b0 20 20 41 72 72 61 6e 67 65 0a 2a 2a 20 66 6f 72    Arrange.** for
1d5c0 20 50 31 20 74 6f 20 6d 6f 76 65 20 73 6f 20 74   P1 to move so t
1d5d0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
1d5e0 20 74 68 65 20 72 6f 77 69 64 20 67 69 76 65 6e   the rowid given
1d5f0 20 62 79 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68   by P2..**.** Th
1d600 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  is is actually a
1d610 20 64 65 66 65 72 72 65 64 20 73 65 65 6b 2e 20   deferred seek. 
1d620 20 4e 6f 74 68 69 6e 67 20 61 63 74 75 61 6c 6c   Nothing actuall
1d630 79 20 68 61 70 70 65 6e 73 20 75 6e 74 69 6c 0a  y happens until.
1d640 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
1d650 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 61 20   used to read a 
1d660 72 65 63 6f 72 64 2e 20 20 54 68 61 74 20 77 61  record.  That wa
1d670 79 2c 20 69 66 20 6e 6f 20 72 65 61 64 73 0a 2a  y, if no reads.*
1d680 2a 20 6f 63 63 75 72 2c 20 6e 6f 20 75 6e 6e 65  * occur, no unne
1d690 63 65 73 73 61 72 79 20 49 2f 4f 20 68 61 70 70  cessary I/O happ
1d6a0 65 6e 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ens..*/.case OP_
1d6b0 53 65 65 6b 3a 20 7b 20 20 20 20 2f 2a 20 69 6e  Seek: {    /* in
1d6c0 32 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  2 */.  VdbeCurso
1d6d0 72 20 2a 70 43 3b 0a 0a 20 20 61 73 73 65 72 74  r *pC;..  assert
1d6e0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
1d6f0 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
1d700 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
1d710 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
1d720 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
1d730 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
1d740 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 29 20  pC->pCursor!=0) 
1d750 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1d760 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  C->isTable );.  
1d770 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20    pC->nullRow = 
1d780 30 3b 0a 20 20 20 20 70 49 6e 32 20 3d 20 26 61  0;.    pIn2 = &a
1d790 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
1d7a0 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67    pC->movetoTarg
1d7b0 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  et = sqlite3Vdbe
1d7c0 49 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 3b 0a  IntValue(pIn2);.
1d7d0 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56      pC->rowidIsV
1d7e0 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 43  alid = 0;.    pC
1d7f0 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
1d800 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61   = 1;.  }.  brea
1d810 6b 3b 0a 7d 0a 20 20 0a 0a 2f 2a 20 4f 70 63 6f  k;.}.  ../* Opco
1d820 64 65 3a 20 46 6f 75 6e 64 20 50 31 20 50 32 20  de: Found P1 P2 
1d830 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 66  P3 P4 *.**.** If
1d840 20 50 34 3d 3d 30 20 74 68 65 6e 20 72 65 67 69   P4==0 then regi
1d850 73 74 65 72 20 50 33 20 68 6f 6c 64 73 20 61 20  ster P3 holds a 
1d860 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74 65 64  blob constructed
1d870 20 62 79 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20   by MakeRecord. 
1d880 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74 68 65 6e   If.** P4>0 then
1d890 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20   register P3 is 
1d8a0 74 68 65 20 66 69 72 73 74 20 6f 66 20 50 34 20  the first of P4 
1d8b0 72 65 67 69 73 74 65 72 73 20 74 68 61 74 20 66  registers that f
1d8c0 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 0a  orm an unpacked.
1d8d0 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  ** record..**.**
1d8e0 20 43 75 72 73 6f 72 20 50 31 20 69 73 20 6f 6e   Cursor P1 is on
1d8f0 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2e   an index btree.
1d900 20 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20    If the record 
1d910 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 50 33  identified by P3
1d920 20 61 6e 64 20 50 34 0a 2a 2a 20 69 73 20 61 20   and P4.** is a 
1d930 70 72 65 66 69 78 20 6f 66 20 61 6e 79 20 65 6e  prefix of any en
1d940 74 72 79 20 69 6e 20 50 31 20 74 68 65 6e 20 61  try in P1 then a
1d950 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f   jump is made to
1d960 20 50 32 20 61 6e 64 0a 2a 2a 20 50 31 20 69 73   P2 and.** P1 is
1d970 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
1d980 74 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 65  t the matching e
1d990 6e 74 72 79 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  ntry..*/./* Opco
1d9a0 64 65 3a 20 4e 6f 74 46 6f 75 6e 64 20 50 31 20  de: NotFound P1 
1d9b0 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  P2 P3 P4 *.**.**
1d9c0 20 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20 72   If P4==0 then r
1d9d0 65 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64 73  egister P3 holds
1d9e0 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63   a blob construc
1d9f0 74 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f 72  ted by MakeRecor
1da00 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74  d.  If.** P4>0 t
1da10 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33 20  hen register P3 
1da20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  is the first of 
1da30 50 34 20 72 65 67 69 73 74 65 72 73 20 74 68 61  P4 registers tha
1da40 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b  t form an unpack
1da50 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a  ed.** record..**
1da60 20 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69   .** Cursor P1 i
1da70 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74  s on an index bt
1da80 72 65 65 2e 20 20 49 66 20 74 68 65 20 72 65 63  ree.  If the rec
1da90 6f 72 64 20 69 64 65 6e 74 69 66 69 65 64 20 62  ord identified b
1daa0 79 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 69  y P3 and P4.** i
1dab0 73 20 6e 6f 74 20 74 68 65 20 70 72 65 66 69 78  s not the prefix
1dac0 20 6f 66 20 61 6e 79 20 65 6e 74 72 79 20 69 6e   of any entry in
1dad0 20 50 31 20 74 68 65 6e 20 61 20 6a 75 6d 70 20   P1 then a jump 
1dae0 69 73 20 6d 61 64 65 20 74 6f 20 50 32 2e 20 20  is made to P2.  
1daf0 49 66 20 50 31 20 0a 2a 2a 20 64 6f 65 73 20 63  If P1 .** does c
1db00 6f 6e 74 61 69 6e 20 61 6e 20 65 6e 74 72 79 20  ontain an entry 
1db10 77 68 6f 73 65 20 70 72 65 66 69 78 20 6d 61 74  whose prefix mat
1db20 63 68 65 73 20 74 68 65 20 50 33 2f 50 34 20 72  ches the P3/P4 r
1db30 65 63 6f 72 64 20 74 68 65 6e 20 63 6f 6e 74 72  ecord then contr
1db40 6f 6c 0a 2a 2a 20 66 61 6c 6c 73 20 74 68 72 6f  ol.** falls thro
1db50 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
1db60 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20  instruction and 
1db70 50 31 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  P1 is left point
1db80 69 6e 67 20 61 74 20 74 68 65 0a 2a 2a 20 6d 61  ing at the.** ma
1db90 74 63 68 69 6e 67 20 65 6e 74 72 79 2e 0a 2a 2a  tching entry..**
1dba0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f  .** See also: Fo
1dbb0 75 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73 2c 20  und, NotExists, 
1dbc0 49 73 55 6e 69 71 75 65 0a 2a 2f 0a 63 61 73 65  IsUnique.*/.case
1dbd0 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 3a 20 20 20   OP_NotFound:   
1dbe0 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33      /* jump, in3
1dbf0 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 6f 75 6e   */.case OP_Foun
1dc00 64 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a  d: {        /* j
1dc10 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e  ump, in3 */.  in
1dc20 74 20 61 6c 72 65 61 64 79 45 78 69 73 74 73 3b  t alreadyExists;
1dc30 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
1dc40 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  C;.  int res;.  
1dc50 63 68 61 72 20 2a 70 46 72 65 65 3b 0a 20 20 55  char *pFree;.  U
1dc60 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1dc70 49 64 78 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b  IdxKey;.  Unpack
1dc80 65 64 52 65 63 6f 72 64 20 72 3b 0a 20 20 63 68  edRecord r;.  ch
1dc90 61 72 20 61 54 65 6d 70 52 65 63 5b 52 4f 55 4e  ar aTempRec[ROUN
1dca0 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
1dcb0 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a  edRecord)) + siz
1dcc0 65 6f 66 28 4d 65 6d 29 2a 33 20 2b 20 37 5d 3b  eof(Mem)*3 + 7];
1dcd0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1dce0 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 66  TEST.  sqlite3_f
1dcf0 6f 75 6e 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  ound_count++;.#e
1dd00 6e 64 69 66 0a 0a 20 20 61 6c 72 65 61 64 79 45  ndif..  alreadyE
1dd10 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 61 73 73  xists = 0;.  ass
1dd20 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
1dd30 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
1dd40 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72  ursor );.  asser
1dd50 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
1dd60 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 70 43  P4_INT32 );.  pC
1dd70 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
1dd80 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
1dd90 70 43 21 3d 30 20 29 3b 0a 20 20 70 49 6e 33 20  pC!=0 );.  pIn3 
1dda0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
1ddb0 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
1ddc0 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 29 20 29  C->pCursor!=0) )
1ddd0 7b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  {..    assert( p
1dde0 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b  C->isTable==0 );
1ddf0 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34  .    if( pOp->p4
1de00 2e 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 2e  .i>0 ){.      r.
1de10 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e 70  pKeyInfo = pC->p
1de20 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 72  KeyInfo;.      r
1de30 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 70  .nField = (u16)p
1de40 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 20 20  Op->p4.i;.      
1de50 72 2e 61 4d 65 6d 20 3d 20 70 49 6e 33 3b 0a 23  r.aMem = pIn3;.#
1de60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1de70 55 47 0a 20 20 20 20 20 20 7b 20 69 6e 74 20 69  UG.      { int i
1de80 3b 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 2e 6e  ; for(i=0; i<r.n
1de90 46 69 65 6c 64 3b 20 69 2b 2b 29 20 61 73 73 65  Field; i++) asse
1dea0 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26  rt( memIsValid(&
1deb0 72 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a  r.aMem[i]) ); }.
1dec0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 2e 66  #endif.      r.f
1ded0 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f  lags = UNPACKED_
1dee0 50 52 45 46 49 58 5f 4d 41 54 43 48 3b 0a 20 20  PREFIX_MATCH;.  
1def0 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 26 72      pIdxKey = &r
1df00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1df10 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
1df20 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
1df30 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20  ackedRecord(.   
1df40 20 20 20 20 20 20 20 70 43 2d 3e 70 4b 65 79 49         pC->pKeyI
1df50 6e 66 6f 2c 20 61 54 65 6d 70 52 65 63 2c 20 73  nfo, aTempRec, s
1df60 69 7a 65 6f 66 28 61 54 65 6d 70 52 65 63 29 2c  izeof(aTempRec),
1df70 20 26 70 46 72 65 65 0a 20 20 20 20 20 20 29 3b   &pFree.      );
1df80 20 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78   .      if( pIdx
1df90 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  Key==0 ) goto no
1dfa0 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  _mem;.      asse
1dfb0 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20  rt( pIn3->flags 
1dfc0 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
1dfd0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 49 6e      assert( (pIn
1dfe0 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  3->flags & MEM_Z
1dff0 65 72 6f 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 7a  ero)==0 );  /* z
1e000 65 72 6f 62 6c 6f 62 73 20 61 6c 72 65 61 64 79  eroblobs already
1e010 20 65 78 70 61 6e 64 65 64 20 2a 2f 0a 20 20 20   expanded */.   
1e020 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1e030 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 2d 3e 70  cordUnpack(pC->p
1e040 4b 65 79 49 6e 66 6f 2c 20 70 49 6e 33 2d 3e 6e  KeyInfo, pIn3->n
1e050 2c 20 70 49 6e 33 2d 3e 7a 2c 20 70 49 64 78 4b  , pIn3->z, pIdxK
1e060 65 79 29 3b 0a 20 20 20 20 20 20 70 49 64 78 4b  ey);.      pIdxK
1e070 65 79 2d 3e 66 6c 61 67 73 20 7c 3d 20 55 4e 50  ey->flags |= UNP
1e080 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54  ACKED_PREFIX_MAT
1e090 43 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  CH;.    }.    rc
1e0a0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
1e0b0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
1e0c0 2d 3e 70 43 75 72 73 6f 72 2c 20 70 49 64 78 4b  ->pCursor, pIdxK
1e0d0 65 79 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b  ey, 0, 0, &res);
1e0e0 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34  .    if( pOp->p4
1e0f0 2e 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  .i==0 ){.      s
1e100 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1e110 20 70 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20   pFree);.    }. 
1e120 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e130 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 62 72  E_OK ){.      br
1e140 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  eak;.    }.    a
1e150 6c 72 65 61 64 79 45 78 69 73 74 73 20 3d 20 28  lreadyExists = (
1e160 72 65 73 3d 3d 30 29 3b 0a 20 20 20 20 70 43 2d  res==0);.    pC-
1e170 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
1e180 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63  = 0;.    pC->cac
1e190 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
1e1a0 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 69 66  _STALE;.  }.  if
1e1b0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
1e1c0 50 5f 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20 69  P_Found ){.    i
1e1d0 66 28 20 61 6c 72 65 61 64 79 45 78 69 73 74 73  f( alreadyExists
1e1e0 20 29 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20   ) pc = pOp->p2 
1e1f0 2d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  - 1;.  }else{.  
1e200 20 20 69 66 28 20 21 61 6c 72 65 61 64 79 45 78    if( !alreadyEx
1e210 69 73 74 73 20 29 20 70 63 20 3d 20 70 4f 70 2d  ists ) pc = pOp-
1e220 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62  >p2 - 1;.  }.  b
1e230 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
1e240 64 65 3a 20 49 73 55 6e 69 71 75 65 20 50 31 20  de: IsUnique P1 
1e250 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  P2 P3 P4 *.**.**
1e260 20 43 75 72 73 6f 72 20 50 31 20 69 73 20 6f 70   Cursor P1 is op
1e270 65 6e 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62  en on an index b
1e280 2d 74 72 65 65 20 2d 20 74 68 61 74 20 69 73 20  -tree - that is 
1e290 74 6f 20 73 61 79 2c 20 61 20 62 74 72 65 65 20  to say, a btree 
1e2a0 77 68 69 63 68 0a 2a 2a 20 6e 6f 20 64 61 74 61  which.** no data
1e2b0 20 61 6e 64 20 77 68 65 72 65 20 74 68 65 20 6b   and where the k
1e2c0 65 79 20 61 72 65 20 72 65 63 6f 72 64 73 20 67  ey are records g
1e2d0 65 6e 65 72 61 74 65 64 20 62 79 20 4f 50 5f 4d  enerated by OP_M
1e2e0 61 6b 65 52 65 63 6f 72 64 20 77 69 74 68 0a 2a  akeRecord with.*
1e2f0 2a 20 74 68 65 20 6c 69 73 74 20 66 69 65 6c 64  * the list field
1e300 20 62 65 69 6e 67 20 74 68 65 20 69 6e 74 65 67   being the integ
1e310 65 72 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20  er ROWID of the 
1e320 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 69  entry that the i
1e330 6e 64 65 78 0a 2a 2a 20 65 6e 74 72 79 20 72 65  ndex.** entry re
1e340 66 65 72 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54  fers to..**.** T
1e350 68 65 20 50 33 20 72 65 67 69 73 74 65 72 20 63  he P3 register c
1e360 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 74 65 67  ontains an integ
1e370 65 72 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  er record number
1e380 2e 20 43 61 6c 6c 20 74 68 69 73 20 72 65 63 6f  . Call this reco
1e390 72 64 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 52 2e  rd .** number R.
1e3a0 20 52 65 67 69 73 74 65 72 20 50 34 20 69 73 20   Register P4 is 
1e3b0 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 73  the first in a s
1e3c0 65 74 20 6f 66 20 4e 20 63 6f 6e 74 69 67 75 6f  et of N contiguo
1e3d0 75 73 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  us registers.** 
1e3e0 74 68 61 74 20 6d 61 6b 65 20 75 70 20 61 6e 20  that make up an 
1e3f0 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  unpacked index k
1e400 65 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ey that can be u
1e410 73 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  sed with cursor 
1e420 50 31 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  P1..** The value
1e430 20 6f 66 20 4e 20 63 61 6e 20 62 65 20 69 6e 66   of N can be inf
1e440 65 72 72 65 64 20 66 72 6f 6d 20 74 68 65 20 63  erred from the c
1e450 75 72 73 6f 72 2e 20 4e 20 69 6e 63 6c 75 64 65  ursor. N include
1e460 73 20 74 68 65 20 72 6f 77 69 64 0a 2a 2a 20 76  s the rowid.** v
1e470 61 6c 75 65 20 61 70 70 65 6e 64 65 64 20 74 6f  alue appended to
1e480 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1e490 69 6e 64 65 78 20 72 65 63 6f 72 64 2e 20 54 68  index record. Th
1e4a0 69 73 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6d  is rowid value m
1e4b0 61 79 0a 2a 2a 20 6f 72 20 6d 61 79 20 6e 6f 74  ay.** or may not
1e4c0 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
1e4d0 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  R..**.** If any 
1e4e0 6f 66 20 74 68 65 20 4e 20 72 65 67 69 73 74 65  of the N registe
1e4f0 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  rs beginning wit
1e500 68 20 72 65 67 69 73 74 65 72 20 50 34 20 63 6f  h register P4 co
1e510 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 0a 2a 2a  ntains a NULL.**
1e520 20 76 61 6c 75 65 2c 20 6a 75 6d 70 20 69 6d 6d   value, jump imm
1e530 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a  ediately to P2..
1e540 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1e550 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
1e560 6e 20 63 68 65 63 6b 73 20 69 66 20 63 75 72 73  n checks if curs
1e570 6f 72 20 50 31 20 63 6f 6e 74 61 69 6e 73 20 61  or P1 contains a
1e580 6e 20 65 6e 74 72 79 0a 2a 2a 20 77 68 65 72 65  n entry.** where
1e590 20 74 68 65 20 66 69 72 73 74 20 28 4e 2d 31 29   the first (N-1)
1e5a0 20 66 69 65 6c 64 73 20 6d 61 74 63 68 20 62 75   fields match bu
1e5b0 74 20 74 68 65 20 72 6f 77 69 64 20 76 61 6c 75  t the rowid valu
1e5c0 65 20 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20  e at the end.** 
1e5d0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
1e5e0 72 79 20 69 73 20 6e 6f 74 20 52 2e 20 49 66 20  ry is not R. If 
1e5f0 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68  there is no such
1e600 20 65 6e 74 72 79 2c 20 63 6f 6e 74 72 6f 6c 20   entry, control 
1e610 6a 75 6d 70 73 0a 2a 2a 20 74 6f 20 69 6e 73 74  jumps.** to inst
1e620 72 75 63 74 69 6f 6e 20 50 32 2e 20 4f 74 68 65  ruction P2. Othe
1e630 72 77 69 73 65 2c 20 74 68 65 20 72 6f 77 69 64  rwise, the rowid
1e640 20 6f 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74   of the conflict
1e650 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 65 6e 74  ing index.** ent
1e660 72 79 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  ry is copied to 
1e670 72 65 67 69 73 74 65 72 20 50 33 20 61 6e 64 20  register P3 and 
1e680 63 6f 6e 74 72 6f 6c 20 66 61 6c 6c 73 20 74 68  control falls th
1e690 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
1e6a0 74 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e  t.** instruction
1e6b0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
1e6c0 3a 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f 74 45  : NotFound, NotE
1e6d0 78 69 73 74 73 2c 20 46 6f 75 6e 64 0a 2a 2f 0a  xists, Found.*/.
1e6e0 63 61 73 65 20 4f 50 5f 49 73 55 6e 69 71 75 65  case OP_IsUnique
1e6f0 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
1e700 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 75 31 36  mp, in3 */.  u16
1e710 20 69 69 3b 0a 20 20 56 64 62 65 43 75 72 73 6f   ii;.  VdbeCurso
1e720 72 20 2a 70 43 78 3b 0a 20 20 42 74 43 75 72 73  r *pCx;.  BtCurs
1e730 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 75 31 36  or *pCrsr;.  u16
1e740 20 6e 46 69 65 6c 64 3b 0a 20 20 4d 65 6d 20 2a   nField;.  Mem *
1e750 61 4d 78 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  aMx;.  UnpackedR
1e760 65 63 6f 72 64 20 72 3b 20 20 20 20 20 20 20 20  ecord r;        
1e770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 2d 54            /* B-T
1e780 72 65 65 20 69 6e 64 65 78 20 73 65 61 72 63 68  ree index search
1e790 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 52 3b   key */.  i64 R;
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e7c0 52 6f 77 69 64 20 73 74 6f 72 65 64 20 69 6e 20  Rowid stored in 
1e7d0 72 65 67 69 73 74 65 72 20 50 33 20 2a 2f 0a 0a  register P3 */..
1e7e0 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
1e7f0 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 4d 78 20 3d  Op->p3];.  aMx =
1e800 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 34 2e 69   &aMem[pOp->p4.i
1e810 5d 3b 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ];.  /* Assert t
1e820 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 6f  hat the values o
1e830 66 20 70 61 72 61 6d 65 74 65 72 73 20 50 31 20  f parameters P1 
1e840 61 6e 64 20 50 34 20 61 72 65 20 69 6e 20 72 61  and P4 are in ra
1e850 6e 67 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  nge. */.  assert
1e860 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
1e870 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 61 73 73  4_INT32 );.  ass
1e880 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 69 3e 30  ert( pOp->p4.i>0
1e890 20 26 26 20 70 4f 70 2d 3e 70 34 2e 69 3c 3d 70   && pOp->p4.i<=p
1e8a0 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 61 73 73 65  ->nMem );.  asse
1e8b0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
1e8c0 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
1e8d0 72 73 6f 72 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  rsor );..  /* Fi
1e8e0 6e 64 20 74 68 65 20 69 6e 64 65 78 20 63 75 72  nd the index cur
1e8f0 73 6f 72 2e 20 2a 2f 0a 20 20 70 43 78 20 3d 20  sor. */.  pCx = 
1e900 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
1e910 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 78  ];.  assert( pCx
1e920 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
1e930 3d 3d 30 20 29 3b 0a 20 20 70 43 78 2d 3e 73 65  ==0 );.  pCx->se
1e940 65 6b 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20  ekResult = 0;.  
1e950 70 43 78 2d 3e 63 61 63 68 65 53 74 61 74 75 73  pCx->cacheStatus
1e960 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
1e970 20 20 70 43 72 73 72 20 3d 20 70 43 78 2d 3e 70    pCrsr = pCx->p
1e980 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66  Cursor;..  /* If
1e990 20 61 6e 79 20 6f 66 20 74 68 65 20 76 61 6c 75   any of the valu
1e9a0 65 73 20 61 72 65 20 4e 55 4c 4c 2c 20 74 61 6b  es are NULL, tak
1e9b0 65 20 74 68 65 20 6a 75 6d 70 2e 20 2a 2f 0a 20  e the jump. */. 
1e9c0 20 6e 46 69 65 6c 64 20 3d 20 70 43 78 2d 3e 70   nField = pCx->p
1e9d0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
1e9e0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
1e9f0 6e 46 69 65 6c 64 3b 20 69 69 2b 2b 29 7b 0a 20  nField; ii++){. 
1ea00 20 20 20 69 66 28 20 61 4d 78 5b 69 69 5d 2e 66     if( aMx[ii].f
1ea10 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
1ea20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f  ){.      pc = pO
1ea30 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20  p->p2 - 1;.     
1ea40 20 70 43 72 73 72 20 3d 20 30 3b 0a 20 20 20 20   pCrsr = 0;.    
1ea50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1ea60 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61 4d   }.  assert( (aM
1ea70 78 5b 6e 46 69 65 6c 64 5d 2e 66 6c 61 67 73 20  x[nField].flags 
1ea80 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
1ea90 3b 0a 0a 20 20 69 66 28 20 70 43 72 73 72 21 3d  ;..  if( pCrsr!=
1eaa0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 50 6f 70 75  0 ){.    /* Popu
1eab0 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  late the index s
1eac0 65 61 72 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20  earch key. */.  
1ead0 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70    r.pKeyInfo = p
1eae0 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  Cx->pKeyInfo;.  
1eaf0 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 6e 46 69    r.nField = nFi
1eb00 65 6c 64 20 2b 20 31 3b 0a 20 20 20 20 72 2e 66  eld + 1;.    r.f
1eb10 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f  lags = UNPACKED_
1eb20 50 52 45 46 49 58 5f 53 45 41 52 43 48 3b 0a 20  PREFIX_SEARCH;. 
1eb30 20 20 20 72 2e 61 4d 65 6d 20 3d 20 61 4d 78 3b     r.aMem = aMx;
1eb40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1eb50 45 42 55 47 0a 20 20 20 20 7b 20 69 6e 74 20 69  EBUG.    { int i
1eb60 3b 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 2e 6e  ; for(i=0; i<r.n
1eb70 46 69 65 6c 64 3b 20 69 2b 2b 29 20 61 73 73 65  Field; i++) asse
1eb80 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26  rt( memIsValid(&
1eb90 72 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a  r.aMem[i]) ); }.
1eba0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45  #endif..    /* E
1ebb0 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
1ebc0 20 6f 66 20 52 20 66 72 6f 6d 20 72 65 67 69 73   of R from regis
1ebd0 74 65 72 20 50 33 2e 20 2a 2f 0a 20 20 20 20 73  ter P3. */.    s
1ebe0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74  qlite3VdbeMemInt
1ebf0 65 67 65 72 69 66 79 28 70 49 6e 33 29 3b 0a 20  egerify(pIn3);. 
1ec00 20 20 20 52 20 3d 20 70 49 6e 33 2d 3e 75 2e 69     R = pIn3->u.i
1ec10 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  ;..    /* Search
1ec20 20 74 68 65 20 42 2d 54 72 65 65 20 69 6e 64 65   the B-Tree inde
1ec30 78 2e 20 49 66 20 6e 6f 20 63 6f 6e 66 6c 69 63  x. If no conflic
1ec40 74 69 6e 67 20 72 65 63 6f 72 64 20 69 73 20 66  ting record is f
1ec50 6f 75 6e 64 2c 20 6a 75 6d 70 0a 20 20 20 20 2a  ound, jump.    *
1ec60 2a 20 74 6f 20 50 32 2e 20 4f 74 68 65 72 77 69  * to P2. Otherwi
1ec70 73 65 2c 20 63 6f 70 79 20 74 68 65 20 72 6f 77  se, copy the row
1ec80 69 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 6c 69  id of the confli
1ec90 63 74 69 6e 67 20 72 65 63 6f 72 64 20 74 6f 0a  cting record to.
1eca0 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72 20      ** register 
1ecb0 50 33 20 61 6e 64 20 66 61 6c 6c 20 74 68 72 6f  P3 and fall thro
1ecc0 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
1ecd0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 2a 2f  instruction.  */
1ece0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ecf0 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
1ed00 63 6b 65 64 28 70 43 72 73 72 2c 20 26 72 2c 20  cked(pCrsr, &r, 
1ed10 30 2c 20 30 2c 20 26 70 43 78 2d 3e 73 65 65 6b  0, 0, &pCx->seek
1ed20 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 69 66 28  Result);.    if(
1ed30 20 28 72 2e 66 6c 61 67 73 20 26 20 55 4e 50 41   (r.flags & UNPA
1ed40 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52  CKED_PREFIX_SEAR
1ed50 43 48 29 20 7c 7c 20 72 2e 72 6f 77 69 64 3d 3d  CH) || r.rowid==
1ed60 52 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20  R ){.      pc = 
1ed70 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20  pOp->p2 - 1;.   
1ed80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
1ed90 6e 33 2d 3e 75 2e 69 20 3d 20 72 2e 72 6f 77 69  n3->u.i = r.rowi
1eda0 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  d;.    }.  }.  b
1edb0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
1edc0 64 65 3a 20 4e 6f 74 45 78 69 73 74 73 20 50 31  de: NotExists P1
1edd0 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
1ede0 20 55 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74   Use the content
1edf0 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20   of register P3 
1ee00 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6b 65  as an integer ke
1ee10 79 2e 20 20 49 66 20 61 20 72 65 63 6f 72 64 20  y.  If a record 
1ee20 0a 2a 2a 20 77 69 74 68 20 74 68 61 74 20 6b 65  .** with that ke
1ee30 79 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  y does not exist
1ee40 20 69 6e 20 74 61 62 6c 65 20 6f 66 20 50 31 2c   in table of P1,
1ee50 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32   then jump to P2
1ee60 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 63  . .** If the rec
1ee70 6f 72 64 20 64 6f 65 73 20 65 78 69 73 74 2c 20  ord does exist, 
1ee80 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67  then fall throug
1ee90 68 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 69  h.  The cursor i
1eea0 73 20 6c 65 66 74 20 0a 2a 2a 20 70 6f 69 6e 74  s left .** point
1eeb0 69 6e 67 20 74 6f 20 74 68 65 20 72 65 63 6f 72  ing to the recor
1eec0 64 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a  d if it exists..
1eed0 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
1eee0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
1eef0 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e 64 20  s operation and 
1ef00 4e 6f 74 46 6f 75 6e 64 20 69 73 20 74 68 61 74  NotFound is that
1ef10 20 74 68 69 73 0a 2a 2a 20 6f 70 65 72 61 74 69   this.** operati
1ef20 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 6b  on assumes the k
1ef30 65 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ey is an integer
1ef40 20 61 6e 64 20 74 68 61 74 20 50 31 20 69 73 20   and that P1 is 
1ef50 61 20 74 61 62 6c 65 20 77 68 65 72 65 61 73 0a  a table whereas.
1ef60 2a 2a 20 4e 6f 74 46 6f 75 6e 64 20 61 73 73 75  ** NotFound assu
1ef70 6d 65 73 20 6b 65 79 20 69 73 20 61 20 62 6c 6f  mes key is a blo
1ef80 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72  b constructed fr
1ef90 6f 6d 20 4d 61 6b 65 52 65 63 6f 72 64 20 61 6e  om MakeRecord an
1efa0 64 0a 2a 2a 20 50 31 20 69 73 20 61 6e 20 69 6e  d.** P1 is an in
1efb0 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  dex..**.** See a
1efc0 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46  lso: Found, NotF
1efd0 6f 75 6e 64 2c 20 49 73 55 6e 69 71 75 65 0a 2a  ound, IsUnique.*
1efe0 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 45 78 69  /.case OP_NotExi
1eff0 73 74 73 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  sts: {        /*
1f000 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20   jump, in3 */.  
1f010 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
1f020 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
1f030 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  r;.  int res;.  
1f040 75 36 34 20 69 4b 65 79 3b 0a 0a 20 20 70 49 6e  u64 iKey;..  pIn
1f050 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  3 = &aMem[pOp->p
1f060 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  3];.  assert( pI
1f070 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n3->flags & MEM_
1f080 49 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Int );.  assert(
1f090 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
1f0a0 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
1f0b0 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  r );.  pC = p->a
1f0c0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
1f0d0 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
1f0e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
1f0f0 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  isTable );.  ass
1f100 65 72 74 28 20 70 43 2d 3e 70 73 65 75 64 6f 54  ert( pC->pseudoT
1f110 61 62 6c 65 52 65 67 3d 3d 30 20 29 3b 0a 20 20  ableReg==0 );.  
1f120 70 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72  pCrsr = pC->pCur
1f130 73 6f 72 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  sor;.  if( ALWAY
1f140 53 28 70 43 72 73 72 21 3d 30 29 20 29 7b 0a 20  S(pCrsr!=0) ){. 
1f150 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20     res = 0;.    
1f160 69 4b 65 79 20 3d 20 70 49 6e 33 2d 3e 75 2e 69  iKey = pIn3->u.i
1f170 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1f180 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
1f190 61 63 6b 65 64 28 70 43 72 73 72 2c 20 30 2c 20  acked(pCrsr, 0, 
1f1a0 69 4b 65 79 2c 20 30 2c 20 26 72 65 73 29 3b 0a  iKey, 0, &res);.
1f1b0 20 20 20 20 70 43 2d 3e 6c 61 73 74 52 6f 77 69      pC->lastRowi
1f1c0 64 20 3d 20 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20  d = pIn3->u.i;. 
1f1d0 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61     pC->rowidIsVa
1f1e0 6c 69 64 20 3d 20 72 65 73 3d 3d 30 20 3f 31 3a  lid = res==0 ?1:
1f1f0 30 3b 0a 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52  0;.    pC->nullR
1f200 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e  ow = 0;.    pC->
1f210 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
1f220 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 70  CHE_STALE;.    p
1f230 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
1f240 6f 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  o = 0;.    if( r
1f250 65 73 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  es!=0 ){.      p
1f260 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
1f270 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f280 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 3d  C->rowidIsValid=
1f290 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
1f2a0 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d  pC->seekResult =
1f2b0 20 72 65 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   res;.  }else{. 
1f2c0 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
1f2d0 6e 73 20 77 68 65 6e 20 61 6e 20 61 74 74 65 6d  ns when an attem
1f2e0 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 72 65 61  pt to open a rea
1f2f0 64 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20  d cursor on the 
1f300 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d  .    ** sqlite_m
1f310 61 73 74 65 72 20 74 61 62 6c 65 20 72 65 74 75  aster table retu
1f320 72 6e 73 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  rns SQLITE_EMPTY
1f330 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 63 20  ..    */.    pc 
1f340 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
1f350 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 72     assert( pC->r
1f360 6f 77 69 64 49 73 56 61 6c 69 64 3d 3d 30 20 29  owidIsValid==0 )
1f370 3b 0a 20 20 20 20 70 43 2d 3e 73 65 65 6b 52 65  ;.    pC->seekRe
1f380 73 75 6c 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  sult = 0;.  }.  
1f390 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
1f3a0 6f 64 65 3a 20 53 65 71 75 65 6e 63 65 20 50 31  ode: Sequence P1
1f3b0 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
1f3c0 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 61 76  Find the next av
1f3d0 61 69 6c 61 62 6c 65 20 73 65 71 75 65 6e 63 65  ailable sequence
1f3e0 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72 73   number for curs
1f3f0 6f 72 20 50 31 2e 0a 2a 2a 20 57 72 69 74 65 20  or P1..** Write 
1f400 74 68 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d  the sequence num
1f410 62 65 72 20 69 6e 74 6f 20 72 65 67 69 73 74 65  ber into registe
1f420 72 20 50 32 2e 0a 2a 2a 20 54 68 65 20 73 65 71  r P2..** The seq
1f430 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 6f 6e 20  uence number on 
1f440 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
1f450 63 72 65 6d 65 6e 74 65 64 20 61 66 74 65 72 20  cremented after 
1f460 74 68 69 73 0a 2a 2a 20 69 6e 73 74 72 75 63 74  this.** instruct
1f470 69 6f 6e 2e 20 20 0a 2a 2f 0a 63 61 73 65 20 4f  ion.  .*/.case O
1f480 50 5f 53 65 71 75 65 6e 63 65 3a 20 7b 20 20 20  P_Sequence: {   
1f490 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
1f4a0 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
1f4b0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
1f4c0 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
1f4d0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73  >nCursor );.  as
1f4e0 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 70  sert( p->apCsr[p
1f4f0 4f 70 2d 3e 70 31 5d 21 3d 30 20 29 3b 0a 20 20  Op->p1]!=0 );.  
1f500 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 2d 3e 61  pOut->u.i = p->a
1f510 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 73  pCsr[pOp->p1]->s
1f520 65 71 43 6f 75 6e 74 2b 2b 3b 0a 20 20 62 72 65  eqCount++;.  bre
1f530 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64  ak;.}.../* Opcod
1f540 65 3a 20 4e 65 77 52 6f 77 69 64 20 50 31 20 50  e: NewRowid P1 P
1f550 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 47  2 P3 * *.**.** G
1f560 65 74 20 61 20 6e 65 77 20 69 6e 74 65 67 65 72  et a new integer
1f570 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 28   record number (
1f580 61 2e 6b 2e 61 20 22 72 6f 77 69 64 22 29 20 75  a.k.a "rowid") u
1f590 73 65 64 20 61 73 20 74 68 65 20 6b 65 79 20 74  sed as the key t
1f5a0 6f 20 61 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  o a table..** Th
1f5b0 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
1f5c0 69 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c  is not previousl
1f5d0 79 20 75 73 65 64 20 61 73 20 61 20 6b 65 79 20  y used as a key 
1f5e0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  in the database.
1f5f0 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 63 75  ** table that cu
1f600 72 73 6f 72 20 50 31 20 70 6f 69 6e 74 73 20 74  rsor P1 points t
1f610 6f 2e 20 20 54 68 65 20 6e 65 77 20 72 65 63 6f  o.  The new reco
1f620 72 64 20 6e 75 6d 62 65 72 20 69 73 20 77 72 69  rd number is wri
1f630 74 74 65 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 20  tten.** written 
1f640 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
1f650 2a 2a 0a 2a 2a 20 49 66 20 50 33 3e 30 20 74 68  **.** If P3>0 th
1f660 65 6e 20 50 33 20 69 73 20 61 20 72 65 67 69 73  en P3 is a regis
1f670 74 65 72 20 69 6e 20 74 68 65 20 72 6f 6f 74 20  ter in the root 
1f680 66 72 61 6d 65 20 6f 66 20 74 68 69 73 20 56 44  frame of this VD
1f690 42 45 20 74 68 61 74 20 68 6f 6c 64 73 20 0a 2a  BE that holds .*
1f6a0 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 70 72  * the largest pr
1f6b0 65 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74  eviously generat
1f6c0 65 64 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  ed record number
1f6d0 2e 20 4e 6f 20 6e 65 77 20 72 65 63 6f 72 64 20  . No new record 
1f6e0 6e 75 6d 62 65 72 73 20 61 72 65 0a 2a 2a 20 61  numbers are.** a
1f6f0 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6c 65 73  llowed to be les
1f700 73 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  s than this valu
1f710 65 2e 20 57 68 65 6e 20 74 68 69 73 20 76 61 6c  e. When this val
1f720 75 65 20 72 65 61 63 68 65 73 20 69 74 73 20 6d  ue reaches its m
1f730 61 78 69 6d 75 6d 2c 20 0a 2a 2a 20 61 6e 20 53  aximum, .** an S
1f740 51 4c 49 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72  QLITE_FULL error
1f750 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e 20 54   is generated. T
1f760 68 65 20 50 33 20 72 65 67 69 73 74 65 72 20 69  he P3 register i
1f770 73 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74  s updated with t
1f780 68 65 20 27 0a 2a 2a 20 67 65 6e 65 72 61 74 65  he '.** generate
1f790 64 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e  d record number.
1f7a0 20 54 68 69 73 20 50 33 20 6d 65 63 68 61 6e 69   This P3 mechani
1f7b0 73 6d 20 69 73 20 75 73 65 64 20 74 6f 20 68 65  sm is used to he
1f7c0 6c 70 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  lp implement the
1f7d0 0a 2a 2a 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  .** AUTOINCREMEN
1f7e0 54 20 66 65 61 74 75 72 65 2e 0a 2a 2f 0a 63 61  T feature..*/.ca
1f7f0 73 65 20 4f 50 5f 4e 65 77 52 6f 77 69 64 3a 20  se OP_NewRowid: 
1f800 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  {           /* o
1f810 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a  ut2-prerelease *
1f820 2f 0a 20 20 69 36 34 20 76 3b 20 20 20 20 20 20  /.  i64 v;      
1f830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f840 65 20 6e 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20  e new rowid */. 
1f850 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
1f860 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
1f870 72 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 67 65  r of table to ge
1f880 74 20 74 68 65 20 6e 65 77 20 72 6f 77 69 64 20  t the new rowid 
1f890 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20  */.  int res;   
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f8b0 65 73 75 6c 74 20 6f 66 20 61 6e 20 73 71 6c 69  esult of an sqli
1f8c0 74 65 33 42 74 72 65 65 4c 61 73 74 28 29 20 2a  te3BtreeLast() *
1f8d0 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20  /.  int cnt;    
1f8e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1f8f0 75 6e 74 65 72 20 74 6f 20 6c 69 6d 69 74 20 74  unter to limit t
1f900 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61  he number of sea
1f910 72 63 68 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a  rches */.  Mem *
1f920 70 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pMem;           
1f930 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
1f940 6c 64 69 6e 67 20 6c 61 72 67 65 73 74 20 72 6f  lding largest ro
1f950 77 69 64 20 66 6f 72 20 41 55 54 4f 49 4e 43 52  wid for AUTOINCR
1f960 45 4d 45 4e 54 20 2a 2f 0a 20 20 56 64 62 65 46  EMENT */.  VdbeF
1f970 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 20 20 20  rame *pFrame;   
1f980 20 20 2f 2a 20 52 6f 6f 74 20 66 72 61 6d 65 20    /* Root frame 
1f990 6f 66 20 56 44 42 45 20 2a 2f 0a 0a 20 20 76 20  of VDBE */..  v 
1f9a0 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a  = 0;.  res = 0;.
1f9b0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1f9c0 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
1f9d0 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
1f9e0 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
1f9f0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
1fa00 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( pC!=0 );.  if(
1fa10 20 4e 45 56 45 52 28 70 43 2d 3e 70 43 75 72 73   NEVER(pC->pCurs
1fa20 6f 72 3d 3d 30 29 20 29 7b 0a 20 20 20 20 2f 2a  or==0) ){.    /*
1fa30 20 54 68 65 20 7a 65 72 6f 20 69 6e 69 74 69 61   The zero initia
1fa40 6c 69 7a 61 74 69 6f 6e 20 61 62 6f 76 65 20 69  lization above i
1fa50 73 20 61 6c 6c 20 74 68 61 74 20 69 73 20 6e 65  s all that is ne
1fa60 65 64 65 64 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  eded */.  }else{
1fa70 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  .    /* The next
1fa80 20 72 6f 77 69 64 20 6f 72 20 72 65 63 6f 72 64   rowid or record
1fa90 20 6e 75 6d 62 65 72 20 28 64 69 66 66 65 72 65   number (differe
1faa0 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65  nt terms for the
1fab0 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 74 68 69   same.    ** thi
1fac0 6e 67 29 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ng) is obtained 
1fad0 69 6e 20 61 20 74 77 6f 2d 73 74 65 70 20 61 6c  in a two-step al
1fae0 67 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 0a  gorithm..    **.
1faf0 20 20 20 20 2a 2a 20 46 69 72 73 74 20 77 65 20      ** First we 
1fb00 61 74 74 65 6d 70 74 20 74 6f 20 66 69 6e 64 20  attempt to find 
1fb10 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 69 73  the largest exis
1fb20 74 69 6e 67 20 72 6f 77 69 64 20 61 6e 64 20 61  ting rowid and a
1fb30 64 64 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 74 6f  dd one.    ** to
1fb40 20 74 68 61 74 2e 20 20 42 75 74 20 69 66 20 74   that.  But if t
1fb50 68 65 20 6c 61 72 67 65 73 74 20 65 78 69 73 74  he largest exist
1fb60 69 6e 67 20 72 6f 77 69 64 20 69 73 20 61 6c 72  ing rowid is alr
1fb70 65 61 64 79 20 74 68 65 20 6d 61 78 69 6d 75 6d  eady the maximum
1fb80 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 76 65  .    ** positive
1fb90 20 69 6e 74 65 67 65 72 2c 20 77 65 20 68 61 76   integer, we hav
1fba0 65 20 74 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67  e to fall throug
1fbb0 68 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 0a  h to the second.
1fbc0 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 69 6c 69      ** probabili
1fbd0 73 74 69 63 20 61 6c 67 6f 72 69 74 68 6d 0a 20  stic algorithm. 
1fbe0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1fbf0 20 73 65 63 6f 6e 64 20 61 6c 67 6f 72 69 74 68   second algorith
1fc00 6d 20 69 73 20 74 6f 20 73 65 6c 65 63 74 20 61  m is to select a
1fc10 20 72 6f 77 69 64 20 61 74 20 72 61 6e 64 6f 6d   rowid at random
1fc20 20 61 6e 64 20 73 65 65 20 69 66 0a 20 20 20 20   and see if.    
1fc30 2a 2a 20 69 74 20 61 6c 72 65 61 64 79 20 65 78  ** it already ex
1fc40 69 73 74 73 20 69 6e 20 74 68 65 20 74 61 62 6c  ists in the tabl
1fc50 65 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e  e.  If it does n
1fc60 6f 74 20 65 78 69 73 74 2c 20 77 65 20 68 61 76  ot exist, we hav
1fc70 65 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 65 64  e.    ** succeed
1fc80 65 64 2e 20 20 49 66 20 74 68 65 20 72 61 6e 64  ed.  If the rand
1fc90 6f 6d 20 72 6f 77 69 64 20 64 6f 65 73 20 65 78  om rowid does ex
1fca0 69 73 74 2c 20 77 65 20 73 65 6c 65 63 74 20 61  ist, we select a
1fcb0 20 6e 65 77 20 6f 6e 65 0a 20 20 20 20 2a 2a 20   new one.    ** 
1fcc0 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2c 20 75  and try again, u
1fcd0 70 20 74 6f 20 31 30 30 20 74 69 6d 65 73 2e 0a  p to 100 times..
1fce0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1fcf0 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29  t( pC->isTable )
1fd00 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1fd10 5f 33 32 42 49 54 5f 52 4f 57 49 44 0a 23 20 20  _32BIT_ROWID.#  
1fd20 20 64 65 66 69 6e 65 20 4d 41 58 5f 52 4f 57 49   define MAX_ROWI
1fd30 44 20 30 78 37 66 66 66 66 66 66 66 0a 23 65 6c  D 0x7fffffff.#el
1fd40 73 65 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 20 63  se.    /* Some c
1fd50 6f 6d 70 69 6c 65 72 73 20 63 6f 6d 70 6c 61 69  ompilers complai
1fd60 6e 20 61 62 6f 75 74 20 63 6f 6e 73 74 61 6e 74  n about constant
1fd70 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 30 78  s of the form 0x
1fd80 37 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66  7fffffffffffffff
1fd90 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 73 20  ..    ** Others 
1fda0 63 6f 6d 70 6c 61 69 6e 20 61 62 6f 75 74 20 30  complain about 0
1fdb0 78 37 66 66 66 66 66 66 66 66 66 66 66 66 66 66  x7ffffffffffffff
1fdc0 66 66 4c 4c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ffLL.  The follo
1fdd0 77 69 6e 67 20 6d 61 63 72 6f 20 73 65 65 6d 73  wing macro seems
1fde0 0a 20 20 20 20 2a 2a 20 74 6f 20 70 72 6f 76 69  .    ** to provi
1fdf0 64 65 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  de the constant 
1fe00 77 68 69 6c 65 20 6d 61 6b 69 6e 67 20 61 6c 6c  while making all
1fe10 20 63 6f 6d 70 69 6c 65 72 73 20 68 61 70 70 79   compilers happy
1fe20 2e 0a 20 20 20 20 2a 2f 0a 23 20 20 20 64 65 66  ..    */.#   def
1fe30 69 6e 65 20 4d 41 58 5f 52 4f 57 49 44 20 20 28  ine MAX_ROWID  (
1fe40 69 36 34 29 28 20 28 28 28 75 36 34 29 30 78 37  i64)( (((u64)0x7
1fe50 66 66 66 66 66 66 66 29 3c 3c 33 32 29 20 7c 20  fffffff)<<32) | 
1fe60 28 75 36 34 29 30 78 66 66 66 66 66 66 66 66 20  (u64)0xffffffff 
1fe70 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66  ).#endif..    if
1fe80 28 20 21 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d  ( !pC->useRandom
1fe90 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 76  Rowid ){.      v
1fea0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
1feb0 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 70 43  etCachedRowid(pC
1fec0 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->pCursor);.    
1fed0 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
1fee0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1fef0 65 33 42 74 72 65 65 4c 61 73 74 28 70 43 2d 3e  e3BtreeLast(pC->
1ff00 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a  pCursor, &res);.
1ff10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1ff20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ff30 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72         goto abor
1ff40 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
1ff50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ff60 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
1ff70 20 20 20 20 20 20 20 76 20 3d 20 31 3b 20 20 20         v = 1;   
1ff80 2f 2a 20 49 4d 50 3a 20 52 2d 36 31 39 31 34 2d  /* IMP: R-61914-
1ff90 34 38 30 37 34 20 2a 2f 0a 20 20 20 20 20 20 20  48074 */.       
1ffa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ffb0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1ffc0 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
1ffd0 6c 69 64 28 70 43 2d 3e 70 43 75 72 73 6f 72 29  lid(pC->pCursor)
1ffe0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
1fff0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
20000 65 79 53 69 7a 65 28 70 43 2d 3e 70 43 75 72 73  eySize(pC->pCurs
20010 6f 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20  or, &v);.       
20020 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
20030 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 2f 2a  QLITE_OK );   /*
20040 20 43 61 6e 6e 6f 74 20 66 61 69 6c 20 66 6f 6c   Cannot fail fol
20050 6c 6f 77 69 6e 67 20 42 74 72 65 65 4c 61 73 74  lowing BtreeLast
20060 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  () */.          
20070 69 66 28 20 76 3e 3d 4d 41 58 5f 52 4f 57 49 44  if( v>=MAX_ROWID
20080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20090 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77  pC->useRandomRow
200a0 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  id = 1;.        
200b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
200c0 20 20 20 20 20 76 2b 2b 3b 20 20 20 2f 2a 20 49       v++;   /* I
200d0 4d 50 3a 20 52 2d 32 39 35 33 38 2d 33 34 39 38  MP: R-29538-3498
200e0 37 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d  7 */.          }
200f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20100 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
20110 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
20120 45 4d 45 4e 54 0a 20 20 20 20 20 20 69 66 28 20  EMENT.      if( 
20130 70 4f 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20 20  pOp->p3 ){.     
20140 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61     /* Assert tha
20150 74 20 50 33 20 69 73 20 61 20 76 61 6c 69 64 20  t P3 is a valid 
20160 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a  memory cell. */.
20170 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20180 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20  pOp->p3>0 );.   
20190 20 20 20 20 20 69 66 28 20 70 2d 3e 70 46 72 61       if( p->pFra
201a0 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
201b0 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46  for(pFrame=p->pF
201c0 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50  rame; pFrame->pP
201d0 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46  arent; pFrame=pF
201e0 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  rame->pParent);.
201f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
20200 65 72 74 20 74 68 61 74 20 50 33 20 69 73 20 61  ert that P3 is a
20210 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 63 65   valid memory ce
20220 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ll. */.         
20230 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
20240 3c 3d 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 20 29  <=pFrame->nMem )
20250 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d  ;.          pMem
20260 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d   = &pFrame->aMem
20270 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20  [pOp->p3];.     
20280 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20290 20 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68      /* Assert th
202a0 61 74 20 50 33 20 69 73 20 61 20 76 61 6c 69 64  at P3 is a valid
202b0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f   memory cell. */
202c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
202d0 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e  t( pOp->p3<=p->n
202e0 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Mem );.         
202f0 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f   pMem = &aMem[pO
20300 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20 20 20  p->p3];.        
20310 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
20320 67 65 28 70 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  ge(p, pMem);.   
20330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
20340 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
20350 64 28 70 4d 65 6d 29 20 29 3b 0a 0a 20 20 20 20  d(pMem) );..    
20360 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
20370 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4d 65 6d  CE(pOp->p3, pMem
20380 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20390 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72  e3VdbeMemInteger
203a0 69 66 79 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20  ify(pMem);.     
203b0 20 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d     assert( (pMem
203c0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
203d0 74 29 21 3d 30 20 29 3b 20 20 2f 2a 20 6d 65 6d  t)!=0 );  /* mem
203e0 28 50 33 29 20 68 6f 6c 64 73 20 61 6e 20 69 6e  (P3) holds an in
203f0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  teger */.       
20400 20 69 66 28 20 70 4d 65 6d 2d 3e 75 2e 69 3d 3d   if( pMem->u.i==
20410 4d 41 58 5f 52 4f 57 49 44 20 7c 7c 20 70 43 2d  MAX_ROWID || pC-
20420 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20  >useRandomRowid 
20430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
20440 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 20 20  = SQLITE_FULL;  
20450 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 32 32 37 35   /* IMP: R-12275
20460 2d 36 31 33 33 38 20 2a 2f 0a 20 20 20 20 20 20  -61338 */.      
20470 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
20480 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
20490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
204a0 66 28 20 76 3c 70 4d 65 6d 2d 3e 75 2e 69 2b 31  f( v<pMem->u.i+1
204b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 76 20   ){.          v 
204c0 3d 20 70 4d 65 6d 2d 3e 75 2e 69 20 2b 20 31 3b  = pMem->u.i + 1;
204d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
204e0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 76     pMem->u.i = v
204f0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
20500 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ..      sqlite3B
20510 74 72 65 65 53 65 74 43 61 63 68 65 64 52 6f 77  treeSetCachedRow
20520 69 64 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  id(pC->pCursor, 
20530 76 3c 4d 41 58 5f 52 4f 57 49 44 20 3f 20 76 2b  v<MAX_ROWID ? v+
20540 31 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  1 : 0);.    }.  
20550 20 20 69 66 28 20 70 43 2d 3e 75 73 65 52 61 6e    if( pC->useRan
20560 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  domRowid ){.    
20570 20 20 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    /* IMPLEMENTAT
20580 49 4f 4e 2d 4f 46 3a 20 52 2d 30 37 36 37 37 2d  ION-OF: R-07677-
20590 34 31 38 38 31 20 49 66 20 74 68 65 20 6c 61 72  41881 If the lar
205a0 67 65 73 74 20 52 4f 57 49 44 20 69 73 20 65 71  gest ROWID is eq
205b0 75 61 6c 20 74 6f 20 74 68 65 0a 20 20 20 20 20  ual to the.     
205c0 20 2a 2a 20 6c 61 72 67 65 73 74 20 70 6f 73 73   ** largest poss
205d0 69 62 6c 65 20 69 6e 74 65 67 65 72 20 28 39 32  ible integer (92
205e0 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
205f0 37 29 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  7) then the data
20600 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e  base.      ** en
20610 67 69 6e 65 20 73 74 61 72 74 73 20 70 69 63 6b  gine starts pick
20620 69 6e 67 20 70 6f 73 69 74 69 76 65 20 63 61 6e  ing positive can
20630 64 69 64 61 74 65 20 52 4f 57 49 44 73 20 61 74  didate ROWIDs at
20640 20 72 61 6e 64 6f 6d 20 75 6e 74 69 6c 0a 20 20   random until.  
20650 20 20 20 20 2a 2a 20 69 74 20 66 69 6e 64 73 20      ** it finds 
20660 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20  one that is not 
20670 70 72 65 76 69 6f 75 73 6c 79 20 75 73 65 64 2e  previously used.
20680 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
20690 28 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 3b 20  ( pOp->p3==0 ); 
206a0 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20 62 65   /* We cannot be
206b0 20 69 6e 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64   in random rowid
206c0 20 6d 6f 64 65 20 69 66 20 74 68 69 73 20 69 73   mode if this is
206d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
206e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
206f0 20 61 6e 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e   an AUTOINCREMEN
20700 54 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  T table. */.    
20710 20 20 2f 2a 20 6f 6e 20 74 68 65 20 66 69 72 73    /* on the firs
20720 74 20 61 74 74 65 6d 70 74 2c 20 73 69 6d 70 6c  t attempt, simpl
20730 79 20 64 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  y do one more th
20740 61 6e 20 70 72 65 76 69 6f 75 73 20 2a 2f 0a 20  an previous */. 
20750 20 20 20 20 20 76 20 3d 20 6c 61 73 74 52 6f 77       v = lastRow
20760 69 64 3b 0a 20 20 20 20 20 20 76 20 26 3d 20 28  id;.      v &= (
20770 4d 41 58 5f 52 4f 57 49 44 3e 3e 31 29 3b 20 2f  MAX_ROWID>>1); /
20780 2a 20 65 6e 73 75 72 65 20 64 6f 65 73 6e 27 74  * ensure doesn't
20790 20 67 6f 20 6e 65 67 61 74 69 76 65 20 2a 2f 0a   go negative */.
207a0 20 20 20 20 20 20 76 2b 2b 3b 20 2f 2a 20 65 6e        v++; /* en
207b0 73 75 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  sure non-zero */
207c0 0a 20 20 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a  .      cnt = 0;.
207d0 20 20 20 20 20 20 77 68 69 6c 65 28 20 20 20 28        while(   (
207e0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  (rc = sqlite3Btr
207f0 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
20800 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  (pC->pCursor, 0,
20810 20 28 75 36 34 29 76 2c 0a 20 20 20 20 20 20 20   (u64)v,.       
20820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20840 20 20 20 20 20 20 20 20 20 20 30 2c 20 26 72 65            0, &re
20850 73 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a  s))==SQLITE_OK).
20860 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
20870 72 65 73 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  res==0).        
20880 20 20 20 20 26 26 20 28 2b 2b 63 6e 74 3c 31 30      && (++cnt<10
20890 30 29 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0)){.        /* 
208a0 63 6f 6c 6c 69 73 69 6f 6e 20 2d 20 74 72 79 20  collision - try 
208b0 61 6e 6f 74 68 65 72 20 72 61 6e 64 6f 6d 20 72  another random r
208c0 6f 77 69 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  owid */.        
208d0 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
208e0 73 73 28 73 69 7a 65 6f 66 28 76 29 2c 20 26 76  ss(sizeof(v), &v
208f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
20900 6e 74 3c 35 20 29 7b 0a 20 20 20 20 20 20 20 20  nt<5 ){.        
20910 20 20 2f 2a 20 74 72 79 20 22 73 6d 61 6c 6c 22    /* try "small"
20920 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64 73 20 66   random rowids f
20930 6f 72 20 74 68 65 20 69 6e 69 74 69 61 6c 20 61  or the initial a
20940 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 20  ttempts */.     
20950 20 20 20 20 20 76 20 26 3d 20 30 78 66 66 66 66       v &= 0xffff
20960 66 66 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ff;.        }els
20970 65 7b 0a 20 20 20 20 20 20 20 20 20 20 76 20 26  e{.          v &
20980 3d 20 28 4d 41 58 5f 52 4f 57 49 44 3e 3e 31 29  = (MAX_ROWID>>1)
20990 3b 20 2f 2a 20 65 6e 73 75 72 65 20 64 6f 65 73  ; /* ensure does
209a0 6e 27 74 20 67 6f 20 6e 65 67 61 74 69 76 65 20  n't go negative 
209b0 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
209c0 20 20 20 20 20 76 2b 2b 3b 20 2f 2a 20 65 6e 73       v++; /* ens
209d0 75 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a  ure non-zero */.
209e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
209f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20a00 26 26 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  && res==0 ){.   
20a10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
20a20 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50 3a  _FULL;   /* IMP:
20a30 20 52 2d 33 38 32 31 39 2d 35 33 30 30 32 20 2a   R-38219-53002 *
20a40 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61  /.        goto a
20a50 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
20a60 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
20a70 20 61 73 73 65 72 74 28 20 76 3e 30 20 29 3b 20   assert( v>0 ); 
20a80 20 2f 2a 20 45 56 3a 20 52 2d 34 30 38 31 32 2d   /* EV: R-40812-
20a90 30 33 35 37 30 20 2a 2f 0a 20 20 20 20 7d 0a 20  03570 */.    }. 
20aa0 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61     pC->rowidIsVa
20ab0 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d  lid = 0;.    pC-
20ac0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
20ad0 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63  = 0;.    pC->cac
20ae0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
20af0 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 70 4f  _STALE;.  }.  pO
20b00 75 74 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 62  ut->u.i = v;.  b
20b10 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
20b20 64 65 3a 20 49 6e 73 65 72 74 20 50 31 20 50 32  de: Insert P1 P2
20b30 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20   P3 P4 P5.**.** 
20b40 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
20b50 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66  nto the table of
20b60 20 63 75 72 73 6f 72 20 50 31 2e 20 20 41 20 6e   cursor P1.  A n
20b70 65 77 20 65 6e 74 72 79 20 69 73 0a 2a 2a 20 63  ew entry is.** c
20b80 72 65 61 74 65 64 20 69 66 20 69 74 20 64 6f 65  reated if it doe
20b90 73 6e 27 74 20 61 6c 72 65 61 64 79 20 65 78 69  sn't already exi
20ba0 73 74 20 6f 72 20 74 68 65 20 64 61 74 61 20 66  st or the data f
20bb0 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a  or an existing.*
20bc0 2a 20 65 6e 74 72 79 20 69 73 20 6f 76 65 72 77  * entry is overw
20bd0 72 69 74 74 65 6e 2e 20 20 54 68 65 20 64 61 74  ritten.  The dat
20be0 61 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 4d  a is the value M
20bf0 45 4d 5f 42 6c 6f 62 20 73 74 6f 72 65 64 20 69  EM_Blob stored i
20c00 6e 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6e 75  n register.** nu
20c10 6d 62 65 72 20 50 32 2e 20 54 68 65 20 6b 65 79  mber P2. The key
20c20 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
20c30 67 69 73 74 65 72 20 50 33 2e 20 54 68 65 20 6b  gister P3. The k
20c40 65 79 20 6d 75 73 74 0a 2a 2a 20 62 65 20 61 20  ey must.** be a 
20c50 4d 45 4d 5f 49 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  MEM_Int..**.** I
20c60 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48  f the OPFLAG_NCH
20c70 41 4e 47 45 20 66 6c 61 67 20 6f 66 20 50 35 20  ANGE flag of P5 
20c80 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
20c90 20 72 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e   row change coun
20ca0 74 20 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e  t is.** incremen
20cb0 74 65 64 20 28 6f 74 68 65 72 77 69 73 65 20 6e  ted (otherwise n
20cc0 6f 74 29 2e 20 20 49 66 20 74 68 65 20 4f 50 46  ot).  If the OPF
20cd0 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44 20 66 6c  LAG_LASTROWID fl
20ce0 61 67 20 6f 66 20 50 35 20 69 73 20 73 65 74 2c  ag of P5 is set,
20cf0 0a 2a 2a 20 74 68 65 6e 20 72 6f 77 69 64 20 69  .** then rowid i
20d00 73 20 73 74 6f 72 65 64 20 66 6f 72 20 73 75 62  s stored for sub
20d10 73 65 71 75 65 6e 74 20 72 65 74 75 72 6e 20 62  sequent return b
20d20 79 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  y the.** sqlite3
20d30 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
20d40 69 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 28 6f  id() function (o
20d50 74 68 65 72 77 69 73 65 20 69 74 20 69 73 20 75  therwise it is u
20d60 6e 6d 6f 64 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a  nmodified)..**.*
20d70 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f  * If the OPFLAG_
20d80 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c  USESEEKRESULT fl
20d90 61 67 20 6f 66 20 50 35 20 69 73 20 73 65 74 20  ag of P5 is set 
20da0 61 6e 64 20 69 66 20 74 68 65 20 72 65 73 75 6c  and if the resul
20db0 74 20 6f 66 0a 2a 2a 20 74 68 65 20 6c 61 73 74  t of.** the last
20dc0 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20   seek operation 
20dd0 28 4f 50 5f 4e 6f 74 45 78 69 73 74 73 29 20 77  (OP_NotExists) w
20de0 61 73 20 61 20 73 75 63 63 65 73 73 2c 20 74 68  as a success, th
20df0 65 6e 20 74 68 69 73 0a 2a 2a 20 6f 70 65 72 61  en this.** opera
20e00 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 20 61 74  tion will not at
20e10 74 65 6d 70 74 20 74 6f 20 66 69 6e 64 20 74 68  tempt to find th
20e20 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 6f  e appropriate ro
20e30 77 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 0a 2a  w before doing.*
20e40 2a 20 74 68 65 20 69 6e 73 65 72 74 20 62 75 74  * the insert but
20e50 20 77 69 6c 6c 20 69 6e 73 74 65 61 64 20 6f 76   will instead ov
20e60 65 72 77 72 69 74 65 20 74 68 65 20 72 6f 77 20  erwrite the row 
20e70 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
20e80 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  is.** currently 
20e90 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 50 72  pointing to.  Pr
20ea0 65 73 75 6d 61 62 6c 79 2c 20 74 68 65 20 70 72  esumably, the pr
20eb0 69 6f 72 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  ior OP_NotExists
20ec0 20 6f 70 63 6f 64 65 0a 2a 2a 20 68 61 73 20 61   opcode.** has a
20ed0 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
20ee0 64 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f 72  d the cursor cor
20ef0 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 69 73  rectly.  This is
20f00 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
20f10 0a 2a 2a 20 74 68 61 74 20 62 6f 6f 73 74 73 20  .** that boosts 
20f20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 79 20 61  performance by a
20f30 76 6f 69 64 69 6e 67 20 72 65 64 75 6e 64 61 6e  voiding redundan
20f40 74 20 73 65 65 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49  t seeks..**.** I
20f50 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 49 53 55  f the OPFLAG_ISU
20f60 50 44 41 54 45 20 66 6c 61 67 20 69 73 20 73 65  PDATE flag is se
20f70 74 2c 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63  t, then this opc
20f80 6f 64 65 20 69 73 20 70 61 72 74 20 6f 66 20 61  ode is part of a
20f90 6e 0a 2a 2a 20 55 50 44 41 54 45 20 6f 70 65 72  n.** UPDATE oper
20fa0 61 74 69 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73  ation.  Otherwis
20fb0 65 20 28 69 66 20 74 68 65 20 66 6c 61 67 20 69  e (if the flag i
20fc0 73 20 63 6c 65 61 72 29 20 74 68 65 6e 20 74 68  s clear) then th
20fd0 69 73 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20  is opcode.** is 
20fe0 70 61 72 74 20 6f 66 20 61 6e 20 49 4e 53 45 52  part of an INSER
20ff0 54 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 54 68  T operation.  Th
21000 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20  e difference is 
21010 6f 6e 6c 79 20 69 6d 70 6f 72 74 61 6e 74 20 74  only important t
21020 6f 0a 2a 2a 20 74 68 65 20 75 70 64 61 74 65 20  o.** the update 
21030 68 6f 6f 6b 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  hook..**.** Para
21040 6d 65 74 65 72 20 50 34 20 6d 61 79 20 70 6f 69  meter P4 may poi
21050 6e 74 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63  nt to a string c
21060 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
21070 62 6c 65 2d 6e 61 6d 65 2c 20 6f 72 0a 2a 2a 20  ble-name, or.** 
21080 6d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20  may be NULL. If 
21090 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  it is not NULL, 
210a0 74 68 65 6e 20 74 68 65 20 75 70 64 61 74 65 2d  then the update-
210b0 68 6f 6f 6b 20 0a 2a 2a 20 28 73 71 6c 69 74 65  hook .** (sqlite
210c0 33 2e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63  3.xUpdateCallbac
210d0 6b 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 66 6f  k) is invoked fo
210e0 6c 6c 6f 77 69 6e 67 20 61 20 73 75 63 63 65 73  llowing a succes
210f0 73 66 75 6c 20 69 6e 73 65 72 74 2e 0a 2a 2a 0a  sful insert..**.
21100 2a 2a 20 28 57 41 52 4e 49 4e 47 2f 54 4f 44 4f  ** (WARNING/TODO
21110 3a 20 49 66 20 50 31 20 69 73 20 61 20 70 73 65  : If P1 is a pse
21120 75 64 6f 2d 63 75 72 73 6f 72 20 61 6e 64 20 50  udo-cursor and P
21130 32 20 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79  2 is dynamically
21140 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2c 20 74  .** allocated, t
21150 68 65 6e 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  hen ownership of
21160 20 50 32 20 69 73 20 74 72 61 6e 73 66 65 72 72   P2 is transferr
21170 65 64 20 74 6f 20 74 68 65 20 70 73 65 75 64 6f  ed to the pseudo
21180 2d 63 75 72 73 6f 72 0a 2a 2a 20 61 6e 64 20 72  -cursor.** and r
21190 65 67 69 73 74 65 72 20 50 32 20 62 65 63 6f 6d  egister P2 becom
211a0 65 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 49  es ephemeral.  I
211b0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
211c0 63 68 61 6e 67 65 64 2c 20 74 68 65 0a 2a 2a 20  changed, the.** 
211d0 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65  value of registe
211e0 72 20 50 32 20 77 69 6c 6c 20 74 68 65 6e 20 63  r P2 will then c
211f0 68 61 6e 67 65 2e 20 20 4d 61 6b 65 20 73 75 72  hange.  Make sur
21200 65 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 0a  e this does not.
21210 2a 2a 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ** cause any pro
21220 62 6c 65 6d 73 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  blems.).**.** Th
21230 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f  is instruction o
21240 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 74 61 62  nly works on tab
21250 6c 65 73 2e 20 20 54 68 65 20 65 71 75 69 76 61  les.  The equiva
21260 6c 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  lent instruction
21270 0a 2a 2a 20 66 6f 72 20 69 6e 64 69 63 65 73 20  .** for indices 
21280 69 73 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2e  is OP_IdxInsert.
21290 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .*/./* Opcode: I
212a0 6e 73 65 72 74 49 6e 74 20 50 31 20 50 32 20 50  nsertInt P1 P2 P
212b0 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68  3 P4 P5.**.** Th
212c0 69 73 20 77 6f 72 6b 73 20 65 78 61 63 74 6c 79  is works exactly
212d0 20 6c 69 6b 65 20 4f 50 5f 49 6e 73 65 72 74 20   like OP_Insert 
212e0 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
212f0 6b 65 79 20 69 73 20 74 68 65 0a 2a 2a 20 69 6e  key is the.** in
21300 74 65 67 65 72 20 76 61 6c 75 65 20 50 33 2c 20  teger value P3, 
21310 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  not the value of
21320 20 74 68 65 20 69 6e 74 65 67 65 72 20 73 74 6f   the integer sto
21330 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
21340 50 33 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  P3..*/.case OP_I
21350 6e 73 65 72 74 3a 20 0a 63 61 73 65 20 4f 50 5f  nsert: .case OP_
21360 49 6e 73 65 72 74 49 6e 74 3a 20 7b 0a 20 20 4d  InsertInt: {.  M
21370 65 6d 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  em *pData;      
21380 20 2f 2a 20 4d 45 4d 20 63 65 6c 6c 20 68 6f 6c   /* MEM cell hol
21390 64 69 6e 67 20 64 61 74 61 20 66 6f 72 20 74 68  ding data for th
213a0 65 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69  e record to be i
213b0 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 4d 65 6d  nserted */.  Mem
213c0 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 2f   *pKey;        /
213d0 2a 20 4d 45 4d 20 63 65 6c 6c 20 68 6f 6c 64 69  * MEM cell holdi
213e0 6e 67 20 6b 65 79 20 20 66 6f 72 20 74 68 65 20  ng key  for the 
213f0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 36 34 20  record */.  i64 
21400 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  iKey;         /*
21410 20 54 68 65 20 69 6e 74 65 67 65 72 20 52 4f 57   The integer ROW
21420 49 44 20 6f 72 20 6b 65 79 20 66 6f 72 20 74 68  ID or key for th
21430 65 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69  e record to be i
21440 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 56 64 62  nserted */.  Vdb
21450 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 2f  eCursor *pC;   /
21460 2a 20 43 75 72 73 6f 72 20 74 6f 20 74 61 62 6c  * Cursor to tabl
21470 65 20 69 6e 74 6f 20 77 68 69 63 68 20 69 6e 73  e into which ins
21480 65 72 74 20 69 73 20 77 72 69 74 74 65 6e 20 2a  ert is written *
21490 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 3b 20 20  /.  int nZero;  
214a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
214b0 6f 66 20 7a 65 72 6f 2d 62 79 74 65 73 20 74 6f  of zero-bytes to
214c0 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74   append */.  int
214d0 20 73 65 65 6b 52 65 73 75 6c 74 3b 20 20 20 2f   seekResult;   /
214e0 2a 20 52 65 73 75 6c 74 20 6f 66 20 70 72 69 6f  * Result of prio
214f0 72 20 73 65 65 6b 20 6f 72 20 30 20 69 66 20 6e  r seek or 0 if n
21500 6f 20 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20  o USESEEKRESULT 
21510 66 6c 61 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  flag */.  const 
21520 63 68 61 72 20 2a 7a 44 62 3b 20 20 2f 2a 20 64  char *zDb;  /* d
21530 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2d 20 75  atabase name - u
21540 73 65 64 20 62 79 20 74 68 65 20 75 70 64 61 74  sed by the updat
21550 65 20 68 6f 6f 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e hook */.  cons
21560 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b 20 2f 2a  t char *zTbl; /*
21570 20 54 61 62 6c 65 20 6e 61 6d 65 20 2d 20 75 73   Table name - us
21580 65 64 20 62 79 20 74 68 65 20 6f 70 64 61 74 65  ed by the opdate
21590 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 6e 74 20 6f   hook */.  int o
215a0 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
215b0 4f 70 63 6f 64 65 20 66 6f 72 20 75 70 64 61 74  Opcode for updat
215c0 65 20 68 6f 6f 6b 3a 20 53 51 4c 49 54 45 5f 55  e hook: SQLITE_U
215d0 50 44 41 54 45 20 6f 72 20 53 51 4c 49 54 45 5f  PDATE or SQLITE_
215e0 49 4e 53 45 52 54 20 2a 2f 0a 0a 20 20 70 44 61  INSERT */..  pDa
215f0 74 61 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ta = &aMem[pOp->
21600 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p2];.  assert( p
21610 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
21620 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
21630 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  );.  assert( mem
21640 49 73 56 61 6c 69 64 28 70 44 61 74 61 29 20 29  IsValid(pData) )
21650 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
21660 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
21670 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
21680 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70 43 75   assert( pC->pCu
21690 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rsor!=0 );.  ass
216a0 65 72 74 28 20 70 43 2d 3e 70 73 65 75 64 6f 54  ert( pC->pseudoT
216b0 61 62 6c 65 52 65 67 3d 3d 30 20 29 3b 0a 20 20  ableReg==0 );.  
216c0 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61  assert( pC->isTa
216d0 62 6c 65 20 29 3b 0a 20 20 52 45 47 49 53 54 45  ble );.  REGISTE
216e0 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c  R_TRACE(pOp->p2,
216f0 20 70 44 61 74 61 29 3b 0a 0a 20 20 69 66 28 20   pData);..  if( 
21700 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
21710 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 70 4b  Insert ){.    pK
21720 65 79 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ey = &aMem[pOp->
21730 70 33 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  p3];.    assert(
21740 20 70 4b 65 79 2d 3e 66 6c 61 67 73 20 26 20 4d   pKey->flags & M
21750 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 61 73  EM_Int );.    as
21760 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
21770 28 70 4b 65 79 29 20 29 3b 0a 20 20 20 20 52 45  (pKey) );.    RE
21780 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
21790 2d 3e 70 33 2c 20 70 4b 65 79 29 3b 0a 20 20 20  ->p3, pKey);.   
217a0 20 69 4b 65 79 20 3d 20 70 4b 65 79 2d 3e 75 2e   iKey = pKey->u.
217b0 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  i;.  }else{.    
217c0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
217d0 6f 64 65 3d 3d 4f 50 5f 49 6e 73 65 72 74 49 6e  ode==OP_InsertIn
217e0 74 20 29 3b 0a 20 20 20 20 69 4b 65 79 20 3d 20  t );.    iKey = 
217f0 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 0a 0a 20 20  pOp->p3;.  }..  
21800 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50  if( pOp->p5 & OP
21810 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29 20 70  FLAG_NCHANGE ) p
21820 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 69  ->nChange++;.  i
21830 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46  f( pOp->p5 & OPF
21840 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44 20 29 20  LAG_LASTROWID ) 
21850 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
21860 6c 61 73 74 52 6f 77 69 64 20 3d 20 69 4b 65 79  lastRowid = iKey
21870 3b 0a 20 20 69 66 28 20 70 44 61 74 61 2d 3e 66  ;.  if( pData->f
21880 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
21890 29 7b 0a 20 20 20 20 70 44 61 74 61 2d 3e 7a 20  ){.    pData->z 
218a0 3d 20 30 3b 0a 20 20 20 20 70 44 61 74 61 2d 3e  = 0;.    pData->
218b0 6e 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n = 0;.  }else{.
218c0 20 20 20 20 61 73 73 65 72 74 28 20 70 44 61 74      assert( pDat
218d0 61 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  a->flags & (MEM_
218e0 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29 20 29 3b  Blob|MEM_Str) );
218f0 0a 20 20 7d 0a 20 20 73 65 65 6b 52 65 73 75 6c  .  }.  seekResul
21900 74 20 3d 20 28 28 70 4f 70 2d 3e 70 35 20 26 20  t = ((pOp->p5 & 
21910 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
21920 53 55 4c 54 29 20 3f 20 70 43 2d 3e 73 65 65 6b  SULT) ? pC->seek
21930 52 65 73 75 6c 74 20 3a 20 30 29 3b 0a 20 20 69  Result : 0);.  i
21940 66 28 20 70 44 61 74 61 2d 3e 66 6c 61 67 73 20  f( pData->flags 
21950 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
21960 20 20 6e 5a 65 72 6f 20 3d 20 70 44 61 74 61 2d    nZero = pData-
21970 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 65 6c 73  >u.nZero;.  }els
21980 65 7b 0a 20 20 20 20 6e 5a 65 72 6f 20 3d 20 30  e{.    nZero = 0
21990 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
219a0 74 72 65 65 53 65 74 43 61 63 68 65 64 52 6f 77  treeSetCachedRow
219b0 69 64 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  id(pC->pCursor, 
219c0 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
219d0 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 70 43  e3BtreeInsert(pC
219e0 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 69 4b  ->pCursor, 0, iK
219f0 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
21a10 61 74 61 2d 3e 7a 2c 20 70 44 61 74 61 2d 3e 6e  ata->z, pData->n
21a20 2c 20 6e 5a 65 72 6f 2c 0a 20 20 20 20 20 20 20  , nZero,.       
21a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a40 20 20 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46     pOp->p5 & OPF
21a50 4c 41 47 5f 41 50 50 45 4e 44 2c 20 73 65 65 6b  LAG_APPEND, seek
21a60 52 65 73 75 6c 74 0a 20 20 29 3b 0a 20 20 70 43  Result.  );.  pC
21a70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d  ->rowidIsValid =
21a80 20 30 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72 72   0;.  pC->deferr
21a90 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
21aa0 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
21ab0 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 0a  = CACHE_STALE;..
21ac0 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
21ad0 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72  update-hook if r
21ae0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
21af0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21b00 26 26 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61  && db->xUpdateCa
21b10 6c 6c 62 61 63 6b 20 26 26 20 70 4f 70 2d 3e 70  llback && pOp->p
21b20 34 2e 7a 20 29 7b 0a 20 20 20 20 7a 44 62 20 3d  4.z ){.    zDb =
21b30 20 64 62 2d 3e 61 44 62 5b 70 43 2d 3e 69 44 62   db->aDb[pC->iDb
21b40 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7a 54 62  ].zName;.    zTb
21b50 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  l = pOp->p4.z;. 
21b60 20 20 20 6f 70 20 3d 20 28 28 70 4f 70 2d 3e 70     op = ((pOp->p
21b70 35 20 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44  5 & OPFLAG_ISUPD
21b80 41 54 45 29 20 3f 20 53 51 4c 49 54 45 5f 55 50  ATE) ? SQLITE_UP
21b90 44 41 54 45 20 3a 20 53 51 4c 49 54 45 5f 49 4e  DATE : SQLITE_IN
21ba0 53 45 52 54 29 3b 0a 20 20 20 20 61 73 73 65 72  SERT);.    asser
21bb0 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29  t( pC->isTable )
21bc0 3b 0a 20 20 20 20 64 62 2d 3e 78 55 70 64 61 74  ;.    db->xUpdat
21bd0 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 55  eCallback(db->pU
21be0 70 64 61 74 65 41 72 67 2c 20 6f 70 2c 20 7a 44  pdateArg, op, zD
21bf0 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 29 3b 0a  b, zTbl, iKey);.
21c00 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
21c10 69 44 62 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  iDb>=0 );.  }.  
21c20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
21c30 6f 64 65 3a 20 44 65 6c 65 74 65 20 50 31 20 50  ode: Delete P1 P
21c40 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 44  2 * P4 *.**.** D
21c50 65 6c 65 74 65 20 74 68 65 20 72 65 63 6f 72 64  elete the record
21c60 20 61 74 20 77 68 69 63 68 20 74 68 65 20 50 31   at which the P1
21c70 20 63 75 72 73 6f 72 20 69 73 20 63 75 72 72 65   cursor is curre
21c80 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
21c90 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20  *.** The cursor 
21ca0 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69  will be left poi
21cb0 6e 74 69 6e 67 20 61 74 20 65 69 74 68 65 72 20  nting at either 
21cc0 74 68 65 20 6e 65 78 74 20 6f 72 20 74 68 65 20  the next or the 
21cd0 70 72 65 76 69 6f 75 73 0a 2a 2a 20 72 65 63 6f  previous.** reco
21ce0 72 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  rd in the table.
21cf0 20 49 66 20 69 74 20 69 73 20 6c 65 66 74 20 70   If it is left p
21d00 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6e  ointing at the n
21d10 65 78 74 20 72 65 63 6f 72 64 2c 20 74 68 65 6e  ext record, then
21d20 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 4e 65 78  .** the next Nex
21d30 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  t instruction wi
21d40 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20 20  ll be a no-op.  
21d50 48 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 74  Hence it is OK t
21d60 6f 20 64 65 6c 65 74 65 0a 2a 2a 20 61 20 72 65  o delete.** a re
21d70 63 6f 72 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  cord from within
21d80 20 61 6e 20 4e 65 78 74 20 6c 6f 6f 70 2e 0a 2a   an Next loop..*
21d90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c  *.** If the OPFL
21da0 41 47 5f 4e 43 48 41 4e 47 45 20 66 6c 61 67 20  AG_NCHANGE flag 
21db0 6f 66 20 50 32 20 69 73 20 73 65 74 2c 20 74 68  of P2 is set, th
21dc0 65 6e 20 74 68 65 20 72 6f 77 20 63 68 61 6e 67  en the row chang
21dd0 65 20 63 6f 75 6e 74 20 69 73 0a 2a 2a 20 69 6e  e count is.** in
21de0 63 72 65 6d 65 6e 74 65 64 20 28 6f 74 68 65 72  cremented (other
21df0 77 69 73 65 20 6e 6f 74 29 2e 0a 2a 2a 0a 2a 2a  wise not)..**.**
21e00 20 50 31 20 6d 75 73 74 20 6e 6f 74 20 62 65 20   P1 must not be 
21e10 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 20 49  pseudo-table.  I
21e20 74 20 68 61 73 20 74 6f 20 62 65 20 61 20 72 65  t has to be a re
21e30 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 2a 2a  al table with.**
21e40 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 2e 0a   multiple rows..
21e50 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 6e  **.** If P4 is n
21e60 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  ot NULL, then it
21e70 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
21e80 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 50  the table that P
21e90 31 20 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  1 is.** pointing
21ea0 20 74 6f 2e 20 20 54 68 65 20 75 70 64 61 74 65   to.  The update
21eb0 20 68 6f 6f 6b 20 77 69 6c 6c 20 62 65 20 69 6e   hook will be in
21ec0 76 6f 6b 65 64 2c 20 69 66 20 69 74 20 65 78 69  voked, if it exi
21ed0 73 74 73 2e 0a 2a 2a 20 49 66 20 50 34 20 69 73  sts..** If P4 is
21ee0 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 74   not NULL then t
21ef0 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73  he P1 cursor mus
21f00 74 20 68 61 76 65 20 62 65 65 6e 20 70 6f 73 69  t have been posi
21f10 74 69 6f 6e 65 64 0a 2a 2a 20 75 73 69 6e 67 20  tioned.** using 
21f20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 70 72 69 6f  OP_NotFound prio
21f30 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
21f40 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61  is opcode..*/.ca
21f50 73 65 20 4f 50 5f 44 65 6c 65 74 65 3a 20 7b 0a  se OP_Delete: {.
21f60 20 20 69 36 34 20 69 4b 65 79 3b 0a 20 20 56 64    i64 iKey;.  Vd
21f70 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20  beCursor *pC;.. 
21f80 20 69 4b 65 79 20 3d 20 30 3b 0a 20 20 61 73 73   iKey = 0;.  ass
21f90 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
21fa0 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
21fb0 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20  ursor );.  pC = 
21fc0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
21fd0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  ];.  assert( pC!
21fe0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
21ff0 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29  pC->pCursor!=0 )
22000 3b 20 20 2f 2a 20 4f 6e 6c 79 20 76 61 6c 69 64  ;  /* Only valid
22010 20 66 6f 72 20 72 65 61 6c 20 74 61 62 6c 65 73   for real tables
22020 2c 20 6e 6f 20 70 73 65 75 64 6f 74 61 62 6c 65  , no pseudotable
22030 73 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  s */..  /* If th
22040 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 77 69  e update-hook wi
22050 6c 6c 20 62 65 20 69 6e 76 6f 6b 65 64 2c 20 73  ll be invoked, s
22060 65 74 20 69 4b 65 79 20 74 6f 20 74 68 65 20 72  et iKey to the r
22070 6f 77 69 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a  owid of the.  **
22080 20 72 6f 77 20 62 65 69 6e 67 20 64 65 6c 65 74   row being delet
22090 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ed..  */.  if( d
220a0 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61  b->xUpdateCallba
220b0 63 6b 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 20  ck && pOp->p4.z 
220c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
220d0 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  C->isTable );.  
220e0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 72 6f    assert( pC->ro
220f0 77 69 64 49 73 56 61 6c 69 64 20 29 3b 20 20 2f  widIsValid );  /
22100 2a 20 6c 61 73 74 52 6f 77 69 64 20 73 65 74 20  * lastRowid set 
22110 62 79 20 70 72 65 76 69 6f 75 73 20 4f 50 5f 4e  by previous OP_N
22120 6f 74 46 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 69  otFound */.    i
22130 4b 65 79 20 3d 20 70 43 2d 3e 6c 61 73 74 52 6f  Key = pC->lastRo
22140 77 69 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  wid;.  }..  /* T
22150 68 65 20 4f 50 5f 44 65 6c 65 74 65 20 6f 70 63  he OP_Delete opc
22160 6f 64 65 20 61 6c 77 61 79 73 20 66 6f 6c 6c 6f  ode always follo
22170 77 73 20 61 6e 20 4f 50 5f 4e 6f 74 45 78 69 73  ws an OP_NotExis
22180 74 73 20 6f 72 20 4f 50 5f 4c 61 73 74 20 6f 72  ts or OP_Last or
22190 0a 20 20 2a 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 20  .  ** OP_Column 
221a0 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
221b0 65 20 77 69 74 68 6f 75 74 20 61 6e 79 20 69 6e  e without any in
221c0 74 65 72 76 65 6e 69 6e 67 20 6f 70 65 72 61 74  tervening operat
221d0 69 6f 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 6d  ions that.  ** m
221e0 69 67 68 74 20 6d 6f 76 65 20 6f 72 20 69 6e 76  ight move or inv
221f0 61 6c 69 64 61 74 65 20 74 68 65 20 63 75 72 73  alidate the curs
22200 6f 72 2e 20 20 48 65 6e 63 65 20 63 75 72 73 6f  or.  Hence curso
22210 72 20 70 43 20 69 73 20 61 6c 77 61 79 73 20 70  r pC is always p
22220 6f 69 6e 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  ointing.  ** to 
22230 74 68 65 20 72 6f 77 20 74 6f 20 62 65 20 64 65  the row to be de
22240 6c 65 74 65 64 20 61 6e 64 20 74 68 65 20 73 71  leted and the sq
22250 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
22260 6f 76 65 74 6f 28 29 20 6f 70 65 72 61 74 69 6f  oveto() operatio
22270 6e 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 69 73 20  n.  ** below is 
22280 61 6c 77 61 79 73 20 61 20 6e 6f 2d 6f 70 20 61  always a no-op a
22290 6e 64 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  nd cannot fail. 
222a0 20 57 65 20 77 69 6c 6c 20 72 75 6e 20 69 74 20   We will run it 
222b0 61 6e 79 68 6f 77 2c 20 74 68 6f 75 67 68 2c 0a  anyhow, though,.
222c0 20 20 2a 2a 20 74 6f 20 67 75 61 72 64 20 61 67    ** to guard ag
222d0 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61  ainst future cha
222e0 6e 67 65 73 20 74 6f 20 74 68 65 20 63 6f 64 65  nges to the code
222f0 20 67 65 6e 65 72 61 74 6f 72 2e 0a 20 20 2a 2a   generator..  **
22300 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  /.  assert( pC->
22310 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d  deferredMoveto==
22320 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
22330 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
22340 65 74 6f 28 70 43 29 3b 0a 20 20 69 66 28 20 4e  eto(pC);.  if( N
22350 45 56 45 52 28 72 63 21 3d 53 51 4c 49 54 45 5f  EVER(rc!=SQLITE_
22360 4f 4b 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  OK) ) goto abort
22370 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a  _due_to_error;..
22380 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65    sqlite3BtreeSe
22390 74 43 61 63 68 65 64 52 6f 77 69 64 28 70 43 2d  tCachedRowid(pC-
223a0 3e 70 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20  >pCursor, 0);.  
223b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
223c0 65 44 65 6c 65 74 65 28 70 43 2d 3e 70 43 75 72  eDelete(pC->pCur
223d0 73 6f 72 29 3b 0a 20 20 70 43 2d 3e 63 61 63 68  sor);.  pC->cach
223e0 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
223f0 53 54 41 4c 45 3b 0a 0a 20 20 2f 2a 20 49 6e 76  STALE;..  /* Inv
22400 6f 6b 65 20 74 68 65 20 75 70 64 61 74 65 2d 68  oke the update-h
22410 6f 6f 6b 20 69 66 20 72 65 71 75 69 72 65 64 2e  ook if required.
22420 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
22430 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 78  LITE_OK && db->x
22440 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26  UpdateCallback &
22450 26 20 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20  & pOp->p4.z ){. 
22460 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
22470 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 43 2d  Db = db->aDb[pC-
22480 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >iDb].zName;.   
22490 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
224a0 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  l = pOp->p4.z;. 
224b0 20 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61     db->xUpdateCa
224c0 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 55 70 64 61  llback(db->pUpda
224d0 74 65 41 72 67 2c 20 53 51 4c 49 54 45 5f 44 45  teArg, SQLITE_DE
224e0 4c 45 54 45 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c  LETE, zDb, zTbl,
224f0 20 69 4b 65 79 29 3b 0a 20 20 20 20 61 73 73 65   iKey);.    asse
22500 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29  rt( pC->iDb>=0 )
22510 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d  ;.  }.  if( pOp-
22520 3e 70 32 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48  >p2 & OPFLAG_NCH
22530 41 4e 47 45 20 29 20 70 2d 3e 6e 43 68 61 6e 67  ANGE ) p->nChang
22540 65 2b 2b 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  e++;.  break;.}.
22550 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 65 74  /* Opcode: Reset
22560 43 6f 75 6e 74 20 2a 20 2a 20 2a 20 2a 20 2a 0a  Count * * * * *.
22570 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
22580 6f 66 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  of the change co
22590 75 6e 74 65 72 20 69 73 20 63 6f 70 69 65 64 20  unter is copied 
225a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
225b0 68 61 6e 64 6c 65 0a 2a 2a 20 63 68 61 6e 67 65  handle.** change
225c0 20 63 6f 75 6e 74 65 72 20 28 72 65 74 75 72 6e   counter (return
225d0 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ed by subsequent
225e0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
225f0 33 5f 63 68 61 6e 67 65 73 28 29 29 2e 0a 2a 2a  3_changes())..**
22600 20 54 68 65 6e 20 74 68 65 20 56 4d 73 20 69 6e   Then the VMs in
22610 74 65 72 6e 61 6c 20 63 68 61 6e 67 65 20 63 6f  ternal change co
22620 75 6e 74 65 72 20 72 65 73 65 74 73 20 74 6f 20  unter resets to 
22630 30 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  0..** This is us
22640 65 64 20 62 79 20 74 72 69 67 67 65 72 20 70 72  ed by trigger pr
22650 6f 67 72 61 6d 73 2e 0a 2a 2f 0a 63 61 73 65 20  ograms..*/.case 
22660 4f 50 5f 52 65 73 65 74 43 6f 75 6e 74 3a 20 7b  OP_ResetCount: {
22670 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
22680 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e  tChanges(db, p->
22690 6e 43 68 61 6e 67 65 29 3b 0a 20 20 70 2d 3e 6e  nChange);.  p->n
226a0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 62 72  Change = 0;.  br
226b0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
226c0 65 3a 20 53 6f 72 74 65 72 43 6f 6d 70 61 72 65  e: SorterCompare
226d0 20 50 31 20 50 32 20 50 33 0a 2a 2a 0a 2a 2a 20   P1 P2 P3.**.** 
226e0 50 31 20 69 73 20 61 20 73 6f 72 74 65 72 20 63  P1 is a sorter c
226f0 75 72 73 6f 72 2e 20 54 68 69 73 20 69 6e 73 74  ursor. This inst
22700 72 75 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  ruction compares
22710 20 74 68 65 20 72 65 63 6f 72 64 20 62 6c 6f 62   the record blob
22720 20 69 6e 20 0a 2a 2a 20 72 65 67 69 73 74 65 72   in .** register
22730 20 50 33 20 77 69 74 68 20 74 68 65 20 65 6e 74   P3 with the ent
22740 72 79 20 74 68 61 74 20 74 68 65 20 73 6f 72 74  ry that the sort
22750 65 72 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e  er cursor curren
22760 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
22770 2a 20 49 66 2c 20 65 78 63 6c 75 64 69 6e 67 20  * If, excluding 
22780 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 73  the rowid fields
22790 20 61 74 20 74 68 65 20 65 6e 64 2c 20 74 68 65   at the end, the
227a0 20 74 77 6f 20 72 65 63 6f 72 64 73 20 61 72 65   two records are
227b0 20 61 20 6d 61 74 63 68 2c 0a 2a 2a 20 66 61 6c   a match,.** fal
227c0 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
227d0 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
227e0 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6a 75  n. Otherwise, ju
227f0 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f  mp to instructio
22800 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  n P2..*/.case OP
22810 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 3a 20  _SorterCompare: 
22820 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
22830 70 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a  pC;.  int res;..
22840 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
22850 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
22860 72 74 28 20 69 73 53 6f 72 74 65 72 28 70 43 29  rt( isSorter(pC)
22870 20 29 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d   );.  pIn3 = &aM
22880 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 72  em[pOp->p3];.  r
22890 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  c = sqlite3VdbeS
228a0 6f 72 74 65 72 43 6f 6d 70 61 72 65 28 70 43 2c  orterCompare(pC,
228b0 20 70 49 6e 33 2c 20 26 72 65 73 29 3b 0a 20 20   pIn3, &res);.  
228c0 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 70  if( res ){.    p
228d0 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20  c = pOp->p2-1;. 
228e0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a 0a   }.  break;.};..
228f0 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65  /* Opcode: Sorte
22900 72 44 61 74 61 20 50 31 20 50 32 20 2a 20 2a 20  rData P1 P2 * * 
22910 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e  *.**.** Write in
22920 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 20 74  to register P2 t
22930 68 65 20 63 75 72 72 65 6e 74 20 73 6f 72 74 65  he current sorte
22940 72 20 64 61 74 61 20 66 6f 72 20 73 6f 72 74 65  r data for sorte
22950 72 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2f 0a  r cursor P1..*/.
22960 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 44 61  case OP_SorterDa
22970 74 61 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73  ta: {.  VdbeCurs
22980 6f 72 20 2a 70 43 3b 0a 0a 20 20 70 4f 75 74 20  or *pC;..  pOut 
22990 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
229a0 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
229b0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
229c0 73 65 72 74 28 20 70 43 2d 3e 69 73 53 6f 72 74  sert( pC->isSort
229d0 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  er );.  rc = sql
229e0 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 52 6f  ite3VdbeSorterRo
229f0 77 6b 65 79 28 70 43 2c 20 70 4f 75 74 29 3b 0a  wkey(pC, pOut);.
22a00 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
22a10 70 63 6f 64 65 3a 20 52 6f 77 44 61 74 61 20 50  pcode: RowData P
22a20 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
22a30 20 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67 69   Write into regi
22a40 73 74 65 72 20 50 32 20 74 68 65 20 63 6f 6d 70  ster P2 the comp
22a50 6c 65 74 65 20 72 6f 77 20 64 61 74 61 20 66 6f  lete row data fo
22a60 72 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 20  r cursor P1..** 
22a70 54 68 65 72 65 20 69 73 20 6e 6f 20 69 6e 74 65  There is no inte
22a80 72 70 72 65 74 61 74 69 6f 6e 20 6f 66 20 74 68  rpretation of th
22a90 65 20 64 61 74 61 2e 20 20 0a 2a 2a 20 49 74 20  e data.  .** It 
22aa0 69 73 20 6a 75 73 74 20 63 6f 70 69 65 64 20 6f  is just copied o
22ab0 6e 74 6f 20 74 68 65 20 50 32 20 72 65 67 69 73  nto the P2 regis
22ac0 74 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 0a  ter exactly as .
22ad0 2a 2a 20 69 74 20 69 73 20 66 6f 75 6e 64 20 69  ** it is found i
22ae0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
22af0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
22b00 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73 74  e P1 cursor must
22b10 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   be pointing to 
22b20 61 20 76 61 6c 69 64 20 72 6f 77 20 28 6e 6f 74  a valid row (not
22b30 20 61 20 4e 55 4c 4c 20 72 6f 77 29 0a 2a 2a 20   a NULL row).** 
22b40 6f 66 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2c  of a real table,
22b50 20 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d 74 61   not a pseudo-ta
22b60 62 6c 65 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ble..*/./* Opcod
22b70 65 3a 20 52 6f 77 4b 65 79 20 50 31 20 50 32 20  e: RowKey P1 P2 
22b80 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74  * * *.**.** Writ
22b90 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  e into register 
22ba0 50 32 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  P2 the complete 
22bb0 72 6f 77 20 6b 65 79 20 66 6f 72 20 63 75 72 73  row key for curs
22bc0 6f 72 20 50 31 2e 0a 2a 2a 20 54 68 65 72 65 20  or P1..** There 
22bd0 69 73 20 6e 6f 20 69 6e 74 65 72 70 72 65 74 61  is no interpreta
22be0 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
22bf0 2e 20 20 0a 2a 2a 20 54 68 65 20 6b 65 79 20 69  .  .** The key i
22c00 73 20 63 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68  s copied onto th
22c10 65 20 50 33 20 72 65 67 69 73 74 65 72 20 65 78  e P3 register ex
22c20 61 63 74 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20  actly as .** it 
22c30 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  is found in the 
22c40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
22c50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 63  *.** If the P1 c
22c60 75 72 73 6f 72 20 6d 75 73 74 20 62 65 20 70 6f  ursor must be po
22c70 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69  inting to a vali
22c80 64 20 72 6f 77 20 28 6e 6f 74 20 61 20 4e 55 4c  d row (not a NUL
22c90 4c 20 72 6f 77 29 0a 2a 2a 20 6f 66 20 61 20 72  L row).** of a r
22ca0 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  eal table, not a
22cb0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a   pseudo-table..*
22cc0 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 4b 65 79  /.case OP_RowKey
22cd0 3a 0a 63 61 73 65 20 4f 50 5f 52 6f 77 44 61 74  :.case OP_RowDat
22ce0 61 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  a: {.  VdbeCurso
22cf0 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f  r *pC;.  BtCurso
22d00 72 20 2a 70 43 72 73 72 3b 0a 20 20 75 33 32 20  r *pCrsr;.  u32 
22d10 6e 3b 0a 20 20 69 36 34 20 6e 36 34 3b 0a 0a 20  n;.  i64 n64;.. 
22d20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
22d30 70 2d 3e 70 32 5d 3b 0a 20 20 6d 65 6d 41 62 6f  p->p2];.  memAbo
22d40 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f  utToChange(p, pO
22d50 75 74 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20  ut);..  /* Note 
22d60 74 68 61 74 20 52 6f 77 4b 65 79 20 61 6e 64 20  that RowKey and 
22d70 52 6f 77 44 61 74 61 20 61 72 65 20 72 65 61 6c  RowData are real
22d80 6c 79 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  ly exactly the s
22d90 61 6d 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ame instruction 
22da0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
22db0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
22dc0 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
22dd0 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
22de0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
22df0 65 72 74 28 20 70 43 2d 3e 69 73 53 6f 72 74 65  ert( pC->isSorte
22e00 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
22e10 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 7c 7c  ( pC->isTable ||
22e20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50   pOp->opcode!=OP
22e30 5f 52 6f 77 44 61 74 61 20 29 3b 0a 20 20 61 73  _RowData );.  as
22e40 73 65 72 74 28 20 70 43 2d 3e 69 73 49 6e 64 65  sert( pC->isInde
22e50 78 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  x || pOp->opcode
22e60 3d 3d 4f 50 5f 52 6f 77 44 61 74 61 20 29 3b 0a  ==OP_RowData );.
22e70 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
22e80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
22e90 3e 6e 75 6c 6c 52 6f 77 3d 3d 30 20 29 3b 0a 20  >nullRow==0 );. 
22ea0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70 73 65   assert( pC->pse
22eb0 75 64 6f 54 61 62 6c 65 52 65 67 3d 3d 30 20 29  udoTableReg==0 )
22ec0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
22ed0 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
22ee0 70 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72  pCrsr = pC->pCur
22ef0 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 73  sor;.  assert( s
22f00 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
22f10 72 49 73 56 61 6c 69 64 28 70 43 72 73 72 29 20  rIsValid(pCrsr) 
22f20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 50 5f  );..  /* The OP_
22f30 52 6f 77 4b 65 79 20 61 6e 64 20 4f 50 5f 52 6f  RowKey and OP_Ro
22f40 77 44 61 74 61 20 6f 70 63 6f 64 65 73 20 61 6c  wData opcodes al
22f50 77 61 79 73 20 66 6f 6c 6c 6f 77 20 4f 50 5f 4e  ways follow OP_N
22f60 6f 74 45 78 69 73 74 73 20 6f 72 0a 20 20 2a 2a  otExists or.  **
22f70 20 4f 50 5f 52 65 77 69 6e 64 2f 4f 70 5f 4e 65   OP_Rewind/Op_Ne
22f80 78 74 20 77 69 74 68 20 6e 6f 20 69 6e 74 65 72  xt with no inter
22f90 76 65 6e 69 6e 67 20 69 6e 73 74 72 75 63 74 69  vening instructi
22fa0 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 69  ons that might i
22fb0 6e 76 61 6c 69 64 61 74 65 0a 20 20 2a 2a 20 74  nvalidate.  ** t
22fc0 68 65 20 63 75 72 73 6f 72 2e 20 20 48 65 6e 63  he cursor.  Henc
22fd0 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
22fe0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
22ff0 72 4d 6f 76 65 74 6f 28 29 20 63 61 6c 6c 20 69  rMoveto() call i
23000 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 61 20  s always.  ** a 
23010 6e 6f 2d 6f 70 20 61 6e 64 20 63 61 6e 20 6e 65  no-op and can ne
23020 76 65 72 20 66 61 69 6c 2e 20 20 42 75 74 20 77  ver fail.  But w
23030 65 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c  e leave it in pl
23040 61 63 65 20 61 73 20 61 20 73 61 66 65 74 79 2e  ace as a safety.
23050 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
23060 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
23070 74 6f 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  to==0 );.  rc = 
23080 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
23090 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 69  rMoveto(pC);.  i
230a0 66 28 20 4e 45 56 45 52 28 72 63 21 3d 53 51 4c  f( NEVER(rc!=SQL
230b0 49 54 45 5f 4f 4b 29 20 29 20 67 6f 74 6f 20 61  ITE_OK) ) goto a
230c0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
230d0 72 3b 0a 0a 20 20 69 66 28 20 70 43 2d 3e 69 73  r;..  if( pC->is
230e0 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 61 73 73  Index ){.    ass
230f0 65 72 74 28 20 21 70 43 2d 3e 69 73 54 61 62 6c  ert( !pC->isTabl
23100 65 20 29 3b 0a 20 20 20 20 56 56 41 5f 4f 4e 4c  e );.    VVA_ONL
23110 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42  Y(rc =) sqlite3B
23120 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 72 73  treeKeySize(pCrs
23130 72 2c 20 26 6e 36 34 29 3b 0a 20 20 20 20 61 73  r, &n64);.    as
23140 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
23150 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 54 72 75  _OK );    /* Tru
23160 65 20 62 65 63 61 75 73 65 20 6f 66 20 43 75 72  e because of Cur
23170 73 6f 72 4d 6f 76 65 74 6f 28 29 20 63 61 6c 6c  sorMoveto() call
23180 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 69 66   above */.    if
23190 28 20 6e 36 34 3e 64 62 2d 3e 61 4c 69 6d 69 74  ( n64>db->aLimit
231a0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
231b0 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 20 20 67  NGTH] ){.      g
231c0 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20  oto too_big;.   
231d0 20 7d 0a 20 20 20 20 6e 20 3d 20 28 75 33 32 29   }.    n = (u32)
231e0 6e 36 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n64;.  }else{.  
231f0 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29    VVA_ONLY(rc =)
23200 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
23210 61 53 69 7a 65 28 70 43 72 73 72 2c 20 26 6e 29  aSize(pCrsr, &n)
23220 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
23230 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
23240 20 20 2f 2a 20 44 61 74 61 53 69 7a 65 28 29 20    /* DataSize() 
23250 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20  cannot fail */. 
23260 20 20 20 69 66 28 20 6e 3e 28 75 33 32 29 64 62     if( n>(u32)db
23270 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
23280 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b  LIMIT_LENGTH] ){
23290 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f  .      goto too_
232a0 62 69 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  big;.    }.  }. 
232b0 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
232c0 4d 65 6d 47 72 6f 77 28 70 4f 75 74 2c 20 6e 2c  MemGrow(pOut, n,
232d0 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   0) ){.    goto 
232e0 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 70 4f  no_mem;.  }.  pO
232f0 75 74 2d 3e 6e 20 3d 20 6e 3b 0a 20 20 4d 65 6d  ut->n = n;.  Mem
23300 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
23310 2c 20 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 20 20 69  , MEM_Blob);.  i
23320 66 28 20 70 43 2d 3e 69 73 49 6e 64 65 78 20 29  f( pC->isIndex )
23330 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
23340 65 33 42 74 72 65 65 4b 65 79 28 70 43 72 73 72  e3BtreeKey(pCrsr
23350 2c 20 30 2c 20 6e 2c 20 70 4f 75 74 2d 3e 7a 29  , 0, n, pOut->z)
23360 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
23370 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
23380 44 61 74 61 28 70 43 72 73 72 2c 20 30 2c 20 6e  Data(pCrsr, 0, n
23390 2c 20 70 4f 75 74 2d 3e 7a 29 3b 0a 20 20 7d 0a  , pOut->z);.  }.
233a0 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 53 51    pOut->enc = SQ
233b0 4c 49 54 45 5f 55 54 46 38 3b 20 20 2f 2a 20 49  LITE_UTF8;  /* I
233c0 6e 20 63 61 73 65 20 74 68 65 20 62 6c 6f 62 20  n case the blob 
233d0 69 73 20 65 76 65 72 20 63 61 73 74 20 74 6f 20  is ever cast to 
233e0 74 65 78 74 20 2a 2f 0a 20 20 55 50 44 41 54 45  text */.  UPDATE
233f0 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f  _MAX_BLOBSIZE(pO
23400 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
23410 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 69  ./* Opcode: Rowi
23420 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  d P1 P2 * * *.**
23430 0a 2a 2a 20 53 74 6f 72 65 20 69 6e 20 72 65 67  .** Store in reg
23440 69 73 74 65 72 20 50 32 20 61 6e 20 69 6e 74 65  ister P2 an inte
23450 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
23460 20 6b 65 79 20 6f 66 20 74 68 65 20 74 61 62 6c   key of the tabl
23470 65 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  e entry that.** 
23480 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  P1 is currently 
23490 70 6f 69 6e 74 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20  point to..**.** 
234a0 50 31 20 63 61 6e 20 62 65 20 65 69 74 68 65 72  P1 can be either
234b0 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   an ordinary tab
234c0 6c 65 20 6f 72 20 61 20 76 69 72 74 75 61 6c 20  le or a virtual 
234d0 74 61 62 6c 65 2e 20 20 54 68 65 72 65 20 75 73  table.  There us
234e0 65 64 20 74 6f 0a 2a 2a 20 62 65 20 61 20 73 65  ed to.** be a se
234f0 70 61 72 61 74 65 20 4f 50 5f 56 52 6f 77 69 64  parate OP_VRowid
23500 20 6f 70 63 6f 64 65 20 66 6f 72 20 75 73 65 20   opcode for use 
23510 77 69 74 68 20 76 69 72 74 75 61 6c 20 74 61 62  with virtual tab
23520 6c 65 73 2c 20 62 75 74 20 74 68 69 73 0a 2a 2a  les, but this.**
23530 20 6f 6e 65 20 6f 70 63 6f 64 65 20 6e 6f 77 20   one opcode now 
23540 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 74  works for both t
23550 61 62 6c 65 20 74 79 70 65 73 2e 0a 2a 2f 0a 63  able types..*/.c
23560 61 73 65 20 4f 50 5f 52 6f 77 69 64 3a 20 7b 20  ase OP_Rowid: { 
23570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23580 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61  /* out2-prerelea
23590 73 65 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  se */.  VdbeCurs
235a0 6f 72 20 2a 70 43 3b 0a 20 20 69 36 34 20 76 3b  or *pC;.  i64 v;
235b0 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
235c0 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20  *pVtab;.  const 
235d0 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
235e0 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 61 73 73 65  pModule;..  asse
235f0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
23600 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
23610 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
23620 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
23630 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
23640 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
23650 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65  C->pseudoTableRe
23660 67 3d 3d 30 20 7c 7c 20 70 43 2d 3e 6e 75 6c 6c  g==0 || pC->null
23670 52 6f 77 20 29 3b 0a 20 20 69 66 28 20 70 43 2d  Row );.  if( pC-
23680 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20  >nullRow ){.    
23690 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
236a0 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 62 72 65 61  M_Null;.    brea
236b0 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  k;.  }else if( p
236c0 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
236d0 6f 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 43 2d  o ){.    v = pC-
236e0 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b 0a 23  >movetoTarget;.#
236f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23700 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
23710 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e    }else if( pC->
23720 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20  pVtabCursor ){. 
23730 20 20 20 70 56 74 61 62 20 3d 20 70 43 2d 3e 70     pVtab = pC->p
23740 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
23750 62 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 20 3d  b;.    pModule =
23760 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b   pVtab->pModule;
23770 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 6f  .    assert( pMo
23780 64 75 6c 65 2d 3e 78 52 6f 77 69 64 20 29 3b 0a  dule->xRowid );.
23790 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65      rc = pModule
237a0 2d 3e 78 52 6f 77 69 64 28 70 43 2d 3e 70 56 74  ->xRowid(pC->pVt
237b0 61 62 43 75 72 73 6f 72 2c 20 26 76 29 3b 0a 20  abCursor, &v);. 
237c0 20 20 20 69 6d 70 6f 72 74 56 74 61 62 45 72 72     importVtabErr
237d0 4d 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 23  Msg(p, pVtab);.#
237e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
237f0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
23800 45 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E */.  }else{.  
23810 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70 43    assert( pC->pC
23820 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20  ursor!=0 );.    
23830 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
23840 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29  CursorMoveto(pC)
23850 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
23860 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
23870 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20  _error;.    if( 
23880 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64  pC->rowidIsValid
23890 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 43   ){.      v = pC
238a0 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 20  ->lastRowid;.   
238b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
238c0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
238d0 65 79 53 69 7a 65 28 70 43 2d 3e 70 43 75 72 73  eySize(pC->pCurs
238e0 6f 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 61  or, &v);.      a
238f0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
23900 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 41 6c 77 61  E_OK );  /* Alwa
23910 79 73 20 73 6f 20 62 65 63 61 75 73 65 20 6f 66  ys so because of
23920 20 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29 20   CursorMoveto() 
23930 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 7d 0a 20  above */.    }. 
23940 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d   }.  pOut->u.i =
23950 20 76 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   v;.  break;.}..
23960 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 75 6c 6c 52  /* Opcode: NullR
23970 6f 77 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  ow P1 * * * *.**
23980 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
23990 73 6f 72 20 50 31 20 74 6f 20 61 20 6e 75 6c 6c  sor P1 to a null
239a0 20 72 6f 77 2e 20 20 41 6e 79 20 4f 50 5f 43 6f   row.  Any OP_Co
239b0 6c 75 6d 6e 20 6f 70 65 72 61 74 69 6f 6e 73 0a  lumn operations.
239c0 2a 2a 20 74 68 61 74 20 6f 63 63 75 72 20 77 68  ** that occur wh
239d0 69 6c 65 20 74 68 65 20 63 75 72 73 6f 72 20 69  ile the cursor i
239e0 73 20 6f 6e 20 74 68 65 20 6e 75 6c 6c 20 72 6f  s on the null ro
239f0 77 20 77 69 6c 6c 20 61 6c 77 61 79 73 0a 2a 2a  w will always.**
23a00 20 77 72 69 74 65 20 61 20 4e 55 4c 4c 2e 0a 2a   write a NULL..*
23a10 2f 0a 63 61 73 65 20 4f 50 5f 4e 75 6c 6c 52 6f  /.case OP_NullRo
23a20 77 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  w: {.  VdbeCurso
23a30 72 20 2a 70 43 3b 0a 0a 20 20 61 73 73 65 72 74  r *pC;..  assert
23a40 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
23a50 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
23a60 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
23a70 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
23a80 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
23a90 29 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77  );.  pC->nullRow
23aa0 20 3d 20 31 3b 0a 20 20 70 43 2d 3e 72 6f 77 69   = 1;.  pC->rowi
23ab0 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  dIsValid = 0;.  
23ac0 61 73 73 65 72 74 28 20 70 43 2d 3e 70 43 75 72  assert( pC->pCur
23ad0 73 6f 72 20 7c 7c 20 70 43 2d 3e 70 56 74 61 62  sor || pC->pVtab
23ae0 43 75 72 73 6f 72 20 29 3b 0a 20 20 69 66 28 20  Cursor );.  if( 
23af0 70 43 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  pC->pCursor ){. 
23b00 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
23b10 6c 65 61 72 43 75 72 73 6f 72 28 70 43 2d 3e 70  learCursor(pC->p
23b20 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 62  Cursor);.  }.  b
23b30 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
23b40 64 65 3a 20 4c 61 73 74 20 50 31 20 50 32 20 2a  de: Last P1 P2 *
23b50 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e   * *.**.** The n
23b60 65 78 74 20 75 73 65 20 6f 66 20 74 68 65 20 52  ext use of the R
23b70 6f 77 69 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f  owid or Column o
23b80 72 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69  r Next instructi
23b90 6f 6e 20 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69  on for P1 .** wi
23ba0 6c 6c 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  ll refer to the 
23bb0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
23bc0 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  e database table
23bd0 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66   or index..** If
23be0 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
23bf0 64 65 78 20 69 73 20 65 6d 70 74 79 20 61 6e 64  dex is empty and
23c00 20 50 32 3e 30 2c 20 74 68 65 6e 20 6a 75 6d 70   P2>0, then jump
23c10 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
23c20 50 32 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73 20  P2..** If P2 is 
23c30 30 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  0 or if the tabl
23c40 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20 6e 6f  e or index is no
23c50 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68  t empty, fall th
23c60 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20  rough.** to the 
23c70 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75  following instru
23c80 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ction..*/.case O
23c90 50 5f 4c 61 73 74 3a 20 7b 20 20 20 20 20 20 20  P_Last: {       
23ca0 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64   /* jump */.  Vd
23cb0 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
23cc0 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
23cd0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61  .  int res;..  a
23ce0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
23cf0 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
23d00 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
23d10 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
23d20 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
23d30 43 21 3d 30 20 29 3b 0a 20 20 70 43 72 73 72 20  C!=0 );.  pCrsr 
23d40 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20  = pC->pCursor;. 
23d50 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20   res = 0;.  if( 
23d60 41 4c 57 41 59 53 28 70 43 72 73 72 21 3d 30 29  ALWAYS(pCrsr!=0)
23d70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
23d80 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 70 43  ite3BtreeLast(pC
23d90 72 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a  rsr, &res);.  }.
23da0 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20    pC->nullRow = 
23db0 28 75 38 29 72 65 73 3b 0a 20 20 70 43 2d 3e 64  (u8)res;.  pC->d
23dc0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
23dd0 30 3b 0a 20 20 70 43 2d 3e 72 6f 77 69 64 49 73  0;.  pC->rowidIs
23de0 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 70 43 2d  Valid = 0;.  pC-
23df0 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
23e00 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66  ACHE_STALE;.  if
23e10 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 72  ( pOp->p2>0 && r
23e20 65 73 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70  es ){.    pc = p
23e30 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a  Op->p2 - 1;.  }.
23e40 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20    break;.}.../* 
23e50 4f 70 63 6f 64 65 3a 20 53 6f 72 74 20 50 31 20  Opcode: Sort P1 
23e60 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  P2 * * *.**.** T
23e70 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
23e80 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
23e90 20 74 68 69 6e 67 20 61 73 20 4f 50 5f 52 65 77   thing as OP_Rew
23ea0 69 6e 64 20 65 78 63 65 70 74 20 74 68 61 74 0a  ind except that.
23eb0 2a 2a 20 69 74 20 69 6e 63 72 65 6d 65 6e 74 73  ** it increments
23ec0 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
23ed0 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
23ee0 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
23ef0 67 2e 0a 2a 2a 0a 2a 2a 20 53 6f 72 74 69 6e 67  g..**.** Sorting
23f00 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64   is accomplished
23f10 20 62 79 20 77 72 69 74 69 6e 67 20 72 65 63 6f   by writing reco
23f20 72 64 73 20 69 6e 74 6f 20 61 20 73 6f 72 74 69  rds into a sorti
23f30 6e 67 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65  ng index,.** the
23f40 6e 20 72 65 77 69 6e 64 69 6e 67 20 74 68 61 74  n rewinding that
23f50 20 69 6e 64 65 78 20 61 6e 64 20 70 6c 61 79 69   index and playi
23f60 6e 67 20 69 74 20 62 61 63 6b 20 66 72 6f 6d 20  ng it back from 
23f70 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20  beginning to.** 
23f80 65 6e 64 2e 20 20 57 65 20 75 73 65 20 74 68 65  end.  We use the
23f90 20 4f 50 5f 53 6f 72 74 20 6f 70 63 6f 64 65 20   OP_Sort opcode 
23fa0 69 6e 73 74 65 61 64 20 6f 66 20 4f 50 5f 52 65  instead of OP_Re
23fb0 77 69 6e 64 20 74 6f 20 64 6f 20 74 68 65 0a 2a  wind to do the.*
23fc0 2a 20 72 65 77 69 6e 64 69 6e 67 20 73 6f 20 74  * rewinding so t
23fd0 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 76  hat the global v
23fe0 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  ariable will be 
23ff0 69 6e 63 72 65 6d 65 6e 74 65 64 20 61 6e 64 0a  incremented and.
24000 2a 2a 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65  ** regression te
24010 73 74 73 20 63 61 6e 20 64 65 74 65 72 6d 69 6e  sts can determin
24020 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
24030 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69   the optimizer i
24040 73 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 6f  s.** correctly o
24050 70 74 69 6d 69 7a 69 6e 67 20 6f 75 74 20 73 6f  ptimizing out so
24060 72 74 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  rts..*/.case OP_
24070 53 6f 72 74 65 72 53 6f 72 74 3a 20 20 20 20 2f  SorterSort:    /
24080 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f  * jump */.case O
24090 50 5f 53 6f 72 74 3a 20 7b 20 20 20 20 20 20 20  P_Sort: {       
240a0 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 23 69 66 64   /* jump */.#ifd
240b0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
240c0 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f   sqlite3_sort_co
240d0 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  unt++;.  sqlite3
240e0 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2d 2d 3b  _search_count--;
240f0 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 61 43 6f  .#endif.  p->aCo
24100 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53 54 4d  unter[SQLITE_STM
24110 54 53 54 41 54 55 53 5f 53 4f 52 54 2d 31 5d 2b  TSTATUS_SORT-1]+
24120 2b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72  +;.  /* Fall thr
24130 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 52 65 77  ough into OP_Rew
24140 69 6e 64 20 2a 2f 0a 7d 0a 2f 2a 20 4f 70 63 6f  ind */.}./* Opco
24150 64 65 3a 20 52 65 77 69 6e 64 20 50 31 20 50 32  de: Rewind P1 P2
24160 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65   * * *.**.** The
24170 20 6e 65 78 74 20 75 73 65 20 6f 66 20 74 68 65   next use of the
24180 20 52 6f 77 69 64 20 6f 72 20 43 6f 6c 75 6d 6e   Rowid or Column
24190 20 6f 72 20 4e 65 78 74 20 69 6e 73 74 72 75 63   or Next instruc
241a0 74 69 6f 6e 20 66 6f 72 20 50 31 20 0a 2a 2a 20  tion for P1 .** 
241b0 77 69 6c 6c 20 72 65 66 65 72 20 74 6f 20 74 68  will refer to th
241c0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
241d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61   the database ta
241e0 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  ble or index..**
241f0 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   If the table or
24200 20 69 6e 64 65 78 20 69 73 20 65 6d 70 74 79 20   index is empty 
24210 61 6e 64 20 50 32 3e 30 2c 20 74 68 65 6e 20 6a  and P2>0, then j
24220 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
24230 74 6f 20 50 32 2e 0a 2a 2a 20 49 66 20 50 32 20  to P2..** If P2 
24240 69 73 20 30 20 6f 72 20 69 66 20 74 68 65 20 74  is 0 or if the t
24250 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73  able or index is
24260 20 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c   not empty, fall
24270 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74   through.** to t
24280 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73  he following ins
24290 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73  truction..*/.cas
242a0 65 20 4f 50 5f 52 65 77 69 6e 64 3a 20 7b 20 20  e OP_Rewind: {  
242b0 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
242c0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
242d0 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  C;.  BtCursor *p
242e0 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b  Crsr;.  int res;
242f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
24300 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
24310 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
24320 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
24330 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
24340 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
24350 73 73 65 72 74 28 20 70 43 2d 3e 69 73 53 6f 72  ssert( pC->isSor
24360 74 65 72 3d 3d 28 70 4f 70 2d 3e 6f 70 63 6f 64  ter==(pOp->opcod
24370 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  e==OP_SorterSort
24380 29 20 29 3b 0a 20 20 72 65 73 20 3d 20 31 3b 0a  ) );.  res = 1;.
24390 20 20 69 66 28 20 69 73 53 6f 72 74 65 72 28 70    if( isSorter(p
243a0 43 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  C) ){.    rc = s
243b0 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
243c0 52 65 77 69 6e 64 28 64 62 2c 20 70 43 2c 20 26  Rewind(db, pC, &
243d0 72 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  res);.  }else{. 
243e0 20 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 70     pCrsr = pC->p
243f0 43 75 72 73 6f 72 3b 0a 20 20 20 20 61 73 73 65  Cursor;.    asse
24400 72 74 28 20 70 43 72 73 72 20 29 3b 0a 20 20 20  rt( pCrsr );.   
24410 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
24420 65 65 46 69 72 73 74 28 70 43 72 73 72 2c 20 26  eeFirst(pCrsr, &
24430 72 65 73 29 3b 0a 20 20 20 20 70 43 2d 3e 61 74  res);.    pC->at
24440 46 69 72 73 74 20 3d 20 72 65 73 3d 3d 30 20 3f  First = res==0 ?
24450 31 3a 30 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66  1:0;.    pC->def
24460 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
24470 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74  .    pC->cacheSt
24480 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
24490 4c 45 3b 0a 20 20 20 20 70 43 2d 3e 72 6f 77 69  LE;.    pC->rowi
244a0 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  dIsValid = 0;.  
244b0 7d 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20  }.  pC->nullRow 
244c0 3d 20 28 75 38 29 72 65 73 3b 0a 20 20 61 73 73  = (u8)res;.  ass
244d0 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26  ert( pOp->p2>0 &
244e0 26 20 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4f 70  & pOp->p2<p->nOp
244f0 20 29 3b 0a 20 20 69 66 28 20 72 65 73 20 29 7b   );.  if( res ){
24500 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70  .    pc = pOp->p
24510 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65  2 - 1;.  }.  bre
24520 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
24530 3a 20 4e 65 78 74 20 50 31 20 50 32 20 2a 20 50  : Next P1 P2 * P
24540 34 20 50 35 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e  4 P5.**.** Advan
24550 63 65 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20  ce cursor P1 so 
24560 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
24570 6f 20 74 68 65 20 6e 65 78 74 20 6b 65 79 2f 64  o the next key/d
24580 61 74 61 20 70 61 69 72 20 69 6e 20 69 74 73 0a  ata pair in its.
24590 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ** table or inde
245a0 78 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  x.  If there are
245b0 20 6e 6f 20 6d 6f 72 65 20 6b 65 79 2f 76 61 6c   no more key/val
245c0 75 65 20 70 61 69 72 73 20 74 68 65 6e 20 66 61  ue pairs then fa
245d0 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f  ll through.** to
245e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
245f0 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 42 75 74  nstruction.  But
24600 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
24610 64 76 61 6e 63 65 20 77 61 73 20 73 75 63 63 65  dvance was succe
24620 73 73 66 75 6c 2c 0a 2a 2a 20 6a 75 6d 70 20 69  ssful,.** jump i
24630 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32  mmediately to P2
24640 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 31 20 63  ..**.** The P1 c
24650 75 72 73 6f 72 20 6d 75 73 74 20 62 65 20 66 6f  ursor must be fo
24660 72 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2c 20  r a real table, 
24670 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d 74 61 62  not a pseudo-tab
24680 6c 65 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20  le..**.** P4 is 
24690 61 6c 77 61 79 73 20 6f 66 20 74 79 70 65 20 50  always of type P
246a0 34 5f 41 44 56 41 4e 43 45 2e 20 54 68 65 20 66  4_ADVANCE. The f
246b0 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20  unction pointer 
246c0 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 73 71 6c  points to.** sql
246d0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e  ite3BtreeNext().
246e0 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20  .**.** If P5 is 
246f0 70 6f 73 69 74 69 76 65 20 61 6e 64 20 74 68 65  positive and the
24700 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20   jump is taken, 
24710 74 68 65 6e 20 65 76 65 6e 74 20 63 6f 75 6e 74  then event count
24720 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 35 2d  er.** number P5-
24730 31 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  1 in the prepare
24740 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 69  d statement is i
24750 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a  ncremented..**.*
24760 2a 20 53 65 65 20 61 6c 73 6f 3a 20 50 72 65 76  * See also: Prev
24770 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50  .*/./* Opcode: P
24780 72 65 76 20 50 31 20 50 32 20 2a 20 2a 20 50 35  rev P1 P2 * * P5
24790 0a 2a 2a 0a 2a 2a 20 42 61 63 6b 20 75 70 20 63  .**.** Back up c
247a0 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
247b0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
247c0 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2f 64  e previous key/d
247d0 61 74 61 20 70 61 69 72 20 69 6e 20 69 74 73 0a  ata pair in its.
247e0 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ** table or inde
247f0 78 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  x.  If there is 
24800 6e 6f 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2f  no previous key/
24810 76 61 6c 75 65 20 70 61 69 72 73 20 74 68 65 6e  value pairs then
24820 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a   fall through.**
24830 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
24840 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  g instruction.  
24850 42 75 74 20 69 66 20 74 68 65 20 63 75 72 73 6f  But if the curso
24860 72 20 62 61 63 6b 75 70 20 77 61 73 20 73 75 63  r backup was suc
24870 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 6a 75 6d 70  cessful,.** jump
24880 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
24890 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 31  P2..**.** The P1
248a0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 20   cursor must be 
248b0 66 6f 72 20 61 20 72 65 61 6c 20 74 61 62 6c 65  for a real table
248c0 2c 20 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d 74  , not a pseudo-t
248d0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69  able..**.** P4 i
248e0 73 20 61 6c 77 61 79 73 20 6f 66 20 74 79 70 65  s always of type
248f0 20 50 34 5f 41 44 56 41 4e 43 45 2e 20 54 68 65   P4_ADVANCE. The
24900 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
24910 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 73  r points to.** s
24920 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
24930 6f 75 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ous()..**.** If 
24940 50 35 20 69 73 20 70 6f 73 69 74 69 76 65 20 61  P5 is positive a
24950 6e 64 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74  nd the jump is t
24960 61 6b 65 6e 2c 20 74 68 65 6e 20 65 76 65 6e 74  aken, then event
24970 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 6e 75 6d 62   counter.** numb
24980 65 72 20 50 35 2d 31 20 69 6e 20 74 68 65 20 70  er P5-1 in the p
24990 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
249a0 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
249b0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72  ..*/.case OP_Sor
249c0 74 65 72 4e 65 78 74 3a 20 20 20 20 2f 2a 20 6a  terNext:    /* j
249d0 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 50  ump */.case OP_P
249e0 72 65 76 3a 20 20 20 20 20 20 20 20 20 20 2f 2a  rev:          /*
249f0 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50   jump */.case OP
24a00 5f 4e 65 78 74 3a 20 7b 20 20 20 20 20 20 20 20  _Next: {        
24a10 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62  /* jump */.  Vdb
24a20 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69  eCursor *pC;.  i
24a30 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72  nt res;..  asser
24a40 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
24a50 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
24a60 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sor );.  assert(
24a70 20 70 4f 70 2d 3e 70 35 3c 3d 41 72 72 61 79 53   pOp->p5<=ArrayS
24a80 69 7a 65 28 70 2d 3e 61 43 6f 75 6e 74 65 72 29  ize(p->aCounter)
24a90 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
24aa0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
24ab0 69 66 28 20 70 43 3d 3d 30 20 29 7b 0a 20 20 20  if( pC==0 ){.   
24ac0 20 62 72 65 61 6b 3b 20 20 2f 2a 20 53 65 65 20   break;  /* See 
24ad0 74 69 63 6b 65 74 20 23 32 32 37 33 20 2a 2f 0a  ticket #2273 */.
24ae0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
24af0 2d 3e 69 73 53 6f 72 74 65 72 3d 3d 28 70 4f 70  ->isSorter==(pOp
24b00 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72  ->opcode==OP_Sor
24b10 74 65 72 4e 65 78 74 29 20 29 3b 0a 20 20 69 66  terNext) );.  if
24b20 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 20 29  ( isSorter(pC) )
24b30 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  {.    assert( pO
24b40 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f  p->opcode==OP_So
24b50 72 74 65 72 4e 65 78 74 20 29 3b 0a 20 20 20 20  rterNext );.    
24b60 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
24b70 53 6f 72 74 65 72 4e 65 78 74 28 64 62 2c 20 70  SorterNext(db, p
24b80 43 2c 20 26 72 65 73 29 3b 0a 20 20 7d 65 6c 73  C, &res);.  }els
24b90 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 31 3b 0a  e{.    res = 1;.
24ba0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
24bb0 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d  deferredMoveto==
24bc0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
24bd0 20 70 43 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a   pC->pCursor );.
24be0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
24bf0 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74  >opcode!=OP_Next
24c00 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76   || pOp->p4.xAdv
24c10 61 6e 63 65 3d 3d 73 71 6c 69 74 65 33 42 74 72  ance==sqlite3Btr
24c20 65 65 4e 65 78 74 20 29 3b 0a 20 20 20 20 61 73  eeNext );.    as
24c30 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
24c40 65 21 3d 4f 50 5f 50 72 65 76 20 7c 7c 20 70 4f  e!=OP_Prev || pO
24c50 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d  p->p4.xAdvance==
24c60 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
24c70 69 6f 75 73 20 29 3b 0a 20 20 20 20 72 63 20 3d  ious );.    rc =
24c80 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
24c90 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26  e(pC->pCursor, &
24ca0 72 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 2d 3e  res);.  }.  pC->
24cb0 6e 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29 72 65  nullRow = (u8)re
24cc0 73 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74  s;.  pC->cacheSt
24cd0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
24ce0 4c 45 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30  LE;.  if( res==0
24cf0 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70   ){.    pc = pOp
24d00 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 69 66  ->p2 - 1;.    if
24d10 28 20 70 4f 70 2d 3e 70 35 20 29 20 70 2d 3e 61  ( pOp->p5 ) p->a
24d20 43 6f 75 6e 74 65 72 5b 70 4f 70 2d 3e 70 35 2d  Counter[pOp->p5-
24d30 31 5d 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c  1]++;.#ifdef SQL
24d40 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c  ITE_TEST.    sql
24d50 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
24d60 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  t++;.#endif.  }.
24d70 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c    pC->rowidIsVal
24d80 69 64 20 3d 20 30 3b 0a 20 20 67 6f 74 6f 20 63  id = 0;.  goto c
24d90 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75  heck_for_interru
24da0 70 74 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  pt;.}../* Opcode
24db0 3a 20 49 64 78 49 6e 73 65 72 74 20 50 31 20 50  : IdxInsert P1 P
24dc0 32 20 50 33 20 2a 20 50 35 0a 2a 2a 0a 2a 2a 20  2 P3 * P5.**.** 
24dd0 52 65 67 69 73 74 65 72 20 50 32 20 68 6f 6c 64  Register P2 hold
24de0 73 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 6b  s an SQL index k
24df0 65 79 20 6d 61 64 65 20 75 73 69 6e 67 20 74 68  ey made using th
24e00 65 0a 2a 2a 20 4d 61 6b 65 52 65 63 6f 72 64 20  e.** MakeRecord 
24e10 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 54  instructions.  T
24e20 68 69 73 20 6f 70 63 6f 64 65 20 77 72 69 74 65  his opcode write
24e30 73 20 74 68 61 74 20 6b 65 79 0a 2a 2a 20 69 6e  s that key.** in
24e40 74 6f 20 74 68 65 20 69 6e 64 65 78 20 50 31 2e  to the index P1.
24e50 20 20 44 61 74 61 20 66 6f 72 20 74 68 65 20 65    Data for the e
24e60 6e 74 72 79 20 69 73 20 6e 69 6c 2e 0a 2a 2a 0a  ntry is nil..**.
24e70 2a 2a 20 50 33 20 69 73 20 61 20 66 6c 61 67 20  ** P3 is a flag 
24e80 74 68 61 74 20 70 72 6f 76 69 64 65 73 20 61 20  that provides a 
24e90 68 69 6e 74 20 74 6f 20 74 68 65 20 62 2d 74 72  hint to the b-tr
24ea0 65 65 20 6c 61 79 65 72 20 74 68 61 74 20 74 68  ee layer that th
24eb0 69 73 0a 2a 2a 20 69 6e 73 65 72 74 20 69 73 20  is.** insert is 
24ec0 6c 69 6b 65 6c 79 20 74 6f 20 62 65 20 61 6e 20  likely to be an 
24ed0 61 70 70 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  append..**.** Th
24ee0 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f  is instruction o
24ef0 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 69 6e  nly works for in
24f00 64 69 63 65 73 2e 20 20 54 68 65 20 65 71 75 69  dices.  The equi
24f10 76 61 6c 65 6e 74 20 69 6e 73 74 72 75 63 74 69  valent instructi
24f20 6f 6e 0a 2a 2a 20 66 6f 72 20 74 61 62 6c 65 73  on.** for tables
24f30 20 69 73 20 4f 50 5f 49 6e 73 65 72 74 2e 0a 2a   is OP_Insert..*
24f40 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72  /.case OP_Sorter
24f50 49 6e 73 65 72 74 3a 20 20 20 20 20 20 20 2f 2a  Insert:       /*
24f60 20 69 6e 32 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in2 */.case OP_
24f70 49 64 78 49 6e 73 65 72 74 3a 20 7b 20 20 20 20  IdxInsert: {    
24f80 20 20 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20      /* in2 */.  
24f90 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
24fa0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
24fb0 72 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20  r;.  int nKey;. 
24fc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65   const char *zKe
24fd0 79 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  y;..  assert( pO
24fe0 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
24ff0 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
25000 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
25010 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
25020 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
25030 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 53   assert( pC->isS
25040 6f 72 74 65 72 3d 3d 28 70 4f 70 2d 3e 6f 70 63  orter==(pOp->opc
25050 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 49 6e  ode==OP_SorterIn
25060 73 65 72 74 29 20 29 3b 0a 20 20 70 49 6e 32 20  sert) );.  pIn2 
25070 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
25080 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 32  ;.  assert( pIn2
25090 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
250a0 6f 62 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20  ob );.  pCrsr = 
250b0 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  pC->pCursor;.  i
250c0 66 28 20 41 4c 57 41 59 53 28 70 43 72 73 72 21  f( ALWAYS(pCrsr!
250d0 3d 30 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =0) ){.    asser
250e0 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d  t( pC->isTable==
250f0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 45 78  0 );.    rc = Ex
25100 70 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29 3b 0a  pandBlob(pIn2);.
25110 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
25130 66 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 20  f( isSorter(pC) 
25140 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
25150 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
25160 72 57 72 69 74 65 28 64 62 2c 20 70 43 2c 20 70  rWrite(db, pC, p
25170 49 6e 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  In2);.      }els
25180 65 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 20  e{.        nKey 
25190 3d 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 20 20 20  = pIn2->n;.     
251a0 20 20 20 7a 4b 65 79 20 3d 20 70 49 6e 32 2d 3e     zKey = pIn2->
251b0 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  z;.        rc = 
251c0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
251d0 72 74 28 70 43 72 73 72 2c 20 7a 4b 65 79 2c 20  rt(pCrsr, zKey, 
251e0 6e 4b 65 79 2c 20 22 22 2c 20 30 2c 20 30 2c 20  nKey, "", 0, 0, 
251f0 70 4f 70 2d 3e 70 33 2c 20 0a 20 20 20 20 20 20  pOp->p3, .      
25200 20 20 20 20 20 20 28 28 70 4f 70 2d 3e 70 35 20        ((pOp->p5 
25210 26 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  & OPFLAG_USESEEK
25220 52 45 53 55 4c 54 29 20 3f 20 70 43 2d 3e 73 65  RESULT) ? pC->se
25230 65 6b 52 65 73 75 6c 74 20 3a 20 30 29 0a 20 20  ekResult : 0).  
25240 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
25250 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d       assert( pC-
25260 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d  >deferredMoveto=
25270 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43  =0 );.        pC
25280 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
25290 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20  CACHE_STALE;.   
252a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
252b0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
252c0 63 6f 64 65 3a 20 49 64 78 44 65 6c 65 74 65 20  code: IdxDelete 
252d0 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
252e0 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ** The content o
252f0 66 20 50 33 20 72 65 67 69 73 74 65 72 73 20 73  f P3 registers s
25300 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 69 73  tarting at regis
25310 74 65 72 20 50 32 20 66 6f 72 6d 0a 2a 2a 20 61  ter P2 form.** a
25320 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  n unpacked index
25330 20 6b 65 79 2e 20 54 68 69 73 20 6f 70 63 6f 64   key. This opcod
25340 65 20 72 65 6d 6f 76 65 73 20 74 68 61 74 20 65  e removes that e
25350 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 0a 2a  ntry from the .*
25360 2a 20 69 6e 64 65 78 20 6f 70 65 6e 65 64 20 62  * index opened b
25370 79 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2f 0a  y cursor P1..*/.
25380 63 61 73 65 20 4f 50 5f 49 64 78 44 65 6c 65 74  case OP_IdxDelet
25390 65 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  e: {.  VdbeCurso
253a0 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f  r *pC;.  BtCurso
253b0 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20  r *pCrsr;.  int 
253c0 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  res;.  UnpackedR
253d0 65 63 6f 72 64 20 72 3b 0a 0a 20 20 61 73 73 65  ecord r;..  asse
253e0 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b  rt( pOp->p3>0 );
253f0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
25400 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b  p2>0 && pOp->p2+
25410 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p3<=p->nMem
25420 2b 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +1 );.  assert( 
25430 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
25440 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
25450 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
25460 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
25470 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
25480 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 70  .  pCrsr = pC->p
25490 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 41 4c  Cursor;.  if( AL
254a0 57 41 59 53 28 70 43 72 73 72 21 3d 30 29 20 29  WAYS(pCrsr!=0) )
254b0 7b 0a 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f  {.    r.pKeyInfo
254c0 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b   = pC->pKeyInfo;
254d0 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20  .    r.nField = 
254e0 28 75 31 36 29 70 4f 70 2d 3e 70 33 3b 0a 20 20  (u16)pOp->p3;.  
254f0 20 20 72 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20    r.flags = 0;. 
25500 20 20 20 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65     r.aMem = &aMe
25510 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 23 69 66 64  m[pOp->p2];.#ifd
25520 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
25530 20 20 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72      { int i; for
25540 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64  (i=0; i<r.nField
25550 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 6d  ; i++) assert( m
25560 65 6d 49 73 56 61 6c 69 64 28 26 72 2e 61 4d 65  emIsValid(&r.aMe
25570 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69  m[i]) ); }.#endi
25580 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
25590 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
255a0 61 63 6b 65 64 28 70 43 72 73 72 2c 20 26 72 2c  acked(pCrsr, &r,
255b0 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20   0, 0, &res);.  
255c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
255d0 5f 4f 4b 20 26 26 20 72 65 73 3d 3d 30 20 29 7b  _OK && res==0 ){
255e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
255f0 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 70  te3BtreeDelete(p
25600 43 72 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Crsr);.    }.   
25610 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66   assert( pC->def
25620 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29  erredMoveto==0 )
25630 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53  ;.    pC->cacheS
25640 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
25650 41 4c 45 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  ALE;.  }.  break
25660 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
25670 49 64 78 52 6f 77 69 64 20 50 31 20 50 32 20 2a  IdxRowid P1 P2 *
25680 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65   * *.**.** Write
25690 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
256a0 32 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  2 an integer whi
256b0 63 68 20 69 73 20 74 68 65 20 6c 61 73 74 20 65  ch is the last e
256c0 6e 74 72 79 20 69 6e 20 74 68 65 20 72 65 63 6f  ntry in the reco
256d0 72 64 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64  rd at.** the end
256e0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6b 65   of the index ke
256f0 79 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  y pointed to by 
25700 63 75 72 73 6f 72 20 50 31 2e 20 20 54 68 69 73  cursor P1.  This
25710 20 69 6e 74 65 67 65 72 20 73 68 6f 75 6c 64 20   integer should 
25720 62 65 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 20  be.** the rowid 
25730 6f 66 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  of the table ent
25740 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  ry to which this
25750 20 69 6e 64 65 78 20 65 6e 74 72 79 20 70 6f 69   index entry poi
25760 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  nts..**.** See a
25770 6c 73 6f 3a 20 52 6f 77 69 64 2c 20 4d 61 6b 65  lso: Rowid, Make
25780 52 65 63 6f 72 64 2e 0a 2a 2f 0a 63 61 73 65 20  Record..*/.case 
25790 4f 50 5f 49 64 78 52 6f 77 69 64 3a 20 7b 20 20  OP_IdxRowid: {  
257a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
257b0 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a  ut2-prerelease *
257c0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
257d0 72 73 72 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  rsr;.  VdbeCurso
257e0 72 20 2a 70 43 3b 0a 20 20 69 36 34 20 72 6f 77  r *pC;.  i64 row
257f0 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  id;..  assert( p
25800 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
25810 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
25820 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
25830 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
25840 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
25850 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 70 43    pCrsr = pC->pC
25860 75 72 73 6f 72 3b 0a 20 20 70 4f 75 74 2d 3e 66  ursor;.  pOut->f
25870 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
25880 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43  .  if( ALWAYS(pC
25890 72 73 72 21 3d 30 29 20 29 7b 0a 20 20 20 20 72  rsr!=0) ){.    r
258a0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
258b0 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b  ursorMoveto(pC);
258c0 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 72  .    if( NEVER(r
258d0 63 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  c) ) goto abort_
258e0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
258f0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65    assert( pC->de
25900 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20  ferredMoveto==0 
25910 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
25920 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b  C->isTable==0 );
25930 0a 20 20 20 20 69 66 28 20 21 70 43 2d 3e 6e 75  .    if( !pC->nu
25940 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 72  llRow ){.      r
25950 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49  c = sqlite3VdbeI
25960 64 78 52 6f 77 69 64 28 64 62 2c 20 70 43 72 73  dxRowid(db, pCrs
25970 72 2c 20 26 72 6f 77 69 64 29 3b 0a 20 20 20 20  r, &rowid);.    
25980 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25990 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
259a0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
259b0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a  _error;.      }.
259c0 20 20 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20        pOut->u.i 
259d0 3d 20 72 6f 77 69 64 3b 0a 20 20 20 20 20 20 70  = rowid;.      p
259e0 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
259f0 5f 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _Int;.    }.  }.
25a00 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
25a10 70 63 6f 64 65 3a 20 49 64 78 47 45 20 50 31 20  pcode: IdxGE P1 
25a20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
25a30 2a 20 54 68 65 20 50 34 20 72 65 67 69 73 74 65  * The P4 registe
25a40 72 20 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69  r values beginni
25a50 6e 67 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20  ng with P3 form 
25a60 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65  an unpacked inde
25a70 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f  x .** key that o
25a80 6d 69 74 73 20 74 68 65 20 52 4f 57 49 44 2e 20  mits the ROWID. 
25a90 20 43 6f 6d 70 61 72 65 20 74 68 69 73 20 6b 65   Compare this ke
25aa0 79 20 76 61 6c 75 65 20 61 67 61 69 6e 73 74 20  y value against 
25ab0 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 74 68  the index .** th
25ac0 61 74 20 50 31 20 69 73 20 63 75 72 72 65 6e 74  at P1 is current
25ad0 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20  ly pointing to, 
25ae0 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 52 4f 57  ignoring the ROW
25af0 49 44 20 6f 6e 20 74 68 65 20 50 31 20 69 6e 64  ID on the P1 ind
25b00 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ex..**.** If the
25b10 20 50 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20   P1 index entry 
25b20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
25b30 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
25b40 6b 65 79 20 76 61 6c 75 65 0a 2a 2a 20 74 68 65  key value.** the
25b50 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20 4f  n jump to P2.  O
25b60 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68  therwise fall th
25b70 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
25b80 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  t instruction..*
25b90 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 6e 6f  *.** If P5 is no
25ba0 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 65 20  n-zero then the 
25bb0 6b 65 79 20 76 61 6c 75 65 20 69 73 20 69 6e 63  key value is inc
25bc0 72 65 61 73 65 64 20 62 79 20 61 6e 20 65 70 73  reased by an eps
25bd0 69 6c 6f 6e 20 0a 2a 2a 20 70 72 69 6f 72 20 74  ilon .** prior t
25be0 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
25bf0 2e 20 20 54 68 69 73 20 6d 61 6b 65 20 74 68 65  .  This make the
25c00 20 6f 70 63 6f 64 65 20 77 6f 72 6b 20 6c 69 6b   opcode work lik
25c10 65 20 49 64 78 47 54 20 65 78 63 65 70 74 0a 2a  e IdxGT except.*
25c20 2a 20 74 68 61 74 20 69 66 20 74 68 65 20 6b 65  * that if the ke
25c30 79 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20  y from register 
25c40 50 33 20 69 73 20 61 20 70 72 65 66 69 78 20 6f  P3 is a prefix o
25c50 66 20 74 68 65 20 6b 65 79 20 69 6e 20 74 68 65  f the key in the
25c60 20 63 75 72 73 6f 72 2c 0a 2a 2a 20 74 68 65 20   cursor,.** the 
25c70 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65 20  result is false 
25c80 77 68 65 72 65 61 73 20 69 74 20 77 6f 75 6c 64  whereas it would
25c90 20 62 65 20 74 72 75 65 20 77 69 74 68 20 49 64   be true with Id
25ca0 78 47 54 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  xGT..*/./* Opcod
25cb0 65 3a 20 49 64 78 4c 54 20 50 31 20 50 32 20 50  e: IdxLT P1 P2 P
25cc0 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68  3 P4 P5.**.** Th
25cd0 65 20 50 34 20 72 65 67 69 73 74 65 72 20 76 61  e P4 register va
25ce0 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77  lues beginning w
25cf0 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e 20 75  ith P3 form an u
25d00 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a  npacked index .*
25d10 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69 74 73  * key that omits
25d20 20 74 68 65 20 52 4f 57 49 44 2e 20 20 43 6f 6d   the ROWID.  Com
25d30 70 61 72 65 20 74 68 69 73 20 6b 65 79 20 76 61  pare this key va
25d40 6c 75 65 20 61 67 61 69 6e 73 74 20 74 68 65 20  lue against the 
25d50 69 6e 64 65 78 20 0a 2a 2a 20 74 68 61 74 20 50  index .** that P
25d60 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  1 is currently p
25d70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f  ointing to, igno
25d80 72 69 6e 67 20 74 68 65 20 52 4f 57 49 44 20 6f  ring the ROWID o
25d90 6e 20 74 68 65 20 50 31 20 69 6e 64 65 78 2e 0a  n the P1 index..
25da0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20  **.** If the P1 
25db0 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 6c  index entry is l
25dc0 65 73 73 20 74 68 61 6e 20 74 68 65 20 6b 65 79  ess than the key
25dd0 20 76 61 6c 75 65 20 74 68 65 6e 20 6a 75 6d 70   value then jump
25de0 20 74 6f 20 50 32 2e 0a 2a 2a 20 4f 74 68 65 72   to P2..** Other
25df0 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67  wise fall throug
25e00 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
25e10 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
25e20 20 49 66 20 50 35 20 69 73 20 6e 6f 6e 2d 7a 65   If P5 is non-ze
25e30 72 6f 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20  ro then the key 
25e40 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73  value is increas
25e50 65 64 20 62 79 20 61 6e 20 65 70 73 69 6c 6f 6e  ed by an epsilon
25e60 20 70 72 69 6f 72 20 0a 2a 2a 20 74 6f 20 74 68   prior .** to th
25e70 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  e comparison.  T
25e80 68 69 73 20 6d 61 6b 65 73 20 74 68 65 20 6f 70  his makes the op
25e90 63 6f 64 65 20 77 6f 72 6b 20 6c 69 6b 65 20 49  code work like I
25ea0 64 78 4c 45 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  dxLE..*/.case OP
25eb0 5f 49 64 78 4c 54 3a 20 20 20 20 20 20 20 20 20  _IdxLT:         
25ec0 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65   /* jump */.case
25ed0 20 4f 50 5f 49 64 78 47 45 3a 20 7b 20 20 20 20   OP_IdxGE: {    
25ee0 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20      /* jump */. 
25ef0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
25f00 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 55 6e  .  int res;.  Un
25f10 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a  packedRecord r;.
25f20 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
25f30 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
25f40 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
25f50 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
25f60 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
25f70 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73  t( pC!=0 );.  as
25f80 73 65 72 74 28 20 70 43 2d 3e 69 73 4f 72 64 65  sert( pC->isOrde
25f90 72 65 64 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  red );.  if( ALW
25fa0 41 59 53 28 70 43 2d 3e 70 43 75 72 73 6f 72 21  AYS(pC->pCursor!
25fb0 3d 30 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =0) ){.    asser
25fc0 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d  t( pC->deferredM
25fd0 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 20 20  oveto==0 );.    
25fe0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d  assert( pOp->p5=
25ff0 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 31  =0 || pOp->p5==1
26000 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26010 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
26020 49 4e 54 33 32 20 29 3b 0a 20 20 20 20 72 2e 70  INT32 );.    r.p
26030 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b  KeyInfo = pC->pK
26040 65 79 49 6e 66 6f 3b 0a 20 20 20 20 72 2e 6e 46  eyInfo;.    r.nF
26050 69 65 6c 64 20 3d 20 28 75 31 36 29 70 4f 70 2d  ield = (u16)pOp-
26060 3e 70 34 2e 69 3b 0a 20 20 20 20 69 66 28 20 70  >p4.i;.    if( p
26070 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 20 20  Op->p5 ){.      
26080 72 2e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b  r.flags = UNPACK
26090 45 44 5f 49 4e 43 52 4b 45 59 20 7c 20 55 4e 50  ED_INCRKEY | UNP
260a0 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54  ACKED_PREFIX_MAT
260b0 43 48 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CH;.    }else{. 
260c0 20 20 20 20 20 72 2e 66 6c 61 67 73 20 3d 20 55       r.flags = U
260d0 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d  NPACKED_PREFIX_M
260e0 41 54 43 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ATCH;.    }.    
260f0 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70  r.aMem = &aMem[p
26100 4f 70 2d 3e 70 33 5d 3b 0a 23 69 66 64 65 66 20  Op->p3];.#ifdef 
26110 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
26120 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d   { int i; for(i=
26130 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69  0; i<r.nField; i
26140 2b 2b 29 20 61 73 73 65 72 74 28 20 6d 65 6d 49  ++) assert( memI
26150 73 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69  sValid(&r.aMem[i
26160 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20  ]) ); }.#endif. 
26170 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
26180 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
26190 28 70 43 2c 20 26 72 2c 20 26 72 65 73 29 3b 0a  (pC, &r, &res);.
261a0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
261b0 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 7b  ode==OP_IdxLT ){
261c0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 2d 72 65  .      res = -re
261d0 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
261e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
261f0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47  >opcode==OP_IdxG
26200 45 20 29 3b 0a 20 20 20 20 20 20 72 65 73 2b 2b  E );.      res++
26210 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
26220 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  res>0 ){.      p
26230 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 20  c = pOp->p2 - 1 
26240 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
26250 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
26260 65 3a 20 44 65 73 74 72 6f 79 20 50 31 20 50 32  e: Destroy P1 P2
26270 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 65   P3 * *.**.** De
26280 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 64  lete an entire d
26290 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
262a0 20 69 6e 64 65 78 20 77 68 6f 73 65 20 72 6f 6f   index whose roo
262b0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  t page in the da
262c0 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69  tabase.** file i
262d0 73 20 67 69 76 65 6e 20 62 79 20 50 31 2e 0a 2a  s given by P1..*
262e0 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 62  *.** The table b
262f0 65 69 6e 67 20 64 65 73 74 72 6f 79 65 64 20 69  eing destroyed i
26300 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  s in the main da
26310 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 50  tabase file if P
26320 33 3d 3d 30 2e 20 20 49 66 0a 2a 2a 20 50 33 3d  3==0.  If.** P3=
26330 3d 31 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c  =1 then the tabl
26340 65 20 74 6f 20 62 65 20 63 6c 65 61 72 20 69 73  e to be clear is
26350 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   in the auxiliar
26360 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  y database file.
26370 2a 2a 20 74 68 61 74 20 69 73 20 75 73 65 64 20  ** that is used 
26380 74 6f 20 73 74 6f 72 65 20 74 61 62 6c 65 73 20  to store tables 
26390 63 72 65 61 74 65 20 75 73 69 6e 67 20 43 52 45  create using CRE
263a0 41 54 45 20 54 45 4d 50 4f 52 41 52 59 20 54 41  ATE TEMPORARY TA
263b0 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55  BLE..**.** If AU
263c0 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62  TOVACUUM is enab
263d0 6c 65 64 20 74 68 65 6e 20 69 74 20 69 73 20 70  led then it is p
263e0 6f 73 73 69 62 6c 65 20 74 68 61 74 20 61 6e 6f  ossible that ano
263f0 74 68 65 72 20 72 6f 6f 74 20 70 61 67 65 0a 2a  ther root page.*
26400 2a 20 6d 69 67 68 74 20 62 65 20 6d 6f 76 65 64  * might be moved
26410 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 6c 79 20   into the newly 
26420 64 65 6c 65 74 65 64 20 72 6f 6f 74 20 70 61 67  deleted root pag
26430 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  e in order to ke
26440 65 70 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70  ep all.** root p
26450 61 67 65 73 20 63 6f 6e 74 69 67 75 6f 75 73 20  ages contiguous 
26460 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
26470 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
26480 2e 20 20 54 68 65 20 66 6f 72 6d 65 72 0a 2a 2a  .  The former.**
26490 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f   value of the ro
264a0 6f 74 20 70 61 67 65 20 74 68 61 74 20 6d 6f 76  ot page that mov
264b0 65 64 20 2d 20 69 74 73 20 76 61 6c 75 65 20 62  ed - its value b
264c0 65 66 6f 72 65 20 74 68 65 20 6d 6f 76 65 20 6f  efore the move o
264d0 63 63 75 72 72 65 64 20 2d 0a 2a 2a 20 69 73 20  ccurred -.** is 
264e0 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
264f0 65 72 20 50 32 2e 20 20 49 66 20 6e 6f 20 70 61  er P2.  If no pa
26500 67 65 20 0a 2a 2a 20 6d 6f 76 65 6d 65 6e 74 20  ge .** movement 
26510 77 61 73 20 72 65 71 75 69 72 65 64 20 28 62 65  was required (be
26520 63 61 75 73 65 20 74 68 65 20 74 61 62 6c 65 20  cause the table 
26530 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 77 61  being dropped wa
26540 73 20 61 6c 72 65 61 64 79 20 0a 2a 2a 20 74 68  s already .** th
26550 65 20 6c 61 73 74 20 6f 6e 65 20 69 6e 20 74 68  e last one in th
26560 65 20 64 61 74 61 62 61 73 65 29 20 74 68 65 6e  e database) then
26570 20 61 20 7a 65 72 6f 20 69 73 20 73 74 6f 72 65   a zero is store
26580 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  d in register P2
26590 2e 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55  ..** If AUTOVACU
265a0 55 4d 20 69 73 20 64 69 73 61 62 6c 65 64 20 74  UM is disabled t
265b0 68 65 6e 20 61 20 7a 65 72 6f 20 69 73 20 73 74  hen a zero is st
265c0 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
265d0 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61   P2..**.** See a
265e0 6c 73 6f 3a 20 43 6c 65 61 72 0a 2a 2f 0a 63 61  lso: Clear.*/.ca
265f0 73 65 20 4f 50 5f 44 65 73 74 72 6f 79 3a 20 7b  se OP_Destroy: {
26600 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65       /* out2-pre
26610 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
26620 20 69 4d 6f 76 65 64 3b 0a 20 20 69 6e 74 20 69   iMoved;.  int i
26630 43 6e 74 3b 0a 20 20 56 64 62 65 20 2a 70 56 64  Cnt;.  Vdbe *pVd
26640 62 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  be;.  int iDb;..
26650 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
26660 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 23 69 66 6e  dOnly==0 );.#ifn
26670 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26680 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
26690 43 6e 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  Cnt = 0;.  for(p
266a0 56 64 62 65 3d 64 62 2d 3e 70 56 64 62 65 3b 20  Vdbe=db->pVdbe; 
266b0 70 56 64 62 65 3b 20 70 56 64 62 65 20 3d 20 70  pVdbe; pVdbe = p
266c0 56 64 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Vdbe->pNext){.  
266d0 20 20 69 66 28 20 70 56 64 62 65 2d 3e 6d 61 67    if( pVdbe->mag
266e0 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
266f0 55 4e 20 26 26 20 70 56 64 62 65 2d 3e 62 49 73  UN && pVdbe->bIs
26700 52 65 61 64 65 72 20 0a 20 20 20 20 20 26 26 20  Reader .     && 
26710 70 56 64 62 65 2d 3e 69 6e 56 74 61 62 4d 65 74  pVdbe->inVtabMet
26720 68 6f 64 3c 32 20 26 26 20 70 56 64 62 65 2d 3e  hod<2 && pVdbe->
26730 70 63 3e 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  pc>=0 .    ){.  
26740 20 20 20 20 69 43 6e 74 2b 2b 3b 0a 20 20 20 20      iCnt++;.    
26750 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 43  }.  }.#else.  iC
26760 6e 74 20 3d 20 64 62 2d 3e 6e 56 64 62 65 52 65  nt = db->nVdbeRe
26770 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4f 75  ad;.#endif.  pOu
26780 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  t->flags = MEM_N
26790 75 6c 6c 3b 0a 20 20 69 66 28 20 69 43 6e 74 3e  ull;.  if( iCnt>
267a0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
267b0 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20  LITE_LOCKED;.   
267c0 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
267d0 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 7d 65  = OE_Abort;.  }e
267e0 6c 73 65 7b 0a 20 20 20 20 69 44 62 20 3d 20 70  lse{.    iDb = p
267f0 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 61 73 73 65  Op->p3;.    asse
26800 72 74 28 20 69 43 6e 74 3d 3d 31 20 29 3b 0a 20  rt( iCnt==1 );. 
26810 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62     assert( (p->b
26820 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44  treeMask & (((yD
26830 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62 29 29 21  bMask)1)<<iDb))!
26840 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
26850 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
26860 61 62 6c 65 28 64 62 2d 3e 61 44 62 5b 69 44 62  able(db->aDb[iDb
26870 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 31 2c 20  ].pBt, pOp->p1, 
26880 26 69 4d 6f 76 65 64 29 3b 0a 20 20 20 20 70 4f  &iMoved);.    pO
26890 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ut->flags = MEM_
268a0 49 6e 74 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 75  Int;.    pOut->u
268b0 2e 69 20 3d 20 69 4d 6f 76 65 64 3b 0a 23 69 66  .i = iMoved;.#if
268c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
268d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
268e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
268f0 4b 20 26 26 20 69 4d 6f 76 65 64 21 3d 30 20 29  K && iMoved!=0 )
26900 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
26910 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 64 62 2c  ootPageMoved(db,
26920 20 69 44 62 2c 20 69 4d 6f 76 65 64 2c 20 70 4f   iDb, iMoved, pO
26930 70 2d 3e 70 31 29 3b 0a 20 20 20 20 20 20 2f 2a  p->p1);.      /*
26940 20 41 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20   All OP_Destroy 
26950 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72  operations occur
26960 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72   on the same btr
26970 65 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  ee */.      asse
26980 72 74 28 20 72 65 73 65 74 53 63 68 65 6d 61 4f  rt( resetSchemaO
26990 6e 46 61 75 6c 74 3d 3d 30 20 7c 7c 20 72 65 73  nFault==0 || res
269a0 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 3d  etSchemaOnFault=
269b0 3d 69 44 62 2b 31 20 29 3b 0a 20 20 20 20 20 20  =iDb+1 );.      
269c0 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75  resetSchemaOnFau
269d0 6c 74 20 3d 20 69 44 62 2b 31 3b 0a 20 20 20 20  lt = iDb+1;.    
269e0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 62  }.#endif.  }.  b
269f0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
26a00 64 65 3a 20 43 6c 65 61 72 20 50 31 20 50 32 20  de: Clear P1 P2 
26a10 50 33 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  P3.**.** Delete 
26a20 61 6c 6c 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  all contents of 
26a30 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62  the database tab
26a40 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68 6f 73  le or index whos
26a50 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69  e root page.** i
26a60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a70 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 20  ile is given by 
26a80 50 31 2e 20 20 42 75 74 2c 20 75 6e 6c 69 6b 65  P1.  But, unlike
26a90 20 44 65 73 74 72 6f 79 2c 20 64 6f 20 6e 6f 74   Destroy, do not
26aa0 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 74  .** remove the t
26ab0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 66 72  able or index fr
26ac0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
26ad0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
26ae0 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c 65 61  table being clea
26af0 72 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  r is in the main
26b00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
26b10 66 20 50 32 3d 3d 30 2e 20 20 49 66 0a 2a 2a 20  f P2==0.  If.** 
26b20 50 32 3d 3d 31 20 74 68 65 6e 20 74 68 65 20 74  P2==1 then the t
26b30 61 62 6c 65 20 74 6f 20 62 65 20 63 6c 65 61 72  able to be clear
26b40 20 69 73 20 69 6e 20 74 68 65 20 61 75 78 69 6c   is in the auxil
26b50 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  iary database fi
26b60 6c 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 75 73  le.** that is us
26b70 65 64 20 74 6f 20 73 74 6f 72 65 20 74 61 62 6c  ed to store tabl
26b80 65 73 20 63 72 65 61 74 65 20 75 73 69 6e 67 20  es create using 
26b90 43 52 45 41 54 45 20 54 45 4d 50 4f 52 41 52 59  CREATE TEMPORARY
26ba0 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 49 66   TABLE..**.** If
26bb0 20 74 68 65 20 50 33 20 76 61 6c 75 65 20 69 73   the P3 value is
26bc0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
26bd0 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72  the table referr
26be0 65 64 20 74 6f 20 6d 75 73 74 20 62 65 20 61 6e  ed to must be an
26bf0 0a 2a 2a 20 69 6e 74 6b 65 79 20 74 61 62 6c 65  .** intkey table
26c00 20 28 61 6e 20 53 51 4c 20 74 61 62 6c 65 2c 20   (an SQL table, 
26c10 6e 6f 74 20 61 6e 20 69 6e 64 65 78 29 2e 20 49  not an index). I
26c20 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
26c30 72 6f 77 20 63 68 61 6e 67 65 20 0a 2a 2a 20 63  row change .** c
26c40 6f 75 6e 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  ount is incremen
26c50 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
26c60 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
26c70 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c 65   table being cle
26c80 61 72 65 64 2e 20 0a 2a 2a 20 49 66 20 50 33 20  ared. .** If P3 
26c90 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
26ca0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 76  zero, then the v
26cb0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 72  alue stored in r
26cc0 65 67 69 73 74 65 72 20 50 33 20 69 73 0a 2a 2a  egister P3 is.**
26cd0 20 61 6c 73 6f 20 69 6e 63 72 65 6d 65 6e 74 65   also incremente
26ce0 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
26cf0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
26d00 61 62 6c 65 20 62 65 69 6e 67 20 63 6c 65 61 72  able being clear
26d10 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ed..**.** See al
26d20 73 6f 3a 20 44 65 73 74 72 6f 79 0a 2a 2f 0a 63  so: Destroy.*/.c
26d30 61 73 65 20 4f 50 5f 43 6c 65 61 72 3a 20 7b 0a  ase OP_Clear: {.
26d40 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 3b 0a 20    int nChange;. 
26d50 0a 20 20 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  .  nChange = 0;.
26d60 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
26d70 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73  dOnly==0 );.  as
26d80 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d  sert( (p->btreeM
26d90 61 73 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b  ask & (((yDbMask
26da0 29 31 29 3c 3c 70 4f 70 2d 3e 70 32 29 29 21 3d  )1)<<pOp->p2))!=
26db0 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
26dc0 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
26dd0 6c 65 28 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  le(.      db->aD
26de0 62 5b 70 4f 70 2d 3e 70 32 5d 2e 70 42 74 2c 20  b[pOp->p2].pBt, 
26df0 70 4f 70 2d 3e 70 31 2c 20 28 70 4f 70 2d 3e 70  pOp->p1, (pOp->p
26e00 33 20 3f 20 26 6e 43 68 61 6e 67 65 20 3a 20 30  3 ? &nChange : 0
26e10 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4f 70  ).  );.  if( pOp
26e20 2d 3e 70 33 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  ->p3 ){.    p->n
26e30 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67  Change += nChang
26e40 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  e;.    if( pOp->
26e50 70 33 3e 30 20 29 7b 0a 20 20 20 20 20 20 61 73  p3>0 ){.      as
26e60 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
26e70 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29  (&aMem[pOp->p3])
26e80 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62 6f   );.      memAbo
26e90 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 26 61  utToChange(p, &a
26ea0 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20  Mem[pOp->p3]);. 
26eb0 20 20 20 20 20 61 4d 65 6d 5b 70 4f 70 2d 3e 70       aMem[pOp->p
26ec0 33 5d 2e 75 2e 69 20 2b 3d 20 6e 43 68 61 6e 67  3].u.i += nChang
26ed0 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  e;.    }.  }.  b
26ee0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
26ef0 64 65 3a 20 43 72 65 61 74 65 54 61 62 6c 65 20  de: CreateTable 
26f00 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
26f10 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
26f20 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61   table in the ma
26f30 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
26f40 20 69 66 20 50 31 3d 3d 30 20 6f 72 20 69 6e 20   if P1==0 or in 
26f50 74 68 65 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79  the.** auxiliary
26f60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
26f70 66 20 50 31 3d 3d 31 20 6f 72 20 69 6e 20 61 6e  f P1==1 or in an
26f80 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
26f90 73 65 20 69 66 0a 2a 2a 20 50 31 3e 31 2e 20 20  se if.** P1>1.  
26fa0 57 72 69 74 65 20 74 68 65 20 72 6f 6f 74 20 70  Write the root p
26fb0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
26fc0 65 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 74 6f  e new table into
26fd0 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 32 0a  .** register P2.
26fe0 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
26ff0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 61 20 74  ence between a t
27000 61 62 6c 65 20 61 6e 64 20 61 6e 20 69 6e 64 65  able and an inde
27010 78 20 69 73 20 74 68 69 73 3a 20 20 41 20 74 61  x is this:  A ta
27020 62 6c 65 20 6d 75 73 74 0a 2a 2a 20 68 61 76 65  ble must.** have
27030 20 61 20 34 2d 62 79 74 65 20 69 6e 74 65 67 65   a 4-byte intege
27040 72 20 6b 65 79 20 61 6e 64 20 63 61 6e 20 68 61  r key and can ha
27050 76 65 20 61 72 62 69 74 72 61 72 79 20 64 61 74  ve arbitrary dat
27060 61 2e 20 20 41 6e 20 69 6e 64 65 78 0a 2a 2a 20  a.  An index.** 
27070 68 61 73 20 61 6e 20 61 72 62 69 74 72 61 72 79  has an arbitrary
27080 20 6b 65 79 20 62 75 74 20 6e 6f 20 64 61 74 61   key but no data
27090 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
270a0 3a 20 43 72 65 61 74 65 49 6e 64 65 78 0a 2a 2f  : CreateIndex.*/
270b0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 72 65 61  ./* Opcode: Crea
270c0 74 65 49 6e 64 65 78 20 50 31 20 50 32 20 2a 20  teIndex P1 P2 * 
270d0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  * *.**.** Alloca
270e0 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 69  te a new index i
270f0 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
27100 61 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d  ase file if P1==
27110 30 20 6f 72 20 69 6e 20 74 68 65 0a 2a 2a 20 61  0 or in the.** a
27120 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
27130 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 31 20  e file if P1==1 
27140 6f 72 20 69 6e 20 61 6e 20 61 74 74 61 63 68 65  or in an attache
27150 64 20 64 61 74 61 62 61 73 65 20 69 66 0a 2a 2a  d database if.**
27160 20 50 31 3e 31 2e 20 20 57 72 69 74 65 20 74 68   P1>1.  Write th
27170 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
27180 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  er of the new ta
27190 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69  ble into.** regi
271a0 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53  ster P2..**.** S
271b0 65 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  ee documentation
271c0 20 6f 6e 20 4f 50 5f 43 72 65 61 74 65 54 61 62   on OP_CreateTab
271d0 6c 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  le for additiona
271e0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
271f0 2f 0a 63 61 73 65 20 4f 50 5f 43 72 65 61 74 65  /.case OP_Create
27200 49 6e 64 65 78 3a 20 20 20 20 20 20 20 20 20 20  Index:          
27210 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c    /* out2-prerel
27220 65 61 73 65 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  ease */.case OP_
27230 43 72 65 61 74 65 54 61 62 6c 65 3a 20 7b 20 20  CreateTable: {  
27240 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
27250 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
27260 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  int pgno;.  int 
27270 66 6c 61 67 73 3b 0a 20 20 44 62 20 2a 70 44 62  flags;.  Db *pDb
27280 3b 0a 0a 20 20 70 67 6e 6f 20 3d 20 30 3b 0a 20  ;..  pgno = 0;. 
27290 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
272a0 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64  >=0 && pOp->p1<d
272b0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
272c0 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73  rt( (p->btreeMas
272d0 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31  k & (((yDbMask)1
272e0 29 3c 3c 70 4f 70 2d 3e 70 31 29 29 21 3d 30 20  )<<pOp->p1))!=0 
272f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
27300 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  readOnly==0 );. 
27310 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
27320 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
27330 72 74 28 20 70 44 62 2d 3e 70 42 74 21 3d 30 20  rt( pDb->pBt!=0 
27340 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  );.  if( pOp->op
27350 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 54  code==OP_CreateT
27360 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 66  able ){.    /* f
27370 6c 61 67 73 20 3d 20 42 54 52 45 45 5f 49 4e 54  lags = BTREE_INT
27380 4b 45 59 3b 20 2a 2f 0a 20 20 20 20 66 6c 61 67  KEY; */.    flag
27390 73 20 3d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59  s = BTREE_INTKEY
273a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
273b0 6c 61 67 73 20 3d 20 42 54 52 45 45 5f 42 4c 4f  lags = BTREE_BLO
273c0 42 4b 45 59 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  BKEY;.  }.  rc =
273d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
273e0 61 74 65 54 61 62 6c 65 28 70 44 62 2d 3e 70 42  ateTable(pDb->pB
273f0 74 2c 20 26 70 67 6e 6f 2c 20 66 6c 61 67 73 29  t, &pgno, flags)
27400 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  ;.  pOut->u.i = 
27410 70 67 6e 6f 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  pgno;.  break;.}
27420 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61 72  ../* Opcode: Par
27430 73 65 53 63 68 65 6d 61 20 50 31 20 2a 20 2a 20  seSchema P1 * * 
27440 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20  P4 *.**.** Read 
27450 61 6e 64 20 70 61 72 73 65 20 61 6c 6c 20 65 6e  and parse all en
27460 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20 53  tries from the S
27470 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
27480 6c 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 50  le of database P
27490 31 0a 2a 2a 20 74 68 61 74 20 6d 61 74 63 68 20  1.** that match 
274a0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
274b0 20 50 34 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73   P4. .**.** This
274c0 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20   opcode invokes 
274d0 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 63 72  the parser to cr
274e0 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75  eate a new virtu
274f0 61 6c 20 6d 61 63 68 69 6e 65 2c 0a 2a 2a 20 74  al machine,.** t
27500 68 65 6e 20 72 75 6e 73 20 74 68 65 20 6e 65 77  hen runs the new
27510 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
27520 2e 20 20 49 74 20 69 73 20 74 68 75 73 20 61 20  .  It is thus a 
27530 72 65 2d 65 6e 74 72 61 6e 74 20 6f 70 63 6f 64  re-entrant opcod
27540 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 61  e..*/.case OP_Pa
27550 72 73 65 53 63 68 65 6d 61 3a 20 7b 0a 20 20 69  rseSchema: {.  i
27560 6e 74 20 69 44 62 3b 0a 20 20 63 6f 6e 73 74 20  nt iDb;.  const 
27570 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 3b 0a 20  char *zMaster;. 
27580 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 49   char *zSql;.  I
27590 6e 69 74 44 61 74 61 20 69 6e 69 74 44 61 74 61  nitData initData
275a0 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 70 72 65 70  ;..  /* Any prep
275b0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 74  ared statement t
275c0 68 61 74 20 69 6e 76 6f 6b 65 73 20 74 68 69 73  hat invokes this
275d0 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 68 6f 6c   opcode will hol
275e0 64 20 6d 75 74 65 78 65 73 0a 20 20 2a 2a 20 6f  d mutexes.  ** o
275f0 6e 20 65 76 65 72 79 20 62 74 72 65 65 2e 20 20  n every btree.  
27600 54 68 69 73 20 69 73 20 61 20 70 72 65 72 65 71  This is a prereq
27610 75 69 73 69 74 65 20 66 6f 72 20 69 6e 76 6f 6b  uisite for invok
27620 69 6e 67 20 0a 20 20 2a 2a 20 73 71 6c 69 74 65  ing .  ** sqlite
27630 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b 28 29 2e  3InitCallback().
27640 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
27650 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
27660 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e  iDb=0; iDb<db->n
27670 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20  Db; iDb++){.    
27680 61 73 73 65 72 74 28 20 69 44 62 3d 3d 31 20 7c  assert( iDb==1 |
27690 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  | sqlite3BtreeHo
276a0 6c 64 73 4d 75 74 65 78 28 64 62 2d 3e 61 44 62  ldsMutex(db->aDb
276b0 5b 69 44 62 5d 2e 70 42 74 29 20 29 3b 0a 20 20  [iDb].pBt) );.  
276c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 44 62 20  }.#endif..  iDb 
276d0 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 61 73 73  = pOp->p1;.  ass
276e0 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
276f0 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
27700 61 73 73 65 72 74 28 20 44 62 48 61 73 50 72 6f  assert( DbHasPro
27710 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44  perty(db, iDb, D
27720 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20  B_SchemaLoaded) 
27730 29 3b 0a 20 20 2f 2a 20 55 73 65 64 20 74 6f 20  );.  /* Used to 
27740 62 65 20 61 20 63 6f 6e 64 69 74 69 6f 6e 61 6c  be a conditional
27750 20 2a 2f 20 7b 0a 20 20 20 20 7a 4d 61 73 74 65   */ {.    zMaste
27760 72 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  r = SCHEMA_TABLE
27770 28 69 44 62 29 3b 0a 20 20 20 20 69 6e 69 74 44  (iDb);.    initD
27780 61 74 61 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  ata.db = db;.   
27790 20 69 6e 69 74 44 61 74 61 2e 69 44 62 20 3d 20   initData.iDb = 
277a0 70 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 69 6e 69  pOp->p1;.    ini
277b0 74 44 61 74 61 2e 70 7a 45 72 72 4d 73 67 20 3d  tData.pzErrMsg =
277c0 20 26 70 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20   &p->zErrMsg;.  
277d0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
277e0 4d 50 72 69 6e 74 66 28 64 62 2c 0a 20 20 20 20  MPrintf(db,.    
277f0 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c     "SELECT name,
27800 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c 20 46   rootpage, sql F
27810 52 4f 4d 20 27 25 71 27 2e 25 73 20 57 48 45 52  ROM '%q'.%s WHER
27820 45 20 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f  E %s ORDER BY ro
27830 77 69 64 22 2c 0a 20 20 20 20 20 20 20 64 62 2d  wid",.       db-
27840 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
27850 20 7a 4d 61 73 74 65 72 2c 20 70 4f 70 2d 3e 70   zMaster, pOp->p
27860 34 2e 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  4.z);.    if( zS
27870 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ql==0 ){.      r
27880 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
27890 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
278a0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
278b0 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20  nit.busy==0 );. 
278c0 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75       db->init.bu
278d0 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e  sy = 1;.      in
278e0 69 74 44 61 74 61 2e 72 63 20 3d 20 53 51 4c 49  itData.rc = SQLI
278f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 61 73 73  TE_OK;.      ass
27900 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
27910 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
27920 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
27930 63 28 64 62 2c 20 7a 53 71 6c 2c 20 73 71 6c 69  c(db, zSql, sqli
27940 74 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b 2c  te3InitCallback,
27950 20 26 69 6e 69 74 44 61 74 61 2c 20 30 29 3b 0a   &initData, 0);.
27960 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
27970 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 69  LITE_OK ) rc = i
27980 6e 69 74 44 61 74 61 2e 72 63 3b 0a 20 20 20 20  nitData.rc;.    
27990 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
279a0 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  db, zSql);.     
279b0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d   db->init.busy =
279c0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
279d0 69 66 28 20 72 63 20 29 20 73 71 6c 69 74 65 33  if( rc ) sqlite3
279e0 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
279f0 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b  fConnection(db);
27a00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
27a10 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 67  E_NOMEM ){.    g
27a20 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a  oto no_mem;.  }.
27a30 20 20 62 72 65 61 6b 3b 20 20 0a 7d 0a 0a 23 69    break;  .}..#i
27a40 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
27a50 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 29 0a  E_OMIT_ANALYZE).
27a60 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 6f 61 64 41  /* Opcode: LoadA
27a70 6e 61 6c 79 73 69 73 20 50 31 20 2a 20 2a 20 2a  nalysis P1 * * *
27a80 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 74 68   *.**.** Read th
27a90 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  e sqlite_stat1 t
27aa0 61 62 6c 65 20 66 6f 72 20 64 61 74 61 62 61 73  able for databas
27ab0 65 20 50 31 20 61 6e 64 20 6c 6f 61 64 20 74 68  e P1 and load th
27ac0 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20  e content.** of 
27ad0 74 68 61 74 20 74 61 62 6c 65 20 69 6e 74 6f 20  that table into 
27ae0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 69 6e 64  the internal ind
27af0 65 78 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  ex hash table.  
27b00 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 0a  This will cause.
27b10 2a 2a 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  ** the analysis 
27b20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  to be used when 
27b30 70 72 65 70 61 72 69 6e 67 20 61 6c 6c 20 73 75  preparing all su
27b40 62 73 65 71 75 65 6e 74 20 71 75 65 72 69 65 73  bsequent queries
27b50 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 6f 61  ..*/.case OP_Loa
27b60 64 41 6e 61 6c 79 73 69 73 3a 20 7b 0a 20 20 61  dAnalysis: {.  a
27b70 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
27b80 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d  0 && pOp->p1<db-
27b90 3e 6e 44 62 20 29 3b 0a 20 20 72 63 20 3d 20 73  >nDb );.  rc = s
27ba0 71 6c 69 74 65 33 41 6e 61 6c 79 73 69 73 4c 6f  qlite3AnalysisLo
27bb0 61 64 28 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b  ad(db, pOp->p1);
27bc0 0a 20 20 62 72 65 61 6b 3b 20 20 0a 7d 0a 23 65  .  break;  .}.#e
27bd0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
27be0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41  (SQLITE_OMIT_ANA
27bf0 4c 59 5a 45 29 20 2a 2f 0a 0a 2f 2a 20 4f 70 63  LYZE) */../* Opc
27c00 6f 64 65 3a 20 44 72 6f 70 54 61 62 6c 65 20 50  ode: DropTable P
27c10 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  1 * * P4 *.**.**
27c20 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 74 65   Remove the inte
27c30 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29  rnal (in-memory)
27c40 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
27c50 20 74 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a   that describe.*
27c60 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
27c70 64 20 50 34 20 69 6e 20 64 61 74 61 62 61 73 65  d P4 in database
27c80 20 50 31 2e 20 20 54 68 69 73 20 69 73 20 63 61   P1.  This is ca
27c90 6c 6c 65 64 20 61 66 74 65 72 20 61 20 74 61 62  lled after a tab
27ca0 6c 65 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65 64  le.** is dropped
27cb0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
27cc0 70 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72  p the internal r
27cd0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
27ce0 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63   the.** schema c
27cf0 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 77  onsistent with w
27d00 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a  hat is on disk..
27d10 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70 54  */.case OP_DropT
27d20 61 62 6c 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65  able: {.  sqlite
27d30 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
27d40 54 61 62 6c 65 28 64 62 2c 20 70 4f 70 2d 3e 70  Table(db, pOp->p
27d50 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  1, pOp->p4.z);. 
27d60 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
27d70 63 6f 64 65 3a 20 44 72 6f 70 49 6e 64 65 78 20  code: DropIndex 
27d80 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
27d90 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 74  * Remove the int
27da0 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79  ernal (in-memory
27db0 29 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  ) data structure
27dc0 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 0a  s that describe.
27dd0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  ** the index nam
27de0 65 64 20 50 34 20 69 6e 20 64 61 74 61 62 61 73  ed P4 in databas
27df0 65 20 50 31 2e 20 20 54 68 69 73 20 69 73 20 63  e P1.  This is c
27e00 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20 69  alled after an i
27e10 6e 64 65 78 0a 2a 2a 20 69 73 20 64 72 6f 70 70  ndex.** is dropp
27e20 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  ed in order to k
27e30 65 65 70 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  eep the internal
27e40 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
27e50 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61  of the.** schema
27e60 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
27e70 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b   what is on disk
27e80 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f  ..*/.case OP_Dro
27e90 70 49 6e 64 65 78 3a 20 7b 0a 20 20 73 71 6c 69  pIndex: {.  sqli
27ea0 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
27eb0 74 65 49 6e 64 65 78 28 64 62 2c 20 70 4f 70 2d  teIndex(db, pOp-
27ec0 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  >p1, pOp->p4.z);
27ed0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
27ee0 4f 70 63 6f 64 65 3a 20 44 72 6f 70 54 72 69 67  Opcode: DropTrig
27ef0 67 65 72 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a  ger P1 * * P4 *.
27f00 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  **.** Remove the
27f10 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65   internal (in-me
27f20 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72 75 63  mory) data struc
27f30 74 75 72 65 73 20 74 68 61 74 20 64 65 73 63 72  tures that descr
27f40 69 62 65 0a 2a 2a 20 74 68 65 20 74 72 69 67 67  ibe.** the trigg
27f50 65 72 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64  er named P4 in d
27f60 61 74 61 62 61 73 65 20 50 31 2e 20 20 54 68 69  atabase P1.  Thi
27f70 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  s is called afte
27f80 72 20 61 20 74 72 69 67 67 65 72 0a 2a 2a 20 69  r a trigger.** i
27f90 73 20 64 72 6f 70 70 65 64 20 69 6e 20 6f 72 64  s dropped in ord
27fa0 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 69  er to keep the i
27fb0 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e  nternal represen
27fc0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  tation of the.**
27fd0 20 73 63 68 65 6d 61 20 63 6f 6e 73 69 73 74 65   schema consiste
27fe0 6e 74 20 77 69 74 68 20 77 68 61 74 20 69 73 20  nt with what is 
27ff0 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65  on disk..*/.case
28000 20 4f 50 5f 44 72 6f 70 54 72 69 67 67 65 72 3a   OP_DropTrigger:
28010 20 7b 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69   {.  sqlite3Unli
28020 6e 6b 41 6e 64 44 65 6c 65 74 65 54 72 69 67 67  nkAndDeleteTrigg
28030 65 72 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20  er(db, pOp->p1, 
28040 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72  pOp->p4.z);.  br
28050 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  eak;.}...#ifndef
28060 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
28070 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 20  EGRITY_CHECK./* 
28080 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67 72 69 74  Opcode: Integrit
28090 79 43 6b 20 50 31 20 50 32 20 50 33 20 2a 20 50  yCk P1 P2 P3 * P
280a0 35 0a 2a 2a 0a 2a 2a 20 44 6f 20 61 6e 20 61 6e  5.**.** Do an an
280b0 61 6c 79 73 69 73 20 6f 66 20 74 68 65 20 63 75  alysis of the cu
280c0 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74  rrently open dat
280d0 61 62 61 73 65 2e 20 20 53 74 6f 72 65 20 69 6e  abase.  Store in
280e0 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 20  .** register P1 
280f0 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65  the text of an e
28100 72 72 6f 72 20 6d 65 73 73 61 67 65 20 64 65 73  rror message des
28110 63 72 69 62 69 6e 67 20 61 6e 79 20 70 72 6f 62  cribing any prob
28120 6c 65 6d 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 70  lems..** If no p
28130 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e  roblems are foun
28140 64 2c 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c 20  d, store a NULL 
28150 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a  in register P1..
28160 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74  **.** The regist
28170 65 72 20 50 33 20 63 6f 6e 74 61 69 6e 73 20 74  er P3 contains t
28180 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
28190 72 20 6f 66 20 61 6c 6c 6f 77 65 64 20 65 72 72  r of allowed err
281a0 6f 72 73 2e 0a 2a 2a 20 41 74 20 6d 6f 73 74 20  ors..** At most 
281b0 72 65 67 28 50 33 29 20 65 72 72 6f 72 73 20 77  reg(P3) errors w
281c0 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 2e  ill be reported.
281d0 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
281e0 64 73 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73  ds, the analysis
281f0 20 73 74 6f 70 73 20 61 73 20 73 6f 6f 6e 20 61   stops as soon a
28200 73 20 72 65 67 28 50 31 29 20 65 72 72 6f 72 73  s reg(P1) errors
28210 20 61 72 65 20 0a 2a 2a 20 73 65 65 6e 2e 20 20   are .** seen.  
28220 52 65 67 28 50 31 29 20 69 73 20 75 70 64 61 74  Reg(P1) is updat
28230 65 64 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62  ed with the numb
28240 65 72 20 6f 66 20 65 72 72 6f 72 73 20 72 65 6d  er of errors rem
28250 61 69 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  aining..**.** Th
28260 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
28270 65 72 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ers of all table
28280 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
28290 65 20 61 72 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e are integer.**
282a0 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 28 50   stored in reg(P
282b0 31 29 2c 20 72 65 67 28 50 31 2b 31 29 2c 20 72  1), reg(P1+1), r
282c0 65 67 28 50 31 2b 32 29 2c 20 2e 2e 2e 2e 20 20  eg(P1+2), ....  
282d0 54 68 65 72 65 20 61 72 65 20 50 32 20 74 61 62  There are P2 tab
282e0 6c 65 73 0a 2a 2a 20 74 6f 74 61 6c 2e 0a 2a 2a  les.** total..**
282f0 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 74  .** If P5 is not
28300 20 7a 65 72 6f 2c 20 74 68 65 20 63 68 65 63 6b   zero, the check
28310 20 69 73 20 64 6f 6e 65 20 6f 6e 20 74 68 65 20   is done on the 
28320 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
28330 73 65 0a 2a 2a 20 66 69 6c 65 2c 20 6e 6f 74 20  se.** file, not 
28340 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
28350 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
28360 69 73 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  is opcode is use
28370 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
28380 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
28390 63 6b 20 70 72 61 67 6d 61 2e 0a 2a 2f 0a 63 61  ck pragma..*/.ca
283a0 73 65 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43  se OP_IntegrityC
283b0 6b 3a 20 7b 0a 20 20 69 6e 74 20 6e 52 6f 6f 74  k: {.  int nRoot
283c0 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
283d0 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 63 68   of tables to ch
283e0 65 63 6b 2e 20 20 28 4e 75 6d 62 65 72 20 6f 66  eck.  (Number of
283f0 20 72 6f 6f 74 20 70 61 67 65 73 2e 29 20 2a 2f   root pages.) */
28400 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 20 20  .  int *aRoot;  
28410 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72     /* Array of r
28420 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 73 20  ootpage numbers 
28430 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 62 65  for tables to be
28440 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e   checked */.  in
28450 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  t j;          /*
28460 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
28470 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20  .  int nErr;    
28480 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
28490 65 72 72 6f 72 73 20 72 65 70 6f 72 74 65 64 20  errors reported 
284a0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  */.  char *z;   
284b0 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
284c0 74 68 65 20 65 72 72 6f 72 20 72 65 70 6f 72 74  the error report
284d0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 6e 45 72 72   */.  Mem *pnErr
284e0 3b 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65  ;     /* Registe
284f0 72 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20  r keeping track 
28500 6f 66 20 65 72 72 6f 72 73 20 72 65 6d 61 69 6e  of errors remain
28510 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ing */..  assert
28520 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29  ( p->bIsReader )
28530 3b 0a 20 20 6e 52 6f 6f 74 20 3d 20 70 4f 70 2d  ;.  nRoot = pOp-
28540 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  >p2;.  assert( n
28550 52 6f 6f 74 3e 30 20 29 3b 0a 20 20 61 52 6f 6f  Root>0 );.  aRoo
28560 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
28570 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
28580 66 28 69 6e 74 29 2a 28 6e 52 6f 6f 74 2b 31 29  f(int)*(nRoot+1)
28590 20 29 3b 0a 20 20 69 66 28 20 61 52 6f 6f 74 3d   );.  if( aRoot=
285a0 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
285b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
285c0 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33  >p3>0 && pOp->p3
285d0 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70  <=p->nMem );.  p
285e0 6e 45 72 72 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  nErr = &aMem[pOp
285f0 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p3];.  assert(
28600 20 28 70 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26   (pnErr->flags &
28610 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a   MEM_Int)!=0 );.
28620 20 20 61 73 73 65 72 74 28 20 28 70 6e 45 72 72    assert( (pnErr
28630 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53  ->flags & (MEM_S
28640 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30  tr|MEM_Blob))==0
28650 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   );.  pIn1 = &aM
28660 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 66  em[pOp->p1];.  f
28670 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 52 6f 6f 74 3b  or(j=0; j<nRoot;
28680 20 6a 2b 2b 29 7b 0a 20 20 20 20 61 52 6f 6f 74   j++){.    aRoot
28690 5b 6a 5d 20 3d 20 28 69 6e 74 29 73 71 6c 69 74  [j] = (int)sqlit
286a0 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 26  e3VdbeIntValue(&
286b0 70 49 6e 31 5b 6a 5d 29 3b 0a 20 20 7d 0a 20 20  pIn1[j]);.  }.  
286c0 61 52 6f 6f 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20  aRoot[j] = 0;.  
286d0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c  assert( pOp->p5<
286e0 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
286f0 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61  ert( (p->btreeMa
28700 73 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29  sk & (((yDbMask)
28710 31 29 3c 3c 70 4f 70 2d 3e 70 35 29 29 21 3d 30  1)<<pOp->p5))!=0
28720 20 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65   );.  z = sqlite
28730 33 42 74 72 65 65 49 6e 74 65 67 72 69 74 79 43  3BtreeIntegrityC
28740 68 65 63 6b 28 64 62 2d 3e 61 44 62 5b 70 4f 70  heck(db->aDb[pOp
28750 2d 3e 70 35 5d 2e 70 42 74 2c 20 61 52 6f 6f 74  ->p5].pBt, aRoot
28760 2c 20 6e 52 6f 6f 74 2c 0a 20 20 20 20 20 20 20  , nRoot,.       
28770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28780 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70            (int)p
28790 6e 45 72 72 2d 3e 75 2e 69 2c 20 26 6e 45 72 72  nErr->u.i, &nErr
287a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
287b0 65 65 28 64 62 2c 20 61 52 6f 6f 74 29 3b 0a 20  ee(db, aRoot);. 
287c0 20 70 6e 45 72 72 2d 3e 75 2e 69 20 2d 3d 20 6e   pnErr->u.i -= n
287d0 45 72 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Err;.  sqlite3Vd
287e0 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 49 6e  beMemSetNull(pIn
287f0 31 29 3b 0a 20 20 69 66 28 20 6e 45 72 72 3d 3d  1);.  if( nErr==
28800 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
28810 20 7a 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65   z==0 );.  }else
28820 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
28830 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
28840 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
28850 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
28860 70 49 6e 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c  pIn1, z, -1, SQL
28870 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74 65  ITE_UTF8, sqlite
28880 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 20 20 55  3_free);.  }.  U
28890 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49  PDATE_MAX_BLOBSI
288a0 5a 45 28 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69  ZE(pIn1);.  sqli
288b0 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
288c0 6f 64 69 6e 67 28 70 49 6e 31 2c 20 65 6e 63 6f  oding(pIn1, enco
288d0 64 69 6e 67 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  ding);.  break;.
288e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
288f0 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
28900 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 20 4f  Y_CHECK */../* O
28910 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 41 64 64  pcode: RowSetAdd
28920 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
28930 2a 2a 20 49 6e 73 65 72 74 20 74 68 65 20 69 6e  ** Insert the in
28940 74 65 67 65 72 20 76 61 6c 75 65 20 68 65 6c 64  teger value held
28950 20 62 79 20 72 65 67 69 73 74 65 72 20 50 32 20   by register P2 
28960 69 6e 74 6f 20 61 20 62 6f 6f 6c 65 61 6e 20 69  into a boolean i
28970 6e 64 65 78 0a 2a 2a 20 68 65 6c 64 20 69 6e 20  ndex.** held in 
28980 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 0a  register P1..**.
28990 2a 2a 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  ** An assertion 
289a0 66 61 69 6c 73 20 69 66 20 50 32 20 69 73 20 6e  fails if P2 is n
289b0 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a  ot an integer..*
289c0 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65 74  /.case OP_RowSet
289d0 41 64 64 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20  Add: {       /* 
289e0 69 6e 31 2c 20 69 6e 32 20 2a 2f 0a 20 20 70 49  in1, in2 */.  pI
289f0 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
28a00 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61  p1];.  pIn2 = &a
28a10 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
28a20 61 73 73 65 72 74 28 20 28 70 49 6e 32 2d 3e 66  assert( (pIn2->f
28a30 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21  lags & MEM_Int)!
28a40 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 49 6e  =0 );.  if( (pIn
28a50 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  1->flags & MEM_R
28a60 6f 77 53 65 74 29 3d 3d 30 20 29 7b 0a 20 20 20  owSet)==0 ){.   
28a70 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
28a80 65 74 52 6f 77 53 65 74 28 70 49 6e 31 29 3b 0a  etRowSet(pIn1);.
28a90 20 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66      if( (pIn1->f
28aa0 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
28ab0 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  t)==0 ) goto no_
28ac0 6d 65 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  mem;.  }.  sqlit
28ad0 65 33 52 6f 77 53 65 74 49 6e 73 65 72 74 28 70  e3RowSetInsert(p
28ae0 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20  In1->u.pRowSet, 
28af0 70 49 6e 32 2d 3e 75 2e 69 29 3b 0a 20 20 62 72  pIn2->u.i);.  br
28b00 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
28b10 65 3a 20 52 6f 77 53 65 74 52 65 61 64 20 50 31  e: RowSetRead P1
28b20 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
28b30 20 45 78 74 72 61 63 74 20 74 68 65 20 73 6d 61   Extract the sma
28b40 6c 6c 65 73 74 20 76 61 6c 75 65 20 66 72 6f 6d  llest value from
28b50 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20 50   boolean index P
28b60 31 20 61 6e 64 20 70 75 74 20 74 68 61 74 20 76  1 and put that v
28b70 61 6c 75 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67  alue into.** reg
28b80 69 73 74 65 72 20 50 33 2e 20 20 4f 72 2c 20 69  ister P3.  Or, i
28b90 66 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20  f boolean index 
28ba0 50 31 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  P1 is initially 
28bb0 65 6d 70 74 79 2c 20 6c 65 61 76 65 20 50 33 0a  empty, leave P3.
28bc0 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ** unchanged and
28bd0 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63   jump to instruc
28be0 74 69 6f 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  tion P2..*/.case
28bf0 20 4f 50 5f 52 6f 77 53 65 74 52 65 61 64 3a 20   OP_RowSetRead: 
28c00 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c  {       /* jump,
28c10 20 69 6e 31 2c 20 6f 75 74 33 20 2a 2f 0a 20 20   in1, out3 */.  
28c20 69 36 34 20 76 61 6c 3b 0a 0a 20 20 70 49 6e 31  i64 val;..  pIn1
28c30 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
28c40 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  ];.  if( (pIn1->
28c50 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
28c60 65 74 29 3d 3d 30 20 0a 20 20 20 7c 7c 20 73 71  et)==0 .   || sq
28c70 6c 69 74 65 33 52 6f 77 53 65 74 4e 65 78 74 28  lite3RowSetNext(
28c80 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c  pIn1->u.pRowSet,
28c90 20 26 76 61 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20   &val)==0.  ){. 
28ca0 20 20 20 2f 2a 20 54 68 65 20 62 6f 6f 6c 65 61     /* The boolea
28cb0 6e 20 69 6e 64 65 78 20 69 73 20 65 6d 70 74 79  n index is empty
28cc0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
28cd0 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 49  dbeMemSetNull(pI
28ce0 6e 31 29 3b 0a 20 20 20 20 70 63 20 3d 20 70 4f  n1);.    pc = pO
28cf0 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 65 6c  p->p2 - 1;.  }el
28d00 73 65 7b 0a 20 20 20 20 2f 2a 20 41 20 76 61 6c  se{.    /* A val
28d10 75 65 20 77 61 73 20 70 75 6c 6c 65 64 20 66 72  ue was pulled fr
28d20 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  om the index */.
28d30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
28d40 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d 65 6d  emSetInt64(&aMem
28d50 5b 70 4f 70 2d 3e 70 33 5d 2c 20 76 61 6c 29 3b  [pOp->p3], val);
28d60 0a 20 20 7d 0a 20 20 67 6f 74 6f 20 63 68 65 63  .  }.  goto chec
28d70 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b  k_for_interrupt;
28d80 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  .}../* Opcode: R
28d90 6f 77 53 65 74 54 65 73 74 20 50 31 20 50 32 20  owSetTest P1 P2 
28da0 50 33 20 50 34 0a 2a 2a 0a 2a 2a 20 52 65 67 69  P3 P4.**.** Regi
28db0 73 74 65 72 20 50 33 20 69 73 20 61 73 73 75 6d  ster P3 is assum
28dc0 65 64 20 74 6f 20 68 6f 6c 64 20 61 20 36 34 2d  ed to hold a 64-
28dd0 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75  bit integer valu
28de0 65 2e 20 49 66 20 72 65 67 69 73 74 65 72 20 50  e. If register P
28df0 31 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20  1.** contains a 
28e00 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 61 6e  RowSet object an
28e10 64 20 74 68 61 74 20 52 6f 77 53 65 74 20 6f 62  d that RowSet ob
28e20 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ject contains.**
28e30 20 74 68 65 20 76 61 6c 75 65 20 68 65 6c 64 20   the value held 
28e40 69 6e 20 50 33 2c 20 6a 75 6d 70 20 74 6f 20 72  in P3, jump to r
28e50 65 67 69 73 74 65 72 20 50 32 2e 20 4f 74 68 65  egister P2. Othe
28e60 72 77 69 73 65 2c 20 69 6e 73 65 72 74 20 74 68  rwise, insert th
28e70 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69 6e 20  e.** integer in 
28e80 50 33 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53  P3 into the RowS
28e90 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 20  et and continue 
28ea0 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 78  on to the.** nex
28eb0 74 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  t opcode..**.** 
28ec0 54 68 65 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  The RowSet objec
28ed0 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 66  t is optimized f
28ee0 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 72  or the case wher
28ef0 65 20 73 75 63 63 65 73 73 69 76 65 20 73 65 74  e successive set
28f00 73 0a 2a 2a 20 6f 66 20 69 6e 74 65 67 65 72 73  s.** of integers
28f10 2c 20 77 68 65 72 65 20 65 61 63 68 20 73 65 74  , where each set
28f20 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 75 70   contains no dup
28f30 6c 69 63 61 74 65 73 2e 20 45 61 63 68 20 73 65  licates. Each se
28f40 74 0a 2a 2a 20 6f 66 20 76 61 6c 75 65 73 20 69  t.** of values i
28f50 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
28f60 61 20 75 6e 69 71 75 65 20 50 34 20 76 61 6c 75  a unique P4 valu
28f70 65 2e 20 54 68 65 20 66 69 72 73 74 20 73 65 74  e. The first set
28f80 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 50 34  .** must have P4
28f90 3d 3d 30 2c 20 74 68 65 20 66 69 6e 61 6c 20 73  ==0, the final s
28fa0 65 74 20 50 34 3d 2d 31 2e 20 20 50 34 20 6d 75  et P4=-1.  P4 mu
28fb0 73 74 20 62 65 20 65 69 74 68 65 72 20 2d 31 20  st be either -1 
28fc0 6f 72 0a 2a 2a 20 6e 6f 6e 2d 6e 65 67 61 74 69  or.** non-negati
28fd0 76 65 2e 20 20 46 6f 72 20 6e 6f 6e 2d 6e 65 67  ve.  For non-neg
28fe0 61 74 69 76 65 20 76 61 6c 75 65 73 20 6f 66 20  ative values of 
28ff0 50 34 20 6f 6e 6c 79 20 74 68 65 20 6c 6f 77 65  P4 only the lowe
29000 72 20 34 0a 2a 2a 20 62 69 74 73 20 61 72 65 20  r 4.** bits are 
29010 73 69 67 6e 69 66 69 63 61 6e 74 2e 0a 2a 2a 0a  significant..**.
29020 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 6f  ** This allows o
29030 70 74 69 6d 69 7a 61 74 69 6f 6e 73 3a 20 28 61  ptimizations: (a
29040 29 20 77 68 65 6e 20 50 34 3d 3d 30 20 74 68 65  ) when P4==0 the
29050 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
29060 20 74 65 73 74 0a 2a 2a 20 74 68 65 20 72 6f 77   test.** the row
29070 73 65 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 50  set object for P
29080 33 2c 20 61 73 20 69 74 20 69 73 20 67 75 61 72  3, as it is guar
29090 61 6e 74 65 65 64 20 6e 6f 74 20 74 6f 20 63 6f  anteed not to co
290a0 6e 74 61 69 6e 20 69 74 2c 0a 2a 2a 20 28 62 29  ntain it,.** (b)
290b0 20 77 68 65 6e 20 50 34 3d 3d 2d 31 20 74 68 65   when P4==-1 the
290c0 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
290d0 20 69 6e 73 65 72 74 20 74 68 65 20 76 61 6c 75   insert the valu
290e0 65 2c 20 61 73 20 69 74 20 77 69 6c 6c 0a 2a 2a  e, as it will.**
290f0 20 6e 65 76 65 72 20 62 65 20 74 65 73 74 65 64   never be tested
29100 20 66 6f 72 2c 20 61 6e 64 20 28 63 29 20 77 68   for, and (c) wh
29110 65 6e 20 61 20 76 61 6c 75 65 20 74 68 61 74 20  en a value that 
29120 69 73 20 70 61 72 74 20 6f 66 20 73 65 74 20 58  is part of set X
29130 20 69 73 0a 2a 2a 20 69 6e 73 65 72 74 65 64 2c   is.** inserted,
29140 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
29150 64 20 74 6f 20 73 65 61 72 63 68 20 74 6f 20 73  d to search to s
29160 65 65 20 69 66 20 74 68 65 20 73 61 6d 65 20 76  ee if the same v
29170 61 6c 75 65 20 77 61 73 0a 2a 2a 20 70 72 65 76  alue was.** prev
29180 69 6f 75 73 6c 79 20 69 6e 73 65 72 74 65 64 20  iously inserted 
29190 61 73 20 70 61 72 74 20 6f 66 20 73 65 74 20 58  as part of set X
291a0 20 28 6f 6e 6c 79 20 69 66 20 69 74 20 77 61 73   (only if it was
291b0 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 69   previously.** i
291c0 6e 73 65 72 74 65 64 20 61 73 20 70 61 72 74 20  nserted as part 
291d0 6f 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 65  of some other se
291e0 74 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  t)..*/.case OP_R
291f0 6f 77 53 65 74 54 65 73 74 3a 20 7b 20 20 20 20  owSetTest: {    
29200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29210 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69   /* jump, in1, i
29220 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 74  n3 */.  int iSet
29230 3b 0a 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a  ;.  int exists;.
29240 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
29250 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 33  pOp->p1];.  pIn3
29260 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
29270 5d 3b 0a 20 20 69 53 65 74 20 3d 20 70 4f 70 2d  ];.  iSet = pOp-
29280 3e 70 34 2e 69 3b 0a 20 20 61 73 73 65 72 74 28  >p4.i;.  assert(
29290 20 70 49 6e 33 2d 3e 66 6c 61 67 73 26 4d 45 4d   pIn3->flags&MEM
292a0 5f 49 6e 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  _Int );..  /* If
292b0 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69   there is anythi
292c0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
292d0 72 6f 77 73 65 74 20 6f 62 6a 65 63 74 20 69 6e  rowset object in
292e0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 50 31 2c   memory cell P1,
292f0 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20 69 74 20  .  ** delete it 
29300 6e 6f 77 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  now and initiali
29310 7a 65 20 50 31 20 77 69 74 68 20 61 6e 20 65 6d  ze P1 with an em
29320 70 74 79 20 72 6f 77 73 65 74 0a 20 20 2a 2f 0a  pty rowset.  */.
29330 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
29340 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29  gs & MEM_RowSet)
29350 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
29360 65 33 56 64 62 65 4d 65 6d 53 65 74 52 6f 77 53  e3VdbeMemSetRowS
29370 65 74 28 70 49 6e 31 29 3b 0a 20 20 20 20 69 66  et(pIn1);.    if
29380 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
29390 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20   MEM_RowSet)==0 
293a0 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
293b0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f   }..  assert( pO
293c0 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
293d0 54 33 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  T32 );.  assert(
293e0 20 69 53 65 74 3d 3d 2d 31 20 7c 7c 20 69 53 65   iSet==-1 || iSe
293f0 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 53  t>=0 );.  if( iS
29400 65 74 20 29 7b 0a 20 20 20 20 65 78 69 73 74 73  et ){.    exists
29410 20 3d 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74   = sqlite3RowSet
29420 54 65 73 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f  Test(pIn1->u.pRo
29430 77 53 65 74 2c 20 0a 20 20 20 20 20 20 20 20 20  wSet, .         
29440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29450 20 20 20 20 20 20 28 75 38 29 28 69 53 65 74 3e        (u8)(iSet>
29460 3d 30 20 3f 20 69 53 65 74 20 26 20 30 78 66 20  =0 ? iSet & 0xf 
29470 3a 20 30 78 66 66 29 2c 0a 20 20 20 20 20 20 20  : 0xff),.       
29480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29490 20 20 20 20 20 20 20 20 70 49 6e 33 2d 3e 75 2e          pIn3->u.
294a0 69 29 3b 0a 20 20 20 20 69 66 28 20 65 78 69 73  i);.    if( exis
294b0 74 73 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d  ts ){.      pc =
294c0 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
294d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
294e0 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 65 74 3e  .  }.  if( iSet>
294f0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
29500 33 52 6f 77 53 65 74 49 6e 73 65 72 74 28 70 49  3RowSetInsert(pI
29510 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20 70  n1->u.pRowSet, p
29520 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 7d 0a 20  In3->u.i);.  }. 
29530 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e   break;.}...#ifn
29540 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
29550 54 52 49 47 47 45 52 0a 0a 2f 2a 20 4f 70 63 6f  TRIGGER../* Opco
29560 64 65 3a 20 50 72 6f 67 72 61 6d 20 50 31 20 50  de: Program P1 P
29570 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  2 P3 P4 *.**.** 
29580 45 78 65 63 75 74 65 20 74 68 65 20 74 72 69 67  Execute the trig
29590 67 65 72 20 70 72 6f 67 72 61 6d 20 70 61 73 73  ger program pass
295a0 65 64 20 61 73 20 50 34 20 28 74 79 70 65 20 50  ed as P4 (type P
295b0 34 5f 53 55 42 50 52 4f 47 52 41 4d 29 2e 20 0a  4_SUBPROGRAM). .
295c0 2a 2a 0a 2a 2a 20 50 31 20 63 6f 6e 74 61 69 6e  **.** P1 contain
295d0 73 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  s the address of
295e0 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
295f0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
29600 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72 79 20  he first memory 
29610 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61  .** cell in an a
29620 72 72 61 79 20 6f 66 20 76 61 6c 75 65 73 20 75  rray of values u
29630 73 65 64 20 61 73 20 61 72 67 75 6d 65 6e 74 73  sed as arguments
29640 20 74 6f 20 74 68 65 20 73 75 62 2d 70 72 6f 67   to the sub-prog
29650 72 61 6d 2e 20 50 32 20 0a 2a 2a 20 63 6f 6e 74  ram. P2 .** cont
29660 61 69 6e 73 20 74 68 65 20 61 64 64 72 65 73 73  ains the address
29670 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66 20 74   to jump to if t
29680 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 74  he sub-program t
29690 68 72 6f 77 73 20 61 6e 20 49 47 4e 4f 52 45 20  hrows an IGNORE 
296a0 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 75 73  .** exception us
296b0 69 6e 67 20 74 68 65 20 52 41 49 53 45 28 29 20  ing the RAISE() 
296c0 66 75 6e 63 74 69 6f 6e 2e 20 52 65 67 69 73 74  function. Regist
296d0 65 72 20 50 33 20 63 6f 6e 74 61 69 6e 73 20 74  er P3 contains t
296e0 68 65 20 61 64 64 72 65 73 73 20 0a 2a 2a 20 6f  he address .** o
296f0 66 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  f a memory cell 
29700 69 6e 20 74 68 69 73 20 28 74 68 65 20 70 61 72  in this (the par
29710 65 6e 74 29 20 56 4d 20 74 68 61 74 20 69 73 20  ent) VM that is 
29720 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
29730 20 74 68 65 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20   the .** memory 
29740 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
29750 73 75 62 2d 76 64 62 65 20 61 74 20 72 75 6e 74  sub-vdbe at runt
29760 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  ime..**.** P4 is
29770 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
29780 65 20 56 4d 20 63 6f 6e 74 61 69 6e 69 6e 67 20  e VM containing 
29790 74 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67  the trigger prog
297a0 72 61 6d 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ram..*/.case OP_
297b0 50 72 6f 67 72 61 6d 3a 20 7b 20 20 20 20 20 20  Program: {      
297c0 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69    /* jump */.  i
297d0 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20  nt nMem;        
297e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
297f0 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 67 69 73   of memory regis
29800 74 65 72 73 20 66 6f 72 20 73 75 62 2d 70 72 6f  ters for sub-pro
29810 67 72 61 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  gram */.  int nB
29820 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
29830 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 72 75    /* Bytes of ru
29840 6e 74 69 6d 65 20 73 70 61 63 65 20 72 65 71 75  ntime space requ
29850 69 72 65 64 20 66 6f 72 20 73 75 62 2d 70 72 6f  ired for sub-pro
29860 67 72 61 6d 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  gram */.  Mem *p
29870 52 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Rt;             
29880 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f    /* Register to
29890 20 61 6c 6c 6f 63 61 74 65 20 72 75 6e 74 69 6d   allocate runtim
298a0 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 4d 65 6d  e space */.  Mem
298b0 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   *pMem;         
298c0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
298d0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
298e0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 2a 2f 0a  memory cells */.
298f0 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 20 20 20 20    Mem *pEnd;    
29900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
29910 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  t memory cell in
29920 20 6e 65 77 20 61 72 72 61 79 20 2a 2f 0a 20 20   new array */.  
29930 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
29940 65 3b 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 76  e;      /* New v
29950 64 62 65 20 66 72 61 6d 65 20 74 6f 20 65 78 65  dbe frame to exe
29960 63 75 74 65 20 69 6e 20 2a 2f 0a 20 20 53 75 62  cute in */.  Sub
29970 50 72 6f 67 72 61 6d 20 2a 70 50 72 6f 67 72 61  Program *pProgra
29980 6d 3b 20 20 20 2f 2a 20 53 75 62 2d 70 72 6f 67  m;   /* Sub-prog
29990 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20 2a  ram to execute *
299a0 2f 0a 20 20 76 6f 69 64 20 2a 74 3b 20 20 20 20  /.  void *t;    
299b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
299c0 6f 6b 65 6e 20 69 64 65 6e 74 69 66 79 69 6e 67  oken identifying
299d0 20 74 72 69 67 67 65 72 20 2a 2f 0a 0a 20 20 70   trigger */..  p
299e0 50 72 6f 67 72 61 6d 20 3d 20 70 4f 70 2d 3e 70  Program = pOp->p
299f0 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 52  4.pProgram;.  pR
29a00 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
29a10 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  3];.  assert( pP
29a20 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3e 30 20 29 3b  rogram->nOp>0 );
29a30 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .  .  /* If the 
29a40 70 35 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  p5 flag is clear
29a50 2c 20 74 68 65 6e 20 72 65 63 75 72 73 69 76 65  , then recursive
29a60 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
29a70 72 69 67 67 65 72 73 20 69 73 20 0a 20 20 2a 2a  riggers is .  **
29a80 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 62 61   disabled for ba
29a90 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
29aa0 69 6c 69 74 79 20 28 70 35 20 69 73 20 73 65 74  ility (p5 is set
29ab0 20 69 66 20 74 68 69 73 20 73 75 62 2d 70 72 6f   if this sub-pro
29ac0 67 72 61 6d 0a 20 20 2a 2a 20 69 73 20 72 65 61  gram.  ** is rea
29ad0 6c 6c 79 20 61 20 74 72 69 67 67 65 72 2c 20 6e  lly a trigger, n
29ae0 6f 74 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  ot a foreign key
29af0 20 61 63 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65   action, and the
29b00 20 66 6c 61 67 20 73 65 74 0a 20 20 2a 2a 20 61   flag set.  ** a
29b10 6e 64 20 63 6c 65 61 72 65 64 20 62 79 20 74 68  nd cleared by th
29b20 65 20 22 50 52 41 47 4d 41 20 72 65 63 75 72 73  e "PRAGMA recurs
29b30 69 76 65 5f 74 72 69 67 67 65 72 73 22 20 63 6f  ive_triggers" co
29b40 6d 6d 61 6e 64 20 69 73 20 63 6c 65 61 72 29 2e  mmand is clear).
29b50 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 74 20 69  .  ** .  ** It i
29b60 73 20 72 65 63 75 72 73 69 76 65 20 69 6e 76 6f  s recursive invo
29b70 63 61 74 69 6f 6e 20 6f 66 20 74 72 69 67 67 65  cation of trigge
29b80 72 73 2c 20 61 74 20 74 68 65 20 53 51 4c 20 6c  rs, at the SQL l
29b90 65 76 65 6c 2c 20 74 68 61 74 20 69 73 20 0a 20  evel, that is . 
29ba0 20 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20 49 6e   ** disabled. In
29bb0 20 73 6f 6d 65 20 63 61 73 65 73 20 61 20 73 69   some cases a si
29bc0 6e 67 6c 65 20 74 72 69 67 67 65 72 20 6d 61 79  ngle trigger may
29bd0 20 67 65 6e 65 72 61 74 65 20 6d 6f 72 65 20 74   generate more t
29be0 68 61 6e 20 6f 6e 65 20 0a 20 20 2a 2a 20 53 75  han one .  ** Su
29bf0 62 50 72 6f 67 72 61 6d 20 28 69 66 20 74 68 65  bProgram (if the
29c00 20 74 72 69 67 67 65 72 20 6d 61 79 20 62 65 20   trigger may be 
29c10 65 78 65 63 75 74 65 64 20 77 69 74 68 20 6d 6f  executed with mo
29c20 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 69 66 66  re than one diff
29c30 65 72 65 6e 74 20 0a 20 20 2a 2a 20 4f 4e 20 43  erent .  ** ON C
29c40 4f 4e 46 4c 49 43 54 20 61 6c 67 6f 72 69 74 68  ONFLICT algorith
29c50 6d 29 2e 20 53 75 62 50 72 6f 67 72 61 6d 20 73  m). SubProgram s
29c60 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
29c70 61 74 65 64 20 77 69 74 68 20 61 0a 20 20 2a 2a  ated with a.  **
29c80 20 73 69 6e 67 6c 65 20 74 72 69 67 67 65 72 20   single trigger 
29c90 61 6c 6c 20 68 61 76 65 20 74 68 65 20 73 61 6d  all have the sam
29ca0 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
29cb0 53 75 62 50 72 6f 67 72 61 6d 2e 74 6f 6b 65 6e  SubProgram.token
29cc0 20 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e   .  ** variable.
29cd0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e    */.  if( pOp->
29ce0 70 35 20 29 7b 0a 20 20 20 20 74 20 3d 20 70 50  p5 ){.    t = pP
29cf0 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 20  rogram->token;. 
29d00 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d     for(pFrame=p-
29d10 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 20  >pFrame; pFrame 
29d20 26 26 20 70 46 72 61 6d 65 2d 3e 74 6f 6b 65 6e  && pFrame->token
29d30 21 3d 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61  !=t; pFrame=pFra
29d40 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  me->pParent);.  
29d50 20 20 69 66 28 20 70 46 72 61 6d 65 20 29 20 62    if( pFrame ) b
29d60 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  reak;.  }..  if(
29d70 20 70 2d 3e 6e 46 72 61 6d 65 3e 3d 64 62 2d 3e   p->nFrame>=db->
29d80 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
29d90 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
29da0 48 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  H] ){.    rc = S
29db0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
29dc0 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
29dd0 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  g(&p->zErrMsg, d
29de0 62 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 6c 65 76  b, "too many lev
29df0 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20 72  els of trigger r
29e00 65 63 75 72 73 69 6f 6e 22 29 3b 0a 20 20 20 20  ecursion");.    
29e10 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
29e20 20 52 65 67 69 73 74 65 72 20 70 52 74 20 69 73   Register pRt is
29e30 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
29e40 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72  he memory requir
29e50 65 64 20 74 6f 20 73 61 76 65 20 74 68 65 20 73  ed to save the s
29e60 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tate.  ** of the
29e70 20 63 75 72 72 65 6e 74 20 70 72 6f 67 72 61 6d   current program
29e80 2c 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79  , and the memory
29e90 20 72 65 71 75 69 72 65 64 20 61 74 20 72 75 6e   required at run
29ea0 74 69 6d 65 20 74 6f 20 65 78 65 63 75 74 65 0a  time to execute.
29eb0 20 20 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72    ** the trigger
29ec0 20 70 72 6f 67 72 61 6d 2e 20 49 66 20 74 68 69   program. If thi
29ed0 73 20 74 72 69 67 67 65 72 20 68 61 73 20 62 65  s trigger has be
29ee0 65 6e 20 66 69 72 65 64 20 62 65 66 6f 72 65 2c  en fired before,
29ef0 20 74 68 65 6e 20 70 52 74 20 0a 20 20 2a 2a 20   then pRt .  ** 
29f00 69 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  is already alloc
29f10 61 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ated. Otherwise,
29f20 20 69 74 20 6d 75 73 74 20 62 65 20 69 6e 69 74   it must be init
29f30 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20 20 69  ialized.  */.  i
29f40 66 28 20 28 70 52 74 2d 3e 66 6c 61 67 73 26 4d  f( (pRt->flags&M
29f50 45 4d 5f 46 72 61 6d 65 29 3d 3d 30 20 29 7b 0a  EM_Frame)==0 ){.
29f60 20 20 20 20 2f 2a 20 53 75 62 50 72 6f 67 72 61      /* SubProgra
29f70 6d 2e 6e 4d 65 6d 20 69 73 20 73 65 74 20 74 6f  m.nMem is set to
29f80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
29f90 65 6d 6f 72 79 20 63 65 6c 6c 73 20 75 73 65 64  emory cells used
29fa0 20 62 79 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   by the .    ** 
29fb0 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69  program stored i
29fc0 6e 20 53 75 62 50 72 6f 67 72 61 6d 2e 61 4f 70  n SubProgram.aOp
29fd0 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65  . As well as the
29fe0 73 65 2c 20 6f 6e 65 20 6d 65 6d 6f 72 79 0a 20  se, one memory. 
29ff0 20 20 20 2a 2a 20 63 65 6c 6c 20 69 73 20 72 65     ** cell is re
2a000 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
2a010 63 75 72 73 6f 72 20 75 73 65 64 20 62 79 20 74  cursor used by t
2a020 68 65 20 70 72 6f 67 72 61 6d 2e 20 53 65 74 20  he program. Set 
2a030 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
2a040 69 61 62 6c 65 20 6e 4d 65 6d 20 28 61 6e 64 20  iable nMem (and 
2a050 6c 61 74 65 72 2c 20 56 64 62 65 46 72 61 6d 65  later, VdbeFrame
2a060 2e 6e 43 68 69 6c 64 4d 65 6d 29 20 74 6f 20 74  .nChildMem) to t
2a070 68 69 73 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a  his value..    *
2a080 2f 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 70 50 72  /.    nMem = pPr
2a090 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20 2b 20 70 50  ogram->nMem + pP
2a0a0 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b 0a 20 20  rogram->nCsr;.  
2a0b0 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
2a0c0 28 73 69 7a 65 6f 66 28 56 64 62 65 46 72 61 6d  (sizeof(VdbeFram
2a0d0 65 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  e)).            
2a0e0 20 20 2b 20 6e 4d 65 6d 20 2a 20 73 69 7a 65 6f    + nMem * sizeo
2a0f0 66 28 4d 65 6d 29 0a 20 20 20 20 20 20 20 20 20  f(Mem).         
2a100 20 20 20 20 20 2b 20 70 50 72 6f 67 72 61 6d 2d       + pProgram-
2a110 3e 6e 43 73 72 20 2a 20 73 69 7a 65 6f 66 28 56  >nCsr * sizeof(V
2a120 64 62 65 43 75 72 73 6f 72 20 2a 29 0a 20 20 20  dbeCursor *).   
2a130 20 20 20 20 20 20 20 20 20 20 20 2b 20 70 50 72             + pPr
2a140 6f 67 72 61 6d 2d 3e 6e 4f 6e 63 65 20 2a 20 73  ogram->nOnce * s
2a150 69 7a 65 6f 66 28 75 38 29 3b 0a 20 20 20 20 70  izeof(u8);.    p
2a160 46 72 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  Frame = sqlite3D
2a170 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
2a180 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
2a190 21 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 20  !pFrame ){.     
2a1a0 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
2a1b0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
2a1c0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 52  dbeMemRelease(pR
2a1d0 74 29 3b 0a 20 20 20 20 70 52 74 2d 3e 66 6c 61  t);.    pRt->fla
2a1e0 67 73 20 3d 20 4d 45 4d 5f 46 72 61 6d 65 3b 0a  gs = MEM_Frame;.
2a1f0 20 20 20 20 70 52 74 2d 3e 75 2e 70 46 72 61 6d      pRt->u.pFram
2a200 65 20 3d 20 70 46 72 61 6d 65 3b 0a 0a 20 20 20  e = pFrame;..   
2a210 20 70 46 72 61 6d 65 2d 3e 76 20 3d 20 70 3b 0a   pFrame->v = p;.
2a220 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69      pFrame->nChi
2a230 6c 64 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20  ldMem = nMem;.  
2a240 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64    pFrame->nChild
2a250 43 73 72 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e  Csr = pProgram->
2a260 6e 43 73 72 3b 0a 20 20 20 20 70 46 72 61 6d 65  nCsr;.    pFrame
2a270 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 70  ->pc = pc;.    p
2a280 46 72 61 6d 65 2d 3e 61 4d 65 6d 20 3d 20 70 2d  Frame->aMem = p-
2a290 3e 61 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d  >aMem;.    pFram
2a2a0 65 2d 3e 6e 4d 65 6d 20 3d 20 70 2d 3e 6e 4d 65  e->nMem = p->nMe
2a2b0 6d 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 61  m;.    pFrame->a
2a2c0 70 43 73 72 20 3d 20 70 2d 3e 61 70 43 73 72 3b  pCsr = p->apCsr;
2a2d0 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43 75  .    pFrame->nCu
2a2e0 72 73 6f 72 20 3d 20 70 2d 3e 6e 43 75 72 73 6f  rsor = p->nCurso
2a2f0 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 61  r;.    pFrame->a
2a300 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20  Op = p->aOp;.   
2a310 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 20 3d 20 70   pFrame->nOp = p
2a320 2d 3e 6e 4f 70 3b 0a 20 20 20 20 70 46 72 61 6d  ->nOp;.    pFram
2a330 65 2d 3e 74 6f 6b 65 6e 20 3d 20 70 50 72 6f 67  e->token = pProg
2a340 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  ram->token;.    
2a350 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61  pFrame->aOnceFla
2a360 67 20 3d 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67  g = p->aOnceFlag
2a370 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 4f  ;.    pFrame->nO
2a380 6e 63 65 46 6c 61 67 20 3d 20 70 2d 3e 6e 4f 6e  nceFlag = p->nOn
2a390 63 65 46 6c 61 67 3b 0a 0a 20 20 20 20 70 45 6e  ceFlag;..    pEn
2a3a0 64 20 3d 20 26 56 64 62 65 46 72 61 6d 65 4d 65  d = &VdbeFrameMe
2a3b0 6d 28 70 46 72 61 6d 65 29 5b 70 46 72 61 6d 65  m(pFrame)[pFrame
2a3c0 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20  ->nChildMem];.  
2a3d0 20 20 66 6f 72 28 70 4d 65 6d 3d 56 64 62 65 46    for(pMem=VdbeF
2a3e0 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65 29 3b  rameMem(pFrame);
2a3f0 20 70 4d 65 6d 21 3d 70 45 6e 64 3b 20 70 4d 65   pMem!=pEnd; pMe
2a400 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d  m++){.      pMem
2a410 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
2a420 76 61 6c 69 64 3b 0a 20 20 20 20 20 20 70 4d 65  valid;.      pMe
2a430 6d 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  m->db = db;.    
2a440 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
2a450 46 72 61 6d 65 20 3d 20 70 52 74 2d 3e 75 2e 70  Frame = pRt->u.p
2a460 46 72 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72  Frame;.    asser
2a470 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65  t( pProgram->nMe
2a480 6d 2b 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72  m+pProgram->nCsr
2a490 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64  ==pFrame->nChild
2a4a0 4d 65 6d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Mem );.    asser
2a4b0 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73  t( pProgram->nCs
2a4c0 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c  r==pFrame->nChil
2a4d0 64 43 73 72 20 29 3b 0a 20 20 20 20 61 73 73 65  dCsr );.    asse
2a4e0 72 74 28 20 70 63 3d 3d 70 46 72 61 6d 65 2d 3e  rt( pc==pFrame->
2a4f0 70 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e  pc );.  }..  p->
2a500 6e 46 72 61 6d 65 2b 2b 3b 0a 20 20 70 46 72 61  nFrame++;.  pFra
2a510 6d 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 2d  me->pParent = p-
2a520 3e 70 46 72 61 6d 65 3b 0a 20 20 70 46 72 61 6d  >pFrame;.  pFram
2a530 65 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6c  e->lastRowid = l
2a540 61 73 74 52 6f 77 69 64 3b 0a 20 20 70 46 72 61  astRowid;.  pFra
2a550 6d 65 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 2d  me->nChange = p-
2a560 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 70 2d 3e 6e  >nChange;.  p->n
2a570 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d  Change = 0;.  p-
2a580 3e 70 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65  >pFrame = pFrame
2a590 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 4d  ;.  p->aMem = aM
2a5a0 65 6d 20 3d 20 26 56 64 62 65 46 72 61 6d 65 4d  em = &VdbeFrameM
2a5b0 65 6d 28 70 46 72 61 6d 65 29 5b 2d 31 5d 3b 0a  em(pFrame)[-1];.
2a5c0 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61    p->nMem = pFra
2a5d0 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 3b 0a 20  me->nChildMem;. 
2a5e0 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75   p->nCursor = (u
2a5f0 31 36 29 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c  16)pFrame->nChil
2a600 64 43 73 72 3b 0a 20 20 70 2d 3e 61 70 43 73 72  dCsr;.  p->apCsr
2a610 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
2a620 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 2b  *)&aMem[p->nMem+
2a630 31 5d 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 61  1];.  p->aOp = a
2a640 4f 70 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 61  Op = pProgram->a
2a650 4f 70 3b 0a 20 20 70 2d 3e 6e 4f 70 20 3d 20 70  Op;.  p->nOp = p
2a660 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3b 0a 20 20  Program->nOp;.  
2a670 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 28  p->aOnceFlag = (
2a680 75 38 20 2a 29 26 70 2d 3e 61 70 43 73 72 5b 70  u8 *)&p->apCsr[p
2a690 2d 3e 6e 43 75 72 73 6f 72 5d 3b 0a 20 20 70 2d  ->nCursor];.  p-
2a6a0 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 50 72  >nOnceFlag = pPr
2a6b0 6f 67 72 61 6d 2d 3e 6e 4f 6e 63 65 3b 0a 20 20  ogram->nOnce;.  
2a6c0 70 63 20 3d 20 2d 31 3b 0a 20 20 6d 65 6d 73 65  pc = -1;.  memse
2a6d0 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20  t(p->aOnceFlag, 
2a6e0 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29  0, p->nOnceFlag)
2a6f0 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  ;..  break;.}../
2a700 2a 20 4f 70 63 6f 64 65 3a 20 50 61 72 61 6d 20  * Opcode: Param 
2a710 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
2a720 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73  * This opcode is
2a730 20 6f 6e 6c 79 20 65 76 65 72 20 70 72 65 73 65   only ever prese
2a740 6e 74 20 69 6e 20 73 75 62 2d 70 72 6f 67 72 61  nt in sub-progra
2a750 6d 73 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68  ms called via th
2a760 65 20 0a 2a 2a 20 4f 50 5f 50 72 6f 67 72 61 6d  e .** OP_Program
2a770 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 43 6f   instruction. Co
2a780 70 79 20 61 20 76 61 6c 75 65 20 63 75 72 72 65  py a value curre
2a790 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61  ntly stored in a
2a7a0 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c   memory .** cell
2a7b0 20 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   of the calling 
2a7c0 28 70 61 72 65 6e 74 29 20 66 72 61 6d 65 20 74  (parent) frame t
2a7d0 6f 20 63 65 6c 6c 20 50 32 20 69 6e 20 74 68 65  o cell P2 in the
2a7e0 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 73 20   current frames 
2a7f0 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63  .** address spac
2a800 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  e. This is used 
2a810 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  by trigger progr
2a820 61 6d 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  ams to access th
2a830 65 20 6e 65 77 2e 2a 20 0a 2a 2a 20 61 6e 64 20  e new.* .** and 
2a840 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 2e 0a 2a 2a  old.* values..**
2a850 0a 2a 2a 20 54 68 65 20 61 64 64 72 65 73 73 20  .** The address 
2a860 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74  of the cell in t
2a870 68 65 20 70 61 72 65 6e 74 20 66 72 61 6d 65 20  he parent frame 
2a880 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
2a890 20 61 64 64 69 6e 67 0a 2a 2a 20 74 68 65 20 76   adding.** the v
2a8a0 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 61  alue of the P1 a
2a8b0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 76  rgument to the v
2a8c0 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 61  alue of the P1 a
2a8d0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 2a  rgument to the.*
2a8e0 2a 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50 72 6f  * calling OP_Pro
2a8f0 67 72 61 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e  gram instruction
2a900 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 61 72  ..*/.case OP_Par
2a910 61 6d 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  am: {           
2a920 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61  /* out2-prerelea
2a930 73 65 20 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d  se */.  VdbeFram
2a940 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 4d 65 6d  e *pFrame;.  Mem
2a950 20 2a 70 49 6e 3b 0a 20 20 70 46 72 61 6d 65 20   *pIn;.  pFrame 
2a960 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 70  = p->pFrame;.  p
2a970 49 6e 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d  In = &pFrame->aM
2a980 65 6d 5b 70 4f 70 2d 3e 70 31 20 2b 20 70 46 72  em[pOp->p1 + pFr
2a990 61 6d 65 2d 3e 61 4f 70 5b 70 46 72 61 6d 65 2d  ame->aOp[pFrame-
2a9a0 3e 70 63 5d 2e 70 31 5d 3b 20 20 20 0a 20 20 73  >pc].p1];   .  s
2a9b0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
2a9c0 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70  llowCopy(pOut, p
2a9d0 49 6e 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  In, MEM_Ephem);.
2a9e0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 65 6e 64    break;.}..#end
2a9f0 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
2aa00 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
2aa10 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  R */..#ifndef SQ
2aa20 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
2aa30 4e 5f 4b 45 59 0a 2f 2a 20 4f 70 63 6f 64 65 3a  N_KEY./* Opcode:
2aa40 20 46 6b 43 6f 75 6e 74 65 72 20 50 31 20 50 32   FkCounter P1 P2
2aa50 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 63   * * *.**.** Inc
2aa60 72 65 6d 65 6e 74 20 61 20 22 63 6f 6e 73 74 72  rement a "constr
2aa70 61 69 6e 74 20 63 6f 75 6e 74 65 72 22 20 62 79  aint counter" by
2aa80 20 50 32 20 28 50 32 20 6d 61 79 20 62 65 20 6e   P2 (P2 may be n
2aa90 65 67 61 74 69 76 65 20 6f 72 20 70 6f 73 69 74  egative or posit
2aaa0 69 76 65 29 2e 0a 2a 2a 20 49 66 20 50 31 20 69  ive)..** If P1 i
2aab0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
2aac0 64 61 74 61 62 61 73 65 20 63 6f 6e 73 74 72 61  database constra
2aad0 69 6e 74 20 63 6f 75 6e 74 65 72 20 69 73 20 69  int counter is i
2aae0 6e 63 72 65 6d 65 6e 74 65 64 20 0a 2a 2a 20 28  ncremented .** (
2aaf0 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
2ab00 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
2ab10 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ). Otherwise, if
2ab20 20 50 31 20 69 73 20 7a 65 72 6f 2c 20 74 68 65   P1 is zero, the
2ab30 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 63   .** statement c
2ab40 6f 75 6e 74 65 72 20 69 73 20 69 6e 63 72 65 6d  ounter is increm
2ab50 65 6e 74 65 64 20 28 69 6d 6d 65 64 69 61 74 65  ented (immediate
2ab60 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
2ab70 73 74 72 61 69 6e 74 73 29 2e 0a 2a 2f 0a 63 61  straints)..*/.ca
2ab80 73 65 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 3a  se OP_FkCounter:
2ab90 20 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31   {.  if( pOp->p1
2aba0 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66   ){.    db->nDef
2abb0 65 72 72 65 64 43 6f 6e 73 20 2b 3d 20 70 4f 70  erredCons += pOp
2abc0 2d 3e 70 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->p2;.  }else{. 
2abd0 20 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61     p->nFkConstra
2abe0 69 6e 74 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a  int += pOp->p2;.
2abf0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
2ac00 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6b 49 66 5a  /* Opcode: FkIfZ
2ac10 65 72 6f 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  ero P1 P2 * * *.
2ac20 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
2ac30 65 20 74 65 73 74 73 20 69 66 20 61 20 66 6f 72  e tests if a for
2ac40 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
2ac50 69 6e 74 2d 63 6f 75 6e 74 65 72 20 69 73 20 63  int-counter is c
2ac60 75 72 72 65 6e 74 6c 79 20 7a 65 72 6f 2e 0a 2a  urrently zero..*
2ac70 2a 20 49 66 20 73 6f 2c 20 6a 75 6d 70 20 74 6f  * If so, jump to
2ac80 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e   instruction P2.
2ac90 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
2aca0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
2acb0 6e 65 78 74 20 0a 2a 2a 20 69 6e 73 74 72 75 63  next .** instruc
2acc0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  tion..**.** If P
2acd0 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  1 is non-zero, t
2ace0 68 65 6e 20 74 68 65 20 6a 75 6d 70 20 69 73 20  hen the jump is 
2acf0 74 61 6b 65 6e 20 69 66 20 74 68 65 20 64 61 74  taken if the dat
2ad00 61 62 61 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  abase constraint
2ad10 2d 63 6f 75 6e 74 65 72 0a 2a 2a 20 69 73 20 7a  -counter.** is z
2ad20 65 72 6f 20 28 74 68 65 20 6f 6e 65 20 74 68 61  ero (the one tha
2ad30 74 20 63 6f 75 6e 74 73 20 64 65 66 65 72 72 65  t counts deferre
2ad40 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f  d constraint vio
2ad50 6c 61 74 69 6f 6e 73 29 2e 20 49 66 20 50 31 20  lations). If P1 
2ad60 69 73 0a 2a 2a 20 7a 65 72 6f 2c 20 74 68 65 20  is.** zero, the 
2ad70 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
2ad80 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
2ad90 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65  onstraint-counte
2ada0 72 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 69 6d  r is zero.** (im
2adb0 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
2adc0 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  key constraint v
2add0 69 6f 6c 61 74 69 6f 6e 73 29 2e 0a 2a 2f 0a 63  iolations)..*/.c
2ade0 61 73 65 20 4f 50 5f 46 6b 49 66 5a 65 72 6f 3a  ase OP_FkIfZero:
2adf0 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75   {         /* ju
2ae00 6d 70 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d  mp */.  if( pOp-
2ae10 3e 70 31 20 29 7b 0a 20 20 20 20 69 66 28 20 64  >p1 ){.    if( d
2ae20 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
2ae30 3d 3d 30 20 29 20 70 63 20 3d 20 70 4f 70 2d 3e  ==0 ) pc = pOp->
2ae40 70 32 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  p2-1;.  }else{. 
2ae50 20 20 20 69 66 28 20 70 2d 3e 6e 46 6b 43 6f 6e     if( p->nFkCon
2ae60 73 74 72 61 69 6e 74 3d 3d 30 20 29 20 70 63 20  straint==0 ) pc 
2ae70 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d  = pOp->p2-1;.  }
2ae80 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
2ae90 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
2aea0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
2aeb0 4e 5f 4b 45 59 20 2a 2f 0a 0a 23 69 66 6e 64 65  N_KEY */..#ifnde
2aec0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2aed0 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 2f 2a 20 4f  TOINCREMENT./* O
2aee0 70 63 6f 64 65 3a 20 4d 65 6d 4d 61 78 20 50 31  pcode: MemMax P1
2aef0 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
2af00 50 31 20 69 73 20 61 20 72 65 67 69 73 74 65 72  P1 is a register
2af10 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 66 72 61   in the root fra
2af20 6d 65 20 6f 66 20 74 68 69 73 20 56 4d 20 28 74  me of this VM (t
2af30 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 69 73  he root frame is
2af40 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72  .** different fr
2af50 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  om the current f
2af60 72 61 6d 65 20 69 66 20 74 68 69 73 20 69 6e 73  rame if this ins
2af70 74 72 75 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  truction is bein
2af80 67 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 77 69  g executed.** wi
2af90 74 68 69 6e 20 61 20 73 75 62 2d 70 72 6f 67 72  thin a sub-progr
2afa0 61 6d 29 2e 20 53 65 74 20 74 68 65 20 76 61 6c  am). Set the val
2afb0 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  ue of register P
2afc0 31 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  1 to the maximum
2afd0 20 6f 66 20 0a 2a 2a 20 69 74 73 20 63 75 72 72   of .** its curr
2afe0 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 74 68  ent value and th
2aff0 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
2b000 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68  ter P2..**.** Th
2b010 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  is instruction t
2b020 68 72 6f 77 73 20 61 6e 20 65 72 72 6f 72 20 69  hrows an error i
2b030 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
2b040 6c 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c  l is not initial
2b050 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72  ly.** an integer
2b060 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 65 6d  ..*/.case OP_Mem
2b070 4d 61 78 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  Max: {        /*
2b080 20 69 6e 32 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70   in2 */.  Mem *p
2b090 49 6e 31 3b 0a 20 20 56 64 62 65 46 72 61 6d 65  In1;.  VdbeFrame
2b0a0 20 2a 70 46 72 61 6d 65 3b 0a 20 20 69 66 28 20   *pFrame;.  if( 
2b0b0 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20  p->pFrame ){.   
2b0c0 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
2b0d0 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70  Frame; pFrame->p
2b0e0 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70  Parent; pFrame=p
2b0f0 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
2b100 0a 20 20 20 20 70 49 6e 31 20 3d 20 26 70 46 72  .    pIn1 = &pFr
2b110 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70  ame->aMem[pOp->p
2b120 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1];.  }else{.   
2b130 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
2b140 70 2d 3e 70 31 5d 3b 0a 20 20 7d 0a 20 20 61 73  p->p1];.  }.  as
2b150 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
2b160 28 70 49 6e 31 29 20 29 3b 0a 20 20 73 71 6c 69  (pIn1) );.  sqli
2b170 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65  te3VdbeMemIntege
2b180 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 70 49  rify(pIn1);.  pI
2b190 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n2 = &aMem[pOp->
2b1a0 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p2];.  sqlite3Vd
2b1b0 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28  beMemIntegerify(
2b1c0 70 49 6e 32 29 3b 0a 20 20 69 66 28 20 70 49 6e  pIn2);.  if( pIn
2b1d0 31 2d 3e 75 2e 69 3c 70 49 6e 32 2d 3e 75 2e 69  1->u.i<pIn2->u.i
2b1e0 29 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 75 2e 69  ){.    pIn1->u.i
2b1f0 20 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20   = pIn2->u.i;.  
2b200 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  }.  break;.}.#en
2b210 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2b220 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
2b230 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20   */../* Opcode: 
2b240 49 66 50 6f 73 20 50 31 20 50 32 20 2a 20 2a 20  IfPos P1 P2 * * 
2b250 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 76  *.**.** If the v
2b260 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72  alue of register
2b270 20 50 31 20 69 73 20 31 20 6f 72 20 67 72 65 61   P1 is 1 or grea
2b280 74 65 72 2c 20 6a 75 6d 70 20 74 6f 20 50 32 2e  ter, jump to P2.
2b290 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c  .**.** It is ill
2b2a0 65 67 61 6c 20 74 6f 20 75 73 65 20 74 68 69 73  egal to use this
2b2b0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 20   instruction on 
2b2c0 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  a register that 
2b2d0 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
2b2e0 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 20  ain an integer. 
2b2f0 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
2b300 75 6c 74 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  ult will result 
2b310 69 66 20 79 6f 75 20 74 72 79 2e 0a 2a 2f 0a 63  if you try..*/.c
2b320 61 73 65 20 4f 50 5f 49 66 50 6f 73 3a 20 7b 20  ase OP_IfPos: { 
2b330 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
2b340 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  in1 */.  pIn1 = 
2b350 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
2b360 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e    assert( pIn1->
2b370 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b  flags&MEM_Int );
2b380 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69  .  if( pIn1->u.i
2b390 3e 30 20 29 7b 0a 20 20 20 20 20 70 63 20 3d 20  >0 ){.     pc = 
2b3a0 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d  pOp->p2 - 1;.  }
2b3b0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
2b3c0 4f 70 63 6f 64 65 3a 20 49 66 4e 65 67 20 50 31  Opcode: IfNeg P1
2b3d0 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
2b3e0 49 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  If the value of 
2b3f0 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 6c  register P1 is l
2b400 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 6a  ess than zero, j
2b410 75 6d 70 20 74 6f 20 50 32 2e 20 0a 2a 2a 0a 2a  ump to P2. .**.*
2b420 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
2b430 74 6f 20 75 73 65 20 74 68 69 73 20 69 6e 73 74  to use this inst
2b440 72 75 63 74 69 6f 6e 20 6f 6e 20 61 20 72 65 67  ruction on a reg
2b450 69 73 74 65 72 20 74 68 61 74 20 64 6f 65 73 0a  ister that does.
2b460 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
2b470 6e 20 69 6e 74 65 67 65 72 2e 20 20 41 6e 20 61  n integer.  An a
2b480 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77  ssertion fault w
2b490 69 6c 6c 20 72 65 73 75 6c 74 20 69 66 20 79 6f  ill result if yo
2b4a0 75 20 74 72 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f  u try..*/.case O
2b4b0 50 5f 49 66 4e 65 67 3a 20 7b 20 20 20 20 20 20  P_IfNeg: {      
2b4c0 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a    /* jump, in1 *
2b4d0 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
2b4e0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
2b4f0 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ert( pIn1->flags
2b500 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 69 66  &MEM_Int );.  if
2b510 28 20 70 49 6e 31 2d 3e 75 2e 69 3c 30 20 29 7b  ( pIn1->u.i<0 ){
2b520 0a 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e  .     pc = pOp->
2b530 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72  p2 - 1;.  }.  br
2b540 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
2b550 65 3a 20 49 66 5a 65 72 6f 20 50 31 20 50 32 20  e: IfZero P1 P2 
2b560 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  P3 * *.**.** The
2b570 20 72 65 67 69 73 74 65 72 20 50 31 20 6d 75 73   register P1 mus
2b580 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74  t contain an int
2b590 65 67 65 72 2e 20 20 41 64 64 20 6c 69 74 65 72  eger.  Add liter
2b5a0 61 6c 20 50 33 20 74 6f 20 74 68 65 0a 2a 2a 20  al P3 to the.** 
2b5b0 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
2b5c0 72 20 50 31 2e 20 20 49 66 20 74 68 65 20 72 65  r P1.  If the re
2b5d0 73 75 6c 74 20 69 73 20 65 78 61 63 74 6c 79 20  sult is exactly 
2b5e0 30 2c 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 0a  0, jump to P2. .
2b5f0 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  **.** It is ille
2b600 67 61 6c 20 74 6f 20 75 73 65 20 74 68 69 73 20  gal to use this 
2b610 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 20 61  instruction on a
2b620 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 64   register that d
2b630 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
2b640 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  in an integer.  
2b650 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75  An assertion fau
2b660 6c 74 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  lt will result i
2b670 66 20 79 6f 75 20 74 72 79 2e 0a 2a 2f 0a 63 61  f you try..*/.ca
2b680 73 65 20 4f 50 5f 49 66 5a 65 72 6f 3a 20 7b 20  se OP_IfZero: { 
2b690 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
2b6a0 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  in1 */.  pIn1 = 
2b6b0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
2b6c0 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e    assert( pIn1->
2b6d0 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b  flags&MEM_Int );
2b6e0 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20 2b 3d 20  .  pIn1->u.i += 
2b6f0 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 70  pOp->p3;.  if( p
2b700 49 6e 31 2d 3e 75 2e 69 3d 3d 30 20 29 7b 0a 20  In1->u.i==0 ){. 
2b710 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
2b720 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61   - 1;.  }.  brea
2b730 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
2b740 20 41 67 67 53 74 65 70 20 2a 20 50 32 20 50 33   AggStep * P2 P3
2b750 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 45 78 65   P4 P5.**.** Exe
2b760 63 75 74 65 20 74 68 65 20 73 74 65 70 20 66 75  cute the step fu
2b770 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 61 67  nction for an ag
2b780 67 72 65 67 61 74 65 2e 20 20 54 68 65 0a 2a 2a  gregate.  The.**
2b790 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 50 35   function has P5
2b7a0 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 50 34   arguments.   P4
2b7b0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2b7c0 20 74 68 65 20 46 75 6e 63 44 65 66 0a 2a 2a 20   the FuncDef.** 
2b7d0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 73  structure that s
2b7e0 70 65 63 69 66 69 65 73 20 74 68 65 20 66 75 6e  pecifies the fun
2b7f0 63 74 69 6f 6e 2e 20 20 55 73 65 20 72 65 67 69  ction.  Use regi
2b800 73 74 65 72 0a 2a 2a 20 50 33 20 61 73 20 74 68  ster.** P3 as th
2b810 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  e accumulator..*
2b820 2a 0a 2a 2a 20 54 68 65 20 50 35 20 61 72 67 75  *.** The P5 argu
2b830 6d 65 6e 74 73 20 61 72 65 20 74 61 6b 65 6e 20  ments are taken 
2b840 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50 32  from register P2
2b850 20 61 6e 64 20 69 74 73 0a 2a 2a 20 73 75 63 63   and its.** succ
2b860 65 73 73 6f 72 73 2e 0a 2a 2f 0a 63 61 73 65 20  essors..*/.case 
2b870 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b 0a 20 20  OP_AggStep: {.  
2b880 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  int n;.  int i;.
2b890 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 4d    Mem *pMem;.  M
2b8a0 65 6d 20 2a 70 52 65 63 3b 0a 20 20 73 71 6c 69  em *pRec;.  sqli
2b8b0 74 65 33 5f 63 6f 6e 74 65 78 74 20 63 74 78 3b  te3_context ctx;
2b8c0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
2b8d0 20 2a 2a 61 70 56 61 6c 3b 0a 0a 20 20 6e 20 3d   **apVal;..  n =
2b8e0 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 61 73 73 65   pOp->p5;.  asse
2b8f0 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 70 52  rt( n>=0 );.  pR
2b900 65 63 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ec = &aMem[pOp->
2b910 70 32 5d 3b 0a 20 20 61 70 56 61 6c 20 3d 20 70  p2];.  apVal = p
2b920 2d 3e 61 70 41 72 67 3b 0a 20 20 61 73 73 65 72  ->apArg;.  asser
2b930 74 28 20 61 70 56 61 6c 20 7c 7c 20 6e 3d 3d 30  t( apVal || n==0
2b940 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
2b950 3c 6e 3b 20 69 2b 2b 2c 20 70 52 65 63 2b 2b 29  <n; i++, pRec++)
2b960 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  {.    assert( me
2b970 6d 49 73 56 61 6c 69 64 28 70 52 65 63 29 20 29  mIsValid(pRec) )
2b980 3b 0a 20 20 20 20 61 70 56 61 6c 5b 69 5d 20 3d  ;.    apVal[i] =
2b990 20 70 52 65 63 3b 0a 20 20 20 20 6d 65 6d 41 62   pRec;.    memAb
2b9a0 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70  outToChange(p, p
2b9b0 52 65 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Rec);.    sqlite
2b9c0 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70  3VdbeMemStoreTyp
2b9d0 65 28 70 52 65 63 29 3b 0a 20 20 7d 0a 20 20 63  e(pRec);.  }.  c
2b9e0 74 78 2e 70 46 75 6e 63 20 3d 20 70 4f 70 2d 3e  tx.pFunc = pOp->
2b9f0 70 34 2e 70 46 75 6e 63 3b 0a 20 20 61 73 73 65  p4.pFunc;.  asse
2ba00 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26  rt( pOp->p3>0 &&
2ba10 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65   pOp->p3<=p->nMe
2ba20 6d 20 29 3b 0a 20 20 63 74 78 2e 70 4d 65 6d 20  m );.  ctx.pMem 
2ba30 3d 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70  = pMem = &aMem[p
2ba40 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 4d 65 6d 2d  Op->p3];.  pMem-
2ba50 3e 6e 2b 2b 3b 0a 20 20 63 74 78 2e 73 2e 66 6c  >n++;.  ctx.s.fl
2ba60 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
2ba70 20 20 63 74 78 2e 73 2e 7a 20 3d 20 30 3b 0a 20    ctx.s.z = 0;. 
2ba80 20 63 74 78 2e 73 2e 7a 4d 61 6c 6c 6f 63 20 3d   ctx.s.zMalloc =
2ba90 20 30 3b 0a 20 20 63 74 78 2e 73 2e 78 44 65 6c   0;.  ctx.s.xDel
2baa0 20 3d 20 30 3b 0a 20 20 63 74 78 2e 73 2e 64 62   = 0;.  ctx.s.db
2bab0 20 3d 20 64 62 3b 0a 20 20 63 74 78 2e 69 73 45   = db;.  ctx.isE
2bac0 72 72 6f 72 20 3d 20 30 3b 0a 20 20 63 74 78 2e  rror = 0;.  ctx.
2bad0 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 63 74 78  pColl = 0;.  ctx
2bae0 2e 73 6b 69 70 46 6c 61 67 20 3d 20 30 3b 0a 20  .skipFlag = 0;. 
2baf0 20 69 66 28 20 63 74 78 2e 70 46 75 6e 63 2d 3e   if( ctx.pFunc->
2bb00 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
2bb10 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
2bb20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 3e      assert( pOp>
2bb30 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 61 73  p->aOp );.    as
2bb40 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 70 34  sert( pOp[-1].p4
2bb50 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51  type==P4_COLLSEQ
2bb60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2bb70 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
2bb80 4f 50 5f 43 6f 6c 6c 53 65 71 20 29 3b 0a 20 20  OP_CollSeq );.  
2bb90 20 20 63 74 78 2e 70 43 6f 6c 6c 20 3d 20 70 4f    ctx.pColl = pO
2bba0 70 5b 2d 31 5d 2e 70 34 2e 70 43 6f 6c 6c 3b 0a  p[-1].p4.pColl;.
2bbb0 20 20 7d 0a 20 20 28 63 74 78 2e 70 46 75 6e 63    }.  (ctx.pFunc
2bbc0 2d 3e 78 53 74 65 70 29 28 26 63 74 78 2c 20 6e  ->xStep)(&ctx, n
2bbd0 2c 20 61 70 56 61 6c 29 3b 20 2f 2a 20 49 4d 50  , apVal); /* IMP
2bbe0 3a 20 52 2d 32 34 35 30 35 2d 32 33 32 33 30 20  : R-24505-23230 
2bbf0 2a 2f 0a 20 20 69 66 28 20 63 74 78 2e 69 73 45  */.  if( ctx.isE
2bc00 72 72 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rror ){.    sqli
2bc10 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
2bc20 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25  >zErrMsg, db, "%
2bc30 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s", sqlite3_valu
2bc40 65 5f 74 65 78 74 28 26 63 74 78 2e 73 29 29 3b  e_text(&ctx.s));
2bc50 0a 20 20 20 20 72 63 20 3d 20 63 74 78 2e 69 73  .    rc = ctx.is
2bc60 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  Error;.  }.  if(
2bc70 20 63 74 78 2e 73 6b 69 70 46 6c 61 67 20 29 7b   ctx.skipFlag ){
2bc80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
2bc90 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
2bca0 43 6f 6c 6c 53 65 71 20 29 3b 0a 20 20 20 20 69  CollSeq );.    i
2bcb0 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20   = pOp[-1].p1;. 
2bcc0 20 20 20 69 66 28 20 69 20 29 20 73 71 6c 69 74     if( i ) sqlit
2bcd0 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36  e3VdbeMemSetInt6
2bce0 34 28 26 61 4d 65 6d 5b 69 5d 2c 20 31 29 3b 0a  4(&aMem[i], 1);.
2bcf0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64    }..  sqlite3Vd
2bd00 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 74  beMemRelease(&ct
2bd10 78 2e 73 29 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a  x.s);..  break;.
2bd20 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67  }../* Opcode: Ag
2bd30 67 46 69 6e 61 6c 20 50 31 20 50 32 20 2a 20 50  gFinal P1 P2 * P
2bd40 34 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75 74  4 *.**.** Execut
2bd50 65 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 72 20  e the finalizer 
2bd60 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20  function for an 
2bd70 61 67 67 72 65 67 61 74 65 2e 20 20 50 31 20 69  aggregate.  P1 i
2bd80 73 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20  s.** the memory 
2bd90 6c 6f 63 61 74 69 6f 6e 20 74 68 61 74 20 69 73  location that is
2bda0 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
2bdb0 20 66 6f 72 20 74 68 65 20 61 67 67 72 65 67 61   for the aggrega
2bdc0 74 65 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73 20  te..**.** P2 is 
2bdd0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  the number of ar
2bde0 67 75 6d 65 6e 74 73 20 74 68 61 74 20 74 68 65  guments that the
2bdf0 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 74   step function t
2be00 61 6b 65 73 20 61 6e 64 0a 2a 2a 20 50 34 20 69  akes and.** P4 i
2be10 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
2be20 68 65 20 46 75 6e 63 44 65 66 20 66 6f 72 20 74  he FuncDef for t
2be30 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  his function.  T
2be40 68 65 20 50 32 0a 2a 2a 20 61 72 67 75 6d 65 6e  he P2.** argumen
2be50 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79  t is not used by
2be60 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 20 20 49   this opcode.  I
2be70 74 20 69 73 20 6f 6e 6c 79 20 74 68 65 72 65 20  t is only there 
2be80 74 6f 20 64 69 73 61 6d 62 69 67 75 61 74 65 0a  to disambiguate.
2be90 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  ** functions tha
2bea0 74 20 63 61 6e 20 74 61 6b 65 20 76 61 72 79 69  t can take varyi
2beb0 6e 67 20 6e 75 6d 62 65 72 73 20 6f 66 20 61 72  ng numbers of ar
2bec0 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 0a 2a 2a  guments.  The.**
2bed0 20 50 34 20 61 72 67 75 6d 65 6e 74 20 69 73 20   P4 argument is 
2bee0 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20  only needed for 
2bef0 74 68 65 20 64 65 67 65 6e 65 72 61 74 65 20 63  the degenerate c
2bf00 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 74 68 65  ase where.** the
2bf10 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 77   step function w
2bf20 61 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c  as not previousl
2bf30 79 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 63 61 73  y called..*/.cas
2bf40 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 3a 20 7b  e OP_AggFinal: {
2bf50 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20  .  Mem *pMem;.  
2bf60 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
2bf70 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 70 2d  0 && pOp->p1<=p-
2bf80 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 4d 65 6d 20  >nMem );.  pMem 
2bf90 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
2bfa0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d 65  ;.  assert( (pMe
2bfb0 6d 2d 3e 66 6c 61 67 73 20 26 20 7e 28 4d 45 4d  m->flags & ~(MEM
2bfc0 5f 4e 75 6c 6c 7c 4d 45 4d 5f 41 67 67 29 29 3d  _Null|MEM_Agg))=
2bfd0 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
2bfe0 69 74 65 33 56 64 62 65 4d 65 6d 46 69 6e 61 6c  ite3VdbeMemFinal
2bff0 69 7a 65 28 70 4d 65 6d 2c 20 70 4f 70 2d 3e 70  ize(pMem, pOp->p
2c000 34 2e 70 46 75 6e 63 29 3b 0a 20 20 69 66 28 20  4.pFunc);.  if( 
2c010 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
2c020 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
2c030 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22  ErrMsg, db, "%s"
2c040 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
2c050 74 65 78 74 28 70 4d 65 6d 29 29 3b 0a 20 20 7d  text(pMem));.  }
2c060 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
2c070 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4d 65  angeEncoding(pMe
2c080 6d 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  m, encoding);.  
2c090 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
2c0a0 49 5a 45 28 70 4d 65 6d 29 3b 0a 20 20 69 66 28  IZE(pMem);.  if(
2c0b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54   sqlite3VdbeMemT
2c0c0 6f 6f 42 69 67 28 70 4d 65 6d 29 20 29 7b 0a 20  ooBig(pMem) ){. 
2c0d0 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b     goto too_big;
2c0e0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
2c0f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c100 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 4f 70 63 6f  OMIT_WAL./* Opco
2c110 64 65 3a 20 43 68 65 63 6b 70 6f 69 6e 74 20 50  de: Checkpoint P
2c120 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
2c130 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74  * Checkpoint dat
2c140 61 62 61 73 65 20 50 31 2e 20 54 68 69 73 20 69  abase P1. This i
2c150 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 50 31 20  s a no-op if P1 
2c160 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
2c170 20 69 6e 0a 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e   in.** WAL mode.
2c180 20 50 61 72 61 6d 65 74 65 72 20 50 32 20 69 73   Parameter P2 is
2c190 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43   one of SQLITE_C
2c1a0 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
2c1b0 45 2c 20 46 55 4c 4c 0a 2a 2a 20 6f 72 20 52 45  E, FULL.** or RE
2c1c0 53 54 41 52 54 2e 20 20 57 72 69 74 65 20 31 20  START.  Write 1 
2c1d0 6f 72 20 30 20 69 6e 74 6f 20 6d 65 6d 5b 50 33  or 0 into mem[P3
2c1e0 5d 20 69 66 20 74 68 65 20 63 68 65 63 6b 70 6f  ] if the checkpo
2c1f0 69 6e 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53  int returns.** S
2c200 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 6e 6f  QLITE_BUSY or no
2c210 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  t, respectively.
2c220 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
2c230 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
2c240 68 65 0a 2a 2a 20 57 41 4c 20 61 66 74 65 72 20  he.** WAL after 
2c250 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
2c260 6e 74 6f 20 6d 65 6d 5b 50 33 2b 31 5d 20 61 6e  nto mem[P3+1] an
2c270 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
2c280 70 61 67 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20  pages.** in the 
2c290 57 41 4c 20 74 68 61 74 20 68 61 76 65 20 62 65  WAL that have be
2c2a0 65 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  en checkpointed 
2c2b0 61 66 74 65 72 20 74 68 65 20 63 68 65 63 6b 70  after the checkp
2c2c0 6f 69 6e 74 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65  oint.** complete
2c2d0 73 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b 32 5d  s into mem[P3+2]
2c2e0 2e 20 20 48 6f 77 65 76 65 72 20 6f 6e 20 61 6e  .  However on an
2c2f0 20 65 72 72 6f 72 2c 20 6d 65 6d 5b 50 33 2b 31   error, mem[P3+1
2c300 5d 20 61 6e 64 0a 2a 2a 20 6d 65 6d 5b 50 33 2b  ] and.** mem[P3+
2c310 32 5d 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  2] are initializ
2c320 65 64 20 74 6f 20 2d 31 2e 0a 2a 2f 0a 63 61 73  ed to -1..*/.cas
2c330 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a  e OP_Checkpoint:
2c340 20 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20   {.  int i;     
2c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c360 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2c370 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 52  nter */.  int aR
2c380 65 73 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20  es[3];          
2c390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
2c3a0 75 6c 74 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  ults */.  Mem *p
2c3b0 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
2c3c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
2c3d0 74 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  te results here 
2c3e0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
2c3f0 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
2c400 20 20 61 52 65 73 5b 30 5d 20 3d 20 30 3b 0a 20    aRes[0] = 0;. 
2c410 20 61 52 65 73 5b 31 5d 20 3d 20 61 52 65 73 5b   aRes[1] = aRes[
2c420 32 5d 20 3d 20 2d 31 3b 0a 20 20 61 73 73 65 72  2] = -1;.  asser
2c430 74 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49  t( pOp->p2==SQLI
2c440 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
2c450 53 53 49 56 45 0a 20 20 20 20 20 20 20 7c 7c 20  SSIVE.       || 
2c460 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f  pOp->p2==SQLITE_
2c470 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 0a  CHECKPOINT_FULL.
2c480 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70         || pOp->p
2c490 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  2==SQLITE_CHECKP
2c4a0 4f 49 4e 54 5f 52 45 53 54 41 52 54 0a 20 20 29  OINT_RESTART.  )
2c4b0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2c4c0 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 70  Checkpoint(db, p
2c4d0 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c  Op->p1, pOp->p2,
2c4e0 20 26 61 52 65 73 5b 31 5d 2c 20 26 61 52 65 73   &aRes[1], &aRes
2c4f0 5b 32 5d 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  [2]);.  if( rc==
2c500 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
2c510 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2c520 4b 3b 0a 20 20 20 20 61 52 65 73 5b 30 5d 20 3d  K;.    aRes[0] =
2c530 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   1;.  }.  for(i=
2c540 30 2c 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b  0, pMem = &aMem[
2c550 70 4f 70 2d 3e 70 33 5d 3b 20 69 3c 33 3b 20 69  pOp->p3]; i<3; i
2c560 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20  ++, pMem++){.   
2c570 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
2c580 65 74 49 6e 74 36 34 28 70 4d 65 6d 2c 20 28 69  etInt64(pMem, (i
2c590 36 34 29 61 52 65 73 5b 69 5d 29 3b 0a 20 20 7d  64)aRes[i]);.  }
2c5a0 20 20 20 20 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b      .  break;.};
2c5b0 20 20 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64    .#endif..#ifnd
2c5c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
2c5d0 52 41 47 4d 41 0a 2f 2a 20 4f 70 63 6f 64 65 3a  RAGMA./* Opcode:
2c5e0 20 4a 6f 75 72 6e 61 6c 4d 6f 64 65 20 50 31 20   JournalMode P1 
2c5f0 50 32 20 50 33 20 2a 20 50 35 0a 2a 2a 0a 2a 2a  P2 P3 * P5.**.**
2c600 20 43 68 61 6e 67 65 20 74 68 65 20 6a 6f 75 72   Change the jour
2c610 6e 61 6c 20 6d 6f 64 65 20 6f 66 20 64 61 74 61  nal mode of data
2c620 62 61 73 65 20 50 31 20 74 6f 20 50 33 2e 20 50  base P1 to P3. P
2c630 33 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  3 must be one of
2c640 20 74 68 65 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f   the.** PAGER_JO
2c650 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 76 61  URNALMODE_XXX va
2c660 6c 75 65 73 2e 20 49 66 20 63 68 61 6e 67 69 6e  lues. If changin
2c670 67 20 62 65 74 77 65 65 6e 20 74 68 65 20 76 61  g between the va
2c680 72 69 6f 75 73 20 72 6f 6c 6c 62 61 63 6b 0a 2a  rious rollback.*
2c690 2a 20 6d 6f 64 65 73 20 28 64 65 6c 65 74 65 2c  * modes (delete,
2c6a0 20 74 72 75 6e 63 61 74 65 2c 20 70 65 72 73 69   truncate, persi
2c6b0 73 74 2c 20 6f 66 66 20 61 6e 64 20 6d 65 6d 6f  st, off and memo
2c6c0 72 79 29 2c 20 74 68 69 73 20 69 73 20 61 20 73  ry), this is a s
2c6d0 69 6d 70 6c 65 0a 2a 2a 20 6f 70 65 72 61 74 69  imple.** operati
2c6e0 6f 6e 2e 20 4e 6f 20 49 4f 20 69 73 20 72 65 71  on. No IO is req
2c6f0 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
2c700 63 68 61 6e 67 69 6e 67 20 69 6e 74 6f 20 6f 72  changing into or
2c710 20 6f 75 74 20 6f 66 20 57 41 4c 20 6d 6f 64 65   out of WAL mode
2c720 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 20 69   the procedure i
2c730 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74  s more complicat
2c740 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ed..**.** Write 
2c750 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  a string contain
2c760 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 6a 6f  ing the final jo
2c770 75 72 6e 61 6c 2d 6d 6f 64 65 20 74 6f 20 72 65  urnal-mode to re
2c780 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61  gister P2..*/.ca
2c790 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64  se OP_JournalMod
2c7a0 65 3a 20 7b 20 20 20 20 2f 2a 20 6f 75 74 32 2d  e: {    /* out2-
2c7b0 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
2c7c0 42 74 72 65 65 20 2a 70 42 74 3b 20 20 20 20 20  Btree *pBt;     
2c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7e0 2f 2a 20 42 74 72 65 65 20 74 6f 20 63 68 61 6e  /* Btree to chan
2c7f0 67 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20  ge journal mode 
2c800 6f 66 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70  of */.  Pager *p
2c810 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  Pager;          
2c820 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
2c830 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2c840 20 70 42 74 20 2a 2f 0a 20 20 69 6e 74 20 65 4e   pBt */.  int eN
2c850 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
2c860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
2c870 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f   journal mode */
2c880 0a 20 20 69 6e 74 20 65 4f 6c 64 3b 20 20 20 20  .  int eOld;    
2c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8a0 20 20 20 2f 2a 20 54 68 65 20 6f 6c 64 20 6a 6f     /* The old jo
2c8b0 75 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 23 69  urnal mode */.#i
2c8c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2c8d0 54 5f 57 41 4c 0a 20 20 63 6f 6e 73 74 20 63 68  T_WAL.  const ch
2c8e0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
2c8f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2c900 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
2c910 20 66 6f 72 20 70 50 61 67 65 72 20 2a 2f 0a 23   for pPager */.#
2c920 65 6e 64 69 66 0a 0a 20 20 65 4e 65 77 20 3d 20  endif..  eNew = 
2c930 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72  pOp->p3;.  asser
2c940 74 28 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a  t( eNew==PAGER_J
2c950 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
2c960 45 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65  E .       || eNe
2c970 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  w==PAGER_JOURNAL
2c980 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 0a 20  MODE_TRUNCATE . 
2c990 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50        || eNew==P
2c9a0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2c9b0 5f 50 45 52 53 49 53 54 20 0a 20 20 20 20 20 20  _PERSIST .      
2c9c0 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f   || eNew==PAGER_
2c9d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a  JOURNALMODE_OFF.
2c9e0 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d         || eNew==
2c9f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2ca00 45 5f 4d 45 4d 4f 52 59 0a 20 20 20 20 20 20 20  E_MEMORY.       
2ca10 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a  || eNew==PAGER_J
2ca20 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 20  OURNALMODE_WAL. 
2ca30 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50        || eNew==P
2ca40 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2ca50 5f 51 55 45 52 59 0a 20 20 29 3b 0a 20 20 61 73  _QUERY.  );.  as
2ca60 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
2ca70 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e   && pOp->p1<db->
2ca80 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
2ca90 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
2caa0 29 3b 0a 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e  );..  pBt = db->
2cab0 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74  aDb[pOp->p1].pBt
2cac0 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c  ;.  pPager = sql
2cad0 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
2cae0 42 74 29 3b 0a 20 20 65 4f 6c 64 20 3d 20 73 71  Bt);.  eOld = sq
2caf0 6c 69 74 65 33 50 61 67 65 72 47 65 74 4a 6f 75  lite3PagerGetJou
2cb00 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 29  rnalMode(pPager)
2cb10 3b 0a 20 20 69 66 28 20 65 4e 65 77 3d 3d 50 41  ;.  if( eNew==PA
2cb20 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2cb30 51 55 45 52 59 20 29 20 65 4e 65 77 20 3d 20 65  QUERY ) eNew = e
2cb40 4f 6c 64 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  Old;.  if( !sqli
2cb50 74 65 33 50 61 67 65 72 4f 6b 54 6f 43 68 61 6e  te3PagerOkToChan
2cb60 67 65 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50  geJournalMode(pP
2cb70 61 67 65 72 29 20 29 20 65 4e 65 77 20 3d 20 65  ager) ) eNew = e
2cb80 4f 6c 64 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Old;..#ifndef SQ
2cb90 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2cba0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  zFilename = sqli
2cbb0 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
2cbc0 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 0a 20 20  (pPager, 1);..  
2cbd0 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
2cbe0 61 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20  a transition to 
2cbf0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 57 41 4c  journal_mode=WAL
2cc00 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 0a   for a database.
2cc10 20 20 2a 2a 20 69 6e 20 74 65 6d 70 6f 72 61 72    ** in temporar
2cc20 79 20 73 74 6f 72 61 67 65 20 6f 72 20 69 66 20  y storage or if 
2cc30 74 68 65 20 56 46 53 20 64 6f 65 73 20 6e 6f 74  the VFS does not
2cc40 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 20   support shared 
2cc50 6d 65 6d 6f 72 79 20 0a 20 20 2a 2f 0a 20 20 69  memory .  */.  i
2cc60 66 28 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a  f( eNew==PAGER_J
2cc70 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 20  OURNALMODE_WAL. 
2cc80 20 20 26 26 20 28 73 71 6c 69 74 65 33 53 74 72    && (sqlite3Str
2cc90 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
2cca0 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ==0           /*
2ccb0 20 54 65 6d 70 20 66 69 6c 65 20 2a 2f 0a 20 20   Temp file */.  
2ccc0 20 20 20 20 20 7c 7c 20 21 73 71 6c 69 74 65 33       || !sqlite3
2ccd0 50 61 67 65 72 57 61 6c 53 75 70 70 6f 72 74 65  PagerWalSupporte
2cce0 64 28 70 50 61 67 65 72 29 29 20 20 20 2f 2a 20  d(pPager))   /* 
2ccf0 4e 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  No shared-memory
2cd00 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 29 7b   support */.  ){
2cd10 0a 20 20 20 20 65 4e 65 77 20 3d 20 65 4f 6c 64  .    eNew = eOld
2cd20 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 28 65 4e  ;.  }..  if( (eN
2cd30 65 77 21 3d 65 4f 6c 64 29 0a 20 20 20 26 26 20  ew!=eOld).   && 
2cd40 28 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55  (eOld==PAGER_JOU
2cd50 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 7c 7c 20  RNALMODE_WAL || 
2cd60 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eNew==PAGER_JOUR
2cd70 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 29  NALMODE_WAL).  )
2cd80 7b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 61  {.    if( !db->a
2cd90 75 74 6f 43 6f 6d 6d 69 74 20 7c 7c 20 64 62 2d  utoCommit || db-
2cda0 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a  >nVdbeRead>1 ){.
2cdb0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2cdc0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 73  E_ERROR;.      s
2cdd0 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
2cde0 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
2cdf0 20 0a 20 20 20 20 20 20 20 20 20 20 22 63 61 6e   .          "can
2ce00 6e 6f 74 20 63 68 61 6e 67 65 20 25 73 20 77 61  not change %s wa
2ce10 6c 20 6d 6f 64 65 20 66 72 6f 6d 20 77 69 74 68  l mode from with
2ce20 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
2ce30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 28 65 4e  ",.          (eN
2ce40 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ew==PAGER_JOURNA
2ce50 4c 4d 4f 44 45 5f 57 41 4c 20 3f 20 22 69 6e 74  LMODE_WAL ? "int
2ce60 6f 22 20 3a 20 22 6f 75 74 20 6f 66 22 29 0a 20  o" : "out of"). 
2ce70 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72       );.      br
2ce80 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
2ce90 20 0a 20 20 20 20 20 20 69 66 28 20 65 4f 6c 64   .      if( eOld
2cea0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2ceb0 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20  ODE_WAL ){.     
2cec0 20 20 20 2f 2a 20 49 66 20 6c 65 61 76 69 6e 67     /* If leaving
2ced0 20 57 41 4c 20 6d 6f 64 65 2c 20 63 6c 6f 73 65   WAL mode, close
2cee0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49   the log file. I
2cef0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
2cf00 65 20 63 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  e call.        *
2cf10 2a 20 74 6f 20 50 61 67 65 72 43 6c 6f 73 65 57  * to PagerCloseW
2cf20 61 6c 28 29 20 63 68 65 63 6b 70 6f 69 6e 74 73  al() checkpoints
2cf30 20 61 6e 64 20 64 65 6c 65 74 65 73 20 74 68 65   and deletes the
2cf40 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67   write-ahead-log
2cf50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c   .        ** fil
2cf60 65 2e 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20  e. An EXCLUSIVE 
2cf70 6c 6f 63 6b 20 6d 61 79 20 73 74 69 6c 6c 20 62  lock may still b
2cf80 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  e held on the da
2cf90 74 61 62 61 73 65 20 66 69 6c 65 20 0a 20 20 20  tabase file .   
2cfa0 20 20 20 20 20 2a 2a 20 61 66 74 65 72 20 61 20       ** after a 
2cfb0 73 75 63 63 65 73 73 66 75 6c 20 72 65 74 75 72  successful retur
2cfc0 6e 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  n. .        */. 
2cfd0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2cfe0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 57 61 6c  te3PagerCloseWal
2cff0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2d000 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d010 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2d020 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
2d030 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67  JournalMode(pPag
2d040 65 72 2c 20 65 4e 65 77 29 3b 0a 20 20 20 20 20  er, eNew);.     
2d050 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2d060 20 69 66 28 20 65 4f 6c 64 3d 3d 50 41 47 45 52   if( eOld==PAGER
2d070 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2d080 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ORY ){.        /
2d090 2a 20 43 61 6e 6e 6f 74 20 74 72 61 6e 73 69 74  * Cannot transit
2d0a0 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 66 72 6f  ion directly fro
2d0b0 6d 20 4d 45 4d 4f 52 59 20 74 6f 20 57 41 4c 2e  m MEMORY to WAL.
2d0c0 20 20 55 73 65 20 6d 6f 64 65 20 4f 46 46 0a 20    Use mode OFF. 
2d0d0 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 6e 20         ** as an 
2d0e0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 2a 2f 0a  intermediate */.
2d0f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
2d100 61 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f  agerSetJournalMo
2d110 64 65 28 70 50 61 67 65 72 2c 20 50 41 47 45 52  de(pPager, PAGER
2d120 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2d130 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  );.      }.  .  
2d140 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 72      /* Open a tr
2d150 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
2d160 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2d170 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
2d180 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
2d190 2a 2a 20 6d 6f 64 65 2c 20 74 68 69 73 20 74 72  ** mode, this tr
2d1a0 61 6e 73 61 63 74 69 6f 6e 20 61 6c 77 61 79 73  ansaction always
2d1b0 20 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b   uses a rollback
2d1c0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20   journal..      
2d1d0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
2d1e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
2d1f0 6e 54 72 61 6e 73 28 70 42 74 29 3d 3d 30 20 29  nTrans(pBt)==0 )
2d200 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2d210 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d220 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2d230 33 42 74 72 65 65 53 65 74 56 65 72 73 69 6f 6e  3BtreeSetVersion
2d240 28 70 42 74 2c 20 28 65 4e 65 77 3d 3d 50 41 47  (pBt, (eNew==PAG
2d250 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
2d260 41 4c 20 3f 20 32 20 3a 20 31 29 29 3b 0a 20 20  AL ? 2 : 1));.  
2d270 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2d280 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66  #endif /* ifndef
2d290 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
2d2a0 20 2a 2f 0a 0a 20 20 69 66 28 20 72 63 20 29 7b   */..  if( rc ){
2d2b0 0a 20 20 20 20 65 4e 65 77 20 3d 20 65 4f 6c 64  .    eNew = eOld
2d2c0 3b 0a 20 20 7d 0a 20 20 65 4e 65 77 20 3d 20 73  ;.  }.  eNew = s
2d2d0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4a 6f  qlite3PagerSetJo
2d2e0 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72  urnalMode(pPager
2d2f0 2c 20 65 4e 65 77 29 3b 0a 0a 20 20 70 4f 75 74  , eNew);..  pOut
2d300 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
2d310 5d 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  ];.  pOut->flags
2d320 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53   = MEM_Str|MEM_S
2d330 74 61 74 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  tatic|MEM_Term;.
2d340 20 20 70 4f 75 74 2d 3e 7a 20 3d 20 28 63 68 61    pOut->z = (cha
2d350 72 20 2a 29 73 71 6c 69 74 65 33 4a 6f 75 72 6e  r *)sqlite3Journ
2d360 61 6c 4d 6f 64 65 6e 61 6d 65 28 65 4e 65 77 29  alModename(eNew)
2d370 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 73 71  ;.  pOut->n = sq
2d380 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4f  lite3Strlen30(pO
2d390 75 74 2d 3e 7a 29 3b 0a 20 20 70 4f 75 74 2d 3e  ut->z);.  pOut->
2d3a0 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
2d3b0 38 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  8;.  sqlite3Vdbe
2d3c0 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70  ChangeEncoding(p
2d3d0 4f 75 74 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  Out, encoding);.
2d3e0 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a 23 65 6e 64    break;.};.#end
2d3f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2d400 54 5f 50 52 41 47 4d 41 20 2a 2f 0a 0a 23 69 66  T_PRAGMA */..#if
2d410 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2d420 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 26 26  _OMIT_VACUUM) &&
2d430 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2d440 5f 4f 4d 49 54 5f 41 54 54 41 43 48 29 0a 2f 2a  _OMIT_ATTACH)./*
2d450 20 4f 70 63 6f 64 65 3a 20 56 61 63 75 75 6d 20   Opcode: Vacuum 
2d460 2a 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  * * * * *.**.** 
2d470 56 61 63 75 75 6d 20 74 68 65 20 65 6e 74 69 72  Vacuum the entir
2d480 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
2d490 73 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 63 61  s opcode will ca
2d4a0 75 73 65 20 6f 74 68 65 72 20 76 69 72 74 75 61  use other virtua
2d4b0 6c 0a 2a 2a 20 6d 61 63 68 69 6e 65 73 20 74 6f  l.** machines to
2d4c0 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
2d4d0 72 75 6e 2e 20 20 49 74 20 6d 61 79 20 6e 6f 74  run.  It may not
2d4e0 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
2d4f0 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
2d500 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  saction..*/.case
2d510 20 4f 50 5f 56 61 63 75 75 6d 3a 20 7b 0a 20 20   OP_Vacuum: {.  
2d520 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f  assert( p->readO
2d530 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  nly==0 );.  rc =
2d540 20 73 71 6c 69 74 65 33 52 75 6e 56 61 63 75 75   sqlite3RunVacuu
2d550 6d 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  m(&p->zErrMsg, d
2d560 62 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  b);.  break;.}.#
2d570 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
2d580 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2d590 41 55 54 4f 56 41 43 55 55 4d 29 0a 2f 2a 20 4f  AUTOVACUUM)./* O
2d5a0 70 63 6f 64 65 3a 20 49 6e 63 72 56 61 63 75 75  pcode: IncrVacuu
2d5b0 6d 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  m P1 P2 * * *.**
2d5c0 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
2d5d0 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 74 68 65  ngle step of the
2d5e0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
2d5f0 75 75 6d 20 70 72 6f 63 65 64 75 72 65 20 6f 6e  uum procedure on
2d600 0a 2a 2a 20 74 68 65 20 50 31 20 64 61 74 61 62  .** the P1 datab
2d610 61 73 65 2e 20 49 66 20 74 68 65 20 76 61 63 75  ase. If the vacu
2d620 75 6d 20 68 61 73 20 66 69 6e 69 73 68 65 64 2c  um has finished,
2d630 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63   jump to instruc
2d640 74 69 6f 6e 0a 2a 2a 20 50 32 2e 20 4f 74 68 65  tion.** P2. Othe
2d650 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 6f  rwise, fall thro
2d660 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
2d670 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
2d680 63 61 73 65 20 4f 50 5f 49 6e 63 72 56 61 63 75  case OP_IncrVacu
2d690 75 6d 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  um: {        /* 
2d6a0 6a 75 6d 70 20 2a 2f 0a 20 20 42 74 72 65 65 20  jump */.  Btree 
2d6b0 2a 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pBt;..  assert(
2d6c0 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
2d6d0 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29  Op->p1<db->nDb )
2d6e0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  ;.  assert( (p->
2d6f0 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79  btreeMask & (((y
2d700 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e  DbMask)1)<<pOp->
2d710 70 31 29 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  p1))!=0 );.  ass
2d720 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  ert( p->readOnly
2d730 3d 3d 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 64  ==0 );.  pBt = d
2d740 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e  b->aDb[pOp->p1].
2d750 70 42 74 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  pBt;.  rc = sqli
2d760 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75  te3BtreeIncrVacu
2d770 75 6d 28 70 42 74 29 3b 0a 20 20 69 66 28 20 72  um(pBt);.  if( r
2d780 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
2d790 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e  {.    pc = pOp->
2d7a0 70 32 20 2d 20 31 3b 0a 20 20 20 20 72 63 20 3d  p2 - 1;.    rc =
2d7b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2d7c0 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
2d7d0 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 78  f../* Opcode: Ex
2d7e0 70 69 72 65 20 50 31 20 2a 20 2a 20 2a 20 2a 0a  pire P1 * * * *.
2d7f0 2a 2a 0a 2a 2a 20 43 61 75 73 65 20 70 72 65 63  **.** Cause prec
2d800 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
2d810 74 73 20 74 6f 20 62 65 63 6f 6d 65 20 65 78 70  ts to become exp
2d820 69 72 65 64 2e 20 41 6e 20 65 78 70 69 72 65 64  ired. An expired
2d830 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 66 61   statement.** fa
2d840 69 6c 73 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ils with an erro
2d850 72 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45  r code of SQLITE
2d860 5f 53 43 48 45 4d 41 20 69 66 20 69 74 20 69 73  _SCHEMA if it is
2d870 20 65 76 65 72 20 65 78 65 63 75 74 65 64 20 0a   ever executed .
2d880 2a 2a 20 28 76 69 61 20 73 71 6c 69 74 65 33 5f  ** (via sqlite3_
2d890 73 74 65 70 28 29 29 2e 0a 2a 2a 20 0a 2a 2a 20  step())..** .** 
2d8a0 49 66 20 50 31 20 69 73 20 30 2c 20 74 68 65 6e  If P1 is 0, then
2d8b0 20 61 6c 6c 20 53 51 4c 20 73 74 61 74 65 6d 65   all SQL stateme
2d8c0 6e 74 73 20 62 65 63 6f 6d 65 20 65 78 70 69 72  nts become expir
2d8d0 65 64 2e 20 49 66 20 50 31 20 69 73 20 6e 6f 6e  ed. If P1 is non
2d8e0 2d 7a 65 72 6f 2c 0a 2a 2a 20 74 68 65 6e 20 6f  -zero,.** then o
2d8f0 6e 6c 79 20 74 68 65 20 63 75 72 72 65 6e 74 6c  nly the currentl
2d900 79 20 65 78 65 63 75 74 69 6e 67 20 73 74 61 74  y executing stat
2d910 65 6d 65 6e 74 20 69 73 20 61 66 66 65 63 74 65  ement is affecte
2d920 64 2e 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 45  d. .*/.case OP_E
2d930 78 70 69 72 65 3a 20 7b 0a 20 20 69 66 28 20 21  xpire: {.  if( !
2d940 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 73  pOp->p1 ){.    s
2d950 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
2d960 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
2d970 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
2d980 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
2d990 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
2d9a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d9b0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2d9c0 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 61 62  E./* Opcode: Tab
2d9d0 6c 65 4c 6f 63 6b 20 50 31 20 50 32 20 50 33 20  leLock P1 P2 P3 
2d9e0 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 4f 62 74 61 69  P4 *.**.** Obtai
2d9f0 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 70 61  n a lock on a pa
2da00 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20  rticular table. 
2da10 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  This instruction
2da20 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68   is only used wh
2da30 65 6e 0a 2a 2a 20 74 68 65 20 73 68 61 72 65 64  en.** the shared
2da40 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20 69  -cache feature i
2da50 73 20 65 6e 61 62 6c 65 64 2e 20 0a 2a 2a 0a 2a  s enabled. .**.*
2da60 2a 20 50 31 20 69 73 20 74 68 65 20 69 6e 64 65  * P1 is the inde
2da70 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
2da80 65 20 69 6e 20 73 71 6c 69 74 65 33 2e 61 44 62  e in sqlite3.aDb
2da90 5b 5d 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  [] of the databa
2daa0 73 65 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20 74  se.** on which t
2dab0 68 65 20 6c 6f 63 6b 20 69 73 20 61 63 71 75 69  he lock is acqui
2dac0 72 65 64 2e 20 20 41 20 72 65 61 64 6c 6f 63 6b  red.  A readlock
2dad0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69 66 20   is obtained if 
2dae0 50 33 3d 3d 30 20 6f 72 0a 2a 2a 20 61 20 77 72  P3==0 or.** a wr
2daf0 69 74 65 20 6c 6f 63 6b 20 69 66 20 50 33 3d 3d  ite lock if P3==
2db00 31 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 63 6f 6e 74  1..**.** P2 cont
2db10 61 69 6e 73 20 74 68 65 20 72 6f 6f 74 2d 70 61  ains the root-pa
2db20 67 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ge of the table 
2db30 74 6f 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 50  to lock..**.** P
2db40 34 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  4 contains a poi
2db50 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65  nter to the name
2db60 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 62 65   of the table be
2db70 69 6e 67 20 6c 6f 63 6b 65 64 2e 20 54 68 69 73  ing locked. This
2db80 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 75 73 65 64   is only.** used
2db90 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20   to generate an 
2dba0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66  error message if
2dbb0 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
2dbc0 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f   be obtained..*/
2dbd0 0a 63 61 73 65 20 4f 50 5f 54 61 62 6c 65 4c 6f  .case OP_TableLo
2dbe0 63 6b 3a 20 7b 0a 20 20 75 38 20 69 73 57 72 69  ck: {.  u8 isWri
2dbf0 74 65 4c 6f 63 6b 20 3d 20 28 75 38 29 70 4f 70  teLock = (u8)pOp
2dc00 2d 3e 70 33 3b 0a 20 20 69 66 28 20 69 73 57 72  ->p3;.  if( isWr
2dc10 69 74 65 4c 6f 63 6b 20 7c 7c 20 30 3d 3d 28 64  iteLock || 0==(d
2dc20 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
2dc30 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
2dc40 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 31 20 3d   ){.    int p1 =
2dc50 20 70 4f 70 2d 3e 70 31 3b 20 0a 20 20 20 20 61   pOp->p1; .    a
2dc60 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20  ssert( p1>=0 && 
2dc70 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p1<db->nDb );.  
2dc80 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74    assert( (p->bt
2dc90 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44 62  reeMask & (((yDb
2dca0 4d 61 73 6b 29 31 29 3c 3c 70 31 29 29 21 3d 30  Mask)1)<<p1))!=0
2dcb0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2dcc0 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 30 20 7c  isWriteLock==0 |
2dcd0 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 31  | isWriteLock==1
2dce0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2dcf0 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61 62  ite3BtreeLockTab
2dd00 6c 65 28 64 62 2d 3e 61 44 62 5b 70 31 5d 2e 70  le(db->aDb[p1].p
2dd10 42 74 2c 20 70 4f 70 2d 3e 70 32 2c 20 69 73 57  Bt, pOp->p2, isW
2dd20 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  riteLock);.    i
2dd30 66 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51  f( (rc&0xFF)==SQ
2dd40 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  LITE_LOCKED ){. 
2dd50 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2dd60 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  *z = pOp->p4.z;.
2dd70 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
2dd80 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
2dd90 73 67 2c 20 64 62 2c 20 22 64 61 74 61 62 61 73  sg, db, "databas
2dda0 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65  e table is locke
2ddb0 64 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  d: %s", z);.    
2ddc0 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  }.  }.  break;.}
2ddd0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2dde0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
2ddf0 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  CHE */..#ifndef 
2de00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2de10 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f  UALTABLE./* Opco
2de20 64 65 3a 20 56 42 65 67 69 6e 20 2a 20 2a 20 2a  de: VBegin * * *
2de30 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 6d   P4 *.**.** P4 m
2de40 61 79 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  ay be a pointer 
2de50 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74  to an sqlite3_vt
2de60 61 62 20 73 74 72 75 63 74 75 72 65 2e 20 49 66  ab structure. If
2de70 20 73 6f 2c 20 63 61 6c 6c 20 74 68 65 20 0a 2a   so, call the .*
2de80 2a 20 78 42 65 67 69 6e 20 6d 65 74 68 6f 64 20  * xBegin method 
2de90 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  for that table..
2dea0 2a 2a 0a 2a 2a 20 41 6c 73 6f 2c 20 77 68 65 74  **.** Also, whet
2deb0 68 65 72 20 6f 72 20 6e 6f 74 20 50 34 20 69 73  her or not P4 is
2dec0 20 73 65 74 2c 20 63 68 65 63 6b 20 74 68 61 74   set, check that
2ded0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 62 65 69   this is not bei
2dee0 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 0a 2a  ng called from.*
2def0 2a 20 77 69 74 68 69 6e 20 61 20 63 61 6c 6c 62  * within a callb
2df00 61 63 6b 20 74 6f 20 61 20 76 69 72 74 75 61 6c  ack to a virtual
2df10 20 74 61 62 6c 65 20 78 53 79 6e 63 28 29 20 6d   table xSync() m
2df20 65 74 68 6f 64 2e 20 49 66 20 69 74 20 69 73 2c  ethod. If it is,
2df30 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f   the error.** co
2df40 64 65 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  de will be set t
2df50 6f 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  o SQLITE_LOCKED.
2df60 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 42 65 67  .*/.case OP_VBeg
2df70 69 6e 3a 20 7b 0a 20 20 56 54 61 62 6c 65 20 2a  in: {.  VTable *
2df80 70 56 54 61 62 3b 0a 20 20 70 56 54 61 62 20 3d  pVTab;.  pVTab =
2df90 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a   pOp->p4.pVtab;.
2dfa0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
2dfb0 61 62 42 65 67 69 6e 28 64 62 2c 20 70 56 54 61  abBegin(db, pVTa
2dfc0 62 29 3b 0a 20 20 69 66 28 20 70 56 54 61 62 20  b);.  if( pVTab 
2dfd0 29 20 69 6d 70 6f 72 74 56 74 61 62 45 72 72 4d  ) importVtabErrM
2dfe0 73 67 28 70 2c 20 70 56 54 61 62 2d 3e 70 56 74  sg(p, pVTab->pVt
2dff0 61 62 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ab);.  break;.}.
2e000 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2e010 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2e020 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  LE */..#ifndef S
2e030 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2e040 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64  ALTABLE./* Opcod
2e050 65 3a 20 56 43 72 65 61 74 65 20 50 31 20 2a 20  e: VCreate P1 * 
2e060 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20  * P4 *.**.** P4 
2e070 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
2e080 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
2e090 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 43  n database P1. C
2e0a0 61 6c 6c 20 74 68 65 20 78 43 72 65 61 74 65 20  all the xCreate 
2e0b0 6d 65 74 68 6f 64 0a 2a 2a 20 66 6f 72 20 74 68  method.** for th
2e0c0 61 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73  at table..*/.cas
2e0d0 65 20 4f 50 5f 56 43 72 65 61 74 65 3a 20 7b 0a  e OP_VCreate: {.
2e0e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
2e0f0 61 62 43 61 6c 6c 43 72 65 61 74 65 28 64 62 2c  abCallCreate(db,
2e100 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
2e110 34 2e 7a 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67  4.z, &p->zErrMsg
2e120 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  );.  break;.}.#e
2e130 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2e140 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2e150 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
2e160 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2e170 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a  TABLE./* Opcode:
2e180 20 56 44 65 73 74 72 6f 79 20 50 31 20 2a 20 2a   VDestroy P1 * *
2e190 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69   P4 *.**.** P4 i
2e1a0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
2e1b0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
2e1c0 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 20 43   database P1.  C
2e1d0 61 6c 6c 20 74 68 65 20 78 44 65 73 74 72 6f 79  all the xDestroy
2e1e0 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68   method.** of th
2e1f0 61 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73  at table..*/.cas
2e200 65 20 4f 50 5f 56 44 65 73 74 72 6f 79 3a 20 7b  e OP_VDestroy: {
2e210 0a 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68  .  p->inVtabMeth
2e220 6f 64 20 3d 20 32 3b 0a 20 20 72 63 20 3d 20 73  od = 2;.  rc = s
2e230 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 44 65  qlite3VtabCallDe
2e240 73 74 72 6f 79 28 64 62 2c 20 70 4f 70 2d 3e 70  stroy(db, pOp->p
2e250 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  1, pOp->p4.z);. 
2e260 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
2e270 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d   = 0;.  break;.}
2e280 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2e290 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2e2a0 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  BLE */..#ifndef 
2e2b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2e2c0 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f  UALTABLE./* Opco
2e2d0 64 65 3a 20 56 4f 70 65 6e 20 50 31 20 2a 20 2a  de: VOpen P1 * *
2e2e0 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69   P4 *.**.** P4 i
2e2f0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2e300 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f   virtual table o
2e310 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c 69 74 65  bject, an sqlite
2e320 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65  3_vtab structure
2e330 2e 0a 2a 2a 20 50 31 20 69 73 20 61 20 63 75 72  ..** P1 is a cur
2e340 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 54 68 69  sor number.  Thi
2e350 73 20 6f 70 63 6f 64 65 20 6f 70 65 6e 73 20 61  s opcode opens a
2e360 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 76   cursor to the v
2e370 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20  irtual.** table 
2e380 61 6e 64 20 73 74 6f 72 65 73 20 74 68 61 74 20  and stores that 
2e390 63 75 72 73 6f 72 20 69 6e 20 50 31 2e 0a 2a 2f  cursor in P1..*/
2e3a0 0a 63 61 73 65 20 4f 50 5f 56 4f 70 65 6e 3a 20  .case OP_VOpen: 
2e3b0 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
2e3c0 70 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pCur;.  sqlite3_
2e3d0 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
2e3e0 61 62 43 75 72 73 6f 72 3b 0a 20 20 73 71 6c 69  abCursor;.  sqli
2e3f0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b  te3_vtab *pVtab;
2e400 0a 20 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  .  sqlite3_modul
2e410 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 61  e *pModule;..  a
2e420 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61  ssert( p->bIsRea
2e430 64 65 72 20 29 3b 0a 20 20 70 43 75 72 20 3d 20  der );.  pCur = 
2e440 30 3b 0a 20 20 70 56 74 61 62 43 75 72 73 6f 72  0;.  pVtabCursor
2e450 20 3d 20 30 3b 0a 20 20 70 56 74 61 62 20 3d 20   = 0;.  pVtab = 
2e460 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70  pOp->p4.pVtab->p
2e470 56 74 61 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20  Vtab;.  pModule 
2e480 3d 20 28 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  = (sqlite3_modul
2e490 65 20 2a 29 70 56 74 61 62 2d 3e 70 4d 6f 64 75  e *)pVtab->pModu
2e4a0 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 70 56 74  le;.  assert(pVt
2e4b0 61 62 20 26 26 20 70 4d 6f 64 75 6c 65 29 3b 0a  ab && pModule);.
2e4c0 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e    rc = pModule->
2e4d0 78 4f 70 65 6e 28 70 56 74 61 62 2c 20 26 70 56  xOpen(pVtab, &pV
2e4e0 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 69 6d  tabCursor);.  im
2e4f0 70 6f 72 74 56 74 61 62 45 72 72 4d 73 67 28 70  portVtabErrMsg(p
2e500 2c 20 70 56 74 61 62 29 3b 0a 20 20 69 66 28 20  , pVtab);.  if( 
2e510 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 29 7b  SQLITE_OK==rc ){
2e520 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
2e530 7a 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  ze sqlite3_vtab_
2e540 63 75 72 73 6f 72 20 62 61 73 65 20 63 6c 61 73  cursor base clas
2e550 73 20 2a 2f 0a 20 20 20 20 70 56 74 61 62 43 75  s */.    pVtabCu
2e560 72 73 6f 72 2d 3e 70 56 74 61 62 20 3d 20 70 56  rsor->pVtab = pV
2e570 74 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69  tab;..    /* Ini
2e580 74 69 61 6c 69 7a 65 20 76 64 62 65 20 63 75 72  tialize vdbe cur
2e590 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  sor object */.  
2e5a0 20 20 70 43 75 72 20 3d 20 61 6c 6c 6f 63 61 74    pCur = allocat
2e5b0 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e  eCursor(p, pOp->
2e5c0 70 31 2c 20 30 2c 20 2d 31 2c 20 30 29 3b 0a 20  p1, 0, -1, 0);. 
2e5d0 20 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a 20     if( pCur ){. 
2e5e0 20 20 20 20 20 70 43 75 72 2d 3e 70 56 74 61 62       pCur->pVtab
2e5f0 43 75 72 73 6f 72 20 3d 20 70 56 74 61 62 43 75  Cursor = pVtabCu
2e600 72 73 6f 72 3b 0a 20 20 20 20 20 20 70 43 75 72  rsor;.      pCur
2e610 2d 3e 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61  ->pModule = pVta
2e620 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e  bCursor->pVtab->
2e630 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 7d 65 6c  pModule;.    }el
2e640 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61  se{.      db->ma
2e650 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
2e660 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78        pModule->x
2e670 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f  Close(pVtabCurso
2e680 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
2e690 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
2e6a0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
2e6b0 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
2e6c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2e6d0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2e6e0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 46 69 6c  ./* Opcode: VFil
2e6f0 74 65 72 20 50 31 20 50 32 20 50 33 20 50 34 20  ter P1 P2 P3 P4 
2e700 2a 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20  *.**.** P1 is a 
2e710 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 75 73  cursor opened us
2e720 69 6e 67 20 56 4f 70 65 6e 2e 20 20 50 32 20 69  ing VOpen.  P2 i
2e730 73 20 61 6e 20 61 64 64 72 65 73 73 20 74 6f 20  s an address to 
2e740 6a 75 6d 70 20 74 6f 20 69 66 0a 2a 2a 20 74 68  jump to if.** th
2e750 65 20 66 69 6c 74 65 72 65 64 20 72 65 73 75 6c  e filtered resul
2e760 74 20 73 65 74 20 69 73 20 65 6d 70 74 79 2e 0a  t set is empty..
2e770 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 65 69 74 68  **.** P4 is eith
2e780 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20 73 74 72  er NULL or a str
2e790 69 6e 67 20 74 68 61 74 20 77 61 73 20 67 65 6e  ing that was gen
2e7a0 65 72 61 74 65 64 20 62 79 20 74 68 65 20 78 42  erated by the xB
2e7b0 65 73 74 49 6e 64 65 78 0a 2a 2a 20 6d 65 74 68  estIndex.** meth
2e7c0 6f 64 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c 65  od of the module
2e7d0 2e 20 20 54 68 65 20 69 6e 74 65 72 70 72 65 74  .  The interpret
2e7e0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 34 20  ation of the P4 
2e7f0 73 74 72 69 6e 67 20 69 73 20 6c 65 66 74 0a 2a  string is left.*
2e800 2a 20 74 6f 20 74 68 65 20 6d 6f 64 75 6c 65 20  * to the module 
2e810 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a  implementation..
2e820 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
2e830 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 46  e invokes the xF
2e840 69 6c 74 65 72 20 6d 65 74 68 6f 64 20 6f 6e 20  ilter method on 
2e850 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
2e860 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62  e specified.** b
2e870 79 20 50 31 2e 20 20 54 68 65 20 69 6e 74 65 67  y P1.  The integ
2e880 65 72 20 71 75 65 72 79 20 70 6c 61 6e 20 70 61  er query plan pa
2e890 72 61 6d 65 74 65 72 20 74 6f 20 78 46 69 6c 74  rameter to xFilt
2e8a0 65 72 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  er is stored in 
2e8b0 72 65 67 69 73 74 65 72 0a 2a 2a 20 50 33 2e 20  register.** P3. 
2e8c0 52 65 67 69 73 74 65 72 20 50 33 2b 31 20 73 74  Register P3+1 st
2e8d0 6f 72 65 73 20 74 68 65 20 61 72 67 63 20 70 61  ores the argc pa
2e8e0 72 61 6d 65 74 65 72 20 74 6f 20 62 65 20 70 61  rameter to be pa
2e8f0 73 73 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 78  ssed to the.** x
2e900 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e 20 52  Filter method. R
2e910 65 67 69 73 74 65 72 73 20 50 33 2b 32 2e 2e 50  egisters P3+2..P
2e920 33 2b 31 2b 61 72 67 63 20 61 72 65 20 74 68 65  3+1+argc are the
2e930 20 61 72 67 63 0a 2a 2a 20 61 64 64 69 74 69 6f   argc.** additio
2e940 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 73 20 77  nal parameters w
2e950 68 69 63 68 20 61 72 65 20 70 61 73 73 65 64 20  hich are passed 
2e960 74 6f 0a 2a 2a 20 78 46 69 6c 74 65 72 20 61 73  to.** xFilter as
2e970 20 61 72 67 76 2e 20 52 65 67 69 73 74 65 72 20   argv. Register 
2e980 50 33 2b 32 20 62 65 63 6f 6d 65 73 20 61 72 67  P3+2 becomes arg
2e990 76 5b 30 5d 20 77 68 65 6e 20 70 61 73 73 65 64  v[0] when passed
2e9a0 20 74 6f 20 78 46 69 6c 74 65 72 2e 0a 2a 2a 0a   to xFilter..**.
2e9b0 2a 2a 20 41 20 6a 75 6d 70 20 69 73 20 6d 61 64  ** A jump is mad
2e9c0 65 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 72  e to P2 if the r
2e9d0 65 73 75 6c 74 20 73 65 74 20 61 66 74 65 72 20  esult set after 
2e9e0 66 69 6c 74 65 72 69 6e 67 20 77 6f 75 6c 64 20  filtering would 
2e9f0 62 65 20 65 6d 70 74 79 2e 0a 2a 2f 0a 63 61 73  be empty..*/.cas
2ea00 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 20  e OP_VFilter: { 
2ea10 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69    /* jump */.  i
2ea20 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20 69  nt nArg;.  int i
2ea30 51 75 65 72 79 3b 0a 20 20 63 6f 6e 73 74 20 73  Query;.  const s
2ea40 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
2ea50 4d 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d 20 2a 70  Module;.  Mem *p
2ea60 51 75 65 72 79 3b 0a 20 20 4d 65 6d 20 2a 70 41  Query;.  Mem *pA
2ea70 72 67 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc;.  sqlite3_v
2ea80 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
2ea90 62 43 75 72 73 6f 72 3b 0a 20 20 73 71 6c 69 74  bCursor;.  sqlit
2eaa0 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a  e3_vtab *pVtab;.
2eab0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
2eac0 75 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  ur;.  int res;. 
2ead0 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 2a   int i;.  Mem **
2eae0 61 70 41 72 67 3b 0a 0a 20 20 70 51 75 65 72 79  apArg;..  pQuery
2eaf0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
2eb00 5d 3b 0a 20 20 70 41 72 67 63 20 3d 20 26 70 51  ];.  pArgc = &pQ
2eb10 75 65 72 79 5b 31 5d 3b 0a 20 20 70 43 75 72 20  uery[1];.  pCur 
2eb20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
2eb30 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 6d  p1];.  assert( m
2eb40 65 6d 49 73 56 61 6c 69 64 28 70 51 75 65 72 79  emIsValid(pQuery
2eb50 29 20 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f  ) );.  REGISTER_
2eb60 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70  TRACE(pOp->p3, p
2eb70 51 75 65 72 79 29 3b 0a 20 20 61 73 73 65 72 74  Query);.  assert
2eb80 28 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72  ( pCur->pVtabCur
2eb90 73 6f 72 20 29 3b 0a 20 20 70 56 74 61 62 43 75  sor );.  pVtabCu
2eba0 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 56 74  rsor = pCur->pVt
2ebb0 61 62 43 75 72 73 6f 72 3b 0a 20 20 70 56 74 61  abCursor;.  pVta
2ebc0 62 20 3d 20 70 56 74 61 62 43 75 72 73 6f 72 2d  b = pVtabCursor-
2ebd0 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64 75 6c  >pVtab;.  pModul
2ebe0 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  e = pVtab->pModu
2ebf0 6c 65 3b 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74  le;..  /* Grab t
2ec00 68 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  he index number 
2ec10 61 6e 64 20 61 72 67 63 20 70 61 72 61 6d 65 74  and argc paramet
2ec20 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ers */.  assert(
2ec30 20 28 70 51 75 65 72 79 2d 3e 66 6c 61 67 73 26   (pQuery->flags&
2ec40 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 26 26 20 70  MEM_Int)!=0 && p
2ec50 41 72 67 63 2d 3e 66 6c 61 67 73 3d 3d 4d 45 4d  Argc->flags==MEM
2ec60 5f 49 6e 74 20 29 3b 0a 20 20 6e 41 72 67 20 3d  _Int );.  nArg =
2ec70 20 28 69 6e 74 29 70 41 72 67 63 2d 3e 75 2e 69   (int)pArgc->u.i
2ec80 3b 0a 20 20 69 51 75 65 72 79 20 3d 20 28 69 6e  ;.  iQuery = (in
2ec90 74 29 70 51 75 65 72 79 2d 3e 75 2e 69 3b 0a 0a  t)pQuery->u.i;..
2eca0 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
2ecb0 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 20 2a  xFilter method *
2ecc0 2f 0a 20 20 7b 0a 20 20 20 20 72 65 73 20 3d 20  /.  {.    res = 
2ecd0 30 3b 0a 20 20 20 20 61 70 41 72 67 20 3d 20 70  0;.    apArg = p
2ece0 2d 3e 61 70 41 72 67 3b 0a 20 20 20 20 66 6f 72  ->apArg;.    for
2ecf0 28 69 20 3d 20 30 3b 20 69 3c 6e 41 72 67 3b 20  (i = 0; i<nArg; 
2ed00 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 70 41 72  i++){.      apAr
2ed10 67 5b 69 5d 20 3d 20 26 70 41 72 67 63 5b 69 2b  g[i] = &pArgc[i+
2ed20 31 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1];.      sqlite
2ed30 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70  3VdbeMemStoreTyp
2ed40 65 28 61 70 41 72 67 5b 69 5d 29 3b 0a 20 20 20  e(apArg[i]);.   
2ed50 20 7d 0a 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61   }..    p->inVta
2ed60 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20  bMethod = 1;.   
2ed70 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78   rc = pModule->x
2ed80 46 69 6c 74 65 72 28 70 56 74 61 62 43 75 72 73  Filter(pVtabCurs
2ed90 6f 72 2c 20 69 51 75 65 72 79 2c 20 70 4f 70 2d  or, iQuery, pOp-
2eda0 3e 70 34 2e 7a 2c 20 6e 41 72 67 2c 20 61 70 41  >p4.z, nArg, apA
2edb0 72 67 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74  rg);.    p->inVt
2edc0 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20  abMethod = 0;.  
2edd0 20 20 69 6d 70 6f 72 74 56 74 61 62 45 72 72 4d    importVtabErrM
2ede0 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20  sg(p, pVtab);.  
2edf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ee00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73  _OK ){.      res
2ee10 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66   = pModule->xEof
2ee20 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20  (pVtabCursor);. 
2ee30 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 65     }..    if( re
2ee40 73 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20  s ){.      pc = 
2ee50 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20  pOp->p2 - 1;.   
2ee60 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 6e   }.  }.  pCur->n
2ee70 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 0a 20 20 62  ullRow = 0;..  b
2ee80 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
2ee90 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
2eea0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
2eeb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2eec0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2eed0 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 43 6f 6c 75  /* Opcode: VColu
2eee0 6d 6e 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  mn P1 P2 P3 * *.
2eef0 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20  **.** Store the 
2ef00 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 2d  value of the P2-
2ef10 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  th column of.** 
2ef20 74 68 65 20 72 6f 77 20 6f 66 20 74 68 65 20 76  the row of the v
2ef30 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 74 68 61  irtual-table tha
2ef40 74 20 74 68 65 20 0a 2a 2a 20 50 31 20 63 75 72  t the .** P1 cur
2ef50 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
2ef60 74 6f 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  to into register
2ef70 20 50 33 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P3..*/.case OP_
2ef80 56 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 73 71 6c  VColumn: {.  sql
2ef90 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
2efa0 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  ;.  const sqlite
2efb0 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
2efc0 65 3b 0a 20 20 4d 65 6d 20 2a 70 44 65 73 74 3b  e;.  Mem *pDest;
2efd0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
2efe0 78 74 20 73 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  xt sContext;..  
2eff0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72  VdbeCursor *pCur
2f000 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
2f010 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
2f020 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f  pCur->pVtabCurso
2f030 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2f040 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d  Op->p3>0 && pOp-
2f050 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a  >p3<=p->nMem );.
2f060 20 20 70 44 65 73 74 20 3d 20 26 61 4d 65 6d 5b    pDest = &aMem[
2f070 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41  pOp->p3];.  memA
2f080 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
2f090 70 44 65 73 74 29 3b 0a 20 20 69 66 28 20 70 43  pDest);.  if( pC
2f0a0 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20  ur->nullRow ){. 
2f0b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
2f0c0 6d 53 65 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b  mSetNull(pDest);
2f0d0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
2f0e0 20 20 70 56 74 61 62 20 3d 20 70 43 75 72 2d 3e    pVtab = pCur->
2f0f0 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
2f100 61 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20  ab;.  pModule = 
2f110 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
2f120 20 20 61 73 73 65 72 74 28 20 70 4d 6f 64 75 6c    assert( pModul
2f130 65 2d 3e 78 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  e->xColumn );.  
2f140 6d 65 6d 73 65 74 28 26 73 43 6f 6e 74 65 78 74  memset(&sContext
2f150 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 6f 6e  , 0, sizeof(sCon
2f160 74 65 78 74 29 29 3b 0a 0a 20 20 2f 2a 20 54 68  text));..  /* Th
2f170 65 20 6f 75 74 70 75 74 20 63 65 6c 6c 20 6d 61  e output cell ma
2f180 79 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  y already have a
2f190 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
2f1a0 64 2e 20 4d 6f 76 65 0a 20 20 2a 2a 20 74 68 65  d. Move.  ** the
2f1b0 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
2f1c0 73 20 74 6f 20 73 43 6f 6e 74 65 78 74 2e 73 20  s to sContext.s 
2f1d0 73 6f 20 69 6e 20 63 61 73 65 20 74 68 65 20 75  so in case the u
2f1e0 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 0a 20 20  ser-function .  
2f1f0 2a 2a 20 63 61 6e 20 75 73 65 20 74 68 65 20 61  ** can use the a
2f200 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64  lready allocated
2f210 20 62 75 66 66 65 72 20 69 6e 73 74 65 61 64 20   buffer instead 
2f220 6f 66 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  of allocating a 
2f230 0a 20 20 2a 2a 20 6e 65 77 20 6f 6e 65 2e 0a 20  .  ** new one.. 
2f240 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
2f250 65 4d 65 6d 4d 6f 76 65 28 26 73 43 6f 6e 74 65  eMemMove(&sConte
2f260 78 74 2e 73 2c 20 70 44 65 73 74 29 3b 0a 20 20  xt.s, pDest);.  
2f270 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 26  MemSetTypeFlag(&
2f280 73 43 6f 6e 74 65 78 74 2e 73 2c 20 4d 45 4d 5f  sContext.s, MEM_
2f290 4e 75 6c 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 70  Null);..  rc = p
2f2a0 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d 6e 28  Module->xColumn(
2f2b0 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f  pCur->pVtabCurso
2f2c0 72 2c 20 26 73 43 6f 6e 74 65 78 74 2c 20 70 4f  r, &sContext, pO
2f2d0 70 2d 3e 70 32 29 3b 0a 20 20 69 6d 70 6f 72 74  p->p2);.  import
2f2e0 56 74 61 62 45 72 72 4d 73 67 28 70 2c 20 70 56  VtabErrMsg(p, pV
2f2f0 74 61 62 29 3b 0a 20 20 69 66 28 20 73 43 6f 6e  tab);.  if( sCon
2f300 74 65 78 74 2e 69 73 45 72 72 6f 72 20 29 7b 0a  text.isError ){.
2f310 20 20 20 20 72 63 20 3d 20 73 43 6f 6e 74 65 78      rc = sContex
2f320 74 2e 69 73 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a  t.isError;.  }..
2f330 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 65    /* Copy the re
2f340 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63  sult of the func
2f350 74 69 6f 6e 20 74 6f 20 74 68 65 20 50 33 20 72  tion to the P3 r
2f360 65 67 69 73 74 65 72 2e 20 57 65 0a 20 20 2a 2a  egister. We.  **
2f370 20 64 6f 20 74 68 69 73 20 72 65 67 61 72 64 6c   do this regardl
2f380 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
2f390 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 6f  r not an error o
2f3a0 63 63 75 72 72 65 64 20 74 6f 20 65 6e 73 75 72  ccurred to ensur
2f3b0 65 20 61 6e 79 0a 20 20 2a 2a 20 64 79 6e 61 6d  e any.  ** dynam
2f3c0 69 63 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 6e  ic allocation in
2f3d0 20 73 43 6f 6e 74 65 78 74 2e 73 20 28 61 20 4d   sContext.s (a M
2f3e0 65 6d 20 73 74 72 75 63 74 29 20 69 73 20 20 72  em struct) is  r
2f3f0 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
2f400 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2f410 65 45 6e 63 6f 64 69 6e 67 28 26 73 43 6f 6e 74  eEncoding(&sCont
2f420 65 78 74 2e 73 2c 20 65 6e 63 6f 64 69 6e 67 29  ext.s, encoding)
2f430 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
2f440 65 6d 4d 6f 76 65 28 70 44 65 73 74 2c 20 26 73  emMove(pDest, &s
2f450 43 6f 6e 74 65 78 74 2e 73 29 3b 0a 20 20 52 45  Context.s);.  RE
2f460 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
2f470 2d 3e 70 33 2c 20 70 44 65 73 74 29 3b 0a 20 20  ->p3, pDest);.  
2f480 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
2f490 49 5a 45 28 70 44 65 73 74 29 3b 0a 0a 20 20 69  IZE(pDest);..  i
2f4a0 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
2f4b0 6d 54 6f 6f 42 69 67 28 70 44 65 73 74 29 20 29  mTooBig(pDest) )
2f4c0 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62  {.    goto too_b
2f4d0 69 67 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  ig;.  }.  break;
2f4e0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2f4f0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2f500 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  TABLE */..#ifnde
2f510 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2f520 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70  RTUALTABLE./* Op
2f530 63 6f 64 65 3a 20 56 4e 65 78 74 20 50 31 20 50  code: VNext P1 P
2f540 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 64  2 * * *.**.** Ad
2f550 76 61 6e 63 65 20 76 69 72 74 75 61 6c 20 74 61  vance virtual ta
2f560 62 6c 65 20 50 31 20 74 6f 20 74 68 65 20 6e 65  ble P1 to the ne
2f570 78 74 20 72 6f 77 20 69 6e 20 69 74 73 20 72 65  xt row in its re
2f580 73 75 6c 74 20 73 65 74 20 61 6e 64 0a 2a 2a 20  sult set and.** 
2f590 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74  jump to instruct
2f5a0 69 6f 6e 20 50 32 2e 20 20 4f 72 2c 20 69 66 20  ion P2.  Or, if 
2f5b0 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
2f5c0 65 20 68 61 73 20 72 65 61 63 68 65 64 0a 2a 2a  e has reached.**
2f5d0 20 74 68 65 20 65 6e 64 20 6f 66 20 69 74 73 20   the end of its 
2f5e0 72 65 73 75 6c 74 20 73 65 74 2c 20 74 68 65 6e  result set, then
2f5f0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
2f600 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2f610 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ction..*/.case O
2f620 50 5f 56 4e 65 78 74 3a 20 7b 20 20 20 2f 2a 20  P_VNext: {   /* 
2f630 6a 75 6d 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  jump */.  sqlite
2f640 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20  3_vtab *pVtab;. 
2f650 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
2f660 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a  odule *pModule;.
2f670 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 56 64 62    int res;.  Vdb
2f680 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a  eCursor *pCur;..
2f690 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 70 43 75    res = 0;.  pCu
2f6a0 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  r = p->apCsr[pOp
2f6b0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2f6c0 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73   pCur->pVtabCurs
2f6d0 6f 72 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  or );.  if( pCur
2f6e0 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20  ->nullRow ){.   
2f6f0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 56   break;.  }.  pV
2f700 74 61 62 20 3d 20 70 43 75 72 2d 3e 70 56 74 61  tab = pCur->pVta
2f710 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a  bCursor->pVtab;.
2f720 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61    pModule = pVta
2f730 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 61 73  b->pModule;.  as
2f740 73 65 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78  sert( pModule->x
2f750 4e 65 78 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e  Next );..  /* In
2f760 76 6f 6b 65 20 74 68 65 20 78 4e 65 78 74 28 29  voke the xNext()
2f770 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 6d   method of the m
2f780 6f 64 75 6c 65 2e 20 54 68 65 72 65 20 69 73 20  odule. There is 
2f790 6e 6f 20 77 61 79 20 66 6f 72 20 74 68 65 0a 20  no way for the. 
2f7a0 20 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 69   ** underlying i
2f7b0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 6f  mplementation to
2f7c0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
2f7d0 20 69 66 20 6f 6e 65 20 6f 63 63 75 72 73 20 64   if one occurs d
2f7e0 75 72 69 6e 67 0a 20 20 2a 2a 20 78 4e 65 78 74  uring.  ** xNext
2f7f0 28 29 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20  (). Instead, if 
2f800 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2f810 20 74 72 75 65 20 69 73 20 72 65 74 75 72 6e 65   true is returne
2f820 64 20 28 69 6e 64 69 63 61 74 69 6e 67 20 74 68  d (indicating th
2f830 61 74 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 73  at .  ** data is
2f840 20 61 76 61 69 6c 61 62 6c 65 29 20 61 6e 64 20   available) and 
2f850 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 72  the error code r
2f860 65 74 75 72 6e 65 64 20 77 68 65 6e 20 78 43 6f  eturned when xCo
2f870 6c 75 6d 6e 20 6f 72 0a 20 20 2a 2a 20 73 6f 6d  lumn or.  ** som
2f880 65 20 6f 74 68 65 72 20 6d 65 74 68 6f 64 20 69  e other method i
2f890 73 20 6e 65 78 74 20 69 6e 76 6f 6b 65 64 20 6f  s next invoked o
2f8a0 6e 20 74 68 65 20 73 61 76 65 20 76 69 72 74 75  n the save virtu
2f8b0 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e  al table cursor.
2f8c0 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e 56 74 61  .  */.  p->inVta
2f8d0 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 72  bMethod = 1;.  r
2f8e0 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65  c = pModule->xNe
2f8f0 78 74 28 70 43 75 72 2d 3e 70 56 74 61 62 43 75  xt(pCur->pVtabCu
2f900 72 73 6f 72 29 3b 0a 20 20 70 2d 3e 69 6e 56 74  rsor);.  p->inVt
2f910 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20  abMethod = 0;.  
2f920 69 6d 70 6f 72 74 56 74 61 62 45 72 72 4d 73 67  importVtabErrMsg
2f930 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20 69 66  (p, pVtab);.  if
2f940 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f950 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 4d 6f  ){.    res = pMo
2f960 64 75 6c 65 2d 3e 78 45 6f 66 28 70 43 75 72 2d  dule->xEof(pCur-
2f970 3e 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20  >pVtabCursor);. 
2f980 20 7d 0a 0a 20 20 69 66 28 20 21 72 65 73 20 29   }..  if( !res )
2f990 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
2f9a0 65 20 69 73 20 64 61 74 61 2c 20 6a 75 6d 70 20  e is data, jump 
2f9b0 74 6f 20 50 32 20 2a 2f 0a 20 20 20 20 70 63 20  to P2 */.    pc 
2f9c0 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
2f9d0 20 7d 0a 20 20 67 6f 74 6f 20 63 68 65 63 6b 5f   }.  goto check_
2f9e0 66 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 7d  for_interrupt;.}
2f9f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2fa00 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2fa10 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  BLE */..#ifndef 
2fa20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2fa30 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f  UALTABLE./* Opco
2fa40 64 65 3a 20 56 52 65 6e 61 6d 65 20 50 31 20 2a  de: VRename P1 *
2fa50 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34   * P4 *.**.** P4
2fa60 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2fa70 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
2fa80 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c 69   object, an sqli
2fa90 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75  te3_vtab structu
2faa0 72 65 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  re..** This opco
2fab0 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63  de invokes the c
2fac0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 78 52 65  orresponding xRe
2fad0 6e 61 6d 65 20 6d 65 74 68 6f 64 2e 20 54 68 65  name method. The
2fae0 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 72 65 67   value.** in reg
2faf0 69 73 74 65 72 20 50 31 20 69 73 20 70 61 73 73  ister P1 is pass
2fb00 65 64 20 61 73 20 74 68 65 20 7a 4e 61 6d 65 20  ed as the zName 
2fb10 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
2fb20 78 52 65 6e 61 6d 65 20 6d 65 74 68 6f 64 2e 0a  xRename method..
2fb30 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 52 65 6e 61  */.case OP_VRena
2fb40 6d 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  me: {.  sqlite3_
2fb50 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 4d  vtab *pVtab;.  M
2fb60 65 6d 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 70 56  em *pName;..  pV
2fb70 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56  tab = pOp->p4.pV
2fb80 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4e  tab->pVtab;.  pN
2fb90 61 6d 65 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  ame = &aMem[pOp-
2fba0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
2fbb0 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e  pVtab->pModule->
2fbc0 78 52 65 6e 61 6d 65 20 29 3b 0a 20 20 61 73 73  xRename );.  ass
2fbd0 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
2fbe0 70 4e 61 6d 65 29 20 29 3b 0a 20 20 61 73 73 65  pName) );.  asse
2fbf0 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  rt( p->readOnly=
2fc00 3d 30 20 29 3b 0a 20 20 52 45 47 49 53 54 45 52  =0 );.  REGISTER
2fc10 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20  _TRACE(pOp->p1, 
2fc20 70 4e 61 6d 65 29 3b 0a 20 20 61 73 73 65 72 74  pName);.  assert
2fc30 28 20 70 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 26  ( pName->flags &
2fc40 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 74 65   MEM_Str );.  te
2fc50 73 74 63 61 73 65 28 20 70 4e 61 6d 65 2d 3e 65  stcase( pName->e
2fc60 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
2fc70 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2fc80 4e 61 6d 65 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Name->enc==SQLIT
2fc90 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20 74  E_UTF16BE );.  t
2fca0 65 73 74 63 61 73 65 28 20 70 4e 61 6d 65 2d 3e  estcase( pName->
2fcb0 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
2fcc0 36 4c 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  6LE );.  rc = sq
2fcd0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45  lite3VdbeChangeE
2fce0 6e 63 6f 64 69 6e 67 28 70 4e 61 6d 65 2c 20 53  ncoding(pName, S
2fcf0 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69  QLITE_UTF8);.  i
2fd00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2fd10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 56 74   ){.    rc = pVt
2fd20 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 52 65  ab->pModule->xRe
2fd30 6e 61 6d 65 28 70 56 74 61 62 2c 20 70 4e 61 6d  name(pVtab, pNam
2fd40 65 2d 3e 7a 29 3b 0a 20 20 20 20 69 6d 70 6f 72  e->z);.    impor
2fd50 74 56 74 61 62 45 72 72 4d 73 67 28 70 2c 20 70  tVtabErrMsg(p, p
2fd60 56 74 61 62 29 3b 0a 20 20 20 20 70 2d 3e 65 78  Vtab);.    p->ex
2fd70 70 69 72 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  pired = 0;.  }. 
2fd80 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
2fd90 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2fda0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2fdb0 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 55  LE./* Opcode: VU
2fdc0 70 64 61 74 65 20 50 31 20 50 32 20 50 33 20 50  pdate P1 P2 P3 P
2fdd0 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20  4 *.**.** P4 is 
2fde0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 76  a pointer to a v
2fdf0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a  irtual table obj
2fe00 65 63 74 2c 20 61 6e 20 73 71 6c 69 74 65 33 5f  ect, an sqlite3_
2fe10 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e 0a  vtab structure..
2fe20 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69  ** This opcode i
2fe30 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 72 72 65  nvokes the corre
2fe40 73 70 6f 6e 64 69 6e 67 20 78 55 70 64 61 74 65  sponding xUpdate
2fe50 20 6d 65 74 68 6f 64 2e 20 50 32 20 76 61 6c 75   method. P2 valu
2fe60 65 73 0a 2a 2a 20 61 72 65 20 63 6f 6e 74 69 67  es.** are contig
2fe70 75 6f 75 73 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  uous memory cell
2fe80 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 50 33  s starting at P3
2fe90 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20   to pass to the 
2fea0 78 55 70 64 61 74 65 20 0a 2a 2a 20 69 6e 76 6f  xUpdate .** invo
2feb0 63 61 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75  cation. The valu
2fec0 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 28 50  e in register (P
2fed0 33 2b 50 32 2d 31 29 20 63 6f 72 72 65 73 70 6f  3+P2-1) correspo
2fee0 6e 64 73 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70  nds to the .** p
2fef0 32 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  2th element of t
2ff00 68 65 20 61 72 67 76 20 61 72 72 61 79 20 70 61  he argv array pa
2ff10 73 73 65 64 20 74 6f 20 78 55 70 64 61 74 65 2e  ssed to xUpdate.
2ff20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 55 70 64 61  .**.** The xUpda
2ff30 74 65 20 6d 65 74 68 6f 64 20 77 69 6c 6c 20 64  te method will d
2ff40 6f 20 61 20 44 45 4c 45 54 45 20 6f 72 20 61 6e  o a DELETE or an
2ff50 20 49 4e 53 45 52 54 20 6f 72 20 62 6f 74 68 2e   INSERT or both.
2ff60 0a 2a 2a 20 54 68 65 20 61 72 67 76 5b 30 5d 20  .** The argv[0] 
2ff70 65 6c 65 6d 65 6e 74 20 28 77 68 69 63 68 20 63  element (which c
2ff80 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 6d 65  orresponds to me
2ff90 6d 6f 72 79 20 63 65 6c 6c 20 50 33 29 0a 2a 2a  mory cell P3).**
2ffa0 20 69 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66   is the rowid of
2ffb0 20 61 20 72 6f 77 20 74 6f 20 64 65 6c 65 74 65   a row to delete
2ffc0 2e 20 20 49 66 20 61 72 67 76 5b 30 5d 20 69 73  .  If argv[0] is
2ffd0 20 4e 55 4c 4c 20 74 68 65 6e 20 6e 6f 20 0a 2a   NULL then no .*
2ffe0 2a 20 64 65 6c 65 74 69 6f 6e 20 6f 63 63 75 72  * deletion occur
2fff0 73 2e 20 20 54 68 65 20 61 72 67 76 5b 31 5d 20  s.  The argv[1] 
30000 65 6c 65 6d 65 6e 74 20 69 73 20 74 68 65 20 72  element is the r
30010 6f 77 69 64 20 6f 66 20 74 68 65 20 6e 65 77 20  owid of the new 
30020 0a 2a 2a 20 72 6f 77 2e 20 20 54 68 69 73 20 63  .** row.  This c
30030 61 6e 20 62 65 20 4e 55 4c 4c 20 74 6f 20 68 61  an be NULL to ha
30040 76 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  ve the virtual t
30050 61 62 6c 65 20 73 65 6c 65 63 74 20 74 68 65 20  able select the 
30060 6e 65 77 20 0a 2a 2a 20 72 6f 77 69 64 20 66 6f  new .** rowid fo
30070 72 20 69 74 73 65 6c 66 2e 20 20 54 68 65 20 73  r itself.  The s
30080 75 62 73 65 71 75 65 6e 74 20 65 6c 65 6d 65 6e  ubsequent elemen
30090 74 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ts in the array 
300a0 61 72 65 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75  are .** the valu
300b0 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  es of columns in
300c0 20 74 68 65 20 6e 65 77 20 72 6f 77 2e 0a 2a 2a   the new row..**
300d0 0a 2a 2a 20 49 66 20 50 32 3d 3d 31 20 74 68 65  .** If P2==1 the
300e0 6e 20 6e 6f 20 69 6e 73 65 72 74 20 69 73 20 70  n no insert is p
300f0 65 72 66 6f 72 6d 65 64 2e 20 20 61 72 67 76 5b  erformed.  argv[
30100 30 5d 20 69 73 20 74 68 65 20 72 6f 77 69 64 20  0] is the rowid 
30110 6f 66 0a 2a 2a 20 61 20 72 6f 77 20 74 6f 20 64  of.** a row to d
30120 65 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 50 31 20  elete..**.** P1 
30130 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20 66 6c 61  is a boolean fla
30140 67 2e 20 49 66 20 69 74 20 69 73 20 73 65 74 20  g. If it is set 
30150 74 6f 20 74 72 75 65 20 61 6e 64 20 74 68 65 20  to true and the 
30160 78 55 70 64 61 74 65 20 63 61 6c 6c 0a 2a 2a 20  xUpdate call.** 
30170 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  is successful, t
30180 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
30190 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
301a0 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
301b0 77 69 64 28 29 20 0a 2a 2a 20 69 73 20 73 65 74  wid() .** is set
301c0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66   to the value of
301d0 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   the rowid for t
301e0 68 65 20 72 6f 77 20 6a 75 73 74 20 69 6e 73 65  he row just inse
301f0 72 74 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  rted..*/.case OP
30200 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 73 71  _VUpdate: {.  sq
30210 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
30220 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 6f 64  b;.  sqlite3_mod
30230 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20  ule *pModule;.  
30240 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20  int nArg;.  int 
30250 69 3b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  i;.  sqlite_int6
30260 34 20 72 6f 77 69 64 3b 0a 20 20 4d 65 6d 20 2a  4 rowid;.  Mem *
30270 2a 61 70 41 72 67 3b 0a 20 20 4d 65 6d 20 2a 70  *apArg;.  Mem *p
30280 58 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  X;..  assert( pO
30290 70 2d 3e 70 32 3d 3d 31 20 20 20 20 20 20 20 20  p->p2==1        
302a0 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 46  || pOp->p5==OE_F
302b0 61 69 6c 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 35  ail   || pOp->p5
302c0 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20  ==OE_Rollback . 
302d0 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 35        || pOp->p5
302e0 3d 3d 4f 45 5f 41 62 6f 72 74 20 7c 7c 20 70 4f  ==OE_Abort || pO
302f0 70 2d 3e 70 35 3d 3d 4f 45 5f 49 67 6e 6f 72 65  p->p5==OE_Ignore
30300 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f   || pOp->p5==OE_
30310 52 65 70 6c 61 63 65 0a 20 20 29 3b 0a 20 20 61  Replace.  );.  a
30320 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e  ssert( p->readOn
30330 6c 79 3d 3d 30 20 29 3b 0a 20 20 70 56 74 61 62  ly==0 );.  pVtab
30340 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62   = pOp->p4.pVtab
30350 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64 75  ->pVtab;.  pModu
30360 6c 65 20 3d 20 28 73 71 6c 69 74 65 33 5f 6d 6f  le = (sqlite3_mo
30370 64 75 6c 65 20 2a 29 70 56 74 61 62 2d 3e 70 4d  dule *)pVtab->pM
30380 6f 64 75 6c 65 3b 0a 20 20 6e 41 72 67 20 3d 20  odule;.  nArg = 
30390 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72  pOp->p2;.  asser
303a0 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
303b0 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 69 66 28  P4_VTAB );.  if(
303c0 20 41 4c 57 41 59 53 28 70 4d 6f 64 75 6c 65 2d   ALWAYS(pModule-
303d0 3e 78 55 70 64 61 74 65 29 20 29 7b 0a 20 20 20  >xUpdate) ){.   
303e0 20 75 38 20 76 74 61 62 4f 6e 43 6f 6e 66 6c 69   u8 vtabOnConfli
303f0 63 74 20 3d 20 64 62 2d 3e 76 74 61 62 4f 6e 43  ct = db->vtabOnC
30400 6f 6e 66 6c 69 63 74 3b 0a 20 20 20 20 61 70 41  onflict;.    apA
30410 72 67 20 3d 20 70 2d 3e 61 70 41 72 67 3b 0a 20  rg = p->apArg;. 
30420 20 20 20 70 58 20 3d 20 26 61 4d 65 6d 5b 70 4f     pX = &aMem[pO
30430 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 66 6f 72 28  p->p3];.    for(
30440 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
30450 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
30460 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 58 29 20   memIsValid(pX) 
30470 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62 6f 75  );.      memAbou
30480 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 58 29  tToChange(p, pX)
30490 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
304a0 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28  dbeMemStoreType(
304b0 70 58 29 3b 0a 20 20 20 20 20 20 61 70 41 72 67  pX);.      apArg
304c0 5b 69 5d 20 3d 20 70 58 3b 0a 20 20 20 20 20 20  [i] = pX;.      
304d0 70 58 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pX++;.    }.    
304e0 64 62 2d 3e 76 74 61 62 4f 6e 43 6f 6e 66 6c 69  db->vtabOnConfli
304f0 63 74 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20  ct = pOp->p5;.  
30500 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e    rc = pModule->
30510 78 55 70 64 61 74 65 28 70 56 74 61 62 2c 20 6e  xUpdate(pVtab, n
30520 41 72 67 2c 20 61 70 41 72 67 2c 20 26 72 6f 77  Arg, apArg, &row
30530 69 64 29 3b 0a 20 20 20 20 64 62 2d 3e 76 74 61  id);.    db->vta
30540 62 4f 6e 43 6f 6e 66 6c 69 63 74 20 3d 20 76 74  bOnConflict = vt
30550 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 3b 0a 20 20  abOnConflict;.  
30560 20 20 69 6d 70 6f 72 74 56 74 61 62 45 72 72 4d    importVtabErrM
30570 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20  sg(p, pVtab);.  
30580 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30590 5f 4f 4b 20 26 26 20 70 4f 70 2d 3e 70 31 20 29  _OK && pOp->p1 )
305a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
305b0 6e 41 72 67 3e 31 20 26 26 20 61 70 41 72 67 5b  nArg>1 && apArg[
305c0 30 5d 20 26 26 20 28 61 70 41 72 67 5b 30 5d 2d  0] && (apArg[0]-
305d0 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 29  >flags&MEM_Null)
305e0 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 61   );.      db->la
305f0 73 74 52 6f 77 69 64 20 3d 20 6c 61 73 74 52 6f  stRowid = lastRo
30600 77 69 64 20 3d 20 72 6f 77 69 64 3b 0a 20 20 20  wid = rowid;.   
30610 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 26 30   }.    if( (rc&0
30620 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
30630 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e  STRAINT && pOp->
30640 70 34 2e 70 56 74 61 62 2d 3e 62 43 6f 6e 73 74  p4.pVtab->bConst
30650 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 69  raint ){.      i
30660 66 28 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 49  f( pOp->p5==OE_I
30670 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20  gnore ){.       
30680 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
30690 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
306a0 20 20 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63        p->errorAc
306b0 74 69 6f 6e 20 3d 20 28 28 70 4f 70 2d 3e 70 35  tion = ((pOp->p5
306c0 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 20 3f 20  ==OE_Replace) ? 
306d0 4f 45 5f 41 62 6f 72 74 20 3a 20 70 4f 70 2d 3e  OE_Abort : pOp->
306e0 70 35 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p5);.      }.   
306f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
30700 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 20 20  >nChange++;.    
30710 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  }.  }.  break;.}
30720 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
30730 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
30740 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  BLE */..#ifndef 
30750 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
30760 45 52 5f 50 52 41 47 4d 41 53 0a 2f 2a 20 4f 70  ER_PRAGMAS./* Op
30770 63 6f 64 65 3a 20 50 61 67 65 63 6f 75 6e 74 20  code: Pagecount 
30780 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
30790 2a 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72  * Write the curr
307a0 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ent number of pa
307b0 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
307c0 50 31 20 74 6f 20 6d 65 6d 6f 72 79 20 63 65 6c  P1 to memory cel
307d0 6c 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  l P2..*/.case OP
307e0 5f 50 61 67 65 63 6f 75 6e 74 3a 20 7b 20 20 20  _Pagecount: {   
307f0 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
30800 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20  -prerelease */. 
30810 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 73 71 6c   pOut->u.i = sql
30820 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67  ite3BtreeLastPag
30830 65 28 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70  e(db->aDb[pOp->p
30840 31 5d 2e 70 42 74 29 3b 0a 20 20 62 72 65 61 6b  1].pBt);.  break
30850 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
30860 6e 64 65 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49  ndef  SQLITE_OMI
30870 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
30880 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 61 78 50 67  /* Opcode: MaxPg
30890 63 6e 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a  cnt P1 P2 P3 * *
308a0 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 73 65  .**.** Try to se
308b0 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
308c0 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 64 61 74  ge count for dat
308d0 61 62 61 73 65 20 50 31 20 74 6f 20 74 68 65 20  abase P1 to the 
308e0 76 61 6c 75 65 20 69 6e 20 50 33 2e 0a 2a 2a 20  value in P3..** 
308f0 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6d  Do not let the m
30900 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
30910 74 20 66 61 6c 6c 20 62 65 6c 6f 77 20 74 68 65  t fall below the
30920 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
30930 75 6e 74 20 61 6e 64 0a 2a 2a 20 64 6f 20 6e 6f  unt and.** do no
30940 74 20 63 68 61 6e 67 65 20 74 68 65 20 6d 61 78  t change the max
30950 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
30960 76 61 6c 75 65 20 69 66 20 50 33 3d 3d 30 2e 0a  value if P3==0..
30970 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20  **.** Store the 
30980 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
30990 6e 74 20 61 66 74 65 72 20 74 68 65 20 63 68 61  nt after the cha
309a0 6e 67 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  nge in register 
309b0 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d  P2..*/.case OP_M
309c0 61 78 50 67 63 6e 74 3a 20 7b 20 20 20 20 20 20  axPgcnt: {      
309d0 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72        /* out2-pr
309e0 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 75 6e  erelease */.  un
309f0 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 4d 61  signed int newMa
30a00 78 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  x;.  Btree *pBt;
30a10 0a 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44  ..  pBt = db->aD
30a20 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a  b[pOp->p1].pBt;.
30a30 20 20 6e 65 77 4d 61 78 20 3d 20 30 3b 0a 20 20    newMax = 0;.  
30a40 69 66 28 20 70 4f 70 2d 3e 70 33 20 29 7b 0a 20  if( pOp->p3 ){. 
30a50 20 20 20 6e 65 77 4d 61 78 20 3d 20 73 71 6c 69     newMax = sqli
30a60 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65  te3BtreeLastPage
30a70 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  (pBt);.    if( n
30a80 65 77 4d 61 78 20 3c 20 28 75 6e 73 69 67 6e 65  ewMax < (unsigne
30a90 64 29 70 4f 70 2d 3e 70 33 20 29 20 6e 65 77 4d  d)pOp->p3 ) newM
30aa0 61 78 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 70  ax = (unsigned)p
30ab0 4f 70 2d 3e 70 33 3b 0a 20 20 7d 0a 20 20 70 4f  Op->p3;.  }.  pO
30ac0 75 74 2d 3e 75 2e 69 20 3d 20 73 71 6c 69 74 65  ut->u.i = sqlite
30ad0 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75  3BtreeMaxPageCou
30ae0 6e 74 28 70 42 74 2c 20 6e 65 77 4d 61 78 29 3b  nt(pBt, newMax);
30af0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
30b00 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  if...#ifndef SQL
30b10 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f  ITE_OMIT_TRACE./
30b20 2a 20 4f 70 63 6f 64 65 3a 20 54 72 61 63 65 20  * Opcode: Trace 
30b30 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  * * * P4 *.**.**
30b40 20 49 66 20 74 72 61 63 69 6e 67 20 69 73 20 65   If tracing is e
30b50 6e 61 62 6c 65 64 20 28 62 79 20 74 68 65 20 73  nabled (by the s
30b60 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29 29 20  qlite3_trace()) 
30b70 69 6e 74 65 72 66 61 63 65 2c 20 74 68 65 6e 0a  interface, then.
30b80 2a 2a 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  ** the UTF-8 str
30b90 69 6e 67 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ing contained in
30ba0 20 50 34 20 69 73 20 65 6d 69 74 74 65 64 20 6f   P4 is emitted o
30bb0 6e 20 74 68 65 20 74 72 61 63 65 20 63 61 6c 6c  n the trace call
30bc0 62 61 63 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  back..*/.case OP
30bd0 5f 54 72 61 63 65 3a 20 7b 0a 20 20 63 68 61 72  _Trace: {.  char
30be0 20 2a 7a 54 72 61 63 65 3b 0a 20 20 63 68 61 72   *zTrace;.  char
30bf0 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e   *z;..  if( db->
30c00 78 54 72 61 63 65 0a 20 20 20 26 26 20 21 70 2d  xTrace.   && !p-
30c10 3e 64 6f 69 6e 67 52 65 72 75 6e 0a 20 20 20 26  >doingRerun.   &
30c20 26 20 28 7a 54 72 61 63 65 20 3d 20 28 70 4f 70  & (zTrace = (pOp
30c30 2d 3e 70 34 2e 7a 20 3f 20 70 4f 70 2d 3e 70 34  ->p4.z ? pOp->p4
30c40 2e 7a 20 3a 20 70 2d 3e 7a 53 71 6c 29 29 21 3d  .z : p->zSql))!=
30c50 30 0a 20 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73  0.  ){.    z = s
30c60 71 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64  qlite3VdbeExpand
30c70 53 71 6c 28 70 2c 20 7a 54 72 61 63 65 29 3b 0a  Sql(p, zTrace);.
30c80 20 20 20 20 64 62 2d 3e 78 54 72 61 63 65 28 64      db->xTrace(d
30c90 62 2d 3e 70 54 72 61 63 65 41 72 67 2c 20 7a 29  b->pTraceArg, z)
30ca0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
30cb0 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 7d 0a  ree(db, z);.  }.
30cc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
30cd0 42 55 47 0a 20 20 69 66 28 20 28 64 62 2d 3e 66  BUG.  if( (db->f
30ce0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 71  lags & SQLITE_Sq
30cf0 6c 54 72 61 63 65 29 21 3d 30 0a 20 20 20 26 26  lTrace)!=0.   &&
30d00 20 28 7a 54 72 61 63 65 20 3d 20 28 70 4f 70 2d   (zTrace = (pOp-
30d10 3e 70 34 2e 7a 20 3f 20 70 4f 70 2d 3e 70 34 2e  >p4.z ? pOp->p4.
30d20 7a 20 3a 20 70 2d 3e 7a 53 71 6c 29 29 21 3d 30  z : p->zSql))!=0
30d30 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
30d40 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 51  3DebugPrintf("SQ
30d50 4c 2d 74 72 61 63 65 3a 20 25 73 5c 6e 22 2c 20  L-trace: %s\n", 
30d60 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a 23 65 6e  zTrace);.  }.#en
30d70 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
30d80 42 55 47 20 2a 2f 0a 20 20 62 72 65 61 6b 3b 0a  BUG */.  break;.
30d90 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 4f 70  }.#endif.../* Op
30da0 63 6f 64 65 3a 20 4e 6f 6f 70 20 2a 20 2a 20 2a  code: Noop * * *
30db0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f   * *.**.** Do no
30dc0 74 68 69 6e 67 2e 20 20 54 68 69 73 20 69 6e 73  thing.  This ins
30dd0 74 72 75 63 74 69 6f 6e 20 69 73 20 6f 66 74 65  truction is ofte
30de0 6e 20 75 73 65 66 75 6c 20 61 73 20 61 20 6a 75  n useful as a ju
30df0 6d 70 0a 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f  mp.** destinatio
30e00 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  n..*/./*.** The 
30e10 6d 61 67 69 63 20 45 78 70 6c 61 69 6e 20 6f 70  magic Explain op
30e20 63 6f 64 65 20 61 72 65 20 6f 6e 6c 79 20 69 6e  code are only in
30e30 73 65 72 74 65 64 20 77 68 65 6e 20 65 78 70 6c  serted when expl
30e40 61 69 6e 3d 3d 32 20 28 77 68 69 63 68 0a 2a 2a  ain==2 (which.**
30e50 20 69 73 20 74 6f 20 73 61 79 20 77 68 65 6e 20   is to say when 
30e60 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52  the EXPLAIN QUER
30e70 59 20 50 4c 41 4e 20 73 79 6e 74 61 78 20 69 73  Y PLAN syntax is
30e80 20 75 73 65 64 2e 29 0a 2a 2a 20 54 68 69 73 20   used.).** This 
30e90 6f 70 63 6f 64 65 20 72 65 63 6f 72 64 73 20 69  opcode records i
30ea0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
30eb0 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
30ec0 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 74 68 65  It is the.** the
30ed0 20 73 61 6d 65 20 61 73 20 61 20 6e 6f 2d 6f 70   same as a no-op
30ee0 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65 73 6e  .  This opcodesn
30ef0 65 76 65 72 20 61 70 70 65 61 72 73 20 69 6e 20  ever appears in 
30f00 61 20 72 65 61 6c 20 56 4d 20 70 72 6f 67 72 61  a real VM progra
30f10 6d 2e 0a 2a 2f 0a 64 65 66 61 75 6c 74 3a 20 7b  m..*/.default: {
30f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
30f30 73 20 69 73 20 72 65 61 6c 6c 79 20 4f 50 5f 4e  s is really OP_N
30f40 6f 6f 70 20 61 6e 64 20 4f 50 5f 45 78 70 6c 61  oop and OP_Expla
30f50 69 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  in */.  assert( 
30f60 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
30f70 4e 6f 6f 70 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63  Noop || pOp->opc
30f80 6f 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69 6e 20  ode==OP_Explain 
30f90 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
30fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
30ff0 20 54 68 65 20 63 61 73 65 73 20 6f 66 20 74 68   The cases of th
31000 65 20 73 77 69 74 63 68 20 73 74 61 74 65 6d 65  e switch stateme
31010 6e 74 20 61 62 6f 76 65 20 74 68 69 73 20 6c 69  nt above this li
31020 6e 65 20 73 68 6f 75 6c 64 20 61 6c 6c 20 62 65  ne should all be
31030 20 69 6e 64 65 6e 74 65 64 0a 2a 2a 20 62 79 20   indented.** by 
31040 36 20 73 70 61 63 65 73 2e 20 20 42 75 74 20 74  6 spaces.  But t
31050 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 36 20 73  he left-most 6 s
31060 70 61 63 65 73 20 68 61 76 65 20 62 65 65 6e 20  paces have been 
31070 72 65 6d 6f 76 65 64 20 74 6f 20 69 6d 70 72 6f  removed to impro
31080 76 65 20 74 68 65 0a 2a 2a 20 72 65 61 64 61 62  ve the.** readab
31090 69 6c 69 74 79 2e 20 20 46 72 6f 6d 20 74 68 69  ility.  From thi
310a0 73 20 70 6f 69 6e 74 20 6f 6e 20 64 6f 77 6e 2c  s point on down,
310b0 20 74 68 65 20 6e 6f 72 6d 61 6c 20 69 6e 64 65   the normal inde
310c0 6e 74 61 74 69 6f 6e 20 72 75 6c 65 73 20 61 72  ntation rules ar
310d0 65 0a 2a 2a 20 72 65 73 74 6f 72 65 64 2e 0a 2a  e.** restored..*
310e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
310f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 20 20  ************/.  
31130 20 20 7d 0a 0a 23 69 66 64 65 66 20 56 44 42 45    }..#ifdef VDBE
31140 5f 50 52 4f 46 49 4c 45 0a 20 20 20 20 7b 0a 20  _PROFILE.    {. 
31150 20 20 20 20 20 75 36 34 20 65 6c 61 70 73 65 64       u64 elapsed
31160 20 3d 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65   = sqlite3Hwtime
31170 28 29 20 2d 20 73 74 61 72 74 3b 0a 20 20 20 20  () - start;.    
31180 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 2b 3d    pOp->cycles +=
31190 20 65 6c 61 70 73 65 64 3b 0a 20 20 20 20 20 20   elapsed;.      
311a0 70 4f 70 2d 3e 63 6e 74 2b 2b 3b 0a 23 69 66 20  pOp->cnt++;.#if 
311b0 30 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  0.        fprint
311c0 66 28 73 74 64 6f 75 74 2c 20 22 25 31 30 6c 6c  f(stdout, "%10ll
311d0 75 20 22 2c 20 65 6c 61 70 73 65 64 29 3b 0a 20  u ", elapsed);. 
311e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
311f0 62 65 50 72 69 6e 74 4f 70 28 73 74 64 6f 75 74  bePrintOp(stdout
31200 2c 20 6f 72 69 67 50 63 2c 20 26 61 4f 70 5b 6f  , origPc, &aOp[o
31210 72 69 67 50 63 5d 29 3b 0a 23 65 6e 64 69 66 0a  rigPc]);.#endif.
31220 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
31230 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
31240 6e 67 20 63 6f 64 65 20 61 64 64 73 20 6e 6f 74  ng code adds not
31250 68 69 6e 67 20 74 6f 20 74 68 65 20 61 63 74 75  hing to the actu
31260 61 6c 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  al functionality
31270 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
31280 72 6f 67 72 61 6d 2e 20 20 49 74 20 69 73 20 6f  rogram.  It is o
31290 6e 6c 79 20 68 65 72 65 20 66 6f 72 20 74 65 73  nly here for tes
312a0 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
312b0 6e 67 2e 0a 20 20 20 20 2a 2a 20 4f 6e 20 74 68  ng..    ** On th
312c0 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 74  e other hand, it
312d0 20 64 6f 65 73 20 62 75 72 6e 20 43 50 55 20 63   does burn CPU c
312e0 79 63 6c 65 73 20 65 76 65 72 79 20 74 69 6d 65  ycles every time
312f0 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20   through.    ** 
31300 74 68 65 20 65 76 61 6c 75 61 74 6f 72 20 6c 6f  the evaluator lo
31310 6f 70 2e 20 20 53 6f 20 77 65 20 63 61 6e 20 6c  op.  So we can l
31320 65 61 76 65 20 69 74 20 6f 75 74 20 77 68 65 6e  eave it out when
31330 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e   NDEBUG is defin
31340 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ed..    */.#ifnd
31350 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 61 73  ef NDEBUG.    as
31360 73 65 72 74 28 20 70 63 3e 3d 2d 31 20 26 26 20  sert( pc>=-1 && 
31370 70 63 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 0a 23 69  pc<p->nOp );..#i
31380 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
31390 47 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 72 61  G.    if( p->tra
313a0 63 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ce ){.      if( 
313b0 72 63 21 3d 30 20 29 20 66 70 72 69 6e 74 66 28  rc!=0 ) fprintf(
313c0 70 2d 3e 74 72 61 63 65 2c 22 72 63 3d 25 64 5c  p->trace,"rc=%d\
313d0 6e 22 2c 72 63 29 3b 0a 20 20 20 20 20 20 69 66  n",rc);.      if
313e0 28 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26  ( pOp->opflags &
313f0 20 28 4f 50 46 4c 47 5f 4f 55 54 32 5f 50 52 45   (OPFLG_OUT2_PRE
31400 52 45 4c 45 41 53 45 7c 4f 50 46 4c 47 5f 4f 55  RELEASE|OPFLG_OU
31410 54 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  T2) ){.        r
31420 65 67 69 73 74 65 72 54 72 61 63 65 28 70 2d 3e  egisterTrace(p->
31430 74 72 61 63 65 2c 20 70 4f 70 2d 3e 70 32 2c 20  trace, pOp->p2, 
31440 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b  &aMem[pOp->p2]);
31450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
31460 66 28 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20  f( pOp->opflags 
31470 26 20 4f 50 46 4c 47 5f 4f 55 54 33 20 29 7b 0a  & OPFLG_OUT3 ){.
31480 20 20 20 20 20 20 20 20 72 65 67 69 73 74 65 72          register
31490 54 72 61 63 65 28 70 2d 3e 74 72 61 63 65 2c 20  Trace(p->trace, 
314a0 70 4f 70 2d 3e 70 33 2c 20 26 61 4d 65 6d 5b 70  pOp->p3, &aMem[p
314b0 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20  Op->p3]);.      
314c0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 20  }.    }.#endif  
314d0 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
314e0 2a 2f 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44  */.#endif  /* ND
314f0 45 42 55 47 20 2a 2f 0a 20 20 7d 20 20 2f 2a 20  EBUG */.  }  /* 
31500 54 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  The end of the f
31510 6f 72 28 3b 3b 29 20 6c 6f 6f 70 20 74 68 65 20  or(;;) loop the 
31520 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 6f 70  loops through op
31530 63 6f 64 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 49  codes */..  /* I
31540 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
31550 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
31560 74 68 61 74 20 65 78 65 63 75 74 69 6f 6e 20 69  that execution i
31570 73 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 0a  s finished with.
31580 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 66    ** an error of
31590 20 73 6f 6d 65 20 6b 69 6e 64 2e 0a 20 20 2a 2f   some kind..  */
315a0 0a 76 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74  .vdbe_error_halt
315b0 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 20 29  :.  assert( rc )
315c0 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a  ;.  p->rc = rc;.
315d0 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
315e0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
315f0 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c  xLog!=0 );.  sql
31600 69 74 65 33 5f 6c 6f 67 28 72 63 2c 20 22 73 74  ite3_log(rc, "st
31610 61 74 65 6d 65 6e 74 20 61 62 6f 72 74 73 20 61  atement aborts a
31620 74 20 25 64 3a 20 5b 25 73 5d 20 25 73 22 2c 20  t %d: [%s] %s", 
31630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31640 20 20 20 20 70 63 2c 20 70 2d 3e 7a 53 71 6c 2c      pc, p->zSql,
31650 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
31660 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
31670 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  p);.  if( rc==SQ
31680 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
31690 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69   ) db->mallocFai
316a0 6c 65 64 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20  led = 1;.  rc = 
316b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
316c0 69 66 28 20 72 65 73 65 74 53 63 68 65 6d 61 4f  if( resetSchemaO
316d0 6e 46 61 75 6c 74 3e 30 20 29 7b 0a 20 20 20 20  nFault>0 ){.    
316e0 73 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53  sqlite3ResetOneS
316f0 63 68 65 6d 61 28 64 62 2c 20 72 65 73 65 74 53  chema(db, resetS
31700 63 68 65 6d 61 4f 6e 46 61 75 6c 74 2d 31 29 3b  chemaOnFault-1);
31710 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
31720 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
31730 6f 75 74 20 6f 66 20 74 68 69 73 20 70 72 6f 63  out of this proc
31740 65 64 75 72 65 2e 20 20 57 65 20 68 61 76 65 20  edure.  We have 
31750 74 6f 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20  to.  ** release 
31760 74 68 65 20 6d 75 74 65 78 65 73 20 6f 6e 20 62  the mutexes on b
31770 74 72 65 65 73 20 74 68 61 74 20 77 65 72 65 20  trees that were 
31780 61 63 71 75 69 72 65 64 20 61 74 20 74 68 65 0a  acquired at the.
31790 20 20 2a 2a 20 74 6f 70 2e 20 2a 2f 0a 76 64 62    ** top. */.vdb
317a0 65 5f 72 65 74 75 72 6e 3a 0a 20 20 64 62 2d 3e  e_return:.  db->
317b0 6c 61 73 74 52 6f 77 69 64 20 3d 20 6c 61 73 74  lastRowid = last
317c0 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 61 43 6f 75  Rowid;.  p->aCou
317d0 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53 54 4d 54  nter[SQLITE_STMT
317e0 53 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 2d 31  STATUS_VM_STEP-1
317f0 5d 20 2b 3d 20 28 69 6e 74 29 6e 56 6d 53 74 65  ] += (int)nVmSte
31800 70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  p;.  sqlite3Vdbe
31810 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
31820 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  rn rc;..  /* Jum
31830 70 20 74 6f 20 68 65 72 65 20 69 66 20 61 20 73  p to here if a s
31840 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6c 61  tring or blob la
31850 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  rger than SQLITE
31860 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 20 20 2a 2a  _MAX_LENGTH.  **
31870 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e   is encountered.
31880 0a 20 20 2a 2f 0a 74 6f 6f 5f 62 69 67 3a 0a 20  .  */.too_big:. 
31890 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
318a0 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  g(&p->zErrMsg, d
318b0 62 2c 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c  b, "string or bl
318c0 6f 62 20 74 6f 6f 20 62 69 67 22 29 3b 0a 20 20  ob too big");.  
318d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 54 4f 4f 42  rc = SQLITE_TOOB
318e0 49 47 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f  IG;.  goto vdbe_
318f0 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 0a 20 20 2f  error_halt;..  /
31900 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
31910 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  f a malloc() fai
31920 6c 73 2e 0a 20 20 2a 2f 0a 6e 6f 5f 6d 65 6d 3a  ls..  */.no_mem:
31930 0a 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  .  db->mallocFai
31940 6c 65 64 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74  led = 1;.  sqlit
31950 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
31960 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 6f 75  zErrMsg, db, "ou
31970 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20  t of memory");. 
31980 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
31990 45 4d 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f  EM;.  goto vdbe_
319a0 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 0a 20 20 2f  error_halt;..  /
319b0 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 66  * Jump to here f
319c0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 6b 69 6e  or any other kin
319d0 64 20 6f 66 20 66 61 74 61 6c 20 65 72 72 6f 72  d of fatal error
319e0 2e 20 20 54 68 65 20 22 72 63 22 20 76 61 72 69  .  The "rc" vari
319f0 61 62 6c 65 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  able.  ** should
31a00 20 68 6f 6c 64 20 74 68 65 20 65 72 72 6f 72 20   hold the error 
31a10 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 61 62 6f  number..  */.abo
31a20 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3a  rt_due_to_error:
31a30 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 45  .  assert( p->zE
31a40 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 20 20 69 66  rrMsg==0 );.  if
31a50 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
31a60 65 64 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ed ) rc = SQLITE
31a70 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 72 63  _NOMEM;.  if( rc
31a80 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  !=SQLITE_IOERR_N
31a90 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69  OMEM ){.    sqli
31aa0 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
31ab0 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25  >zErrMsg, db, "%
31ac0 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  s", sqlite3ErrSt
31ad0 72 28 72 63 29 29 3b 0a 20 20 7d 0a 20 20 67 6f  r(rc));.  }.  go
31ae0 74 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68 61  to vdbe_error_ha
31af0 6c 74 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  lt;..  /* Jump t
31b00 6f 20 68 65 72 65 20 69 66 20 74 68 65 20 73 71  o here if the sq
31b10 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
31b20 29 20 41 50 49 20 73 65 74 73 20 74 68 65 20 69  ) API sets the i
31b30 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a 20 66 6c  nterrupt.  ** fl
31b40 61 67 2e 0a 20 20 2a 2f 0a 61 62 6f 72 74 5f 64  ag..  */.abort_d
31b50 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70 74 3a  ue_to_interrupt:
31b60 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 75  .  assert( db->u
31b70 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
31b80 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  );.  rc = SQLITE
31b90 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 70 2d  _INTERRUPT;.  p-
31ba0 3e 72 63 20 3d 20 72 63 3b 0a 20 20 73 71 6c 69  >rc = rc;.  sqli
31bb0 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
31bc0 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25  >zErrMsg, db, "%
31bd0 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  s", sqlite3ErrSt
31be0 72 28 72 63 29 29 3b 0a 20 20 67 6f 74 6f 20 76  r(rc));.  goto v
31bf0 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a  dbe_error_halt;.
31c00 7d 0a                                            }.