/ Hex Artifact Content
Login

Artifact 50b5b4ef29d928a4f60905f820ee1ab2f8ced29f:


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 50 72 65 70  lite3VdbeMemPrep
0940: 61 72 65 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29  areToChange(P,M)
0950: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
0960: 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
0970: 28 50 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (P,M).#endif../*
0980: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
0990: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
09a0: 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
09b0: 20 65 76 65 72 79 20 74 69 6d 65 20 61 20 63 75   every time a cu
09c0: 72 73 6f 72 0a 2a 2a 20 6d 6f 76 65 73 2c 20 65  rsor.** moves, e
09d0: 69 74 68 65 72 20 62 79 20 74 68 65 20 4f 50 5f  ither by the OP_
09e0: 53 65 65 6b 58 58 2c 20 4f 50 5f 4e 65 78 74 2c  SeekXX, OP_Next,
09f0: 20 6f 72 20 4f 50 5f 50 72 65 76 20 6f 70 63 6f   or OP_Prev opco
0a00: 64 65 73 2e 20 20 54 68 65 20 74 65 73 74 0a 2a  des.  The test.*
0a10: 2a 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 65  * procedures use
0a20: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
0a30: 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  n to make sure t
0a40: 68 61 74 20 69 6e 64 69 63 65 73 20 61 72 65 0a  hat indices are.
0a50: 2a 2a 20 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65  ** working corre
0a60: 63 74 6c 79 2e 20 20 54 68 69 73 20 76 61 72 69  ctly.  This vari
0a70: 61 62 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63  able has no func
0a80: 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  tion other than 
0a90: 74 6f 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66  to.** help verif
0aa0: 79 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70  y the correct op
0ab0: 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
0ac0: 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65  ibrary..*/.#ifde
0ad0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
0ae0: 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
0af0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
0b00: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  if../*.** When t
0b10: 68 69 73 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  his global varia
0b20: 62 6c 65 20 69 73 20 70 6f 73 69 74 69 76 65 2c  ble is positive,
0b30: 20 69 74 20 67 65 74 73 20 64 65 63 72 65 6d 65   it gets decreme
0b40: 6e 74 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nted once before
0b50: 0a 2a 2a 20 65 61 63 68 20 69 6e 73 74 72 75 63  .** each instruc
0b60: 74 69 6f 6e 20 69 6e 20 74 68 65 20 56 44 42 45  tion in the VDBE
0b70: 2e 20 20 57 68 65 6e 20 72 65 61 63 68 65 73 20  .  When reaches 
0b80: 7a 65 72 6f 2c 20 74 68 65 20 75 31 2e 69 73 49  zero, the u1.isI
0b90: 6e 74 65 72 72 75 70 74 65 64 0a 2a 2a 20 66 69  nterrupted.** fi
0ba0: 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74  eld of the sqlit
0bb0: 65 33 20 73 74 72 75 63 74 75 72 65 20 69 73 20  e3 structure is 
0bc0: 73 65 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  set in order to 
0bd0: 73 69 6d 75 6c 61 74 65 20 61 6e 64 20 69 6e 74  simulate and 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 0a 2a 2a 20 43 61 6c 6c  em;}../*.** Call
1620: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 45   sqlite3VdbeMemE
1630: 78 70 61 6e 64 42 6c 6f 62 28 29 20 6f 6e 20 74  xpandBlob() on t
1640: 68 65 20 73 75 70 70 6c 69 65 64 20 76 61 6c 75  he supplied valu
1650: 65 20 28 74 79 70 65 20 4d 65 6d 2a 29 0a 2a 2a  e (type Mem*).**
1660: 20 50 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a   P if required..
1670: 2a 2f 0a 23 64 65 66 69 6e 65 20 45 78 70 61 6e  */.#define Expan
1680: 64 42 6c 6f 62 28 50 29 20 28 28 28 50 29 2d 3e  dBlob(P) (((P)->
1690: 66 6c 61 67 73 26 4d 45 4d 5f 5a 65 72 6f 29 3f  flags&MEM_Zero)?
16a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 45 78  sqlite3VdbeMemEx
16b0: 70 61 6e 64 42 6c 6f 62 28 50 29 3a 30 29 0a 0a  pandBlob(P):0)..
16c0: 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
16d0: 4d 65 6d 20 70 6f 69 6e 74 73 20 61 74 20 61 20  Mem points at a 
16e0: 72 65 67 69 73 74 65 72 20 74 68 61 74 20 77 69  register that wi
16f0: 6c 6c 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  ll be passed to 
1700: 61 0a 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65  a.** user-define
1710: 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 72 65  d function or re
1720: 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73  turned to the us
1730: 65 72 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  er as the result
1740: 20 6f 66 20 61 20 71 75 65 72 79 2e 0a 2a 2a 20   of a query..** 
1750: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
1760: 73 20 74 68 65 20 70 4d 65 6d 2d 3e 74 79 70 65  s the pMem->type
1770: 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20 62   variable used b
1780: 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 61  y the sqlite3_va
1790: 6c 75 65 5f 2a 28 29 20 0a 2a 2a 20 72 6f 75 74  lue_*() .** rout
17a0: 69 6e 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ines..*/.void sq
17b0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f 72  lite3VdbeMemStor
17c0: 65 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 29  eType(Mem *pMem)
17d0: 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  {.  int flags = 
17e0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  pMem->flags;.  i
17f0: 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  f( flags & MEM_N
1800: 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d  ull ){.    pMem-
1810: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e  >type = SQLITE_N
1820: 55 4c 4c 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20  ULL;.  }.  else 
1830: 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  if( flags & MEM_
1840: 49 6e 74 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d  Int ){.    pMem-
1850: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  >type = SQLITE_I
1860: 4e 54 45 47 45 52 3b 0a 20 20 7d 0a 20 20 65 6c  NTEGER;.  }.  el
1870: 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  se if( flags & M
1880: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 70  EM_Real ){.    p
1890: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
18a0: 54 45 5f 46 4c 4f 41 54 3b 0a 20 20 7d 0a 20 20  TE_FLOAT;.  }.  
18b0: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
18c0: 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
18d0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
18e0: 49 54 45 5f 54 45 58 54 3b 0a 20 20 7d 65 6c 73  ITE_TEXT;.  }els
18f0: 65 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  e{.    pMem->typ
1900: 65 20 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3b  e = SQLITE_BLOB;
1910: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
1920: 6c 6f 63 61 74 65 20 56 64 62 65 43 75 72 73 6f  locate VdbeCurso
1930: 72 20 6e 75 6d 62 65 72 20 69 43 75 72 2e 20 20  r number iCur.  
1940: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1950: 20 74 6f 20 69 74 2e 20 20 52 65 74 75 72 6e 20   to it.  Return 
1960: 4e 55 4c 4c 0a 2a 2a 20 69 66 20 77 65 20 72 75  NULL.** if we ru
1970: 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
1980: 0a 2a 2f 0a 73 74 61 74 69 63 20 56 64 62 65 43  .*/.static VdbeC
1990: 75 72 73 6f 72 20 2a 61 6c 6c 6f 63 61 74 65 43  ursor *allocateC
19a0: 75 72 73 6f 72 28 0a 20 20 56 64 62 65 20 2a 70  ursor(.  Vdbe *p
19b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
19c0: 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
19d0: 63 68 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 69  chine */.  int i
19e0: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
19f0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1a00: 20 6e 65 77 20 56 64 62 65 43 75 72 73 6f 72 20   new VdbeCursor 
1a10: 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c  */.  int nField,
1a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1a30: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
1a40: 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  n the table or i
1a50: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 44  ndex */.  int iD
1a60: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1a70: 2f 2a 20 57 68 65 6e 20 64 61 74 61 62 61 73 65  /* When database
1a80: 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 6c 6f   the cursor belo
1a90: 6e 67 73 20 74 6f 2c 20 6f 72 20 2d 31 20 2a 2f  ngs to, or -1 */
1aa0: 0a 20 20 69 6e 74 20 69 73 42 74 72 65 65 43 75  .  int isBtreeCu
1ab0: 72 73 6f 72 20 20 20 20 20 2f 2a 20 54 72 75 65  rsor     /* True
1ac0: 20 66 6f 72 20 42 2d 54 72 65 65 2e 20 20 46 61   for B-Tree.  Fa
1ad0: 6c 73 65 20 66 6f 72 20 70 73 65 75 64 6f 2d 74  lse for pseudo-t
1ae0: 61 62 6c 65 20 6f 72 20 76 74 61 62 20 2a 2f 0a  able or vtab */.
1af0: 29 7b 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ){.  /* Find the
1b00: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
1b10: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
1b20: 6f 20 73 74 6f 72 65 20 74 68 65 20 62 6c 6f 62  o store the blob
1b30: 20 6f 66 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20   of memory.  ** 
1b40: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 69  required for thi
1b50: 73 20 56 64 62 65 43 75 72 73 6f 72 20 73 74 72  s VdbeCursor str
1b60: 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 63 6f  ucture. It is co
1b70: 6e 76 65 6e 69 65 6e 74 20 74 6f 20 75 73 65 20  nvenient to use 
1b80: 61 20 0a 20 20 2a 2a 20 76 64 62 65 20 6d 65 6d  a .  ** vdbe mem
1b90: 6f 72 79 20 63 65 6c 6c 20 74 6f 20 6d 61 6e 61  ory cell to mana
1ba0: 67 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  ge the memory al
1bb0: 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 69 72 65  location require
1bc0: 64 20 66 6f 72 20 61 0a 20 20 2a 2a 20 56 64 62  d for a.  ** Vdb
1bd0: 65 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72  eCursor structur
1be0: 65 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77  e for the follow
1bf0: 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a 20 20 2a  ing reasons:.  *
1c00: 2a 0a 20 20 2a 2a 20 20 20 2a 20 53 6f 6d 65 74  *.  **   * Somet
1c10: 69 6d 65 73 20 63 75 72 73 6f 72 20 6e 75 6d 62  imes cursor numb
1c20: 65 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72  ers are used for
1c30: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
1c40: 66 65 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20 20  ferent.  **     
1c50: 70 75 72 70 6f 73 65 73 20 69 6e 20 61 20 76 64  purposes in a vd
1c60: 62 65 20 70 72 6f 67 72 61 6d 2e 20 54 68 65 20  be program. The 
1c70: 64 69 66 66 65 72 65 6e 74 20 75 73 65 73 20 6d  different uses m
1c80: 69 67 68 74 20 72 65 71 75 69 72 65 0a 20 20 2a  ight require.  *
1c90: 2a 20 20 20 20 20 64 69 66 66 65 72 65 6e 74 20  *     different 
1ca0: 73 69 7a 65 64 20 61 6c 6c 6f 63 61 74 69 6f 6e  sized allocation
1cb0: 73 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  s. Memory cells 
1cc0: 70 72 6f 76 69 64 65 20 67 72 6f 77 61 62 6c 65  provide growable
1cd0: 0a 20 20 2a 2a 20 20 20 20 20 61 6c 6c 6f 63 61  .  **     alloca
1ce0: 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
1cf0: 20 20 20 2a 20 57 68 65 6e 20 75 73 69 6e 67 20     * When using 
1d00: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
1d10: 4e 41 47 45 4d 45 4e 54 2c 20 6d 65 6d 6f 72 79  NAGEMENT, memory
1d20: 20 63 65 6c 6c 20 62 75 66 66 65 72 73 20 63 61   cell buffers ca
1d30: 6e 0a 20 20 2a 2a 20 20 20 20 20 62 65 20 66 72  n.  **     be fr
1d40: 65 65 64 20 6c 61 7a 69 6c 79 20 76 69 61 20 74  eed lazily via t
1d50: 68 65 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  he sqlite3_relea
1d60: 73 65 5f 6d 65 6d 6f 72 79 28 29 20 41 50 49 2e  se_memory() API.
1d70: 20 54 68 69 73 0a 20 20 2a 2a 20 20 20 20 20 6d   This.  **     m
1d80: 69 6e 69 6d 69 7a 65 73 20 74 68 65 20 6e 75 6d  inimizes the num
1d90: 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 20 63 61  ber of malloc ca
1da0: 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  lls made by the 
1db0: 73 79 73 74 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  system..  **.  *
1dc0: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  * Memory cells f
1dd0: 6f 72 20 63 75 72 73 6f 72 73 20 61 72 65 20 61  or cursors are a
1de0: 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65 20  llocated at the 
1df0: 74 6f 70 20 6f 66 20 74 68 65 20 61 64 64 72 65  top of the addre
1e00: 73 73 0a 20 20 2a 2a 20 73 70 61 63 65 2e 20 4d  ss.  ** space. M
1e10: 65 6d 6f 72 79 20 63 65 6c 6c 20 28 70 2d 3e 6e  emory cell (p->n
1e20: 4d 65 6d 29 20 63 6f 72 72 65 73 70 6f 6e 64 73  Mem) corresponds
1e30: 20 74 6f 20 63 75 72 73 6f 72 20 30 2e 20 53 70   to cursor 0. Sp
1e40: 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 63 75 72  ace for.  ** cur
1e50: 73 6f 72 20 31 20 69 73 20 6d 61 6e 61 67 65 64  sor 1 is managed
1e60: 20 62 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   by memory cell 
1e70: 28 70 2d 3e 6e 4d 65 6d 2d 31 29 2c 20 65 74 63  (p->nMem-1), etc
1e80: 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ..  */.  Mem *pM
1e90: 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 2d  em = &p->aMem[p-
1ea0: 3e 6e 4d 65 6d 2d 69 43 75 72 5d 3b 0a 0a 20 20  >nMem-iCur];..  
1eb0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 56 64 62  int nByte;.  Vdb
1ec0: 65 43 75 72 73 6f 72 20 2a 70 43 78 20 3d 20 30  eCursor *pCx = 0
1ed0: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 0a 20 20 20  ;.  nByte = .   
1ee0: 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
1ef0: 28 56 64 62 65 43 75 72 73 6f 72 29 29 20 2b 20  (VdbeCursor)) + 
1f00: 0a 20 20 20 20 20 20 28 69 73 42 74 72 65 65 43  .      (isBtreeC
1f10: 75 72 73 6f 72 3f 73 71 6c 69 74 65 33 42 74 72  ursor?sqlite3Btr
1f20: 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 3a 30  eeCursorSize():0
1f30: 29 20 2b 20 0a 20 20 20 20 20 20 32 2a 6e 46 69  ) + .      2*nFi
1f40: 65 6c 64 2a 73 69 7a 65 6f 66 28 75 33 32 29 3b  eld*sizeof(u32);
1f50: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43 75 72  ..  assert( iCur
1f60: 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
1f70: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 5b 69 43   if( p->apCsr[iC
1f80: 75 72 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ur] ){.    sqlit
1f90: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
1fa0: 28 70 2c 20 70 2d 3e 61 70 43 73 72 5b 69 43 75  (p, p->apCsr[iCu
1fb0: 72 5d 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73  r]);.    p->apCs
1fc0: 72 5b 69 43 75 72 5d 20 3d 20 30 3b 0a 20 20 7d  r[iCur] = 0;.  }
1fd0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1fe0: 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ==sqlite3VdbeMem
1ff0: 47 72 6f 77 28 70 4d 65 6d 2c 20 6e 42 79 74 65  Grow(pMem, nByte
2000: 2c 20 30 29 20 29 7b 0a 20 20 20 20 70 2d 3e 61  , 0) ){.    p->a
2010: 70 43 73 72 5b 69 43 75 72 5d 20 3d 20 70 43 78  pCsr[iCur] = pCx
2020: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 2a 29   = (VdbeCursor*)
2030: 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 6d 65 6d  pMem->z;.    mem
2040: 73 65 74 28 70 43 78 2c 20 30 2c 20 73 69 7a 65  set(pCx, 0, size
2050: 6f 66 28 56 64 62 65 43 75 72 73 6f 72 29 29 3b  of(VdbeCursor));
2060: 0a 20 20 20 20 70 43 78 2d 3e 69 44 62 20 3d 20  .    pCx->iDb = 
2070: 69 44 62 3b 0a 20 20 20 20 70 43 78 2d 3e 6e 46  iDb;.    pCx->nF
2080: 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20  ield = nField;. 
2090: 20 20 20 69 66 28 20 6e 46 69 65 6c 64 20 29 7b     if( nField ){
20a0: 0a 20 20 20 20 20 20 70 43 78 2d 3e 61 54 79 70  .      pCx->aTyp
20b0: 65 20 3d 20 28 75 33 32 20 2a 29 26 70 4d 65 6d  e = (u32 *)&pMem
20c0: 2d 3e 7a 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  ->z[ROUND8(sizeo
20d0: 66 28 56 64 62 65 43 75 72 73 6f 72 29 29 5d 3b  f(VdbeCursor))];
20e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
20f0: 73 42 74 72 65 65 43 75 72 73 6f 72 20 29 7b 0a  sBtreeCursor ){.
2100: 20 20 20 20 20 20 70 43 78 2d 3e 70 43 75 72 73        pCx->pCurs
2110: 6f 72 20 3d 20 28 42 74 43 75 72 73 6f 72 2a 29  or = (BtCursor*)
2120: 0a 20 20 20 20 20 20 20 20 20 20 26 70 4d 65 6d  .          &pMem
2130: 2d 3e 7a 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  ->z[ROUND8(sizeo
2140: 66 28 56 64 62 65 43 75 72 73 6f 72 29 29 2b 32  f(VdbeCursor))+2
2150: 2a 6e 46 69 65 6c 64 2a 73 69 7a 65 6f 66 28 75  *nField*sizeof(u
2160: 33 32 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  32)];.      sqli
2170: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65  te3BtreeCursorZe
2180: 72 6f 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  ro(pCx->pCursor)
2190: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
21a0: 74 75 72 6e 20 70 43 78 3b 0a 7d 0a 0a 2f 2a 0a  turn pCx;.}../*.
21b0: 2a 2a 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72  ** Try to conver
21c0: 74 20 61 20 76 61 6c 75 65 20 69 6e 74 6f 20 61  t a value into a
21d0: 20 6e 75 6d 65 72 69 63 20 72 65 70 72 65 73 65   numeric represe
21e0: 6e 74 61 74 69 6f 6e 20 69 66 20 77 65 20 63 61  ntation if we ca
21f0: 6e 0a 2a 2a 20 64 6f 20 73 6f 20 77 69 74 68 6f  n.** do so witho
2200: 75 74 20 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72  ut loss of infor
2210: 6d 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65  mation.  In othe
2220: 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20  r words, if the 
2230: 73 74 72 69 6e 67 0a 2a 2a 20 6c 6f 6f 6b 73 20  string.** looks 
2240: 6c 69 6b 65 20 61 20 6e 75 6d 62 65 72 2c 20 63  like a number, c
2250: 6f 6e 76 65 72 74 20 69 74 20 69 6e 74 6f 20 61  onvert it into a
2260: 20 6e 75 6d 62 65 72 2e 20 20 49 66 20 69 74 20   number.  If it 
2270: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 6c 6f 6f 6b  does not.** look
2280: 20 6c 69 6b 65 20 61 20 6e 75 6d 62 65 72 2c 20   like a number, 
2290: 6c 65 61 76 65 20 69 74 20 61 6c 6f 6e 65 2e 0a  leave it alone..
22a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
22b0: 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e  pplyNumericAffin
22c0: 69 74 79 28 4d 65 6d 20 2a 70 52 65 63 29 7b 0a  ity(Mem *pRec){.
22d0: 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66 6c 61    if( (pRec->fla
22e0: 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d  gs & (MEM_Real|M
22f0: 45 4d 5f 49 6e 74 29 29 3d 3d 30 20 29 7b 0a 20  EM_Int))==0 ){. 
2300: 20 20 20 64 6f 75 62 6c 65 20 72 56 61 6c 75 65     double rValue
2310: 3b 0a 20 20 20 20 69 36 34 20 69 56 61 6c 75 65  ;.    i64 iValue
2320: 3b 0a 20 20 20 20 75 38 20 65 6e 63 20 3d 20 70  ;.    u8 enc = p
2330: 52 65 63 2d 3e 65 6e 63 3b 0a 20 20 20 20 69 66  Rec->enc;.    if
2340: 28 20 28 70 52 65 63 2d 3e 66 6c 61 67 73 26 4d  ( (pRec->flags&M
2350: 45 4d 5f 53 74 72 29 3d 3d 30 20 29 20 72 65 74  EM_Str)==0 ) ret
2360: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  urn;.    if( sql
2370: 69 74 65 33 41 74 6f 46 28 70 52 65 63 2d 3e 7a  ite3AtoF(pRec->z
2380: 2c 20 26 72 56 61 6c 75 65 2c 20 70 52 65 63 2d  , &rValue, pRec-
2390: 3e 6e 2c 20 65 6e 63 29 3d 3d 30 20 29 20 72 65  >n, enc)==0 ) re
23a0: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 30 3d  turn;.    if( 0=
23b0: 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 70  =sqlite3Atoi64(p
23c0: 52 65 63 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 2c  Rec->z, &iValue,
23d0: 20 70 52 65 63 2d 3e 6e 2c 20 65 6e 63 29 20 29   pRec->n, enc) )
23e0: 7b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 75 2e  {.      pRec->u.
23f0: 69 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20  i = iValue;.    
2400: 20 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 7c 3d    pRec->flags |=
2410: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 7d 65   MEM_Int;.    }e
2420: 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 65 63 2d  lse{.      pRec-
2430: 3e 72 20 3d 20 72 56 61 6c 75 65 3b 0a 20 20 20  >r = rValue;.   
2440: 20 20 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 7c     pRec->flags |
2450: 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20  = MEM_Real;.    
2460: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  }.  }.}../*.** P
2470: 72 6f 63 65 73 73 69 6e 67 20 69 73 20 64 65 74  rocessing is det
2480: 65 72 6d 69 6e 65 20 62 79 20 74 68 65 20 61 66  ermine by the af
2490: 66 69 6e 69 74 79 20 70 61 72 61 6d 65 74 65 72  finity parameter
24a0: 3a 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  :.**.** SQLITE_A
24b0: 46 46 5f 49 4e 54 45 47 45 52 3a 0a 2a 2a 20 53  FF_INTEGER:.** S
24c0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3a 0a  QLITE_AFF_REAL:.
24d0: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ** SQLITE_AFF_NU
24e0: 4d 45 52 49 43 3a 0a 2a 2a 20 20 20 20 54 72 79  MERIC:.**    Try
24f0: 20 74 6f 20 63 6f 6e 76 65 72 74 20 70 52 65 63   to convert pRec
2500: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 72   to an integer r
2510: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72  epresentation or
2520: 20 61 20 0a 2a 2a 20 20 20 20 66 6c 6f 61 74 69   a .**    floati
2530: 6e 67 2d 70 6f 69 6e 74 20 72 65 70 72 65 73 65  ng-point represe
2540: 6e 74 61 74 69 6f 6e 20 69 66 20 61 6e 20 69 6e  ntation if an in
2550: 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61  teger representa
2560: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 6e 6f  tion.**    is no
2570: 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 4e 6f 74  t possible.  Not
2580: 65 20 74 68 61 74 20 74 68 65 20 69 6e 74 65 67  e that the integ
2590: 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  er representatio
25a0: 6e 20 69 73 0a 2a 2a 20 20 20 20 61 6c 77 61 79  n is.**    alway
25b0: 73 20 70 72 65 66 65 72 72 65 64 2c 20 65 76 65  s preferred, eve
25c0: 6e 20 69 66 20 74 68 65 20 61 66 66 69 6e 69 74  n if the affinit
25d0: 79 20 69 73 20 52 45 41 4c 2c 20 62 65 63 61 75  y is REAL, becau
25e0: 73 65 0a 2a 2a 20 20 20 20 61 6e 20 69 6e 74 65  se.**    an inte
25f0: 67 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69  ger representati
2600: 6f 6e 20 69 73 20 6d 6f 72 65 20 73 70 61 63 65  on is more space
2610: 20 65 66 66 69 63 69 65 6e 74 20 6f 6e 20 64 69   efficient on di
2620: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  sk..**.** SQLITE
2630: 5f 41 46 46 5f 54 45 58 54 3a 0a 2a 2a 20 20 20  _AFF_TEXT:.**   
2640: 20 43 6f 6e 76 65 72 74 20 70 52 65 63 20 74 6f   Convert pRec to
2650: 20 61 20 74 65 78 74 20 72 65 70 72 65 73 65 6e   a text represen
2660: 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 51  tation..**.** SQ
2670: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 2a  LITE_AFF_NONE:.*
2680: 2a 20 20 20 20 4e 6f 2d 6f 70 2e 20 20 70 52 65  *    No-op.  pRe
2690: 63 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  c is unchanged..
26a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
26b0: 70 70 6c 79 41 66 66 69 6e 69 74 79 28 0a 20 20  pplyAffinity(.  
26c0: 4d 65 6d 20 2a 70 52 65 63 2c 20 20 20 20 20 20  Mem *pRec,      
26d0: 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
26e0: 20 74 6f 20 61 70 70 6c 79 20 61 66 66 69 6e 69   to apply affini
26f0: 74 79 20 74 6f 20 2a 2f 0a 20 20 63 68 61 72 20  ty to */.  char 
2700: 61 66 66 69 6e 69 74 79 2c 20 20 20 20 20 20 2f  affinity,      /
2710: 2a 20 54 68 65 20 61 66 66 69 6e 69 74 79 20 74  * The affinity t
2720: 6f 20 62 65 20 61 70 70 6c 69 65 64 20 2a 2f 0a  o be applied */.
2730: 20 20 75 38 20 65 6e 63 20 20 20 20 20 20 20 20    u8 enc        
2740: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69        /* Use thi
2750: 73 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  s text encoding 
2760: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 61 66 66 69  */.){.  if( affi
2770: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
2780: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 2f 2a 20  _TEXT ){.    /* 
2790: 4f 6e 6c 79 20 61 74 74 65 6d 70 74 20 74 68 65  Only attempt the
27a0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 54   conversion to T
27b0: 45 58 54 20 69 66 20 74 68 65 72 65 20 69 73 20  EXT if there is 
27c0: 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 72 65  an integer or re
27d0: 61 6c 0a 20 20 20 20 2a 2a 20 72 65 70 72 65 73  al.    ** repres
27e0: 65 6e 74 61 74 69 6f 6e 20 28 62 6c 6f 62 20 61  entation (blob a
27f0: 6e 64 20 4e 55 4c 4c 20 64 6f 20 6e 6f 74 20 67  nd NULL do not g
2800: 65 74 20 63 6f 6e 76 65 72 74 65 64 29 20 62 75  et converted) bu
2810: 74 20 6e 6f 20 73 74 72 69 6e 67 0a 20 20 20 20  t no string.    
2820: 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ** representatio
2830: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
2840: 28 20 30 3d 3d 28 70 52 65 63 2d 3e 66 6c 61 67  ( 0==(pRec->flag
2850: 73 26 4d 45 4d 5f 53 74 72 29 20 26 26 20 28 70  s&MEM_Str) && (p
2860: 52 65 63 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f  Rec->flags&(MEM_
2870: 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 29 29 20 29  Real|MEM_Int)) )
2880: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2890: 64 62 65 4d 65 6d 53 74 72 69 6e 67 69 66 79 28  dbeMemStringify(
28a0: 70 52 65 63 2c 20 65 6e 63 29 3b 0a 20 20 20 20  pRec, enc);.    
28b0: 7d 0a 20 20 20 20 70 52 65 63 2d 3e 66 6c 61 67  }.    pRec->flag
28c0: 73 20 26 3d 20 7e 28 4d 45 4d 5f 52 65 61 6c 7c  s &= ~(MEM_Real|
28d0: 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 65 6c 73  MEM_Int);.  }els
28e0: 65 20 69 66 28 20 61 66 66 69 6e 69 74 79 21 3d  e if( affinity!=
28f0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
2900: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  ){.    assert( a
2910: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
2920: 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
2930: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
2940: 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 20  AFF_REAL.       
2950: 20 20 20 20 20 20 7c 7c 20 61 66 66 69 6e 69 74        || affinit
2960: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  y==SQLITE_AFF_NU
2970: 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 61 70 70  MERIC );.    app
2980: 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  lyNumericAffinit
2990: 79 28 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28  y(pRec);.    if(
29a0: 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20 4d   pRec->flags & M
29b0: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
29c0: 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 65   sqlite3VdbeInte
29d0: 67 65 72 41 66 66 69 6e 69 74 79 28 70 52 65 63  gerAffinity(pRec
29e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
29f0: 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 63 6f 6e  /*.** Try to con
2a00: 76 65 72 74 20 74 68 65 20 74 79 70 65 20 6f 66  vert the type of
2a10: 20 61 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75   a function argu
2a20: 6d 65 6e 74 20 6f 72 20 61 20 72 65 73 75 6c 74  ment or a result
2a30: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 74 6f 20   column.** into 
2a40: 61 20 6e 75 6d 65 72 69 63 20 72 65 70 72 65 73  a numeric repres
2a50: 65 6e 74 61 74 69 6f 6e 2e 20 20 55 73 65 20 65  entation.  Use e
2a60: 69 74 68 65 72 20 49 4e 54 45 47 45 52 20 6f 72  ither INTEGER or
2a70: 20 52 45 41 4c 20 77 68 69 63 68 65 76 65 72 0a   REAL whichever.
2a80: 2a 2a 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  ** is appropriat
2a90: 65 2e 20 20 42 75 74 20 6f 6e 6c 79 20 64 6f 20  e.  But only do 
2aa0: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69  the conversion i
2ab0: 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
2ac0: 20 77 69 74 68 6f 75 74 0a 2a 2a 20 6c 6f 73 73   without.** loss
2ad0: 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   of information 
2ae0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72  and return the r
2af0: 65 76 69 73 65 64 20 74 79 70 65 20 6f 66 20 74  evised type of t
2b00: 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  he argument..*/.
2b10: 69 6e 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  int sqlite3_valu
2b20: 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 73  e_numeric_type(s
2b30: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
2b40: 61 6c 29 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  al){.  Mem *pMem
2b50: 20 3d 20 28 4d 65 6d 2a 29 70 56 61 6c 3b 0a 20   = (Mem*)pVal;. 
2b60: 20 69 66 28 20 70 4d 65 6d 2d 3e 74 79 70 65 3d   if( pMem->type=
2b70: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
2b80: 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63      applyNumeric
2b90: 41 66 66 69 6e 69 74 79 28 70 4d 65 6d 29 3b 0a  Affinity(pMem);.
2ba0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
2bb0: 65 6d 53 74 6f 72 65 54 79 70 65 28 70 4d 65 6d  emStoreType(pMem
2bc0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2bd0: 70 4d 65 6d 2d 3e 74 79 70 65 3b 0a 7d 0a 0a 2f  pMem->type;.}../
2be0: 2a 0a 2a 2a 20 45 78 70 6f 72 74 65 64 20 76 65  *.** Exported ve
2bf0: 72 73 69 6f 6e 20 6f 66 20 61 70 70 6c 79 41 66  rsion of applyAf
2c00: 66 69 6e 69 74 79 28 29 2e 20 54 68 69 73 20 6f  finity(). This o
2c10: 6e 65 20 77 6f 72 6b 73 20 6f 6e 20 73 71 6c 69  ne works on sqli
2c20: 74 65 33 5f 76 61 6c 75 65 2a 2c 20 0a 2a 2a 20  te3_value*, .** 
2c30: 6e 6f 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  not the internal
2c40: 20 4d 65 6d 2a 20 74 79 70 65 2e 0a 2a 2f 0a 76   Mem* type..*/.v
2c50: 6f 69 64 20 73 71 6c 69 74 65 33 56 61 6c 75 65  oid sqlite3Value
2c60: 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 0a 20  ApplyAffinity(. 
2c70: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2c80: 70 56 61 6c 2c 20 0a 20 20 75 38 20 61 66 66 69  pVal, .  u8 affi
2c90: 6e 69 74 79 2c 20 0a 20 20 75 38 20 65 6e 63 0a  nity, .  u8 enc.
2ca0: 29 7b 0a 20 20 61 70 70 6c 79 41 66 66 69 6e 69  ){.  applyAffini
2cb0: 74 79 28 28 4d 65 6d 20 2a 29 70 56 61 6c 2c 20  ty((Mem *)pVal, 
2cc0: 61 66 66 69 6e 69 74 79 2c 20 65 6e 63 29 3b 0a  affinity, enc);.
2cd0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2ce0: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 57 72 69  _DEBUG./*.** Wri
2cf0: 74 65 20 61 20 6e 69 63 65 20 73 74 72 69 6e 67  te a nice string
2d00: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2d10: 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  of the contents 
2d20: 6f 66 20 63 65 6c 6c 20 70 4d 65 6d 0a 2a 2a 20  of cell pMem.** 
2d30: 69 6e 74 6f 20 62 75 66 66 65 72 20 7a 42 75 66  into buffer zBuf
2d40: 2c 20 6c 65 6e 67 74 68 20 6e 42 75 66 2e 0a 2a  , length nBuf..*
2d50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
2d60: 62 65 4d 65 6d 50 72 65 74 74 79 50 72 69 6e 74  beMemPrettyPrint
2d70: 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 63 68 61 72  (Mem *pMem, char
2d80: 20 2a 7a 42 75 66 29 7b 0a 20 20 63 68 61 72 20   *zBuf){.  char 
2d90: 2a 7a 43 73 72 20 3d 20 7a 42 75 66 3b 0a 20 20  *zCsr = zBuf;.  
2da0: 69 6e 74 20 66 20 3d 20 70 4d 65 6d 2d 3e 66 6c  int f = pMem->fl
2db0: 61 67 73 3b 0a 0a 20 20 73 74 61 74 69 63 20 63  ags;..  static c
2dc0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
2dd0: 20 65 6e 63 6e 61 6d 65 73 5b 5d 20 3d 20 7b 22   encnames[] = {"
2de0: 28 58 29 22 2c 20 22 28 38 29 22 2c 20 22 28 31  (X)", "(8)", "(1
2df0: 36 4c 45 29 22 2c 20 22 28 31 36 42 45 29 22 7d  6LE)", "(16BE)"}
2e00: 3b 0a 0a 20 20 69 66 28 20 66 26 4d 45 4d 5f 42  ;..  if( f&MEM_B
2e10: 6c 6f 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  lob ){.    int i
2e20: 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20  ;.    char c;.  
2e30: 20 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 44 79    if( f & MEM_Dy
2e40: 6e 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 27  n ){.      c = '
2e50: 7a 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  z';.      assert
2e60: 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74  ( (f & (MEM_Stat
2e70: 69 63 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d  ic|MEM_Ephem))==
2e80: 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  0 );.    }else i
2e90: 66 28 20 66 20 26 20 4d 45 4d 5f 53 74 61 74 69  f( f & MEM_Stati
2ea0: 63 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 27  c ){.      c = '
2eb0: 74 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t';.      assert
2ec0: 28 20 28 66 20 26 20 28 4d 45 4d 5f 44 79 6e 7c  ( (f & (MEM_Dyn|
2ed0: 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20 29  MEM_Ephem))==0 )
2ee0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2ef0: 66 20 26 20 4d 45 4d 5f 45 70 68 65 6d 20 29 7b  f & MEM_Ephem ){
2f00: 0a 20 20 20 20 20 20 63 20 3d 20 27 65 27 3b 0a  .      c = 'e';.
2f10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 66        assert( (f
2f20: 20 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d   & (MEM_Static|M
2f30: 45 4d 5f 44 79 6e 29 29 3d 3d 30 20 29 3b 0a 20  EM_Dyn))==0 );. 
2f40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f50: 63 20 3d 20 27 73 27 3b 0a 20 20 20 20 7d 0a 0a  c = 's';.    }..
2f60: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2f70: 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 20  intf(100, zCsr, 
2f80: 22 25 63 22 2c 20 63 29 3b 0a 20 20 20 20 7a 43  "%c", c);.    zC
2f90: 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  sr += sqlite3Str
2fa0: 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20 20  len30(zCsr);.   
2fb0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2fc0: 66 28 31 30 30 2c 20 7a 43 73 72 2c 20 22 25 64  f(100, zCsr, "%d
2fd0: 5b 22 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20  [", pMem->n);.  
2fe0: 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65    zCsr += sqlite
2ff0: 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b  3Strlen30(zCsr);
3000: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3010: 31 36 20 26 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b  16 && i<pMem->n;
3020: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
3030: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
3040: 30 2c 20 7a 43 73 72 2c 20 22 25 30 32 58 22 2c  0, zCsr, "%02X",
3050: 20 28 28 69 6e 74 29 70 4d 65 6d 2d 3e 7a 5b 69   ((int)pMem->z[i
3060: 5d 20 26 20 30 78 46 46 29 29 3b 0a 20 20 20 20  ] & 0xFF));.    
3070: 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65    zCsr += sqlite
3080: 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b  3Strlen30(zCsr);
3090: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
30a0: 3d 30 3b 20 69 3c 31 36 20 26 26 20 69 3c 70 4d  =0; i<16 && i<pM
30b0: 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  em->n; i++){.   
30c0: 20 20 20 63 68 61 72 20 7a 20 3d 20 70 4d 65 6d     char z = pMem
30d0: 2d 3e 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ->z[i];.      if
30e0: 28 20 7a 3c 33 32 20 7c 7c 20 7a 3e 31 32 36 20  ( z<32 || z>126 
30f0: 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 27 2e 27 3b  ) *zCsr++ = '.';
3100: 0a 20 20 20 20 20 20 65 6c 73 65 20 2a 7a 43 73  .      else *zCs
3110: 72 2b 2b 20 3d 20 7a 3b 0a 20 20 20 20 7d 0a 0a  r++ = z;.    }..
3120: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
3130: 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 20  intf(100, zCsr, 
3140: 22 5d 25 73 22 2c 20 65 6e 63 6e 61 6d 65 73 5b  "]%s", encnames[
3150: 70 4d 65 6d 2d 3e 65 6e 63 5d 29 3b 0a 20 20 20  pMem->enc]);.   
3160: 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33   zCsr += sqlite3
3170: 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a  Strlen30(zCsr);.
3180: 20 20 20 20 69 66 28 20 66 20 26 20 4d 45 4d 5f      if( f & MEM_
3190: 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 73 71  Zero ){.      sq
31a0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
31b0: 30 30 2c 20 7a 43 73 72 2c 22 2b 25 64 7a 22 2c  00, zCsr,"+%dz",
31c0: 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 29 3b 0a  pMem->u.nZero);.
31d0: 20 20 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71        zCsr += sq
31e0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
31f0: 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  sr);.    }.    *
3200: 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  zCsr = '\0';.  }
3210: 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d  else if( f & MEM
3220: 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  _Str ){.    int 
3230: 6a 2c 20 6b 3b 0a 20 20 20 20 7a 42 75 66 5b 30  j, k;.    zBuf[0
3240: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 69 66 28  ] = ' ';.    if(
3250: 20 66 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a   f & MEM_Dyn ){.
3260: 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20        zBuf[1] = 
3270: 27 7a 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72  'z';.      asser
3280: 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61  t( (f & (MEM_Sta
3290: 74 69 63 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d  tic|MEM_Ephem))=
32a0: 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  =0 );.    }else 
32b0: 69 66 28 20 66 20 26 20 4d 45 4d 5f 53 74 61 74  if( f & MEM_Stat
32c0: 69 63 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66  ic ){.      zBuf
32d0: 5b 31 5d 20 3d 20 27 74 27 3b 0a 20 20 20 20 20  [1] = 't';.     
32e0: 20 61 73 73 65 72 74 28 20 28 66 20 26 20 28 4d   assert( (f & (M
32f0: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d  EM_Dyn|MEM_Ephem
3300: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c  ))==0 );.    }el
3310: 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 45  se if( f & MEM_E
3320: 70 68 65 6d 20 29 7b 0a 20 20 20 20 20 20 7a 42  phem ){.      zB
3330: 75 66 5b 31 5d 20 3d 20 27 65 27 3b 0a 20 20 20  uf[1] = 'e';.   
3340: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20     assert( (f & 
3350: 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f  (MEM_Static|MEM_
3360: 44 79 6e 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Dyn))==0 );.    
3370: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 42 75  }else{.      zBu
3380: 66 5b 31 5d 20 3d 20 27 73 27 3b 0a 20 20 20 20  f[1] = 's';.    
3390: 7d 0a 20 20 20 20 6b 20 3d 20 32 3b 0a 20 20 20  }.    k = 2;.   
33a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
33b0: 66 28 31 30 30 2c 20 26 7a 42 75 66 5b 6b 5d 2c  f(100, &zBuf[k],
33c0: 20 22 25 64 22 2c 20 70 4d 65 6d 2d 3e 6e 29 3b   "%d", pMem->n);
33d0: 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65  .    k += sqlite
33e0: 33 53 74 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b  3Strlen30(&zBuf[
33f0: 6b 5d 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b  k]);.    zBuf[k+
3400: 2b 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 20 66 6f  +] = '[';.    fo
3410: 72 28 6a 3d 30 3b 20 6a 3c 31 35 20 26 26 20 6a  r(j=0; j<15 && j
3420: 3c 70 4d 65 6d 2d 3e 6e 3b 20 6a 2b 2b 29 7b 0a  <pMem->n; j++){.
3430: 20 20 20 20 20 20 75 38 20 63 20 3d 20 70 4d 65        u8 c = pMe
3440: 6d 2d 3e 7a 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  m->z[j];.      i
3450: 66 28 20 63 3e 3d 30 78 32 30 20 26 26 20 63 3c  f( c>=0x20 && c<
3460: 30 78 37 66 20 29 7b 0a 20 20 20 20 20 20 20 20  0x7f ){.        
3470: 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 63 3b 0a 20  zBuf[k++] = c;. 
3480: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3490: 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20      zBuf[k++] = 
34a0: 27 2e 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  '.';.      }.   
34b0: 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d   }.    zBuf[k++]
34c0: 20 3d 20 27 5d 27 3b 0a 20 20 20 20 73 71 6c 69   = ']';.    sqli
34d0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30  te3_snprintf(100
34e0: 2c 26 7a 42 75 66 5b 6b 5d 2c 20 65 6e 63 6e 61  ,&zBuf[k], encna
34f0: 6d 65 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d 29 3b  mes[pMem->enc]);
3500: 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65  .    k += sqlite
3510: 33 53 74 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b  3Strlen30(&zBuf[
3520: 6b 5d 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b  k]);.    zBuf[k+
3530: 2b 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  +] = 0;.  }.}.#e
3540: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
3550: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
3560: 50 72 69 6e 74 20 74 68 65 20 76 61 6c 75 65 20  Print the value 
3570: 6f 66 20 61 20 72 65 67 69 73 74 65 72 20 66 6f  of a register fo
3580: 72 20 74 72 61 63 69 6e 67 20 70 75 72 70 6f 73  r tracing purpos
3590: 65 73 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es:.*/.static vo
35a0: 69 64 20 6d 65 6d 54 72 61 63 65 50 72 69 6e 74  id memTracePrint
35b0: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 4d 65 6d 20  (FILE *out, Mem 
35c0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 66 6c  *p){.  if( p->fl
35d0: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
35e0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
35f0: 74 2c 20 22 20 4e 55 4c 4c 22 29 3b 0a 20 20 7d  t, " NULL");.  }
3600: 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 66 6c 61  else if( (p->fla
3610: 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45  gs & (MEM_Int|ME
3620: 4d 5f 53 74 72 29 29 3d 3d 28 4d 45 4d 5f 49 6e  M_Str))==(MEM_In
3630: 74 7c 4d 45 4d 5f 53 74 72 29 20 29 7b 0a 20 20  t|MEM_Str) ){.  
3640: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
3650: 20 73 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e   si:%lld", p->u.
3660: 69 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  i);.  }else if( 
3670: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  p->flags & MEM_I
3680: 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  nt ){.    fprint
3690: 66 28 6f 75 74 2c 20 22 20 69 3a 25 6c 6c 64 22  f(out, " i:%lld"
36a0: 2c 20 70 2d 3e 75 2e 69 29 3b 0a 23 69 66 6e 64  , p->u.i);.#ifnd
36b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
36c0: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
36d0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61  }else if( p->fla
36e0: 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b  gs & MEM_Real ){
36f0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
3700: 2c 20 22 20 72 3a 25 67 22 2c 20 70 2d 3e 72 29  , " r:%g", p->r)
3710: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
3720: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
3730: 4d 45 4d 5f 52 6f 77 53 65 74 20 29 7b 0a 20 20  MEM_RowSet ){.  
3740: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
3750: 20 28 72 6f 77 73 65 74 29 22 29 3b 0a 20 20 7d   (rowset)");.  }
3760: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a  else{.    char z
3770: 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 73 71  Buf[200];.    sq
3780: 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72 65 74  lite3VdbeMemPret
3790: 74 79 50 72 69 6e 74 28 70 2c 20 7a 42 75 66 29  tyPrint(p, zBuf)
37a0: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
37b0: 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 66 70 72  t, " ");.    fpr
37c0: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
37d0: 7a 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  zBuf);.  }.}.sta
37e0: 74 69 63 20 76 6f 69 64 20 72 65 67 69 73 74 65  tic void registe
37f0: 72 54 72 61 63 65 28 46 49 4c 45 20 2a 6f 75 74  rTrace(FILE *out
3800: 2c 20 69 6e 74 20 69 52 65 67 2c 20 4d 65 6d 20  , int iReg, Mem 
3810: 2a 70 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f  *p){.  fprintf(o
3820: 75 74 2c 20 22 52 45 47 5b 25 64 5d 20 3d 20 22  ut, "REG[%d] = "
3830: 2c 20 69 52 65 67 29 3b 0a 20 20 6d 65 6d 54 72  , iReg);.  memTr
3840: 61 63 65 50 72 69 6e 74 28 6f 75 74 2c 20 70 29  acePrint(out, p)
3850: 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
3860: 20 22 5c 6e 22 29 3b 0a 7d 0a 23 65 6e 64 69 66   "\n");.}.#endif
3870: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
3880: 44 45 42 55 47 0a 23 20 20 64 65 66 69 6e 65 20  DEBUG.#  define 
3890: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 52  REGISTER_TRACE(R
38a0: 2c 4d 29 20 69 66 28 70 2d 3e 74 72 61 63 65 29  ,M) if(p->trace)
38b0: 72 65 67 69 73 74 65 72 54 72 61 63 65 28 70 2d  registerTrace(p-
38c0: 3e 74 72 61 63 65 2c 52 2c 4d 29 0a 23 65 6c 73  >trace,R,M).#els
38d0: 65 0a 23 20 20 64 65 66 69 6e 65 20 52 45 47 49  e.#  define REGI
38e0: 53 54 45 52 5f 54 52 41 43 45 28 52 2c 4d 29 0a  STER_TRACE(R,M).
38f0: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20  #endif...#ifdef 
3900: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 0a 2f 2a  VDBE_PROFILE../*
3910: 20 0a 2a 2a 20 68 77 74 69 6d 65 2e 68 20 63 6f   .** hwtime.h co
3920: 6e 74 61 69 6e 73 20 69 6e 6c 69 6e 65 20 61 73  ntains inline as
3930: 73 65 6d 62 6c 65 72 20 63 6f 64 65 20 66 6f 72  sembler code for
3940: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 0a 2a   implementing .*
3950: 2a 20 68 69 67 68 2d 70 65 72 66 6f 72 6d 61 6e  * high-performan
3960: 63 65 20 74 69 6d 69 6e 67 20 72 6f 75 74 69 6e  ce timing routin
3970: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
3980: 22 68 77 74 69 6d 65 2e 68 22 0a 0a 23 65 6e 64  "hwtime.h"..#end
3990: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  if../*.** The CH
39a0: 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52 52 55 50  ECK_FOR_INTERRUP
39b0: 54 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 20  T macro defined 
39c0: 68 65 72 65 20 6c 6f 6f 6b 73 20 74 6f 20 73 65  here looks to se
39d0: 65 20 69 66 20 74 68 65 0a 2a 2a 20 73 71 6c 69  e if the.** sqli
39e0: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 29 20  te3_interrupt() 
39f0: 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e  routine has been
3a00: 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 74 20   called.  If it 
3a10: 68 61 73 20 62 65 65 6e 2c 20 74 68 65 6e 0a 2a  has been, then.*
3a20: 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20  * processing of 
3a30: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
3a40: 20 69 73 20 69 6e 74 65 72 72 75 70 74 65 64 2e   is interrupted.
3a50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72  .**.** This macr
3a60: 6f 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79  o added to every
3a70: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
3a80: 74 20 64 6f 65 73 20 61 20 6a 75 6d 70 20 69 6e  t does a jump in
3a90: 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 69 6d 70   order to.** imp
3aa0: 6c 65 6d 65 6e 74 20 61 20 6c 6f 6f 70 2e 20 20  lement a loop.  
3ab0: 54 68 69 73 20 74 65 73 74 20 75 73 65 64 20 74  This test used t
3ac0: 6f 20 62 65 20 6f 6e 20 65 76 65 72 79 20 73 69  o be on every si
3ad0: 6e 67 6c 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  ngle instruction
3ae0: 2c 0a 2a 2a 20 62 75 74 20 74 68 61 74 20 6d 65  ,.** but that me
3af0: 61 6e 74 20 77 65 20 6d 6f 72 65 20 74 65 73 74  ant we more test
3b00: 69 6e 67 20 74 68 61 74 20 77 65 20 6e 65 65 64  ing that we need
3b10: 65 64 2e 20 20 42 79 20 6f 6e 6c 79 20 74 65 73  ed.  By only tes
3b20: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 66 6c 61 67  ting the.** flag
3b30: 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63   on jump instruc
3b40: 74 69 6f 6e 73 2c 20 77 65 20 67 65 74 20 61 20  tions, we get a 
3b50: 28 73 6d 61 6c 6c 29 20 73 70 65 65 64 20 69 6d  (small) speed im
3b60: 70 72 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 23 64  provement..*/.#d
3b70: 65 66 69 6e 65 20 43 48 45 43 4b 5f 46 4f 52 5f  efine CHECK_FOR_
3b80: 49 4e 54 45 52 52 55 50 54 20 5c 0a 20 20 20 69  INTERRUPT \.   i
3b90: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
3ba0: 72 72 75 70 74 65 64 20 29 20 67 6f 74 6f 20 61  rrupted ) goto a
3bb0: 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 69 6e 74 65  bort_due_to_inte
3bc0: 72 72 75 70 74 3b 0a 0a 0a 23 69 66 6e 64 65 66  rrupt;...#ifndef
3bd0: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68   NDEBUG./*.** Th
3be0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
3bf0: 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  nly called from 
3c00: 77 69 74 68 69 6e 20 61 6e 20 61 73 73 65 72 74  within an assert
3c10: 28 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 49  () expression. I
3c20: 74 0a 2a 2a 20 63 68 65 63 6b 73 20 74 68 61 74  t.** checks that
3c30: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 54 72   the sqlite3.nTr
3c40: 61 6e 73 61 63 74 69 6f 6e 20 76 61 72 69 61 62  ansaction variab
3c50: 6c 65 20 69 73 20 63 6f 72 72 65 63 74 6c 79 20  le is correctly 
3c60: 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 75  set to.** the nu
3c70: 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 74 72 61 6e  mber of non-tran
3c80: 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
3c90: 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  ts currently in 
3ca0: 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
3cb0: 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20  ist starting at 
3cc0: 73 71 6c 69 74 65 33 2e 70 53 61 76 65 70 6f 69  sqlite3.pSavepoi
3cd0: 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 55 73 61 67 65  nt..** .** Usage
3ce0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 73 73 65  :.**.**     asse
3cf0: 72 74 28 20 63 68 65 63 6b 53 61 76 65 70 6f 69  rt( checkSavepoi
3d00: 6e 74 43 6f 75 6e 74 28 64 62 29 20 29 3b 0a 2a  ntCount(db) );.*
3d10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
3d20: 63 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74  ckSavepointCount
3d30: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
3d40: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 53 61   int n = 0;.  Sa
3d50: 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20 20 66 6f  vepoint *p;.  fo
3d60: 72 28 70 3d 64 62 2d 3e 70 53 61 76 65 70 6f 69  r(p=db->pSavepoi
3d70: 6e 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  nt; p; p=p->pNex
3d80: 74 29 20 6e 2b 2b 3b 0a 20 20 61 73 73 65 72 74  t) n++;.  assert
3d90: 28 20 6e 3d 3d 28 64 62 2d 3e 6e 53 61 76 65 70  ( n==(db->nSavep
3da0: 6f 69 6e 74 20 2b 20 64 62 2d 3e 69 73 54 72 61  oint + db->isTra
3db0: 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
3dc0: 74 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  t) );.  return 1
3dd0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
3de0: 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72  * Transfer error
3df0: 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 66 72   message text fr
3e00: 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74  om an sqlite3_vt
3e10: 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74  ab.zErrMsg (text
3e20: 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65   stored.** in me
3e30: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
3e40: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
3e50: 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a  c) into a Vdbe.z
3e60: 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f  ErrMsg (text sto
3e70: 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  red.** in memory
3e80: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
3e90: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e  qlite3DbMalloc).
3ea0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3eb0: 69 6d 70 6f 72 74 56 74 61 62 45 72 72 4d 73 67  importVtabErrMsg
3ec0: 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65  (Vdbe *p, sqlite
3ed0: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
3ee0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3ef0: 70 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33  p->db;.  sqlite3
3f00: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
3f10: 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
3f20: 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62  rMsg = sqlite3Db
3f30: 53 74 72 44 75 70 28 64 62 2c 20 70 56 74 61 62  StrDup(db, pVtab
3f40: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71  ->zErrMsg);.  sq
3f50: 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
3f60: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56  ->zErrMsg);.  pV
3f70: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
3f80: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  ;.}.../*.** Exec
3f90: 75 74 65 20 61 73 20 6d 75 63 68 20 6f 66 20 61  ute as much of a
3fa0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 73   VDBE program as
3fb0: 20 77 65 20 63 61 6e 20 74 68 65 6e 20 72 65 74   we can then ret
3fc0: 75 72 6e 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  urn..**.** sqlit
3fd0: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
3fe0: 29 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  ) must be called
3ff0: 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
4000: 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
4010: 0a 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 70 72  .** close the pr
4020: 6f 67 72 61 6d 20 77 69 74 68 20 61 20 66 69 6e  ogram with a fin
4030: 61 6c 20 4f 50 5f 48 61 6c 74 20 61 6e 64 20 74  al OP_Halt and t
4040: 6f 20 73 65 74 20 75 70 20 74 68 65 20 63 61 6c  o set up the cal
4050: 6c 62 61 63 6b 73 0a 2a 2a 20 61 6e 64 20 74 68  lbacks.** and th
4060: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
4070: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57  pointer..**.** W
4080: 68 65 6e 65 76 65 72 20 61 20 72 6f 77 20 6f 72  henever a row or
4090: 20 72 65 73 75 6c 74 20 64 61 74 61 20 69 73 20   result data is 
40a0: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20  available, this 
40b0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 65 69 74  routine will eit
40c0: 68 65 72 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  her.** invoke th
40d0: 65 20 72 65 73 75 6c 74 20 63 61 6c 6c 62 61 63  e result callbac
40e0: 6b 20 28 69 66 20 74 68 65 72 65 20 69 73 20 6f  k (if there is o
40f0: 6e 65 29 20 6f 72 20 72 65 74 75 72 6e 20 77 69  ne) or return wi
4100: 74 68 0a 2a 2a 20 53 51 4c 49 54 45 5f 52 4f 57  th.** SQLITE_ROW
4110: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 61 74  ..**.** If an at
4120: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
4130: 20 6f 70 65 6e 20 61 20 6c 6f 63 6b 65 64 20 64   open a locked d
4140: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68  atabase, then th
4150: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 69  is routine.** wi
4160: 6c 6c 20 65 69 74 68 65 72 20 69 6e 76 6f 6b 65  ll either invoke
4170: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
4180: 63 6b 20 28 69 66 20 74 68 65 72 65 20 69 73 20  ck (if there is 
4190: 6f 6e 65 29 20 6f 72 20 69 74 20 77 69 6c 6c 0a  one) or it will.
41a0: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
41b0: 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _BUSY..**.** If 
41c0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
41d0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
41e0: 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  e is written to 
41f0: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a  memory obtained.
4200: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ** from sqlite3_
4210: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 2d 3e  malloc() and p->
4220: 7a 45 72 72 4d 73 67 20 69 73 20 6d 61 64 65 20  zErrMsg is made 
4230: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
4240: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 20 54 68 65 20   memory..** The 
4250: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 74  error code is st
4260: 6f 72 65 64 20 69 6e 20 70 2d 3e 72 63 20 61 6e  ored in p->rc an
4270: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
4280: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 52  eturns SQLITE_ER
4290: 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ROR..**.** If th
42a0: 65 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72 20  e callback ever 
42b0: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
42c0: 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 67 72  , then the progr
42d0: 61 6d 20 65 78 69 74 73 0a 2a 2a 20 69 6d 6d 65  am exits.** imme
42e0: 64 69 61 74 65 6c 79 2e 20 20 54 68 65 72 65 20  diately.  There 
42f0: 77 69 6c 6c 20 62 65 20 6e 6f 20 65 72 72 6f 72  will be no error
4300: 20 6d 65 73 73 61 67 65 20 62 75 74 20 74 68 65   message but the
4310: 20 70 2d 3e 72 63 20 66 69 65 6c 64 20 69 73 0a   p->rc field is.
4320: 2a 2a 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  ** set to SQLITE
4330: 5f 41 42 4f 52 54 20 61 6e 64 20 74 68 69 73 20  _ABORT and this 
4340: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
4350: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
4360: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6d 65 6d 6f 72 79  ..**.** A memory
4370: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
4380: 72 20 63 61 75 73 65 73 20 70 2d 3e 72 63 20 74  r causes p->rc t
4390: 6f 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49  o be set to SQLI
43a0: 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 74 68 69  TE_NOMEM and thi
43b0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  s.** routine to 
43c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
43d0: 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ROR..**.** Other
43e0: 20 66 61 74 61 6c 20 65 72 72 6f 72 73 20 72 65   fatal errors re
43f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
4400: 52 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  R..**.** After t
4410: 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
4420: 66 69 6e 69 73 68 65 64 2c 20 73 71 6c 69 74 65  finished, sqlite
4430: 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 29 20  3VdbeFinalize() 
4440: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 73 65  should be.** use
4450: 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68  d to clean up th
4460: 65 20 6d 65 73 73 20 74 68 61 74 20 77 61 73 20  e mess that was 
4470: 6c 65 66 74 20 62 65 68 69 6e 64 2e 0a 2a 2f 0a  left behind..*/.
4480: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 45  int sqlite3VdbeE
4490: 78 65 63 28 0a 20 20 56 64 62 65 20 2a 70 20 20  xec(.  Vdbe *p  
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44b0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
44c0: 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3d 30 3b 20  .){.  int pc=0; 
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 2f 2a 20 54 68 65 20 70 72 6f 67 72 61 6d 20   /* The program 
44f0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4f 70 20  counter */.  Op 
4500: 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 20 20  *aOp = p->aOp;  
4510: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
4520: 6f 66 20 70 2d 3e 61 4f 70 20 2a 2f 0a 20 20 4f  of p->aOp */.  O
4530: 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20  p *pOp;         
4540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4550: 72 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a  rent operation *
4560: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
4570: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 2f  ITE_OK;        /
4580: 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
4590: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  n */.  sqlite3 *
45a0: 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20  db = p->db;     
45b0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
45c0: 65 20 2a 2f 0a 20 20 75 38 20 72 65 73 65 74 53  e */.  u8 resetS
45d0: 63 68 65 6d 61 4f 6e 46 61 75 6c 74 20 3d 20 30  chemaOnFault = 0
45e0: 3b 20 2f 2a 20 52 65 73 65 74 20 73 63 68 65 6d  ; /* Reset schem
45f0: 61 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72  a after an error
4600: 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a   if positive */.
4610: 20 20 75 38 20 65 6e 63 6f 64 69 6e 67 20 3d 20    u8 encoding = 
4620: 45 4e 43 28 64 62 29 3b 20 20 20 20 20 2f 2a 20  ENC(db);     /* 
4630: 54 68 65 20 64 61 74 61 62 61 73 65 20 65 6e 63  The database enc
4640: 6f 64 69 6e 67 20 2a 2f 0a 23 69 66 6e 64 65 66  oding */.#ifndef
4650: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
4660: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20  GRESS_CALLBACK. 
4670: 20 69 6e 74 20 63 68 65 63 6b 50 72 6f 67 72 65   int checkProgre
4680: 73 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ss;         /* T
4690: 72 75 65 20 69 66 20 70 72 6f 67 72 65 73 73 20  rue if progress 
46a0: 63 61 6c 6c 62 61 63 6b 73 20 61 72 65 20 65 6e  callbacks are en
46b0: 61 62 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  abled */.  int n
46c0: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b  ProgressOps = 0;
46d0: 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 73        /* Opcodes
46e0: 20 65 78 65 63 75 74 65 64 20 73 69 6e 63 65 20   executed since 
46f0: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
4700: 6b 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 4d  k. */.#endif.  M
4710: 65 6d 20 2a 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d  em *aMem = p->aM
4720: 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  em;       /* Cop
4730: 79 20 6f 66 20 70 2d 3e 61 4d 65 6d 20 2a 2f 0a  y of p->aMem */.
4740: 20 20 4d 65 6d 20 2a 70 49 6e 31 20 3d 20 30 3b    Mem *pIn1 = 0;
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4760: 31 73 74 20 69 6e 70 75 74 20 6f 70 65 72 61 6e  1st input operan
4770: 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 32  d */.  Mem *pIn2
4780: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
4790: 20 20 2f 2a 20 32 6e 64 20 69 6e 70 75 74 20 6f    /* 2nd input o
47a0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20  perand */.  Mem 
47b0: 2a 70 49 6e 33 20 3d 20 30 3b 20 20 20 20 20 20  *pIn3 = 0;      
47c0: 20 20 20 20 20 20 20 2f 2a 20 33 72 64 20 69 6e         /* 3rd in
47d0: 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  put operand */. 
47e0: 20 4d 65 6d 20 2a 70 4f 75 74 20 3d 20 30 3b 20   Mem *pOut = 0; 
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4800: 75 74 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f  utput operand */
4810: 0a 20 20 69 6e 74 20 69 43 6f 6d 70 61 72 65 20  .  int iCompare 
4820: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
4830: 20 52 65 73 75 6c 74 20 6f 66 20 6c 61 73 74 20   Result of last 
4840: 4f 50 5f 43 6f 6d 70 61 72 65 20 6f 70 65 72 61  OP_Compare opera
4850: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  tion */.  int *a
4860: 50 65 72 6d 75 74 65 20 3d 20 30 3b 20 20 20 20  Permute = 0;    
4870: 20 20 20 20 20 2f 2a 20 50 65 72 6d 75 74 61 74       /* Permutat
4880: 69 6f 6e 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66  ion of columns f
4890: 6f 72 20 4f 50 5f 43 6f 6d 70 61 72 65 20 2a 2f  or OP_Compare */
48a0: 0a 20 20 69 36 34 20 6c 61 73 74 52 6f 77 69 64  .  i64 lastRowid
48b0: 20 3d 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64   = db->lastRowid
48c0: 3b 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75  ;  /* Saved valu
48d0: 65 20 6f 66 20 74 68 65 20 6c 61 73 74 20 69 6e  e of the last in
48e0: 73 65 72 74 20 52 4f 57 49 44 20 2a 2f 0a 23 69  sert ROWID */.#i
48f0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
4900: 45 0a 20 20 75 36 34 20 73 74 61 72 74 3b 20 20  E.  u64 start;  
4910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4920: 2a 20 43 50 55 20 63 6c 6f 63 6b 20 63 6f 75 6e  * CPU clock coun
4930: 74 20 61 74 20 73 74 61 72 74 20 6f 66 20 6f 70  t at start of op
4940: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  code */.  int or
4950: 69 67 50 63 3b 20 20 20 20 20 20 20 20 20 20 20  igPc;           
4960: 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20       /* Program 
4970: 63 6f 75 6e 74 65 72 20 61 74 20 73 74 61 72 74  counter at start
4980: 20 6f 66 20 6f 70 63 6f 64 65 20 2a 2f 0a 23 65   of opcode */.#e
4990: 6e 64 69 66 0a 20 20 2f 2a 2a 2a 20 49 4e 53 45  ndif.  /*** INSE
49a0: 52 54 20 53 54 41 43 4b 20 55 4e 49 4f 4e 20 48  RT STACK UNION H
49b0: 45 52 45 20 2a 2a 2a 2f 0a 0a 20 20 61 73 73 65  ERE ***/..  asse
49c0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
49d0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 20  BE_MAGIC_RUN ); 
49e0: 20 2f 2a 20 73 71 6c 69 74 65 33 5f 73 74 65 70   /* sqlite3_step
49f0: 28 29 20 76 65 72 69 66 69 65 73 20 74 68 69 73  () verifies this
4a00: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
4a10: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
4a20: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   p->rc==SQLITE_N
4a30: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54  OMEM ){.    /* T
4a40: 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61  his happens if a
4a50: 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65   malloc() inside
4a60: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
4a70: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29  e3_column_text()
4a80: 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   or.    ** sqlit
4a90: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
4aa0: 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20  () failed.  */. 
4ab0: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
4ac0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
4ad0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
4ae0: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
4af0: 42 55 53 59 20 29 3b 0a 20 20 70 2d 3e 72 63 20  BUSY );.  p->rc 
4b00: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
4b10: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
4b20: 6e 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 52 65  n==0 );.  p->pRe
4b30: 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 20 20 64  sultSet = 0;.  d
4b40: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e  b->busyHandler.n
4b50: 42 75 73 79 20 3d 20 30 3b 0a 20 20 43 48 45 43  Busy = 0;.  CHEC
4b60: 4b 5f 46 4f 52 5f 49 4e 54 45 52 52 55 50 54 3b  K_FOR_INTERRUPT;
4b70: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f  .  sqlite3VdbeIO
4b80: 54 72 61 63 65 53 71 6c 28 70 29 3b 0a 23 69 66  TraceSql(p);.#if
4b90: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4ba0: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
4bb0: 43 4b 0a 20 20 63 68 65 63 6b 50 72 6f 67 72 65  CK.  checkProgre
4bc0: 73 73 20 3d 20 64 62 2d 3e 78 50 72 6f 67 72 65  ss = db->xProgre
4bd0: 73 73 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 23 69  ss!=0;.#endif.#i
4be0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4bf0: 47 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  G.  sqlite3Begin
4c00: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
4c10: 20 20 69 66 28 20 70 2d 3e 70 63 3d 3d 30 20 20    if( p->pc==0  
4c20: 26 26 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  && (p->db->flags
4c30: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 4c 69   & SQLITE_VdbeLi
4c40: 73 74 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20  sting)!=0 ){.   
4c50: 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 72 69 6e   int i;.    prin
4c60: 74 66 28 22 56 44 42 45 20 50 72 6f 67 72 61 6d  tf("VDBE Program
4c70: 20 4c 69 73 74 69 6e 67 3a 5c 6e 22 29 3b 0a 20   Listing:\n");. 
4c80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
4c90: 69 6e 74 53 71 6c 28 70 29 3b 0a 20 20 20 20 66  intSql(p);.    f
4ca0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
4cb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
4cc0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
4cd0: 28 73 74 64 6f 75 74 2c 20 69 2c 20 26 61 4f 70  (stdout, i, &aOp
4ce0: 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  [i]);.    }.  }.
4cf0: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
4d00: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 65 6e 64  gnMalloc();.#end
4d10: 69 66 0a 20 20 66 6f 72 28 70 63 3d 70 2d 3e 70  if.  for(pc=p->p
4d20: 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  c; rc==SQLITE_OK
4d30: 3b 20 70 63 2b 2b 29 7b 0a 20 20 20 20 61 73 73  ; pc++){.    ass
4d40: 65 72 74 28 20 70 63 3e 3d 30 20 26 26 20 70 63  ert( pc>=0 && pc
4d50: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 20 20 69  <p->nOp );.    i
4d60: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
4d70: 6c 65 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  led ) goto no_me
4d80: 6d 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  m;.#ifdef VDBE_P
4d90: 52 4f 46 49 4c 45 0a 20 20 20 20 6f 72 69 67 50  ROFILE.    origP
4da0: 63 20 3d 20 70 63 3b 0a 20 20 20 20 73 74 61 72  c = pc;.    star
4db0: 74 20 3d 20 73 71 6c 69 74 65 33 48 77 74 69 6d  t = sqlite3Hwtim
4dc0: 65 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  e();.#endif.    
4dd0: 70 4f 70 20 3d 20 26 61 4f 70 5b 70 63 5d 3b 0a  pOp = &aOp[pc];.
4de0: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c  .    /* Only all
4df0: 6f 77 20 74 72 61 63 69 6e 67 20 69 66 20 53 51  ow tracing if SQ
4e00: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
4e10: 66 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 69  fined..    */.#i
4e20: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4e30: 47 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 72 61  G.    if( p->tra
4e40: 63 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ce ){.      if( 
4e50: 70 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pc==0 ){.       
4e60: 20 70 72 69 6e 74 66 28 22 56 44 42 45 20 45 78   printf("VDBE Ex
4e70: 65 63 75 74 69 6f 6e 20 54 72 61 63 65 3a 5c 6e  ecution Trace:\n
4e80: 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ");.        sqli
4e90: 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28  te3VdbePrintSql(
4ea0: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
4eb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
4ec0: 6e 74 4f 70 28 70 2d 3e 74 72 61 63 65 2c 20 70  ntOp(p->trace, p
4ed0: 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 7d 0a 23  c, pOp);.    }.#
4ee0: 65 6e 64 69 66 0a 20 20 20 20 20 20 0a 0a 20 20  endif.      ..  
4ef0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
4f00: 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
4f10: 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6e 74 65  simulate an inte
4f20: 72 72 75 70 74 2e 20 20 54 68 69 73 20 6f 6e 6c  rrupt.  This onl
4f30: 79 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a  y happens.    **
4f40: 20 69 66 20 77 65 20 68 61 76 65 20 61 20 73 70   if we have a sp
4f50: 65 63 69 61 6c 20 74 65 73 74 20 62 75 69 6c 64  ecial test build
4f60: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20  ..    */.#ifdef 
4f70: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
4f80: 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  if( sqlite3_inte
4f90: 72 72 75 70 74 5f 63 6f 75 6e 74 3e 30 20 29 7b  rrupt_count>0 ){
4fa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
4fb0: 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 2d 2d  nterrupt_count--
4fc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
4fd0: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f  te3_interrupt_co
4fe0: 75 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  unt==0 ){.      
4ff0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72    sqlite3_interr
5000: 75 70 74 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  upt(db);.      }
5010: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  .    }.#endif..#
5020: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5030: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
5040: 42 41 43 4b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c  BACK.    /* Call
5050: 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   the progress ca
5060: 6c 6c 62 61 63 6b 20 69 66 20 69 74 20 69 73 20  llback if it is 
5070: 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 74  configured and t
5080: 68 65 20 72 65 71 75 69 72 65 64 20 6e 75 6d 62  he required numb
5090: 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 56 44 42  er.    ** of VDB
50a0: 45 20 6f 70 73 20 68 61 76 65 20 62 65 65 6e 20  E ops have been 
50b0: 65 78 65 63 75 74 65 64 20 28 65 69 74 68 65 72  executed (either
50c0: 20 73 69 6e 63 65 20 74 68 69 73 20 69 6e 76 6f   since this invo
50d0: 63 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 2a 2a  cation of.    **
50e0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
50f0: 28 29 20 6f 72 20 73 69 6e 63 65 20 6c 61 73 74  () or since last
5100: 20 74 69 6d 65 20 74 68 65 20 70 72 6f 67 72 65   time the progre
5110: 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 61 73 20  ss callback was 
5120: 63 61 6c 6c 65 64 29 2e 0a 20 20 20 20 2a 2a 20  called)..    ** 
5130: 49 66 20 74 68 65 20 70 72 6f 67 72 65 73 73 20  If the progress 
5140: 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
5150: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 65 78 69 74 20   non-zero, exit 
5160: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
5170: 69 6e 65 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ine with.    ** 
5180: 61 20 72 65 74 75 72 6e 20 63 6f 64 65 20 53 51  a return code SQ
5190: 4c 49 54 45 5f 41 42 4f 52 54 2e 0a 20 20 20 20  LITE_ABORT..    
51a0: 2a 2f 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b  */.    if( check
51b0: 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
51c0: 20 20 69 66 28 20 64 62 2d 3e 6e 50 72 6f 67 72    if( db->nProgr
51d0: 65 73 73 4f 70 73 3d 3d 6e 50 72 6f 67 72 65 73  essOps==nProgres
51e0: 73 4f 70 73 20 29 7b 0a 20 20 20 20 20 20 20 20  sOps ){.        
51f0: 69 6e 74 20 70 72 63 3b 0a 20 20 20 20 20 20 20  int prc;.       
5200: 20 70 72 63 20 3d 20 64 62 2d 3e 78 50 72 6f 67   prc = db->xProg
5210: 72 65 73 73 28 64 62 2d 3e 70 50 72 6f 67 72 65  ress(db->pProgre
5220: 73 73 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20  ssArg);.        
5230: 69 66 28 20 70 72 63 21 3d 30 20 29 7b 0a 20 20  if( prc!=0 ){.  
5240: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
5250: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20  ITE_INTERRUPT;. 
5260: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64           goto vd
5270: 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 20  be_error_halt;. 
5280: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5290: 20 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20   nProgressOps = 
52a0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
52b0: 20 6e 50 72 6f 67 72 65 73 73 4f 70 73 2b 2b 3b   nProgressOps++;
52c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
52d0: 20 20 20 2f 2a 20 4f 6e 20 61 6e 79 20 6f 70 63     /* On any opc
52e0: 6f 64 65 20 77 69 74 68 20 74 68 65 20 22 6f 75  ode with the "ou
52f0: 74 32 2d 70 72 65 72 65 6c 61 73 65 22 20 74 61  t2-prerelase" ta
5300: 67 2c 20 66 72 65 65 20 61 6e 79 0a 20 20 20 20  g, free any.    
5310: 2a 2a 20 65 78 74 65 72 6e 61 6c 20 61 6c 6c 6f  ** external allo
5320: 63 61 74 69 6f 6e 73 20 6f 75 74 20 6f 66 20 6d  cations out of m
5330: 65 6d 5b 70 32 5d 20 61 6e 64 20 73 65 74 20 6d  em[p2] and set m
5340: 65 6d 5b 70 32 5d 20 74 6f 20 62 65 0a 20 20 20  em[p2] to be.   
5350: 20 2a 2a 20 61 6e 20 75 6e 64 65 66 69 6e 65 64   ** an undefined
5360: 20 69 6e 74 65 67 65 72 2e 20 20 4f 70 63 6f 64   integer.  Opcod
5370: 65 73 20 77 69 6c 6c 20 65 69 74 68 65 72 20 66  es will either f
5380: 69 6c 6c 20 69 6e 20 74 68 65 20 69 6e 74 65 67  ill in the integ
5390: 65 72 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 20  er.    ** value 
53a0: 6f 72 20 63 6f 6e 76 65 72 74 20 6d 65 6d 5b 70  or convert mem[p
53b0: 32 5d 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  2] to a differen
53c0: 74 20 74 79 70 65 2e 0a 20 20 20 20 2a 2f 0a 20  t type..    */. 
53d0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
53e0: 6f 70 66 6c 61 67 73 3d 3d 73 71 6c 69 74 65 33  opflags==sqlite3
53f0: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70  OpcodeProperty[p
5400: 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 29 3b 0a 20  Op->opcode] );. 
5410: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 66 6c     if( pOp->opfl
5420: 61 67 73 20 26 20 4f 50 46 4c 47 5f 4f 55 54 32  ags & OPFLG_OUT2
5430: 5f 50 52 45 52 45 4c 45 41 53 45 20 29 7b 0a 20  _PRERELEASE ){. 
5440: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
5450: 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20 20 20  ->p2>0 );.      
5460: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c  assert( pOp->p2<
5470: 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20  =p->nMem );.    
5480: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
5490: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 20 20 6d  Op->p2];.      m
54a0: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
54b0: 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 20 20  p, pOut);.      
54c0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
54d0: 6c 65 61 73 65 45 78 74 65 72 6e 61 6c 28 70 4f  leaseExternal(pO
54e0: 75 74 29 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  ut);.      pOut-
54f0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
5500: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5510: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
5520: 6f 6e 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64  on other operand
5530: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
5540: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28  TE_DEBUG.    if(
5550: 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26   (pOp->opflags &
5560: 20 4f 50 46 4c 47 5f 49 4e 31 29 21 3d 30 20 29   OPFLG_IN1)!=0 )
5570: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5580: 70 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20 20 20  pOp->p1>0 );.   
5590: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
55a0: 70 31 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  p1<=p->nMem );. 
55b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
55c0: 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f  IsValid(&aMem[pO
55d0: 70 2d 3e 70 31 5d 29 20 29 3b 0a 20 20 20 20 20  p->p1]) );.     
55e0: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
55f0: 70 4f 70 2d 3e 70 31 2c 20 26 61 4d 65 6d 5b 70  pOp->p1, &aMem[p
5600: 4f 70 2d 3e 70 31 5d 29 3b 0a 20 20 20 20 7d 0a  Op->p1]);.    }.
5610: 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70      if( (pOp->op
5620: 66 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 49 4e  flags & OPFLG_IN
5630: 32 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  2)!=0 ){.      a
5640: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30  ssert( pOp->p2>0
5650: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
5660: 28 20 70 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d  ( pOp->p2<=p->nM
5670: 65 6d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  em );.      asse
5680: 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26  rt( memIsValid(&
5690: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 20 29  aMem[pOp->p2]) )
56a0: 3b 0a 20 20 20 20 20 20 52 45 47 49 53 54 45 52  ;.      REGISTER
56b0: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20  _TRACE(pOp->p2, 
56c0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b  &aMem[pOp->p2]);
56d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
56e0: 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f  pOp->opflags & O
56f0: 50 46 4c 47 5f 49 4e 33 29 21 3d 30 20 29 7b 0a  PFLG_IN3)!=0 ){.
5700: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
5710: 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20 20  p->p3>0 );.     
5720: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
5730: 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20  <=p->nMem );.   
5740: 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
5750: 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d  Valid(&aMem[pOp-
5760: 3e 70 33 5d 29 20 29 3b 0a 20 20 20 20 20 20 52  >p3]) );.      R
5770: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
5780: 70 2d 3e 70 33 2c 20 26 61 4d 65 6d 5b 70 4f 70  p->p3, &aMem[pOp
5790: 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ->p3]);.    }.  
57a0: 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c    if( (pOp->opfl
57b0: 61 67 73 20 26 20 4f 50 46 4c 47 5f 4f 55 54 32  ags & OPFLG_OUT2
57c0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  )!=0 ){.      as
57d0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20  sert( pOp->p2>0 
57e0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
57f0: 20 70 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d 65   pOp->p2<=p->nMe
5800: 6d 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62  m );.      memAb
5810: 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 26  outToChange(p, &
5820: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b 0a  aMem[pOp->p2]);.
5830: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
5840: 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50  Op->opflags & OP
5850: 46 4c 47 5f 4f 55 54 33 29 21 3d 30 20 29 7b 0a  FLG_OUT3)!=0 ){.
5860: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
5870: 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20 20  p->p3>0 );.     
5880: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
5890: 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20  <=p->nMem );.   
58a0: 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61     memAboutToCha
58b0: 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70  nge(p, &aMem[pOp
58c0: 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 7d 0a 23 65  ->p3]);.    }.#e
58d0: 6e 64 69 66 0a 20 20 0a 20 20 20 20 73 77 69 74  ndif.  .    swit
58e0: 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ch( pOp->opcode 
58f0: 29 7b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ){../***********
5900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5940: 2a 2a 0a 2a 2a 20 57 68 61 74 20 66 6f 6c 6c 6f  **.** What follo
5950: 77 73 20 69 73 20 61 20 6d 61 73 73 69 76 65 20  ws is a massive 
5960: 73 77 69 74 63 68 20 73 74 61 74 65 6d 65 6e 74  switch statement
5970: 20 77 68 65 72 65 20 65 61 63 68 20 63 61 73 65   where each case
5980: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 0a 2a 2a   implements a.**
5990: 20 73 65 70 61 72 61 74 65 20 69 6e 73 74 72 75   separate instru
59a0: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 69 72  ction in the vir
59b0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 49  tual machine.  I
59c0: 66 20 77 65 20 66 6f 6c 6c 6f 77 20 74 68 65 20  f we follow the 
59d0: 75 73 75 61 6c 0a 2a 2a 20 69 6e 64 65 6e 74 61  usual.** indenta
59e0: 74 69 6f 6e 20 63 6f 6e 76 65 6e 74 69 6f 6e 73  tion conventions
59f0: 2c 20 65 61 63 68 20 63 61 73 65 20 73 68 6f 75  , each case shou
5a00: 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64 20 62  ld be indented b
5a10: 79 20 36 20 73 70 61 63 65 73 2e 20 20 42 75 74  y 6 spaces.  But
5a20: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 20 6c 6f  .** that is a lo
5a30: 74 20 6f 66 20 77 61 73 74 65 64 20 73 70 61 63  t of wasted spac
5a40: 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 6d 61  e on the left ma
5a50: 72 67 69 6e 2e 20 20 53 6f 20 74 68 65 20 63 6f  rgin.  So the co
5a60: 64 65 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65  de within.** the
5a70: 20 73 77 69 74 63 68 20 73 74 61 74 65 6d 65 6e   switch statemen
5a80: 74 20 77 69 6c 6c 20 62 72 65 61 6b 20 77 69 74  t will break wit
5a90: 68 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 61 6e 64  h convention and
5aa0: 20 62 65 20 66 6c 75 73 68 2d 6c 65 66 74 2e 20   be flush-left. 
5ab0: 41 6e 6f 74 68 65 72 0a 2a 2a 20 62 69 67 20 63  Another.** big c
5ac0: 6f 6d 6d 65 6e 74 20 28 73 69 6d 69 6c 61 72 20  omment (similar 
5ad0: 74 6f 20 74 68 69 73 20 6f 6e 65 29 20 77 69 6c  to this one) wil
5ae0: 6c 20 6d 61 72 6b 20 74 68 65 20 70 6f 69 6e 74  l mark the point
5af0: 20 69 6e 20 74 68 65 20 63 6f 64 65 20 77 68 65   in the code whe
5b00: 72 65 0a 2a 2a 20 77 65 20 74 72 61 6e 73 69 74  re.** we transit
5b10: 69 6f 6e 20 62 61 63 6b 20 74 6f 20 6e 6f 72 6d  ion back to norm
5b20: 61 6c 20 69 6e 64 65 6e 74 61 74 69 6f 6e 2e 0a  al indentation..
5b30: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
5b40: 74 69 6e 67 20 6f 66 20 65 61 63 68 20 63 61 73  ting of each cas
5b50: 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  e is important. 
5b60: 20 54 68 65 20 6d 61 6b 65 66 69 6c 65 20 66 6f   The makefile fo
5b70: 72 20 53 51 4c 69 74 65 0a 2a 2a 20 67 65 6e 65  r SQLite.** gene
5b80: 72 61 74 65 73 20 74 77 6f 20 43 20 66 69 6c 65  rates two C file
5b90: 73 20 22 6f 70 63 6f 64 65 73 2e 68 22 20 61 6e  s "opcodes.h" an
5ba0: 64 20 22 6f 70 63 6f 64 65 73 2e 63 22 20 62 79  d "opcodes.c" by
5bb0: 20 73 63 61 6e 6e 69 6e 67 20 74 68 69 73 0a 2a   scanning this.*
5bc0: 2a 20 66 69 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66  * file looking f
5bd0: 6f 72 20 6c 69 6e 65 73 20 74 68 61 74 20 62 65  or lines that be
5be0: 67 69 6e 20 77 69 74 68 20 22 63 61 73 65 20 4f  gin with "case O
5bf0: 50 5f 22 2e 20 20 54 68 65 20 6f 70 63 6f 64 65  P_".  The opcode
5c00: 73 2e 68 20 66 69 6c 65 73 0a 2a 2a 20 77 69 6c  s.h files.** wil
5c10: 6c 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68  l be filled with
5c20: 20 23 64 65 66 69 6e 65 73 20 74 68 61 74 20 67   #defines that g
5c30: 69 76 65 20 75 6e 69 71 75 65 20 69 6e 74 65 67  ive unique integ
5c40: 65 72 20 76 61 6c 75 65 73 20 74 6f 20 65 61 63  er values to eac
5c50: 68 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 6e 64 20  h.** opcode and 
5c60: 74 68 65 20 6f 70 63 6f 64 65 73 2e 63 20 66 69  the opcodes.c fi
5c70: 6c 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  le is filled wit
5c80: 68 20 61 6e 20 61 72 72 61 79 20 6f 66 20 73 74  h an array of st
5c90: 72 69 6e 67 73 20 77 68 65 72 65 0a 2a 2a 20 65  rings where.** e
5ca0: 61 63 68 20 73 74 72 69 6e 67 20 69 73 20 74 68  ach string is th
5cb0: 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20  e symbolic name 
5cc0: 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  for the correspo
5cd0: 6e 64 69 6e 67 20 6f 70 63 6f 64 65 2e 20 20 49  nding opcode.  I
5ce0: 66 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 73 74  f the.** case st
5cf0: 61 74 65 6d 65 6e 74 20 69 73 20 66 6f 6c 6c 6f  atement is follo
5d00: 77 65 64 20 62 79 20 61 20 63 6f 6d 6d 65 6e 74  wed by a comment
5d10: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2f 23   of the form "/#
5d20: 20 73 61 6d 65 20 61 73 20 2e 2e 2e 20 23 2f 22   same as ... #/"
5d30: 0a 2a 2a 20 74 68 61 74 20 63 6f 6d 6d 65 6e 74  .** that comment
5d40: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
5d50: 72 6d 69 6e 65 20 74 68 65 20 70 61 72 74 69 63  rmine the partic
5d60: 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68  ular value of th
5d70: 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  e opcode..**.** 
5d80: 4f 74 68 65 72 20 6b 65 79 77 6f 72 64 73 20 69  Other keywords i
5d90: 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 68  n the comment th
5da0: 61 74 20 66 6f 6c 6c 6f 77 73 20 65 61 63 68 20  at follows each 
5db0: 63 61 73 65 20 61 72 65 20 75 73 65 64 20 74 6f  case are used to
5dc0: 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 74 68  .** construct th
5dd0: 65 20 4f 50 46 4c 47 5f 49 4e 49 54 49 41 4c 49  e OPFLG_INITIALI
5de0: 5a 45 52 20 76 61 6c 75 65 20 74 68 61 74 20 69  ZER value that i
5df0: 6e 69 74 69 61 6c 69 7a 65 73 20 6f 70 63 6f 64  nitializes opcod
5e00: 65 50 72 6f 70 65 72 74 79 5b 5d 2e 0a 2a 2a 20  eProperty[]..** 
5e10: 4b 65 79 77 6f 72 64 73 20 69 6e 63 6c 75 64 65  Keywords include
5e20: 3a 20 69 6e 31 2c 20 69 6e 32 2c 20 69 6e 33 2c  : in1, in2, in3,
5e30: 20 6f 75 74 32 5f 70 72 65 72 65 6c 65 61 73 65   out2_prerelease
5e40: 2c 20 6f 75 74 32 2c 20 6f 75 74 33 2e 20 20 53  , out2, out3.  S
5e50: 65 65 0a 2a 2a 20 74 68 65 20 6d 6b 6f 70 63 6f  ee.** the mkopco
5e60: 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 66  deh.awk script f
5e70: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
5e80: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
5e90: 20 44 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 61   Documentation a
5ea0: 62 6f 75 74 20 56 44 42 45 20 6f 70 63 6f 64 65  bout VDBE opcode
5eb0: 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  s is generated b
5ec0: 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 69 73 20  y scanning this 
5ed0: 66 69 6c 65 0a 2a 2a 20 66 6f 72 20 6c 69 6e 65  file.** for line
5ee0: 73 20 6f 66 20 74 68 61 74 20 63 6f 6e 74 61 69  s of that contai
5ef0: 6e 20 22 4f 70 63 6f 64 65 3a 22 2e 20 20 54 68  n "Opcode:".  Th
5f00: 61 74 20 6c 69 6e 65 20 61 6e 64 20 61 6c 6c 20  at line and all 
5f10: 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 63 6f  subsequent.** co
5f20: 6d 6d 65 6e 74 20 6c 69 6e 65 73 20 61 72 65 20  mment lines are 
5f30: 75 73 65 64 20 69 6e 20 74 68 65 20 67 65 6e 65  used in the gene
5f40: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70  ration of the op
5f50: 63 6f 64 65 2e 68 74 6d 6c 20 64 6f 63 75 6d 65  code.html docume
5f60: 6e 74 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2e  ntation.** file.
5f70: 0a 2a 2a 0a 2a 2a 20 53 55 4d 4d 41 52 59 3a 0a  .**.** SUMMARY:.
5f80: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 6d 61 74  **.**     Format
5f90: 74 69 6e 67 20 69 73 20 69 6d 70 6f 72 74 61 6e  ting is importan
5fa0: 74 20 74 6f 20 73 63 72 69 70 74 73 20 74 68 61  t to scripts tha
5fb0: 74 20 73 63 61 6e 20 74 68 69 73 20 66 69 6c 65  t scan this file
5fc0: 2e 0a 2a 2a 20 20 20 20 20 44 6f 20 6e 6f 74 20  ..**     Do not 
5fd0: 64 65 76 69 61 74 65 20 66 72 6f 6d 20 74 68 65  deviate from the
5fe0: 20 66 6f 72 6d 61 74 74 69 6e 67 20 73 74 79 6c   formatting styl
5ff0: 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
6000: 73 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  se..**.*********
6010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6050: 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ****/../* Opcode
6060: 3a 20 20 47 6f 74 6f 20 2a 20 50 32 20 2a 20 2a  :  Goto * P2 * *
6070: 20 2a 0a 2a 2a 0a 2a 2a 20 41 6e 20 75 6e 63 6f   *.**.** An unco
6080: 6e 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74  nditional jump t
6090: 6f 20 61 64 64 72 65 73 73 20 50 32 2e 0a 2a 2a  o address P2..**
60a0: 20 54 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   The next instru
60b0: 63 74 69 6f 6e 20 65 78 65 63 75 74 65 64 20 77  ction executed w
60c0: 69 6c 6c 20 62 65 20 0a 2a 2a 20 74 68 65 20 6f  ill be .** the o
60d0: 6e 65 20 61 74 20 69 6e 64 65 78 20 50 32 20 66  ne at index P2 f
60e0: 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
60f0: 67 20 6f 66 0a 2a 2a 20 74 68 65 20 70 72 6f 67  g of.** the prog
6100: 72 61 6d 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ram..*/.case OP_
6110: 47 6f 74 6f 3a 20 7b 20 20 20 20 20 20 20 20 20  Goto: {         
6120: 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20      /* jump */. 
6130: 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52   CHECK_FOR_INTER
6140: 52 55 50 54 3b 0a 20 20 70 63 20 3d 20 70 4f 70  RUPT;.  pc = pOp
6150: 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 62 72 65 61  ->p2 - 1;.  brea
6160: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
6170: 20 20 47 6f 73 75 62 20 50 31 20 50 32 20 2a 20    Gosub P1 P2 * 
6180: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  * *.**.** Write 
6190: 74 68 65 20 63 75 72 72 65 6e 74 20 61 64 64 72  the current addr
61a0: 65 73 73 20 6f 6e 74 6f 20 72 65 67 69 73 74 65  ess onto registe
61b0: 72 20 50 31 0a 2a 2a 20 61 6e 64 20 74 68 65 6e  r P1.** and then
61c0: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73   jump to address
61d0: 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
61e0: 47 6f 73 75 62 3a 20 7b 20 20 20 20 20 20 20 20  Gosub: {        
61f0: 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31      /* jump, in1
6200: 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
6210: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  em[pOp->p1];.  a
6220: 73 73 65 72 74 28 20 28 70 49 6e 31 2d 3e 66 6c  ssert( (pIn1->fl
6230: 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d  ags & MEM_Dyn)==
6240: 30 20 29 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54  0 );.  memAboutT
6250: 6f 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29  oChange(p, pIn1)
6260: 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  ;.  pIn1->flags 
6270: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 70 49 6e  = MEM_Int;.  pIn
6280: 31 2d 3e 75 2e 69 20 3d 20 70 63 3b 0a 20 20 52  1->u.i = pc;.  R
6290: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
62a0: 70 2d 3e 70 31 2c 20 70 49 6e 31 29 3b 0a 20 20  p->p1, pIn1);.  
62b0: 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
62c0: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
62d0: 20 4f 70 63 6f 64 65 3a 20 20 52 65 74 75 72 6e   Opcode:  Return
62e0: 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
62f0: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65  * Jump to the ne
6300: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  xt instruction a
6310: 66 74 65 72 20 74 68 65 20 61 64 64 72 65 73 73  fter the address
6320: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
6330: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 74 75  .*/.case OP_Retu
6340: 72 6e 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  rn: {           
6350: 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31  /* in1 */.  pIn1
6360: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
6370: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ];.  assert( pIn
6380: 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  1->flags & MEM_I
6390: 6e 74 20 29 3b 0a 20 20 70 63 20 3d 20 28 69 6e  nt );.  pc = (in
63a0: 74 29 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 62  t)pIn1->u.i;.  b
63b0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
63c0: 64 65 3a 20 20 59 69 65 6c 64 20 50 31 20 2a 20  de:  Yield P1 * 
63d0: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 77 61 70  * * *.**.** Swap
63e0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75   the program cou
63f0: 6e 74 65 72 20 77 69 74 68 20 74 68 65 20 76 61  nter with the va
6400: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
6410: 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 59  P1..*/.case OP_Y
6420: 69 65 6c 64 3a 20 7b 20 20 20 20 20 20 20 20 20  ield: {         
6430: 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 69     /* in1 */.  i
6440: 6e 74 20 70 63 44 65 73 74 3b 0a 20 20 70 49 6e  nt pcDest;.  pIn
6450: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
6460: 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  1];.  assert( (p
6470: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
6480: 5f 44 79 6e 29 3d 3d 30 20 29 3b 0a 20 20 70 49  _Dyn)==0 );.  pI
6490: 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  n1->flags = MEM_
64a0: 49 6e 74 3b 0a 20 20 70 63 44 65 73 74 20 3d 20  Int;.  pcDest = 
64b0: 28 69 6e 74 29 70 49 6e 31 2d 3e 75 2e 69 3b 0a  (int)pIn1->u.i;.
64c0: 20 20 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 70 63    pIn1->u.i = pc
64d0: 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41  ;.  REGISTER_TRA
64e0: 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70 49 6e 31  CE(pOp->p1, pIn1
64f0: 29 3b 0a 20 20 70 63 20 3d 20 70 63 44 65 73 74  );.  pc = pcDest
6500: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
6510: 20 4f 70 63 6f 64 65 3a 20 20 48 61 6c 74 49 66   Opcode:  HaltIf
6520: 4e 75 6c 6c 20 20 50 31 20 50 32 20 50 33 20 50  Null  P1 P2 P3 P
6530: 34 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20  4 *.**.** Check 
6540: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
6550: 69 73 74 65 72 20 50 33 2e 20 20 49 66 20 69 74  ister P3.  If it
6560: 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 48 61   is NULL then Ha
6570: 6c 74 20 75 73 69 6e 67 0a 2a 2a 20 70 61 72 61  lt using.** para
6580: 6d 65 74 65 72 20 50 31 2c 20 50 32 2c 20 61 6e  meter P1, P2, an
6590: 64 20 50 34 20 61 73 20 69 66 20 74 68 69 73 20  d P4 as if this 
65a0: 77 65 72 65 20 61 20 48 61 6c 74 20 69 6e 73 74  were a Halt inst
65b0: 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  ruction.  If the
65c0: 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20 72 65 67  .** value in reg
65d0: 69 73 74 65 72 20 50 33 20 69 73 20 6e 6f 74 20  ister P3 is not 
65e0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
65f0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
6600: 6f 70 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 48  op..*/.case OP_H
6610: 61 6c 74 49 66 4e 75 6c 6c 3a 20 7b 20 20 20 20  altIfNull: {    
6620: 20 20 2f 2a 20 69 6e 33 20 2a 2f 0a 20 20 70 49    /* in3 */.  pI
6630: 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n3 = &aMem[pOp->
6640: 70 33 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 33  p3];.  if( (pIn3
6650: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
6660: 6c 6c 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ll)==0 ) break;.
6670: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
6680: 68 20 69 6e 74 6f 20 4f 50 5f 48 61 6c 74 20 2a  h into OP_Halt *
6690: 2f 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  /.}../* Opcode: 
66a0: 20 48 61 6c 74 20 50 31 20 50 32 20 2a 20 50 34   Halt P1 P2 * P4
66b0: 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 69 74 20 69 6d   *.**.** Exit im
66c0: 6d 65 64 69 61 74 65 6c 79 2e 20 20 41 6c 6c 20  mediately.  All 
66d0: 6f 70 65 6e 20 63 75 72 73 6f 72 73 2c 20 65 74  open cursors, et
66e0: 63 20 61 72 65 20 63 6c 6f 73 65 64 0a 2a 2a 20  c are closed.** 
66f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a  automatically..*
6700: 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20 72  *.** P1 is the r
6710: 65 73 75 6c 74 20 63 6f 64 65 20 72 65 74 75 72  esult code retur
6720: 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 65  ned by sqlite3_e
6730: 78 65 63 28 29 2c 20 73 71 6c 69 74 65 33 5f 72  xec(), sqlite3_r
6740: 65 73 65 74 28 29 2c 0a 2a 2a 20 6f 72 20 73 71  eset(),.** or sq
6750: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29  lite3_finalize()
6760: 2e 20 20 46 6f 72 20 61 20 6e 6f 72 6d 61 6c 20  .  For a normal 
6770: 68 61 6c 74 2c 20 74 68 69 73 20 73 68 6f 75 6c  halt, this shoul
6780: 64 20 62 65 20 53 51 4c 49 54 45 5f 4f 4b 20 28  d be SQLITE_OK (
6790: 30 29 2e 0a 2a 2a 20 46 6f 72 20 65 72 72 6f 72  0)..** For error
67a0: 73 2c 20 69 74 20 63 61 6e 20 62 65 20 73 6f 6d  s, it can be som
67b0: 65 20 6f 74 68 65 72 20 76 61 6c 75 65 2e 20 20  e other value.  
67c0: 49 66 20 50 31 21 3d 30 20 74 68 65 6e 20 50 32  If P1!=0 then P2
67d0: 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65 0a   will determine.
67e0: 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
67f0: 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  t to rollback th
6800: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
6810: 63 74 69 6f 6e 2e 20 20 44 6f 20 6e 6f 74 20 72  ction.  Do not r
6820: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 50 32  ollback.** if P2
6830: 3d 3d 4f 45 5f 46 61 69 6c 2e 20 44 6f 20 74 68  ==OE_Fail. Do th
6840: 65 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 50 32  e rollback if P2
6850: 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 2e 20 20  ==OE_Rollback.  
6860: 49 66 20 50 32 3d 3d 4f 45 5f 41 62 6f 72 74 2c  If P2==OE_Abort,
6870: 0a 2a 2a 20 74 68 65 6e 20 62 61 63 6b 20 6f 75  .** then back ou
6880: 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 68  t all changes th
6890: 61 74 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  at have occurred
68a0: 20 64 75 72 69 6e 67 20 74 68 69 73 20 65 78 65   during this exe
68b0: 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  cution of the.**
68c0: 20 56 44 42 45 2c 20 62 75 74 20 64 6f 20 6e 6f   VDBE, but do no
68d0: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  t rollback the t
68e0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  ransaction. .**.
68f0: 2a 2a 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20  ** If P4 is not 
6900: 6e 75 6c 6c 20 74 68 65 6e 20 69 74 20 69 73 20  null then it is 
6910: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
6920: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
6930: 68 65 72 65 20 69 73 20 61 6e 20 69 6d 70 6c 69  here is an impli
6940: 65 64 20 22 48 61 6c 74 20 30 20 30 20 30 22 20  ed "Halt 0 0 0" 
6950: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 73 65  instruction inse
6960: 72 74 65 64 20 61 74 20 74 68 65 20 76 65 72 79  rted at the very
6970: 20 65 6e 64 20 6f 66 0a 2a 2a 20 65 76 65 72 79   end of.** every
6980: 20 70 72 6f 67 72 61 6d 2e 20 20 53 6f 20 61 20   program.  So a 
6990: 6a 75 6d 70 20 70 61 73 74 20 74 68 65 20 6c 61  jump past the la
69a0: 73 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f  st instruction o
69b0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a  f the program.**
69c0: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
69d0: 65 78 65 63 75 74 69 6e 67 20 48 61 6c 74 2e 0a  executing Halt..
69e0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 48 61 6c 74 3a  */.case OP_Halt:
69f0: 20 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31   {.  if( pOp->p1
6a00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
6a10: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
6a20: 2f 2a 20 48 61 6c 74 20 74 68 65 20 73 75 62 2d  /* Halt the sub-
6a30: 70 72 6f 67 72 61 6d 2e 20 52 65 74 75 72 6e 20  program. Return 
6a40: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 70  control to the p
6a50: 61 72 65 6e 74 20 66 72 61 6d 65 2e 20 2a 2f 0a  arent frame. */.
6a60: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
6a70: 46 72 61 6d 65 20 3d 20 70 2d 3e 70 46 72 61 6d  Frame = p->pFram
6a80: 65 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65  e;.    p->pFrame
6a90: 20 3d 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65   = pFrame->pPare
6aa0: 6e 74 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d  nt;.    p->nFram
6ab0: 65 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e--;.    sqlite3
6ac0: 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
6ad0: 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a  b, p->nChange);.
6ae0: 20 20 20 20 70 63 20 3d 20 73 71 6c 69 74 65 33      pc = sqlite3
6af0: 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65  VdbeFrameRestore
6b00: 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 6c 61  (pFrame);.    la
6b10: 73 74 52 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61  stRowid = db->la
6b20: 73 74 52 6f 77 69 64 3b 0a 20 20 20 20 69 66 28  stRowid;.    if(
6b30: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 49 67 6e   pOp->p2==OE_Ign
6b40: 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ore ){.      /* 
6b50: 49 6e 73 74 72 75 63 74 69 6f 6e 20 70 63 20 69  Instruction pc i
6b60: 73 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  s the OP_Program
6b70: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
6b80: 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 0a 20  e sub-program . 
6b90: 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c       ** currentl
6ba0: 79 20 62 65 69 6e 67 20 68 61 6c 74 65 64 2e 20  y being halted. 
6bb0: 49 66 20 74 68 65 20 70 32 20 69 6e 73 74 72 75  If the p2 instru
6bc0: 63 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 4f 50  ction of this OP
6bd0: 5f 48 61 6c 74 0a 20 20 20 20 20 20 2a 2a 20 69  _Halt.      ** i
6be0: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 73 65  nstruction is se
6bf0: 74 20 74 6f 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  t to OE_Ignore, 
6c00: 74 68 65 6e 20 74 68 65 20 73 75 62 2d 70 72 6f  then the sub-pro
6c10: 67 72 61 6d 20 69 73 20 74 68 72 6f 77 69 6e 67  gram is throwing
6c20: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 49 47 4e  .      ** an IGN
6c30: 4f 52 45 20 65 78 63 65 70 74 69 6f 6e 2e 20 49  ORE exception. I
6c40: 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 6d 70  n this case jump
6c50: 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20   to the address 
6c60: 73 70 65 63 69 66 69 65 64 0a 20 20 20 20 20 20  specified.      
6c70: 2a 2a 20 61 73 20 74 68 65 20 70 32 20 6f 66 20  ** as the p2 of 
6c80: 74 68 65 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50  the calling OP_P
6c90: 72 6f 67 72 61 6d 2e 20 20 2a 2f 0a 20 20 20 20  rogram.  */.    
6ca0: 20 20 70 63 20 3d 20 70 2d 3e 61 4f 70 5b 70 63    pc = p->aOp[pc
6cb0: 5d 2e 70 32 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  ].p2-1;.    }.  
6cc0: 20 20 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a    aOp = p->aOp;.
6cd0: 20 20 20 20 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d      aMem = p->aM
6ce0: 65 6d 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  em;.    break;. 
6cf0: 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 70 4f   }..  p->rc = pO
6d00: 70 2d 3e 70 31 3b 0a 20 20 70 2d 3e 65 72 72 6f  p->p1;.  p->erro
6d10: 72 41 63 74 69 6f 6e 20 3d 20 28 75 38 29 70 4f  rAction = (u8)pO
6d20: 70 2d 3e 70 32 3b 0a 20 20 70 2d 3e 70 63 20 3d  p->p2;.  p->pc =
6d30: 20 70 63 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e   pc;.  if( pOp->
6d40: 70 34 2e 7a 20 29 7b 0a 20 20 20 20 61 73 73 65  p4.z ){.    asse
6d50: 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
6d60: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 73 71 6c 69  E_OK );.    sqli
6d70: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
6d80: 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25  >zErrMsg, db, "%
6d90: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  s", pOp->p4.z);.
6da0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71      testcase( sq
6db0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
6dc0: 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 20  g.xLog!=0 );.   
6dd0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 70 4f 70   sqlite3_log(pOp
6de0: 2d 3e 70 31 2c 20 22 61 62 6f 72 74 20 61 74 20  ->p1, "abort at 
6df0: 25 64 20 69 6e 20 5b 25 73 5d 3a 20 25 73 22 2c  %d in [%s]: %s",
6e00: 20 70 63 2c 20 70 2d 3e 7a 53 71 6c 2c 20 70 4f   pc, p->zSql, pO
6e10: 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 7d 65 6c 73  p->p4.z);.  }els
6e20: 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20  e if( p->rc ){. 
6e30: 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c     testcase( sql
6e40: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
6e50: 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 20 20  .xLog!=0 );.    
6e60: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 70 4f 70 2d  sqlite3_log(pOp-
6e70: 3e 70 31 2c 20 22 63 6f 6e 73 74 72 61 69 6e 74  >p1, "constraint
6e80: 20 66 61 69 6c 65 64 20 61 74 20 25 64 20 69 6e   failed at %d in
6e90: 20 5b 25 73 5d 22 2c 20 70 63 2c 20 70 2d 3e 7a   [%s]", pc, p->z
6ea0: 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  Sql);.  }.  rc =
6eb0: 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
6ec0: 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  (p);.  assert( r
6ed0: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c  c==SQLITE_BUSY |
6ee0: 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
6ef0: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  || rc==SQLITE_ER
6f00: 52 4f 52 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  ROR );.  if( rc=
6f10: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
6f20: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d      p->rc = rc =
6f30: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
6f40: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
6f50: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
6f60: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
6f70: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a  E_CONSTRAINT );.
6f80: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
6f90: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 64 62 2d  SQLITE_OK || db-
6fa0: 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3e 30  >nDeferredCons>0
6fb0: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e   );.    rc = p->
6fc0: 72 63 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc ? SQLITE_ERRO
6fd0: 52 20 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  R : SQLITE_DONE;
6fe0: 0a 20 20 7d 0a 20 20 67 6f 74 6f 20 76 64 62 65  .  }.  goto vdbe
6ff0: 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f  _return;.}../* O
7000: 70 63 6f 64 65 3a 20 49 6e 74 65 67 65 72 20 50  pcode: Integer P
7010: 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
7020: 20 54 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65   The 32-bit inte
7030: 67 65 72 20 76 61 6c 75 65 20 50 31 20 69 73 20  ger value P1 is 
7040: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 72 65 67  written into reg
7050: 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73  ister P2..*/.cas
7060: 65 20 4f 50 5f 49 6e 74 65 67 65 72 3a 20 7b 20  e OP_Integer: { 
7070: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
7080: 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
7090: 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pOut->u.i = pOp-
70a0: 3e 70 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  >p1;.  break;.}.
70b0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 36  ./* Opcode: Int6
70c0: 34 20 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a  4 * P2 * P4 *.**
70d0: 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e  .** P4 is a poin
70e0: 74 65 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20  ter to a 64-bit 
70f0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a  integer value..*
7100: 2a 20 57 72 69 74 65 20 74 68 61 74 20 76 61 6c  * Write that val
7110: 75 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  ue into register
7120: 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
7130: 49 6e 74 36 34 3a 20 7b 20 20 20 20 20 20 20 20  Int64: {        
7140: 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65     /* out2-prere
7150: 6c 65 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  lease */.  asser
7160: 74 28 20 70 4f 70 2d 3e 70 34 2e 70 49 36 34 21  t( pOp->p4.pI64!
7170: 3d 30 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e  =0 );.  pOut->u.
7180: 69 20 3d 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36  i = *pOp->p4.pI6
7190: 34 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23  4;.  break;.}..#
71a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
71b0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
71c0: 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 61  T./* Opcode: Rea
71d0: 6c 20 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a  l * P2 * P4 *.**
71e0: 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e  .** P4 is a poin
71f0: 74 65 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20  ter to a 64-bit 
7200: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
7210: 61 6c 75 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74  alue..** Write t
7220: 68 61 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72  hat value into r
7230: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63  egister P2..*/.c
7240: 61 73 65 20 4f 50 5f 52 65 61 6c 3a 20 7b 20 20  ase OP_Real: {  
7250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
7260: 65 20 61 73 20 54 4b 5f 46 4c 4f 41 54 2c 20 6f  e as TK_FLOAT, o
7270: 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a  ut2-prerelease *
7280: 2f 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20  /.  pOut->flags 
7290: 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 61 73  = MEM_Real;.  as
72a0: 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73  sert( !sqlite3Is
72b0: 4e 61 4e 28 2a 70 4f 70 2d 3e 70 34 2e 70 52 65  NaN(*pOp->p4.pRe
72c0: 61 6c 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 72  al) );.  pOut->r
72d0: 20 3d 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61   = *pOp->p4.pRea
72e0: 6c 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  l;.  break;.}.#e
72f0: 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ndif../* Opcode:
7300: 20 53 74 72 69 6e 67 38 20 2a 20 50 32 20 2a 20   String8 * P2 * 
7310: 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f  P4 *.**.** P4 po
7320: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 20 74 65  ints to a nul te
7330: 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73  rminated UTF-8 s
7340: 74 72 69 6e 67 2e 20 54 68 69 73 20 6f 70 63 6f  tring. This opco
7350: 64 65 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65  de is transforme
7360: 64 20 0a 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50  d .** into an OP
7370: 5f 53 74 72 69 6e 67 20 62 65 66 6f 72 65 20 69  _String before i
7380: 74 20 69 73 20 65 78 65 63 75 74 65 64 20 66 6f  t is executed fo
7390: 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  r the first time
73a0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 74 72  ..*/.case OP_Str
73b0: 69 6e 67 38 3a 20 7b 20 20 20 20 20 20 20 20 20  ing8: {         
73c0: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 54  /* same as TK_ST
73d0: 52 49 4e 47 2c 20 6f 75 74 32 2d 70 72 65 72 65  RING, out2-prere
73e0: 6c 65 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  lease */.  asser
73f0: 74 28 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  t( pOp->p4.z!=0 
7400: 29 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  );.  pOp->opcode
7410: 20 3d 20 4f 50 5f 53 74 72 69 6e 67 3b 0a 20 20   = OP_String;.  
7420: 70 4f 70 2d 3e 70 31 20 3d 20 73 71 6c 69 74 65  pOp->p1 = sqlite
7430: 33 53 74 72 6c 65 6e 33 30 28 70 4f 70 2d 3e 70  3Strlen30(pOp->p
7440: 34 2e 7a 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  4.z);..#ifndef S
7450: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
7460: 0a 20 20 69 66 28 20 65 6e 63 6f 64 69 6e 67 21  .  if( encoding!
7470: 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a  =SQLITE_UTF8 ){.
7480: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7490: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4f  VdbeMemSetStr(pO
74a0: 75 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 2d  ut, pOp->p4.z, -
74b0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
74c0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
74d0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
74e0: 54 45 5f 54 4f 4f 42 49 47 20 29 20 67 6f 74 6f  TE_TOOBIG ) goto
74f0: 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20 20 69 66   too_big;.    if
7500: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
7510: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e  ite3VdbeChangeEn
7520: 63 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65 6e 63  coding(pOut, enc
7530: 6f 64 69 6e 67 29 20 29 20 67 6f 74 6f 20 6e 6f  oding) ) goto no
7540: 5f 6d 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  _mem;.    assert
7550: 28 20 70 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 3d  ( pOut->zMalloc=
7560: 3d 70 4f 75 74 2d 3e 7a 20 29 3b 0a 20 20 20 20  =pOut->z );.    
7570: 61 73 73 65 72 74 28 20 70 4f 75 74 2d 3e 66 6c  assert( pOut->fl
7580: 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b  ags & MEM_Dyn );
7590: 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 4d 61 6c 6c  .    pOut->zMall
75a0: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74  oc = 0;.    pOut
75b0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 53  ->flags |= MEM_S
75c0: 74 61 74 69 63 3b 0a 20 20 20 20 70 4f 75 74 2d  tatic;.    pOut-
75d0: 3e 66 6c 61 67 73 20 26 3d 20 7e 4d 45 4d 5f 44  >flags &= ~MEM_D
75e0: 79 6e 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  yn;.    if( pOp-
75f0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 44 59 4e 41  >p4type==P4_DYNA
7600: 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MIC ){.      sql
7610: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7620: 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 7d  Op->p4.z);.    }
7630: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
7640: 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20   = P4_DYNAMIC;. 
7650: 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 70     pOp->p4.z = p
7660: 4f 75 74 2d 3e 7a 3b 0a 20 20 20 20 70 4f 70 2d  Out->z;.    pOp-
7670: 3e 70 31 20 3d 20 70 4f 75 74 2d 3e 6e 3b 0a 20  >p1 = pOut->n;. 
7680: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
7690: 70 4f 70 2d 3e 70 31 3e 64 62 2d 3e 61 4c 69 6d  pOp->p1>db->aLim
76a0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
76b0: 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67  LENGTH] ){.    g
76c0: 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
76d0: 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75  .  /* Fall throu
76e0: 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63  gh to the next c
76f0: 61 73 65 2c 20 4f 50 5f 53 74 72 69 6e 67 20 2a  ase, OP_String *
7700: 2f 0a 7d 0a 20 20 0a 2f 2a 20 4f 70 63 6f 64 65  /.}.  ./* Opcode
7710: 3a 20 53 74 72 69 6e 67 20 50 31 20 50 32 20 2a  : String P1 P2 *
7720: 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20   P4 *.**.** The 
7730: 73 74 72 69 6e 67 20 76 61 6c 75 65 20 50 34 20  string value P4 
7740: 6f 66 20 6c 65 6e 67 74 68 20 50 31 20 28 62 79  of length P1 (by
7750: 74 65 73 29 20 69 73 20 73 74 6f 72 65 64 20 69  tes) is stored i
7760: 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  n register P2..*
7770: 2f 0a 63 61 73 65 20 4f 50 5f 53 74 72 69 6e 67  /.case OP_String
7780: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  : {          /* 
7790: 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20  out2-prerelease 
77a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
77b0: 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a 20 20 70  ->p4.z!=0 );.  p
77c0: 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
77d0: 5f 53 74 72 7c 4d 45 4d 5f 53 74 61 74 69 63 7c  _Str|MEM_Static|
77e0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74  MEM_Term;.  pOut
77f0: 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  ->z = pOp->p4.z;
7800: 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 70 4f 70  .  pOut->n = pOp
7810: 2d 3e 70 31 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e  ->p1;.  pOut->en
7820: 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20  c = encoding;.  
7830: 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
7840: 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65  IZE(pOut);.  bre
7850: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
7860: 3a 20 4e 75 6c 6c 20 2a 20 50 32 20 2a 20 2a 20  : Null * P2 * * 
7870: 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  *.**.** Write a 
7880: 4e 55 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73 74  NULL into regist
7890: 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f  er P2..*/.case O
78a0: 50 5f 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20  P_Null: {       
78b0: 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72      /* out2-prer
78c0: 65 6c 65 61 73 65 20 2a 2f 0a 20 20 70 4f 75 74  elease */.  pOut
78d0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
78e0: 6c 6c 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  ll;.  break;.}..
78f0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 6c 6f 62  ./* Opcode: Blob
7900: 20 50 31 20 50 32 20 2a 20 50 34 0a 2a 2a 0a 2a   P1 P2 * P4.**.*
7910: 2a 20 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61  * P4 points to a
7920: 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 50 31   blob of data P1
7930: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 20 20 53 74   bytes long.  St
7940: 6f 72 65 20 74 68 69 73 0a 2a 2a 20 62 6c 6f 62  ore this.** blob
7950: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
7960: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 6c 6f 62  .*/.case OP_Blob
7970: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
7980: 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65     /* out2-prere
7990: 6c 65 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  lease */.  asser
79a0: 74 28 20 70 4f 70 2d 3e 70 31 20 3c 3d 20 53 51  t( pOp->p1 <= SQ
79b0: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
79c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
79d0: 4d 65 6d 53 65 74 53 74 72 28 70 4f 75 74 2c 20  MemSetStr(pOut, 
79e0: 70 4f 70 2d 3e 70 34 2e 7a 2c 20 70 4f 70 2d 3e  pOp->p4.z, pOp->
79f0: 70 31 2c 20 30 2c 20 30 29 3b 0a 20 20 70 4f 75  p1, 0, 0);.  pOu
7a00: 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e  t->enc = encodin
7a10: 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  g;.  UPDATE_MAX_
7a20: 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a  BLOBSIZE(pOut);.
7a30: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
7a40: 70 63 6f 64 65 3a 20 56 61 72 69 61 62 6c 65 20  pcode: Variable 
7a50: 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a  P1 P2 * P4 *.**.
7a60: 2a 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  ** Transfer the 
7a70: 76 61 6c 75 65 73 20 6f 66 20 62 6f 75 6e 64 20  values of bound 
7a80: 70 61 72 61 6d 65 74 65 72 20 50 31 20 69 6e 74  parameter P1 int
7a90: 6f 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a  o register P2.**
7aa0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d  .** If the param
7ab0: 65 74 65 72 20 69 73 20 6e 61 6d 65 64 2c 20 74  eter is named, t
7ac0: 68 65 6e 20 69 74 73 20 6e 61 6d 65 20 61 70 70  hen its name app
7ad0: 65 61 72 73 20 69 6e 20 50 34 20 61 6e 64 20 50  ears in P4 and P
7ae0: 33 3d 3d 31 2e 0a 2a 2a 20 54 68 65 20 50 34 20  3==1..** The P4 
7af0: 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 62 79  value is used by
7b00: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
7b10: 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 2e 0a  rameter_name()..
7b20: 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 61 72 69 61  */.case OP_Varia
7b30: 62 6c 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ble: {          
7b40: 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c    /* out2-prerel
7b50: 65 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  ease */.  Mem *p
7b60: 56 61 72 3b 20 20 20 20 20 20 20 2f 2a 20 56 61  Var;       /* Va
7b70: 6c 75 65 20 62 65 69 6e 67 20 74 72 61 6e 73 66  lue being transf
7b80: 65 72 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  erred */..  asse
7b90: 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26  rt( pOp->p1>0 &&
7ba0: 20 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 56 61   pOp->p1<=p->nVa
7bb0: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
7bc0: 4f 70 2d 3e 70 34 2e 7a 3d 3d 30 20 7c 7c 20 70  Op->p4.z==0 || p
7bd0: 4f 70 2d 3e 70 34 2e 7a 3d 3d 70 2d 3e 61 7a 56  Op->p4.z==p->azV
7be0: 61 72 5b 70 4f 70 2d 3e 70 31 2d 31 5d 20 29 3b  ar[pOp->p1-1] );
7bf0: 0a 20 20 70 56 61 72 20 3d 20 26 70 2d 3e 61 56  .  pVar = &p->aV
7c00: 61 72 5b 70 4f 70 2d 3e 70 31 20 2d 20 31 5d 3b  ar[pOp->p1 - 1];
7c10: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  .  if( sqlite3Vd
7c20: 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 56 61 72  beMemTooBig(pVar
7c30: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f  ) ){.    goto to
7c40: 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 73 71 6c  o_big;.  }.  sql
7c50: 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c  ite3VdbeMemShall
7c60: 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 56 61  owCopy(pOut, pVa
7c70: 72 2c 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a  r, MEM_Static);.
7c80: 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
7c90: 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62  BSIZE(pOut);.  b
7ca0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
7cb0: 64 65 3a 20 4d 6f 76 65 20 50 31 20 50 32 20 50  de: Move P1 P2 P
7cc0: 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65  3 * *.**.** Move
7cd0: 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72   the values in r
7ce0: 65 67 69 73 74 65 72 20 50 31 2e 2e 50 31 2b 50  egister P1..P1+P
7cf0: 33 2d 31 20 6f 76 65 72 20 69 6e 74 6f 0a 2a 2a  3-1 over into.**
7d00: 20 72 65 67 69 73 74 65 72 73 20 50 32 2e 2e 50   registers P2..P
7d10: 32 2b 50 33 2d 31 2e 20 20 52 65 67 69 73 74 65  2+P3-1.  Registe
7d20: 72 73 20 50 31 2e 2e 50 31 2b 50 31 2d 31 20 61  rs P1..P1+P1-1 a
7d30: 72 65 0a 2a 2a 20 6c 65 66 74 20 68 6f 6c 64 69  re.** left holdi
7d40: 6e 67 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69  ng a NULL.  It i
7d50: 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 72  s an error for r
7d60: 65 67 69 73 74 65 72 20 72 61 6e 67 65 73 0a 2a  egister ranges.*
7d70: 2a 20 50 31 2e 2e 50 31 2b 50 33 2d 31 20 61 6e  * P1..P1+P3-1 an
7d80: 64 20 50 32 2e 2e 50 32 2b 50 33 2d 31 20 74 6f  d P2..P2+P3-1 to
7d90: 20 6f 76 65 72 6c 61 70 2e 0a 2a 2f 0a 63 61 73   overlap..*/.cas
7da0: 65 20 4f 50 5f 4d 6f 76 65 3a 20 7b 0a 20 20 63  e OP_Move: {.  c
7db0: 68 61 72 20 2a 7a 4d 61 6c 6c 6f 63 3b 20 20 20  har *zMalloc;   
7dc0: 2f 2a 20 48 6f 6c 64 69 6e 67 20 76 61 72 69 61  /* Holding varia
7dd0: 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ble for allocate
7de0: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
7df0: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  t n;           /
7e00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69  * Number of regi
7e10: 73 74 65 72 73 20 6c 65 66 74 20 74 6f 20 63 6f  sters left to co
7e20: 70 79 20 2a 2f 0a 20 20 69 6e 74 20 70 31 3b 20  py */.  int p1; 
7e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
7e40: 73 74 65 72 20 74 6f 20 63 6f 70 79 20 66 72 6f  ster to copy fro
7e50: 6d 20 2a 2f 0a 20 20 69 6e 74 20 70 32 3b 20 20  m */.  int p2;  
7e60: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
7e70: 74 65 72 20 74 6f 20 63 6f 70 79 20 74 6f 20 2a  ter to copy to *
7e80: 2f 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33  /..  n = pOp->p3
7e90: 3b 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31  ;.  p1 = pOp->p1
7ea0: 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32  ;.  p2 = pOp->p2
7eb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20  ;.  assert( n>0 
7ec0: 26 26 20 70 31 3e 30 20 26 26 20 70 32 3e 30 20  && p1>0 && p2>0 
7ed0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 2b  );.  assert( p1+
7ee0: 6e 3c 3d 70 32 20 7c 7c 20 70 32 2b 6e 3c 3d 70  n<=p2 || p2+n<=p
7ef0: 31 20 29 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26  1 );..  pIn1 = &
7f00: 61 4d 65 6d 5b 70 31 5d 3b 0a 20 20 70 4f 75 74  aMem[p1];.  pOut
7f10: 20 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20   = &aMem[p2];.  
7f20: 77 68 69 6c 65 28 20 6e 2d 2d 20 29 7b 0a 20 20  while( n-- ){.  
7f30: 20 20 61 73 73 65 72 74 28 20 70 4f 75 74 3c 3d    assert( pOut<=
7f40: 26 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 5d 20 29  &aMem[p->nMem] )
7f50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
7f60: 6e 31 3c 3d 26 61 4d 65 6d 5b 70 2d 3e 6e 4d 65  n1<=&aMem[p->nMe
7f70: 6d 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  m] );.    assert
7f80: 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e  ( memIsValid(pIn
7f90: 31 29 20 29 3b 0a 20 20 20 20 6d 65 6d 41 62 6f  1) );.    memAbo
7fa0: 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f  utToChange(p, pO
7fb0: 75 74 29 3b 0a 20 20 20 20 7a 4d 61 6c 6c 6f 63  ut);.    zMalloc
7fc0: 20 3d 20 70 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63   = pOut->zMalloc
7fd0: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 4d 61 6c  ;.    pOut->zMal
7fe0: 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  loc = 0;.    sql
7ff0: 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28  ite3VdbeMemMove(
8000: 70 4f 75 74 2c 20 70 49 6e 31 29 3b 0a 20 20 20  pOut, pIn1);.   
8010: 20 70 49 6e 31 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d   pIn1->zMalloc =
8020: 20 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 52 45   zMalloc;.    RE
8030: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 32 2b  GISTER_TRACE(p2+
8040: 2b 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 70 49  +, pOut);.    pI
8050: 6e 31 2b 2b 3b 0a 20 20 20 20 70 4f 75 74 2b 2b  n1++;.    pOut++
8060: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
8070: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 70  ../* Opcode: Cop
8080: 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  y P1 P2 * * *.**
8090: 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20  .** Make a copy 
80a0: 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69  of register P1 i
80b0: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e  nto register P2.
80c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74  .**.** This inst
80d0: 72 75 63 74 69 6f 6e 20 6d 61 6b 65 73 20 61 20  ruction makes a 
80e0: 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65  deep copy of the
80f0: 20 76 61 6c 75 65 2e 20 20 41 20 64 75 70 6c 69   value.  A dupli
8100: 63 61 74 65 0a 2a 2a 20 69 73 20 6d 61 64 65 20  cate.** is made 
8110: 6f 66 20 61 6e 79 20 73 74 72 69 6e 67 20 6f 72  of any string or
8120: 20 62 6c 6f 62 20 63 6f 6e 73 74 61 6e 74 2e 20   blob constant. 
8130: 20 53 65 65 20 61 6c 73 6f 20 4f 50 5f 53 43 6f   See also OP_SCo
8140: 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  py..*/.case OP_C
8150: 6f 70 79 3a 20 7b 20 20 20 20 20 20 20 20 20 20  opy: {          
8160: 20 20 20 2f 2a 20 69 6e 31 2c 20 6f 75 74 32 20     /* in1, out2 
8170: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
8180: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f  m[pOp->p1];.  pO
8190: 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
81a0: 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p2];.  assert( p
81b0: 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a 20 20 73  Out!=pIn1 );.  s
81c0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
81d0: 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70  llowCopy(pOut, p
81e0: 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  In1, MEM_Ephem);
81f0: 0a 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a  .  Deephemeraliz
8200: 65 28 70 4f 75 74 29 3b 0a 20 20 52 45 47 49 53  e(pOut);.  REGIS
8210: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
8220: 32 2c 20 70 4f 75 74 29 3b 0a 20 20 62 72 65 61  2, pOut);.  brea
8230: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
8240: 20 53 43 6f 70 79 20 50 31 20 50 32 20 2a 20 2a   SCopy P1 P2 * *
8250: 20 2a 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20   *.**.** Make a 
8260: 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20  shallow copy of 
8270: 72 65 67 69 73 74 65 72 20 50 31 20 69 6e 74 6f  register P1 into
8280: 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
8290: 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63  .** This instruc
82a0: 74 69 6f 6e 20 6d 61 6b 65 73 20 61 20 73 68 61  tion makes a sha
82b0: 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74 68 65  llow copy of the
82c0: 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20   value.  If the 
82d0: 76 61 6c 75 65 0a 2a 2a 20 69 73 20 61 20 73 74  value.** is a st
82e0: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 74 68  ring or blob, th
82f0: 65 6e 20 74 68 65 20 63 6f 70 79 20 69 73 20 6f  en the copy is o
8300: 6e 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nly a pointer to
8310: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
8320: 20 61 6e 64 20 68 65 6e 63 65 20 69 66 20 74 68   and hence if th
8330: 65 20 6f 72 69 67 69 6e 61 6c 20 63 68 61 6e 67  e original chang
8340: 65 73 20 73 6f 20 77 69 6c 6c 20 74 68 65 20 63  es so will the c
8350: 6f 70 79 2e 0a 2a 2a 20 57 6f 72 73 65 2c 20 69  opy..** Worse, i
8360: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69  f the original i
8370: 73 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 20 74  s deallocated, t
8380: 68 65 20 63 6f 70 79 20 62 65 63 6f 6d 65 73 20  he copy becomes 
8390: 69 6e 76 61 6c 69 64 2e 0a 2a 2a 20 54 68 75 73  invalid..** Thus
83a0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6d 75 73   the program mus
83b0: 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  t guarantee that
83c0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 77 69   the original wi
83d0: 6c 6c 20 6e 6f 74 20 63 68 61 6e 67 65 0a 2a 2a  ll not change.**
83e0: 20 64 75 72 69 6e 67 20 74 68 65 20 6c 69 66 65   during the life
83f0: 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f 70 79  time of the copy
8400: 2e 20 20 55 73 65 20 4f 50 5f 43 6f 70 79 20 74  .  Use OP_Copy t
8410: 6f 20 6d 61 6b 65 20 61 20 63 6f 6d 70 6c 65 74  o make a complet
8420: 65 0a 2a 2a 20 63 6f 70 79 2e 0a 2a 2f 0a 63 61  e.** copy..*/.ca
8430: 73 65 20 4f 50 5f 53 43 6f 70 79 3a 20 7b 20 20  se OP_SCopy: {  
8440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31            /* in1
8450: 2c 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31  , out2 */.  pIn1
8460: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
8470: 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65  ];.  pOut = &aMe
8480: 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73  m[pOp->p2];.  as
8490: 73 65 72 74 28 20 70 4f 75 74 21 3d 70 49 6e 31  sert( pOut!=pIn1
84a0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
84b0: 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
84c0: 70 4f 75 74 2c 20 70 49 6e 31 2c 20 4d 45 4d 5f  pOut, pIn1, MEM_
84d0: 45 70 68 65 6d 29 3b 0a 23 69 66 64 65 66 20 53  Ephem);.#ifdef S
84e0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
84f0: 28 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72  ( pOut->pScopyFr
8500: 6f 6d 3d 3d 30 20 29 20 70 4f 75 74 2d 3e 70 53  om==0 ) pOut->pS
8510: 63 6f 70 79 46 72 6f 6d 20 3d 20 70 49 6e 31 3b  copyFrom = pIn1;
8520: 0a 23 65 6e 64 69 66 0a 20 20 52 45 47 49 53 54  .#endif.  REGIST
8530: 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32  ER_TRACE(pOp->p2
8540: 2c 20 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b  , pOut);.  break
8550: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
8560: 52 65 73 75 6c 74 52 6f 77 20 50 31 20 50 32 20  ResultRow P1 P2 
8570: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  * * *.**.** The 
8580: 72 65 67 69 73 74 65 72 73 20 50 31 20 74 68 72  registers P1 thr
8590: 6f 75 67 68 20 50 31 2b 50 32 2d 31 20 63 6f 6e  ough P1+P2-1 con
85a0: 74 61 69 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  tain a single ro
85b0: 77 20 6f 66 0a 2a 2a 20 72 65 73 75 6c 74 73 2e  w of.** results.
85c0: 20 54 68 69 73 20 6f 70 63 6f 64 65 20 63 61 75   This opcode cau
85d0: 73 65 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ses the sqlite3_
85e0: 73 74 65 70 28 29 20 63 61 6c 6c 20 74 6f 20 74  step() call to t
85f0: 65 72 6d 69 6e 61 74 65 0a 2a 2a 20 77 69 74 68  erminate.** with
8600: 20 61 6e 20 53 51 4c 49 54 45 5f 52 4f 57 20 72   an SQLITE_ROW r
8610: 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 69  eturn code and i
8620: 74 20 73 65 74 73 20 75 70 20 74 68 65 20 73 71  t sets up the sq
8630: 6c 69 74 65 33 5f 73 74 6d 74 0a 2a 2a 20 73 74  lite3_stmt.** st
8640: 72 75 63 74 75 72 65 20 74 6f 20 70 72 6f 76 69  ructure to provi
8650: 64 65 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  de access to the
8660: 20 74 6f 70 20 50 31 20 76 61 6c 75 65 73 20 61   top P1 values a
8670: 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
8680: 72 6f 77 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  row..*/.case OP_
8690: 52 65 73 75 6c 74 52 6f 77 3a 20 7b 0a 20 20 4d  ResultRow: {.  M
86a0: 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e 74 20  em *pMem;.  int 
86b0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  i;.  assert( p->
86c0: 6e 52 65 73 43 6f 6c 75 6d 6e 3d 3d 70 4f 70 2d  nResColumn==pOp-
86d0: 3e 70 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >p2 );.  assert(
86e0: 20 70 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20 20   pOp->p1>0 );.  
86f0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 2b  assert( pOp->p1+
8700: 70 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p2<=p->nMem
8710: 2b 31 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  +1 );..  /* If t
8720: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61  his statement ha
8730: 73 20 76 69 6f 6c 61 74 65 64 20 69 6d 6d 65 64  s violated immed
8740: 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
8750: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 64 6f   constraints, do
8760: 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 74 75 72 6e  .  ** not return
8770: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
8780: 6f 77 73 20 6d 6f 64 69 66 69 65 64 2e 20 41 6e  ows modified. An
8790: 64 20 64 6f 20 6e 6f 74 20 52 45 4c 45 41 53 45  d do not RELEASE
87a0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20   the statement. 
87b0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e   ** transaction.
87c0: 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   It needs to be 
87d0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 2a 2f  rolled back.  */
87e0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
87f0: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56  !=(rc = sqlite3V
8800: 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29  dbeCheckFk(p, 0)
8810: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
8820: 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   db->flags&SQLIT
8830: 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 3b 0a 20  E_CountRows );. 
8840: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75 73     assert( p->us
8850: 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 3b  esStmtJournal );
8860: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
8870: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c  .  /* If the SQL
8880: 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 66 6c  ITE_CountRows fl
8890: 61 67 20 69 73 20 73 65 74 20 69 6e 20 73 71 6c  ag is set in sql
88a0: 69 74 65 33 2e 66 6c 61 67 73 20 6d 61 73 6b 2c  ite3.flags mask,
88b0: 20 74 68 65 6e 20 0a 20 20 2a 2a 20 44 4d 4c 20   then .  ** DML 
88c0: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6b  statements invok
88d0: 65 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f  e this opcode to
88e0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
88f0: 65 72 20 6f 66 20 72 6f 77 73 20 0a 20 20 2a 2a  er of rows .  **
8900: 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 74 68 65   modified to the
8910: 20 75 73 65 72 2e 20 54 68 69 73 20 69 73 20 74   user. This is t
8920: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 61 74  he only way that
8930: 20 61 20 56 4d 20 74 68 61 74 0a 20 20 2a 2a 20   a VM that.  ** 
8940: 6f 70 65 6e 73 20 61 20 73 74 61 74 65 6d 65 6e  opens a statemen
8950: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  t transaction ma
8960: 79 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 6f 70  y invoke this op
8970: 63 6f 64 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  code..  **.  ** 
8980: 49 6e 20 63 61 73 65 20 74 68 69 73 20 69 73 20  In case this is 
8990: 73 75 63 68 20 61 20 73 74 61 74 65 6d 65 6e 74  such a statement
89a0: 2c 20 63 6c 6f 73 65 20 61 6e 79 20 73 74 61 74  , close any stat
89b0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
89c0: 6e 0a 20 20 2a 2a 20 6f 70 65 6e 65 64 20 62 79  n.  ** opened by
89d0: 20 74 68 69 73 20 56 4d 20 62 65 66 6f 72 65 20   this VM before 
89e0: 72 65 74 75 72 6e 69 6e 67 20 63 6f 6e 74 72 6f  returning contro
89f0: 6c 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 54  l to the user. T
8a00: 68 69 73 20 69 73 20 74 6f 0a 20 20 2a 2a 20 65  his is to.  ** e
8a10: 6e 73 75 72 65 20 74 68 61 74 20 73 74 61 74 65  nsure that state
8a20: 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
8a30: 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 73  s are always nes
8a40: 74 65 64 2c 20 6e 6f 74 20 6f 76 65 72 6c 61 70  ted, not overlap
8a50: 70 69 6e 67 2e 0a 20 20 2a 2a 20 49 66 20 74 68  ping..  ** If th
8a60: 65 20 6f 70 65 6e 20 73 74 61 74 65 6d 65 6e 74  e open statement
8a70: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
8a80: 6e 6f 74 20 63 6c 6f 73 65 64 20 68 65 72 65 2c  not closed here,
8a90: 20 74 68 65 6e 20 74 68 65 20 75 73 65 72 0a 20   then the user. 
8aa0: 20 2a 2a 20 6d 61 79 20 73 74 65 70 20 61 6e 6f   ** may step ano
8ab0: 74 68 65 72 20 56 4d 20 74 68 61 74 20 6f 70 65  ther VM that ope
8ac0: 6e 73 20 69 74 73 20 6f 77 6e 20 73 74 61 74 65  ns its own state
8ad0: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
8ae0: 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6d 61 79 20  . This.  ** may 
8af0: 6c 65 61 64 20 74 6f 20 6f 76 65 72 6c 61 70 70  lead to overlapp
8b00: 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 74 72  ing statement tr
8b10: 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a  ansactions..  **
8b20: 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 74 65 6d  .  ** The statem
8b30: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
8b40: 69 73 20 6e 65 76 65 72 20 61 20 74 6f 70 2d 6c  is never a top-l
8b50: 65 76 65 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  evel transaction
8b60: 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68  .  Hence.  ** th
8b70: 65 20 52 45 4c 45 41 53 45 20 63 61 6c 6c 20 62  e RELEASE call b
8b80: 65 6c 6f 77 20 63 61 6e 20 6e 65 76 65 72 20 66  elow can never f
8b90: 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ail..  */.  asse
8ba0: 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  rt( p->iStatemen
8bb0: 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 66 6c 61 67  t==0 || db->flag
8bc0: 73 26 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  s&SQLITE_CountRo
8bd0: 77 73 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ws );.  rc = sql
8be0: 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
8bf0: 74 65 6d 65 6e 74 28 70 2c 20 53 41 56 45 50 4f  tement(p, SAVEPO
8c00: 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20  INT_RELEASE);.  
8c10: 69 66 28 20 4e 45 56 45 52 28 72 63 21 3d 53 51  if( NEVER(rc!=SQ
8c20: 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20  LITE_OK) ){.    
8c30: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
8c40: 20 49 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   Invalidate all 
8c50: 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73 6f 72  ephemeral cursor
8c60: 20 72 6f 77 20 63 61 63 68 65 73 20 2a 2f 0a 20   row caches */. 
8c70: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 28   p->cacheCtr = (
8c80: 70 2d 3e 63 61 63 68 65 43 74 72 20 2b 20 32 29  p->cacheCtr + 2)
8c90: 7c 31 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  |1;..  /* Make s
8ca0: 75 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ure the results 
8cb0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
8cc0: 6f 77 20 61 72 65 20 5c 30 30 30 20 74 65 72 6d  ow are \000 term
8cd0: 69 6e 61 74 65 64 0a 20 20 2a 2a 20 61 6e 64 20  inated.  ** and 
8ce0: 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65 64  have an assigned
8cf0: 20 74 79 70 65 2e 20 20 54 68 65 20 72 65 73 75   type.  The resu
8d00: 6c 74 73 20 61 72 65 20 64 65 2d 65 70 68 65 6d  lts are de-ephem
8d10: 65 72 61 6c 69 7a 65 64 20 61 73 0a 20 20 2a 2a  eralized as.  **
8d20: 20 61 73 20 73 69 64 65 20 65 66 66 65 63 74 2e   as side effect.
8d30: 0a 20 20 2a 2f 0a 20 20 70 4d 65 6d 20 3d 20 70  .  */.  pMem = p
8d40: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26  ->pResultSet = &
8d50: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
8d60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 70 2d   for(i=0; i<pOp-
8d70: 3e 70 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  >p2; i++){.    a
8d80: 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
8d90: 64 28 26 70 4d 65 6d 5b 69 5d 29 20 29 3b 0a 20  d(&pMem[i]) );. 
8da0: 20 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a     Deephemeraliz
8db0: 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 20  e(&pMem[i]);.   
8dc0: 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 5b 69   assert( (pMem[i
8dd0: 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 45 70  ].flags & MEM_Ep
8de0: 68 65 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  hem)==0.        
8df0: 20 20 20 20 7c 7c 20 28 70 4d 65 6d 5b 69 5d 2e      || (pMem[i].
8e00: 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72  flags & (MEM_Str
8e10: 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 29  |MEM_Blob))==0 )
8e20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8e30: 65 4d 65 6d 4e 75 6c 54 65 72 6d 69 6e 61 74 65  eMemNulTerminate
8e40: 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 20 20  (&pMem[i]);.    
8e50: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74  sqlite3VdbeMemSt
8e60: 6f 72 65 54 79 70 65 28 26 70 4d 65 6d 5b 69 5d  oreType(&pMem[i]
8e70: 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  );.    REGISTER_
8e80: 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2b 69 2c  TRACE(pOp->p1+i,
8e90: 20 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 7d 0a   &pMem[i]);.  }.
8ea0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
8eb0: 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 6e 6f  Failed ) goto no
8ec0: 5f 6d 65 6d 3b 0a 0a 20 20 2f 2a 20 52 65 74 75  _mem;..  /* Retu
8ed0: 72 6e 20 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20  rn SQLITE_ROW.  
8ee0: 2a 2f 0a 20 20 70 2d 3e 70 63 20 3d 20 70 63 20  */.  p->pc = pc 
8ef0: 2b 20 31 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49  + 1;.  rc = SQLI
8f00: 54 45 5f 52 4f 57 3b 0a 20 20 67 6f 74 6f 20 76  TE_ROW;.  goto v
8f10: 64 62 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  dbe_return;.}../
8f20: 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6e 63 61 74  * Opcode: Concat
8f30: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
8f40: 0a 2a 2a 20 41 64 64 20 74 68 65 20 74 65 78 74  .** Add the text
8f50: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
8f60: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
8f70: 74 68 65 20 74 65 78 74 20 69 6e 0a 2a 2a 20 72  the text in.** r
8f80: 65 67 69 73 74 65 72 20 50 32 20 61 6e 64 20 73  egister P2 and s
8f90: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
8fa0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
8fb0: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65  ** If either the
8fc0: 20 50 31 20 6f 72 20 50 32 20 74 65 78 74 20 61   P1 or P2 text a
8fd0: 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20 73 74 6f  re NULL then sto
8fe0: 72 65 20 4e 55 4c 4c 20 69 6e 20 50 33 2e 0a 2a  re NULL in P3..*
8ff0: 2a 0a 2a 2a 20 20 20 50 33 20 3d 20 50 32 20 7c  *.**   P3 = P2 |
9000: 7c 20 50 31 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  | P1.**.** It is
9010: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 50 31 20   illegal for P1 
9020: 61 6e 64 20 50 33 20 74 6f 20 62 65 20 74 68 65  and P3 to be the
9030: 20 73 61 6d 65 20 72 65 67 69 73 74 65 72 2e 20   same register. 
9040: 53 6f 6d 65 74 69 6d 65 73 2c 0a 2a 2a 20 69 66  Sometimes,.** if
9050: 20 50 33 20 69 73 20 74 68 65 20 73 61 6d 65 20   P3 is the same 
9060: 72 65 67 69 73 74 65 72 20 61 73 20 50 32 2c 20  register as P2, 
9070: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
9080: 6f 6e 20 69 73 20 61 62 6c 65 0a 2a 2a 20 74 6f  on is able.** to
9090: 20 61 76 6f 69 64 20 61 20 6d 65 6d 63 70 79 28   avoid a memcpy(
90a0: 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f  )..*/.case OP_Co
90b0: 6e 63 61 74 3a 20 7b 20 20 20 20 20 20 20 20 20  ncat: {         
90c0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
90d0: 43 4f 4e 43 41 54 2c 20 69 6e 31 2c 20 69 6e 32  CONCAT, in1, in2
90e0: 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34 20  , out3 */.  i64 
90f0: 6e 42 79 74 65 3b 0a 0a 20 20 70 49 6e 31 20 3d  nByte;..  pIn1 =
9100: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
9110: 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b  .  pIn2 = &aMem[
9120: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75 74  pOp->p2];.  pOut
9130: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
9140: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ];.  assert( pIn
9150: 31 21 3d 70 4f 75 74 20 29 3b 0a 20 20 69 66 28  1!=pOut );.  if(
9160: 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20   (pIn1->flags | 
9170: 70 49 6e 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d  pIn2->flags) & M
9180: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73  EM_Null ){.    s
9190: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
91a0: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20  Null(pOut);.    
91b0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
91c0: 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31   ExpandBlob(pIn1
91d0: 29 20 7c 7c 20 45 78 70 61 6e 64 42 6c 6f 62 28  ) || ExpandBlob(
91e0: 70 49 6e 32 29 20 29 20 67 6f 74 6f 20 6e 6f 5f  pIn2) ) goto no_
91f0: 6d 65 6d 3b 0a 20 20 53 74 72 69 6e 67 69 66 79  mem;.  Stringify
9200: 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69 6e 67 29  (pIn1, encoding)
9210: 3b 0a 20 20 53 74 72 69 6e 67 69 66 79 28 70 49  ;.  Stringify(pI
9220: 6e 32 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  n2, encoding);. 
9230: 20 6e 42 79 74 65 20 3d 20 70 49 6e 31 2d 3e 6e   nByte = pIn1->n
9240: 20 2b 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 69 66   + pIn2->n;.  if
9250: 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69 6d  ( nByte>db->aLim
9260: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
9270: 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67  LENGTH] ){.    g
9280: 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
9290: 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61  .  MemSetTypeFla
92a0: 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 53 74 72 29  g(pOut, MEM_Str)
92b0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56  ;.  if( sqlite3V
92c0: 64 62 65 4d 65 6d 47 72 6f 77 28 70 4f 75 74 2c  dbeMemGrow(pOut,
92d0: 20 28 69 6e 74 29 6e 42 79 74 65 2b 32 2c 20 70   (int)nByte+2, p
92e0: 4f 75 74 3d 3d 70 49 6e 32 29 20 29 7b 0a 20 20  Out==pIn2) ){.  
92f0: 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
9300: 20 7d 0a 20 20 69 66 28 20 70 4f 75 74 21 3d 70   }.  if( pOut!=p
9310: 49 6e 32 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  In2 ){.    memcp
9320: 79 28 70 4f 75 74 2d 3e 7a 2c 20 70 49 6e 32 2d  y(pOut->z, pIn2-
9330: 3e 7a 2c 20 70 49 6e 32 2d 3e 6e 29 3b 0a 20 20  >z, pIn2->n);.  
9340: 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70 4f 75 74  }.  memcpy(&pOut
9350: 2d 3e 7a 5b 70 49 6e 32 2d 3e 6e 5d 2c 20 70 49  ->z[pIn2->n], pI
9360: 6e 31 2d 3e 7a 2c 20 70 49 6e 31 2d 3e 6e 29 3b  n1->z, pIn1->n);
9370: 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74 65  .  pOut->z[nByte
9380: 5d 20 3d 20 30 3b 0a 20 20 70 4f 75 74 2d 3e 7a  ] = 0;.  pOut->z
9390: 5b 6e 42 79 74 65 2b 31 5d 20 3d 20 30 3b 0a 20  [nByte+1] = 0;. 
93a0: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20   pOut->flags |= 
93b0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74  MEM_Term;.  pOut
93c0: 2d 3e 6e 20 3d 20 28 69 6e 74 29 6e 42 79 74 65  ->n = (int)nByte
93d0: 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20  ;.  pOut->enc = 
93e0: 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41  encoding;.  UPDA
93f0: 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
9400: 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  pOut);.  break;.
9410: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 64  }../* Opcode: Ad
9420: 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  d P1 P2 P3 * *.*
9430: 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 76 61 6c  *.** Add the val
9440: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
9450: 31 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  1 to the value i
9460: 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a  n register P2.**
9470: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
9480: 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65  esult in registe
9490: 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68  r P3..** If eith
94a0: 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c  er input is NULL
94b0: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
94c0: 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  NULL..*/./* Opco
94d0: 64 65 3a 20 4d 75 6c 74 69 70 6c 79 20 50 31 20  de: Multiply P1 
94e0: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 0a  P2 P3 * *.**.**.
94f0: 2a 2a 20 4d 75 6c 74 69 70 6c 79 20 74 68 65 20  ** Multiply the 
9500: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
9510: 72 20 50 31 20 62 79 20 74 68 65 20 76 61 6c 75  r P1 by the valu
9520: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
9530: 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
9540: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
9550: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
9560: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
9570: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
9580: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f  is NULL..*/./* O
9590: 70 63 6f 64 65 3a 20 53 75 62 74 72 61 63 74 20  pcode: Subtract 
95a0: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
95b0: 2a 2a 20 53 75 62 74 72 61 63 74 20 74 68 65 20  ** Subtract the 
95c0: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
95d0: 72 20 50 31 20 66 72 6f 6d 20 74 68 65 20 76 61  r P1 from the va
95e0: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
95f0: 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20  P2.** and store 
9600: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65  the result in re
9610: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66  gister P3..** If
9620: 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73   either input is
9630: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c   NULL, the resul
9640: 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a  t is NULL..*/./*
9650: 20 4f 70 63 6f 64 65 3a 20 44 69 76 69 64 65 20   Opcode: Divide 
9660: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
9670: 2a 2a 20 44 69 76 69 64 65 20 74 68 65 20 76 61  ** Divide the va
9680: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
9690: 50 31 20 62 79 20 74 68 65 20 76 61 6c 75 65 20  P1 by the value 
96a0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a  in register P2.*
96b0: 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
96c0: 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74  result in regist
96d0: 65 72 20 50 33 20 28 50 33 3d 50 32 2f 50 31 29  er P3 (P3=P2/P1)
96e0: 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69  . If the value i
96f0: 6e 20 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50  n .** register P
9700: 31 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  1 is zero, then 
9710: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
9720: 4c 4c 2e 20 49 66 20 65 69 74 68 65 72 20 69 6e  LL. If either in
9730: 70 75 74 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c 2c  put is .** NULL,
9740: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
9750: 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ULL..*/./* Opcod
9760: 65 3a 20 52 65 6d 61 69 6e 64 65 72 20 50 31 20  e: Remainder P1 
9770: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
9780: 43 6f 6d 70 75 74 65 20 74 68 65 20 72 65 6d 61  Compute the rema
9790: 69 6e 64 65 72 20 61 66 74 65 72 20 69 6e 74 65  inder after inte
97a0: 67 65 72 20 64 69 76 69 73 69 6f 6e 20 6f 66 20  ger division of 
97b0: 74 68 65 20 76 61 6c 75 65 20 69 6e 0a 2a 2a 20  the value in.** 
97c0: 72 65 67 69 73 74 65 72 20 50 31 20 62 79 20 74  register P1 by t
97d0: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
97e0: 73 74 65 72 20 50 32 20 61 6e 64 20 73 74 6f 72  ster P2 and stor
97f0: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
9800: 50 33 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 76  P3. .** If the v
9810: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
9820: 20 50 32 20 69 73 20 7a 65 72 6f 20 74 68 65 20   P2 is zero the 
9830: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
9840: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 70 65  ** If either ope
9850: 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c 20 74 68  rand is NULL, th
9860: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
9870: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 64 64  ..*/.case OP_Add
9880: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
9890: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
98a0: 4b 5f 50 4c 55 53 2c 20 69 6e 31 2c 20 69 6e 32  K_PLUS, in1, in2
98b0: 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f  , out3 */.case O
98c0: 50 5f 53 75 62 74 72 61 63 74 3a 20 20 20 20 20  P_Subtract:     
98d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
98e0: 20 61 73 20 54 4b 5f 4d 49 4e 55 53 2c 20 69 6e   as TK_MINUS, in
98f0: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
9900: 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79  case OP_Multiply
9910: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  :              /
9920: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 54 41  * same as TK_STA
9930: 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  R, in1, in2, out
9940: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 69 76  3 */.case OP_Div
9950: 69 64 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  ide:            
9960: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
9970: 4b 5f 53 4c 41 53 48 2c 20 69 6e 31 2c 20 69 6e  K_SLASH, in1, in
9980: 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
9990: 4f 50 5f 52 65 6d 61 69 6e 64 65 72 3a 20 7b 20  OP_Remainder: { 
99a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
99b0: 65 20 61 73 20 54 4b 5f 52 45 4d 2c 20 69 6e 31  e as TK_REM, in1
99c0: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20  , in2, out3 */. 
99d0: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
99e0: 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 4d 45 4d   /* Combined MEM
99f0: 5f 2a 20 66 6c 61 67 73 20 66 72 6f 6d 20 62 6f  _* flags from bo
9a00: 74 68 20 69 6e 70 75 74 73 20 2a 2f 0a 20 20 69  th inputs */.  i
9a10: 36 34 20 69 41 3b 20 20 20 20 20 20 20 20 20 2f  64 iA;         /
9a20: 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65 20  * Integer value 
9a30: 6f 66 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  of left operand 
9a40: 2a 2f 0a 20 20 69 36 34 20 69 42 3b 20 20 20 20  */.  i64 iB;    
9a50: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
9a60: 76 61 6c 75 65 20 6f 66 20 72 69 67 68 74 20 6f  value of right o
9a70: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f 75 62  perand */.  doub
9a80: 6c 65 20 72 41 3b 20 20 20 20 20 20 2f 2a 20 52  le rA;      /* R
9a90: 65 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 65 66  eal value of lef
9aa0: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 64  t operand */.  d
9ab0: 6f 75 62 6c 65 20 72 42 3b 20 20 20 20 20 20 2f  ouble rB;      /
9ac0: 2a 20 52 65 61 6c 20 76 61 6c 75 65 20 6f 66 20  * Real value of 
9ad0: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f  right operand */
9ae0: 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ..  pIn1 = &aMem
9af0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 70 70  [pOp->p1];.  app
9b00: 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  lyNumericAffinit
9b10: 79 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e 32 20  y(pIn1);.  pIn2 
9b20: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
9b30: 3b 0a 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63  ;.  applyNumeric
9b40: 41 66 66 69 6e 69 74 79 28 70 49 6e 32 29 3b 0a  Affinity(pIn2);.
9b50: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
9b60: 4f 70 2d 3e 70 33 5d 3b 0a 20 20 66 6c 61 67 73  Op->p3];.  flags
9b70: 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c   = pIn1->flags |
9b80: 20 70 49 6e 32 2d 3e 66 6c 61 67 73 3b 0a 20 20   pIn2->flags;.  
9b90: 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d  if( (flags & MEM
9ba0: 5f 4e 75 6c 6c 29 21 3d 30 20 29 20 67 6f 74 6f  _Null)!=0 ) goto
9bb0: 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75   arithmetic_resu
9bc0: 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 69 66  lt_is_null;.  if
9bd0: 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
9be0: 20 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn2->flags & M
9bf0: 45 4d 5f 49 6e 74 29 3d 3d 4d 45 4d 5f 49 6e 74  EM_Int)==MEM_Int
9c00: 20 29 7b 0a 20 20 20 20 69 41 20 3d 20 70 49 6e   ){.    iA = pIn
9c10: 31 2d 3e 75 2e 69 3b 0a 20 20 20 20 69 42 20 3d  1->u.i;.    iB =
9c20: 20 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20 20   pIn2->u.i;.    
9c30: 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63  switch( pOp->opc
9c40: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ode ){.      cas
9c50: 65 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20  e OP_Add:       
9c60: 69 66 28 20 73 71 6c 69 74 65 33 41 64 64 49 6e  if( sqlite3AddIn
9c70: 74 36 34 28 26 69 42 2c 69 41 29 20 29 20 67 6f  t64(&iB,iA) ) go
9c80: 74 6f 20 66 70 5f 6d 61 74 68 3b 20 20 62 72 65  to fp_math;  bre
9c90: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
9ca0: 50 5f 53 75 62 74 72 61 63 74 3a 20 20 69 66 28  P_Subtract:  if(
9cb0: 20 73 71 6c 69 74 65 33 53 75 62 49 6e 74 36 34   sqlite3SubInt64
9cc0: 28 26 69 42 2c 69 41 29 20 29 20 67 6f 74 6f 20  (&iB,iA) ) goto 
9cd0: 66 70 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b  fp_math;  break;
9ce0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4d  .      case OP_M
9cf0: 75 6c 74 69 70 6c 79 3a 20 20 69 66 28 20 73 71  ultiply:  if( sq
9d00: 6c 69 74 65 33 4d 75 6c 49 6e 74 36 34 28 26 69  lite3MulInt64(&i
9d10: 42 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 70 5f  B,iA) ) goto fp_
9d20: 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20  math;  break;.  
9d30: 20 20 20 20 63 61 73 65 20 4f 50 5f 44 69 76 69      case OP_Divi
9d40: 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  de: {.        if
9d50: 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61  ( iA==0 ) goto a
9d60: 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74  rithmetic_result
9d70: 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20  _is_null;.      
9d80: 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 26 26 20    if( iA==-1 && 
9d90: 69 42 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54  iB==SMALLEST_INT
9da0: 36 34 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74  64 ) goto fp_mat
9db0: 68 3b 0a 20 20 20 20 20 20 20 20 69 42 20 2f 3d  h;.        iB /=
9dc0: 20 69 41 3b 0a 20 20 20 20 20 20 20 20 62 72 65   iA;.        bre
9dd0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
9de0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
9df0: 20 20 20 20 20 69 66 28 20 69 41 3d 3d 30 20 29       if( iA==0 )
9e00: 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63   goto arithmetic
9e10: 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b  _result_is_null;
9e20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d  .        if( iA=
9e30: 3d 2d 31 20 29 20 69 41 20 3d 20 31 3b 0a 20 20  =-1 ) iA = 1;.  
9e40: 20 20 20 20 20 20 69 42 20 25 3d 20 69 41 3b 0a        iB %= iA;.
9e50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9e60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9e70: 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 42 3b   pOut->u.i = iB;
9e80: 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46  .    MemSetTypeF
9e90: 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e  lag(pOut, MEM_In
9ea0: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 66 70 5f  t);.  }else{.fp_
9eb0: 6d 61 74 68 3a 0a 20 20 20 20 72 41 20 3d 20 73  math:.    rA = s
9ec0: 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56 61  qlite3VdbeRealVa
9ed0: 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 20 20 72  lue(pIn1);.    r
9ee0: 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  B = sqlite3VdbeR
9ef0: 65 61 6c 56 61 6c 75 65 28 70 49 6e 32 29 3b 0a  ealValue(pIn2);.
9f00: 20 20 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d      switch( pOp-
9f10: 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20  >opcode ){.     
9f20: 20 63 61 73 65 20 4f 50 5f 41 64 64 3a 20 20 20   case OP_Add:   
9f30: 20 20 20 20 20 20 72 42 20 2b 3d 20 72 41 3b 20        rB += rA; 
9f40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9f50: 20 20 20 63 61 73 65 20 4f 50 5f 53 75 62 74 72     case OP_Subtr
9f60: 61 63 74 3a 20 20 20 20 72 42 20 2d 3d 20 72 41  act:    rB -= rA
9f70: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
9f80: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4d 75 6c       case OP_Mul
9f90: 74 69 70 6c 79 3a 20 20 20 20 72 42 20 2a 3d 20  tiply:    rB *= 
9fa0: 72 41 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  rA;       break;
9fb0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 44  .      case OP_D
9fc0: 69 76 69 64 65 3a 20 7b 0a 20 20 20 20 20 20 20  ivide: {.       
9fd0: 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e   /* (double)0 In
9fe0: 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f   case of SQLITE_
9ff0: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
a000: 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  INT... */.      
a010: 20 20 69 66 28 20 72 41 3d 3d 28 64 6f 75 62 6c    if( rA==(doubl
a020: 65 29 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68  e)0 ) goto arith
a030: 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f  metic_result_is_
a040: 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 72 42  null;.        rB
a050: 20 2f 3d 20 72 41 3b 0a 20 20 20 20 20 20 20 20   /= rA;.        
a060: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
a070: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
a080: 20 20 20 20 20 20 20 20 69 41 20 3d 20 28 69 36          iA = (i6
a090: 34 29 72 41 3b 0a 20 20 20 20 20 20 20 20 69 42  4)rA;.        iB
a0a0: 20 3d 20 28 69 36 34 29 72 42 3b 0a 20 20 20 20   = (i64)rB;.    
a0b0: 20 20 20 20 69 66 28 20 69 41 3d 3d 30 20 29 20      if( iA==0 ) 
a0c0: 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f  goto arithmetic_
a0d0: 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a  result_is_null;.
a0e0: 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d          if( iA==
a0f0: 2d 31 20 29 20 69 41 20 3d 20 31 3b 0a 20 20 20  -1 ) iA = 1;.   
a100: 20 20 20 20 20 72 42 20 3d 20 28 64 6f 75 62 6c       rB = (doubl
a110: 65 29 28 69 42 20 25 20 69 41 29 3b 0a 20 20 20  e)(iB % iA);.   
a120: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a130: 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66    }.    }.#ifdef
a140: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
a150: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
a160: 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 42 3b 0a  pOut->u.i = rB;.
a170: 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
a180: 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74  ag(pOut, MEM_Int
a190: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  );.#else.    if(
a1a0: 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 72 42   sqlite3IsNaN(rB
a1b0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
a1c0: 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c  arithmetic_resul
a1d0: 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 7d  t_is_null;.    }
a1e0: 0a 20 20 20 20 70 4f 75 74 2d 3e 72 20 3d 20 72  .    pOut->r = r
a1f0: 42 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70  B;.    MemSetTyp
a200: 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f  eFlag(pOut, MEM_
a210: 52 65 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 28  Real);.    if( (
a220: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
a230: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
a240: 6c 69 74 65 33 56 64 62 65 49 6e 74 65 67 65 72  lite3VdbeInteger
a250: 41 66 66 69 6e 69 74 79 28 70 4f 75 74 29 3b 0a  Affinity(pOut);.
a260: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
a270: 0a 20 20 62 72 65 61 6b 3b 0a 0a 61 72 69 74 68  .  break;..arith
a280: 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f  metic_result_is_
a290: 6e 75 6c 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56  null:.  sqlite3V
a2a0: 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f  dbeMemSetNull(pO
a2b0: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
a2c0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6c 6c  ./* Opcode: Coll
a2d0: 53 65 71 20 2a 20 2a 20 50 34 0a 2a 2a 0a 2a 2a  Seq * * P4.**.**
a2e0: 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72   P4 is a pointer
a2f0: 20 74 6f 20 61 20 43 6f 6c 6c 53 65 71 20 73 74   to a CollSeq st
a300: 72 75 63 74 2e 20 49 66 20 74 68 65 20 6e 65 78  ruct. If the nex
a310: 74 20 63 61 6c 6c 20 74 6f 20 61 20 75 73 65 72  t call to a user
a320: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6f 72 20   function.** or 
a330: 61 67 67 72 65 67 61 74 65 20 63 61 6c 6c 73 20  aggregate calls 
a340: 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f  sqlite3GetFuncCo
a350: 6c 6c 53 65 71 28 29 2c 20 74 68 69 73 20 63 6f  llSeq(), this co
a360: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
a370: 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75   will.** be retu
a380: 72 6e 65 64 2e 20 54 68 69 73 20 69 73 20 75 73  rned. This is us
a390: 65 64 20 62 79 20 74 68 65 20 62 75 69 6c 74 2d  ed by the built-
a3a0: 69 6e 20 6d 69 6e 28 29 2c 20 6d 61 78 28 29 20  in min(), max() 
a3b0: 61 6e 64 20 6e 75 6c 6c 69 66 28 29 0a 2a 2a 20  and nullif().** 
a3c0: 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  functions..**.**
a3d0: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 75   The interface u
a3e0: 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
a3f0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
a400: 20 61 66 6f 72 65 6d 65 6e 74 69 6f 6e 65 64 20   aforementioned 
a410: 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 6f 20  functions.** to 
a420: 72 65 74 72 69 65 76 65 20 74 68 65 20 63 6f 6c  retrieve the col
a430: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
a440: 73 65 74 20 62 79 20 74 68 69 73 20 6f 70 63 6f  set by this opco
a450: 64 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  de is not availa
a460: 62 6c 65 0a 2a 2a 20 70 75 62 6c 69 63 6c 79 2c  ble.** publicly,
a470: 20 6f 6e 6c 79 20 74 6f 20 75 73 65 72 20 66 75   only to user fu
a480: 6e 63 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20  nctions defined 
a490: 69 6e 20 66 75 6e 63 2e 63 2e 0a 2a 2f 0a 63 61  in func.c..*/.ca
a4a0: 73 65 20 4f 50 5f 43 6f 6c 6c 53 65 71 3a 20 7b  se OP_CollSeq: {
a4b0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
a4c0: 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53  p4type==P4_COLLS
a4d0: 45 51 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  EQ );.  break;.}
a4e0: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 75 6e  ../* Opcode: Fun
a4f0: 63 74 69 6f 6e 20 50 31 20 50 32 20 50 33 20 50  ction P1 P2 P3 P
a500: 34 20 50 35 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b  4 P5.**.** Invok
a510: 65 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f  e a user functio
a520: 6e 20 28 50 34 20 69 73 20 61 20 70 6f 69 6e 74  n (P4 is a point
a530: 65 72 20 74 6f 20 61 20 46 75 6e 63 74 69 6f 6e  er to a Function
a540: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 0a   structure that.
a550: 2a 2a 20 64 65 66 69 6e 65 73 20 74 68 65 20 66  ** defines the f
a560: 75 6e 63 74 69 6f 6e 29 20 77 69 74 68 20 50 35  unction) with P5
a570: 20 61 72 67 75 6d 65 6e 74 73 20 74 61 6b 65 6e   arguments taken
a580: 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50   from register P
a590: 32 20 61 6e 64 0a 2a 2a 20 73 75 63 63 65 73 73  2 and.** success
a5a0: 6f 72 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ors.  The result
a5b0: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
a5c0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
a5d0: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 52 65  gister P3..** Re
a5e0: 67 69 73 74 65 72 20 50 33 20 6d 75 73 74 20 6e  gister P3 must n
a5f0: 6f 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  ot be one of the
a600: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 70 75 74 73   function inputs
a610: 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20  ..**.** P1 is a 
a620: 33 32 2d 62 69 74 20 62 69 74 6d 61 73 6b 20 69  32-bit bitmask i
a630: 6e 64 69 63 61 74 69 6e 67 20 77 68 65 74 68 65  ndicating whethe
a640: 72 20 6f 72 20 6e 6f 74 20 65 61 63 68 20 61 72  r or not each ar
a650: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 0a 2a  gument to the .*
a660: 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 64  * function was d
a670: 65 74 65 72 6d 69 6e 65 64 20 74 6f 20 62 65 20  etermined to be 
a680: 63 6f 6e 73 74 61 6e 74 20 61 74 20 63 6f 6d 70  constant at comp
a690: 69 6c 65 20 74 69 6d 65 2e 20 49 66 20 74 68 65  ile time. If the
a6a0: 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
a6b0: 6e 74 20 77 61 73 20 63 6f 6e 73 74 61 6e 74 20  nt was constant 
a6c0: 74 68 65 6e 20 62 69 74 20 30 20 6f 66 20 50 31  then bit 0 of P1
a6d0: 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 69 73   is set. This is
a6e0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
a6f0: 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6d 65  ne.** whether me
a700: 74 61 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta data associat
a710: 65 64 20 77 69 74 68 20 61 20 75 73 65 72 20 66  ed with a user f
a720: 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
a730: 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71   using the.** sq
a740: 6c 69 74 65 33 5f 73 65 74 5f 61 75 78 64 61 74  lite3_set_auxdat
a750: 61 28 29 20 41 50 49 20 6d 61 79 20 62 65 20 73  a() API may be s
a760: 61 66 65 6c 79 20 72 65 74 61 69 6e 65 64 20 75  afely retained u
a770: 6e 74 69 6c 20 74 68 65 20 6e 65 78 74 0a 2a 2a  ntil the next.**
a780: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
a790: 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  his opcode..**.*
a7a0: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 41 67 67 53  * See also: AggS
a7b0: 74 65 70 20 61 6e 64 20 41 67 67 46 69 6e 61 6c  tep and AggFinal
a7c0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 75 6e 63  .*/.case OP_Func
a7d0: 74 69 6f 6e 3a 20 7b 0a 20 20 69 6e 74 20 69 3b  tion: {.  int i;
a7e0: 0a 20 20 4d 65 6d 20 2a 70 41 72 67 3b 0a 20 20  .  Mem *pArg;.  
a7f0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
a800: 63 74 78 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ctx;.  sqlite3_v
a810: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 3b 0a 20 20  alue **apVal;.  
a820: 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70 4f  int n;..  n = pO
a830: 70 2d 3e 70 35 3b 0a 20 20 61 70 56 61 6c 20 3d  p->p5;.  apVal =
a840: 20 70 2d 3e 61 70 41 72 67 3b 0a 20 20 61 73 73   p->apArg;.  ass
a850: 65 72 74 28 20 61 70 56 61 6c 20 7c 7c 20 6e 3d  ert( apVal || n=
a860: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
a870: 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70  pOp->p3>0 && pOp
a880: 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b  ->p3<=p->nMem );
a890: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
a8a0: 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41  pOp->p3];.  memA
a8b0: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
a8c0: 70 4f 75 74 29 3b 0a 0a 20 20 61 73 73 65 72 74  pOut);..  assert
a8d0: 28 20 6e 3d 3d 30 20 7c 7c 20 28 70 4f 70 2d 3e  ( n==0 || (pOp->
a8e0: 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b  p2>0 && pOp->p2+
a8f0: 6e 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 29 20 29 3b  n<=p->nMem+1) );
a900: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
a910: 70 33 3c 70 4f 70 2d 3e 70 32 20 7c 7c 20 70 4f  p3<pOp->p2 || pO
a920: 70 2d 3e 70 33 3e 3d 70 4f 70 2d 3e 70 32 2b 6e  p->p3>=pOp->p2+n
a930: 20 29 3b 0a 20 20 70 41 72 67 20 3d 20 26 61 4d   );.  pArg = &aM
a940: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 66  em[pOp->p2];.  f
a950: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
a960: 2c 20 70 41 72 67 2b 2b 29 7b 0a 20 20 20 20 61  , pArg++){.    a
a970: 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
a980: 64 28 70 41 72 67 29 20 29 3b 0a 20 20 20 20 61  d(pArg) );.    a
a990: 70 56 61 6c 5b 69 5d 20 3d 20 70 41 72 67 3b 0a  pVal[i] = pArg;.
a9a0: 20 20 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69      Deephemerali
a9b0: 7a 65 28 70 41 72 67 29 3b 0a 20 20 20 20 73 71  ze(pArg);.    sq
a9c0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f 72  lite3VdbeMemStor
a9d0: 65 54 79 70 65 28 70 41 72 67 29 3b 0a 20 20 20  eType(pArg);.   
a9e0: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
a9f0: 70 4f 70 2d 3e 70 32 2b 69 2c 20 70 41 72 67 29  pOp->p2+i, pArg)
aa00: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
aa10: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
aa20: 5f 46 55 4e 43 44 45 46 20 7c 7c 20 70 4f 70 2d  _FUNCDEF || pOp-
aa30: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 56 44 42 45  >p4type==P4_VDBE
aa40: 46 55 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 4f  FUNC );.  if( pO
aa50: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55  p->p4type==P4_FU
aa60: 4e 43 44 45 46 20 29 7b 0a 20 20 20 20 63 74 78  NCDEF ){.    ctx
aa70: 2e 70 46 75 6e 63 20 3d 20 70 4f 70 2d 3e 70 34  .pFunc = pOp->p4
aa80: 2e 70 46 75 6e 63 3b 0a 20 20 20 20 63 74 78 2e  .pFunc;.    ctx.
aa90: 70 56 64 62 65 46 75 6e 63 20 3d 20 30 3b 0a 20  pVdbeFunc = 0;. 
aaa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 74 78 2e   }else{.    ctx.
aab0: 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62  pVdbeFunc = (Vdb
aac0: 65 46 75 6e 63 2a 29 70 4f 70 2d 3e 70 34 2e 70  eFunc*)pOp->p4.p
aad0: 56 64 62 65 46 75 6e 63 3b 0a 20 20 20 20 63 74  VdbeFunc;.    ct
aae0: 78 2e 70 46 75 6e 63 20 3d 20 63 74 78 2e 70 56  x.pFunc = ctx.pV
aaf0: 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 3b 0a  dbeFunc->pFunc;.
ab00: 20 20 7d 0a 0a 20 20 63 74 78 2e 73 2e 66 6c 61    }..  ctx.s.fla
ab10: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
ab20: 20 63 74 78 2e 73 2e 64 62 20 3d 20 64 62 3b 0a   ctx.s.db = db;.
ab30: 20 20 63 74 78 2e 73 2e 78 44 65 6c 20 3d 20 30    ctx.s.xDel = 0
ab40: 3b 0a 20 20 63 74 78 2e 73 2e 7a 4d 61 6c 6c 6f  ;.  ctx.s.zMallo
ab50: 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65  c = 0;..  /* The
ab60: 20 6f 75 74 70 75 74 20 63 65 6c 6c 20 6d 61 79   output cell may
ab70: 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
ab80: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
ab90: 2e 20 4d 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20  . Move.  ** the 
aba0: 70 6f 69 6e 74 65 72 20 74 6f 20 63 74 78 2e 73  pointer to ctx.s
abb0: 20 73 6f 20 69 6e 20 63 61 73 65 20 74 68 65 20   so in case the 
abc0: 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 63 61  user-function ca
abd0: 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 61  n use.  ** the a
abe0: 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64  lready allocated
abf0: 20 62 75 66 66 65 72 20 69 6e 73 74 65 61 64 20   buffer instead 
ac00: 6f 66 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  of allocating a 
ac10: 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  new one..  */.  
ac20: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f  sqlite3VdbeMemMo
ac30: 76 65 28 26 63 74 78 2e 73 2c 20 70 4f 75 74 29  ve(&ctx.s, pOut)
ac40: 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c  ;.  MemSetTypeFl
ac50: 61 67 28 26 63 74 78 2e 73 2c 20 4d 45 4d 5f 4e  ag(&ctx.s, MEM_N
ac60: 75 6c 6c 29 3b 0a 0a 20 20 63 74 78 2e 69 73 45  ull);..  ctx.isE
ac70: 72 72 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  rror = 0;.  if( 
ac80: 63 74 78 2e 70 46 75 6e 63 2d 3e 66 6c 61 67 73  ctx.pFunc->flags
ac90: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
aca0: 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 61  EEDCOLL ){.    a
acb0: 73 73 65 72 74 28 20 70 4f 70 3e 61 4f 70 20 29  ssert( pOp>aOp )
acc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
acd0: 70 5b 2d 31 5d 2e 70 34 74 79 70 65 3d 3d 50 34  p[-1].p4type==P4
ace0: 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 20 20  _COLLSEQ );.    
acf0: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
ad00: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53  opcode==OP_CollS
ad10: 65 71 20 29 3b 0a 20 20 20 20 63 74 78 2e 70 43  eq );.    ctx.pC
ad20: 6f 6c 6c 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 34  oll = pOp[-1].p4
ad30: 2e 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 64 62  .pColl;.  }.  db
ad40: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6c 61  ->lastRowid = la
ad50: 73 74 52 6f 77 69 64 3b 0a 20 20 28 2a 63 74 78  stRowid;.  (*ctx
ad60: 2e 70 46 75 6e 63 2d 3e 78 46 75 6e 63 29 28 26  .pFunc->xFunc)(&
ad70: 63 74 78 2c 20 6e 2c 20 61 70 56 61 6c 29 3b 20  ctx, n, apVal); 
ad80: 2f 2a 20 49 4d 50 3a 20 52 2d 32 34 35 30 35 2d  /* IMP: R-24505-
ad90: 32 33 32 33 30 20 2a 2f 0a 20 20 6c 61 73 74 52  23230 */.  lastR
ada0: 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61 73 74 52  owid = db->lastR
adb0: 6f 77 69 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  owid;..  /* If a
adc0: 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ny auxiliary dat
add0: 61 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65  a functions have
ade0: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 62 79 20   been called by 
adf0: 74 68 69 73 20 75 73 65 72 20 66 75 6e 63 74 69  this user functi
ae00: 6f 6e 2c 0a 20 20 2a 2a 20 69 6d 6d 65 64 69 61  on,.  ** immedia
ae10: 74 65 6c 79 20 63 61 6c 6c 20 74 68 65 20 64 65  tely call the de
ae20: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61 6e 79  structor for any
ae30: 20 6e 6f 6e 2d 73 74 61 74 69 63 20 76 61 6c 75   non-static valu
ae40: 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  es..  */.  if( c
ae50: 74 78 2e 70 56 64 62 65 46 75 6e 63 20 29 7b 0a  tx.pVdbeFunc ){.
ae60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44      sqlite3VdbeD
ae70: 65 6c 65 74 65 41 75 78 44 61 74 61 28 63 74 78  eleteAuxData(ctx
ae80: 2e 70 56 64 62 65 46 75 6e 63 2c 20 70 4f 70 2d  .pVdbeFunc, pOp-
ae90: 3e 70 31 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  >p1);.    pOp->p
aea0: 34 2e 70 56 64 62 65 46 75 6e 63 20 3d 20 63 74  4.pVdbeFunc = ct
aeb0: 78 2e 70 56 64 62 65 46 75 6e 63 3b 0a 20 20 20  x.pVdbeFunc;.   
aec0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
aed0: 34 5f 56 44 42 45 46 55 4e 43 3b 0a 20 20 7d 0a  4_VDBEFUNC;.  }.
aee0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
aef0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 2f  cFailed ){.    /
af00: 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 61 20  * Even though a 
af10: 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 66 61 69  malloc() has fai
af20: 6c 65 64 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65  led, the impleme
af30: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  ntation of the. 
af40: 20 20 20 2a 2a 20 75 73 65 72 20 66 75 6e 63 74     ** user funct
af50: 69 6f 6e 20 6d 61 79 20 68 61 76 65 20 63 61 6c  ion may have cal
af60: 6c 65 64 20 61 6e 20 73 71 6c 69 74 65 33 5f 72  led an sqlite3_r
af70: 65 73 75 6c 74 5f 58 58 58 28 29 20 66 75 6e 63  esult_XXX() func
af80: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 6f 20 72  tion.    ** to r
af90: 65 74 75 72 6e 20 61 20 76 61 6c 75 65 2e 20 54  eturn a value. T
afa0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
afb0: 6c 20 72 65 6c 65 61 73 65 73 20 61 6e 79 20 72  l releases any r
afc0: 65 73 6f 75 72 63 65 73 0a 20 20 20 20 2a 2a 20  esources.    ** 
afd0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
afe0: 73 75 63 68 20 61 20 76 61 6c 75 65 2e 0a 20 20  such a value..  
aff0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
b000: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
b010: 63 74 78 2e 73 29 3b 0a 20 20 20 20 67 6f 74 6f  ctx.s);.    goto
b020: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 0a 20 20   no_mem;.  }..  
b030: 2f 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  /* If the functi
b040: 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  on returned an e
b050: 72 72 6f 72 2c 20 74 68 72 6f 77 20 61 6e 20 65  rror, throw an e
b060: 78 63 65 70 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  xception */.  if
b070: 28 20 63 74 78 2e 69 73 45 72 72 6f 72 20 29 7b  ( ctx.isError ){
b080: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
b090: 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
b0a0: 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c  g, db, "%s", sql
b0b0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
b0c0: 26 63 74 78 2e 73 29 29 3b 0a 20 20 20 20 72 63  &ctx.s));.    rc
b0d0: 20 3d 20 63 74 78 2e 69 73 45 72 72 6f 72 3b 0a   = ctx.isError;.
b0e0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74    }..  /* Copy t
b0f0: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
b100: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 74 6f 20 72   function into r
b110: 65 67 69 73 74 65 72 20 50 33 20 2a 2f 0a 20 20  egister P3 */.  
b120: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
b130: 65 45 6e 63 6f 64 69 6e 67 28 26 63 74 78 2e 73  eEncoding(&ctx.s
b140: 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 73  , encoding);.  s
b150: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76  qlite3VdbeMemMov
b160: 65 28 70 4f 75 74 2c 20 26 63 74 78 2e 73 29 3b  e(pOut, &ctx.s);
b170: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  .  if( sqlite3Vd
b180: 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 4f 75 74  beMemTooBig(pOut
b190: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f  ) ){.    goto to
b1a0: 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a 23 69 66 20  o_big;.  }..#if 
b1b0: 30 0a 20 20 2f 2a 20 54 68 65 20 61 70 70 2d 64  0.  /* The app-d
b1c0: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 20  efined function 
b1d0: 68 61 73 20 64 6f 6e 65 20 73 6f 6d 65 74 68 69  has done somethi
b1e0: 6e 67 20 74 68 61 74 20 61 73 20 63 61 75 73 65  ng that as cause
b1f0: 64 20 74 68 69 73 0a 20 20 2a 2a 20 73 74 61 74  d this.  ** stat
b200: 65 6d 65 6e 74 20 74 6f 20 65 78 70 69 72 65 2e  ement to expire.
b210: 20 20 28 50 65 72 68 61 70 73 20 74 68 65 20 66    (Perhaps the f
b220: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 73  unction called s
b230: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 20 20  qlite3_exec().  
b240: 2a 2a 20 77 69 74 68 20 61 20 43 52 45 41 54 45  ** with a CREATE
b250: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
b260: 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  .).  */.  if( p-
b270: 3e 65 78 70 69 72 65 64 20 29 20 72 63 20 3d 20  >expired ) rc = 
b280: 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 23 65  SQLITE_ABORT;.#e
b290: 6e 64 69 66 0a 0a 20 20 52 45 47 49 53 54 45 52  ndif..  REGISTER
b2a0: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20  _TRACE(pOp->p3, 
b2b0: 70 4f 75 74 29 3b 0a 20 20 55 50 44 41 54 45 5f  pOut);.  UPDATE_
b2c0: 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75  MAX_BLOBSIZE(pOu
b2d0: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
b2e0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69 74 41 6e  /* Opcode: BitAn
b2f0: 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  d P1 P2 P3 * *.*
b300: 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 62 69  *.** Take the bi
b310: 74 2d 77 69 73 65 20 41 4e 44 20 6f 66 20 74 68  t-wise AND of th
b320: 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69  e values in regi
b330: 73 74 65 72 20 50 31 20 61 6e 64 20 50 32 20 61  ster P1 and P2 a
b340: 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20  nd.** store the 
b350: 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74  result in regist
b360: 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74  er P3..** If eit
b370: 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c  her input is NUL
b380: 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  L, the result is
b390: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63   NULL..*/./* Opc
b3a0: 6f 64 65 3a 20 42 69 74 4f 72 20 50 31 20 50 32  ode: BitOr P1 P2
b3b0: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 61   P3 * *.**.** Ta
b3c0: 6b 65 20 74 68 65 20 62 69 74 2d 77 69 73 65 20  ke the bit-wise 
b3d0: 4f 52 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73  OR of the values
b3e0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
b3f0: 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73 74  and P2 and.** st
b400: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
b410: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
b420: 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75  * If either inpu
b430: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  t is NULL, the r
b440: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
b450: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68 69  /./* Opcode: Shi
b460: 66 74 4c 65 66 74 20 50 31 20 50 32 20 50 33 20  ftLeft P1 P2 P3 
b470: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74 20  * *.**.** Shift 
b480: 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
b490: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
b4a0: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 62 79 20   to the left by 
b4b0: 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
b4c0: 20 62 69 74 73 20 73 70 65 63 69 66 69 65 64 20   bits specified 
b4d0: 62 79 20 74 68 65 20 69 6e 74 65 67 65 72 20 69  by the integer i
b4e0: 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a  n register P1..*
b4f0: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
b500: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
b510: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
b520: 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74  input is NULL, t
b530: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
b540: 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  L..*/./* Opcode:
b550: 20 53 68 69 66 74 52 69 67 68 74 20 50 31 20 50   ShiftRight P1 P
b560: 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53  2 P3 * *.**.** S
b570: 68 69 66 74 20 74 68 65 20 69 6e 74 65 67 65 72  hift the integer
b580: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
b590: 65 72 20 50 32 20 74 6f 20 74 68 65 20 72 69 67  er P2 to the rig
b5a0: 68 74 20 62 79 20 74 68 65 0a 2a 2a 20 6e 75 6d  ht by the.** num
b5b0: 62 65 72 20 6f 66 20 62 69 74 73 20 73 70 65 63  ber of bits spec
b5c0: 69 66 69 65 64 20 62 79 20 74 68 65 20 69 6e 74  ified by the int
b5d0: 65 67 65 72 20 69 6e 20 72 65 67 69 73 74 65 72  eger in register
b5e0: 20 50 31 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68   P1..** Store th
b5f0: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
b600: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
b610: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
b620: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
b630: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65  is NULL..*/.case
b640: 20 4f 50 5f 42 69 74 41 6e 64 3a 20 20 20 20 20   OP_BitAnd:     
b650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
b660: 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 41 4e 44  ame as TK_BITAND
b670: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
b680: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74 4f   */.case OP_BitO
b690: 72 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r:              
b6a0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
b6b0: 4b 5f 42 49 54 4f 52 2c 20 69 6e 31 2c 20 69 6e  K_BITOR, in1, in
b6c0: 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
b6d0: 4f 50 5f 53 68 69 66 74 4c 65 66 74 3a 20 20 20  OP_ShiftLeft:   
b6e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
b6f0: 6d 65 20 61 73 20 54 4b 5f 4c 53 48 49 46 54 2c  me as TK_LSHIFT,
b700: 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
b710: 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 68 69 66 74  */.case OP_Shift
b720: 52 69 67 68 74 3a 20 7b 20 20 20 20 20 20 20 20  Right: {        
b730: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
b740: 5f 52 53 48 49 46 54 2c 20 69 6e 31 2c 20 69 6e  _RSHIFT, in1, in
b750: 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34  2, out3 */.  i64
b760: 20 69 41 3b 0a 20 20 75 36 34 20 75 41 3b 0a 20   iA;.  u64 uA;. 
b770: 20 69 36 34 20 69 42 3b 0a 20 20 75 38 20 6f 70   i64 iB;.  u8 op
b780: 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  ;..  pIn1 = &aMe
b790: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49  m[pOp->p1];.  pI
b7a0: 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n2 = &aMem[pOp->
b7b0: 70 32 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61  p2];.  pOut = &a
b7c0: 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
b7d0: 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
b7e0: 20 7c 20 70 49 6e 32 2d 3e 66 6c 61 67 73 29 20   | pIn2->flags) 
b7f0: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
b800: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
b810: 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
b820: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
b830: 69 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  iA = sqlite3Vdbe
b840: 49 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 3b 0a  IntValue(pIn2);.
b850: 20 20 69 42 20 3d 20 73 71 6c 69 74 65 33 56 64    iB = sqlite3Vd
b860: 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29  beIntValue(pIn1)
b870: 3b 0a 20 20 6f 70 20 3d 20 70 4f 70 2d 3e 6f 70  ;.  op = pOp->op
b880: 63 6f 64 65 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  code;.  if( op==
b890: 4f 50 5f 42 69 74 41 6e 64 20 29 7b 0a 20 20 20  OP_BitAnd ){.   
b8a0: 20 69 41 20 26 3d 20 69 42 3b 0a 20 20 7d 65 6c   iA &= iB;.  }el
b8b0: 73 65 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 42 69  se if( op==OP_Bi
b8c0: 74 4f 72 20 29 7b 0a 20 20 20 20 69 41 20 7c 3d  tOr ){.    iA |=
b8d0: 20 69 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   iB;.  }else if(
b8e0: 20 69 42 21 3d 30 20 29 7b 0a 20 20 20 20 61 73   iB!=0 ){.    as
b8f0: 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 53 68 69  sert( op==OP_Shi
b900: 66 74 52 69 67 68 74 20 7c 7c 20 6f 70 3d 3d 4f  ftRight || op==O
b910: 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 0a  P_ShiftLeft );..
b920: 20 20 20 20 2f 2a 20 49 66 20 73 68 69 66 74 69      /* If shifti
b930: 6e 67 20 62 79 20 61 20 6e 65 67 61 74 69 76 65  ng by a negative
b940: 20 61 6d 6f 75 6e 74 2c 20 73 68 69 66 74 20 69   amount, shift i
b950: 6e 20 74 68 65 20 6f 74 68 65 72 20 64 69 72 65  n the other dire
b960: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28  ction */.    if(
b970: 20 69 42 3c 30 20 29 7b 0a 20 20 20 20 20 20 61   iB<0 ){.      a
b980: 73 73 65 72 74 28 20 4f 50 5f 53 68 69 66 74 52  ssert( OP_ShiftR
b990: 69 67 68 74 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  ight==OP_ShiftLe
b9a0: 66 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 6f 70  ft+1 );.      op
b9b0: 20 3d 20 32 2a 4f 50 5f 53 68 69 66 74 4c 65 66   = 2*OP_ShiftLef
b9c0: 74 20 2b 20 31 20 2d 20 6f 70 3b 0a 20 20 20 20  t + 1 - op;.    
b9d0: 20 20 69 42 20 3d 20 69 42 3e 28 2d 36 34 29 20    iB = iB>(-64) 
b9e0: 3f 20 2d 69 42 20 3a 20 36 34 3b 0a 20 20 20 20  ? -iB : 64;.    
b9f0: 7d 0a 0a 20 20 20 20 69 66 28 20 69 42 3e 3d 36  }..    if( iB>=6
ba00: 34 20 29 7b 0a 20 20 20 20 20 20 69 41 20 3d 20  4 ){.      iA = 
ba10: 28 69 41 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 4f 50  (iA>=0 || op==OP
ba20: 5f 53 68 69 66 74 4c 65 66 74 29 20 3f 20 30 20  _ShiftLeft) ? 0 
ba30: 3a 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  : -1;.    }else{
ba40: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 75  .      memcpy(&u
ba50: 41 2c 20 26 69 41 2c 20 73 69 7a 65 6f 66 28 75  A, &iA, sizeof(u
ba60: 41 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  A));.      if( o
ba70: 70 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  p==OP_ShiftLeft 
ba80: 29 7b 0a 20 20 20 20 20 20 20 20 75 41 20 3c 3c  ){.        uA <<
ba90: 3d 20 69 42 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = iB;.      }els
baa0: 65 7b 0a 20 20 20 20 20 20 20 20 75 41 20 3e 3e  e{.        uA >>
bab0: 3d 20 69 42 3b 0a 20 20 20 20 20 20 20 20 2f 2a  = iB;.        /*
bac0: 20 53 69 67 6e 2d 65 78 74 65 6e 64 20 6f 6e 20   Sign-extend on 
bad0: 61 20 72 69 67 68 74 20 73 68 69 66 74 20 6f 66  a right shift of
bae0: 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
baf0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  er */.        if
bb00: 28 20 69 41 3c 30 20 29 20 75 41 20 7c 3d 20 28  ( iA<0 ) uA |= (
bb10: 28 28 28 75 36 34 29 30 78 66 66 66 66 66 66 66  (((u64)0xfffffff
bb20: 66 29 3c 3c 33 32 29 7c 30 78 66 66 66 66 66 66  f)<<32)|0xffffff
bb30: 66 66 29 20 3c 3c 20 28 36 34 2d 69 42 29 3b 0a  ff) << (64-iB);.
bb40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
bb50: 6d 63 70 79 28 26 69 41 2c 20 26 75 41 2c 20 73  mcpy(&iA, &uA, s
bb60: 69 7a 65 6f 66 28 69 41 29 29 3b 0a 20 20 20 20  izeof(iA));.    
bb70: 7d 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e  }.  }.  pOut->u.
bb80: 69 20 3d 20 69 41 3b 0a 20 20 4d 65 6d 53 65 74  i = iA;.  MemSet
bb90: 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d  TypeFlag(pOut, M
bba0: 45 4d 5f 49 6e 74 29 3b 0a 20 20 62 72 65 61 6b  EM_Int);.  break
bbb0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
bbc0: 41 64 64 49 6d 6d 20 20 50 31 20 50 32 20 2a 20  AddImm  P1 P2 * 
bbd0: 2a 20 2a 0a 2a 2a 20 0a 2a 2a 20 41 64 64 20 74  * *.** .** Add t
bbe0: 68 65 20 63 6f 6e 73 74 61 6e 74 20 50 32 20 74  he constant P2 t
bbf0: 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  o the value in r
bc00: 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20 54  egister P1..** T
bc10: 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77  he result is alw
bc20: 61 79 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a  ays an integer..
bc30: 2a 2a 0a 2a 2a 20 54 6f 20 66 6f 72 63 65 20 61  **.** To force a
bc40: 6e 79 20 72 65 67 69 73 74 65 72 20 74 6f 20 62  ny register to b
bc50: 65 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 6a 75  e an integer, ju
bc60: 73 74 20 61 64 64 20 30 2e 0a 2a 2f 0a 63 61 73  st add 0..*/.cas
bc70: 65 20 4f 50 5f 41 64 64 49 6d 6d 3a 20 7b 20 20  e OP_AddImm: {  
bc80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31            /* in1
bc90: 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
bca0: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 6d  em[pOp->p1];.  m
bcb0: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
bcc0: 70 2c 20 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69  p, pIn1);.  sqli
bcd0: 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65  te3VdbeMemIntege
bce0: 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 70 49  rify(pIn1);.  pI
bcf0: 6e 31 2d 3e 75 2e 69 20 2b 3d 20 70 4f 70 2d 3e  n1->u.i += pOp->
bd00: 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  p2;.  break;.}..
bd10: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 75 73 74 42  /* Opcode: MustB
bd20: 65 49 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  eInt P1 P2 * * *
bd30: 0a 2a 2a 20 0a 2a 2a 20 46 6f 72 63 65 20 74 68  .** .** Force th
bd40: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
bd50: 74 65 72 20 50 31 20 74 6f 20 62 65 20 61 6e 20  ter P1 to be an 
bd60: 69 6e 74 65 67 65 72 2e 20 20 49 66 20 74 68 65  integer.  If the
bd70: 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20   value.** in P1 
bd80: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
bd90: 72 20 61 6e 64 20 63 61 6e 6e 6f 74 20 62 65 20  r and cannot be 
bda0: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
bdb0: 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20 77 69 74  n integer.** wit
bdc0: 68 6f 75 74 20 64 61 74 61 20 6c 6f 73 73 2c 20  hout data loss, 
bdd0: 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69  then jump immedi
bde0: 61 74 65 6c 79 20 74 6f 20 50 32 2c 20 6f 72 20  ately to P2, or 
bdf0: 69 66 20 50 32 3d 3d 30 0a 2a 2a 20 72 61 69 73  if P2==0.** rais
be00: 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53 4d  e an SQLITE_MISM
be10: 41 54 43 48 20 65 78 63 65 70 74 69 6f 6e 2e 0a  ATCH exception..
be20: 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 75 73 74 42  */.case OP_MustB
be30: 65 49 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20  eInt: {         
be40: 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20     /* jump, in1 
be50: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
be60: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 70  m[pOp->p1];.  ap
be70: 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e 31  plyAffinity(pIn1
be80: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  , SQLITE_AFF_NUM
be90: 45 52 49 43 2c 20 65 6e 63 6f 64 69 6e 67 29 3b  ERIC, encoding);
bea0: 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
beb0: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d  ags & MEM_Int)==
bec0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70  0 ){.    if( pOp
bed0: 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->p2==0 ){.     
bee0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53   rc = SQLITE_MIS
bef0: 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 67 6f 74  MATCH;.      got
bf00: 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
bf10: 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rror;.    }else{
bf20: 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  .      pc = pOp-
bf30: 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20  >p2 - 1;.    }. 
bf40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4d 65 6d 53   }else{.    MemS
bf50: 65 74 54 79 70 65 46 6c 61 67 28 70 49 6e 31 2c  etTypeFlag(pIn1,
bf60: 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 20   MEM_Int);.  }. 
bf70: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64   break;.}..#ifnd
bf80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
bf90: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
bfa0: 20 4f 70 63 6f 64 65 3a 20 52 65 61 6c 41 66 66   Opcode: RealAff
bfb0: 69 6e 69 74 79 20 50 31 20 2a 20 2a 20 2a 20 2a  inity P1 * * * *
bfc0: 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 69 73 74  .**.** If regist
bfd0: 65 72 20 50 31 20 68 6f 6c 64 73 20 61 6e 20 69  er P1 holds an i
bfe0: 6e 74 65 67 65 72 20 63 6f 6e 76 65 72 74 20 69  nteger convert i
bff0: 74 20 74 6f 20 61 20 72 65 61 6c 20 76 61 6c 75  t to a real valu
c000: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  e..**.** This op
c010: 63 6f 64 65 20 69 73 20 75 73 65 64 20 77 68 65  code is used whe
c020: 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69 6e 66  n extracting inf
c030: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20  ormation from a 
c040: 63 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 68  column that.** h
c050: 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79  as REAL affinity
c060: 2e 20 20 53 75 63 68 20 63 6f 6c 75 6d 6e 20 76  .  Such column v
c070: 61 6c 75 65 73 20 6d 61 79 20 73 74 69 6c 6c 20  alues may still 
c080: 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20  be stored as.** 
c090: 69 6e 74 65 67 65 72 73 2c 20 66 6f 72 20 73 70  integers, for sp
c0a0: 61 63 65 20 65 66 66 69 63 69 65 6e 63 79 2c 20  ace efficiency, 
c0b0: 62 75 74 20 61 66 74 65 72 20 65 78 74 72 61 63  but after extrac
c0c0: 74 69 6f 6e 20 77 65 20 77 61 6e 74 20 74 68 65  tion we want the
c0d0: 6d 0a 2a 2a 20 74 6f 20 68 61 76 65 20 6f 6e 6c  m.** to have onl
c0e0: 79 20 61 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a  y a real value..
c0f0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61 6c 41  */.case OP_RealA
c100: 66 66 69 6e 69 74 79 3a 20 7b 20 20 20 20 20 20  ffinity: {      
c110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
c120: 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
c130: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
c140: 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73   if( pIn1->flags
c150: 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
c160: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
c170: 52 65 61 6c 69 66 79 28 70 49 6e 31 29 3b 0a 20  Realify(pIn1);. 
c180: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65   }.  break;.}.#e
c190: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
c1a0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 2f  LITE_OMIT_CAST./
c1b0: 2a 20 4f 70 63 6f 64 65 3a 20 54 6f 54 65 78 74  * Opcode: ToText
c1c0: 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
c1d0: 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75  * Force the valu
c1e0: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
c1f0: 20 74 6f 20 62 65 20 74 65 78 74 2e 0a 2a 2a 20   to be text..** 
c200: 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  If the value is 
c210: 6e 75 6d 65 72 69 63 2c 20 63 6f 6e 76 65 72 74  numeric, convert
c220: 20 69 74 20 74 6f 20 61 20 73 74 72 69 6e 67 20   it to a string 
c230: 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 65 71 75  using the.** equ
c240: 69 76 61 6c 65 6e 74 20 6f 66 20 70 72 69 6e 74  ivalent of print
c250: 66 28 29 2e 20 20 42 6c 6f 62 20 76 61 6c 75 65  f().  Blob value
c260: 73 20 61 72 65 20 75 6e 63 68 61 6e 67 65 64 20  s are unchanged 
c270: 61 6e 64 0a 2a 2a 20 61 72 65 20 61 66 74 65 72  and.** are after
c280: 77 61 72 64 73 20 73 69 6d 70 6c 79 20 69 6e 74  wards simply int
c290: 65 72 70 72 65 74 65 64 20 61 73 20 74 65 78 74  erpreted as text
c2a0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76  ..**.** A NULL v
c2b0: 61 6c 75 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  alue is not chan
c2c0: 67 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ged by this rout
c2d0: 69 6e 65 2e 20 20 49 74 20 72 65 6d 61 69 6e 73  ine.  It remains
c2e0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f   NULL..*/.case O
c2f0: 50 5f 54 6f 54 65 78 74 3a 20 7b 20 20 20 20 20  P_ToText: {     
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c310: 73 61 6d 65 20 61 73 20 54 4b 5f 54 4f 5f 54 45  same as TK_TO_TE
c320: 58 54 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e  XT, in1 */.  pIn
c330: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
c340: 31 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f  1];.  memAboutTo
c350: 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b  Change(p, pIn1);
c360: 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61  .  if( pIn1->fla
c370: 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 20  gs & MEM_Null ) 
c380: 62 72 65 61 6b 3b 0a 20 20 61 73 73 65 72 74 28  break;.  assert(
c390: 20 4d 45 4d 5f 53 74 72 3d 3d 28 4d 45 4d 5f 42   MEM_Str==(MEM_B
c3a0: 6c 6f 62 3e 3e 33 29 20 29 3b 0a 20 20 70 49 6e  lob>>3) );.  pIn
c3b0: 31 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 49 6e  1->flags |= (pIn
c3c0: 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f  1->flags&MEM_Blo
c3d0: 62 29 3e 3e 33 3b 0a 20 20 61 70 70 6c 79 41 66  b)>>3;.  applyAf
c3e0: 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 53 51 4c  finity(pIn1, SQL
c3f0: 49 54 45 5f 41 46 46 5f 54 45 58 54 2c 20 65 6e  ITE_AFF_TEXT, en
c400: 63 6f 64 69 6e 67 29 3b 0a 20 20 72 63 20 3d 20  coding);.  rc = 
c410: 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31 29  ExpandBlob(pIn1)
c420: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31  ;.  assert( pIn1
c430: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
c440: 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
c450: 61 69 6c 65 64 20 29 3b 0a 20 20 70 49 6e 31 2d  ailed );.  pIn1-
c460: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f  >flags &= ~(MEM_
c470: 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d  Int|MEM_Real|MEM
c480: 5f 42 6c 6f 62 7c 4d 45 4d 5f 5a 65 72 6f 29 3b  _Blob|MEM_Zero);
c490: 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c  .  UPDATE_MAX_BL
c4a0: 4f 42 53 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20  OBSIZE(pIn1);.  
c4b0: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
c4c0: 6f 64 65 3a 20 54 6f 42 6c 6f 62 20 50 31 20 2a  ode: ToBlob P1 *
c4d0: 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72   * * *.**.** For
c4e0: 63 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ce the value in 
c4f0: 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20 62  register P1 to b
c500: 65 20 61 20 42 4c 4f 42 2e 0a 2a 2a 20 49 66 20  e a BLOB..** If 
c510: 74 68 65 20 76 61 6c 75 65 20 69 73 20 6e 75 6d  the value is num
c520: 65 72 69 63 2c 20 63 6f 6e 76 65 72 74 20 69 74  eric, convert it
c530: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 66 69 72   to a string fir
c540: 73 74 2e 0a 2a 2a 20 53 74 72 69 6e 67 73 20 61  st..** Strings a
c550: 72 65 20 73 69 6d 70 6c 79 20 72 65 69 6e 74 65  re simply reinte
c560: 72 70 72 65 74 65 64 20 61 73 20 62 6c 6f 62 73  rpreted as blobs
c570: 20 77 69 74 68 20 6e 6f 20 63 68 61 6e 67 65 0a   with no change.
c580: 2a 2a 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c  ** to the underl
c590: 79 69 6e 67 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  ying data..**.**
c5a0: 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73   A NULL value is
c5b0: 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 62 79 20   not changed by 
c5c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 49  this routine.  I
c5d0: 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a  t remains NULL..
c5e0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f 42 6c 6f  */.case OP_ToBlo
c5f0: 62 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  b: {            
c600: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
c610: 20 54 4b 5f 54 4f 5f 42 4c 4f 42 2c 20 69 6e 31   TK_TO_BLOB, in1
c620: 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
c630: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69  em[pOp->p1];.  i
c640: 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  f( pIn1->flags &
c650: 20 4d 45 4d 5f 4e 75 6c 6c 20 29 20 62 72 65 61   MEM_Null ) brea
c660: 6b 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  k;.  if( (pIn1->
c670: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
c680: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 70 70 6c  )==0 ){.    appl
c690: 79 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 20  yAffinity(pIn1, 
c6a0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 2c  SQLITE_AFF_TEXT,
c6b0: 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20   encoding);.    
c6c0: 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c  assert( pIn1->fl
c6d0: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 7c 7c  ags & MEM_Str ||
c6e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
c6f0: 64 20 29 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54  d );.    MemSetT
c700: 79 70 65 46 6c 61 67 28 70 49 6e 31 2c 20 4d 45  ypeFlag(pIn1, ME
c710: 4d 5f 42 6c 6f 62 29 3b 0a 20 20 7d 65 6c 73 65  M_Blob);.  }else
c720: 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 66 6c 61 67  {.    pIn1->flag
c730: 73 20 26 3d 20 7e 28 4d 45 4d 5f 54 79 70 65 4d  s &= ~(MEM_TypeM
c740: 61 73 6b 26 7e 4d 45 4d 5f 42 6c 6f 62 29 3b 0a  ask&~MEM_Blob);.
c750: 20 20 7d 0a 20 20 55 50 44 41 54 45 5f 4d 41 58    }.  UPDATE_MAX
c760: 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31 29 3b  _BLOBSIZE(pIn1);
c770: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
c780: 4f 70 63 6f 64 65 3a 20 54 6f 4e 75 6d 65 72 69  Opcode: ToNumeri
c790: 63 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  c P1 * * * *.**.
c7a0: 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c  ** Force the val
c7b0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
c7c0: 31 20 74 6f 20 62 65 20 6e 75 6d 65 72 69 63 20  1 to be numeric 
c7d0: 28 65 69 74 68 65 72 20 61 6e 0a 2a 2a 20 69 6e  (either an.** in
c7e0: 74 65 67 65 72 20 6f 72 20 61 20 66 6c 6f 61 74  teger or a float
c7f0: 69 6e 67 2d 70 6f 69 6e 74 20 6e 75 6d 62 65 72  ing-point number
c800: 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c  .).** If the val
c810: 75 65 20 69 73 20 74 65 78 74 20 6f 72 20 62 6c  ue is text or bl
c820: 6f 62 2c 20 74 72 79 20 74 6f 20 63 6f 6e 76 65  ob, try to conve
c830: 72 74 20 69 74 20 74 6f 20 61 6e 20 75 73 69 6e  rt it to an usin
c840: 67 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c  g the.** equival
c850: 65 6e 74 20 6f 66 20 61 74 6f 69 28 29 20 6f 72  ent of atoi() or
c860: 20 61 74 6f 66 28 29 20 61 6e 64 20 73 74 6f 72   atof() and stor
c870: 65 20 30 20 69 66 20 6e 6f 20 73 75 63 68 20 63  e 0 if no such c
c880: 6f 6e 76 65 72 73 69 6f 6e 20 0a 2a 2a 20 69 73  onversion .** is
c890: 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a   possible..**.**
c8a0: 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73   A NULL value is
c8b0: 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 62 79 20   not changed by 
c8c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 49  this routine.  I
c8d0: 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a  t remains NULL..
c8e0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f 4e 75 6d  */.case OP_ToNum
c8f0: 65 72 69 63 3a 20 7b 20 20 20 20 20 20 20 20 20  eric: {         
c900: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
c910: 20 61 73 20 54 4b 5f 54 4f 5f 4e 55 4d 45 52 49   as TK_TO_NUMERI
c920: 43 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31  C, in1 */.  pIn1
c930: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
c940: 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ];.  sqlite3Vdbe
c950: 4d 65 6d 4e 75 6d 65 72 69 66 79 28 70 49 6e 31  MemNumerify(pIn1
c960: 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  );.  break;.}.#e
c970: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
c980: 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 0a 2f 2a 20  MIT_CAST */../* 
c990: 4f 70 63 6f 64 65 3a 20 54 6f 49 6e 74 20 50 31  Opcode: ToInt P1
c9a0: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46   * * * *.**.** F
c9b0: 6f 72 63 65 20 74 68 65 20 76 61 6c 75 65 20 69  orce the value i
c9c0: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f  n register P1 to
c9d0: 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   be an integer. 
c9e0: 20 49 66 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65   If.** The value
c9f0: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 20   is currently a 
ca00: 72 65 61 6c 20 6e 75 6d 62 65 72 2c 20 64 72 6f  real number, dro
ca10: 70 20 69 74 73 20 66 72 61 63 74 69 6f 6e 61 6c  p its fractional
ca20: 20 70 61 72 74 2e 0a 2a 2a 20 49 66 20 74 68 65   part..** If the
ca30: 20 76 61 6c 75 65 20 69 73 20 74 65 78 74 20 6f   value is text o
ca40: 72 20 62 6c 6f 62 2c 20 74 72 79 20 74 6f 20 63  r blob, try to c
ca50: 6f 6e 76 65 72 74 20 69 74 20 74 6f 20 61 6e 20  onvert it to an 
ca60: 69 6e 74 65 67 65 72 20 75 73 69 6e 67 20 74 68  integer using th
ca70: 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  e.** equivalent 
ca80: 6f 66 20 61 74 6f 69 28 29 20 61 6e 64 20 73 74  of atoi() and st
ca90: 6f 72 65 20 30 20 69 66 20 6e 6f 20 73 75 63 68  ore 0 if no such
caa0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 70   conversion is p
cab0: 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  ossible..**.** A
cac0: 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e   NULL value is n
cad0: 6f 74 20 63 68 61 6e 67 65 64 20 62 79 20 74 68  ot changed by th
cae0: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 49 74 20  is routine.  It 
caf0: 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f  remains NULL..*/
cb00: 0a 63 61 73 65 20 4f 50 5f 54 6f 49 6e 74 3a 20  .case OP_ToInt: 
cb10: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
cb20: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
cb30: 5f 54 4f 5f 49 4e 54 2c 20 69 6e 31 20 2a 2f 0a  _TO_INT, in1 */.
cb40: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
cb50: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 28  Op->p1];.  if( (
cb60: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
cb70: 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20  M_Null)==0 ){.  
cb80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
cb90: 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 31 29  Integerify(pIn1)
cba0: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
cbb0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
cbc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 29  QLITE_OMIT_CAST)
cbd0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
cbe0: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
cbf0: 47 5f 50 4f 49 4e 54 29 0a 2f 2a 20 4f 70 63 6f  G_POINT)./* Opco
cc00: 64 65 3a 20 54 6f 52 65 61 6c 20 50 31 20 2a 20  de: ToReal P1 * 
cc10: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72 63  * * *.**.** Forc
cc20: 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  e the value in r
cc30: 65 67 69 73 74 65 72 20 50 31 20 74 6f 20 62 65  egister P1 to be
cc40: 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e   a floating poin
cc50: 74 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 49 66 20  t number..** If 
cc60: 54 68 65 20 76 61 6c 75 65 20 69 73 20 63 75 72  The value is cur
cc70: 72 65 6e 74 6c 79 20 61 6e 20 69 6e 74 65 67 65  rently an intege
cc80: 72 2c 20 63 6f 6e 76 65 72 74 20 69 74 2e 0a 2a  r, convert it..*
cc90: 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69  * If the value i
cca0: 73 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 2c 20  s text or blob, 
ccb0: 74 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 69  try to convert i
ccc0: 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  t to an integer 
ccd0: 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 65 71 75  using the.** equ
cce0: 69 76 61 6c 65 6e 74 20 6f 66 20 61 74 6f 69 28  ivalent of atoi(
ccf0: 29 20 61 6e 64 20 73 74 6f 72 65 20 30 2e 30 20  ) and store 0.0 
cd00: 69 66 20 6e 6f 20 73 75 63 68 20 63 6f 6e 76 65  if no such conve
cd10: 72 73 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c  rsion is possibl
cd20: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20  e..**.** A NULL 
cd30: 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 63 68 61  value is not cha
cd40: 6e 67 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  nged by this rou
cd50: 74 69 6e 65 2e 20 20 49 74 20 72 65 6d 61 69 6e  tine.  It remain
cd60: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20  s NULL..*/.case 
cd70: 4f 50 5f 54 6f 52 65 61 6c 3a 20 7b 20 20 20 20  OP_ToReal: {    
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cd90: 20 73 61 6d 65 20 61 73 20 54 4b 5f 54 4f 5f 52   same as TK_TO_R
cda0: 45 41 4c 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49  EAL, in1 */.  pI
cdb0: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
cdc0: 70 31 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54  p1];.  memAboutT
cdd0: 6f 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29  oChange(p, pIn1)
cde0: 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66  ;.  if( (pIn1->f
cdf0: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
ce00: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
ce10: 65 33 56 64 62 65 4d 65 6d 52 65 61 6c 69 66 79  e3VdbeMemRealify
ce20: 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72  (pIn1);.  }.  br
ce30: 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
ce40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
ce50: 5f 4f 4d 49 54 5f 43 41 53 54 29 20 26 26 20 21  _OMIT_CAST) && !
ce60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
ce70: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
ce80: 4e 54 29 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64  NT) */../* Opcod
ce90: 65 3a 20 4c 74 20 50 31 20 50 32 20 50 33 20 50  e: Lt P1 P2 P3 P
cea0: 34 20 50 35 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61  4 P5.**.** Compa
ceb0: 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  re the values in
cec0: 20 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64   register P1 and
ced0: 20 50 33 2e 20 20 49 66 20 72 65 67 28 50 33 29   P3.  If reg(P3)
cee0: 3c 72 65 67 28 50 31 29 20 74 68 65 6e 0a 2a 2a  <reg(P1) then.**
cef0: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73   jump to address
cf00: 20 50 32 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20   P2.  .**.** If 
cf10: 74 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  the SQLITE_JUMPI
cf20: 46 4e 55 4c 4c 20 62 69 74 20 6f 66 20 50 35 20  FNULL bit of P5 
cf30: 69 73 20 73 65 74 20 61 6e 64 20 65 69 74 68 65  is set and eithe
cf40: 72 20 72 65 67 28 50 31 29 20 6f 72 0a 2a 2a 20  r reg(P1) or.** 
cf50: 72 65 67 28 50 33 29 20 69 73 20 4e 55 4c 4c 20  reg(P3) is NULL 
cf60: 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75  then take the ju
cf70: 6d 70 2e 20 20 49 66 20 74 68 65 20 53 51 4c 49  mp.  If the SQLI
cf80: 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 0a 2a  TE_JUMPIFNULL .*
cf90: 2a 20 62 69 74 20 69 73 20 63 6c 65 61 72 20 74  * bit is clear t
cfa0: 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
cfb0: 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72 61   if either opera
cfc0: 6e 64 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  nd is NULL..**.*
cfd0: 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 41 46 46  * The SQLITE_AFF
cfe0: 5f 4d 41 53 4b 20 70 6f 72 74 69 6f 6e 20 6f 66  _MASK portion of
cff0: 20 50 35 20 6d 75 73 74 20 62 65 20 61 6e 20 61   P5 must be an a
d000: 66 66 69 6e 69 74 79 20 63 68 61 72 61 63 74 65  ffinity characte
d010: 72 20 2d 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  r -.** SQLITE_AF
d020: 46 5f 54 45 58 54 2c 20 53 51 4c 49 54 45 5f 41  F_TEXT, SQLITE_A
d030: 46 46 5f 49 4e 54 45 47 45 52 2c 20 61 6e 64 20  FF_INTEGER, and 
d040: 73 6f 20 66 6f 72 74 68 2e 20 41 6e 20 61 74 74  so forth. An att
d050: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 0a 2a 2a  empt is made .**
d060: 20 74 6f 20 63 6f 65 72 63 65 20 62 6f 74 68 20   to coerce both 
d070: 69 6e 70 75 74 73 20 61 63 63 6f 72 64 69 6e 67  inputs according
d080: 20 74 6f 20 74 68 69 73 20 61 66 66 69 6e 69 74   to this affinit
d090: 79 20 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20  y before the.** 
d0a0: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61  comparison is ma
d0b0: 64 65 2e 20 49 66 20 74 68 65 20 53 51 4c 49 54  de. If the SQLIT
d0c0: 45 5f 41 46 46 5f 4d 41 53 4b 20 69 73 20 30 78  E_AFF_MASK is 0x
d0d0: 30 30 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  00, then numeric
d0e0: 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 69 73 20  .** affinity is 
d0f0: 75 73 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  used. Note that 
d100: 74 68 65 20 61 66 66 69 6e 69 74 79 20 63 6f 6e  the affinity con
d110: 76 65 72 73 69 6f 6e 73 20 61 72 65 20 73 74 6f  versions are sto
d120: 72 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 74 6f  red.** back into
d130: 20 74 68 65 20 69 6e 70 75 74 20 72 65 67 69 73   the input regis
d140: 74 65 72 73 20 50 31 20 61 6e 64 20 50 33 2e 20  ters P1 and P3. 
d150: 20 53 6f 20 74 68 69 73 20 6f 70 63 6f 64 65 20   So this opcode 
d160: 63 61 6e 20 63 61 75 73 65 0a 2a 2a 20 70 65 72  can cause.** per
d170: 73 69 73 74 65 6e 74 20 63 68 61 6e 67 65 73 20  sistent changes 
d180: 74 6f 20 72 65 67 69 73 74 65 72 73 20 50 31 20  to registers P1 
d190: 61 6e 64 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  and P3..**.** On
d1a0: 63 65 20 61 6e 79 20 63 6f 6e 76 65 72 73 69 6f  ce any conversio
d1b0: 6e 73 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c  ns have taken pl
d1c0: 61 63 65 2c 20 61 6e 64 20 6e 65 69 74 68 65 72  ace, and neither
d1d0: 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20   value is NULL, 
d1e0: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61  .** the values a
d1f0: 72 65 20 63 6f 6d 70 61 72 65 64 2e 20 49 66 20  re compared. If 
d200: 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65 20  both values are 
d210: 62 6c 6f 62 73 20 74 68 65 6e 20 6d 65 6d 63 6d  blobs then memcm
d220: 70 28 29 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  p() is.** used t
d230: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
d240: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 63  results of the c
d250: 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66 20 62  omparison.  If b
d260: 6f 74 68 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72  oth values.** ar
d270: 65 20 74 65 78 74 2c 20 74 68 65 6e 20 74 68 65  e text, then the
d280: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
d290: 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
d2a0: 73 70 65 63 69 66 69 65 64 20 69 6e 0a 2a 2a 20  specified in.** 
d2b0: 50 34 20 69 73 20 20 75 73 65 64 20 74 6f 20 64  P4 is  used to d
d2c0: 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
d2d0: 2e 20 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20  .  If P4 is not 
d2e0: 73 70 65 63 69 66 69 65 64 20 74 68 65 6e 0a 2a  specified then.*
d2f0: 2a 20 6d 65 6d 63 6d 70 28 29 20 69 73 20 75 73  * memcmp() is us
d300: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 65  ed to compare te
d310: 78 74 20 73 74 72 69 6e 67 2e 20 20 49 66 20 62  xt string.  If b
d320: 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65 0a 2a  oth values are.*
d330: 2a 20 6e 75 6d 65 72 69 63 2c 20 74 68 65 6e 20  * numeric, then 
d340: 61 20 6e 75 6d 65 72 69 63 20 63 6f 6d 70 61 72  a numeric compar
d350: 69 73 6f 6e 20 69 73 20 75 73 65 64 2e 20 49 66  ison is used. If
d360: 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a   the two values.
d370: 2a 2a 20 61 72 65 20 6f 66 20 64 69 66 66 65 72  ** are of differ
d380: 65 6e 74 20 74 79 70 65 73 2c 20 74 68 65 6e 20  ent types, then 
d390: 6e 75 6d 62 65 72 73 20 61 72 65 20 63 6f 6e 73  numbers are cons
d3a0: 69 64 65 72 65 64 20 6c 65 73 73 20 74 68 61 6e  idered less than
d3b0: 0a 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e 64 20  .** strings and 
d3c0: 73 74 72 69 6e 67 73 20 61 72 65 20 63 6f 6e 73  strings are cons
d3d0: 69 64 65 72 65 64 20 6c 65 73 73 20 74 68 61 6e  idered less than
d3e0: 20 62 6c 6f 62 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   blobs..**.** If
d3f0: 20 74 68 65 20 53 51 4c 49 54 45 5f 53 54 4f 52   the SQLITE_STOR
d400: 45 50 32 20 62 69 74 20 6f 66 20 50 35 20 69 73  EP2 bit of P5 is
d410: 20 73 65 74 2c 20 74 68 65 6e 20 64 6f 20 6e 6f   set, then do no
d420: 74 20 6a 75 6d 70 2e 20 20 49 6e 73 74 65 61 64  t jump.  Instead
d430: 2c 0a 2a 2a 20 73 74 6f 72 65 20 61 20 62 6f 6f  ,.** store a boo
d440: 6c 65 61 6e 20 72 65 73 75 6c 74 20 28 65 69 74  lean result (eit
d450: 68 65 72 20 30 2c 20 6f 72 20 31 2c 20 6f 72 20  her 0, or 1, or 
d460: 4e 55 4c 4c 29 20 69 6e 20 72 65 67 69 73 74 65  NULL) in registe
d470: 72 20 50 32 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  r P2..*/./* Opco
d480: 64 65 3a 20 4e 65 20 50 31 20 50 32 20 50 33 20  de: Ne P1 P2 P3 
d490: 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73  P4 P5.**.** This
d4a0: 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
d4b0: 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65   the Lt opcode e
d4c0: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6a  xcept that the j
d4d0: 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a  ump is taken if.
d4e0: 2a 2a 20 74 68 65 20 6f 70 65 72 61 6e 64 73 20  ** the operands 
d4f0: 69 6e 20 72 65 67 69 73 74 65 72 73 20 50 31 20  in registers P1 
d500: 61 6e 64 20 50 33 20 61 72 65 20 6e 6f 74 20 65  and P3 are not e
d510: 71 75 61 6c 2e 20 20 53 65 65 20 74 68 65 20 4c  qual.  See the L
d520: 74 20 6f 70 63 6f 64 65 20 66 6f 72 0a 2a 2a 20  t opcode for.** 
d530: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
d540: 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  mation..**.** If
d550: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69   SQLITE_NULLEQ i
d560: 73 20 73 65 74 20 69 6e 20 50 35 20 74 68 65 6e  s set in P5 then
d570: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   the result of c
d580: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 6c 77  omparison is alw
d590: 61 79 73 20 65 69 74 68 65 72 0a 2a 2a 20 74 72  ays either.** tr
d5a0: 75 65 20 6f 72 20 66 61 6c 73 65 20 61 6e 64 20  ue or false and 
d5b0: 69 73 20 6e 65 76 65 72 20 4e 55 4c 4c 2e 20 20  is never NULL.  
d5c0: 49 66 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73  If both operands
d5d0: 20 61 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20 74   are NULL then t
d5e0: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 66 20  he result.** of 
d5f0: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 66 61  comparison is fa
d600: 6c 73 65 2e 20 20 49 66 20 65 69 74 68 65 72 20  lse.  If either 
d610: 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20  operand is NULL 
d620: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
d630: 69 73 20 74 72 75 65 2e 0a 2a 2a 20 49 66 20 6e  is true..** If n
d640: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
d650: 73 20 4e 55 4c 4c 20 74 68 65 20 72 65 73 75 6c  s NULL the resul
d660: 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  t is the same as
d670: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 66 0a   it would be if.
d680: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 55  ** the SQLITE_NU
d690: 4c 4c 45 51 20 66 6c 61 67 20 77 65 72 65 20 6f  LLEQ flag were o
d6a0: 6d 69 74 74 65 64 20 66 72 6f 6d 20 50 35 2e 0a  mitted from P5..
d6b0: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 71  */./* Opcode: Eq
d6c0: 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
d6d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
d6e0: 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 4c   just like the L
d6f0: 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20  t opcode except 
d700: 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73  that the jump is
d710: 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65   taken if.** the
d720: 20 6f 70 65 72 61 6e 64 73 20 69 6e 20 72 65 67   operands in reg
d730: 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 33  isters P1 and P3
d740: 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 20 53   are equal..** S
d750: 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65  ee the Lt opcode
d760: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
d770: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
d780: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4e 55 4c  ** If SQLITE_NUL
d790: 4c 45 51 20 69 73 20 73 65 74 20 69 6e 20 50 35  LEQ is set in P5
d7a0: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
d7b0: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   of comparison i
d7c0: 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 0a  s always either.
d7d0: 2a 2a 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65  ** true or false
d7e0: 20 61 6e 64 20 69 73 20 6e 65 76 65 72 20 4e 55   and is never NU
d7f0: 4c 4c 2e 20 20 49 66 20 62 6f 74 68 20 6f 70 65  LL.  If both ope
d800: 72 61 6e 64 73 20 61 72 65 20 4e 55 4c 4c 20 74  rands are NULL t
d810: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  hen the result.*
d820: 2a 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  * of comparison 
d830: 69 73 20 74 72 75 65 2e 20 20 49 66 20 65 69 74  is true.  If eit
d840: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
d850: 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ULL then the res
d860: 75 6c 74 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  ult is false..**
d870: 20 49 66 20 6e 65 69 74 68 65 72 20 6f 70 65 72   If neither oper
d880: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 20  and is NULL the 
d890: 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 73 61  result is the sa
d8a0: 6d 65 20 61 73 20 69 74 20 77 6f 75 6c 64 20 62  me as it would b
d8b0: 65 20 69 66 0a 2a 2a 20 74 68 65 20 53 51 4c 49  e if.** the SQLI
d8c0: 54 45 5f 4e 55 4c 4c 45 51 20 66 6c 61 67 20 77  TE_NULLEQ flag w
d8d0: 65 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  ere omitted from
d8e0: 20 50 35 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64   P5..*/./* Opcod
d8f0: 65 3a 20 4c 65 20 50 31 20 50 32 20 50 33 20 50  e: Le P1 P2 P3 P
d900: 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4 P5.**.** This 
d910: 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20  works just like 
d920: 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78  the Lt opcode ex
d930: 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6a 75  cept that the ju
d940: 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a  mp is taken if.*
d950: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
d960: 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20   register P3 is 
d970: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
d980: 61 6c 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e  al to the conten
d990: 74 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65 72  t of.** register
d9a0: 20 50 31 2e 20 20 53 65 65 20 74 68 65 20 4c 74   P1.  See the Lt
d9b0: 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 64 69   opcode for addi
d9c0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
d9d0: 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  on..*/./* Opcode
d9e0: 3a 20 47 74 20 50 31 20 50 32 20 50 33 20 50 34  : Gt P1 P2 P3 P4
d9f0: 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77   P5.**.** This w
da00: 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74  orks just like t
da10: 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78 63  he Lt opcode exc
da20: 65 70 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d  ept that the jum
da30: 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a  p is taken if.**
da40: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
da50: 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20 67  register P3 is g
da60: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
da70: 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65  content of.** re
da80: 67 69 73 74 65 72 20 50 31 2e 20 20 53 65 65 20  gister P1.  See 
da90: 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f  the Lt opcode fo
daa0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
dab0: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20  ormation..*/./* 
dac0: 4f 70 63 6f 64 65 3a 20 47 65 20 50 31 20 50 32  Opcode: Ge P1 P2
dad0: 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20   P3 P4 P5.**.** 
dae0: 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20  This works just 
daf0: 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f  like the Lt opco
db00: 64 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74  de except that t
db10: 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
db20: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65   if.** the conte
db30: 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
db40: 33 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  3 is greater tha
db50: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
db60: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20  e content of.** 
db70: 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 53 65  register P1.  Se
db80: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20  e the Lt opcode 
db90: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
dba0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 63  nformation..*/.c
dbb0: 61 73 65 20 4f 50 5f 45 71 3a 20 20 20 20 20 20  ase OP_Eq:      
dbc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
dbd0: 20 61 73 20 54 4b 5f 45 51 2c 20 6a 75 6d 70 2c   as TK_EQ, jump,
dbe0: 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73   in1, in3 */.cas
dbf0: 65 20 4f 50 5f 4e 65 3a 20 20 20 20 20 20 20 20  e OP_Ne:        
dc00: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
dc10: 73 20 54 4b 5f 4e 45 2c 20 6a 75 6d 70 2c 20 69  s TK_NE, jump, i
dc20: 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20  n1, in3 */.case 
dc30: 4f 50 5f 4c 74 3a 20 20 20 20 20 20 20 20 20 20  OP_Lt:          
dc40: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
dc50: 54 4b 5f 4c 54 2c 20 6a 75 6d 70 2c 20 69 6e 31  TK_LT, jump, in1
dc60: 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
dc70: 5f 4c 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  _Le:            
dc80: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
dc90: 5f 4c 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20  _LE, jump, in1, 
dca0: 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 47  in3 */.case OP_G
dcb0: 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t:              
dcc0: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 47   /* same as TK_G
dcd0: 54 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e  T, jump, in1, in
dce0: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 65 3a  3 */.case OP_Ge:
dcf0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   {             /
dd00: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 47 45 2c  * same as TK_GE,
dd10: 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20   jump, in1, in3 
dd20: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20  */.  int res;   
dd30: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
dd40: 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  lt of the compar
dd50: 69 73 6f 6e 20 6f 66 20 70 49 6e 31 20 61 67 61  ison of pIn1 aga
dd60: 69 6e 73 74 20 70 49 6e 33 20 2a 2f 0a 20 20 63  inst pIn3 */.  c
dd70: 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20  har affinity;   
dd80: 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 74     /* Affinity t
dd90: 6f 20 75 73 65 20 66 6f 72 20 63 6f 6d 70 61 72  o use for compar
dda0: 69 73 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 66 6c  ison */.  u16 fl
ddb0: 61 67 73 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  ags1;         /*
ddc0: 20 43 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c   Copy of initial
ddd0: 20 76 61 6c 75 65 20 6f 66 20 70 49 6e 31 2d 3e   value of pIn1->
dde0: 66 6c 61 67 73 20 2a 2f 0a 20 20 75 31 36 20 66  flags */.  u16 f
ddf0: 6c 61 67 73 33 3b 20 20 20 20 20 20 20 20 20 2f  lags3;         /
de00: 2a 20 43 6f 70 79 20 6f 66 20 69 6e 69 74 69 61  * Copy of initia
de10: 6c 20 76 61 6c 75 65 20 6f 66 20 70 49 6e 33 2d  l value of pIn3-
de20: 3e 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 70 49 6e  >flags */..  pIn
de30: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
de40: 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d  1];.  pIn3 = &aM
de50: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 66  em[pOp->p3];.  f
de60: 6c 61 67 73 31 20 3d 20 70 49 6e 31 2d 3e 66 6c  lags1 = pIn1->fl
de70: 61 67 73 3b 0a 20 20 66 6c 61 67 73 33 20 3d 20  ags;.  flags3 = 
de80: 70 49 6e 33 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  pIn3->flags;.  i
de90: 66 28 20 28 66 6c 61 67 73 31 20 7c 20 66 6c 61  f( (flags1 | fla
dea0: 67 73 33 29 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  gs3)&MEM_Null ){
deb0: 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 62  .    /* One or b
dec0: 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65  oth operands are
ded0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28   NULL */.    if(
dee0: 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54   pOp->p5 & SQLIT
def0: 45 5f 4e 55 4c 4c 45 51 20 29 7b 0a 20 20 20 20  E_NULLEQ ){.    
df00: 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 4e    /* If SQLITE_N
df10: 55 4c 4c 45 51 20 69 73 20 73 65 74 20 28 77 68  ULLEQ is set (wh
df20: 69 63 68 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61  ich will only ha
df30: 70 70 65 6e 20 69 66 20 74 68 65 20 6f 70 65 72  ppen if the oper
df40: 61 74 6f 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ator is.      **
df50: 20 4f 50 5f 45 71 20 6f 72 20 4f 50 5f 4e 65 29   OP_Eq or OP_Ne)
df60: 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a   then take the j
df70: 75 6d 70 20 6f 72 20 6e 6f 74 20 64 65 70 65 6e  ump or not depen
df80: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 0a  ding on whether.
df90: 20 20 20 20 20 20 2a 2a 20 6f 72 20 6e 6f 74 20        ** or not 
dfa0: 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72  both operands ar
dfb0: 65 20 6e 75 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f  e null..      */
dfc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
dfd0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45  Op->opcode==OP_E
dfe0: 71 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  q || pOp->opcode
dff0: 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ne );.     
e000: 20 72 65 73 20 3d 20 28 66 6c 61 67 73 31 20 26   res = (flags1 &
e010: 20 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f 4e 75   flags3 & MEM_Nu
e020: 6c 6c 29 3d 3d 30 3b 0a 20 20 20 20 7d 65 6c 73  ll)==0;.    }els
e030: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  e{.      /* SQLI
e040: 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 63 6c 65  TE_NULLEQ is cle
e050: 61 72 20 61 6e 64 20 61 74 20 6c 65 61 73 74 20  ar and at least 
e060: 6f 6e 65 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  one operand is N
e070: 55 4c 4c 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ULL,.      ** th
e080: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
e090: 20 61 6c 77 61 79 73 20 4e 55 4c 4c 2e 0a 20 20   always NULL..  
e0a0: 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 6d 70 20      ** The jump 
e0b0: 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20  is taken if the 
e0c0: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
e0d0: 4c 20 62 69 74 20 69 73 20 73 65 74 2e 0a 20 20  L bit is set..  
e0e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
e0f0: 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54   pOp->p5 & SQLIT
e100: 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 20 20  E_STOREP2 ){.   
e110: 20 20 20 20 20 70 4f 75 74 20 3d 20 26 61 4d 65       pOut = &aMe
e120: 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20  m[pOp->p2];.    
e130: 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
e140: 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c  ag(pOut, MEM_Nul
e150: 6c 29 3b 0a 20 20 20 20 20 20 20 20 52 45 47 49  l);.        REGI
e160: 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
e170: 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 20  p2, pOut);.     
e180: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
e190: 70 35 20 26 20 53 51 4c 49 54 45 5f 4a 55 4d 50  p5 & SQLITE_JUMP
e1a0: 49 46 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  IFNULL ){.      
e1b0: 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31    pc = pOp->p2-1
e1c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e1d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
e1e0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 69  else{.    /* Nei
e1f0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
e200: 4e 55 4c 4c 2e 20 20 44 6f 20 61 20 63 6f 6d 70  NULL.  Do a comp
e210: 61 72 69 73 6f 6e 2e 20 2a 2f 0a 20 20 20 20 61  arison. */.    a
e220: 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70  ffinity = pOp->p
e230: 35 20 26 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d  5 & SQLITE_AFF_M
e240: 41 53 4b 3b 0a 20 20 20 20 69 66 28 20 61 66 66  ASK;.    if( aff
e250: 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 61  inity ){.      a
e260: 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e  pplyAffinity(pIn
e270: 31 2c 20 61 66 66 69 6e 69 74 79 2c 20 65 6e 63  1, affinity, enc
e280: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 61 70  oding);.      ap
e290: 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e 33  plyAffinity(pIn3
e2a0: 2c 20 61 66 66 69 6e 69 74 79 2c 20 65 6e 63 6f  , affinity, enco
e2b0: 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28  ding);.      if(
e2c0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e2d0: 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  d ) goto no_mem;
e2e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
e2f0: 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
e300: 3d 50 34 5f 43 4f 4c 4c 53 45 51 20 7c 7c 20 70  =P4_COLLSEQ || p
e310: 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3d 3d 30 20  Op->p4.pColl==0 
e320: 29 3b 0a 20 20 20 20 45 78 70 61 6e 64 42 6c 6f  );.    ExpandBlo
e330: 62 28 70 49 6e 31 29 3b 0a 20 20 20 20 45 78 70  b(pIn1);.    Exp
e340: 61 6e 64 42 6c 6f 62 28 70 49 6e 33 29 3b 0a 20  andBlob(pIn3);. 
e350: 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
e360: 4d 65 6d 43 6f 6d 70 61 72 65 28 70 49 6e 33 2c  MemCompare(pIn3,
e370: 20 70 49 6e 31 2c 20 70 4f 70 2d 3e 70 34 2e 70   pIn1, pOp->p4.p
e380: 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 77 69  Coll);.  }.  swi
e390: 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  tch( pOp->opcode
e3a0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f   ){.    case OP_
e3b0: 45 71 3a 20 20 20 20 72 65 73 20 3d 20 72 65 73  Eq:    res = res
e3c0: 3d 3d 30 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ==0;     break;.
e3d0: 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 3a 20      case OP_Ne: 
e3e0: 20 20 20 72 65 73 20 3d 20 72 65 73 21 3d 30 3b     res = res!=0;
e3f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e400: 63 61 73 65 20 4f 50 5f 4c 74 3a 20 20 20 20 72  case OP_Lt:    r
e410: 65 73 20 3d 20 72 65 73 3c 30 3b 20 20 20 20 20  es = res<0;     
e420: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
e430: 20 4f 50 5f 4c 65 3a 20 20 20 20 72 65 73 20 3d   OP_Le:    res =
e440: 20 72 65 73 3c 3d 30 3b 20 20 20 20 20 62 72 65   res<=0;     bre
e450: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f  ak;.    case OP_
e460: 47 74 3a 20 20 20 20 72 65 73 20 3d 20 72 65 73  Gt:    res = res
e470: 3e 30 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  >0;      break;.
e480: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
e490: 20 20 20 72 65 73 20 3d 20 72 65 73 3e 3d 30 3b     res = res>=0;
e4a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
e4b0: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26  .  if( pOp->p5 &
e4c0: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
e4d0: 29 7b 0a 20 20 20 20 70 4f 75 74 20 3d 20 26 61  ){.    pOut = &a
e4e0: 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
e4f0: 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
e500: 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20  ge(p, pOut);.   
e510: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
e520: 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a  pOut, MEM_Int);.
e530: 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20      pOut->u.i = 
e540: 72 65 73 3b 0a 20 20 20 20 52 45 47 49 53 54 45  res;.    REGISTE
e550: 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c  R_TRACE(pOp->p2,
e560: 20 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 20   pOut);.  }else 
e570: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 70  if( res ){.    p
e580: 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20  c = pOp->p2-1;. 
e590: 20 7d 0a 0a 20 20 2f 2a 20 55 6e 64 6f 20 61 6e   }..  /* Undo an
e5a0: 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  y changes made b
e5b0: 79 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28  y applyAffinity(
e5c0: 29 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 72  ) to the input r
e5d0: 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a 20 20 70  egisters. */.  p
e5e0: 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 28 70 49  In1->flags = (pI
e5f0: 6e 31 2d 3e 66 6c 61 67 73 26 7e 4d 45 4d 5f 54  n1->flags&~MEM_T
e600: 79 70 65 4d 61 73 6b 29 20 7c 20 28 66 6c 61 67  ypeMask) | (flag
e610: 73 31 26 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29  s1&MEM_TypeMask)
e620: 3b 0a 20 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20  ;.  pIn3->flags 
e630: 3d 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 26 7e  = (pIn3->flags&~
e640: 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 20 7c 20  MEM_TypeMask) | 
e650: 28 66 6c 61 67 73 33 26 4d 45 4d 5f 54 79 70 65  (flags3&MEM_Type
e660: 4d 61 73 6b 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  Mask);.  break;.
e670: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 65  }../* Opcode: Pe
e680: 72 6d 75 74 61 74 69 6f 6e 20 2a 20 2a 20 2a 20  rmutation * * * 
e690: 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74  P4 *.**.** Set t
e6a0: 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75  he permutation u
e6b0: 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f 43 6f  sed by the OP_Co
e6c0: 6d 70 61 72 65 20 6f 70 65 72 61 74 6f 72 20 74  mpare operator t
e6d0: 6f 20 62 65 20 74 68 65 20 61 72 72 61 79 0a 2a  o be the array.*
e6e0: 2a 20 6f 66 20 69 6e 74 65 67 65 72 73 20 69 6e  * of integers in
e6f0: 20 50 34 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70   P4..**.** The p
e700: 65 72 6d 75 74 61 74 69 6f 6e 20 69 73 20 6f 6e  ermutation is on
e710: 6c 79 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74  ly valid until t
e720: 68 65 20 6e 65 78 74 20 4f 50 5f 50 65 72 6d 75  he next OP_Permu
e730: 74 61 74 69 6f 6e 2c 20 4f 50 5f 43 6f 6d 70 61  tation, OP_Compa
e740: 72 65 2c 0a 2a 2a 20 4f 50 5f 48 61 6c 74 2c 20  re,.** OP_Halt, 
e750: 6f 72 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2e  or OP_ResultRow.
e760: 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68 65 20    Typically the 
e770: 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 20 73  OP_Permutation s
e780: 68 6f 75 6c 64 20 6f 63 63 75 72 0a 2a 2a 20 69  hould occur.** i
e790: 6d 6d 65 64 69 61 74 65 6c 79 20 70 72 69 6f 72  mmediately prior
e7a0: 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6d 70 61   to the OP_Compa
e7b0: 72 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50  re..*/.case OP_P
e7c0: 65 72 6d 75 74 61 74 69 6f 6e 3a 20 7b 0a 20 20  ermutation: {.  
e7d0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
e7e0: 79 70 65 3d 3d 50 34 5f 49 4e 54 41 52 52 41 59  ype==P4_INTARRAY
e7f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
e800: 70 2d 3e 70 34 2e 61 69 20 29 3b 0a 20 20 61 50  p->p4.ai );.  aP
e810: 65 72 6d 75 74 65 20 3d 20 70 4f 70 2d 3e 70 34  ermute = pOp->p4
e820: 2e 61 69 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .ai;.  break;.}.
e830: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6d 70  ./* Opcode: Comp
e840: 61 72 65 20 50 31 20 50 32 20 50 33 20 50 34 20  are P1 P2 P3 P4 
e850: 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  *.**.** Compare 
e860: 74 77 6f 20 76 65 63 74 6f 72 73 20 6f 66 20 72  two vectors of r
e870: 65 67 69 73 74 65 72 73 20 69 6e 20 72 65 67 28  egisters in reg(
e880: 50 31 29 2e 2e 72 65 67 28 50 31 2b 50 33 2d 31  P1)..reg(P1+P3-1
e890: 29 20 28 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  ) (call this.** 
e8a0: 76 65 63 74 6f 72 20 22 41 22 29 20 61 6e 64 20  vector "A") and 
e8b0: 69 6e 20 72 65 67 28 50 32 29 2e 2e 72 65 67 28  in reg(P2)..reg(
e8c0: 50 32 2b 50 33 2d 31 29 20 28 22 42 22 29 2e 20  P2+P3-1) ("B"). 
e8d0: 20 53 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   Save the result
e8e0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61   of.** the compa
e8f0: 72 69 73 6f 6e 20 66 6f 72 20 75 73 65 20 62 79  rison for use by
e900: 20 74 68 65 20 6e 65 78 74 20 4f 50 5f 4a 75 6d   the next OP_Jum
e910: 70 20 69 6e 73 74 72 75 63 74 2e 0a 2a 2a 0a 2a  p instruct..**.*
e920: 2a 20 50 34 20 69 73 20 61 20 4b 65 79 49 6e 66  * P4 is a KeyInf
e930: 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
e940: 20 64 65 66 69 6e 65 73 20 63 6f 6c 6c 61 74 69   defines collati
e950: 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61 6e 64  ng sequences and
e960: 20 73 6f 72 74 0a 2a 2a 20 6f 72 64 65 72 73 20   sort.** orders 
e970: 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73  for the comparis
e980: 6f 6e 2e 20 20 54 68 65 20 70 65 72 6d 75 74 61  on.  The permuta
e990: 74 69 6f 6e 20 61 70 70 6c 69 65 73 20 74 6f 20  tion applies to 
e9a0: 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 6f 6e 6c  registers.** onl
e9b0: 79 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20  y.  The KeyInfo 
e9c0: 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 75 73 65  elements are use
e9d0: 64 20 73 65 71 75 65 6e 74 69 61 6c 6c 79 2e 0a  d sequentially..
e9e0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61 72  **.** The compar
e9f0: 69 73 6f 6e 20 69 73 20 61 20 73 6f 72 74 20 63  ison is a sort c
ea00: 6f 6d 70 61 72 69 73 6f 6e 2c 20 73 6f 20 4e 55  omparison, so NU
ea10: 4c 4c 73 20 63 6f 6d 70 61 72 65 20 65 71 75 61  LLs compare equa
ea20: 6c 2c 0a 2a 2a 20 4e 55 4c 4c 73 20 61 72 65 20  l,.** NULLs are 
ea30: 6c 65 73 73 20 74 68 61 6e 20 6e 75 6d 62 65 72  less than number
ea40: 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 6c  s, numbers are l
ea50: 65 73 73 20 74 68 61 6e 20 73 74 72 69 6e 67 73  ess than strings
ea60: 2c 0a 2a 2a 20 61 6e 64 20 73 74 72 69 6e 67 73  ,.** and strings
ea70: 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 62   are less than b
ea80: 6c 6f 62 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  lobs..*/.case OP
ea90: 5f 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 69 6e  _Compare: {.  in
eaa0: 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  t n;.  int i;.  
eab0: 69 6e 74 20 70 31 3b 0a 20 20 69 6e 74 20 70 32  int p1;.  int p2
eac0: 3b 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66  ;.  const KeyInf
ead0: 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69  o *pKeyInfo;.  i
eae0: 6e 74 20 69 64 78 3b 0a 20 20 43 6f 6c 6c 53 65  nt idx;.  CollSe
eaf0: 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20  q *pColl;    /* 
eb00: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
eb10: 63 65 20 74 6f 20 75 73 65 20 6f 6e 20 74 68 69  ce to use on thi
eb20: 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  s term */.  int 
eb30: 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f  bRev;          /
eb40: 2a 20 54 72 75 65 20 66 6f 72 20 44 45 53 43 45  * True for DESCE
eb50: 4e 44 49 4e 47 20 73 6f 72 74 20 6f 72 64 65 72  NDING sort order
eb60: 20 2a 2f 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e   */..  n = pOp->
eb70: 70 33 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d  p3;.  pKeyInfo =
eb80: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
eb90: 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30  o;.  assert( n>0
eba0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
ebb0: 65 79 49 6e 66 6f 21 3d 30 20 29 3b 0a 20 20 70  eyInfo!=0 );.  p
ebc0: 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70  1 = pOp->p1;.  p
ebd0: 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 23 69 66  2 = pOp->p2;.#if
ebe0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
ebf0: 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a  if( aPermute ){.
ec00: 20 20 20 20 69 6e 74 20 6b 2c 20 6d 78 20 3d 20      int k, mx = 
ec10: 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  0;.    for(k=0; 
ec20: 6b 3c 6e 3b 20 6b 2b 2b 29 20 69 66 28 20 61 50  k<n; k++) if( aP
ec30: 65 72 6d 75 74 65 5b 6b 5d 3e 6d 78 20 29 20 6d  ermute[k]>mx ) m
ec40: 78 20 3d 20 61 50 65 72 6d 75 74 65 5b 6b 5d 3b  x = aPermute[k];
ec50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e  .    assert( p1>
ec60: 30 20 26 26 20 70 31 2b 6d 78 3c 3d 70 2d 3e 6e  0 && p1+mx<=p->n
ec70: 4d 65 6d 2b 31 20 29 3b 0a 20 20 20 20 61 73 73  Mem+1 );.    ass
ec80: 65 72 74 28 20 70 32 3e 30 20 26 26 20 70 32 2b  ert( p2>0 && p2+
ec90: 6d 78 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29 3b  mx<=p->nMem+1 );
eca0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
ecb0: 73 65 72 74 28 20 70 31 3e 30 20 26 26 20 70 31  sert( p1>0 && p1
ecc0: 2b 6e 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29 3b  +n<=p->nMem+1 );
ecd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 32 3e  .    assert( p2>
ece0: 30 20 26 26 20 70 32 2b 6e 3c 3d 70 2d 3e 6e 4d  0 && p2+n<=p->nM
ecf0: 65 6d 2b 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  em+1 );.  }.#end
ed00: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
ed10: 55 47 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  UG */.  for(i=0;
ed20: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
ed30: 69 64 78 20 3d 20 61 50 65 72 6d 75 74 65 20 3f  idx = aPermute ?
ed40: 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3a 20 69   aPermute[i] : i
ed50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
ed60: 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70  mIsValid(&aMem[p
ed70: 31 2b 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 61  1+idx]) );.    a
ed80: 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
ed90: 64 28 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d 29  d(&aMem[p2+idx])
eda0: 20 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52   );.    REGISTER
edb0: 5f 54 52 41 43 45 28 70 31 2b 69 64 78 2c 20 26  _TRACE(p1+idx, &
edc0: 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 29 3b 0a 20  aMem[p1+idx]);. 
edd0: 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
ede0: 45 28 70 32 2b 69 64 78 2c 20 26 61 4d 65 6d 5b  E(p2+idx, &aMem[
edf0: 70 32 2b 69 64 78 5d 29 3b 0a 20 20 20 20 61 73  p2+idx]);.    as
ee00: 73 65 72 74 28 20 69 3c 70 4b 65 79 49 6e 66 6f  sert( i<pKeyInfo
ee10: 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 20 20 20 20  ->nField );.    
ee20: 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f  pColl = pKeyInfo
ee30: 2d 3e 61 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  ->aColl[i];.    
ee40: 62 52 65 76 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  bRev = pKeyInfo-
ee50: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a  >aSortOrder[i];.
ee60: 20 20 20 20 69 43 6f 6d 70 61 72 65 20 3d 20 73      iCompare = s
ee70: 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
ee80: 28 26 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 2c 20  (&aMem[p1+idx], 
ee90: 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d 2c 20 70  &aMem[p2+idx], p
eea0: 43 6f 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 69  Coll);.    if( i
eeb0: 43 6f 6d 70 61 72 65 20 29 7b 0a 20 20 20 20 20  Compare ){.     
eec0: 20 69 66 28 20 62 52 65 76 20 29 20 69 43 6f 6d   if( bRev ) iCom
eed0: 70 61 72 65 20 3d 20 2d 69 43 6f 6d 70 61 72 65  pare = -iCompare
eee0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
eef0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 50 65 72 6d     }.  }.  aPerm
ef00: 75 74 65 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b  ute = 0;.  break
ef10: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
ef20: 4a 75 6d 70 20 50 31 20 50 32 20 50 33 20 2a 20  Jump P1 P2 P3 * 
ef30: 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20  *.**.** Jump to 
ef40: 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
ef50: 61 74 20 61 64 64 72 65 73 73 20 50 31 2c 20 50  at address P1, P
ef60: 32 2c 20 6f 72 20 50 33 20 64 65 70 65 6e 64 69  2, or P3 dependi
ef70: 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 0a 2a 2a  ng on whether.**
ef80: 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   in the most rec
ef90: 65 6e 74 20 4f 50 5f 43 6f 6d 70 61 72 65 20 69  ent OP_Compare i
efa0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 65 20 50  nstruction the P
efb0: 31 20 76 65 63 74 6f 72 20 77 61 73 20 6c 65 73  1 vector was les
efc0: 73 20 74 68 61 6e 0a 2a 2a 20 65 71 75 61 6c 20  s than.** equal 
efd0: 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74  to, or greater t
efe0: 68 61 6e 20 74 68 65 20 50 32 20 76 65 63 74 6f  han the P2 vecto
eff0: 72 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  r, respectively.
f000: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4a 75 6d 70  .*/.case OP_Jump
f010: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
f020: 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 66 28  /* jump */.  if(
f030: 20 69 43 6f 6d 70 61 72 65 3c 30 20 29 7b 0a 20   iCompare<0 ){. 
f040: 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 31 20     pc = pOp->p1 
f050: 2d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  - 1;.  }else if(
f060: 20 69 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a   iCompare==0 ){.
f070: 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
f080: 20 2d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   - 1;.  }else{. 
f090: 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 33 20     pc = pOp->p3 
f0a0: 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  - 1;.  }.  break
f0b0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
f0c0: 41 6e 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a  And P1 P2 P3 * *
f0d0: 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20  .**.** Take the 
f0e0: 6c 6f 67 69 63 61 6c 20 41 4e 44 20 6f 66 20 74  logical AND of t
f0f0: 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67  he values in reg
f100: 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 32  isters P1 and P2
f110: 20 61 6e 64 0a 2a 2a 20 77 72 69 74 65 20 74 68   and.** write th
f120: 65 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 72 65  e result into re
f130: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a  gister P3..**.**
f140: 20 49 66 20 65 69 74 68 65 72 20 50 31 20 6f 72   If either P1 or
f150: 20 50 32 20 69 73 20 30 20 28 66 61 6c 73 65 29   P2 is 0 (false)
f160: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
f170: 20 69 73 20 30 20 65 76 65 6e 20 69 66 0a 2a 2a   is 0 even if.**
f180: 20 74 68 65 20 6f 74 68 65 72 20 69 6e 70 75 74   the other input
f190: 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c   is NULL.  A NUL
f1a0: 4c 20 61 6e 64 20 74 72 75 65 20 6f 72 20 74 77  L and true or tw
f1b0: 6f 20 4e 55 4c 4c 73 20 67 69 76 65 0a 2a 2a 20  o NULLs give.** 
f1c0: 61 20 4e 55 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a  a NULL output..*
f1d0: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 72 20  /./* Opcode: Or 
f1e0: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
f1f0: 2a 2a 20 54 61 6b 65 20 74 68 65 20 6c 6f 67 69  ** Take the logi
f200: 63 61 6c 20 4f 52 20 6f 66 20 74 68 65 20 76 61  cal OR of the va
f210: 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72  lues in register
f220: 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a   P1 and P2 and.*
f230: 2a 20 73 74 6f 72 65 20 74 68 65 20 61 6e 73 77  * store the answ
f240: 65 72 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  er in register P
f250: 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  3..**.** If eith
f260: 65 72 20 50 31 20 6f 72 20 50 32 20 69 73 20 6e  er P1 or P2 is n
f270: 6f 6e 7a 65 72 6f 20 28 74 72 75 65 29 20 74 68  onzero (true) th
f280: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
f290: 20 31 20 28 74 72 75 65 29 0a 2a 2a 20 65 76 65   1 (true).** eve
f2a0: 6e 20 69 66 20 74 68 65 20 6f 74 68 65 72 20 69  n if the other i
f2b0: 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e 20 20 41  nput is NULL.  A
f2c0: 20 4e 55 4c 4c 20 61 6e 64 20 66 61 6c 73 65 20   NULL and false 
f2d0: 6f 72 20 74 77 6f 20 4e 55 4c 4c 73 0a 2a 2a 20  or two NULLs.** 
f2e0: 67 69 76 65 20 61 20 4e 55 4c 4c 20 6f 75 74 70  give a NULL outp
f2f0: 75 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41  ut..*/.case OP_A
f300: 6e 64 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd:             
f310: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 41   /* same as TK_A
f320: 4e 44 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  ND, in1, in2, ou
f330: 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 72  t3 */.case OP_Or
f340: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
f350: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4f 52  /* same as TK_OR
f360: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
f370: 20 2a 2f 0a 20 20 69 6e 74 20 76 31 3b 20 20 20   */.  int v1;   
f380: 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64   /* Left operand
f390: 3a 20 20 30 3d 3d 46 41 4c 53 45 2c 20 31 3d 3d  :  0==FALSE, 1==
f3a0: 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e 4f 57 4e  TRUE, 2==UNKNOWN
f3b0: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   or NULL */.  in
f3c0: 74 20 76 32 3b 20 20 20 20 2f 2a 20 52 69 67 68  t v2;    /* Righ
f3d0: 74 20 6f 70 65 72 61 6e 64 3a 20 30 3d 3d 46 41  t operand: 0==FA
f3e0: 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c 20 32 3d  LSE, 1==TRUE, 2=
f3f0: 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e 55 4c 4c  =UNKNOWN or NULL
f400: 20 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61   */..  pIn1 = &a
f410: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
f420: 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  if( pIn1->flags 
f430: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
f440: 20 20 76 31 20 3d 20 32 3b 0a 20 20 7d 65 6c 73    v1 = 2;.  }els
f450: 65 7b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69  e{.    v1 = sqli
f460: 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28  te3VdbeIntValue(
f470: 70 49 6e 31 29 21 3d 30 3b 0a 20 20 7d 0a 20 20  pIn1)!=0;.  }.  
f480: 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn2 = &aMem[pOp
f490: 2d 3e 70 32 5d 3b 0a 20 20 69 66 28 20 70 49 6e  ->p2];.  if( pIn
f4a0: 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  2->flags & MEM_N
f4b0: 75 6c 6c 20 29 7b 0a 20 20 20 20 76 32 20 3d 20  ull ){.    v2 = 
f4c0: 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
f4d0: 76 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  v2 = sqlite3Vdbe
f4e0: 49 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 21 3d  IntValue(pIn2)!=
f4f0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70  0;.  }.  if( pOp
f500: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 6e 64  ->opcode==OP_And
f510: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
f520: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
f530: 61 72 20 61 6e 64 5f 6c 6f 67 69 63 5b 5d 20 3d  ar and_logic[] =
f540: 20 7b 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31   { 0, 0, 0, 0, 1
f550: 2c 20 32 2c 20 30 2c 20 32 2c 20 32 20 7d 3b 0a  , 2, 0, 2, 2 };.
f560: 20 20 20 20 76 31 20 3d 20 61 6e 64 5f 6c 6f 67      v1 = and_log
f570: 69 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d  ic[v1*3+v2];.  }
f580: 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
f590: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
f5a0: 63 68 61 72 20 6f 72 5f 6c 6f 67 69 63 5b 5d 20  char or_logic[] 
f5b0: 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 31 2c 20  = { 0, 1, 2, 1, 
f5c0: 31 2c 20 31 2c 20 32 2c 20 31 2c 20 32 20 7d 3b  1, 1, 2, 1, 2 };
f5d0: 0a 20 20 20 20 76 31 20 3d 20 6f 72 5f 6c 6f 67  .    v1 = or_log
f5e0: 69 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d  ic[v1*3+v2];.  }
f5f0: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
f600: 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20  pOp->p3];.  if( 
f610: 76 31 3d 3d 32 20 29 7b 0a 20 20 20 20 4d 65 6d  v1==2 ){.    Mem
f620: 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
f630: 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d  , MEM_Null);.  }
f640: 65 6c 73 65 7b 0a 20 20 20 20 70 4f 75 74 2d 3e  else{.    pOut->
f650: 75 2e 69 20 3d 20 76 31 3b 0a 20 20 20 20 4d 65  u.i = v1;.    Me
f660: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
f670: 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d  t, MEM_Int);.  }
f680: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
f690: 4f 70 63 6f 64 65 3a 20 4e 6f 74 20 50 31 20 50  Opcode: Not P1 P
f6a0: 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e  2 * * *.**.** In
f6b0: 74 65 72 70 72 65 74 20 74 68 65 20 76 61 6c 75  terpret the valu
f6c0: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
f6d0: 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   as a boolean va
f6e0: 6c 75 65 2e 20 20 53 74 6f 72 65 20 74 68 65 0a  lue.  Store the.
f6f0: 2a 2a 20 62 6f 6f 6c 65 61 6e 20 63 6f 6d 70 6c  ** boolean compl
f700: 65 6d 65 6e 74 20 69 6e 20 72 65 67 69 73 74 65  ement in registe
f710: 72 20 50 32 2e 20 20 49 66 20 74 68 65 20 76 61  r P2.  If the va
f720: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
f730: 50 31 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20  P1 is .** NULL, 
f740: 74 68 65 6e 20 61 20 4e 55 4c 4c 20 69 73 20 73  then a NULL is s
f750: 74 6f 72 65 64 20 69 6e 20 50 32 2e 0a 2a 2f 0a  tored in P2..*/.
f760: 63 61 73 65 20 4f 50 5f 4e 6f 74 3a 20 7b 20 20  case OP_Not: {  
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f780: 20 73 61 6d 65 20 61 73 20 54 4b 5f 4e 4f 54 2c   same as TK_NOT,
f790: 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20 20   in1, out2 */.  
f7a0: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
f7b0: 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20  ->p1];.  pOut = 
f7c0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
f7d0: 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67    if( pIn1->flag
f7e0: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
f7f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
f800: 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b  emSetNull(pOut);
f810: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
f820: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49  lite3VdbeMemSetI
f830: 6e 74 36 34 28 70 4f 75 74 2c 20 21 73 71 6c 69  nt64(pOut, !sqli
f840: 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28  te3VdbeIntValue(
f850: 70 49 6e 31 29 29 3b 0a 20 20 7d 0a 20 20 62 72  pIn1));.  }.  br
f860: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
f870: 65 3a 20 42 69 74 4e 6f 74 20 50 31 20 50 32 20  e: BitNot P1 P2 
f880: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 74 65  * * *.**.** Inte
f890: 72 70 72 65 74 20 74 68 65 20 63 6f 6e 74 65 6e  rpret the conten
f8a0: 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 31  t of register P1
f8b0: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   as an integer. 
f8c0: 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20 6f 6e   Store the.** on
f8d0: 65 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66  es-complement of
f8e0: 20 74 68 65 20 50 31 20 76 61 6c 75 65 20 69 6e   the P1 value in
f8f0: 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 20  to register P2. 
f900: 20 49 66 20 50 31 20 68 6f 6c 64 73 0a 2a 2a 20   If P1 holds.** 
f910: 61 20 4e 55 4c 4c 20 74 68 65 6e 20 73 74 6f 72  a NULL then stor
f920: 65 20 61 20 4e 55 4c 4c 20 69 6e 20 50 32 2e 0a  e a NULL in P2..
f930: 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74 4e 6f  */.case OP_BitNo
f940: 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  t: {            
f950: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 42   /* same as TK_B
f960: 49 54 4e 4f 54 2c 20 69 6e 31 2c 20 6f 75 74 32  ITNOT, in1, out2
f970: 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
f980: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70  em[pOp->p1];.  p
f990: 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
f9a0: 3e 70 32 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31  >p2];.  if( pIn1
f9b0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
f9c0: 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ll ){.    sqlite
f9d0: 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
f9e0: 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pOut);.  }else{.
f9f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
fa00: 65 6d 53 65 74 49 6e 74 36 34 28 70 4f 75 74 2c  emSetInt64(pOut,
fa10: 20 7e 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74   ~sqlite3VdbeInt
fa20: 56 61 6c 75 65 28 70 49 6e 31 29 29 3b 0a 20 20  Value(pIn1));.  
fa30: 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
fa40: 20 4f 70 63 6f 64 65 3a 20 49 66 20 50 31 20 50   Opcode: If P1 P
fa50: 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a  2 P3 * *.**.** J
fa60: 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65  ump to P2 if the
fa70: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
fa80: 65 72 20 50 31 20 69 73 20 74 72 75 65 2e 20 20  er P1 is true.  
fa90: 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  The value.** is 
faa0: 63 6f 6e 73 69 64 65 72 65 64 20 74 72 75 65 20  considered true 
fab0: 69 66 20 69 74 20 69 73 20 6e 75 6d 65 72 69 63  if it is numeric
fac0: 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20   and non-zero.  
fad0: 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  If the value.** 
fae0: 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c 20 74 68  in P1 is NULL th
faf0: 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  en take the jump
fb00: 20 69 66 20 50 33 20 69 73 20 74 72 75 65 2e 0a   if P3 is true..
fb10: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66  */./* Opcode: If
fb20: 4e 6f 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a  Not P1 P2 P3 * *
fb30: 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50  .**.** Jump to P
fb40: 32 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  2 if the value i
fb50: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  n register P1 is
fb60: 20 46 61 6c 73 65 2e 20 20 54 68 65 20 76 61 6c   False.  The val
fb70: 75 65 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  ue.** is conside
fb80: 72 65 64 20 74 72 75 65 20 69 66 20 69 74 20 68  red true if it h
fb90: 61 73 20 61 20 6e 75 6d 65 72 69 63 20 76 61 6c  as a numeric val
fba0: 75 65 20 6f 66 20 7a 65 72 6f 2e 20 20 49 66 20  ue of zero.  If 
fbb0: 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20  the value.** in 
fbc0: 50 31 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  P1 is NULL then 
fbd0: 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
fbe0: 20 50 33 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a   P3 is true..*/.
fbf0: 63 61 73 65 20 4f 50 5f 49 66 3a 20 20 20 20 20  case OP_If:     
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
fc10: 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 63 61 73 65  ump, in1 */.case
fc20: 20 4f 50 5f 49 66 4e 6f 74 3a 20 7b 20 20 20 20   OP_IfNot: {    
fc30: 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
fc40: 20 69 6e 31 20 2a 2f 0a 20 20 69 6e 74 20 63 3b   in1 */.  int c;
fc50: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
fc60: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20  pOp->p1];.  if( 
fc70: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
fc80: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 63 20  M_Null ){.    c 
fc90: 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 65 6c  = pOp->p3;.  }el
fca0: 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
fcb0: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
fcc0: 50 4f 49 4e 54 0a 20 20 20 20 63 20 3d 20 73 71  POINT.    c = sq
fcd0: 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
fce0: 65 28 70 49 6e 31 29 21 3d 30 3b 0a 23 65 6c 73  e(pIn1)!=0;.#els
fcf0: 65 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65  e.    c = sqlite
fd00: 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28 70  3VdbeRealValue(p
fd10: 49 6e 31 29 21 3d 30 2e 30 3b 0a 23 65 6e 64 69  In1)!=0.0;.#endi
fd20: 66 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  f.    if( pOp->o
fd30: 70 63 6f 64 65 3d 3d 4f 50 5f 49 66 4e 6f 74 20  pcode==OP_IfNot 
fd40: 29 20 63 20 3d 20 21 63 3b 0a 20 20 7d 0a 20 20  ) c = !c;.  }.  
fd50: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 70 63 20  if( c ){.    pc 
fd60: 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d  = pOp->p2-1;.  }
fd70: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
fd80: 4f 70 63 6f 64 65 3a 20 49 73 4e 75 6c 6c 20 50  Opcode: IsNull P
fd90: 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
fda0: 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74   Jump to P2 if t
fdb0: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
fdc0: 73 74 65 72 20 50 31 20 69 73 20 4e 55 4c 4c 2e  ster P1 is NULL.
fdd0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 73 4e 75  .*/.case OP_IsNu
fde0: 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ll: {           
fdf0: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 49   /* same as TK_I
fe00: 53 4e 55 4c 4c 2c 20 6a 75 6d 70 2c 20 69 6e 31  SNULL, jump, in1
fe10: 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
fe20: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69  em[pOp->p1];.  i
fe30: 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
fe40: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29  & MEM_Null)!=0 )
fe50: 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e  {.    pc = pOp->
fe60: 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72  p2 - 1;.  }.  br
fe70: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
fe80: 65 3a 20 4e 6f 74 4e 75 6c 6c 20 50 31 20 50 32  e: NotNull P1 P2
fe90: 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d   * * *.**.** Jum
fea0: 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 76  p to P2 if the v
feb0: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
fec0: 20 50 31 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e   P1 is not NULL.
fed0: 20 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f    .*/.case OP_No
fee0: 74 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20  tNull: {        
fef0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
ff00: 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 6a 75 6d 70 2c  K_NOTNULL, jump,
ff10: 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
ff20: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
ff30: 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
ff40: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d  ags & MEM_Null)=
ff50: 3d 30 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70  =0 ){.    pc = p
ff60: 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a  Op->p2 - 1;.  }.
ff70: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
ff80: 70 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e 20 50 31  pcode: Column P1
ff90: 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a   P2 P3 P4 P5.**.
ffa0: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
ffb0: 20 64 61 74 61 20 74 68 61 74 20 63 75 72 73 6f   data that curso
ffc0: 72 20 50 31 20 70 6f 69 6e 74 73 20 74 6f 20 61  r P1 points to a
ffd0: 73 20 61 20 73 74 72 75 63 74 75 72 65 20 62 75  s a structure bu
ffe0: 69 6c 74 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65  ilt using.** the
fff0: 20 4d 61 6b 65 52 65 63 6f 72 64 20 69 6e 73 74   MakeRecord inst
10000 72 75 63 74 69 6f 6e 2e 20 20 28 53 65 65 20 74  ruction.  (See t
10010 68 65 20 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  he MakeRecord op
10020 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f  code for additio
10030 6e 61 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  nal.** informati
10040 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 6f 72  on about the for
10050 6d 61 74 20 6f 66 20 74 68 65 20 64 61 74 61 2e  mat of the data.
10060 29 20 20 45 78 74 72 61 63 74 20 74 68 65 20 50  )  Extract the P
10070 32 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 66  2-th column.** f
10080 72 6f 6d 20 74 68 69 73 20 72 65 63 6f 72 64 2e  rom this record.
10090 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6c    If there are l
100a0 65 73 73 20 74 68 61 74 20 28 50 32 2b 31 29 20  ess that (P2+1) 
100b0 0a 2a 2a 20 76 61 6c 75 65 73 20 69 6e 20 74 68  .** values in th
100c0 65 20 72 65 63 6f 72 64 2c 20 65 78 74 72 61 63  e record, extrac
100d0 74 20 61 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  t a NULL..**.** 
100e0 54 68 65 20 76 61 6c 75 65 20 65 78 74 72 61 63  The value extrac
100f0 74 65 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ted is stored in
10100 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
10110 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d  .** If the colum
10120 6e 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72  n contains fewer
10130 20 74 68 61 6e 20 50 32 20 66 69 65 6c 64 73 2c   than P2 fields,
10140 20 74 68 65 6e 20 65 78 74 72 61 63 74 20 61 20   then extract a 
10150 4e 55 4c 4c 2e 20 20 4f 72 2c 0a 2a 2a 20 69 66  NULL.  Or,.** if
10160 20 74 68 65 20 50 34 20 61 72 67 75 6d 65 6e 74   the P4 argument
10170 20 69 73 20 61 20 50 34 5f 4d 45 4d 20 75 73 65   is a P4_MEM use
10180 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
10190 65 20 50 34 20 61 72 67 75 6d 65 6e 74 20 61 73  e P4 argument as
101a0 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  .** the result..
101b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46  **.** If the OPF
101c0 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 20 62  LAG_CLEARCACHE b
101d0 69 74 20 69 73 20 73 65 74 20 6f 6e 20 50 35 20  it is set on P5 
101e0 61 6e 64 20 50 31 20 69 73 20 61 20 70 73 65 75  and P1 is a pseu
101f0 64 6f 2d 74 61 62 6c 65 20 63 75 72 73 6f 72 2c  do-table cursor,
10200 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61 63  .** then the cac
10210 68 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  he of the cursor
10220 20 69 73 20 72 65 73 65 74 20 70 72 69 6f 72 20   is reset prior 
10230 74 6f 20 65 78 74 72 61 63 74 69 6e 67 20 74 68  to extracting th
10240 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65  e column..** The
10250 20 66 69 72 73 74 20 4f 50 5f 43 6f 6c 75 6d 6e   first OP_Column
10260 20 61 67 61 69 6e 73 74 20 61 20 70 73 65 75 64   against a pseud
10270 6f 2d 74 61 62 6c 65 20 61 66 74 65 72 20 74 68  o-table after th
10280 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
10290 6f 6e 74 65 6e 74 0a 2a 2a 20 72 65 67 69 73 74  ontent.** regist
102a0 65 72 20 68 61 73 20 63 68 61 6e 67 65 64 20 73  er has changed s
102b0 68 6f 75 6c 64 20 68 61 76 65 20 74 68 69 73 20  hould have this 
102c0 62 69 74 20 73 65 74 2e 0a 2a 2f 0a 63 61 73 65  bit set..*/.case
102d0 20 4f 50 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20   OP_Column: {.  
102e0 75 33 32 20 70 61 79 6c 6f 61 64 53 69 7a 65 3b  u32 payloadSize;
102f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10300 62 79 74 65 73 20 69 6e 20 74 68 65 20 72 65 63  bytes in the rec
10310 6f 72 64 20 2a 2f 0a 20 20 69 36 34 20 70 61 79  ord */.  i64 pay
10320 6c 6f 61 64 53 69 7a 65 36 34 3b 20 2f 2a 20 4e  loadSize64; /* N
10330 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
10340 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  n the record */.
10350 20 20 69 6e 74 20 70 31 3b 20 20 20 20 20 20 20    int p1;       
10360 20 20 20 20 20 2f 2a 20 50 31 20 76 61 6c 75 65       /* P1 value
10370 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 2a   of the opcode *
10380 2f 0a 20 20 69 6e 74 20 70 32 3b 20 20 20 20 20  /.  int p2;     
10390 20 20 20 20 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e         /* column
103a0 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 74 72 69   number to retri
103b0 65 76 65 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  eve */.  VdbeCur
103c0 73 6f 72 20 2a 70 43 3b 20 20 20 20 2f 2a 20 54  sor *pC;    /* T
103d0 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 2a  he VDBE cursor *
103e0 2f 0a 20 20 63 68 61 72 20 2a 7a 52 65 63 3b 20  /.  char *zRec; 
103f0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
10400 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 72 65  r to complete re
10410 63 6f 72 64 2d 64 61 74 61 20 2a 2f 0a 20 20 42  cord-data */.  B
10420 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 20  tCursor *pCrsr; 
10430 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 63    /* The BTree c
10440 75 72 73 6f 72 20 2a 2f 0a 20 20 75 33 32 20 2a  ursor */.  u32 *
10450 61 54 79 70 65 3b 20 20 20 20 20 20 20 20 2f 2a  aType;        /*
10460 20 61 54 79 70 65 5b 69 5d 20 68 6f 6c 64 73 20   aType[i] holds 
10470 74 68 65 20 6e 75 6d 65 72 69 63 20 74 79 70 65  the numeric type
10480 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 6f 6c   of the i-th col
10490 75 6d 6e 20 2a 2f 0a 20 20 75 33 32 20 2a 61 4f  umn */.  u32 *aO
104a0 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 61  ffset;      /* a
104b0 4f 66 66 73 65 74 5b 69 5d 20 69 73 20 6f 66 66  Offset[i] is off
104c0 73 65 74 20 74 6f 20 73 74 61 72 74 20 6f 66 20  set to start of 
104d0 64 61 74 61 20 66 6f 72 20 69 2d 74 68 20 63 6f  data for i-th co
104e0 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  lumn */.  int nF
104f0 69 65 6c 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  ield;        /* 
10500 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
10510 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a   in the record *
10520 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20  /.  int len;    
10530 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65         /* The le
10540 6e 67 74 68 20 6f 66 20 74 68 65 20 73 65 72 69  ngth of the seri
10550 61 6c 69 7a 65 64 20 64 61 74 61 20 66 6f 72 20  alized data for 
10560 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  the column */.  
10570 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
10580 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
10590 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  er */.  char *zD
105a0 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  ata;       /* Pa
105b0 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  rt of the record
105c0 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a   being decoded *
105d0 2f 0a 20 20 4d 65 6d 20 2a 70 44 65 73 74 3b 20  /.  Mem *pDest; 
105e0 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
105f0 74 6f 20 77 72 69 74 65 20 74 68 65 20 65 78 74  to write the ext
10600 72 61 63 74 65 64 20 76 61 6c 75 65 20 2a 2f 0a  racted value */.
10610 20 20 4d 65 6d 20 73 4d 65 6d 3b 20 20 20 20 20    Mem sMem;     
10620 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 74 6f 72       /* For stor
10630 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 62  ing the record b
10640 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a  eing decoded */.
10650 20 20 75 38 20 2a 7a 49 64 78 3b 20 20 20 20 20    u8 *zIdx;     
10660 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
10670 74 6f 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  to header */.  u
10680 38 20 2a 7a 45 6e 64 48 64 72 3b 20 20 20 20 20  8 *zEndHdr;     
10690 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
106a0 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72  first byte after
106b0 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
106c0 20 75 33 32 20 6f 66 66 73 65 74 3b 20 20 20 20   u32 offset;    
106d0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
106e0 74 6f 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20  to the data */. 
106f0 20 75 33 32 20 73 7a 46 69 65 6c 64 3b 20 20 20   u32 szField;   
10700 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10710 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 6f   bytes in the co
10720 6e 74 65 6e 74 20 6f 66 20 61 20 66 69 65 6c 64  ntent of a field
10730 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 48 64 72 3b   */.  int szHdr;
10740 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
10750 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 73   of the header s
10760 69 7a 65 20 66 69 65 6c 64 20 61 74 20 73 74 61  ize field at sta
10770 72 74 20 6f 66 20 72 65 63 6f 72 64 20 2a 2f 0a  rt of record */.
10780 20 20 69 6e 74 20 61 76 61 69 6c 3b 20 20 20 20    int avail;    
10790 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
107a0 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
107b0 61 62 6c 65 20 64 61 74 61 20 2a 2f 0a 20 20 4d  able data */.  M
107c0 65 6d 20 2a 70 52 65 67 3b 20 20 20 20 20 20 20  em *pReg;       
107d0 20 20 2f 2a 20 50 73 65 75 64 6f 54 61 62 6c 65    /* PseudoTable
107e0 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 20   input register 
107f0 2a 2f 0a 0a 0a 20 20 70 31 20 3d 20 70 4f 70 2d  */...  p1 = pOp-
10800 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d  >p1;.  p2 = pOp-
10810 3e 70 32 3b 0a 20 20 70 43 20 3d 20 30 3b 0a 20  >p2;.  pC = 0;. 
10820 20 6d 65 6d 73 65 74 28 26 73 4d 65 6d 2c 20 30   memset(&sMem, 0
10830 2c 20 73 69 7a 65 6f 66 28 73 4d 65 6d 29 29 3b  , sizeof(sMem));
10840 0a 20 20 61 73 73 65 72 74 28 20 70 31 3c 70 2d  .  assert( p1<p-
10850 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73  >nCursor );.  as
10860 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20  sert( pOp->p3>0 
10870 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e  && pOp->p3<=p->n
10880 4d 65 6d 20 29 3b 0a 20 20 70 44 65 73 74 20 3d  Mem );.  pDest =
10890 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
108a0 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61  .  memAboutToCha
108b0 6e 67 65 28 70 2c 20 70 44 65 73 74 29 3b 0a 20  nge(p, pDest);. 
108c0 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
108d0 70 44 65 73 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  pDest, MEM_Null)
108e0 3b 0a 20 20 7a 52 65 63 20 3d 20 30 3b 0a 0a 20  ;.  zRec = 0;.. 
108f0 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
10900 65 74 73 20 74 68 65 20 76 61 72 69 61 62 6c 65  ets the variable
10910 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 74 6f 20   payloadSize to 
10920 62 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  be the total num
10930 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 79 74 65  ber of.  ** byte
10940 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 2e  s in the record.
10950 0a 20 20 2a 2a 0a 20 20 2a 2a 20 7a 52 65 63 20  .  **.  ** zRec 
10960 69 73 20 73 65 74 20 74 6f 20 62 65 20 74 68 65  is set to be the
10970 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
10980 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 66 20  f the record if 
10990 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  it is available.
109a0 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  ** The comple
109b0 74 65 20 72 65 63 6f 72 64 20 74 65 78 74 20 69  te record text i
109c0 73 20 61 6c 77 61 79 73 20 61 76 61 69 6c 61 62  s always availab
109d0 6c 65 20 66 6f 72 20 70 73 65 75 64 6f 2d 74 61  le for pseudo-ta
109e0 62 6c 65 73 0a 20 20 2a 2a 20 49 66 20 74 68 65  bles.  ** If the
109f0 20 72 65 63 6f 72 64 20 69 73 20 73 74 6f 72 65   record is store
10a00 64 20 69 6e 20 61 20 63 75 72 73 6f 72 2c 20 74  d in a cursor, t
10a10 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 65 63 6f  he complete reco
10a20 72 64 20 74 65 78 74 0a 20 20 2a 2a 20 6d 69 67  rd text.  ** mig
10a30 68 74 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20  ht be available 
10a40 69 6e 20 74 68 65 20 20 70 43 2d 3e 61 52 6f 77  in the  pC->aRow
10a50 20 63 61 63 68 65 2e 20 20 4f 72 20 69 74 20 6d   cache.  Or it m
10a60 69 67 68 74 20 6e 6f 74 20 62 65 2e 0a 20 20 2a  ight not be..  *
10a70 2a 20 49 66 20 74 68 65 20 64 61 74 61 20 69 73  * If the data is
10a80 20 75 6e 61 76 61 69 6c 61 62 6c 65 2c 20 20 7a   unavailable,  z
10a90 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 4e 55  Rec is set to NU
10aa0 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  LL..  **.  ** We
10ab0 20 61 6c 73 6f 20 63 6f 6d 70 75 74 65 20 74 68   also compute th
10ac0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
10ad0 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72  mns in the recor
10ae0 64 2e 20 20 46 6f 72 20 63 75 72 73 6f 72 73 2c  d.  For cursors,
10af0 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  .  ** the number
10b00 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 73 20 73   of columns is s
10b10 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62  tored in the Vdb
10b20 65 43 75 72 73 6f 72 2e 6e 46 69 65 6c 64 20 65  eCursor.nField e
10b30 6c 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70  lement..  */.  p
10b40 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 31 5d  C = p->apCsr[p1]
10b50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
10b60 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
10b70 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
10b80 54 41 42 4c 45 0a 20 20 61 73 73 65 72 74 28 20  TABLE.  assert( 
10b90 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3d  pC->pVtabCursor=
10ba0 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  =0 );.#endif.  p
10bb0 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73  Crsr = pC->pCurs
10bc0 6f 72 3b 0a 20 20 69 66 28 20 70 43 72 73 72 21  or;.  if( pCrsr!
10bd0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
10be0 20 72 65 63 6f 72 64 20 69 73 20 73 74 6f 72 65   record is store
10bf0 64 20 69 6e 20 61 20 42 2d 54 72 65 65 20 2a 2f  d in a B-Tree */
10c00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10c10 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
10c20 6f 28 70 43 29 3b 0a 20 20 20 20 69 66 28 20 72  o(pC);.    if( r
10c30 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
10c40 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
10c50 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77   if( pC->nullRow
10c60 20 29 7b 0a 20 20 20 20 20 20 70 61 79 6c 6f 61   ){.      payloa
10c70 64 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d  dSize = 0;.    }
10c80 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 63 61 63  else if( pC->cac
10c90 68 65 53 74 61 74 75 73 3d 3d 70 2d 3e 63 61 63  heStatus==p->cac
10ca0 68 65 43 74 72 20 29 7b 0a 20 20 20 20 20 20 70  heCtr ){.      p
10cb0 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 70 43 2d  ayloadSize = pC-
10cc0 3e 70 61 79 6c 6f 61 64 53 69 7a 65 3b 0a 20 20  >payloadSize;.  
10cd0 20 20 20 20 7a 52 65 63 20 3d 20 28 63 68 61 72      zRec = (char
10ce0 2a 29 70 43 2d 3e 61 52 6f 77 3b 0a 20 20 20 20  *)pC->aRow;.    
10cf0 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 69 73  }else if( pC->is
10d00 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 61  Index ){.      a
10d10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
10d20 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
10d30 28 70 43 72 73 72 29 20 29 3b 0a 20 20 20 20 20  (pCrsr) );.     
10d40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
10d50 65 65 4b 65 79 53 69 7a 65 28 70 43 72 73 72 2c  eeKeySize(pCrsr,
10d60 20 26 70 61 79 6c 6f 61 64 53 69 7a 65 36 34 29   &payloadSize64)
10d70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10d80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
10d90 20 20 20 2f 2a 20 54 72 75 65 20 62 65 63 61 75     /* True becau
10da0 73 65 20 6f 66 20 43 75 72 73 6f 72 4d 6f 76 65  se of CursorMove
10db0 74 6f 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 20  to() call above 
10dc0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  */.      /* sqli
10dd0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
10de0 6c 50 74 72 28 29 20 75 73 65 73 20 67 65 74 56  lPtr() uses getV
10df0 61 72 69 6e 74 33 32 28 29 20 74 6f 20 65 78 74  arint32() to ext
10e00 72 61 63 74 20 74 68 65 0a 20 20 20 20 20 20 2a  ract the.      *
10e10 2a 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 2c 20  * payload size, 
10e20 73 6f 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69  so it is impossi
10e30 62 6c 65 20 66 6f 72 20 70 61 79 6c 6f 61 64 53  ble for payloadS
10e40 69 7a 65 36 34 20 74 6f 20 62 65 0a 20 20 20 20  ize64 to be.    
10e50 20 20 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e    ** larger than
10e60 20 33 32 20 62 69 74 73 2e 20 2a 2f 0a 20 20 20   32 bits. */.   
10e70 20 20 20 61 73 73 65 72 74 28 20 28 70 61 79 6c     assert( (payl
10e80 6f 61 64 53 69 7a 65 36 34 20 26 20 53 51 4c 49  oadSize64 & SQLI
10e90 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36  TE_MAX_U32)==(u6
10ea0 34 29 70 61 79 6c 6f 61 64 53 69 7a 65 36 34 20  4)payloadSize64 
10eb0 29 3b 0a 20 20 20 20 20 20 70 61 79 6c 6f 61 64  );.      payload
10ec0 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 79 6c  Size = (u32)payl
10ed0 6f 61 64 53 69 7a 65 36 34 3b 0a 20 20 20 20 7d  oadSize64;.    }
10ee0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
10ef0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
10f00 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
10f10 72 73 72 29 20 29 3b 0a 20 20 20 20 20 20 72 63  rsr) );.      rc
10f20 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44   = sqlite3BtreeD
10f30 61 74 61 53 69 7a 65 28 70 43 72 73 72 2c 20 26  ataSize(pCrsr, &
10f40 70 61 79 6c 6f 61 64 53 69 7a 65 29 3b 0a 20 20  payloadSize);.  
10f50 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
10f60 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 2f  SQLITE_OK );   /
10f70 2a 20 44 61 74 61 53 69 7a 65 28 29 20 63 61 6e  * DataSize() can
10f80 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 20 20  not fail */.    
10f90 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  }.  }else if( pC
10fa0 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67  ->pseudoTableReg
10fb0 3e 30 20 29 7b 0a 20 20 20 20 70 52 65 67 20 3d  >0 ){.    pReg =
10fc0 20 26 61 4d 65 6d 5b 70 43 2d 3e 70 73 65 75 64   &aMem[pC->pseud
10fd0 6f 54 61 62 6c 65 52 65 67 5d 3b 0a 20 20 20 20  oTableReg];.    
10fe0 61 73 73 65 72 74 28 20 70 52 65 67 2d 3e 66 6c  assert( pReg->fl
10ff0 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
11000 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
11010 6d 49 73 56 61 6c 69 64 28 70 52 65 67 29 20 29  mIsValid(pReg) )
11020 3b 0a 20 20 20 20 70 61 79 6c 6f 61 64 53 69 7a  ;.    payloadSiz
11030 65 20 3d 20 70 52 65 67 2d 3e 6e 3b 0a 20 20 20  e = pReg->n;.   
11040 20 7a 52 65 63 20 3d 20 70 52 65 67 2d 3e 7a 3b   zRec = pReg->z;
11050 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74  .    pC->cacheSt
11060 61 74 75 73 20 3d 20 28 70 4f 70 2d 3e 70 35 26  atus = (pOp->p5&
11070 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48  OPFLAG_CLEARCACH
11080 45 29 20 3f 20 43 41 43 48 45 5f 53 54 41 4c 45  E) ? CACHE_STALE
11090 20 3a 20 70 2d 3e 63 61 63 68 65 43 74 72 3b 0a   : p->cacheCtr;.
110a0 20 20 20 20 61 73 73 65 72 74 28 20 70 61 79 6c      assert( payl
110b0 6f 61 64 53 69 7a 65 3d 3d 30 20 7c 7c 20 7a 52  oadSize==0 || zR
110c0 65 63 21 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  ec!=0 );.  }else
110d0 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
110e0 72 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65 20  r the row to be 
110f0 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 70 61 79 6c  NULL */.    payl
11100 6f 61 64 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d  oadSize = 0;.  }
11110 0a 0a 20 20 2f 2a 20 49 66 20 70 61 79 6c 6f 61  ..  /* If payloa
11120 64 53 69 7a 65 20 69 73 20 30 2c 20 74 68 65 6e  dSize is 0, then
11130 20 6a 75 73 74 20 73 74 6f 72 65 20 61 20 4e 55   just store a NU
11140 4c 4c 20 2a 2f 0a 20 20 69 66 28 20 70 61 79 6c  LL */.  if( payl
11150 6f 61 64 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  oadSize==0 ){.  
11160 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
11170 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20  >flags&MEM_Null 
11180 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63  );.    goto op_c
11190 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 7d 0a 20  olumn_out;.  }. 
111a0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 4c 69   assert( db->aLi
111b0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
111c0 5f 4c 45 4e 47 54 48 5d 3e 3d 30 20 29 3b 0a 20  _LENGTH]>=0 );. 
111d0 20 69 66 28 20 70 61 79 6c 6f 61 64 53 69 7a 65   if( payloadSize
111e0 20 3e 20 28 75 33 32 29 64 62 2d 3e 61 4c 69 6d   > (u32)db->aLim
111f0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
11200 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67  LENGTH] ){.    g
11210 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
11220 0a 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 43 2d  ..  nField = pC-
11230 3e 6e 46 69 65 6c 64 3b 0a 20 20 61 73 73 65 72  >nField;.  asser
11240 74 28 20 70 32 3c 6e 46 69 65 6c 64 20 29 3b 0a  t( p2<nField );.
11250 0a 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 70  .  /* Read and p
11260 61 72 73 65 20 74 68 65 20 74 61 62 6c 65 20 68  arse the table h
11270 65 61 64 65 72 2e 20 20 53 74 6f 72 65 20 74 68  eader.  Store th
11280 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
11290 20 70 61 72 73 65 0a 20 20 2a 2a 20 69 6e 74 6f   parse.  ** into
112a0 20 74 68 65 20 72 65 63 6f 72 64 20 68 65 61 64   the record head
112b0 65 72 20 63 61 63 68 65 20 66 69 65 6c 64 73 20  er cache fields 
112c0 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 20  of the cursor.. 
112d0 20 2a 2f 0a 20 20 61 54 79 70 65 20 3d 20 70 43   */.  aType = pC
112e0 2d 3e 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70  ->aType;.  if( p
112f0 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 3d 3d  C->cacheStatus==
11300 70 2d 3e 63 61 63 68 65 43 74 72 20 29 7b 0a 20  p->cacheCtr ){. 
11310 20 20 20 61 4f 66 66 73 65 74 20 3d 20 70 43 2d     aOffset = pC-
11320 3e 61 4f 66 66 73 65 74 3b 0a 20 20 7d 65 6c 73  >aOffset;.  }els
11330 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 61 54  e{.    assert(aT
11340 79 70 65 29 3b 0a 20 20 20 20 61 76 61 69 6c 20  ype);.    avail 
11350 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 61 4f 66  = 0;.    pC->aOf
11360 66 73 65 74 20 3d 20 61 4f 66 66 73 65 74 20 3d  fset = aOffset =
11370 20 26 61 54 79 70 65 5b 6e 46 69 65 6c 64 5d 3b   &aType[nField];
11380 0a 20 20 20 20 70 43 2d 3e 70 61 79 6c 6f 61 64  .    pC->payload
11390 53 69 7a 65 20 3d 20 70 61 79 6c 6f 61 64 53 69  Size = payloadSi
113a0 7a 65 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68  ze;.    pC->cach
113b0 65 53 74 61 74 75 73 20 3d 20 70 2d 3e 63 61 63  eStatus = p->cac
113c0 68 65 43 74 72 3b 0a 0a 20 20 20 20 2f 2a 20 46  heCtr;..    /* F
113d0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
113e0 6e 79 20 62 79 74 65 73 20 61 72 65 20 69 6e 20  ny bytes are in 
113f0 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
11400 20 20 69 66 28 20 7a 52 65 63 20 29 7b 0a 20 20    if( zRec ){.  
11410 20 20 20 20 7a 44 61 74 61 20 3d 20 7a 52 65 63      zData = zRec
11420 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11430 20 20 20 69 66 28 20 70 43 2d 3e 69 73 49 6e 64     if( pC->isInd
11440 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44  ex ){.        zD
11450 61 74 61 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  ata = (char*)sql
11460 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
11470 68 28 70 43 72 73 72 2c 20 26 61 76 61 69 6c 29  h(pCrsr, &avail)
11480 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11490 20 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 28         zData = (
114a0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 42 74 72  char*)sqlite3Btr
114b0 65 65 44 61 74 61 46 65 74 63 68 28 70 43 72 73  eeDataFetch(pCrs
114c0 72 2c 20 26 61 76 61 69 6c 29 3b 0a 20 20 20 20  r, &avail);.    
114d0 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20    }.      /* If 
114e0 4b 65 79 46 65 74 63 68 28 29 2f 44 61 74 61 46  KeyFetch()/DataF
114f0 65 74 63 68 28 29 20 6d 61 6e 61 67 65 64 20 74  etch() managed t
11500 6f 20 67 65 74 20 74 68 65 20 65 6e 74 69 72 65  o get the entire
11510 20 70 61 79 6c 6f 61 64 2c 0a 20 20 20 20 20 20   payload,.      
11520 2a 2a 20 73 61 76 65 20 74 68 65 20 70 61 79 6c  ** save the payl
11530 6f 61 64 20 69 6e 20 74 68 65 20 70 43 2d 3e 61  oad in the pC->a
11540 52 6f 77 20 63 61 63 68 65 2e 20 20 54 68 61 74  Row cache.  That
11550 20 77 69 6c 6c 20 73 61 76 65 20 75 73 20 66 72   will save us fr
11560 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 69  om.      ** havi
11570 6e 67 20 74 6f 20 6d 61 6b 65 20 61 64 64 69 74  ng to make addit
11580 69 6f 6e 61 6c 20 63 61 6c 6c 73 20 74 6f 20 66  ional calls to f
11590 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
115a0 20 70 6f 72 74 69 6f 6e 20 6f 66 0a 20 20 20 20   portion of.    
115b0 20 20 2a 2a 20 74 68 65 20 72 65 63 6f 72 64 2e    ** the record.
115c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
115d0 61 73 73 65 72 74 28 20 61 76 61 69 6c 3e 3d 30  assert( avail>=0
115e0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 61   );.      if( pa
115f0 79 6c 6f 61 64 53 69 7a 65 20 3c 3d 20 28 75 33  yloadSize <= (u3
11600 32 29 61 76 61 69 6c 20 29 7b 0a 20 20 20 20 20  2)avail ){.     
11610 20 20 20 7a 52 65 63 20 3d 20 7a 44 61 74 61 3b     zRec = zData;
11620 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 61 52 6f  .        pC->aRo
11630 77 20 3d 20 28 75 38 2a 29 7a 44 61 74 61 3b 0a  w = (u8*)zData;.
11640 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11650 20 20 20 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20       pC->aRow = 
11660 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
11670 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
11680 6f 77 69 6e 67 20 61 73 73 65 72 74 20 69 73 20  owing assert is 
11690 74 72 75 65 20 69 6e 20 61 6c 6c 20 63 61 73 65  true in all case
116a0 73 20 61 63 63 65 70 74 20 77 68 65 6e 0a 20 20  s accept when.  
116b0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
116c0 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
116d0 63 6f 72 72 75 70 74 65 64 20 65 78 74 65 72 6e  corrupted extern
116e0 61 6c 6c 79 2e 0a 20 20 20 20 2a 2a 20 20 20 20  ally..    **    
116f0 61 73 73 65 72 74 28 20 7a 52 65 63 21 3d 30 20  assert( zRec!=0 
11700 7c 7c 20 61 76 61 69 6c 3e 3d 70 61 79 6c 6f 61  || avail>=payloa
11710 64 53 69 7a 65 20 7c 7c 20 61 76 61 69 6c 3e 3d  dSize || avail>=
11720 39 20 29 3b 20 2a 2f 0a 20 20 20 20 73 7a 48 64  9 ); */.    szHd
11730 72 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  r = getVarint32(
11740 28 75 38 2a 29 7a 44 61 74 61 2c 20 6f 66 66 73  (u8*)zData, offs
11750 65 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  et);..    /* Mak
11760 65 20 73 75 72 65 20 61 20 63 6f 72 72 75 70 74  e sure a corrupt
11770 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f   database has no
11780 74 20 67 69 76 65 6e 20 75 73 20 61 6e 20 6f 76  t given us an ov
11790 65 72 73 69 7a 65 20 68 65 61 64 65 72 2e 0a 20  ersize header.. 
117a0 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 6e 6f     ** Do this no
117b0 77 20 74 6f 20 61 76 6f 69 64 20 61 6e 20 6f 76  w to avoid an ov
117c0 65 72 73 69 7a 65 20 6d 65 6d 6f 72 79 20 61 6c  ersize memory al
117d0 6c 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a  location..    **
117e0 0a 20 20 20 20 2a 2a 20 54 79 70 65 20 65 6e 74  .    ** Type ent
117f0 72 69 65 73 20 63 61 6e 20 62 65 20 62 65 74 77  ries can be betw
11800 65 65 6e 20 31 20 61 6e 64 20 35 20 62 79 74 65  een 1 and 5 byte
11810 73 20 65 61 63 68 2e 20 20 42 75 74 20 34 20 61  s each.  But 4 a
11820 6e 64 20 35 20 62 79 74 65 0a 20 20 20 20 2a 2a  nd 5 byte.    **
11830 20 74 79 70 65 73 20 75 73 65 20 73 6f 20 6d 75   types use so mu
11840 63 68 20 64 61 74 61 20 73 70 61 63 65 20 74 68  ch data space th
11850 61 74 20 74 68 65 72 65 20 63 61 6e 20 6f 6e 6c  at there can onl
11860 79 20 62 65 20 34 30 39 36 20 61 6e 64 20 33 32  y be 4096 and 32
11870 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 6d 2c   of.    ** them,
11880 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20   respectively.  
11890 53 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  So the maximum h
118a0 65 61 64 65 72 20 6c 65 6e 67 74 68 20 72 65 73  eader length res
118b0 75 6c 74 73 20 66 72 6f 6d 20 61 0a 20 20 20 20  ults from a.    
118c0 2a 2a 20 33 2d 62 79 74 65 20 74 79 70 65 20 66  ** 3-byte type f
118d0 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 20 6d  or each of the m
118e0 61 78 69 6d 75 6d 20 6f 66 20 33 32 37 36 38 20  aximum of 32768 
118f0 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 20 74 68 72  columns plus thr
11900 65 65 0a 20 20 20 20 2a 2a 20 65 78 74 72 61 20  ee.    ** extra 
11910 62 79 74 65 73 20 66 6f 72 20 74 68 65 20 68 65  bytes for the he
11920 61 64 65 72 20 6c 65 6e 67 74 68 20 69 74 73 65  ader length itse
11930 6c 66 2e 20 20 33 32 37 36 38 2a 33 20 2b 20 33  lf.  32768*3 + 3
11940 20 3d 20 39 38 33 30 37 2e 0a 20 20 20 20 2a 2f   = 98307..    */
11950 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 20  .    if( offset 
11960 3e 20 39 38 33 30 37 20 29 7b 0a 20 20 20 20 20  > 98307 ){.     
11970 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
11980 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
11990 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f   goto op_column_
119a0 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
119b0 2f 2a 20 43 6f 6d 70 75 74 65 20 69 6e 20 6c 65  /* Compute in le
119c0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
119d0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 77 65  bytes of data we
119e0 20 6e 65 65 64 20 74 6f 20 72 65 61 64 20 69 6e   need to read in
119f0 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 74 6f   order.    ** to
11a00 20 67 65 74 20 6e 46 69 65 6c 64 20 74 79 70 65   get nField type
11a10 20 76 61 6c 75 65 73 2e 20 20 6f 66 66 73 65 74   values.  offset
11a20 20 69 73 20 61 6e 20 75 70 70 65 72 20 62 6f 75   is an upper bou
11a30 6e 64 20 6f 6e 20 74 68 69 73 2e 20 20 42 75 74  nd on this.  But
11a40 0a 20 20 20 20 2a 2a 20 6e 46 69 65 6c 64 20 6d  .    ** nField m
11a50 69 67 68 74 20 62 65 20 73 69 67 6e 69 66 69 63  ight be signific
11a60 61 6e 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20  antly less than 
11a70 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 20  the true number 
11a80 6f 66 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a  of columns.    *
11a90 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20  * in the table, 
11aa0 61 6e 64 20 69 6e 20 74 68 61 74 20 63 61 73 65  and in that case
11ab0 2c 20 35 2a 6e 46 69 65 6c 64 2b 33 20 6d 69 67  , 5*nField+3 mig
11ac0 68 74 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  ht be smaller th
11ad0 61 6e 20 6f 66 66 73 65 74 2e 0a 20 20 20 20 2a  an offset..    *
11ae0 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 6d 69 6e  * We want to min
11af0 69 6d 69 7a 65 20 6c 65 6e 20 69 6e 20 6f 72 64  imize len in ord
11b00 65 72 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  er to limit the 
11b10 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f  size of the memo
11b20 72 79 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61  ry.    ** alloca
11b30 74 69 6f 6e 2c 20 65 73 70 65 63 69 61 6c 6c 79  tion, especially
11b40 20 69 66 20 61 20 63 6f 72 72 75 70 74 20 64 61   if a corrupt da
11b50 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
11b60 63 61 75 73 65 64 20 6f 66 66 73 65 74 0a 20 20  caused offset.  
11b70 20 20 2a 2a 20 74 6f 20 62 65 20 6f 76 65 72 73    ** to be overs
11b80 69 7a 65 64 2e 20 4f 66 66 73 65 74 20 69 73 20  ized. Offset is 
11b90 6c 69 6d 69 74 65 64 20 74 6f 20 39 38 33 30 37  limited to 98307
11ba0 20 61 62 6f 76 65 2e 20 20 42 75 74 20 39 38 33   above.  But 983
11bb0 30 37 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20  07 might.    ** 
11bc0 73 74 69 6c 6c 20 65 78 63 65 65 64 20 52 6f 62  still exceed Rob
11bd0 73 6f 6e 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  son memory alloc
11be0 61 74 69 6f 6e 20 6c 69 6d 69 74 73 20 6f 6e 20  ation limits on 
11bf0 73 6f 6d 65 20 63 6f 6e 66 69 67 75 72 61 74 69  some configurati
11c00 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 4f 6e 20 73  ons..    ** On s
11c10 79 73 74 65 6d 73 20 74 68 61 74 20 63 61 6e 6e  ystems that cann
11c20 6f 74 20 74 6f 6c 65 72 61 74 65 20 6c 61 72 67  ot tolerate larg
11c30 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
11c40 69 6f 6e 73 2c 20 6e 46 69 65 6c 64 2a 35 2b 33  ions, nField*5+3
11c50 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6c 69 6b  .    ** will lik
11c60 65 6c 79 20 62 65 20 6d 75 63 68 20 73 6d 61 6c  ely be much smal
11c70 6c 65 72 20 73 69 6e 63 65 20 6e 46 69 65 6c 64  ler since nField
11c80 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 62 65 20   will likely be 
11c90 6c 65 73 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a  less than.    **
11ca0 20 32 30 20 6f 72 20 73 6f 2e 20 20 54 68 69 73   20 or so.  This
11cb0 20 69 6e 73 75 72 65 73 20 74 68 61 74 20 52 6f   insures that Ro
11cc0 62 73 6f 6e 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  bson memory allo
11cd0 63 61 74 69 6f 6e 20 6c 69 6d 69 74 73 20 61 72  cation limits ar
11ce0 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 78 63  e.    ** not exc
11cf0 65 65 64 65 64 20 65 76 65 6e 20 66 6f 72 20 63  eeded even for c
11d00 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
11d10 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  files..    */.  
11d20 20 20 6c 65 6e 20 3d 20 6e 46 69 65 6c 64 2a 35    len = nField*5
11d30 20 2b 20 33 3b 0a 20 20 20 20 69 66 28 20 6c 65   + 3;.    if( le
11d40 6e 20 3e 20 28 69 6e 74 29 6f 66 66 73 65 74 20  n > (int)offset 
11d50 29 20 6c 65 6e 20 3d 20 28 69 6e 74 29 6f 66 66  ) len = (int)off
11d60 73 65 74 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  set;..    /* The
11d70 20 4b 65 79 46 65 74 63 68 28 29 20 6f 72 20 44   KeyFetch() or D
11d80 61 74 61 46 65 74 63 68 28 29 20 61 62 6f 76 65  ataFetch() above
11d90 20 61 72 65 20 66 61 73 74 20 61 6e 64 20 77 69   are fast and wi
11da0 6c 6c 20 67 65 74 20 74 68 65 20 65 6e 74 69 72  ll get the entir
11db0 65 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 20  e.    ** record 
11dc0 68 65 61 64 65 72 20 69 6e 20 6d 6f 73 74 20 63  header in most c
11dd0 61 73 65 73 2e 20 20 42 75 74 20 74 68 65 79 20  ases.  But they 
11de0 77 69 6c 6c 20 66 61 69 6c 20 74 6f 20 67 65 74  will fail to get
11df0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 0a 20 20   the complete.  
11e00 20 20 2a 2a 20 72 65 63 6f 72 64 20 68 65 61 64    ** record head
11e10 65 72 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  er if the record
11e20 20 68 65 61 64 65 72 20 64 6f 65 73 20 6e 6f 74   header does not
11e30 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65   fit on a single
11e40 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20   page.    ** in 
11e50 74 68 65 20 42 2d 54 72 65 65 2e 20 20 57 68 65  the B-Tree.  Whe
11e60 6e 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20  n that happens, 
11e70 75 73 65 20 73 71 6c 69 74 65 33 56 64 62 65 4d  use sqlite3VdbeM
11e80 65 6d 46 72 6f 6d 42 74 72 65 65 28 29 20 74 6f  emFromBtree() to
11e90 0a 20 20 20 20 2a 2a 20 61 63 71 75 69 72 65 20  .    ** acquire 
11ea0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  the complete hea
11eb0 64 65 72 20 74 65 78 74 2e 0a 20 20 20 20 2a 2f  der text..    */
11ec0 0a 20 20 20 20 69 66 28 20 21 7a 52 65 63 20 26  .    if( !zRec &
11ed0 26 20 61 76 61 69 6c 3c 6c 65 6e 20 29 7b 0a 20  & avail<len ){. 
11ee0 20 20 20 20 20 73 4d 65 6d 2e 66 6c 61 67 73 20       sMem.flags 
11ef0 3d 20 30 3b 0a 20 20 20 20 20 20 73 4d 65 6d 2e  = 0;.      sMem.
11f00 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  db = 0;.      rc
11f10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
11f20 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 72 73 72  mFromBtree(pCrsr
11f30 2c 20 30 2c 20 6c 65 6e 2c 20 70 43 2d 3e 69 73  , 0, len, pC->is
11f40 49 6e 64 65 78 2c 20 26 73 4d 65 6d 29 3b 0a 20  Index, &sMem);. 
11f50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11f60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11f70 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e    goto op_column
11f80 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
11f90 20 20 20 20 7a 44 61 74 61 20 3d 20 73 4d 65 6d      zData = sMem
11fa0 2e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 45  .z;.    }.    zE
11fb0 6e 64 48 64 72 20 3d 20 28 75 38 20 2a 29 26 7a  ndHdr = (u8 *)&z
11fc0 44 61 74 61 5b 6c 65 6e 5d 3b 0a 20 20 20 20 7a  Data[len];.    z
11fd0 49 64 78 20 3d 20 28 75 38 20 2a 29 26 7a 44 61  Idx = (u8 *)&zDa
11fe0 74 61 5b 73 7a 48 64 72 5d 3b 0a 0a 20 20 20 20  ta[szHdr];..    
11ff0 2f 2a 20 53 63 61 6e 20 74 68 65 20 68 65 61 64  /* Scan the head
12000 65 72 20 61 6e 64 20 75 73 65 20 69 74 20 74 6f  er and use it to
12010 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 61 54 79   fill in the aTy
12020 70 65 5b 5d 20 61 6e 64 20 61 4f 66 66 73 65 74  pe[] and aOffset
12030 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 73  [].    ** arrays
12040 2e 20 20 61 54 79 70 65 5b 69 5d 20 77 69 6c 6c  .  aType[i] will
12050 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 79 70   contain the typ
12060 65 20 69 6e 74 65 67 65 72 20 66 6f 72 20 74 68  e integer for th
12070 65 20 69 2d 74 68 0a 20 20 20 20 2a 2a 20 63 6f  e i-th.    ** co
12080 6c 75 6d 6e 20 61 6e 64 20 61 4f 66 66 73 65 74  lumn and aOffset
12090 5b 69 5d 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  [i] will contain
120a0 20 74 68 65 20 6f 66 66 73 65 74 20 66 72 6f 6d   the offset from
120b0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
120c0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 65 63     ** of the rec
120d0 6f 72 64 20 74 6f 20 74 68 65 20 73 74 61 72 74  ord to the start
120e0 20 6f 66 20 74 68 65 20 64 61 74 61 20 66 6f 72   of the data for
120f0 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e   the i-th column
12100 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
12110 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64 3b 20 69  i=0; i<nField; i
12120 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ++){.      if( z
12130 49 64 78 3c 7a 45 6e 64 48 64 72 20 29 7b 0a 20  Idx<zEndHdr ){. 
12140 20 20 20 20 20 20 20 61 4f 66 66 73 65 74 5b 69         aOffset[i
12150 5d 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  ] = offset;.    
12160 20 20 20 20 7a 49 64 78 20 2b 3d 20 67 65 74 56      zIdx += getV
12170 61 72 69 6e 74 33 32 28 7a 49 64 78 2c 20 61 54  arint32(zIdx, aT
12180 79 70 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ype[i]);.       
12190 20 73 7a 46 69 65 6c 64 20 3d 20 73 71 6c 69 74   szField = sqlit
121a0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
121b0 4c 65 6e 28 61 54 79 70 65 5b 69 5d 29 3b 0a 20  Len(aType[i]);. 
121c0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d         offset +=
121d0 20 73 7a 46 69 65 6c 64 3b 0a 20 20 20 20 20 20   szField;.      
121e0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 73 7a 46    if( offset<szF
121f0 69 65 6c 64 20 29 7b 20 20 2f 2a 20 54 72 75 65  ield ){  /* True
12200 20 69 66 20 6f 66 66 73 65 74 20 6f 76 65 72 66   if offset overf
12210 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  lows */.        
12220 20 20 7a 49 64 78 20 3d 20 26 7a 45 6e 64 48 64    zIdx = &zEndHd
12230 72 5b 31 5d 3b 20 20 2f 2a 20 46 6f 72 63 65 73  r[1];  /* Forces
12240 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
12250 72 65 74 75 72 6e 20 62 65 6c 6f 77 20 2a 2f 0a  return below */.
12260 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
12270 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12290 2f 2a 20 49 66 20 69 20 69 73 20 6c 65 73 73 20  /* If i is less 
122a0 74 68 61 74 20 6e 46 69 65 6c 64 2c 20 74 68 65  that nField, the
122b0 6e 20 74 68 65 72 65 20 61 72 65 20 6c 65 73 73  n there are less
122c0 20 66 69 65 6c 64 73 20 69 6e 20 74 68 69 73 0a   fields in this.
122d0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 63 6f 72          ** recor
122e0 64 20 74 68 61 6e 20 53 65 74 4e 75 6d 43 6f 6c  d than SetNumCol
122f0 75 6d 6e 73 20 69 6e 64 69 63 61 74 65 64 20 74  umns indicated t
12300 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73  here are columns
12310 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
12320 2a 2a 20 74 61 62 6c 65 2e 20 53 65 74 20 74 68  ** table. Set th
12330 65 20 6f 66 66 73 65 74 20 66 6f 72 20 61 6e 79  e offset for any
12340 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e   extra columns n
12350 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 0a 20 20  ot present in.  
12360 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 63        ** the rec
12370 6f 72 64 20 74 6f 20 30 2e 20 54 68 69 73 20 74  ord to 0. This t
12380 65 6c 6c 73 20 63 6f 64 65 20 62 65 6c 6f 77 20  ells code below 
12390 74 6f 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c 0a  to store a NULL.
123a0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 65          ** inste
123b0 61 64 20 6f 66 20 64 65 73 65 72 69 61 6c 69 7a  ad of deserializ
123c0 69 6e 67 20 61 20 76 61 6c 75 65 20 66 72 6f 6d  ing a value from
123d0 20 74 68 65 20 72 65 63 6f 72 64 2e 0a 20 20 20   the record..   
123e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
123f0 61 4f 66 66 73 65 74 5b 69 5d 20 3d 20 30 3b 0a  aOffset[i] = 0;.
12400 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12410 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
12420 52 65 6c 65 61 73 65 28 26 73 4d 65 6d 29 3b 0a  Release(&sMem);.
12430 20 20 20 20 73 4d 65 6d 2e 66 6c 61 67 73 20 3d      sMem.flags =
12440 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 0a 20 20 20 20   MEM_Null;..    
12450 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 72 65  /* If we have re
12460 61 64 20 6d 6f 72 65 20 68 65 61 64 65 72 20 64  ad more header d
12470 61 74 61 20 74 68 61 6e 20 77 61 73 20 63 6f 6e  ata than was con
12480 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65  tained in the he
12490 61 64 65 72 2c 0a 20 20 20 20 2a 2a 20 6f 72 20  ader,.    ** or 
124a0 69 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  if the end of th
124b0 65 20 6c 61 73 74 20 66 69 65 6c 64 20 61 70 70  e last field app
124c0 65 61 72 73 20 74 6f 20 62 65 20 70 61 73 74 20  ears to be past 
124d0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
124e0 20 20 20 2a 2a 20 72 65 63 6f 72 64 2c 20 6f 72     ** record, or
124f0 20 69 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   if the end of t
12500 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 61 70  he last field ap
12510 70 65 61 72 73 20 74 6f 20 62 65 20 62 65 66 6f  pears to be befo
12520 72 65 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a  re the end.    *
12530 2a 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  * of the record 
12540 28 77 68 65 6e 20 61 6c 6c 20 66 69 65 6c 64 73  (when all fields
12550 20 70 72 65 73 65 6e 74 29 2c 20 74 68 65 6e 20   present), then 
12560 77 65 20 6d 75 73 74 20 62 65 20 64 65 61 6c 69  we must be deali
12570 6e 67 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ng .    ** with 
12580 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
12590 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
125a0 66 28 20 28 7a 49 64 78 20 3e 20 7a 45 6e 64 48  f( (zIdx > zEndH
125b0 64 72 29 20 7c 7c 20 28 6f 66 66 73 65 74 20 3e  dr) || (offset >
125c0 20 70 61 79 6c 6f 61 64 53 69 7a 65 29 0a 20 20   payloadSize).  
125d0 20 20 20 20 20 20 20 7c 7c 20 28 7a 49 64 78 3d         || (zIdx=
125e0 3d 7a 45 6e 64 48 64 72 20 26 26 20 6f 66 66 73  =zEndHdr && offs
125f0 65 74 21 3d 70 61 79 6c 6f 61 64 53 69 7a 65 29  et!=payloadSize)
12600 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
12610 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
12620 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f  PT;.      goto o
12630 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20  p_column_out;.  
12640 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65    }.  }..  /* Ge
12650 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 66  t the column inf
12660 6f 72 6d 61 74 69 6f 6e 2e 20 49 66 20 61 4f 66  ormation. If aOf
12670 66 73 65 74 5b 70 32 5d 20 69 73 20 6e 6f 6e 2d  fset[p2] is non-
12680 7a 65 72 6f 2c 20 74 68 65 6e 20 0a 20 20 2a 2a  zero, then .  **
12690 20 64 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65   deserialize the
126a0 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
126b0 72 65 63 6f 72 64 2e 20 49 66 20 61 4f 66 66 73  record. If aOffs
126c0 65 74 5b 70 32 5d 20 69 73 20 7a 65 72 6f 2c 0a  et[p2] is zero,.
126d0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
126e0 61 72 65 20 6e 6f 74 20 65 6e 6f 75 67 68 20 66  are not enough f
126f0 69 65 6c 64 73 20 69 6e 20 74 68 65 20 72 65 63  ields in the rec
12700 6f 72 64 20 74 6f 20 73 61 74 69 73 66 79 20 74  ord to satisfy t
12710 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 2e  he.  ** request.
12720 20 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20    In this case, 
12730 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 4e 55  set the value NU
12740 4c 4c 20 6f 72 20 74 6f 20 50 34 20 69 66 20 50  LL or to P4 if P
12750 34 20 69 73 0a 20 20 2a 2a 20 61 20 70 6f 69 6e  4 is.  ** a poin
12760 74 65 72 20 74 6f 20 61 20 4d 65 6d 20 6f 62 6a  ter to a Mem obj
12770 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ect..  */.  if( 
12780 61 4f 66 66 73 65 74 5b 70 32 5d 20 29 7b 0a 20  aOffset[p2] ){. 
12790 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
127a0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
127b0 69 66 28 20 7a 52 65 63 20 29 7b 0a 20 20 20 20  if( zRec ){.    
127c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
127d0 52 65 6c 65 61 73 65 45 78 74 65 72 6e 61 6c 28  ReleaseExternal(
127e0 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71  pDest);.      sq
127f0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
12800 65 74 28 28 75 38 20 2a 29 26 7a 52 65 63 5b 61  et((u8 *)&zRec[a
12810 4f 66 66 73 65 74 5b 70 32 5d 5d 2c 20 61 54 79  Offset[p2]], aTy
12820 70 65 5b 70 32 5d 2c 20 70 44 65 73 74 29 3b 0a  pe[p2], pDest);.
12830 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12840 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 56 64   len = sqlite3Vd
12850 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
12860 61 54 79 70 65 5b 70 32 5d 29 3b 0a 20 20 20 20  aType[p2]);.    
12870 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
12880 4d 6f 76 65 28 26 73 4d 65 6d 2c 20 70 44 65 73  Move(&sMem, pDes
12890 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
128a0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
128b0 6d 42 74 72 65 65 28 70 43 72 73 72 2c 20 61 4f  mBtree(pCrsr, aO
128c0 66 66 73 65 74 5b 70 32 5d 2c 20 6c 65 6e 2c 20  ffset[p2], len, 
128d0 70 43 2d 3e 69 73 49 6e 64 65 78 2c 20 26 73 4d  pC->isIndex, &sM
128e0 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  em);.      if( r
128f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12900 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f          goto op_
12910 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20 20  column_out;.    
12920 20 20 7d 0a 20 20 20 20 20 20 7a 44 61 74 61 20    }.      zData 
12930 3d 20 73 4d 65 6d 2e 7a 3b 0a 20 20 20 20 20 20  = sMem.z;.      
12940 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
12950 6c 47 65 74 28 28 75 38 2a 29 7a 44 61 74 61 2c  lGet((u8*)zData,
12960 20 61 54 79 70 65 5b 70 32 5d 2c 20 70 44 65 73   aType[p2], pDes
12970 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  t);.    }.    pD
12980 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64  est->enc = encod
12990 69 6e 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ing;.  }else{.  
129a0 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
129b0 65 3d 3d 50 34 5f 4d 45 4d 20 29 7b 0a 20 20 20  e==P4_MEM ){.   
129c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
129d0 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 44 65  mShallowCopy(pDe
129e0 73 74 2c 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d  st, pOp->p4.pMem
129f0 2c 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20  , MEM_Static);. 
12a00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12a10 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 66  assert( pDest->f
12a20 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 3b  lags&MEM_Null );
12a30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12a40 20 49 66 20 77 65 20 64 79 6e 61 6d 69 63 61 6c   If we dynamical
12a50 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  ly allocated spa
12a60 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 64  ce to hold the d
12a70 61 74 61 20 28 69 6e 20 74 68 65 0a 20 20 2a 2a  ata (in the.  **
12a80 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
12a90 72 6f 6d 42 74 72 65 65 28 29 20 63 61 6c 6c 20  romBtree() call 
12aa0 61 62 6f 76 65 29 20 74 68 65 6e 20 74 72 61 6e  above) then tran
12ab0 73 66 65 72 20 63 6f 6e 74 72 6f 6c 20 6f 66 20  sfer control of 
12ac0 74 68 61 74 0a 20 20 2a 2a 20 64 79 6e 61 6d 69  that.  ** dynami
12ad0 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
12ae0 73 70 61 63 65 20 6f 76 65 72 20 74 6f 20 74 68  space over to th
12af0 65 20 70 44 65 73 74 20 73 74 72 75 63 74 75 72  e pDest structur
12b00 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 65  e..  ** This pre
12b10 76 65 6e 74 73 20 61 20 6d 65 6d 6f 72 79 20 63  vents a memory c
12b20 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  opy..  */.  if( 
12b30 73 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a  sMem.zMalloc ){.
12b40 20 20 20 20 61 73 73 65 72 74 28 20 73 4d 65 6d      assert( sMem
12b50 2e 7a 3d 3d 73 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63  .z==sMem.zMalloc
12b60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12b70 21 28 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 26  !(pDest->flags &
12b80 20 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 20   MEM_Dyn) );.   
12b90 20 61 73 73 65 72 74 28 20 21 28 70 44 65 73 74   assert( !(pDest
12ba0 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 42  ->flags & (MEM_B
12bb0 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29 29 20 7c 7c  lob|MEM_Str)) ||
12bc0 20 70 44 65 73 74 2d 3e 7a 3d 3d 73 4d 65 6d 2e   pDest->z==sMem.
12bd0 7a 20 29 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e  z );.    pDest->
12be0 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 45  flags &= ~(MEM_E
12bf0 70 68 65 6d 7c 4d 45 4d 5f 53 74 61 74 69 63 29  phem|MEM_Static)
12c00 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 66 6c 61  ;.    pDest->fla
12c10 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d 3b 0a  gs |= MEM_Term;.
12c20 20 20 20 20 70 44 65 73 74 2d 3e 7a 20 3d 20 73      pDest->z = s
12c30 4d 65 6d 2e 7a 3b 0a 20 20 20 20 70 44 65 73 74  Mem.z;.    pDest
12c40 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 73 4d 65 6d  ->zMalloc = sMem
12c50 2e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 7d 0a 0a 20  .zMalloc;.  }.. 
12c60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
12c70 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c  eMemMakeWriteabl
12c80 65 28 70 44 65 73 74 29 3b 0a 0a 6f 70 5f 63 6f  e(pDest);..op_co
12c90 6c 75 6d 6e 5f 6f 75 74 3a 0a 20 20 55 50 44 41  lumn_out:.  UPDA
12ca0 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
12cb0 70 44 65 73 74 29 3b 0a 20 20 52 45 47 49 53 54  pDest);.  REGIST
12cc0 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
12cd0 2c 20 70 44 65 73 74 29 3b 0a 20 20 62 72 65 61  , pDest);.  brea
12ce0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
12cf0 20 41 66 66 69 6e 69 74 79 20 50 31 20 50 32 20   Affinity P1 P2 
12d00 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 41 70 70  * P4 *.**.** App
12d10 6c 79 20 61 66 66 69 6e 69 74 69 65 73 20 74 6f  ly affinities to
12d20 20 61 20 72 61 6e 67 65 20 6f 66 20 50 32 20 72   a range of P2 r
12d30 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
12d40 67 20 77 69 74 68 20 50 31 2e 0a 2a 2a 0a 2a 2a  g with P1..**.**
12d50 20 50 34 20 69 73 20 61 20 73 74 72 69 6e 67 20   P4 is a string 
12d60 74 68 61 74 20 69 73 20 50 32 20 63 68 61 72 61  that is P2 chara
12d70 63 74 65 72 73 20 6c 6f 6e 67 2e 20 54 68 65 20  cters long. The 
12d80 6e 74 68 20 63 68 61 72 61 63 74 65 72 20 6f 66  nth character of
12d90 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20 69   the.** string i
12da0 6e 64 69 63 61 74 65 73 20 74 68 65 20 63 6f 6c  ndicates the col
12db0 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 74 68 61  umn affinity tha
12dc0 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
12dd0 20 66 6f 72 20 74 68 65 20 6e 74 68 0a 2a 2a 20   for the nth.** 
12de0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74  memory cell in t
12df0 68 65 20 72 61 6e 67 65 2e 0a 2a 2f 0a 63 61 73  he range..*/.cas
12e00 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 3a 20 7b  e OP_Affinity: {
12e10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
12e20 41 66 66 69 6e 69 74 79 3b 20 20 20 2f 2a 20 54  Affinity;   /* T
12e30 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 62  he affinity to b
12e40 65 20 61 70 70 6c 69 65 64 20 2a 2f 0a 20 20 63  e applied */.  c
12e50 68 61 72 20 63 41 66 66 3b 20 20 20 20 20 20 20  har cAff;       
12e60 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
12e70 67 6c 65 20 63 68 61 72 61 63 74 65 72 20 6f 66  gle character of
12e80 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 0a 20 20   affinity */..  
12e90 7a 41 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d  zAffinity = pOp-
12ea0 3e 70 34 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28  >p4.z;.  assert(
12eb0 20 7a 41 66 66 69 6e 69 74 79 21 3d 30 20 29 3b   zAffinity!=0 );
12ec0 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66 66 69  .  assert( zAffi
12ed0 6e 69 74 79 5b 70 4f 70 2d 3e 70 32 5d 3d 3d 30  nity[pOp->p2]==0
12ee0 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   );.  pIn1 = &aM
12ef0 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 77  em[pOp->p1];.  w
12f00 68 69 6c 65 28 20 28 63 41 66 66 20 3d 20 2a 28  hile( (cAff = *(
12f10 7a 41 66 66 69 6e 69 74 79 2b 2b 29 29 21 3d 30  zAffinity++))!=0
12f20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12f30 70 49 6e 31 20 3c 3d 20 26 70 2d 3e 61 4d 65 6d  pIn1 <= &p->aMem
12f40 5b 70 2d 3e 6e 4d 65 6d 5d 20 29 3b 0a 20 20 20  [p->nMem] );.   
12f50 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
12f60 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 20  lid(pIn1) );.   
12f70 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31   ExpandBlob(pIn1
12f80 29 3b 0a 20 20 20 20 61 70 70 6c 79 41 66 66 69  );.    applyAffi
12f90 6e 69 74 79 28 70 49 6e 31 2c 20 63 41 66 66 2c  nity(pIn1, cAff,
12fa0 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20   encoding);.    
12fb0 70 49 6e 31 2b 2b 3b 0a 20 20 7d 0a 20 20 62 72  pIn1++;.  }.  br
12fc0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
12fd0 65 3a 20 4d 61 6b 65 52 65 63 6f 72 64 20 50 31  e: MakeRecord P1
12fe0 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a   P2 P3 P4 *.**.*
12ff0 2a 20 43 6f 6e 76 65 72 74 20 50 32 20 72 65 67  * Convert P2 reg
13000 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  isters beginning
13010 20 77 69 74 68 20 50 31 20 69 6e 74 6f 20 74 68   with P1 into th
13020 65 20 5b 72 65 63 6f 72 64 20 66 6f 72 6d 61 74  e [record format
13030 5d 0a 2a 2a 20 75 73 65 20 61 73 20 61 20 64 61  ].** use as a da
13040 74 61 20 72 65 63 6f 72 64 20 69 6e 20 61 20 64  ta record in a d
13050 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
13060 20 61 73 20 61 20 6b 65 79 0a 2a 2a 20 69 6e 20   as a key.** in 
13070 61 6e 20 69 6e 64 65 78 2e 20 20 54 68 65 20 4f  an index.  The O
13080 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20  P_Column opcode 
13090 63 61 6e 20 64 65 63 6f 64 65 20 74 68 65 20 72  can decode the r
130a0 65 63 6f 72 64 20 6c 61 74 65 72 2e 0a 2a 2a 0a  ecord later..**.
130b0 2a 2a 20 50 34 20 6d 61 79 20 62 65 20 61 20 73  ** P4 may be a s
130c0 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 50 32  tring that is P2
130d0 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 67   characters long
130e0 2e 20 20 54 68 65 20 6e 74 68 20 63 68 61 72 61  .  The nth chara
130f0 63 74 65 72 20 6f 66 20 74 68 65 0a 2a 2a 20 73  cter of the.** s
13100 74 72 69 6e 67 20 69 6e 64 69 63 61 74 65 73 20  tring indicates 
13110 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
13120 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ity that should 
13130 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
13140 6e 74 68 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  nth.** field of 
13150 74 68 65 20 69 6e 64 65 78 20 6b 65 79 2e 0a 2a  the index key..*
13160 2a 0a 2a 2a 20 54 68 65 20 6d 61 70 70 69 6e 67  *.** The mapping
13170 20 66 72 6f 6d 20 63 68 61 72 61 63 74 65 72 20   from character 
13180 74 6f 20 61 66 66 69 6e 69 74 79 20 69 73 20 67  to affinity is g
13190 69 76 65 6e 20 62 79 20 74 68 65 20 53 51 4c 49  iven by the SQLI
131a0 54 45 5f 41 46 46 5f 0a 2a 2a 20 6d 61 63 72 6f  TE_AFF_.** macro
131b0 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c  s defined in sql
131c0 69 74 65 49 6e 74 2e 68 2e 0a 2a 2a 0a 2a 2a 20  iteInt.h..**.** 
131d0 49 66 20 50 34 20 69 73 20 4e 55 4c 4c 20 74 68  If P4 is NULL th
131e0 65 6e 20 61 6c 6c 20 69 6e 64 65 78 20 66 69 65  en all index fie
131f0 6c 64 73 20 68 61 76 65 20 74 68 65 20 61 66 66  lds have the aff
13200 69 6e 69 74 79 20 4e 4f 4e 45 2e 0a 2a 2f 0a 63  inity NONE..*/.c
13210 61 73 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  ase OP_MakeRecor
13220 64 3a 20 7b 0a 20 20 75 38 20 2a 7a 4e 65 77 52  d: {.  u8 *zNewR
13230 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 2f 2a  ecord;        /*
13240 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
13250 64 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  d the data for t
13260 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
13270 0a 20 20 4d 65 6d 20 2a 70 52 65 63 3b 20 20 20  .  Mem *pRec;   
13280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13290 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
132a0 20 75 36 34 20 6e 44 61 74 61 3b 20 20 20 20 20   u64 nData;     
132b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
132c0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
132d0 74 61 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 6e  ta space */.  in
132e0 74 20 6e 48 64 72 3b 20 20 20 20 20 20 20 20 20  t nHdr;         
132f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13300 66 20 62 79 74 65 73 20 6f 66 20 68 65 61 64 65  f bytes of heade
13310 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 36 34  r space */.  i64
13320 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
13330 20 20 20 20 2f 2a 20 44 61 74 61 20 73 70 61 63      /* Data spac
13340 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  e required for t
13350 68 69 73 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  his record */.  
13360 69 6e 74 20 6e 5a 65 72 6f 3b 20 20 20 20 20 20  int nZero;      
13370 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
13380 20 6f 66 20 7a 65 72 6f 20 62 79 74 65 73 20 61   of zero bytes a
13390 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
133a0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
133b0 20 6e 56 61 72 69 6e 74 3b 20 20 20 20 20 20 20   nVarint;       
133c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
133d0 20 62 79 74 65 73 20 69 6e 20 61 20 76 61 72 69   bytes in a vari
133e0 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  nt */.  u32 seri
133f0 61 6c 5f 74 79 70 65 3b 20 20 20 20 20 20 20 2f  al_type;       /
13400 2a 20 54 79 70 65 20 66 69 65 6c 64 20 2a 2f 0a  * Type field */.
13410 20 20 4d 65 6d 20 2a 70 44 61 74 61 30 3b 20 20    Mem *pData0;  
13420 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
13430 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 63 6f  t field to be co
13440 6d 62 69 6e 65 64 20 69 6e 74 6f 20 74 68 65 20  mbined into the 
13450 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65 6d 20  record */.  Mem 
13460 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20  *pLast;         
13470 20 20 20 2f 2a 20 4c 61 73 74 20 66 69 65 6c 64     /* Last field
13480 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a   of the record *
13490 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20  /.  int nField; 
134a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
134b0 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
134c0 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  n the record */.
134d0 20 20 63 68 61 72 20 2a 7a 41 66 66 69 6e 69 74    char *zAffinit
134e0 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  y;       /* The 
134f0 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
13500 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 2a  for the record *
13510 2f 0a 20 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  /.  int file_for
13520 6d 61 74 3b 20 20 20 20 20 20 20 2f 2a 20 46 69  mat;       /* Fi
13530 6c 65 20 66 6f 72 6d 61 74 20 74 6f 20 75 73 65  le format to use
13540 20 66 6f 72 20 65 6e 63 6f 64 69 6e 67 20 2a 2f   for encoding */
13550 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
13560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
13570 63 65 20 75 73 65 64 20 69 6e 20 7a 4e 65 77 52  ce used in zNewR
13580 65 63 6f 72 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ecord[] */.  int
13590 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
135a0 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
135b0 20 61 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 2f   a field */..  /
135c0 2a 20 41 73 73 75 6d 69 6e 67 20 74 68 65 20 72  * Assuming the r
135d0 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 73 20 4e  ecord contains N
135e0 20 66 69 65 6c 64 73 2c 20 74 68 65 20 72 65 63   fields, the rec
135f0 6f 72 64 20 66 6f 72 6d 61 74 20 6c 6f 6f 6b 73  ord format looks
13600 0a 20 20 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a  .  ** like this:
13610 0a 20 20 2a 2a 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d  .  **.  ** -----
13620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13660 2d 2d 2d 0a 20 20 2a 2a 20 7c 20 68 64 72 2d 73  ---.  ** | hdr-s
13670 69 7a 65 20 7c 20 74 79 70 65 20 30 20 7c 20 74  ize | type 0 | t
13680 79 70 65 20 31 20 7c 20 2e 2e 2e 20 7c 20 74 79  ype 1 | ... | ty
13690 70 65 20 4e 2d 31 20 7c 20 64 61 74 61 30 20 7c  pe N-1 | data0 |
136a0 20 2e 2e 2e 20 7c 20 64 61 74 61 20 4e 2d 31 20   ... | data N-1 
136b0 7c 20 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  | .  ** --------
136c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13700 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 61 74 61 28  .  **.  ** Data(
13710 30 29 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  0) is taken from
13720 20 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 44   register P1.  D
13730 61 74 61 28 31 29 20 63 6f 6d 65 73 20 66 72 6f  ata(1) comes fro
13740 6d 20 72 65 67 69 73 74 65 72 20 50 31 2b 31 0a  m register P1+1.
13750 20 20 2a 2a 20 61 6e 64 20 73 6f 20 66 72 6f 74    ** and so frot
13760 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 63  h..  **.  ** Eac
13770 68 20 74 79 70 65 20 66 69 65 6c 64 20 69 73 20  h type field is 
13780 61 20 76 61 72 69 6e 74 20 72 65 70 72 65 73 65  a varint represe
13790 6e 74 69 6e 67 20 74 68 65 20 73 65 72 69 61 6c  nting the serial
137a0 20 74 79 70 65 20 6f 66 20 74 68 65 20 0a 20 20   type of the .  
137b0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
137c0 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 28 73   data element (s
137d0 65 65 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ee sqlite3VdbeSe
137e0 72 69 61 6c 54 79 70 65 28 29 29 2e 20 54 68 65  rialType()). The
137f0 0a 20 20 2a 2a 20 68 64 72 2d 73 69 7a 65 20 66  .  ** hdr-size f
13800 69 65 6c 64 20 69 73 20 61 6c 73 6f 20 61 20 76  ield is also a v
13810 61 72 69 6e 74 20 77 68 69 63 68 20 69 73 20 74  arint which is t
13820 68 65 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 74  he offset from t
13830 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a  he beginning.  *
13840 2a 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  * of the record 
13850 74 6f 20 64 61 74 61 30 2e 0a 20 20 2a 2f 0a 20  to data0..  */. 
13860 20 6e 44 61 74 61 20 3d 20 30 3b 20 20 20 20 20   nData = 0;     
13870 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13880 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 73   bytes of data s
13890 70 61 63 65 20 2a 2f 0a 20 20 6e 48 64 72 20 3d  pace */.  nHdr =
138a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
138b0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
138c0 6f 66 20 68 65 61 64 65 72 20 73 70 61 63 65 20  of header space 
138d0 2a 2f 0a 20 20 6e 5a 65 72 6f 20 3d 20 30 3b 20  */.  nZero = 0; 
138e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
138f0 72 20 6f 66 20 7a 65 72 6f 20 62 79 74 65 73 20  r of zero bytes 
13900 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
13910 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 6e 46  e record */.  nF
13920 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  ield = pOp->p1;.
13930 20 20 7a 41 66 66 69 6e 69 74 79 20 3d 20 70 4f    zAffinity = pO
13940 70 2d 3e 70 34 2e 7a 3b 0a 20 20 61 73 73 65 72  p->p4.z;.  asser
13950 74 28 20 6e 46 69 65 6c 64 3e 30 20 26 26 20 70  t( nField>0 && p
13960 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d  Op->p2>0 && pOp-
13970 3e 70 32 2b 6e 46 69 65 6c 64 3c 3d 70 2d 3e 6e  >p2+nField<=p->n
13980 4d 65 6d 2b 31 20 29 3b 0a 20 20 70 44 61 74 61  Mem+1 );.  pData
13990 30 20 3d 20 26 61 4d 65 6d 5b 6e 46 69 65 6c 64  0 = &aMem[nField
139a0 5d 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f  ];.  nField = pO
139b0 70 2d 3e 70 32 3b 0a 20 20 70 4c 61 73 74 20 3d  p->p2;.  pLast =
139c0 20 26 70 44 61 74 61 30 5b 6e 46 69 65 6c 64 2d   &pData0[nField-
139d0 31 5d 3b 0a 20 20 66 69 6c 65 5f 66 6f 72 6d 61  1];.  file_forma
139e0 74 20 3d 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46  t = p->minWriteF
139f0 69 6c 65 46 6f 72 6d 61 74 3b 0a 0a 20 20 2f 2a  ileFormat;..  /*
13a00 20 49 64 65 6e 74 69 66 79 20 74 68 65 20 6f 75   Identify the ou
13a10 74 70 75 74 20 72 65 67 69 73 74 65 72 20 2a 2f  tput register */
13a20 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
13a30 70 33 3c 70 4f 70 2d 3e 70 31 20 7c 7c 20 70 4f  p3<pOp->p1 || pO
13a40 70 2d 3e 70 33 3e 3d 70 4f 70 2d 3e 70 31 2b 70  p->p3>=pOp->p1+p
13a50 4f 70 2d 3e 70 32 20 29 3b 0a 20 20 70 4f 75 74  Op->p2 );.  pOut
13a60 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
13a70 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43  ];.  memAboutToC
13a80 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a  hange(p, pOut);.
13a90 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
13aa0 67 68 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  gh the elements 
13ab0 74 68 61 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75  that will make u
13ac0 70 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20  p the record to 
13ad0 66 69 67 75 72 65 0a 20 20 2a 2a 20 6f 75 74 20  figure.  ** out 
13ae0 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69  how much space i
13af0 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  s required for t
13b00 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e 0a 20  he new record.. 
13b10 20 2a 2f 0a 20 20 66 6f 72 28 70 52 65 63 3d 70   */.  for(pRec=p
13b20 44 61 74 61 30 3b 20 70 52 65 63 3c 3d 70 4c 61  Data0; pRec<=pLa
13b30 73 74 3b 20 70 52 65 63 2b 2b 29 7b 0a 20 20 20  st; pRec++){.   
13b40 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
13b50 6c 69 64 28 70 52 65 63 29 20 29 3b 0a 20 20 20  lid(pRec) );.   
13b60 20 69 66 28 20 7a 41 66 66 69 6e 69 74 79 20 29   if( zAffinity )
13b70 7b 0a 20 20 20 20 20 20 61 70 70 6c 79 41 66 66  {.      applyAff
13b80 69 6e 69 74 79 28 70 52 65 63 2c 20 7a 41 66 66  inity(pRec, zAff
13b90 69 6e 69 74 79 5b 70 52 65 63 2d 70 44 61 74 61  inity[pRec-pData
13ba0 30 5d 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  0], encoding);. 
13bb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 65     }.    if( pRe
13bc0 63 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 5a 65 72  c->flags&MEM_Zer
13bd0 6f 20 26 26 20 70 52 65 63 2d 3e 6e 3e 30 20 29  o && pRec->n>0 )
13be0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
13bf0 64 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62  dbeMemExpandBlob
13c00 28 70 52 65 63 29 3b 0a 20 20 20 20 7d 0a 20 20  (pRec);.    }.  
13c10 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
13c20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
13c30 6c 54 79 70 65 28 70 52 65 63 2c 20 66 69 6c 65  lType(pRec, file
13c40 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 6c 65  _format);.    le
13c50 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  n = sqlite3VdbeS
13c60 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
13c70 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 6e  ial_type);.    n
13c80 44 61 74 61 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20  Data += len;.   
13c90 20 6e 48 64 72 20 2b 3d 20 73 71 6c 69 74 65 33   nHdr += sqlite3
13ca0 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c  VarintLen(serial
13cb0 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20  _type);.    if( 
13cc0 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRec->flags & ME
13cd0 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  M_Zero ){.      
13ce0 2f 2a 20 4f 6e 6c 79 20 70 75 72 65 20 7a 65 72  /* Only pure zer
13cf0 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f 42 73 20 63  o-filled BLOBs c
13d00 61 6e 20 62 65 20 69 6e 70 75 74 20 74 6f 20 74  an be input to t
13d10 68 69 73 20 4f 70 63 6f 64 65 2e 0a 20 20 20 20  his Opcode..    
13d20 20 20 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 61    ** We do not a
13d30 6c 6c 6f 77 20 62 6c 6f 62 73 20 77 69 74 68 20  llow blobs with 
13d40 61 20 70 72 65 66 69 78 20 61 6e 64 20 61 20 7a  a prefix and a z
13d50 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e  ero-filled tail.
13d60 20 2a 2f 0a 20 20 20 20 20 20 6e 5a 65 72 6f 20   */.      nZero 
13d70 2b 3d 20 70 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f  += pRec->u.nZero
13d80 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13d90 6c 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 5a 65  len ){.      nZe
13da0 72 6f 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ro = 0;.    }.  
13db0 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  }..  /* Add the 
13dc0 69 6e 69 74 69 61 6c 20 68 65 61 64 65 72 20 76  initial header v
13dd0 61 72 69 6e 74 20 61 6e 64 20 74 6f 74 61 6c 20  arint and total 
13de0 74 68 65 20 73 69 7a 65 20 2a 2f 0a 20 20 6e 48  the size */.  nH
13df0 64 72 20 2b 3d 20 6e 56 61 72 69 6e 74 20 3d 20  dr += nVarint = 
13e00 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e  sqlite3VarintLen
13e10 28 6e 48 64 72 29 3b 0a 20 20 69 66 28 20 6e 56  (nHdr);.  if( nV
13e20 61 72 69 6e 74 3c 73 71 6c 69 74 65 33 56 61 72  arint<sqlite3Var
13e30 69 6e 74 4c 65 6e 28 6e 48 64 72 29 20 29 7b 0a  intLen(nHdr) ){.
13e40 20 20 20 20 6e 48 64 72 2b 2b 3b 0a 20 20 7d 0a      nHdr++;.  }.
13e50 20 20 6e 42 79 74 65 20 3d 20 6e 48 64 72 2b 6e    nByte = nHdr+n
13e60 44 61 74 61 2d 6e 5a 65 72 6f 3b 0a 20 20 69 66  Data-nZero;.  if
13e70 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69 6d  ( nByte>db->aLim
13e80 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
13e90 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67  LENGTH] ){.    g
13ea0 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
13eb0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
13ec0 20 74 68 65 20 6f 75 74 70 75 74 20 72 65 67 69   the output regi
13ed0 73 74 65 72 20 68 61 73 20 61 20 62 75 66 66 65  ster has a buffe
13ee0 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  r large enough t
13ef0 6f 20 73 74 6f 72 65 20 0a 20 20 2a 2a 20 74 68  o store .  ** th
13f00 65 20 6e 65 77 20 72 65 63 6f 72 64 2e 20 54 68  e new record. Th
13f10 65 20 6f 75 74 70 75 74 20 72 65 67 69 73 74 65  e output registe
13f20 72 20 28 70 4f 70 2d 3e 70 33 29 20 69 73 20 6e  r (pOp->p3) is n
13f30 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20  ot allowed to.  
13f40 2a 2a 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  ** be one of the
13f50 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 73   input registers
13f60 20 28 62 65 63 61 75 73 65 20 74 68 65 20 66 6f   (because the fo
13f70 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 0a  llowing call to.
13f80 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
13f90 4d 65 6d 47 72 6f 77 28 29 20 63 6f 75 6c 64 20  MemGrow() could 
13fa0 63 6c 6f 62 62 65 72 20 74 68 65 20 76 61 6c 75  clobber the valu
13fb0 65 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 75  e before it is u
13fc0 73 65 64 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sed)..  */.  if(
13fd0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
13fe0 72 6f 77 28 70 4f 75 74 2c 20 28 69 6e 74 29 6e  row(pOut, (int)n
13ff0 42 79 74 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  Byte, 0) ){.    
14000 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
14010 0a 20 20 7a 4e 65 77 52 65 63 6f 72 64 20 3d 20  .  zNewRecord = 
14020 28 75 38 20 2a 29 70 4f 75 74 2d 3e 7a 3b 0a 0a  (u8 *)pOut->z;..
14030 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
14040 65 63 6f 72 64 20 2a 2f 0a 20 20 69 20 3d 20 70  ecord */.  i = p
14050 75 74 56 61 72 69 6e 74 33 32 28 7a 4e 65 77 52  utVarint32(zNewR
14060 65 63 6f 72 64 2c 20 6e 48 64 72 29 3b 0a 20 20  ecord, nHdr);.  
14070 66 6f 72 28 70 52 65 63 3d 70 44 61 74 61 30 3b  for(pRec=pData0;
14080 20 70 52 65 63 3c 3d 70 4c 61 73 74 3b 20 70 52   pRec<=pLast; pR
14090 65 63 2b 2b 29 7b 0a 20 20 20 20 73 65 72 69 61  ec++){.    seria
140a0 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33  l_type = sqlite3
140b0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70  VdbeSerialType(p
140c0 52 65 63 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74  Rec, file_format
140d0 29 3b 0a 20 20 20 20 69 20 2b 3d 20 70 75 74 56  );.    i += putV
140e0 61 72 69 6e 74 33 32 28 26 7a 4e 65 77 52 65 63  arint32(&zNewRec
140f0 6f 72 64 5b 69 5d 2c 20 73 65 72 69 61 6c 5f 74  ord[i], serial_t
14100 79 70 65 29 3b 20 20 20 20 20 20 2f 2a 20 73 65  ype);      /* se
14110 72 69 61 6c 20 74 79 70 65 20 2a 2f 0a 20 20 7d  rial type */.  }
14120 0a 20 20 66 6f 72 28 70 52 65 63 3d 70 44 61 74  .  for(pRec=pDat
14130 61 30 3b 20 70 52 65 63 3c 3d 70 4c 61 73 74 3b  a0; pRec<=pLast;
14140 20 70 52 65 63 2b 2b 29 7b 20 20 2f 2a 20 73 65   pRec++){  /* se
14150 72 69 61 6c 20 64 61 74 61 20 2a 2f 0a 20 20 20  rial data */.   
14160 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62   i += sqlite3Vdb
14170 65 53 65 72 69 61 6c 50 75 74 28 26 7a 4e 65 77  eSerialPut(&zNew
14180 52 65 63 6f 72 64 5b 69 5d 2c 20 28 69 6e 74 29  Record[i], (int)
14190 28 6e 42 79 74 65 2d 69 29 2c 20 70 52 65 63 2c  (nByte-i), pRec,
141a0 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20  file_format);.  
141b0 7d 0a 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e  }.  assert( i==n
141c0 42 79 74 65 20 29 3b 0a 0a 20 20 61 73 73 65 72  Byte );..  asser
141d0 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20  t( pOp->p3>0 && 
141e0 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p3<=p->nMem
141f0 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20   );.  pOut->n = 
14200 28 69 6e 74 29 6e 42 79 74 65 3b 0a 20 20 70 4f  (int)nByte;.  pO
14210 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ut->flags = MEM_
14220 42 6c 6f 62 20 7c 20 4d 45 4d 5f 44 79 6e 3b 0a  Blob | MEM_Dyn;.
14230 20 20 70 4f 75 74 2d 3e 78 44 65 6c 20 3d 20 30    pOut->xDel = 0
14240 3b 0a 20 20 69 66 28 20 6e 5a 65 72 6f 20 29 7b  ;.  if( nZero ){
14250 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 6e 5a 65  .    pOut->u.nZe
14260 72 6f 20 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20  ro = nZero;.    
14270 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pOut->flags |= M
14280 45 4d 5f 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 70  EM_Zero;.  }.  p
14290 4f 75 74 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Out->enc = SQLIT
142a0 45 5f 55 54 46 38 3b 20 20 2f 2a 20 49 6e 20 63  E_UTF8;  /* In c
142b0 61 73 65 20 74 68 65 20 62 6c 6f 62 20 69 73 20  ase the blob is 
142c0 65 76 65 72 20 63 6f 6e 76 65 72 74 65 64 20 74  ever converted t
142d0 6f 20 74 65 78 74 20 2a 2f 0a 20 20 52 45 47 49  o text */.  REGI
142e0 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
142f0 70 33 2c 20 70 4f 75 74 29 3b 0a 20 20 55 50 44  p3, pOut);.  UPD
14300 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
14310 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b  (pOut);.  break;
14320 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  .}../* Opcode: C
14330 6f 75 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  ount P1 P2 * * *
14340 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65  .**.** Store the
14350 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
14360 65 73 20 28 61 6e 20 69 6e 74 65 67 65 72 20 76  es (an integer v
14370 61 6c 75 65 29 20 69 6e 20 74 68 65 20 74 61 62  alue) in the tab
14380 6c 65 20 6f 72 20 69 6e 64 65 78 20 0a 2a 2a 20  le or index .** 
14390 6f 70 65 6e 65 64 20 62 79 20 63 75 72 73 6f 72  opened by cursor
143a0 20 50 31 20 69 6e 20 72 65 67 69 73 74 65 72 20   P1 in register 
143b0 50 32 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  P2.*/.#ifndef SQ
143c0 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
143d0 4f 55 4e 54 0a 63 61 73 65 20 4f 50 5f 43 6f 75  OUNT.case OP_Cou
143e0 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a  nt: {         /*
143f0 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65   out2-prerelease
14400 20 2a 2f 0a 20 20 69 36 34 20 6e 45 6e 74 72 79   */.  i64 nEntry
14410 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
14420 72 73 72 3b 0a 0a 20 20 70 43 72 73 72 20 3d 20  rsr;..  pCrsr = 
14430 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
14440 5d 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  ]->pCursor;.  if
14450 28 20 70 43 72 73 72 20 29 7b 0a 20 20 20 20 72  ( pCrsr ){.    r
14460 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
14470 43 6f 75 6e 74 28 70 43 72 73 72 2c 20 26 6e 45  Count(pCrsr, &nE
14480 6e 74 72 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ntry);.  }else{.
14490 20 20 20 20 6e 45 6e 74 72 79 20 3d 20 30 3b 0a      nEntry = 0;.
144a0 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20    }.  pOut->u.i 
144b0 3d 20 6e 45 6e 74 72 79 3b 0a 20 20 62 72 65 61  = nEntry;.  brea
144c0 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  k;.}.#endif../* 
144d0 4f 70 63 6f 64 65 3a 20 53 61 76 65 70 6f 69 6e  Opcode: Savepoin
144e0 74 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  t P1 * * P4 *.**
144f0 0a 2a 2a 20 4f 70 65 6e 2c 20 72 65 6c 65 61 73  .** Open, releas
14500 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 74 68  e or rollback th
14510 65 20 73 61 76 65 70 6f 69 6e 74 20 6e 61 6d 65  e savepoint name
14520 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 50  d by parameter P
14530 34 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20  4, depending.** 
14540 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
14550 50 31 2e 20 54 6f 20 6f 70 65 6e 20 61 20 6e 65  P1. To open a ne
14560 77 20 73 61 76 65 70 6f 69 6e 74 2c 20 50 31 3d  w savepoint, P1=
14570 3d 30 2e 20 54 6f 20 72 65 6c 65 61 73 65 20 28  =0. To release (
14580 63 6f 6d 6d 69 74 29 20 61 6e 0a 2a 2a 20 65 78  commit) an.** ex
14590 69 73 74 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  isting savepoint
145a0 2c 20 50 31 3d 3d 31 2c 20 6f 72 20 74 6f 20 72  , P1==1, or to r
145b0 6f 6c 6c 62 61 63 6b 20 61 6e 20 65 78 69 73 74  ollback an exist
145c0 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20 50 31  ing savepoint P1
145d0 3d 3d 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ==2..*/.case OP_
145e0 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 69  Savepoint: {.  i
145f0 6e 74 20 70 31 3b 20 20 20 20 20 20 20 20 20 20  nt p1;          
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14610 2a 20 56 61 6c 75 65 20 6f 66 20 50 31 20 6f 70  * Value of P1 op
14620 65 72 61 6e 64 20 2a 2f 0a 20 20 63 68 61 72 20  erand */.  char 
14630 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
14640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
14650 6d 65 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 20  me of savepoint 
14660 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  */.  int nName;.
14670 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 4e 65    Savepoint *pNe
14680 77 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  w;.  Savepoint *
14690 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 53 61  pSavepoint;.  Sa
146a0 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 3b 0a 20  vepoint *pTmp;. 
146b0 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 3b   int iSavepoint;
146c0 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 70 31  .  int ii;..  p1
146d0 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 4e   = pOp->p1;.  zN
146e0 61 6d 65 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  ame = pOp->p4.z;
146f0 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
14700 61 74 20 74 68 65 20 70 31 20 70 61 72 61 6d 65  at the p1 parame
14710 74 65 72 20 69 73 20 76 61 6c 69 64 2e 20 41 6c  ter is valid. Al
14720 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 72 65  so that if there
14730 20 69 73 20 6e 6f 20 6f 70 65 6e 0a 20 20 2a 2a   is no open.  **
14740 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
14750 65 6e 20 74 68 65 72 65 20 63 61 6e 6e 6f 74 20  en there cannot 
14760 62 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74  be any savepoint
14770 73 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s. .  */.  asser
14780 74 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e  t( db->pSavepoin
14790 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  t==0 || db->auto
147a0 43 6f 6d 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61  Commit==0 );.  a
147b0 73 73 65 72 74 28 20 70 31 3d 3d 53 41 56 45 50  ssert( p1==SAVEP
147c0 4f 49 4e 54 5f 42 45 47 49 4e 7c 7c 70 31 3d 3d  OINT_BEGIN||p1==
147d0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
147e0 45 7c 7c 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54  E||p1==SAVEPOINT
147f0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61  _ROLLBACK );.  a
14800 73 73 65 72 74 28 20 64 62 2d 3e 70 53 61 76 65  ssert( db->pSave
14810 70 6f 69 6e 74 20 7c 7c 20 64 62 2d 3e 69 73 54  point || db->isT
14820 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f  ransactionSavepo
14830 69 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  int==0 );.  asse
14840 72 74 28 20 63 68 65 63 6b 53 61 76 65 70 6f 69  rt( checkSavepoi
14850 6e 74 43 6f 75 6e 74 28 64 62 29 20 29 3b 0a 0a  ntCount(db) );..
14860 20 20 69 66 28 20 70 31 3d 3d 53 41 56 45 50 4f    if( p1==SAVEPO
14870 49 4e 54 5f 42 45 47 49 4e 20 29 7b 0a 20 20 20  INT_BEGIN ){.   
14880 20 69 66 28 20 64 62 2d 3e 77 72 69 74 65 56 64   if( db->writeVd
14890 62 65 43 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20  beCnt>0 ){.     
148a0 20 2f 2a 20 41 20 6e 65 77 20 73 61 76 65 70 6f   /* A new savepo
148b0 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 63 72  int cannot be cr
148c0 65 61 74 65 64 20 69 66 20 74 68 65 72 65 20 61  eated if there a
148d0 72 65 20 61 63 74 69 76 65 20 77 72 69 74 65 20  re active write 
148e0 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
148f0 65 6e 74 73 20 28 69 2e 65 2e 20 6f 70 65 6e 20  ents (i.e. open 
14900 72 65 61 64 2f 77 72 69 74 65 20 69 6e 63 72 65  read/write incre
14910 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 68 61 6e 64  mental blob hand
14920 6c 65 73 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  les)..      */. 
14930 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53       sqlite3SetS
14940 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
14950 67 2c 20 64 62 2c 20 22 63 61 6e 6e 6f 74 20 6f  g, db, "cannot o
14960 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 20 2d 20  pen savepoint - 
14970 22 0a 20 20 20 20 20 20 20 20 22 53 51 4c 20 73  ".        "SQL s
14980 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f  tatements in pro
14990 67 72 65 73 73 22 29 3b 0a 20 20 20 20 20 20 72  gress");.      r
149a0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
149b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
149c0 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
149d0 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
149e0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
149f0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
14a00 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  BLE.      /* Thi
14a10 73 20 63 61 6c 6c 20 69 73 20 4f 6b 20 65 76 65  s call is Ok eve
14a20 6e 20 69 66 20 74 68 69 73 20 73 61 76 65 70 6f  n if this savepo
14a30 69 6e 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  int is actually 
14a40 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  a transaction.  
14a50 20 20 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74      ** savepoint
14a60 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
14a70 73 68 6f 75 6c 64 20 6e 6f 74 20 70 72 6f 6d 70  should not promp
14a80 74 20 78 53 61 76 65 70 6f 69 6e 74 28 29 29 20  t xSavepoint()) 
14a90 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 20 20 20  callbacks..     
14aa0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
14ab0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76   transaction sav
14ac0 65 70 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70 65  epoint being ope
14ad0 6e 65 64 2c 20 69 74 20 69 73 20 67 75 61 72 61  ned, it is guara
14ae0 6e 74 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  nteed.      ** t
14af0 68 61 74 20 74 68 65 20 64 62 2d 3e 61 56 54 72  hat the db->aVTr
14b00 61 6e 73 5b 5d 20 61 72 72 61 79 20 69 73 20 65  ans[] array is e
14b10 6d 70 74 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20  mpty.  */.      
14b20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 75 74 6f  assert( db->auto
14b30 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
14b40 3e 6e 56 54 72 61 6e 73 3d 3d 30 20 29 3b 0a 20  >nVTrans==0 );. 
14b50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14b60 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
14b70 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 42 45 47  b, SAVEPOINT_BEG
14b80 49 4e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  IN,.            
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ba0 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
14bb0 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  nt+db->nSavepoin
14bc0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
14bd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
14be0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
14bf0 65 72 72 6f 72 3b 0a 23 65 6e 64 69 66 0a 0a 20  error;.#endif.. 
14c00 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61       /* Create a
14c10 20 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20 73   new savepoint s
14c20 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20  tructure. */.   
14c30 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
14c40 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
14c50 20 73 69 7a 65 6f 66 28 53 61 76 65 70 6f 69 6e   sizeof(Savepoin
14c60 74 29 2b 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20  t)+nName+1);.   
14c70 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
14c80 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61         pNew->zNa
14c90 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 26 70 4e  me = (char *)&pN
14ca0 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 6d  ew[1];.        m
14cb0 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 4e 61 6d  emcpy(pNew->zNam
14cc0 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b  e, zName, nName+
14cd0 31 29 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 20  1);.    .       
14ce0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
14cf0 6e 6f 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74  no open transact
14d00 69 6f 6e 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ion, then mark t
14d10 68 69 73 20 61 73 20 61 20 73 70 65 63 69 61 6c  his as a special
14d20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 74 72 61  .        ** "tra
14d30 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
14d40 6e 74 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  nt". */.        
14d50 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
14d60 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  it ){.          
14d70 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
14d80 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
14d90 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53  ->isTransactionS
14da0 61 76 65 70 6f 69 6e 74 20 3d 20 31 3b 0a 20 20  avepoint = 1;.  
14db0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14dc0 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 61 76 65         db->nSave
14dd0 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  point++;.       
14de0 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 20 20   }.    .        
14df0 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
14e00 73 61 76 65 70 6f 69 6e 74 20 69 6e 74 6f 20 74  savepoint into t
14e10 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
14e20 6c 65 27 73 20 6c 69 73 74 2e 20 2a 2f 0a 20 20  le's list. */.  
14e30 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78        pNew->pNex
14e40 74 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  t = db->pSavepoi
14e50 6e 74 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  nt;.        db->
14e60 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 4e 65  pSavepoint = pNe
14e70 77 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  w;.        pNew-
14e80 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
14e90 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
14ea0 6e 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ns;.      }.    
14eb0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
14ec0 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 0a  Savepoint = 0;..
14ed0 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
14ee0 6e 61 6d 65 64 20 73 61 76 65 70 6f 69 6e 74 2e  named savepoint.
14ef0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
14f00 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 2c 20  such savepoint, 
14f10 74 68 65 6e 20 61 6e 0a 20 20 20 20 2a 2a 20 61  then an.    ** a
14f20 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
14f30 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e  ned to the user.
14f40 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 0a 20 20    */.    for(.  
14f50 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74 20 3d      pSavepoint =
14f60 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b   db->pSavepoint;
14f70 20 0a 20 20 20 20 20 20 70 53 61 76 65 70 6f 69   .      pSavepoi
14f80 6e 74 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  nt && sqlite3Str
14f90 49 43 6d 70 28 70 53 61 76 65 70 6f 69 6e 74 2d  ICmp(pSavepoint-
14fa0 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  >zName, zName);.
14fb0 20 20 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74        pSavepoint
14fc0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 70   = pSavepoint->p
14fd0 4e 65 78 74 0a 20 20 20 20 29 7b 0a 20 20 20 20  Next.    ){.    
14fe0 20 20 69 53 61 76 65 70 6f 69 6e 74 2b 2b 3b 0a    iSavepoint++;.
14ff0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
15000 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
15010 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
15020 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
15030 20 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 73 61   db, "no such sa
15040 76 65 70 6f 69 6e 74 3a 20 25 73 22 2c 20 7a 4e  vepoint: %s", zN
15050 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ame);.      rc =
15060 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
15070 20 20 20 7d 65 6c 73 65 20 69 66 28 20 0a 20 20     }else if( .  
15080 20 20 20 20 20 20 64 62 2d 3e 77 72 69 74 65 56        db->writeV
15090 64 62 65 43 6e 74 3e 30 20 7c 7c 20 28 70 31 3d  dbeCnt>0 || (p1=
150a0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
150b0 41 43 4b 20 26 26 20 64 62 2d 3e 61 63 74 69 76  ACK && db->activ
150c0 65 56 64 62 65 43 6e 74 3e 31 29 20 0a 20 20 20  eVdbeCnt>1) .   
150d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20   ){.      /* It 
150e0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
150f0 74 6f 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d  to release (comm
15100 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e 74 20  it) a savepoint 
15110 69 66 20 74 68 65 72 65 20 61 72 65 20 0a 20 20  if there are .  
15120 20 20 20 20 2a 2a 20 61 63 74 69 76 65 20 77 72      ** active wr
15130 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ite statements. 
15140 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
15150 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  le to rollback a
15160 20 73 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 20   savepoint.     
15170 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72 65   ** if there are
15180 20 61 6e 79 20 61 63 74 69 76 65 20 73 74 61 74   any active stat
15190 65 6d 65 6e 74 73 20 61 74 20 61 6c 6c 2e 0a 20  ements at all.. 
151a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
151b0 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
151c0 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
151d0 0a 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74  .        "cannot
151e0 20 25 73 20 73 61 76 65 70 6f 69 6e 74 20 2d 20   %s savepoint - 
151f0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69  SQL statements i
15200 6e 20 70 72 6f 67 72 65 73 73 22 2c 0a 20 20 20  n progress",.   
15210 20 20 20 20 20 28 70 31 3d 3d 53 41 56 45 50 4f       (p1==SAVEPO
15220 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 3f 20 22  INT_ROLLBACK ? "
15230 72 6f 6c 6c 62 61 63 6b 22 3a 20 22 72 65 6c 65  rollback": "rele
15240 61 73 65 22 29 0a 20 20 20 20 20 20 29 3b 0a 20  ase").      );. 
15250 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15260 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65  _BUSY;.    }else
15270 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65  {..      /* Dete
15280 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
15290 20 6e 6f 74 20 74 68 69 73 20 69 73 20 61 20 74   not this is a t
152a0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
152b0 6f 69 6e 74 2e 20 49 66 20 73 6f 2c 0a 20 20 20  oint. If so,.   
152c0 20 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 69     ** and this i
152d0 73 20 61 20 52 45 4c 45 41 53 45 20 63 6f 6d 6d  s a RELEASE comm
152e0 61 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  and, then the cu
152f0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
15300 6e 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63  n .      ** is c
15310 6f 6d 6d 69 74 74 65 64 2e 20 0a 20 20 20 20 20  ommitted. .     
15320 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73   */.      int is
15330 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 53  Transaction = pS
15340 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 3d  avepoint->pNext=
15350 3d 30 20 26 26 20 64 62 2d 3e 69 73 54 72 61 6e  =0 && db->isTran
15360 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74  sactionSavepoint
15370 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 72  ;.      if( isTr
15380 61 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 31 3d  ansaction && p1=
15390 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
153a0 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  SE ){.        if
153b0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56  ( (rc = sqlite3V
153c0 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29  dbeCheckFk(p, 1)
153d0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
153e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76            goto v
153f0 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20  dbe_return;.    
15400 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 62      }.        db
15410 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
15420 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
15430 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
15440 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
15450 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 63  .          p->pc
15460 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 20 20 20   = pc;.         
15470 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
15480 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
15490 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53 51 4c 49  ->rc = rc = SQLI
154a0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
154b0 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74     goto vdbe_ret
154c0 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
154d0 20 20 20 20 20 20 20 64 62 2d 3e 69 73 54 72 61         db->isTra
154e0 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
154f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
15500 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20  c = p->rc;.     
15510 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15520 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 64 62 2d  iSavepoint = db-
15530 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2d 20 69 53  >nSavepoint - iS
15540 61 76 65 70 6f 69 6e 74 20 2d 20 31 3b 0a 20 20  avepoint - 1;.  
15550 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
15560 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b  ii<db->nDb; ii++
15570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
15580 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
15590 76 65 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b  vepoint(db->aDb[
155a0 69 69 5d 2e 70 42 74 2c 20 70 31 2c 20 69 53 61  ii].pBt, p1, iSa
155b0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
155c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
155d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
155e0 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
155f0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
15600 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15610 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
15620 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p1==SAVEPOINT_RO
15630 4c 4c 42 41 43 4b 20 26 26 20 28 64 62 2d 3e 66  LLBACK && (db->f
15640 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
15650 72 6e 43 68 61 6e 67 65 73 29 21 3d 30 20 29 7b  rnChanges)!=0 ){
15660 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15670 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
15680 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
15690 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
156a0 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
156b0 68 65 6d 61 28 64 62 2c 20 2d 31 29 3b 0a 20 20  hema(db, -1);.  
156c0 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
156d0 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c  s = (db->flags |
156e0 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
156f0 61 6e 67 65 73 29 3b 0a 20 20 20 20 20 20 20 20  anges);.        
15700 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  }.      }.  .   
15710 20 20 20 2f 2a 20 52 65 67 61 72 64 6c 65 73 73     /* Regardless
15720 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 69 73   of whether this
15730 20 69 73 20 61 20 52 45 4c 45 41 53 45 20 6f 72   is a RELEASE or
15740 20 52 4f 4c 4c 42 41 43 4b 2c 20 64 65 73 74 72   ROLLBACK, destr
15750 6f 79 20 61 6c 6c 20 0a 20 20 20 20 20 20 2a 2a  oy all .      **
15760 20 73 61 76 65 70 6f 69 6e 74 73 20 6e 65 73 74   savepoints nest
15770 65 64 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65  ed inside of the
15780 20 73 61 76 65 70 6f 69 6e 74 20 62 65 69 6e 67   savepoint being
15790 20 6f 70 65 72 61 74 65 64 20 6f 6e 2e 20 2a 2f   operated on. */
157a0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 64 62  .      while( db
157b0 2d 3e 70 53 61 76 65 70 6f 69 6e 74 21 3d 70 53  ->pSavepoint!=pS
157c0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
157d0 20 20 20 20 70 54 6d 70 20 3d 20 64 62 2d 3e 70      pTmp = db->p
157e0 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20  Savepoint;.     
157f0 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e     db->pSavepoin
15800 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b  t = pTmp->pNext;
15810 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15820 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29  DbFree(db, pTmp)
15830 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53  ;.        db->nS
15840 61 76 65 70 6f 69 6e 74 2d 2d 3b 0a 20 20 20 20  avepoint--;.    
15850 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
15860 20 69 74 20 69 73 20 61 20 52 45 4c 45 41 53 45   it is a RELEASE
15870 2c 20 74 68 65 6e 20 64 65 73 74 72 6f 79 20 74  , then destroy t
15880 68 65 20 73 61 76 65 70 6f 69 6e 74 20 62 65 69  he savepoint bei
15890 6e 67 20 6f 70 65 72 61 74 65 64 20 6f 6e 20 0a  ng operated on .
158a0 20 20 20 20 20 20 2a 2a 20 74 6f 6f 2e 20 49 66        ** too. If
158b0 20 69 74 20 69 73 20 61 20 52 4f 4c 4c 42 41 43   it is a ROLLBAC
158c0 4b 20 54 4f 2c 20 74 68 65 6e 20 73 65 74 20 74  K TO, then set t
158d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 66  he number of def
158e0 65 72 72 65 64 20 0a 20 20 20 20 20 20 2a 2a 20  erred .      ** 
158f0 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
15900 74 69 6f 6e 73 20 70 72 65 73 65 6e 74 20 69 6e  tions present in
15910 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
15920 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
15930 64 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  d.      ** when 
15940 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 77 61  the savepoint wa
15950 73 20 63 72 65 61 74 65 64 2e 20 20 2a 2f 0a 20  s created.  */. 
15960 20 20 20 20 20 69 66 28 20 70 31 3d 3d 53 41 56       if( p1==SAV
15970 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29  EPOINT_RELEASE )
15980 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
15990 28 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 64 62  ( pSavepoint==db
159a0 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a  ->pSavepoint );.
159b0 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53 61 76          db->pSav
159c0 65 70 6f 69 6e 74 20 3d 20 70 53 61 76 65 70 6f  epoint = pSavepo
159d0 69 6e 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  int->pNext;.    
159e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
159f0 65 28 64 62 2c 20 70 53 61 76 65 70 6f 69 6e 74  e(db, pSavepoint
15a00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
15a10 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  isTransaction ){
15a20 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
15a30 53 61 76 65 70 6f 69 6e 74 2d 2d 3b 0a 20 20 20  Savepoint--;.   
15a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
15a50 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  se{.        db->
15a60 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
15a70 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 44 65 66  pSavepoint->nDef
15a80 65 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20  erredCons;.     
15a90 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 21 69   }..      if( !i
15aa0 73 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  sTransaction ){.
15ab0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
15ac0 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
15ad0 74 28 64 62 2c 20 70 31 2c 20 69 53 61 76 65 70  t(db, p1, iSavep
15ae0 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69  oint);.        i
15af0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15b00 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
15b10 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
15b20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
15b30 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
15b40 63 6f 64 65 3a 20 41 75 74 6f 43 6f 6d 6d 69 74  code: AutoCommit
15b50 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
15b60 2a 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62  ** Set the datab
15b70 61 73 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  ase auto-commit 
15b80 66 6c 61 67 20 74 6f 20 50 31 20 28 31 20 6f 72  flag to P1 (1 or
15b90 20 30 29 2e 20 49 66 20 50 32 20 69 73 20 74 72   0). If P2 is tr
15ba0 75 65 2c 20 72 6f 6c 6c 0a 2a 2a 20 62 61 63 6b  ue, roll.** back
15bb0 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20 61   any currently a
15bc0 63 74 69 76 65 20 62 74 72 65 65 20 74 72 61 6e  ctive btree tran
15bd0 73 61 63 74 69 6f 6e 73 2e 20 49 66 20 74 68 65  sactions. If the
15be0 72 65 20 61 72 65 20 61 6e 79 20 61 63 74 69 76  re are any activ
15bf0 65 0a 2a 2a 20 56 4d 73 20 28 61 70 61 72 74 20  e.** VMs (apart 
15c00 66 72 6f 6d 20 74 68 69 73 20 6f 6e 65 29 2c 20  from this one), 
15c10 74 68 65 6e 20 61 20 52 4f 4c 4c 42 41 43 4b 20  then a ROLLBACK 
15c20 66 61 69 6c 73 2e 20 20 41 20 43 4f 4d 4d 49 54  fails.  A COMMIT
15c30 20 66 61 69 6c 73 20 69 66 0a 2a 2a 20 74 68 65   fails if.** the
15c40 72 65 20 61 72 65 20 61 63 74 69 76 65 20 77 72  re are active wr
15c50 69 74 69 6e 67 20 56 4d 73 20 6f 72 20 61 63 74  iting VMs or act
15c60 69 76 65 20 56 4d 73 20 74 68 61 74 20 75 73 65  ive VMs that use
15c70 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 0a 2a   shared cache..*
15c80 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75  *.** This instru
15c90 63 74 69 6f 6e 20 63 61 75 73 65 73 20 74 68 65  ction causes the
15ca0 20 56 4d 20 74 6f 20 68 61 6c 74 2e 0a 2a 2f 0a   VM to halt..*/.
15cb0 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  case OP_AutoComm
15cc0 69 74 3a 20 7b 0a 20 20 69 6e 74 20 64 65 73 69  it: {.  int desi
15cd0 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20  redAutoCommit;. 
15ce0 20 69 6e 74 20 69 52 6f 6c 6c 62 61 63 6b 3b 0a   int iRollback;.
15cf0 20 20 69 6e 74 20 74 75 72 6e 4f 6e 41 43 3b 0a    int turnOnAC;.
15d00 0a 20 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f  .  desiredAutoCo
15d10 6d 6d 69 74 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  mmit = pOp->p1;.
15d20 20 20 69 52 6f 6c 6c 62 61 63 6b 20 3d 20 70 4f    iRollback = pO
15d30 70 2d 3e 70 32 3b 0a 20 20 74 75 72 6e 4f 6e 41  p->p2;.  turnOnA
15d40 43 20 3d 20 64 65 73 69 72 65 64 41 75 74 6f 43  C = desiredAutoC
15d50 6f 6d 6d 69 74 20 26 26 20 21 64 62 2d 3e 61 75  ommit && !db->au
15d60 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20 61 73 73 65  toCommit;.  asse
15d70 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f 43  rt( desiredAutoC
15d80 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 64 65 73 69  ommit==1 || desi
15d90 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  redAutoCommit==0
15da0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65   );.  assert( de
15db0 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d  siredAutoCommit=
15dc0 3d 31 20 7c 7c 20 69 52 6f 6c 6c 62 61 63 6b 3d  =1 || iRollback=
15dd0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
15de0 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
15df0 74 3e 30 20 29 3b 20 20 2f 2a 20 41 74 20 6c 65  t>0 );  /* At le
15e00 61 73 74 20 74 68 69 73 20 6f 6e 65 20 56 4d 20  ast this one VM 
15e10 69 73 20 61 63 74 69 76 65 20 2a 2f 0a 0a 20 20  is active */..  
15e20 69 66 28 20 74 75 72 6e 4f 6e 41 43 20 26 26 20  if( turnOnAC && 
15e30 69 52 6f 6c 6c 62 61 63 6b 20 26 26 20 64 62 2d  iRollback && db-
15e40 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 31  >activeVdbeCnt>1
15e50 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
15e60 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  is instruction i
15e70 6d 70 6c 65 6d 65 6e 74 73 20 61 20 52 4f 4c 4c  mplements a ROLL
15e80 42 41 43 4b 20 61 6e 64 20 6f 74 68 65 72 20 56  BACK and other V
15e90 4d 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 74  Ms are.    ** st
15ea0 69 6c 6c 20 72 75 6e 6e 69 6e 67 2c 20 61 6e 64  ill running, and
15eb0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
15ec0 73 20 61 63 74 69 76 65 2c 20 72 65 74 75 72 6e  s active, return
15ed0 20 61 6e 20 65 72 72 6f 72 20 69 6e 64 69 63 61   an error indica
15ee0 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 61 74  ting.    ** that
15ef0 20 74 68 65 20 6f 74 68 65 72 20 56 4d 73 20 6d   the other VMs m
15f00 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 66 69 72  ust complete fir
15f10 73 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  st. .    */.    
15f20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
15f30 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
15f40 2c 20 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61  , "cannot rollba
15f50 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2d  ck transaction -
15f60 20 22 0a 20 20 20 20 20 20 20 20 22 53 51 4c 20   ".        "SQL 
15f70 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70 72  statements in pr
15f80 6f 67 72 65 73 73 22 29 3b 0a 20 20 20 20 72 63  ogress");.    rc
15f90 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
15fa0 20 20 7d 65 6c 73 65 20 69 66 28 20 74 75 72 6e    }else if( turn
15fb0 4f 6e 41 43 20 26 26 20 21 69 52 6f 6c 6c 62 61  OnAC && !iRollba
15fc0 63 6b 20 26 26 20 64 62 2d 3e 77 72 69 74 65 56  ck && db->writeV
15fd0 64 62 65 43 6e 74 3e 30 20 29 7b 0a 20 20 20 20  dbeCnt>0 ){.    
15fe0 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 73 74 72  /* If this instr
15ff0 75 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74  uction implement
16000 73 20 61 20 43 4f 4d 4d 49 54 20 61 6e 64 20 6f  s a COMMIT and o
16010 74 68 65 72 20 56 4d 73 20 61 72 65 20 77 72 69  ther VMs are wri
16020 74 69 6e 67 0a 20 20 20 20 2a 2a 20 72 65 74 75  ting.    ** retu
16030 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 64 69  rn an error indi
16040 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20  cating that the 
16050 6f 74 68 65 72 20 56 4d 73 20 6d 75 73 74 20 63  other VMs must c
16060 6f 6d 70 6c 65 74 65 20 66 69 72 73 74 2e 20 0a  omplete first. .
16070 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
16080 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
16090 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 63 61  zErrMsg, db, "ca
160a0 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 74 72 61 6e  nnot commit tran
160b0 73 61 63 74 69 6f 6e 20 2d 20 22 0a 20 20 20 20  saction - ".    
160c0 20 20 20 20 22 53 51 4c 20 73 74 61 74 65 6d 65      "SQL stateme
160d0 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73 22  nts in progress"
160e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
160f0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
16100 20 69 66 28 20 64 65 73 69 72 65 64 41 75 74 6f   if( desiredAuto
16110 43 6f 6d 6d 69 74 21 3d 64 62 2d 3e 61 75 74 6f  Commit!=db->auto
16120 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 69 66  Commit ){.    if
16130 28 20 69 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20  ( iRollback ){. 
16140 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73       assert( des
16150 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d  iredAutoCommit==
16160 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
16170 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
16180 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 75 74  );.      db->aut
16190 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
161a0 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d   }else if( (rc =
161b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
161c0 6b 46 6b 28 70 2c 20 31 29 29 21 3d 53 51 4c 49  kFk(p, 1))!=SQLI
161d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
161e0 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b  oto vdbe_return;
161f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16200 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
16210 20 3d 20 28 75 38 29 64 65 73 69 72 65 64 41 75   = (u8)desiredAu
16220 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20 20  toCommit;.      
16230 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 48  if( sqlite3VdbeH
16240 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45 5f 42  alt(p)==SQLITE_B
16250 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70  USY ){.        p
16260 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 20  ->pc = pc;.     
16270 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
16280 74 20 3d 20 28 75 38 29 28 31 2d 64 65 73 69 72  t = (u8)(1-desir
16290 65 64 41 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a 20  edAutoCommit);. 
162a0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
162b0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
162c0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64  .        goto vd
162d0 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  be_return;.     
162e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
162f0 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d  ert( db->nStatem
16300 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  ent==0 );.    sq
16310 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
16320 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 69 66  ints(db);.    if
16330 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
16340 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
16350 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
16360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
16370 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
16380 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f  ;.    }.    goto
16390 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20   vdbe_return;.  
163a0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
163b0 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
163c0 7a 45 72 72 4d 73 67 2c 20 64 62 2c 0a 20 20 20  zErrMsg, db,.   
163d0 20 20 20 20 20 28 21 64 65 73 69 72 65 64 41 75       (!desiredAu
163e0 74 6f 43 6f 6d 6d 69 74 29 3f 22 63 61 6e 6e 6f  toCommit)?"canno
163f0 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
16400 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 74  ction within a t
16410 72 61 6e 73 61 63 74 69 6f 6e 22 3a 28 0a 20 20  ransaction":(.  
16420 20 20 20 20 20 20 28 69 52 6f 6c 6c 62 61 63 6b        (iRollback
16430 29 3f 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61  )?"cannot rollba
16440 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74  ck - no transact
16450 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 3a 0a  ion is active":.
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 20 20 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69     "cannot commi
16480 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74 69  t - no transacti
16490 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29 29 3b  on is active"));
164a0 0a 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 72  .         .    r
164b0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
164c0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
164d0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 72 61  ../* Opcode: Tra
164e0 6e 73 61 63 74 69 6f 6e 20 50 31 20 50 32 20 2a  nsaction P1 P2 *
164f0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 42 65 67 69 6e   * *.**.** Begin
16500 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
16510 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
16520 20 65 6e 64 73 20 77 68 65 6e 20 61 20 43 6f 6d   ends when a Com
16530 6d 69 74 20 6f 72 20 52 6f 6c 6c 62 61 63 6b 0a  mit or Rollback.
16540 2a 2a 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63  ** opcode is enc
16550 6f 75 6e 74 65 72 65 64 2e 20 20 44 65 70 65 6e  ountered.  Depen
16560 64 69 6e 67 20 6f 6e 20 74 68 65 20 4f 4e 20 43  ding on the ON C
16570 4f 4e 46 4c 49 43 54 20 73 65 74 74 69 6e 67 2c  ONFLICT setting,
16580 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
16590 69 6f 6e 20 6d 69 67 68 74 20 61 6c 73 6f 20 62  ion might also b
165a0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 66  e rolled back if
165b0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
165c0 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  ountered..**.** 
165d0 50 31 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  P1 is the index 
165e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
165f0 66 69 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 68  file on which th
16600 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
16610 0a 2a 2a 20 73 74 61 72 74 65 64 2e 20 20 49 6e  .** started.  In
16620 64 65 78 20 30 20 69 73 20 74 68 65 20 6d 61 69  dex 0 is the mai
16630 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
16640 61 6e 64 20 69 6e 64 65 78 20 31 20 69 73 20 74  and index 1 is t
16650 68 65 0a 2a 2a 20 66 69 6c 65 20 75 73 65 64 20  he.** file used 
16660 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61  for temporary ta
16670 62 6c 65 73 2e 20 20 49 6e 64 69 63 65 73 20 6f  bles.  Indices o
16680 66 20 32 20 6f 72 20 6d 6f 72 65 20 61 72 65 20  f 2 or more are 
16690 75 73 65 64 20 66 6f 72 0a 2a 2a 20 61 74 74 61  used for.** atta
166a0 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2e 0a  ched databases..
166b0 2a 2a 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 6e  **.** If P2 is n
166c0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20  on-zero, then a 
166d0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
166e0 6e 20 69 73 20 73 74 61 72 74 65 64 2e 20 20 41  n is started.  A
166f0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
16700 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 6f 6e  s.** obtained on
16710 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16720 6c 65 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  le when a write-
16730 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
16740 74 61 72 74 65 64 2e 20 20 4e 6f 0a 2a 2a 20 6f  tarted.  No.** o
16750 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 61 6e  ther process can
16760 20 73 74 61 72 74 20 61 6e 6f 74 68 65 72 20 77   start another w
16770 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
16780 20 77 68 69 6c 65 20 74 68 69 73 20 74 72 61 6e   while this tran
16790 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e  saction is.** un
167a0 64 65 72 77 61 79 2e 20 20 53 74 61 72 74 69 6e  derway.  Startin
167b0 67 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  g a write transa
167c0 63 74 69 6f 6e 20 61 6c 73 6f 20 63 72 65 61 74  ction also creat
167d0 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
167e0 75 72 6e 61 6c 2e 20 41 0a 2a 2a 20 77 72 69 74  urnal. A.** writ
167f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e transaction mu
16800 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
16810 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
16820 20 63 61 6e 20 62 65 20 6d 61 64 65 20 74 6f 20   can be made to 
16830 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  the.** database.
16840 20 20 49 66 20 50 32 20 69 73 20 32 20 6f 72 20    If P2 is 2 or 
16850 67 72 65 61 74 65 72 20 74 68 65 6e 20 61 6e 20  greater then an 
16860 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69  EXCLUSIVE lock i
16870 73 20 61 6c 73 6f 20 6f 62 74 61 69 6e 65 64 0a  s also obtained.
16880 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ** on the file..
16890 2a 2a 0a 2a 2a 20 49 66 20 61 20 77 72 69 74 65  **.** If a write
168a0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
168b0 73 74 61 72 74 65 64 20 61 6e 64 20 74 68 65 20  started and the 
168c0 56 64 62 65 2e 75 73 65 73 53 74 6d 74 4a 6f 75  Vdbe.usesStmtJou
168d0 72 6e 61 6c 20 66 6c 61 67 20 69 73 0a 2a 2a 20  rnal flag is.** 
168e0 74 72 75 65 20 28 74 68 69 73 20 66 6c 61 67 20  true (this flag 
168f0 69 73 20 73 65 74 20 69 66 20 74 68 65 20 56 64  is set if the Vd
16900 62 65 20 6d 61 79 20 6d 6f 64 69 66 79 20 6d 6f  be may modify mo
16910 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20  re than one row 
16920 61 6e 64 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77  and may.** throw
16930 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74   an ABORT except
16940 69 6f 6e 29 2c 20 61 20 73 74 61 74 65 6d 65 6e  ion), a statemen
16950 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  t transaction ma
16960 79 20 61 6c 73 6f 20 62 65 20 6f 70 65 6e 65 64  y also be opened
16970 2e 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  ..** More specif
16980 69 63 61 6c 6c 79 2c 20 61 20 73 74 61 74 65 6d  ically, a statem
16990 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
169a0 69 73 20 6f 70 65 6e 65 64 20 69 66 66 20 74 68  is opened iff th
169b0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
169c0 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nnection is curr
169d0 65 6e 74 6c 79 20 6e 6f 74 20 69 6e 20 61 75 74  ently not in aut
169e0 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 6f 72  ocommit mode, or
169f0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   if there are ot
16a00 68 65 72 0a 2a 2a 20 61 63 74 69 76 65 20 73 74  her.** active st
16a10 61 74 65 6d 65 6e 74 73 2e 20 41 20 73 74 61 74  atements. A stat
16a20 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
16a30 6e 20 61 6c 6c 6f 77 73 20 74 68 65 20 61 66 66  n allows the aff
16a40 65 63 74 73 20 6f 66 20 74 68 69 73 0a 2a 2a 20  ects of this.** 
16a50 56 44 42 45 20 74 6f 20 62 65 20 72 6f 6c 6c 65  VDBE to be rolle
16a60 64 20 62 61 63 6b 20 61 66 74 65 72 20 61 6e 20  d back after an 
16a70 65 72 72 6f 72 20 77 69 74 68 6f 75 74 20 68 61  error without ha
16a80 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 62 61 63  ving to roll bac
16a90 6b 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20  k the.** entire 
16aa0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20  transaction. If 
16ab0 6e 6f 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  no error is enco
16ac0 75 6e 74 65 72 65 64 2c 20 74 68 65 20 73 74 61  untered, the sta
16ad0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
16ae0 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 61 75 74 6f 6d  on.** will autom
16af0 61 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69 74 20  atically commit 
16b00 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 68 61  when the VDBE ha
16b10 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32  lts..**.** If P2
16b20 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61   is zero, then a
16b30 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62   read-lock is ob
16b40 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61  tained on the da
16b50 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
16b60 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74  case OP_Transact
16b70 69 6f 6e 3a 20 7b 0a 20 20 42 74 72 65 65 20 2a  ion: {.  Btree *
16b80 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
16b90 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
16ba0 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b  p->p1<db->nDb );
16bb0 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62  .  assert( (p->b
16bc0 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44  treeMask & (((yD
16bd0 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e 70  bMask)1)<<pOp->p
16be0 31 29 29 21 3d 30 20 29 3b 0a 20 20 70 42 74 20  1))!=0 );.  pBt 
16bf0 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70  = db->aDb[pOp->p
16c00 31 5d 2e 70 42 74 3b 0a 0a 20 20 69 66 28 20 70  1].pBt;..  if( p
16c10 42 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  Bt ){.    rc = s
16c20 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
16c30 54 72 61 6e 73 28 70 42 74 2c 20 70 4f 70 2d 3e  Trans(pBt, pOp->
16c40 70 32 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  p2);.    if( rc=
16c50 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
16c60 20 20 20 20 20 20 70 2d 3e 70 63 20 3d 20 70 63        p->pc = pc
16c70 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  ;.      p->rc = 
16c80 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
16c90 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62  ;.      goto vdb
16ca0 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  e_return;.    }.
16cb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16cc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
16cd0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
16ce0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20  _error;.    }.. 
16cf0 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 26     if( pOp->p2 &
16d00 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  & p->usesStmtJou
16d10 72 6e 61 6c 20 0a 20 20 20 20 20 26 26 20 28 64  rnal .     && (d
16d20 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
16d30 20 7c 7c 20 64 62 2d 3e 61 63 74 69 76 65 56 64   || db->activeVd
16d40 62 65 43 6e 74 3e 31 29 20 0a 20 20 20 20 29 7b  beCnt>1) .    ){
16d50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
16d60 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
16d70 72 61 6e 73 28 70 42 74 29 20 29 3b 0a 20 20 20  rans(pBt) );.   
16d80 20 20 20 69 66 28 20 70 2d 3e 69 53 74 61 74 65     if( p->iState
16d90 6d 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ment==0 ){.     
16da0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
16db0 53 74 61 74 65 6d 65 6e 74 3e 3d 30 20 26 26 20  Statement>=0 && 
16dc0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 3d  db->nSavepoint>=
16dd0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  0 );.        db-
16de0 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 2b 3b 20 0a  >nStatement++; .
16df0 20 20 20 20 20 20 20 20 70 2d 3e 69 53 74 61 74          p->iStat
16e00 65 6d 65 6e 74 20 3d 20 64 62 2d 3e 6e 53 61 76  ement = db->nSav
16e10 65 70 6f 69 6e 74 20 2b 20 64 62 2d 3e 6e 53 74  epoint + db->nSt
16e20 61 74 65 6d 65 6e 74 3b 0a 20 20 20 20 20 20 7d  atement;.      }
16e30 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
16e40 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
16e50 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
16e60 42 45 47 49 4e 2c 20 70 2d 3e 69 53 74 61 74 65  BEGIN, p->iState
16e70 6d 65 6e 74 2d 31 29 3b 0a 20 20 20 20 20 20 69  ment-1);.      i
16e80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16e90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
16ea0 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
16eb0 69 6e 53 74 6d 74 28 70 42 74 2c 20 70 2d 3e 69  inStmt(pBt, p->i
16ec0 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20  Statement);.    
16ed0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 74    }..      /* St
16ee0 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
16ef0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
16f00 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65  abase handles de
16f10 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
16f20 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74  t.      ** count
16f30 65 72 2e 20 49 66 20 74 68 65 20 73 74 61 74 65  er. If the state
16f40 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
16f50 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
16f60 6c 65 64 20 62 61 63 6b 2c 0a 20 20 20 20 20 20  led back,.      
16f70 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
16f80 74 68 69 73 20 63 6f 75 6e 74 65 72 20 6e 65 65  this counter nee
16f90 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65  ds to be restore
16fa0 64 20 74 6f 6f 2e 20 20 2a 2f 0a 20 20 20 20 20  d too.  */.     
16fb0 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73   p->nStmtDefCons
16fc0 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64   = db->nDeferred
16fd0 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cons;.    }.  }.
16fe0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
16ff0 70 63 6f 64 65 3a 20 52 65 61 64 43 6f 6f 6b 69  pcode: ReadCooki
17000 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  e P1 P2 P3 * *.*
17010 2a 0a 2a 2a 20 52 65 61 64 20 63 6f 6f 6b 69 65  *.** Read cookie
17020 20 6e 75 6d 62 65 72 20 50 33 20 66 72 6f 6d 20   number P3 from 
17030 64 61 74 61 62 61 73 65 20 50 31 20 61 6e 64 20  database P1 and 
17040 77 72 69 74 65 20 69 74 20 69 6e 74 6f 20 72 65  write it into re
17050 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 20 50 33  gister P2..** P3
17060 3d 3d 31 20 69 73 20 74 68 65 20 73 63 68 65 6d  ==1 is the schem
17070 61 20 76 65 72 73 69 6f 6e 2e 20 20 50 33 3d 3d  a version.  P3==
17080 32 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73  2 is the databas
17090 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 50 33 3d  e format..** P3=
170a0 3d 33 20 69 73 20 74 68 65 20 72 65 63 6f 6d 6d  =3 is the recomm
170b0 65 6e 64 65 64 20 70 61 67 65 72 20 63 61 63 68  ended pager cach
170c0 65 20 73 69 7a 65 2c 20 61 6e 64 20 73 6f 20 66  e size, and so f
170d0 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20 69 73 0a  orth.  P1==0 is.
170e0 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ** the main data
170f0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 50 31  base file and P1
17100 3d 3d 31 20 69 73 20 74 68 65 20 64 61 74 61 62  ==1 is the datab
17110 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f  ase file used to
17120 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72   store.** tempor
17130 61 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a  ary tables..**.*
17140 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
17150 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74  a read-lock on t
17160 68 65 20 64 61 74 61 62 61 73 65 20 28 65 69 74  he database (eit
17170 68 65 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  her a transactio
17180 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 73 74 61  n.** must be sta
17190 72 74 65 64 20 6f 72 20 74 68 65 72 65 20 6d 75  rted or there mu
171a0 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75  st be an open cu
171b0 72 73 6f 72 29 20 62 65 66 6f 72 65 0a 2a 2a 20  rsor) before.** 
171c0 65 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 69  executing this i
171d0 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  nstruction..*/.c
171e0 61 73 65 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69  ase OP_ReadCooki
171f0 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  e: {            
17200 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65     /* out2-prere
17210 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lease */.  int i
17220 4d 65 74 61 3b 0a 20 20 69 6e 74 20 69 44 62 3b  Meta;.  int iDb;
17230 0a 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 0a  .  int iCookie;.
17240 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31  .  iDb = pOp->p1
17250 3b 0a 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 4f  ;.  iCookie = pO
17260 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72 74 28  p->p3;.  assert(
17270 20 70 4f 70 2d 3e 70 33 3c 53 51 4c 49 54 45 5f   pOp->p3<SQLITE_
17280 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20 29 3b 0a  N_BTREE_META );.
17290 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
172a0 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
172b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
172c0 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
172d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
172e0 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28  ->btreeMask & ((
172f0 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62  (yDbMask)1)<<iDb
17300 29 29 21 3d 30 20 29 3b 0a 0a 20 20 73 71 6c 69  ))!=0 );..  sqli
17310 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
17320 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
17330 2c 20 69 43 6f 6f 6b 69 65 2c 20 28 75 33 32 20  , iCookie, (u32 
17340 2a 29 26 69 4d 65 74 61 29 3b 0a 20 20 70 4f 75  *)&iMeta);.  pOu
17350 74 2d 3e 75 2e 69 20 3d 20 69 4d 65 74 61 3b 0a  t->u.i = iMeta;.
17360 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
17370 70 63 6f 64 65 3a 20 53 65 74 43 6f 6f 6b 69 65  pcode: SetCookie
17380 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
17390 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f  .** Write the co
173a0 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65  ntent of registe
173b0 72 20 50 33 20 28 69 6e 74 65 72 70 72 65 74 65  r P3 (interprete
173c0 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 29  d as an integer)
173d0 0a 2a 2a 20 69 6e 74 6f 20 63 6f 6f 6b 69 65 20  .** into cookie 
173e0 6e 75 6d 62 65 72 20 50 32 20 6f 66 20 64 61 74  number P2 of dat
173f0 61 62 61 73 65 20 50 31 2e 20 20 50 32 3d 3d 31  abase P1.  P2==1
17400 20 69 73 20 74 68 65 20 73 63 68 65 6d 61 20 76   is the schema v
17410 65 72 73 69 6f 6e 2e 20 20 0a 2a 2a 20 50 32 3d  ersion.  .** P2=
17420 3d 32 20 69 73 20 74 68 65 20 64 61 74 61 62 61  =2 is the databa
17430 73 65 20 66 6f 72 6d 61 74 2e 20 50 32 3d 3d 33  se format. P2==3
17440 20 69 73 20 74 68 65 20 72 65 63 6f 6d 6d 65 6e   is the recommen
17450 64 65 64 20 70 61 67 65 72 20 63 61 63 68 65 20  ded pager cache 
17460 0a 2a 2a 20 73 69 7a 65 2c 20 61 6e 64 20 73 6f  .** size, and so
17470 20 66 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20 69   forth.  P1==0 i
17480 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
17490 61 73 65 20 66 69 6c 65 20 61 6e 64 20 50 31 3d  ase file and P1=
174a0 3d 31 20 69 73 20 74 68 65 20 0a 2a 2a 20 64 61  =1 is the .** da
174b0 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
174c0 20 74 6f 20 73 74 6f 72 65 20 74 65 6d 70 6f 72   to store tempor
174d0 61 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a  ary tables..**.*
174e0 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
174f0 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
17500 62 65 66 6f 72 65 20 65 78 65 63 75 74 69 6e 67  before executing
17510 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2f   this opcode..*/
17520 0a 63 61 73 65 20 4f 50 5f 53 65 74 43 6f 6f 6b  .case OP_SetCook
17530 69 65 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 69  ie: {       /* i
17540 6e 33 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b  n3 */.  Db *pDb;
17550 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
17560 70 32 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45  p2<SQLITE_N_BTRE
17570 45 5f 4d 45 54 41 20 29 3b 0a 20 20 61 73 73 65  E_META );.  asse
17580 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
17590 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44  & pOp->p1<db->nD
175a0 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  b );.  assert( (
175b0 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28  p->btreeMask & (
175c0 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f  ((yDbMask)1)<<pO
175d0 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a 20 20  p->p1))!=0 );.  
175e0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70  pDb = &db->aDb[p
175f0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
17600 74 28 20 70 44 62 2d 3e 70 42 74 21 3d 30 20 29  t( pDb->pBt!=0 )
17610 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
17620 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
17630 6c 64 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20  ld(db, pOp->p1, 
17640 30 29 20 29 3b 0a 20 20 70 49 6e 33 20 3d 20 26  0) );.  pIn3 = &
17650 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
17660 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
17670 6e 74 65 67 65 72 69 66 79 28 70 49 6e 33 29 3b  ntegerify(pIn3);
17680 0a 20 20 2f 2a 20 53 65 65 20 6e 6f 74 65 20 61  .  /* See note a
17690 62 6f 75 74 20 69 6e 64 65 78 20 73 68 69 66 74  bout index shift
176a0 69 6e 67 20 6f 6e 20 4f 50 5f 52 65 61 64 43 6f  ing on OP_ReadCo
176b0 6f 6b 69 65 20 2a 2f 0a 20 20 72 63 20 3d 20 73  okie */.  rc = s
176c0 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
176d0 65 4d 65 74 61 28 70 44 62 2d 3e 70 42 74 2c 20  eMeta(pDb->pBt, 
176e0 70 4f 70 2d 3e 70 32 2c 20 28 69 6e 74 29 70 49  pOp->p2, (int)pI
176f0 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 69 66 28 20  n3->u.i);.  if( 
17700 70 4f 70 2d 3e 70 32 3d 3d 42 54 52 45 45 5f 53  pOp->p2==BTREE_S
17710 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 20 29 7b  CHEMA_VERSION ){
17720 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  .    /* When the
17730 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 63   schema cookie c
17740 68 61 6e 67 65 73 2c 20 72 65 63 6f 72 64 20 74  hanges, record t
17750 68 65 20 6e 65 77 20 63 6f 6f 6b 69 65 20 69 6e  he new cookie in
17760 74 65 72 6e 61 6c 6c 79 20 2a 2f 0a 20 20 20 20  ternally */.    
17770 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63  pDb->pSchema->sc
17780 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 28 69  hema_cookie = (i
17790 6e 74 29 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20  nt)pIn3->u.i;.  
177a0 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
177b0 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
177c0 67 65 73 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ges;.  }else if(
177d0 20 70 4f 70 2d 3e 70 32 3d 3d 42 54 52 45 45 5f   pOp->p2==BTREE_
177e0 46 49 4c 45 5f 46 4f 52 4d 41 54 20 29 7b 0a 20  FILE_FORMAT ){. 
177f0 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 63 68 61     /* Record cha
17800 6e 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  nges in the file
17810 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 70   format */.    p
17820 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c  Db->pSchema->fil
17830 65 5f 66 6f 72 6d 61 74 20 3d 20 28 75 38 29 70  e_format = (u8)p
17840 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20  In3->u.i;.  }.  
17850 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 31 20 29  if( pOp->p1==1 )
17860 7b 0a 20 20 20 20 2f 2a 20 49 6e 76 61 6c 69 64  {.    /* Invalid
17870 61 74 65 20 61 6c 6c 20 70 72 65 70 61 72 65 64  ate all prepared
17880 20 73 74 61 74 65 6d 65 6e 74 73 20 77 68 65 6e   statements when
17890 65 76 65 72 20 74 68 65 20 54 45 4d 50 20 64 61  ever the TEMP da
178a0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 73 63  tabase.    ** sc
178b0 68 65 6d 61 20 69 73 20 63 68 61 6e 67 65 64 2e  hema is changed.
178c0 20 20 54 69 63 6b 65 74 20 23 31 36 34 34 20 2a    Ticket #1644 *
178d0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  /.    sqlite3Exp
178e0 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
178f0 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 70  ments(db);.    p
17900 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 20  ->expired = 0;. 
17910 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
17920 2a 20 4f 70 63 6f 64 65 3a 20 56 65 72 69 66 79  * Opcode: Verify
17930 43 6f 6f 6b 69 65 20 50 31 20 50 32 20 50 33 20  Cookie P1 P2 P3 
17940 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20  * *.**.** Check 
17950 74 68 65 20 76 61 6c 75 65 20 6f 66 20 67 6c 6f  the value of glo
17960 62 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 72  bal database par
17970 61 6d 65 74 65 72 20 6e 75 6d 62 65 72 20 30 20  ameter number 0 
17980 28 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 76  (the.** schema v
17990 65 72 73 69 6f 6e 29 20 61 6e 64 20 6d 61 6b 65  ersion) and make
179a0 20 73 75 72 65 20 69 74 20 69 73 20 65 71 75 61   sure it is equa
179b0 6c 20 74 6f 20 50 32 20 61 6e 64 20 74 68 61 74  l to P2 and that
179c0 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 74 69   the.** generati
179d0 6f 6e 20 63 6f 75 6e 74 65 72 20 6f 6e 20 74 68  on counter on th
179e0 65 20 6c 6f 63 61 6c 20 73 63 68 65 6d 61 20 70  e local schema p
179f0 61 72 73 65 20 65 71 75 61 6c 73 20 50 33 2e 0a  arse equals P3..
17a00 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20  **.** P1 is the 
17a10 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
17a20 77 68 69 63 68 20 69 73 20 30 20 66 6f 72 20 74  which is 0 for t
17a30 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
17a40 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 31 20 66   file.** and 1 f
17a50 6f 72 20 74 68 65 20 66 69 6c 65 20 68 6f 6c 64  or the file hold
17a60 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
17a70 62 6c 65 73 20 61 6e 64 20 73 6f 6d 65 20 68 69  bles and some hi
17a80 67 68 65 72 20 6e 75 6d 62 65 72 0a 2a 2a 20 66  gher number.** f
17a90 6f 72 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  or auxiliary dat
17aa0 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  abases..**.** Th
17ab0 65 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65 73  e cookie changes
17ac0 20 69 74 73 20 76 61 6c 75 65 20 77 68 65 6e 65   its value whene
17ad0 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65  ver the database
17ae0 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 2e   schema changes.
17af0 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69  .** This operati
17b00 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  on is used to de
17b10 74 65 63 74 20 77 68 65 6e 20 74 68 61 74 20 74  tect when that t
17b20 68 65 20 63 6f 6f 6b 69 65 20 68 61 73 20 63 68  he cookie has ch
17b30 61 6e 67 65 64 0a 2a 2a 20 61 6e 64 20 74 68 61  anged.** and tha
17b40 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  t the current pr
17b50 6f 63 65 73 73 20 6e 65 65 64 73 20 74 6f 20 72  ocess needs to r
17b60 65 72 65 61 64 20 74 68 65 20 73 63 68 65 6d 61  eread the schema
17b70 2e 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 61  ..**.** Either a
17b80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65   transaction nee
17b90 64 73 20 74 6f 20 68 61 76 65 20 62 65 65 6e 20  ds to have been 
17ba0 73 74 61 72 74 65 64 20 6f 72 20 61 6e 20 4f 50  started or an OP
17bb0 5f 4f 70 65 6e 20 6e 65 65 64 73 0a 2a 2a 20 74  _Open needs.** t
17bc0 6f 20 62 65 20 65 78 65 63 75 74 65 64 20 28 74  o be executed (t
17bd0 6f 20 65 73 74 61 62 6c 69 73 68 20 61 20 72 65  o establish a re
17be0 61 64 20 6c 6f 63 6b 29 20 62 65 66 6f 72 65 20  ad lock) before 
17bf0 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 0a 2a  this opcode is.*
17c00 2a 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 63 61  * invoked..*/.ca
17c10 73 65 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b  se OP_VerifyCook
17c20 69 65 3a 20 7b 0a 20 20 69 6e 74 20 69 4d 65 74  ie: {.  int iMet
17c30 61 3b 0a 20 20 69 6e 74 20 69 47 65 6e 3b 0a 20  a;.  int iGen;. 
17c40 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 0a 20 20   Btree *pBt;..  
17c50 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
17c60 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62  =0 && pOp->p1<db
17c70 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
17c80 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  t( (p->btreeMask
17c90 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31 29   & (((yDbMask)1)
17ca0 3c 3c 70 4f 70 2d 3e 70 31 29 29 21 3d 30 20 29  <<pOp->p1))!=0 )
17cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
17cc0 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
17cd0 6c 64 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20  ld(db, pOp->p1, 
17ce0 30 29 20 29 3b 0a 20 20 70 42 74 20 3d 20 64 62  0) );.  pBt = db
17cf0 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70  ->aDb[pOp->p1].p
17d00 42 74 3b 0a 20 20 69 66 28 20 70 42 74 20 29 7b  Bt;.  if( pBt ){
17d10 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
17d20 65 47 65 74 4d 65 74 61 28 70 42 74 2c 20 42 54  eGetMeta(pBt, BT
17d30 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49  REE_SCHEMA_VERSI
17d40 4f 4e 2c 20 28 75 33 32 20 2a 29 26 69 4d 65 74  ON, (u32 *)&iMet
17d50 61 29 3b 0a 20 20 20 20 69 47 65 6e 20 3d 20 64  a);.    iGen = d
17d60 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e  b->aDb[pOp->p1].
17d70 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
17d80 74 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tion;.  }else{. 
17d90 20 20 20 69 47 65 6e 20 3d 20 69 4d 65 74 61 20     iGen = iMeta 
17da0 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  = 0;.  }.  if( i
17db0 4d 65 74 61 21 3d 70 4f 70 2d 3e 70 32 20 7c 7c  Meta!=pOp->p2 ||
17dc0 20 69 47 65 6e 21 3d 70 4f 70 2d 3e 70 33 20 29   iGen!=pOp->p3 )
17dd0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
17de0 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
17df0 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
17e00 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Msg = sqlite3DbS
17e10 74 72 44 75 70 28 64 62 2c 20 22 64 61 74 61 62  trDup(db, "datab
17e20 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63  ase schema has c
17e30 68 61 6e 67 65 64 22 29 3b 0a 20 20 20 20 2f 2a  hanged");.    /*
17e40 20 49 66 20 74 68 65 20 73 63 68 65 6d 61 2d 63   If the schema-c
17e50 6f 6f 6b 69 65 20 66 72 6f 6d 20 74 68 65 20 64  ookie from the d
17e60 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 74  atabase file mat
17e70 63 68 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  ches the cookie 
17e80 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 77  .    ** stored w
17e90 69 74 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ith the in-memor
17ea0 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
17eb0 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2c 20   of the schema, 
17ec0 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 65  do.    ** not re
17ed0 6c 6f 61 64 20 74 68 65 20 73 63 68 65 6d 61 20  load the schema 
17ee0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
17ef0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
17f00 20 20 20 2a 2a 20 49 66 20 76 69 72 74 75 61 6c     ** If virtual
17f10 2d 74 61 62 6c 65 73 20 61 72 65 20 69 6e 20 75  -tables are in u
17f20 73 65 2c 20 74 68 69 73 20 69 73 20 6e 6f 74 20  se, this is not 
17f30 6a 75 73 74 20 61 6e 20 6f 70 74 69 6d 69 7a 61  just an optimiza
17f40 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 4f 66 74  tion..    ** Oft
17f50 65 6e 2c 20 76 2d 74 61 62 6c 65 73 20 73 74 6f  en, v-tables sto
17f60 72 65 20 74 68 65 69 72 20 64 61 74 61 20 69 6e  re their data in
17f70 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20 74 61   other SQLite ta
17f80 62 6c 65 73 2c 20 77 68 69 63 68 0a 20 20 20 20  bles, which.    
17f90 2a 2a 20 61 72 65 20 71 75 65 72 69 65 64 20 66  ** are queried f
17fa0 72 6f 6d 20 77 69 74 68 69 6e 20 78 4e 65 78 74  rom within xNext
17fb0 28 29 20 61 6e 64 20 6f 74 68 65 72 20 76 2d 74  () and other v-t
17fc0 61 62 6c 65 20 6d 65 74 68 6f 64 73 20 75 73 69  able methods usi
17fd0 6e 67 0a 20 20 20 20 2a 2a 20 70 72 65 70 61 72  ng.    ** prepar
17fe0 65 64 20 71 75 65 72 69 65 73 2e 20 49 66 20 73  ed queries. If s
17ff0 75 63 68 20 61 20 71 75 65 72 79 20 69 73 20 6f  uch a query is o
18000 75 74 2d 6f 66 2d 64 61 74 65 2c 20 77 65 20 64  ut-of-date, we d
18010 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 0a 20 20  o not want to.  
18020 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68 65    ** discard the
18030 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
18040 2c 20 61 73 20 74 68 65 20 75 73 65 72 20 63 6f  , as the user co
18050 64 65 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  de implementing 
18060 74 68 65 0a 20 20 20 20 2a 2a 20 76 2d 74 61 62  the.    ** v-tab
18070 6c 65 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  le would have to
18080 20 62 65 20 72 65 61 64 79 20 66 6f 72 20 74 68   be ready for th
18090 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73  e sqlite3_vtab s
180a0 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 0a  tructure itself.
180b0 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76      ** to be inv
180c0 61 6c 69 64 61 74 65 64 20 77 68 65 6e 65 76 65  alidated wheneve
180d0 72 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  r sqlite3_step()
180e0 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
180f0 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 61  within .    ** a
18100 20 76 2d 74 61 62 6c 65 20 6d 65 74 68 6f 64 2e   v-table method.
18110 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
18120 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d  db->aDb[pOp->p1]
18130 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
18140 5f 63 6f 6f 6b 69 65 21 3d 69 4d 65 74 61 20 29  _cookie!=iMeta )
18150 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
18160 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
18170 6d 61 28 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b  ma(db, pOp->p1);
18180 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 65  .    }..    p->e
18190 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  xpired = 1;.    
181a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 53 43 48 45  rc = SQLITE_SCHE
181b0 4d 41 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  MA;.  }.  break;
181c0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .}../* Opcode: O
181d0 70 65 6e 52 65 61 64 20 50 31 20 50 32 20 50 33  penRead P1 P2 P3
181e0 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 4f 70 65   P4 P5.**.** Ope
181f0 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  n a read-only cu
18200 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74  rsor for the dat
18210 61 62 61 73 65 20 74 61 62 6c 65 20 77 68 6f 73  abase table whos
18220 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 0a 2a  e root page is.*
18230 2a 20 50 32 20 69 6e 20 61 20 64 61 74 61 62 61  * P2 in a databa
18240 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 64 61  se file.  The da
18250 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 64  tabase file is d
18260 65 74 65 72 6d 69 6e 65 64 20 62 79 20 50 33 2e  etermined by P3.
18270 20 0a 2a 2a 20 50 33 3d 3d 30 20 6d 65 61 6e 73   .** P3==0 means
18280 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
18290 73 65 2c 20 50 33 3d 3d 31 20 6d 65 61 6e 73 20  se, P3==1 means 
182a0 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65  the database use
182b0 64 20 66 6f 72 20 0a 2a 2a 20 74 65 6d 70 6f 72  d for .** tempor
182c0 61 72 79 20 74 61 62 6c 65 73 2c 20 61 6e 64 20  ary tables, and 
182d0 50 33 3e 31 20 6d 65 61 6e 73 20 75 73 65 64 20  P3>1 means used 
182e0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
182f0 67 20 61 74 74 61 63 68 65 64 0a 2a 2a 20 64 61  g attached.** da
18300 74 61 62 61 73 65 2e 20 20 47 69 76 65 20 74 68  tabase.  Give th
18310 65 20 6e 65 77 20 63 75 72 73 6f 72 20 61 6e 20  e new cursor an 
18320 69 64 65 6e 74 69 66 69 65 72 20 6f 66 20 50 31  identifier of P1
18330 2e 20 20 54 68 65 20 50 31 0a 2a 2a 20 76 61 6c  .  The P1.** val
18340 75 65 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20  ues need not be 
18350 63 6f 6e 74 69 67 75 6f 75 73 20 62 75 74 20 61  contiguous but a
18360 6c 6c 20 50 31 20 76 61 6c 75 65 73 20 73 68 6f  ll P1 values sho
18370 75 6c 64 20 62 65 20 73 6d 61 6c 6c 20 69 6e 74  uld be small int
18380 65 67 65 72 73 2e 0a 2a 2a 20 49 74 20 69 73 20  egers..** It is 
18390 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 50 31 20  an error for P1 
183a0 74 6f 20 62 65 20 6e 65 67 61 74 69 76 65 2e 0a  to be negative..
183b0 2a 2a 0a 2a 2a 20 49 66 20 50 35 21 3d 30 20 74  **.** If P5!=0 t
183c0 68 65 6e 20 75 73 65 20 74 68 65 20 63 6f 6e 74  hen use the cont
183d0 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20  ent of register 
183e0 50 32 20 61 73 20 74 68 65 20 72 6f 6f 74 20 70  P2 as the root p
183f0 61 67 65 2c 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  age, not.** the 
18400 76 61 6c 75 65 20 6f 66 20 50 32 20 69 74 73 65  value of P2 itse
18410 6c 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  lf..**.** There 
18420 77 69 6c 6c 20 62 65 20 61 20 72 65 61 64 20 6c  will be a read l
18430 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
18440 61 73 65 20 77 68 65 6e 65 76 65 72 20 74 68 65  ase whenever the
18450 72 65 20 69 73 20 61 6e 0a 2a 2a 20 6f 70 65 6e  re is an.** open
18460 20 63 75 72 73 6f 72 2e 20 20 49 66 20 74 68 65   cursor.  If the
18470 20 64 61 74 61 62 61 73 65 20 77 61 73 20 75 6e   database was un
18480 6c 6f 63 6b 65 64 20 70 72 69 6f 72 20 74 6f 20  locked prior to 
18490 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
184a0 0a 2a 2a 20 74 68 65 6e 20 61 20 72 65 61 64 20  .** then a read 
184b0 6c 6f 63 6b 20 69 73 20 61 63 71 75 69 72 65 64  lock is acquired
184c0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73   as part of this
184d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 41   instruction.  A
184e0 20 72 65 61 64 0a 2a 2a 20 6c 6f 63 6b 20 61 6c   read.** lock al
184f0 6c 6f 77 73 20 6f 74 68 65 72 20 70 72 6f 63 65  lows other proce
18500 73 73 65 73 20 74 6f 20 72 65 61 64 20 74 68 65  sses to read the
18510 20 64 61 74 61 62 61 73 65 20 62 75 74 20 70 72   database but pr
18520 6f 68 69 62 69 74 73 0a 2a 2a 20 61 6e 79 20 6f  ohibits.** any o
18530 74 68 65 72 20 70 72 6f 63 65 73 73 20 66 72 6f  ther process fro
18540 6d 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  m modifying the 
18550 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72  database.  The r
18560 65 61 64 20 6c 6f 63 6b 20 69 73 0a 2a 2a 20 72  ead lock is.** r
18570 65 6c 65 61 73 65 64 20 77 68 65 6e 20 61 6c 6c  eleased when all
18580 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6c 6f   cursors are clo
18590 73 65 64 2e 20 20 49 66 20 74 68 69 73 20 69 6e  sed.  If this in
185a0 73 74 72 75 63 74 69 6f 6e 20 61 74 74 65 6d 70  struction attemp
185b0 74 73 0a 2a 2a 20 74 6f 20 67 65 74 20 61 20 72  ts.** to get a r
185c0 65 61 64 20 6c 6f 63 6b 20 62 75 74 20 66 61 69  ead lock but fai
185d0 6c 73 2c 20 74 68 65 20 73 63 72 69 70 74 20 74  ls, the script t
185e0 65 72 6d 69 6e 61 74 65 73 20 77 69 74 68 20 61  erminates with a
185f0 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  n.** SQLITE_BUSY
18600 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
18610 2a 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65 20  ** The P4 value 
18620 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 6e  may be either an
18630 20 69 6e 74 65 67 65 72 20 28 50 34 5f 49 4e 54   integer (P4_INT
18640 33 32 29 20 6f 72 20 61 20 70 6f 69 6e 74 65 72  32) or a pointer
18650 20 74 6f 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f   to.** a KeyInfo
18660 20 73 74 72 75 63 74 75 72 65 20 28 50 34 5f 4b   structure (P4_K
18670 45 59 49 4e 46 4f 29 2e 20 49 66 20 69 74 20 69  EYINFO). If it i
18680 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
18690 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
186a0 75 63 74 75 72 65 2c 20 74 68 65 6e 20 73 61 69  ucture, then sai
186b0 64 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69  d structure defi
186c0 6e 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nes the content 
186d0 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a  and collating .*
186e0 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  * sequence of th
186f0 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 6f 70  e index being op
18700 65 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ened. Otherwise,
18710 20 69 66 20 50 34 20 69 73 20 61 6e 20 69 6e 74   if P4 is an int
18720 65 67 65 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20  eger .** value, 
18730 69 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  it is set to the
18740 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
18750 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ns in the table.
18760 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
18770 4f 70 65 6e 57 72 69 74 65 2e 0a 2a 2f 0a 2f 2a  OpenWrite..*/./*
18780 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 57 72 69   Opcode: OpenWri
18790 74 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50  te P1 P2 P3 P4 P
187a0 35 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72  5.**.** Open a r
187b0 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72  ead/write cursor
187c0 20 6e 61 6d 65 64 20 50 31 20 6f 6e 20 74 68 65   named P1 on the
187d0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
187e0 77 68 6f 73 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  whose root.** pa
187f0 67 65 20 69 73 20 50 32 2e 20 20 4f 72 20 69 66  ge is P2.  Or if
18800 20 50 35 21 3d 30 20 75 73 65 20 74 68 65 20 63   P5!=0 use the c
18810 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74  ontent of regist
18820 65 72 20 50 32 20 74 6f 20 66 69 6e 64 20 74 68  er P2 to find th
18830 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 0a  e.** root page..
18840 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 76 61 6c  **.** The P4 val
18850 75 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  ue may be either
18860 20 61 6e 20 69 6e 74 65 67 65 72 20 28 50 34 5f   an integer (P4_
18870 49 4e 54 33 32 29 20 6f 72 20 61 20 70 6f 69 6e  INT32) or a poin
18880 74 65 72 20 74 6f 0a 2a 2a 20 61 20 4b 65 79 49  ter to.** a KeyI
18890 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 28 50  nfo structure (P
188a0 34 5f 4b 45 59 49 4e 46 4f 29 2e 20 49 66 20 69  4_KEYINFO). If i
188b0 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
188c0 6f 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20  o a KeyInfo .** 
188d0 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 20  structure, then 
188e0 73 61 69 64 20 73 74 72 75 63 74 75 72 65 20 64  said structure d
188f0 65 66 69 6e 65 73 20 74 68 65 20 63 6f 6e 74 65  efines the conte
18900 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  nt and collating
18910 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66   .** sequence of
18920 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
18930 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65 72 77 69   opened. Otherwi
18940 73 65 2c 20 69 66 20 50 34 20 69 73 20 61 6e 20  se, if P4 is an 
18950 69 6e 74 65 67 65 72 20 0a 2a 2a 20 76 61 6c 75  integer .** valu
18960 65 2c 20 69 74 20 69 73 20 73 65 74 20 74 6f 20  e, it is set to 
18970 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
18980 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
18990 6c 65 2c 20 6f 72 20 74 6f 20 74 68 65 0a 2a 2a  le, or to the.**
189a0 20 6c 61 72 67 65 73 74 20 69 6e 64 65 78 20 6f   largest index o
189b0 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  f any column of 
189c0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
189d0 73 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 2e  s actually used.
189e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74  .**.** This inst
189f0 72 75 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6a 75  ruction works ju
18a00 73 74 20 6c 69 6b 65 20 4f 70 65 6e 52 65 61 64  st like OpenRead
18a10 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20   except that it 
18a20 6f 70 65 6e 73 20 74 68 65 20 63 75 72 73 6f 72  opens the cursor
18a30 0a 2a 2a 20 69 6e 20 72 65 61 64 2f 77 72 69 74  .** in read/writ
18a40 65 20 6d 6f 64 65 2e 20 20 46 6f 72 20 61 20 67  e mode.  For a g
18a50 69 76 65 6e 20 74 61 62 6c 65 2c 20 74 68 65 72  iven table, ther
18a60 65 20 63 61 6e 20 62 65 20 6f 6e 65 20 6f 72 20  e can be one or 
18a70 6d 6f 72 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a  more read-only.*
18a80 2a 20 63 75 72 73 6f 72 73 20 6f 72 20 61 20 73  * cursors or a s
18a90 69 6e 67 6c 65 20 72 65 61 64 2f 77 72 69 74 65  ingle read/write
18aa0 20 63 75 72 73 6f 72 20 62 75 74 20 6e 6f 74 20   cursor but not 
18ab0 62 6f 74 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  both..**.** See 
18ac0 61 6c 73 6f 20 4f 70 65 6e 52 65 61 64 2e 0a 2a  also OpenRead..*
18ad0 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 52 65  /.case OP_OpenRe
18ae0 61 64 3a 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e  ad:.case OP_Open
18af0 57 72 69 74 65 3a 20 7b 0a 20 20 69 6e 74 20 6e  Write: {.  int n
18b00 46 69 65 6c 64 3b 0a 20 20 4b 65 79 49 6e 66 6f  Field;.  KeyInfo
18b10 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e   *pKeyInfo;.  in
18b20 74 20 70 32 3b 0a 20 20 69 6e 74 20 69 44 62 3b  t p2;.  int iDb;
18b30 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 3b 0a 20  .  int wrFlag;. 
18b40 20 42 74 72 65 65 20 2a 70 58 3b 0a 20 20 56 64   Btree *pX;.  Vd
18b50 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  beCursor *pCur;.
18b60 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 69 66    Db *pDb;..  if
18b70 28 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a  ( p->expired ){.
18b80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18b90 41 42 4f 52 54 3b 0a 20 20 20 20 62 72 65 61 6b  ABORT;.    break
18ba0 3b 0a 20 20 7d 0a 0a 20 20 6e 46 69 65 6c 64 20  ;.  }..  nField 
18bb0 3d 20 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20  = 0;.  pKeyInfo 
18bc0 3d 20 30 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d  = 0;.  p2 = pOp-
18bd0 3e 70 32 3b 0a 20 20 69 44 62 20 3d 20 70 4f 70  >p2;.  iDb = pOp
18be0 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p3;.  assert( 
18bf0 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
18c00 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
18c10 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  t( (p->btreeMask
18c20 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31 29   & (((yDbMask)1)
18c30 3c 3c 69 44 62 29 29 21 3d 30 20 29 3b 0a 20 20  <<iDb))!=0 );.  
18c40 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
18c50 44 62 5d 3b 0a 20 20 70 58 20 3d 20 70 44 62 2d  Db];.  pX = pDb-
18c60 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
18c70 70 58 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  pX!=0 );.  if( p
18c80 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f  Op->opcode==OP_O
18c90 70 65 6e 57 72 69 74 65 20 29 7b 0a 20 20 20 20  penWrite ){.    
18ca0 77 72 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20  wrFlag = 1;.    
18cb0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
18cc0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
18cd0 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
18ce0 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
18cf0 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20  ma->file_format 
18d00 3c 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c  < p->minWriteFil
18d10 65 46 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20 20  eFormat ){.     
18d20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65   p->minWriteFile
18d30 46 6f 72 6d 61 74 20 3d 20 70 44 62 2d 3e 70 53  Format = pDb->pS
18d40 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
18d50 61 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  at;.    }.  }els
18d60 65 7b 0a 20 20 20 20 77 72 46 6c 61 67 20 3d 20  e{.    wrFlag = 
18d70 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70  0;.  }.  if( pOp
18d80 2d 3e 70 35 20 29 7b 0a 20 20 20 20 61 73 73 65  ->p5 ){.    asse
18d90 72 74 28 20 70 32 3e 30 20 29 3b 0a 20 20 20 20  rt( p2>0 );.    
18da0 61 73 73 65 72 74 28 20 70 32 3c 3d 70 2d 3e 6e  assert( p2<=p->n
18db0 4d 65 6d 20 29 3b 0a 20 20 20 20 70 49 6e 32 20  Mem );.    pIn2 
18dc0 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20 20  = &aMem[p2];.   
18dd0 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
18de0 6c 69 64 28 70 49 6e 32 29 20 29 3b 0a 20 20 20  lid(pIn2) );.   
18df0 20 61 73 73 65 72 74 28 20 28 70 49 6e 32 2d 3e   assert( (pIn2->
18e00 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
18e10 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  !=0 );.    sqlit
18e20 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72  e3VdbeMemInteger
18e30 69 66 79 28 70 49 6e 32 29 3b 0a 20 20 20 20 70  ify(pIn2);.    p
18e40 32 20 3d 20 28 69 6e 74 29 70 49 6e 32 2d 3e 75  2 = (int)pIn2->u
18e50 2e 69 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  .i;.    /* The p
18e60 32 20 76 61 6c 75 65 20 61 6c 77 61 79 73 20 63  2 value always c
18e70 6f 6d 65 73 20 66 72 6f 6d 20 61 20 70 72 69 6f  omes from a prio
18e80 72 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  r OP_CreateTable
18e90 20 6f 70 63 6f 64 65 20 61 6e 64 0a 20 20 20 20   opcode and.    
18ea0 2a 2a 20 74 68 61 74 20 6f 70 63 6f 64 65 20 77  ** that opcode w
18eb0 69 6c 6c 20 61 6c 77 61 79 73 20 73 65 74 20 74  ill always set t
18ec0 68 65 20 70 32 20 76 61 6c 75 65 20 74 6f 20 32  he p2 value to 2
18ed0 20 6f 72 20 6d 6f 72 65 20 6f 72 20 65 6c 73 65   or more or else
18ee0 20 66 61 69 6c 2e 0a 20 20 20 20 2a 2a 20 49 66   fail..    ** If
18ef0 20 74 68 65 72 65 20 77 65 72 65 20 61 20 66 61   there were a fa
18f00 69 6c 75 72 65 2c 20 74 68 65 20 70 72 65 70 61  ilure, the prepa
18f10 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77 6f  red statement wo
18f20 75 6c 64 20 68 61 76 65 20 68 61 6c 74 65 64 0a  uld have halted.
18f30 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 72 65      ** before re
18f40 61 63 68 69 6e 67 20 74 68 69 73 20 69 6e 73 74  aching this inst
18f50 72 75 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ruction. */.    
18f60 69 66 28 20 4e 45 56 45 52 28 70 32 3c 32 29 20  if( NEVER(p2<2) 
18f70 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  ) {.      rc = S
18f80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
18f90 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  PT;.      goto a
18fa0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
18fb0 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  r;.    }.  }.  i
18fc0 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
18fd0 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20  P4_KEYINFO ){.  
18fe0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70    pKeyInfo = pOp
18ff0 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
19000 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63     pKeyInfo->enc
19010 20 3d 20 45 4e 43 28 70 2d 3e 64 62 29 3b 0a 20   = ENC(p->db);. 
19020 20 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79     nField = pKey
19030 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 3b 0a  Info->nField+1;.
19040 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
19050 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
19060 32 20 29 7b 0a 20 20 20 20 6e 46 69 65 6c 64 20  2 ){.    nField 
19070 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 7d  = pOp->p4.i;.  }
19080 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
19090 70 31 3e 3d 30 20 29 3b 0a 20 20 70 43 75 72 20  p1>=0 );.  pCur 
190a0 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  = allocateCursor
190b0 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 6e 46 69  (p, pOp->p1, nFi
190c0 65 6c 64 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20  eld, iDb, 1);.  
190d0 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20 67 6f  if( pCur==0 ) go
190e0 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 75  to no_mem;.  pCu
190f0 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  r->nullRow = 1;.
19100 20 20 70 43 75 72 2d 3e 69 73 4f 72 64 65 72 65    pCur->isOrdere
19110 64 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  d = 1;.  rc = sq
19120 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
19130 28 70 58 2c 20 70 32 2c 20 77 72 46 6c 61 67 2c  (pX, p2, wrFlag,
19140 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 2d   pKeyInfo, pCur-
19150 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 70 43 75  >pCursor);.  pCu
19160 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  r->pKeyInfo = pK
19170 65 79 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 53 69  eyInfo;..  /* Si
19180 6e 63 65 20 69 74 20 70 65 72 66 6f 72 6d 73 20  nce it performs 
19190 6e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  no memory alloca
191a0 74 69 6f 6e 20 6f 72 20 49 4f 2c 20 74 68 65 20  tion or IO, the 
191b0 6f 6e 6c 79 20 76 61 6c 75 65 73 20 74 68 61 74  only values that
191c0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  .  ** sqlite3Btr
191d0 65 65 43 75 72 73 6f 72 28 29 20 6d 61 79 20 72  eeCursor() may r
191e0 65 74 75 72 6e 20 61 72 65 20 53 51 4c 49 54 45  eturn are SQLITE
191f0 5f 45 4d 50 54 59 20 61 6e 64 20 53 51 4c 49 54  _EMPTY and SQLIT
19200 45 5f 4f 4b 2e 20 0a 20 20 2a 2a 20 53 51 4c 49  E_OK. .  ** SQLI
19210 54 45 5f 45 4d 50 54 59 20 69 73 20 6f 6e 6c 79  TE_EMPTY is only
19220 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 61   returned when a
19230 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f 70 65  ttempting to ope
19240 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a  n the table.  **
19250 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
19260 31 20 6f 66 20 61 20 7a 65 72 6f 2d 62 79 74 65  1 of a zero-byte
19270 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20   database.  */. 
19280 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
19290 49 54 45 5f 45 4d 50 54 59 20 7c 7c 20 72 63 3d  ITE_EMPTY || rc=
192a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
192b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45  if( rc==SQLITE_E
192c0 4d 50 54 59 20 29 7b 0a 20 20 20 20 70 43 75 72  MPTY ){.    pCur
192d0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
192e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
192f0 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  K;.  }..  /* Set
19300 20 74 68 65 20 56 64 62 65 43 75 72 73 6f 72 2e   the VdbeCursor.
19310 69 73 54 61 62 6c 65 20 61 6e 64 20 69 73 49 6e  isTable and isIn
19320 64 65 78 20 76 61 72 69 61 62 6c 65 73 2e 20 50  dex variables. P
19330 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73  revious versions
19340 20 6f 66 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20   of.  ** SQLite 
19350 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  used to check if
19360 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 66   the root-page f
19370 6c 61 67 73 20 77 65 72 65 20 73 61 6e 65 20 61  lags were sane a
19380 74 20 74 68 69 73 20 70 6f 69 6e 74 0a 20 20 2a  t this point.  *
19390 2a 20 61 6e 64 20 72 65 70 6f 72 74 20 64 61 74  * and report dat
193a0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
193b0 20 69 66 20 74 68 65 79 20 77 65 72 65 20 6e 6f   if they were no
193c0 74 2c 20 62 75 74 20 74 68 69 73 20 63 68 65 63  t, but this chec
193d0 6b 20 68 61 73 0a 20 20 2a 2a 20 73 69 6e 63 65  k has.  ** since
193e0 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20   moved into the 
193f0 62 74 72 65 65 20 6c 61 79 65 72 2e 20 20 2a 2f  btree layer.  */
19400 20 20 0a 20 20 70 43 75 72 2d 3e 69 73 54 61 62    .  pCur->isTab
19410 6c 65 20 3d 20 70 4f 70 2d 3e 70 34 74 79 70 65  le = pOp->p4type
19420 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  !=P4_KEYINFO;.  
19430 70 43 75 72 2d 3e 69 73 49 6e 64 65 78 20 3d 20  pCur->isIndex = 
19440 21 70 43 75 72 2d 3e 69 73 54 61 62 6c 65 3b 0a  !pCur->isTable;.
19450 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
19460 70 63 6f 64 65 3a 20 4f 70 65 6e 45 70 68 65 6d  pcode: OpenEphem
19470 65 72 61 6c 20 50 31 20 50 32 20 2a 20 50 34 20  eral P1 P2 * P4 
19480 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  *.**.** Open a n
19490 65 77 20 63 75 72 73 6f 72 20 50 31 20 74 6f 20  ew cursor P1 to 
194a0 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
194b0 65 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  e..** The cursor
194c0 20 69 73 20 61 6c 77 61 79 73 20 6f 70 65 6e 65   is always opene
194d0 64 20 72 65 61 64 2f 77 72 69 74 65 20 65 76 65  d read/write eve
194e0 6e 20 69 66 20 0a 2a 2a 20 74 68 65 20 6d 61 69  n if .** the mai
194f0 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  n database is re
19500 61 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 65 70  ad-only.  The ep
19510 68 65 6d 65 72 61 6c 0a 2a 2a 20 74 61 62 6c 65  hemeral.** table
19520 20 69 73 20 64 65 6c 65 74 65 64 20 61 75 74 6f   is deleted auto
19530 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
19540 68 65 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  he cursor is clo
19550 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73  sed..**.** P2 is
19560 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
19570 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 65 70  olumns in the ep
19580 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 2a  hemeral table..*
19590 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69  * The cursor poi
195a0 6e 74 73 20 74 6f 20 61 20 42 54 72 65 65 20 74  nts to a BTree t
195b0 61 62 6c 65 20 69 66 20 50 34 3d 3d 30 20 61 6e  able if P4==0 an
195c0 64 20 74 6f 20 61 20 42 54 72 65 65 20 69 6e 64  d to a BTree ind
195d0 65 78 0a 2a 2a 20 69 66 20 50 34 20 69 73 20 6e  ex.** if P4 is n
195e0 6f 74 20 30 2e 20 20 49 66 20 50 34 20 69 73 20  ot 0.  If P4 is 
195f0 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69  not NULL, it poi
19600 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  nts to a KeyInfo
19610 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68   structure.** th
19620 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 66  at defines the f
19630 6f 72 6d 61 74 20 6f 66 20 6b 65 79 73 20 69 6e  ormat of keys in
19640 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a   the index..**.*
19650 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 61  * This opcode wa
19660 73 20 6f 6e 63 65 20 63 61 6c 6c 65 64 20 4f 70  s once called Op
19670 65 6e 54 65 6d 70 2e 20 20 42 75 74 20 74 68 61  enTemp.  But tha
19680 74 20 63 72 65 61 74 65 64 0a 2a 2a 20 63 6f 6e  t created.** con
19690 66 75 73 69 6f 6e 20 62 65 63 61 75 73 65 20 74  fusion because t
196a0 68 65 20 74 65 72 6d 20 22 74 65 6d 70 20 74 61  he term "temp ta
196b0 62 6c 65 22 2c 20 6d 69 67 68 74 20 72 65 66 65  ble", might refe
196c0 72 20 65 69 74 68 65 72 0a 2a 2a 20 74 6f 20 61  r either.** to a
196d0 20 54 45 4d 50 20 74 61 62 6c 65 20 61 74 20 74   TEMP table at t
196e0 68 65 20 53 51 4c 20 6c 65 76 65 6c 2c 20 6f 72  he SQL level, or
196f0 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 70 65 6e   to a table open
19700 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 6f 70  ed by.** this op
19710 63 6f 64 65 2e 20 20 54 68 65 6e 20 74 68 69 73  code.  Then this
19720 20 6f 70 63 6f 64 65 20 77 61 73 20 63 61 6c 6c   opcode was call
19730 20 4f 70 65 6e 56 69 72 74 75 61 6c 2e 20 20 42   OpenVirtual.  B
19740 75 74 0a 2a 2a 20 74 68 61 74 20 63 72 65 61 74  ut.** that creat
19750 65 64 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74  ed confusion wit
19760 68 20 74 68 65 20 77 68 6f 6c 65 20 76 69 72 74  h the whole virt
19770 75 61 6c 2d 74 61 62 6c 65 20 69 64 65 61 2e 0a  ual-table idea..
19780 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70  */./* Opcode: Op
19790 65 6e 41 75 74 6f 69 6e 64 65 78 20 50 31 20 50  enAutoindex P1 P
197a0 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54  2 * P4 *.**.** T
197b0 68 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73  his opcode works
197c0 20 74 68 65 20 73 61 6d 65 20 61 73 20 4f 50 5f   the same as OP_
197d0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2e 20 20  OpenEphemeral.  
197e0 49 74 20 68 61 73 20 61 0a 2a 2a 20 64 69 66 66  It has a.** diff
197f0 65 72 65 6e 74 20 6e 61 6d 65 20 74 6f 20 64 69  erent name to di
19800 73 74 69 6e 67 75 69 73 68 20 69 74 73 20 75 73  stinguish its us
19810 65 2e 20 20 54 61 62 6c 65 73 20 63 72 65 61 74  e.  Tables creat
19820 65 64 20 75 73 69 6e 67 0a 2a 2a 20 62 79 20 74  ed using.** by t
19830 68 69 73 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20  his opcode will 
19840 62 65 20 75 73 65 64 20 66 6f 72 20 61 75 74 6f  be used for auto
19850 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65  matically create
19860 64 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 69  d transient.** i
19870 6e 64 69 63 65 73 20 69 6e 20 6a 6f 69 6e 73 2e  ndices in joins.
19880 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e  .*/.case OP_Open
19890 41 75 74 6f 69 6e 64 65 78 3a 20 0a 63 61 73 65  Autoindex: .case
198a0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
198b0 6c 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  l: {.  VdbeCurso
198c0 72 20 2a 70 43 78 3b 0a 20 20 73 74 61 74 69 63  r *pCx;.  static
198d0 20 63 6f 6e 73 74 20 69 6e 74 20 76 66 73 46 6c   const int vfsFl
198e0 61 67 73 20 3d 20 0a 20 20 20 20 20 20 53 51 4c  ags = .      SQL
198f0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
19900 54 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54  TE |.      SQLIT
19910 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
19920 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
19930 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
19940 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
19950 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
19960 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
19970 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 3b 0a  N_TRANSIENT_DB;.
19980 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
19990 70 31 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20 3d  p1>=0 );.  pCx =
199a0 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
199b0 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  p, pOp->p1, pOp-
199c0 3e 70 32 2c 20 2d 31 2c 20 31 29 3b 0a 20 20 69  >p2, -1, 1);.  i
199d0 66 28 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f  f( pCx==0 ) goto
199e0 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e   no_mem;.  pCx->
199f0 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72  nullRow = 1;.  r
19a00 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
19a10 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30  Open(db->pVfs, 0
19a20 2c 20 64 62 2c 20 26 70 43 78 2d 3e 70 42 74 2c  , db, &pCx->pBt,
19a30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
19a40 20 20 20 20 20 20 20 20 20 20 42 54 52 45 45 5f            BTREE_
19a50 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 7c 20 42  OMIT_JOURNAL | B
19a60 54 52 45 45 5f 53 49 4e 47 4c 45 20 7c 20 70 4f  TREE_SINGLE | pO
19a70 70 2d 3e 70 35 2c 20 76 66 73 46 6c 61 67 73 29  p->p5, vfsFlags)
19a80 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
19a90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
19aa0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
19ab0 67 69 6e 54 72 61 6e 73 28 70 43 78 2d 3e 70 42  ginTrans(pCx->pB
19ac0 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28  t, 1);.  }.  if(
19ad0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19ae0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 72  {.    /* If a tr
19af0 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 69 73  ansient index is
19b00 20 72 65 71 75 69 72 65 64 2c 20 63 72 65 61 74   required, creat
19b10 65 20 69 74 20 62 79 20 63 61 6c 6c 69 6e 67 0a  e it by calling.
19b20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
19b30 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
19b40 20 77 69 74 68 20 74 68 65 20 42 54 52 45 45 5f   with the BTREE_
19b50 42 4c 4f 42 4b 45 59 20 66 6c 61 67 20 62 65 66  BLOBKEY flag bef
19b60 6f 72 65 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69  ore.    ** openi
19b70 6e 67 20 69 74 2e 20 49 66 20 61 20 74 72 61 6e  ng it. If a tran
19b80 73 69 65 6e 74 20 74 61 62 6c 65 20 69 73 20 72  sient table is r
19b90 65 71 75 69 72 65 64 2c 20 6a 75 73 74 20 75 73  equired, just us
19ba0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 61 75 74  e the.    ** aut
19bb0 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74  omatically creat
19bc0 65 64 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  ed table with ro
19bd0 6f 74 2d 70 61 67 65 20 31 20 28 61 6e 20 42 4c  ot-page 1 (an BL
19be0 4f 42 5f 49 4e 54 4b 45 59 20 74 61 62 6c 65 29  OB_INTKEY table)
19bf0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
19c00 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
19c10 6f 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  o ){.      int p
19c20 67 6e 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72  gno;.      asser
19c30 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
19c40 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20  P4_KEYINFO );.  
19c50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19c60 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
19c70 28 70 43 78 2d 3e 70 42 74 2c 20 26 70 67 6e 6f  (pCx->pBt, &pgno
19c80 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29  , BTREE_BLOBKEY)
19c90 3b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ; .      if( rc=
19ca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19cb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 67        assert( pg
19cc0 6e 6f 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 2b  no==MASTER_ROOT+
19cd0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  1 );.        rc 
19ce0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  = sqlite3BtreeCu
19cf0 72 73 6f 72 28 70 43 78 2d 3e 70 42 74 2c 20 70  rsor(pCx->pBt, p
19d00 67 6e 6f 2c 20 31 2c 20 0a 20 20 20 20 20 20 20  gno, 1, .       
19d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d20 20 20 20 20 20 20 20 20 20 28 4b 65 79 49 6e 66           (KeyInf
19d30 6f 2a 29 70 4f 70 2d 3e 70 34 2e 7a 2c 20 70 43  o*)pOp->p4.z, pC
19d40 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20  x->pCursor);.   
19d50 20 20 20 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e       pCx->pKeyIn
19d60 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  fo = pOp->p4.pKe
19d70 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70  yInfo;.        p
19d80 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  Cx->pKeyInfo->en
19d90 63 20 3d 20 45 4e 43 28 70 2d 3e 64 62 29 3b 0a  c = ENC(p->db);.
19da0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
19db0 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20 30 3b 0a  x->isTable = 0;.
19dc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19dd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
19de0 65 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 42  eeCursor(pCx->pB
19df0 74 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  t, MASTER_ROOT, 
19e00 31 2c 20 30 2c 20 70 43 78 2d 3e 70 43 75 72 73  1, 0, pCx->pCurs
19e10 6f 72 29 3b 0a 20 20 20 20 20 20 70 43 78 2d 3e  or);.      pCx->
19e20 69 73 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  isTable = 1;.   
19e30 20 7d 0a 20 20 7d 0a 20 20 70 43 78 2d 3e 69 73   }.  }.  pCx->is
19e40 4f 72 64 65 72 65 64 20 3d 20 28 70 4f 70 2d 3e  Ordered = (pOp->
19e50 70 35 21 3d 42 54 52 45 45 5f 55 4e 4f 52 44 45  p5!=BTREE_UNORDE
19e60 52 45 44 29 3b 0a 20 20 70 43 78 2d 3e 69 73 49  RED);.  pCx->isI
19e70 6e 64 65 78 20 3d 20 21 70 43 78 2d 3e 69 73 54  ndex = !pCx->isT
19e80 61 62 6c 65 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  able;.  break;.}
19e90 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65  ../* Opcode: Ope
19ea0 6e 50 73 65 75 64 6f 20 50 31 20 50 32 20 50 33  nPseudo P1 P2 P3
19eb0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20   * *.**.** Open 
19ec0 61 20 6e 65 77 20 63 75 72 73 6f 72 20 74 68 61  a new cursor tha
19ed0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 61  t points to a fa
19ee0 6b 65 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f  ke table that co
19ef0 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 0a  ntains a single.
19f00 2a 2a 20 72 6f 77 20 6f 66 20 64 61 74 61 2e 20  ** row of data. 
19f10 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
19f20 74 68 61 74 20 6f 6e 65 20 72 6f 77 20 69 6e 20  that one row in 
19f30 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6d  the content of m
19f40 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 73 74 65  emory.** registe
19f50 72 20 50 32 2e 20 20 49 6e 20 6f 74 68 65 72 20  r P2.  In other 
19f60 77 6f 72 64 73 2c 20 63 75 72 73 6f 72 20 50 31  words, cursor P1
19f70 20 62 65 63 6f 6d 65 73 20 61 6e 20 61 6c 69 61   becomes an alia
19f80 73 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 4d 45  s for the .** ME
19f90 4d 5f 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 20 63  M_Blob content c
19fa0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 72 65 67 69  ontained in regi
19fb0 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 41  ster P2..**.** A
19fc0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 63 72   pseudo-table cr
19fd0 65 61 74 65 64 20 62 79 20 74 68 69 73 20 6f 70  eated by this op
19fe0 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20  code is used to 
19ff0 68 6f 6c 64 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  hold a single.**
1a000 20 72 6f 77 20 6f 75 74 70 75 74 20 66 72 6f 6d   row output from
1a010 20 74 68 65 20 73 6f 72 74 65 72 20 73 6f 20 74   the sorter so t
1a020 68 61 74 20 74 68 65 20 72 6f 77 20 63 61 6e 20  hat the row can 
1a030 62 65 20 64 65 63 6f 6d 70 6f 73 65 64 20 69 6e  be decomposed in
1a040 74 6f 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  to.** individual
1a050 20 63 6f 6c 75 6d 6e 73 20 75 73 69 6e 67 20 74   columns using t
1a060 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63  he OP_Column opc
1a070 6f 64 65 2e 20 20 54 68 65 20 4f 50 5f 43 6f 6c  ode.  The OP_Col
1a080 75 6d 6e 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73  umn opcode.** is
1a090 20 74 68 65 20 6f 6e 6c 79 20 63 75 72 73 6f 72   the only cursor
1a0a0 20 6f 70 63 6f 64 65 20 74 68 61 74 20 77 6f 72   opcode that wor
1a0b0 6b 73 20 77 69 74 68 20 61 20 70 73 65 75 64 6f  ks with a pseudo
1a0c0 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 50 33  -table..**.** P3
1a0d0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1a0e0 66 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  f fields in the 
1a0f0 72 65 63 6f 72 64 73 20 74 68 61 74 20 77 69 6c  records that wil
1a100 6c 20 62 65 20 73 74 6f 72 65 64 20 62 79 0a 2a  l be stored by.*
1a110 2a 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62  * the pseudo-tab
1a120 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f  le..*/.case OP_O
1a130 70 65 6e 50 73 65 75 64 6f 3a 20 7b 0a 20 20 56  penPseudo: {.  V
1a140 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a  dbeCursor *pCx;.
1a150 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1a160 70 31 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20 3d  p1>=0 );.  pCx =
1a170 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
1a180 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  p, pOp->p1, pOp-
1a190 3e 70 33 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 69  >p3, -1, 0);.  i
1a1a0 66 28 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f  f( pCx==0 ) goto
1a1b0 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e   no_mem;.  pCx->
1a1c0 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70  nullRow = 1;.  p
1a1d0 43 78 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52  Cx->pseudoTableR
1a1e0 65 67 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  eg = pOp->p2;.  
1a1f0 70 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20 31  pCx->isTable = 1
1a200 3b 0a 20 20 70 43 78 2d 3e 69 73 49 6e 64 65 78  ;.  pCx->isIndex
1a210 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d   = 0;.  break;.}
1a220 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6c 6f  ../* Opcode: Clo
1a230 73 65 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  se P1 * * * *.**
1a240 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
1a250 6f 72 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70  or previously op
1a260 65 6e 65 64 20 61 73 20 50 31 2e 20 20 49 66 20  ened as P1.  If 
1a270 50 31 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 75 72  P1 is not.** cur
1a280 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 74 68 69  rently open, thi
1a290 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  s instruction is
1a2a0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63 61 73   a no-op..*/.cas
1a2b0 65 20 4f 50 5f 43 6c 6f 73 65 3a 20 7b 0a 20 20  e OP_Close: {.  
1a2c0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
1a2d0 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
1a2e0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 73 71  >nCursor );.  sq
1a2f0 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
1a300 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43 73 72 5b  sor(p, p->apCsr[
1a310 70 4f 70 2d 3e 70 31 5d 29 3b 0a 20 20 70 2d 3e  pOp->p1]);.  p->
1a320 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 20 3d  apCsr[pOp->p1] =
1a330 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   0;.  break;.}..
1a340 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 47  /* Opcode: SeekG
1a350 65 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  e P1 P2 P3 P4 *.
1a360 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20  **.** If cursor 
1a370 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20  P1 refers to an 
1a380 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65  SQL table (B-Tre
1a390 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74 65  e that uses inte
1a3a0 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75  ger keys), .** u
1a3b0 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  se the value in 
1a3c0 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20 74  register P3 as t
1a3d0 68 65 20 6b 65 79 2e 20 20 49 66 20 63 75 72 73  he key.  If curs
1a3e0 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a  or P1 refers .**
1a3f0 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
1a400 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 65  , then P3 is the
1a410 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   first in an arr
1a420 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 65  ay of P4 registe
1a430 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  rs .** that are 
1a440 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63  used as an unpac
1a450 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a  ked index key. .
1a460 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e  **.** Reposition
1a470 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68   cursor P1 so th
1a480 61 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  at  it points to
1a490 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e   the smallest en
1a4a0 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20  try that .** is 
1a4b0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1a4c0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79  equal to the key
1a4d0 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65   value. If there
1a4e0 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20   are no records 
1a4f0 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
1a500 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1a510 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e   key and P2 is n
1a520 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75  ot zero, then ju
1a530 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  mp to P2..**.** 
1a540 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c  See also: Found,
1a550 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73 74 69   NotFound, Disti
1a560 6e 63 74 2c 20 53 65 65 6b 4c 74 2c 20 53 65 65  nct, SeekLt, See
1a570 6b 47 74 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f  kGt, SeekLe.*/./
1a580 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 47 74  * Opcode: SeekGt
1a590 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a   P1 P2 P3 P4 *.*
1a5a0 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50  *.** If cursor P
1a5b0 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53  1 refers to an S
1a5c0 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65  QL table (B-Tree
1a5d0 20 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67   that uses integ
1a5e0 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73  er keys), .** us
1a5f0 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  e the value in r
1a600 65 67 69 73 74 65 72 20 50 33 20 61 73 20 61 20  egister P3 as a 
1a610 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72 20 50  key. If cursor P
1a620 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20  1 refers .** to 
1a630 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68  an SQL index, th
1a640 65 6e 20 50 33 20 69 73 20 74 68 65 20 66 69 72  en P3 is the fir
1a650 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  st in an array o
1a660 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20 0a  f P4 registers .
1a670 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ** that are used
1a680 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20   as an unpacked 
1a690 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a  index key. .**.*
1a6a0 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72  * Reposition cur
1a6b0 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 20  sor P1 so that  
1a6c0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
1a6d0 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72 79 20   smallest entry 
1a6e0 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72 65 61  that .** is grea
1a6f0 74 65 72 20 74 68 61 6e 20 74 68 65 20 6b 65 79  ter than the key
1a700 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65   value. If there
1a710 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20   are no records 
1a720 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a  greater than .**
1a730 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20   the key and P2 
1a740 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
1a750 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a  n jump to P2..**
1a760 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f  .** See also: Fo
1a770 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44  und, NotFound, D
1a780 69 73 74 69 6e 63 74 2c 20 53 65 65 6b 4c 74 2c  istinct, SeekLt,
1a790 20 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a   SeekGe, SeekLe.
1a7a0 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65  */./* Opcode: Se
1a7b0 65 6b 4c 74 20 50 31 20 50 32 20 50 33 20 50 34  ekLt P1 P2 P3 P4
1a7c0 20 2a 20 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72   * .**.** If cur
1a7d0 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f  sor P1 refers to
1a7e0 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42   an SQL table (B
1a7f0 2d 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20  -Tree that uses 
1a800 69 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a  integer keys), .
1a810 2a 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65  ** use the value
1a820 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20   in register P3 
1a830 61 73 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72  as a key. If cur
1a840 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a  sor P1 refers .*
1a850 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  * to an SQL inde
1a860 78 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68  x, then P3 is th
1a870 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
1a880 72 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74  ray of P4 regist
1a890 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65  ers .** that are
1a8a0 20 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61   used as an unpa
1a8b0 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20  cked index key. 
1a8c0 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f  .**.** Repositio
1a8d0 6e 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74  n cursor P1 so t
1a8e0 68 61 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74  hat  it points t
1a8f0 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e  o the largest en
1a900 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20  try that .** is 
1a910 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6b 65  less than the ke
1a920 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72  y value. If ther
1a930 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73  e are no records
1a940 20 6c 65 73 73 20 74 68 61 6e 20 0a 2a 2a 20 74   less than .** t
1a950 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73  he key and P2 is
1a960 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
1a970 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a  jump to P2..**.*
1a980 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e  * See also: Foun
1a990 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73  d, NotFound, Dis
1a9a0 74 69 6e 63 74 2c 20 53 65 65 6b 47 74 2c 20 53  tinct, SeekGt, S
1a9b0 65 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f  eekGe, SeekLe.*/
1a9c0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b  ./* Opcode: Seek
1a9d0 4c 65 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  Le P1 P2 P3 P4 *
1a9e0 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  .**.** If cursor
1a9f0 20 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e   P1 refers to an
1aa00 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72   SQL table (B-Tr
1aa10 65 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74  ee that uses int
1aa20 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20  eger keys), .** 
1aa30 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  use the value in
1aa40 20 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20   register P3 as 
1aa50 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72  a key. If cursor
1aa60 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74   P1 refers .** t
1aa70 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20  o an SQL index, 
1aa80 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66  then P3 is the f
1aa90 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
1aaa0 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73   of P4 registers
1aab0 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73   .** that are us
1aac0 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65  ed as an unpacke
1aad0 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a  d index key. .**
1aae0 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63  .** Reposition c
1aaf0 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
1ab00 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
1ab10 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20  e largest entry 
1ab20 74 68 61 74 20 0a 2a 2a 20 69 73 20 6c 65 73 73  that .** is less
1ab30 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1ab40 6f 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e  o the key value.
1ab50 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1ab60 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 6c 65 73   records .** les
1ab70 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
1ab80 74 6f 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50  to the key and P
1ab90 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  2 is not zero, t
1aba0 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a  hen jump to P2..
1abb0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1abc0 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c  Found, NotFound,
1abd0 20 44 69 73 74 69 6e 63 74 2c 20 53 65 65 6b 47   Distinct, SeekG
1abe0 74 2c 20 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c  t, SeekGe, SeekL
1abf0 74 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65  t.*/.case OP_See
1ac00 6b 4c 74 3a 20 20 20 20 20 20 20 20 20 2f 2a 20  kLt:         /* 
1ac10 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73  jump, in3 */.cas
1ac20 65 20 4f 50 5f 53 65 65 6b 4c 65 3a 20 20 20 20  e OP_SeekLe:    
1ac30 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
1ac40 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65  3 */.case OP_See
1ac50 6b 47 65 3a 20 20 20 20 20 20 20 20 20 2f 2a 20  kGe:         /* 
1ac60 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73  jump, in3 */.cas
1ac70 65 20 4f 50 5f 53 65 65 6b 47 74 3a 20 7b 20 20  e OP_SeekGt: {  
1ac80 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
1ac90 33 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 0a  3 */.  int res;.
1aca0 20 20 69 6e 74 20 6f 63 3b 0a 20 20 56 64 62 65    int oc;.  Vdbe
1acb0 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 55 6e  Cursor *pC;.  Un
1acc0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a  packedRecord r;.
1acd0 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20    int nField;.  
1ace0 69 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 2f  i64 iKey;      /
1acf0 2a 20 54 68 65 20 72 6f 77 69 64 20 77 65 20 61  * The rowid we a
1ad00 72 65 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f  re to seek to */
1ad10 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
1ad20 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
1ad30 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
1ad40 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1ad50 32 21 3d 30 20 29 3b 0a 20 20 70 43 20 3d 20 70  2!=0 );.  pC = p
1ad60 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
1ad70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
1ad80 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1ad90 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65  C->pseudoTableRe
1ada0 67 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  g==0 );.  assert
1adb0 28 20 4f 50 5f 53 65 65 6b 4c 65 20 3d 3d 20 4f  ( OP_SeekLe == O
1adc0 50 5f 53 65 65 6b 4c 74 2b 31 20 29 3b 0a 20 20  P_SeekLt+1 );.  
1add0 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 47  assert( OP_SeekG
1ade0 65 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c 74 2b 32  e == OP_SeekLt+2
1adf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50   );.  assert( OP
1ae00 5f 53 65 65 6b 47 74 20 3d 3d 20 4f 50 5f 53 65  _SeekGt == OP_Se
1ae10 65 6b 4c 74 2b 33 20 29 3b 0a 20 20 61 73 73 65  ekLt+3 );.  asse
1ae20 72 74 28 20 70 43 2d 3e 69 73 4f 72 64 65 72 65  rt( pC->isOrdere
1ae30 64 20 29 3b 0a 20 20 69 66 28 20 70 43 2d 3e 70  d );.  if( pC->p
1ae40 43 75 72 73 6f 72 21 3d 30 20 29 7b 0a 20 20 20  Cursor!=0 ){.   
1ae50 20 6f 63 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64   oc = pOp->opcod
1ae60 65 3b 0a 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52  e;.    pC->nullR
1ae70 6f 77 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ow = 0;.    if( 
1ae80 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 7b 0a 20  pC->isTable ){. 
1ae90 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75       /* The inpu
1aea0 74 20 76 61 6c 75 65 20 69 6e 20 50 33 20 6d 69  t value in P3 mi
1aeb0 67 68 74 20 62 65 20 6f 66 20 61 6e 79 20 74 79  ght be of any ty
1aec0 70 65 3a 20 69 6e 74 65 67 65 72 2c 20 72 65 61  pe: integer, rea
1aed0 6c 2c 20 73 74 72 69 6e 67 2c 0a 20 20 20 20 20  l, string,.     
1aee0 20 2a 2a 20 62 6c 6f 62 2c 20 6f 72 20 4e 55 4c   ** blob, or NUL
1aef0 4c 2e 20 20 42 75 74 20 69 74 20 6e 65 65 64 73  L.  But it needs
1af00 20 74 6f 20 62 65 20 61 6e 20 69 6e 74 65 67 65   to be an intege
1af10 72 20 62 65 66 6f 72 65 20 77 65 20 63 61 6e 20  r before we can 
1af20 64 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  do.      ** the 
1af30 73 65 65 6b 2c 20 73 6f 20 63 6f 76 65 72 74 20  seek, so covert 
1af40 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e  it. */.      pIn
1af50 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  3 = &aMem[pOp->p
1af60 33 5d 3b 0a 20 20 20 20 20 20 61 70 70 6c 79 4e  3];.      applyN
1af70 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 70  umericAffinity(p
1af80 49 6e 33 29 3b 0a 20 20 20 20 20 20 69 4b 65 79  In3);.      iKey
1af90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e   = sqlite3VdbeIn
1afa0 74 56 61 6c 75 65 28 70 49 6e 33 29 3b 0a 20 20  tValue(pIn3);.  
1afb0 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56      pC->rowidIsV
1afc0 61 6c 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20  alid = 0;..     
1afd0 20 2f 2a 20 49 66 20 74 68 65 20 50 33 20 76 61   /* If the P3 va
1afe0 6c 75 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  lue could not be
1aff0 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
1b000 61 6e 20 69 6e 74 65 67 65 72 20 77 69 74 68 6f  an integer witho
1b010 75 74 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 73 73  ut.      ** loss
1b020 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c   of information,
1b030 20 74 68 65 6e 20 73 70 65 63 69 61 6c 20 70 72   then special pr
1b040 6f 63 65 73 73 69 6e 67 20 69 73 20 72 65 71 75  ocessing is requ
1b050 69 72 65 64 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20  ired... */.     
1b060 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67   if( (pIn3->flag
1b070 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20  s & MEM_Int)==0 
1b080 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
1b090 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
1b0a0 4d 5f 52 65 61 6c 29 3d 3d 30 20 29 7b 0a 20 20  M_Real)==0 ){.  
1b0b0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1b0c0 65 20 50 33 20 76 61 6c 75 65 20 63 61 6e 6e 6f  e P3 value canno
1b0d0 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  t be converted i
1b0e0 6e 74 6f 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  nto any kind of 
1b0f0 61 20 6e 75 6d 62 65 72 2c 0a 20 20 20 20 20 20  a number,.      
1b100 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
1b110 73 65 65 6b 20 69 73 20 6e 6f 74 20 70 6f 73 73  seek is not poss
1b120 69 62 6c 65 2c 20 73 6f 20 6a 75 6d 70 20 74 6f  ible, so jump to
1b130 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   P2 */.         
1b140 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
1b150 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
1b160 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1b170 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
1b180 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
1b190 20 74 68 65 6e 20 74 68 65 20 50 33 20 76 61 6c   then the P3 val
1b1a0 75 65 20 6d 75 73 74 20 62 65 20 61 20 66 6c 6f  ue must be a flo
1b1b0 61 74 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  ating.        **
1b1c0 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a   point number. *
1b1d0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
1b1e0 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26  ( (pIn3->flags &
1b1f0 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 3b   MEM_Real)!=0 );
1b200 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4b  ..        if( iK
1b210 65 79 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54  ey==SMALLEST_INT
1b220 36 34 20 26 26 20 28 70 49 6e 33 2d 3e 72 3c 28  64 && (pIn3->r<(
1b230 64 6f 75 62 6c 65 29 69 4b 65 79 20 7c 7c 20 70  double)iKey || p
1b240 49 6e 33 2d 3e 72 3e 30 29 20 29 7b 0a 20 20 20  In3->r>0) ){.   
1b250 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33         /* The P3
1b260 20 76 61 6c 75 65 20 69 73 20 74 6f 6f 20 6c 61   value is too la
1b270 72 67 65 20 69 6e 20 6d 61 67 6e 69 74 75 64 65  rge in magnitude
1b280 20 74 6f 20 62 65 20 65 78 70 72 65 73 73 65 64   to be expressed
1b290 20 61 73 20 61 6e 0a 20 20 20 20 20 20 20 20 20   as an.         
1b2a0 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   ** integer. */.
1b2b0 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20            res = 
1b2c0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
1b2d0 20 70 49 6e 33 2d 3e 72 3c 30 20 29 7b 0a 20 20   pIn3->r<0 ){.  
1b2e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 63            if( oc
1b2f0 3e 3d 4f 50 5f 53 65 65 6b 47 65 20 29 7b 20 20  >=OP_SeekGe ){  
1b300 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53  assert( oc==OP_S
1b310 65 65 6b 47 65 20 7c 7c 20 6f 63 3d 3d 4f 50 5f  eekGe || oc==OP_
1b320 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 20 20  SeekGt );.      
1b330 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1b340 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 70  ite3BtreeFirst(p
1b350 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73  C->pCursor, &res
1b360 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1b370 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b380 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  OK ) goto abort_
1b390 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
1b3a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b3b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b3c0 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 63 3c           if( oc<
1b3d0 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 7b 20 20 61  =OP_SeekLe ){  a
1b3e0 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65  ssert( oc==OP_Se
1b3f0 65 6b 4c 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53  ekLt || oc==OP_S
1b400 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 20 20 20  eekLe );.       
1b410 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1b420 74 65 33 42 74 72 65 65 4c 61 73 74 28 70 43 2d  te3BtreeLast(pC-
1b430 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b  >pCursor, &res);
1b440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1b450 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b460 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
1b470 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
1b480 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b490 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1b4a0 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
1b4b0 20 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d         pc = pOp-
1b4c0 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  >p2 - 1;.       
1b4d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
1b4e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1b4f0 6c 73 65 20 69 66 28 20 6f 63 3d 3d 4f 50 5f 53  lse if( oc==OP_S
1b500 65 65 6b 4c 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f  eekLt || oc==OP_
1b510 53 65 65 6b 47 65 20 29 7b 0a 20 20 20 20 20 20  SeekGe ){.      
1b520 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 63      /* Use the c
1b530 65 69 6c 69 6e 67 28 29 20 66 75 6e 63 74 69 6f  eiling() functio
1b540 6e 20 74 6f 20 63 6f 6e 76 65 72 74 20 72 65 61  n to convert rea
1b550 6c 2d 3e 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  l->int */.      
1b560 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e 72 20      if( pIn3->r 
1b570 3e 20 28 64 6f 75 62 6c 65 29 69 4b 65 79 20 29  > (double)iKey )
1b580 20 69 4b 65 79 2b 2b 3b 0a 20 20 20 20 20 20 20   iKey++;.       
1b590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b5a0 20 20 2f 2a 20 55 73 65 20 74 68 65 20 66 6c 6f    /* Use the flo
1b5b0 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  or() function to
1b5c0 20 63 6f 6e 76 65 72 74 20 72 65 61 6c 2d 3e 69   convert real->i
1b5d0 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nt */.          
1b5e0 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53  assert( oc==OP_S
1b5f0 65 65 6b 4c 65 20 7c 7c 20 6f 63 3d 3d 4f 50 5f  eekLe || oc==OP_
1b600 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 20 20  SeekGt );.      
1b610 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e 72 20      if( pIn3->r 
1b620 3c 20 28 64 6f 75 62 6c 65 29 69 4b 65 79 20 29  < (double)iKey )
1b630 20 69 4b 65 79 2d 2d 3b 0a 20 20 20 20 20 20 20   iKey--;.       
1b640 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20   }.      } .    
1b650 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1b660 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
1b670 64 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30  d(pC->pCursor, 0
1b680 2c 20 28 75 36 34 29 69 4b 65 79 2c 20 30 2c 20  , (u64)iKey, 0, 
1b690 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28  &res);.      if(
1b6a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b6b0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61  {.        goto a
1b6c0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
1b6d0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
1b6e0 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
1b6f0 20 20 20 20 20 20 20 70 43 2d 3e 72 6f 77 69 64         pC->rowid
1b700 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  IsValid = 1;.   
1b710 20 20 20 20 20 70 43 2d 3e 6c 61 73 74 52 6f 77       pC->lastRow
1b720 69 64 20 3d 20 69 4b 65 79 3b 0a 20 20 20 20 20  id = iKey;.     
1b730 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1b740 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70      nField = pOp
1b750 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 20 20 61 73  ->p4.i;.      as
1b760 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
1b770 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20  e==P4_INT32 );. 
1b780 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 69       assert( nFi
1b790 65 6c 64 3e 30 20 29 3b 0a 20 20 20 20 20 20 72  eld>0 );.      r
1b7a0 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e  .pKeyInfo = pC->
1b7b0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pKeyInfo;.      
1b7c0 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  r.nField = (u16)
1b7d0 6e 46 69 65 6c 64 3b 0a 0a 20 20 20 20 20 20 2f  nField;..      /
1b7e0 2a 20 54 68 65 20 6e 65 78 74 20 6c 69 6e 65 20  * The next line 
1b7f0 6f 66 20 63 6f 64 65 20 63 6f 6d 70 75 74 65 73  of code computes
1b800 20 61 73 20 66 6f 6c 6c 6f 77 73 2c 20 6f 6e 6c   as follows, onl
1b810 79 20 66 61 73 74 65 72 3a 0a 20 20 20 20 20 20  y faster:.      
1b820 2a 2a 20 20 20 69 66 28 20 6f 63 3d 3d 4f 50 5f  **   if( oc==OP_
1b830 53 65 65 6b 47 74 20 7c 7c 20 6f 63 3d 3d 4f 50  SeekGt || oc==OP
1b840 5f 53 65 65 6b 4c 65 20 29 7b 0a 20 20 20 20 20  _SeekLe ){.     
1b850 20 2a 2a 20 20 20 20 20 72 2e 66 6c 61 67 73 20   **     r.flags 
1b860 3d 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b  = UNPACKED_INCRK
1b870 45 59 3b 0a 20 20 20 20 20 20 2a 2a 20 20 20 7d  EY;.      **   }
1b880 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 2a 20 20  else{.      **  
1b890 20 20 20 72 2e 66 6c 61 67 73 20 3d 20 30 3b 0a     r.flags = 0;.
1b8a0 20 20 20 20 20 20 2a 2a 20 20 20 7d 0a 20 20 20        **   }.   
1b8b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 2e 66 6c     */.      r.fl
1b8c0 61 67 73 20 3d 20 28 75 31 36 29 28 55 4e 50 41  ags = (u16)(UNPA
1b8d0 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 2a 20 28  CKED_INCRKEY * (
1b8e0 31 20 26 20 28 6f 63 20 2d 20 4f 50 5f 53 65 65  1 & (oc - OP_See
1b8f0 6b 4c 74 29 29 29 3b 0a 20 20 20 20 20 20 61 73  kLt)));.      as
1b900 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65  sert( oc!=OP_See
1b910 6b 47 74 20 7c 7c 20 72 2e 66 6c 61 67 73 3d 3d  kGt || r.flags==
1b920 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59  UNPACKED_INCRKEY
1b930 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1b940 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 4c 65 20  ( oc!=OP_SeekLe 
1b950 7c 7c 20 72 2e 66 6c 61 67 73 3d 3d 55 4e 50 41  || r.flags==UNPA
1b960 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 29 3b 0a  CKED_INCRKEY );.
1b970 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63        assert( oc
1b980 21 3d 4f 50 5f 53 65 65 6b 47 65 20 7c 7c 20 72  !=OP_SeekGe || r
1b990 2e 66 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20  .flags==0 );.   
1b9a0 20 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f     assert( oc!=O
1b9b0 50 5f 53 65 65 6b 4c 74 20 7c 7c 20 72 2e 66 6c  P_SeekLt || r.fl
1b9c0 61 67 73 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  ags==0 );..     
1b9d0 20 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b   r.aMem = &aMem[
1b9e0 70 4f 70 2d 3e 70 33 5d 3b 0a 23 69 66 64 65 66  pOp->p3];.#ifdef
1b9f0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1ba00 20 20 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72      { int i; for
1ba10 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64  (i=0; i<r.nField
1ba20 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 6d  ; i++) assert( m
1ba30 65 6d 49 73 56 61 6c 69 64 28 26 72 2e 61 4d 65  emIsValid(&r.aMe
1ba40 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69  m[i]) ); }.#endi
1ba50 66 0a 20 20 20 20 20 20 45 78 70 61 6e 64 42 6c  f.      ExpandBl
1ba60 6f 62 28 72 2e 61 4d 65 6d 29 3b 0a 20 20 20 20  ob(r.aMem);.    
1ba70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1ba80 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
1ba90 64 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26  d(pC->pCursor, &
1baa0 72 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a  r, 0, 0, &res);.
1bab0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1bac0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1bad0 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
1bae0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
1baf0 20 20 7d 0a 20 20 20 20 20 20 70 43 2d 3e 72 6f    }.      pC->ro
1bb00 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a  widIsValid = 0;.
1bb10 20 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e 64 65      }.    pC->de
1bb20 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
1bb30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53  ;.    pC->cacheS
1bb40 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
1bb50 41 4c 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ALE;.#ifdef SQLI
1bb60 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69  TE_TEST.    sqli
1bb70 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
1bb80 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  ++;.#endif.    i
1bb90 66 28 20 6f 63 3e 3d 4f 50 5f 53 65 65 6b 47 65  f( oc>=OP_SeekGe
1bba0 20 29 7b 20 20 61 73 73 65 72 74 28 20 6f 63 3d   ){  assert( oc=
1bbb0 3d 4f 50 5f 53 65 65 6b 47 65 20 7c 7c 20 6f 63  =OP_SeekGe || oc
1bbc0 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20  ==OP_SeekGt );. 
1bbd0 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 7c       if( res<0 |
1bbe0 7c 20 28 72 65 73 3d 3d 30 20 26 26 20 6f 63 3d  | (res==0 && oc=
1bbf0 3d 4f 50 5f 53 65 65 6b 47 74 29 20 29 7b 0a 20  =OP_SeekGt) ){. 
1bc00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1bc10 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 2d  te3BtreeNext(pC-
1bc20 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b  >pCursor, &res);
1bc30 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1bc40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1bc50 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
1bc60 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 43  rror;.        pC
1bc70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d  ->rowidIsValid =
1bc80 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1bc90 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 30  .        res = 0
1bca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1bcb0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1bcc0 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74  t( oc==OP_SeekLt
1bcd0 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c   || oc==OP_SeekL
1bce0 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  e );.      if( r
1bcf0 65 73 3e 30 20 7c 7c 20 28 72 65 73 3d 3d 30 20  es>0 || (res==0 
1bd00 26 26 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74  && oc==OP_SeekLt
1bd10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1bd20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
1bd30 65 76 69 6f 75 73 28 70 43 2d 3e 70 43 75 72 73  evious(pC->pCurs
1bd40 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20  or, &res);.     
1bd50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1bd60 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72  E_OK ) goto abor
1bd70 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
1bd80 20 20 20 20 20 20 20 20 70 43 2d 3e 72 6f 77 69          pC->rowi
1bd90 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  dIsValid = 0;.  
1bda0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bdb0 20 20 20 2f 2a 20 72 65 73 20 6d 69 67 68 74 20     /* res might 
1bdc0 62 65 20 6e 65 67 61 74 69 76 65 20 62 65 63 61  be negative beca
1bdd0 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 69 73  use the table is
1bde0 20 65 6d 70 74 79 2e 20 20 43 68 65 63 6b 20 74   empty.  Check t
1bdf0 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 65  o.        ** see
1be00 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
1be10 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  case..        */
1be20 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 73  .        res = s
1be30 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 70  qlite3BtreeEof(p
1be40 43 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20  C->pCursor);.   
1be50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
1be60 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30  ssert( pOp->p2>0
1be70 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20   );.    if( res 
1be80 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f  ){.      pc = pO
1be90 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 7d  p->p2 - 1;.    }
1bea0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1beb0 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
1bec0 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
1bed0 20 6f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   open the sqlite
1bee0 33 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20  3_master table. 
1bef0 20 20 20 2a 2a 20 66 6f 72 20 72 65 61 64 20 61     ** for read a
1bf00 63 63 65 73 73 20 72 65 74 75 72 6e 73 20 53 51  ccess returns SQ
1bf10 4c 49 54 45 5f 45 4d 50 54 59 2e 20 49 6e 20 74  LITE_EMPTY. In t
1bf20 68 69 73 20 63 61 73 65 20 61 6c 77 61 79 73 0a  his case always.
1bf30 20 20 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20      ** take the 
1bf40 6a 75 6d 70 20 28 73 69 6e 63 65 20 74 68 65 72  jump (since ther
1bf50 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73  e are no records
1bf60 20 69 6e 20 74 68 65 20 74 61 62 6c 65 29 2e 0a   in the table)..
1bf70 20 20 20 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20      */.    pc = 
1bf80 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d  pOp->p2 - 1;.  }
1bf90 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
1bfa0 4f 70 63 6f 64 65 3a 20 53 65 65 6b 20 50 31 20  Opcode: Seek P1 
1bfb0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50  P2 * * *.**.** P
1bfc0 31 20 69 73 20 61 6e 20 6f 70 65 6e 20 74 61 62  1 is an open tab
1bfd0 6c 65 20 63 75 72 73 6f 72 20 61 6e 64 20 50 32  le cursor and P2
1bfe0 20 69 73 20 61 20 72 6f 77 69 64 20 69 6e 74 65   is a rowid inte
1bff0 67 65 72 2e 20 20 41 72 72 61 6e 67 65 0a 2a 2a  ger.  Arrange.**
1c000 20 66 6f 72 20 50 31 20 74 6f 20 6d 6f 76 65 20   for P1 to move 
1c010 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
1c020 73 20 74 6f 20 74 68 65 20 72 6f 77 69 64 20 67  s to the rowid g
1c030 69 76 65 6e 20 62 79 20 50 32 2e 0a 2a 2a 0a 2a  iven by P2..**.*
1c040 2a 20 54 68 69 73 20 69 73 20 61 63 74 75 61 6c  * This is actual
1c050 6c 79 20 61 20 64 65 66 65 72 72 65 64 20 73 65  ly a deferred se
1c060 65 6b 2e 20 20 4e 6f 74 68 69 6e 67 20 61 63 74  ek.  Nothing act
1c070 75 61 6c 6c 79 20 68 61 70 70 65 6e 73 20 75 6e  ually happens un
1c080 74 69 6c 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f  til.** the curso
1c090 72 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  r is used to rea
1c0a0 64 20 61 20 72 65 63 6f 72 64 2e 20 20 54 68 61  d a record.  Tha
1c0b0 74 20 77 61 79 2c 20 69 66 20 6e 6f 20 72 65 61  t way, if no rea
1c0c0 64 73 0a 2a 2a 20 6f 63 63 75 72 2c 20 6e 6f 20  ds.** occur, no 
1c0d0 75 6e 6e 65 63 65 73 73 61 72 79 20 49 2f 4f 20  unnecessary I/O 
1c0e0 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 63 61 73 65  happens..*/.case
1c0f0 20 4f 50 5f 53 65 65 6b 3a 20 7b 20 20 20 20 2f   OP_Seek: {    /
1c100 2a 20 69 6e 32 20 2a 2f 0a 20 20 56 64 62 65 43  * in2 */.  VdbeC
1c110 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 61 73  ursor *pC;..  as
1c120 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
1c130 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
1c140 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
1c150 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
1c160 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
1c170 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  !=0 );.  if( ALW
1c180 41 59 53 28 70 43 2d 3e 70 43 75 72 73 6f 72 21  AYS(pC->pCursor!
1c190 3d 30 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =0) ){.    asser
1c1a0 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29  t( pC->isTable )
1c1b0 3b 0a 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f  ;.    pC->nullRo
1c1c0 77 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e 32 20  w = 0;.    pIn2 
1c1d0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
1c1e0 3b 0a 20 20 20 20 70 43 2d 3e 6d 6f 76 65 74 6f  ;.    pC->moveto
1c1f0 54 61 72 67 65 74 20 3d 20 73 71 6c 69 74 65 33  Target = sqlite3
1c200 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e  VdbeIntValue(pIn
1c210 32 29 3b 0a 20 20 20 20 70 43 2d 3e 72 6f 77 69  2);.    pC->rowi
1c220 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  dIsValid = 0;.  
1c230 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f    pC->deferredMo
1c240 76 65 74 6f 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  veto = 1;.  }.  
1c250 62 72 65 61 6b 3b 0a 7d 0a 20 20 0a 0a 2f 2a 20  break;.}.  ../* 
1c260 4f 70 63 6f 64 65 3a 20 46 6f 75 6e 64 20 50 31  Opcode: Found P1
1c270 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a   P2 P3 P4 *.**.*
1c280 2a 20 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20  * If P4==0 then 
1c290 72 65 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64  register P3 hold
1c2a0 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75  s a blob constru
1c2b0 63 74 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f  cted by MakeReco
1c2c0 72 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20  rd.  If.** P4>0 
1c2d0 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33  then register P3
1c2e0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 66   is the first of
1c2f0 20 50 34 20 72 65 67 69 73 74 65 72 73 20 74 68   P4 registers th
1c300 61 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63  at form an unpac
1c310 6b 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a  ked.** record..*
1c320 2a 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69  *.** Cursor P1 i
1c330 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74  s on an index bt
1c340 72 65 65 2e 20 20 49 66 20 74 68 65 20 72 65 63  ree.  If the rec
1c350 6f 72 64 20 69 64 65 6e 74 69 66 69 65 64 20 62  ord identified b
1c360 79 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 69  y P3 and P4.** i
1c370 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 61 6e  s a prefix of an
1c380 79 20 65 6e 74 72 79 20 69 6e 20 50 31 20 74 68  y entry in P1 th
1c390 65 6e 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  en a jump is mad
1c3a0 65 20 74 6f 20 50 32 20 61 6e 64 0a 2a 2a 20 50  e to P2 and.** P
1c3b0 31 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  1 is left pointi
1c3c0 6e 67 20 61 74 20 74 68 65 20 6d 61 74 63 68 69  ng at the matchi
1c3d0 6e 67 20 65 6e 74 72 79 2e 0a 2a 2f 0a 2f 2a 20  ng entry..*/./* 
1c3e0 4f 70 63 6f 64 65 3a 20 4e 6f 74 46 6f 75 6e 64  Opcode: NotFound
1c3f0 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a   P1 P2 P3 P4 *.*
1c400 2a 0a 2a 2a 20 49 66 20 50 34 3d 3d 30 20 74 68  *.** If P4==0 th
1c410 65 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 68  en register P3 h
1c420 6f 6c 64 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73  olds a blob cons
1c430 74 72 75 63 74 65 64 20 62 79 20 4d 61 6b 65 52  tructed by MakeR
1c440 65 63 6f 72 64 2e 20 20 49 66 0a 2a 2a 20 50 34  ecord.  If.** P4
1c450 3e 30 20 74 68 65 6e 20 72 65 67 69 73 74 65 72  >0 then register
1c460 20 50 33 20 69 73 20 74 68 65 20 66 69 72 73 74   P3 is the first
1c470 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73   of P4 registers
1c480 20 74 68 61 74 20 66 6f 72 6d 20 61 6e 20 75 6e   that form an un
1c490 70 61 63 6b 65 64 0a 2a 2a 20 72 65 63 6f 72 64  packed.** record
1c4a0 2e 0a 2a 2a 20 0a 2a 2a 20 43 75 72 73 6f 72 20  ..** .** Cursor 
1c4b0 50 31 20 69 73 20 6f 6e 20 61 6e 20 69 6e 64 65  P1 is on an inde
1c4c0 78 20 62 74 72 65 65 2e 20 20 49 66 20 74 68 65  x btree.  If the
1c4d0 20 72 65 63 6f 72 64 20 69 64 65 6e 74 69 66 69   record identifi
1c4e0 65 64 20 62 79 20 50 33 20 61 6e 64 20 50 34 0a  ed by P3 and P4.
1c4f0 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 70 72  ** is not the pr
1c500 65 66 69 78 20 6f 66 20 61 6e 79 20 65 6e 74 72  efix of any entr
1c510 79 20 69 6e 20 50 31 20 74 68 65 6e 20 61 20 6a  y in P1 then a j
1c520 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f 20 50  ump is made to P
1c530 32 2e 20 20 49 66 20 50 31 20 0a 2a 2a 20 64 6f  2.  If P1 .** do
1c540 65 73 20 63 6f 6e 74 61 69 6e 20 61 6e 20 65 6e  es contain an en
1c550 74 72 79 20 77 68 6f 73 65 20 70 72 65 66 69 78  try whose prefix
1c560 20 6d 61 74 63 68 65 73 20 74 68 65 20 50 33 2f   matches the P3/
1c570 50 34 20 72 65 63 6f 72 64 20 74 68 65 6e 20 63  P4 record then c
1c580 6f 6e 74 72 6f 6c 0a 2a 2a 20 66 61 6c 6c 73 20  ontrol.** falls 
1c590 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
1c5a0 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
1c5b0 61 6e 64 20 50 31 20 69 73 20 6c 65 66 74 20 70  and P1 is left p
1c5c0 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 0a 2a  ointing at the.*
1c5d0 2a 20 6d 61 74 63 68 69 6e 67 20 65 6e 74 72 79  * matching entry
1c5e0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
1c5f0 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 45 78 69 73  : Found, NotExis
1c600 74 73 2c 20 49 73 55 6e 69 71 75 65 0a 2a 2f 0a  ts, IsUnique.*/.
1c610 63 61 73 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  case OP_NotFound
1c620 3a 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c  :       /* jump,
1c630 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in3 */.case OP_
1c640 46 6f 75 6e 64 3a 20 7b 20 20 20 20 20 20 20 20  Found: {        
1c650 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a  /* jump, in3 */.
1c660 20 20 69 6e 74 20 61 6c 72 65 61 64 79 45 78 69    int alreadyExi
1c670 73 74 73 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  sts;.  VdbeCurso
1c680 72 20 2a 70 43 3b 0a 20 20 69 6e 74 20 72 65 73  r *pC;.  int res
1c690 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ;.  UnpackedReco
1c6a0 72 64 20 2a 70 49 64 78 4b 65 79 3b 0a 20 20 55  rd *pIdxKey;.  U
1c6b0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72 3b  npackedRecord r;
1c6c0 0a 20 20 63 68 61 72 20 61 54 65 6d 70 52 65 63  .  char aTempRec
1c6d0 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55  [ROUND8(sizeof(U
1c6e0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20  npackedRecord)) 
1c6f0 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 33 20  + sizeof(Mem)*3 
1c700 2b 20 37 5d 3b 0a 0a 23 69 66 64 65 66 20 53 51  + 7];..#ifdef SQ
1c710 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
1c720 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 2b  te3_found_count+
1c730 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 6c 72  +;.#endif..  alr
1c740 65 61 64 79 45 78 69 73 74 73 20 3d 20 30 3b 0a  eadyExists = 0;.
1c750 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1c760 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
1c770 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
1c780 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
1c790 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b  ype==P4_INT32 );
1c7a0 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
1c7b0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
1c7c0 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
1c7d0 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn3 = &aMem[pOp
1c7e0 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 41 4c 57  ->p3];.  if( ALW
1c7f0 41 59 53 28 70 43 2d 3e 70 43 75 72 73 6f 72 21  AYS(pC->pCursor!
1c800 3d 30 29 20 29 7b 0a 0a 20 20 20 20 61 73 73 65  =0) ){..    asse
1c810 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d  rt( pC->isTable=
1c820 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  =0 );.    if( pO
1c830 70 2d 3e 70 34 2e 69 3e 30 20 29 7b 0a 20 20 20  p->p4.i>0 ){.   
1c840 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20     r.pKeyInfo = 
1c850 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  pC->pKeyInfo;.  
1c860 20 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28      r.nField = (
1c870 75 31 36 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20  u16)pOp->p4.i;. 
1c880 20 20 20 20 20 72 2e 61 4d 65 6d 20 3d 20 70 49       r.aMem = pI
1c890 6e 33 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  n3;.#ifdef SQLIT
1c8a0 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 7b 20  E_DEBUG.      { 
1c8b0 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20  int i; for(i=0; 
1c8c0 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29  i<r.nField; i++)
1c8d0 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
1c8e0 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20  lid(&r.aMem[i]) 
1c8f0 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20  ); }.#endif.    
1c900 20 20 72 2e 66 6c 61 67 73 20 3d 20 55 4e 50 41    r.flags = UNPA
1c910 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43  CKED_PREFIX_MATC
1c920 48 3b 0a 20 20 20 20 20 20 70 49 64 78 4b 65 79  H;.      pIdxKey
1c930 20 3d 20 26 72 3b 0a 20 20 20 20 7d 65 6c 73 65   = &r;.    }else
1c940 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1c950 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
1c960 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  M_Blob );.      
1c970 61 73 73 65 72 74 28 20 28 70 49 6e 33 2d 3e 66  assert( (pIn3->f
1c980 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
1c990 3d 3d 30 20 29 3b 20 20 2f 2a 20 7a 65 72 6f 62  ==0 );  /* zerob
1c9a0 6c 6f 62 73 20 61 6c 72 65 61 64 79 20 65 78 70  lobs already exp
1c9b0 61 6e 64 65 64 20 2a 2f 0a 20 20 20 20 20 20 70  anded */.      p
1c9c0 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
1c9d0 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
1c9e0 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 70  (pC->pKeyInfo, p
1c9f0 49 6e 33 2d 3e 6e 2c 20 70 49 6e 33 2d 3e 7a 2c  In3->n, pIn3->z,
1ca00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca20 20 20 20 20 20 20 20 20 20 61 54 65 6d 70 52 65           aTempRe
1ca30 63 2c 20 73 69 7a 65 6f 66 28 61 54 65 6d 70 52  c, sizeof(aTempR
1ca40 65 63 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ec));.      if( 
1ca50 70 49 64 78 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  pIdxKey==0 ){.  
1ca60 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
1ca70 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
1ca80 20 70 49 64 78 4b 65 79 2d 3e 66 6c 61 67 73 20   pIdxKey->flags 
1ca90 7c 3d 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46  |= UNPACKED_PREF
1caa0 49 58 5f 4d 41 54 43 48 3b 0a 20 20 20 20 7d 0a  IX_MATCH;.    }.
1cab0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1cac0 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
1cad0 6b 65 64 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c  ked(pC->pCursor,
1cae0 20 70 49 64 78 4b 65 79 2c 20 30 2c 20 30 2c 20   pIdxKey, 0, 0, 
1caf0 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 70  &res);.    if( p
1cb00 4f 70 2d 3e 70 34 2e 69 3d 3d 30 20 29 7b 0a 20  Op->p4.i==0 ){. 
1cb10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1cb20 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65  DeleteUnpackedRe
1cb30 63 6f 72 64 28 70 49 64 78 4b 65 79 29 3b 0a 20  cord(pIdxKey);. 
1cb40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
1cb50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cb60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1cb70 0a 20 20 20 20 61 6c 72 65 61 64 79 45 78 69 73  .    alreadyExis
1cb80 74 73 20 3d 20 28 72 65 73 3d 3d 30 29 3b 0a 20  ts = (res==0);. 
1cb90 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d     pC->deferredM
1cba0 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70  oveto = 0;.    p
1cbb0 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  C->cacheStatus =
1cbc0 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
1cbd0 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  }.  if( pOp->opc
1cbe0 6f 64 65 3d 3d 4f 50 5f 46 6f 75 6e 64 20 29 7b  ode==OP_Found ){
1cbf0 0a 20 20 20 20 69 66 28 20 61 6c 72 65 61 64 79  .    if( already
1cc00 45 78 69 73 74 73 20 29 20 70 63 20 3d 20 70 4f  Exists ) pc = pO
1cc10 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 65 6c  p->p2 - 1;.  }el
1cc20 73 65 7b 0a 20 20 20 20 69 66 28 20 21 61 6c 72  se{.    if( !alr
1cc30 65 61 64 79 45 78 69 73 74 73 20 29 20 70 63 20  eadyExists ) pc 
1cc40 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
1cc50 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
1cc60 2a 20 4f 70 63 6f 64 65 3a 20 49 73 55 6e 69 71  * Opcode: IsUniq
1cc70 75 65 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  ue P1 P2 P3 P4 *
1cc80 0a 2a 2a 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31  .**.** Cursor P1
1cc90 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69   is open on an i
1cca0 6e 64 65 78 20 62 2d 74 72 65 65 20 2d 20 74 68  ndex b-tree - th
1ccb0 61 74 20 69 73 20 74 6f 20 73 61 79 2c 20 61 20  at is to say, a 
1ccc0 62 74 72 65 65 20 77 68 69 63 68 0a 2a 2a 20 6e  btree which.** n
1ccd0 6f 20 64 61 74 61 20 61 6e 64 20 77 68 65 72 65  o data and where
1cce0 20 74 68 65 20 6b 65 79 20 61 72 65 20 72 65 63   the key are rec
1ccf0 6f 72 64 73 20 67 65 6e 65 72 61 74 65 64 20 62  ords generated b
1cd00 79 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  y OP_MakeRecord 
1cd10 77 69 74 68 0a 2a 2a 20 74 68 65 20 6c 69 73 74  with.** the list
1cd20 20 66 69 65 6c 64 20 62 65 69 6e 67 20 74 68 65   field being the
1cd30 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20 6f   integer ROWID o
1cd40 66 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  f the entry that
1cd50 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 65 6e   the index.** en
1cd60 74 72 79 20 72 65 66 65 72 73 20 74 6f 2e 0a 2a  try refers to..*
1cd70 2a 0a 2a 2a 20 54 68 65 20 50 33 20 72 65 67 69  *.** The P3 regi
1cd80 73 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ster contains an
1cd90 20 69 6e 74 65 67 65 72 20 72 65 63 6f 72 64 20   integer record 
1cda0 6e 75 6d 62 65 72 2e 20 43 61 6c 6c 20 74 68 69  number. Call thi
1cdb0 73 20 72 65 63 6f 72 64 20 0a 2a 2a 20 6e 75 6d  s record .** num
1cdc0 62 65 72 20 52 2e 20 52 65 67 69 73 74 65 72 20  ber R. Register 
1cdd0 50 34 20 69 73 20 74 68 65 20 66 69 72 73 74 20  P4 is the first 
1cde0 69 6e 20 61 20 73 65 74 20 6f 66 20 4e 20 63 6f  in a set of N co
1cdf0 6e 74 69 67 75 6f 75 73 20 72 65 67 69 73 74 65  ntiguous registe
1ce00 72 73 0a 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20  rs.** that make 
1ce10 75 70 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69  up an unpacked i
1ce20 6e 64 65 78 20 6b 65 79 20 74 68 61 74 20 63 61  ndex key that ca
1ce30 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20 63  n be used with c
1ce40 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 20 54 68 65  ursor P1..** The
1ce50 20 76 61 6c 75 65 20 6f 66 20 4e 20 63 61 6e 20   value of N can 
1ce60 62 65 20 69 6e 66 65 72 72 65 64 20 66 72 6f 6d  be inferred from
1ce70 20 74 68 65 20 63 75 72 73 6f 72 2e 20 4e 20 69   the cursor. N i
1ce80 6e 63 6c 75 64 65 73 20 74 68 65 20 72 6f 77 69  ncludes the rowi
1ce90 64 0a 2a 2a 20 76 61 6c 75 65 20 61 70 70 65 6e  d.** value appen
1cea0 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ded to the end o
1ceb0 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f  f the index reco
1cec0 72 64 2e 20 54 68 69 73 20 72 6f 77 69 64 20 76  rd. This rowid v
1ced0 61 6c 75 65 20 6d 61 79 0a 2a 2a 20 6f 72 20 6d  alue may.** or m
1cee0 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 73 61  ay not be the sa
1cef0 6d 65 20 61 73 20 52 2e 0a 2a 2a 0a 2a 2a 20 49  me as R..**.** I
1cf00 66 20 61 6e 79 20 6f 66 20 74 68 65 20 4e 20 72  f any of the N r
1cf10 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69  egisters beginni
1cf20 6e 67 20 77 69 74 68 20 72 65 67 69 73 74 65 72  ng with register
1cf30 20 50 34 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e   P4 contains a N
1cf40 55 4c 4c 0a 2a 2a 20 76 61 6c 75 65 2c 20 6a 75  ULL.** value, ju
1cf50 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
1cf60 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  o P2..**.** Othe
1cf70 72 77 69 73 65 2c 20 74 68 69 73 20 69 6e 73 74  rwise, this inst
1cf80 72 75 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  ruction checks i
1cf90 66 20 63 75 72 73 6f 72 20 50 31 20 63 6f 6e 74  f cursor P1 cont
1cfa0 61 69 6e 73 20 61 6e 20 65 6e 74 72 79 0a 2a 2a  ains an entry.**
1cfb0 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
1cfc0 20 28 4e 2d 31 29 20 66 69 65 6c 64 73 20 6d 61   (N-1) fields ma
1cfd0 74 63 68 20 62 75 74 20 74 68 65 20 72 6f 77 69  tch but the rowi
1cfe0 64 20 76 61 6c 75 65 20 61 74 20 74 68 65 20 65  d value at the e
1cff0 6e 64 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64  nd.** of the ind
1d000 65 78 20 65 6e 74 72 79 20 69 73 20 6e 6f 74 20  ex entry is not 
1d010 52 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  R. If there is n
1d020 6f 20 73 75 63 68 20 65 6e 74 72 79 2c 20 63 6f  o such entry, co
1d030 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 2a 2a 20 74  ntrol jumps.** t
1d040 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32  o instruction P2
1d050 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
1d060 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63 6f   rowid of the co
1d070 6e 66 6c 69 63 74 69 6e 67 20 69 6e 64 65 78 0a  nflicting index.
1d080 2a 2a 20 65 6e 74 72 79 20 69 73 20 63 6f 70 69  ** entry is copi
1d090 65 64 20 74 6f 20 72 65 67 69 73 74 65 72 20 50  ed to register P
1d0a0 33 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 66 61  3 and control fa
1d0b0 6c 6c 73 20 74 68 72 6f 75 67 68 20 74 6f 20 74  lls through to t
1d0c0 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 73 74 72  he next.** instr
1d0d0 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65  uction..**.** Se
1d0e0 65 20 61 6c 73 6f 3a 20 4e 6f 74 46 6f 75 6e 64  e also: NotFound
1d0f0 2c 20 4e 6f 74 45 78 69 73 74 73 2c 20 46 6f 75  , NotExists, Fou
1d100 6e 64 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 73  nd.*/.case OP_Is
1d110 55 6e 69 71 75 65 3a 20 7b 20 20 20 20 20 20 20  Unique: {       
1d120 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f   /* jump, in3 */
1d130 0a 20 20 75 31 36 20 69 69 3b 0a 20 20 56 64 62  .  u16 ii;.  Vdb
1d140 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 20 20  eCursor *pCx;.  
1d150 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
1d160 0a 20 20 75 31 36 20 6e 46 69 65 6c 64 3b 0a 20  .  u16 nField;. 
1d170 20 4d 65 6d 20 2a 61 4d 78 3b 0a 20 20 55 6e 70   Mem *aMx;.  Unp
1d180 61 63 6b 65 64 52 65 63 6f 72 64 20 72 3b 20 20  ackedRecord r;  
1d190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1a0 2f 2a 20 42 2d 54 72 65 65 20 69 6e 64 65 78 20  /* B-Tree index 
1d1b0 73 65 61 72 63 68 20 6b 65 79 20 2a 2f 0a 20 20  search key */.  
1d1c0 69 36 34 20 52 3b 20 20 20 20 20 20 20 20 20 20  i64 R;          
1d1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1e0 20 20 20 2f 2a 20 52 6f 77 69 64 20 73 74 6f 72     /* Rowid stor
1d1f0 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
1d200 33 20 2a 2f 0a 0a 20 20 70 49 6e 33 20 3d 20 26  3 */..  pIn3 = &
1d210 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
1d220 20 61 4d 78 20 3d 20 26 61 4d 65 6d 5b 70 4f 70   aMx = &aMem[pOp
1d230 2d 3e 70 34 2e 69 5d 3b 0a 20 20 2f 2a 20 41 73  ->p4.i];.  /* As
1d240 73 65 72 74 20 74 68 61 74 20 74 68 65 20 76 61  sert that the va
1d250 6c 75 65 73 20 6f 66 20 70 61 72 61 6d 65 74 65  lues of paramete
1d260 72 73 20 50 31 20 61 6e 64 20 50 34 20 61 72 65  rs P1 and P4 are
1d270 20 69 6e 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20   in range. */.  
1d280 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
1d290 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b  ype==P4_INT32 );
1d2a0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1d2b0 70 34 2e 69 3e 30 20 26 26 20 70 4f 70 2d 3e 70  p4.i>0 && pOp->p
1d2c0 34 2e 69 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a  4.i<=p->nMem );.
1d2d0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1d2e0 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
1d2f0 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 0a 20  p->nCursor );.. 
1d300 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 69 6e 64   /* Find the ind
1d310 65 78 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20  ex cursor. */.  
1d320 70 43 78 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70  pCx = p->apCsr[p
1d330 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
1d340 74 28 20 70 43 78 2d 3e 64 65 66 65 72 72 65 64  t( pCx->deferred
1d350 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 70  Moveto==0 );.  p
1d360 43 78 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d  Cx->seekResult =
1d370 20 30 3b 0a 20 20 70 43 78 2d 3e 63 61 63 68 65   0;.  pCx->cache
1d380 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
1d390 54 41 4c 45 3b 0a 20 20 70 43 72 73 72 20 3d 20  TALE;.  pCrsr = 
1d3a0 70 43 78 2d 3e 70 43 75 72 73 6f 72 3b 0a 0a 20  pCx->pCursor;.. 
1d3b0 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68   /* If any of th
1d3c0 65 20 76 61 6c 75 65 73 20 61 72 65 20 4e 55 4c  e values are NUL
1d3d0 4c 2c 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  L, take the jump
1d3e0 2e 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20  . */.  nField = 
1d3f0 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  pCx->pKeyInfo->n
1d400 46 69 65 6c 64 3b 0a 20 20 66 6f 72 28 69 69 3d  Field;.  for(ii=
1d410 30 3b 20 69 69 3c 6e 46 69 65 6c 64 3b 20 69 69  0; ii<nField; ii
1d420 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 4d 78  ++){.    if( aMx
1d430 5b 69 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d  [ii].flags & MEM
1d440 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  _Null ){.      p
1d450 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
1d460 0a 20 20 20 20 20 20 70 43 72 73 72 20 3d 20 30  .      pCrsr = 0
1d470 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d480 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
1d490 74 28 20 28 61 4d 78 5b 6e 46 69 65 6c 64 5d 2e  t( (aMx[nField].
1d4a0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
1d4b0 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  )==0 );..  if( p
1d4c0 43 72 73 72 21 3d 30 20 29 7b 0a 20 20 20 20 2f  Crsr!=0 ){.    /
1d4d0 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 69  * Populate the i
1d4e0 6e 64 65 78 20 73 65 61 72 63 68 20 6b 65 79 2e  ndex search key.
1d4f0 20 2a 2f 0a 20 20 20 20 72 2e 70 4b 65 79 49 6e   */.    r.pKeyIn
1d500 66 6f 20 3d 20 70 43 78 2d 3e 70 4b 65 79 49 6e  fo = pCx->pKeyIn
1d510 66 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64  fo;.    r.nField
1d520 20 3d 20 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20   = nField + 1;. 
1d530 20 20 20 72 2e 66 6c 61 67 73 20 3d 20 55 4e 50     r.flags = UNP
1d540 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45 41  ACKED_PREFIX_SEA
1d550 52 43 48 3b 0a 20 20 20 20 72 2e 61 4d 65 6d 20  RCH;.    r.aMem 
1d560 3d 20 61 4d 78 3b 0a 23 69 66 64 65 66 20 53 51  = aMx;.#ifdef SQ
1d570 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 7b  LITE_DEBUG.    {
1d580 20 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b   int i; for(i=0;
1d590 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b   i<r.nField; i++
1d5a0 29 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56  ) assert( memIsV
1d5b0 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29  alid(&r.aMem[i])
1d5c0 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20   ); }.#endif..  
1d5d0 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
1d5e0 20 76 61 6c 75 65 20 6f 66 20 52 20 66 72 6f 6d   value of R from
1d5f0 20 72 65 67 69 73 74 65 72 20 50 33 2e 20 2a 2f   register P3. */
1d600 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d610 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49  MemIntegerify(pI
1d620 6e 33 29 3b 0a 20 20 20 20 52 20 3d 20 70 49 6e  n3);.    R = pIn
1d630 33 2d 3e 75 2e 69 3b 0a 0a 20 20 20 20 2f 2a 20  3->u.i;..    /* 
1d640 53 65 61 72 63 68 20 74 68 65 20 42 2d 54 72 65  Search the B-Tre
1d650 65 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f 20 63  e index. If no c
1d660 6f 6e 66 6c 69 63 74 69 6e 67 20 72 65 63 6f 72  onflicting recor
1d670 64 20 69 73 20 66 6f 75 6e 64 2c 20 6a 75 6d 70  d is found, jump
1d680 0a 20 20 20 20 2a 2a 20 74 6f 20 50 32 2e 20 4f  .    ** to P2. O
1d690 74 68 65 72 77 69 73 65 2c 20 63 6f 70 79 20 74  therwise, copy t
1d6a0 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
1d6b0 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 65 63 6f  conflicting reco
1d6c0 72 64 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 67  rd to.    ** reg
1d6d0 69 73 74 65 72 20 50 33 20 61 6e 64 20 66 61 6c  ister P3 and fal
1d6e0 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
1d6f0 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
1d700 6e 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n.  */.    rc = 
1d710 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1d720 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 72 73 72  toUnpacked(pCrsr
1d730 2c 20 26 72 2c 20 30 2c 20 30 2c 20 26 70 43 78  , &r, 0, 0, &pCx
1d740 2d 3e 73 65 65 6b 52 65 73 75 6c 74 29 3b 0a 20  ->seekResult);. 
1d750 20 20 20 69 66 28 20 28 72 2e 66 6c 61 67 73 20     if( (r.flags 
1d760 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49  & UNPACKED_PREFI
1d770 58 5f 53 45 41 52 43 48 29 20 7c 7c 20 72 2e 72  X_SEARCH) || r.r
1d780 6f 77 69 64 3d 3d 52 20 29 7b 0a 20 20 20 20 20  owid==R ){.     
1d790 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
1d7a0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1d7b0 20 20 20 20 70 49 6e 33 2d 3e 75 2e 69 20 3d 20      pIn3->u.i = 
1d7c0 72 2e 72 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 20  r.rowid;.    }. 
1d7d0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
1d7e0 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 45 78 69  * Opcode: NotExi
1d7f0 73 74 73 20 50 31 20 50 32 20 50 33 20 2a 20 2a  sts P1 P2 P3 * *
1d800 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 63  .**.** Use the c
1d810 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74  ontent of regist
1d820 65 72 20 50 33 20 61 73 20 61 6e 20 69 6e 74 65  er P3 as an inte
1d830 67 65 72 20 6b 65 79 2e 20 20 49 66 20 61 20 72  ger key.  If a r
1d840 65 63 6f 72 64 20 0a 2a 2a 20 77 69 74 68 20 74  ecord .** with t
1d850 68 61 74 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  hat key does not
1d860 20 65 78 69 73 74 20 69 6e 20 74 61 62 6c 65 20   exist in table 
1d870 6f 66 20 50 31 2c 20 74 68 65 6e 20 6a 75 6d 70  of P1, then jump
1d880 20 74 6f 20 50 32 2e 20 0a 2a 2a 20 49 66 20 74   to P2. .** If t
1d890 68 65 20 72 65 63 6f 72 64 20 64 6f 65 73 20 65  he record does e
1d8a0 78 69 73 74 2c 20 74 68 65 6e 20 66 61 6c 6c 20  xist, then fall 
1d8b0 74 68 72 6f 75 67 68 2e 20 20 54 68 65 20 63 75  through.  The cu
1d8c0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 0a 2a 2a  rsor is left .**
1d8d0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
1d8e0 20 72 65 63 6f 72 64 20 69 66 20 69 74 20 65 78   record if it ex
1d8f0 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ists..**.** The 
1d900 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
1d910 65 6e 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  en this operatio
1d920 6e 20 61 6e 64 20 4e 6f 74 46 6f 75 6e 64 20 69  n and NotFound i
1d930 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 6f  s that this.** o
1d940 70 65 72 61 74 69 6f 6e 20 61 73 73 75 6d 65 73  peration assumes
1d950 20 74 68 65 20 6b 65 79 20 69 73 20 61 6e 20 69   the key is an i
1d960 6e 74 65 67 65 72 20 61 6e 64 20 74 68 61 74 20  nteger and that 
1d970 50 31 20 69 73 20 61 20 74 61 62 6c 65 20 77 68  P1 is a table wh
1d980 65 72 65 61 73 0a 2a 2a 20 4e 6f 74 46 6f 75 6e  ereas.** NotFoun
1d990 64 20 61 73 73 75 6d 65 73 20 6b 65 79 20 69 73  d assumes key is
1d9a0 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63   a blob construc
1d9b0 74 65 64 20 66 72 6f 6d 20 4d 61 6b 65 52 65 63  ted from MakeRec
1d9c0 6f 72 64 20 61 6e 64 0a 2a 2a 20 50 31 20 69 73  ord and.** P1 is
1d9d0 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a   an index..**.**
1d9e0 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64   See also: Found
1d9f0 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 49 73 55 6e  , NotFound, IsUn
1da00 69 71 75 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ique.*/.case OP_
1da10 4e 6f 74 45 78 69 73 74 73 3a 20 7b 20 20 20 20  NotExists: {    
1da20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33      /* jump, in3
1da30 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
1da40 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
1da50 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72   *pCrsr;.  int r
1da60 65 73 3b 0a 20 20 75 36 34 20 69 4b 65 79 3b 0a  es;.  u64 iKey;.
1da70 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b  .  pIn3 = &aMem[
1da80 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65  pOp->p3];.  asse
1da90 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20  rt( pIn3->flags 
1daa0 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 61  & MEM_Int );.  a
1dab0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
1dac0 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
1dad0 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
1dae0 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
1daf0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
1db00 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
1db10 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b  ( pC->isTable );
1db20 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70  .  assert( pC->p
1db30 73 65 75 64 6f 54 61 62 6c 65 52 65 67 3d 3d 30  seudoTableReg==0
1db40 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43   );.  pCrsr = pC
1db50 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  ->pCursor;.  if(
1db60 20 70 43 72 73 72 21 3d 30 20 29 7b 0a 20 20 20   pCrsr!=0 ){.   
1db70 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 4b   res = 0;.    iK
1db80 65 79 20 3d 20 70 49 6e 33 2d 3e 75 2e 69 3b 0a  ey = pIn3->u.i;.
1db90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1dba0 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
1dbb0 6b 65 64 28 70 43 72 73 72 2c 20 30 2c 20 69 4b  ked(pCrsr, 0, iK
1dbc0 65 79 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20  ey, 0, &res);.  
1dbd0 20 20 70 43 2d 3e 6c 61 73 74 52 6f 77 69 64 20    pC->lastRowid 
1dbe0 3d 20 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 20  = pIn3->u.i;.   
1dbf0 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69   pC->rowidIsVali
1dc00 64 20 3d 20 72 65 73 3d 3d 30 20 3f 31 3a 30 3b  d = res==0 ?1:0;
1dc10 0a 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77  .    pC->nullRow
1dc20 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61   = 0;.    pC->ca
1dc30 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
1dc40 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 70 43 2d  E_STALE;.    pC-
1dc50 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
1dc60 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 65 73  = 0;.    if( res
1dc70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 63 20  !=0 ){.      pc 
1dc80 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
1dc90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d       assert( pC-
1dca0 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 3d 3d 30  >rowidIsValid==0
1dcb0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43   );.    }.    pC
1dcc0 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 72  ->seekResult = r
1dcd0 65 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  es;.  }else{.   
1dce0 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
1dcf0 20 77 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   when an attempt
1dd00 20 74 6f 20 6f 70 65 6e 20 61 20 72 65 61 64 20   to open a read 
1dd10 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 0a 20  cursor on the . 
1dd20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73     ** sqlite_mas
1dd30 74 65 72 20 74 61 62 6c 65 20 72 65 74 75 72 6e  ter table return
1dd40 73 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 2e 0a  s SQLITE_EMPTY..
1dd50 20 20 20 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20      */.    pc = 
1dd60 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20  pOp->p2 - 1;.   
1dd70 20 61 73 73 65 72 74 28 20 70 43 2d 3e 72 6f 77   assert( pC->row
1dd80 69 64 49 73 56 61 6c 69 64 3d 3d 30 20 29 3b 0a  idIsValid==0 );.
1dd90 20 20 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75      pC->seekResu
1dda0 6c 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 62 72  lt = 0;.  }.  br
1ddb0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
1ddc0 65 3a 20 53 65 71 75 65 6e 63 65 20 50 31 20 50  e: Sequence P1 P
1ddd0 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 69  2 * * *.**.** Fi
1dde0 6e 64 20 74 68 65 20 6e 65 78 74 20 61 76 61 69  nd the next avai
1ddf0 6c 61 62 6c 65 20 73 65 71 75 65 6e 63 65 20 6e  lable sequence n
1de00 75 6d 62 65 72 20 66 6f 72 20 63 75 72 73 6f 72  umber for cursor
1de10 20 50 31 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68   P1..** Write th
1de20 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65  e sequence numbe
1de30 72 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  r into register 
1de40 50 32 2e 0a 2a 2a 20 54 68 65 20 73 65 71 75 65  P2..** The seque
1de50 6e 63 65 20 6e 75 6d 62 65 72 20 6f 6e 20 74 68  nce number on th
1de60 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 63 72  e cursor is incr
1de70 65 6d 65 6e 74 65 64 20 61 66 74 65 72 20 74 68  emented after th
1de80 69 73 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  is.** instructio
1de90 6e 2e 20 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  n.  .*/.case OP_
1dea0 53 65 71 75 65 6e 63 65 3a 20 7b 20 20 20 20 20  Sequence: {     
1deb0 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72        /* out2-pr
1dec0 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 61 73  erelease */.  as
1ded0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
1dee0 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
1def0 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65  Cursor );.  asse
1df00 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  rt( p->apCsr[pOp
1df10 2d 3e 70 31 5d 21 3d 30 20 29 3b 0a 20 20 70 4f  ->p1]!=0 );.  pO
1df20 75 74 2d 3e 75 2e 69 20 3d 20 70 2d 3e 61 70 43  ut->u.i = p->apC
1df30 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 73 65 71  sr[pOp->p1]->seq
1df40 43 6f 75 6e 74 2b 2b 3b 0a 20 20 62 72 65 61 6b  Count++;.  break
1df50 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ;.}.../* Opcode:
1df60 20 4e 65 77 52 6f 77 69 64 20 50 31 20 50 32 20   NewRowid P1 P2 
1df70 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 47 65 74  P3 * *.**.** Get
1df80 20 61 20 6e 65 77 20 69 6e 74 65 67 65 72 20 72   a new integer r
1df90 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 28 61 2e  ecord number (a.
1dfa0 6b 2e 61 20 22 72 6f 77 69 64 22 29 20 75 73 65  k.a "rowid") use
1dfb0 64 20 61 73 20 74 68 65 20 6b 65 79 20 74 6f 20  d as the key to 
1dfc0 61 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20  a table..** The 
1dfd0 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 69 73  record number is
1dfe0 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20   not previously 
1dff0 75 73 65 64 20 61 73 20 61 20 6b 65 79 20 69 6e  used as a key in
1e000 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1e010 20 74 61 62 6c 65 20 74 68 61 74 20 63 75 72 73   table that curs
1e020 6f 72 20 50 31 20 70 6f 69 6e 74 73 20 74 6f 2e  or P1 points to.
1e030 20 20 54 68 65 20 6e 65 77 20 72 65 63 6f 72 64    The new record
1e040 20 6e 75 6d 62 65 72 20 69 73 20 77 72 69 74 74   number is writt
1e050 65 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  en.** written to
1e060 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
1e070 0a 2a 2a 20 49 66 20 50 33 3e 30 20 74 68 65 6e  .** If P3>0 then
1e080 20 50 33 20 69 73 20 61 20 72 65 67 69 73 74 65   P3 is a registe
1e090 72 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 66 72  r in the root fr
1e0a0 61 6d 65 20 6f 66 20 74 68 69 73 20 56 44 42 45  ame of this VDBE
1e0b0 20 74 68 61 74 20 68 6f 6c 64 73 20 0a 2a 2a 20   that holds .** 
1e0c0 74 68 65 20 6c 61 72 67 65 73 74 20 70 72 65 76  the largest prev
1e0d0 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65 64  iously generated
1e0e0 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20   record number. 
1e0f0 4e 6f 20 6e 65 77 20 72 65 63 6f 72 64 20 6e 75  No new record nu
1e100 6d 62 65 72 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  mbers are.** all
1e110 6f 77 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20  owed to be less 
1e120 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2e  than this value.
1e130 20 57 68 65 6e 20 74 68 69 73 20 76 61 6c 75 65   When this value
1e140 20 72 65 61 63 68 65 73 20 69 74 73 20 6d 61 78   reaches its max
1e150 69 6d 75 6d 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c  imum, .** an SQL
1e160 49 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 69  ITE_FULL error i
1e170 73 20 67 65 6e 65 72 61 74 65 64 2e 20 54 68 65  s generated. The
1e180 20 50 33 20 72 65 67 69 73 74 65 72 20 69 73 20   P3 register is 
1e190 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65  updated with the
1e1a0 20 27 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20   '.** generated 
1e1b0 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20 54  record number. T
1e1c0 68 69 73 20 50 33 20 6d 65 63 68 61 6e 69 73 6d  his P3 mechanism
1e1d0 20 69 73 20 75 73 65 64 20 74 6f 20 68 65 6c 70   is used to help
1e1e0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a   implement the.*
1e1f0 2a 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  * AUTOINCREMENT 
1e200 66 65 61 74 75 72 65 2e 0a 2a 2f 0a 63 61 73 65  feature..*/.case
1e210 20 4f 50 5f 4e 65 77 52 6f 77 69 64 3a 20 7b 20   OP_NewRowid: { 
1e220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
1e230 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a  2-prerelease */.
1e240 20 20 69 36 34 20 76 3b 20 20 20 20 20 20 20 20    i64 v;        
1e250 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e260 6e 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20 56  new rowid */.  V
1e270 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 20  dbeCursor *pC;  
1e280 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
1e290 6f 66 20 74 61 62 6c 65 20 74 6f 20 67 65 74 20  of table to get 
1e2a0 74 68 65 20 6e 65 77 20 72 6f 77 69 64 20 2a 2f  the new rowid */
1e2b0 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20  .  int res;     
1e2c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1e2d0 75 6c 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65  ult of an sqlite
1e2e0 33 42 74 72 65 65 4c 61 73 74 28 29 20 2a 2f 0a  3BtreeLast() */.
1e2f0 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
1e300 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
1e310 74 65 72 20 74 6f 20 6c 69 6d 69 74 20 74 68 65  ter to limit the
1e320 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63   number of searc
1e330 68 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  hes */.  Mem *pM
1e340 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
1e350 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
1e360 69 6e 67 20 6c 61 72 67 65 73 74 20 72 6f 77 69  ing largest rowi
1e370 64 20 66 6f 72 20 41 55 54 4f 49 4e 43 52 45 4d  d for AUTOINCREM
1e380 45 4e 54 20 2a 2f 0a 20 20 56 64 62 65 46 72 61  ENT */.  VdbeFra
1e390 6d 65 20 2a 70 46 72 61 6d 65 3b 20 20 20 20 20  me *pFrame;     
1e3a0 2f 2a 20 52 6f 6f 74 20 66 72 61 6d 65 20 6f 66  /* Root frame of
1e3b0 20 56 44 42 45 20 2a 2f 0a 0a 20 20 76 20 3d 20   VDBE */..  v = 
1e3c0 30 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 20  0;.  res = 0;.  
1e3d0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
1e3e0 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
1e3f0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
1e400 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
1e410 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
1e420 70 43 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  pC!=0 );.  if( N
1e430 45 56 45 52 28 70 43 2d 3e 70 43 75 72 73 6f 72  EVER(pC->pCursor
1e440 3d 3d 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ==0) ){.    /* T
1e450 68 65 20 7a 65 72 6f 20 69 6e 69 74 69 61 6c 69  he zero initiali
1e460 7a 61 74 69 6f 6e 20 61 62 6f 76 65 20 69 73 20  zation above is 
1e470 61 6c 6c 20 74 68 61 74 20 69 73 20 6e 65 65 64  all that is need
1e480 65 64 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ed */.  }else{. 
1e490 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72     /* The next r
1e4a0 6f 77 69 64 20 6f 72 20 72 65 63 6f 72 64 20 6e  owid or record n
1e4b0 75 6d 62 65 72 20 28 64 69 66 66 65 72 65 6e 74  umber (different
1e4c0 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73   terms for the s
1e4d0 61 6d 65 0a 20 20 20 20 2a 2a 20 74 68 69 6e 67  ame.    ** thing
1e4e0 29 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e  ) is obtained in
1e4f0 20 61 20 74 77 6f 2d 73 74 65 70 20 61 6c 67 6f   a two-step algo
1e500 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20  rithm..    **.  
1e510 20 20 2a 2a 20 46 69 72 73 74 20 77 65 20 61 74    ** First we at
1e520 74 65 6d 70 74 20 74 6f 20 66 69 6e 64 20 74 68  tempt to find th
1e530 65 20 6c 61 72 67 65 73 74 20 65 78 69 73 74 69  e largest existi
1e540 6e 67 20 72 6f 77 69 64 20 61 6e 64 20 61 64 64  ng rowid and add
1e550 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 74 6f 20 74   one.    ** to t
1e560 68 61 74 2e 20 20 42 75 74 20 69 66 20 74 68 65  hat.  But if the
1e570 20 6c 61 72 67 65 73 74 20 65 78 69 73 74 69 6e   largest existin
1e580 67 20 72 6f 77 69 64 20 69 73 20 61 6c 72 65 61  g rowid is alrea
1e590 64 79 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 20  dy the maximum. 
1e5a0 20 20 20 2a 2a 20 70 6f 73 69 74 69 76 65 20 69     ** positive i
1e5b0 6e 74 65 67 65 72 2c 20 77 65 20 68 61 76 65 20  nteger, we have 
1e5c0 74 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  to fall through 
1e5d0 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20  to the second.  
1e5e0 20 20 2a 2a 20 70 72 6f 62 61 62 69 6c 69 73 74    ** probabilist
1e5f0 69 63 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20 20  ic algorithm.   
1e600 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
1e610 65 63 6f 6e 64 20 61 6c 67 6f 72 69 74 68 6d 20  econd algorithm 
1e620 69 73 20 74 6f 20 73 65 6c 65 63 74 20 61 20 72  is to select a r
1e630 6f 77 69 64 20 61 74 20 72 61 6e 64 6f 6d 20 61  owid at random a
1e640 6e 64 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a  nd see if.    **
1e650 20 69 74 20 61 6c 72 65 61 64 79 20 65 78 69 73   it already exis
1e660 74 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ts in the table.
1e670 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74    If it does not
1e680 20 65 78 69 73 74 2c 20 77 65 20 68 61 76 65 0a   exist, we have.
1e690 20 20 20 20 2a 2a 20 73 75 63 63 65 65 64 65 64      ** succeeded
1e6a0 2e 20 20 49 66 20 74 68 65 20 72 61 6e 64 6f 6d  .  If the random
1e6b0 20 72 6f 77 69 64 20 64 6f 65 73 20 65 78 69 73   rowid does exis
1e6c0 74 2c 20 77 65 20 73 65 6c 65 63 74 20 61 20 6e  t, we select a n
1e6d0 65 77 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 6e  ew one.    ** an
1e6e0 64 20 74 72 79 20 61 67 61 69 6e 2c 20 75 70 20  d try again, up 
1e6f0 74 6f 20 31 30 30 20 74 69 6d 65 73 2e 0a 20 20  to 100 times..  
1e700 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1e710 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a   pC->isTable );.
1e720 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 33  .#ifdef SQLITE_3
1e730 32 42 49 54 5f 52 4f 57 49 44 0a 23 20 20 20 64  2BIT_ROWID.#   d
1e740 65 66 69 6e 65 20 4d 41 58 5f 52 4f 57 49 44 20  efine MAX_ROWID 
1e750 30 78 37 66 66 66 66 66 66 66 0a 23 65 6c 73 65  0x7fffffff.#else
1e760 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 20 63 6f 6d  .    /* Some com
1e770 70 69 6c 65 72 73 20 63 6f 6d 70 6c 61 69 6e 20  pilers complain 
1e780 61 62 6f 75 74 20 63 6f 6e 73 74 61 6e 74 73 20  about constants 
1e790 6f 66 20 74 68 65 20 66 6f 72 6d 20 30 78 37 66  of the form 0x7f
1e7a0 66 66 66 66 66 66 66 66 66 66 66 66 66 66 2e 0a  ffffffffffffff..
1e7b0 20 20 20 20 2a 2a 20 4f 74 68 65 72 73 20 63 6f      ** Others co
1e7c0 6d 70 6c 61 69 6e 20 61 62 6f 75 74 20 30 78 37  mplain about 0x7
1e7d0 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66  ffffffffffffffff
1e7e0 4c 4c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  LL.  The followi
1e7f0 6e 67 20 6d 61 63 72 6f 20 73 65 65 6d 73 0a 20  ng macro seems. 
1e800 20 20 20 2a 2a 20 74 6f 20 70 72 6f 76 69 64 65     ** to provide
1e810 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 77 68   the constant wh
1e820 69 6c 65 20 6d 61 6b 69 6e 67 20 61 6c 6c 20 63  ile making all c
1e830 6f 6d 70 69 6c 65 72 73 20 68 61 70 70 79 2e 0a  ompilers happy..
1e840 20 20 20 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e      */.#   defin
1e850 65 20 4d 41 58 5f 52 4f 57 49 44 20 20 28 69 36  e MAX_ROWID  (i6
1e860 34 29 28 20 28 28 28 75 36 34 29 30 78 37 66 66  4)( (((u64)0x7ff
1e870 66 66 66 66 66 29 3c 3c 33 32 29 20 7c 20 28 75  fffff)<<32) | (u
1e880 36 34 29 30 78 66 66 66 66 66 66 66 66 20 29 0a  64)0xffffffff ).
1e890 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20  #endif..    if( 
1e8a0 21 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f  !pC->useRandomRo
1e8b0 77 69 64 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  wid ){.      v =
1e8c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1e8d0 43 61 63 68 65 64 52 6f 77 69 64 28 70 43 2d 3e  CachedRowid(pC->
1e8e0 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  pCursor);.      
1e8f0 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
1e900 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e910 42 74 72 65 65 4c 61 73 74 28 70 43 2d 3e 70 43  BtreeLast(pC->pC
1e920 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20  ursor, &res);.  
1e930 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e940 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e950 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
1e960 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
1e970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e980 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
1e990 20 20 20 20 20 76 20 3d 20 31 3b 20 20 20 2f 2a       v = 1;   /*
1e9a0 20 49 4d 50 3a 20 52 2d 36 31 39 31 34 2d 34 38   IMP: R-61914-48
1e9b0 30 37 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  074 */.        }
1e9c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1e9d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1e9e0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
1e9f0 64 28 70 43 2d 3e 70 43 75 72 73 6f 72 29 20 29  d(pC->pCursor) )
1ea00 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1ea10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1ea20 53 69 7a 65 28 70 43 2d 3e 70 43 75 72 73 6f 72  Size(pC->pCursor
1ea30 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20  , &v);.         
1ea40 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1ea50 49 54 45 5f 4f 4b 20 29 3b 20 20 20 2f 2a 20 43  ITE_OK );   /* C
1ea60 61 6e 6e 6f 74 20 66 61 69 6c 20 66 6f 6c 6c 6f  annot fail follo
1ea70 77 69 6e 67 20 42 74 72 65 65 4c 61 73 74 28 29  wing BtreeLast()
1ea80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
1ea90 28 20 76 3d 3d 4d 41 58 5f 52 4f 57 49 44 20 29  ( v==MAX_ROWID )
1eaa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
1eab0 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64  ->useRandomRowid
1eac0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1ead0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1eae0 20 20 20 76 2b 2b 3b 20 20 20 2f 2a 20 49 4d 50     v++;   /* IMP
1eaf0 3a 20 52 2d 32 39 35 33 38 2d 33 34 39 38 37 20  : R-29538-34987 
1eb00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  */.          }. 
1eb10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1eb20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1eb30 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
1eb40 45 4e 54 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ENT.      if( pO
1eb50 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20 20 20 20  p->p3 ){.       
1eb60 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
1eb70 50 33 20 69 73 20 61 20 76 61 6c 69 64 20 6d 65  P3 is a valid me
1eb80 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20  mory cell. */.  
1eb90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
1eba0 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20 20  p->p3>0 );.     
1ebb0 20 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65     if( p->pFrame
1ebc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
1ebd0 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61  r(pFrame=p->pFra
1ebe0 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72  me; pFrame->pPar
1ebf0 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61  ent; pFrame=pFra
1ec00 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  me->pParent);.  
1ec10 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65 72          /* Asser
1ec20 74 20 74 68 61 74 20 50 33 20 69 73 20 61 20 76  t that P3 is a v
1ec30 61 6c 69 64 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  alid memory cell
1ec40 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  . */.          a
1ec50 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d  ssert( pOp->p3<=
1ec60 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pFrame->nMem );.
1ec70 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d            pMem =
1ec80 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70   &pFrame->aMem[p
1ec90 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20 20  Op->p3];.       
1eca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ecb0 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
1ecc0 20 50 33 20 69 73 20 61 20 76 61 6c 69 64 20 6d   P3 is a valid m
1ecd0 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20  emory cell. */. 
1ece0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1ecf0 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65   pOp->p3<=p->nMe
1ed00 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  m );.          p
1ed10 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Mem = &aMem[pOp-
1ed20 3e 70 33 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  >p3];.          
1ed30 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
1ed40 28 70 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20  (p, pMem);.     
1ed50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
1ed60 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
1ed70 70 4d 65 6d 29 20 29 3b 0a 0a 20 20 20 20 20 20  pMem) );..      
1ed80 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
1ed90 28 70 4f 70 2d 3e 70 33 2c 20 70 4d 65 6d 29 3b  (pOp->p3, pMem);
1eda0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1edb0 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66  VdbeMemIntegerif
1edc0 79 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  y(pMem);.       
1edd0 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e   assert( (pMem->
1ede0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
1edf0 21 3d 30 20 29 3b 20 20 2f 2a 20 6d 65 6d 28 50  !=0 );  /* mem(P
1ee00 33 29 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65  3) holds an inte
1ee10 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ger */.        i
1ee20 66 28 20 70 4d 65 6d 2d 3e 75 2e 69 3d 3d 4d 41  f( pMem->u.i==MA
1ee30 58 5f 52 4f 57 49 44 20 7c 7c 20 70 43 2d 3e 75  X_ROWID || pC->u
1ee40 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 29 7b  seRandomRowid ){
1ee50 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1ee60 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 20 20 20 2f  SQLITE_FULL;   /
1ee70 2a 20 49 4d 50 3a 20 52 2d 31 32 32 37 35 2d 36  * IMP: R-12275-6
1ee80 31 33 33 38 20 2a 2f 0a 20 20 20 20 20 20 20 20  1338 */.        
1ee90 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
1eea0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
1eeb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1eec0 20 76 3c 70 4d 65 6d 2d 3e 75 2e 69 2b 31 20 29   v<pMem->u.i+1 )
1eed0 7b 0a 20 20 20 20 20 20 20 20 20 20 76 20 3d 20  {.          v = 
1eee0 70 4d 65 6d 2d 3e 75 2e 69 20 2b 20 31 3b 0a 20  pMem->u.i + 1;. 
1eef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ef00 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 76 3b 0a   pMem->u.i = v;.
1ef10 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
1ef20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1ef30 65 65 53 65 74 43 61 63 68 65 64 52 6f 77 69 64  eeSetCachedRowid
1ef40 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 76 3c  (pC->pCursor, v<
1ef50 4d 41 58 5f 52 4f 57 49 44 20 3f 20 76 2b 31 20  MAX_ROWID ? v+1 
1ef60 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  : 0);.    }.    
1ef70 69 66 28 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f  if( pC->useRando
1ef80 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  mRowid ){.      
1ef90 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  /* IMPLEMENTATIO
1efa0 4e 2d 4f 46 3a 20 52 2d 30 37 36 37 37 2d 34 31  N-OF: R-07677-41
1efb0 38 38 31 20 49 66 20 74 68 65 20 6c 61 72 67 65  881 If the large
1efc0 73 74 20 52 4f 57 49 44 20 69 73 20 65 71 75 61  st ROWID is equa
1efd0 6c 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  l to the.      *
1efe0 2a 20 6c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * largest possib
1eff0 6c 65 20 69 6e 74 65 67 65 72 20 28 39 32 32 33  le integer (9223
1f000 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37 29  372036854775807)
1f010 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
1f020 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 67 69  se.      ** engi
1f030 6e 65 20 73 74 61 72 74 73 20 70 69 63 6b 69 6e  ne starts pickin
1f040 67 20 70 6f 73 69 74 69 76 65 20 63 61 6e 64 69  g positive candi
1f050 64 61 74 65 20 52 4f 57 49 44 73 20 61 74 20 72  date ROWIDs at r
1f060 61 6e 64 6f 6d 20 75 6e 74 69 6c 0a 20 20 20 20  andom until.    
1f070 20 20 2a 2a 20 69 74 20 66 69 6e 64 73 20 6f 6e    ** it finds on
1f080 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 70 72  e that is not pr
1f090 65 76 69 6f 75 73 6c 79 20 75 73 65 64 2e 20 2a  eviously used. *
1f0a0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1f0b0 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 3b 20 20 2f  pOp->p3==0 );  /
1f0c0 2a 20 57 65 20 63 61 6e 6e 6f 74 20 62 65 20 69  * We cannot be i
1f0d0 6e 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20 6d  n random rowid m
1f0e0 6f 64 65 20 69 66 20 74 68 69 73 20 69 73 0a 20  ode if this is. 
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f100 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
1f110 6e 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  n AUTOINCREMENT 
1f120 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  table. */.      
1f130 2f 2a 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  /* on the first 
1f140 61 74 74 65 6d 70 74 2c 20 73 69 6d 70 6c 79 20  attempt, simply 
1f150 64 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  do one more than
1f160 20 70 72 65 76 69 6f 75 73 20 2a 2f 0a 20 20 20   previous */.   
1f170 20 20 20 76 20 3d 20 6c 61 73 74 52 6f 77 69 64     v = lastRowid
1f180 3b 0a 20 20 20 20 20 20 76 20 26 3d 20 28 4d 41  ;.      v &= (MA
1f190 58 5f 52 4f 57 49 44 3e 3e 31 29 3b 20 2f 2a 20  X_ROWID>>1); /* 
1f1a0 65 6e 73 75 72 65 20 64 6f 65 73 6e 27 74 20 67  ensure doesn't g
1f1b0 6f 20 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20  o negative */.  
1f1c0 20 20 20 20 76 2b 2b 3b 20 2f 2a 20 65 6e 73 75      v++; /* ensu
1f1d0 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20  re non-zero */. 
1f1e0 20 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20       cnt = 0;.  
1f1f0 20 20 20 20 77 68 69 6c 65 28 20 20 20 28 28 72      while(   ((r
1f200 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1f210 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
1f220 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28  C->pCursor, 0, (
1f230 75 36 34 29 76 2c 0a 20 20 20 20 20 20 20 20 20  u64)v,.         
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f260 20 20 20 20 20 20 20 20 30 2c 20 26 72 65 73 29          0, &res)
1f270 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20  )==SQLITE_OK).  
1f280 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72 65            && (re
1f290 73 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20  s==0).          
1f2a0 20 20 26 26 20 28 2b 2b 63 6e 74 3c 31 30 30 29    && (++cnt<100)
1f2b0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 6f  ){.        /* co
1f2c0 6c 6c 69 73 69 6f 6e 20 2d 20 74 72 79 20 61 6e  llision - try an
1f2d0 6f 74 68 65 72 20 72 61 6e 64 6f 6d 20 72 6f 77  other random row
1f2e0 69 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  id */.        sq
1f2f0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
1f300 28 73 69 7a 65 6f 66 28 76 29 2c 20 26 76 29 3b  (sizeof(v), &v);
1f310 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6e 74  .        if( cnt
1f320 3c 35 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <5 ){.          
1f330 2f 2a 20 74 72 79 20 22 73 6d 61 6c 6c 22 20 72  /* try "small" r
1f340 61 6e 64 6f 6d 20 72 6f 77 69 64 73 20 66 6f 72  andom rowids for
1f350 20 74 68 65 20 69 6e 69 74 69 61 6c 20 61 74 74   the initial att
1f360 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  empts */.       
1f370 20 20 20 76 20 26 3d 20 30 78 66 66 66 66 66 66     v &= 0xffffff
1f380 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1f390 0a 20 20 20 20 20 20 20 20 20 20 76 20 26 3d 20  .          v &= 
1f3a0 28 4d 41 58 5f 52 4f 57 49 44 3e 3e 31 29 3b 20  (MAX_ROWID>>1); 
1f3b0 2f 2a 20 65 6e 73 75 72 65 20 64 6f 65 73 6e 27  /* ensure doesn'
1f3c0 74 20 67 6f 20 6e 65 67 61 74 69 76 65 20 2a 2f  t go negative */
1f3d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f3e0 20 20 20 76 2b 2b 3b 20 2f 2a 20 65 6e 73 75 72     v++; /* ensur
1f3f0 65 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20  e non-zero */.  
1f400 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1f410 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1f420 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
1f430 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
1f440 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ULL;   /* IMP: R
1f450 2d 33 38 32 31 39 2d 35 33 30 30 32 20 2a 2f 0a  -38219-53002 */.
1f460 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f          goto abo
1f470 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
1f480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1f490 73 73 65 72 74 28 20 76 3e 30 20 29 3b 20 20 2f  ssert( v>0 );  /
1f4a0 2a 20 45 56 3a 20 52 2d 34 30 38 31 32 2d 30 33  * EV: R-40812-03
1f4b0 35 37 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  570 */.    }.   
1f4c0 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69   pC->rowidIsVali
1f4d0 64 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 64  d = 0;.    pC->d
1f4e0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
1f4f0 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65  0;.    pC->cache
1f500 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
1f510 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 70 4f 75 74  TALE;.  }.  pOut
1f520 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 62 72 65  ->u.i = v;.  bre
1f530 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1f540 3a 20 49 6e 73 65 72 74 20 50 31 20 50 32 20 50  : Insert P1 P2 P
1f550 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 57 72  3 P4 P5.**.** Wr
1f560 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
1f570 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 63  o the table of c
1f580 75 72 73 6f 72 20 50 31 2e 20 20 41 20 6e 65 77  ursor P1.  A new
1f590 20 65 6e 74 72 79 20 69 73 0a 2a 2a 20 63 72 65   entry is.** cre
1f5a0 61 74 65 64 20 69 66 20 69 74 20 64 6f 65 73 6e  ated if it doesn
1f5b0 27 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  't already exist
1f5c0 20 6f 72 20 74 68 65 20 64 61 74 61 20 66 6f 72   or the data for
1f5d0 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20   an existing.** 
1f5e0 65 6e 74 72 79 20 69 73 20 6f 76 65 72 77 72 69  entry is overwri
1f5f0 74 74 65 6e 2e 20 20 54 68 65 20 64 61 74 61 20  tten.  The data 
1f600 69 73 20 74 68 65 20 76 61 6c 75 65 20 4d 45 4d  is the value MEM
1f610 5f 42 6c 6f 62 20 73 74 6f 72 65 64 20 69 6e 20  _Blob stored in 
1f620 72 65 67 69 73 74 65 72 0a 2a 2a 20 6e 75 6d 62  register.** numb
1f630 65 72 20 50 32 2e 20 54 68 65 20 6b 65 79 20 69  er P2. The key i
1f640 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
1f650 73 74 65 72 20 50 33 2e 20 54 68 65 20 6b 65 79  ster P3. The key
1f660 20 6d 75 73 74 0a 2a 2a 20 62 65 20 61 20 4d 45   must.** be a ME
1f670 4d 5f 49 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  M_Int..**.** If 
1f680 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  the OPFLAG_NCHAN
1f690 47 45 20 66 6c 61 67 20 6f 66 20 50 35 20 69 73  GE flag of P5 is
1f6a0 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72   set, then the r
1f6b0 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20  ow change count 
1f6c0 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65  is.** incremente
1f6d0 64 20 28 6f 74 68 65 72 77 69 73 65 20 6e 6f 74  d (otherwise not
1f6e0 29 2e 20 20 49 66 20 74 68 65 20 4f 50 46 4c 41  ).  If the OPFLA
1f6f0 47 5f 4c 41 53 54 52 4f 57 49 44 20 66 6c 61 67  G_LASTROWID flag
1f700 20 6f 66 20 50 35 20 69 73 20 73 65 74 2c 0a 2a   of P5 is set,.*
1f710 2a 20 74 68 65 6e 20 72 6f 77 69 64 20 69 73 20  * then rowid is 
1f720 73 74 6f 72 65 64 20 66 6f 72 20 73 75 62 73 65  stored for subse
1f730 71 75 65 6e 74 20 72 65 74 75 72 6e 20 62 79 20  quent return by 
1f740 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6c  the.** sqlite3_l
1f750 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
1f760 28 29 20 66 75 6e 63 74 69 6f 6e 20 28 6f 74 68  () function (oth
1f770 65 72 77 69 73 65 20 69 74 20 69 73 20 75 6e 6d  erwise it is unm
1f780 6f 64 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  odified)..**.** 
1f790 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53  If the OPFLAG_US
1f7a0 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67  ESEEKRESULT flag
1f7b0 20 6f 66 20 50 35 20 69 73 20 73 65 74 20 61 6e   of P5 is set an
1f7c0 64 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  d if the result 
1f7d0 6f 66 0a 2a 2a 20 74 68 65 20 6c 61 73 74 20 73  of.** the last s
1f7e0 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20 28 4f  eek operation (O
1f7f0 50 5f 4e 6f 74 45 78 69 73 74 73 29 20 77 61 73  P_NotExists) was
1f800 20 61 20 73 75 63 63 65 73 73 2c 20 74 68 65 6e   a success, then
1f810 20 74 68 69 73 0a 2a 2a 20 6f 70 65 72 61 74 69   this.** operati
1f820 6f 6e 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65  on will not atte
1f830 6d 70 74 20 74 6f 20 66 69 6e 64 20 74 68 65 20  mpt to find the 
1f840 61 70 70 72 6f 70 72 69 61 74 65 20 72 6f 77 20  appropriate row 
1f850 62 65 66 6f 72 65 20 64 6f 69 6e 67 0a 2a 2a 20  before doing.** 
1f860 74 68 65 20 69 6e 73 65 72 74 20 62 75 74 20 77  the insert but w
1f870 69 6c 6c 20 69 6e 73 74 65 61 64 20 6f 76 65 72  ill instead over
1f880 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 68  write the row th
1f890 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
1f8a0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  .** currently po
1f8b0 69 6e 74 69 6e 67 20 74 6f 2e 20 20 50 72 65 73  inting to.  Pres
1f8c0 75 6d 61 62 6c 79 2c 20 74 68 65 20 70 72 69 6f  umably, the prio
1f8d0 72 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f  r OP_NotExists o
1f8e0 70 63 6f 64 65 0a 2a 2a 20 68 61 73 20 61 6c 72  pcode.** has alr
1f8f0 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20  eady positioned 
1f900 74 68 65 20 63 75 72 73 6f 72 20 63 6f 72 72 65  the cursor corre
1f910 63 74 6c 79 2e 20 20 54 68 69 73 20 69 73 20 61  ctly.  This is a
1f920 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  n optimization.*
1f930 2a 20 74 68 61 74 20 62 6f 6f 73 74 73 20 70 65  * that boosts pe
1f940 72 66 6f 72 6d 61 6e 63 65 20 62 79 20 61 76 6f  rformance by avo
1f950 69 64 69 6e 67 20 72 65 64 75 6e 64 61 6e 74 20  iding redundant 
1f960 73 65 65 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  seeks..**.** If 
1f970 74 68 65 20 4f 50 46 4c 41 47 5f 49 53 55 50 44  the OPFLAG_ISUPD
1f980 41 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ATE flag is set,
1f990 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63 6f 64   then this opcod
1f9a0 65 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 0a  e is part of an.
1f9b0 2a 2a 20 55 50 44 41 54 45 20 6f 70 65 72 61 74  ** UPDATE operat
1f9c0 69 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ion.  Otherwise 
1f9d0 28 69 66 20 74 68 65 20 66 6c 61 67 20 69 73 20  (if the flag is 
1f9e0 63 6c 65 61 72 29 20 74 68 65 6e 20 74 68 69 73  clear) then this
1f9f0 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 70 61   opcode.** is pa
1fa00 72 74 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20  rt of an INSERT 
1fa10 6f 70 65 72 61 74 69 6f 6e 2e 20 20 54 68 65 20  operation.  The 
1fa20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 6f 6e  difference is on
1fa30 6c 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 0a  ly important to.
1fa40 2a 2a 20 74 68 65 20 75 70 64 61 74 65 20 68 6f  ** the update ho
1fa50 6f 6b 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  ok..**.** Parame
1fa60 74 65 72 20 50 34 20 6d 61 79 20 70 6f 69 6e 74  ter P4 may point
1fa70 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
1fa80 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
1fa90 65 2d 6e 61 6d 65 2c 20 6f 72 0a 2a 2a 20 6d 61  e-name, or.** ma
1faa0 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69 74  y be NULL. If it
1fab0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
1fac0 65 6e 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f  en the update-ho
1fad0 6f 6b 20 0a 2a 2a 20 28 73 71 6c 69 74 65 33 2e  ok .** (sqlite3.
1fae0 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 29  xUpdateCallback)
1faf0 20 69 73 20 69 6e 76 6f 6b 65 64 20 66 6f 6c 6c   is invoked foll
1fb00 6f 77 69 6e 67 20 61 20 73 75 63 63 65 73 73 66  owing a successf
1fb10 75 6c 20 69 6e 73 65 72 74 2e 0a 2a 2a 0a 2a 2a  ul insert..**.**
1fb20 20 28 57 41 52 4e 49 4e 47 2f 54 4f 44 4f 3a 20   (WARNING/TODO: 
1fb30 49 66 20 50 31 20 69 73 20 61 20 70 73 65 75 64  If P1 is a pseud
1fb40 6f 2d 63 75 72 73 6f 72 20 61 6e 64 20 50 32 20  o-cursor and P2 
1fb50 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a  is dynamically.*
1fb60 2a 20 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65  * allocated, the
1fb70 6e 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 50  n ownership of P
1fb80 32 20 69 73 20 74 72 61 6e 73 66 65 72 72 65 64  2 is transferred
1fb90 20 74 6f 20 74 68 65 20 70 73 65 75 64 6f 2d 63   to the pseudo-c
1fba0 75 72 73 6f 72 0a 2a 2a 20 61 6e 64 20 72 65 67  ursor.** and reg
1fbb0 69 73 74 65 72 20 50 32 20 62 65 63 6f 6d 65 73  ister P2 becomes
1fbc0 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 49 66 20   ephemeral.  If 
1fbd0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 63 68  the cursor is ch
1fbe0 61 6e 67 65 64 2c 20 74 68 65 0a 2a 2a 20 76 61  anged, the.** va
1fbf0 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20  lue of register 
1fc00 50 32 20 77 69 6c 6c 20 74 68 65 6e 20 63 68 61  P2 will then cha
1fc10 6e 67 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  nge.  Make sure 
1fc20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  this does not.**
1fc30 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
1fc40 65 6d 73 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ems.).**.** This
1fc50 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 6c   instruction onl
1fc60 79 20 77 6f 72 6b 73 20 6f 6e 20 74 61 62 6c 65  y works on table
1fc70 73 2e 20 20 54 68 65 20 65 71 75 69 76 61 6c 65  s.  The equivale
1fc80 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  nt instruction.*
1fc90 2a 20 66 6f 72 20 69 6e 64 69 63 65 73 20 69 73  * for indices is
1fca0 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2e 0a 2a   OP_IdxInsert..*
1fcb0 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 73  /./* Opcode: Ins
1fcc0 65 72 74 49 6e 74 20 50 31 20 50 32 20 50 33 20  ertInt P1 P2 P3 
1fcd0 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73  P4 P5.**.** This
1fce0 20 77 6f 72 6b 73 20 65 78 61 63 74 6c 79 20 6c   works exactly l
1fcf0 69 6b 65 20 4f 50 5f 49 6e 73 65 72 74 20 65 78  ike OP_Insert ex
1fd00 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6b 65  cept that the ke
1fd10 79 20 69 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65  y is the.** inte
1fd20 67 65 72 20 76 61 6c 75 65 20 50 33 2c 20 6e 6f  ger value P3, no
1fd30 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
1fd40 68 65 20 69 6e 74 65 67 65 72 20 73 74 6f 72 65  he integer store
1fd50 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  d in register P3
1fd60 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 73  ..*/.case OP_Ins
1fd70 65 72 74 3a 20 0a 63 61 73 65 20 4f 50 5f 49 6e  ert: .case OP_In
1fd80 73 65 72 74 49 6e 74 3a 20 7b 0a 20 20 4d 65 6d  sertInt: {.  Mem
1fd90 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 2f   *pData;       /
1fda0 2a 20 4d 45 4d 20 63 65 6c 6c 20 68 6f 6c 64 69  * MEM cell holdi
1fdb0 6e 67 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ng data for the 
1fdc0 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73  record to be ins
1fdd0 65 72 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a  erted */.  Mem *
1fde0 70 4b 65 79 3b 20 20 20 20 20 20 20 20 2f 2a 20  pKey;        /* 
1fdf0 4d 45 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67  MEM cell holding
1fe00 20 6b 65 79 20 20 66 6f 72 20 74 68 65 20 72 65   key  for the re
1fe10 63 6f 72 64 20 2a 2f 0a 20 20 69 36 34 20 69 4b  cord */.  i64 iK
1fe20 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ey;         /* T
1fe30 68 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44  he integer ROWID
1fe40 20 6f 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20   or key for the 
1fe50 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73  record to be ins
1fe60 65 72 74 65 64 20 2a 2f 0a 20 20 56 64 62 65 43  erted */.  VdbeC
1fe70 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 2f 2a 20  ursor *pC;   /* 
1fe80 43 75 72 73 6f 72 20 74 6f 20 74 61 62 6c 65 20  Cursor to table 
1fe90 69 6e 74 6f 20 77 68 69 63 68 20 69 6e 73 65 72  into which inser
1fea0 74 20 69 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a  t is written */.
1feb0 20 20 69 6e 74 20 6e 5a 65 72 6f 3b 20 20 20 20    int nZero;    
1fec0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1fed0 20 7a 65 72 6f 2d 62 79 74 65 73 20 74 6f 20 61   zero-bytes to a
1fee0 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73  ppend */.  int s
1fef0 65 65 6b 52 65 73 75 6c 74 3b 20 20 20 2f 2a 20  eekResult;   /* 
1ff00 52 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20  Result of prior 
1ff10 73 65 65 6b 20 6f 72 20 30 20 69 66 20 6e 6f 20  seek or 0 if no 
1ff20 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c  USESEEKRESULT fl
1ff30 61 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ag */.  const ch
1ff40 61 72 20 2a 7a 44 62 3b 20 20 2f 2a 20 64 61 74  ar *zDb;  /* dat
1ff50 61 62 61 73 65 20 6e 61 6d 65 20 2d 20 75 73 65  abase name - use
1ff60 64 20 62 79 20 74 68 65 20 75 70 64 61 74 65 20  d by the update 
1ff70 68 6f 6f 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  hook */.  const 
1ff80 63 68 61 72 20 2a 7a 54 62 6c 3b 20 2f 2a 20 54  char *zTbl; /* T
1ff90 61 62 6c 65 20 6e 61 6d 65 20 2d 20 75 73 65 64  able name - used
1ffa0 20 62 79 20 74 68 65 20 6f 70 64 61 74 65 20 68   by the opdate h
1ffb0 6f 6f 6b 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ook */.  int op;
1ffc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
1ffd0 63 6f 64 65 20 66 6f 72 20 75 70 64 61 74 65 20  code for update 
1ffe0 68 6f 6f 6b 3a 20 53 51 4c 49 54 45 5f 55 50 44  hook: SQLITE_UPD
1fff0 41 54 45 20 6f 72 20 53 51 4c 49 54 45 5f 49 4e  ATE or SQLITE_IN
20000 53 45 52 54 20 2a 2f 0a 0a 20 20 70 44 61 74 61  SERT */..  pData
20010 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
20020 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ];.  assert( pOp
20030 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
20040 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
20050 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73  .  assert( memIs
20060 56 61 6c 69 64 28 70 44 61 74 61 29 20 29 3b 0a  Valid(pData) );.
20070 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
20080 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
20090 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
200a0 73 73 65 72 74 28 20 70 43 2d 3e 70 43 75 72 73  ssert( pC->pCurs
200b0 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  or!=0 );.  asser
200c0 74 28 20 70 43 2d 3e 70 73 65 75 64 6f 54 61 62  t( pC->pseudoTab
200d0 6c 65 52 65 67 3d 3d 30 20 29 3b 0a 20 20 61 73  leReg==0 );.  as
200e0 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c  sert( pC->isTabl
200f0 65 20 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f  e );.  REGISTER_
20100 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70  TRACE(pOp->p2, p
20110 44 61 74 61 29 3b 0a 0a 20 20 69 66 28 20 70 4f  Data);..  if( pO
20120 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  p->opcode==OP_In
20130 73 65 72 74 20 29 7b 0a 20 20 20 20 70 4b 65 79  sert ){.    pKey
20140 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
20150 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
20160 4b 65 79 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Key->flags & MEM
20170 5f 49 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  _Int );.    asse
20180 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70  rt( memIsValid(p
20190 4b 65 79 29 20 29 3b 0a 20 20 20 20 52 45 47 49  Key) );.    REGI
201a0 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
201b0 70 33 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 69  p3, pKey);.    i
201c0 4b 65 79 20 3d 20 70 4b 65 79 2d 3e 75 2e 69 3b  Key = pKey->u.i;
201d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
201e0 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
201f0 65 3d 3d 4f 50 5f 49 6e 73 65 72 74 49 6e 74 20  e==OP_InsertInt 
20200 29 3b 0a 20 20 20 20 69 4b 65 79 20 3d 20 70 4f  );.    iKey = pO
20210 70 2d 3e 70 33 3b 0a 20 20 7d 0a 0a 20 20 69 66  p->p3;.  }..  if
20220 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c  ( pOp->p5 & OPFL
20230 41 47 5f 4e 43 48 41 4e 47 45 20 29 20 70 2d 3e  AG_NCHANGE ) p->
20240 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 69 66 28  nChange++;.  if(
20250 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41   pOp->p5 & OPFLA
20260 47 5f 4c 41 53 54 52 4f 57 49 44 20 29 20 64 62  G_LASTROWID ) db
20270 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6c 61  ->lastRowid = la
20280 73 74 52 6f 77 69 64 20 3d 20 69 4b 65 79 3b 0a  stRowid = iKey;.
20290 20 20 69 66 28 20 70 44 61 74 61 2d 3e 66 6c 61    if( pData->fla
202a0 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  gs & MEM_Null ){
202b0 0a 20 20 20 20 70 44 61 74 61 2d 3e 7a 20 3d 20  .    pData->z = 
202c0 30 3b 0a 20 20 20 20 70 44 61 74 61 2d 3e 6e 20  0;.    pData->n 
202d0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
202e0 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61 2d    assert( pData-
202f0 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 42 6c  >flags & (MEM_Bl
20300 6f 62 7c 4d 45 4d 5f 53 74 72 29 20 29 3b 0a 20  ob|MEM_Str) );. 
20310 20 7d 0a 20 20 73 65 65 6b 52 65 73 75 6c 74 20   }.  seekResult 
20320 3d 20 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50  = ((pOp->p5 & OP
20330 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
20340 4c 54 29 20 3f 20 70 43 2d 3e 73 65 65 6b 52 65  LT) ? pC->seekRe
20350 73 75 6c 74 20 3a 20 30 29 3b 0a 20 20 69 66 28  sult : 0);.  if(
20360 20 70 44 61 74 61 2d 3e 66 6c 61 67 73 20 26 20   pData->flags & 
20370 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
20380 6e 5a 65 72 6f 20 3d 20 70 44 61 74 61 2d 3e 75  nZero = pData->u
20390 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 65 6c 73 65 7b  .nZero;.  }else{
203a0 0a 20 20 20 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a  .    nZero = 0;.
203b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
203c0 65 65 53 65 74 43 61 63 68 65 64 52 6f 77 69 64  eeSetCachedRowid
203d0 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 29  (pC->pCursor, 0)
203e0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
203f0 42 74 72 65 65 49 6e 73 65 72 74 28 70 43 2d 3e  BtreeInsert(pC->
20400 70 43 75 72 73 6f 72 2c 20 30 2c 20 69 4b 65 79  pCursor, 0, iKey
20410 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20420 20 20 20 20 20 20 20 20 20 20 20 20 70 44 61 74              pDat
20430 61 2d 3e 7a 2c 20 70 44 61 74 61 2d 3e 6e 2c 20  a->z, pData->n, 
20440 6e 5a 65 72 6f 2c 0a 20 20 20 20 20 20 20 20 20  nZero,.         
20450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20460 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41   pOp->p5 & OPFLA
20470 47 5f 41 50 50 45 4e 44 2c 20 73 65 65 6b 52 65  G_APPEND, seekRe
20480 73 75 6c 74 0a 20 20 29 3b 0a 20 20 70 43 2d 3e  sult.  );.  pC->
20490 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30  rowidIsValid = 0
204a0 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64  ;.  pC->deferred
204b0 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43  Moveto = 0;.  pC
204c0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
204d0 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 0a 20 20  CACHE_STALE;..  
204e0 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 75 70  /* Invoke the up
204f0 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65 71  date-hook if req
20500 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  uired. */.  if( 
20510 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20520 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c   db->xUpdateCall
20530 62 61 63 6b 20 26 26 20 70 4f 70 2d 3e 70 34 2e  back && pOp->p4.
20540 7a 20 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20 64  z ){.    zDb = d
20550 62 2d 3e 61 44 62 5b 70 43 2d 3e 69 44 62 5d 2e  b->aDb[pC->iDb].
20560 7a 4e 61 6d 65 3b 0a 20 20 20 20 7a 54 62 6c 20  zName;.    zTbl 
20570 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
20580 20 6f 70 20 3d 20 28 28 70 4f 70 2d 3e 70 35 20   op = ((pOp->p5 
20590 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54  & OPFLAG_ISUPDAT
205a0 45 29 20 3f 20 53 51 4c 49 54 45 5f 55 50 44 41  E) ? SQLITE_UPDA
205b0 54 45 20 3a 20 53 51 4c 49 54 45 5f 49 4e 53 45  TE : SQLITE_INSE
205c0 52 54 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  RT);.    assert(
205d0 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a   pC->isTable );.
205e0 20 20 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43      db->xUpdateC
205f0 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 55 70 64  allback(db->pUpd
20600 61 74 65 41 72 67 2c 20 6f 70 2c 20 7a 44 62 2c  ateArg, op, zDb,
20610 20 7a 54 62 6c 2c 20 69 4b 65 79 29 3b 0a 20 20   zTbl, iKey);.  
20620 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 44    assert( pC->iD
20630 62 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 62 72  b>=0 );.  }.  br
20640 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
20650 65 3a 20 44 65 6c 65 74 65 20 50 31 20 50 32 20  e: Delete P1 P2 
20660 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c  * P4 *.**.** Del
20670 65 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 61  ete the record a
20680 74 20 77 68 69 63 68 20 74 68 65 20 50 31 20 63  t which the P1 c
20690 75 72 73 6f 72 20 69 73 20 63 75 72 72 65 6e 74  ursor is current
206a0 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
206b0 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 77 69  ** The cursor wi
206c0 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74  ll be left point
206d0 69 6e 67 20 61 74 20 65 69 74 68 65 72 20 74 68  ing at either th
206e0 65 20 6e 65 78 74 20 6f 72 20 74 68 65 20 70 72  e next or the pr
206f0 65 76 69 6f 75 73 0a 2a 2a 20 72 65 63 6f 72 64  evious.** record
20700 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 49   in the table. I
20710 66 20 69 74 20 69 73 20 6c 65 66 74 20 70 6f 69  f it is left poi
20720 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6e 65 78  nting at the nex
20730 74 20 72 65 63 6f 72 64 2c 20 74 68 65 6e 0a 2a  t record, then.*
20740 2a 20 74 68 65 20 6e 65 78 74 20 4e 65 78 74 20  * the next Next 
20750 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c  instruction will
20760 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 65   be a no-op.  He
20770 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 74 6f 20  nce it is OK to 
20780 64 65 6c 65 74 65 0a 2a 2a 20 61 20 72 65 63 6f  delete.** a reco
20790 72 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  rd from within a
207a0 6e 20 4e 65 78 74 20 6c 6f 6f 70 2e 0a 2a 2a 0a  n Next loop..**.
207b0 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  ** If the OPFLAG
207c0 5f 4e 43 48 41 4e 47 45 20 66 6c 61 67 20 6f 66  _NCHANGE flag of
207d0 20 50 32 20 69 73 20 73 65 74 2c 20 74 68 65 6e   P2 is set, then
207e0 20 74 68 65 20 72 6f 77 20 63 68 61 6e 67 65 20   the row change 
207f0 63 6f 75 6e 74 20 69 73 0a 2a 2a 20 69 6e 63 72  count is.** incr
20800 65 6d 65 6e 74 65 64 20 28 6f 74 68 65 72 77 69  emented (otherwi
20810 73 65 20 6e 6f 74 29 2e 0a 2a 2a 0a 2a 2a 20 50  se not)..**.** P
20820 31 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 70 73  1 must not be ps
20830 65 75 64 6f 2d 74 61 62 6c 65 2e 20 20 49 74 20  eudo-table.  It 
20840 68 61 73 20 74 6f 20 62 65 20 61 20 72 65 61 6c  has to be a real
20850 20 74 61 62 6c 65 20 77 69 74 68 0a 2a 2a 20 6d   table with.** m
20860 75 6c 74 69 70 6c 65 20 72 6f 77 73 2e 0a 2a 2a  ultiple rows..**
20870 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 6e 6f 74  .** If P4 is not
20880 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
20890 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
208a0 65 20 74 61 62 6c 65 20 74 68 61 74 20 50 31 20  e table that P1 
208b0 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  is.** pointing t
208c0 6f 2e 20 20 54 68 65 20 75 70 64 61 74 65 20 68  o.  The update h
208d0 6f 6f 6b 20 77 69 6c 6c 20 62 65 20 69 6e 76 6f  ook will be invo
208e0 6b 65 64 2c 20 69 66 20 69 74 20 65 78 69 73 74  ked, if it exist
208f0 73 2e 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 6e  s..** If P4 is n
20900 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65  ot NULL then the
20910 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73 74 20   P1 cursor must 
20920 68 61 76 65 20 62 65 65 6e 20 70 6f 73 69 74 69  have been positi
20930 6f 6e 65 64 0a 2a 2a 20 75 73 69 6e 67 20 4f 50  oned.** using OP
20940 5f 4e 6f 74 46 6f 75 6e 64 20 70 72 69 6f 72 20  _NotFound prior 
20950 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
20960 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65   opcode..*/.case
20970 20 4f 50 5f 44 65 6c 65 74 65 3a 20 7b 0a 20 20   OP_Delete: {.  
20980 69 36 34 20 69 4b 65 79 3b 0a 20 20 56 64 62 65  i64 iKey;.  Vdbe
20990 43 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 69  Cursor *pC;..  i
209a0 4b 65 79 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  Key = 0;.  asser
209b0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
209c0 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
209d0 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
209e0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
209f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
20a00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
20a10 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 20  ->pCursor!=0 ); 
20a20 20 2f 2a 20 4f 6e 6c 79 20 76 61 6c 69 64 20 66   /* Only valid f
20a30 6f 72 20 72 65 61 6c 20 74 61 62 6c 65 73 2c 20  or real tables, 
20a40 6e 6f 20 70 73 65 75 64 6f 74 61 62 6c 65 73 20  no pseudotables 
20a50 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  */..  /* If the 
20a60 75 70 64 61 74 65 2d 68 6f 6f 6b 20 77 69 6c 6c  update-hook will
20a70 20 62 65 20 69 6e 76 6f 6b 65 64 2c 20 73 65 74   be invoked, set
20a80 20 69 4b 65 79 20 74 6f 20 74 68 65 20 72 6f 77   iKey to the row
20a90 69 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 72  id of the.  ** r
20aa0 6f 77 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ow being deleted
20ab0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
20ac0 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  >xUpdateCallback
20ad0 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b   && pOp->p4.z ){
20ae0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
20af0 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  >isTable );.    
20b00 61 73 73 65 72 74 28 20 70 43 2d 3e 72 6f 77 69  assert( pC->rowi
20b10 64 49 73 56 61 6c 69 64 20 29 3b 20 20 2f 2a 20  dIsValid );  /* 
20b20 6c 61 73 74 52 6f 77 69 64 20 73 65 74 20 62 79  lastRowid set by
20b30 20 70 72 65 76 69 6f 75 73 20 4f 50 5f 4e 6f 74   previous OP_Not
20b40 46 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 69 4b 65  Found */.    iKe
20b50 79 20 3d 20 70 43 2d 3e 6c 61 73 74 52 6f 77 69  y = pC->lastRowi
20b60 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  d;.  }..  /* The
20b70 20 4f 50 5f 44 65 6c 65 74 65 20 6f 70 63 6f 64   OP_Delete opcod
20b80 65 20 61 6c 77 61 79 73 20 66 6f 6c 6c 6f 77 73  e always follows
20b90 20 61 6e 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73   an OP_NotExists
20ba0 20 6f 72 20 4f 50 5f 4c 61 73 74 20 6f 72 0a 20   or OP_Last or. 
20bb0 20 2a 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 6e   ** OP_Column on
20bc0 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 20   the same table 
20bd0 77 69 74 68 6f 75 74 20 61 6e 79 20 69 6e 74 65  without any inte
20be0 72 76 65 6e 69 6e 67 20 6f 70 65 72 61 74 69 6f  rvening operatio
20bf0 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 6d 69 67  ns that.  ** mig
20c00 68 74 20 6d 6f 76 65 20 6f 72 20 69 6e 76 61 6c  ht move or inval
20c10 69 64 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  idate the cursor
20c20 2e 20 20 48 65 6e 63 65 20 63 75 72 73 6f 72 20  .  Hence cursor 
20c30 70 43 20 69 73 20 61 6c 77 61 79 73 20 70 6f 69  pC is always poi
20c40 6e 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68  nting.  ** to th
20c50 65 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c 65  e row to be dele
20c60 74 65 64 20 61 6e 64 20 74 68 65 20 73 71 6c 69  ted and the sqli
20c70 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
20c80 65 74 6f 28 29 20 6f 70 65 72 61 74 69 6f 6e 0a  eto() operation.
20c90 20 20 2a 2a 20 62 65 6c 6f 77 20 69 73 20 61 6c    ** below is al
20ca0 77 61 79 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64  ways a no-op and
20cb0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 57   cannot fail.  W
20cc0 65 20 77 69 6c 6c 20 72 75 6e 20 69 74 20 61 6e  e will run it an
20cd0 79 68 6f 77 2c 20 74 68 6f 75 67 68 2c 0a 20 20  yhow, though,.  
20ce0 2a 2a 20 74 6f 20 67 75 61 72 64 20 61 67 61 69  ** to guard agai
20cf0 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e 67  nst future chang
20d00 65 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  es to the code g
20d10 65 6e 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 2f 0a  enerator..  **/.
20d20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65    assert( pC->de
20d30 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20  ferredMoveto==0 
20d40 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
20d50 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
20d60 6f 28 70 43 29 3b 0a 20 20 69 66 28 20 4e 45 56  o(pC);.  if( NEV
20d70 45 52 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  ER(rc!=SQLITE_OK
20d80 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  ) ) goto abort_d
20d90 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20  ue_to_error;..  
20da0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
20db0 61 63 68 65 64 52 6f 77 69 64 28 70 43 2d 3e 70  achedRowid(pC->p
20dc0 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 72 63  Cursor, 0);.  rc
20dd0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44   = sqlite3BtreeD
20de0 65 6c 65 74 65 28 70 43 2d 3e 70 43 75 72 73 6f  elete(pC->pCurso
20df0 72 29 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53  r);.  pC->cacheS
20e00 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
20e10 41 4c 45 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b  ALE;..  /* Invok
20e20 65 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f  e the update-hoo
20e30 6b 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  k if required. *
20e40 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
20e50 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 78 55 70  TE_OK && db->xUp
20e60 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26 26 20  dateCallback && 
20e70 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20  pOp->p4.z ){.   
20e80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
20e90 20 3d 20 64 62 2d 3e 61 44 62 5b 70 43 2d 3e 69   = db->aDb[pC->i
20ea0 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
20eb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20  onst char *zTbl 
20ec0 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
20ed0 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c   db->xUpdateCall
20ee0 62 61 63 6b 28 64 62 2d 3e 70 55 70 64 61 74 65  back(db->pUpdate
20ef0 41 72 67 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  Arg, SQLITE_DELE
20f00 54 45 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69  TE, zDb, zTbl, i
20f10 4b 65 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Key);.    assert
20f20 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a  ( pC->iDb>=0 );.
20f30 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70    }.  if( pOp->p
20f40 32 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  2 & OPFLAG_NCHAN
20f50 47 45 20 29 20 70 2d 3e 6e 43 68 61 6e 67 65 2b  GE ) p->nChange+
20f60 2b 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 2f 2a  +;.  break;.}./*
20f70 20 4f 70 63 6f 64 65 3a 20 52 65 73 65 74 43 6f   Opcode: ResetCo
20f80 75 6e 74 20 2a 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  unt * * * * *.**
20f90 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
20fa0 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
20fb0 74 65 72 20 69 73 20 63 6f 70 69 65 64 20 74 6f  ter is copied to
20fc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
20fd0 6e 64 6c 65 0a 2a 2a 20 63 68 61 6e 67 65 20 63  ndle.** change c
20fe0 6f 75 6e 74 65 72 20 28 72 65 74 75 72 6e 65 64  ounter (returned
20ff0 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
21000 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f  alls to sqlite3_
21010 63 68 61 6e 67 65 73 28 29 29 2e 0a 2a 2a 20 54  changes())..** T
21020 68 65 6e 20 74 68 65 20 56 4d 73 20 69 6e 74 65  hen the VMs inte
21030 72 6e 61 6c 20 63 68 61 6e 67 65 20 63 6f 75 6e  rnal change coun
21040 74 65 72 20 72 65 73 65 74 73 20 74 6f 20 30 2e  ter resets to 0.
21050 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 64  .** This is used
21060 20 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67   by trigger prog
21070 72 61 6d 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  rams..*/.case OP
21080 5f 52 65 73 65 74 43 6f 75 6e 74 3a 20 7b 0a 20  _ResetCount: {. 
21090 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
210a0 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43  hanges(db, p->nC
210b0 68 61 6e 67 65 29 3b 0a 20 20 70 2d 3e 6e 43 68  hange);.  p->nCh
210c0 61 6e 67 65 20 3d 20 30 3b 0a 20 20 62 72 65 61  ange = 0;.  brea
210d0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
210e0 20 52 6f 77 44 61 74 61 20 50 31 20 50 32 20 2a   RowData P1 P2 *
210f0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65   * *.**.** Write
21100 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
21110 32 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72  2 the complete r
21120 6f 77 20 64 61 74 61 20 66 6f 72 20 63 75 72 73  ow data for curs
21130 6f 72 20 50 31 2e 0a 2a 2a 20 54 68 65 72 65 20  or P1..** There 
21140 69 73 20 6e 6f 20 69 6e 74 65 72 70 72 65 74 61  is no interpreta
21150 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
21160 2e 20 20 0a 2a 2a 20 49 74 20 69 73 20 6a 75 73  .  .** It is jus
21170 74 20 63 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68  t copied onto th
21180 65 20 50 32 20 72 65 67 69 73 74 65 72 20 65 78  e P2 register ex
21190 61 63 74 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20  actly as .** it 
211a0 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  is found in the 
211b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
211c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 63  *.** If the P1 c
211d0 75 72 73 6f 72 20 6d 75 73 74 20 62 65 20 70 6f  ursor must be po
211e0 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69  inting to a vali
211f0 64 20 72 6f 77 20 28 6e 6f 74 20 61 20 4e 55 4c  d row (not a NUL
21200 4c 20 72 6f 77 29 0a 2a 2a 20 6f 66 20 61 20 72  L row).** of a r
21210 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  eal table, not a
21220 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a   pseudo-table..*
21230 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77  /./* Opcode: Row
21240 4b 65 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  Key P1 P2 * * *.
21250 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f  **.** Write into
21260 20 72 65 67 69 73 74 65 72 20 50 32 20 74 68 65   register P2 the
21270 20 63 6f 6d 70 6c 65 74 65 20 72 6f 77 20 6b 65   complete row ke
21280 79 20 66 6f 72 20 63 75 72 73 6f 72 20 50 31 2e  y for cursor P1.
21290 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20  .** There is no 
212a0 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20 6f  interpretation o
212b0 66 20 74 68 65 20 64 61 74 61 2e 20 20 0a 2a 2a  f the data.  .**
212c0 20 54 68 65 20 6b 65 79 20 69 73 20 63 6f 70 69   The key is copi
212d0 65 64 20 6f 6e 74 6f 20 74 68 65 20 50 33 20 72  ed onto the P3 r
212e0 65 67 69 73 74 65 72 20 65 78 61 63 74 6c 79 20  egister exactly 
212f0 61 73 20 0a 2a 2a 20 69 74 20 69 73 20 66 6f 75  as .** it is fou
21300 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nd in the databa
21310 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
21320 66 20 74 68 65 20 50 31 20 63 75 72 73 6f 72 20  f the P1 cursor 
21330 6d 75 73 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  must be pointing
21340 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 20   to a valid row 
21350 28 6e 6f 74 20 61 20 4e 55 4c 4c 20 72 6f 77 29  (not a NULL row)
21360 0a 2a 2a 20 6f 66 20 61 20 72 65 61 6c 20 74 61  .** of a real ta
21370 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65 75 64  ble, not a pseud
21380 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65  o-table..*/.case
21390 20 4f 50 5f 52 6f 77 4b 65 79 3a 0a 63 61 73 65   OP_RowKey:.case
213a0 20 4f 50 5f 52 6f 77 44 61 74 61 3a 20 7b 0a 20   OP_RowData: {. 
213b0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
213c0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72  .  BtCursor *pCr
213d0 73 72 3b 0a 20 20 75 33 32 20 6e 3b 0a 20 20 69  sr;.  u32 n;.  i
213e0 36 34 20 6e 36 34 3b 0a 0a 20 20 70 4f 75 74 20  64 n64;..  pOut 
213f0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
21400 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68  ;.  memAboutToCh
21410 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 0a  ange(p, pOut);..
21420 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 52    /* Note that R
21430 6f 77 4b 65 79 20 61 6e 64 20 52 6f 77 44 61 74  owKey and RowDat
21440 61 20 61 72 65 20 72 65 61 6c 6c 79 20 65 78 61  a are really exa
21450 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 69 6e  ctly the same in
21460 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 61  struction */.  a
21470 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
21480 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
21490 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
214a0 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
214b0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
214c0 43 2d 3e 69 73 54 61 62 6c 65 20 7c 7c 20 70 4f  C->isTable || pO
214d0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f  p->opcode==OP_Ro
214e0 77 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  wKey );.  assert
214f0 28 20 70 43 2d 3e 69 73 49 6e 64 65 78 20 7c 7c  ( pC->isIndex ||
21500 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
21510 5f 52 6f 77 44 61 74 61 20 29 3b 0a 20 20 61 73  _RowData );.  as
21520 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
21530 20 61 73 73 65 72 74 28 20 70 43 2d 3e 6e 75 6c   assert( pC->nul
21540 6c 52 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  lRow==0 );.  ass
21550 65 72 74 28 20 70 43 2d 3e 70 73 65 75 64 6f 54  ert( pC->pseudoT
21560 61 62 6c 65 52 65 67 3d 3d 30 20 29 3b 0a 20 20  ableReg==0 );.  
21570 61 73 73 65 72 74 28 20 70 43 2d 3e 70 43 75 72  assert( pC->pCur
21580 73 6f 72 21 3d 30 20 29 3b 0a 20 20 70 43 72 73  sor!=0 );.  pCrs
21590 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b  r = pC->pCursor;
215a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
215b0 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
215c0 61 6c 69 64 28 70 43 72 73 72 29 20 29 3b 0a 0a  alid(pCrsr) );..
215d0 20 20 2f 2a 20 54 68 65 20 4f 50 5f 52 6f 77 4b    /* The OP_RowK
215e0 65 79 20 61 6e 64 20 4f 50 5f 52 6f 77 44 61 74  ey and OP_RowDat
215f0 61 20 6f 70 63 6f 64 65 73 20 61 6c 77 61 79 73  a opcodes always
21600 20 66 6f 6c 6c 6f 77 20 4f 50 5f 4e 6f 74 45 78   follow OP_NotEx
21610 69 73 74 73 20 6f 72 0a 20 20 2a 2a 20 4f 50 5f  ists or.  ** OP_
21620 52 65 77 69 6e 64 2f 4f 70 5f 4e 65 78 74 20 77  Rewind/Op_Next w
21630 69 74 68 20 6e 6f 20 69 6e 74 65 72 76 65 6e 69  ith no interveni
21640 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ng instructions 
21650 74 68 61 74 20 6d 69 67 68 74 20 69 6e 76 61 6c  that might inval
21660 69 64 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 63  idate.  ** the c
21670 75 72 73 6f 72 2e 20 20 48 65 6e 63 65 20 74 68  ursor.  Hence th
21680 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
21690 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
216a0 65 74 6f 28 29 20 63 61 6c 6c 20 69 73 20 61 6c  eto() call is al
216b0 77 61 79 73 0a 20 20 2a 2a 20 61 20 6e 6f 2d 6f  ways.  ** a no-o
216c0 70 20 61 6e 64 20 63 61 6e 20 6e 65 76 65 72 20  p and can never 
216d0 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20 6c 65  fail.  But we le
216e0 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20  ave it in place 
216f0 61 73 20 61 20 73 61 66 65 74 79 2e 0a 20 20 2a  as a safety..  *
21700 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  /.  assert( pC->
21710 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d  deferredMoveto==
21720 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
21730 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
21740 65 74 6f 28 70 43 29 3b 0a 20 20 69 66 28 20 4e  eto(pC);.  if( N
21750 45 56 45 52 28 72 63 21 3d 53 51 4c 49 54 45 5f  EVER(rc!=SQLITE_
21760 4f 4b 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  OK) ) goto abort
21770 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a  _due_to_error;..
21780 20 20 69 66 28 20 70 43 2d 3e 69 73 49 6e 64 65    if( pC->isInde
21790 78 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  x ){.    assert(
217a0 20 21 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b   !pC->isTable );
217b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
217c0 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
217d0 72 73 72 2c 20 26 6e 36 34 29 3b 0a 20 20 20 20  rsr, &n64);.    
217e0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
217f0 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 54  TE_OK );    /* T
21800 72 75 65 20 62 65 63 61 75 73 65 20 6f 66 20 43  rue because of C
21810 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29 20 63 61  ursorMoveto() ca
21820 6c 6c 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20  ll above */.    
21830 69 66 28 20 6e 36 34 3e 64 62 2d 3e 61 4c 69 6d  if( n64>db->aLim
21840 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
21850 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 20  LENGTH] ){.     
21860 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20   goto too_big;. 
21870 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 28 75 33     }.    n = (u3
21880 32 29 6e 36 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2)n64;.  }else{.
21890 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
218a0 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 70 43  BtreeDataSize(pC
218b0 72 73 72 2c 20 26 6e 29 3b 0a 20 20 20 20 61 73  rsr, &n);.    as
218c0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
218d0 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 44 61 74  _OK );    /* Dat
218e0 61 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66  aSize() cannot f
218f0 61 69 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ail */.    if( n
21900 3e 28 75 33 32 29 64 62 2d 3e 61 4c 69 6d 69 74  >(u32)db->aLimit
21910 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
21920 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 20 20 67  NGTH] ){.      g
21930 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20  oto too_big;.   
21940 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c   }.  }.  if( sql
21950 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
21960 70 4f 75 74 2c 20 6e 2c 20 30 29 20 29 7b 0a 20  pOut, n, 0) ){. 
21970 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
21980 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20    }.  pOut->n = 
21990 6e 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46  n;.  MemSetTypeF
219a0 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 42 6c  lag(pOut, MEM_Bl
219b0 6f 62 29 3b 0a 20 20 69 66 28 20 70 43 2d 3e 69  ob);.  if( pC->i
219c0 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 72 63  sIndex ){.    rc
219d0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
219e0 65 79 28 70 43 72 73 72 2c 20 30 2c 20 6e 2c 20  ey(pCrsr, 0, n, 
219f0 70 4f 75 74 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73  pOut->z);.  }els
21a00 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
21a10 74 65 33 42 74 72 65 65 44 61 74 61 28 70 43 72  te3BtreeData(pCr
21a20 73 72 2c 20 30 2c 20 6e 2c 20 70 4f 75 74 2d 3e  sr, 0, n, pOut->
21a30 7a 29 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e  z);.  }.  pOut->
21a40 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
21a50 38 3b 20 20 2f 2a 20 49 6e 20 63 61 73 65 20 74  8;  /* In case t
21a60 68 65 20 62 6c 6f 62 20 69 73 20 65 76 65 72 20  he blob is ever 
21a70 63 61 73 74 20 74 6f 20 74 65 78 74 20 2a 2f 0a  cast to text */.
21a80 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
21a90 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62  BSIZE(pOut);.  b
21aa0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
21ab0 64 65 3a 20 52 6f 77 69 64 20 50 31 20 50 32 20  de: Rowid P1 P2 
21ac0 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 74 6f 72  * * *.**.** Stor
21ad0 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
21ae0 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
21af0 68 20 69 73 20 74 68 65 20 6b 65 79 20 6f 66 20  h is the key of 
21b00 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
21b10 74 68 61 74 0a 2a 2a 20 50 31 20 69 73 20 63 75  that.** P1 is cu
21b20 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f  rrently point to
21b30 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 63 61 6e 20 62  ..**.** P1 can b
21b40 65 20 65 69 74 68 65 72 20 61 6e 20 6f 72 64 69  e either an ordi
21b50 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 61 20  nary table or a 
21b60 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
21b70 54 68 65 72 65 20 75 73 65 64 20 74 6f 0a 2a 2a  There used to.**
21b80 20 62 65 20 61 20 73 65 70 61 72 61 74 65 20 4f   be a separate O
21b90 50 5f 56 52 6f 77 69 64 20 6f 70 63 6f 64 65 20  P_VRowid opcode 
21ba0 66 6f 72 20 75 73 65 20 77 69 74 68 20 76 69 72  for use with vir
21bb0 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 62 75 74  tual tables, but
21bc0 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 20 6f 70 63   this.** one opc
21bd0 6f 64 65 20 6e 6f 77 20 77 6f 72 6b 73 20 66 6f  ode now works fo
21be0 72 20 62 6f 74 68 20 74 61 62 6c 65 20 74 79 70  r both table typ
21bf0 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  es..*/.case OP_R
21c00 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20 20 20  owid: {         
21c10 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
21c20 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
21c30 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
21c40 20 20 69 36 34 20 76 3b 0a 20 20 73 71 6c 69 74    i64 v;.  sqlit
21c50 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a  e3_vtab *pVtab;.
21c60 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
21c70 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b  module *pModule;
21c80 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
21c90 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
21ca0 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
21cb0 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
21cc0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
21cd0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
21ce0 73 73 65 72 74 28 20 70 43 2d 3e 70 73 65 75 64  ssert( pC->pseud
21cf0 6f 54 61 62 6c 65 52 65 67 3d 3d 30 20 29 3b 0a  oTableReg==0 );.
21d00 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f    if( pC->nullRo
21d10 77 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66  w ){.    pOut->f
21d20 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
21d30 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 65  .    break;.  }e
21d40 6c 73 65 20 69 66 28 20 70 43 2d 3e 64 65 66 65  lse if( pC->defe
21d50 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20  rredMoveto ){.  
21d60 20 20 76 20 3d 20 70 43 2d 3e 6d 6f 76 65 74 6f    v = pC->moveto
21d70 54 61 72 67 65 74 3b 0a 23 69 66 6e 64 65 66 20  Target;.#ifndef 
21d80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
21d90 55 41 4c 54 41 42 4c 45 0a 20 20 7d 65 6c 73 65  UALTABLE.  }else
21da0 20 69 66 28 20 70 43 2d 3e 70 56 74 61 62 43 75   if( pC->pVtabCu
21db0 72 73 6f 72 20 29 7b 0a 20 20 20 20 70 56 74 61  rsor ){.    pVta
21dc0 62 20 3d 20 70 43 2d 3e 70 56 74 61 62 43 75 72  b = pC->pVtabCur
21dd0 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20  sor->pVtab;.    
21de0 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d  pModule = pVtab-
21df0 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 61 73  >pModule;.    as
21e00 73 65 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78  sert( pModule->x
21e10 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 72 63 20  Rowid );.    rc 
21e20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 6f 77 69  = pModule->xRowi
21e30 64 28 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f  d(pC->pVtabCurso
21e40 72 2c 20 26 76 29 3b 0a 20 20 20 20 69 6d 70 6f  r, &v);.    impo
21e50 72 74 56 74 61 62 45 72 72 4d 73 67 28 70 2c 20  rtVtabErrMsg(p, 
21e60 70 56 74 61 62 29 3b 0a 23 65 6e 64 69 66 20 2f  pVtab);.#endif /
21e70 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
21e80 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 20 20  RTUALTABLE */.  
21e90 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
21ea0 74 28 20 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d  t( pC->pCursor!=
21eb0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
21ec0 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
21ed0 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 20 20 69  oveto(pC);.    i
21ee0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
21ef0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
21f00 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 72 6f 77  .    if( pC->row
21f10 69 64 49 73 56 61 6c 69 64 20 29 7b 0a 20 20 20  idIsValid ){.   
21f20 20 20 20 76 20 3d 20 70 43 2d 3e 6c 61 73 74 52     v = pC->lastR
21f30 6f 77 69 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  owid;.    }else{
21f40 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
21f50 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
21f60 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 76 29  pC->pCursor, &v)
21f70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
21f80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
21f90 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 6f 20 62    /* Always so b
21fa0 65 63 61 75 73 65 20 6f 66 20 43 75 72 73 6f 72  ecause of Cursor
21fb0 4d 6f 76 65 74 6f 28 29 20 61 62 6f 76 65 20 2a  Moveto() above *
21fc0 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4f  /.    }.  }.  pO
21fd0 75 74 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 62  ut->u.i = v;.  b
21fe0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
21ff0 64 65 3a 20 4e 75 6c 6c 52 6f 77 20 50 31 20 2a  de: NullRow P1 *
22000 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 6f 76   * * *.**.** Mov
22010 65 20 74 68 65 20 63 75 72 73 6f 72 20 50 31 20  e the cursor P1 
22020 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 2e 20 20  to a null row.  
22030 41 6e 79 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70  Any OP_Column op
22040 65 72 61 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  erations.** that
22050 20 6f 63 63 75 72 20 77 68 69 6c 65 20 74 68 65   occur while the
22060 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 20 74 68   cursor is on th
22070 65 20 6e 75 6c 6c 20 72 6f 77 20 77 69 6c 6c 20  e null row will 
22080 61 6c 77 61 79 73 0a 2a 2a 20 77 72 69 74 65 20  always.** write 
22090 61 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20  a NULL..*/.case 
220a0 4f 50 5f 4e 75 6c 6c 52 6f 77 3a 20 7b 0a 20 20  OP_NullRow: {.  
220b0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
220c0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
220d0 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
220e0 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
220f0 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
22100 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
22110 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70 43  t( pC!=0 );.  pC
22120 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20  ->nullRow = 1;. 
22130 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69   pC->rowidIsVali
22140 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 2d  d = 0;.  if( pC-
22150 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
22160 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
22170 72 43 75 72 73 6f 72 28 70 43 2d 3e 70 43 75 72  rCursor(pC->pCur
22180 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  sor);.  }.  brea
22190 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
221a0 20 4c 61 73 74 20 50 31 20 50 32 20 2a 20 2a 20   Last P1 P2 * * 
221b0 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  *.**.** The next
221c0 20 75 73 65 20 6f 66 20 74 68 65 20 52 6f 77 69   use of the Rowi
221d0 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72 20 4e  d or Column or N
221e0 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
221f0 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c 6c 20  for P1 .** will 
22200 72 65 66 65 72 20 74 6f 20 74 68 65 20 6c 61 73  refer to the las
22210 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
22220 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
22230 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74 68   index..** If th
22240 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
22250 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20 50 32   is empty and P2
22260 3e 30 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d  >0, then jump im
22270 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
22280 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 30 20 6f  .** If P2 is 0 o
22290 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f  r if the table o
222a0 72 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 65  r index is not e
222b0 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75  mpty, fall throu
222c0 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c  gh.** to the fol
222d0 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69  lowing instructi
222e0 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c  on..*/.case OP_L
222f0 61 73 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  ast: {        /*
22300 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43   jump */.  VdbeC
22310 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43  ursor *pC;.  BtC
22320 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20  ursor *pCrsr;.  
22330 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65  int res;..  asse
22340 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
22350 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
22360 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
22370 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
22380 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
22390 30 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70  0 );.  pCrsr = p
223a0 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  C->pCursor;.  if
223b0 28 20 70 43 72 73 72 3d 3d 30 20 29 7b 0a 20 20  ( pCrsr==0 ){.  
223c0 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 7d 65 6c    res = 1;.  }el
223d0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
223e0 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 70 43  ite3BtreeLast(pC
223f0 72 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a  rsr, &res);.  }.
22400 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20    pC->nullRow = 
22410 28 75 38 29 72 65 73 3b 0a 20 20 70 43 2d 3e 64  (u8)res;.  pC->d
22420 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
22430 30 3b 0a 20 20 70 43 2d 3e 72 6f 77 69 64 49 73  0;.  pC->rowidIs
22440 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 70 43 2d  Valid = 0;.  pC-
22450 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
22460 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66  ACHE_STALE;.  if
22470 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 72  ( pOp->p2>0 && r
22480 65 73 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70  es ){.    pc = p
22490 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a  Op->p2 - 1;.  }.
224a0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20    break;.}.../* 
224b0 4f 70 63 6f 64 65 3a 20 53 6f 72 74 20 50 31 20  Opcode: Sort P1 
224c0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  P2 * * *.**.** T
224d0 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
224e0 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
224f0 20 74 68 69 6e 67 20 61 73 20 4f 50 5f 52 65 77   thing as OP_Rew
22500 69 6e 64 20 65 78 63 65 70 74 20 74 68 61 74 0a  ind except that.
22510 2a 2a 20 69 74 20 69 6e 63 72 65 6d 65 6e 74 73  ** it increments
22520 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
22530 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
22540 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
22550 67 2e 0a 2a 2a 0a 2a 2a 20 53 6f 72 74 69 6e 67  g..**.** Sorting
22560 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64   is accomplished
22570 20 62 79 20 77 72 69 74 69 6e 67 20 72 65 63 6f   by writing reco
22580 72 64 73 20 69 6e 74 6f 20 61 20 73 6f 72 74 69  rds into a sorti
22590 6e 67 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65  ng index,.** the
225a0 6e 20 72 65 77 69 6e 64 69 6e 67 20 74 68 61 74  n rewinding that
225b0 20 69 6e 64 65 78 20 61 6e 64 20 70 6c 61 79 69   index and playi
225c0 6e 67 20 69 74 20 62 61 63 6b 20 66 72 6f 6d 20  ng it back from 
225d0 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20  beginning to.** 
225e0 65 6e 64 2e 20 20 57 65 20 75 73 65 20 74 68 65  end.  We use the
225f0 20 4f 50 5f 53 6f 72 74 20 6f 70 63 6f 64 65 20   OP_Sort opcode 
22600 69 6e 73 74 65 61 64 20 6f 66 20 4f 50 5f 52 65  instead of OP_Re
22610 77 69 6e 64 20 74 6f 20 64 6f 20 74 68 65 0a 2a  wind to do the.*
22620 2a 20 72 65 77 69 6e 64 69 6e 67 20 73 6f 20 74  * rewinding so t
22630 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 76  hat the global v
22640 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  ariable will be 
22650 69 6e 63 72 65 6d 65 6e 74 65 64 20 61 6e 64 0a  incremented and.
22660 2a 2a 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65  ** regression te
22670 73 74 73 20 63 61 6e 20 64 65 74 65 72 6d 69 6e  sts can determin
22680 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
22690 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69   the optimizer i
226a0 73 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 6f  s.** correctly o
226b0 70 74 69 6d 69 7a 69 6e 67 20 6f 75 74 20 73 6f  ptimizing out so
226c0 72 74 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  rts..*/.case OP_
226d0 53 6f 72 74 3a 20 7b 20 20 20 20 20 20 20 20 2f  Sort: {        /
226e0 2a 20 6a 75 6d 70 20 2a 2f 0a 23 69 66 64 65 66  * jump */.#ifdef
226f0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
22700 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e  qlite3_sort_coun
22710 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  t++;.  sqlite3_s
22720 65 61 72 63 68 5f 63 6f 75 6e 74 2d 2d 3b 0a 23  earch_count--;.#
22730 65 6e 64 69 66 0a 20 20 70 2d 3e 61 43 6f 75 6e  endif.  p->aCoun
22740 74 65 72 5b 53 51 4c 49 54 45 5f 53 54 4d 54 53  ter[SQLITE_STMTS
22750 54 41 54 55 53 5f 53 4f 52 54 2d 31 5d 2b 2b 3b  TATUS_SORT-1]++;
22760 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75  .  /* Fall throu
22770 67 68 20 69 6e 74 6f 20 4f 50 5f 52 65 77 69 6e  gh into OP_Rewin
22780 64 20 2a 2f 0a 7d 0a 2f 2a 20 4f 70 63 6f 64 65  d */.}./* Opcode
22790 3a 20 52 65 77 69 6e 64 20 50 31 20 50 32 20 2a  : Rewind P1 P2 *
227a0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e   * *.**.** The n
227b0 65 78 74 20 75 73 65 20 6f 66 20 74 68 65 20 52  ext use of the R
227c0 6f 77 69 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f  owid or Column o
227d0 72 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69  r Next instructi
227e0 6f 6e 20 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69  on for P1 .** wi
227f0 6c 6c 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  ll refer to the 
22800 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
22810 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  he database tabl
22820 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 49  e or index..** I
22830 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
22840 6e 64 65 78 20 69 73 20 65 6d 70 74 79 20 61 6e  ndex is empty an
22850 64 20 50 32 3e 30 2c 20 74 68 65 6e 20 6a 75 6d  d P2>0, then jum
22860 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
22870 20 50 32 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73   P2..** If P2 is
22880 20 30 20 6f 72 20 69 66 20 74 68 65 20 74 61 62   0 or if the tab
22890 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20 6e  le or index is n
228a0 6f 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c 20 74  ot empty, fall t
228b0 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65  hrough.** to the
228c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72   following instr
228d0 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  uction..*/.case 
228e0 4f 50 5f 52 65 77 69 6e 64 3a 20 7b 20 20 20 20  OP_Rewind: {    
228f0 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20      /* jump */. 
22900 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
22910 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72  .  BtCursor *pCr
22920 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a  sr;.  int res;..
22930 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
22940 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
22950 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
22960 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
22970 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
22980 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 72 65 73  ( pC!=0 );.  res
22990 20 3d 20 31 3b 0a 20 20 69 66 28 20 28 70 43 72   = 1;.  if( (pCr
229a0 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72  sr = pC->pCursor
229b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )!=0 ){.    rc =
229c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
229d0 73 74 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b  st(pCrsr, &res);
229e0 0a 20 20 20 20 70 43 2d 3e 61 74 46 69 72 73 74  .    pC->atFirst
229f0 20 3d 20 72 65 73 3d 3d 30 20 3f 31 3a 30 3b 0a   = res==0 ?1:0;.
22a00 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64      pC->deferred
22a10 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20  Moveto = 0;.    
22a20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
22a30 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
22a40 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61     pC->rowidIsVa
22a50 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  lid = 0;.  }.  p
22a60 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 28 75 38  C->nullRow = (u8
22a70 29 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20  )res;.  assert( 
22a80 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70  pOp->p2>0 && pOp
22a90 2d 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  ->p2<p->nOp );. 
22aa0 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
22ab0 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
22ac0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
22ad0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 78  ../* Opcode: Nex
22ae0 74 20 50 31 20 50 32 20 2a 20 2a 20 50 35 0a 2a  t P1 P2 * * P5.*
22af0 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 63 75 72  *.** Advance cur
22b00 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 69  sor P1 so that i
22b10 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
22b20 6e 65 78 74 20 6b 65 79 2f 64 61 74 61 20 70 61  next key/data pa
22b30 69 72 20 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62  ir in its.** tab
22b40 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 49 66  le or index.  If
22b50 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
22b60 72 65 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69  re key/value pai
22b70 72 73 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  rs then fall thr
22b80 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ough.** to the f
22b90 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63  ollowing instruc
22ba0 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 20 74 68  tion.  But if th
22bb0 65 20 63 75 72 73 6f 72 20 61 64 76 61 6e 63 65  e cursor advance
22bc0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c   was successful,
22bd0 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  .** jump immedia
22be0 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a  tely to P2..**.*
22bf0 2a 20 54 68 65 20 50 31 20 63 75 72 73 6f 72 20  * The P1 cursor 
22c00 6d 75 73 74 20 62 65 20 66 6f 72 20 61 20 72 65  must be for a re
22c10 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  al table, not a 
22c20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a  pseudo-table..**
22c30 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 70 6f 73  .** If P5 is pos
22c40 69 74 69 76 65 20 61 6e 64 20 74 68 65 20 6a 75  itive and the ju
22c50 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20 74 68 65  mp is taken, the
22c60 6e 20 65 76 65 6e 74 20 63 6f 75 6e 74 65 72 0a  n event counter.
22c70 2a 2a 20 6e 75 6d 62 65 72 20 50 35 2d 31 20 69  ** number P5-1 i
22c80 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
22c90 74 61 74 65 6d 65 6e 74 20 69 73 20 69 6e 63 72  tatement is incr
22ca0 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  emented..**.** S
22cb0 65 65 20 61 6c 73 6f 3a 20 50 72 65 76 0a 2a 2f  ee also: Prev.*/
22cc0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 72 65 76  ./* Opcode: Prev
22cd0 20 50 31 20 50 32 20 2a 20 2a 20 50 35 0a 2a 2a   P1 P2 * * P5.**
22ce0 0a 2a 2a 20 42 61 63 6b 20 75 70 20 63 75 72 73  .** Back up curs
22cf0 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 69 74  or P1 so that it
22d00 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 70   points to the p
22d10 72 65 76 69 6f 75 73 20 6b 65 79 2f 64 61 74 61  revious key/data
22d20 20 70 61 69 72 20 69 6e 20 69 74 73 0a 2a 2a 20   pair in its.** 
22d30 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20  table or index. 
22d40 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
22d50 70 72 65 76 69 6f 75 73 20 6b 65 79 2f 76 61 6c  previous key/val
22d60 75 65 20 70 61 69 72 73 20 74 68 65 6e 20 66 61  ue pairs then fa
22d70 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f  ll through.** to
22d80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
22d90 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 42 75 74  nstruction.  But
22da0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62   if the cursor b
22db0 61 63 6b 75 70 20 77 61 73 20 73 75 63 63 65 73  ackup was succes
22dc0 73 66 75 6c 2c 0a 2a 2a 20 6a 75 6d 70 20 69 6d  sful,.** jump im
22dd0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
22de0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 31 20 63 75  .**.** The P1 cu
22df0 72 73 6f 72 20 6d 75 73 74 20 62 65 20 66 6f 72  rsor must be for
22e00 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e   a real table, n
22e10 6f 74 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c  ot a pseudo-tabl
22e20 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69  e..**.** If P5 i
22e30 73 20 70 6f 73 69 74 69 76 65 20 61 6e 64 20 74  s positive and t
22e40 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
22e50 2c 20 74 68 65 6e 20 65 76 65 6e 74 20 63 6f 75  , then event cou
22e60 6e 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50  nter.** number P
22e70 35 2d 31 20 69 6e 20 74 68 65 20 70 72 65 70 61  5-1 in the prepa
22e80 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73  red statement is
22e90 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f   incremented..*/
22ea0 0a 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 20 20  .case OP_Prev:  
22eb0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
22ec0 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a  */.case OP_Next:
22ed0 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
22ee0 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  p */.  VdbeCurso
22ef0 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f  r *pC;.  BtCurso
22f00 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20  r *pCrsr;.  int 
22f10 72 65 73 3b 0a 0a 20 20 43 48 45 43 4b 5f 46 4f  res;..  CHECK_FO
22f20 52 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 61  R_INTERRUPT;.  a
22f30 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
22f40 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
22f50 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73  nCursor );.  ass
22f60 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c 3d 41 72  ert( pOp->p5<=Ar
22f70 72 61 79 53 69 7a 65 28 70 2d 3e 61 43 6f 75 6e  raySize(p->aCoun
22f80 74 65 72 29 20 29 3b 0a 20 20 70 43 20 3d 20 70  ter) );.  pC = p
22f90 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
22fa0 3b 0a 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b  ;.  if( pC==0 ){
22fb0 0a 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20  .    break;  /* 
22fc0 53 65 65 20 74 69 63 6b 65 74 20 23 32 32 37 33  See ticket #2273
22fd0 20 2a 2f 0a 20 20 7d 0a 20 20 70 43 72 73 72 20   */.  }.  pCrsr 
22fe0 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20  = pC->pCursor;. 
22ff0 20 69 66 28 20 70 43 72 73 72 3d 3d 30 20 29 7b   if( pCrsr==0 ){
23000 0a 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77  .    pC->nullRow
23010 20 3d 20 31 3b 0a 20 20 20 20 62 72 65 61 6b 3b   = 1;.    break;
23020 0a 20 20 7d 0a 20 20 72 65 73 20 3d 20 31 3b 0a  .  }.  res = 1;.
23030 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65    assert( pC->de
23040 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20  ferredMoveto==0 
23050 29 3b 0a 20 20 72 63 20 3d 20 70 4f 70 2d 3e 6f  );.  rc = pOp->o
23060 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 78 74 20 3f  pcode==OP_Next ?
23070 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
23080 74 28 70 43 72 73 72 2c 20 26 72 65 73 29 20 3a  t(pCrsr, &res) :
23090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
230a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
230b0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
230c0 6f 75 73 28 70 43 72 73 72 2c 20 26 72 65 73 29  ous(pCrsr, &res)
230d0 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20  ;.  pC->nullRow 
230e0 3d 20 28 75 38 29 72 65 73 3b 0a 20 20 70 43 2d  = (u8)res;.  pC-
230f0 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
23100 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66  ACHE_STALE;.  if
23110 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
23120 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
23130 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  ;.    if( pOp->p
23140 35 20 29 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b  5 ) p->aCounter[
23150 70 4f 70 2d 3e 70 35 2d 31 5d 2b 2b 3b 0a 23 69  pOp->p5-1]++;.#i
23160 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
23170 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61  .    sqlite3_sea
23180 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  rch_count++;.#en
23190 64 69 66 0a 20 20 7d 0a 20 20 70 43 2d 3e 72 6f  dif.  }.  pC->ro
231a0 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a  widIsValid = 0;.
231b0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
231c0 70 63 6f 64 65 3a 20 49 64 78 49 6e 73 65 72 74  pcode: IdxInsert
231d0 20 50 31 20 50 32 20 50 33 20 2a 20 50 35 0a 2a   P1 P2 P3 * P5.*
231e0 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 32  *.** Register P2
231f0 20 68 6f 6c 64 73 20 61 6e 20 53 51 4c 20 69 6e   holds an SQL in
23200 64 65 78 20 6b 65 79 20 6d 61 64 65 20 75 73 69  dex key made usi
23210 6e 67 20 74 68 65 0a 2a 2a 20 4d 61 6b 65 52 65  ng the.** MakeRe
23220 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  cord instruction
23230 73 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20  s.  This opcode 
23240 77 72 69 74 65 73 20 74 68 61 74 20 6b 65 79 0a  writes that key.
23250 2a 2a 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 65  ** into the inde
23260 78 20 50 31 2e 20 20 44 61 74 61 20 66 6f 72 20  x P1.  Data for 
23270 74 68 65 20 65 6e 74 72 79 20 69 73 20 6e 69 6c  the entry is nil
23280 2e 0a 2a 2a 0a 2a 2a 20 50 33 20 69 73 20 61 20  ..**.** P3 is a 
23290 66 6c 61 67 20 74 68 61 74 20 70 72 6f 76 69 64  flag that provid
232a0 65 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65  es a hint to the
232b0 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20 74 68   b-tree layer th
232c0 61 74 20 74 68 69 73 0a 2a 2a 20 69 6e 73 65 72  at this.** inser
232d0 74 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f 20 62  t is likely to b
232e0 65 20 61 6e 20 61 70 70 65 6e 64 2e 0a 2a 2a 0a  e an append..**.
232f0 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  ** This instruct
23300 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  ion only works f
23310 6f 72 20 69 6e 64 69 63 65 73 2e 20 20 54 68 65  or indices.  The
23320 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e 73 74   equivalent inst
23330 72 75 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74  ruction.** for t
23340 61 62 6c 65 73 20 69 73 20 4f 50 5f 49 6e 73 65  ables is OP_Inse
23350 72 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  rt..*/.case OP_I
23360 64 78 49 6e 73 65 72 74 3a 20 7b 20 20 20 20 20  dxInsert: {     
23370 20 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56     /* in2 */.  V
23380 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
23390 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72   BtCursor *pCrsr
233a0 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20  ;.  int nKey;.  
233b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79  const char *zKey
233c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
233d0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
233e0 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
233f0 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
23400 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
23410 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
23420 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn2 = &aMem[pOp
23430 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p2];.  assert(
23440 20 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn2->flags & M
23450 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 70 43 72  EM_Blob );.  pCr
23460 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72  sr = pC->pCursor
23470 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
23480 43 72 73 72 21 3d 30 29 20 29 7b 0a 20 20 20 20  Crsr!=0) ){.    
23490 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61  assert( pC->isTa
234a0 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  ble==0 );.    rc
234b0 20 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49   = ExpandBlob(pI
234c0 6e 32 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  n2);.    if( rc=
234d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
234e0 20 20 20 20 6e 4b 65 79 20 3d 20 70 49 6e 32 2d      nKey = pIn2-
234f0 3e 6e 3b 0a 20 20 20 20 20 20 7a 4b 65 79 20 3d  >n;.      zKey =
23500 20 70 49 6e 32 2d 3e 7a 3b 0a 20 20 20 20 20 20   pIn2->z;.      
23510 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
23520 65 49 6e 73 65 72 74 28 70 43 72 73 72 2c 20 7a  eInsert(pCrsr, z
23530 4b 65 79 2c 20 6e 4b 65 79 2c 20 22 22 2c 20 30  Key, nKey, "", 0
23540 2c 20 30 2c 20 70 4f 70 2d 3e 70 33 2c 20 0a 20  , 0, pOp->p3, . 
23550 20 20 20 20 20 20 20 20 20 28 28 70 4f 70 2d 3e           ((pOp->
23560 70 35 20 26 20 4f 50 46 4c 41 47 5f 55 53 45 53  p5 & OPFLAG_USES
23570 45 45 4b 52 45 53 55 4c 54 29 20 3f 20 70 43 2d  EEKRESULT) ? pC-
23580 3e 73 65 65 6b 52 65 73 75 6c 74 20 3a 20 30 29  >seekResult : 0)
23590 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
235a0 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65  assert( pC->defe
235b0 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
235c0 0a 20 20 20 20 20 20 70 43 2d 3e 63 61 63 68 65  .      pC->cache
235d0 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
235e0 54 41 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TALE;.    }.  }.
235f0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
23600 70 63 6f 64 65 3a 20 49 64 78 44 65 6c 65 74 65  pcode: IdxDelete
23610 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
23620 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  .** The content 
23630 6f 66 20 50 33 20 72 65 67 69 73 74 65 72 73 20  of P3 registers 
23640 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 69  starting at regi
23650 73 74 65 72 20 50 32 20 66 6f 72 6d 0a 2a 2a 20  ster P2 form.** 
23660 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65  an unpacked inde
23670 78 20 6b 65 79 2e 20 54 68 69 73 20 6f 70 63 6f  x key. This opco
23680 64 65 20 72 65 6d 6f 76 65 73 20 74 68 61 74 20  de removes that 
23690 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 0a  entry from the .
236a0 2a 2a 20 69 6e 64 65 78 20 6f 70 65 6e 65 64 20  ** index opened 
236b0 62 79 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2f  by cursor P1..*/
236c0 0a 63 61 73 65 20 4f 50 5f 49 64 78 44 65 6c 65  .case OP_IdxDele
236d0 74 65 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73  te: {.  VdbeCurs
236e0 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73  or *pC;.  BtCurs
236f0 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74  or *pCrsr;.  int
23700 20 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65 64   res;.  Unpacked
23710 52 65 63 6f 72 64 20 72 3b 0a 0a 20 20 61 73 73  Record r;..  ass
23720 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29  ert( pOp->p3>0 )
23730 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
23740 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32  >p2>0 && pOp->p2
23750 2b 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65  +pOp->p3<=p->nMe
23760 6d 2b 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  m+1 );.  assert(
23770 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
23780 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
23790 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  r );.  pC = p->a
237a0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
237b0 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
237c0 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e  ;.  pCrsr = pC->
237d0 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 41  pCursor;.  if( A
237e0 4c 57 41 59 53 28 70 43 72 73 72 21 3d 30 29 20  LWAYS(pCrsr!=0) 
237f0 29 7b 0a 20 20 20 20 72 2e 70 4b 65 79 49 6e 66  ){.    r.pKeyInf
23800 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f  o = pC->pKeyInfo
23810 3b 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d  ;.    r.nField =
23820 20 28 75 31 36 29 70 4f 70 2d 3e 70 33 3b 0a 20   (u16)pOp->p3;. 
23830 20 20 20 72 2e 66 6c 61 67 73 20 3d 20 30 3b 0a     r.flags = 0;.
23840 20 20 20 20 72 2e 61 4d 65 6d 20 3d 20 26 61 4d      r.aMem = &aM
23850 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 23 69 66  em[pOp->p2];.#if
23860 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
23870 0a 20 20 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f  .    { int i; fo
23880 72 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c  r(i=0; i<r.nFiel
23890 64 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  d; i++) assert( 
238a0 6d 65 6d 49 73 56 61 6c 69 64 28 26 72 2e 61 4d  memIsValid(&r.aM
238b0 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64  em[i]) ); }.#end
238c0 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
238d0 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
238e0 70 61 63 6b 65 64 28 70 43 72 73 72 2c 20 26 72  packed(pCrsr, &r
238f0 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  , 0, 0, &res);. 
23900 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23910 45 5f 4f 4b 20 26 26 20 72 65 73 3d 3d 30 20 29  E_OK && res==0 )
23920 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
23930 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
23940 70 43 72 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pCrsr);.    }.  
23950 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65    assert( pC->de
23960 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20  ferredMoveto==0 
23970 29 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65  );.    pC->cache
23980 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
23990 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 62 72 65 61  TALE;.  }.  brea
239a0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
239b0 20 49 64 78 52 6f 77 69 64 20 50 31 20 50 32 20   IdxRowid P1 P2 
239c0 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74  * * *.**.** Writ
239d0 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  e into register 
239e0 50 32 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  P2 an integer wh
239f0 69 63 68 20 69 73 20 74 68 65 20 6c 61 73 74 20  ich is the last 
23a00 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 65 63  entry in the rec
23a10 6f 72 64 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ord at.** the en
23a20 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6b  d of the index k
23a30 65 79 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ey pointed to by
23a40 20 63 75 72 73 6f 72 20 50 31 2e 20 20 54 68 69   cursor P1.  Thi
23a50 73 20 69 6e 74 65 67 65 72 20 73 68 6f 75 6c 64  s integer should
23a60 20 62 65 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64   be.** the rowid
23a70 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 65 6e   of the table en
23a80 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 69  try to which thi
23a90 73 20 69 6e 64 65 78 20 65 6e 74 72 79 20 70 6f  s index entry po
23aa0 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ints..**.** See 
23ab0 61 6c 73 6f 3a 20 52 6f 77 69 64 2c 20 4d 61 6b  also: Rowid, Mak
23ac0 65 52 65 63 6f 72 64 2e 0a 2a 2f 0a 63 61 73 65  eRecord..*/.case
23ad0 20 4f 50 5f 49 64 78 52 6f 77 69 64 3a 20 7b 20   OP_IdxRowid: { 
23ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23af0 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20  out2-prerelease 
23b00 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
23b10 43 72 73 72 3b 0a 20 20 56 64 62 65 43 75 72 73  Crsr;.  VdbeCurs
23b20 6f 72 20 2a 70 43 3b 0a 20 20 69 36 34 20 72 6f  or *pC;.  i64 ro
23b30 77 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  wid;..  assert( 
23b40 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
23b50 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
23b60 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
23b70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
23b80 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
23b90 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 70  .  pCrsr = pC->p
23ba0 43 75 72 73 6f 72 3b 0a 20 20 70 4f 75 74 2d 3e  Cursor;.  pOut->
23bb0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
23bc0 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
23bd0 43 72 73 72 21 3d 30 29 20 29 7b 0a 20 20 20 20  Crsr!=0) ){.    
23be0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
23bf0 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29  CursorMoveto(pC)
23c00 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
23c10 72 63 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  rc) ) goto abort
23c20 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
23c30 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64     assert( pC->d
23c40 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30  eferredMoveto==0
23c50 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
23c60 70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29  pC->isTable==0 )
23c70 3b 0a 20 20 20 20 69 66 28 20 21 70 43 2d 3e 6e  ;.    if( !pC->n
23c80 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ullRow ){.      
23c90 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
23ca0 49 64 78 52 6f 77 69 64 28 64 62 2c 20 70 43 72  IdxRowid(db, pCr
23cb0 73 72 2c 20 26 72 6f 77 69 64 29 3b 0a 20 20 20  sr, &rowid);.   
23cc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23cd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23ce0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
23cf0 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  o_error;.      }
23d00 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69  .      pOut->u.i
23d10 20 3d 20 72 6f 77 69 64 3b 0a 20 20 20 20 20 20   = rowid;.      
23d20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
23d30 4d 5f 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  M_Int;.    }.  }
23d40 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
23d50 4f 70 63 6f 64 65 3a 20 49 64 78 47 45 20 50 31  Opcode: IdxGE P1
23d60 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a   P2 P3 P4 P5.**.
23d70 2a 2a 20 54 68 65 20 50 34 20 72 65 67 69 73 74  ** The P4 regist
23d80 65 72 20 76 61 6c 75 65 73 20 62 65 67 69 6e 6e  er values beginn
23d90 69 6e 67 20 77 69 74 68 20 50 33 20 66 6f 72 6d  ing with P3 form
23da0 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64   an unpacked ind
23db0 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20  ex .** key that 
23dc0 6f 6d 69 74 73 20 74 68 65 20 52 4f 57 49 44 2e  omits the ROWID.
23dd0 20 20 43 6f 6d 70 61 72 65 20 74 68 69 73 20 6b    Compare this k
23de0 65 79 20 76 61 6c 75 65 20 61 67 61 69 6e 73 74  ey value against
23df0 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 74   the index .** t
23e00 68 61 74 20 50 31 20 69 73 20 63 75 72 72 65 6e  hat P1 is curren
23e10 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c  tly pointing to,
23e20 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 52 4f   ignoring the RO
23e30 57 49 44 20 6f 6e 20 74 68 65 20 50 31 20 69 6e  WID on the P1 in
23e40 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  dex..**.** If th
23e50 65 20 50 31 20 69 6e 64 65 78 20 65 6e 74 72 79  e P1 index entry
23e60 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
23e70 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
23e80 20 6b 65 79 20 76 61 6c 75 65 0a 2a 2a 20 74 68   key value.** th
23e90 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20  en jump to P2.  
23ea0 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74  Otherwise fall t
23eb0 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
23ec0 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  xt instruction..
23ed0 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 6e  **.** If P5 is n
23ee0 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 65  on-zero then the
23ef0 20 6b 65 79 20 76 61 6c 75 65 20 69 73 20 69 6e   key value is in
23f00 63 72 65 61 73 65 64 20 62 79 20 61 6e 20 65 70  creased by an ep
23f10 73 69 6c 6f 6e 20 0a 2a 2a 20 70 72 69 6f 72 20  silon .** prior 
23f20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  to the compariso
23f30 6e 2e 20 20 54 68 69 73 20 6d 61 6b 65 20 74 68  n.  This make th
23f40 65 20 6f 70 63 6f 64 65 20 77 6f 72 6b 20 6c 69  e opcode work li
23f50 6b 65 20 49 64 78 47 54 20 65 78 63 65 70 74 0a  ke IdxGT except.
23f60 2a 2a 20 74 68 61 74 20 69 66 20 74 68 65 20 6b  ** that if the k
23f70 65 79 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  ey from register
23f80 20 50 33 20 69 73 20 61 20 70 72 65 66 69 78 20   P3 is a prefix 
23f90 6f 66 20 74 68 65 20 6b 65 79 20 69 6e 20 74 68  of the key in th
23fa0 65 20 63 75 72 73 6f 72 2c 0a 2a 2a 20 74 68 65  e cursor,.** the
23fb0 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65   result is false
23fc0 20 77 68 65 72 65 61 73 20 69 74 20 77 6f 75 6c   whereas it woul
23fd0 64 20 62 65 20 74 72 75 65 20 77 69 74 68 20 49  d be true with I
23fe0 64 78 47 54 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  dxGT..*/./* Opco
23ff0 64 65 3a 20 49 64 78 4c 54 20 50 31 20 50 32 20  de: IdxLT P1 P2 
24000 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54  P3 P4 P5.**.** T
24010 68 65 20 50 34 20 72 65 67 69 73 74 65 72 20 76  he P4 register v
24020 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67 20  alues beginning 
24030 77 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e 20  with P3 form an 
24040 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 0a  unpacked index .
24050 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69 74  ** key that omit
24060 73 20 74 68 65 20 52 4f 57 49 44 2e 20 20 43 6f  s the ROWID.  Co
24070 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79 20 76  mpare this key v
24080 61 6c 75 65 20 61 67 61 69 6e 73 74 20 74 68 65  alue against the
24090 20 69 6e 64 65 78 20 0a 2a 2a 20 74 68 61 74 20   index .** that 
240a0 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  P1 is currently 
240b0 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e  pointing to, ign
240c0 6f 72 69 6e 67 20 74 68 65 20 52 4f 57 49 44 20  oring the ROWID 
240d0 6f 6e 20 74 68 65 20 50 31 20 69 6e 64 65 78 2e  on the P1 index.
240e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31  .**.** If the P1
240f0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20   index entry is 
24100 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6b 65  less than the ke
24110 79 20 76 61 6c 75 65 20 74 68 65 6e 20 6a 75 6d  y value then jum
24120 70 20 74 6f 20 50 32 2e 0a 2a 2a 20 4f 74 68 65  p to P2..** Othe
24130 72 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75  rwise fall throu
24140 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
24150 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
24160 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 6e 2d 7a  * If P5 is non-z
24170 65 72 6f 20 74 68 65 6e 20 74 68 65 20 6b 65 79  ero then the key
24180 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61   value is increa
24190 73 65 64 20 62 79 20 61 6e 20 65 70 73 69 6c 6f  sed by an epsilo
241a0 6e 20 70 72 69 6f 72 20 0a 2a 2a 20 74 6f 20 74  n prior .** to t
241b0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  he comparison.  
241c0 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 20 6f  This makes the o
241d0 70 63 6f 64 65 20 77 6f 72 6b 20 6c 69 6b 65 20  pcode work like 
241e0 49 64 78 4c 45 2e 0a 2a 2f 0a 63 61 73 65 20 4f  IdxLE..*/.case O
241f0 50 5f 49 64 78 4c 54 3a 20 20 20 20 20 20 20 20  P_IdxLT:        
24200 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73    /* jump */.cas
24210 65 20 4f 50 5f 49 64 78 47 45 3a 20 7b 20 20 20  e OP_IdxGE: {   
24220 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
24230 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
24240 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 55  ;.  int res;.  U
24250 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72 3b  npackedRecord r;
24260 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
24270 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
24280 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
24290 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
242a0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
242b0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
242c0 73 73 65 72 74 28 20 70 43 2d 3e 69 73 4f 72 64  ssert( pC->isOrd
242d0 65 72 65 64 20 29 3b 0a 20 20 69 66 28 20 41 4c  ered );.  if( AL
242e0 57 41 59 53 28 70 43 2d 3e 70 43 75 72 73 6f 72  WAYS(pC->pCursor
242f0 21 3d 30 29 20 29 7b 0a 20 20 20 20 61 73 73 65  !=0) ){.    asse
24300 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64  rt( pC->deferred
24310 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 20  Moveto==0 );.   
24320 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35   assert( pOp->p5
24330 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d  ==0 || pOp->p5==
24340 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
24350 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
24360 5f 49 4e 54 33 32 20 29 3b 0a 20 20 20 20 72 2e  _INT32 );.    r.
24370 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e 70  pKeyInfo = pC->p
24380 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 72 2e 6e  KeyInfo;.    r.n
24390 46 69 65 6c 64 20 3d 20 28 75 31 36 29 70 4f 70  Field = (u16)pOp
243a0 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 69 66 28 20  ->p4.i;.    if( 
243b0 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 20  pOp->p5 ){.     
243c0 20 72 2e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43   r.flags = UNPAC
243d0 4b 45 44 5f 49 4e 43 52 4b 45 59 20 7c 20 55 4e  KED_INCRKEY | UN
243e0 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f  PACKED_IGNORE_RO
243f0 57 49 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  WID;.    }else{.
24400 20 20 20 20 20 20 72 2e 66 6c 61 67 73 20 3d 20        r.flags = 
24410 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f  UNPACKED_IGNORE_
24420 52 4f 57 49 44 3b 0a 20 20 20 20 7d 0a 20 20 20  ROWID;.    }.   
24430 20 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b   r.aMem = &aMem[
24440 70 4f 70 2d 3e 70 33 5d 3b 0a 23 69 66 64 65 66  pOp->p3];.#ifdef
24450 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
24460 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28 69    { int i; for(i
24470 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20  =0; i<r.nField; 
24480 69 2b 2b 29 20 61 73 73 65 72 74 28 20 6d 65 6d  i++) assert( mem
24490 49 73 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b  IsValid(&r.aMem[
244a0 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a  i]) ); }.#endif.
244b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
244c0 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
244d0 65 28 70 43 2c 20 26 72 2c 20 26 72 65 73 29 3b  e(pC, &r, &res);
244e0 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
244f0 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54 20 29  code==OP_IdxLT )
24500 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 2d 72  {.      res = -r
24510 65 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  es;.    }else{. 
24520 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
24530 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78  ->opcode==OP_Idx
24540 47 45 20 29 3b 0a 20 20 20 20 20 20 72 65 73 2b  GE );.      res+
24550 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
24560 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
24570 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
24580 20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62   ;.    }.  }.  b
24590 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
245a0 64 65 3a 20 44 65 73 74 72 6f 79 20 50 31 20 50  de: Destroy P1 P
245b0 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44  2 P3 * *.**.** D
245c0 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
245d0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f  database table o
245e0 72 20 69 6e 64 65 78 20 77 68 6f 73 65 20 72 6f  r index whose ro
245f0 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ot page in the d
24600 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
24610 69 73 20 67 69 76 65 6e 20 62 79 20 50 31 2e 0a  is given by P1..
24620 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
24630 62 65 69 6e 67 20 64 65 73 74 72 6f 79 65 64 20  being destroyed 
24640 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  is in the main d
24650 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
24660 50 33 3d 3d 30 2e 20 20 49 66 0a 2a 2a 20 50 33  P3==0.  If.** P3
24670 3d 3d 31 20 74 68 65 6e 20 74 68 65 20 74 61 62  ==1 then the tab
24680 6c 65 20 74 6f 20 62 65 20 63 6c 65 61 72 20 69  le to be clear i
24690 73 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61  s in the auxilia
246a0 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
246b0 0a 2a 2a 20 74 68 61 74 20 69 73 20 75 73 65 64  .** that is used
246c0 20 74 6f 20 73 74 6f 72 65 20 74 61 62 6c 65 73   to store tables
246d0 20 63 72 65 61 74 65 20 75 73 69 6e 67 20 43 52   create using CR
246e0 45 41 54 45 20 54 45 4d 50 4f 52 41 52 59 20 54  EATE TEMPORARY T
246f0 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41  ABLE..**.** If A
24700 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61  UTOVACUUM is ena
24710 62 6c 65 64 20 74 68 65 6e 20 69 74 20 69 73 20  bled then it is 
24720 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 61 6e  possible that an
24730 6f 74 68 65 72 20 72 6f 6f 74 20 70 61 67 65 0a  other root page.
24740 2a 2a 20 6d 69 67 68 74 20 62 65 20 6d 6f 76 65  ** might be move
24750 64 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 6c 79  d into the newly
24760 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 20 70 61   deleted root pa
24770 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  ge in order to k
24780 65 65 70 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20  eep all.** root 
24790 70 61 67 65 73 20 63 6f 6e 74 69 67 75 6f 75 73  pages contiguous
247a0 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
247b0 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
247c0 65 2e 20 20 54 68 65 20 66 6f 72 6d 65 72 0a 2a  e.  The former.*
247d0 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72  * value of the r
247e0 6f 6f 74 20 70 61 67 65 20 74 68 61 74 20 6d 6f  oot page that mo
247f0 76 65 64 20 2d 20 69 74 73 20 76 61 6c 75 65 20  ved - its value 
24800 62 65 66 6f 72 65 20 74 68 65 20 6d 6f 76 65 20  before the move 
24810 6f 63 63 75 72 72 65 64 20 2d 0a 2a 2a 20 69 73  occurred -.** is
24820 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
24830 74 65 72 20 50 32 2e 20 20 49 66 20 6e 6f 20 70  ter P2.  If no p
24840 61 67 65 20 0a 2a 2a 20 6d 6f 76 65 6d 65 6e 74  age .** movement
24850 20 77 61 73 20 72 65 71 75 69 72 65 64 20 28 62   was required (b
24860 65 63 61 75 73 65 20 74 68 65 20 74 61 62 6c 65  ecause the table
24870 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 77   being dropped w
24880 61 73 20 61 6c 72 65 61 64 79 20 0a 2a 2a 20 74  as already .** t
24890 68 65 20 6c 61 73 74 20 6f 6e 65 20 69 6e 20 74  he last one in t
248a0 68 65 20 64 61 74 61 62 61 73 65 29 20 74 68 65  he database) the
248b0 6e 20 61 20 7a 65 72 6f 20 69 73 20 73 74 6f 72  n a zero is stor
248c0 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
248d0 32 2e 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43  2..** If AUTOVAC
248e0 55 55 4d 20 69 73 20 64 69 73 61 62 6c 65 64 20  UUM is disabled 
248f0 74 68 65 6e 20 61 20 7a 65 72 6f 20 69 73 20 73  then a zero is s
24900 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
24910 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  r P2..**.** See 
24920 61 6c 73 6f 3a 20 43 6c 65 61 72 0a 2a 2f 0a 63  also: Clear.*/.c
24930 61 73 65 20 4f 50 5f 44 65 73 74 72 6f 79 3a 20  ase OP_Destroy: 
24940 7b 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72  {     /* out2-pr
24950 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e  erelease */.  in
24960 74 20 69 4d 6f 76 65 64 3b 0a 20 20 69 6e 74 20  t iMoved;.  int 
24970 69 43 6e 74 3b 0a 20 20 56 64 62 65 20 2a 70 56  iCnt;.  Vdbe *pV
24980 64 62 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  dbe;.  int iDb;.
24990 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
249a0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
249b0 0a 20 20 69 43 6e 74 20 3d 20 30 3b 0a 20 20 66  .  iCnt = 0;.  f
249c0 6f 72 28 70 56 64 62 65 3d 64 62 2d 3e 70 56 64  or(pVdbe=db->pVd
249d0 62 65 3b 20 70 56 64 62 65 3b 20 70 56 64 62 65  be; pVdbe; pVdbe
249e0 20 3d 20 70 56 64 62 65 2d 3e 70 4e 65 78 74 29   = pVdbe->pNext)
249f0 7b 0a 20 20 20 20 69 66 28 20 70 56 64 62 65 2d  {.    if( pVdbe-
24a00 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
24a10 49 43 5f 52 55 4e 20 26 26 20 70 56 64 62 65 2d  IC_RUN && pVdbe-
24a20 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 3c 32 20  >inVtabMethod<2 
24a30 26 26 20 70 56 64 62 65 2d 3e 70 63 3e 3d 30 20  && pVdbe->pc>=0 
24a40 29 7b 0a 20 20 20 20 20 20 69 43 6e 74 2b 2b 3b  ){.      iCnt++;
24a50 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
24a60 0a 20 20 69 43 6e 74 20 3d 20 64 62 2d 3e 61 63  .  iCnt = db->ac
24a70 74 69 76 65 56 64 62 65 43 6e 74 3b 0a 23 65 6e  tiveVdbeCnt;.#en
24a80 64 69 66 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67  dif.  pOut->flag
24a90 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
24aa0 69 66 28 20 69 43 6e 74 3e 31 20 29 7b 0a 20 20  if( iCnt>1 ){.  
24ab0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f    rc = SQLITE_LO
24ac0 43 4b 45 44 3b 0a 20 20 20 20 70 2d 3e 65 72 72  CKED;.    p->err
24ad0 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
24ae0 6f 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ort;.  }else{.  
24af0 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 33 3b    iDb = pOp->p3;
24b00 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6e  .    assert( iCn
24b10 74 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  t==1 );.    asse
24b20 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73  rt( (p->btreeMas
24b30 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31  k & (((yDbMask)1
24b40 29 3c 3c 69 44 62 29 29 21 3d 30 20 29 3b 0a 20  )<<iDb))!=0 );. 
24b50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
24b60 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 64 62  treeDropTable(db
24b70 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20  ->aDb[iDb].pBt, 
24b80 70 4f 70 2d 3e 70 31 2c 20 26 69 4d 6f 76 65 64  pOp->p1, &iMoved
24b90 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61  );.    pOut->fla
24ba0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
24bb0 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 4d    pOut->u.i = iM
24bc0 6f 76 65 64 3b 0a 23 69 66 6e 64 65 66 20 53 51  oved;.#ifndef SQ
24bd0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
24be0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 72 63 3d  CUUM.    if( rc=
24bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4d  =SQLITE_OK && iM
24c00 6f 76 65 64 21 3d 30 20 29 7b 0a 20 20 20 20 20  oved!=0 ){.     
24c10 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65   sqlite3RootPage
24c20 4d 6f 76 65 64 28 64 62 2c 20 69 44 62 2c 20 69  Moved(db, iDb, i
24c30 4d 6f 76 65 64 2c 20 70 4f 70 2d 3e 70 31 29 3b  Moved, pOp->p1);
24c40 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 4f 50  .      /* All OP
24c50 5f 44 65 73 74 72 6f 79 20 6f 70 65 72 61 74 69  _Destroy operati
24c60 6f 6e 73 20 6f 63 63 75 72 20 6f 6e 20 74 68 65  ons occur on the
24c70 20 73 61 6d 65 20 62 74 72 65 65 20 2a 2f 0a 20   same btree */. 
24c80 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73       assert( res
24c90 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 3d  etSchemaOnFault=
24ca0 3d 30 20 7c 7c 20 72 65 73 65 74 53 63 68 65 6d  =0 || resetSchem
24cb0 61 4f 6e 46 61 75 6c 74 3d 3d 69 44 62 2b 31 20  aOnFault==iDb+1 
24cc0 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 53 63  );.      resetSc
24cd0 68 65 6d 61 4f 6e 46 61 75 6c 74 20 3d 20 69 44  hemaOnFault = iD
24ce0 62 2b 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  b+1;.    }.#endi
24cf0 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  f.  }.  break;.}
24d00 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6c 65  ../* Opcode: Cle
24d10 61 72 20 50 31 20 50 32 20 50 33 0a 2a 2a 0a 2a  ar P1 P2 P3.**.*
24d20 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 63 6f 6e  * Delete all con
24d30 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74  tents of the dat
24d40 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69  abase table or i
24d50 6e 64 65 78 20 77 68 6f 73 65 20 72 6f 6f 74 20  ndex whose root 
24d60 70 61 67 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64  page.** in the d
24d70 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
24d80 67 69 76 65 6e 20 62 79 20 50 31 2e 20 20 42 75  given by P1.  Bu
24d90 74 2c 20 75 6e 6c 69 6b 65 20 44 65 73 74 72 6f  t, unlike Destro
24da0 79 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 72 65 6d  y, do not.** rem
24db0 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 6f 72  ove the table or
24dc0 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20   index from the 
24dd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
24de0 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 62  *.** The table b
24df0 65 69 6e 67 20 63 6c 65 61 72 20 69 73 20 69 6e  eing clear is in
24e00 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
24e10 73 65 20 66 69 6c 65 20 69 66 20 50 32 3d 3d 30  se file if P2==0
24e20 2e 20 20 49 66 0a 2a 2a 20 50 32 3d 3d 31 20 74  .  If.** P2==1 t
24e30 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f  hen the table to
24e40 20 62 65 20 63 6c 65 61 72 20 69 73 20 69 6e 20   be clear is in 
24e50 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
24e60 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74  tabase file.** t
24e70 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  hat is used to s
24e80 74 6f 72 65 20 74 61 62 6c 65 73 20 63 72 65 61  tore tables crea
24e90 74 65 20 75 73 69 6e 67 20 43 52 45 41 54 45 20  te using CREATE 
24ea0 54 45 4d 50 4f 52 41 52 59 20 54 41 42 4c 45 2e  TEMPORARY TABLE.
24eb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 33  .**.** If the P3
24ec0 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65   value is non-ze
24ed0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 74 61 62  ro, then the tab
24ee0 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 6d  le referred to m
24ef0 75 73 74 20 62 65 20 61 6e 0a 2a 2a 20 69 6e 74  ust be an.** int
24f00 6b 65 79 20 74 61 62 6c 65 20 28 61 6e 20 53 51  key table (an SQ
24f10 4c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 6e 20  L table, not an 
24f20 69 6e 64 65 78 29 2e 20 49 6e 20 74 68 69 73 20  index). In this 
24f30 63 61 73 65 20 74 68 65 20 72 6f 77 20 63 68 61  case the row cha
24f40 6e 67 65 20 0a 2a 2a 20 63 6f 75 6e 74 20 69 73  nge .** count is
24f50 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20   incremented by 
24f60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
24f70 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
24f80 62 65 69 6e 67 20 63 6c 65 61 72 65 64 2e 20 0a  being cleared. .
24f90 2a 2a 20 49 66 20 50 33 20 69 73 20 67 72 65 61  ** If P3 is grea
24fa0 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
24fb0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 73 74  hen the value st
24fc0 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
24fd0 20 50 33 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 69   P3 is.** also i
24fe0 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68  ncremented by th
24ff0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
25000 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65   in the table be
25010 69 6e 67 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a  ing cleared..**.
25020 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 44 65 73  ** See also: Des
25030 74 72 6f 79 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  troy.*/.case OP_
25040 43 6c 65 61 72 3a 20 7b 0a 20 20 69 6e 74 20 6e  Clear: {.  int n
25050 43 68 61 6e 67 65 3b 0a 20 0a 20 20 6e 43 68 61  Change;. .  nCha
25060 6e 67 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  nge = 0;.  asser
25070 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  t( (p->btreeMask
25080 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31 29   & (((yDbMask)1)
25090 3c 3c 70 4f 70 2d 3e 70 32 29 29 21 3d 30 20 29  <<pOp->p2))!=0 )
250a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
250b0 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
250c0 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 70  .      db->aDb[p
250d0 4f 70 2d 3e 70 32 5d 2e 70 42 74 2c 20 70 4f 70  Op->p2].pBt, pOp
250e0 2d 3e 70 31 2c 20 28 70 4f 70 2d 3e 70 33 20 3f  ->p1, (pOp->p3 ?
250f0 20 26 6e 43 68 61 6e 67 65 20 3a 20 30 29 0a 20   &nChange : 0). 
25100 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   );.  if( pOp->p
25110 33 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 43 68 61  3 ){.    p->nCha
25120 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
25130 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 3e      if( pOp->p3>
25140 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
25150 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61  t( memIsValid(&a
25160 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20 29 3b  Mem[pOp->p3]) );
25170 0a 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54  .      memAboutT
25180 6f 43 68 61 6e 67 65 28 70 2c 20 26 61 4d 65 6d  oChange(p, &aMem
25190 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20  [pOp->p3]);.    
251a0 20 20 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2e    aMem[pOp->p3].
251b0 75 2e 69 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  u.i += nChange;.
251c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
251d0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
251e0 20 43 72 65 61 74 65 54 61 62 6c 65 20 50 31 20   CreateTable P1 
251f0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41  P2 * * *.**.** A
25200 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 74 61  llocate a new ta
25210 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
25220 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
25230 20 50 31 3d 3d 30 20 6f 72 20 69 6e 20 74 68 65   P1==0 or in the
25240 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61  .** auxiliary da
25250 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 50  tabase file if P
25260 31 3d 3d 31 20 6f 72 20 69 6e 20 61 6e 20 61 74  1==1 or in an at
25270 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20  tached database 
25280 69 66 0a 2a 2a 20 50 31 3e 31 2e 20 20 57 72 69  if.** P1>1.  Wri
25290 74 65 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  te the root page
252a0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
252b0 65 77 20 74 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a  ew table into.**
252c0 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 0a   register P2.**.
252d0 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
252e0 65 20 62 65 74 77 65 65 6e 20 61 20 74 61 62 6c  e between a tabl
252f0 65 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 69  e and an index i
25300 73 20 74 68 69 73 3a 20 20 41 20 74 61 62 6c 65  s this:  A table
25310 20 6d 75 73 74 0a 2a 2a 20 68 61 76 65 20 61 20   must.** have a 
25320 34 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6b  4-byte integer k
25330 65 79 20 61 6e 64 20 63 61 6e 20 68 61 76 65 20  ey and can have 
25340 61 72 62 69 74 72 61 72 79 20 64 61 74 61 2e 20  arbitrary data. 
25350 20 41 6e 20 69 6e 64 65 78 0a 2a 2a 20 68 61 73   An index.** has
25360 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6b 65   an arbitrary ke
25370 79 20 62 75 74 20 6e 6f 20 64 61 74 61 2e 0a 2a  y but no data..*
25380 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 43  *.** See also: C
25390 72 65 61 74 65 49 6e 64 65 78 0a 2a 2f 0a 2f 2a  reateIndex.*/./*
253a0 20 4f 70 63 6f 64 65 3a 20 43 72 65 61 74 65 49   Opcode: CreateI
253b0 6e 64 65 78 20 50 31 20 50 32 20 2a 20 2a 20 2a  ndex P1 P2 * * *
253c0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  .**.** Allocate 
253d0 61 20 6e 65 77 20 69 6e 64 65 78 20 69 6e 20 74  a new index in t
253e0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
253f0 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 30 20 6f   file if P1==0 o
25400 72 20 69 6e 20 74 68 65 0a 2a 2a 20 61 75 78 69  r in the.** auxi
25410 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66  liary database f
25420 69 6c 65 20 69 66 20 50 31 3d 3d 31 20 6f 72 20  ile if P1==1 or 
25430 69 6e 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  in an attached d
25440 61 74 61 62 61 73 65 20 69 66 0a 2a 2a 20 50 31  atabase if.** P1
25450 3e 31 2e 20 20 57 72 69 74 65 20 74 68 65 20 72  >1.  Write the r
25460 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
25470 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
25480 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65   into.** registe
25490 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  r P2..**.** See 
254a0 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6f 6e  documentation on
254b0 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20   OP_CreateTable 
254c0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
254d0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 63  nformation..*/.c
254e0 61 73 65 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  ase OP_CreateInd
254f0 65 78 3a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ex:            /
25500 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73  * out2-prereleas
25510 65 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 72 65  e */.case OP_Cre
25520 61 74 65 54 61 62 6c 65 3a 20 7b 20 20 20 20 20  ateTable: {     
25530 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65       /* out2-pre
25540 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
25550 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 66 6c 61   pgno;.  int fla
25560 67 73 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  gs;.  Db *pDb;..
25570 20 20 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 61 73    pgno = 0;.  as
25580 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
25590 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e   && pOp->p1<db->
255a0 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
255b0 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26   (p->btreeMask &
255c0 20 28 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c   (((yDbMask)1)<<
255d0 70 4f 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a  pOp->p1))!=0 );.
255e0 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
255f0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
25600 65 72 74 28 20 70 44 62 2d 3e 70 42 74 21 3d 30  ert( pDb->pBt!=0
25610 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f   );.  if( pOp->o
25620 70 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65  pcode==OP_Create
25630 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
25640 66 6c 61 67 73 20 3d 20 42 54 52 45 45 5f 49 4e  flags = BTREE_IN
25650 54 4b 45 59 3b 20 2a 2f 0a 20 20 20 20 66 6c 61  TKEY; */.    fla
25660 67 73 20 3d 20 42 54 52 45 45 5f 49 4e 54 4b 45  gs = BTREE_INTKE
25670 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
25680 66 6c 61 67 73 20 3d 20 42 54 52 45 45 5f 42 4c  flags = BTREE_BL
25690 4f 42 4b 45 59 3b 0a 20 20 7d 0a 20 20 72 63 20  OBKEY;.  }.  rc 
256a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72  = sqlite3BtreeCr
256b0 65 61 74 65 54 61 62 6c 65 28 70 44 62 2d 3e 70  eateTable(pDb->p
256c0 42 74 2c 20 26 70 67 6e 6f 2c 20 66 6c 61 67 73  Bt, &pgno, flags
256d0 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  );.  pOut->u.i =
256e0 20 70 67 6e 6f 3b 0a 20 20 62 72 65 61 6b 3b 0a   pgno;.  break;.
256f0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61  }../* Opcode: Pa
25700 72 73 65 53 63 68 65 6d 61 20 50 31 20 2a 20 2a  rseSchema P1 * *
25710 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64   P4 *.**.** Read
25720 20 61 6e 64 20 70 61 72 73 65 20 61 6c 6c 20 65   and parse all e
25730 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20  ntries from the 
25740 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
25750 62 6c 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ble of database 
25760 50 31 0a 2a 2a 20 74 68 61 74 20 6d 61 74 63 68  P1.** that match
25770 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
25780 65 20 50 34 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69  e P4. .**.** Thi
25790 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73  s opcode invokes
257a0 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 63   the parser to c
257b0 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
257c0 75 61 6c 20 6d 61 63 68 69 6e 65 2c 0a 2a 2a 20  ual machine,.** 
257d0 74 68 65 6e 20 72 75 6e 73 20 74 68 65 20 6e 65  then runs the ne
257e0 77 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  w virtual machin
257f0 65 2e 20 20 49 74 20 69 73 20 74 68 75 73 20 61  e.  It is thus a
25800 20 72 65 2d 65 6e 74 72 61 6e 74 20 6f 70 63 6f   re-entrant opco
25810 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50  de..*/.case OP_P
25820 61 72 73 65 53 63 68 65 6d 61 3a 20 7b 0a 20 20  arseSchema: {.  
25830 69 6e 74 20 69 44 62 3b 0a 20 20 63 6f 6e 73 74  int iDb;.  const
25840 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 3b 0a   char *zMaster;.
25850 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
25860 49 6e 69 74 44 61 74 61 20 69 6e 69 74 44 61 74  InitData initDat
25870 61 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 70 72 65  a;..  /* Any pre
25880 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
25890 74 68 61 74 20 69 6e 76 6f 6b 65 73 20 74 68 69  that invokes thi
258a0 73 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 68 6f  s opcode will ho
258b0 6c 64 20 6d 75 74 65 78 65 73 0a 20 20 2a 2a 20  ld mutexes.  ** 
258c0 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 2e 20  on every btree. 
258d0 20 54 68 69 73 20 69 73 20 61 20 70 72 65 72 65   This is a prere
258e0 71 75 69 73 69 74 65 20 66 6f 72 20 69 6e 76 6f  quisite for invo
258f0 6b 69 6e 67 20 0a 20 20 2a 2a 20 73 71 6c 69 74  king .  ** sqlit
25900 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b 28 29  e3InitCallback()
25910 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
25920 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
25930 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e  (iDb=0; iDb<db->
25940 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20  nDb; iDb++){.   
25950 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 31 20   assert( iDb==1 
25960 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  || sqlite3BtreeH
25970 6f 6c 64 73 4d 75 74 65 78 28 64 62 2d 3e 61 44  oldsMutex(db->aD
25980 62 5b 69 44 62 5d 2e 70 42 74 29 20 29 3b 0a 20  b[iDb].pBt) );. 
25990 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 44 62   }.#endif..  iDb
259a0 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 61 73   = pOp->p1;.  as
259b0 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
259c0 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
259d0 20 61 73 73 65 72 74 28 20 44 62 48 61 73 50 72   assert( DbHasPr
259e0 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
259f0 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
25a00 20 29 3b 0a 20 20 2f 2a 20 55 73 65 64 20 74 6f   );.  /* Used to
25a10 20 62 65 20 61 20 63 6f 6e 64 69 74 69 6f 6e 61   be a conditiona
25a20 6c 20 2a 2f 20 7b 0a 20 20 20 20 7a 4d 61 73 74  l */ {.    zMast
25a30 65 72 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  er = SCHEMA_TABL
25a40 45 28 69 44 62 29 3b 0a 20 20 20 20 69 6e 69 74  E(iDb);.    init
25a50 44 61 74 61 2e 64 62 20 3d 20 64 62 3b 0a 20 20  Data.db = db;.  
25a60 20 20 69 6e 69 74 44 61 74 61 2e 69 44 62 20 3d    initData.iDb =
25a70 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 69 6e   pOp->p1;.    in
25a80 69 74 44 61 74 61 2e 70 7a 45 72 72 4d 73 67 20  itData.pzErrMsg 
25a90 3d 20 26 70 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20  = &p->zErrMsg;. 
25aa0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
25ab0 33 4d 50 72 69 6e 74 66 28 64 62 2c 0a 20 20 20  3MPrintf(db,.   
25ac0 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
25ad0 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c 20  , rootpage, sql 
25ae0 46 52 4f 4d 20 27 25 71 27 2e 25 73 20 57 48 45  FROM '%q'.%s WHE
25af0 52 45 20 25 73 20 4f 52 44 45 52 20 42 59 20 72  RE %s ORDER BY r
25b00 6f 77 69 64 22 2c 0a 20 20 20 20 20 20 20 64 62  owid",.       db
25b10 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
25b20 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4f 70 2d 3e  , zMaster, pOp->
25b30 70 34 2e 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a  p4.z);.    if( z
25b40 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
25b50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
25b60 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
25b70 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
25b80 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a  init.busy==0 );.
25b90 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62        db->init.b
25ba0 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  usy = 1;.      i
25bb0 6e 69 74 44 61 74 61 2e 72 63 20 3d 20 53 51 4c  nitData.rc = SQL
25bc0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 61 73  ITE_OK;.      as
25bd0 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
25be0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
25bf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
25c00 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 73 71 6c  ec(db, zSql, sql
25c10 69 74 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b  ite3InitCallback
25c20 2c 20 26 69 6e 69 74 44 61 74 61 2c 20 30 29 3b  , &initData, 0);
25c30 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
25c40 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
25c50 69 6e 69 74 44 61 74 61 2e 72 63 3b 0a 20 20 20  initData.rc;.   
25c60 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
25c70 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  (db, zSql);.    
25c80 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20    db->init.busy 
25c90 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
25ca0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25cb0 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 67 6f 74  NOMEM ){.    got
25cc0 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20  o no_mem;.  }.  
25cd0 62 72 65 61 6b 3b 20 20 0a 7d 0a 0a 23 69 66 20  break;  .}..#if 
25ce0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
25cf0 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 29 0a 2f 2a  OMIT_ANALYZE)./*
25d00 20 4f 70 63 6f 64 65 3a 20 4c 6f 61 64 41 6e 61   Opcode: LoadAna
25d10 6c 79 73 69 73 20 50 31 20 2a 20 2a 20 2a 20 2a  lysis P1 * * * *
25d20 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  .**.** Read the 
25d30 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62  sqlite_stat1 tab
25d40 6c 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  le for database 
25d50 50 31 20 61 6e 64 20 6c 6f 61 64 20 74 68 65 20  P1 and load the 
25d60 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68  content.** of th
25d70 61 74 20 74 61 62 6c 65 20 69 6e 74 6f 20 74 68  at table into th
25d80 65 20 69 6e 74 65 72 6e 61 6c 20 69 6e 64 65 78  e internal index
25d90 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 54 68   hash table.  Th
25da0 69 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 2a 2a  is will cause.**
25db0 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 74 6f   the analysis to
25dc0 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 70 72   be used when pr
25dd0 65 70 61 72 69 6e 67 20 61 6c 6c 20 73 75 62 73  eparing all subs
25de0 65 71 75 65 6e 74 20 71 75 65 72 69 65 73 2e 0a  equent queries..
25df0 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 6f 61 64 41  */.case OP_LoadA
25e00 6e 61 6c 79 73 69 73 3a 20 7b 0a 20 20 61 73 73  nalysis: {.  ass
25e10 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
25e20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e  && pOp->p1<db->n
25e30 44 62 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Db );.  rc = sql
25e40 69 74 65 33 41 6e 61 6c 79 73 69 73 4c 6f 61 64  ite3AnalysisLoad
25e50 28 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20  (db, pOp->p1);. 
25e60 20 62 72 65 61 6b 3b 20 20 0a 7d 0a 23 65 6e 64   break;  .}.#end
25e70 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
25e80 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59  QLITE_OMIT_ANALY
25e90 5a 45 29 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64  ZE) */../* Opcod
25ea0 65 3a 20 44 72 6f 70 54 61 62 6c 65 20 50 31 20  e: DropTable P1 
25eb0 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52  * * P4 *.**.** R
25ec0 65 6d 6f 76 65 20 74 68 65 20 69 6e 74 65 72 6e  emove the intern
25ed0 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29 20 64  al (in-memory) d
25ee0 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 74  ata structures t
25ef0 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a 2a 20  hat describe.** 
25f00 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  the table named 
25f10 50 34 20 69 6e 20 64 61 74 61 62 61 73 65 20 50  P4 in database P
25f20 31 2e 20 20 54 68 69 73 20 69 73 20 63 61 6c 6c  1.  This is call
25f30 65 64 20 61 66 74 65 72 20 61 20 74 61 62 6c 65  ed after a table
25f40 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65 64 20 69  .** is dropped i
25f50 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
25f60 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70  the internal rep
25f70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
25f80 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e  he.** schema con
25f90 73 69 73 74 65 6e 74 20 77 69 74 68 20 77 68 61  sistent with wha
25fa0 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f  t is on disk..*/
25fb0 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70 54 61 62  .case OP_DropTab
25fc0 6c 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 55  le: {.  sqlite3U
25fd0 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61  nlinkAndDeleteTa
25fe0 62 6c 65 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c  ble(db, pOp->p1,
25ff0 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62   pOp->p4.z);.  b
26000 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
26010 64 65 3a 20 44 72 6f 70 49 6e 64 65 78 20 50 31  de: DropIndex P1
26020 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20   * * P4 *.**.** 
26030 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 74 65 72  Remove the inter
26040 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29 20  nal (in-memory) 
26050 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
26060 74 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a 2a  that describe.**
26070 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64   the index named
26080 20 50 34 20 69 6e 20 64 61 74 61 62 61 73 65 20   P4 in database 
26090 50 31 2e 20 20 54 68 69 73 20 69 73 20 63 61 6c  P1.  This is cal
260a0 6c 65 64 20 61 66 74 65 72 20 61 6e 20 69 6e 64  led after an ind
260b0 65 78 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65 64  ex.** is dropped
260c0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
260d0 70 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72  p the internal r
260e0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
260f0 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63   the.** schema c
26100 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 77  onsistent with w
26110 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a  hat is on disk..
26120 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70 49  */.case OP_DropI
26130 6e 64 65 78 3a 20 7b 0a 20 20 73 71 6c 69 74 65  ndex: {.  sqlite
26140 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
26150 49 6e 64 65 78 28 64 62 2c 20 70 4f 70 2d 3e 70  Index(db, pOp->p
26160 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  1, pOp->p4.z);. 
26170 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
26180 63 6f 64 65 3a 20 44 72 6f 70 54 72 69 67 67 65  code: DropTrigge
26190 72 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  r P1 * * P4 *.**
261a0 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69  .** Remove the i
261b0 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f  nternal (in-memo
261c0 72 79 29 20 64 61 74 61 20 73 74 72 75 63 74 75  ry) data structu
261d0 72 65 73 20 74 68 61 74 20 64 65 73 63 72 69 62  res that describ
261e0 65 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72  e.** the trigger
261f0 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64 61 74   named P4 in dat
26200 61 62 61 73 65 20 50 31 2e 20 20 54 68 69 73 20  abase P1.  This 
26210 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
26220 61 20 74 72 69 67 67 65 72 0a 2a 2a 20 69 73 20  a trigger.** is 
26230 64 72 6f 70 70 65 64 20 69 6e 20 6f 72 64 65 72  dropped in order
26240 20 74 6f 20 6b 65 65 70 20 74 68 65 20 69 6e 74   to keep the int
26250 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61  ernal representa
26260 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73  tion of the.** s
26270 63 68 65 6d 61 20 63 6f 6e 73 69 73 74 65 6e 74  chema consistent
26280 20 77 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e   with what is on
26290 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f   disk..*/.case O
262a0 50 5f 44 72 6f 70 54 72 69 67 67 65 72 3a 20 7b  P_DropTrigger: {
262b0 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  .  sqlite3Unlink
262c0 41 6e 64 44 65 6c 65 74 65 54 72 69 67 67 65 72  AndDeleteTrigger
262d0 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  (db, pOp->p1, pO
262e0 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61  p->p4.z);.  brea
262f0 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  k;.}...#ifndef S
26300 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
26310 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 20 4f 70  RITY_CHECK./* Op
26320 63 6f 64 65 3a 20 49 6e 74 65 67 72 69 74 79 43  code: IntegrityC
26330 6b 20 50 31 20 50 32 20 50 33 20 2a 20 50 35 0a  k P1 P2 P3 * P5.
26340 2a 2a 0a 2a 2a 20 44 6f 20 61 6e 20 61 6e 61 6c  **.** Do an anal
26350 79 73 69 73 20 6f 66 20 74 68 65 20 63 75 72 72  ysis of the curr
26360 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74 61 62  ently open datab
26370 61 73 65 2e 20 20 53 74 6f 72 65 20 69 6e 0a 2a  ase.  Store in.*
26380 2a 20 72 65 67 69 73 74 65 72 20 50 31 20 74 68  * register P1 th
26390 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 72 72  e text of an err
263a0 6f 72 20 6d 65 73 73 61 67 65 20 64 65 73 63 72  or message descr
263b0 69 62 69 6e 67 20 61 6e 79 20 70 72 6f 62 6c 65  ibing any proble
263c0 6d 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 70 72 6f  ms..** If no pro
263d0 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2c  blems are found,
263e0 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c 20 69 6e   store a NULL in
263f0 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a   register P1..**
26400 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74 65 72  .** The register
26410 20 50 33 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   P3 contains the
26420 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
26430 6f 66 20 61 6c 6c 6f 77 65 64 20 65 72 72 6f 72  of allowed error
26440 73 2e 0a 2a 2a 20 41 74 20 6d 6f 73 74 20 72 65  s..** At most re
26450 67 28 50 33 29 20 65 72 72 6f 72 73 20 77 69 6c  g(P3) errors wil
26460 6c 20 62 65 20 72 65 70 6f 72 74 65 64 2e 0a 2a  l be reported..*
26470 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
26480 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 73  , the analysis s
26490 74 6f 70 73 20 61 73 20 73 6f 6f 6e 20 61 73 20  tops as soon as 
264a0 72 65 67 28 50 31 29 20 65 72 72 6f 72 73 20 61  reg(P1) errors a
264b0 72 65 20 0a 2a 2a 20 73 65 65 6e 2e 20 20 52 65  re .** seen.  Re
264c0 67 28 50 31 29 20 69 73 20 75 70 64 61 74 65 64  g(P1) is updated
264d0 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62 65 72   with the number
264e0 20 6f 66 20 65 72 72 6f 72 73 20 72 65 6d 61 69   of errors remai
264f0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ning..**.** The 
26500 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
26510 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  s of all tables 
26520 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
26530 61 72 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 73  are integer.** s
26540 74 6f 72 65 64 20 69 6e 20 72 65 67 28 50 31 29  tored in reg(P1)
26550 2c 20 72 65 67 28 50 31 2b 31 29 2c 20 72 65 67  , reg(P1+1), reg
26560 28 50 31 2b 32 29 2c 20 2e 2e 2e 2e 20 20 54 68  (P1+2), ....  Th
26570 65 72 65 20 61 72 65 20 50 32 20 74 61 62 6c 65  ere are P2 table
26580 73 0a 2a 2a 20 74 6f 74 61 6c 2e 0a 2a 2a 0a 2a  s.** total..**.*
26590 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 74 20 7a  * If P5 is not z
265a0 65 72 6f 2c 20 74 68 65 20 63 68 65 63 6b 20 69  ero, the check i
265b0 73 20 64 6f 6e 65 20 6f 6e 20 74 68 65 20 61 75  s done on the au
265c0 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
265d0 0a 2a 2a 20 66 69 6c 65 2c 20 6e 6f 74 20 74 68  .** file, not th
265e0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
265f0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
26600 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
26610 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
26620 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
26630 20 70 72 61 67 6d 61 2e 0a 2a 2f 0a 63 61 73 65   pragma..*/.case
26640 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 3a   OP_IntegrityCk:
26650 20 7b 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 3b 20   {.  int nRoot; 
26660 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
26670 66 20 74 61 62 6c 65 73 20 74 6f 20 63 68 65 63  f tables to chec
26680 6b 2e 20 20 28 4e 75 6d 62 65 72 20 6f 66 20 72  k.  (Number of r
26690 6f 6f 74 20 70 61 67 65 73 2e 29 20 2a 2f 0a 20  oot pages.) */. 
266a0 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 20 20 20 20   int *aRoot;    
266b0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 6f 6f   /* Array of roo
266c0 74 70 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f  tpage numbers fo
266d0 72 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 63  r tables to be c
266e0 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  hecked */.  int 
266f0 6a 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  j;          /* L
26700 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
26710 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20   int nErr;      
26720 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
26730 72 6f 72 73 20 72 65 70 6f 72 74 65 64 20 2a 2f  rors reported */
26740 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
26750 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
26760 65 20 65 72 72 6f 72 20 72 65 70 6f 72 74 20 2a  e error report *
26770 2f 0a 20 20 4d 65 6d 20 2a 70 6e 45 72 72 3b 20  /.  Mem *pnErr; 
26780 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
26790 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66  keeping track of
267a0 20 65 72 72 6f 72 73 20 72 65 6d 61 69 6e 69 6e   errors remainin
267b0 67 20 2a 2f 0a 20 20 0a 20 20 6e 52 6f 6f 74 20  g */.  .  nRoot 
267c0 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73  = pOp->p2;.  ass
267d0 65 72 74 28 20 6e 52 6f 6f 74 3e 30 20 29 3b 0a  ert( nRoot>0 );.
267e0 20 20 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65    aRoot = sqlite
267f0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
26800 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 52   sizeof(int)*(nR
26810 6f 6f 74 2b 31 29 20 29 3b 0a 20 20 69 66 28 20  oot+1) );.  if( 
26820 61 52 6f 6f 74 3d 3d 30 20 29 20 67 6f 74 6f 20  aRoot==0 ) goto 
26830 6e 6f 5f 6d 65 6d 3b 0a 20 20 61 73 73 65 72 74  no_mem;.  assert
26840 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70  ( pOp->p3>0 && p
26850 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20  Op->p3<=p->nMem 
26860 29 3b 0a 20 20 70 6e 45 72 72 20 3d 20 26 61 4d  );.  pnErr = &aM
26870 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61  em[pOp->p3];.  a
26880 73 73 65 72 74 28 20 28 70 6e 45 72 72 2d 3e 66  ssert( (pnErr->f
26890 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21  lags & MEM_Int)!
268a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
268b0 28 70 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26 20  (pnErr->flags & 
268c0 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
268d0 62 29 29 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31  b))==0 );.  pIn1
268e0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
268f0 5d 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  ];.  for(j=0; j<
26900 6e 52 6f 6f 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nRoot; j++){.   
26910 20 61 52 6f 6f 74 5b 6a 5d 20 3d 20 28 69 6e 74   aRoot[j] = (int
26920 29 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56  )sqlite3VdbeIntV
26930 61 6c 75 65 28 26 70 49 6e 31 5b 6a 5d 29 3b 0a  alue(&pIn1[j]);.
26940 20 20 7d 0a 20 20 61 52 6f 6f 74 5b 6a 5d 20 3d    }.  aRoot[j] =
26950 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   0;.  assert( pO
26960 70 2d 3e 70 35 3c 64 62 2d 3e 6e 44 62 20 29 3b  p->p5<db->nDb );
26970 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62  .  assert( (p->b
26980 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44  treeMask & (((yD
26990 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e 70  bMask)1)<<pOp->p
269a0 35 29 29 21 3d 30 20 29 3b 0a 20 20 7a 20 3d 20  5))!=0 );.  z = 
269b0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65  sqlite3BtreeInte
269c0 67 72 69 74 79 43 68 65 63 6b 28 64 62 2d 3e 61  grityCheck(db->a
269d0 44 62 5b 70 4f 70 2d 3e 70 35 5d 2e 70 42 74 2c  Db[pOp->p5].pBt,
269e0 20 61 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 0a 20   aRoot, nRoot,. 
269f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a10 28 69 6e 74 29 70 6e 45 72 72 2d 3e 75 2e 69 2c  (int)pnErr->u.i,
26a20 20 26 6e 45 72 72 29 3b 0a 20 20 73 71 6c 69 74   &nErr);.  sqlit
26a30 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 52 6f  e3DbFree(db, aRo
26a40 6f 74 29 3b 0a 20 20 70 6e 45 72 72 2d 3e 75 2e  ot);.  pnErr->u.
26a50 69 20 2d 3d 20 6e 45 72 72 3b 0a 20 20 73 71 6c  i -= nErr;.  sql
26a60 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
26a70 6c 6c 28 70 49 6e 31 29 3b 0a 20 20 69 66 28 20  ll(pIn1);.  if( 
26a80 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nErr==0 ){.    a
26a90 73 73 65 72 74 28 20 7a 3d 3d 30 20 29 3b 0a 20  ssert( z==0 );. 
26aa0 20 7d 65 6c 73 65 20 69 66 28 20 7a 3d 3d 30 20   }else if( z==0 
26ab0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  ){.    goto no_m
26ac0 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  em;.  }else{.   
26ad0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
26ae0 65 74 53 74 72 28 70 49 6e 31 2c 20 7a 2c 20 2d  etStr(pIn1, z, -
26af0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
26b00 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
26b10 20 7d 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f   }.  UPDATE_MAX_
26b20 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31 29 3b 0a  BLOBSIZE(pIn1);.
26b30 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
26b40 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 49 6e 31  ngeEncoding(pIn1
26b50 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 62  , encoding);.  b
26b60 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
26b70 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
26b80 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
26b90 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77  ../* Opcode: Row
26ba0 53 65 74 41 64 64 20 50 31 20 50 32 20 2a 20 2a  SetAdd P1 P2 * *
26bb0 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 73 65 72 74 20   *.**.** Insert 
26bc0 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
26bd0 65 20 68 65 6c 64 20 62 79 20 72 65 67 69 73 74  e held by regist
26be0 65 72 20 50 32 20 69 6e 74 6f 20 61 20 62 6f 6f  er P2 into a boo
26bf0 6c 65 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 68 65  lean index.** he
26c00 6c 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ld in register P
26c10 31 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 61 73 73 65  1..**.** An asse
26c20 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 50  rtion fails if P
26c30 32 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  2 is not an inte
26c40 67 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ger..*/.case OP_
26c50 52 6f 77 53 65 74 41 64 64 3a 20 7b 20 20 20 20  RowSetAdd: {    
26c60 20 20 20 2f 2a 20 69 6e 31 2c 20 69 6e 32 20 2a     /* in1, in2 *
26c70 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
26c80 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e  [pOp->p1];.  pIn
26c90 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  2 = &aMem[pOp->p
26ca0 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  2];.  assert( (p
26cb0 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In2->flags & MEM
26cc0 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20 69 66  _Int)!=0 );.  if
26cd0 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
26ce0 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20   MEM_RowSet)==0 
26cf0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
26d00 62 65 4d 65 6d 53 65 74 52 6f 77 53 65 74 28 70  beMemSetRowSet(p
26d10 49 6e 31 29 3b 0a 20 20 20 20 69 66 28 20 28 70  In1);.    if( (p
26d20 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
26d30 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 20 67 6f  _RowSet)==0 ) go
26d40 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20  to no_mem;.  }. 
26d50 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74 49 6e   sqlite3RowSetIn
26d60 73 65 72 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f  sert(pIn1->u.pRo
26d70 77 53 65 74 2c 20 70 49 6e 32 2d 3e 75 2e 69 29  wSet, pIn2->u.i)
26d80 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
26d90 20 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 52   Opcode: RowSetR
26da0 65 61 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a  ead P1 P2 P3 * *
26db0 0a 2a 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20 74  .**.** Extract t
26dc0 68 65 20 73 6d 61 6c 6c 65 73 74 20 76 61 6c 75  he smallest valu
26dd0 65 20 66 72 6f 6d 20 62 6f 6f 6c 65 61 6e 20 69  e from boolean i
26de0 6e 64 65 78 20 50 31 20 61 6e 64 20 70 75 74 20  ndex P1 and put 
26df0 74 68 61 74 20 76 61 6c 75 65 20 69 6e 74 6f 0a  that value into.
26e00 2a 2a 20 72 65 67 69 73 74 65 72 20 50 33 2e 20  ** register P3. 
26e10 20 4f 72 2c 20 69 66 20 62 6f 6f 6c 65 61 6e 20   Or, if boolean 
26e20 69 6e 64 65 78 20 50 31 20 69 73 20 69 6e 69 74  index P1 is init
26e30 69 61 6c 6c 79 20 65 6d 70 74 79 2c 20 6c 65 61  ially empty, lea
26e40 76 65 20 50 33 0a 2a 2a 20 75 6e 63 68 61 6e 67  ve P3.** unchang
26e50 65 64 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 69  ed and jump to i
26e60 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 0a 2a  nstruction P2..*
26e70 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65 74  /.case OP_RowSet
26e80 52 65 61 64 3a 20 7b 20 20 20 20 20 20 20 2f 2a  Read: {       /*
26e90 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 6f 75 74 33   jump, in1, out3
26ea0 20 2a 2f 0a 20 20 69 36 34 20 76 61 6c 3b 0a 20   */.  i64 val;. 
26eb0 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52   CHECK_FOR_INTER
26ec0 52 55 50 54 3b 0a 20 20 70 49 6e 31 20 3d 20 26  RUPT;.  pIn1 = &
26ed0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
26ee0 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
26ef0 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d  s & MEM_RowSet)=
26f00 3d 30 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65  =0 .   || sqlite
26f10 33 52 6f 77 53 65 74 4e 65 78 74 28 70 49 6e 31  3RowSetNext(pIn1
26f20 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20 26 76 61  ->u.pRowSet, &va
26f30 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f  l)==0.  ){.    /
26f40 2a 20 54 68 65 20 62 6f 6f 6c 65 61 6e 20 69 6e  * The boolean in
26f50 64 65 78 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  dex is empty */.
26f60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
26f70 65 6d 53 65 74 4e 75 6c 6c 28 70 49 6e 31 29 3b  emSetNull(pIn1);
26f80 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70  .    pc = pOp->p
26f90 32 20 2d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2 - 1;.  }else{.
26fa0 20 20 20 20 2f 2a 20 41 20 76 61 6c 75 65 20 77      /* A value w
26fb0 61 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74  as pulled from t
26fc0 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  he index */.    
26fd0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
26fe0 74 49 6e 74 36 34 28 26 61 4d 65 6d 5b 70 4f 70  tInt64(&aMem[pOp
26ff0 2d 3e 70 33 5d 2c 20 76 61 6c 29 3b 0a 20 20 7d  ->p3], val);.  }
27000 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
27010 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 54 65  Opcode: RowSetTe
27020 73 74 20 50 31 20 50 32 20 50 33 20 50 34 0a 2a  st P1 P2 P3 P4.*
27030 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 33  *.** Register P3
27040 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
27050 6f 6c 64 20 61 20 36 34 2d 62 69 74 20 69 6e 74  old a 64-bit int
27060 65 67 65 72 20 76 61 6c 75 65 2e 20 49 66 20 72  eger value. If r
27070 65 67 69 73 74 65 72 20 50 31 0a 2a 2a 20 63 6f  egister P1.** co
27080 6e 74 61 69 6e 73 20 61 20 52 6f 77 53 65 74 20  ntains a RowSet 
27090 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20  object and that 
270a0 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 63 6f  RowSet object co
270b0 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61  ntains.** the va
270c0 6c 75 65 20 68 65 6c 64 20 69 6e 20 50 33 2c 20  lue held in P3, 
270d0 6a 75 6d 70 20 74 6f 20 72 65 67 69 73 74 65 72  jump to register
270e0 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20   P2. Otherwise, 
270f0 69 6e 73 65 72 74 20 74 68 65 0a 2a 2a 20 69 6e  insert the.** in
27100 74 65 67 65 72 20 69 6e 20 50 33 20 69 6e 74 6f  teger in P3 into
27110 20 74 68 65 20 52 6f 77 53 65 74 20 61 6e 64 20   the RowSet and 
27120 63 6f 6e 74 69 6e 75 65 20 6f 6e 20 74 6f 20 74  continue on to t
27130 68 65 0a 2a 2a 20 6e 65 78 74 20 6f 70 63 6f 64  he.** next opcod
27140 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 6f 77  e..**.** The Row
27150 53 65 74 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  Set object is op
27160 74 69 6d 69 7a 65 64 20 66 6f 72 20 74 68 65 20  timized for the 
27170 63 61 73 65 20 77 68 65 72 65 20 73 75 63 63 65  case where succe
27180 73 73 69 76 65 20 73 65 74 73 0a 2a 2a 20 6f 66  ssive sets.** of
27190 20 69 6e 74 65 67 65 72 73 2c 20 77 68 65 72 65   integers, where
271a0 20 65 61 63 68 20 73 65 74 20 63 6f 6e 74 61 69   each set contai
271b0 6e 73 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 73  ns no duplicates
271c0 2e 20 45 61 63 68 20 73 65 74 0a 2a 2a 20 6f 66  . Each set.** of
271d0 20 76 61 6c 75 65 73 20 69 73 20 69 64 65 6e 74   values is ident
271e0 69 66 69 65 64 20 62 79 20 61 20 75 6e 69 71 75  ified by a uniqu
271f0 65 20 50 34 20 76 61 6c 75 65 2e 20 54 68 65 20  e P4 value. The 
27200 66 69 72 73 74 20 73 65 74 0a 2a 2a 20 6d 75 73  first set.** mus
27210 74 20 68 61 76 65 20 50 34 3d 3d 30 2c 20 74 68  t have P4==0, th
27220 65 20 66 69 6e 61 6c 20 73 65 74 20 50 34 3d 2d  e final set P4=-
27230 31 2e 20 20 50 34 20 6d 75 73 74 20 62 65 20 65  1.  P4 must be e
27240 69 74 68 65 72 20 2d 31 20 6f 72 0a 2a 2a 20 6e  ither -1 or.** n
27250 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 20 20 46 6f  on-negative.  Fo
27260 72 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 76  r non-negative v
27270 61 6c 75 65 73 20 6f 66 20 50 34 20 6f 6e 6c 79  alues of P4 only
27280 20 74 68 65 20 6c 6f 77 65 72 20 34 0a 2a 2a 20   the lower 4.** 
27290 62 69 74 73 20 61 72 65 20 73 69 67 6e 69 66 69  bits are signifi
272a0 63 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cant..**.** This
272b0 20 61 6c 6c 6f 77 73 20 6f 70 74 69 6d 69 7a 61   allows optimiza
272c0 74 69 6f 6e 73 3a 20 28 61 29 20 77 68 65 6e 20  tions: (a) when 
272d0 50 34 3d 3d 30 20 74 68 65 72 65 20 69 73 20 6e  P4==0 there is n
272e0 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74 0a 2a  o need to test.*
272f0 2a 20 74 68 65 20 72 6f 77 73 65 74 20 6f 62 6a  * the rowset obj
27300 65 63 74 20 66 6f 72 20 50 33 2c 20 61 73 20 69  ect for P3, as i
27310 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
27320 6e 6f 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 69  not to contain i
27330 74 2c 0a 2a 2a 20 28 62 29 20 77 68 65 6e 20 50  t,.** (b) when P
27340 34 3d 3d 2d 31 20 74 68 65 72 65 20 69 73 20 6e  4==-1 there is n
27350 6f 20 6e 65 65 64 20 74 6f 20 69 6e 73 65 72 74  o need to insert
27360 20 74 68 65 20 76 61 6c 75 65 2c 20 61 73 20 69   the value, as i
27370 74 20 77 69 6c 6c 0a 2a 2a 20 6e 65 76 65 72 20  t will.** never 
27380 62 65 20 74 65 73 74 65 64 20 66 6f 72 2c 20 61  be tested for, a
27390 6e 64 20 28 63 29 20 77 68 65 6e 20 61 20 76 61  nd (c) when a va
273a0 6c 75 65 20 74 68 61 74 20 69 73 20 70 61 72 74  lue that is part
273b0 20 6f 66 20 73 65 74 20 58 20 69 73 0a 2a 2a 20   of set X is.** 
273c0 69 6e 73 65 72 74 65 64 2c 20 74 68 65 72 65 20  inserted, there 
273d0 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65  is no need to se
273e0 61 72 63 68 20 74 6f 20 73 65 65 20 69 66 20 74  arch to see if t
273f0 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 77 61  he same value wa
27400 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  s.** previously 
27410 69 6e 73 65 72 74 65 64 20 61 73 20 70 61 72 74  inserted as part
27420 20 6f 66 20 73 65 74 20 58 20 28 6f 6e 6c 79 20   of set X (only 
27430 69 66 20 69 74 20 77 61 73 20 70 72 65 76 69 6f  if it was previo
27440 75 73 6c 79 0a 2a 2a 20 69 6e 73 65 72 74 65 64  usly.** inserted
27450 20 61 73 20 70 61 72 74 20 6f 66 20 73 6f 6d 65   as part of some
27460 20 6f 74 68 65 72 20 73 65 74 29 2e 0a 2a 2f 0a   other set)..*/.
27470 63 61 73 65 20 4f 50 5f 52 6f 77 53 65 74 54 65  case OP_RowSetTe
27480 73 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  st: {           
27490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d            /* jum
274a0 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 20  p, in1, in3 */. 
274b0 20 69 6e 74 20 69 53 65 74 3b 0a 20 20 69 6e 74   int iSet;.  int
274c0 20 65 78 69 73 74 73 3b 0a 0a 20 20 70 49 6e 31   exists;..  pIn1
274d0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
274e0 5d 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65  ];.  pIn3 = &aMe
274f0 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 53  m[pOp->p3];.  iS
27500 65 74 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  et = pOp->p4.i;.
27510 20 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e    assert( pIn3->
27520 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b  flags&MEM_Int );
27530 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
27540 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65  is anything othe
27550 72 20 74 68 61 6e 20 61 20 72 6f 77 73 65 74 20  r than a rowset 
27560 6f 62 6a 65 63 74 20 69 6e 20 6d 65 6d 6f 72 79  object in memory
27570 20 63 65 6c 6c 20 50 31 2c 0a 20 20 2a 2a 20 64   cell P1,.  ** d
27580 65 6c 65 74 65 20 69 74 20 6e 6f 77 20 61 6e 64  elete it now and
27590 20 69 6e 69 74 69 61 6c 69 7a 65 20 50 31 20 77   initialize P1 w
275a0 69 74 68 20 61 6e 20 65 6d 70 74 79 20 72 6f 77  ith an empty row
275b0 73 65 74 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  set.  */.  if( (
275c0 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
275d0 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 7b 0a  M_RowSet)==0 ){.
275e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
275f0 65 6d 53 65 74 52 6f 77 53 65 74 28 70 49 6e 31  emSetRowSet(pIn1
27600 29 3b 0a 20 20 20 20 69 66 28 20 28 70 49 6e 31  );.    if( (pIn1
27610 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
27620 77 53 65 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20  wSet)==0 ) goto 
27630 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 61  no_mem;.  }..  a
27640 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79  ssert( pOp->p4ty
27650 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a  pe==P4_INT32 );.
27660 20 20 61 73 73 65 72 74 28 20 69 53 65 74 3d 3d    assert( iSet==
27670 2d 31 20 7c 7c 20 69 53 65 74 3e 3d 30 20 29 3b  -1 || iSet>=0 );
27680 0a 20 20 69 66 28 20 69 53 65 74 20 29 7b 0a 20  .  if( iSet ){. 
27690 20 20 20 65 78 69 73 74 73 20 3d 20 73 71 6c 69     exists = sqli
276a0 74 65 33 52 6f 77 53 65 74 54 65 73 74 28 70 49  te3RowSetTest(pI
276b0 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20 0a  n1->u.pRowSet, .
276c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
276e0 75 38 29 28 69 53 65 74 3e 3d 30 20 3f 20 69 53  u8)(iSet>=0 ? iS
276f0 65 74 20 26 20 30 78 66 20 3a 20 30 78 66 66 29  et & 0xf : 0xff)
27700 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27720 20 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 20   pIn3->u.i);.   
27730 20 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20   if( exists ){. 
27740 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70       pc = pOp->p
27750 32 20 2d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  2 - 1;.      bre
27760 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
27770 69 66 28 20 69 53 65 74 3e 3d 30 20 29 7b 0a 20  if( iSet>=0 ){. 
27780 20 20 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74     sqlite3RowSet
27790 49 6e 73 65 72 74 28 70 49 6e 31 2d 3e 75 2e 70  Insert(pIn1->u.p
277a0 52 6f 77 53 65 74 2c 20 70 49 6e 33 2d 3e 75 2e  RowSet, pIn3->u.
277b0 69 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  i);.  }.  break;
277c0 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
277d0 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
277e0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 72 6f  ../* Opcode: Pro
277f0 67 72 61 6d 20 50 31 20 50 32 20 50 33 20 50 34  gram P1 P2 P3 P4
27800 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75 74 65   *.**.** Execute
27810 20 74 68 65 20 74 72 69 67 67 65 72 20 70 72 6f   the trigger pro
27820 67 72 61 6d 20 70 61 73 73 65 64 20 61 73 20 50  gram passed as P
27830 34 20 28 74 79 70 65 20 50 34 5f 53 55 42 50 52  4 (type P4_SUBPR
27840 4f 47 52 41 4d 29 2e 20 0a 2a 2a 0a 2a 2a 20 50  OGRAM). .**.** P
27850 31 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61  1 contains the a
27860 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6d 65  ddress of the me
27870 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 63  mory cell that c
27880 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72 73  ontains the firs
27890 74 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c  t memory .** cel
278a0 6c 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  l in an array of
278b0 20 76 61 6c 75 65 73 20 75 73 65 64 20 61 73 20   values used as 
278c0 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
278d0 20 73 75 62 2d 70 72 6f 67 72 61 6d 2e 20 50 32   sub-program. P2
278e0 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68   .** contains th
278f0 65 20 61 64 64 72 65 73 73 20 74 6f 20 6a 75 6d  e address to jum
27900 70 20 74 6f 20 69 66 20 74 68 65 20 73 75 62 2d  p to if the sub-
27910 70 72 6f 67 72 61 6d 20 74 68 72 6f 77 73 20 61  program throws a
27920 6e 20 49 47 4e 4f 52 45 20 0a 2a 2a 20 65 78 63  n IGNORE .** exc
27930 65 70 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65  eption using the
27940 20 52 41 49 53 45 28 29 20 66 75 6e 63 74 69 6f   RAISE() functio
27950 6e 2e 20 52 65 67 69 73 74 65 72 20 50 33 20 63  n. Register P3 c
27960 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64 72  ontains the addr
27970 65 73 73 20 0a 2a 2a 20 6f 66 20 61 20 6d 65 6d  ess .** of a mem
27980 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74 68 69 73  ory cell in this
27990 20 28 74 68 65 20 70 61 72 65 6e 74 29 20 56 4d   (the parent) VM
279a0 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f   that is used to
279b0 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 0a 2a   allocate the .*
279c0 2a 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65  * memory require
279d0 64 20 62 79 20 74 68 65 20 73 75 62 2d 76 64 62  d by the sub-vdb
279e0 65 20 61 74 20 72 75 6e 74 69 6d 65 2e 0a 2a 2a  e at runtime..**
279f0 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e  .** P4 is a poin
27a00 74 65 72 20 74 6f 20 74 68 65 20 56 4d 20 63 6f  ter to the VM co
27a10 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 72 69  ntaining the tri
27a20 67 67 65 72 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  gger program..*/
27a30 0a 63 61 73 65 20 4f 50 5f 50 72 6f 67 72 61 6d  .case OP_Program
27a40 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
27a50 6d 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  mp */.  int nMem
27a60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27a70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d  /* Number of mem
27a80 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 66 6f  ory registers fo
27a90 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 2a 2f  r sub-program */
27aa0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
27ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
27ac0 74 65 73 20 6f 66 20 72 75 6e 74 69 6d 65 20 73  tes of runtime s
27ad0 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
27ae0 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 2a 2f  r sub-program */
27af0 0a 20 20 4d 65 6d 20 2a 70 52 74 3b 20 20 20 20  .  Mem *pRt;    
27b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
27b10 67 69 73 74 65 72 20 74 6f 20 61 6c 6c 6f 63 61  gister to alloca
27b20 74 65 20 72 75 6e 74 69 6d 65 20 73 70 61 63 65  te runtime space
27b30 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b   */.  Mem *pMem;
27b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27b50 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
27b60 20 74 68 72 6f 75 67 68 20 6d 65 6d 6f 72 79 20   through memory 
27b70 63 65 6c 6c 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a  cells */.  Mem *
27b80 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
27b90 20 20 20 2f 2a 20 4c 61 73 74 20 6d 65 6d 6f 72     /* Last memor
27ba0 79 20 63 65 6c 6c 20 69 6e 20 6e 65 77 20 61 72  y cell in new ar
27bb0 72 61 79 20 2a 2f 0a 20 20 56 64 62 65 46 72 61  ray */.  VdbeFra
27bc0 6d 65 20 2a 70 46 72 61 6d 65 3b 20 20 20 20 20  me *pFrame;     
27bd0 20 2f 2a 20 4e 65 77 20 76 64 62 65 20 66 72 61   /* New vdbe fra
27be0 6d 65 20 74 6f 20 65 78 65 63 75 74 65 20 69 6e  me to execute in
27bf0 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
27c00 20 2a 70 50 72 6f 67 72 61 6d 3b 20 20 20 2f 2a   *pProgram;   /*
27c10 20 53 75 62 2d 70 72 6f 67 72 61 6d 20 74 6f 20   Sub-program to 
27c20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 76 6f 69  execute */.  voi
27c30 64 20 2a 74 3b 20 20 20 20 20 20 20 20 20 20 20  d *t;           
27c40 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 69 64       /* Token id
27c50 65 6e 74 69 66 79 69 6e 67 20 74 72 69 67 67 65  entifying trigge
27c60 72 20 2a 2f 0a 0a 20 20 70 50 72 6f 67 72 61 6d  r */..  pProgram
27c70 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67   = pOp->p4.pProg
27c80 72 61 6d 3b 0a 20 20 70 52 74 20 3d 20 26 61 4d  ram;.  pRt = &aM
27c90 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61  em[pOp->p3];.  a
27ca0 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
27cb0 64 28 70 52 74 29 20 29 3b 0a 20 20 61 73 73 65  d(pRt) );.  asse
27cc0 72 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f  rt( pProgram->nO
27cd0 70 3e 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  p>0 );.  .  /* I
27ce0 66 20 74 68 65 20 70 35 20 66 6c 61 67 20 69 73  f the p5 flag is
27cf0 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 72 65 63   clear, then rec
27d00 75 72 73 69 76 65 20 69 6e 76 6f 63 61 74 69 6f  ursive invocatio
27d10 6e 20 6f 66 20 74 72 69 67 67 65 72 73 20 69 73  n of triggers is
27d20 20 0a 20 20 2a 2a 20 64 69 73 61 62 6c 65 64 20   .  ** disabled 
27d30 66 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f  for backwards co
27d40 6d 70 61 74 69 62 69 6c 69 74 79 20 28 70 35 20  mpatibility (p5 
27d50 69 73 20 73 65 74 20 69 66 20 74 68 69 73 20 73  is set if this s
27d60 75 62 2d 70 72 6f 67 72 61 6d 0a 20 20 2a 2a 20  ub-program.  ** 
27d70 69 73 20 72 65 61 6c 6c 79 20 61 20 74 72 69 67  is really a trig
27d80 67 65 72 2c 20 6e 6f 74 20 61 20 66 6f 72 65 69  ger, not a forei
27d90 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 2c 20 61  gn key action, a
27da0 6e 64 20 74 68 65 20 66 6c 61 67 20 73 65 74 0a  nd the flag set.
27db0 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 65 64    ** and cleared
27dc0 20 62 79 20 74 68 65 20 22 50 52 41 47 4d 41 20   by the "PRAGMA 
27dd0 72 65 63 75 72 73 69 76 65 5f 74 72 69 67 67 65  recursive_trigge
27de0 72 73 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 63  rs" command is c
27df0 6c 65 61 72 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a  lear)..  ** .  *
27e00 2a 20 49 74 20 69 73 20 72 65 63 75 72 73 69 76  * It is recursiv
27e10 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20  e invocation of 
27e20 74 72 69 67 67 65 72 73 2c 20 61 74 20 74 68 65  triggers, at the
27e30 20 53 51 4c 20 6c 65 76 65 6c 2c 20 74 68 61 74   SQL level, that
27e40 20 69 73 20 0a 20 20 2a 2a 20 64 69 73 61 62 6c   is .  ** disabl
27e50 65 64 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  ed. In some case
27e60 73 20 61 20 73 69 6e 67 6c 65 20 74 72 69 67 67  s a single trigg
27e70 65 72 20 6d 61 79 20 67 65 6e 65 72 61 74 65 20  er may generate 
27e80 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 0a 20  more than one . 
27e90 20 2a 2a 20 53 75 62 50 72 6f 67 72 61 6d 20 28   ** SubProgram (
27ea0 69 66 20 74 68 65 20 74 72 69 67 67 65 72 20 6d  if the trigger m
27eb0 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77  ay be executed w
27ec0 69 74 68 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ith more than on
27ed0 65 20 64 69 66 66 65 72 65 6e 74 20 0a 20 20 2a  e different .  *
27ee0 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 61 6c  * ON CONFLICT al
27ef0 67 6f 72 69 74 68 6d 29 2e 20 53 75 62 50 72 6f  gorithm). SubPro
27f00 67 72 61 6d 20 73 74 72 75 63 74 75 72 65 73 20  gram structures 
27f10 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
27f20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65 20 74 72  a.  ** single tr
27f30 69 67 67 65 72 20 61 6c 6c 20 68 61 76 65 20 74  igger all have t
27f40 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 66 6f  he same value fo
27f50 72 20 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d  r the SubProgram
27f60 2e 74 6f 6b 65 6e 20 0a 20 20 2a 2a 20 76 61 72  .token .  ** var
27f70 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28  iable.  */.  if(
27f80 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20   pOp->p5 ){.    
27f90 74 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 74 6f  t = pProgram->to
27fa0 6b 65 6e 3b 0a 20 20 20 20 66 6f 72 28 70 46 72  ken;.    for(pFr
27fb0 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70  ame=p->pFrame; p
27fc0 46 72 61 6d 65 20 26 26 20 70 46 72 61 6d 65 2d  Frame && pFrame-
27fd0 3e 74 6f 6b 65 6e 21 3d 74 3b 20 70 46 72 61 6d  >token!=t; pFram
27fe0 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  e=pFrame->pParen
27ff0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72 61  t);.    if( pFra
28000 6d 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  me ) break;.  }.
28010 0a 20 20 69 66 28 20 70 2d 3e 6e 46 72 61 6d 65  .  if( p->nFrame
28020 3e 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  >=db->aLimit[SQL
28030 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
28040 52 5f 44 45 50 54 48 5d 20 29 7b 0a 20 20 20 20  R_DEPTH] ){.    
28050 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
28060 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  R;.    sqlite3Se
28070 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
28080 4d 73 67 2c 20 64 62 2c 20 22 74 6f 6f 20 6d 61  Msg, db, "too ma
28090 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 69  ny levels of tri
280a0 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e 22 29  gger recursion")
280b0 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
280c0 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  ..  /* Register 
280d0 70 52 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  pRt is used to s
280e0 74 6f 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  tore the memory 
280f0 72 65 71 75 69 72 65 64 20 74 6f 20 73 61 76 65  required to save
28100 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20   the state.  ** 
28110 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  of the current p
28120 72 6f 67 72 61 6d 2c 20 61 6e 64 20 74 68 65 20  rogram, and the 
28130 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20  memory required 
28140 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 65 78  at runtime to ex
28150 65 63 75 74 65 0a 20 20 2a 2a 20 74 68 65 20 74  ecute.  ** the t
28160 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2e 20  rigger program. 
28170 49 66 20 74 68 69 73 20 74 72 69 67 67 65 72 20  If this trigger 
28180 68 61 73 20 62 65 65 6e 20 66 69 72 65 64 20 62  has been fired b
28190 65 66 6f 72 65 2c 20 74 68 65 6e 20 70 52 74 20  efore, then pRt 
281a0 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  .  ** is already
281b0 20 61 6c 6c 6f 63 61 74 65 64 2e 20 4f 74 68 65   allocated. Othe
281c0 72 77 69 73 65 2c 20 69 74 20 6d 75 73 74 20 62  rwise, it must b
281d0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  e initialized.  
281e0 2a 2f 0a 20 20 69 66 28 20 28 70 52 74 2d 3e 66  */.  if( (pRt->f
281f0 6c 61 67 73 26 4d 45 4d 5f 46 72 61 6d 65 29 3d  lags&MEM_Frame)=
28200 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 75 62  =0 ){.    /* Sub
28210 50 72 6f 67 72 61 6d 2e 6e 4d 65 6d 20 69 73 20  Program.nMem is 
28220 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
28230 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  r of memory cell
28240 73 20 75 73 65 64 20 62 79 20 74 68 65 20 0a 20  s used by the . 
28250 20 20 20 2a 2a 20 70 72 6f 67 72 61 6d 20 73 74     ** program st
28260 6f 72 65 64 20 69 6e 20 53 75 62 50 72 6f 67 72  ored in SubProgr
28270 61 6d 2e 61 4f 70 2e 20 41 73 20 77 65 6c 6c 20  am.aOp. As well 
28280 61 73 20 74 68 65 73 65 2c 20 6f 6e 65 20 6d 65  as these, one me
28290 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  mory.    ** cell
282a0 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
282b0 20 65 61 63 68 20 63 75 72 73 6f 72 20 75 73 65   each cursor use
282c0 64 20 62 79 20 74 68 65 20 70 72 6f 67 72 61 6d  d by the program
282d0 2e 20 53 65 74 20 6c 6f 63 61 6c 0a 20 20 20 20  . Set local.    
282e0 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 4d 65 6d  ** variable nMem
282f0 20 28 61 6e 64 20 6c 61 74 65 72 2c 20 56 64 62   (and later, Vdb
28300 65 46 72 61 6d 65 2e 6e 43 68 69 6c 64 4d 65 6d  eFrame.nChildMem
28310 29 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e  ) to this value.
28320 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4d 65 6d  .    */.    nMem
28330 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65   = pProgram->nMe
28340 6d 20 2b 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43  m + pProgram->nC
28350 73 72 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  sr;.    nByte = 
28360 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 56 64  ROUND8(sizeof(Vd
28370 62 65 46 72 61 6d 65 29 29 0a 20 20 20 20 20 20  beFrame)).      
28380 20 20 20 20 20 20 20 20 2b 20 6e 4d 65 6d 20 2a          + nMem *
28390 20 73 69 7a 65 6f 66 28 4d 65 6d 29 0a 20 20 20   sizeof(Mem).   
283a0 20 20 20 20 20 20 20 20 20 20 20 2b 20 70 50 72             + pPr
283b0 6f 67 72 61 6d 2d 3e 6e 43 73 72 20 2a 20 73 69  ogram->nCsr * si
283c0 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 20  zeof(VdbeCursor 
283d0 2a 29 3b 0a 20 20 20 20 70 46 72 61 6d 65 20 3d  *);.    pFrame =
283e0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
283f0 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b  Zero(db, nByte);
28400 0a 20 20 20 20 69 66 28 20 21 70 46 72 61 6d 65  .    if( !pFrame
28410 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e   ){.      goto n
28420 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  o_mem;.    }.   
28430 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
28440 65 6c 65 61 73 65 28 70 52 74 29 3b 0a 20 20 20  elease(pRt);.   
28450 20 70 52 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45   pRt->flags = ME
28460 4d 5f 46 72 61 6d 65 3b 0a 20 20 20 20 70 52 74  M_Frame;.    pRt
28470 2d 3e 75 2e 70 46 72 61 6d 65 20 3d 20 70 46 72  ->u.pFrame = pFr
28480 61 6d 65 3b 0a 0a 20 20 20 20 70 46 72 61 6d 65  ame;..    pFrame
28490 2d 3e 76 20 3d 20 70 3b 0a 20 20 20 20 70 46 72  ->v = p;.    pFr
284a0 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 20 3d  ame->nChildMem =
284b0 20 6e 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d   nMem;.    pFram
284c0 65 2d 3e 6e 43 68 69 6c 64 43 73 72 20 3d 20 70  e->nChildCsr = p
284d0 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b 0a 20  Program->nCsr;. 
284e0 20 20 20 70 46 72 61 6d 65 2d 3e 70 63 20 3d 20     pFrame->pc = 
284f0 70 63 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e  pc;.    pFrame->
28500 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a  aMem = p->aMem;.
28510 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d      pFrame->nMem
28520 20 3d 20 70 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20   = p->nMem;.    
28530 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 20 3d 20  pFrame->apCsr = 
28540 70 2d 3e 61 70 43 73 72 3b 0a 20 20 20 20 70 46  p->apCsr;.    pF
28550 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  rame->nCursor = 
28560 70 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20  p->nCursor;.    
28570 70 46 72 61 6d 65 2d 3e 61 4f 70 20 3d 20 70 2d  pFrame->aOp = p-
28580 3e 61 4f 70 3b 0a 20 20 20 20 70 46 72 61 6d 65  >aOp;.    pFrame
28590 2d 3e 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  ->nOp = p->nOp;.
285a0 20 20 20 20 70 46 72 61 6d 65 2d 3e 74 6f 6b 65      pFrame->toke
285b0 6e 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 74 6f  n = pProgram->to
285c0 6b 65 6e 3b 0a 0a 20 20 20 20 70 45 6e 64 20 3d  ken;..    pEnd =
285d0 20 26 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70   &VdbeFrameMem(p
285e0 46 72 61 6d 65 29 5b 70 46 72 61 6d 65 2d 3e 6e  Frame)[pFrame->n
285f0 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 20 20 66  ChildMem];.    f
28600 6f 72 28 70 4d 65 6d 3d 56 64 62 65 46 72 61 6d  or(pMem=VdbeFram
28610 65 4d 65 6d 28 70 46 72 61 6d 65 29 3b 20 70 4d  eMem(pFrame); pM
28620 65 6d 21 3d 70 45 6e 64 3b 20 70 4d 65 6d 2b 2b  em!=pEnd; pMem++
28630 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ){.      pMem->f
28640 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
28650 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20  .      pMem->db 
28660 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  = db;.    }.  }e
28670 6c 73 65 7b 0a 20 20 20 20 70 46 72 61 6d 65 20  lse{.    pFrame 
28680 3d 20 70 52 74 2d 3e 75 2e 70 46 72 61 6d 65 3b  = pRt->u.pFrame;
28690 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72  .    assert( pPr
286a0 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 2b 70 50 72 6f  ogram->nMem+pPro
286b0 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 70 46 72 61  gram->nCsr==pFra
286c0 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 20 29 3b  me->nChildMem );
286d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72  .    assert( pPr
286e0 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 70 46 72  ogram->nCsr==pFr
286f0 61 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72 20 29  ame->nChildCsr )
28700 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63  ;.    assert( pc
28710 3d 3d 70 46 72 61 6d 65 2d 3e 70 63 20 29 3b 0a  ==pFrame->pc );.
28720 20 20 7d 0a 0a 20 20 70 2d 3e 6e 46 72 61 6d 65    }..  p->nFrame
28730 2b 2b 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 50  ++;.  pFrame->pP
28740 61 72 65 6e 74 20 3d 20 70 2d 3e 70 46 72 61 6d  arent = p->pFram
28750 65 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 6c 61 73  e;.  pFrame->las
28760 74 52 6f 77 69 64 20 3d 20 6c 61 73 74 52 6f 77  tRowid = lastRow
28770 69 64 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 6e 43  id;.  pFrame->nC
28780 68 61 6e 67 65 20 3d 20 70 2d 3e 6e 43 68 61 6e  hange = p->nChan
28790 67 65 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65  ge;.  p->nChange
287a0 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 46 72 61 6d   = 0;.  p->pFram
287b0 65 20 3d 20 70 46 72 61 6d 65 3b 0a 20 20 70 2d  e = pFrame;.  p-
287c0 3e 61 4d 65 6d 20 3d 20 61 4d 65 6d 20 3d 20 26  >aMem = aMem = &
287d0 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 46 72  VdbeFrameMem(pFr
287e0 61 6d 65 29 5b 2d 31 5d 3b 0a 20 20 70 2d 3e 6e  ame)[-1];.  p->n
287f0 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  Mem = pFrame->nC
28800 68 69 6c 64 4d 65 6d 3b 0a 20 20 70 2d 3e 6e 43  hildMem;.  p->nC
28810 75 72 73 6f 72 20 3d 20 28 75 31 36 29 70 46 72  ursor = (u16)pFr
28820 61 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 0a  ame->nChildCsr;.
28830 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 56 64    p->apCsr = (Vd
28840 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65  beCursor **)&aMe
28850 6d 5b 70 2d 3e 6e 4d 65 6d 2b 31 5d 3b 0a 20 20  m[p->nMem+1];.  
28860 70 2d 3e 61 4f 70 20 3d 20 61 4f 70 20 3d 20 70  p->aOp = aOp = p
28870 50 72 6f 67 72 61 6d 2d 3e 61 4f 70 3b 0a 20 20  Program->aOp;.  
28880 70 2d 3e 6e 4f 70 20 3d 20 70 50 72 6f 67 72 61  p->nOp = pProgra
28890 6d 2d 3e 6e 4f 70 3b 0a 20 20 70 63 20 3d 20 2d  m->nOp;.  pc = -
288a0 31 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  1;..  break;.}..
288b0 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61 72 61 6d  /* Opcode: Param
288c0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
288d0 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69  ** This opcode i
288e0 73 20 6f 6e 6c 79 20 65 76 65 72 20 70 72 65 73  s only ever pres
288f0 65 6e 74 20 69 6e 20 73 75 62 2d 70 72 6f 67 72  ent in sub-progr
28900 61 6d 73 20 63 61 6c 6c 65 64 20 76 69 61 20 74  ams called via t
28910 68 65 20 0a 2a 2a 20 4f 50 5f 50 72 6f 67 72 61  he .** OP_Progra
28920 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 43  m instruction. C
28930 6f 70 79 20 61 20 76 61 6c 75 65 20 63 75 72 72  opy a value curr
28940 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
28950 61 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c  a memory .** cel
28960 6c 20 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e 67  l of the calling
28970 20 28 70 61 72 65 6e 74 29 20 66 72 61 6d 65 20   (parent) frame 
28980 74 6f 20 63 65 6c 6c 20 50 32 20 69 6e 20 74 68  to cell P2 in th
28990 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 73  e current frames
289a0 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61   .** address spa
289b0 63 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  ce. This is used
289c0 20 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67   by trigger prog
289d0 72 61 6d 73 20 74 6f 20 61 63 63 65 73 73 20 74  rams to access t
289e0 68 65 20 6e 65 77 2e 2a 20 0a 2a 2a 20 61 6e 64  he new.* .** and
289f0 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 2e 0a 2a   old.* values..*
28a00 2a 0a 2a 2a 20 54 68 65 20 61 64 64 72 65 73 73  *.** The address
28a10 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 6e 20   of the cell in 
28a20 74 68 65 20 70 61 72 65 6e 74 20 66 72 61 6d 65  the parent frame
28a30 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
28a40 79 20 61 64 64 69 6e 67 0a 2a 2a 20 74 68 65 20  y adding.** the 
28a50 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20  value of the P1 
28a60 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
28a70 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20  value of the P1 
28a80 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a  argument to the.
28a90 2a 2a 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50 72  ** calling OP_Pr
28aa0 6f 67 72 61 6d 20 69 6e 73 74 72 75 63 74 69 6f  ogram instructio
28ab0 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 61  n..*/.case OP_Pa
28ac0 72 61 6d 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ram: {          
28ad0 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65   /* out2-prerele
28ae0 61 73 65 20 2a 2f 0a 20 20 56 64 62 65 46 72 61  ase */.  VdbeFra
28af0 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 4d 65  me *pFrame;.  Me
28b00 6d 20 2a 70 49 6e 3b 0a 20 20 70 46 72 61 6d 65  m *pIn;.  pFrame
28b10 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20   = p->pFrame;.  
28b20 70 49 6e 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61  pIn = &pFrame->a
28b30 4d 65 6d 5b 70 4f 70 2d 3e 70 31 20 2b 20 70 46  Mem[pOp->p1 + pF
28b40 72 61 6d 65 2d 3e 61 4f 70 5b 70 46 72 61 6d 65  rame->aOp[pFrame
28b50 2d 3e 70 63 5d 2e 70 31 5d 3b 20 20 20 0a 20 20  ->pc].p1];   .  
28b60 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
28b70 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20  allowCopy(pOut, 
28b80 70 49 6e 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  pIn, MEM_Ephem);
28b90 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 65 6e  .  break;.}..#en
28ba0 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
28bb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
28bc0 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ER */..#ifndef S
28bd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
28be0 47 4e 5f 4b 45 59 0a 2f 2a 20 4f 70 63 6f 64 65  GN_KEY./* Opcode
28bf0 3a 20 46 6b 43 6f 75 6e 74 65 72 20 50 31 20 50  : FkCounter P1 P
28c00 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e  2 * * *.**.** In
28c10 63 72 65 6d 65 6e 74 20 61 20 22 63 6f 6e 73 74  crement a "const
28c20 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 22 20 62  raint counter" b
28c30 79 20 50 32 20 28 50 32 20 6d 61 79 20 62 65 20  y P2 (P2 may be 
28c40 6e 65 67 61 74 69 76 65 20 6f 72 20 70 6f 73 69  negative or posi
28c50 74 69 76 65 29 2e 0a 2a 2a 20 49 66 20 50 31 20  tive)..** If P1 
28c60 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
28c70 20 64 61 74 61 62 61 73 65 20 63 6f 6e 73 74 72   database constr
28c80 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 69 73 20  aint counter is 
28c90 69 6e 63 72 65 6d 65 6e 74 65 64 20 0a 2a 2a 20  incremented .** 
28ca0 28 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67  (deferred foreig
28cb0 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
28cc0 73 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  s). Otherwise, i
28cd0 66 20 50 31 20 69 73 20 7a 65 72 6f 2c 20 74 68  f P1 is zero, th
28ce0 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  e .** statement 
28cf0 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 63 72 65  counter is incre
28d00 6d 65 6e 74 65 64 20 28 69 6d 6d 65 64 69 61 74  mented (immediat
28d10 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
28d20 6e 73 74 72 61 69 6e 74 73 29 2e 0a 2a 2f 0a 63  nstraints)..*/.c
28d30 61 73 65 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  ase OP_FkCounter
28d40 3a 20 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70  : {.  if( pOp->p
28d50 31 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65  1 ){.    db->nDe
28d60 66 65 72 72 65 64 43 6f 6e 73 20 2b 3d 20 70 4f  ferredCons += pO
28d70 70 2d 3e 70 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p->p2;.  }else{.
28d80 20 20 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72      p->nFkConstr
28d90 61 69 6e 74 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b  aint += pOp->p2;
28da0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
28db0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6b 49 66  ./* Opcode: FkIf
28dc0 5a 65 72 6f 20 50 31 20 50 32 20 2a 20 2a 20 2a  Zero P1 P2 * * *
28dd0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
28de0 64 65 20 74 65 73 74 73 20 69 66 20 61 20 66 6f  de tests if a fo
28df0 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
28e00 61 69 6e 74 2d 63 6f 75 6e 74 65 72 20 69 73 20  aint-counter is 
28e10 63 75 72 72 65 6e 74 6c 79 20 7a 65 72 6f 2e 0a  currently zero..
28e20 2a 2a 20 49 66 20 73 6f 2c 20 6a 75 6d 70 20 74  ** If so, jump t
28e30 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32  o instruction P2
28e40 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c  . Otherwise, fal
28e50 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
28e60 20 6e 65 78 74 20 0a 2a 2a 20 69 6e 73 74 72 75   next .** instru
28e70 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
28e80 50 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  P1 is non-zero, 
28e90 74 68 65 6e 20 74 68 65 20 6a 75 6d 70 20 69 73  then the jump is
28ea0 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20 64 61   taken if the da
28eb0 74 61 62 61 73 65 20 63 6f 6e 73 74 72 61 69 6e  tabase constrain
28ec0 74 2d 63 6f 75 6e 74 65 72 0a 2a 2a 20 69 73 20  t-counter.** is 
28ed0 7a 65 72 6f 20 28 74 68 65 20 6f 6e 65 20 74 68  zero (the one th
28ee0 61 74 20 63 6f 75 6e 74 73 20 64 65 66 65 72 72  at counts deferr
28ef0 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69  ed constraint vi
28f00 6f 6c 61 74 69 6f 6e 73 29 2e 20 49 66 20 50 31  olations). If P1
28f10 20 69 73 0a 2a 2a 20 7a 65 72 6f 2c 20 74 68 65   is.** zero, the
28f20 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69   jump is taken i
28f30 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
28f40 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74  constraint-count
28f50 65 72 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 69  er is zero.** (i
28f60 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
28f70 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
28f80 76 69 6f 6c 61 74 69 6f 6e 73 29 2e 0a 2a 2f 0a  violations)..*/.
28f90 63 61 73 65 20 4f 50 5f 46 6b 49 66 5a 65 72 6f  case OP_FkIfZero
28fa0 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6a  : {         /* j
28fb0 75 6d 70 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70  ump */.  if( pOp
28fc0 2d 3e 70 31 20 29 7b 0a 20 20 20 20 69 66 28 20  ->p1 ){.    if( 
28fd0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
28fe0 73 3d 3d 30 20 29 20 70 63 20 3d 20 70 4f 70 2d  s==0 ) pc = pOp-
28ff0 3e 70 32 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  >p2-1;.  }else{.
29000 20 20 20 20 69 66 28 20 70 2d 3e 6e 46 6b 43 6f      if( p->nFkCo
29010 6e 73 74 72 61 69 6e 74 3d 3d 30 20 29 20 70 63  nstraint==0 ) pc
29020 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20   = pOp->p2-1;.  
29030 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  }.  break;.}.#en
29040 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
29050 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
29060 47 4e 5f 4b 45 59 20 2a 2f 0a 0a 23 69 66 6e 64  GN_KEY */..#ifnd
29070 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
29080 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 2f 2a 20  UTOINCREMENT./* 
29090 4f 70 63 6f 64 65 3a 20 4d 65 6d 4d 61 78 20 50  Opcode: MemMax P
290a0 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
290b0 20 50 31 20 69 73 20 61 20 72 65 67 69 73 74 65   P1 is a registe
290c0 72 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 66 72  r in the root fr
290d0 61 6d 65 20 6f 66 20 74 68 69 73 20 56 4d 20 28  ame of this VM (
290e0 74 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 69  the root frame i
290f0 73 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66  s.** different f
29100 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
29110 66 72 61 6d 65 20 69 66 20 74 68 69 73 20 69 6e  frame if this in
29120 73 74 72 75 63 74 69 6f 6e 20 69 73 20 62 65 69  struction is bei
29130 6e 67 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 77  ng executed.** w
29140 69 74 68 69 6e 20 61 20 73 75 62 2d 70 72 6f 67  ithin a sub-prog
29150 72 61 6d 29 2e 20 53 65 74 20 74 68 65 20 76 61  ram). Set the va
29160 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20  lue of register 
29170 50 31 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  P1 to the maximu
29180 6d 20 6f 66 20 0a 2a 2a 20 69 74 73 20 63 75 72  m of .** its cur
29190 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 74  rent value and t
291a0 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
291b0 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54  ster P2..**.** T
291c0 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
291d0 74 68 72 6f 77 73 20 61 6e 20 65 72 72 6f 72 20  throws an error 
291e0 69 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  if the memory ce
291f0 6c 6c 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61  ll is not initia
29200 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65  lly.** an intege
29210 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 65  r..*/.case OP_Me
29220 6d 4d 61 78 3a 20 7b 20 20 20 20 20 20 20 20 2f  mMax: {        /
29230 2a 20 69 6e 32 20 2a 2f 0a 20 20 4d 65 6d 20 2a  * in2 */.  Mem *
29240 70 49 6e 31 3b 0a 20 20 56 64 62 65 46 72 61 6d  pIn1;.  VdbeFram
29250 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 69 66 28  e *pFrame;.  if(
29260 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20   p->pFrame ){.  
29270 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e    for(pFrame=p->
29280 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e  pFrame; pFrame->
29290 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d  pParent; pFrame=
292a0 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29  pFrame->pParent)
292b0 3b 0a 20 20 20 20 70 49 6e 31 20 3d 20 26 70 46  ;.    pIn1 = &pF
292c0 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e  rame->aMem[pOp->
292d0 70 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  p1];.  }else{.  
292e0 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
292f0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 7d 0a 20 20 61  Op->p1];.  }.  a
29300 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
29310 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 73 71 6c  d(pIn1) );.  sql
29320 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67  ite3VdbeMemInteg
29330 65 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 70  erify(pIn1);.  p
29340 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In2 = &aMem[pOp-
29350 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56  >p2];.  sqlite3V
29360 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79  dbeMemIntegerify
29370 28 70 49 6e 32 29 3b 0a 20 20 69 66 28 20 70 49  (pIn2);.  if( pI
29380 6e 31 2d 3e 75 2e 69 3c 70 49 6e 32 2d 3e 75 2e  n1->u.i<pIn2->u.
29390 69 29 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 75 2e  i){.    pIn1->u.
293a0 69 20 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20  i = pIn2->u.i;. 
293b0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65   }.  break;.}.#e
293c0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
293d0 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
293e0 54 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  T */../* Opcode:
293f0 20 49 66 50 6f 73 20 50 31 20 50 32 20 2a 20 2a   IfPos P1 P2 * *
29400 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20   *.**.** If the 
29410 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65  value of registe
29420 72 20 50 31 20 69 73 20 31 20 6f 72 20 67 72 65  r P1 is 1 or gre
29430 61 74 65 72 2c 20 6a 75 6d 70 20 74 6f 20 50 32  ater, jump to P2
29440 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c  ..**.** It is il
29450 6c 65 67 61 6c 20 74 6f 20 75 73 65 20 74 68 69  legal to use thi
29460 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e  s instruction on
29470 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
29480 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
29490 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e  tain an integer.
294a0 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66    An assertion f
294b0 61 75 6c 74 20 77 69 6c 6c 20 72 65 73 75 6c 74  ault will result
294c0 20 69 66 20 79 6f 75 20 74 72 79 2e 0a 2a 2f 0a   if you try..*/.
294d0 63 61 73 65 20 4f 50 5f 49 66 50 6f 73 3a 20 7b  case OP_IfPos: {
294e0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
294f0 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
29500 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
29510 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d  .  assert( pIn1-
29520 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29  >flags&MEM_Int )
29530 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e  ;.  if( pIn1->u.
29540 69 3e 30 20 29 7b 0a 20 20 20 20 20 70 63 20 3d  i>0 ){.     pc =
29550 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
29560 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
29570 20 4f 70 63 6f 64 65 3a 20 49 66 4e 65 67 20 50   Opcode: IfNeg P
29580 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
29590 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   If the value of
295a0 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20   register P1 is 
295b0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
295c0 6a 75 6d 70 20 74 6f 20 50 32 2e 20 0a 2a 2a 0a  jump to P2. .**.
295d0 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
295e0 20 74 6f 20 75 73 65 20 74 68 69 73 20 69 6e 73   to use this ins
295f0 74 72 75 63 74 69 6f 6e 20 6f 6e 20 61 20 72 65  truction on a re
29600 67 69 73 74 65 72 20 74 68 61 74 20 64 6f 65 73  gister that does
29610 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
29620 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 41 6e 20  an integer.  An 
29630 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
29640 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 66 20 79  will result if y
29650 6f 75 20 74 72 79 2e 0a 2a 2f 0a 63 61 73 65 20  ou try..*/.case 
29660 4f 50 5f 49 66 4e 65 67 3a 20 7b 20 20 20 20 20  OP_IfNeg: {     
29670 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20     /* jump, in1 
29680 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
29690 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  m[pOp->p1];.  as
296a0 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67  sert( pIn1->flag
296b0 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 69  s&MEM_Int );.  i
296c0 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3c 30 20 29  f( pIn1->u.i<0 )
296d0 7b 0a 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  {.     pc = pOp-
296e0 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62  >p2 - 1;.  }.  b
296f0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
29700 64 65 3a 20 49 66 5a 65 72 6f 20 50 31 20 50 32  de: IfZero P1 P2
29710 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68   P3 * *.**.** Th
29720 65 20 72 65 67 69 73 74 65 72 20 50 31 20 6d 75  e register P1 mu
29730 73 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e  st contain an in
29740 74 65 67 65 72 2e 20 20 41 64 64 20 6c 69 74 65  teger.  Add lite
29750 72 61 6c 20 50 33 20 74 6f 20 74 68 65 0a 2a 2a  ral P3 to the.**
29760 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
29770 65 72 20 50 31 2e 20 20 49 66 20 74 68 65 20 72  er P1.  If the r
29780 65 73 75 6c 74 20 69 73 20 65 78 61 63 74 6c 79  esult is exactly
29790 20 30 2c 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20   0, jump to P2. 
297a0 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c  .**.** It is ill
297b0 65 67 61 6c 20 74 6f 20 75 73 65 20 74 68 69 73  egal to use this
297c0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 20   instruction on 
297d0 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  a register that 
297e0 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
297f0 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 20  ain an integer. 
29800 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
29810 75 6c 74 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  ult will result 
29820 69 66 20 79 6f 75 20 74 72 79 2e 0a 2a 2f 0a 63  if you try..*/.c
29830 61 73 65 20 4f 50 5f 49 66 5a 65 72 6f 3a 20 7b  ase OP_IfZero: {
29840 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
29850 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
29860 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
29870 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d  .  assert( pIn1-
29880 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29  >flags&MEM_Int )
29890 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20 2b 3d  ;.  pIn1->u.i +=
298a0 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20   pOp->p3;.  if( 
298b0 70 49 6e 31 2d 3e 75 2e 69 3d 3d 30 20 29 7b 0a  pIn1->u.i==0 ){.
298c0 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70       pc = pOp->p
298d0 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65  2 - 1;.  }.  bre
298e0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
298f0 3a 20 41 67 67 53 74 65 70 20 2a 20 50 32 20 50  : AggStep * P2 P
29900 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 45 78  3 P4 P5.**.** Ex
29910 65 63 75 74 65 20 74 68 65 20 73 74 65 70 20 66  ecute the step f
29920 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 61  unction for an a
29930 67 67 72 65 67 61 74 65 2e 20 20 54 68 65 0a 2a  ggregate.  The.*
29940 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 50  * function has P
29950 35 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 50  5 arguments.   P
29960 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
29970 6f 20 74 68 65 20 46 75 6e 63 44 65 66 0a 2a 2a  o the FuncDef.**
29980 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
29990 73 70 65 63 69 66 69 65 73 20 74 68 65 20 66 75  specifies the fu
299a0 6e 63 74 69 6f 6e 2e 20 20 55 73 65 20 72 65 67  nction.  Use reg
299b0 69 73 74 65 72 0a 2a 2a 20 50 33 20 61 73 20 74  ister.** P3 as t
299c0 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  he accumulator..
299d0 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 61 72 67  **.** The P5 arg
299e0 75 6d 65 6e 74 73 20 61 72 65 20 74 61 6b 65 6e  uments are taken
299f0 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50   from register P
29a00 32 20 61 6e 64 20 69 74 73 0a 2a 2a 20 73 75 63  2 and its.** suc
29a10 63 65 73 73 6f 72 73 2e 0a 2a 2f 0a 63 61 73 65  cessors..*/.case
29a20 20 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b 0a 20   OP_AggStep: {. 
29a30 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b   int n;.  int i;
29a40 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20  .  Mem *pMem;.  
29a50 4d 65 6d 20 2a 70 52 65 63 3b 0a 20 20 73 71 6c  Mem *pRec;.  sql
29a60 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 63 74 78  ite3_context ctx
29a70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
29a80 65 20 2a 2a 61 70 56 61 6c 3b 0a 0a 20 20 6e 20  e **apVal;..  n 
29a90 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 61 73 73  = pOp->p5;.  ass
29aa0 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 70  ert( n>=0 );.  p
29ab0 52 65 63 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Rec = &aMem[pOp-
29ac0 3e 70 32 5d 3b 0a 20 20 61 70 56 61 6c 20 3d 20  >p2];.  apVal = 
29ad0 70 2d 3e 61 70 41 72 67 3b 0a 20 20 61 73 73 65  p->apArg;.  asse
29ae0 72 74 28 20 61 70 56 61 6c 20 7c 7c 20 6e 3d 3d  rt( apVal || n==
29af0 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
29b00 69 3c 6e 3b 20 69 2b 2b 2c 20 70 52 65 63 2b 2b  i<n; i++, pRec++
29b10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  ){.    assert( m
29b20 65 6d 49 73 56 61 6c 69 64 28 70 52 65 63 29 20  emIsValid(pRec) 
29b30 29 3b 0a 20 20 20 20 61 70 56 61 6c 5b 69 5d 20  );.    apVal[i] 
29b40 3d 20 70 52 65 63 3b 0a 20 20 20 20 6d 65 6d 41  = pRec;.    memA
29b50 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
29b60 70 52 65 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  pRec);.    sqlit
29b70 65 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79  e3VdbeMemStoreTy
29b80 70 65 28 70 52 65 63 29 3b 0a 20 20 7d 0a 20 20  pe(pRec);.  }.  
29b90 63 74 78 2e 70 46 75 6e 63 20 3d 20 70 4f 70 2d  ctx.pFunc = pOp-
29ba0 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 61 73 73  >p4.pFunc;.  ass
29bb0 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26  ert( pOp->p3>0 &
29bc0 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d  & pOp->p3<=p->nM
29bd0 65 6d 20 29 3b 0a 20 20 63 74 78 2e 70 4d 65 6d  em );.  ctx.pMem
29be0 20 3d 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b   = pMem = &aMem[
29bf0 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 4d 65 6d  pOp->p3];.  pMem
29c00 2d 3e 6e 2b 2b 3b 0a 20 20 63 74 78 2e 73 2e 66  ->n++;.  ctx.s.f
29c10 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
29c20 0a 20 20 63 74 78 2e 73 2e 7a 20 3d 20 30 3b 0a  .  ctx.s.z = 0;.
29c30 20 20 63 74 78 2e 73 2e 7a 4d 61 6c 6c 6f 63 20    ctx.s.zMalloc 
29c40 3d 20 30 3b 0a 20 20 63 74 78 2e 73 2e 78 44 65  = 0;.  ctx.s.xDe
29c50 6c 20 3d 20 30 3b 0a 20 20 63 74 78 2e 73 2e 64  l = 0;.  ctx.s.d
29c60 62 20 3d 20 64 62 3b 0a 20 20 63 74 78 2e 69 73  b = db;.  ctx.is
29c70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 63 74 78  Error = 0;.  ctx
29c80 2e 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 69 66  .pColl = 0;.  if
29c90 28 20 63 74 78 2e 70 46 75 6e 63 2d 3e 66 6c 61  ( ctx.pFunc->fla
29ca0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
29cb0 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
29cc0 20 61 73 73 65 72 74 28 20 70 4f 70 3e 70 2d 3e   assert( pOp>p->
29cd0 61 4f 70 20 29 3b 0a 20 20 20 20 61 73 73 65 72  aOp );.    asser
29ce0 74 28 20 70 4f 70 5b 2d 31 5d 2e 70 34 74 79 70  t( pOp[-1].p4typ
29cf0 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51 20 29 3b  e==P4_COLLSEQ );
29d00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
29d10 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
29d20 43 6f 6c 6c 53 65 71 20 29 3b 0a 20 20 20 20 63  CollSeq );.    c
29d30 74 78 2e 70 43 6f 6c 6c 20 3d 20 70 4f 70 5b 2d  tx.pColl = pOp[-
29d40 31 5d 2e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 7d  1].p4.pColl;.  }
29d50 0a 20 20 28 63 74 78 2e 70 46 75 6e 63 2d 3e 78  .  (ctx.pFunc->x
29d60 53 74 65 70 29 28 26 63 74 78 2c 20 6e 2c 20 61  Step)(&ctx, n, a
29d70 70 56 61 6c 29 3b 20 2f 2a 20 49 4d 50 3a 20 52  pVal); /* IMP: R
29d80 2d 32 34 35 30 35 2d 32 33 32 33 30 20 2a 2f 0a  -24505-23230 */.
29d90 20 20 69 66 28 20 63 74 78 2e 69 73 45 72 72 6f    if( ctx.isErro
29da0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
29db0 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
29dc0 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c  rrMsg, db, "%s",
29dd0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
29de0 65 78 74 28 26 63 74 78 2e 73 29 29 3b 0a 20 20  ext(&ctx.s));.  
29df0 20 20 72 63 20 3d 20 63 74 78 2e 69 73 45 72 72    rc = ctx.isErr
29e00 6f 72 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  or;.  }..  sqlit
29e10 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
29e20 28 26 63 74 78 2e 73 29 3b 0a 0a 20 20 62 72 65  (&ctx.s);..  bre
29e30 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
29e40 3a 20 41 67 67 46 69 6e 61 6c 20 50 31 20 50 32  : AggFinal P1 P2
29e50 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 45 78   * P4 *.**.** Ex
29e60 65 63 75 74 65 20 74 68 65 20 66 69 6e 61 6c 69  ecute the finali
29e70 7a 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  zer function for
29e80 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
29e90 50 31 20 69 73 0a 2a 2a 20 74 68 65 20 6d 65 6d  P1 is.** the mem
29ea0 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 74 68 61  ory location tha
29eb0 74 20 69 73 20 74 68 65 20 61 63 63 75 6d 75 6c  t is the accumul
29ec0 61 74 6f 72 20 66 6f 72 20 74 68 65 20 61 67 67  ator for the agg
29ed0 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 50 32  regate..**.** P2
29ee0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
29ef0 66 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74  f arguments that
29f00 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69   the step functi
29f10 6f 6e 20 74 61 6b 65 73 20 61 6e 64 0a 2a 2a 20  on takes and.** 
29f20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P4 is a pointer 
29f30 74 6f 20 74 68 65 20 46 75 6e 63 44 65 66 20 66  to the FuncDef f
29f40 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  or this function
29f50 2e 20 20 54 68 65 20 50 32 0a 2a 2a 20 61 72 67  .  The P2.** arg
29f60 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 75 73 65  ument is not use
29f70 64 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65  d by this opcode
29f80 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 74 68  .  It is only th
29f90 65 72 65 20 74 6f 20 64 69 73 61 6d 62 69 67 75  ere to disambigu
29fa0 61 74 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ate.** functions
29fb0 20 74 68 61 74 20 63 61 6e 20 74 61 6b 65 20 76   that can take v
29fc0 61 72 79 69 6e 67 20 6e 75 6d 62 65 72 73 20 6f  arying numbers o
29fd0 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68  f arguments.  Th
29fe0 65 0a 2a 2a 20 50 34 20 61 72 67 75 6d 65 6e 74  e.** P4 argument
29ff0 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20   is only needed 
2a000 66 6f 72 20 74 68 65 20 64 65 67 65 6e 65 72 61  for the degenera
2a010 74 65 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a  te case where.**
2a020 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69   the step functi
2a030 6f 6e 20 77 61 73 20 6e 6f 74 20 70 72 65 76 69  on was not previ
2a040 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ously called..*/
2a050 0a 63 61 73 65 20 4f 50 5f 41 67 67 46 69 6e 61  .case OP_AggFina
2a060 6c 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  l: {.  Mem *pMem
2a070 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
2a080 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31  >p1>0 && pOp->p1
2a090 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70  <=p->nMem );.  p
2a0a0 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Mem = &aMem[pOp-
2a0b0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
2a0c0 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 7e  (pMem->flags & ~
2a0d0 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 41 67  (MEM_Null|MEM_Ag
2a0e0 67 29 29 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  g))==0 );.  rc =
2a0f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
2a100 69 6e 61 6c 69 7a 65 28 70 4d 65 6d 2c 20 70 4f  inalize(pMem, pO
2a110 70 2d 3e 70 34 2e 70 46 75 6e 63 29 3b 0a 20 20  p->p4.pFunc);.  
2a120 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
2a130 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
2a140 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
2a150 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61  "%s", sqlite3_va
2a160 6c 75 65 5f 74 65 78 74 28 70 4d 65 6d 29 29 3b  lue_text(pMem));
2a170 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
2a180 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67  beChangeEncoding
2a190 28 70 4d 65 6d 2c 20 65 6e 63 6f 64 69 6e 67 29  (pMem, encoding)
2a1a0 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
2a1b0 4c 4f 42 53 49 5a 45 28 70 4d 65 6d 29 3b 0a 20  LOBSIZE(pMem);. 
2a1c0 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
2a1d0 4d 65 6d 54 6f 6f 42 69 67 28 70 4d 65 6d 29 20  MemTooBig(pMem) 
2a1e0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f  ){.    goto too_
2a1f0 62 69 67 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  big;.  }.  break
2a200 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
2a210 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20  ITE_OMIT_WAL./* 
2a220 4f 70 63 6f 64 65 3a 20 43 68 65 63 6b 70 6f 69  Opcode: Checkpoi
2a230 6e 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  nt P1 P2 P3 * *.
2a240 2a 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74  **.** Checkpoint
2a250 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 54 68   database P1. Th
2a260 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
2a270 20 50 31 20 69 73 20 6e 6f 74 20 63 75 72 72 65   P1 is not curre
2a280 6e 74 6c 79 20 69 6e 0a 2a 2a 20 57 41 4c 20 6d  ntly in.** WAL m
2a290 6f 64 65 2e 20 50 61 72 61 6d 65 74 65 72 20 50  ode. Parameter P
2a2a0 32 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49  2 is one of SQLI
2a2b0 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
2a2c0 53 53 49 56 45 2c 20 46 55 4c 4c 0a 2a 2a 20 6f  SSIVE, FULL.** o
2a2d0 72 20 52 45 53 54 41 52 54 2e 20 20 57 72 69 74  r RESTART.  Writ
2a2e0 65 20 31 20 6f 72 20 30 20 69 6e 74 6f 20 6d 65  e 1 or 0 into me
2a2f0 6d 5b 50 33 5d 20 69 66 20 74 68 65 20 63 68 65  m[P3] if the che
2a300 63 6b 70 6f 69 6e 74 20 72 65 74 75 72 6e 73 0a  ckpoint returns.
2a310 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f  ** SQLITE_BUSY o
2a320 72 20 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76  r not, respectiv
2a330 65 6c 79 2e 20 20 57 72 69 74 65 20 74 68 65 20  ely.  Write the 
2a340 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2a350 69 6e 20 74 68 65 0a 2a 2a 20 57 41 4c 20 61 66  in the.** WAL af
2a360 74 65 72 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ter the checkpoi
2a370 6e 74 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b 31  nt into mem[P3+1
2a380 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  ] and the number
2a390 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 20   of pages.** in 
2a3a0 74 68 65 20 57 41 4c 20 74 68 61 74 20 68 61 76  the WAL that hav
2a3b0 65 20 62 65 65 6e 20 63 68 65 63 6b 70 6f 69 6e  e been checkpoin
2a3c0 74 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68  ted after the ch
2a3d0 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 63 6f 6d 70  eckpoint.** comp
2a3e0 6c 65 74 65 73 20 69 6e 74 6f 20 6d 65 6d 5b 50  letes into mem[P
2a3f0 33 2b 32 5d 2e 20 20 48 6f 77 65 76 65 72 20 6f  3+2].  However o
2a400 6e 20 61 6e 20 65 72 72 6f 72 2c 20 6d 65 6d 5b  n an error, mem[
2a410 50 33 2b 31 5d 20 61 6e 64 0a 2a 2a 20 6d 65 6d  P3+1] and.** mem
2a420 5b 50 33 2b 32 5d 20 61 72 65 20 69 6e 69 74 69  [P3+2] are initi
2a430 61 6c 69 7a 65 64 20 74 6f 20 2d 31 2e 0a 2a 2f  alized to -1..*/
2a440 0a 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f  .case OP_Checkpo
2a450 69 6e 74 3a 20 7b 0a 20 20 69 6e 74 20 69 3b 20  int: {.  int i; 
2a460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a470 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2a480 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
2a490 74 20 61 52 65 73 5b 33 5d 3b 20 20 20 20 20 20  t aRes[3];      
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a4b0 20 52 65 73 75 6c 74 73 20 2a 2f 0a 20 20 4d 65   Results */.  Me
2a4c0 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20 20  m *pMem;        
2a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a4e0 20 57 72 69 74 65 20 72 65 73 75 6c 74 73 20 68   Write results h
2a4f0 65 72 65 20 2a 2f 0a 0a 20 20 61 52 65 73 5b 30  ere */..  aRes[0
2a500 5d 20 3d 20 30 3b 0a 20 20 61 52 65 73 5b 31 5d  ] = 0;.  aRes[1]
2a510 20 3d 20 61 52 65 73 5b 32 5d 20 3d 20 2d 31 3b   = aRes[2] = -1;
2a520 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2a530 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b  p2==SQLITE_CHECK
2a540 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 0a 20 20  POINT_PASSIVE.  
2a550 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d       || pOp->p2=
2a560 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  =SQLITE_CHECKPOI
2a570 4e 54 5f 46 55 4c 4c 0a 20 20 20 20 20 20 20 7c  NT_FULL.       |
2a580 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54  | pOp->p2==SQLIT
2a590 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
2a5a0 54 41 52 54 0a 20 20 29 3b 0a 20 20 72 63 20 3d  TART.  );.  rc =
2a5b0 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69   sqlite3Checkpoi
2a5c0 6e 74 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20  nt(db, pOp->p1, 
2a5d0 70 4f 70 2d 3e 70 32 2c 20 26 61 52 65 73 5b 31  pOp->p2, &aRes[1
2a5e0 5d 2c 20 26 61 52 65 73 5b 32 5d 29 3b 0a 20 20  ], &aRes[2]);.  
2a5f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
2a600 55 53 59 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  USY ){.    rc = 
2a610 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 61  SQLITE_OK;.    a
2a620 52 65 73 5b 30 5d 20 3d 20 31 3b 0a 20 20 7d 0a  Res[0] = 1;.  }.
2a630 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 20    for(i=0, pMem 
2a640 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
2a650 3b 20 69 3c 33 3b 20 69 2b 2b 2c 20 70 4d 65 6d  ; i<3; i++, pMem
2a660 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
2a670 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28  VdbeMemSetInt64(
2a680 70 4d 65 6d 2c 20 28 69 36 34 29 61 52 65 73 5b  pMem, (i64)aRes[
2a690 69 5d 29 3b 0a 20 20 7d 20 20 20 20 0a 20 20 62  i]);.  }    .  b
2a6a0 72 65 61 6b 3b 0a 7d 3b 20 20 0a 23 65 6e 64 69  reak;.};  .#endi
2a6b0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
2a6c0 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 2f 2a  E_OMIT_PRAGMA./*
2a6d0 20 4f 70 63 6f 64 65 3a 20 4a 6f 75 72 6e 61 6c   Opcode: Journal
2a6e0 4d 6f 64 65 20 50 31 20 50 32 20 50 33 20 2a 20  Mode P1 P2 P3 * 
2a6f0 50 35 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  P5.**.** Change 
2a700 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  the journal mode
2a710 20 6f 66 20 64 61 74 61 62 61 73 65 20 50 31 20   of database P1 
2a720 74 6f 20 50 33 2e 20 50 33 20 6d 75 73 74 20 62  to P3. P3 must b
2a730 65 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20  e one of the.** 
2a740 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2a750 45 5f 58 58 58 20 76 61 6c 75 65 73 2e 20 49 66  E_XXX values. If
2a760 20 63 68 61 6e 67 69 6e 67 20 62 65 74 77 65 65   changing betwee
2a770 6e 20 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f  n the various ro
2a780 6c 6c 62 61 63 6b 0a 2a 2a 20 6d 6f 64 65 73 20  llback.** modes 
2a790 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74  (delete, truncat
2a7a0 65 2c 20 70 65 72 73 69 73 74 2c 20 6f 66 66 20  e, persist, off 
2a7b0 61 6e 64 20 6d 65 6d 6f 72 79 29 2c 20 74 68 69  and memory), thi
2a7c0 73 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  s is a simple.**
2a7d0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 4e 6f 20 49   operation. No I
2a7e0 4f 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  O is required..*
2a7f0 2a 0a 2a 2a 20 49 66 20 63 68 61 6e 67 69 6e 67  *.** If changing
2a800 20 69 6e 74 6f 20 6f 72 20 6f 75 74 20 6f 66 20   into or out of 
2a810 57 41 4c 20 6d 6f 64 65 20 74 68 65 20 70 72 6f  WAL mode the pro
2a820 63 65 64 75 72 65 20 69 73 20 6d 6f 72 65 20 63  cedure is more c
2a830 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a  omplicated..**.*
2a840 2a 20 57 72 69 74 65 20 61 20 73 74 72 69 6e 67  * Write a string
2a850 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2a860 66 69 6e 61 6c 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  final journal-mo
2a870 64 65 20 74 6f 20 72 65 67 69 73 74 65 72 20 50  de to register P
2a880 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4a 6f  2..*/.case OP_Jo
2a890 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 20 20 20 20  urnalMode: {    
2a8a0 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61  /* out2-prerelea
2a8b0 73 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  se */.  Btree *p
2a8c0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
2a8d0 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
2a8e0 20 74 6f 20 63 68 61 6e 67 65 20 6a 6f 75 72 6e   to change journ
2a8f0 61 6c 20 6d 6f 64 65 20 6f 66 20 2a 2f 0a 20 20  al mode of */.  
2a900 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
2a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a920 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69 61  /* Pager associa
2a930 74 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f 0a  ted with pBt */.
2a940 20 20 69 6e 74 20 65 4e 65 77 3b 20 20 20 20 20    int eNew;     
2a950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a960 20 20 2f 2a 20 4e 65 77 20 6a 6f 75 72 6e 61 6c    /* New journal
2a970 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65   mode */.  int e
2a980 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
2a990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2a9a0 65 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6d 6f  e old journal mo
2a9b0 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
2a9c0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
2a9d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2a9e0 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
2a9f0 20 66 6f 72 20 70 50 61 67 65 72 20 2a 2f 0a 0a   for pPager */..
2aa00 20 20 65 4e 65 77 20 3d 20 70 4f 70 2d 3e 70 33    eNew = pOp->p3
2aa10 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4e 65 77  ;.  assert( eNew
2aa20 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2aa30 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20  ODE_DELETE .    
2aa40 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45     || eNew==PAGE
2aa50 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
2aa60 55 4e 43 41 54 45 20 0a 20 20 20 20 20 20 20 7c  UNCATE .       |
2aa70 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f  | eNew==PAGER_JO
2aa80 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
2aa90 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65  T .       || eNe
2aaa0 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  w==PAGER_JOURNAL
2aab0 4d 4f 44 45 5f 4f 46 46 0a 20 20 20 20 20 20 20  MODE_OFF.       
2aac0 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a  || eNew==PAGER_J
2aad0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
2aae0 59 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77  Y.       || eNew
2aaf0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2ab00 4f 44 45 5f 57 41 4c 0a 20 20 20 20 20 20 20 7c  ODE_WAL.       |
2ab10 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f  | eNew==PAGER_JO
2ab20 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a  URNALMODE_QUERY.
2ab30 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
2ab40 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
2ab50 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  ->p1<db->nDb );.
2ab60 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  .  pBt = db->aDb
2ab70 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20  [pOp->p1].pBt;. 
2ab80 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
2ab90 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
2aba0 3b 0a 20 20 65 4f 6c 64 20 3d 20 73 71 6c 69 74  ;.  eOld = sqlit
2abb0 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61  e3PagerGetJourna
2abc0 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  lMode(pPager);. 
2abd0 20 69 66 28 20 65 4e 65 77 3d 3d 50 41 47 45 52   if( eNew==PAGER
2abe0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
2abf0 52 59 20 29 20 65 4e 65 77 20 3d 20 65 4f 6c 64  RY ) eNew = eOld
2ac00 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
2ac10 50 61 67 65 72 4f 6b 54 6f 43 68 61 6e 67 65 4a  PagerOkToChangeJ
2ac20 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65  ournalMode(pPage
2ac30 72 29 20 29 20 65 4e 65 77 20 3d 20 65 4f 6c 64  r) ) eNew = eOld
2ac40 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
2ac50 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 7a 46 69  E_OMIT_WAL.  zFi
2ac60 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
2ac70 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 50  PagerFilename(pP
2ac80 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20  ager);..  /* Do 
2ac90 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 74 72 61 6e  not allow a tran
2aca0 73 69 74 69 6f 6e 20 74 6f 20 6a 6f 75 72 6e 61  sition to journa
2acb0 6c 5f 6d 6f 64 65 3d 57 41 4c 20 66 6f 72 20 61  l_mode=WAL for a
2acc0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69   database.  ** i
2acd0 6e 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  n temporary stor
2ace0 61 67 65 20 6f 72 20 69 66 20 74 68 65 20 56 46  age or if the VF
2acf0 53 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  S does not suppo
2ad00 72 74 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  rt shared memory
2ad10 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 4e 65   .  */.  if( eNe
2ad20 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  w==PAGER_JOURNAL
2ad30 4d 4f 44 45 5f 57 41 4c 0a 20 20 20 26 26 20 28  MODE_WAL.   && (
2ad40 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20  zFilename[0]==0 
2ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad60 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
2ad70 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 7c  file */.       |
2ad80 7c 20 21 73 71 6c 69 74 65 33 50 61 67 65 72 57  | !sqlite3PagerW
2ad90 61 6c 53 75 70 70 6f 72 74 65 64 28 70 50 61 67  alSupported(pPag
2ada0 65 72 29 29 20 20 20 2f 2a 20 4e 6f 20 73 68 61  er))   /* No sha
2adb0 72 65 64 2d 6d 65 6d 6f 72 79 20 73 75 70 70 6f  red-memory suppo
2adc0 72 74 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 65  rt */.  ){.    e
2add0 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 7d 0a  New = eOld;.  }.
2ade0 0a 20 20 69 66 28 20 28 65 4e 65 77 21 3d 65 4f  .  if( (eNew!=eO
2adf0 6c 64 29 0a 20 20 20 26 26 20 28 65 4f 6c 64 3d  ld).   && (eOld=
2ae00 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2ae10 44 45 5f 57 41 4c 20 7c 7c 20 65 4e 65 77 3d 3d  DE_WAL || eNew==
2ae20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2ae30 45 5f 57 41 4c 29 0a 20 20 29 7b 0a 20 20 20 20  E_WAL).  ){.    
2ae40 69 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d  if( !db->autoCom
2ae50 6d 69 74 20 7c 7c 20 64 62 2d 3e 61 63 74 69 76  mit || db->activ
2ae60 65 56 64 62 65 43 6e 74 3e 31 20 29 7b 0a 20 20  eVdbeCnt>1 ){.  
2ae70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ae80 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c  ERROR;.      sql
2ae90 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
2aea0 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 0a  ->zErrMsg, db, .
2aeb0 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f            "canno
2aec0 74 20 63 68 61 6e 67 65 20 25 73 20 77 61 6c 20  t change %s wal 
2aed0 6d 6f 64 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  mode from within
2aee0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c   a transaction",
2aef0 0a 20 20 20 20 20 20 20 20 20 20 28 65 4e 65 77  .          (eNew
2af00 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2af10 4f 44 45 5f 57 41 4c 20 3f 20 22 69 6e 74 6f 22  ODE_WAL ? "into"
2af20 20 3a 20 22 6f 75 74 20 6f 66 22 29 0a 20 20 20   : "out of").   
2af30 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61     );.      brea
2af40 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 0a  k;.    }else{. .
2af50 20 20 20 20 20 20 69 66 28 20 65 4f 6c 64 3d 3d        if( eOld==
2af60 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2af70 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_WAL ){.       
2af80 20 2f 2a 20 49 66 20 6c 65 61 76 69 6e 67 20 57   /* If leaving W
2af90 41 4c 20 6d 6f 64 65 2c 20 63 6c 6f 73 65 20 74  AL mode, close t
2afa0 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20  he log file. If 
2afb0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20  successful, the 
2afc0 63 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  call.        ** 
2afd0 74 6f 20 50 61 67 65 72 43 6c 6f 73 65 57 61 6c  to PagerCloseWal
2afe0 28 29 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 61  () checkpoints a
2aff0 6e 64 20 64 65 6c 65 74 65 73 20 74 68 65 20 77  nd deletes the w
2b000 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 0a  rite-ahead-log .
2b010 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e          ** file.
2b020 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   An EXCLUSIVE lo
2b030 63 6b 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  ck may still be 
2b040 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2b050 62 61 73 65 20 66 69 6c 65 20 0a 20 20 20 20 20  base file .     
2b060 20 20 20 2a 2a 20 61 66 74 65 72 20 61 20 73 75     ** after a su
2b070 63 63 65 73 73 66 75 6c 20 72 65 74 75 72 6e 2e  ccessful return.
2b080 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
2b090 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2b0a0 33 50 61 67 65 72 43 6c 6f 73 65 57 61 6c 28 70  3PagerCloseWal(p
2b0b0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
2b0c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b0d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
2b0e0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4a 6f  qlite3PagerSetJo
2b0f0 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72  urnalMode(pPager
2b100 2c 20 65 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , eNew);.       
2b110 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
2b120 66 28 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a  f( eOld==PAGER_J
2b130 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
2b140 59 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  Y ){.        /* 
2b150 43 61 6e 6e 6f 74 20 74 72 61 6e 73 69 74 69 6f  Cannot transitio
2b160 6e 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20  n directly from 
2b170 4d 45 4d 4f 52 59 20 74 6f 20 57 41 4c 2e 20 20  MEMORY to WAL.  
2b180 55 73 65 20 6d 6f 64 65 20 4f 46 46 0a 20 20 20  Use mode OFF.   
2b190 20 20 20 20 20 2a 2a 20 61 73 20 61 6e 20 69 6e       ** as an in
2b1a0 74 65 72 6d 65 64 69 61 74 65 20 2a 2f 0a 20 20  termediate */.  
2b1b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
2b1c0 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65  erSetJournalMode
2b1d0 28 70 50 61 67 65 72 2c 20 50 41 47 45 52 5f 4a  (pPager, PAGER_J
2b1e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 3b  OURNALMODE_OFF);
2b1f0 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
2b200 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 72 61 6e    /* Open a tran
2b210 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
2b220 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 52 65  atabase file. Re
2b230 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
2b240 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
2b250 20 6d 6f 64 65 2c 20 74 68 69 73 20 74 72 61 6e   mode, this tran
2b260 73 61 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75  saction always u
2b270 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
2b280 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  ournal..      */
2b290 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
2b2a0 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
2b2b0 72 61 6e 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a  rans(pBt)==0 );.
2b2c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2b2d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b2e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2b2f0 74 72 65 65 53 65 74 56 65 72 73 69 6f 6e 28 70  treeSetVersion(p
2b300 42 74 2c 20 28 65 4e 65 77 3d 3d 50 41 47 45 52  Bt, (eNew==PAGER
2b310 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2b320 20 3f 20 32 20 3a 20 31 29 29 3b 0a 20 20 20 20   ? 2 : 1));.    
2b330 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
2b340 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53  ndif /* ifndef S
2b350 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
2b360 2f 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  /..  if( rc ){. 
2b370 20 20 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a     eNew = eOld;.
2b380 20 20 7d 0a 20 20 65 4e 65 77 20 3d 20 73 71 6c    }.  eNew = sql
2b390 69 74 65 33 50 61 67 65 72 53 65 74 4a 6f 75 72  ite3PagerSetJour
2b3a0 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 2c 20  nalMode(pPager, 
2b3b0 65 4e 65 77 29 3b 0a 0a 20 20 70 4f 75 74 20 3d  eNew);..  pOut =
2b3c0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
2b3d0 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d  .  pOut->flags =
2b3e0 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74 61   MEM_Str|MEM_Sta
2b3f0 74 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  tic|MEM_Term;.  
2b400 70 4f 75 74 2d 3e 7a 20 3d 20 28 63 68 61 72 20  pOut->z = (char 
2b410 2a 29 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  *)sqlite3Journal
2b420 4d 6f 64 65 6e 61 6d 65 28 65 4e 65 77 29 3b 0a  Modename(eNew);.
2b430 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 73 71 6c 69    pOut->n = sqli
2b440 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4f 75 74  te3Strlen30(pOut
2b450 2d 3e 7a 29 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e  ->z);.  pOut->en
2b460 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
2b470 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
2b480 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4f 75  angeEncoding(pOu
2b490 74 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  t, encoding);.  
2b4a0 62 72 65 61 6b 3b 0a 7d 3b 0a 23 65 6e 64 69 66  break;.};.#endif
2b4b0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2b4c0 50 52 41 47 4d 41 20 2a 2f 0a 0a 23 69 66 20 21  PRAGMA */..#if !
2b4d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2b4e0 4d 49 54 5f 56 41 43 55 55 4d 29 20 26 26 20 21  MIT_VACUUM) && !
2b4f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2b500 4d 49 54 5f 41 54 54 41 43 48 29 0a 2f 2a 20 4f  MIT_ATTACH)./* O
2b510 70 63 6f 64 65 3a 20 56 61 63 75 75 6d 20 2a 20  pcode: Vacuum * 
2b520 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 56 61  * * * *.**.** Va
2b530 63 75 75 6d 20 74 68 65 20 65 6e 74 69 72 65 20  cuum the entire 
2b540 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
2b550 6f 70 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73  opcode will caus
2b560 65 20 6f 74 68 65 72 20 76 69 72 74 75 61 6c 0a  e other virtual.
2b570 2a 2a 20 6d 61 63 68 69 6e 65 73 20 74 6f 20 62  ** machines to b
2b580 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 75  e created and ru
2b590 6e 2e 20 20 49 74 20 6d 61 79 20 6e 6f 74 20 62  n.  It may not b
2b5a0 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  e called from wi
2b5b0 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61  thin.** a transa
2b5c0 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ction..*/.case O
2b5d0 50 5f 56 61 63 75 75 6d 3a 20 7b 0a 20 20 72 63  P_Vacuum: {.  rc
2b5e0 20 3d 20 73 71 6c 69 74 65 33 52 75 6e 56 61 63   = sqlite3RunVac
2b5f0 75 75 6d 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  uum(&p->zErrMsg,
2b600 20 64 62 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d   db);.  break;.}
2b610 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
2b620 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2b630 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 2f 2a  T_AUTOVACUUM)./*
2b640 20 4f 70 63 6f 64 65 3a 20 49 6e 63 72 56 61 63   Opcode: IncrVac
2b650 75 75 6d 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  uum P1 P2 * * *.
2b660 2a 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  **.** Perform a 
2b670 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 74  single step of t
2b680 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
2b690 61 63 75 75 6d 20 70 72 6f 63 65 64 75 72 65 20  acuum procedure 
2b6a0 6f 6e 0a 2a 2a 20 74 68 65 20 50 31 20 64 61 74  on.** the P1 dat
2b6b0 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 76 61  abase. If the va
2b6c0 63 75 75 6d 20 68 61 73 20 66 69 6e 69 73 68 65  cuum has finishe
2b6d0 64 2c 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72  d, jump to instr
2b6e0 75 63 74 69 6f 6e 0a 2a 2a 20 50 32 2e 20 4f 74  uction.** P2. Ot
2b6f0 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68  herwise, fall th
2b700 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
2b710 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  t instruction..*
2b720 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 63 72 56 61  /.case OP_IncrVa
2b730 63 75 75 6d 3a 20 7b 20 20 20 20 20 20 20 20 2f  cuum: {        /
2b740 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 42 74 72 65  * jump */.  Btre
2b750 65 20 2a 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  e *pBt;..  asser
2b760 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
2b770 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62   pOp->p1<db->nDb
2b780 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
2b790 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28  ->btreeMask & ((
2b7a0 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70  (yDbMask)1)<<pOp
2b7b0 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a 20 20 70  ->p1))!=0 );.  p
2b7c0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70  Bt = db->aDb[pOp
2b7d0 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 72 63 20  ->p1].pBt;.  rc 
2b7e0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
2b7f0 63 72 56 61 63 75 75 6d 28 70 42 74 29 3b 0a 20  crVacuum(pBt);. 
2b800 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b810 44 4f 4e 45 20 29 7b 0a 20 20 20 20 70 63 20 3d  DONE ){.    pc =
2b820 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
2b830 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2b840 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
2b850 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f  .#endif../* Opco
2b860 64 65 3a 20 45 78 70 69 72 65 20 50 31 20 2a 20  de: Expire P1 * 
2b870 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 61 75 73  * * *.**.** Caus
2b880 65 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74  e precompiled st
2b890 61 74 65 6d 65 6e 74 73 20 74 6f 20 62 65 63 6f  atements to beco
2b8a0 6d 65 20 65 78 70 69 72 65 64 2e 20 41 6e 20 65  me expired. An e
2b8b0 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
2b8c0 0a 2a 2a 20 66 61 69 6c 73 20 77 69 74 68 20 61  .** fails with a
2b8d0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 66 20  n error code of 
2b8e0 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 69 66  SQLITE_SCHEMA if
2b8f0 20 69 74 20 69 73 20 65 76 65 72 20 65 78 65 63   it is ever exec
2b900 75 74 65 64 20 0a 2a 2a 20 28 76 69 61 20 73 71  uted .** (via sq
2b910 6c 69 74 65 33 5f 73 74 65 70 28 29 29 2e 0a 2a  lite3_step())..*
2b920 2a 20 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 30  * .** If P1 is 0
2b930 2c 20 74 68 65 6e 20 61 6c 6c 20 53 51 4c 20 73  , then all SQL s
2b940 74 61 74 65 6d 65 6e 74 73 20 62 65 63 6f 6d 65  tatements become
2b950 20 65 78 70 69 72 65 64 2e 20 49 66 20 50 31 20   expired. If P1 
2b960 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20  is non-zero,.** 
2b970 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 63 75  then only the cu
2b980 72 72 65 6e 74 6c 79 20 65 78 65 63 75 74 69 6e  rrently executin
2b990 67 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61  g statement is a
2b9a0 66 66 65 63 74 65 64 2e 20 0a 2a 2f 0a 63 61 73  ffected. .*/.cas
2b9b0 65 20 4f 50 5f 45 78 70 69 72 65 3a 20 7b 0a 20  e OP_Expire: {. 
2b9c0 20 69 66 28 20 21 70 4f 70 2d 3e 70 31 20 29 7b   if( !pOp->p1 ){
2b9d0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
2b9e0 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
2b9f0 65 6e 74 73 28 64 62 29 3b 0a 20 20 7d 65 6c 73  ents(db);.  }els
2ba00 65 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  e{.    p->expire
2ba10 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65  d = 1;.  }.  bre
2ba20 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ak;.}..#ifndef S
2ba30 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2ba40 44 5f 43 41 43 48 45 0a 2f 2a 20 4f 70 63 6f 64  D_CACHE./* Opcod
2ba50 65 3a 20 54 61 62 6c 65 4c 6f 63 6b 20 50 31 20  e: TableLock P1 
2ba60 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  P2 P3 P4 *.**.**
2ba70 20 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   Obtain a lock o
2ba80 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74  n a particular t
2ba90 61 62 6c 65 2e 20 54 68 69 73 20 69 6e 73 74 72  able. This instr
2baa0 75 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  uction is only u
2bab0 73 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  sed when.** the 
2bac0 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61  shared-cache fea
2bad0 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  ture is enabled.
2bae0 20 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68   .**.** P1 is th
2baf0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64  e index of the d
2bb00 61 74 61 62 61 73 65 20 69 6e 20 73 71 6c 69 74  atabase in sqlit
2bb10 65 33 2e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20  e3.aDb[] of the 
2bb20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6f 6e 20 77  database.** on w
2bb30 68 69 63 68 20 74 68 65 20 6c 6f 63 6b 20 69 73  hich the lock is
2bb40 20 61 63 71 75 69 72 65 64 2e 20 20 41 20 72 65   acquired.  A re
2bb50 61 64 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  adlock is obtain
2bb60 65 64 20 69 66 20 50 33 3d 3d 30 20 6f 72 0a 2a  ed if P3==0 or.*
2bb70 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 69  * a write lock i
2bb80 66 20 50 33 3d 3d 31 2e 0a 2a 2a 0a 2a 2a 20 50  f P3==1..**.** P
2bb90 32 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  2 contains the r
2bba0 6f 6f 74 2d 70 61 67 65 20 6f 66 20 74 68 65 20  oot-page of the 
2bbb0 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 2e 0a 2a  table to lock..*
2bbc0 2a 0a 2a 2a 20 50 34 20 63 6f 6e 74 61 69 6e 73  *.** P4 contains
2bbd0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2bbe0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
2bbf0 62 6c 65 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64  ble being locked
2bc00 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 0a 2a  . This is only.*
2bc10 2a 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  * used to genera
2bc20 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
2bc30 61 67 65 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  age if the lock 
2bc40 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
2bc50 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54  ed..*/.case OP_T
2bc60 61 62 6c 65 4c 6f 63 6b 3a 20 7b 0a 20 20 75 38  ableLock: {.  u8
2bc70 20 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28   isWriteLock = (
2bc80 75 38 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66  u8)pOp->p3;.  if
2bc90 28 20 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c  ( isWriteLock ||
2bca0 20 30 3d 3d 28 64 62 2d 3e 66 6c 61 67 73 26 53   0==(db->flags&S
2bcb0 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2bcc0 69 74 74 65 64 29 20 29 7b 0a 20 20 20 20 69 6e  itted) ){.    in
2bcd0 74 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 20  t p1 = pOp->p1; 
2bce0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e  .    assert( p1>
2bcf0 3d 30 20 26 26 20 70 31 3c 64 62 2d 3e 6e 44 62  =0 && p1<db->nDb
2bd00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2bd10 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20  (p->btreeMask & 
2bd20 28 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70  (((yDbMask)1)<<p
2bd30 31 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  1))!=0 );.    as
2bd40 73 65 72 74 28 20 69 73 57 72 69 74 65 4c 6f 63  sert( isWriteLoc
2bd50 6b 3d 3d 30 20 7c 7c 20 69 73 57 72 69 74 65 4c  k==0 || isWriteL
2bd60 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 72 63  ock==1 );.    rc
2bd70 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c   = sqlite3BtreeL
2bd80 6f 63 6b 54 61 62 6c 65 28 64 62 2d 3e 61 44 62  ockTable(db->aDb
2bd90 5b 70 31 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70  [p1].pBt, pOp->p
2bda0 32 2c 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b  2, isWriteLock);
2bdb0 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78 46  .    if( (rc&0xF
2bdc0 46 29 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  F)==SQLITE_LOCKE
2bdd0 44 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  D ){.      const
2bde0 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e   char *z = pOp->
2bdf0 70 34 2e 7a 3b 0a 20 20 20 20 20 20 73 71 6c 69  p4.z;.      sqli
2be00 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
2be10 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 64  >zErrMsg, db, "d
2be20 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73  atabase table is
2be30 20 6c 6f 63 6b 65 64 3a 20 25 73 22 2c 20 7a 29   locked: %s", z)
2be40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
2be50 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
2be60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
2be70 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2be80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2be90 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
2bea0 2a 20 4f 70 63 6f 64 65 3a 20 56 42 65 67 69 6e  * Opcode: VBegin
2beb0 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a   * * * P4 *.**.*
2bec0 2a 20 50 34 20 6d 61 79 20 62 65 20 61 20 70 6f  * P4 may be a po
2bed0 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
2bee0 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75  te3_vtab structu
2bef0 72 65 2e 20 49 66 20 73 6f 2c 20 63 61 6c 6c 20  re. If so, call 
2bf00 74 68 65 20 0a 2a 2a 20 78 42 65 67 69 6e 20 6d  the .** xBegin m
2bf10 65 74 68 6f 64 20 66 6f 72 20 74 68 61 74 20 74  ethod for that t
2bf20 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  able..**.** Also
2bf30 2c 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  , whether or not
2bf40 20 50 34 20 69 73 20 73 65 74 2c 20 63 68 65 63   P4 is set, chec
2bf50 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20 6e  k that this is n
2bf60 6f 74 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  ot being called 
2bf70 66 72 6f 6d 0a 2a 2a 20 77 69 74 68 69 6e 20 61  from.** within a
2bf80 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 20 76   callback to a v
2bf90 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78 53 79  irtual table xSy
2bfa0 6e 63 28 29 20 6d 65 74 68 6f 64 2e 20 49 66 20  nc() method. If 
2bfb0 69 74 20 69 73 2c 20 74 68 65 20 65 72 72 6f 72  it is, the error
2bfc0 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 62 65  .** code will be
2bfd0 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4c   set to SQLITE_L
2bfe0 4f 43 4b 45 44 2e 0a 2a 2f 0a 63 61 73 65 20 4f  OCKED..*/.case O
2bff0 50 5f 56 42 65 67 69 6e 3a 20 7b 0a 20 20 56 54  P_VBegin: {.  VT
2c000 61 62 6c 65 20 2a 70 56 54 61 62 3b 0a 20 20 70  able *pVTab;.  p
2c010 56 54 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  VTab = pOp->p4.p
2c020 56 74 61 62 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Vtab;.  rc = sql
2c030 69 74 65 33 56 74 61 62 42 65 67 69 6e 28 64 62  ite3VtabBegin(db
2c040 2c 20 70 56 54 61 62 29 3b 0a 20 20 69 66 28 20  , pVTab);.  if( 
2c050 70 56 54 61 62 20 29 20 69 6d 70 6f 72 74 56 74  pVTab ) importVt
2c060 61 62 45 72 72 4d 73 67 28 70 2c 20 70 56 54 61  abErrMsg(p, pVTa
2c070 62 2d 3e 70 56 74 61 62 29 3b 0a 20 20 62 72 65  b->pVtab);.  bre
2c080 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ak;.}.#endif /* 
2c090 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2c0a0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
2c0b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2c0c0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
2c0d0 20 4f 70 63 6f 64 65 3a 20 56 43 72 65 61 74 65   Opcode: VCreate
2c0e0 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a   P1 * * P4 *.**.
2c0f0 2a 2a 20 50 34 20 69 73 20 74 68 65 20 6e 61 6d  ** P4 is the nam
2c100 65 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74  e of a virtual t
2c110 61 62 6c 65 20 69 6e 20 64 61 74 61 62 61 73 65  able in database
2c120 20 50 31 2e 20 43 61 6c 6c 20 74 68 65 20 78 43   P1. Call the xC
2c130 72 65 61 74 65 20 6d 65 74 68 6f 64 0a 2a 2a 20  reate method.** 
2c140 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  for that table..
2c150 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 43 72 65 61  */.case OP_VCrea
2c160 74 65 3a 20 7b 0a 20 20 72 63 20 3d 20 73 71 6c  te: {.  rc = sql
2c170 69 74 65 33 56 74 61 62 43 61 6c 6c 43 72 65 61  ite3VtabCallCrea
2c180 74 65 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20  te(db, pOp->p1, 
2c190 70 4f 70 2d 3e 70 34 2e 7a 2c 20 26 70 2d 3e 7a  pOp->p4.z, &p->z
2c1a0 45 72 72 4d 73 67 29 3b 0a 20 20 62 72 65 61 6b  ErrMsg);.  break
2c1b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2c1c0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2c1d0 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64  LTABLE */..#ifnd
2c1e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2c1f0 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f  IRTUALTABLE./* O
2c200 70 63 6f 64 65 3a 20 56 44 65 73 74 72 6f 79 20  pcode: VDestroy 
2c210 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
2c220 2a 20 50 34 20 69 73 20 74 68 65 20 6e 61 6d 65  * P4 is the name
2c230 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61   of a virtual ta
2c240 62 6c 65 20 69 6e 20 64 61 74 61 62 61 73 65 20  ble in database 
2c250 50 31 2e 20 20 43 61 6c 6c 20 74 68 65 20 78 44  P1.  Call the xD
2c260 65 73 74 72 6f 79 20 6d 65 74 68 6f 64 0a 2a 2a  estroy method.**
2c270 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 2e 0a   of that table..
2c280 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 44 65 73 74  */.case OP_VDest
2c290 72 6f 79 3a 20 7b 0a 20 20 70 2d 3e 69 6e 56 74  roy: {.  p->inVt
2c2a0 61 62 4d 65 74 68 6f 64 20 3d 20 32 3b 0a 20 20  abMethod = 2;.  
2c2b0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
2c2c0 43 61 6c 6c 44 65 73 74 72 6f 79 28 64 62 2c 20  CallDestroy(db, 
2c2d0 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34  pOp->p1, pOp->p4
2c2e0 2e 7a 29 3b 0a 20 20 70 2d 3e 69 6e 56 74 61 62  .z);.  p->inVtab
2c2f0 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 62 72  Method = 0;.  br
2c300 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
2c310 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2c320 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
2c330 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2c340 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
2c350 2a 20 4f 70 63 6f 64 65 3a 20 56 4f 70 65 6e 20  * Opcode: VOpen 
2c360 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
2c370 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65  * P4 is a pointe
2c380 72 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74  r to a virtual t
2c390 61 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20  able object, an 
2c3a0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72  sqlite3_vtab str
2c3b0 75 63 74 75 72 65 2e 0a 2a 2a 20 50 31 20 69 73  ucture..** P1 is
2c3c0 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72   a cursor number
2c3d0 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6f  .  This opcode o
2c3e0 70 65 6e 73 20 61 20 63 75 72 73 6f 72 20 74 6f  pens a cursor to
2c3f0 20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20   the virtual.** 
2c400 74 61 62 6c 65 20 61 6e 64 20 73 74 6f 72 65 73  table and stores
2c410 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 6e 20   that cursor in 
2c420 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56  P1..*/.case OP_V
2c430 4f 70 65 6e 3a 20 7b 0a 20 20 56 64 62 65 43 75  Open: {.  VdbeCu
2c440 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 73 71  rsor *pCur;.  sq
2c450 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
2c460 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  r *pVtabCursor;.
2c470 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
2c480 70 56 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  pVtab;.  sqlite3
2c490 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
2c4a0 3b 0a 0a 20 20 70 43 75 72 20 3d 20 30 3b 0a 20  ;..  pCur = 0;. 
2c4b0 20 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 30   pVtabCursor = 0
2c4c0 3b 0a 20 20 70 56 74 61 62 20 3d 20 70 4f 70 2d  ;.  pVtab = pOp-
2c4d0 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62  >p4.pVtab->pVtab
2c4e0 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20 28 73  ;.  pModule = (s
2c4f0 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 29  qlite3_module *)
2c500 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
2c510 20 20 61 73 73 65 72 74 28 70 56 74 61 62 20 26    assert(pVtab &
2c520 26 20 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 72 63  & pModule);.  rc
2c530 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4f 70 65   = pModule->xOpe
2c540 6e 28 70 56 74 61 62 2c 20 26 70 56 74 61 62 43  n(pVtab, &pVtabC
2c550 75 72 73 6f 72 29 3b 0a 20 20 69 6d 70 6f 72 74  ursor);.  import
2c560 56 74 61 62 45 72 72 4d 73 67 28 70 2c 20 70 56  VtabErrMsg(p, pV
2c570 74 61 62 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  tab);.  if( SQLI
2c580 54 45 5f 4f 4b 3d 3d 72 63 20 29 7b 0a 20 20 20  TE_OK==rc ){.   
2c590 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 73   /* Initialize s
2c5a0 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
2c5b0 6f 72 20 62 61 73 65 20 63 6c 61 73 73 20 2a 2f  or base class */
2c5c0 0a 20 20 20 20 70 56 74 61 62 43 75 72 73 6f 72  .    pVtabCursor
2c5d0 2d 3e 70 56 74 61 62 20 3d 20 70 56 74 61 62 3b  ->pVtab = pVtab;
2c5e0 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
2c5f0 69 73 65 20 76 64 62 65 20 63 75 72 73 6f 72 20  ise vdbe cursor 
2c600 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 70 43  object */.    pC
2c610 75 72 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72  ur = allocateCur
2c620 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20  sor(p, pOp->p1, 
2c630 30 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 69  0, -1, 0);.    i
2c640 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 20  f( pCur ){.     
2c650 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73   pCur->pVtabCurs
2c660 6f 72 20 3d 20 70 56 74 61 62 43 75 72 73 6f 72  or = pVtabCursor
2c670 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4d  ;.      pCur->pM
2c680 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 43 75 72  odule = pVtabCur
2c690 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64  sor->pVtab->pMod
2c6a0 75 6c 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ule;.    }else{.
2c6b0 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
2c6c0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
2c6d0 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73    pModule->xClos
2c6e0 65 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a  e(pVtabCursor);.
2c6f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
2c700 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  k;.}.#endif /* S
2c710 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2c720 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e  ALTABLE */..#ifn
2c730 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c740 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20  VIRTUALTABLE./* 
2c750 4f 70 63 6f 64 65 3a 20 56 46 69 6c 74 65 72 20  Opcode: VFilter 
2c760 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a  P1 P2 P3 P4 *.**
2c770 0a 2a 2a 20 50 31 20 69 73 20 61 20 63 75 72 73  .** P1 is a curs
2c780 6f 72 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  or opened using 
2c790 56 4f 70 65 6e 2e 20 20 50 32 20 69 73 20 61 6e  VOpen.  P2 is an
2c7a0 20 61 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70   address to jump
2c7b0 20 74 6f 20 69 66 0a 2a 2a 20 74 68 65 20 66 69   to if.** the fi
2c7c0 6c 74 65 72 65 64 20 72 65 73 75 6c 74 20 73 65  ltered result se
2c7d0 74 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  t is empty..**.*
2c7e0 2a 20 50 34 20 69 73 20 65 69 74 68 65 72 20 4e  * P4 is either N
2c7f0 55 4c 4c 20 6f 72 20 61 20 73 74 72 69 6e 67 20  ULL or a string 
2c800 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74  that was generat
2c810 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
2c820 6e 64 65 78 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  ndex.** method o
2c830 66 20 74 68 65 20 6d 6f 64 75 6c 65 2e 20 20 54  f the module.  T
2c840 68 65 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f  he interpretatio
2c850 6e 20 6f 66 20 74 68 65 20 50 34 20 73 74 72 69  n of the P4 stri
2c860 6e 67 20 69 73 20 6c 65 66 74 0a 2a 2a 20 74 6f  ng is left.** to
2c870 20 74 68 65 20 6d 6f 64 75 6c 65 20 69 6d 70 6c   the module impl
2c880 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ementation..**.*
2c890 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 6e  * This opcode in
2c8a0 76 6f 6b 65 73 20 74 68 65 20 78 46 69 6c 74 65  vokes the xFilte
2c8b0 72 20 6d 65 74 68 6f 64 20 6f 6e 20 74 68 65 20  r method on the 
2c8c0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73 70  virtual table sp
2c8d0 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 50 31  ecified.** by P1
2c8e0 2e 20 20 54 68 65 20 69 6e 74 65 67 65 72 20 71  .  The integer q
2c8f0 75 65 72 79 20 70 6c 61 6e 20 70 61 72 61 6d 65  uery plan parame
2c900 74 65 72 20 74 6f 20 78 46 69 6c 74 65 72 20 69  ter to xFilter i
2c910 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
2c920 73 74 65 72 0a 2a 2a 20 50 33 2e 20 52 65 67 69  ster.** P3. Regi
2c930 73 74 65 72 20 50 33 2b 31 20 73 74 6f 72 65 73  ster P3+1 stores
2c940 20 74 68 65 20 61 72 67 63 20 70 61 72 61 6d 65   the argc parame
2c950 74 65 72 20 74 6f 20 62 65 20 70 61 73 73 65 64  ter to be passed
2c960 20 74 6f 20 74 68 65 0a 2a 2a 20 78 46 69 6c 74   to the.** xFilt
2c970 65 72 20 6d 65 74 68 6f 64 2e 20 52 65 67 69 73  er method. Regis
2c980 74 65 72 73 20 50 33 2b 32 2e 2e 50 33 2b 31 2b  ters P3+2..P3+1+
2c990 61 72 67 63 20 61 72 65 20 74 68 65 20 61 72 67  argc are the arg
2c9a0 63 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20  c.** additional 
2c9b0 70 61 72 61 6d 65 74 65 72 73 20 77 68 69 63 68  parameters which
2c9c0 20 61 72 65 20 70 61 73 73 65 64 20 74 6f 0a 2a   are passed to.*
2c9d0 2a 20 78 46 69 6c 74 65 72 20 61 73 20 61 72 67  * xFilter as arg
2c9e0 76 2e 20 52 65 67 69 73 74 65 72 20 50 33 2b 32  v. Register P3+2
2c9f0 20 62 65 63 6f 6d 65 73 20 61 72 67 76 5b 30 5d   becomes argv[0]
2ca00 20 77 68 65 6e 20 70 61 73 73 65 64 20 74 6f 20   when passed to 
2ca10 78 46 69 6c 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 41  xFilter..**.** A
2ca20 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f   jump is made to
2ca30 20 50 32 20 69 66 20 74 68 65 20 72 65 73 75 6c   P2 if the resul
2ca40 74 20 73 65 74 20 61 66 74 65 72 20 66 69 6c 74  t set after filt
2ca50 65 72 69 6e 67 20 77 6f 75 6c 64 20 62 65 20 65  ering would be e
2ca60 6d 70 74 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  mpty..*/.case OP
2ca70 5f 56 46 69 6c 74 65 72 3a 20 7b 20 20 20 2f 2a  _VFilter: {   /*
2ca80 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74 20 6e   jump */.  int n
2ca90 41 72 67 3b 0a 20 20 69 6e 74 20 69 51 75 65 72  Arg;.  int iQuer
2caa0 79 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  y;.  const sqlit
2cab0 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
2cac0 6c 65 3b 0a 20 20 4d 65 6d 20 2a 70 51 75 65 72  le;.  Mem *pQuer
2cad0 79 3b 0a 20 20 4d 65 6d 20 2a 70 41 72 67 63 3b  y;.  Mem *pArgc;
2cae0 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
2caf0 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
2cb00 73 6f 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  sor;.  sqlite3_v
2cb10 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 56 64  tab *pVtab;.  Vd
2cb20 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  beCursor *pCur;.
2cb30 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74    int res;.  int
2cb40 20 69 3b 0a 20 20 4d 65 6d 20 2a 2a 61 70 41 72   i;.  Mem **apAr
2cb50 67 3b 0a 0a 20 20 70 51 75 65 72 79 20 3d 20 26  g;..  pQuery = &
2cb60 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
2cb70 20 70 41 72 67 63 20 3d 20 26 70 51 75 65 72 79   pArgc = &pQuery
2cb80 5b 31 5d 3b 0a 20 20 70 43 75 72 20 3d 20 70 2d  [1];.  pCur = p-
2cb90 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
2cba0 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73  .  assert( memIs
2cbb0 56 61 6c 69 64 28 70 51 75 65 72 79 29 20 29 3b  Valid(pQuery) );
2cbc0 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
2cbd0 45 28 70 4f 70 2d 3e 70 33 2c 20 70 51 75 65 72  E(pOp->p3, pQuer
2cbe0 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  y);.  assert( pC
2cbf0 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20  ur->pVtabCursor 
2cc00 29 3b 0a 20 20 70 56 74 61 62 43 75 72 73 6f 72  );.  pVtabCursor
2cc10 20 3d 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75   = pCur->pVtabCu
2cc20 72 73 6f 72 3b 0a 20 20 70 56 74 61 62 20 3d 20  rsor;.  pVtab = 
2cc30 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
2cc40 61 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20  ab;.  pModule = 
2cc50 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
2cc60 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 69  .  /* Grab the i
2cc70 6e 64 65 78 20 6e 75 6d 62 65 72 20 61 6e 64 20  ndex number and 
2cc80 61 72 67 63 20 70 61 72 61 6d 65 74 65 72 73 20  argc parameters 
2cc90 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 51  */.  assert( (pQ
2cca0 75 65 72 79 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  uery->flags&MEM_
2ccb0 49 6e 74 29 21 3d 30 20 26 26 20 70 41 72 67 63  Int)!=0 && pArgc
2ccc0 2d 3e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 74  ->flags==MEM_Int
2ccd0 20 29 3b 0a 20 20 6e 41 72 67 20 3d 20 28 69 6e   );.  nArg = (in
2cce0 74 29 70 41 72 67 63 2d 3e 75 2e 69 3b 0a 20 20  t)pArgc->u.i;.  
2ccf0 69 51 75 65 72 79 20 3d 20 28 69 6e 74 29 70 51  iQuery = (int)pQ
2cd00 75 65 72 79 2d 3e 75 2e 69 3b 0a 0a 20 20 2f 2a  uery->u.i;..  /*
2cd10 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c   Invoke the xFil
2cd20 74 65 72 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ter method */.  
2cd30 7b 0a 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20  {.    res = 0;. 
2cd40 20 20 20 61 70 41 72 67 20 3d 20 70 2d 3e 61 70     apArg = p->ap
2cd50 41 72 67 3b 0a 20 20 20 20 66 6f 72 28 69 20 3d  Arg;.    for(i =
2cd60 20 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29   0; i<nArg; i++)
2cd70 7b 0a 20 20 20 20 20 20 61 70 41 72 67 5b 69 5d  {.      apArg[i]
2cd80 20 3d 20 26 70 41 72 67 63 5b 69 2b 31 5d 3b 0a   = &pArgc[i+1];.
2cd90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2cda0 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28 61 70  eMemStoreType(ap
2cdb0 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 0a  Arg[i]);.    }..
2cdc0 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74      p->inVtabMet
2cdd0 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 72 63 20  hod = 1;.    rc 
2cde0 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 46 69 6c 74  = pModule->xFilt
2cdf0 65 72 28 70 56 74 61 62 43 75 72 73 6f 72 2c 20  er(pVtabCursor, 
2ce00 69 51 75 65 72 79 2c 20 70 4f 70 2d 3e 70 34 2e  iQuery, pOp->p4.
2ce10 7a 2c 20 6e 41 72 67 2c 20 61 70 41 72 67 29 3b  z, nArg, apArg);
2ce20 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  .    p->inVtabMe
2ce30 74 68 6f 64 20 3d 20 30 3b 0a 20 20 20 20 69 6d  thod = 0;.    im
2ce40 70 6f 72 74 56 74 61 62 45 72 72 4d 73 67 28 70  portVtabErrMsg(p
2ce50 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20 69 66  , pVtab);.    if
2ce60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ce70 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  ){.      res = p
2ce80 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66 28 70 56 74  Module->xEof(pVt
2ce90 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d  abCursor);.    }
2cea0 0a 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ..    if( res ){
2ceb0 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  .      pc = pOp-
2cec0 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20  >p2 - 1;.    }. 
2ced0 20 7d 0a 20 20 70 43 75 72 2d 3e 6e 75 6c 6c 52   }.  pCur->nullR
2cee0 6f 77 20 3d 20 30 3b 0a 0a 20 20 62 72 65 61 6b  ow = 0;..  break
2cef0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2cf00 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2cf10 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64  LTABLE */..#ifnd
2cf20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2cf30 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f  IRTUALTABLE./* O
2cf40 70 63 6f 64 65 3a 20 56 43 6f 6c 75 6d 6e 20 50  pcode: VColumn P
2cf50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
2cf60 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75  * Store the valu
2cf70 65 20 6f 66 20 74 68 65 20 50 32 2d 74 68 20 63  e of the P2-th c
2cf80 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
2cf90 72 6f 77 20 6f 66 20 74 68 65 20 76 69 72 74 75  row of the virtu
2cfa0 61 6c 2d 74 61 62 6c 65 20 74 68 61 74 20 74 68  al-table that th
2cfb0 65 20 0a 2a 2a 20 50 31 20 63 75 72 73 6f 72 20  e .** P1 cursor 
2cfc0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69  is pointing to i
2cfd0 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 33 2e  nto register P3.
2cfe0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 43 6f 6c  .*/.case OP_VCol
2cff0 75 6d 6e 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33  umn: {.  sqlite3
2d000 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20  _vtab *pVtab;.  
2d010 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
2d020 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20  dule *pModule;. 
2d030 20 4d 65 6d 20 2a 70 44 65 73 74 3b 0a 20 20 73   Mem *pDest;.  s
2d040 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 73  qlite3_context s
2d050 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 56 64 62 65  Context;..  Vdbe
2d060 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70  Cursor *pCur = p
2d070 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
2d080 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2d090 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 3b  ->pVtabCursor );
2d0a0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2d0b0 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c  p3>0 && pOp->p3<
2d0c0 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 44  =p->nMem );.  pD
2d0d0 65 73 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  est = &aMem[pOp-
2d0e0 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74  >p3];.  memAbout
2d0f0 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 44 65 73  ToChange(p, pDes
2d100 74 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  t);.  if( pCur->
2d110 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 73  nullRow ){.    s
2d120 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
2d130 4e 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20 20  Null(pDest);.   
2d140 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 56   break;.  }.  pV
2d150 74 61 62 20 3d 20 70 43 75 72 2d 3e 70 56 74 61  tab = pCur->pVta
2d160 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a  bCursor->pVtab;.
2d170 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61    pModule = pVta
2d180 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 61 73  b->pModule;.  as
2d190 73 65 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78  sert( pModule->x
2d1a0 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6d 65 6d 73  Column );.  mems
2d1b0 65 74 28 26 73 43 6f 6e 74 65 78 74 2c 20 30 2c  et(&sContext, 0,
2d1c0 20 73 69 7a 65 6f 66 28 73 43 6f 6e 74 65 78 74   sizeof(sContext
2d1d0 29 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6f 75  ));..  /* The ou
2d1e0 74 70 75 74 20 63 65 6c 6c 20 6d 61 79 20 61 6c  tput cell may al
2d1f0 72 65 61 64 79 20 68 61 76 65 20 61 20 62 75 66  ready have a buf
2d200 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 2e 20 4d  fer allocated. M
2d210 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ove.  ** the cur
2d220 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 74 6f  rent contents to
2d230 20 73 43 6f 6e 74 65 78 74 2e 73 20 73 6f 20 69   sContext.s so i
2d240 6e 20 63 61 73 65 20 74 68 65 20 75 73 65 72 2d  n case the user-
2d250 66 75 6e 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 63  function .  ** c
2d260 61 6e 20 75 73 65 20 74 68 65 20 61 6c 72 65 61  an use the alrea
2d270 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  dy allocated buf
2d280 66 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 61  fer instead of a
2d290 6c 6c 6f 63 61 74 69 6e 67 20 61 20 0a 20 20 2a  llocating a .  *
2d2a0 2a 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  * new one..  */.
2d2b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
2d2c0 4d 6f 76 65 28 26 73 43 6f 6e 74 65 78 74 2e 73  Move(&sContext.s
2d2d0 2c 20 70 44 65 73 74 29 3b 0a 20 20 4d 65 6d 53  , pDest);.  MemS
2d2e0 65 74 54 79 70 65 46 6c 61 67 28 26 73 43 6f 6e  etTypeFlag(&sCon
2d2f0 74 65 78 74 2e 73 2c 20 4d 45 4d 5f 4e 75 6c 6c  text.s, MEM_Null
2d300 29 3b 0a 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75  );..  rc = pModu
2d310 6c 65 2d 3e 78 43 6f 6c 75 6d 6e 28 70 43 75 72  le->xColumn(pCur
2d320 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 2c 20 26  ->pVtabCursor, &
2d330 73 43 6f 6e 74 65 78 74 2c 20 70 4f 70 2d 3e 70  sContext, pOp->p
2d340 32 29 3b 0a 20 20 69 6d 70 6f 72 74 56 74 61 62  2);.  importVtab
2d350 45 72 72 4d 73 67 28 70 2c 20 70 56 74 61 62 29  ErrMsg(p, pVtab)
2d360 3b 0a 20 20 69 66 28 20 73 43 6f 6e 74 65 78 74  ;.  if( sContext
2d370 2e 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  .isError ){.    
2d380 72 63 20 3d 20 73 43 6f 6e 74 65 78 74 2e 69 73  rc = sContext.is
2d390 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Error;.  }..  /*
2d3a0 20 43 6f 70 79 20 74 68 65 20 72 65 73 75 6c 74   Copy the result
2d3b0 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
2d3c0 20 74 6f 20 74 68 65 20 50 33 20 72 65 67 69 73   to the P3 regis
2d3d0 74 65 72 2e 20 57 65 0a 20 20 2a 2a 20 64 6f 20  ter. We.  ** do 
2d3e0 74 68 69 73 20 72 65 67 61 72 64 6c 65 73 73 20  this regardless 
2d3f0 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  of whether or no
2d400 74 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  t an error occur
2d410 72 65 64 20 74 6f 20 65 6e 73 75 72 65 20 61 6e  red to ensure an
2d420 79 0a 20 20 2a 2a 20 64 79 6e 61 6d 69 63 20 61  y.  ** dynamic a
2d430 6c 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 73 43 6f  llocation in sCo
2d440 6e 74 65 78 74 2e 73 20 28 61 20 4d 65 6d 20 73  ntext.s (a Mem s
2d450 74 72 75 63 74 29 20 69 73 20 20 72 65 6c 65 61  truct) is  relea
2d460 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  sed..  */.  sqli
2d470 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
2d480 6f 64 69 6e 67 28 26 73 43 6f 6e 74 65 78 74 2e  oding(&sContext.
2d490 73 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  s, encoding);.  
2d4a0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f  sqlite3VdbeMemMo
2d4b0 76 65 28 70 44 65 73 74 2c 20 26 73 43 6f 6e 74  ve(pDest, &sCont
2d4c0 65 78 74 2e 73 29 3b 0a 20 20 52 45 47 49 53 54  ext.s);.  REGIST
2d4d0 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
2d4e0 2c 20 70 44 65 73 74 29 3b 0a 20 20 55 50 44 41  , pDest);.  UPDA
2d4f0 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
2d500 70 44 65 73 74 29 3b 0a 0a 20 20 69 66 28 20 73  pDest);..  if( s
2d510 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f  qlite3VdbeMemToo
2d520 42 69 67 28 70 44 65 73 74 29 20 29 7b 0a 20 20  Big(pDest) ){.  
2d530 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a    goto too_big;.
2d540 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23    }.  break;.}.#
2d550 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2d560 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2d570 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2d580 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2d590 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65  LTABLE./* Opcode
2d5a0 3a 20 56 4e 65 78 74 20 50 31 20 50 32 20 2a 20  : VNext P1 P2 * 
2d5b0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63  * *.**.** Advanc
2d5c0 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
2d5d0 50 31 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  P1 to the next r
2d5e0 6f 77 20 69 6e 20 69 74 73 20 72 65 73 75 6c 74  ow in its result
2d5f0 20 73 65 74 20 61 6e 64 0a 2a 2a 20 6a 75 6d 70   set and.** jump
2d600 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   to instruction 
2d610 50 32 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20  P2.  Or, if the 
2d620 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  virtual table ha
2d630 73 20 72 65 61 63 68 65 64 0a 2a 2a 20 74 68 65  s reached.** the
2d640 20 65 6e 64 20 6f 66 20 69 74 73 20 72 65 73 75   end of its resu
2d650 6c 74 20 73 65 74 2c 20 74 68 65 6e 20 66 61 6c  lt set, then fal
2d660 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
2d670 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
2d680 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 4e  n..*/.case OP_VN
2d690 65 78 74 3a 20 7b 20 20 20 2f 2a 20 6a 75 6d 70  ext: {   /* jump
2d6a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 74   */.  sqlite3_vt
2d6b0 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e  ab *pVtab;.  con
2d6c0 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
2d6d0 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e  e *pModule;.  in
2d6e0 74 20 72 65 73 3b 0a 20 20 56 64 62 65 43 75 72  t res;.  VdbeCur
2d6f0 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 72 65  sor *pCur;..  re
2d700 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 20 3d 20  s = 0;.  pCur = 
2d710 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
2d720 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ];.  assert( pCu
2d730 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29  r->pVtabCursor )
2d740 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 75  ;.  if( pCur->nu
2d750 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 62 72 65  llRow ){.    bre
2d760 61 6b 3b 0a 20 20 7d 0a 20 20 70 56 74 61 62 20  ak;.  }.  pVtab 
2d770 3d 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72  = pCur->pVtabCur
2d780 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d  sor->pVtab;.  pM
2d790 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70  odule = pVtab->p
2d7a0 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65 72 74  Module;.  assert
2d7b0 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74  ( pModule->xNext
2d7c0 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65   );..  /* Invoke
2d7d0 20 74 68 65 20 78 4e 65 78 74 28 29 20 6d 65 74   the xNext() met
2d7e0 68 6f 64 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c  hod of the modul
2d7f0 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 77  e. There is no w
2d800 61 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ay for the.  ** 
2d810 75 6e 64 65 72 6c 79 69 6e 67 20 69 6d 70 6c 65  underlying imple
2d820 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20 72 65 74  mentation to ret
2d830 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 66 20  urn an error if 
2d840 6f 6e 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e  one occurs durin
2d850 67 0a 20 20 2a 2a 20 78 4e 65 78 74 28 29 2e 20  g.  ** xNext(). 
2d860 49 6e 73 74 65 61 64 2c 20 69 66 20 61 6e 20 65  Instead, if an e
2d870 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 72 75  rror occurs, tru
2d880 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 69  e is returned (i
2d890 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 0a  ndicating that .
2d8a0 20 20 2a 2a 20 64 61 74 61 20 69 73 20 61 76 61    ** data is ava
2d8b0 69 6c 61 62 6c 65 29 20 61 6e 64 20 74 68 65 20  ilable) and the 
2d8c0 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72  error code retur
2d8d0 6e 65 64 20 77 68 65 6e 20 78 43 6f 6c 75 6d 6e  ned when xColumn
2d8e0 20 6f 72 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 74   or.  ** some ot
2d8f0 68 65 72 20 6d 65 74 68 6f 64 20 69 73 20 6e 65  her method is ne
2d900 78 74 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68  xt invoked on th
2d910 65 20 73 61 76 65 20 76 69 72 74 75 61 6c 20 74  e save virtual t
2d920 61 62 6c 65 20 63 75 72 73 6f 72 2e 0a 20 20 2a  able cursor..  *
2d930 2f 0a 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74  /.  p->inVtabMet
2d940 68 6f 64 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20  hod = 1;.  rc = 
2d950 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 28 70  pModule->xNext(p
2d960 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  Cur->pVtabCursor
2d970 29 3b 0a 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  );.  p->inVtabMe
2d980 74 68 6f 64 20 3d 20 30 3b 0a 20 20 69 6d 70 6f  thod = 0;.  impo
2d990 72 74 56 74 61 62 45 72 72 4d 73 67 28 70 2c 20  rtVtabErrMsg(p, 
2d9a0 70 56 74 61 62 29 3b 0a 20 20 69 66 28 20 72 63  pVtab);.  if( rc
2d9b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2d9c0 20 20 20 72 65 73 20 3d 20 70 4d 6f 64 75 6c 65     res = pModule
2d9d0 2d 3e 78 45 6f 66 28 70 43 75 72 2d 3e 70 56 74  ->xEof(pCur->pVt
2d9e0 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 0a  abCursor);.  }..
2d9f0 20 20 69 66 28 20 21 72 65 73 20 29 7b 0a 20 20    if( !res ){.  
2da00 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
2da10 20 64 61 74 61 2c 20 6a 75 6d 70 20 74 6f 20 50   data, jump to P
2da20 32 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 70 4f  2 */.    pc = pO
2da30 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20  p->p2 - 1;.  }. 
2da40 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
2da50 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2da60 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
2da70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2da80 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2da90 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 52 65  E./* Opcode: VRe
2daa0 6e 61 6d 65 20 50 31 20 2a 20 2a 20 50 34 20 2a  name P1 * * P4 *
2dab0 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70  .**.** P4 is a p
2dac0 6f 69 6e 74 65 72 20 74 6f 20 61 20 76 69 72 74  ointer to a virt
2dad0 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74  ual table object
2dae0 2c 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61  , an sqlite3_vta
2daf0 62 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  b structure..** 
2db00 54 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f  This opcode invo
2db10 6b 65 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f  kes the correspo
2db20 6e 64 69 6e 67 20 78 52 65 6e 61 6d 65 20 6d 65  nding xRename me
2db30 74 68 6f 64 2e 20 54 68 65 20 76 61 6c 75 65 0a  thod. The value.
2db40 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ** in register P
2db50 31 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  1 is passed as t
2db60 68 65 20 7a 4e 61 6d 65 20 61 72 67 75 6d 65 6e  he zName argumen
2db70 74 20 74 6f 20 74 68 65 20 78 52 65 6e 61 6d 65  t to the xRename
2db80 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 63 61 73 65   method..*/.case
2db90 20 4f 50 5f 56 52 65 6e 61 6d 65 3a 20 7b 0a 20   OP_VRename: {. 
2dba0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
2dbb0 56 74 61 62 3b 0a 20 20 4d 65 6d 20 2a 70 4e 61  Vtab;.  Mem *pNa
2dbc0 6d 65 3b 0a 0a 20 20 70 56 74 61 62 20 3d 20 70  me;..  pVtab = p
2dbd0 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56  Op->p4.pVtab->pV
2dbe0 74 61 62 3b 0a 20 20 70 4e 61 6d 65 20 3d 20 26  tab;.  pName = &
2dbf0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
2dc00 20 61 73 73 65 72 74 28 20 70 56 74 61 62 2d 3e   assert( pVtab->
2dc10 70 4d 6f 64 75 6c 65 2d 3e 78 52 65 6e 61 6d 65  pModule->xRename
2dc20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 65   );.  assert( me
2dc30 6d 49 73 56 61 6c 69 64 28 70 4e 61 6d 65 29 20  mIsValid(pName) 
2dc40 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  );.  REGISTER_TR
2dc50 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70 4e 61  ACE(pOp->p1, pNa
2dc60 6d 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  me);.  assert( p
2dc70 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 26 20 4d 45  Name->flags & ME
2dc80 4d 5f 53 74 72 20 29 3b 0a 20 20 72 63 20 3d 20  M_Str );.  rc = 
2dc90 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e  pVtab->pModule->
2dca0 78 52 65 6e 61 6d 65 28 70 56 74 61 62 2c 20 70  xRename(pVtab, p
2dcb0 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 69 6d 70 6f  Name->z);.  impo
2dcc0 72 74 56 74 61 62 45 72 72 4d 73 67 28 70 2c 20  rtVtabErrMsg(p, 
2dcd0 70 56 74 61 62 29 3b 0a 20 20 70 2d 3e 65 78 70  pVtab);.  p->exp
2dce0 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20 62 72 65  ired = 0;..  bre
2dcf0 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ak;.}.#endif..#i
2dd00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2dd10 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
2dd20 2a 20 4f 70 63 6f 64 65 3a 20 56 55 70 64 61 74  * Opcode: VUpdat
2dd30 65 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  e P1 P2 P3 P4 *.
2dd40 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f  **.** P4 is a po
2dd50 69 6e 74 65 72 20 74 6f 20 61 20 76 69 72 74 75  inter to a virtu
2dd60 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 2c  al table object,
2dd70 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
2dd80 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54   structure..** T
2dd90 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b  his opcode invok
2dda0 65 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  es the correspon
2ddb0 64 69 6e 67 20 78 55 70 64 61 74 65 20 6d 65 74  ding xUpdate met
2ddc0 68 6f 64 2e 20 50 32 20 76 61 6c 75 65 73 0a 2a  hod. P2 values.*
2ddd0 2a 20 61 72 65 20 63 6f 6e 74 69 67 75 6f 75 73  * are contiguous
2dde0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 73 74   memory cells st
2ddf0 61 72 74 69 6e 67 20 61 74 20 50 33 20 74 6f 20  arting at P3 to 
2de00 70 61 73 73 20 74 6f 20 74 68 65 20 78 55 70 64  pass to the xUpd
2de10 61 74 65 20 0a 2a 2a 20 69 6e 76 6f 63 61 74 69  ate .** invocati
2de20 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 69 6e  on. The value in
2de30 20 72 65 67 69 73 74 65 72 20 28 50 33 2b 50 32   register (P3+P2
2de40 2d 31 29 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  -1) corresponds 
2de50 74 6f 20 74 68 65 20 0a 2a 2a 20 70 32 74 68 20  to the .** p2th 
2de60 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61  element of the a
2de70 72 67 76 20 61 72 72 61 79 20 70 61 73 73 65 64  rgv array passed
2de80 20 74 6f 20 78 55 70 64 61 74 65 2e 0a 2a 2a 0a   to xUpdate..**.
2de90 2a 2a 20 54 68 65 20 78 55 70 64 61 74 65 20 6d  ** The xUpdate m
2dea0 65 74 68 6f 64 20 77 69 6c 6c 20 64 6f 20 61 20  ethod will do a 
2deb0 44 45 4c 45 54 45 20 6f 72 20 61 6e 20 49 4e 53  DELETE or an INS
2dec0 45 52 54 20 6f 72 20 62 6f 74 68 2e 0a 2a 2a 20  ERT or both..** 
2ded0 54 68 65 20 61 72 67 76 5b 30 5d 20 65 6c 65 6d  The argv[0] elem
2dee0 65 6e 74 20 28 77 68 69 63 68 20 63 6f 72 72 65  ent (which corre
2def0 73 70 6f 6e 64 73 20 74 6f 20 6d 65 6d 6f 72 79  sponds to memory
2df00 20 63 65 6c 6c 20 50 33 29 0a 2a 2a 20 69 73 20   cell P3).** is 
2df10 74 68 65 20 72 6f 77 69 64 20 6f 66 20 61 20 72  the rowid of a r
2df20 6f 77 20 74 6f 20 64 65 6c 65 74 65 2e 20 20 49  ow to delete.  I
2df30 66 20 61 72 67 76 5b 30 5d 20 69 73 20 4e 55 4c  f argv[0] is NUL
2df40 4c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 64 65  L then no .** de
2df50 6c 65 74 69 6f 6e 20 6f 63 63 75 72 73 2e 20 20  letion occurs.  
2df60 54 68 65 20 61 72 67 76 5b 31 5d 20 65 6c 65 6d  The argv[1] elem
2df70 65 6e 74 20 69 73 20 74 68 65 20 72 6f 77 69 64  ent is the rowid
2df80 20 6f 66 20 74 68 65 20 6e 65 77 20 0a 2a 2a 20   of the new .** 
2df90 72 6f 77 2e 20 20 54 68 69 73 20 63 61 6e 20 62  row.  This can b
2dfa0 65 20 4e 55 4c 4c 20 74 6f 20 68 61 76 65 20 74  e NULL to have t
2dfb0 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
2dfc0 20 73 65 6c 65 63 74 20 74 68 65 20 6e 65 77 20   select the new 
2dfd0 0a 2a 2a 20 72 6f 77 69 64 20 66 6f 72 20 69 74  .** rowid for it
2dfe0 73 65 6c 66 2e 20 20 54 68 65 20 73 75 62 73 65  self.  The subse
2dff0 71 75 65 6e 74 20 65 6c 65 6d 65 6e 74 73 20 69  quent elements i
2e000 6e 20 74 68 65 20 61 72 72 61 79 20 61 72 65 20  n the array are 
2e010 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 6f  .** the values o
2e020 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
2e030 20 6e 65 77 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20   new row..**.** 
2e040 49 66 20 50 32 3d 3d 31 20 74 68 65 6e 20 6e 6f  If P2==1 then no
2e050 20 69 6e 73 65 72 74 20 69 73 20 70 65 72 66 6f   insert is perfo
2e060 72 6d 65 64 2e 20 20 61 72 67 76 5b 30 5d 20 69  rmed.  argv[0] i
2e070 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 0a 2a  s the rowid of.*
2e080 2a 20 61 20 72 6f 77 20 74 6f 20 64 65 6c 65 74  * a row to delet
2e090 65 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61  e..**.** P1 is a
2e0a0 20 62 6f 6f 6c 65 61 6e 20 66 6c 61 67 2e 20 49   boolean flag. I
2e0b0 66 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 74  f it is set to t
2e0c0 72 75 65 20 61 6e 64 20 74 68 65 20 78 55 70 64  rue and the xUpd
2e0d0 61 74 65 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 73  ate call.** is s
2e0e0 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 6e 20  uccessful, then 
2e0f0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
2e100 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6c 61  ed by sqlite3_la
2e110 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
2e120 29 20 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ) .** is set to 
2e130 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2e140 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 72   rowid for the r
2e150 6f 77 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64  ow just inserted
2e160 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 55 70  ..*/.case OP_VUp
2e170 64 61 74 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65  date: {.  sqlite
2e180 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20  3_vtab *pVtab;. 
2e190 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
2e1a0 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e 74 20  *pModule;.  int 
2e1b0 6e 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  nArg;.  int i;. 
2e1c0 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f   sqlite_int64 ro
2e1d0 77 69 64 3b 0a 20 20 4d 65 6d 20 2a 2a 61 70 41  wid;.  Mem **apA
2e1e0 72 67 3b 0a 20 20 4d 65 6d 20 2a 70 58 3b 0a 0a  rg;.  Mem *pX;..
2e1f0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2e200 32 3d 3d 31 20 20 20 20 20 20 20 20 7c 7c 20 70  2==1        || p
2e210 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 46 61 69 6c 20  Op->p5==OE_Fail 
2e220 20 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45    || pOp->p5==OE
2e230 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20  _Rollback .     
2e240 20 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45    || pOp->p5==OE
2e250 5f 41 62 6f 72 74 20 7c 7c 20 70 4f 70 2d 3e 70  _Abort || pOp->p
2e260 35 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 7c 7c 20  5==OE_Ignore || 
2e270 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 52 65 70 6c  pOp->p5==OE_Repl
2e280 61 63 65 0a 20 20 29 3b 0a 20 20 70 56 74 61 62  ace.  );.  pVtab
2e290 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62   = pOp->p4.pVtab
2e2a0 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64 75  ->pVtab;.  pModu
2e2b0 6c 65 20 3d 20 28 73 71 6c 69 74 65 33 5f 6d 6f  le = (sqlite3_mo
2e2c0 64 75 6c 65 20 2a 29 70 56 74 61 62 2d 3e 70 4d  dule *)pVtab->pM
2e2d0 6f 64 75 6c 65 3b 0a 20 20 6e 41 72 67 20 3d 20  odule;.  nArg = 
2e2e0 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72  pOp->p2;.  asser
2e2f0 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
2e300 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 69 66 28  P4_VTAB );.  if(
2e310 20 41 4c 57 41 59 53 28 70 4d 6f 64 75 6c 65 2d   ALWAYS(pModule-
2e320 3e 78 55 70 64 61 74 65 29 20 29 7b 0a 20 20 20  >xUpdate) ){.   
2e330 20 75 38 20 76 74 61 62 4f 6e 43 6f 6e 66 6c 69   u8 vtabOnConfli
2e340 63 74 20 3d 20 64 62 2d 3e 76 74 61 62 4f 6e 43  ct = db->vtabOnC
2e350 6f 6e 66 6c 69 63 74 3b 0a 20 20 20 20 61 70 41  onflict;.    apA
2e360 72 67 20 3d 20 70 2d 3e 61 70 41 72 67 3b 0a 20  rg = p->apArg;. 
2e370 20 20 20 70 58 20 3d 20 26 61 4d 65 6d 5b 70 4f     pX = &aMem[pO
2e380 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 66 6f 72 28  p->p3];.    for(
2e390 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
2e3a0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2e3b0 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 58 29 20   memIsValid(pX) 
2e3c0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62 6f 75  );.      memAbou
2e3d0 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 58 29  tToChange(p, pX)
2e3e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2e3f0 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28  dbeMemStoreType(
2e400 70 58 29 3b 0a 20 20 20 20 20 20 61 70 41 72 67  pX);.      apArg
2e410 5b 69 5d 20 3d 20 70 58 3b 0a 20 20 20 20 20 20  [i] = pX;.      
2e420 70 58 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pX++;.    }.    
2e430 64 62 2d 3e 76 74 61 62 4f 6e 43 6f 6e 66 6c 69  db->vtabOnConfli
2e440 63 74 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20  ct = pOp->p5;.  
2e450 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e    rc = pModule->
2e460 78 55 70 64 61 74 65 28 70 56 74 61 62 2c 20 6e  xUpdate(pVtab, n
2e470 41 72 67 2c 20 61 70 41 72 67 2c 20 26 72 6f 77  Arg, apArg, &row
2e480 69 64 29 3b 0a 20 20 20 20 64 62 2d 3e 76 74 61  id);.    db->vta
2e490 62 4f 6e 43 6f 6e 66 6c 69 63 74 20 3d 20 76 74  bOnConflict = vt
2e4a0 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 3b 0a 20 20  abOnConflict;.  
2e4b0 20 20 69 6d 70 6f 72 74 56 74 61 62 45 72 72 4d    importVtabErrM
2e4c0 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20  sg(p, pVtab);.  
2e4d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e4e0 5f 4f 4b 20 26 26 20 70 4f 70 2d 3e 70 31 20 29  _OK && pOp->p1 )
2e4f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2e500 6e 41 72 67 3e 31 20 26 26 20 61 70 41 72 67 5b  nArg>1 && apArg[
2e510 30 5d 20 26 26 20 28 61 70 41 72 67 5b 30 5d 2d  0] && (apArg[0]-
2e520 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 29  >flags&MEM_Null)
2e530 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 61   );.      db->la
2e540 73 74 52 6f 77 69 64 20 3d 20 6c 61 73 74 52 6f  stRowid = lastRo
2e550 77 69 64 20 3d 20 72 6f 77 69 64 3b 0a 20 20 20  wid = rowid;.   
2e560 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2e570 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
2e580 20 26 26 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61   && pOp->p4.pVta
2e590 62 2d 3e 62 43 6f 6e 73 74 72 61 69 6e 74 20 29  b->bConstraint )
2e5a0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
2e5b0 3e 70 35 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29  >p5==OE_Ignore )
2e5c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2e5d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2e5e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2e5f0 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
2e600 28 28 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 52 65  ((pOp->p5==OE_Re
2e610 70 6c 61 63 65 29 20 3f 20 4f 45 5f 41 62 6f 72  place) ? OE_Abor
2e620 74 20 3a 20 70 4f 70 2d 3e 70 35 29 3b 0a 20 20  t : pOp->p5);.  
2e630 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2e640 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
2e650 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
2e660 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
2e670 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2e680 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
2e690 0a 23 69 66 6e 64 65 66 20 20 53 51 4c 49 54 45  .#ifndef  SQLITE
2e6a0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
2e6b0 4d 41 53 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50  MAS./* Opcode: P
2e6c0 61 67 65 63 6f 75 6e 74 20 50 31 20 50 32 20 2a  agecount P1 P2 *
2e6d0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65   * *.**.** Write
2e6e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d   the current num
2e6f0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2e700 64 61 74 61 62 61 73 65 20 50 31 20 74 6f 20 6d  database P1 to m
2e710 65 6d 6f 72 79 20 63 65 6c 6c 20 50 32 2e 0a 2a  emory cell P2..*
2e720 2f 0a 63 61 73 65 20 4f 50 5f 50 61 67 65 63 6f  /.case OP_Pageco
2e730 75 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20  unt: {          
2e740 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c    /* out2-prerel
2e750 65 61 73 65 20 2a 2f 0a 20 20 70 4f 75 74 2d 3e  ease */.  pOut->
2e760 75 2e 69 20 3d 20 73 71 6c 69 74 65 33 42 74 72  u.i = sqlite3Btr
2e770 65 65 4c 61 73 74 50 61 67 65 28 64 62 2d 3e 61  eeLastPage(db->a
2e780 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 29  Db[pOp->p1].pBt)
2e790 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
2e7a0 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 20 53  dif...#ifndef  S
2e7b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
2e7c0 5f 50 52 41 47 4d 41 53 0a 2f 2a 20 4f 70 63 6f  _PRAGMAS./* Opco
2e7d0 64 65 3a 20 4d 61 78 50 67 63 6e 74 20 50 31 20  de: MaxPgcnt P1 
2e7e0 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
2e7f0 54 72 79 20 74 6f 20 73 65 74 20 74 68 65 20 6d  Try to set the m
2e800 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
2e810 74 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 50  t for database P
2e820 31 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  1 to the value i
2e830 6e 20 50 33 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20  n P3..** Do not 
2e840 6c 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  let the maximum 
2e850 70 61 67 65 20 63 6f 75 6e 74 20 66 61 6c 6c 20  page count fall 
2e860 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
2e870 74 20 70 61 67 65 20 63 6f 75 6e 74 20 61 6e 64  t page count and
2e880 0a 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67  .** do not chang
2e890 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  e the maximum pa
2e8a0 67 65 20 63 6f 75 6e 74 20 76 61 6c 75 65 20 69  ge count value i
2e8b0 66 20 50 33 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 53  f P3==0..**.** S
2e8c0 74 6f 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  tore the maximum
2e8d0 20 70 61 67 65 20 63 6f 75 6e 74 20 61 66 74 65   page count afte
2e8e0 72 20 74 68 65 20 63 68 61 6e 67 65 20 69 6e 20  r the change in 
2e8f0 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a  register P2..*/.
2e900 63 61 73 65 20 4f 50 5f 4d 61 78 50 67 63 6e 74  case OP_MaxPgcnt
2e910 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
2e920 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73  * out2-prereleas
2e930 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
2e940 69 6e 74 20 6e 65 77 4d 61 78 3b 0a 20 20 42 74  int newMax;.  Bt
2e950 72 65 65 20 2a 70 42 74 3b 0a 0a 20 20 70 42 74  ree *pBt;..  pBt
2e960 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e   = db->aDb[pOp->
2e970 70 31 5d 2e 70 42 74 3b 0a 20 20 6e 65 77 4d 61  p1].pBt;.  newMa
2e980 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 70  x = 0;.  if( pOp
2e990 2d 3e 70 33 20 29 7b 0a 20 20 20 20 6e 65 77 4d  ->p3 ){.    newM
2e9a0 61 78 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ax = sqlite3Btre
2e9b0 65 4c 61 73 74 50 61 67 65 28 70 42 74 29 3b 0a  eLastPage(pBt);.
2e9c0 20 20 20 20 69 66 28 20 6e 65 77 4d 61 78 20 3c      if( newMax <
2e9d0 20 28 75 6e 73 69 67 6e 65 64 29 70 4f 70 2d 3e   (unsigned)pOp->
2e9e0 70 33 20 29 20 6e 65 77 4d 61 78 20 3d 20 28 75  p3 ) newMax = (u
2e9f0 6e 73 69 67 6e 65 64 29 70 4f 70 2d 3e 70 33 3b  nsigned)pOp->p3;
2ea00 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69  .  }.  pOut->u.i
2ea10 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
2ea20 61 78 50 61 67 65 43 6f 75 6e 74 28 70 42 74 2c  axPageCount(pBt,
2ea30 20 6e 65 77 4d 61 78 29 3b 0a 20 20 62 72 65 61   newMax);.  brea
2ea40 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  k;.}.#endif...#i
2ea50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ea60 54 5f 54 52 41 43 45 0a 2f 2a 20 4f 70 63 6f 64  T_TRACE./* Opcod
2ea70 65 3a 20 54 72 61 63 65 20 2a 20 2a 20 2a 20 50  e: Trace * * * P
2ea80 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 61  4 *.**.** If tra
2ea90 63 69 6e 67 20 69 73 20 65 6e 61 62 6c 65 64 20  cing is enabled 
2eaa0 28 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f  (by the sqlite3_
2eab0 74 72 61 63 65 28 29 29 20 69 6e 74 65 72 66 61  trace()) interfa
2eac0 63 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ce, then.** the 
2ead0 55 54 46 2d 38 20 73 74 72 69 6e 67 20 63 6f 6e  UTF-8 string con
2eae0 74 61 69 6e 65 64 20 69 6e 20 50 34 20 69 73 20  tained in P4 is 
2eaf0 65 6d 69 74 74 65 64 20 6f 6e 20 74 68 65 20 74  emitted on the t
2eb00 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  race callback..*
2eb10 2f 0a 63 61 73 65 20 4f 50 5f 54 72 61 63 65 3a  /.case OP_Trace:
2eb20 20 7b 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63   {.  char *zTrac
2eb30 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  e;.  char *z;.. 
2eb40 20 69 66 28 20 64 62 2d 3e 78 54 72 61 63 65 20   if( db->xTrace 
2eb50 26 26 20 28 7a 54 72 61 63 65 20 3d 20 28 70 4f  && (zTrace = (pO
2eb60 70 2d 3e 70 34 2e 7a 20 3f 20 70 4f 70 2d 3e 70  p->p4.z ? pOp->p
2eb70 34 2e 7a 20 3a 20 70 2d 3e 7a 53 71 6c 29 29 21  4.z : p->zSql))!
2eb80 3d 30 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71  =0 ){.    z = sq
2eb90 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53  lite3VdbeExpandS
2eba0 71 6c 28 70 2c 20 7a 54 72 61 63 65 29 3b 0a 20  ql(p, zTrace);. 
2ebb0 20 20 20 64 62 2d 3e 78 54 72 61 63 65 28 64 62     db->xTrace(db
2ebc0 2d 3e 70 54 72 61 63 65 41 72 67 2c 20 7a 29 3b  ->pTraceArg, z);
2ebd0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2ebe0 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 7d 0a 23  ee(db, z);.  }.#
2ebf0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2ec00 55 47 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  UG.  if( (db->fl
2ec10 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 71 6c  ags & SQLITE_Sql
2ec20 54 72 61 63 65 29 21 3d 30 0a 20 20 20 26 26 20  Trace)!=0.   && 
2ec30 28 7a 54 72 61 63 65 20 3d 20 28 70 4f 70 2d 3e  (zTrace = (pOp->
2ec40 70 34 2e 7a 20 3f 20 70 4f 70 2d 3e 70 34 2e 7a  p4.z ? pOp->p4.z
2ec50 20 3a 20 70 2d 3e 7a 53 71 6c 29 29 21 3d 30 0a   : p->zSql))!=0.
2ec60 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
2ec70 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 51 4c  DebugPrintf("SQL
2ec80 2d 74 72 61 63 65 3a 20 25 73 5c 6e 22 2c 20 7a  -trace: %s\n", z
2ec90 54 72 61 63 65 29 3b 0a 20 20 7d 0a 23 65 6e 64  Trace);.  }.#end
2eca0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
2ecb0 55 47 20 2a 2f 0a 20 20 62 72 65 61 6b 3b 0a 7d  UG */.  break;.}
2ecc0 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 4f 70 63  .#endif.../* Opc
2ecd0 6f 64 65 3a 20 4e 6f 6f 70 20 2a 20 2a 20 2a 20  ode: Noop * * * 
2ece0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  * *.**.** Do not
2ecf0 68 69 6e 67 2e 20 20 54 68 69 73 20 69 6e 73 74  hing.  This inst
2ed00 72 75 63 74 69 6f 6e 20 69 73 20 6f 66 74 65 6e  ruction is often
2ed10 20 75 73 65 66 75 6c 20 61 73 20 61 20 6a 75 6d   useful as a jum
2ed20 70 0a 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e  p.** destination
2ed30 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  ..*/./*.** The m
2ed40 61 67 69 63 20 45 78 70 6c 61 69 6e 20 6f 70 63  agic Explain opc
2ed50 6f 64 65 20 61 72 65 20 6f 6e 6c 79 20 69 6e 73  ode are only ins
2ed60 65 72 74 65 64 20 77 68 65 6e 20 65 78 70 6c 61  erted when expla
2ed70 69 6e 3d 3d 32 20 28 77 68 69 63 68 0a 2a 2a 20  in==2 (which.** 
2ed80 69 73 20 74 6f 20 73 61 79 20 77 68 65 6e 20 74  is to say when t
2ed90 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  he EXPLAIN QUERY
2eda0 20 50 4c 41 4e 20 73 79 6e 74 61 78 20 69 73 20   PLAN syntax is 
2edb0 75 73 65 64 2e 29 0a 2a 2a 20 54 68 69 73 20 6f  used.).** This o
2edc0 70 63 6f 64 65 20 72 65 63 6f 72 64 73 20 69 6e  pcode records in
2edd0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
2ede0 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 49  he optimizer.  I
2edf0 74 20 69 73 20 74 68 65 0a 2a 2a 20 74 68 65 20  t is the.** the 
2ee00 73 61 6d 65 20 61 73 20 61 20 6e 6f 2d 6f 70 2e  same as a no-op.
2ee10 20 20 54 68 69 73 20 6f 70 63 6f 64 65 73 6e 65    This opcodesne
2ee20 76 65 72 20 61 70 70 65 61 72 73 20 69 6e 20 61  ver appears in a
2ee30 20 72 65 61 6c 20 56 4d 20 70 72 6f 67 72 61 6d   real VM program
2ee40 2e 0a 2a 2f 0a 64 65 66 61 75 6c 74 3a 20 7b 20  ..*/.default: { 
2ee50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
2ee60 20 69 73 20 72 65 61 6c 6c 79 20 4f 50 5f 4e 6f   is really OP_No
2ee70 6f 70 20 61 6e 64 20 4f 50 5f 45 78 70 6c 61 69  op and OP_Explai
2ee80 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  n */.  assert( p
2ee90 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e  Op->opcode==OP_N
2eea0 6f 6f 70 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f  oop || pOp->opco
2eeb0 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de==OP_Explain )
2eec0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
2eed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ef00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ef10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
2ef20 54 68 65 20 63 61 73 65 73 20 6f 66 20 74 68 65  The cases of the
2ef30 20 73 77 69 74 63 68 20 73 74 61 74 65 6d 65 6e   switch statemen
2ef40 74 20 61 62 6f 76 65 20 74 68 69 73 20 6c 69 6e  t above this lin
2ef50 65 20 73 68 6f 75 6c 64 20 61 6c 6c 20 62 65 20  e should all be 
2ef60 69 6e 64 65 6e 74 65 64 0a 2a 2a 20 62 79 20 36  indented.** by 6
2ef70 20 73 70 61 63 65 73 2e 20 20 42 75 74 20 74 68   spaces.  But th
2ef80 65 20 6c 65 66 74 2d 6d 6f 73 74 20 36 20 73 70  e left-most 6 sp
2ef90 61 63 65 73 20 68 61 76 65 20 62 65 65 6e 20 72  aces have been r
2efa0 65 6d 6f 76 65 64 20 74 6f 20 69 6d 70 72 6f 76  emoved to improv
2efb0 65 20 74 68 65 0a 2a 2a 20 72 65 61 64 61 62 69  e the.** readabi
2efc0 6c 69 74 79 2e 20 20 46 72 6f 6d 20 74 68 69 73  lity.  From this
2efd0 20 70 6f 69 6e 74 20 6f 6e 20 64 6f 77 6e 2c 20   point on down, 
2efe0 74 68 65 20 6e 6f 72 6d 61 6c 20 69 6e 64 65 6e  the normal inden
2eff0 74 61 74 69 6f 6e 20 72 75 6c 65 73 20 61 72 65  tation rules are
2f000 0a 2a 2a 20 72 65 73 74 6f 72 65 64 2e 0a 2a 2a  .** restored..**
2f010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 20 20 20  ***********/.   
2f060 20 7d 0a 0a 23 69 66 64 65 66 20 56 44 42 45 5f   }..#ifdef VDBE_
2f070 50 52 4f 46 49 4c 45 0a 20 20 20 20 7b 0a 20 20  PROFILE.    {.  
2f080 20 20 20 20 75 36 34 20 65 6c 61 70 73 65 64 20      u64 elapsed 
2f090 3d 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28  = sqlite3Hwtime(
2f0a0 29 20 2d 20 73 74 61 72 74 3b 0a 20 20 20 20 20  ) - start;.     
2f0b0 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 2b 3d 20   pOp->cycles += 
2f0c0 65 6c 61 70 73 65 64 3b 0a 20 20 20 20 20 20 70  elapsed;.      p
2f0d0 4f 70 2d 3e 63 6e 74 2b 2b 3b 0a 23 69 66 20 30  Op->cnt++;.#if 0
2f0e0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
2f0f0 28 73 74 64 6f 75 74 2c 20 22 25 31 30 6c 6c 75  (stdout, "%10llu
2f100 20 22 2c 20 65 6c 61 70 73 65 64 29 3b 0a 20 20   ", elapsed);.  
2f110 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f120 65 50 72 69 6e 74 4f 70 28 73 74 64 6f 75 74 2c  ePrintOp(stdout,
2f130 20 6f 72 69 67 50 63 2c 20 26 61 4f 70 5b 6f 72   origPc, &aOp[or
2f140 69 67 50 63 5d 29 3b 0a 23 65 6e 64 69 66 0a 20  igPc]);.#endif. 
2f150 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
2f160 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
2f170 67 20 63 6f 64 65 20 61 64 64 73 20 6e 6f 74 68  g code adds noth
2f180 69 6e 67 20 74 6f 20 74 68 65 20 61 63 74 75 61  ing to the actua
2f190 6c 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 0a  l functionality.
2f1a0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72      ** of the pr
2f1b0 6f 67 72 61 6d 2e 20 20 49 74 20 69 73 20 6f 6e  ogram.  It is on
2f1c0 6c 79 20 68 65 72 65 20 66 6f 72 20 74 65 73 74  ly here for test
2f1d0 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
2f1e0 67 2e 0a 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65  g..    ** On the
2f1f0 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 74 20   other hand, it 
2f200 64 6f 65 73 20 62 75 72 6e 20 43 50 55 20 63 79  does burn CPU cy
2f210 63 6c 65 73 20 65 76 65 72 79 20 74 69 6d 65 20  cles every time 
2f220 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74  through.    ** t
2f230 68 65 20 65 76 61 6c 75 61 74 6f 72 20 6c 6f 6f  he evaluator loo
2f240 70 2e 20 20 53 6f 20 77 65 20 63 61 6e 20 6c 65  p.  So we can le
2f250 61 76 65 20 69 74 20 6f 75 74 20 77 68 65 6e 20  ave it out when 
2f260 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  NDEBUG is define
2f270 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  d..    */.#ifnde
2f280 66 20 4e 44 45 42 55 47 0a 20 20 20 20 61 73 73  f NDEBUG.    ass
2f290 65 72 74 28 20 70 63 3e 3d 2d 31 20 26 26 20 70  ert( pc>=-1 && p
2f2a0 63 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 0a 23 69 66  c<p->nOp );..#if
2f2b0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2f2c0 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 72 61 63  .    if( p->trac
2f2d0 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  e ){.      if( r
2f2e0 63 21 3d 30 20 29 20 66 70 72 69 6e 74 66 28 70  c!=0 ) fprintf(p
2f2f0 2d 3e 74 72 61 63 65 2c 22 72 63 3d 25 64 5c 6e  ->trace,"rc=%d\n
2f300 22 2c 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28  ",rc);.      if(
2f310 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20   pOp->opflags & 
2f320 28 4f 50 46 4c 47 5f 4f 55 54 32 5f 50 52 45 52  (OPFLG_OUT2_PRER
2f330 45 4c 45 41 53 45 7c 4f 50 46 4c 47 5f 4f 55 54  ELEASE|OPFLG_OUT
2f340 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  2) ){.        re
2f350 67 69 73 74 65 72 54 72 61 63 65 28 70 2d 3e 74  gisterTrace(p->t
2f360 72 61 63 65 2c 20 70 4f 70 2d 3e 70 32 2c 20 26  race, pOp->p2, &
2f370 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b 0a  aMem[pOp->p2]);.
2f380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2f390 28 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26  ( pOp->opflags &
2f3a0 20 4f 50 46 4c 47 5f 4f 55 54 33 20 29 7b 0a 20   OPFLG_OUT3 ){. 
2f3b0 20 20 20 20 20 20 20 72 65 67 69 73 74 65 72 54         registerT
2f3c0 72 61 63 65 28 70 2d 3e 74 72 61 63 65 2c 20 70  race(p->trace, p
2f3d0 4f 70 2d 3e 70 33 2c 20 26 61 4d 65 6d 5b 70 4f  Op->p3, &aMem[pO
2f3e0 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20 7d  p->p3]);.      }
2f3f0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 20 2f  .    }.#endif  /
2f400 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
2f410 2f 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45  /.#endif  /* NDE
2f420 42 55 47 20 2a 2f 0a 20 20 7d 20 20 2f 2a 20 54  BUG */.  }  /* T
2f430 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 6f  he end of the fo
2f440 72 28 3b 3b 29 20 6c 6f 6f 70 20 74 68 65 20 6c  r(;;) loop the l
2f450 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 6f 70 63  oops through opc
2f460 6f 64 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  odes */..  /* If
2f470 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
2f480 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
2f490 68 61 74 20 65 78 65 63 75 74 69 6f 6e 20 69 73  hat execution is
2f4a0 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 0a 20   finished with. 
2f4b0 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 66 20   ** an error of 
2f4c0 73 6f 6d 65 20 6b 69 6e 64 2e 0a 20 20 2a 2f 0a  some kind..  */.
2f4d0 76 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3a  vdbe_error_halt:
2f4e0 0a 20 20 61 73 73 65 72 74 28 20 72 63 20 29 3b  .  assert( rc );
2f4f0 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  .  p->rc = rc;. 
2f500 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
2f510 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
2f520 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Log!=0 );.  sqli
2f530 74 65 33 5f 6c 6f 67 28 72 63 2c 20 22 73 74 61  te3_log(rc, "sta
2f540 74 65 6d 65 6e 74 20 61 62 6f 72 74 73 20 61 74  tement aborts at
2f550 20 25 64 3a 20 5b 25 73 5d 20 25 73 22 2c 20 0a   %d: [%s] %s", .
2f560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f570 20 20 20 70 63 2c 20 70 2d 3e 7a 53 71 6c 2c 20     pc, p->zSql, 
2f580 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  p->zErrMsg);.  s
2f590 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
2f5a0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2f5b0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
2f5c0 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ) db->mallocFail
2f5d0 65 64 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 53  ed = 1;.  rc = S
2f5e0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69  QLITE_ERROR;.  i
2f5f0 66 28 20 72 65 73 65 74 53 63 68 65 6d 61 4f 6e  f( resetSchemaOn
2f600 46 61 75 6c 74 3e 30 20 29 7b 0a 20 20 20 20 73  Fault>0 ){.    s
2f610 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
2f620 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 72 65  nalSchema(db, re
2f630 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74  setSchemaOnFault
2f640 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  -1);.  }..  /* T
2f650 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
2f660 77 61 79 20 6f 75 74 20 6f 66 20 74 68 69 73 20  way out of this 
2f670 70 72 6f 63 65 64 75 72 65 2e 20 20 57 65 20 68  procedure.  We h
2f680 61 76 65 20 74 6f 0a 20 20 2a 2a 20 72 65 6c 65  ave to.  ** rele
2f690 61 73 65 20 74 68 65 20 6d 75 74 65 78 65 73 20  ase the mutexes 
2f6a0 6f 6e 20 62 74 72 65 65 73 20 74 68 61 74 20 77  on btrees that w
2f6b0 65 72 65 20 61 63 71 75 69 72 65 64 20 61 74 20  ere acquired at 
2f6c0 74 68 65 0a 20 20 2a 2a 20 74 6f 70 2e 20 2a 2f  the.  ** top. */
2f6d0 0a 76 64 62 65 5f 72 65 74 75 72 6e 3a 0a 20 20  .vdbe_return:.  
2f6e0 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
2f6f0 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 73 71 6c  lastRowid;.  sql
2f700 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
2f710 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ;.  return rc;..
2f720 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
2f730 65 20 69 66 20 61 20 73 74 72 69 6e 67 20 6f 72  e if a string or
2f740 20 62 6c 6f 62 20 6c 61 72 67 65 72 20 74 68 61   blob larger tha
2f750 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  n SQLITE_MAX_LEN
2f760 47 54 48 0a 20 20 2a 2a 20 69 73 20 65 6e 63 6f  GTH.  ** is enco
2f770 75 6e 74 65 72 65 64 2e 0a 20 20 2a 2f 0a 74 6f  untered..  */.to
2f780 6f 5f 62 69 67 3a 0a 20 20 73 71 6c 69 74 65 33  o_big:.  sqlite3
2f790 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
2f7a0 72 72 4d 73 67 2c 20 64 62 2c 20 22 73 74 72 69  rrMsg, db, "stri
2f7b0 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62  ng or blob too b
2f7c0 69 67 22 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c  ig");.  rc = SQL
2f7d0 49 54 45 5f 54 4f 4f 42 49 47 3b 0a 20 20 67 6f  ITE_TOOBIG;.  go
2f7e0 74 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68 61  to vdbe_error_ha
2f7f0 6c 74 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  lt;..  /* Jump t
2f800 6f 20 68 65 72 65 20 69 66 20 61 20 6d 61 6c 6c  o here if a mall
2f810 6f 63 28 29 20 66 61 69 6c 73 2e 0a 20 20 2a 2f  oc() fails..  */
2f820 0a 6e 6f 5f 6d 65 6d 3a 0a 20 20 64 62 2d 3e 6d  .no_mem:.  db->m
2f830 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
2f840 0a 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72  .  sqlite3SetStr
2f850 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
2f860 20 64 62 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d   db, "out of mem
2f870 6f 72 79 22 29 3b 0a 20 20 72 63 20 3d 20 53 51  ory");.  rc = SQ
2f880 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 67 6f  LITE_NOMEM;.  go
2f890 74 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68 61  to vdbe_error_ha
2f8a0 6c 74 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  lt;..  /* Jump t
2f8b0 6f 20 68 65 72 65 20 66 6f 72 20 61 6e 79 20 6f  o here for any o
2f8c0 74 68 65 72 20 6b 69 6e 64 20 6f 66 20 66 61 74  ther kind of fat
2f8d0 61 6c 20 65 72 72 6f 72 2e 20 20 54 68 65 20 22  al error.  The "
2f8e0 72 63 22 20 76 61 72 69 61 62 6c 65 0a 20 20 2a  rc" variable.  *
2f8f0 2a 20 73 68 6f 75 6c 64 20 68 6f 6c 64 20 74 68  * should hold th
2f900 65 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 2e 0a  e error number..
2f910 20 20 2a 2f 0a 61 62 6f 72 74 5f 64 75 65 5f 74    */.abort_due_t
2f920 6f 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72  o_error:.  asser
2f930 74 28 20 70 2d 3e 7a 45 72 72 4d 73 67 3d 3d 30  t( p->zErrMsg==0
2f940 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   );.  if( db->ma
2f950 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 63 20  llocFailed ) rc 
2f960 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2f970 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f980 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a  _IOERR_NOMEM ){.
2f990 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
2f9a0 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
2f9b0 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69  , db, "%s", sqli
2f9c0 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a  te3ErrStr(rc));.
2f9d0 20 20 7d 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f    }.  goto vdbe_
2f9e0 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 0a 20 20 2f  error_halt;..  /
2f9f0 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
2fa00 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
2fa10 74 65 72 72 75 70 74 28 29 20 41 50 49 20 73 65  terrupt() API se
2fa20 74 73 20 74 68 65 20 69 6e 74 65 72 72 75 70 74  ts the interrupt
2fa30 0a 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20 2a 2f  .  ** flag..  */
2fa40 0a 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 69 6e  .abort_due_to_in
2fa50 74 65 72 72 75 70 74 3a 0a 20 20 61 73 73 65 72  terrupt:.  asser
2fa60 74 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  t( db->u1.isInte
2fa70 72 72 75 70 74 65 64 20 29 3b 0a 20 20 72 63 20  rrupted );.  rc 
2fa80 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
2fa90 50 54 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63  PT;.  p->rc = rc
2faa0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 74 53 74  ;.  sqlite3SetSt
2fab0 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
2fac0 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69  , db, "%s", sqli
2fad0 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a  te3ErrStr(rc));.
2fae0 20 20 67 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f    goto vdbe_erro
2faf0 72 5f 68 61 6c 74 3b 0a 7d 0a                    r_halt;.}.