/ Hex Artifact Content
Login

Artifact 60340bfb23f456ea0791cb28262a887363773371:


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 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  /* Return true i
16d0: 66 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73  f the cursor was
16e0: 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68   opened using th
16f0: 65 20 4f 50 5f 4f 70 65 6e 53 6f 72 74 65 72 20  e OP_OpenSorter 
1700: 6f 70 63 6f 64 65 2e 20 2a 2f 0a 23 69 66 64 65  opcode. */.#ifde
1710: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
1720: 52 47 45 5f 53 4f 52 54 0a 23 20 64 65 66 69 6e  RGE_SORT.# defin
1730: 65 20 69 73 53 6f 72 74 65 72 28 78 29 20 30 0a  e isSorter(x) 0.
1740: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 69  #else.# define i
1750: 73 53 6f 72 74 65 72 28 78 29 20 28 28 78 29 2d  sSorter(x) ((x)-
1760: 3e 70 53 6f 72 74 65 72 21 3d 30 29 0a 23 65 6e  >pSorter!=0).#en
1770: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  dif../*.** Argum
1780: 65 6e 74 20 70 4d 65 6d 20 70 6f 69 6e 74 73 20  ent pMem points 
1790: 61 74 20 61 20 72 65 67 69 73 74 65 72 20 74 68  at a register th
17a0: 61 74 20 77 69 6c 6c 20 62 65 20 70 61 73 73 65  at will be passe
17b0: 64 20 74 6f 20 61 0a 2a 2a 20 75 73 65 72 2d 64  d to a.** user-d
17c0: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 20  efined function 
17d0: 6f 72 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  or returned to t
17e0: 68 65 20 75 73 65 72 20 61 73 20 74 68 65 20 72  he user as the r
17f0: 65 73 75 6c 74 20 6f 66 20 61 20 71 75 65 72 79  esult of a query
1800: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
1810: 65 20 73 65 74 73 20 74 68 65 20 70 4d 65 6d 2d  e sets the pMem-
1820: 3e 74 79 70 65 20 76 61 72 69 61 62 6c 65 20 75  >type variable u
1830: 73 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74  sed by the sqlit
1840: 65 33 5f 76 61 6c 75 65 5f 2a 28 29 20 0a 2a 2a  e3_value_*() .**
1850: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a 76 6f   routines..*/.vo
1860: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  id sqlite3VdbeMe
1870: 6d 53 74 6f 72 65 54 79 70 65 28 4d 65 6d 20 2a  mStoreType(Mem *
1880: 70 4d 65 6d 29 7b 0a 20 20 69 6e 74 20 66 6c 61  pMem){.  int fla
1890: 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  gs = pMem->flags
18a0: 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
18b0: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
18c0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
18d0: 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20  ITE_NULL;.  }.  
18e0: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
18f0: 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20   MEM_Int ){.    
1900: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
1910: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 7d  ITE_INTEGER;.  }
1920: 0a 20 20 65 6c 73 65 20 69 66 28 20 66 6c 61 67  .  else if( flag
1930: 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  s & MEM_Real ){.
1940: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
1950: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3b 0a 20   SQLITE_FLOAT;. 
1960: 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 66 6c   }.  else if( fl
1970: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ags & MEM_Str ){
1980: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
1990: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
19a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4d 65 6d   }else{.    pMem
19b0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
19c0: 42 4c 4f 42 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  BLOB;.  }.}../*.
19d0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 56 64 62 65  ** Allocate Vdbe
19e0: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 43  Cursor number iC
19f0: 75 72 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  ur.  Return a po
1a00: 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 52 65  inter to it.  Re
1a10: 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  turn NULL.** if 
1a20: 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65  we run out of me
1a30: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
1a40: 56 64 62 65 43 75 72 73 6f 72 20 2a 61 6c 6c 6f  VdbeCursor *allo
1a50: 63 61 74 65 43 75 72 73 6f 72 28 0a 20 20 56 64  cateCursor(.  Vd
1a60: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
1a70: 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
1a80: 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20  al machine */.  
1a90: 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
1aa0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1ab0: 66 20 74 68 65 20 6e 65 77 20 56 64 62 65 43 75  f the new VdbeCu
1ac0: 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  rsor */.  int nF
1ad0: 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20  ield,           
1ae0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65  /* Number of fie
1af0: 6c 64 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  lds in the table
1b00: 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   or index */.  i
1b10: 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20  nt iDb,         
1b20: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 64 61 74       /* When dat
1b30: 61 62 61 73 65 20 74 68 65 20 63 75 72 73 6f 72  abase the cursor
1b40: 20 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 6f 72 20   belongs to, or 
1b50: 2d 31 20 2a 2f 0a 20 20 69 6e 74 20 69 73 42 74  -1 */.  int isBt
1b60: 72 65 65 43 75 72 73 6f 72 20 20 20 20 20 2f 2a  reeCursor     /*
1b70: 20 54 72 75 65 20 66 6f 72 20 42 2d 54 72 65 65   True for B-Tree
1b80: 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 70 73 65  .  False for pse
1b90: 75 64 6f 2d 74 61 62 6c 65 20 6f 72 20 76 74 61  udo-table or vta
1ba0: 62 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 46 69 6e  b */.){.  /* Fin
1bb0: 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  d the memory cel
1bc0: 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  l that will be u
1bd0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
1be0: 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 0a   blob of memory.
1bf0: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f    ** required fo
1c00: 72 20 74 68 69 73 20 56 64 62 65 43 75 72 73 6f  r this VdbeCurso
1c10: 72 20 73 74 72 75 63 74 75 72 65 2e 20 49 74 20  r structure. It 
1c20: 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  is convenient to
1c30: 20 75 73 65 20 61 20 0a 20 20 2a 2a 20 76 64 62   use a .  ** vdb
1c40: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  e memory cell to
1c50: 20 6d 61 6e 61 67 65 20 74 68 65 20 6d 65 6d 6f   manage the memo
1c60: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 65  ry allocation re
1c70: 71 75 69 72 65 64 20 66 6f 72 20 61 0a 20 20 2a  quired for a.  *
1c80: 2a 20 56 64 62 65 43 75 72 73 6f 72 20 73 74 72  * VdbeCursor str
1c90: 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 66  ucture for the f
1ca0: 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73  ollowing reasons
1cb0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  :.  **.  **   * 
1cc0: 53 6f 6d 65 74 69 6d 65 73 20 63 75 72 73 6f 72  Sometimes cursor
1cd0: 20 6e 75 6d 62 65 72 73 20 61 72 65 20 75 73 65   numbers are use
1ce0: 64 20 66 6f 72 20 61 20 63 6f 75 70 6c 65 20 6f  d for a couple o
1cf0: 66 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a  f different.  **
1d00: 20 20 20 20 20 70 75 72 70 6f 73 65 73 20 69 6e       purposes in
1d10: 20 61 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e   a vdbe program.
1d20: 20 54 68 65 20 64 69 66 66 65 72 65 6e 74 20 75   The different u
1d30: 73 65 73 20 6d 69 67 68 74 20 72 65 71 75 69 72  ses might requir
1d40: 65 0a 20 20 2a 2a 20 20 20 20 20 64 69 66 66 65  e.  **     diffe
1d50: 72 65 6e 74 20 73 69 7a 65 64 20 61 6c 6c 6f 63  rent sized alloc
1d60: 61 74 69 6f 6e 73 2e 20 4d 65 6d 6f 72 79 20 63  ations. Memory c
1d70: 65 6c 6c 73 20 70 72 6f 76 69 64 65 20 67 72 6f  ells provide gro
1d80: 77 61 62 6c 65 0a 20 20 2a 2a 20 20 20 20 20 61  wable.  **     a
1d90: 6c 6c 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2a  llocations..  **
1da0: 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 75  .  **   * When u
1db0: 73 69 6e 67 20 45 4e 41 42 4c 45 5f 4d 45 4d 4f  sing ENABLE_MEMO
1dc0: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 2c 20 6d  RY_MANAGEMENT, m
1dd0: 65 6d 6f 72 79 20 63 65 6c 6c 20 62 75 66 66 65  emory cell buffe
1de0: 72 73 20 63 61 6e 0a 20 20 2a 2a 20 20 20 20 20  rs can.  **     
1df0: 62 65 20 66 72 65 65 64 20 6c 61 7a 69 6c 79 20  be freed lazily 
1e00: 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 5f  via the sqlite3_
1e10: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29  release_memory()
1e20: 20 41 50 49 2e 20 54 68 69 73 0a 20 20 2a 2a 20   API. This.  ** 
1e30: 20 20 20 20 6d 69 6e 69 6d 69 7a 65 73 20 74 68      minimizes th
1e40: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 6c 6c  e number of mall
1e50: 6f 63 20 63 61 6c 6c 73 20 6d 61 64 65 20 62 79  oc calls made by
1e60: 20 74 68 65 20 73 79 73 74 65 6d 2e 0a 20 20 2a   the system..  *
1e70: 2a 0a 20 20 2a 2a 20 4d 65 6d 6f 72 79 20 63 65  *.  ** Memory ce
1e80: 6c 6c 73 20 66 6f 72 20 63 75 72 73 6f 72 73 20  lls for cursors 
1e90: 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74  are allocated at
1ea0: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
1eb0: 61 64 64 72 65 73 73 0a 20 20 2a 2a 20 73 70 61  address.  ** spa
1ec0: 63 65 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20  ce. Memory cell 
1ed0: 28 70 2d 3e 6e 4d 65 6d 29 20 63 6f 72 72 65 73  (p->nMem) corres
1ee0: 70 6f 6e 64 73 20 74 6f 20 63 75 72 73 6f 72 20  ponds to cursor 
1ef0: 30 2e 20 53 70 61 63 65 20 66 6f 72 0a 20 20 2a  0. Space for.  *
1f00: 2a 20 63 75 72 73 6f 72 20 31 20 69 73 20 6d 61  * cursor 1 is ma
1f10: 6e 61 67 65 64 20 62 79 20 6d 65 6d 6f 72 79 20  naged by memory 
1f20: 63 65 6c 6c 20 28 70 2d 3e 6e 4d 65 6d 2d 31 29  cell (p->nMem-1)
1f30: 2c 20 65 74 63 2e 0a 20 20 2a 2f 0a 20 20 4d 65  , etc..  */.  Me
1f40: 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d  m *pMem = &p->aM
1f50: 65 6d 5b 70 2d 3e 6e 4d 65 6d 2d 69 43 75 72 5d  em[p->nMem-iCur]
1f60: 3b 0a 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ;..  int nByte;.
1f70: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
1f80: 78 20 3d 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  x = 0;.  nByte =
1f90: 20 0a 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73   .      ROUND8(s
1fa0: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
1fb0: 29 29 20 2b 20 0a 20 20 20 20 20 20 28 69 73 42  )) + .      (isB
1fc0: 74 72 65 65 43 75 72 73 6f 72 3f 73 71 6c 69 74  treeCursor?sqlit
1fd0: 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
1fe0: 65 28 29 3a 30 29 20 2b 20 0a 20 20 20 20 20 20  e():0) + .      
1ff0: 32 2a 6e 46 69 65 6c 64 2a 73 69 7a 65 6f 66 28  2*nField*sizeof(
2000: 75 33 32 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  u32);..  assert(
2010: 20 69 43 75 72 3c 70 2d 3e 6e 43 75 72 73 6f 72   iCur<p->nCursor
2020: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43   );.  if( p->apC
2030: 73 72 5b 69 43 75 72 5d 20 29 7b 0a 20 20 20 20  sr[iCur] ){.    
2040: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
2050: 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43 73  ursor(p, p->apCs
2060: 72 5b 69 43 75 72 5d 29 3b 0a 20 20 20 20 70 2d  r[iCur]);.    p-
2070: 3e 61 70 43 73 72 5b 69 43 75 72 5d 20 3d 20 30  >apCsr[iCur] = 0
2080: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49  ;.  }.  if( SQLI
2090: 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64  TE_OK==sqlite3Vd
20a0: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20  beMemGrow(pMem, 
20b0: 6e 42 79 74 65 2c 20 30 29 20 29 7b 0a 20 20 20  nByte, 0) ){.   
20c0: 20 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20   p->apCsr[iCur] 
20d0: 3d 20 70 43 78 20 3d 20 28 56 64 62 65 43 75 72  = pCx = (VdbeCur
20e0: 73 6f 72 2a 29 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  sor*)pMem->z;.  
20f0: 20 20 6d 65 6d 73 65 74 28 70 43 78 2c 20 30 2c    memset(pCx, 0,
2100: 20 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73   sizeof(VdbeCurs
2110: 6f 72 29 29 3b 0a 20 20 20 20 70 43 78 2d 3e 69  or));.    pCx->i
2120: 44 62 20 3d 20 69 44 62 3b 0a 20 20 20 20 70 43  Db = iDb;.    pC
2130: 78 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65  x->nField = nFie
2140: 6c 64 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 65  ld;.    if( nFie
2150: 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 43 78 2d  ld ){.      pCx-
2160: 3e 61 54 79 70 65 20 3d 20 28 75 33 32 20 2a 29  >aType = (u32 *)
2170: 26 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38 28  &pMem->z[ROUND8(
2180: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
2190: 72 29 29 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  r))];.    }.    
21a0: 69 66 28 20 69 73 42 74 72 65 65 43 75 72 73 6f  if( isBtreeCurso
21b0: 72 20 29 7b 0a 20 20 20 20 20 20 70 43 78 2d 3e  r ){.      pCx->
21c0: 70 43 75 72 73 6f 72 20 3d 20 28 42 74 43 75 72  pCursor = (BtCur
21d0: 73 6f 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20  sor*).          
21e0: 26 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38 28  &pMem->z[ROUND8(
21f0: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
2200: 72 29 29 2b 32 2a 6e 46 69 65 6c 64 2a 73 69 7a  r))+2*nField*siz
2210: 65 6f 66 28 75 33 32 29 5d 3b 0a 20 20 20 20 20  eof(u32)];.     
2220: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
2230: 73 6f 72 5a 65 72 6f 28 70 43 78 2d 3e 70 43 75  sorZero(pCx->pCu
2240: 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rsor);.    }.  }
2250: 0a 20 20 72 65 74 75 72 6e 20 70 43 78 3b 0a 7d  .  return pCx;.}
2260: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 63  ../*.** Try to c
2270: 6f 6e 76 65 72 74 20 61 20 76 61 6c 75 65 20 69  onvert a value i
2280: 6e 74 6f 20 61 20 6e 75 6d 65 72 69 63 20 72 65  nto a numeric re
2290: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 66 20  presentation if 
22a0: 77 65 20 63 61 6e 0a 2a 2a 20 64 6f 20 73 6f 20  we can.** do so 
22b0: 77 69 74 68 6f 75 74 20 6c 6f 73 73 20 6f 66 20  without loss of 
22c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 6e  information.  In
22d0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
22e0: 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 6c   the string.** l
22f0: 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 6e 75 6d 62  ooks like a numb
2300: 65 72 2c 20 63 6f 6e 76 65 72 74 20 69 74 20 69  er, convert it i
2310: 6e 74 6f 20 61 20 6e 75 6d 62 65 72 2e 20 20 49  nto a number.  I
2320: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  f it does not.**
2330: 20 6c 6f 6f 6b 20 6c 69 6b 65 20 61 20 6e 75 6d   look like a num
2340: 62 65 72 2c 20 6c 65 61 76 65 20 69 74 20 61 6c  ber, leave it al
2350: 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  one..*/.static v
2360: 6f 69 64 20 61 70 70 6c 79 4e 75 6d 65 72 69 63  oid applyNumeric
2370: 41 66 66 69 6e 69 74 79 28 4d 65 6d 20 2a 70 52  Affinity(Mem *pR
2380: 65 63 29 7b 0a 20 20 69 66 28 20 28 70 52 65 63  ec){.  if( (pRec
2390: 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52  ->flags & (MEM_R
23a0: 65 61 6c 7c 4d 45 4d 5f 49 6e 74 29 29 3d 3d 30  eal|MEM_Int))==0
23b0: 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72   ){.    double r
23c0: 56 61 6c 75 65 3b 0a 20 20 20 20 69 36 34 20 69  Value;.    i64 i
23d0: 56 61 6c 75 65 3b 0a 20 20 20 20 75 38 20 65 6e  Value;.    u8 en
23e0: 63 20 3d 20 70 52 65 63 2d 3e 65 6e 63 3b 0a 20  c = pRec->enc;. 
23f0: 20 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66 6c     if( (pRec->fl
2400: 61 67 73 26 4d 45 4d 5f 53 74 72 29 3d 3d 30 20  ags&MEM_Str)==0 
2410: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
2420: 28 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 52  ( sqlite3AtoF(pR
2430: 65 63 2d 3e 7a 2c 20 26 72 56 61 6c 75 65 2c 20  ec->z, &rValue, 
2440: 70 52 65 63 2d 3e 6e 2c 20 65 6e 63 29 3d 3d 30  pRec->n, enc)==0
2450: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
2460: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f  f( 0==sqlite3Ato
2470: 69 36 34 28 70 52 65 63 2d 3e 7a 2c 20 26 69 56  i64(pRec->z, &iV
2480: 61 6c 75 65 2c 20 70 52 65 63 2d 3e 6e 2c 20 65  alue, pRec->n, e
2490: 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 70 52 65  nc) ){.      pRe
24a0: 63 2d 3e 75 2e 69 20 3d 20 69 56 61 6c 75 65 3b  c->u.i = iValue;
24b0: 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 66 6c 61  .      pRec->fla
24c0: 67 73 20 7c 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  gs |= MEM_Int;. 
24d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24e0: 70 52 65 63 2d 3e 72 20 3d 20 72 56 61 6c 75 65  pRec->r = rValue
24f0: 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 66 6c  ;.      pRec->fl
2500: 61 67 73 20 7c 3d 20 4d 45 4d 5f 52 65 61 6c 3b  ags |= MEM_Real;
2510: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
2520: 0a 2a 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 69  .** Processing i
2530: 73 20 64 65 74 65 72 6d 69 6e 65 20 62 79 20 74  s determine by t
2540: 68 65 20 61 66 66 69 6e 69 74 79 20 70 61 72 61  he affinity para
2550: 6d 65 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 53 51 4c  meter:.**.** SQL
2560: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3a  ITE_AFF_INTEGER:
2570: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  .** SQLITE_AFF_R
2580: 45 41 4c 3a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  EAL:.** SQLITE_A
2590: 46 46 5f 4e 55 4d 45 52 49 43 3a 0a 2a 2a 20 20  FF_NUMERIC:.**  
25a0: 20 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72 74    Try to convert
25b0: 20 70 52 65 63 20 74 6f 20 61 6e 20 69 6e 74 65   pRec to an inte
25c0: 67 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69  ger representati
25d0: 6f 6e 20 6f 72 20 61 20 0a 2a 2a 20 20 20 20 66  on or a .**    f
25e0: 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 72 65  loating-point re
25f0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 66 20  presentation if 
2600: 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65  an integer repre
2610: 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20  sentation.**    
2620: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
2630: 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
2640: 69 6e 74 65 67 65 72 20 72 65 70 72 65 73 65 6e  integer represen
2650: 74 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 20 20 20  tation is.**    
2660: 61 6c 77 61 79 73 20 70 72 65 66 65 72 72 65 64  always preferred
2670: 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 61 66  , even if the af
2680: 66 69 6e 69 74 79 20 69 73 20 52 45 41 4c 2c 20  finity is REAL, 
2690: 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 61 6e  because.**    an
26a0: 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73 65   integer represe
26b0: 6e 74 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20  ntation is more 
26c0: 73 70 61 63 65 20 65 66 66 69 63 69 65 6e 74 20  space efficient 
26d0: 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 53  on disk..**.** S
26e0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a  QLITE_AFF_TEXT:.
26f0: 2a 2a 20 20 20 20 43 6f 6e 76 65 72 74 20 70 52  **    Convert pR
2700: 65 63 20 74 6f 20 61 20 74 65 78 74 20 72 65 70  ec to a text rep
2710: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a  resentation..**.
2720: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
2730: 4e 45 3a 0a 2a 2a 20 20 20 20 4e 6f 2d 6f 70 2e  NE:.**    No-op.
2740: 20 20 70 52 65 63 20 69 73 20 75 6e 63 68 61 6e    pRec is unchan
2750: 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ged..*/.static v
2760: 6f 69 64 20 61 70 70 6c 79 41 66 66 69 6e 69 74  oid applyAffinit
2770: 79 28 0a 20 20 4d 65 6d 20 2a 70 52 65 63 2c 20  y(.  Mem *pRec, 
2780: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2790: 76 61 6c 75 65 20 74 6f 20 61 70 70 6c 79 20 61  value to apply a
27a0: 66 66 69 6e 69 74 79 20 74 6f 20 2a 2f 0a 20 20  ffinity to */.  
27b0: 63 68 61 72 20 61 66 66 69 6e 69 74 79 2c 20 20  char affinity,  
27c0: 20 20 20 20 2f 2a 20 54 68 65 20 61 66 66 69 6e      /* The affin
27d0: 69 74 79 20 74 6f 20 62 65 20 61 70 70 6c 69 65  ity to be applie
27e0: 64 20 2a 2f 0a 20 20 75 38 20 65 6e 63 20 20 20  d */.  u8 enc   
27f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
2800: 65 20 74 68 69 73 20 74 65 78 74 20 65 6e 63 6f  e this text enco
2810: 64 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ding */.){.  if(
2820: 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54   affinity==SQLIT
2830: 45 5f 41 46 46 5f 54 45 58 54 20 29 7b 0a 20 20  E_AFF_TEXT ){.  
2840: 20 20 2f 2a 20 4f 6e 6c 79 20 61 74 74 65 6d 70    /* Only attemp
2850: 74 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e  t the conversion
2860: 20 74 6f 20 54 45 58 54 20 69 66 20 74 68 65 72   to TEXT if ther
2870: 65 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  e is an integer 
2880: 6f 72 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 72  or real.    ** r
2890: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 28 62  epresentation (b
28a0: 6c 6f 62 20 61 6e 64 20 4e 55 4c 4c 20 64 6f 20  lob and NULL do 
28b0: 6e 6f 74 20 67 65 74 20 63 6f 6e 76 65 72 74 65  not get converte
28c0: 64 29 20 62 75 74 20 6e 6f 20 73 74 72 69 6e 67  d) but no string
28d0: 0a 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e  .    ** represen
28e0: 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  tation..    */. 
28f0: 20 20 20 69 66 28 20 30 3d 3d 28 70 52 65 63 2d     if( 0==(pRec-
2900: 3e 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 20  >flags&MEM_Str) 
2910: 26 26 20 28 70 52 65 63 2d 3e 66 6c 61 67 73 26  && (pRec->flags&
2920: 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e  (MEM_Real|MEM_In
2930: 74 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  t)) ){.      sql
2940: 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69 6e  ite3VdbeMemStrin
2950: 67 69 66 79 28 70 52 65 63 2c 20 65 6e 63 29 3b  gify(pRec, enc);
2960: 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 63 2d  .    }.    pRec-
2970: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f  >flags &= ~(MEM_
2980: 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 29 3b 0a 20  Real|MEM_Int);. 
2990: 20 7d 65 6c 73 65 20 69 66 28 20 61 66 66 69 6e   }else if( affin
29a0: 69 74 79 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity!=SQLITE_AFF_
29b0: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73 65  NONE ){.    asse
29c0: 72 74 28 20 61 66 66 69 6e 69 74 79 3d 3d 53 51  rt( affinity==SQ
29d0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
29e0: 20 7c 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53 51   || affinity==SQ
29f0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20  LITE_AFF_REAL.  
2a00: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 61 66             || af
2a10: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
2a20: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
2a30: 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66    applyNumericAf
2a40: 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a 20 20  finity(pRec);.  
2a50: 20 20 69 66 28 20 70 52 65 63 2d 3e 66 6c 61 67    if( pRec->flag
2a60: 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  s & MEM_Real ){.
2a70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a80: 65 49 6e 74 65 67 65 72 41 66 66 69 6e 69 74 79  eIntegerAffinity
2a90: 28 70 52 65 63 29 3b 0a 20 20 20 20 7d 0a 20 20  (pRec);.    }.  
2aa0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  }.}../*.** Try t
2ab0: 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20 74 79  o convert the ty
2ac0: 70 65 20 6f 66 20 61 20 66 75 6e 63 74 69 6f 6e  pe of a function
2ad0: 20 61 72 67 75 6d 65 6e 74 20 6f 72 20 61 20 72   argument or a r
2ae0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  esult column.** 
2af0: 69 6e 74 6f 20 61 20 6e 75 6d 65 72 69 63 20 72  into a numeric r
2b00: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20  epresentation.  
2b10: 55 73 65 20 65 69 74 68 65 72 20 49 4e 54 45 47  Use either INTEG
2b20: 45 52 20 6f 72 20 52 45 41 4c 20 77 68 69 63 68  ER or REAL which
2b30: 65 76 65 72 0a 2a 2a 20 69 73 20 61 70 70 72 6f  ever.** is appro
2b40: 70 72 69 61 74 65 2e 20 20 42 75 74 20 6f 6e 6c  priate.  But onl
2b50: 79 20 64 6f 20 74 68 65 20 63 6f 6e 76 65 72 73  y do the convers
2b60: 69 6f 6e 20 69 66 20 69 74 20 69 73 20 70 6f 73  ion if it is pos
2b70: 73 69 62 6c 65 20 77 69 74 68 6f 75 74 0a 2a 2a  sible without.**
2b80: 20 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72 6d 61   loss of informa
2b90: 74 69 6f 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  tion and return 
2ba0: 74 68 65 20 72 65 76 69 73 65 64 20 74 79 70 65  the revised type
2bb0: 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
2bc0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2bd0: 5f 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74  _value_numeric_t
2be0: 79 70 65 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  ype(sqlite3_valu
2bf0: 65 20 2a 70 56 61 6c 29 7b 0a 20 20 4d 65 6d 20  e *pVal){.  Mem 
2c00: 2a 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 70 56  *pMem = (Mem*)pV
2c10: 61 6c 3b 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e  al;.  if( pMem->
2c20: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58  type==SQLITE_TEX
2c30: 54 20 29 7b 0a 20 20 20 20 61 70 70 6c 79 4e 75  T ){.    applyNu
2c40: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 4d  mericAffinity(pM
2c50: 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  em);.    sqlite3
2c60: 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65  VdbeMemStoreType
2c70: 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 72 65  (pMem);.  }.  re
2c80: 74 75 72 6e 20 70 4d 65 6d 2d 3e 74 79 70 65 3b  turn pMem->type;
2c90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6f 72 74  .}../*.** Export
2ca0: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 61 70  ed version of ap
2cb0: 70 6c 79 41 66 66 69 6e 69 74 79 28 29 2e 20 54  plyAffinity(). T
2cc0: 68 69 73 20 6f 6e 65 20 77 6f 72 6b 73 20 6f 6e  his one works on
2cd0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2c   sqlite3_value*,
2ce0: 20 0a 2a 2a 20 6e 6f 74 20 74 68 65 20 69 6e 74   .** not the int
2cf0: 65 72 6e 61 6c 20 4d 65 6d 2a 20 74 79 70 65 2e  ernal Mem* type.
2d00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2d10: 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
2d20: 74 79 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ty(.  sqlite3_va
2d30: 6c 75 65 20 2a 70 56 61 6c 2c 20 0a 20 20 75 38  lue *pVal, .  u8
2d40: 20 61 66 66 69 6e 69 74 79 2c 20 0a 20 20 75 38   affinity, .  u8
2d50: 20 65 6e 63 0a 29 7b 0a 20 20 61 70 70 6c 79 41   enc.){.  applyA
2d60: 66 66 69 6e 69 74 79 28 28 4d 65 6d 20 2a 29 70  ffinity((Mem *)p
2d70: 56 61 6c 2c 20 61 66 66 69 6e 69 74 79 2c 20 65  Val, affinity, e
2d80: 6e 63 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  nc);.}..#ifdef S
2d90: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
2da0: 2a 20 57 72 69 74 65 20 61 20 6e 69 63 65 20 73  * Write a nice s
2db0: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
2dc0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 74  tion of the cont
2dd0: 65 6e 74 73 20 6f 66 20 63 65 6c 6c 20 70 4d 65  ents of cell pMe
2de0: 6d 0a 2a 2a 20 69 6e 74 6f 20 62 75 66 66 65 72  m.** into buffer
2df0: 20 7a 42 75 66 2c 20 6c 65 6e 67 74 68 20 6e 42   zBuf, length nB
2e00: 75 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  uf..*/.void sqli
2e10: 74 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79  te3VdbeMemPretty
2e20: 50 72 69 6e 74 28 4d 65 6d 20 2a 70 4d 65 6d 2c  Print(Mem *pMem,
2e30: 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
2e40: 63 68 61 72 20 2a 7a 43 73 72 20 3d 20 7a 42 75  char *zCsr = zBu
2e50: 66 3b 0a 20 20 69 6e 74 20 66 20 3d 20 70 4d 65  f;.  int f = pMe
2e60: 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20 73 74 61  m->flags;..  sta
2e70: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2e80: 63 6f 6e 73 74 20 65 6e 63 6e 61 6d 65 73 5b 5d  const encnames[]
2e90: 20 3d 20 7b 22 28 58 29 22 2c 20 22 28 38 29 22   = {"(X)", "(8)"
2ea0: 2c 20 22 28 31 36 4c 45 29 22 2c 20 22 28 31 36  , "(16LE)", "(16
2eb0: 42 45 29 22 7d 3b 0a 0a 20 20 69 66 28 20 66 26  BE)"};..  if( f&
2ec0: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
2ed0: 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20  int i;.    char 
2ee0: 63 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d  c;.    if( f & M
2ef0: 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20  EM_Dyn ){.      
2f00: 63 20 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20 61  c = 'z';.      a
2f10: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
2f20: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68 65  _Static|MEM_Ephe
2f30: 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65  m))==0 );.    }e
2f40: 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f  lse if( f & MEM_
2f50: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
2f60: 63 20 3d 20 27 74 27 3b 0a 20 20 20 20 20 20 61  c = 't';.      a
2f70: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
2f80: 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29 29  _Dyn|MEM_Ephem))
2f90: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ==0 );.    }else
2fa0: 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 45 70 68   if( f & MEM_Eph
2fb0: 65 6d 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20  em ){.      c = 
2fc0: 27 65 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72  'e';.      asser
2fd0: 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61  t( (f & (MEM_Sta
2fe0: 74 69 63 7c 4d 45 4d 5f 44 79 6e 29 29 3d 3d 30  tic|MEM_Dyn))==0
2ff0: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
3000: 20 20 20 20 20 63 20 3d 20 27 73 27 3b 0a 20 20       c = 's';.  
3010: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
3020: 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a  _snprintf(100, z
3030: 43 73 72 2c 20 22 25 63 22 2c 20 63 29 3b 0a 20  Csr, "%c", c);. 
3040: 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74     zCsr += sqlit
3050: 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29  e3Strlen30(zCsr)
3060: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
3070: 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72  printf(100, zCsr
3080: 2c 20 22 25 64 5b 22 2c 20 70 4d 65 6d 2d 3e 6e  , "%d[", pMem->n
3090: 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 73  );.    zCsr += s
30a0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
30b0: 43 73 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Csr);.    for(i=
30c0: 30 3b 20 69 3c 31 36 20 26 26 20 69 3c 70 4d 65  0; i<16 && i<pMe
30d0: 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  m->n; i++){.    
30e0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
30f0: 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 20 22 25  tf(100, zCsr, "%
3100: 30 32 58 22 2c 20 28 28 69 6e 74 29 70 4d 65 6d  02X", ((int)pMem
3110: 2d 3e 7a 5b 69 5d 20 26 20 30 78 46 46 29 29 3b  ->z[i] & 0xFF));
3120: 0a 20 20 20 20 20 20 7a 43 73 72 20 2b 3d 20 73  .      zCsr += s
3130: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
3140: 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Csr);.    }.    
3150: 66 6f 72 28 69 3d 30 3b 20 69 3c 31 36 20 26 26  for(i=0; i<16 &&
3160: 20 69 3c 70 4d 65 6d 2d 3e 6e 3b 20 69 2b 2b 29   i<pMem->n; i++)
3170: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 20 3d  {.      char z =
3180: 20 70 4d 65 6d 2d 3e 7a 5b 69 5d 3b 0a 20 20 20   pMem->z[i];.   
3190: 20 20 20 69 66 28 20 7a 3c 33 32 20 7c 7c 20 7a     if( z<32 || z
31a0: 3e 31 32 36 20 29 20 2a 7a 43 73 72 2b 2b 20 3d  >126 ) *zCsr++ =
31b0: 20 27 2e 27 3b 0a 20 20 20 20 20 20 65 6c 73 65   '.';.      else
31c0: 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a 3b 0a 20 20   *zCsr++ = z;.  
31d0: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
31e0: 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a  _snprintf(100, z
31f0: 43 73 72 2c 20 22 5d 25 73 22 2c 20 65 6e 63 6e  Csr, "]%s", encn
3200: 61 6d 65 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d 29  ames[pMem->enc])
3210: 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71  ;.    zCsr += sq
3220: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
3230: 73 72 29 3b 0a 20 20 20 20 69 66 28 20 66 20 26  sr);.    if( f &
3240: 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
3250: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
3260: 6e 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 22 2b  ntf(100, zCsr,"+
3270: 25 64 7a 22 2c 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  %dz",pMem->u.nZe
3280: 72 6f 29 3b 0a 20 20 20 20 20 20 7a 43 73 72 20  ro);.      zCsr 
3290: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
32a0: 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 7d 0a  30(zCsr);.    }.
32b0: 20 20 20 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27      *zCsr = '\0'
32c0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20  ;.  }else if( f 
32d0: 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  & MEM_Str ){.   
32e0: 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20 20 20 7a   int j, k;.    z
32f0: 42 75 66 5b 30 5d 20 3d 20 27 20 27 3b 0a 20 20  Buf[0] = ' ';.  
3300: 20 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 44 79    if( f & MEM_Dy
3310: 6e 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b  n ){.      zBuf[
3320: 31 5d 20 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20  1] = 'z';.      
3330: 61 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45  assert( (f & (ME
3340: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68  M_Static|MEM_Eph
3350: 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  em))==0 );.    }
3360: 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d  else if( f & MEM
3370: 5f 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  _Static ){.     
3380: 20 7a 42 75 66 5b 31 5d 20 3d 20 27 74 27 3b 0a   zBuf[1] = 't';.
3390: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 66        assert( (f
33a0: 20 26 20 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f   & (MEM_Dyn|MEM_
33b0: 45 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20  Ephem))==0 );.  
33c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26 20    }else if( f & 
33d0: 4d 45 4d 5f 45 70 68 65 6d 20 29 7b 0a 20 20 20  MEM_Ephem ){.   
33e0: 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 65 27     zBuf[1] = 'e'
33f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
3400: 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69 63  (f & (MEM_Static
3410: 7c 4d 45 4d 5f 44 79 6e 29 29 3d 3d 30 20 29 3b  |MEM_Dyn))==0 );
3420: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3430: 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 73 27 3b    zBuf[1] = 's';
3440: 0a 20 20 20 20 7d 0a 20 20 20 20 6b 20 3d 20 32  .    }.    k = 2
3450: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
3460: 70 72 69 6e 74 66 28 31 30 30 2c 20 26 7a 42 75  printf(100, &zBu
3470: 66 5b 6b 5d 2c 20 22 25 64 22 2c 20 70 4d 65 6d  f[k], "%d", pMem
3480: 2d 3e 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  ->n);.    k += s
3490: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26  qlite3Strlen30(&
34a0: 7a 42 75 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a 42  zBuf[k]);.    zB
34b0: 75 66 5b 6b 2b 2b 5d 20 3d 20 27 5b 27 3b 0a 20  uf[k++] = '[';. 
34c0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31 35     for(j=0; j<15
34d0: 20 26 26 20 6a 3c 70 4d 65 6d 2d 3e 6e 3b 20 6a   && j<pMem->n; j
34e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 63 20  ++){.      u8 c 
34f0: 3d 20 70 4d 65 6d 2d 3e 7a 5b 6a 5d 3b 0a 20 20  = pMem->z[j];.  
3500: 20 20 20 20 69 66 28 20 63 3e 3d 30 78 32 30 20      if( c>=0x20 
3510: 26 26 20 63 3c 30 78 37 66 20 29 7b 0a 20 20 20  && c<0x7f ){.   
3520: 20 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d       zBuf[k++] =
3530: 20 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   c;.      }else{
3540: 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6b 2b  .        zBuf[k+
3550: 2b 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20  +] = '.';.      
3560: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66  }.    }.    zBuf
3570: 5b 6b 2b 2b 5d 20 3d 20 27 5d 27 3b 0a 20 20 20  [k++] = ']';.   
3580: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
3590: 66 28 31 30 30 2c 26 7a 42 75 66 5b 6b 5d 2c 20  f(100,&zBuf[k], 
35a0: 65 6e 63 6e 61 6d 65 73 5b 70 4d 65 6d 2d 3e 65  encnames[pMem->e
35b0: 6e 63 5d 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  nc]);.    k += s
35c0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26  qlite3Strlen30(&
35d0: 7a 42 75 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a 42  zBuf[k]);.    zB
35e0: 75 66 5b 6b 2b 2b 5d 20 3d 20 30 3b 0a 20 20 7d  uf[k++] = 0;.  }
35f0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
3600: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
3610: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 76  *.** Print the v
3620: 61 6c 75 65 20 6f 66 20 61 20 72 65 67 69 73 74  alue of a regist
3630: 65 72 20 66 6f 72 20 74 72 61 63 69 6e 67 20 70  er for tracing p
3640: 75 72 70 6f 73 65 73 3a 0a 2a 2f 0a 73 74 61 74  urposes:.*/.stat
3650: 69 63 20 76 6f 69 64 20 6d 65 6d 54 72 61 63 65  ic void memTrace
3660: 50 72 69 6e 74 28 46 49 4c 45 20 2a 6f 75 74 2c  Print(FILE *out,
3670: 20 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20   Mem *p){.  if( 
3680: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  p->flags & MEM_N
3690: 75 6c 6c 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ull ){.    fprin
36a0: 74 66 28 6f 75 74 2c 20 22 20 4e 55 4c 4c 22 29  tf(out, " NULL")
36b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
36c0: 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49  ->flags & (MEM_I
36d0: 6e 74 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 28 4d  nt|MEM_Str))==(M
36e0: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 53 74 72 29 20  EM_Int|MEM_Str) 
36f0: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
3700: 75 74 2c 20 22 20 73 69 3a 25 6c 6c 64 22 2c 20  ut, " si:%lld", 
3710: 70 2d 3e 75 2e 69 29 3b 0a 20 20 7d 65 6c 73 65  p->u.i);.  }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 49 6e 74 20 29 7b 0a 20 20 20 20 66  MEM_Int ){.    f
3740: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 69 3a  printf(out, " i:
3750: 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e 69 29 3b 0a  %lld", p->u.i);.
3760: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3770: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
3780: 4e 54 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  NT.  }else if( p
3790: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
37a0: 61 6c 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  al ){.    fprint
37b0: 66 28 6f 75 74 2c 20 22 20 72 3a 25 67 22 2c 20  f(out, " r:%g", 
37c0: 70 2d 3e 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20  p->r);.#endif.  
37d0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61  }else if( p->fla
37e0: 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20  gs & MEM_RowSet 
37f0: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
3800: 75 74 2c 20 22 20 28 72 6f 77 73 65 74 29 22 29  ut, " (rowset)")
3810: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
3820: 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20  har zBuf[200];. 
3830: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
3840: 6d 50 72 65 74 74 79 50 72 69 6e 74 28 70 2c 20  mPrettyPrint(p, 
3850: 7a 42 75 66 29 3b 0a 20 20 20 20 66 70 72 69 6e  zBuf);.    fprin
3860: 74 66 28 6f 75 74 2c 20 22 20 22 29 3b 0a 20 20  tf(out, " ");.  
3870: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
3880: 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a  %s", zBuf);.  }.
3890: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  }.static void re
38a0: 67 69 73 74 65 72 54 72 61 63 65 28 46 49 4c 45  gisterTrace(FILE
38b0: 20 2a 6f 75 74 2c 20 69 6e 74 20 69 52 65 67 2c   *out, int iReg,
38c0: 20 4d 65 6d 20 2a 70 29 7b 0a 20 20 66 70 72 69   Mem *p){.  fpri
38d0: 6e 74 66 28 6f 75 74 2c 20 22 52 45 47 5b 25 64  ntf(out, "REG[%d
38e0: 5d 20 3d 20 22 2c 20 69 52 65 67 29 3b 0a 20 20  ] = ", iReg);.  
38f0: 6d 65 6d 54 72 61 63 65 50 72 69 6e 74 28 6f 75  memTracePrint(ou
3900: 74 2c 20 70 29 3b 0a 20 20 66 70 72 69 6e 74 66  t, p);.  fprintf
3910: 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 7d 0a 23  (out, "\n");.}.#
3920: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
3930: 4c 49 54 45 5f 44 45 42 55 47 0a 23 20 20 64 65  LITE_DEBUG.#  de
3940: 66 69 6e 65 20 52 45 47 49 53 54 45 52 5f 54 52  fine REGISTER_TR
3950: 41 43 45 28 52 2c 4d 29 20 69 66 28 70 2d 3e 74  ACE(R,M) if(p->t
3960: 72 61 63 65 29 72 65 67 69 73 74 65 72 54 72 61  race)registerTra
3970: 63 65 28 70 2d 3e 74 72 61 63 65 2c 52 2c 4d 29  ce(p->trace,R,M)
3980: 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
3990: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
39a0: 52 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  R,M).#endif...#i
39b0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
39c0: 45 0a 0a 2f 2a 20 0a 2a 2a 20 68 77 74 69 6d 65  E../* .** hwtime
39d0: 2e 68 20 63 6f 6e 74 61 69 6e 73 20 69 6e 6c 69  .h contains inli
39e0: 6e 65 20 61 73 73 65 6d 62 6c 65 72 20 63 6f 64  ne assembler cod
39f0: 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69  e for implementi
3a00: 6e 67 20 0a 2a 2a 20 68 69 67 68 2d 70 65 72 66  ng .** high-perf
3a10: 6f 72 6d 61 6e 63 65 20 74 69 6d 69 6e 67 20 72  ormance timing r
3a20: 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a 23 69 6e 63  outines..*/.#inc
3a30: 6c 75 64 65 20 22 68 77 74 69 6d 65 2e 68 22 0a  lude "hwtime.h".
3a40: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
3a50: 68 65 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54  he CHECK_FOR_INT
3a60: 45 52 52 55 50 54 20 6d 61 63 72 6f 20 64 65 66  ERRUPT macro def
3a70: 69 6e 65 64 20 68 65 72 65 20 6c 6f 6f 6b 73 20  ined here looks 
3a80: 74 6f 20 73 65 65 20 69 66 20 74 68 65 0a 2a 2a  to see if the.**
3a90: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
3aa0: 70 74 28 29 20 72 6f 75 74 69 6e 65 20 68 61 73  pt() routine has
3ab0: 20 62 65 65 6e 20 63 61 6c 6c 65 64 2e 20 20 49   been called.  I
3ac0: 66 20 69 74 20 68 61 73 20 62 65 65 6e 2c 20 74  f it has been, t
3ad0: 68 65 6e 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e  hen.** processin
3ae0: 67 20 6f 66 20 74 68 65 20 56 44 42 45 20 70 72  g of the VDBE pr
3af0: 6f 67 72 61 6d 20 69 73 20 69 6e 74 65 72 72 75  ogram is interru
3b00: 70 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  pted..**.** This
3b10: 20 6d 61 63 72 6f 20 61 64 64 65 64 20 74 6f 20   macro added to 
3b20: 65 76 65 72 79 20 69 6e 73 74 72 75 63 74 69 6f  every instructio
3b30: 6e 20 74 68 61 74 20 64 6f 65 73 20 61 20 6a 75  n that does a ju
3b40: 6d 70 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a  mp in order to.*
3b50: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 6c 6f  * implement a lo
3b60: 6f 70 2e 20 20 54 68 69 73 20 74 65 73 74 20 75  op.  This test u
3b70: 73 65 64 20 74 6f 20 62 65 20 6f 6e 20 65 76 65  sed to be on eve
3b80: 72 79 20 73 69 6e 67 6c 65 20 69 6e 73 74 72 75  ry single instru
3b90: 63 74 69 6f 6e 2c 0a 2a 2a 20 62 75 74 20 74 68  ction,.** but th
3ba0: 61 74 20 6d 65 61 6e 74 20 77 65 20 6d 6f 72 65  at meant we more
3bb0: 20 74 65 73 74 69 6e 67 20 74 68 61 74 20 77 65   testing that we
3bc0: 20 6e 65 65 64 65 64 2e 20 20 42 79 20 6f 6e 6c   needed.  By onl
3bd0: 79 20 74 65 73 74 69 6e 67 20 74 68 65 0a 2a 2a  y testing the.**
3be0: 20 66 6c 61 67 20 6f 6e 20 6a 75 6d 70 20 69 6e   flag on jump in
3bf0: 73 74 72 75 63 74 69 6f 6e 73 2c 20 77 65 20 67  structions, we g
3c00: 65 74 20 61 20 28 73 6d 61 6c 6c 29 20 73 70 65  et a (small) spe
3c10: 65 64 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 0a  ed improvement..
3c20: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  */.#define CHECK
3c30: 5f 46 4f 52 5f 49 4e 54 45 52 52 55 50 54 20 5c  _FOR_INTERRUPT \
3c40: 0a 20 20 20 69 66 28 20 64 62 2d 3e 75 31 2e 69  .   if( db->u1.i
3c50: 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 20 67  sInterrupted ) g
3c60: 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
3c70: 5f 69 6e 74 65 72 72 75 70 74 3b 0a 0a 0a 23 69  _interrupt;...#i
3c80: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
3c90: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3ca0: 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
3cb0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20 61  from within an a
3cc0: 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
3cd0: 6f 6e 2e 20 49 74 0a 2a 2a 20 63 68 65 63 6b 73  on. It.** checks
3ce0: 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
3cf0: 33 2e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 76  3.nTransaction v
3d00: 61 72 69 61 62 6c 65 20 69 73 20 63 6f 72 72 65  ariable is corre
3d10: 63 74 6c 79 20 73 65 74 20 74 6f 0a 2a 2a 20 74  ctly set to.** t
3d20: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e  he number of non
3d30: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76  -transaction sav
3d40: 65 70 6f 69 6e 74 73 20 63 75 72 72 65 6e 74 6c  epoints currentl
3d50: 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  y in the .** lin
3d60: 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
3d70: 67 20 61 74 20 73 71 6c 69 74 65 33 2e 70 53 61  g at sqlite3.pSa
3d80: 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20  vepoint..** .** 
3d90: 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  Usage:.**.**    
3da0: 20 61 73 73 65 72 74 28 20 63 68 65 63 6b 53 61   assert( checkSa
3db0: 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28 64 62 29  vepointCount(db)
3dc0: 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   );.*/.static in
3dd0: 74 20 63 68 65 63 6b 53 61 76 65 70 6f 69 6e 74  t checkSavepoint
3de0: 43 6f 75 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  Count(sqlite3 *d
3df0: 62 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  b){.  int n = 0;
3e00: 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b  .  Savepoint *p;
3e10: 0a 20 20 66 6f 72 28 70 3d 64 62 2d 3e 70 53 61  .  for(p=db->pSa
3e20: 76 65 70 6f 69 6e 74 3b 20 70 3b 20 70 3d 70 2d  vepoint; p; p=p-
3e30: 3e 70 4e 65 78 74 29 20 6e 2b 2b 3b 0a 20 20 61  >pNext) n++;.  a
3e40: 73 73 65 72 74 28 20 6e 3d 3d 28 64 62 2d 3e 6e  ssert( n==(db->n
3e50: 53 61 76 65 70 6f 69 6e 74 20 2b 20 64 62 2d 3e  Savepoint + db->
3e60: 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76  isTransactionSav
3e70: 65 70 6f 69 6e 74 29 20 29 3b 0a 20 20 72 65 74  epoint) );.  ret
3e80: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
3e90: 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20  ./*.** Transfer 
3ea0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
3eb0: 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74  xt from an sqlit
3ec0: 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20  e3_vtab.zErrMsg 
3ed0: 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20  (text stored.** 
3ee0: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
3ef0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
3f00: 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56  malloc) into a V
3f10: 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78  dbe.zErrMsg (tex
3f20: 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d  t stored.** in m
3f30: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
3f40: 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  rom sqlite3DbMal
3f50: 6c 6f 63 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  loc)..*/.static 
3f60: 76 6f 69 64 20 69 6d 70 6f 72 74 56 74 61 62 45  void importVtabE
3f70: 72 72 4d 73 67 28 56 64 62 65 20 2a 70 2c 20 73  rrMsg(Vdbe *p, s
3f80: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
3f90: 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ab){.  sqlite3 *
3fa0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73 71  db = p->db;.  sq
3fb0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3fc0: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
3fd0: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  ->zErrMsg = sqli
3fe0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
3ff0: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
4000: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
4010: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
4020: 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
4030: 67 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  g = 0;.}.../*.**
4040: 20 45 78 65 63 75 74 65 20 61 73 20 6d 75 63 68   Execute as much
4050: 20 6f 66 20 61 20 56 44 42 45 20 70 72 6f 67 72   of a VDBE progr
4060: 61 6d 20 61 73 20 77 65 20 63 61 6e 20 74 68 65  am as we can the
4070: 6e 20 72 65 74 75 72 6e 2e 0a 2a 2a 0a 2a 2a 20  n return..**.** 
4080: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
4090: 65 61 64 79 28 29 20 6d 75 73 74 20 62 65 20 63  eady() must be c
40a0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 74 68 69  alled before thi
40b0: 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64  s routine in ord
40c0: 65 72 20 74 6f 0a 2a 2a 20 63 6c 6f 73 65 20 74  er to.** close t
40d0: 68 65 20 70 72 6f 67 72 61 6d 20 77 69 74 68 20  he program with 
40e0: 61 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20  a final OP_Halt 
40f0: 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68  and to set up th
4100: 65 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2a 20 61  e callbacks.** a
4110: 6e 64 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  nd the error mes
4120: 73 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  sage pointer..**
4130: 0a 2a 2a 20 57 68 65 6e 65 76 65 72 20 61 20 72  .** Whenever a r
4140: 6f 77 20 6f 72 20 72 65 73 75 6c 74 20 64 61 74  ow or result dat
4150: 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  a is available, 
4160: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
4170: 6c 20 65 69 74 68 65 72 0a 2a 2a 20 69 6e 76 6f  l either.** invo
4180: 6b 65 20 74 68 65 20 72 65 73 75 6c 74 20 63 61  ke the result ca
4190: 6c 6c 62 61 63 6b 20 28 69 66 20 74 68 65 72 65  llback (if there
41a0: 20 69 73 20 6f 6e 65 29 20 6f 72 20 72 65 74 75   is one) or retu
41b0: 72 6e 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49 54  rn with.** SQLIT
41c0: 45 5f 52 4f 57 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  E_ROW..**.** If 
41d0: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
41e0: 64 65 20 74 6f 20 6f 70 65 6e 20 61 20 6c 6f 63  de to open a loc
41f0: 6b 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68  ked database, th
4200: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
4210: 2a 2a 20 77 69 6c 6c 20 65 69 74 68 65 72 20 69  ** will either i
4220: 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63  nvoke the busy c
4230: 61 6c 6c 62 61 63 6b 20 28 69 66 20 74 68 65 72  allback (if ther
4240: 65 20 69 73 20 6f 6e 65 29 20 6f 72 20 69 74 20  e is one) or it 
4250: 77 69 6c 6c 0a 2a 2a 20 72 65 74 75 72 6e 20 53  will.** return S
4260: 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a  QLITE_BUSY..**.*
4270: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
4280: 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 6d  curs, an error m
4290: 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65  essage is writte
42a0: 6e 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  n to memory obta
42b0: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
42c0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
42d0: 64 20 70 2d 3e 7a 45 72 72 4d 73 67 20 69 73 20  d p->zErrMsg is 
42e0: 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f  made to point to
42f0: 20 74 68 61 74 20 6d 65 6d 6f 72 79 2e 0a 2a 2a   that memory..**
4300: 20 54 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   The error code 
4310: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 2d 3e  is stored in p->
4320: 72 63 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  rc and this rout
4330: 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
4340: 54 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20  TE_ERROR..**.** 
4350: 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  If the callback 
4360: 65 76 65 72 20 72 65 74 75 72 6e 73 20 6e 6f 6e  ever returns non
4370: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
4380: 70 72 6f 67 72 61 6d 20 65 78 69 74 73 0a 2a 2a  program exits.**
4390: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 54   immediately.  T
43a0: 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20  here will be no 
43b0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62 75  error message bu
43c0: 74 20 74 68 65 20 70 2d 3e 72 63 20 66 69 65 6c  t the p->rc fiel
43d0: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 53  d is.** set to S
43e0: 51 4c 49 54 45 5f 41 42 4f 52 54 20 61 6e 64 20  QLITE_ABORT and 
43f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
4400: 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  l return SQLITE_
4410: 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41 20 6d  ERROR..**.** A m
4420: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
4430: 20 65 72 72 6f 72 20 63 61 75 73 65 73 20 70 2d   error causes p-
4440: 3e 72 63 20 74 6f 20 62 65 20 73 65 74 20 74 6f  >rc to be set to
4450: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e   SQLITE_NOMEM an
4460: 64 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  d this.** routin
4470: 65 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  e to return SQLI
4480: 54 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20  TE_ERROR..**.** 
4490: 4f 74 68 65 72 20 66 61 74 61 6c 20 65 72 72 6f  Other fatal erro
44a0: 72 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  rs return SQLITE
44b0: 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41 66  _ERROR..**.** Af
44c0: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
44d0: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2c 20 73   has finished, s
44e0: 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69  qlite3VdbeFinali
44f0: 7a 65 28 29 20 73 68 6f 75 6c 64 20 62 65 0a 2a  ze() should be.*
4500: 2a 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20  * used to clean 
4510: 75 70 20 74 68 65 20 6d 65 73 73 20 74 68 61 74  up the mess that
4520: 20 77 61 73 20 6c 65 66 74 20 62 65 68 69 6e 64   was left behind
4530: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4540: 56 64 62 65 45 78 65 63 28 0a 20 20 56 64 62 65  VdbeExec(.  Vdbe
4550: 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20   *p             
4560: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
4570: 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70  BE */.){.  int p
4580: 63 3d 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  c=0;            
4590: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f        /* The pro
45a0: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
45b0: 20 20 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61    Op *aOp = p->a
45c0: 4f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Op;          /* 
45d0: 43 6f 70 79 20 6f 66 20 70 2d 3e 61 4f 70 20 2a  Copy of p->aOp *
45e0: 2f 0a 20 20 4f 70 20 2a 70 4f 70 3b 20 20 20 20  /.  Op *pOp;    
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4600: 2a 20 43 75 72 72 65 6e 74 20 6f 70 65 72 61 74  * Current operat
4610: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ion */.  int rc 
4620: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
4630: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
4640: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69  return */.  sqli
4650: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
4660: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
4670: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 72  tabase */.  u8 r
4680: 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c  esetSchemaOnFaul
4690: 74 20 3d 20 30 3b 20 2f 2a 20 52 65 73 65 74 20  t = 0; /* Reset 
46a0: 73 63 68 65 6d 61 20 61 66 74 65 72 20 61 6e 20  schema after an 
46b0: 65 72 72 6f 72 20 69 66 20 70 6f 73 69 74 69 76  error if positiv
46c0: 65 20 2a 2f 0a 20 20 75 38 20 65 6e 63 6f 64 69  e */.  u8 encodi
46d0: 6e 67 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20  ng = ENC(db);   
46e0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
46f0: 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 23 69  e encoding */.#i
4700: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4710: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
4720: 41 43 4b 0a 20 20 69 6e 74 20 63 68 65 63 6b 50  ACK.  int checkP
4730: 72 6f 67 72 65 73 73 3b 20 20 20 20 20 20 20 20  rogress;        
4740: 20 2f 2a 20 54 72 75 65 20 69 66 20 70 72 6f 67   /* True if prog
4750: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 73 20 61  ress callbacks a
4760: 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  re enabled */.  
4770: 69 6e 74 20 6e 50 72 6f 67 72 65 73 73 4f 70 73  int nProgressOps
4780: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f 70   = 0;      /* Op
4790: 63 6f 64 65 73 20 65 78 65 63 75 74 65 64 20 73  codes executed s
47a0: 69 6e 63 65 20 70 72 6f 67 72 65 73 73 20 63 61  ince progress ca
47b0: 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 23 65 6e 64 69  llback. */.#endi
47c0: 66 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20  f.  Mem *aMem = 
47d0: 70 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f  p->aMem;       /
47e0: 2a 20 43 6f 70 79 20 6f 66 20 70 2d 3e 61 4d 65  * Copy of p->aMe
47f0: 6d 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 31  m */.  Mem *pIn1
4800: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
4810: 20 20 2f 2a 20 31 73 74 20 69 6e 70 75 74 20 6f    /* 1st input o
4820: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20  perand */.  Mem 
4830: 2a 70 49 6e 32 20 3d 20 30 3b 20 20 20 20 20 20  *pIn2 = 0;      
4840: 20 20 20 20 20 20 20 2f 2a 20 32 6e 64 20 69 6e         /* 2nd in
4850: 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  put operand */. 
4860: 20 4d 65 6d 20 2a 70 49 6e 33 20 3d 20 30 3b 20   Mem *pIn3 = 0; 
4870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33              /* 3
4880: 72 64 20 69 6e 70 75 74 20 6f 70 65 72 61 6e 64  rd input operand
4890: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4f 75 74 20   */.  Mem *pOut 
48a0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
48b0: 20 2f 2a 20 4f 75 74 70 75 74 20 6f 70 65 72 61   /* Output opera
48c0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6d  nd */.  int iCom
48d0: 70 61 72 65 20 3d 20 30 3b 20 20 20 20 20 20 20  pare = 0;       
48e0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
48f0: 6c 61 73 74 20 4f 50 5f 43 6f 6d 70 61 72 65 20  last OP_Compare 
4900: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
4910: 6e 74 20 2a 61 50 65 72 6d 75 74 65 20 3d 20 30  nt *aPermute = 0
4920: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72  ;         /* Per
4930: 6d 75 74 61 74 69 6f 6e 20 6f 66 20 63 6f 6c 75  mutation of colu
4940: 6d 6e 73 20 66 6f 72 20 4f 50 5f 43 6f 6d 70 61  mns for OP_Compa
4950: 72 65 20 2a 2f 0a 20 20 69 36 34 20 6c 61 73 74  re */.  i64 last
4960: 52 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61 73 74  Rowid = db->last
4970: 52 6f 77 69 64 3b 20 20 2f 2a 20 53 61 76 65 64  Rowid;  /* Saved
4980: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 61   value of the la
4990: 73 74 20 69 6e 73 65 72 74 20 52 4f 57 49 44 20  st insert ROWID 
49a0: 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  */.#ifdef VDBE_P
49b0: 52 4f 46 49 4c 45 0a 20 20 75 36 34 20 73 74 61  ROFILE.  u64 sta
49c0: 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rt;             
49d0: 20 20 20 20 2f 2a 20 43 50 55 20 63 6c 6f 63 6b      /* CPU clock
49e0: 20 63 6f 75 6e 74 20 61 74 20 73 74 61 72 74 20   count at start 
49f0: 6f 66 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  of opcode */.  i
4a00: 6e 74 20 6f 72 69 67 50 63 3b 20 20 20 20 20 20  nt origPc;      
4a10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
4a20: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 61 74 20  gram counter at 
4a30: 73 74 61 72 74 20 6f 66 20 6f 70 63 6f 64 65 20  start of opcode 
4a40: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 2a 2a  */.#endif.  /***
4a50: 20 49 4e 53 45 52 54 20 53 54 41 43 4b 20 55 4e   INSERT STACK UN
4a60: 49 4f 4e 20 48 45 52 45 20 2a 2a 2a 2f 0a 0a 20  ION HERE ***/.. 
4a70: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
4a80: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
4a90: 4e 20 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33  N );  /* sqlite3
4aa0: 5f 73 74 65 70 28 29 20 76 65 72 69 66 69 65 73  _step() verifies
4ab0: 20 74 68 69 73 20 2a 2f 0a 20 20 73 71 6c 69 74   this */.  sqlit
4ac0: 65 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a  e3VdbeEnter(p);.
4ad0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
4ae0: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
4af0: 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
4b00: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69   if a malloc() i
4b10: 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20  nside a call to 
4b20: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
4b30: 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20  ext() or.    ** 
4b40: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
4b50: 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20  ext16() failed. 
4b60: 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f   */.    goto no_
4b70: 6d 65 6d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  mem;.  }.  asser
4b80: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
4b90: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
4ba0: 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 70  LITE_BUSY );.  p
4bb0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
4bc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
4bd0: 78 70 6c 61 69 6e 3d 3d 30 20 29 3b 0a 20 20 70  xplain==0 );.  p
4be0: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
4bf0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
4c00: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
4c10: 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52   CHECK_FOR_INTER
4c20: 52 55 50 54 3b 0a 20 20 73 71 6c 69 74 65 33 56  RUPT;.  sqlite3V
4c30: 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 70 29  dbeIOTraceSql(p)
4c40: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
4c50: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
4c60: 41 4c 4c 42 41 43 4b 0a 20 20 63 68 65 63 6b 50  ALLBACK.  checkP
4c70: 72 6f 67 72 65 73 73 20 3d 20 64 62 2d 3e 78 50  rogress = db->xP
4c80: 72 6f 67 72 65 73 73 21 3d 30 3b 0a 23 65 6e 64  rogress!=0;.#end
4c90: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
4ca0: 5f 44 45 42 55 47 0a 20 20 73 71 6c 69 74 65 33  _DEBUG.  sqlite3
4cb0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
4cc0: 63 28 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 63  c();.  if( p->pc
4cd0: 3d 3d 30 20 20 26 26 20 28 70 2d 3e 64 62 2d 3e  ==0  && (p->db->
4ce0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
4cf0: 64 62 65 4c 69 73 74 69 6e 67 29 21 3d 30 20 29  dbeListing)!=0 )
4d00: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
4d10: 20 70 72 69 6e 74 66 28 22 56 44 42 45 20 50 72   printf("VDBE Pr
4d20: 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67 3a 5c 6e  ogram Listing:\n
4d30: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ");.    sqlite3V
4d40: 64 62 65 50 72 69 6e 74 53 71 6c 28 70 29 3b 0a  dbePrintSql(p);.
4d50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4d60: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
4d70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
4d80: 69 6e 74 4f 70 28 73 74 64 6f 75 74 2c 20 69 2c  intOp(stdout, i,
4d90: 20 26 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 7d   &aOp[i]);.    }
4da0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e  .  }.  sqlite3En
4db0: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
4dc0: 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 70 63  .#endif.  for(pc
4dd0: 3d 70 2d 3e 70 63 3b 20 72 63 3d 3d 53 51 4c 49  =p->pc; rc==SQLI
4de0: 54 45 5f 4f 4b 3b 20 70 63 2b 2b 29 7b 0a 20 20  TE_OK; pc++){.  
4df0: 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 30 20    assert( pc>=0 
4e00: 26 26 20 70 63 3c 70 2d 3e 6e 4f 70 20 29 3b 0a  && pc<p->nOp );.
4e10: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
4e20: 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
4e30: 6e 6f 5f 6d 65 6d 3b 0a 23 69 66 64 65 66 20 56  no_mem;.#ifdef V
4e40: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 20 20  DBE_PROFILE.    
4e50: 6f 72 69 67 50 63 20 3d 20 70 63 3b 0a 20 20 20  origPc = pc;.   
4e60: 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
4e70: 48 77 74 69 6d 65 28 29 3b 0a 23 65 6e 64 69 66  Hwtime();.#endif
4e80: 0a 20 20 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b  .    pOp = &aOp[
4e90: 70 63 5d 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c  pc];..    /* Onl
4ea0: 79 20 61 6c 6c 6f 77 20 74 72 61 63 69 6e 67 20  y allow tracing 
4eb0: 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  if SQLITE_DEBUG 
4ec0: 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 20  is defined..    
4ed0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4ee0: 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70  _DEBUG.    if( p
4ef0: 2d 3e 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20  ->trace ){.     
4f00: 20 69 66 28 20 70 63 3d 3d 30 20 29 7b 0a 20 20   if( pc==0 ){.  
4f10: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 56 44        printf("VD
4f20: 42 45 20 45 78 65 63 75 74 69 6f 6e 20 54 72 61  BE Execution Tra
4f30: 63 65 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ce:\n");.       
4f40: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
4f50: 74 53 71 6c 28 70 29 3b 0a 20 20 20 20 20 20 7d  tSql(p);.      }
4f60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4f70: 62 65 50 72 69 6e 74 4f 70 28 70 2d 3e 74 72 61  bePrintOp(p->tra
4f80: 63 65 2c 20 70 63 2c 20 70 4f 70 29 3b 0a 20 20  ce, pc, pOp);.  
4f90: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
4fa0: 20 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20   ..    /* Check 
4fb0: 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65  to see if we nee
4fc0: 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
4fd0: 20 69 6e 74 65 72 72 75 70 74 2e 20 20 54 68 69   interrupt.  Thi
4fe0: 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 0a 20  s only happens. 
4ff0: 20 20 20 2a 2a 20 69 66 20 77 65 20 68 61 76 65     ** if we have
5000: 20 61 20 73 70 65 63 69 61 6c 20 74 65 73 74 20   a special test 
5010: 62 75 69 6c 64 2e 0a 20 20 20 20 2a 2f 0a 23 69  build..    */.#i
5020: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
5030: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
5040: 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
5050: 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
5060: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f  te3_interrupt_co
5070: 75 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  unt--;.      if(
5080: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
5090: 70 74 5f 63 6f 75 6e 74 3d 3d 30 20 29 7b 0a 20  pt_count==0 ){. 
50a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
50b0: 6e 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20 20  nterrupt(db);.  
50c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
50d0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
50e0: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
50f0: 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 2f 2a  _CALLBACK.    /*
5100: 20 43 61 6c 6c 20 74 68 65 20 70 72 6f 67 72 65   Call the progre
5110: 73 73 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 69  ss callback if i
5120: 74 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  t is configured 
5130: 61 6e 64 20 74 68 65 20 72 65 71 75 69 72 65 64  and the required
5140: 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2a 20 6f   number.    ** o
5150: 66 20 56 44 42 45 20 6f 70 73 20 68 61 76 65 20  f VDBE ops have 
5160: 62 65 65 6e 20 65 78 65 63 75 74 65 64 20 28 65  been executed (e
5170: 69 74 68 65 72 20 73 69 6e 63 65 20 74 68 69 73  ither since this
5180: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 0a 20   invocation of. 
5190: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62     ** sqlite3Vdb
51a0: 65 45 78 65 63 28 29 20 6f 72 20 73 69 6e 63 65  eExec() or since
51b0: 20 6c 61 73 74 20 74 69 6d 65 20 74 68 65 20 70   last time the p
51c0: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
51d0: 20 77 61 73 20 63 61 6c 6c 65 64 29 2e 0a 20 20   was called)..  
51e0: 20 20 2a 2a 20 49 66 20 74 68 65 20 70 72 6f 67    ** If the prog
51f0: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 72 65  ress callback re
5200: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
5210: 65 78 69 74 20 74 68 65 20 76 69 72 74 75 61 6c  exit the virtual
5220: 20 6d 61 63 68 69 6e 65 20 77 69 74 68 0a 20 20   machine with.  
5230: 20 20 2a 2a 20 61 20 72 65 74 75 72 6e 20 63 6f    ** a return co
5240: 64 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 2e  de SQLITE_ABORT.
5250: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
5260: 63 68 65 63 6b 50 72 6f 67 72 65 73 73 20 29 7b  checkProgress ){
5270: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6e  .      if( db->n
5280: 50 72 6f 67 72 65 73 73 4f 70 73 3d 3d 6e 50 72  ProgressOps==nPr
5290: 6f 67 72 65 73 73 4f 70 73 20 29 7b 0a 20 20 20  ogressOps ){.   
52a0: 20 20 20 20 20 69 6e 74 20 70 72 63 3b 0a 20 20       int prc;.  
52b0: 20 20 20 20 20 20 70 72 63 20 3d 20 64 62 2d 3e        prc = db->
52c0: 78 50 72 6f 67 72 65 73 73 28 64 62 2d 3e 70 50  xProgress(db->pP
52d0: 72 6f 67 72 65 73 73 41 72 67 29 3b 0a 20 20 20  rogressArg);.   
52e0: 20 20 20 20 20 69 66 28 20 70 72 63 21 3d 30 20       if( prc!=0 
52f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
5300: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
5310: 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
5320: 74 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68 61  to vdbe_error_ha
5330: 6c 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  lt;.        }.  
5340: 20 20 20 20 20 20 6e 50 72 6f 67 72 65 73 73 4f        nProgressO
5350: 70 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ps = 0;.      }.
5360: 20 20 20 20 20 20 6e 50 72 6f 67 72 65 73 73 4f        nProgressO
5370: 70 73 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ps++;.    }.#end
5380: 69 66 0a 0a 20 20 20 20 2f 2a 20 4f 6e 20 61 6e  if..    /* On an
5390: 79 20 6f 70 63 6f 64 65 20 77 69 74 68 20 74 68  y opcode with th
53a0: 65 20 22 6f 75 74 32 2d 70 72 65 72 65 6c 61 73  e "out2-prerelas
53b0: 65 22 20 74 61 67 2c 20 66 72 65 65 20 61 6e 79  e" tag, free any
53c0: 0a 20 20 20 20 2a 2a 20 65 78 74 65 72 6e 61 6c  .    ** external
53d0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 75 74   allocations out
53e0: 20 6f 66 20 6d 65 6d 5b 70 32 5d 20 61 6e 64 20   of mem[p2] and 
53f0: 73 65 74 20 6d 65 6d 5b 70 32 5d 20 74 6f 20 62  set mem[p2] to b
5400: 65 0a 20 20 20 20 2a 2a 20 61 6e 20 75 6e 64 65  e.    ** an unde
5410: 66 69 6e 65 64 20 69 6e 74 65 67 65 72 2e 20 20  fined integer.  
5420: 4f 70 63 6f 64 65 73 20 77 69 6c 6c 20 65 69 74  Opcodes will eit
5430: 68 65 72 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  her fill in the 
5440: 69 6e 74 65 67 65 72 0a 20 20 20 20 2a 2a 20 76  integer.    ** v
5450: 61 6c 75 65 20 6f 72 20 63 6f 6e 76 65 72 74 20  alue or convert 
5460: 6d 65 6d 5b 70 32 5d 20 74 6f 20 61 20 64 69 66  mem[p2] to a dif
5470: 66 65 72 65 6e 74 20 74 79 70 65 2e 0a 20 20 20  ferent type..   
5480: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
5490: 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 3d 3d 73 71  pOp->opflags==sq
54a0: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
54b0: 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d  rty[pOp->opcode]
54c0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d   );.    if( pOp-
54d0: 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47  >opflags & OPFLG
54e0: 5f 4f 55 54 32 5f 50 52 45 52 45 4c 45 41 53 45  _OUT2_PRERELEASE
54f0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
5500: 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20  ( pOp->p2>0 );. 
5510: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
5520: 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b  ->p2<=p->nMem );
5530: 0a 20 20 20 20 20 20 70 4f 75 74 20 3d 20 26 61  .      pOut = &a
5540: 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
5550: 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68      memAboutToCh
5560: 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20  ange(p, pOut);. 
5570: 20 20 20 20 20 4d 65 6d 52 65 6c 65 61 73 65 45       MemReleaseE
5580: 78 74 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20  xt(pOut);.      
5590: 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
55a0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  M_Int;.    }..  
55b0: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
55c0: 6b 69 6e 67 20 6f 6e 20 6f 74 68 65 72 20 6f 70  king on other op
55d0: 65 72 61 6e 64 73 20 2a 2f 0a 23 69 66 64 65 66  erands */.#ifdef
55e0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
55f0: 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c    if( (pOp->opfl
5600: 61 67 73 20 26 20 4f 50 46 4c 47 5f 49 4e 31 29  ags & OPFLG_IN1)
5610: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
5620: 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 29  ert( pOp->p1>0 )
5630: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
5640: 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p1<=p->nMem
5650: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
5660: 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d  ( memIsValid(&aM
5670: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20 29 3b 0a  em[pOp->p1]) );.
5680: 20 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54        REGISTER_T
5690: 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 26 61  RACE(pOp->p1, &a
56a0: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 3b 0a 20  Mem[pOp->p1]);. 
56b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 4f     }.    if( (pO
56c0: 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46  p->opflags & OPF
56d0: 4c 47 5f 49 4e 32 29 21 3d 30 20 29 7b 0a 20 20  LG_IN2)!=0 ){.  
56e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
56f0: 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  >p2>0 );.      a
5700: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d  ssert( pOp->p2<=
5710: 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20  p->nMem );.     
5720: 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
5730: 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  lid(&aMem[pOp->p
5740: 32 5d 29 20 29 3b 0a 20 20 20 20 20 20 52 45 47  2]) );.      REG
5750: 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
5760: 3e 70 32 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  >p2, &aMem[pOp->
5770: 70 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p2]);.    }.    
5780: 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67  if( (pOp->opflag
5790: 73 20 26 20 4f 50 46 4c 47 5f 49 4e 33 29 21 3d  s & OPFLG_IN3)!=
57a0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
57b0: 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a  t( pOp->p3>0 );.
57c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
57d0: 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29  p->p3<=p->nMem )
57e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
57f0: 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d  memIsValid(&aMem
5800: 5b 70 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a 20 20  [pOp->p3]) );.  
5810: 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
5820: 43 45 28 70 4f 70 2d 3e 70 33 2c 20 26 61 4d 65  CE(pOp->p3, &aMe
5830: 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20  m[pOp->p3]);.   
5840: 20 7d 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d   }.    if( (pOp-
5850: 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47  >opflags & OPFLG
5860: 5f 4f 55 54 32 29 21 3d 30 20 29 7b 0a 20 20 20  _OUT2)!=0 ){.   
5870: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
5880: 70 32 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  p2>0 );.      as
5890: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 70  sert( pOp->p2<=p
58a0: 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20  ->nMem );.      
58b0: 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
58c0: 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  (p, &aMem[pOp->p
58d0: 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  2]);.    }.    i
58e0: 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73  f( (pOp->opflags
58f0: 20 26 20 4f 50 46 4c 47 5f 4f 55 54 33 29 21 3d   & OPFLG_OUT3)!=
5900: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
5910: 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a  t( pOp->p3>0 );.
5920: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
5930: 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29  p->p3<=p->nMem )
5940: 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74  ;.      memAbout
5950: 54 6f 43 68 61 6e 67 65 28 70 2c 20 26 61 4d 65  ToChange(p, &aMe
5960: 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20  m[pOp->p3]);.   
5970: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20   }.#endif.  .   
5980: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70   switch( pOp->op
5990: 63 6f 64 65 20 29 7b 0a 0a 2f 2a 2a 2a 2a 2a 2a  code ){../******
59a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59e0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 57 68 61 74 20  *******.** What 
59f0: 66 6f 6c 6c 6f 77 73 20 69 73 20 61 20 6d 61 73  follows is a mas
5a00: 73 69 76 65 20 73 77 69 74 63 68 20 73 74 61 74  sive switch stat
5a10: 65 6d 65 6e 74 20 77 68 65 72 65 20 65 61 63 68  ement where each
5a20: 20 63 61 73 65 20 69 6d 70 6c 65 6d 65 6e 74 73   case implements
5a30: 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69   a.** separate i
5a40: 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
5a50: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
5a60: 65 2e 20 20 49 66 20 77 65 20 66 6f 6c 6c 6f 77  e.  If we follow
5a70: 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 69 6e   the usual.** in
5a80: 64 65 6e 74 61 74 69 6f 6e 20 63 6f 6e 76 65 6e  dentation conven
5a90: 74 69 6f 6e 73 2c 20 65 61 63 68 20 63 61 73 65  tions, each case
5aa0: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e   should be inden
5ab0: 74 65 64 20 62 79 20 36 20 73 70 61 63 65 73 2e  ted by 6 spaces.
5ac0: 20 20 42 75 74 0a 2a 2a 20 74 68 61 74 20 69 73    But.** that is
5ad0: 20 61 20 6c 6f 74 20 6f 66 20 77 61 73 74 65 64   a lot of wasted
5ae0: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 6c 65   space on the le
5af0: 66 74 20 6d 61 72 67 69 6e 2e 20 20 53 6f 20 74  ft margin.  So t
5b00: 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 0a 2a  he code within.*
5b10: 2a 20 74 68 65 20 73 77 69 74 63 68 20 73 74 61  * the switch sta
5b20: 74 65 6d 65 6e 74 20 77 69 6c 6c 20 62 72 65 61  tement will brea
5b30: 6b 20 77 69 74 68 20 63 6f 6e 76 65 6e 74 69 6f  k with conventio
5b40: 6e 20 61 6e 64 20 62 65 20 66 6c 75 73 68 2d 6c  n and be flush-l
5b50: 65 66 74 2e 20 41 6e 6f 74 68 65 72 0a 2a 2a 20  eft. Another.** 
5b60: 62 69 67 20 63 6f 6d 6d 65 6e 74 20 28 73 69 6d  big comment (sim
5b70: 69 6c 61 72 20 74 6f 20 74 68 69 73 20 6f 6e 65  ilar to this one
5b80: 29 20 77 69 6c 6c 20 6d 61 72 6b 20 74 68 65 20  ) will mark the 
5b90: 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
5ba0: 65 20 77 68 65 72 65 0a 2a 2a 20 77 65 20 74 72  e where.** we tr
5bb0: 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b 20 74 6f  ansition back to
5bc0: 20 6e 6f 72 6d 61 6c 20 69 6e 64 65 6e 74 61 74   normal indentat
5bd0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
5be0: 6f 72 6d 61 74 74 69 6e 67 20 6f 66 20 65 61 63  ormatting of eac
5bf0: 68 20 63 61 73 65 20 69 73 20 69 6d 70 6f 72 74  h case is import
5c00: 61 6e 74 2e 20 20 54 68 65 20 6d 61 6b 65 66 69  ant.  The makefi
5c10: 6c 65 20 66 6f 72 20 53 51 4c 69 74 65 0a 2a 2a  le for SQLite.**
5c20: 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20 43   generates two C
5c30: 20 66 69 6c 65 73 20 22 6f 70 63 6f 64 65 73 2e   files "opcodes.
5c40: 68 22 20 61 6e 64 20 22 6f 70 63 6f 64 65 73 2e  h" and "opcodes.
5c50: 63 22 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74  c" by scanning t
5c60: 68 69 73 0a 2a 2a 20 66 69 6c 65 20 6c 6f 6f 6b  his.** file look
5c70: 69 6e 67 20 66 6f 72 20 6c 69 6e 65 73 20 74 68  ing for lines th
5c80: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 22 63  at begin with "c
5c90: 61 73 65 20 4f 50 5f 22 2e 20 20 54 68 65 20 6f  ase OP_".  The o
5ca0: 70 63 6f 64 65 73 2e 68 20 66 69 6c 65 73 0a 2a  pcodes.h files.*
5cb0: 2a 20 77 69 6c 6c 20 62 65 20 66 69 6c 6c 65 64  * will be filled
5cc0: 20 77 69 74 68 20 23 64 65 66 69 6e 65 73 20 74   with #defines t
5cd0: 68 61 74 20 67 69 76 65 20 75 6e 69 71 75 65 20  hat give unique 
5ce0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 74  integer values t
5cf0: 6f 20 65 61 63 68 0a 2a 2a 20 6f 70 63 6f 64 65  o each.** opcode
5d00: 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 73   and the opcodes
5d10: 2e 63 20 66 69 6c 65 20 69 73 20 66 69 6c 6c 65  .c file is fille
5d20: 64 20 77 69 74 68 20 61 6e 20 61 72 72 61 79 20  d with an array 
5d30: 6f 66 20 73 74 72 69 6e 67 73 20 77 68 65 72 65  of strings where
5d40: 0a 2a 2a 20 65 61 63 68 20 73 74 72 69 6e 67 20  .** each string 
5d50: 69 73 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20  is the symbolic 
5d60: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 72  name for the cor
5d70: 72 65 73 70 6f 6e 64 69 6e 67 20 6f 70 63 6f 64  responding opcod
5d80: 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 61  e.  If the.** ca
5d90: 73 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  se statement is 
5da0: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 63 6f  followed by a co
5db0: 6d 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 72  mment of the for
5dc0: 6d 20 22 2f 23 20 73 61 6d 65 20 61 73 20 2e 2e  m "/# same as ..
5dd0: 2e 20 23 2f 22 0a 2a 2a 20 74 68 61 74 20 63 6f  . #/".** that co
5de0: 6d 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f  mment is used to
5df0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70   determine the p
5e00: 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20  articular value 
5e10: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a  of the opcode..*
5e20: 2a 0a 2a 2a 20 4f 74 68 65 72 20 6b 65 79 77 6f  *.** Other keywo
5e30: 72 64 73 20 69 6e 20 74 68 65 20 63 6f 6d 6d 65  rds in the comme
5e40: 6e 74 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  nt that follows 
5e50: 65 61 63 68 20 63 61 73 65 20 61 72 65 20 75 73  each case are us
5e60: 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e 73 74 72 75  ed to.** constru
5e70: 63 74 20 74 68 65 20 4f 50 46 4c 47 5f 49 4e 49  ct the OPFLG_INI
5e80: 54 49 41 4c 49 5a 45 52 20 76 61 6c 75 65 20 74  TIALIZER value t
5e90: 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  hat initializes 
5ea0: 6f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 5d  opcodeProperty[]
5eb0: 2e 0a 2a 2a 20 4b 65 79 77 6f 72 64 73 20 69 6e  ..** Keywords in
5ec0: 63 6c 75 64 65 3a 20 69 6e 31 2c 20 69 6e 32 2c  clude: in1, in2,
5ed0: 20 69 6e 33 2c 20 6f 75 74 32 5f 70 72 65 72 65   in3, out2_prere
5ee0: 6c 65 61 73 65 2c 20 6f 75 74 32 2c 20 6f 75 74  lease, out2, out
5ef0: 33 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 6d  3.  See.** the m
5f00: 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
5f10: 69 70 74 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ipt for addition
5f20: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
5f30: 2a 2a 0a 2a 2a 20 44 6f 63 75 6d 65 6e 74 61 74  **.** Documentat
5f40: 69 6f 6e 20 61 62 6f 75 74 20 56 44 42 45 20 6f  ion about VDBE o
5f50: 70 63 6f 64 65 73 20 69 73 20 67 65 6e 65 72 61  pcodes is genera
5f60: 74 65 64 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  ted by scanning 
5f70: 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20 66 6f 72  this file.** for
5f80: 20 6c 69 6e 65 73 20 6f 66 20 74 68 61 74 20 63   lines of that c
5f90: 6f 6e 74 61 69 6e 20 22 4f 70 63 6f 64 65 3a 22  ontain "Opcode:"
5fa0: 2e 20 20 54 68 61 74 20 6c 69 6e 65 20 61 6e 64  .  That line and
5fb0: 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
5fc0: 2a 2a 20 63 6f 6d 6d 65 6e 74 20 6c 69 6e 65 73  ** comment lines
5fd0: 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 65   are used in the
5fe0: 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74   generation of t
5ff0: 68 65 20 6f 70 63 6f 64 65 2e 68 74 6d 6c 20 64  he opcode.html d
6000: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  ocumentation.** 
6010: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 55 4d 4d  file..**.** SUMM
6020: 41 52 59 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 46  ARY:.**.**     F
6030: 6f 72 6d 61 74 74 69 6e 67 20 69 73 20 69 6d 70  ormatting is imp
6040: 6f 72 74 61 6e 74 20 74 6f 20 73 63 72 69 70 74  ortant to script
6050: 73 20 74 68 61 74 20 73 63 61 6e 20 74 68 69 73  s that scan this
6060: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 44 6f   file..**     Do
6070: 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72 6f   not deviate fro
6080: 6d 20 74 68 65 20 66 6f 72 6d 61 74 74 69 6e 67  m the formatting
6090: 20 73 74 79 6c 65 20 63 75 72 72 65 6e 74 6c 79   style currently
60a0: 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 2a 2a   in use..**.****
60b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 4f  *********/../* O
6100: 70 63 6f 64 65 3a 20 20 47 6f 74 6f 20 2a 20 50  pcode:  Goto * P
6110: 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 6e  2 * * *.**.** An
6120: 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a   unconditional j
6130: 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73 20 50  ump to address P
6140: 32 2e 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 69  2..** The next i
6150: 6e 73 74 72 75 63 74 69 6f 6e 20 65 78 65 63 75  nstruction execu
6160: 74 65 64 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20  ted will be .** 
6170: 74 68 65 20 6f 6e 65 20 61 74 20 69 6e 64 65 78  the one at index
6180: 20 50 32 20 66 72 6f 6d 20 74 68 65 20 62 65 67   P2 from the beg
6190: 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
61a0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 63 61 73   program..*/.cas
61b0: 65 20 4f 50 5f 47 6f 74 6f 3a 20 7b 20 20 20 20  e OP_Goto: {    
61c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
61d0: 20 2a 2f 0a 20 20 43 48 45 43 4b 5f 46 4f 52 5f   */.  CHECK_FOR_
61e0: 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 70 63 20  INTERRUPT;.  pc 
61f0: 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
6200: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
6210: 63 6f 64 65 3a 20 20 47 6f 73 75 62 20 50 31 20  code:  Gosub P1 
6220: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57  P2 * * *.**.** W
6230: 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
6240: 20 61 64 64 72 65 73 73 20 6f 6e 74 6f 20 72 65   address onto re
6250: 67 69 73 74 65 72 20 50 31 0a 2a 2a 20 61 6e 64  gister P1.** and
6260: 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 61 64   then jump to ad
6270: 64 72 65 73 73 20 50 32 2e 0a 2a 2f 0a 63 61 73  dress P2..*/.cas
6280: 65 20 4f 50 5f 47 6f 73 75 62 3a 20 7b 20 20 20  e OP_Gosub: {   
6290: 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
62a0: 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  , in1 */.  pIn1 
62b0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
62c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 6e  ;.  assert( (pIn
62d0: 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  1->flags & MEM_D
62e0: 79 6e 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 41  yn)==0 );.  memA
62f0: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
6300: 70 49 6e 31 29 3b 0a 20 20 70 49 6e 31 2d 3e 66  pIn1);.  pIn1->f
6310: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
6320: 20 20 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 70 63    pIn1->u.i = pc
6330: 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41  ;.  REGISTER_TRA
6340: 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70 49 6e 31  CE(pOp->p1, pIn1
6350: 29 3b 0a 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70  );.  pc = pOp->p
6360: 32 20 2d 20 31 3b 0a 20 20 62 72 65 61 6b 3b 0a  2 - 1;.  break;.
6370: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 52  }../* Opcode:  R
6380: 65 74 75 72 6e 20 50 31 20 2a 20 2a 20 2a 20 2a  eturn P1 * * * *
6390: 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 74  .**.** Jump to t
63a0: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
63b0: 69 6f 6e 20 61 66 74 65 72 20 74 68 65 20 61 64  ion after the ad
63c0: 64 72 65 73 73 20 69 6e 20 72 65 67 69 73 74 65  dress in registe
63d0: 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  r P1..*/.case OP
63e0: 5f 52 65 74 75 72 6e 3a 20 7b 20 20 20 20 20 20  _Return: {      
63f0: 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20       /* in1 */. 
6400: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
6410: 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
6420: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20  ( pIn1->flags & 
6430: 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 70 63 20  MEM_Int );.  pc 
6440: 3d 20 28 69 6e 74 29 70 49 6e 31 2d 3e 75 2e 69  = (int)pIn1->u.i
6450: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
6460: 20 4f 70 63 6f 64 65 3a 20 20 59 69 65 6c 64 20   Opcode:  Yield 
6470: 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  P1 * * * *.**.**
6480: 20 53 77 61 70 20 74 68 65 20 70 72 6f 67 72 61   Swap the progra
6490: 6d 20 63 6f 75 6e 74 65 72 20 77 69 74 68 20 74  m counter with t
64a0: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
64b0: 73 74 65 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65  ster P1..*/.case
64c0: 20 4f 50 5f 59 69 65 6c 64 3a 20 7b 20 20 20 20   OP_Yield: {    
64d0: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a          /* in1 *
64e0: 2f 0a 20 20 69 6e 74 20 70 63 44 65 73 74 3b 0a  /.  int pcDest;.
64f0: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
6500: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
6510: 74 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  t( (pIn1->flags 
6520: 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d 30 20 29 3b  & MEM_Dyn)==0 );
6530: 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d  .  pIn1->flags =
6540: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 70 63 44 65   MEM_Int;.  pcDe
6550: 73 74 20 3d 20 28 69 6e 74 29 70 49 6e 31 2d 3e  st = (int)pIn1->
6560: 75 2e 69 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69  u.i;.  pIn1->u.i
6570: 20 3d 20 70 63 3b 0a 20 20 52 45 47 49 53 54 45   = pc;.  REGISTE
6580: 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c  R_TRACE(pOp->p1,
6590: 20 70 49 6e 31 29 3b 0a 20 20 70 63 20 3d 20 70   pIn1);.  pc = p
65a0: 63 44 65 73 74 3b 0a 20 20 62 72 65 61 6b 3b 0a  cDest;.  break;.
65b0: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 48  }../* Opcode:  H
65c0: 61 6c 74 49 66 4e 75 6c 6c 20 20 50 31 20 50 32  altIfNull  P1 P2
65d0: 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 43   P3 P4 *.**.** C
65e0: 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65 20 69  heck the value i
65f0: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 20 20  n register P3.  
6600: 49 66 20 69 74 20 69 73 20 4e 55 4c 4c 20 74 68  If it is NULL th
6610: 65 6e 20 48 61 6c 74 20 75 73 69 6e 67 0a 2a 2a  en Halt using.**
6620: 20 70 61 72 61 6d 65 74 65 72 20 50 31 2c 20 50   parameter P1, P
6630: 32 2c 20 61 6e 64 20 50 34 20 61 73 20 69 66 20  2, and P4 as if 
6640: 74 68 69 73 20 77 65 72 65 20 61 20 48 61 6c 74  this were a Halt
6650: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49   instruction.  I
6660: 66 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69  f the.** value i
6670: 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73  n register P3 is
6680: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
6690: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
66a0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63 61 73 65  a no-op..*/.case
66b0: 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 3a 20   OP_HaltIfNull: 
66c0: 7b 20 20 20 20 20 20 2f 2a 20 69 6e 33 20 2a 2f  {      /* in3 */
66d0: 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b  .  pIn3 = &aMem[
66e0: 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20  pOp->p3];.  if( 
66f0: 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn3->flags & M
6700: 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 20 62 72  EM_Null)==0 ) br
6710: 65 61 6b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74  eak;.  /* Fall t
6720: 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 48  hrough into OP_H
6730: 61 6c 74 20 2a 2f 0a 7d 0a 0a 2f 2a 20 4f 70 63  alt */.}../* Opc
6740: 6f 64 65 3a 20 20 48 61 6c 74 20 50 31 20 50 32  ode:  Halt P1 P2
6750: 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 45 78   * P4 *.**.** Ex
6760: 69 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  it immediately. 
6770: 20 41 6c 6c 20 6f 70 65 6e 20 63 75 72 73 6f 72   All open cursor
6780: 73 2c 20 65 74 63 20 61 72 65 20 63 6c 6f 73 65  s, etc are close
6790: 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
67a0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20  ly..**.** P1 is 
67b0: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20  the result code 
67c0: 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
67d0: 74 65 33 5f 65 78 65 63 28 29 2c 20 73 71 6c 69  te3_exec(), sqli
67e0: 74 65 33 5f 72 65 73 65 74 28 29 2c 0a 2a 2a 20  te3_reset(),.** 
67f0: 6f 72 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  or sqlite3_final
6800: 69 7a 65 28 29 2e 20 20 46 6f 72 20 61 20 6e 6f  ize().  For a no
6810: 72 6d 61 6c 20 68 61 6c 74 2c 20 74 68 69 73 20  rmal halt, this 
6820: 73 68 6f 75 6c 64 20 62 65 20 53 51 4c 49 54 45  should be SQLITE
6830: 5f 4f 4b 20 28 30 29 2e 0a 2a 2a 20 46 6f 72 20  _OK (0)..** For 
6840: 65 72 72 6f 72 73 2c 20 69 74 20 63 61 6e 20 62  errors, it can b
6850: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 76 61 6c  e some other val
6860: 75 65 2e 20 20 49 66 20 50 31 21 3d 30 20 74 68  ue.  If P1!=0 th
6870: 65 6e 20 50 32 20 77 69 6c 6c 20 64 65 74 65 72  en P2 will deter
6880: 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20  mine.** whether 
6890: 6f 72 20 6e 6f 74 20 74 6f 20 72 6f 6c 6c 62 61  or not to rollba
68a0: 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ck the current t
68b0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 44 6f 20  ransaction.  Do 
68c0: 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  not rollback.** 
68d0: 69 66 20 50 32 3d 3d 4f 45 5f 46 61 69 6c 2e 20  if P2==OE_Fail. 
68e0: 44 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  Do the rollback 
68f0: 69 66 20 50 32 3d 3d 4f 45 5f 52 6f 6c 6c 62 61  if P2==OE_Rollba
6900: 63 6b 2e 20 20 49 66 20 50 32 3d 3d 4f 45 5f 41  ck.  If P2==OE_A
6910: 62 6f 72 74 2c 0a 2a 2a 20 74 68 65 6e 20 62 61  bort,.** then ba
6920: 63 6b 20 6f 75 74 20 61 6c 6c 20 63 68 61 6e 67  ck out all chang
6930: 65 73 20 74 68 61 74 20 68 61 76 65 20 6f 63 63  es that have occ
6940: 75 72 72 65 64 20 64 75 72 69 6e 67 20 74 68 69  urred during thi
6950: 73 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  s execution of t
6960: 68 65 0a 2a 2a 20 56 44 42 45 2c 20 62 75 74 20  he.** VDBE, but 
6970: 64 6f 20 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20  do not rollback 
6980: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
6990: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73   .**.** If P4 is
69a0: 20 6e 6f 74 20 6e 75 6c 6c 20 74 68 65 6e 20 69   not null then i
69b0: 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  t is an error me
69c0: 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a 2a 2a  ssage string..**
69d0: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6e 20  .** There is an 
69e0: 69 6d 70 6c 69 65 64 20 22 48 61 6c 74 20 30 20  implied "Halt 0 
69f0: 30 20 30 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  0 0" instruction
6a00: 20 69 6e 73 65 72 74 65 64 20 61 74 20 74 68 65   inserted at the
6a10: 20 76 65 72 79 20 65 6e 64 20 6f 66 0a 2a 2a 20   very end of.** 
6a20: 65 76 65 72 79 20 70 72 6f 67 72 61 6d 2e 20 20  every program.  
6a30: 53 6f 20 61 20 6a 75 6d 70 20 70 61 73 74 20 74  So a jump past t
6a40: 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74  he last instruct
6a50: 69 6f 6e 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ion of the progr
6a60: 61 6d 0a 2a 2a 20 69 73 20 74 68 65 20 73 61 6d  am.** is the sam
6a70: 65 20 61 73 20 65 78 65 63 75 74 69 6e 67 20 48  e as executing H
6a80: 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  alt..*/.case OP_
6a90: 48 61 6c 74 3a 20 7b 0a 20 20 69 66 28 20 70 4f  Halt: {.  if( pO
6aa0: 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->p1==SQLITE_OK
6ab0: 20 26 26 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b   && p->pFrame ){
6ac0: 0a 20 20 20 20 2f 2a 20 48 61 6c 74 20 74 68 65  .    /* Halt the
6ad0: 20 73 75 62 2d 70 72 6f 67 72 61 6d 2e 20 52 65   sub-program. Re
6ae0: 74 75 72 6e 20 63 6f 6e 74 72 6f 6c 20 74 6f 20  turn control to 
6af0: 74 68 65 20 70 61 72 65 6e 74 20 66 72 61 6d 65  the parent frame
6b00: 2e 20 2a 2f 0a 20 20 20 20 56 64 62 65 46 72 61  . */.    VdbeFra
6b10: 6d 65 20 2a 70 46 72 61 6d 65 20 3d 20 70 2d 3e  me *pFrame = p->
6b20: 70 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70  pFrame;.    p->p
6b30: 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 2d 3e  Frame = pFrame->
6b40: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 2d 3e  pParent;.    p->
6b50: 6e 46 72 61 6d 65 2d 2d 3b 0a 20 20 20 20 73 71  nFrame--;.    sq
6b60: 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
6b70: 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
6b80: 67 65 29 3b 0a 20 20 20 20 70 63 20 3d 20 73 71  ge);.    pc = sq
6b90: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
6ba0: 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20  store(pFrame);. 
6bb0: 20 20 20 6c 61 73 74 52 6f 77 69 64 20 3d 20 64     lastRowid = d
6bc0: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20  b->lastRowid;.  
6bd0: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 4f    if( pOp->p2==O
6be0: 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20  E_Ignore ){.    
6bf0: 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e    /* Instruction
6c00: 20 70 63 20 69 73 20 74 68 65 20 4f 50 5f 50 72   pc is the OP_Pr
6c10: 6f 67 72 61 6d 20 74 68 61 74 20 69 6e 76 6f 6b  ogram that invok
6c20: 65 64 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  ed the sub-progr
6c30: 61 6d 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72  am .      ** cur
6c40: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 68 61 6c  rently being hal
6c50: 74 65 64 2e 20 49 66 20 74 68 65 20 70 32 20 69  ted. If the p2 i
6c60: 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68  nstruction of th
6c70: 69 73 20 4f 50 5f 48 61 6c 74 0a 20 20 20 20 20  is OP_Halt.     
6c80: 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
6c90: 69 73 20 73 65 74 20 74 6f 20 4f 45 5f 49 67 6e  is set to OE_Ign
6ca0: 6f 72 65 2c 20 74 68 65 6e 20 74 68 65 20 73 75  ore, then the su
6cb0: 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 74 68 72  b-program is thr
6cc0: 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61  owing.      ** a
6cd0: 6e 20 49 47 4e 4f 52 45 20 65 78 63 65 70 74 69  n IGNORE excepti
6ce0: 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
6cf0: 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 61 64 64   jump to the add
6d00: 72 65 73 73 20 73 70 65 63 69 66 69 65 64 0a 20  ress specified. 
6d10: 20 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 70       ** as the p
6d20: 32 20 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e 67  2 of the calling
6d30: 20 4f 50 5f 50 72 6f 67 72 61 6d 2e 20 20 2a 2f   OP_Program.  */
6d40: 0a 20 20 20 20 20 20 70 63 20 3d 20 70 2d 3e 61  .      pc = p->a
6d50: 4f 70 5b 70 63 5d 2e 70 32 2d 31 3b 0a 20 20 20  Op[pc].p2-1;.   
6d60: 20 7d 0a 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e   }.    aOp = p->
6d70: 61 4f 70 3b 0a 20 20 20 20 61 4d 65 6d 20 3d 20  aOp;.    aMem = 
6d80: 70 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 62 72 65  p->aMem;.    bre
6d90: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72 63  ak;.  }..  p->rc
6da0: 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 2d   = pOp->p1;.  p-
6db0: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 28  >errorAction = (
6dc0: 75 38 29 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 2d  u8)pOp->p2;.  p-
6dd0: 3e 70 63 20 3d 20 70 63 3b 0a 20 20 69 66 28 20  >pc = pc;.  if( 
6de0: 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20  pOp->p4.z ){.   
6df0: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
6e00: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
6e10: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
6e20: 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  g(&p->zErrMsg, d
6e30: 62 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  b, "%s", pOp->p4
6e40: 2e 7a 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  .z);.    testcas
6e50: 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
6e60: 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
6e70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  ;.    sqlite3_lo
6e80: 67 28 70 4f 70 2d 3e 70 31 2c 20 22 61 62 6f 72  g(pOp->p1, "abor
6e90: 74 20 61 74 20 25 64 20 69 6e 20 5b 25 73 5d 3a  t at %d in [%s]:
6ea0: 20 25 73 22 2c 20 70 63 2c 20 70 2d 3e 7a 53 71   %s", pc, p->zSq
6eb0: 6c 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  l, pOp->p4.z);. 
6ec0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
6ed0: 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
6ee0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
6ef0: 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
6f00: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
6f10: 28 70 4f 70 2d 3e 70 31 2c 20 22 63 6f 6e 73 74  (pOp->p1, "const
6f20: 72 61 69 6e 74 20 66 61 69 6c 65 64 20 61 74 20  raint failed at 
6f30: 25 64 20 69 6e 20 5b 25 73 5d 22 2c 20 70 63 2c  %d in [%s]", pc,
6f40: 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20   p->zSql);.  }. 
6f50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
6f60: 65 48 61 6c 74 28 70 29 3b 0a 20 20 61 73 73 65  eHalt(p);.  asse
6f70: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  rt( rc==SQLITE_B
6f80: 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  USY || rc==SQLIT
6f90: 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
6fa0: 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  TE_ERROR );.  if
6fb0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
6fc0: 59 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  Y ){.    p->rc =
6fd0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
6fe0: 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
6ff0: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
7000: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
7010: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
7020: 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
7030: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
7040: 7c 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43  | db->nDeferredC
7050: 6f 6e 73 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  ons>0 );.    rc 
7060: 3d 20 70 2d 3e 72 63 20 3f 20 53 51 4c 49 54 45  = p->rc ? SQLITE
7070: 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f  _ERROR : SQLITE_
7080: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f  DONE;.  }.  goto
7090: 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a   vdbe_return;.}.
70a0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65  ./* Opcode: Inte
70b0: 67 65 72 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  ger P1 P2 * * *.
70c0: 2a 2a 0a 2a 2a 20 54 68 65 20 33 32 2d 62 69 74  **.** The 32-bit
70d0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 50   integer value P
70e0: 31 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  1 is written int
70f0: 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  o register P2..*
7100: 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65 67 65  /.case OP_Intege
7110: 72 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20  r: {         /* 
7120: 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20  out2-prerelease 
7130: 2a 2f 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  */.  pOut->u.i =
7140: 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 62 72 65 61   pOp->p1;.  brea
7150: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
7160: 20 49 6e 74 36 34 20 2a 20 50 32 20 2a 20 50 34   Int64 * P2 * P4
7170: 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61   *.**.** P4 is a
7180: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 36 34   pointer to a 64
7190: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
71a0: 75 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 61  ue..** Write tha
71b0: 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67  t value into reg
71c0: 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73  ister P2..*/.cas
71d0: 65 20 4f 50 5f 49 6e 74 36 34 3a 20 7b 20 20 20  e OP_Int64: {   
71e0: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
71f0: 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
7200: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e  assert( pOp->p4.
7210: 70 49 36 34 21 3d 30 20 29 3b 0a 20 20 70 4f 75  pI64!=0 );.  pOu
7220: 74 2d 3e 75 2e 69 20 3d 20 2a 70 4f 70 2d 3e 70  t->u.i = *pOp->p
7230: 34 2e 70 49 36 34 3b 0a 20 20 62 72 65 61 6b 3b  4.pI64;.  break;
7240: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
7250: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
7260: 5f 50 4f 49 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65  _POINT./* Opcode
7270: 3a 20 52 65 61 6c 20 2a 20 50 32 20 2a 20 50 34  : Real * P2 * P4
7280: 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61   *.**.** P4 is a
7290: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 36 34   pointer to a 64
72a0: 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
72b0: 69 6e 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 57 72  int value..** Wr
72c0: 69 74 65 20 74 68 61 74 20 76 61 6c 75 65 20 69  ite that value i
72d0: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e  nto register P2.
72e0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61 6c  .*/.case OP_Real
72f0: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
7300: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 46 4c 4f  * same as TK_FLO
7310: 41 54 2c 20 6f 75 74 32 2d 70 72 65 72 65 6c 65  AT, out2-prerele
7320: 61 73 65 20 2a 2f 0a 20 20 70 4f 75 74 2d 3e 66  ase */.  pOut->f
7330: 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b  lags = MEM_Real;
7340: 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
7350: 74 65 33 49 73 4e 61 4e 28 2a 70 4f 70 2d 3e 70  te3IsNaN(*pOp->p
7360: 34 2e 70 52 65 61 6c 29 20 29 3b 0a 20 20 70 4f  4.pReal) );.  pO
7370: 75 74 2d 3e 72 20 3d 20 2a 70 4f 70 2d 3e 70 34  ut->r = *pOp->p4
7380: 2e 70 52 65 61 6c 3b 0a 20 20 62 72 65 61 6b 3b  .pReal;.  break;
7390: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70  .}.#endif../* Op
73a0: 63 6f 64 65 3a 20 53 74 72 69 6e 67 38 20 2a 20  code: String8 * 
73b0: 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  P2 * P4 *.**.** 
73c0: 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e  P4 points to a n
73d0: 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul terminated UT
73e0: 46 2d 38 20 73 74 72 69 6e 67 2e 20 54 68 69 73  F-8 string. This
73f0: 20 6f 70 63 6f 64 65 20 69 73 20 74 72 61 6e 73   opcode is trans
7400: 66 6f 72 6d 65 64 20 0a 2a 2a 20 69 6e 74 6f 20  formed .** into 
7410: 61 6e 20 4f 50 5f 53 74 72 69 6e 67 20 62 65 66  an OP_String bef
7420: 6f 72 65 20 69 74 20 69 73 20 65 78 65 63 75 74  ore it is execut
7430: 65 64 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ed for the first
7440: 20 74 69 6d 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f   time..*/.case O
7450: 50 5f 53 74 72 69 6e 67 38 3a 20 7b 20 20 20 20  P_String8: {    
7460: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
7470: 54 4b 5f 53 54 52 49 4e 47 2c 20 6f 75 74 32 2d  TK_STRING, out2-
7480: 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
7490: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e  assert( pOp->p4.
74a0: 7a 21 3d 30 20 29 3b 0a 20 20 70 4f 70 2d 3e 6f  z!=0 );.  pOp->o
74b0: 70 63 6f 64 65 20 3d 20 4f 50 5f 53 74 72 69 6e  pcode = OP_Strin
74c0: 67 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 73  g;.  pOp->p1 = s
74d0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
74e0: 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 0a 23 69 66 6e  Op->p4.z);..#ifn
74f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7500: 55 54 46 31 36 0a 20 20 69 66 28 20 65 6e 63 6f  UTF16.  if( enco
7510: 64 69 6e 67 21 3d 53 51 4c 49 54 45 5f 55 54 46  ding!=SQLITE_UTF
7520: 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  8 ){.    rc = sq
7530: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
7540: 74 72 28 70 4f 75 74 2c 20 70 4f 70 2d 3e 70 34  tr(pOut, pOp->p4
7550: 2e 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  .z, -1, SQLITE_U
7560: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
7570: 49 43 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  IC);.    if( rc=
7580: 3d 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 29  =SQLITE_TOOBIG )
7590: 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20   goto too_big;. 
75a0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
75b0: 21 3d 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  !=sqlite3VdbeCha
75c0: 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4f 75 74  ngeEncoding(pOut
75d0: 2c 20 65 6e 63 6f 64 69 6e 67 29 20 29 20 67 6f  , encoding) ) go
75e0: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 61  to no_mem;.    a
75f0: 73 73 65 72 74 28 20 70 4f 75 74 2d 3e 7a 4d 61  ssert( pOut->zMa
7600: 6c 6c 6f 63 3d 3d 70 4f 75 74 2d 3e 7a 20 29 3b  lloc==pOut->z );
7610: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 75  .    assert( pOu
7620: 74 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  t->flags & MEM_D
7630: 79 6e 20 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  yn );.    pOut->
7640: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
7650: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20   pOut->flags |= 
7660: 4d 45 4d 5f 53 74 61 74 69 63 3b 0a 20 20 20 20  MEM_Static;.    
7670: 70 4f 75 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pOut->flags &= ~
7680: 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20 20 69 66 28  MEM_Dyn;.    if(
7690: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
76a0: 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20  _DYNAMIC ){.    
76b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
76c0: 64 62 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  db, pOp->p4.z);.
76d0: 20 20 20 20 7d 0a 20 20 20 20 70 4f 70 2d 3e 70      }.    pOp->p
76e0: 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d  4type = P4_DYNAM
76f0: 49 43 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e  IC;.    pOp->p4.
7700: 7a 20 3d 20 70 4f 75 74 2d 3e 7a 3b 0a 20 20 20  z = pOut->z;.   
7710: 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 75 74 2d   pOp->p1 = pOut-
7720: 3e 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  >n;.  }.#endif. 
7730: 20 69 66 28 20 70 4f 70 2d 3e 70 31 3e 64 62 2d   if( pOp->p1>db-
7740: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7750: 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a  IMIT_LENGTH] ){.
7760: 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67      goto too_big
7770: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 61 6c 6c 20  ;.  }.  /* Fall 
7780: 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
7790: 65 78 74 20 63 61 73 65 2c 20 4f 50 5f 53 74 72  ext case, OP_Str
77a0: 69 6e 67 20 2a 2f 0a 7d 0a 20 20 0a 2f 2a 20 4f  ing */.}.  ./* O
77b0: 70 63 6f 64 65 3a 20 53 74 72 69 6e 67 20 50 31  pcode: String P1
77c0: 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a   P2 * P4 *.**.**
77d0: 20 54 68 65 20 73 74 72 69 6e 67 20 76 61 6c 75   The string valu
77e0: 65 20 50 34 20 6f 66 20 6c 65 6e 67 74 68 20 50  e P4 of length P
77f0: 31 20 28 62 79 74 65 73 29 20 69 73 20 73 74 6f  1 (bytes) is sto
7800: 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
7810: 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  P2..*/.case OP_S
7820: 74 72 69 6e 67 3a 20 7b 20 20 20 20 20 20 20 20  tring: {        
7830: 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c    /* out2-prerel
7840: 65 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ease */.  assert
7850: 28 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  ( pOp->p4.z!=0 )
7860: 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20  ;.  pOut->flags 
7870: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74  = MEM_Str|MEM_St
7880: 61 74 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  atic|MEM_Term;. 
7890: 20 70 4f 75 74 2d 3e 7a 20 3d 20 70 4f 70 2d 3e   pOut->z = pOp->
78a0: 70 34 2e 7a 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20  p4.z;.  pOut->n 
78b0: 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 4f 75  = pOp->p1;.  pOu
78c0: 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e  t->enc = encodin
78d0: 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  g;.  UPDATE_MAX_
78e0: 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a  BLOBSIZE(pOut);.
78f0: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
7900: 70 63 6f 64 65 3a 20 4e 75 6c 6c 20 2a 20 50 32  pcode: Null * P2
7910: 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69   * * *.**.** Wri
7920: 74 65 20 61 20 4e 55 4c 4c 20 69 6e 74 6f 20 72  te a NULL into r
7930: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63  egister P2..*/.c
7940: 61 73 65 20 4f 50 5f 4e 75 6c 6c 3a 20 7b 20 20  ase OP_Null: {  
7950: 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
7960: 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20  -prerelease */. 
7970: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
7980: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 62 72 65 61 6b  EM_Null;.  break
7990: 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ;.}.../* Opcode:
79a0: 20 42 6c 6f 62 20 50 31 20 50 32 20 2a 20 50 34   Blob P1 P2 * P4
79b0: 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74 73  .**.** P4 points
79c0: 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 64 61   to a blob of da
79d0: 74 61 20 50 31 20 62 79 74 65 73 20 6c 6f 6e 67  ta P1 bytes long
79e0: 2e 20 20 53 74 6f 72 65 20 74 68 69 73 0a 2a 2a  .  Store this.**
79f0: 20 62 6c 6f 62 20 69 6e 20 72 65 67 69 73 74 65   blob in registe
7a00: 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  r P2..*/.case OP
7a10: 5f 42 6c 6f 62 3a 20 7b 20 20 20 20 20 20 20 20  _Blob: {        
7a20: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
7a30: 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
7a40: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 20  assert( pOp->p1 
7a50: 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  <= SQLITE_MAX_LE
7a60: 4e 47 54 48 20 29 3b 0a 20 20 73 71 6c 69 74 65  NGTH );.  sqlite
7a70: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
7a80: 4f 75 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20  Out, pOp->p4.z, 
7a90: 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 30 29 3b 0a  pOp->p1, 0, 0);.
7aa0: 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e    pOut->enc = en
7ab0: 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41 54 45  coding;.  UPDATE
7ac0: 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f  _MAX_BLOBSIZE(pO
7ad0: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
7ae0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 61 72 69  ./* Opcode: Vari
7af0: 61 62 6c 65 20 50 31 20 50 32 20 2a 20 50 34 20  able P1 P2 * P4 
7b00: 2a 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  *.**.** Transfer
7b10: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 62   the values of b
7b20: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 50  ound parameter P
7b30: 31 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  1 into register 
7b40: 50 32 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  P2.**.** If the 
7b50: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 61 6d  parameter is nam
7b60: 65 64 2c 20 74 68 65 6e 20 69 74 73 20 6e 61 6d  ed, then its nam
7b70: 65 20 61 70 70 65 61 72 73 20 69 6e 20 50 34 20  e appears in P4 
7b80: 61 6e 64 20 50 33 3d 3d 31 2e 0a 2a 2a 20 54 68  and P3==1..** Th
7b90: 65 20 50 34 20 76 61 6c 75 65 20 69 73 20 75 73  e P4 value is us
7ba0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 62 69  ed by sqlite3_bi
7bb0: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
7bc0: 65 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  e()..*/.case OP_
7bd0: 56 61 72 69 61 62 6c 65 3a 20 7b 20 20 20 20 20  Variable: {     
7be0: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70         /* out2-p
7bf0: 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 4d  rerelease */.  M
7c00: 65 6d 20 2a 70 56 61 72 3b 20 20 20 20 20 20 20  em *pVar;       
7c10: 2f 2a 20 56 61 6c 75 65 20 62 65 69 6e 67 20 74  /* Value being t
7c20: 72 61 6e 73 66 65 72 72 65 64 20 2a 2f 0a 0a 20  ransferred */.. 
7c30: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
7c40: 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 70  >0 && pOp->p1<=p
7c50: 2d 3e 6e 56 61 72 20 29 3b 0a 20 20 61 73 73 65  ->nVar );.  asse
7c60: 72 74 28 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 30  rt( pOp->p4.z==0
7c70: 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 70   || pOp->p4.z==p
7c80: 2d 3e 61 7a 56 61 72 5b 70 4f 70 2d 3e 70 31 2d  ->azVar[pOp->p1-
7c90: 31 5d 20 29 3b 0a 20 20 70 56 61 72 20 3d 20 26  1] );.  pVar = &
7ca0: 70 2d 3e 61 56 61 72 5b 70 4f 70 2d 3e 70 31 20  p->aVar[pOp->p1 
7cb0: 2d 20 31 5d 3b 0a 20 20 69 66 28 20 73 71 6c 69  - 1];.  if( sqli
7cc0: 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67  te3VdbeMemTooBig
7cd0: 28 70 56 61 72 29 20 29 7b 0a 20 20 20 20 67 6f  (pVar) ){.    go
7ce0: 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a  to too_big;.  }.
7cf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
7d00: 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74  ShallowCopy(pOut
7d10: 2c 20 70 56 61 72 2c 20 4d 45 4d 5f 53 74 61 74  , pVar, MEM_Stat
7d20: 69 63 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  ic);.  UPDATE_MA
7d30: 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29  X_BLOBSIZE(pOut)
7d40: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
7d50: 20 4f 70 63 6f 64 65 3a 20 4d 6f 76 65 20 50 31   Opcode: Move P1
7d60: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
7d70: 20 4d 6f 76 65 20 74 68 65 20 76 61 6c 75 65 73   Move the values
7d80: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
7d90: 2e 50 31 2b 50 33 2d 31 20 6f 76 65 72 20 69 6e  .P1+P3-1 over in
7da0: 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20  to.** registers 
7db0: 50 32 2e 2e 50 32 2b 50 33 2d 31 2e 20 20 52 65  P2..P2+P3-1.  Re
7dc0: 67 69 73 74 65 72 73 20 50 31 2e 2e 50 31 2b 50  gisters P1..P1+P
7dd0: 31 2d 31 20 61 72 65 0a 2a 2a 20 6c 65 66 74 20  1-1 are.** left 
7de0: 68 6f 6c 64 69 6e 67 20 61 20 4e 55 4c 4c 2e 20  holding a NULL. 
7df0: 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
7e00: 66 6f 72 20 72 65 67 69 73 74 65 72 20 72 61 6e  for register ran
7e10: 67 65 73 0a 2a 2a 20 50 31 2e 2e 50 31 2b 50 33  ges.** P1..P1+P3
7e20: 2d 31 20 61 6e 64 20 50 32 2e 2e 50 32 2b 50 33  -1 and P2..P2+P3
7e30: 2d 31 20 74 6f 20 6f 76 65 72 6c 61 70 2e 0a 2a  -1 to overlap..*
7e40: 2f 0a 63 61 73 65 20 4f 50 5f 4d 6f 76 65 3a 20  /.case OP_Move: 
7e50: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 6c 6c 6f  {.  char *zMallo
7e60: 63 3b 20 20 20 2f 2a 20 48 6f 6c 64 69 6e 67 20  c;   /* Holding 
7e70: 76 61 72 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c  variable for all
7e80: 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  ocated memory */
7e90: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
7ea0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7eb0: 20 72 65 67 69 73 74 65 72 73 20 6c 65 66 74 20   registers left 
7ec0: 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
7ed0: 20 70 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   p1;          /*
7ee0: 20 52 65 67 69 73 74 65 72 20 74 6f 20 63 6f 70   Register to cop
7ef0: 79 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  y from */.  int 
7f00: 70 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p2;          /* 
7f10: 52 65 67 69 73 74 65 72 20 74 6f 20 63 6f 70 79  Register to copy
7f20: 20 74 6f 20 2a 2f 0a 0a 20 20 6e 20 3d 20 70 4f   to */..  n = pO
7f30: 70 2d 3e 70 33 3b 0a 20 20 70 31 20 3d 20 70 4f  p->p3;.  p1 = pO
7f40: 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70 4f  p->p1;.  p2 = pO
7f50: 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28  p->p2;.  assert(
7f60: 20 6e 3e 30 20 26 26 20 70 31 3e 30 20 26 26 20   n>0 && p1>0 && 
7f70: 70 32 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p2>0 );.  assert
7f80: 28 20 70 31 2b 6e 3c 3d 70 32 20 7c 7c 20 70 32  ( p1+n<=p2 || p2
7f90: 2b 6e 3c 3d 70 31 20 29 3b 0a 0a 20 20 70 49 6e  +n<=p1 );..  pIn
7fa0: 31 20 3d 20 26 61 4d 65 6d 5b 70 31 5d 3b 0a 20  1 = &aMem[p1];. 
7fb0: 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 32   pOut = &aMem[p2
7fc0: 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  ];.  while( n-- 
7fd0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
7fe0: 4f 75 74 3c 3d 26 61 4d 65 6d 5b 70 2d 3e 6e 4d  Out<=&aMem[p->nM
7ff0: 65 6d 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  em] );.    asser
8000: 74 28 20 70 49 6e 31 3c 3d 26 61 4d 65 6d 5b 70  t( pIn1<=&aMem[p
8010: 2d 3e 6e 4d 65 6d 5d 20 29 3b 0a 20 20 20 20 61  ->nMem] );.    a
8020: 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
8030: 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 20 20 6d  d(pIn1) );.    m
8040: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
8050: 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 7a 4d  p, pOut);.    zM
8060: 61 6c 6c 6f 63 20 3d 20 70 4f 75 74 2d 3e 7a 4d  alloc = pOut->zM
8070: 61 6c 6c 6f 63 3b 0a 20 20 20 20 70 4f 75 74 2d  alloc;.    pOut-
8080: 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  >zMalloc = 0;.  
8090: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
80a0: 4d 6f 76 65 28 70 4f 75 74 2c 20 70 49 6e 31 29  Move(pOut, pIn1)
80b0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
80c0: 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 4f  DEBUG.    if( pO
80d0: 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3e 3d  ut->pScopyFrom>=
80e0: 26 61 4d 65 6d 5b 70 31 5d 20 26 26 20 70 4f 75  &aMem[p1] && pOu
80f0: 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3c 26 61  t->pScopyFrom<&a
8100: 4d 65 6d 5b 70 31 2b 70 4f 70 2d 3e 70 33 5d 20  Mem[p1+pOp->p3] 
8110: 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  ){.      pOut->p
8120: 53 63 6f 70 79 46 72 6f 6d 20 2b 3d 20 70 31 20  ScopyFrom += p1 
8130: 2d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 7d  - pOp->p2;.    }
8140: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 49 6e 31  .#endif.    pIn1
8150: 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 7a 4d 61 6c  ->zMalloc = zMal
8160: 6c 6f 63 3b 0a 20 20 20 20 52 45 47 49 53 54 45  loc;.    REGISTE
8170: 52 5f 54 52 41 43 45 28 70 32 2b 2b 2c 20 70 4f  R_TRACE(p2++, pO
8180: 75 74 29 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b  ut);.    pIn1++;
8190: 0a 20 20 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 7d  .    pOut++;.  }
81a0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
81b0: 4f 70 63 6f 64 65 3a 20 43 6f 70 79 20 50 31 20  Opcode: Copy P1 
81c0: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d  P2 * * *.**.** M
81d0: 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 72 65  ake a copy of re
81e0: 67 69 73 74 65 72 20 50 31 20 69 6e 74 6f 20 72  gister P1 into r
81f0: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
8200: 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69  * This instructi
8210: 6f 6e 20 6d 61 6b 65 73 20 61 20 64 65 65 70 20  on makes a deep 
8220: 63 6f 70 79 20 6f 66 20 74 68 65 20 76 61 6c 75  copy of the valu
8230: 65 2e 20 20 41 20 64 75 70 6c 69 63 61 74 65 0a  e.  A duplicate.
8240: 2a 2a 20 69 73 20 6d 61 64 65 20 6f 66 20 61 6e  ** is made of an
8250: 79 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  y string or blob
8260: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20   constant.  See 
8270: 61 6c 73 6f 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a  also OP_SCopy..*
8280: 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 70 79 3a 20  /.case OP_Copy: 
8290: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {             /*
82a0: 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20 20   in1, out2 */.  
82b0: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
82c0: 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20  ->p1];.  pOut = 
82d0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
82e0: 20 20 61 73 73 65 72 74 28 20 70 4f 75 74 21 3d    assert( pOut!=
82f0: 70 49 6e 31 20 29 3b 0a 20 20 73 71 6c 69 74 65  pIn1 );.  sqlite
8300: 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
8310: 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 31 2c 20  opy(pOut, pIn1, 
8320: 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 44 65  MEM_Ephem);.  De
8330: 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 70 4f 75  ephemeralize(pOu
8340: 74 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54  t);.  REGISTER_T
8350: 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f  RACE(pOp->p2, pO
8360: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
8370: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 43 6f 70  ./* Opcode: SCop
8380: 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  y P1 P2 * * *.**
8390: 0a 2a 2a 20 4d 61 6b 65 20 61 20 73 68 61 6c 6c  .** Make a shall
83a0: 6f 77 20 63 6f 70 79 20 6f 66 20 72 65 67 69 73  ow copy of regis
83b0: 74 65 72 20 50 31 20 69 6e 74 6f 20 72 65 67 69  ter P1 into regi
83c0: 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54  ster P2..**.** T
83d0: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
83e0: 6d 61 6b 65 73 20 61 20 73 68 61 6c 6c 6f 77 20  makes a shallow 
83f0: 63 6f 70 79 20 6f 66 20 74 68 65 20 76 61 6c 75  copy of the valu
8400: 65 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65  e.  If the value
8410: 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20  .** is a string 
8420: 6f 72 20 62 6c 6f 62 2c 20 74 68 65 6e 20 74 68  or blob, then th
8430: 65 20 63 6f 70 79 20 69 73 20 6f 6e 6c 79 20 61  e copy is only a
8440: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
8450: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 61 6e 64 20  ** original and 
8460: 68 65 6e 63 65 20 69 66 20 74 68 65 20 6f 72 69  hence if the ori
8470: 67 69 6e 61 6c 20 63 68 61 6e 67 65 73 20 73 6f  ginal changes so
8480: 20 77 69 6c 6c 20 74 68 65 20 63 6f 70 79 2e 0a   will the copy..
8490: 2a 2a 20 57 6f 72 73 65 2c 20 69 66 20 74 68 65  ** Worse, if the
84a0: 20 6f 72 69 67 69 6e 61 6c 20 69 73 20 64 65 61   original is dea
84b0: 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 20 63 6f  llocated, the co
84c0: 70 79 20 62 65 63 6f 6d 65 73 20 69 6e 76 61 6c  py becomes inval
84d0: 69 64 2e 0a 2a 2a 20 54 68 75 73 20 74 68 65 20  id..** Thus the 
84e0: 70 72 6f 67 72 61 6d 20 6d 75 73 74 20 67 75 61  program must gua
84f0: 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
8500: 6f 72 69 67 69 6e 61 6c 20 77 69 6c 6c 20 6e 6f  original will no
8510: 74 20 63 68 61 6e 67 65 0a 2a 2a 20 64 75 72 69  t change.** duri
8520: 6e 67 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  ng the lifetime 
8530: 6f 66 20 74 68 65 20 63 6f 70 79 2e 20 20 55 73  of the copy.  Us
8540: 65 20 4f 50 5f 43 6f 70 79 20 74 6f 20 6d 61 6b  e OP_Copy to mak
8550: 65 20 61 20 63 6f 6d 70 6c 65 74 65 0a 2a 2a 20  e a complete.** 
8560: 63 6f 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  copy..*/.case OP
8570: 5f 53 43 6f 70 79 3a 20 7b 20 20 20 20 20 20 20  _SCopy: {       
8580: 20 20 20 20 20 2f 2a 20 69 6e 31 2c 20 6f 75 74       /* in1, out
8590: 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61  2 */.  pIn1 = &a
85a0: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
85b0: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
85c0: 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p2];.  assert(
85d0: 20 70 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a 20   pOut!=pIn1 );. 
85e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
85f0: 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c  hallowCopy(pOut,
8600: 20 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65 6d   pIn1, MEM_Ephem
8610: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
8620: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 4f 75  _DEBUG.  if( pOu
8630: 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3d 3d 30  t->pScopyFrom==0
8640: 20 29 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46   ) pOut->pScopyF
8650: 72 6f 6d 20 3d 20 70 49 6e 31 3b 0a 23 65 6e 64  rom = pIn1;.#end
8660: 69 66 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  if.  REGISTER_TR
8670: 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75  ACE(pOp->p2, pOu
8680: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
8690: 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 75 6c  /* Opcode: Resul
86a0: 74 52 6f 77 20 50 31 20 50 32 20 2a 20 2a 20 2a  tRow P1 P2 * * *
86b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69 73  .**.** The regis
86c0: 74 65 72 73 20 50 31 20 74 68 72 6f 75 67 68 20  ters P1 through 
86d0: 50 31 2b 50 32 2d 31 20 63 6f 6e 74 61 69 6e 20  P1+P2-1 contain 
86e0: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 0a  a single row of.
86f0: 2a 2a 20 72 65 73 75 6c 74 73 2e 20 54 68 69 73  ** results. This
8700: 20 6f 70 63 6f 64 65 20 63 61 75 73 65 73 20 74   opcode causes t
8710: 68 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  he sqlite3_step(
8720: 29 20 63 61 6c 6c 20 74 6f 20 74 65 72 6d 69 6e  ) call to termin
8730: 61 74 65 0a 2a 2a 20 77 69 74 68 20 61 6e 20 53  ate.** with an S
8740: 51 4c 49 54 45 5f 52 4f 57 20 72 65 74 75 72 6e  QLITE_ROW return
8750: 20 63 6f 64 65 20 61 6e 64 20 69 74 20 73 65 74   code and it set
8760: 73 20 75 70 20 74 68 65 20 73 71 6c 69 74 65 33  s up the sqlite3
8770: 5f 73 74 6d 74 0a 2a 2a 20 73 74 72 75 63 74 75  _stmt.** structu
8780: 72 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61 63  re to provide ac
8790: 63 65 73 73 20 74 6f 20 74 68 65 20 74 6f 70 20  cess to the top 
87a0: 50 31 20 76 61 6c 75 65 73 20 61 73 20 74 68 65  P1 values as the
87b0: 20 72 65 73 75 6c 74 0a 2a 2a 20 72 6f 77 2e 0a   result.** row..
87c0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 75 6c  */.case OP_Resul
87d0: 74 52 6f 77 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70  tRow: {.  Mem *p
87e0: 4d 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Mem;.  int i;.  
87f0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 73 43  assert( p->nResC
8800: 6f 6c 75 6d 6e 3d 3d 70 4f 70 2d 3e 70 32 20 29  olumn==pOp->p2 )
8810: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
8820: 3e 70 31 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  >p1>0 );.  asser
8830: 74 28 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e  t( pOp->p1+pOp->
8840: 70 32 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29 3b  p2<=p->nMem+1 );
8850: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73  ..  /* If this s
8860: 74 61 74 65 6d 65 6e 74 20 68 61 73 20 76 69 6f  tatement has vio
8870: 6c 61 74 65 64 20 69 6d 6d 65 64 69 61 74 65 20  lated immediate 
8880: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
8890: 74 72 61 69 6e 74 73 2c 20 64 6f 0a 20 20 2a 2a  traints, do.  **
88a0: 20 6e 6f 74 20 72 65 74 75 72 6e 20 74 68 65 20   not return the 
88b0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6d  number of rows m
88c0: 6f 64 69 66 69 65 64 2e 20 41 6e 64 20 64 6f 20  odified. And do 
88d0: 6e 6f 74 20 52 45 4c 45 41 53 45 20 74 68 65 20  not RELEASE the 
88e0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
88f0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 6e  ransaction. It n
8900: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
8910: 64 20 62 61 63 6b 2e 20 20 2a 2f 0a 20 20 69 66  d back.  */.  if
8920: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
8930: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
8940: 65 63 6b 46 6b 28 70 2c 20 30 29 29 20 29 7b 0a  eckFk(p, 0)) ){.
8950: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
8960: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6f 75  flags&SQLITE_Cou
8970: 6e 74 52 6f 77 73 20 29 3b 0a 20 20 20 20 61 73  ntRows );.    as
8980: 73 65 72 74 28 20 70 2d 3e 75 73 65 73 53 74 6d  sert( p->usesStm
8990: 74 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  tJournal );.    
89a0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
89b0: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 43   If the SQLITE_C
89c0: 6f 75 6e 74 52 6f 77 73 20 66 6c 61 67 20 69 73  ountRows flag is
89d0: 20 73 65 74 20 69 6e 20 73 71 6c 69 74 65 33 2e   set in sqlite3.
89e0: 66 6c 61 67 73 20 6d 61 73 6b 2c 20 74 68 65 6e  flags mask, then
89f0: 20 0a 20 20 2a 2a 20 44 4d 4c 20 73 74 61 74 65   .  ** DML state
8a00: 6d 65 6e 74 73 20 69 6e 76 6f 6b 65 20 74 68 69  ments invoke thi
8a10: 73 20 6f 70 63 6f 64 65 20 74 6f 20 72 65 74 75  s opcode to retu
8a20: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
8a30: 20 72 6f 77 73 20 0a 20 20 2a 2a 20 6d 6f 64 69   rows .  ** modi
8a40: 66 69 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  fied to the user
8a50: 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e  . This is the on
8a60: 6c 79 20 77 61 79 20 74 68 61 74 20 61 20 56 4d  ly way that a VM
8a70: 20 74 68 61 74 0a 20 20 2a 2a 20 6f 70 65 6e 73   that.  ** opens
8a80: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
8a90: 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 69 6e 76  nsaction may inv
8aa0: 6f 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65 2e  oke this opcode.
8ab0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63 61  .  **.  ** In ca
8ac0: 73 65 20 74 68 69 73 20 69 73 20 73 75 63 68 20  se this is such 
8ad0: 61 20 73 74 61 74 65 6d 65 6e 74 2c 20 63 6c 6f  a statement, clo
8ae0: 73 65 20 61 6e 79 20 73 74 61 74 65 6d 65 6e 74  se any statement
8af0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
8b00: 2a 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73  * opened by this
8b10: 20 56 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72   VM before retur
8b20: 6e 69 6e 67 20 63 6f 6e 74 72 6f 6c 20 74 6f 20  ning control to 
8b30: 74 68 65 20 75 73 65 72 2e 20 54 68 69 73 20 69  the user. This i
8b40: 73 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65  s to.  ** ensure
8b50: 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2d   that statement-
8b60: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
8b70: 20 61 6c 77 61 79 73 20 6e 65 73 74 65 64 2c 20   always nested, 
8b80: 6e 6f 74 20 6f 76 65 72 6c 61 70 70 69 6e 67 2e  not overlapping.
8b90: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 65  .  ** If the ope
8ba0: 6e 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  n statement-tran
8bb0: 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63  saction is not c
8bc0: 6c 6f 73 65 64 20 68 65 72 65 2c 20 74 68 65 6e  losed here, then
8bd0: 20 74 68 65 20 75 73 65 72 0a 20 20 2a 2a 20 6d   the user.  ** m
8be0: 61 79 20 73 74 65 70 20 61 6e 6f 74 68 65 72 20  ay step another 
8bf0: 56 4d 20 74 68 61 74 20 6f 70 65 6e 73 20 69 74  VM that opens it
8c00: 73 20 6f 77 6e 20 73 74 61 74 65 6d 65 6e 74 20  s own statement 
8c10: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
8c20: 73 0a 20 20 2a 2a 20 6d 61 79 20 6c 65 61 64 20  s.  ** may lead 
8c30: 74 6f 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 73  to overlapping s
8c40: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
8c50: 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
8c60: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   The statement t
8c70: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65  ransaction is ne
8c80: 76 65 72 20 61 20 74 6f 70 2d 6c 65 76 65 6c 20  ver a top-level 
8c90: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 48 65  transaction.  He
8ca0: 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 52 45 4c  nce.  ** the REL
8cb0: 45 41 53 45 20 63 61 6c 6c 20 62 65 6c 6f 77 20  EASE call below 
8cc0: 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a  can never fail..
8cd0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
8ce0: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->iStatement==0 
8cf0: 7c 7c 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  || db->flags&SQL
8d00: 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 3b  ITE_CountRows );
8d10: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
8d20: 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
8d30: 74 28 70 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  t(p, SAVEPOINT_R
8d40: 45 4c 45 41 53 45 29 3b 0a 20 20 69 66 28 20 4e  ELEASE);.  if( N
8d50: 45 56 45 52 28 72 63 21 3d 53 51 4c 49 54 45 5f  EVER(rc!=SQLITE_
8d60: 4f 4b 29 20 29 7b 0a 20 20 20 20 62 72 65 61 6b  OK) ){.    break
8d70: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 76 61  ;.  }..  /* Inva
8d80: 6c 69 64 61 74 65 20 61 6c 6c 20 65 70 68 65 6d  lidate all ephem
8d90: 65 72 61 6c 20 63 75 72 73 6f 72 20 72 6f 77 20  eral cursor row 
8da0: 63 61 63 68 65 73 20 2a 2f 0a 20 20 70 2d 3e 63  caches */.  p->c
8db0: 61 63 68 65 43 74 72 20 3d 20 28 70 2d 3e 63 61  acheCtr = (p->ca
8dc0: 63 68 65 43 74 72 20 2b 20 32 29 7c 31 3b 0a 0a  cheCtr + 2)|1;..
8dd0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
8de0: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
8df0: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 61 72  e current row ar
8e00: 65 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  e \000 terminate
8e10: 64 0a 20 20 2a 2a 20 61 6e 64 20 68 61 76 65 20  d.  ** and have 
8e20: 61 6e 20 61 73 73 69 67 6e 65 64 20 74 79 70 65  an assigned type
8e30: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
8e40: 72 65 20 64 65 2d 65 70 68 65 6d 65 72 61 6c 69  re de-ephemerali
8e50: 7a 65 64 20 61 73 0a 20 20 2a 2a 20 61 73 20 73  zed as.  ** as s
8e60: 69 64 65 20 65 66 66 65 63 74 2e 0a 20 20 2a 2f  ide effect..  */
8e70: 0a 20 20 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65  .  pMem = p->pRe
8e80: 73 75 6c 74 53 65 74 20 3d 20 26 61 4d 65 6d 5b  sultSet = &aMem[
8e90: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 66 6f 72 28  pOp->p1];.  for(
8ea0: 69 3d 30 3b 20 69 3c 70 4f 70 2d 3e 70 32 3b 20  i=0; i<pOp->p2; 
8eb0: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
8ec0: 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 70 4d  ( memIsValid(&pM
8ed0: 65 6d 5b 69 5d 29 20 29 3b 0a 20 20 20 20 44 65  em[i]) );.    De
8ee0: 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 26 70 4d  ephemeralize(&pM
8ef0: 65 6d 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65  em[i]);.    asse
8f00: 72 74 28 20 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61  rt( (pMem[i].fla
8f10: 67 73 20 26 20 4d 45 4d 5f 45 70 68 65 6d 29 3d  gs & MEM_Ephem)=
8f20: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =0.            |
8f30: 7c 20 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73  | (pMem[i].flags
8f40: 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f   & (MEM_Str|MEM_
8f50: 42 6c 6f 62 29 29 3d 3d 30 20 29 3b 0a 20 20 20  Blob))==0 );.   
8f60: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e   sqlite3VdbeMemN
8f70: 75 6c 54 65 72 6d 69 6e 61 74 65 28 26 70 4d 65  ulTerminate(&pMe
8f80: 6d 5b 69 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74  m[i]);.    sqlit
8f90: 65 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79  e3VdbeMemStoreTy
8fa0: 70 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20  pe(&pMem[i]);.  
8fb0: 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
8fc0: 28 70 4f 70 2d 3e 70 31 2b 69 2c 20 26 70 4d 65  (pOp->p1+i, &pMe
8fd0: 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  m[i]);.  }.  if(
8fe0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
8ff0: 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  d ) goto no_mem;
9000: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 53 51  ..  /* Return SQ
9010: 4c 49 54 45 5f 52 4f 57 0a 20 20 2a 2f 0a 20 20  LITE_ROW.  */.  
9020: 70 2d 3e 70 63 20 3d 20 70 63 20 2b 20 31 3b 0a  p->pc = pc + 1;.
9030: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
9040: 57 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 72  W;.  goto vdbe_r
9050: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  eturn;.}../* Opc
9060: 6f 64 65 3a 20 43 6f 6e 63 61 74 20 50 31 20 50  ode: Concat P1 P
9070: 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41  2 P3 * *.**.** A
9080: 64 64 20 74 68 65 20 74 65 78 74 20 69 6e 20 72  dd the text in r
9090: 65 67 69 73 74 65 72 20 50 31 20 6f 6e 74 6f 20  egister P1 onto 
90a0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74  the end of the t
90b0: 65 78 74 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74  ext in.** regist
90c0: 65 72 20 50 32 20 61 6e 64 20 73 74 6f 72 65 20  er P2 and store 
90d0: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65  the result in re
90e0: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66  gister P3..** If
90f0: 20 65 69 74 68 65 72 20 74 68 65 20 50 31 20 6f   either the P1 o
9100: 72 20 50 32 20 74 65 78 74 20 61 72 65 20 4e 55  r P2 text are NU
9110: 4c 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 4e 55  LL then store NU
9120: 4c 4c 20 69 6e 20 50 33 2e 0a 2a 2a 0a 2a 2a 20  LL in P3..**.** 
9130: 20 20 50 33 20 3d 20 50 32 20 7c 7c 20 50 31 0a    P3 = P2 || P1.
9140: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  **.** It is ille
9150: 67 61 6c 20 66 6f 72 20 50 31 20 61 6e 64 20 50  gal for P1 and P
9160: 33 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  3 to be the same
9170: 20 72 65 67 69 73 74 65 72 2e 20 53 6f 6d 65 74   register. Somet
9180: 69 6d 65 73 2c 0a 2a 2a 20 69 66 20 50 33 20 69  imes,.** if P3 i
9190: 73 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73  s the same regis
91a0: 74 65 72 20 61 73 20 50 32 2c 20 74 68 65 20 69  ter as P2, the i
91b0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
91c0: 20 61 62 6c 65 0a 2a 2a 20 74 6f 20 61 76 6f 69   able.** to avoi
91d0: 64 20 61 20 6d 65 6d 63 70 79 28 29 2e 0a 2a 2f  d a memcpy()..*/
91e0: 0a 63 61 73 65 20 4f 50 5f 43 6f 6e 63 61 74 3a  .case OP_Concat:
91f0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {           /* 
9200: 73 61 6d 65 20 61 73 20 54 4b 5f 43 4f 4e 43 41  same as TK_CONCA
9210: 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  T, in1, in2, out
9220: 33 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74 65  3 */.  i64 nByte
9230: 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  ;..  pIn1 = &aMe
9240: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49  m[pOp->p1];.  pI
9250: 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n2 = &aMem[pOp->
9260: 70 32 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61  p2];.  pOut = &a
9270: 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
9280: 61 73 73 65 72 74 28 20 70 49 6e 31 21 3d 70 4f  assert( pIn1!=pO
9290: 75 74 20 29 3b 0a 20 20 69 66 28 20 28 70 49 6e  ut );.  if( (pIn
92a0: 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d  1->flags | pIn2-
92b0: 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 4e 75  >flags) & MEM_Nu
92c0: 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ll ){.    sqlite
92d0: 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
92e0: 70 4f 75 74 29 3b 0a 20 20 20 20 62 72 65 61 6b  pOut);.    break
92f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 61  ;.  }.  if( Expa
9300: 6e 64 42 6c 6f 62 28 70 49 6e 31 29 20 7c 7c 20  ndBlob(pIn1) || 
9310: 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29  ExpandBlob(pIn2)
9320: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
9330: 20 20 53 74 72 69 6e 67 69 66 79 28 70 49 6e 31    Stringify(pIn1
9340: 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 53  , encoding);.  S
9350: 74 72 69 6e 67 69 66 79 28 70 49 6e 32 2c 20 65  tringify(pIn2, e
9360: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 6e 42 79 74  ncoding);.  nByt
9370: 65 20 3d 20 70 49 6e 31 2d 3e 6e 20 2b 20 70 49  e = pIn1->n + pI
9380: 6e 32 2d 3e 6e 3b 0a 20 20 69 66 28 20 6e 42 79  n2->n;.  if( nBy
9390: 74 65 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  te>db->aLimit[SQ
93a0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
93b0: 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  H] ){.    goto t
93c0: 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 4d 65  oo_big;.  }.  Me
93d0: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
93e0: 74 2c 20 4d 45 4d 5f 53 74 72 29 3b 0a 20 20 69  t, MEM_Str);.  i
93f0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
9400: 6d 47 72 6f 77 28 70 4f 75 74 2c 20 28 69 6e 74  mGrow(pOut, (int
9410: 29 6e 42 79 74 65 2b 32 2c 20 70 4f 75 74 3d 3d  )nByte+2, pOut==
9420: 70 49 6e 32 29 20 29 7b 0a 20 20 20 20 67 6f 74  pIn2) ){.    got
9430: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20  o no_mem;.  }.  
9440: 69 66 28 20 70 4f 75 74 21 3d 70 49 6e 32 20 29  if( pOut!=pIn2 )
9450: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75  {.    memcpy(pOu
9460: 74 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 7a 2c 20 70  t->z, pIn2->z, p
9470: 49 6e 32 2d 3e 6e 29 3b 0a 20 20 7d 0a 20 20 6d  In2->n);.  }.  m
9480: 65 6d 63 70 79 28 26 70 4f 75 74 2d 3e 7a 5b 70  emcpy(&pOut->z[p
9490: 49 6e 32 2d 3e 6e 5d 2c 20 70 49 6e 31 2d 3e 7a  In2->n], pIn1->z
94a0: 2c 20 70 49 6e 31 2d 3e 6e 29 3b 0a 20 20 70 4f  , pIn1->n);.  pO
94b0: 75 74 2d 3e 7a 5b 6e 42 79 74 65 5d 20 3d 20 30  ut->z[nByte] = 0
94c0: 3b 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74  ;.  pOut->z[nByt
94d0: 65 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 4f 75 74  e+1] = 0;.  pOut
94e0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54  ->flags |= MEM_T
94f0: 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d  erm;.  pOut->n =
9500: 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a 20 20 70   (int)nByte;.  p
9510: 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64  Out->enc = encod
9520: 69 6e 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  ing;.  UPDATE_MA
9530: 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29  X_BLOBSIZE(pOut)
9540: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
9550: 20 4f 70 63 6f 64 65 3a 20 41 64 64 20 50 31 20   Opcode: Add P1 
9560: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
9570: 41 64 64 20 74 68 65 20 76 61 6c 75 65 20 69 6e  Add the value in
9580: 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20   register P1 to 
9590: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
95a0: 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20  ister P2.** and 
95b0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
95c0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
95d0: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e  .** If either in
95e0: 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  put is NULL, the
95f0: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
9600: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d  .*/./* Opcode: M
9610: 75 6c 74 69 70 6c 79 20 50 31 20 50 32 20 50 33  ultiply P1 P2 P3
9620: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4d 75   * *.**.**.** Mu
9630: 6c 74 69 70 6c 79 20 74 68 65 20 76 61 6c 75 65  ltiply the value
9640: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
9650: 62 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  by the value in 
9660: 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61  register P2.** a
9670: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
9680: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ult in register 
9690: 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  P3..** If either
96a0: 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20   input is NULL, 
96b0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
96c0: 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  LL..*/./* Opcode
96d0: 3a 20 53 75 62 74 72 61 63 74 20 50 31 20 50 32  : Subtract P1 P2
96e0: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 75   P3 * *.**.** Su
96f0: 62 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  btract the value
9700: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
9710: 66 72 6f 6d 20 74 68 65 20 76 61 6c 75 65 20 69  from the value i
9720: 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a  n register P2.**
9730: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
9740: 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65  esult in registe
9750: 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68  r P3..** If eith
9760: 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c  er input is NULL
9770: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
9780: 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  NULL..*/./* Opco
9790: 64 65 3a 20 44 69 76 69 64 65 20 50 31 20 50 32  de: Divide P1 P2
97a0: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 69   P3 * *.**.** Di
97b0: 76 69 64 65 20 74 68 65 20 76 61 6c 75 65 20 69  vide the value i
97c0: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 62 79  n register P1 by
97d0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
97e0: 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64  gister P2.** and
97f0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
9800: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  t in register P3
9810: 20 28 50 33 3d 50 32 2f 50 31 29 2e 20 49 66 20   (P3=P2/P1). If 
9820: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 0a 2a 2a  the value in .**
9830: 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20   register P1 is 
9840: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 72  zero, then the r
9850: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 49  esult is NULL. I
9860: 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69  f either input i
9870: 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20  s .** NULL, the 
9880: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
9890: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  */./* Opcode: Re
98a0: 6d 61 69 6e 64 65 72 20 50 31 20 50 32 20 50 33  mainder P1 P2 P3
98b0: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75   * *.**.** Compu
98c0: 74 65 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  te the remainder
98d0: 20 61 66 74 65 72 20 69 6e 74 65 67 65 72 20 64   after integer d
98e0: 69 76 69 73 69 6f 6e 20 6f 66 20 74 68 65 20 76  ivision of the v
98f0: 61 6c 75 65 20 69 6e 0a 2a 2a 20 72 65 67 69 73  alue in.** regis
9900: 74 65 72 20 50 31 20 62 79 20 74 68 65 20 76 61  ter P1 by the va
9910: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
9920: 50 32 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  P2 and store the
9930: 20 72 65 73 75 6c 74 20 69 6e 20 50 33 2e 20 0a   result in P3. .
9940: 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  ** If the value 
9950: 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 20 69  in register P2 i
9960: 73 20 7a 65 72 6f 20 74 68 65 20 72 65 73 75 6c  s zero the resul
9970: 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 66  t is NULL..** If
9980: 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
9990: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
99a0: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
99b0: 63 61 73 65 20 4f 50 5f 41 64 64 3a 20 20 20 20  case OP_Add:    
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
99d0: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 50 4c 55  * same as TK_PLU
99e0: 53 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  S, in1, in2, out
99f0: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 75 62  3 */.case OP_Sub
9a00: 74 72 61 63 74 3a 20 20 20 20 20 20 20 20 20 20  tract:          
9a10: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
9a20: 4b 5f 4d 49 4e 55 53 2c 20 69 6e 31 2c 20 69 6e  K_MINUS, in1, in
9a30: 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
9a40: 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20  OP_Multiply:    
9a50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
9a60: 65 20 61 73 20 54 4b 5f 53 54 41 52 2c 20 69 6e  e as TK_STAR, in
9a70: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
9a80: 63 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20  case OP_Divide: 
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9aa0: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 4c 41  * same as TK_SLA
9ab0: 53 48 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  SH, in1, in2, ou
9ac0: 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65  t3 */.case OP_Re
9ad0: 6d 61 69 6e 64 65 72 3a 20 7b 20 20 20 20 20 20  mainder: {      
9ae0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
9af0: 54 4b 5f 52 45 4d 2c 20 69 6e 31 2c 20 69 6e 32  TK_REM, in1, in2
9b00: 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 6e 74 20  , out3 */.  int 
9b10: 66 6c 61 67 73 3b 20 20 20 20 20 20 2f 2a 20 43  flags;      /* C
9b20: 6f 6d 62 69 6e 65 64 20 4d 45 4d 5f 2a 20 66 6c  ombined MEM_* fl
9b30: 61 67 73 20 66 72 6f 6d 20 62 6f 74 68 20 69 6e  ags from both in
9b40: 70 75 74 73 20 2a 2f 0a 20 20 69 36 34 20 69 41  puts */.  i64 iA
9b50: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74  ;         /* Int
9b60: 65 67 65 72 20 76 61 6c 75 65 20 6f 66 20 6c 65  eger value of le
9b70: 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ft operand */.  
9b80: 69 36 34 20 69 42 3b 20 20 20 20 20 20 20 20 20  i64 iB;         
9b90: 2f 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65  /* Integer value
9ba0: 20 6f 66 20 72 69 67 68 74 20 6f 70 65 72 61 6e   of right operan
9bb0: 64 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 41  d */.  double rA
9bc0: 3b 20 20 20 20 20 20 2f 2a 20 52 65 61 6c 20 76  ;      /* Real v
9bd0: 61 6c 75 65 20 6f 66 20 6c 65 66 74 20 6f 70 65  alue of left ope
9be0: 72 61 6e 64 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  rand */.  double
9bf0: 20 72 42 3b 20 20 20 20 20 20 2f 2a 20 52 65 61   rB;      /* Rea
9c00: 6c 20 76 61 6c 75 65 20 6f 66 20 72 69 67 68 74  l value of right
9c10: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 0a 20 20 70   operand */..  p
9c20: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
9c30: 3e 70 31 5d 3b 0a 20 20 61 70 70 6c 79 4e 75 6d  >p1];.  applyNum
9c40: 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 49 6e  ericAffinity(pIn
9c50: 31 29 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d  1);.  pIn2 = &aM
9c60: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61  em[pOp->p2];.  a
9c70: 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e  pplyNumericAffin
9c80: 69 74 79 28 70 49 6e 32 29 3b 0a 20 20 70 4f 75  ity(pIn2);.  pOu
9c90: 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
9ca0: 33 5d 3b 0a 20 20 66 6c 61 67 73 20 3d 20 70 49  3];.  flags = pI
9cb0: 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32  n1->flags | pIn2
9cc0: 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 28  ->flags;.  if( (
9cd0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
9ce0: 29 21 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74  )!=0 ) goto arit
9cf0: 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73  hmetic_result_is
9d00: 5f 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 28 70 49  _null;.  if( (pI
9d10: 6e 31 2d 3e 66 6c 61 67 73 20 26 20 70 49 6e 32  n1->flags & pIn2
9d20: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
9d30: 74 29 3d 3d 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  t)==MEM_Int ){. 
9d40: 20 20 20 69 41 20 3d 20 70 49 6e 31 2d 3e 75 2e     iA = pIn1->u.
9d50: 69 3b 0a 20 20 20 20 69 42 20 3d 20 70 49 6e 32  i;.    iB = pIn2
9d60: 2d 3e 75 2e 69 3b 0a 20 20 20 20 73 77 69 74 63  ->u.i;.    switc
9d70: 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29  h( pOp->opcode )
9d80: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  {.      case OP_
9d90: 41 64 64 3a 20 20 20 20 20 20 20 69 66 28 20 73  Add:       if( s
9da0: 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28 26  qlite3AddInt64(&
9db0: 69 42 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 70  iB,iA) ) goto fp
9dc0: 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20  _math;  break;. 
9dd0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 75 62       case OP_Sub
9de0: 74 72 61 63 74 3a 20 20 69 66 28 20 73 71 6c 69  tract:  if( sqli
9df0: 74 65 33 53 75 62 49 6e 74 36 34 28 26 69 42 2c  te3SubInt64(&iB,
9e00: 69 41 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61  iA) ) goto fp_ma
9e10: 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  th;  break;.    
9e20: 20 20 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70    case OP_Multip
9e30: 6c 79 3a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ly:  if( sqlite3
9e40: 4d 75 6c 49 6e 74 36 34 28 26 69 42 2c 69 41 29  MulInt64(&iB,iA)
9e50: 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b   ) goto fp_math;
9e60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9e70: 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 7b  ase OP_Divide: {
9e80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d  .        if( iA=
9e90: 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d  =0 ) goto arithm
9ea0: 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e  etic_result_is_n
9eb0: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ull;.        if(
9ec0: 20 69 41 3d 3d 2d 31 20 26 26 20 69 42 3d 3d 53   iA==-1 && iB==S
9ed0: 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29 20  MALLEST_INT64 ) 
9ee0: 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 0a 20 20  goto fp_math;.  
9ef0: 20 20 20 20 20 20 69 42 20 2f 3d 20 69 41 3b 0a        iB /= iA;.
9f00: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9f10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
9f20: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
9f30: 69 66 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f  if( iA==0 ) goto
9f40: 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75   arithmetic_resu
9f50: 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20  lt_is_null;.    
9f60: 20 20 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 29      if( iA==-1 )
9f70: 20 69 41 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   iA = 1;.       
9f80: 20 69 42 20 25 3d 20 69 41 3b 0a 20 20 20 20 20   iB %= iA;.     
9f90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9fa0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74  }.    }.    pOut
9fb0: 2d 3e 75 2e 69 20 3d 20 69 42 3b 0a 20 20 20 20  ->u.i = iB;.    
9fc0: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
9fd0: 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20  Out, MEM_Int);. 
9fe0: 20 7d 65 6c 73 65 7b 0a 66 70 5f 6d 61 74 68 3a   }else{.fp_math:
9ff0: 0a 20 20 20 20 72 41 20 3d 20 73 71 6c 69 74 65  .    rA = sqlite
a000: 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28 70  3VdbeRealValue(p
a010: 49 6e 31 29 3b 0a 20 20 20 20 72 42 20 3d 20 73  In1);.    rB = s
a020: 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56 61  qlite3VdbeRealVa
a030: 6c 75 65 28 70 49 6e 32 29 3b 0a 20 20 20 20 73  lue(pIn2);.    s
a040: 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f  witch( pOp->opco
a050: 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  de ){.      case
a060: 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20 20   OP_Add:        
a070: 20 72 42 20 2b 3d 20 72 41 3b 20 20 20 20 20 20   rB += rA;      
a080: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a090: 73 65 20 4f 50 5f 53 75 62 74 72 61 63 74 3a 20  se OP_Subtract: 
a0a0: 20 20 20 72 42 20 2d 3d 20 72 41 3b 20 20 20 20     rB -= rA;    
a0b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a0c0: 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79  case OP_Multiply
a0d0: 3a 20 20 20 20 72 42 20 2a 3d 20 72 41 3b 20 20  :    rB *= rA;  
a0e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a0f0: 20 20 63 61 73 65 20 4f 50 5f 44 69 76 69 64 65    case OP_Divide
a100: 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 28  : {.        /* (
a110: 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65  double)0 In case
a120: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   of SQLITE_OMIT_
a130: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e  FLOATING_POINT..
a140: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
a150: 20 72 41 3d 3d 28 64 6f 75 62 6c 65 29 30 20 29   rA==(double)0 )
a160: 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63   goto arithmetic
a170: 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b  _result_is_null;
a180: 0a 20 20 20 20 20 20 20 20 72 42 20 2f 3d 20 72  .        rB /= r
a190: 41 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  A;.        break
a1a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a1b0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
a1c0: 20 20 20 69 41 20 3d 20 28 69 36 34 29 72 41 3b     iA = (i64)rA;
a1d0: 0a 20 20 20 20 20 20 20 20 69 42 20 3d 20 28 69  .        iB = (i
a1e0: 36 34 29 72 42 3b 0a 20 20 20 20 20 20 20 20 69  64)rB;.        i
a1f0: 66 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20  f( iA==0 ) goto 
a200: 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c  arithmetic_resul
a210: 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20  t_is_null;.     
a220: 20 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 29 20     if( iA==-1 ) 
a230: 69 41 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  iA = 1;.        
a240: 72 42 20 3d 20 28 64 6f 75 62 6c 65 29 28 69 42  rB = (double)(iB
a250: 20 25 20 69 41 29 3b 0a 20 20 20 20 20 20 20 20   % iA);.        
a260: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
a270: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
a280: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
a290: 5f 50 4f 49 4e 54 0a 20 20 20 20 70 4f 75 74 2d  _POINT.    pOut-
a2a0: 3e 75 2e 69 20 3d 20 72 42 3b 0a 20 20 20 20 4d  >u.i = rB;.    M
a2b0: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
a2c0: 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 23 65  ut, MEM_Int);.#e
a2d0: 6c 73 65 0a 20 20 20 20 69 66 28 20 73 71 6c 69  lse.    if( sqli
a2e0: 74 65 33 49 73 4e 61 4e 28 72 42 29 20 29 7b 0a  te3IsNaN(rB) ){.
a2f0: 20 20 20 20 20 20 67 6f 74 6f 20 61 72 69 74 68        goto arith
a300: 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f  metic_result_is_
a310: 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  null;.    }.    
a320: 70 4f 75 74 2d 3e 72 20 3d 20 72 42 3b 0a 20 20  pOut->r = rB;.  
a330: 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
a340: 28 70 4f 75 74 2c 20 4d 45 4d 5f 52 65 61 6c 29  (pOut, MEM_Real)
a350: 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
a360: 20 26 20 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20   & MEM_Real)==0 
a370: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a380: 56 64 62 65 49 6e 74 65 67 65 72 41 66 66 69 6e  VdbeIntegerAffin
a390: 69 74 79 28 70 4f 75 74 29 3b 0a 20 20 20 20 7d  ity(pOut);.    }
a3a0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 62 72  .#endif.  }.  br
a3b0: 65 61 6b 3b 0a 0a 61 72 69 74 68 6d 65 74 69 63  eak;..arithmetic
a3c0: 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3a  _result_is_null:
a3d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
a3e0: 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a  mSetNull(pOut);.
a3f0: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
a400: 70 63 6f 64 65 3a 20 43 6f 6c 6c 53 65 71 20 2a  pcode: CollSeq *
a410: 20 2a 20 50 34 0a 2a 2a 0a 2a 2a 20 50 34 20 69   * P4.**.** P4 i
a420: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
a430: 20 43 6f 6c 6c 53 65 71 20 73 74 72 75 63 74 2e   CollSeq struct.
a440: 20 49 66 20 74 68 65 20 6e 65 78 74 20 63 61 6c   If the next cal
a450: 6c 20 74 6f 20 61 20 75 73 65 72 20 66 75 6e 63  l to a user func
a460: 74 69 6f 6e 0a 2a 2a 20 6f 72 20 61 67 67 72 65  tion.** or aggre
a470: 67 61 74 65 20 63 61 6c 6c 73 20 73 71 6c 69 74  gate calls sqlit
a480: 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71  e3GetFuncCollSeq
a490: 28 29 2c 20 74 68 69 73 20 63 6f 6c 6c 61 74 69  (), this collati
a4a0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 6c 6c  on sequence will
a4b0: 0a 2a 2a 20 62 65 20 72 65 74 75 72 6e 65 64 2e  .** be returned.
a4c0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
a4d0: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69   the built-in mi
a4e0: 6e 28 29 2c 20 6d 61 78 28 29 20 61 6e 64 20 6e  n(), max() and n
a4f0: 75 6c 6c 69 66 28 29 0a 2a 2a 20 66 75 6e 63 74  ullif().** funct
a500: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ions..**.** The 
a510: 69 6e 74 65 72 66 61 63 65 20 75 73 65 64 20 62  interface used b
a520: 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  y the implementa
a530: 74 69 6f 6e 20 6f 66 20 74 68 65 20 61 66 6f 72  tion of the afor
a540: 65 6d 65 6e 74 69 6f 6e 65 64 20 66 75 6e 63 74  ementioned funct
a550: 69 6f 6e 73 0a 2a 2a 20 74 6f 20 72 65 74 72 69  ions.** to retri
a560: 65 76 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  eve the collatio
a570: 6e 20 73 65 71 75 65 6e 63 65 20 73 65 74 20 62  n sequence set b
a580: 79 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73  y this opcode is
a590: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a   not available.*
a5a0: 2a 20 70 75 62 6c 69 63 6c 79 2c 20 6f 6e 6c 79  * publicly, only
a5b0: 20 74 6f 20 75 73 65 72 20 66 75 6e 63 74 69 6f   to user functio
a5c0: 6e 73 20 64 65 66 69 6e 65 64 20 69 6e 20 66 75  ns defined in fu
a5d0: 6e 63 2e 63 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  nc.c..*/.case OP
a5e0: 5f 43 6f 6c 6c 53 65 71 3a 20 7b 0a 20 20 61 73  _CollSeq: {.  as
a5f0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
a600: 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51 20 29 3b  e==P4_COLLSEQ );
a610: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
a620: 4f 70 63 6f 64 65 3a 20 46 75 6e 63 74 69 6f 6e  Opcode: Function
a630: 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
a640: 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 61 20 75  **.** Invoke a u
a650: 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 50 34  ser function (P4
a660: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
a670: 20 61 20 46 75 6e 63 74 69 6f 6e 20 73 74 72 75   a Function stru
a680: 63 74 75 72 65 20 74 68 61 74 0a 2a 2a 20 64 65  cture that.** de
a690: 66 69 6e 65 73 20 74 68 65 20 66 75 6e 63 74 69  fines the functi
a6a0: 6f 6e 29 20 77 69 74 68 20 50 35 20 61 72 67 75  on) with P5 argu
a6b0: 6d 65 6e 74 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ments taken from
a6c0: 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 64   register P2 and
a6d0: 0a 2a 2a 20 73 75 63 63 65 73 73 6f 72 73 2e 20  .** successors. 
a6e0: 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   The result of t
a6f0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  he function is s
a700: 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
a710: 72 20 50 33 2e 0a 2a 2a 20 52 65 67 69 73 74 65  r P3..** Registe
a720: 72 20 50 33 20 6d 75 73 74 20 6e 6f 74 20 62 65  r P3 must not be
a730: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 75 6e 63   one of the func
a740: 74 69 6f 6e 20 69 6e 70 75 74 73 2e 0a 2a 2a 0a  tion inputs..**.
a750: 2a 2a 20 50 31 20 69 73 20 61 20 33 32 2d 62 69  ** P1 is a 32-bi
a760: 74 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61  t bitmask indica
a770: 74 69 6e 67 20 77 68 65 74 68 65 72 20 6f 72 20  ting whether or 
a780: 6e 6f 74 20 65 61 63 68 20 61 72 67 75 6d 65 6e  not each argumen
a790: 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66 75 6e  t to the .** fun
a7a0: 63 74 69 6f 6e 20 77 61 73 20 64 65 74 65 72 6d  ction was determ
a7b0: 69 6e 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 74  ined to be const
a7c0: 61 6e 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  ant at compile t
a7d0: 69 6d 65 2e 20 49 66 20 74 68 65 20 66 69 72 73  ime. If the firs
a7e0: 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 77 61  t.** argument wa
a7f0: 73 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20  s constant then 
a800: 62 69 74 20 30 20 6f 66 20 50 31 20 69 73 20 73  bit 0 of P1 is s
a810: 65 74 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  et. This is used
a820: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a   to determine.**
a830: 20 77 68 65 74 68 65 72 20 6d 65 74 61 20 64 61   whether meta da
a840: 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
a850: 74 68 20 61 20 75 73 65 72 20 66 75 6e 63 74 69  th a user functi
a860: 6f 6e 20 61 72 67 75 6d 65 6e 74 20 75 73 69 6e  on argument usin
a870: 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  g the.** sqlite3
a880: 5f 73 65 74 5f 61 75 78 64 61 74 61 28 29 20 41  _set_auxdata() A
a890: 50 49 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79  PI may be safely
a8a0: 20 72 65 74 61 69 6e 65 64 20 75 6e 74 69 6c 20   retained until 
a8b0: 74 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 76 6f  the next.** invo
a8c0: 63 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 6f  cation of this o
a8d0: 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  pcode..**.** See
a8e0: 20 61 6c 73 6f 3a 20 41 67 67 53 74 65 70 20 61   also: AggStep a
a8f0: 6e 64 20 41 67 67 46 69 6e 61 6c 0a 2a 2f 0a 63  nd AggFinal.*/.c
a900: 61 73 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 3a  ase OP_Function:
a910: 20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65   {.  int i;.  Me
a920: 6d 20 2a 70 41 72 67 3b 0a 20 20 73 71 6c 69 74  m *pArg;.  sqlit
a930: 65 33 5f 63 6f 6e 74 65 78 74 20 63 74 78 3b 0a  e3_context ctx;.
a940: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
a950: 2a 2a 61 70 56 61 6c 3b 0a 20 20 69 6e 74 20 6e  **apVal;.  int n
a960: 3b 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 35  ;..  n = pOp->p5
a970: 3b 0a 20 20 61 70 56 61 6c 20 3d 20 70 2d 3e 61  ;.  apVal = p->a
a980: 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
a990: 61 70 56 61 6c 20 7c 7c 20 6e 3d 3d 30 20 29 3b  apVal || n==0 );
a9a0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
a9b0: 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c  p3>0 && pOp->p3<
a9c0: 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 4f  =p->nMem );.  pO
a9d0: 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
a9e0: 70 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54  p3];.  memAboutT
a9f0: 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29  oChange(p, pOut)
aa00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  ;..  assert( n==
aa10: 30 20 7c 7c 20 28 70 4f 70 2d 3e 70 32 3e 30 20  0 || (pOp->p2>0 
aa20: 26 26 20 70 4f 70 2d 3e 70 32 2b 6e 3c 3d 70 2d  && pOp->p2+n<=p-
aa30: 3e 6e 4d 65 6d 2b 31 29 20 29 3b 0a 20 20 61 73  >nMem+1) );.  as
aa40: 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f  sert( pOp->p3<pO
aa50: 70 2d 3e 70 32 20 7c 7c 20 70 4f 70 2d 3e 70 33  p->p2 || pOp->p3
aa60: 3e 3d 70 4f 70 2d 3e 70 32 2b 6e 20 29 3b 0a 20  >=pOp->p2+n );. 
aa70: 20 70 41 72 67 20 3d 20 26 61 4d 65 6d 5b 70 4f   pArg = &aMem[pO
aa80: 70 2d 3e 70 32 5d 3b 0a 20 20 66 6f 72 28 69 3d  p->p2];.  for(i=
aa90: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 41 72  0; i<n; i++, pAr
aaa0: 67 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  g++){.    assert
aab0: 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 41 72  ( memIsValid(pAr
aac0: 67 29 20 29 3b 0a 20 20 20 20 61 70 56 61 6c 5b  g) );.    apVal[
aad0: 69 5d 20 3d 20 70 41 72 67 3b 0a 20 20 20 20 44  i] = pArg;.    D
aae0: 65 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 70 41  eephemeralize(pA
aaf0: 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
ab00: 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65  VdbeMemStoreType
ab10: 28 70 41 72 67 29 3b 0a 20 20 20 20 52 45 47 49  (pArg);.    REGI
ab20: 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
ab30: 70 32 2b 69 2c 20 70 41 72 67 29 3b 0a 20 20 7d  p2+i, pArg);.  }
ab40: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
ab50: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43  >p4type==P4_FUNC
ab60: 44 45 46 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79  DEF || pOp->p4ty
ab70: 70 65 3d 3d 50 34 5f 56 44 42 45 46 55 4e 43 20  pe==P4_VDBEFUNC 
ab80: 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34  );.  if( pOp->p4
ab90: 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43 44 45 46  type==P4_FUNCDEF
aba0: 20 29 7b 0a 20 20 20 20 63 74 78 2e 70 46 75 6e   ){.    ctx.pFun
abb0: 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  c = pOp->p4.pFun
abc0: 63 3b 0a 20 20 20 20 63 74 78 2e 70 56 64 62 65  c;.    ctx.pVdbe
abd0: 46 75 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Func = 0;.  }els
abe0: 65 7b 0a 20 20 20 20 63 74 78 2e 70 56 64 62 65  e{.    ctx.pVdbe
abf0: 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63  Func = (VdbeFunc
ac00: 2a 29 70 4f 70 2d 3e 70 34 2e 70 56 64 62 65 46  *)pOp->p4.pVdbeF
ac10: 75 6e 63 3b 0a 20 20 20 20 63 74 78 2e 70 46 75  unc;.    ctx.pFu
ac20: 6e 63 20 3d 20 63 74 78 2e 70 56 64 62 65 46 75  nc = ctx.pVdbeFu
ac30: 6e 63 2d 3e 70 46 75 6e 63 3b 0a 20 20 7d 0a 0a  nc->pFunc;.  }..
ac40: 20 20 63 74 78 2e 73 2e 66 6c 61 67 73 20 3d 20    ctx.s.flags = 
ac50: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 63 74 78 2e  MEM_Null;.  ctx.
ac60: 73 2e 64 62 20 3d 20 64 62 3b 0a 20 20 63 74 78  s.db = db;.  ctx
ac70: 2e 73 2e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 63  .s.xDel = 0;.  c
ac80: 74 78 2e 73 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30  tx.s.zMalloc = 0
ac90: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6f 75 74 70  ;..  /* The outp
aca0: 75 74 20 63 65 6c 6c 20 6d 61 79 20 61 6c 72 65  ut cell may alre
acb0: 61 64 79 20 68 61 76 65 20 61 20 62 75 66 66 65  ady have a buffe
acc0: 72 20 61 6c 6c 6f 63 61 74 65 64 2e 20 4d 6f 76  r allocated. Mov
acd0: 65 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  e.  ** the point
ace0: 65 72 20 74 6f 20 63 74 78 2e 73 20 73 6f 20 69  er to ctx.s so i
acf0: 6e 20 63 61 73 65 20 74 68 65 20 75 73 65 72 2d  n case the user-
ad00: 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 75 73 65  function can use
ad10: 0a 20 20 2a 2a 20 74 68 65 20 61 6c 72 65 61 64  .  ** the alread
ad20: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  y allocated buff
ad30: 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6c  er instead of al
ad40: 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 6f  locating a new o
ad50: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ne..  */.  sqlit
ad60: 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 26 63  e3VdbeMemMove(&c
ad70: 74 78 2e 73 2c 20 70 4f 75 74 29 3b 0a 20 20 4d  tx.s, pOut);.  M
ad80: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 26 63  emSetTypeFlag(&c
ad90: 74 78 2e 73 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  tx.s, MEM_Null);
ada0: 0a 0a 20 20 63 74 78 2e 69 73 45 72 72 6f 72 20  ..  ctx.isError 
adb0: 3d 20 30 3b 0a 20 20 69 66 28 20 63 74 78 2e 70  = 0;.  if( ctx.p
adc0: 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26 20 53 51  Func->flags & SQ
add0: 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
ade0: 4c 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  LL ){.    assert
adf0: 28 20 70 4f 70 3e 61 4f 70 20 29 3b 0a 20 20 20  ( pOp>aOp );.   
ae00: 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
ae10: 2e 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c  .p4type==P4_COLL
ae20: 53 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  SEQ );.    asser
ae30: 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64  t( pOp[-1].opcod
ae40: 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71 20 29 3b  e==OP_CollSeq );
ae50: 0a 20 20 20 20 63 74 78 2e 70 43 6f 6c 6c 20 3d  .    ctx.pColl =
ae60: 20 70 4f 70 5b 2d 31 5d 2e 70 34 2e 70 43 6f 6c   pOp[-1].p4.pCol
ae70: 6c 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c 61 73  l;.  }.  db->las
ae80: 74 52 6f 77 69 64 20 3d 20 6c 61 73 74 52 6f 77  tRowid = lastRow
ae90: 69 64 3b 0a 20 20 28 2a 63 74 78 2e 70 46 75 6e  id;.  (*ctx.pFun
aea0: 63 2d 3e 78 46 75 6e 63 29 28 26 63 74 78 2c 20  c->xFunc)(&ctx, 
aeb0: 6e 2c 20 61 70 56 61 6c 29 3b 20 2f 2a 20 49 4d  n, apVal); /* IM
aec0: 50 3a 20 52 2d 32 34 35 30 35 2d 32 33 32 33 30  P: R-24505-23230
aed0: 20 2a 2f 0a 20 20 6c 61 73 74 52 6f 77 69 64 20   */.  lastRowid 
aee0: 3d 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b  = db->lastRowid;
aef0: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 61 75  ..  /* If any au
af00: 78 69 6c 69 61 72 79 20 64 61 74 61 20 66 75 6e  xiliary data fun
af10: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
af20: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 69 73 20   called by this 
af30: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2c 0a 20  user function,. 
af40: 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   ** immediately 
af50: 63 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63  call the destruc
af60: 74 6f 72 20 66 6f 72 20 61 6e 79 20 6e 6f 6e 2d  tor for any non-
af70: 73 74 61 74 69 63 20 76 61 6c 75 65 73 2e 0a 20  static values.. 
af80: 20 2a 2f 0a 20 20 69 66 28 20 63 74 78 2e 70 56   */.  if( ctx.pV
af90: 64 62 65 46 75 6e 63 20 29 7b 0a 20 20 20 20 73  dbeFunc ){.    s
afa0: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
afb0: 41 75 78 44 61 74 61 28 63 74 78 2e 70 56 64 62  AuxData(ctx.pVdb
afc0: 65 46 75 6e 63 2c 20 70 4f 70 2d 3e 70 31 29 3b  eFunc, pOp->p1);
afd0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 56 64  .    pOp->p4.pVd
afe0: 62 65 46 75 6e 63 20 3d 20 63 74 78 2e 70 56 64  beFunc = ctx.pVd
aff0: 62 65 46 75 6e 63 3b 0a 20 20 20 20 70 4f 70 2d  beFunc;.    pOp-
b000: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56 44 42  >p4type = P4_VDB
b010: 45 46 55 4e 43 3b 0a 20 20 7d 0a 0a 20 20 69 66  EFUNC;.  }..  if
b020: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
b030: 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 45 76 65  ed ){.    /* Eve
b040: 6e 20 74 68 6f 75 67 68 20 61 20 6d 61 6c 6c 6f  n though a mallo
b050: 63 28 29 20 68 61 73 20 66 61 69 6c 65 64 2c 20  c() has failed, 
b060: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
b070: 6f 6e 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  on of the.    **
b080: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 6d   user function m
b090: 61 79 20 68 61 76 65 20 63 61 6c 6c 65 64 20 61  ay have called a
b0a0: 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  n sqlite3_result
b0b0: 5f 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 0a  _XXX() function.
b0c0: 20 20 20 20 2a 2a 20 74 6f 20 72 65 74 75 72 6e      ** to return
b0d0: 20 61 20 76 61 6c 75 65 2e 20 54 68 65 20 66 6f   a value. The fo
b0e0: 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 72 65 6c  llowing call rel
b0f0: 65 61 73 65 73 20 61 6e 79 20 72 65 73 6f 75 72  eases any resour
b100: 63 65 73 0a 20 20 20 20 2a 2a 20 61 73 73 6f 63  ces.    ** assoc
b110: 69 61 74 65 64 20 77 69 74 68 20 73 75 63 68 20  iated with such 
b120: 61 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a  a value..    */.
b130: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
b140: 65 6d 52 65 6c 65 61 73 65 28 26 63 74 78 2e 73  emRelease(&ctx.s
b150: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  );.    goto no_m
b160: 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  em;.  }..  /* If
b170: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65   the function re
b180: 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 2c  turned an error,
b190: 20 74 68 72 6f 77 20 61 6e 20 65 78 63 65 70 74   throw an except
b1a0: 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 63 74 78  ion */.  if( ctx
b1b0: 2e 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  .isError ){.    
b1c0: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
b1d0: 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
b1e0: 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  , "%s", sqlite3_
b1f0: 76 61 6c 75 65 5f 74 65 78 74 28 26 63 74 78 2e  value_text(&ctx.
b200: 73 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 74  s));.    rc = ct
b210: 78 2e 69 73 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a  x.isError;.  }..
b220: 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 65    /* Copy the re
b230: 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63  sult of the func
b240: 74 69 6f 6e 20 69 6e 74 6f 20 72 65 67 69 73 74  tion into regist
b250: 65 72 20 50 33 20 2a 2f 0a 20 20 73 71 6c 69 74  er P3 */.  sqlit
b260: 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f  e3VdbeChangeEnco
b270: 64 69 6e 67 28 26 63 74 78 2e 73 2c 20 65 6e 63  ding(&ctx.s, enc
b280: 6f 64 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  oding);.  sqlite
b290: 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 70 4f 75  3VdbeMemMove(pOu
b2a0: 74 2c 20 26 63 74 78 2e 73 29 3b 0a 20 20 69 66  t, &ctx.s);.  if
b2b0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
b2c0: 54 6f 6f 42 69 67 28 70 4f 75 74 29 20 29 7b 0a  TooBig(pOut) ){.
b2d0: 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67      goto too_big
b2e0: 3b 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 2f  ;.  }..#if 0.  /
b2f0: 2a 20 54 68 65 20 61 70 70 2d 64 65 66 69 6e 65  * The app-define
b300: 64 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 64  d function has d
b310: 6f 6e 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68  one something th
b320: 61 74 20 61 73 20 63 61 75 73 65 64 20 74 68 69  at as caused thi
b330: 73 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  s.  ** statement
b340: 20 74 6f 20 65 78 70 69 72 65 2e 20 20 28 50 65   to expire.  (Pe
b350: 72 68 61 70 73 20 74 68 65 20 66 75 6e 63 74 69  rhaps the functi
b360: 6f 6e 20 63 61 6c 6c 65 64 20 73 71 6c 69 74 65  on called sqlite
b370: 33 5f 65 78 65 63 28 29 0a 20 20 2a 2a 20 77 69  3_exec().  ** wi
b380: 74 68 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  th a CREATE TABL
b390: 45 20 73 74 61 74 65 6d 65 6e 74 2e 29 0a 20 20  E statement.).  
b3a0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 69  */.  if( p->expi
b3b0: 72 65 64 20 29 20 72 63 20 3d 20 53 51 4c 49 54  red ) rc = SQLIT
b3c0: 45 5f 41 42 4f 52 54 3b 0a 23 65 6e 64 69 66 0a  E_ABORT;.#endif.
b3d0: 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
b3e0: 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4f 75 74 29  E(pOp->p3, pOut)
b3f0: 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
b400: 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20  LOBSIZE(pOut);. 
b410: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
b420: 63 6f 64 65 3a 20 42 69 74 41 6e 64 20 50 31 20  code: BitAnd P1 
b430: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
b440: 54 61 6b 65 20 74 68 65 20 62 69 74 2d 77 69 73  Take the bit-wis
b450: 65 20 41 4e 44 20 6f 66 20 74 68 65 20 76 61 6c  e AND of the val
b460: 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  ues in register 
b470: 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a  P1 and P2 and.**
b480: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
b490: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  t in register P3
b4a0: 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69  ..** If either i
b4b0: 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  nput is NULL, th
b4c0: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
b4d0: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
b4e0: 42 69 74 4f 72 20 50 31 20 50 32 20 50 33 20 2a  BitOr P1 P2 P3 *
b4f0: 20 2a 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68   *.**.** Take th
b500: 65 20 62 69 74 2d 77 69 73 65 20 4f 52 20 6f 66  e bit-wise OR of
b510: 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72   the values in r
b520: 65 67 69 73 74 65 72 20 50 31 20 61 6e 64 20 50  egister P1 and P
b530: 32 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74  2 and.** store t
b540: 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  he result in reg
b550: 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20  ister P3..** If 
b560: 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20  either input is 
b570: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74  NULL, the result
b580: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20   is NULL..*/./* 
b590: 4f 70 63 6f 64 65 3a 20 53 68 69 66 74 4c 65 66  Opcode: ShiftLef
b5a0: 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  t P1 P2 P3 * *.*
b5b0: 2a 0a 2a 2a 20 53 68 69 66 74 20 74 68 65 20 69  *.** Shift the i
b5c0: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69 6e 20  nteger value in 
b5d0: 72 65 67 69 73 74 65 72 20 50 32 20 74 6f 20 74  register P2 to t
b5e0: 68 65 20 6c 65 66 74 20 62 79 20 74 68 65 0a 2a  he left by the.*
b5f0: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  * number of bits
b600: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
b610: 65 20 69 6e 74 65 67 65 72 20 69 6e 20 72 65 67  e integer in reg
b620: 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20 53 74 6f  ister P1..** Sto
b630: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
b640: 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
b650: 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74   If either input
b660: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   is NULL, the re
b670: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  sult is NULL..*/
b680: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68 69 66  ./* Opcode: Shif
b690: 74 52 69 67 68 74 20 50 31 20 50 32 20 50 33 20  tRight P1 P2 P3 
b6a0: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74 20  * *.**.** Shift 
b6b0: 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
b6c0: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
b6d0: 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 62 79   to the right by
b6e0: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
b6f0: 66 20 62 69 74 73 20 73 70 65 63 69 66 69 65 64  f bits specified
b700: 20 62 79 20 74 68 65 20 69 6e 74 65 67 65 72 20   by the integer 
b710: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a  in register P1..
b720: 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  ** Store the res
b730: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ult in register 
b740: 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  P3..** If either
b750: 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20   input is NULL, 
b760: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
b770: 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42  LL..*/.case OP_B
b780: 69 74 41 6e 64 3a 20 20 20 20 20 20 20 20 20 20  itAnd:          
b790: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
b7a0: 73 20 54 4b 5f 42 49 54 41 4e 44 2c 20 69 6e 31  s TK_BITAND, in1
b7b0: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63  , in2, out3 */.c
b7c0: 61 73 65 20 4f 50 5f 42 69 74 4f 72 3a 20 20 20  ase OP_BitOr:   
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b7e0: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54  * same as TK_BIT
b7f0: 4f 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  OR, in1, in2, ou
b800: 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 68  t3 */.case OP_Sh
b810: 69 66 74 4c 65 66 74 3a 20 20 20 20 20 20 20 20  iftLeft:        
b820: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
b830: 20 54 4b 5f 4c 53 48 49 46 54 2c 20 69 6e 31 2c   TK_LSHIFT, in1,
b840: 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61   in2, out3 */.ca
b850: 73 65 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74  se OP_ShiftRight
b860: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  : {           /*
b870: 20 73 61 6d 65 20 61 73 20 54 4b 5f 52 53 48 49   same as TK_RSHI
b880: 46 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  FT, in1, in2, ou
b890: 74 33 20 2a 2f 0a 20 20 69 36 34 20 69 41 3b 0a  t3 */.  i64 iA;.
b8a0: 20 20 75 36 34 20 75 41 3b 0a 20 20 69 36 34 20    u64 uA;.  i64 
b8b0: 69 42 3b 0a 20 20 75 38 20 6f 70 3b 0a 0a 20 20  iB;.  u8 op;..  
b8c0: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
b8d0: 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20  ->p1];.  pIn2 = 
b8e0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
b8f0: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
b900: 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 28  Op->p3];.  if( (
b910: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49  pIn1->flags | pI
b920: 6e 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d  n2->flags) & MEM
b930: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c  _Null ){.    sql
b940: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
b950: 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20 62 72  ll(pOut);.    br
b960: 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 41 20 3d 20  eak;.  }.  iA = 
b970: 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
b980: 6c 75 65 28 70 49 6e 32 29 3b 0a 20 20 69 42 20  lue(pIn2);.  iB 
b990: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74  = sqlite3VdbeInt
b9a0: 56 61 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 6f  Value(pIn1);.  o
b9b0: 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b  p = pOp->opcode;
b9c0: 0a 20 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 42 69  .  if( op==OP_Bi
b9d0: 74 41 6e 64 20 29 7b 0a 20 20 20 20 69 41 20 26  tAnd ){.    iA &
b9e0: 3d 20 69 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = iB;.  }else if
b9f0: 28 20 6f 70 3d 3d 4f 50 5f 42 69 74 4f 72 20 29  ( op==OP_BitOr )
ba00: 7b 0a 20 20 20 20 69 41 20 7c 3d 20 69 42 3b 0a  {.    iA |= iB;.
ba10: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 42 21 3d    }else if( iB!=
ba20: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
ba30: 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67   op==OP_ShiftRig
ba40: 68 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68 69  ht || op==OP_Shi
ba50: 66 74 4c 65 66 74 20 29 3b 0a 0a 20 20 20 20 2f  ftLeft );..    /
ba60: 2a 20 49 66 20 73 68 69 66 74 69 6e 67 20 62 79  * If shifting by
ba70: 20 61 20 6e 65 67 61 74 69 76 65 20 61 6d 6f 75   a negative amou
ba80: 6e 74 2c 20 73 68 69 66 74 20 69 6e 20 74 68 65  nt, shift in the
ba90: 20 6f 74 68 65 72 20 64 69 72 65 63 74 69 6f 6e   other direction
baa0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 42 3c 30   */.    if( iB<0
bab0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
bac0: 28 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74 3d  ( OP_ShiftRight=
bad0: 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 2b 31 20  =OP_ShiftLeft+1 
bae0: 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 32 2a  );.      op = 2*
baf0: 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 2b 20 31  OP_ShiftLeft + 1
bb00: 20 2d 20 6f 70 3b 0a 20 20 20 20 20 20 69 42 20   - op;.      iB 
bb10: 3d 20 69 42 3e 28 2d 36 34 29 20 3f 20 2d 69 42  = iB>(-64) ? -iB
bb20: 20 3a 20 36 34 3b 0a 20 20 20 20 7d 0a 0a 20 20   : 64;.    }..  
bb30: 20 20 69 66 28 20 69 42 3e 3d 36 34 20 29 7b 0a    if( iB>=64 ){.
bb40: 20 20 20 20 20 20 69 41 20 3d 20 28 69 41 3e 3d        iA = (iA>=
bb50: 30 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68 69 66  0 || op==OP_Shif
bb60: 74 4c 65 66 74 29 20 3f 20 30 20 3a 20 2d 31 3b  tLeft) ? 0 : -1;
bb70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
bb80: 20 20 6d 65 6d 63 70 79 28 26 75 41 2c 20 26 69    memcpy(&uA, &i
bb90: 41 2c 20 73 69 7a 65 6f 66 28 75 41 29 29 3b 0a  A, sizeof(uA));.
bba0: 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 4f 50        if( op==OP
bbb0: 5f 53 68 69 66 74 4c 65 66 74 20 29 7b 0a 20 20  _ShiftLeft ){.  
bbc0: 20 20 20 20 20 20 75 41 20 3c 3c 3d 20 69 42 3b        uA <<= iB;
bbd0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
bbe0: 20 20 20 20 20 20 75 41 20 3e 3e 3d 20 69 42 3b        uA >>= iB;
bbf0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 67 6e  .        /* Sign
bc00: 2d 65 78 74 65 6e 64 20 6f 6e 20 61 20 72 69 67  -extend on a rig
bc10: 68 74 20 73 68 69 66 74 20 6f 66 20 61 20 6e 65  ht shift of a ne
bc20: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 2a 2f  gative number */
bc30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3c  .        if( iA<
bc40: 30 20 29 20 75 41 20 7c 3d 20 28 28 28 28 75 36  0 ) uA |= ((((u6
bc50: 34 29 30 78 66 66 66 66 66 66 66 66 29 3c 3c 33  4)0xffffffff)<<3
bc60: 32 29 7c 30 78 66 66 66 66 66 66 66 66 29 20 3c  2)|0xffffffff) <
bc70: 3c 20 28 36 34 2d 69 42 29 3b 0a 20 20 20 20 20  < (64-iB);.     
bc80: 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28   }.      memcpy(
bc90: 26 69 41 2c 20 26 75 41 2c 20 73 69 7a 65 6f 66  &iA, &uA, sizeof
bca0: 28 69 41 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (iA));.    }.  }
bcb0: 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69  .  pOut->u.i = i
bcc0: 41 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46  A;.  MemSetTypeF
bcd0: 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e  lag(pOut, MEM_In
bce0: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
bcf0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 64 64 49 6d  /* Opcode: AddIm
bd00: 6d 20 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  m  P1 P2 * * *.*
bd10: 2a 20 0a 2a 2a 20 41 64 64 20 74 68 65 20 63 6f  * .** Add the co
bd20: 6e 73 74 61 6e 74 20 50 32 20 74 6f 20 74 68 65  nstant P2 to the
bd30: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
bd40: 65 72 20 50 31 2e 0a 2a 2a 20 54 68 65 20 72 65  er P1..** The re
bd50: 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73 20 61  sult is always a
bd60: 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  n integer..**.**
bd70: 20 54 6f 20 66 6f 72 63 65 20 61 6e 79 20 72 65   To force any re
bd80: 67 69 73 74 65 72 20 74 6f 20 62 65 20 61 6e 20  gister to be an 
bd90: 69 6e 74 65 67 65 72 2c 20 6a 75 73 74 20 61 64  integer, just ad
bda0: 64 20 30 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  d 0..*/.case OP_
bdb0: 41 64 64 49 6d 6d 3a 20 7b 20 20 20 20 20 20 20  AddImm: {       
bdc0: 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20       /* in1 */. 
bdd0: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
bde0: 70 2d 3e 70 31 5d 3b 0a 20 20 6d 65 6d 41 62 6f  p->p1];.  memAbo
bdf0: 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 49  utToChange(p, pI
be00: 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  n1);.  sqlite3Vd
be10: 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28  beMemIntegerify(
be20: 70 49 6e 31 29 3b 0a 20 20 70 49 6e 31 2d 3e 75  pIn1);.  pIn1->u
be30: 2e 69 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  .i += pOp->p2;. 
be40: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
be50: 63 6f 64 65 3a 20 4d 75 73 74 42 65 49 6e 74 20  code: MustBeInt 
be60: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 0a  P1 P2 * * *.** .
be70: 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c  ** Force the val
be80: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
be90: 31 20 74 6f 20 62 65 20 61 6e 20 69 6e 74 65 67  1 to be an integ
bea0: 65 72 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75  er.  If the valu
beb0: 65 0a 2a 2a 20 69 6e 20 50 31 20 69 73 20 6e 6f  e.** in P1 is no
bec0: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64  t an integer and
bed0: 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65   cannot be conve
bee0: 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 74  rted into an int
bef0: 65 67 65 72 0a 2a 2a 20 77 69 74 68 6f 75 74 20  eger.** without 
bf00: 64 61 74 61 20 6c 6f 73 73 2c 20 74 68 65 6e 20  data loss, then 
bf10: 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
bf20: 20 74 6f 20 50 32 2c 20 6f 72 20 69 66 20 50 32   to P2, or if P2
bf30: 3d 3d 30 0a 2a 2a 20 72 61 69 73 65 20 61 6e 20  ==0.** raise an 
bf40: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20  SQLITE_MISMATCH 
bf50: 65 78 63 65 70 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  exception..*/.ca
bf60: 73 65 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 3a  se OP_MustBeInt:
bf70: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {            /*
bf80: 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20   jump, in1 */.  
bf90: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
bfa0: 2d 3e 70 31 5d 3b 0a 20 20 61 70 70 6c 79 41 66  ->p1];.  applyAf
bfb0: 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 53 51 4c  finity(pIn1, SQL
bfc0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c  ITE_AFF_NUMERIC,
bfd0: 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 69 66   encoding);.  if
bfe0: 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
bff0: 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a   MEM_Int)==0 ){.
c000: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d      if( pOp->p2=
c010: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
c020: 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48   SQLITE_MISMATCH
c030: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f  ;.      goto abo
c040: 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
c050: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c060: 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
c070: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
c080: 65 7b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70  e{.    MemSetTyp
c090: 65 46 6c 61 67 28 70 49 6e 31 2c 20 4d 45 4d 5f  eFlag(pIn1, MEM_
c0a0: 49 6e 74 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  Int);.  }.  brea
c0b0: 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  k;.}..#ifndef SQ
c0c0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
c0d0: 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 20 4f 70 63 6f  NG_POINT./* Opco
c0e0: 64 65 3a 20 52 65 61 6c 41 66 66 69 6e 69 74 79  de: RealAffinity
c0f0: 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
c100: 2a 20 49 66 20 72 65 67 69 73 74 65 72 20 50 31  * If register P1
c110: 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65 67 65   holds an intege
c120: 72 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f 20  r convert it to 
c130: 61 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a 2a 2a  a real value..**
c140: 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
c150: 69 73 20 75 73 65 64 20 77 68 65 6e 20 65 78 74  is used when ext
c160: 72 61 63 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74  racting informat
c170: 69 6f 6e 20 66 72 6f 6d 20 61 20 63 6f 6c 75 6d  ion from a colum
c180: 6e 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 52 45  n that.** has RE
c190: 41 4c 20 61 66 66 69 6e 69 74 79 2e 20 20 53 75  AL affinity.  Su
c1a0: 63 68 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73  ch column values
c1b0: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 73 74   may still be st
c1c0: 6f 72 65 64 20 61 73 0a 2a 2a 20 69 6e 74 65 67  ored as.** integ
c1d0: 65 72 73 2c 20 66 6f 72 20 73 70 61 63 65 20 65  ers, for space e
c1e0: 66 66 69 63 69 65 6e 63 79 2c 20 62 75 74 20 61  fficiency, but a
c1f0: 66 74 65 72 20 65 78 74 72 61 63 74 69 6f 6e 20  fter extraction 
c200: 77 65 20 77 61 6e 74 20 74 68 65 6d 0a 2a 2a 20  we want them.** 
c210: 74 6f 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 72  to have only a r
c220: 65 61 6c 20 76 61 6c 75 65 2e 0a 2a 2f 0a 63 61  eal value..*/.ca
c230: 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  se OP_RealAffini
c240: 74 79 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ty: {           
c250: 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f         /* in1 */
c260: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
c270: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20  pOp->p1];.  if( 
c280: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
c290: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  M_Int ){.    sql
c2a0: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 61 6c 69  ite3VdbeMemReali
c2b0: 66 79 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20  fy(pIn1);.  }.  
c2c0: 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  break;.}.#endif.
c2d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c2e0: 4f 4d 49 54 5f 43 41 53 54 0a 2f 2a 20 4f 70 63  OMIT_CAST./* Opc
c2f0: 6f 64 65 3a 20 54 6f 54 65 78 74 20 50 31 20 2a  ode: ToText P1 *
c300: 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72   * * *.**.** For
c310: 63 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ce the value in 
c320: 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20 62  register P1 to b
c330: 65 20 74 65 78 74 2e 0a 2a 2a 20 49 66 20 74 68  e text..** If th
c340: 65 20 76 61 6c 75 65 20 69 73 20 6e 75 6d 65 72  e value is numer
c350: 69 63 2c 20 63 6f 6e 76 65 72 74 20 69 74 20 74  ic, convert it t
c360: 6f 20 61 20 73 74 72 69 6e 67 20 75 73 69 6e 67  o a string using
c370: 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65   the.** equivale
c380: 6e 74 20 6f 66 20 70 72 69 6e 74 66 28 29 2e 20  nt of printf(). 
c390: 20 42 6c 6f 62 20 76 61 6c 75 65 73 20 61 72 65   Blob values are
c3a0: 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 2a   unchanged and.*
c3b0: 2a 20 61 72 65 20 61 66 74 65 72 77 61 72 64 73  * are afterwards
c3c0: 20 73 69 6d 70 6c 79 20 69 6e 74 65 72 70 72 65   simply interpre
c3d0: 74 65 64 20 61 73 20 74 65 78 74 2e 0a 2a 2a 0a  ted as text..**.
c3e0: 2a 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20  ** A NULL value 
c3f0: 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 62  is not changed b
c400: 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  y this routine. 
c410: 20 49 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c   It remains NULL
c420: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f 54  ..*/.case OP_ToT
c430: 65 78 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ext: {          
c440: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
c450: 61 73 20 54 4b 5f 54 4f 5f 54 45 58 54 2c 20 69  as TK_TO_TEXT, i
c460: 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
c470: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
c480: 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
c490: 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20 20 69 66  e(p, pIn1);.  if
c4a0: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20  ( pIn1->flags & 
c4b0: 4d 45 4d 5f 4e 75 6c 6c 20 29 20 62 72 65 61 6b  MEM_Null ) break
c4c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d 5f  ;.  assert( MEM_
c4d0: 53 74 72 3d 3d 28 4d 45 4d 5f 42 6c 6f 62 3e 3e  Str==(MEM_Blob>>
c4e0: 33 29 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c  3) );.  pIn1->fl
c4f0: 61 67 73 20 7c 3d 20 28 70 49 6e 31 2d 3e 66 6c  ags |= (pIn1->fl
c500: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 29 3e 3e 33  ags&MEM_Blob)>>3
c510: 3b 0a 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74  ;.  applyAffinit
c520: 79 28 70 49 6e 31 2c 20 53 51 4c 49 54 45 5f 41  y(pIn1, SQLITE_A
c530: 46 46 5f 54 45 58 54 2c 20 65 6e 63 6f 64 69 6e  FF_TEXT, encodin
c540: 67 29 3b 0a 20 20 72 63 20 3d 20 45 78 70 61 6e  g);.  rc = Expan
c550: 64 42 6c 6f 62 28 70 49 6e 31 29 3b 0a 20 20 61  dBlob(pIn1);.  a
c560: 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61  ssert( pIn1->fla
c570: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 7c 7c 20  gs & MEM_Str || 
c580: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c590: 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67   );.  pIn1->flag
c5a0: 73 20 26 3d 20 7e 28 4d 45 4d 5f 49 6e 74 7c 4d  s &= ~(MEM_Int|M
c5b0: 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 42 6c 6f 62  EM_Real|MEM_Blob
c5c0: 7c 4d 45 4d 5f 5a 65 72 6f 29 3b 0a 20 20 55 50  |MEM_Zero);.  UP
c5d0: 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
c5e0: 45 28 70 49 6e 31 29 3b 0a 20 20 62 72 65 61 6b  E(pIn1);.  break
c5f0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
c600: 54 6f 42 6c 6f 62 20 50 31 20 2a 20 2a 20 2a 20  ToBlob P1 * * * 
c610: 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20 74 68  *.**.** Force th
c620: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
c630: 74 65 72 20 50 31 20 74 6f 20 62 65 20 61 20 42  ter P1 to be a B
c640: 4c 4f 42 2e 0a 2a 2a 20 49 66 20 74 68 65 20 76  LOB..** If the v
c650: 61 6c 75 65 20 69 73 20 6e 75 6d 65 72 69 63 2c  alue is numeric,
c660: 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f 20 61   convert it to a
c670: 20 73 74 72 69 6e 67 20 66 69 72 73 74 2e 0a 2a   string first..*
c680: 2a 20 53 74 72 69 6e 67 73 20 61 72 65 20 73 69  * Strings are si
c690: 6d 70 6c 79 20 72 65 69 6e 74 65 72 70 72 65 74  mply reinterpret
c6a0: 65 64 20 61 73 20 62 6c 6f 62 73 20 77 69 74 68  ed as blobs with
c6b0: 20 6e 6f 20 63 68 61 6e 67 65 0a 2a 2a 20 74 6f   no change.** to
c6c0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
c6d0: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  data..**.** A NU
c6e0: 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20  LL value is not 
c6f0: 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20  changed by this 
c700: 72 6f 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d  routine.  It rem
c710: 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61  ains NULL..*/.ca
c720: 73 65 20 4f 50 5f 54 6f 42 6c 6f 62 3a 20 7b 20  se OP_ToBlob: { 
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c740: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 54   /* same as TK_T
c750: 4f 5f 42 4c 4f 42 2c 20 69 6e 31 20 2a 2f 0a 20  O_BLOB, in1 */. 
c760: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
c770: 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70 49  p->p1];.  if( pI
c780: 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
c790: 4e 75 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20  Null ) break;.  
c7a0: 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
c7b0: 20 26 20 4d 45 4d 5f 42 6c 6f 62 29 3d 3d 30 20   & MEM_Blob)==0 
c7c0: 29 7b 0a 20 20 20 20 61 70 70 6c 79 41 66 66 69  ){.    applyAffi
c7d0: 6e 69 74 79 28 70 49 6e 31 2c 20 53 51 4c 49 54  nity(pIn1, SQLIT
c7e0: 45 5f 41 46 46 5f 54 45 58 54 2c 20 65 6e 63 6f  E_AFF_TEXT, enco
c7f0: 64 69 6e 67 29 3b 0a 20 20 20 20 61 73 73 65 72  ding);.    asser
c800: 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  t( pIn1->flags &
c810: 20 4d 45 4d 5f 53 74 72 20 7c 7c 20 64 62 2d 3e   MEM_Str || db->
c820: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
c830: 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
c840: 61 67 28 70 49 6e 31 2c 20 4d 45 4d 5f 42 6c 6f  ag(pIn1, MEM_Blo
c850: 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
c860: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 3d 20   pIn1->flags &= 
c870: 7e 28 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 26 7e  ~(MEM_TypeMask&~
c880: 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 20 20 7d 0a 20  MEM_Blob);.  }. 
c890: 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42   UPDATE_MAX_BLOB
c8a0: 53 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20 62 72  SIZE(pIn1);.  br
c8b0: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
c8c0: 65 3a 20 54 6f 4e 75 6d 65 72 69 63 20 50 31 20  e: ToNumeric P1 
c8d0: 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f  * * * *.**.** Fo
c8e0: 72 63 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  rce the value in
c8f0: 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20   register P1 to 
c900: 62 65 20 6e 75 6d 65 72 69 63 20 28 65 69 74 68  be numeric (eith
c910: 65 72 20 61 6e 0a 2a 2a 20 69 6e 74 65 67 65 72  er an.** integer
c920: 20 6f 72 20 61 20 66 6c 6f 61 74 69 6e 67 2d 70   or a floating-p
c930: 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 29 0a 2a 2a  oint number.).**
c940: 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   If the value is
c950: 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 2c 20 74   text or blob, t
c960: 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 69 74  ry to convert it
c970: 20 74 6f 20 61 6e 20 75 73 69 6e 67 20 74 68 65   to an using the
c980: 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 6f  .** equivalent o
c990: 66 20 61 74 6f 69 28 29 20 6f 72 20 61 74 6f 66  f atoi() or atof
c9a0: 28 29 20 61 6e 64 20 73 74 6f 72 65 20 30 20 69  () and store 0 i
c9b0: 66 20 6e 6f 20 73 75 63 68 20 63 6f 6e 76 65 72  f no such conver
c9c0: 73 69 6f 6e 20 0a 2a 2a 20 69 73 20 70 6f 73 73  sion .** is poss
c9d0: 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  ible..**.** A NU
c9e0: 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20  LL value is not 
c9f0: 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20  changed by this 
ca00: 72 6f 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d  routine.  It rem
ca10: 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61  ains NULL..*/.ca
ca20: 73 65 20 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 3a  se OP_ToNumeric:
ca30: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
ca40: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
ca50: 4b 5f 54 4f 5f 4e 55 4d 45 52 49 43 2c 20 69 6e  K_TO_NUMERIC, in
ca60: 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61  1 */.  pIn1 = &a
ca70: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
ca80: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e 75  sqlite3VdbeMemNu
ca90: 6d 65 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20  merify(pIn1);.  
caa0: 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
cab0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
cac0: 41 53 54 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64  AST */../* Opcod
cad0: 65 3a 20 54 6f 49 6e 74 20 50 31 20 2a 20 2a 20  e: ToInt P1 * * 
cae0: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20  * *.**.** Force 
caf0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
cb00: 69 73 74 65 72 20 50 31 20 74 6f 20 62 65 20 61  ister P1 to be a
cb10: 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66 0a 2a  n integer.  If.*
cb20: 2a 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 63  * The value is c
cb30: 75 72 72 65 6e 74 6c 79 20 61 20 72 65 61 6c 20  urrently a real 
cb40: 6e 75 6d 62 65 72 2c 20 64 72 6f 70 20 69 74 73  number, drop its
cb50: 20 66 72 61 63 74 69 6f 6e 61 6c 20 70 61 72 74   fractional part
cb60: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75  ..** If the valu
cb70: 65 20 69 73 20 74 65 78 74 20 6f 72 20 62 6c 6f  e is text or blo
cb80: 62 2c 20 74 72 79 20 74 6f 20 63 6f 6e 76 65 72  b, try to conver
cb90: 74 20 69 74 20 74 6f 20 61 6e 20 69 6e 74 65 67  t it to an integ
cba0: 65 72 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20  er using the.** 
cbb0: 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 61 74  equivalent of at
cbc0: 6f 69 28 29 20 61 6e 64 20 73 74 6f 72 65 20 30  oi() and store 0
cbd0: 20 69 66 20 6e 6f 20 73 75 63 68 20 63 6f 6e 76   if no such conv
cbe0: 65 72 73 69 6f 6e 20 69 73 20 70 6f 73 73 69 62  ersion is possib
cbf0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c  le..**.** A NULL
cc00: 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 63 68   value is not ch
cc10: 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 72 6f  anged by this ro
cc20: 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d 61 69  utine.  It remai
cc30: 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65  ns NULL..*/.case
cc40: 20 4f 50 5f 54 6f 49 6e 74 3a 20 7b 20 20 20 20   OP_ToInt: {    
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cc60: 20 73 61 6d 65 20 61 73 20 54 4b 5f 54 4f 5f 49   same as TK_TO_I
cc70: 4e 54 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e  NT, in1 */.  pIn
cc80: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
cc90: 31 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d  1];.  if( (pIn1-
cca0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
ccb0: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  l)==0 ){.    sql
ccc0: 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67  ite3VdbeMemInteg
ccd0: 65 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 7d  erify(pIn1);.  }
cce0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66  .  break;.}..#if
ccf0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
cd00: 5f 4f 4d 49 54 5f 43 41 53 54 29 20 26 26 20 21  _OMIT_CAST) && !
cd10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
cd20: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
cd30: 4e 54 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54  NT)./* Opcode: T
cd40: 6f 52 65 61 6c 20 50 31 20 2a 20 2a 20 2a 20 2a  oReal P1 * * * *
cd50: 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65  .**.** Force the
cd60: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
cd70: 65 72 20 50 31 20 74 6f 20 62 65 20 61 20 66 6c  er P1 to be a fl
cd80: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d  oating point num
cd90: 62 65 72 2e 0a 2a 2a 20 49 66 20 54 68 65 20 76  ber..** If The v
cda0: 61 6c 75 65 20 69 73 20 63 75 72 72 65 6e 74 6c  alue is currentl
cdb0: 79 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 63 6f  y an integer, co
cdc0: 6e 76 65 72 74 20 69 74 2e 0a 2a 2a 20 49 66 20  nvert it..** If 
cdd0: 74 68 65 20 76 61 6c 75 65 20 69 73 20 74 65 78  the value is tex
cde0: 74 20 6f 72 20 62 6c 6f 62 2c 20 74 72 79 20 74  t or blob, try t
cdf0: 6f 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f 20  o convert it to 
ce00: 61 6e 20 69 6e 74 65 67 65 72 20 75 73 69 6e 67  an integer using
ce10: 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65   the.** equivale
ce20: 6e 74 20 6f 66 20 61 74 6f 69 28 29 20 61 6e 64  nt of atoi() and
ce30: 20 73 74 6f 72 65 20 30 2e 30 20 69 66 20 6e 6f   store 0.0 if no
ce40: 20 73 75 63 68 20 63 6f 6e 76 65 72 73 69 6f 6e   such conversion
ce50: 20 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a   is possible..**
ce60: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65  .** A NULL value
ce70: 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20   is not changed 
ce80: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
ce90: 20 20 49 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c    It remains NUL
cea0: 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f  L..*/.case OP_To
ceb0: 52 65 61 6c 3a 20 7b 20 20 20 20 20 20 20 20 20  Real: {         
cec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
ced0: 20 61 73 20 54 4b 5f 54 4f 5f 52 45 41 4c 2c 20   as TK_TO_REAL, 
cee0: 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  in1 */.  pIn1 = 
cef0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
cf00: 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
cf10: 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20 20 69  ge(p, pIn1);.  i
cf20: 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
cf30: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
cf40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
cf50: 65 4d 65 6d 52 65 61 6c 69 66 79 28 70 49 6e 31  eMemRealify(pIn1
cf60: 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
cf70: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
cf80: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
cf90: 5f 43 41 53 54 29 20 26 26 20 21 64 65 66 69 6e  _CAST) && !defin
cfa0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
cfb0: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 20 2a  LOATING_POINT) *
cfc0: 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 74  /../* Opcode: Lt
cfd0: 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
cfe0: 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  **.** Compare th
cff0: 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69  e values in regi
d000: 73 74 65 72 20 50 31 20 61 6e 64 20 50 33 2e 20  ster P1 and P3. 
d010: 20 49 66 20 72 65 67 28 50 33 29 3c 72 65 67 28   If reg(P3)<reg(
d020: 50 31 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70  P1) then.** jump
d030: 20 74 6f 20 61 64 64 72 65 73 73 20 50 32 2e 20   to address P2. 
d040: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53   .**.** If the S
d050: 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
d060: 20 62 69 74 20 6f 66 20 50 35 20 69 73 20 73 65   bit of P5 is se
d070: 74 20 61 6e 64 20 65 69 74 68 65 72 20 72 65 67  t and either reg
d080: 28 50 31 29 20 6f 72 0a 2a 2a 20 72 65 67 28 50  (P1) or.** reg(P
d090: 33 29 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  3) is NULL then 
d0a0: 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 2e 20 20  take the jump.  
d0b0: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4a 55  If the SQLITE_JU
d0c0: 4d 50 49 46 4e 55 4c 4c 20 0a 2a 2a 20 62 69 74  MPIFNULL .** bit
d0d0: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 66   is clear then f
d0e0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 65  all through if e
d0f0: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
d100: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
d110: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b   SQLITE_AFF_MASK
d120: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 50 35 20 6d   portion of P5 m
d130: 75 73 74 20 62 65 20 61 6e 20 61 66 66 69 6e 69  ust be an affini
d140: 74 79 20 63 68 61 72 61 63 74 65 72 20 2d 0a 2a  ty character -.*
d150: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  * SQLITE_AFF_TEX
d160: 54 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  T, SQLITE_AFF_IN
d170: 54 45 47 45 52 2c 20 61 6e 64 20 73 6f 20 66 6f  TEGER, and so fo
d180: 72 74 68 2e 20 41 6e 20 61 74 74 65 6d 70 74 20  rth. An attempt 
d190: 69 73 20 6d 61 64 65 20 0a 2a 2a 20 74 6f 20 63  is made .** to c
d1a0: 6f 65 72 63 65 20 62 6f 74 68 20 69 6e 70 75 74  oerce both input
d1b0: 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  s according to t
d1c0: 68 69 73 20 61 66 66 69 6e 69 74 79 20 62 65 66  his affinity bef
d1d0: 6f 72 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 61  ore the.** compa
d1e0: 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 2e 20 49  rison is made. I
d1f0: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46  f the SQLITE_AFF
d200: 5f 4d 41 53 4b 20 69 73 20 30 78 30 30 2c 20 74  _MASK is 0x00, t
d210: 68 65 6e 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 61  hen numeric.** a
d220: 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 2e  ffinity is used.
d230: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61   Note that the a
d240: 66 66 69 6e 69 74 79 20 63 6f 6e 76 65 72 73 69  ffinity conversi
d250: 6f 6e 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  ons are stored.*
d260: 2a 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  * back into the 
d270: 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 73 20  input registers 
d280: 50 31 20 61 6e 64 20 50 33 2e 20 20 53 6f 20 74  P1 and P3.  So t
d290: 68 69 73 20 6f 70 63 6f 64 65 20 63 61 6e 20 63  his opcode can c
d2a0: 61 75 73 65 0a 2a 2a 20 70 65 72 73 69 73 74 65  ause.** persiste
d2b0: 6e 74 20 63 68 61 6e 67 65 73 20 74 6f 20 72 65  nt changes to re
d2c0: 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50  gisters P1 and P
d2d0: 33 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  3..**.** Once an
d2e0: 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 68 61  y conversions ha
d2f0: 76 65 20 74 61 6b 65 6e 20 70 6c 61 63 65 2c 20  ve taken place, 
d300: 61 6e 64 20 6e 65 69 74 68 65 72 20 76 61 6c 75  and neither valu
d310: 65 20 69 73 20 4e 55 4c 4c 2c 20 0a 2a 2a 20 74  e is NULL, .** t
d320: 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  he values are co
d330: 6d 70 61 72 65 64 2e 20 49 66 20 62 6f 74 68 20  mpared. If both 
d340: 76 61 6c 75 65 73 20 61 72 65 20 62 6c 6f 62 73  values are blobs
d350: 20 74 68 65 6e 20 6d 65 6d 63 6d 70 28 29 20 69   then memcmp() i
d360: 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 64 65 74  s.** used to det
d370: 65 72 6d 69 6e 65 20 74 68 65 20 72 65 73 75 6c  ermine the resul
d380: 74 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  ts of the compar
d390: 69 73 6f 6e 2e 20 20 49 66 20 62 6f 74 68 20 76  ison.  If both v
d3a0: 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 74 65 78  alues.** are tex
d3b0: 74 2c 20 74 68 65 6e 20 74 68 65 20 61 70 70 72  t, then the appr
d3c0: 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
d3d0: 67 20 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 69  g function speci
d3e0: 66 69 65 64 20 69 6e 0a 2a 2a 20 50 34 20 69 73  fied in.** P4 is
d3f0: 20 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65    used to do the
d400: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66   comparison.  If
d410: 20 50 34 20 69 73 20 6e 6f 74 20 73 70 65 63 69   P4 is not speci
d420: 66 69 65 64 20 74 68 65 6e 0a 2a 2a 20 6d 65 6d  fied then.** mem
d430: 63 6d 70 28 29 20 69 73 20 75 73 65 64 20 74 6f  cmp() is used to
d440: 20 63 6f 6d 70 61 72 65 20 74 65 78 74 20 73 74   compare text st
d450: 72 69 6e 67 2e 20 20 49 66 20 62 6f 74 68 20 76  ring.  If both v
d460: 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 6e 75 6d  alues are.** num
d470: 65 72 69 63 2c 20 74 68 65 6e 20 61 20 6e 75 6d  eric, then a num
d480: 65 72 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e 20  eric comparison 
d490: 69 73 20 75 73 65 64 2e 20 49 66 20 74 68 65 20  is used. If the 
d4a0: 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72  two values.** ar
d4b0: 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 74  e of different t
d4c0: 79 70 65 73 2c 20 74 68 65 6e 20 6e 75 6d 62 65  ypes, then numbe
d4d0: 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  rs are considere
d4e0: 64 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 73  d less than.** s
d4f0: 74 72 69 6e 67 73 20 61 6e 64 20 73 74 72 69 6e  trings and strin
d500: 67 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  gs are considere
d510: 64 20 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f 62  d less than blob
d520: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
d530: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 62  SQLITE_STOREP2 b
d540: 69 74 20 6f 66 20 50 35 20 69 73 20 73 65 74 2c  it of P5 is set,
d550: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6a 75 6d   then do not jum
d560: 70 2e 20 20 49 6e 73 74 65 61 64 2c 0a 2a 2a 20  p.  Instead,.** 
d570: 73 74 6f 72 65 20 61 20 62 6f 6f 6c 65 61 6e 20  store a boolean 
d580: 72 65 73 75 6c 74 20 28 65 69 74 68 65 72 20 30  result (either 0
d590: 2c 20 6f 72 20 31 2c 20 6f 72 20 4e 55 4c 4c 29  , or 1, or NULL)
d5a0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
d5b0: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  .*/./* Opcode: N
d5c0: 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  e P1 P2 P3 P4 P5
d5d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
d5e0: 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20  s just like the 
d5f0: 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74  Lt opcode except
d600: 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69   that the jump i
d610: 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68  s taken if.** th
d620: 65 20 6f 70 65 72 61 6e 64 73 20 69 6e 20 72 65  e operands in re
d630: 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50  gisters P1 and P
d640: 33 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 2e  3 are not equal.
d650: 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63    See the Lt opc
d660: 6f 64 65 20 66 6f 72 0a 2a 2a 20 61 64 64 69 74  ode for.** addit
d670: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
d680: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  n..**.** If SQLI
d690: 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 73 65 74  TE_NULLEQ is set
d6a0: 20 69 6e 20 50 35 20 74 68 65 6e 20 74 68 65 20   in P5 then the 
d6b0: 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  result of compar
d6c0: 69 73 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65  ison is always e
d6d0: 69 74 68 65 72 0a 2a 2a 20 74 72 75 65 20 6f 72  ither.** true or
d6e0: 20 66 61 6c 73 65 20 61 6e 64 20 69 73 20 6e 65   false and is ne
d6f0: 76 65 72 20 4e 55 4c 4c 2e 20 20 49 66 20 62 6f  ver NULL.  If bo
d700: 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20  th operands are 
d710: 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72 65  NULL then the re
d720: 73 75 6c 74 0a 2a 2a 20 6f 66 20 63 6f 6d 70 61  sult.** of compa
d730: 72 69 73 6f 6e 20 69 73 20 66 61 6c 73 65 2e 20  rison is false. 
d740: 20 49 66 20 65 69 74 68 65 72 20 6f 70 65 72 61   If either opera
d750: 6e 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  nd is NULL then 
d760: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 72  the result is tr
d770: 75 65 2e 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65  ue..** If neithe
d780: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
d790: 4c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  L the result is 
d7a0: 74 68 65 20 73 61 6d 65 20 61 73 20 69 74 20 77  the same as it w
d7b0: 6f 75 6c 64 20 62 65 20 69 66 0a 2a 2a 20 74 68  ould be if.** th
d7c0: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20  e SQLITE_NULLEQ 
d7d0: 66 6c 61 67 20 77 65 72 65 20 6f 6d 69 74 74 65  flag were omitte
d7e0: 64 20 66 72 6f 6d 20 50 35 2e 0a 2a 2f 0a 2f 2a  d from P5..*/./*
d7f0: 20 4f 70 63 6f 64 65 3a 20 45 71 20 50 31 20 50   Opcode: Eq P1 P
d800: 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
d810: 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74   This works just
d820: 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63   like the Lt opc
d830: 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74 20  ode except that 
d840: 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65  the jump is take
d850: 6e 20 69 66 0a 2a 2a 20 74 68 65 20 6f 70 65 72  n if.** the oper
d860: 61 6e 64 73 20 69 6e 20 72 65 67 69 73 74 65 72  ands in register
d870: 73 20 50 31 20 61 6e 64 20 50 33 20 61 72 65 20  s P1 and P3 are 
d880: 65 71 75 61 6c 2e 0a 2a 2a 20 53 65 65 20 74 68  equal..** See th
d890: 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20  e Lt opcode for 
d8a0: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
d8b0: 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  mation..**.** If
d8c0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69   SQLITE_NULLEQ i
d8d0: 73 20 73 65 74 20 69 6e 20 50 35 20 74 68 65 6e  s set in P5 then
d8e0: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   the result of c
d8f0: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 6c 77  omparison is alw
d900: 61 79 73 20 65 69 74 68 65 72 0a 2a 2a 20 74 72  ays either.** tr
d910: 75 65 20 6f 72 20 66 61 6c 73 65 20 61 6e 64 20  ue or false and 
d920: 69 73 20 6e 65 76 65 72 20 4e 55 4c 4c 2e 20 20  is never NULL.  
d930: 49 66 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73  If both operands
d940: 20 61 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20 74   are NULL then t
d950: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 66 20  he result.** of 
d960: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 72  comparison is tr
d970: 75 65 2e 20 20 49 66 20 65 69 74 68 65 72 20 6f  ue.  If either o
d980: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74  perand is NULL t
d990: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
d9a0: 73 20 66 61 6c 73 65 2e 0a 2a 2a 20 49 66 20 6e  s false..** If n
d9b0: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
d9c0: 73 20 4e 55 4c 4c 20 74 68 65 20 72 65 73 75 6c  s NULL the resul
d9d0: 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  t is the same as
d9e0: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 66 0a   it would be if.
d9f0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 55  ** the SQLITE_NU
da00: 4c 4c 45 51 20 66 6c 61 67 20 77 65 72 65 20 6f  LLEQ flag were o
da10: 6d 69 74 74 65 64 20 66 72 6f 6d 20 50 35 2e 0a  mitted from P5..
da20: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 65  */./* Opcode: Le
da30: 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
da40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
da50: 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 4c   just like the L
da60: 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20  t opcode except 
da70: 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73  that the jump is
da80: 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65   taken if.** the
da90: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69   content of regi
daa0: 73 74 65 72 20 50 33 20 69 73 20 6c 65 73 73 20  ster P3 is less 
dab0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
dac0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
dad0: 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 2e 20  ** register P1. 
dae0: 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f   See the Lt opco
daf0: 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  de for additiona
db00: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
db10: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 74 20  /./* Opcode: Gt 
db20: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
db30: 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
db40: 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 4c 74  just like the Lt
db50: 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20 74   opcode except t
db60: 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20  hat the jump is 
db70: 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20  taken if.** the 
db80: 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73  content of regis
db90: 74 65 72 20 50 33 20 69 73 20 67 72 65 61 74 65  ter P3 is greate
dba0: 72 20 74 68 61 6e 20 74 68 65 20 63 6f 6e 74 65  r than the conte
dbb0: 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65  nt of.** registe
dbc0: 72 20 50 31 2e 20 20 53 65 65 20 74 68 65 20 4c  r P1.  See the L
dbd0: 74 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 64  t opcode for add
dbe0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
dbf0: 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ion..*/./* Opcod
dc00: 65 3a 20 47 65 20 50 31 20 50 32 20 50 33 20 50  e: Ge P1 P2 P3 P
dc10: 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4 P5.**.** This 
dc20: 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20  works just like 
dc30: 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78  the Lt opcode ex
dc40: 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6a 75  cept that the ju
dc50: 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a  mp is taken if.*
dc60: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
dc70: 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20   register P3 is 
dc80: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
dc90: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 63 6f 6e  equal to the con
dca0: 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69 73  tent of.** regis
dcb0: 74 65 72 20 50 31 2e 20 20 53 65 65 20 74 68 65  ter P1.  See the
dcc0: 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20 61   Lt opcode for a
dcd0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
dce0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ation..*/.case O
dcf0: 50 5f 45 71 3a 20 20 20 20 20 20 20 20 20 20 20  P_Eq:           
dd00: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
dd10: 4b 5f 45 51 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c  K_EQ, jump, in1,
dd20: 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in3 */.case OP_
dd30: 4e 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  Ne:             
dd40: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
dd50: 4e 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69  NE, jump, in1, i
dd60: 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 74  n3 */.case OP_Lt
dd70: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
dd80: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c 54  /* same as TK_LT
dd90: 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33  , jump, in1, in3
dda0: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 65 3a 20   */.case OP_Le: 
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ddc0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c 45 2c 20   same as TK_LE, 
ddd0: 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a  jump, in1, in3 *
dde0: 2f 0a 63 61 73 65 20 4f 50 5f 47 74 3a 20 20 20  /.case OP_Gt:   
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
de00: 61 6d 65 20 61 73 20 54 4b 5f 47 54 2c 20 6a 75  ame as TK_GT, ju
de10: 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a  mp, in1, in3 */.
de20: 63 61 73 65 20 4f 50 5f 47 65 3a 20 7b 20 20 20  case OP_Ge: {   
de30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
de40: 65 20 61 73 20 54 4b 5f 47 45 2c 20 6a 75 6d 70  e as TK_GE, jump
de50: 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 20 20  , in1, in3 */.  
de60: 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
de70: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
de80: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
de90: 6f 66 20 70 49 6e 31 20 61 67 61 69 6e 73 74 20  of pIn1 against 
dea0: 70 49 6e 33 20 2a 2f 0a 20 20 63 68 61 72 20 61  pIn3 */.  char a
deb0: 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 2f 2a  ffinity;      /*
dec0: 20 41 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65   Affinity to use
ded0: 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20   for comparison 
dee0: 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73 31 3b  */.  u16 flags1;
def0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
df00: 20 6f 66 20 69 6e 69 74 69 61 6c 20 76 61 6c 75   of initial valu
df10: 65 20 6f 66 20 70 49 6e 31 2d 3e 66 6c 61 67 73  e of pIn1->flags
df20: 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73 33   */.  u16 flags3
df30: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  ;         /* Cop
df40: 79 20 6f 66 20 69 6e 69 74 69 61 6c 20 76 61 6c  y of initial val
df50: 75 65 20 6f 66 20 70 49 6e 33 2d 3e 66 6c 61 67  ue of pIn3->flag
df60: 73 20 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d 20 26  s */..  pIn1 = &
df70: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
df80: 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn3 = &aMem[pO
df90: 70 2d 3e 70 33 5d 3b 0a 20 20 66 6c 61 67 73 31  p->p3];.  flags1
dfa0: 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73 3b 0a   = pIn1->flags;.
dfb0: 20 20 66 6c 61 67 73 33 20 3d 20 70 49 6e 33 2d    flags3 = pIn3-
dfc0: 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 66  >flags;.  if( (f
dfd0: 6c 61 67 73 31 20 7c 20 66 6c 61 67 73 33 29 26  lags1 | flags3)&
dfe0: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
dff0: 2f 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f  /* One or both o
e000: 70 65 72 61 6e 64 73 20 61 72 65 20 4e 55 4c 4c  perands are NULL
e010: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 70 2d   */.    if( pOp-
e020: 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4e 55 4c  >p5 & SQLITE_NUL
e030: 4c 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  LEQ ){.      /* 
e040: 49 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  If SQLITE_NULLEQ
e050: 20 69 73 20 73 65 74 20 28 77 68 69 63 68 20 77   is set (which w
e060: 69 6c 6c 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  ill only happen 
e070: 69 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  if the operator 
e080: 69 73 0a 20 20 20 20 20 20 2a 2a 20 4f 50 5f 45  is.      ** OP_E
e090: 71 20 6f 72 20 4f 50 5f 4e 65 29 20 74 68 65 6e  q or OP_Ne) then
e0a0: 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 6f   take the jump o
e0b0: 72 20 6e 6f 74 20 64 65 70 65 6e 64 69 6e 67 20  r not depending 
e0c0: 6f 6e 20 77 68 65 74 68 65 72 0a 20 20 20 20 20  on whether.     
e0d0: 20 2a 2a 20 6f 72 20 6e 6f 74 20 62 6f 74 68 20   ** or not both 
e0e0: 6f 70 65 72 61 6e 64 73 20 61 72 65 20 6e 75 6c  operands are nul
e0f0: 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
e100: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
e110: 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 20 7c 7c 20  pcode==OP_Eq || 
e120: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
e130: 4e 65 20 29 3b 0a 20 20 20 20 20 20 72 65 73 20  Ne );.      res 
e140: 3d 20 28 66 6c 61 67 73 31 20 26 20 66 6c 61 67  = (flags1 & flag
e150: 73 33 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d  s3 & MEM_Null)==
e160: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
e170: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55      /* SQLITE_NU
e180: 4c 4c 45 51 20 69 73 20 63 6c 65 61 72 20 61 6e  LLEQ is clear an
e190: 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  d at least one o
e1a0: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c 0a  perand is NULL,.
e1b0: 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
e1c0: 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61  e result is alwa
e1d0: 79 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 2a  ys NULL..      *
e1e0: 2a 20 54 68 65 20 6a 75 6d 70 20 69 73 20 74 61  * The jump is ta
e1f0: 6b 65 6e 20 69 66 20 74 68 65 20 53 51 4c 49 54  ken if the SQLIT
e200: 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 62 69 74  E_JUMPIFNULL bit
e210: 20 69 73 20 73 65 74 2e 0a 20 20 20 20 20 20 2a   is set..      *
e220: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  /.      if( pOp-
e230: 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f  >p5 & SQLITE_STO
e240: 52 45 50 32 20 29 7b 0a 20 20 20 20 20 20 20 20  REP2 ){.        
e250: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
e260: 2d 3e 70 32 5d 3b 0a 20 20 20 20 20 20 20 20 4d  ->p2];.        M
e270: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
e280: 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  ut, MEM_Null);. 
e290: 20 20 20 20 20 20 20 52 45 47 49 53 54 45 52 5f         REGISTER_
e2a0: 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70  TRACE(pOp->p2, p
e2b0: 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Out);.      }els
e2c0: 65 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20  e if( pOp->p5 & 
e2d0: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
e2e0: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20  L ){.        pc 
e2f0: 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 20  = pOp->p2-1;.   
e300: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
e310: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
e320: 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20  .    /* Neither 
e330: 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2e  operand is NULL.
e340: 20 20 44 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f    Do a compariso
e350: 6e 2e 20 2a 2f 0a 20 20 20 20 61 66 66 69 6e 69  n. */.    affini
e360: 74 79 20 3d 20 70 4f 70 2d 3e 70 35 20 26 20 53  ty = pOp->p5 & S
e370: 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 3b 0a  QLITE_AFF_MASK;.
e380: 20 20 20 20 69 66 28 20 61 66 66 69 6e 69 74 79      if( affinity
e390: 20 29 7b 0a 20 20 20 20 20 20 61 70 70 6c 79 41   ){.      applyA
e3a0: 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 61 66  ffinity(pIn1, af
e3b0: 66 69 6e 69 74 79 2c 20 65 6e 63 6f 64 69 6e 67  finity, encoding
e3c0: 29 3b 0a 20 20 20 20 20 20 61 70 70 6c 79 41 66  );.      applyAf
e3d0: 66 69 6e 69 74 79 28 70 49 6e 33 2c 20 61 66 66  finity(pIn3, aff
e3e0: 69 6e 69 74 79 2c 20 65 6e 63 6f 64 69 6e 67 29  inity, encoding)
e3f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
e400: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
e410: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
e420: 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
e430: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 43  Op->p4type==P4_C
e440: 4f 4c 4c 53 45 51 20 7c 7c 20 70 4f 70 2d 3e 70  OLLSEQ || pOp->p
e450: 34 2e 70 43 6f 6c 6c 3d 3d 30 20 29 3b 0a 20 20  4.pColl==0 );.  
e460: 20 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e    ExpandBlob(pIn
e470: 31 29 3b 0a 20 20 20 20 45 78 70 61 6e 64 42 6c  1);.    ExpandBl
e480: 6f 62 28 70 49 6e 33 29 3b 0a 20 20 20 20 72 65  ob(pIn3);.    re
e490: 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  s = sqlite3MemCo
e4a0: 6d 70 61 72 65 28 70 49 6e 33 2c 20 70 49 6e 31  mpare(pIn3, pIn1
e4b0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 29  , pOp->p4.pColl)
e4c0: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
e4d0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20  pOp->opcode ){. 
e4e0: 20 20 20 63 61 73 65 20 4f 50 5f 45 71 3a 20 20     case OP_Eq:  
e4f0: 20 20 72 65 73 20 3d 20 72 65 73 3d 3d 30 3b 20    res = res==0; 
e500: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
e510: 61 73 65 20 4f 50 5f 4e 65 3a 20 20 20 20 72 65  ase OP_Ne:    re
e520: 73 20 3d 20 72 65 73 21 3d 30 3b 20 20 20 20 20  s = res!=0;     
e530: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
e540: 4f 50 5f 4c 74 3a 20 20 20 20 72 65 73 20 3d 20  OP_Lt:    res = 
e550: 72 65 73 3c 30 3b 20 20 20 20 20 20 62 72 65 61  res<0;      brea
e560: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 4c  k;.    case OP_L
e570: 65 3a 20 20 20 20 72 65 73 20 3d 20 72 65 73 3c  e:    res = res<
e580: 3d 30 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  =0;     break;. 
e590: 20 20 20 63 61 73 65 20 4f 50 5f 47 74 3a 20 20     case OP_Gt:  
e5a0: 20 20 72 65 73 20 3d 20 72 65 73 3e 30 3b 20 20    res = res>0;  
e5b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
e5c0: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 72 65  efault:       re
e5d0: 73 20 3d 20 72 65 73 3e 3d 30 3b 20 20 20 20 20  s = res>=0;     
e5e0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66  break;.  }..  if
e5f0: 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49  ( pOp->p5 & SQLI
e600: 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 20  TE_STOREP2 ){.  
e610: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
e620: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 6d 65 6d  Op->p2];.    mem
e630: 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
e640: 20 70 4f 75 74 29 3b 0a 20 20 20 20 4d 65 6d 53   pOut);.    MemS
e650: 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c  etTypeFlag(pOut,
e660: 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 20 20 70   MEM_Int);.    p
e670: 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 65 73 3b 0a  Out->u.i = res;.
e680: 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
e690: 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75 74  CE(pOp->p2, pOut
e6a0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  );.  }else if( r
e6b0: 65 73 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70  es ){.    pc = p
e6c0: 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d 0a 0a 20  Op->p2-1;.  }.. 
e6d0: 20 2f 2a 20 55 6e 64 6f 20 61 6e 79 20 63 68 61   /* Undo any cha
e6e0: 6e 67 65 73 20 6d 61 64 65 20 62 79 20 61 70 70  nges made by app
e6f0: 6c 79 41 66 66 69 6e 69 74 79 28 29 20 74 6f 20  lyAffinity() to 
e700: 74 68 65 20 69 6e 70 75 74 20 72 65 67 69 73 74  the input regist
e710: 65 72 73 2e 20 2a 2f 0a 20 20 70 49 6e 31 2d 3e  ers. */.  pIn1->
e720: 66 6c 61 67 73 20 3d 20 28 70 49 6e 31 2d 3e 66  flags = (pIn1->f
e730: 6c 61 67 73 26 7e 4d 45 4d 5f 54 79 70 65 4d 61  lags&~MEM_TypeMa
e740: 73 6b 29 20 7c 20 28 66 6c 61 67 73 31 26 4d 45  sk) | (flags1&ME
e750: 4d 5f 54 79 70 65 4d 61 73 6b 29 3b 0a 20 20 70  M_TypeMask);.  p
e760: 49 6e 33 2d 3e 66 6c 61 67 73 20 3d 20 28 70 49  In3->flags = (pI
e770: 6e 33 2d 3e 66 6c 61 67 73 26 7e 4d 45 4d 5f 54  n3->flags&~MEM_T
e780: 79 70 65 4d 61 73 6b 29 20 7c 20 28 66 6c 61 67  ypeMask) | (flag
e790: 73 33 26 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29  s3&MEM_TypeMask)
e7a0: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
e7b0: 20 4f 70 63 6f 64 65 3a 20 50 65 72 6d 75 74 61   Opcode: Permuta
e7c0: 74 69 6f 6e 20 2a 20 2a 20 2a 20 50 34 20 2a 0a  tion * * * P4 *.
e7d0: 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 65  **.** Set the pe
e7e0: 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 62  rmutation used b
e7f0: 79 20 74 68 65 20 4f 50 5f 43 6f 6d 70 61 72 65  y the OP_Compare
e800: 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
e810: 74 68 65 20 61 72 72 61 79 0a 2a 2a 20 6f 66 20  the array.** of 
e820: 69 6e 74 65 67 65 72 73 20 69 6e 20 50 34 2e 0a  integers in P4..
e830: 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 6d 75 74  **.** The permut
e840: 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 76 61  ation is only va
e850: 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 6e 65  lid until the ne
e860: 78 74 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f  xt OP_Permutatio
e870: 6e 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 0a 2a  n, OP_Compare,.*
e880: 2a 20 4f 50 5f 48 61 6c 74 2c 20 6f 72 20 4f 50  * OP_Halt, or OP
e890: 5f 52 65 73 75 6c 74 52 6f 77 2e 20 20 54 79 70  _ResultRow.  Typ
e8a0: 69 63 61 6c 6c 79 20 74 68 65 20 4f 50 5f 50 65  ically the OP_Pe
e8b0: 72 6d 75 74 61 74 69 6f 6e 20 73 68 6f 75 6c 64  rmutation should
e8c0: 20 6f 63 63 75 72 0a 2a 2a 20 69 6d 6d 65 64 69   occur.** immedi
e8d0: 61 74 65 6c 79 20 70 72 69 6f 72 20 74 6f 20 74  ately prior to t
e8e0: 68 65 20 4f 50 5f 43 6f 6d 70 61 72 65 2e 0a 2a  he OP_Compare..*
e8f0: 2f 0a 63 61 73 65 20 4f 50 5f 50 65 72 6d 75 74  /.case OP_Permut
e900: 61 74 69 6f 6e 3a 20 7b 0a 20 20 61 73 73 65 72  ation: {.  asser
e910: 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
e920: 50 34 5f 49 4e 54 41 52 52 41 59 20 29 3b 0a 20  P4_INTARRAY );. 
e930: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
e940: 2e 61 69 20 29 3b 0a 20 20 61 50 65 72 6d 75 74  .ai );.  aPermut
e950: 65 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a  e = pOp->p4.ai;.
e960: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
e970: 70 63 6f 64 65 3a 20 43 6f 6d 70 61 72 65 20 50  pcode: Compare P
e980: 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a  1 P2 P3 P4 *.**.
e990: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 76  ** Compare two v
e9a0: 65 63 74 6f 72 73 20 6f 66 20 72 65 67 69 73 74  ectors of regist
e9b0: 65 72 73 20 69 6e 20 72 65 67 28 50 31 29 2e 2e  ers in reg(P1)..
e9c0: 72 65 67 28 50 31 2b 50 33 2d 31 29 20 28 63 61  reg(P1+P3-1) (ca
e9d0: 6c 6c 20 74 68 69 73 0a 2a 2a 20 76 65 63 74 6f  ll this.** vecto
e9e0: 72 20 22 41 22 29 20 61 6e 64 20 69 6e 20 72 65  r "A") and in re
e9f0: 67 28 50 32 29 2e 2e 72 65 67 28 50 32 2b 50 33  g(P2)..reg(P2+P3
ea00: 2d 31 29 20 28 22 42 22 29 2e 20 20 53 61 76 65  -1) ("B").  Save
ea10: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
ea20: 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * the comparison
ea30: 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
ea40: 6e 65 78 74 20 4f 50 5f 4a 75 6d 70 20 69 6e 73  next OP_Jump ins
ea50: 74 72 75 63 74 2e 0a 2a 2a 0a 2a 2a 20 50 34 20  truct..**.** P4 
ea60: 69 73 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  is a KeyInfo str
ea70: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69  ucture that defi
ea80: 6e 65 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  nes collating se
ea90: 71 75 65 6e 63 65 73 20 61 6e 64 20 73 6f 72 74  quences and sort
eaa0: 0a 2a 2a 20 6f 72 64 65 72 73 20 66 6f 72 20 74  .** orders for t
eab0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  he comparison.  
eac0: 54 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  The permutation 
ead0: 61 70 70 6c 69 65 73 20 74 6f 20 72 65 67 69 73  applies to regis
eae0: 74 65 72 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 20 54  ters.** only.  T
eaf0: 68 65 20 4b 65 79 49 6e 66 6f 20 65 6c 65 6d 65  he KeyInfo eleme
eb00: 6e 74 73 20 61 72 65 20 75 73 65 64 20 73 65 71  nts are used seq
eb10: 75 65 6e 74 69 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a  uentially..**.**
eb20: 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
eb30: 69 73 20 61 20 73 6f 72 74 20 63 6f 6d 70 61 72  is a sort compar
eb40: 69 73 6f 6e 2c 20 73 6f 20 4e 55 4c 4c 73 20 63  ison, so NULLs c
eb50: 6f 6d 70 61 72 65 20 65 71 75 61 6c 2c 0a 2a 2a  ompare equal,.**
eb60: 20 4e 55 4c 4c 73 20 61 72 65 20 6c 65 73 73 20   NULLs are less 
eb70: 74 68 61 6e 20 6e 75 6d 62 65 72 73 2c 20 6e 75  than numbers, nu
eb80: 6d 62 65 72 73 20 61 72 65 20 6c 65 73 73 20 74  mbers are less t
eb90: 68 61 6e 20 73 74 72 69 6e 67 73 2c 0a 2a 2a 20  han strings,.** 
eba0: 61 6e 64 20 73 74 72 69 6e 67 73 20 61 72 65 20  and strings are 
ebb0: 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f 62 73 2e  less than blobs.
ebc0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6d 70  .*/.case OP_Comp
ebd0: 61 72 65 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a  are: {.  int n;.
ebe0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 70    int i;.  int p
ebf0: 31 3b 0a 20 20 69 6e 74 20 70 32 3b 0a 20 20 63  1;.  int p2;.  c
ec00: 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  onst KeyInfo *pK
ec10: 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 69 64  eyInfo;.  int id
ec20: 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  x;.  CollSeq *pC
ec30: 6f 6c 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61  oll;    /* Colla
ec40: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
ec50: 20 75 73 65 20 6f 6e 20 74 68 69 73 20 74 65 72   use on this ter
ec60: 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b  m */.  int bRev;
ec70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
ec80: 65 20 66 6f 72 20 44 45 53 43 45 4e 44 49 4e 47  e for DESCENDING
ec90: 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 0a   sort order */..
eca0: 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20    n = pOp->p3;. 
ecb0: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d   pKeyInfo = pOp-
ecc0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
ecd0: 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20  assert( n>0 );. 
ece0: 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
ecf0: 6f 21 3d 30 20 29 3b 0a 20 20 70 31 20 3d 20 70  o!=0 );.  p1 = p
ed00: 4f 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70  Op->p1;.  p2 = p
ed10: 4f 70 2d 3e 70 32 3b 0a 23 69 66 20 53 51 4c 49  Op->p2;.#if SQLI
ed20: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 61  TE_DEBUG.  if( a
ed30: 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 69  Permute ){.    i
ed40: 6e 74 20 6b 2c 20 6d 78 20 3d 20 30 3b 0a 20 20  nt k, mx = 0;.  
ed50: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 3b 20    for(k=0; k<n; 
ed60: 6b 2b 2b 29 20 69 66 28 20 61 50 65 72 6d 75 74  k++) if( aPermut
ed70: 65 5b 6b 5d 3e 6d 78 20 29 20 6d 78 20 3d 20 61  e[k]>mx ) mx = a
ed80: 50 65 72 6d 75 74 65 5b 6b 5d 3b 0a 20 20 20 20  Permute[k];.    
ed90: 61 73 73 65 72 74 28 20 70 31 3e 30 20 26 26 20  assert( p1>0 && 
eda0: 70 31 2b 6d 78 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31  p1+mx<=p->nMem+1
edb0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
edc0: 70 32 3e 30 20 26 26 20 70 32 2b 6d 78 3c 3d 70  p2>0 && p2+mx<=p
edd0: 2d 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 20 20 7d 65  ->nMem+1 );.  }e
ede0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
edf0: 20 70 31 3e 30 20 26 26 20 70 31 2b 6e 3c 3d 70   p1>0 && p1+n<=p
ee00: 2d 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 20 20 20 20  ->nMem+1 );.    
ee10: 61 73 73 65 72 74 28 20 70 32 3e 30 20 26 26 20  assert( p2>0 && 
ee20: 70 32 2b 6e 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20  p2+n<=p->nMem+1 
ee30: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
ee40: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
ee50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b  .  for(i=0; i<n;
ee60: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 64 78 20 3d   i++){.    idx =
ee70: 20 61 50 65 72 6d 75 74 65 20 3f 20 61 50 65 72   aPermute ? aPer
ee80: 6d 75 74 65 5b 69 5d 20 3a 20 69 3b 0a 20 20 20  mute[i] : i;.   
ee90: 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
eea0: 6c 69 64 28 26 61 4d 65 6d 5b 70 31 2b 69 64 78  lid(&aMem[p1+idx
eeb0: 5d 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ]) );.    assert
eec0: 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d  ( memIsValid(&aM
eed0: 65 6d 5b 70 32 2b 69 64 78 5d 29 20 29 3b 0a 20  em[p2+idx]) );. 
eee0: 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
eef0: 45 28 70 31 2b 69 64 78 2c 20 26 61 4d 65 6d 5b  E(p1+idx, &aMem[
ef00: 70 31 2b 69 64 78 5d 29 3b 0a 20 20 20 20 52 45  p1+idx]);.    RE
ef10: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 32 2b  GISTER_TRACE(p2+
ef20: 69 64 78 2c 20 26 61 4d 65 6d 5b 70 32 2b 69 64  idx, &aMem[p2+id
ef30: 78 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  x]);.    assert(
ef40: 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   i<pKeyInfo->nFi
ef50: 65 6c 64 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  eld );.    pColl
ef60: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
ef70: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 62 52 65 76 20  ll[i];.    bRev 
ef80: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  = pKeyInfo->aSor
ef90: 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 69  tOrder[i];.    i
efa0: 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65  Compare = sqlite
efb0: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 61 4d 65  3MemCompare(&aMe
efc0: 6d 5b 70 31 2b 69 64 78 5d 2c 20 26 61 4d 65 6d  m[p1+idx], &aMem
efd0: 5b 70 32 2b 69 64 78 5d 2c 20 70 43 6f 6c 6c 29  [p2+idx], pColl)
efe0: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6d 70 61  ;.    if( iCompa
eff0: 72 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  re ){.      if( 
f000: 62 52 65 76 20 29 20 69 43 6f 6d 70 61 72 65 20  bRev ) iCompare 
f010: 3d 20 2d 69 43 6f 6d 70 61 72 65 3b 0a 20 20 20  = -iCompare;.   
f020: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f030: 20 20 7d 0a 20 20 61 50 65 72 6d 75 74 65 20 3d    }.  aPermute =
f040: 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   0;.  break;.}..
f050: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4a 75 6d 70 20  /* Opcode: Jump 
f060: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
f070: 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 69  ** Jump to the i
f080: 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20 61 64  nstruction at ad
f090: 64 72 65 73 73 20 50 31 2c 20 50 32 2c 20 6f 72  dress P1, P2, or
f0a0: 20 50 33 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e   P3 depending on
f0b0: 20 77 68 65 74 68 65 72 0a 2a 2a 20 69 6e 20 74   whether.** in t
f0c0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 4f  he most recent O
f0d0: 50 5f 43 6f 6d 70 61 72 65 20 69 6e 73 74 72 75  P_Compare instru
f0e0: 63 74 69 6f 6e 20 74 68 65 20 50 31 20 76 65 63  ction the P1 vec
f0f0: 74 6f 72 20 77 61 73 20 6c 65 73 73 20 74 68 61  tor was less tha
f100: 6e 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f  n.** equal to, o
f110: 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
f120: 68 65 20 50 32 20 76 65 63 74 6f 72 2c 20 72 65  he P2 vector, re
f130: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 63  spectively..*/.c
f140: 61 73 65 20 4f 50 5f 4a 75 6d 70 3a 20 7b 20 20  ase OP_Jump: {  
f150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75             /* ju
f160: 6d 70 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6d  mp */.  if( iCom
f170: 70 61 72 65 3c 30 20 29 7b 0a 20 20 20 20 70 63  pare<0 ){.    pc
f180: 20 3d 20 70 4f 70 2d 3e 70 31 20 2d 20 31 3b 0a   = pOp->p1 - 1;.
f190: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6d    }else if( iCom
f1a0: 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pare==0 ){.    p
f1b0: 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
f1c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 63  .  }else{.    pc
f1d0: 20 3d 20 70 4f 70 2d 3e 70 33 20 2d 20 31 3b 0a   = pOp->p3 - 1;.
f1e0: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
f1f0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 6e 64 20 50  /* Opcode: And P
f200: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
f210: 2a 20 54 61 6b 65 20 74 68 65 20 6c 6f 67 69 63  * Take the logic
f220: 61 6c 20 41 4e 44 20 6f 66 20 74 68 65 20 76 61  al AND of the va
f230: 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72  lues in register
f240: 73 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a  s P1 and P2 and.
f250: 2a 2a 20 77 72 69 74 65 20 74 68 65 20 72 65 73  ** write the res
f260: 75 6c 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65  ult into registe
f270: 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  r P3..**.** If e
f280: 69 74 68 65 72 20 50 31 20 6f 72 20 50 32 20 69  ither P1 or P2 i
f290: 73 20 30 20 28 66 61 6c 73 65 29 20 74 68 65 6e  s 0 (false) then
f2a0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 30   the result is 0
f2b0: 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20   even if.** the 
f2c0: 6f 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  other input is N
f2d0: 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c 20 61 6e 64  ULL.  A NULL and
f2e0: 20 74 72 75 65 20 6f 72 20 74 77 6f 20 4e 55 4c   true or two NUL
f2f0: 4c 73 20 67 69 76 65 0a 2a 2a 20 61 20 4e 55 4c  Ls give.** a NUL
f300: 4c 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 2f 2a 20  L output..*/./* 
f310: 4f 70 63 6f 64 65 3a 20 4f 72 20 50 31 20 50 32  Opcode: Or P1 P2
f320: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 61   P3 * *.**.** Ta
f330: 6b 65 20 74 68 65 20 6c 6f 67 69 63 61 6c 20 4f  ke the logical O
f340: 52 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  R of the values 
f350: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 61  in register P1 a
f360: 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f  nd P2 and.** sto
f370: 72 65 20 74 68 65 20 61 6e 73 77 65 72 20 69 6e  re the answer in
f380: 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
f390: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 50 31  .** If either P1
f3a0: 20 6f 72 20 50 32 20 69 73 20 6e 6f 6e 7a 65 72   or P2 is nonzer
f3b0: 6f 20 28 74 72 75 65 29 20 74 68 65 6e 20 74 68  o (true) then th
f3c0: 65 20 72 65 73 75 6c 74 20 69 73 20 31 20 28 74  e result is 1 (t
f3d0: 72 75 65 29 0a 2a 2a 20 65 76 65 6e 20 69 66 20  rue).** even if 
f3e0: 74 68 65 20 6f 74 68 65 72 20 69 6e 70 75 74 20  the other input 
f3f0: 69 73 20 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c  is NULL.  A NULL
f400: 20 61 6e 64 20 66 61 6c 73 65 20 6f 72 20 74 77   and false or tw
f410: 6f 20 4e 55 4c 4c 73 0a 2a 2a 20 67 69 76 65 20  o NULLs.** give 
f420: 61 20 4e 55 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a  a NULL output..*
f430: 2f 0a 63 61 73 65 20 4f 50 5f 41 6e 64 3a 20 20  /.case OP_And:  
f440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
f450: 61 6d 65 20 61 73 20 54 4b 5f 41 4e 44 2c 20 69  ame as TK_AND, i
f460: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
f470: 0a 63 61 73 65 20 4f 50 5f 4f 72 3a 20 7b 20 20  .case OP_Or: {  
f480: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
f490: 6d 65 20 61 73 20 54 4b 5f 4f 52 2c 20 69 6e 31  me as TK_OR, in1
f4a0: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20  , in2, out3 */. 
f4b0: 20 69 6e 74 20 76 31 3b 20 20 20 20 2f 2a 20 4c   int v1;    /* L
f4c0: 65 66 74 20 6f 70 65 72 61 6e 64 3a 20 20 30 3d  eft operand:  0=
f4d0: 3d 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c  =FALSE, 1==TRUE,
f4e0: 20 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e   2==UNKNOWN or N
f4f0: 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 76 32 3b  ULL */.  int v2;
f500: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65      /* Right ope
f510: 72 61 6e 64 3a 20 30 3d 3d 46 41 4c 53 45 2c 20  rand: 0==FALSE, 
f520: 31 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e  1==TRUE, 2==UNKN
f530: 4f 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 0a  OWN or NULL */..
f540: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
f550: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70  Op->p1];.  if( p
f560: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
f570: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 76 31 20  _Null ){.    v1 
f580: 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 2;.  }else{.  
f590: 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 64    v1 = sqlite3Vd
f5a0: 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29  beIntValue(pIn1)
f5b0: 21 3d 30 3b 0a 20 20 7d 0a 20 20 70 49 6e 32 20  !=0;.  }.  pIn2 
f5c0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
f5d0: 3b 0a 20 20 69 66 28 20 70 49 6e 32 2d 3e 66 6c  ;.  if( pIn2->fl
f5e0: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
f5f0: 7b 0a 20 20 20 20 76 32 20 3d 20 32 3b 0a 20 20  {.    v2 = 2;.  
f600: 7d 65 6c 73 65 7b 0a 20 20 20 20 76 32 20 3d 20  }else{.    v2 = 
f610: 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
f620: 6c 75 65 28 70 49 6e 32 29 21 3d 30 3b 0a 20 20  lue(pIn2)!=0;.  
f630: 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  }.  if( pOp->opc
f640: 6f 64 65 3d 3d 4f 50 5f 41 6e 64 20 29 7b 0a 20  ode==OP_And ){. 
f650: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
f660: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 6e  unsigned char an
f670: 64 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20 30 2c  d_logic[] = { 0,
f680: 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20   0, 0, 0, 1, 2, 
f690: 30 2c 20 32 2c 20 32 20 7d 3b 0a 20 20 20 20 76  0, 2, 2 };.    v
f6a0: 31 20 3d 20 61 6e 64 5f 6c 6f 67 69 63 5b 76 31  1 = and_logic[v1
f6b0: 2a 33 2b 76 32 5d 3b 0a 20 20 7d 65 6c 73 65 7b  *3+v2];.  }else{
f6c0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
f6d0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
f6e0: 6f 72 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20 30  or_logic[] = { 0
f6f0: 2c 20 31 2c 20 32 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 2, 1, 1, 1,
f700: 20 32 2c 20 31 2c 20 32 20 7d 3b 0a 20 20 20 20   2, 1, 2 };.    
f710: 76 31 20 3d 20 6f 72 5f 6c 6f 67 69 63 5b 76 31  v1 = or_logic[v1
f720: 2a 33 2b 76 32 5d 3b 0a 20 20 7d 0a 20 20 70 4f  *3+v2];.  }.  pO
f730: 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
f740: 70 33 5d 3b 0a 20 20 69 66 28 20 76 31 3d 3d 32  p3];.  if( v1==2
f750: 20 29 7b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79   ){.    MemSetTy
f760: 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d  peFlag(pOut, MEM
f770: 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  _Null);.  }else{
f780: 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  .    pOut->u.i =
f790: 20 76 31 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54   v1;.    MemSetT
f7a0: 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45  ypeFlag(pOut, ME
f7b0: 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 20 20 62 72  M_Int);.  }.  br
f7c0: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
f7d0: 65 3a 20 4e 6f 74 20 50 31 20 50 32 20 2a 20 2a  e: Not P1 P2 * *
f7e0: 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72   *.**.** Interpr
f7f0: 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  et the value in 
f800: 72 65 67 69 73 74 65 72 20 50 31 20 61 73 20 61  register P1 as a
f810: 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20   boolean value. 
f820: 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20 62 6f   Store the.** bo
f830: 6f 6c 65 61 6e 20 63 6f 6d 70 6c 65 6d 65 6e 74  olean complement
f840: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
f850: 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69    If the value i
f860: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  n register P1 is
f870: 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   .** NULL, then 
f880: 61 20 4e 55 4c 4c 20 69 73 20 73 74 6f 72 65 64  a NULL is stored
f890: 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20   in P2..*/.case 
f8a0: 4f 50 5f 4e 6f 74 3a 20 7b 20 20 20 20 20 20 20  OP_Not: {       
f8b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
f8c0: 20 61 73 20 54 4b 5f 4e 4f 54 2c 20 69 6e 31 2c   as TK_NOT, in1,
f8d0: 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20   out2 */.  pIn1 
f8e0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
f8f0: 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  ;.  pOut = &aMem
f900: 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69 66 28  [pOp->p2];.  if(
f910: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn1->flags & M
f920: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73  EM_Null ){.    s
f930: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
f940: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 7d 65  Null(pOut);.  }e
f950: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
f960: 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28  VdbeMemSetInt64(
f970: 70 4f 75 74 2c 20 21 73 71 6c 69 74 65 33 56 64  pOut, !sqlite3Vd
f980: 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29  beIntValue(pIn1)
f990: 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
f9a0: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69  }../* Opcode: Bi
f9b0: 74 4e 6f 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  tNot P1 P2 * * *
f9c0: 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  .**.** Interpret
f9d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
f9e0: 72 65 67 69 73 74 65 72 20 50 31 20 61 73 20 61  register P1 as a
f9f0: 6e 20 69 6e 74 65 67 65 72 2e 20 20 53 74 6f 72  n integer.  Stor
fa00: 65 20 74 68 65 0a 2a 2a 20 6f 6e 65 73 2d 63 6f  e the.** ones-co
fa10: 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20  mplement of the 
fa20: 50 31 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65  P1 value into re
fa30: 67 69 73 74 65 72 20 50 32 2e 20 20 49 66 20 50  gister P2.  If P
fa40: 31 20 68 6f 6c 64 73 0a 2a 2a 20 61 20 4e 55 4c  1 holds.** a NUL
fa50: 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 61 20 4e  L then store a N
fa60: 55 4c 4c 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61  ULL in P2..*/.ca
fa70: 73 65 20 4f 50 5f 42 69 74 4e 6f 74 3a 20 7b 20  se OP_BitNot: { 
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
fa90: 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 4e 4f 54  ame as TK_BITNOT
faa0: 2c 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20  , in1, out2 */. 
fab0: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
fac0: 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d  p->p1];.  pOut =
fad0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
fae0: 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61  .  if( pIn1->fla
faf0: 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  gs & MEM_Null ){
fb00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fb10: 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29  MemSetNull(pOut)
fb20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
fb30: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
fb40: 49 6e 74 36 34 28 70 4f 75 74 2c 20 7e 73 71 6c  Int64(pOut, ~sql
fb50: 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65  ite3VdbeIntValue
fb60: 28 70 49 6e 31 29 29 3b 0a 20 20 7d 0a 20 20 62  (pIn1));.  }.  b
fb70: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
fb80: 64 65 3a 20 4f 6e 63 65 20 50 31 20 50 32 20 2a  de: Once P1 P2 *
fb90: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20   * *.**.** Jump 
fba0: 74 6f 20 50 32 20 69 66 20 74 68 65 20 76 61 6c  to P2 if the val
fbb0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
fbc0: 31 20 69 73 20 61 20 6e 6f 74 20 6e 75 6c 6c 20  1 is a not null 
fbd0: 6f 72 20 7a 65 72 6f 2e 20 20 49 66 0a 2a 2a 20  or zero.  If.** 
fbe0: 74 68 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  the value is NUL
fbf0: 4c 20 6f 72 20 7a 65 72 6f 2c 20 66 61 6c 6c 20  L or zero, fall 
fc00: 74 68 72 6f 75 67 68 20 61 6e 64 20 63 68 61 6e  through and chan
fc10: 67 65 20 74 68 65 20 50 31 20 72 65 67 69 73 74  ge the P1 regist
fc20: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 69 6e 74 65  er.** to an inte
fc30: 67 65 72 20 31 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ger 1..**.** Whe
fc40: 6e 20 50 31 20 69 73 20 6e 6f 74 20 75 73 65 64  n P1 is not used
fc50: 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 61 20   otherwise in a 
fc60: 70 72 6f 67 72 61 6d 2c 20 74 68 69 73 20 6f 70  program, this op
fc70: 63 6f 64 65 20 66 61 6c 6c 73 20 74 68 72 6f 75  code falls throu
fc80: 67 68 0a 2a 2a 20 6f 6e 63 65 20 61 6e 64 20 6a  gh.** once and j
fc90: 75 6d 70 73 20 6f 6e 20 61 6c 6c 20 73 75 62 73  umps on all subs
fca0: 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
fcb0: 6e 73 2e 20 20 49 74 20 69 73 20 74 68 65 20 65  ns.  It is the e
fcc0: 71 75 69 76 61 6c 65 6e 74 0a 2a 2a 20 6f 66 20  quivalent.** of 
fcd0: 22 4f 50 5f 49 66 20 50 31 20 50 32 22 2c 20 66  "OP_If P1 P2", f
fce0: 6f 6c 6c 6f 77 65 64 20 62 79 20 22 4f 50 5f 49  ollowed by "OP_I
fcf0: 6e 74 65 67 65 72 20 31 20 50 31 22 2e 0a 2a 2f  nteger 1 P1"..*/
fd00: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 20 50  ./* Opcode: If P
fd10: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
fd20: 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20  * Jump to P2 if 
fd30: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
fd40: 69 73 74 65 72 20 50 31 20 69 73 20 74 72 75 65  ister P1 is true
fd50: 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20  .  The value.** 
fd60: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 72  is considered tr
fd70: 75 65 20 69 66 20 69 74 20 69 73 20 6e 75 6d 65  ue if it is nume
fd80: 72 69 63 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f  ric and non-zero
fd90: 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a  .  If the value.
fda0: 2a 2a 20 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c  ** in P1 is NULL
fdb0: 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a   then take the j
fdc0: 75 6d 70 20 69 66 20 50 33 20 69 73 20 74 72 75  ump if P3 is tru
fdd0: 65 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  e..*/./* Opcode:
fde0: 20 49 66 4e 6f 74 20 50 31 20 50 32 20 50 33 20   IfNot P1 P2 P3 
fdf0: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74  * *.**.** Jump t
fe00: 6f 20 50 32 20 69 66 20 74 68 65 20 76 61 6c 75  o P2 if the valu
fe10: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
fe20: 20 69 73 20 46 61 6c 73 65 2e 20 20 54 68 65 20   is False.  The 
fe30: 76 61 6c 75 65 0a 2a 2a 20 69 73 20 63 6f 6e 73  value.** is cons
fe40: 69 64 65 72 65 64 20 74 72 75 65 20 69 66 20 69  idered true if i
fe50: 74 20 68 61 73 20 61 20 6e 75 6d 65 72 69 63 20  t has a numeric 
fe60: 76 61 6c 75 65 20 6f 66 20 7a 65 72 6f 2e 20 20  value of zero.  
fe70: 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  If the value.** 
fe80: 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c 20 74 68  in P1 is NULL th
fe90: 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  en take the jump
fea0: 20 69 66 20 50 33 20 69 73 20 74 72 75 65 2e 0a   if P3 is true..
feb0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 6e 63 65 3a  */.case OP_Once:
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fed0: 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 63  * jump, in1 */.c
fee0: 61 73 65 20 4f 50 5f 49 66 3a 20 20 20 20 20 20  ase OP_If:      
fef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75             /* ju
ff00: 6d 70 2c 20 69 6e 31 20 2a 2f 0a 63 61 73 65 20  mp, in1 */.case 
ff10: 4f 50 5f 49 66 4e 6f 74 3a 20 7b 20 20 20 20 20  OP_IfNot: {     
ff20: 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
ff30: 69 6e 31 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 0a  in1 */.  int c;.
ff40: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
ff50: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70  Op->p1];.  if( p
ff60: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
ff70: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 63 20 3d  _Null ){.    c =
ff80: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 65 6c 73   pOp->p3;.  }els
ff90: 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
ffa0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
ffb0: 4f 49 4e 54 0a 20 20 20 20 63 20 3d 20 73 71 6c  OINT.    c = sql
ffc0: 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65  ite3VdbeIntValue
ffd0: 28 70 49 6e 31 29 21 3d 30 3b 0a 23 65 6c 73 65  (pIn1)!=0;.#else
ffe0: 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33  .    c = sqlite3
fff0: 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28 70 49  VdbeRealValue(pI
10000 6e 31 29 21 3d 30 2e 30 3b 0a 23 65 6e 64 69 66  n1)!=0.0;.#endif
10010 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
10020 63 6f 64 65 3d 3d 4f 50 5f 49 66 4e 6f 74 20 29  code==OP_IfNot )
10030 20 63 20 3d 20 21 63 3b 0a 20 20 7d 0a 20 20 69   c = !c;.  }.  i
10040 66 28 20 63 20 29 7b 0a 20 20 20 20 70 63 20 3d  f( c ){.    pc =
10050 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d 65   pOp->p2-1;.  }e
10060 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  lse if( pOp->opc
10070 6f 64 65 3d 3d 4f 50 5f 4f 6e 63 65 20 29 7b 0a  ode==OP_Once ){.
10080 20 20 20 20 61 73 73 65 72 74 28 20 28 70 49 6e      assert( (pIn
10090 31 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  1->flags & (MEM_
100a0 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f  Agg|MEM_Dyn|MEM_
100b0 52 6f 77 53 65 74 7c 4d 45 4d 5f 46 72 61 6d 65  RowSet|MEM_Frame
100c0 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 65 6d  ))==0 );.    mem
100d0 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
100e0 20 70 49 6e 31 29 3b 0a 20 20 20 20 70 49 6e 31   pIn1);.    pIn1
100f0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
10100 74 3b 0a 20 20 20 20 70 49 6e 31 2d 3e 75 2e 69  t;.    pIn1->u.i
10110 20 3d 20 31 3b 0a 20 20 20 20 52 45 47 49 53 54   = 1;.    REGIST
10120 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31  ER_TRACE(pOp->p1
10130 2c 20 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20 62  , pIn1);.  }.  b
10140 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
10150 64 65 3a 20 49 73 4e 75 6c 6c 20 50 31 20 50 32  de: IsNull P1 P2
10160 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d   * * *.**.** Jum
10170 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 76  p to P2 if the v
10180 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
10190 20 50 31 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a   P1 is NULL..*/.
101a0 63 61 73 65 20 4f 50 5f 49 73 4e 75 6c 6c 3a 20  case OP_IsNull: 
101b0 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  {            /* 
101c0 73 61 6d 65 20 61 73 20 54 4b 5f 49 53 4e 55 4c  same as TK_ISNUL
101d0 4c 2c 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a  L, jump, in1 */.
101e0 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
101f0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 28  Op->p1];.  if( (
10200 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
10210 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29 7b 0a 20 20  M_Null)!=0 ){.  
10220 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
10230 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   1;.  }.  break;
10240 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  .}../* Opcode: N
10250 6f 74 4e 75 6c 6c 20 50 31 20 50 32 20 2a 20 2a  otNull P1 P2 * *
10260 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f   *.**.** Jump to
10270 20 50 32 20 69 66 20 74 68 65 20 76 61 6c 75 65   P2 if the value
10280 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
10290 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 20 0a 2a  is not NULL.  .*
102a0 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 4e 75 6c  /.case OP_NotNul
102b0 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  l: {            
102c0 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4e 4f  /* same as TK_NO
102d0 54 4e 55 4c 4c 2c 20 6a 75 6d 70 2c 20 69 6e 31  TNULL, jump, in1
102e0 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
102f0 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69  em[pOp->p1];.  i
10300 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
10310 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
10320 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e  {.    pc = pOp->
10330 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72  p2 - 1;.  }.  br
10340 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
10350 65 3a 20 43 6f 6c 75 6d 6e 20 50 31 20 50 32 20  e: Column P1 P2 
10360 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 49  P3 P4 P5.**.** I
10370 6e 74 65 72 70 72 65 74 20 74 68 65 20 64 61 74  nterpret the dat
10380 61 20 74 68 61 74 20 63 75 72 73 6f 72 20 50 31  a that cursor P1
10390 20 70 6f 69 6e 74 73 20 74 6f 20 61 73 20 61 20   points to as a 
103a0 73 74 72 75 63 74 75 72 65 20 62 75 69 6c 74 20  structure built 
103b0 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 4d 61 6b  using.** the Mak
103c0 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63 74  eRecord instruct
103d0 69 6f 6e 2e 20 20 28 53 65 65 20 74 68 65 20 4d  ion.  (See the M
103e0 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
103f0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 0a   for additional.
10400 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** information a
10410 62 6f 75 74 20 74 68 65 20 66 6f 72 6d 61 74 20  bout the format 
10420 6f 66 20 74 68 65 20 64 61 74 61 2e 29 20 20 45  of the data.)  E
10430 78 74 72 61 63 74 20 74 68 65 20 50 32 2d 74 68  xtract the P2-th
10440 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 66 72 6f 6d 20   column.** from 
10450 74 68 69 73 20 72 65 63 6f 72 64 2e 20 20 49 66  this record.  If
10460 20 74 68 65 72 65 20 61 72 65 20 6c 65 73 73 20   there are less 
10470 74 68 61 74 20 28 50 32 2b 31 29 20 0a 2a 2a 20  that (P2+1) .** 
10480 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 72 65  values in the re
10490 63 6f 72 64 2c 20 65 78 74 72 61 63 74 20 61 20  cord, extract a 
104a0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
104b0 76 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  value extracted 
104c0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
104d0 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20  ister P3..**.** 
104e0 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f  If the column co
104f0 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74 68 61  ntains fewer tha
10500 6e 20 50 32 20 66 69 65 6c 64 73 2c 20 74 68 65  n P2 fields, the
10510 6e 20 65 78 74 72 61 63 74 20 61 20 4e 55 4c 4c  n extract a NULL
10520 2e 20 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65  .  Or,.** if the
10530 20 50 34 20 61 72 67 75 6d 65 6e 74 20 69 73 20   P4 argument is 
10540 61 20 50 34 5f 4d 45 4d 20 75 73 65 20 74 68 65  a P4_MEM use the
10550 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
10560 20 61 72 67 75 6d 65 6e 74 20 61 73 0a 2a 2a 20   argument as.** 
10570 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
10580 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f  * If the OPFLAG_
10590 43 4c 45 41 52 43 41 43 48 45 20 62 69 74 20 69  CLEARCACHE bit i
105a0 73 20 73 65 74 20 6f 6e 20 50 35 20 61 6e 64 20  s set on P5 and 
105b0 50 31 20 69 73 20 61 20 70 73 65 75 64 6f 2d 74  P1 is a pseudo-t
105c0 61 62 6c 65 20 63 75 72 73 6f 72 2c 0a 2a 2a 20  able cursor,.** 
105d0 74 68 65 6e 20 74 68 65 20 63 61 63 68 65 20 6f  then the cache o
105e0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
105f0 72 65 73 65 74 20 70 72 69 6f 72 20 74 6f 20 65  reset prior to e
10600 78 74 72 61 63 74 69 6e 67 20 74 68 65 20 63 6f  xtracting the co
10610 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65 20 66 69 72  lumn..** The fir
10620 73 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 67 61  st OP_Column aga
10630 69 6e 73 74 20 61 20 70 73 65 75 64 6f 2d 74 61  inst a pseudo-ta
10640 62 6c 65 20 61 66 74 65 72 20 74 68 65 20 76 61  ble after the va
10650 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  lue of the conte
10660 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 68  nt.** register h
10670 61 73 20 63 68 61 6e 67 65 64 20 73 68 6f 75 6c  as changed shoul
10680 64 20 68 61 76 65 20 74 68 69 73 20 62 69 74 20  d have this bit 
10690 73 65 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  set..*/.case OP_
106a0 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 75 33 32 20  Column: {.  u32 
106b0 70 61 79 6c 6f 61 64 53 69 7a 65 3b 20 20 20 2f  payloadSize;   /
106c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
106d0 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20  s in the record 
106e0 2a 2f 0a 20 20 69 36 34 20 70 61 79 6c 6f 61 64  */.  i64 payload
106f0 53 69 7a 65 36 34 3b 20 2f 2a 20 4e 75 6d 62 65  Size64; /* Numbe
10700 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
10710 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  e record */.  in
10720 74 20 70 31 3b 20 20 20 20 20 20 20 20 20 20 20  t p1;           
10730 20 2f 2a 20 50 31 20 76 61 6c 75 65 20 6f 66 20   /* P1 value of 
10740 74 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  the opcode */.  
10750 69 6e 74 20 70 32 3b 20 20 20 20 20 20 20 20 20  int p2;         
10760 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d     /* column num
10770 62 65 72 20 74 6f 20 72 65 74 72 69 65 76 65 20  ber to retrieve 
10780 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
10790 2a 70 43 3b 20 20 20 20 2f 2a 20 54 68 65 20 56  *pC;    /* The V
107a0 44 42 45 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  DBE cursor */.  
107b0 63 68 61 72 20 2a 7a 52 65 63 3b 20 20 20 20 20  char *zRec;     
107c0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
107d0 20 63 6f 6d 70 6c 65 74 65 20 72 65 63 6f 72 64   complete record
107e0 2d 64 61 74 61 20 2a 2f 0a 20 20 42 74 43 75 72  -data */.  BtCur
107f0 73 6f 72 20 2a 70 43 72 73 72 3b 20 20 20 2f 2a  sor *pCrsr;   /*
10800 20 54 68 65 20 42 54 72 65 65 20 63 75 72 73 6f   The BTree curso
10810 72 20 2a 2f 0a 20 20 75 33 32 20 2a 61 54 79 70  r */.  u32 *aTyp
10820 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 61 54 79  e;        /* aTy
10830 70 65 5b 69 5d 20 68 6f 6c 64 73 20 74 68 65 20  pe[i] holds the 
10840 6e 75 6d 65 72 69 63 20 74 79 70 65 20 6f 66 20  numeric type of 
10850 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20  the i-th column 
10860 2a 2f 0a 20 20 75 33 32 20 2a 61 4f 66 66 73 65  */.  u32 *aOffse
10870 74 3b 20 20 20 20 20 20 2f 2a 20 61 4f 66 66 73  t;      /* aOffs
10880 65 74 5b 69 5d 20 69 73 20 6f 66 66 73 65 74 20  et[i] is offset 
10890 74 6f 20 73 74 61 72 74 20 6f 66 20 64 61 74 61  to start of data
108a0 20 66 6f 72 20 69 2d 74 68 20 63 6f 6c 75 6d 6e   for i-th column
108b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   */.  int nField
108c0 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62  ;        /* numb
108d0 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
108e0 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
108f0 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  int len;        
10900 20 20 20 2f 2a 20 54 68 65 20 6c 65 6e 67 74 68     /* The length
10910 20 6f 66 20 74 68 65 20 73 65 72 69 61 6c 69 7a   of the serializ
10920 65 64 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ed data for the 
10930 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
10940 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  i;             /
10950 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
10960 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61 3b  /.  char *zData;
10970 20 20 20 20 20 20 20 2f 2a 20 50 61 72 74 20 6f         /* Part o
10980 66 20 74 68 65 20 72 65 63 6f 72 64 20 62 65 69  f the record bei
10990 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20  ng decoded */.  
109a0 4d 65 6d 20 2a 70 44 65 73 74 3b 20 20 20 20 20  Mem *pDest;     
109b0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
109c0 72 69 74 65 20 74 68 65 20 65 78 74 72 61 63 74  rite the extract
109d0 65 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65  ed value */.  Me
109e0 6d 20 73 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  m sMem;         
109f0 20 2f 2a 20 46 6f 72 20 73 74 6f 72 69 6e 67 20   /* For storing 
10a00 74 68 65 20 72 65 63 6f 72 64 20 62 65 69 6e 67  the record being
10a10 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 75 38   decoded */.  u8
10a20 20 2a 7a 49 64 78 3b 20 20 20 20 20 20 20 20 20   *zIdx;         
10a30 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 68   /* Index into h
10a40 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a  eader */.  u8 *z
10a50 45 6e 64 48 64 72 3b 20 20 20 20 20 20 20 2f 2a  EndHdr;       /*
10a60 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73   Pointer to firs
10a70 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65  t byte after the
10a80 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
10a90 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
10aa0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74  /* Offset into t
10ab0 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 33 32  he data */.  u32
10ac0 20 73 7a 46 69 65 6c 64 3b 20 20 20 20 20 20 20   szField;       
10ad0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
10ae0 65 73 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  es in the conten
10af0 74 20 6f 66 20 61 20 66 69 65 6c 64 20 2a 2f 0a  t of a field */.
10b00 20 20 69 6e 74 20 73 7a 48 64 72 3b 20 20 20 20    int szHdr;    
10b10 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
10b20 74 68 65 20 68 65 61 64 65 72 20 73 69 7a 65 20  the header size 
10b30 66 69 65 6c 64 20 61 74 20 73 74 61 72 74 20 6f  field at start o
10b40 66 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  f record */.  in
10b50 74 20 61 76 61 69 6c 3b 20 20 20 20 20 20 20 20  t avail;        
10b60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
10b70 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
10b80 20 64 61 74 61 20 2a 2f 0a 20 20 75 33 32 20 74   data */.  u32 t
10b90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10ba0 20 41 20 74 79 70 65 20 63 6f 64 65 20 66 72 6f   A type code fro
10bb0 6d 20 74 68 65 20 72 65 63 6f 72 64 20 68 65 61  m the record hea
10bc0 64 65 72 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52  der */.  Mem *pR
10bd0 65 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  eg;         /* P
10be0 73 65 75 64 6f 54 61 62 6c 65 20 69 6e 70 75 74  seudoTable input
10bf0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 0a 20   register */... 
10c00 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20   p1 = pOp->p1;. 
10c10 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20   p2 = pOp->p2;. 
10c20 20 70 43 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65   pC = 0;.  memse
10c30 74 28 26 73 4d 65 6d 2c 20 30 2c 20 73 69 7a 65  t(&sMem, 0, size
10c40 6f 66 28 73 4d 65 6d 29 29 3b 0a 20 20 61 73 73  of(sMem));.  ass
10c50 65 72 74 28 20 70 31 3c 70 2d 3e 6e 43 75 72 73  ert( p1<p->nCurs
10c60 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  or );.  assert( 
10c70 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70  pOp->p3>0 && pOp
10c80 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b  ->p3<=p->nMem );
10c90 0a 20 20 70 44 65 73 74 20 3d 20 26 61 4d 65 6d  .  pDest = &aMem
10ca0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d  [pOp->p3];.  mem
10cb0 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
10cc0 20 70 44 65 73 74 29 3b 0a 20 20 7a 52 65 63 20   pDest);.  zRec 
10cd0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  = 0;..  /* This 
10ce0 62 6c 6f 63 6b 20 73 65 74 73 20 74 68 65 20 76  block sets the v
10cf0 61 72 69 61 62 6c 65 20 70 61 79 6c 6f 61 64 53  ariable payloadS
10d00 69 7a 65 20 74 6f 20 62 65 20 74 68 65 20 74 6f  ize to be the to
10d10 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  tal number of.  
10d20 2a 2a 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  ** bytes in the 
10d30 72 65 63 6f 72 64 2e 0a 20 20 2a 2a 0a 20 20 2a  record..  **.  *
10d40 2a 20 7a 52 65 63 20 69 73 20 73 65 74 20 74 6f  * zRec is set to
10d50 20 62 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   be the complete
10d60 20 74 65 78 74 20 6f 66 20 74 68 65 20 72 65 63   text of the rec
10d70 6f 72 64 20 69 66 20 69 74 20 69 73 20 61 76 61  ord if it is ava
10d80 69 6c 61 62 6c 65 2e 0a 20 20 2a 2a 20 54 68 65  ilable..  ** The
10d90 20 63 6f 6d 70 6c 65 74 65 20 72 65 63 6f 72 64   complete record
10da0 20 74 65 78 74 20 69 73 20 61 6c 77 61 79 73 20   text is always 
10db0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 70 73  available for ps
10dc0 65 75 64 6f 2d 74 61 62 6c 65 73 0a 20 20 2a 2a  eudo-tables.  **
10dd0 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
10de0 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 63 75  s stored in a cu
10df0 72 73 6f 72 2c 20 74 68 65 20 63 6f 6d 70 6c 65  rsor, the comple
10e00 74 65 20 72 65 63 6f 72 64 20 74 65 78 74 0a 20  te record text. 
10e10 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 61 76 61   ** might be ava
10e20 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 20 70  ilable in the  p
10e30 43 2d 3e 61 52 6f 77 20 63 61 63 68 65 2e 20 20  C->aRow cache.  
10e40 4f 72 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  Or it might not 
10e50 62 65 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  be..  ** If the 
10e60 64 61 74 61 20 69 73 20 75 6e 61 76 61 69 6c 61  data is unavaila
10e70 62 6c 65 2c 20 20 7a 52 65 63 20 69 73 20 73 65  ble,  zRec is se
10e80 74 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a  t to NULL..  **.
10e90 20 20 2a 2a 20 57 65 20 61 6c 73 6f 20 63 6f 6d    ** We also com
10ea0 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
10eb0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
10ec0 65 20 72 65 63 6f 72 64 2e 20 20 46 6f 72 20 63  e record.  For c
10ed0 75 72 73 6f 72 73 2c 0a 20 20 2a 2a 20 74 68 65  ursors,.  ** the
10ee0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
10ef0 6e 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ns is stored in 
10f00 74 68 65 20 56 64 62 65 43 75 72 73 6f 72 2e 6e  the VdbeCursor.n
10f10 46 69 65 6c 64 20 65 6c 65 6d 65 6e 74 2e 0a 20  Field element.. 
10f20 20 2a 2f 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   */.  pC = p->ap
10f30 43 73 72 5b 70 31 5d 3b 0a 20 20 61 73 73 65 72  Csr[p1];.  asser
10f40 74 28 20 70 43 21 3d 30 20 29 3b 0a 23 69 66 6e  t( pC!=0 );.#ifn
10f50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10f60 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 61  VIRTUALTABLE.  a
10f70 73 73 65 72 74 28 20 70 43 2d 3e 70 56 74 61 62  ssert( pC->pVtab
10f80 43 75 72 73 6f 72 3d 3d 30 20 29 3b 0a 23 65 6e  Cursor==0 );.#en
10f90 64 69 66 0a 20 20 70 43 72 73 72 20 3d 20 70 43  dif.  pCrsr = pC
10fa0 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  ->pCursor;.  if(
10fb0 20 70 43 72 73 72 21 3d 30 20 29 7b 0a 20 20 20   pCrsr!=0 ){.   
10fc0 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 69   /* The record i
10fd0 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 42 2d  s stored in a B-
10fe0 54 72 65 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  Tree */.    rc =
10ff0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
11000 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20  orMoveto(pC);.  
11010 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
11020 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
11030 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e  or;.    if( pC->
11040 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20  nullRow ){.     
11050 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 30   payloadSize = 0
11060 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
11070 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 3d  pC->cacheStatus=
11080 3d 70 2d 3e 63 61 63 68 65 43 74 72 20 29 7b 0a  =p->cacheCtr ){.
11090 20 20 20 20 20 20 70 61 79 6c 6f 61 64 53 69 7a        payloadSiz
110a0 65 20 3d 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53  e = pC->payloadS
110b0 69 7a 65 3b 0a 20 20 20 20 20 20 7a 52 65 63 20  ize;.      zRec 
110c0 3d 20 28 63 68 61 72 2a 29 70 43 2d 3e 61 52 6f  = (char*)pC->aRo
110d0 77 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  w;.    }else if(
110e0 20 70 43 2d 3e 69 73 49 6e 64 65 78 20 29 7b 0a   pC->isIndex ){.
110f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
11100 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
11110 49 73 56 61 6c 69 64 28 70 43 72 73 72 29 20 29  IsValid(pCrsr) )
11120 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
11130 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
11140 28 70 43 72 73 72 2c 20 26 70 61 79 6c 6f 61 64  (pCrsr, &payload
11150 53 69 7a 65 36 34 29 3b 0a 20 20 20 20 20 20 61  Size64);.      a
11160 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
11170 45 5f 4f 4b 20 29 3b 20 20 20 2f 2a 20 54 72 75  E_OK );   /* Tru
11180 65 20 62 65 63 61 75 73 65 20 6f 66 20 43 75 72  e because of Cur
11190 73 6f 72 4d 6f 76 65 74 6f 28 29 20 63 61 6c 6c  sorMoveto() call
111a0 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20   above */.      
111b0 2f 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  /* sqlite3BtreeP
111c0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 75 73  arseCellPtr() us
111d0 65 73 20 67 65 74 56 61 72 69 6e 74 33 32 28 29  es getVarint32()
111e0 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 0a   to extract the.
111f0 20 20 20 20 20 20 2a 2a 20 70 61 79 6c 6f 61 64        ** payload
11200 20 73 69 7a 65 2c 20 73 6f 20 69 74 20 69 73 20   size, so it is 
11210 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 70  impossible for p
11220 61 79 6c 6f 61 64 53 69 7a 65 36 34 20 74 6f 20  ayloadSize64 to 
11230 62 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67  be.      ** larg
11240 65 72 20 74 68 61 6e 20 33 32 20 62 69 74 73 2e  er than 32 bits.
11250 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
11260 28 20 28 70 61 79 6c 6f 61 64 53 69 7a 65 36 34  ( (payloadSize64
11270 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33   & SQLITE_MAX_U3
11280 32 29 3d 3d 28 75 36 34 29 70 61 79 6c 6f 61 64  2)==(u64)payload
11290 53 69 7a 65 36 34 20 29 3b 0a 20 20 20 20 20 20  Size64 );.      
112a0 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 28 75  payloadSize = (u
112b0 33 32 29 70 61 79 6c 6f 61 64 53 69 7a 65 36 34  32)payloadSize64
112c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
112d0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
112e0 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
112f0 61 6c 69 64 28 70 43 72 73 72 29 20 29 3b 0a 20  alid(pCrsr) );. 
11300 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11310 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 70  3BtreeDataSize(p
11320 43 72 73 72 2c 20 26 70 61 79 6c 6f 61 64 53 69  Crsr, &payloadSi
11330 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ze);.      asser
11340 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
11350 20 29 3b 20 20 20 2f 2a 20 44 61 74 61 53 69 7a   );   /* DataSiz
11360 65 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  e() cannot fail 
11370 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  */.    }.  }else
11380 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 2d 3e   if( ALWAYS(pC->
11390 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67 3e 30  pseudoTableReg>0
113a0 29 20 29 7b 0a 20 20 20 20 70 52 65 67 20 3d 20  ) ){.    pReg = 
113b0 26 61 4d 65 6d 5b 70 43 2d 3e 70 73 65 75 64 6f  &aMem[pC->pseudo
113c0 54 61 62 6c 65 52 65 67 5d 3b 0a 20 20 20 20 61  TableReg];.    a
113d0 73 73 65 72 74 28 20 70 52 65 67 2d 3e 66 6c 61  ssert( pReg->fla
113e0 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
113f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d  .    assert( mem
11400 49 73 56 61 6c 69 64 28 70 52 65 67 29 20 29 3b  IsValid(pReg) );
11410 0a 20 20 20 20 70 61 79 6c 6f 61 64 53 69 7a 65  .    payloadSize
11420 20 3d 20 70 52 65 67 2d 3e 6e 3b 0a 20 20 20 20   = pReg->n;.    
11430 7a 52 65 63 20 3d 20 70 52 65 67 2d 3e 7a 3b 0a  zRec = pReg->z;.
11440 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61      pC->cacheSta
11450 74 75 73 20 3d 20 28 70 4f 70 2d 3e 70 35 26 4f  tus = (pOp->p5&O
11460 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45  PFLAG_CLEARCACHE
11470 29 20 3f 20 43 41 43 48 45 5f 53 54 41 4c 45 20  ) ? CACHE_STALE 
11480 3a 20 70 2d 3e 63 61 63 68 65 43 74 72 3b 0a 20  : p->cacheCtr;. 
11490 20 20 20 61 73 73 65 72 74 28 20 70 61 79 6c 6f     assert( paylo
114a0 61 64 53 69 7a 65 3d 3d 30 20 7c 7c 20 7a 52 65  adSize==0 || zRe
114b0 63 21 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  c!=0 );.  }else{
114c0 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72  .    /* Consider
114d0 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65 20 4e   the row to be N
114e0 55 4c 4c 20 2a 2f 0a 20 20 20 20 70 61 79 6c 6f  ULL */.    paylo
114f0 61 64 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 0a  adSize = 0;.  }.
11500 0a 20 20 2f 2a 20 49 66 20 70 61 79 6c 6f 61 64  .  /* If payload
11510 53 69 7a 65 20 69 73 20 30 2c 20 74 68 65 6e 20  Size is 0, then 
11520 6a 75 73 74 20 73 74 6f 72 65 20 61 20 4e 55 4c  just store a NUL
11530 4c 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70  L.  This can hap
11540 70 65 6e 20 62 65 63 61 75 73 65 20 6f 66 0a 20  pen because of. 
11550 20 2a 2a 20 6e 75 6c 6c 52 6f 77 20 6f 72 20 62   ** nullRow or b
11560 65 63 61 75 73 65 20 6f 66 20 61 20 63 6f 72 72  ecause of a corr
11570 75 70 74 20 64 61 74 61 62 61 73 65 2e 20 2a 2f  upt database. */
11580 0a 20 20 69 66 28 20 70 61 79 6c 6f 61 64 53 69  .  if( payloadSi
11590 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d  ze==0 ){.    Mem
115a0 53 65 74 54 79 70 65 46 6c 61 67 28 70 44 65 73  SetTypeFlag(pDes
115b0 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  t, MEM_Null);.  
115c0 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e    goto op_column
115d0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _out;.  }.  asse
115e0 72 74 28 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  rt( db->aLimit[S
115f0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
11600 54 48 5d 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  TH]>=0 );.  if( 
11610 70 61 79 6c 6f 61 64 53 69 7a 65 20 3e 20 28 75  payloadSize > (u
11620 33 32 29 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  32)db->aLimit[SQ
11630 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
11640 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  H] ){.    goto t
11650 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a 20 20 6e  oo_big;.  }..  n
11660 46 69 65 6c 64 20 3d 20 70 43 2d 3e 6e 46 69 65  Field = pC->nFie
11670 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 32  ld;.  assert( p2
11680 3c 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a  <nField );..  /*
11690 20 52 65 61 64 20 61 6e 64 20 70 61 72 73 65 20   Read and parse 
116a0 74 68 65 20 74 61 62 6c 65 20 68 65 61 64 65 72  the table header
116b0 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  .  Store the res
116c0 75 6c 74 73 20 6f 66 20 74 68 65 20 70 61 72 73  ults of the pars
116d0 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20  e.  ** into the 
116e0 72 65 63 6f 72 64 20 68 65 61 64 65 72 20 63 61  record header ca
116f0 63 68 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  che fields of th
11700 65 20 63 75 72 73 6f 72 2e 0a 20 20 2a 2f 0a 20  e cursor..  */. 
11710 20 61 54 79 70 65 20 3d 20 70 43 2d 3e 61 54 79   aType = pC->aTy
11720 70 65 3b 0a 20 20 69 66 28 20 70 43 2d 3e 63 61  pe;.  if( pC->ca
11730 63 68 65 53 74 61 74 75 73 3d 3d 70 2d 3e 63 61  cheStatus==p->ca
11740 63 68 65 43 74 72 20 29 7b 0a 20 20 20 20 61 4f  cheCtr ){.    aO
11750 66 66 73 65 74 20 3d 20 70 43 2d 3e 61 4f 66 66  ffset = pC->aOff
11760 73 65 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  set;.  }else{.  
11770 20 20 61 73 73 65 72 74 28 61 54 79 70 65 29 3b    assert(aType);
11780 0a 20 20 20 20 61 76 61 69 6c 20 3d 20 30 3b 0a  .    avail = 0;.
11790 20 20 20 20 70 43 2d 3e 61 4f 66 66 73 65 74 20      pC->aOffset 
117a0 3d 20 61 4f 66 66 73 65 74 20 3d 20 26 61 54 79  = aOffset = &aTy
117b0 70 65 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20  pe[nField];.    
117c0 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20  pC->payloadSize 
117d0 3d 20 70 61 79 6c 6f 61 64 53 69 7a 65 3b 0a 20  = payloadSize;. 
117e0 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74     pC->cacheStat
117f0 75 73 20 3d 20 70 2d 3e 63 61 63 68 65 43 74 72  us = p->cacheCtr
11800 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ;..    /* Figure
11810 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79   out how many by
11820 74 65 73 20 61 72 65 20 69 6e 20 74 68 65 20 68  tes are in the h
11830 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 69 66 28  eader */.    if(
11840 20 7a 52 65 63 20 29 7b 0a 20 20 20 20 20 20 7a   zRec ){.      z
11850 44 61 74 61 20 3d 20 7a 52 65 63 3b 0a 20 20 20  Data = zRec;.   
11860 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
11870 28 20 70 43 2d 3e 69 73 49 6e 64 65 78 20 29 7b  ( pC->isIndex ){
11880 0a 20 20 20 20 20 20 20 20 7a 44 61 74 61 20 3d  .        zData =
11890 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 42   (char*)sqlite3B
118a0 74 72 65 65 4b 65 79 46 65 74 63 68 28 70 43 72  treeKeyFetch(pCr
118b0 73 72 2c 20 26 61 76 61 69 6c 29 3b 0a 20 20 20  sr, &avail);.   
118c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
118d0 20 20 7a 44 61 74 61 20 3d 20 28 63 68 61 72 2a    zData = (char*
118e0 29 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74  )sqlite3BtreeDat
118f0 61 46 65 74 63 68 28 70 43 72 73 72 2c 20 26 61  aFetch(pCrsr, &a
11900 76 61 69 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  vail);.      }. 
11910 20 20 20 20 20 2f 2a 20 49 66 20 4b 65 79 46 65       /* If KeyFe
11920 74 63 68 28 29 2f 44 61 74 61 46 65 74 63 68 28  tch()/DataFetch(
11930 29 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74  ) managed to get
11940 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c   the entire payl
11950 6f 61 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73 61  oad,.      ** sa
11960 76 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69  ve the payload i
11970 6e 20 74 68 65 20 70 43 2d 3e 61 52 6f 77 20 63  n the pC->aRow c
11980 61 63 68 65 2e 20 20 54 68 61 74 20 77 69 6c 6c  ache.  That will
11990 20 73 61 76 65 20 75 73 20 66 72 6f 6d 0a 20 20   save us from.  
119a0 20 20 20 20 2a 2a 20 68 61 76 69 6e 67 20 74 6f      ** having to
119b0 20 6d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c   make additional
119c0 20 63 61 6c 6c 73 20 74 6f 20 66 65 74 63 68 20   calls to fetch 
119d0 74 68 65 20 63 6f 6e 74 65 6e 74 20 70 6f 72 74  the content port
119e0 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ion of.      ** 
119f0 74 68 65 20 72 65 63 6f 72 64 2e 0a 20 20 20 20  the record..    
11a00 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
11a10 74 28 20 61 76 61 69 6c 3e 3d 30 20 29 3b 0a 20  t( avail>=0 );. 
11a20 20 20 20 20 20 69 66 28 20 70 61 79 6c 6f 61 64       if( payload
11a30 53 69 7a 65 20 3c 3d 20 28 75 33 32 29 61 76 61  Size <= (u32)ava
11a40 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52  il ){.        zR
11a50 65 63 20 3d 20 7a 44 61 74 61 3b 0a 20 20 20 20  ec = zData;.    
11a60 20 20 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20 28      pC->aRow = (
11a70 75 38 2a 29 7a 44 61 74 61 3b 0a 20 20 20 20 20  u8*)zData;.     
11a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11a90 70 43 2d 3e 61 52 6f 77 20 3d 20 30 3b 0a 20 20  pC->aRow = 0;.  
11aa0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
11ab0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
11ac0 20 61 73 73 65 72 74 20 69 73 20 74 72 75 65 20   assert is true 
11ad0 69 6e 20 61 6c 6c 20 63 61 73 65 73 20 61 63 63  in all cases acc
11ae0 65 70 74 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  ept when.    ** 
11af0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11b00 65 20 68 61 73 20 62 65 65 6e 20 63 6f 72 72 75  e has been corru
11b10 70 74 65 64 20 65 78 74 65 72 6e 61 6c 6c 79 2e  pted externally.
11b20 0a 20 20 20 20 2a 2a 20 20 20 20 61 73 73 65 72  .    **    asser
11b30 74 28 20 7a 52 65 63 21 3d 30 20 7c 7c 20 61 76  t( zRec!=0 || av
11b40 61 69 6c 3e 3d 70 61 79 6c 6f 61 64 53 69 7a 65  ail>=payloadSize
11b50 20 7c 7c 20 61 76 61 69 6c 3e 3d 39 20 29 3b 20   || avail>=9 ); 
11b60 2a 2f 0a 20 20 20 20 73 7a 48 64 72 20 3d 20 67  */.    szHdr = g
11b70 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
11b80 7a 44 61 74 61 2c 20 6f 66 66 73 65 74 29 3b 0a  zData, offset);.
11b90 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
11ba0 65 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  e a corrupt data
11bb0 62 61 73 65 20 68 61 73 20 6e 6f 74 20 67 69 76  base has not giv
11bc0 65 6e 20 75 73 20 61 6e 20 6f 76 65 72 73 69 7a  en us an oversiz
11bd0 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2a  e header..    **
11be0 20 44 6f 20 74 68 69 73 20 6e 6f 77 20 74 6f 20   Do this now to 
11bf0 61 76 6f 69 64 20 61 6e 20 6f 76 65 72 73 69 7a  avoid an oversiz
11c00 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
11c10 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ion..    **.    
11c20 2a 2a 20 54 79 70 65 20 65 6e 74 72 69 65 73 20  ** Type entries 
11c30 63 61 6e 20 62 65 20 62 65 74 77 65 65 6e 20 31  can be between 1
11c40 20 61 6e 64 20 35 20 62 79 74 65 73 20 65 61 63   and 5 bytes eac
11c50 68 2e 20 20 42 75 74 20 34 20 61 6e 64 20 35 20  h.  But 4 and 5 
11c60 62 79 74 65 0a 20 20 20 20 2a 2a 20 74 79 70 65  byte.    ** type
11c70 73 20 75 73 65 20 73 6f 20 6d 75 63 68 20 64 61  s use so much da
11c80 74 61 20 73 70 61 63 65 20 74 68 61 74 20 74 68  ta space that th
11c90 65 72 65 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  ere can only be 
11ca0 34 30 39 36 20 61 6e 64 20 33 32 20 6f 66 0a 20  4096 and 32 of. 
11cb0 20 20 20 2a 2a 20 74 68 65 6d 2c 20 72 65 73 70     ** them, resp
11cc0 65 63 74 69 76 65 6c 79 2e 20 20 53 6f 20 74 68  ectively.  So th
11cd0 65 20 6d 61 78 69 6d 75 6d 20 68 65 61 64 65 72  e maximum header
11ce0 20 6c 65 6e 67 74 68 20 72 65 73 75 6c 74 73 20   length results 
11cf0 66 72 6f 6d 20 61 0a 20 20 20 20 2a 2a 20 33 2d  from a.    ** 3-
11d00 62 79 74 65 20 74 79 70 65 20 66 6f 72 20 65 61  byte type for ea
11d10 63 68 20 6f 66 20 74 68 65 20 6d 61 78 69 6d 75  ch of the maximu
11d20 6d 20 6f 66 20 33 32 37 36 38 20 63 6f 6c 75 6d  m of 32768 colum
11d30 6e 73 20 70 6c 75 73 20 74 68 72 65 65 0a 20 20  ns plus three.  
11d40 20 20 2a 2a 20 65 78 74 72 61 20 62 79 74 65 73    ** extra bytes
11d50 20 66 6f 72 20 74 68 65 20 68 65 61 64 65 72 20   for the header 
11d60 6c 65 6e 67 74 68 20 69 74 73 65 6c 66 2e 20 20  length itself.  
11d70 33 32 37 36 38 2a 33 20 2b 20 33 20 3d 20 39 38  32768*3 + 3 = 98
11d80 33 30 37 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  307..    */.    
11d90 69 66 28 20 6f 66 66 73 65 74 20 3e 20 39 38 33  if( offset > 983
11da0 30 37 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  07 ){.      rc =
11db0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11dc0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
11dd0 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a   op_column_out;.
11de0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
11df0 6d 70 75 74 65 20 69 6e 20 6c 65 6e 20 74 68 65  mpute in len the
11e00 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
11e10 20 6f 66 20 64 61 74 61 20 77 65 20 6e 65 65 64   of data we need
11e20 20 74 6f 20 72 65 61 64 20 69 6e 20 6f 72 64 65   to read in orde
11e30 72 0a 20 20 20 20 2a 2a 20 74 6f 20 67 65 74 20  r.    ** to get 
11e40 6e 46 69 65 6c 64 20 74 79 70 65 20 76 61 6c 75  nField type valu
11e50 65 73 2e 20 20 6f 66 66 73 65 74 20 69 73 20 61  es.  offset is a
11e60 6e 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e  n upper bound on
11e70 20 74 68 69 73 2e 20 20 42 75 74 0a 20 20 20 20   this.  But.    
11e80 2a 2a 20 6e 46 69 65 6c 64 20 6d 69 67 68 74 20  ** nField might 
11e90 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79  be significantly
11ea0 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 74   less than the t
11eb0 72 75 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  rue number of co
11ec0 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a 20 69 6e 20  lumns.    ** in 
11ed0 74 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 69  the table, and i
11ee0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 35 2a 6e  n that case, 5*n
11ef0 46 69 65 6c 64 2b 33 20 6d 69 67 68 74 20 62 65  Field+3 might be
11f00 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 66   smaller than of
11f10 66 73 65 74 2e 0a 20 20 20 20 2a 2a 20 57 65 20  fset..    ** We 
11f20 77 61 6e 74 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  want to minimize
11f30 20 6c 65 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f   len in order to
11f40 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20   limit the size 
11f50 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20  of the memory.  
11f60 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c    ** allocation,
11f70 20 65 73 70 65 63 69 61 6c 6c 79 20 69 66 20 61   especially if a
11f80 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
11f90 65 20 66 69 6c 65 20 68 61 73 20 63 61 75 73 65  e file has cause
11fa0 64 20 6f 66 66 73 65 74 0a 20 20 20 20 2a 2a 20  d offset.    ** 
11fb0 74 6f 20 62 65 20 6f 76 65 72 73 69 7a 65 64 2e  to be oversized.
11fc0 20 4f 66 66 73 65 74 20 69 73 20 6c 69 6d 69 74   Offset is limit
11fd0 65 64 20 74 6f 20 39 38 33 30 37 20 61 62 6f 76  ed to 98307 abov
11fe0 65 2e 20 20 42 75 74 20 39 38 33 30 37 20 6d 69  e.  But 98307 mi
11ff0 67 68 74 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c  ght.    ** still
12000 20 65 78 63 65 65 64 20 52 6f 62 73 6f 6e 20 6d   exceed Robson m
12010 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
12020 20 6c 69 6d 69 74 73 20 6f 6e 20 73 6f 6d 65 20   limits on some 
12030 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 0a  configurations..
12040 20 20 20 20 2a 2a 20 4f 6e 20 73 79 73 74 65 6d      ** On system
12050 73 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 74 6f  s that cannot to
12060 6c 65 72 61 74 65 20 6c 61 72 67 65 20 6d 65 6d  lerate large mem
12070 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2c  ory allocations,
12080 20 6e 46 69 65 6c 64 2a 35 2b 33 0a 20 20 20 20   nField*5+3.    
12090 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 62  ** will likely b
120a0 65 20 6d 75 63 68 20 73 6d 61 6c 6c 65 72 20 73  e much smaller s
120b0 69 6e 63 65 20 6e 46 69 65 6c 64 20 77 69 6c 6c  ince nField will
120c0 20 6c 69 6b 65 6c 79 20 62 65 20 6c 65 73 73 20   likely be less 
120d0 74 68 61 6e 0a 20 20 20 20 2a 2a 20 32 30 20 6f  than.    ** 20 o
120e0 72 20 73 6f 2e 20 20 54 68 69 73 20 69 6e 73 75  r so.  This insu
120f0 72 65 73 20 74 68 61 74 20 52 6f 62 73 6f 6e 20  res that Robson 
12100 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
12110 6e 20 6c 69 6d 69 74 73 20 61 72 65 0a 20 20 20  n limits are.   
12120 20 2a 2a 20 6e 6f 74 20 65 78 63 65 65 64 65 64   ** not exceeded
12130 20 65 76 65 6e 20 66 6f 72 20 63 6f 72 72 75 70   even for corrup
12140 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
12150 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e  ..    */.    len
12160 20 3d 20 6e 46 69 65 6c 64 2a 35 20 2b 20 33 3b   = nField*5 + 3;
12170 0a 20 20 20 20 69 66 28 20 6c 65 6e 20 3e 20 28  .    if( len > (
12180 69 6e 74 29 6f 66 66 73 65 74 20 29 20 6c 65 6e  int)offset ) len
12190 20 3d 20 28 69 6e 74 29 6f 66 66 73 65 74 3b 0a   = (int)offset;.
121a0 0a 20 20 20 20 2f 2a 20 54 68 65 20 4b 65 79 46  .    /* The KeyF
121b0 65 74 63 68 28 29 20 6f 72 20 44 61 74 61 46 65  etch() or DataFe
121c0 74 63 68 28 29 20 61 62 6f 76 65 20 61 72 65 20  tch() above are 
121d0 66 61 73 74 20 61 6e 64 20 77 69 6c 6c 20 67 65  fast and will ge
121e0 74 20 74 68 65 20 65 6e 74 69 72 65 0a 20 20 20  t the entire.   
121f0 20 2a 2a 20 72 65 63 6f 72 64 20 68 65 61 64 65   ** record heade
12200 72 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 2e  r in most cases.
12210 20 20 42 75 74 20 74 68 65 79 20 77 69 6c 6c 20    But they will 
12220 66 61 69 6c 20 74 6f 20 67 65 74 20 74 68 65 20  fail to get the 
12230 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20  complete.    ** 
12240 72 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 66  record header if
12250 20 74 68 65 20 72 65 63 6f 72 64 20 68 65 61 64   the record head
12260 65 72 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20  er does not fit 
12270 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  on a single page
12280 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 42  .    ** in the B
12290 2d 54 72 65 65 2e 20 20 57 68 65 6e 20 74 68 61  -Tree.  When tha
122a0 74 20 68 61 70 70 65 6e 73 2c 20 75 73 65 20 73  t happens, use s
122b0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
122c0 6d 42 74 72 65 65 28 29 20 74 6f 0a 20 20 20 20  mBtree() to.    
122d0 2a 2a 20 61 63 71 75 69 72 65 20 74 68 65 20 63  ** acquire the c
122e0 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 20 74  omplete header t
122f0 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext..    */.    
12300 69 66 28 20 21 7a 52 65 63 20 26 26 20 61 76 61  if( !zRec && ava
12310 69 6c 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 20 20  il<len ){.      
12320 73 4d 65 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a  sMem.flags = 0;.
12330 20 20 20 20 20 20 73 4d 65 6d 2e 64 62 20 3d 20        sMem.db = 
12340 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
12350 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
12360 42 74 72 65 65 28 70 43 72 73 72 2c 20 30 2c 20  Btree(pCrsr, 0, 
12370 6c 65 6e 2c 20 70 43 2d 3e 69 73 49 6e 64 65 78  len, pC->isIndex
12380 2c 20 26 73 4d 65 6d 29 3b 0a 20 20 20 20 20 20  , &sMem);.      
12390 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
123a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
123b0 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b  o op_column_out;
123c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
123d0 44 61 74 61 20 3d 20 73 4d 65 6d 2e 7a 3b 0a 20  Data = sMem.z;. 
123e0 20 20 20 7d 0a 20 20 20 20 7a 45 6e 64 48 64 72     }.    zEndHdr
123f0 20 3d 20 28 75 38 20 2a 29 26 7a 44 61 74 61 5b   = (u8 *)&zData[
12400 6c 65 6e 5d 3b 0a 20 20 20 20 7a 49 64 78 20 3d  len];.    zIdx =
12410 20 28 75 38 20 2a 29 26 7a 44 61 74 61 5b 73 7a   (u8 *)&zData[sz
12420 48 64 72 5d 3b 0a 0a 20 20 20 20 2f 2a 20 53 63  Hdr];..    /* Sc
12430 61 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  an the header an
12440 64 20 75 73 65 20 69 74 20 74 6f 20 66 69 6c 6c  d use it to fill
12450 20 69 6e 20 74 68 65 20 61 54 79 70 65 5b 5d 20   in the aType[] 
12460 61 6e 64 20 61 4f 66 66 73 65 74 5b 5d 0a 20 20  and aOffset[].  
12470 20 20 2a 2a 20 61 72 72 61 79 73 2e 20 20 61 54    ** arrays.  aT
12480 79 70 65 5b 69 5d 20 77 69 6c 6c 20 63 6f 6e 74  ype[i] will cont
12490 61 69 6e 20 74 68 65 20 74 79 70 65 20 69 6e 74  ain the type int
124a0 65 67 65 72 20 66 6f 72 20 74 68 65 20 69 2d 74  eger for the i-t
124b0 68 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20  h.    ** column 
124c0 61 6e 64 20 61 4f 66 66 73 65 74 5b 69 5d 20 77  and aOffset[i] w
124d0 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  ill contain the 
124e0 6f 66 66 73 65 74 20 66 72 6f 6d 20 74 68 65 20  offset from the 
124f0 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a  beginning.    **
12500 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 74   of the record t
12510 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
12520 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  he data for the 
12530 69 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20  i-th column.    
12540 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
12550 69 3c 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a  i<nField; i++){.
12560 20 20 20 20 20 20 69 66 28 20 7a 49 64 78 3c 7a        if( zIdx<z
12570 45 6e 64 48 64 72 20 29 7b 0a 20 20 20 20 20 20  EndHdr ){.      
12580 20 20 61 4f 66 66 73 65 74 5b 69 5d 20 3d 20 6f    aOffset[i] = o
12590 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69  ffset;.        i
125a0 66 28 20 7a 49 64 78 5b 30 5d 3c 30 78 38 30 20  f( zIdx[0]<0x80 
125b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 20 3d  ){.          t =
125c0 20 7a 49 64 78 5b 30 5d 3b 0a 20 20 20 20 20 20   zIdx[0];.      
125d0 20 20 20 20 7a 49 64 78 2b 2b 3b 0a 20 20 20 20      zIdx++;.    
125e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
125f0 20 20 20 20 20 7a 49 64 78 20 2b 3d 20 73 71 6c       zIdx += sql
12600 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
12610 7a 49 64 78 2c 20 26 74 29 3b 0a 20 20 20 20 20  zIdx, &t);.     
12620 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 54 79     }.        aTy
12630 70 65 5b 69 5d 20 3d 20 74 3b 0a 20 20 20 20 20  pe[i] = t;.     
12640 20 20 20 73 7a 46 69 65 6c 64 20 3d 20 73 71 6c     szField = sql
12650 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
12660 70 65 4c 65 6e 28 74 29 3b 0a 20 20 20 20 20 20  peLen(t);.      
12670 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 7a 46 69    offset += szFi
12680 65 6c 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28  eld;.        if(
12690 20 6f 66 66 73 65 74 3c 73 7a 46 69 65 6c 64 20   offset<szField 
126a0 29 7b 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f  ){  /* True if o
126b0 66 66 73 65 74 20 6f 76 65 72 66 6c 6f 77 73 20  ffset overflows 
126c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 49 64  */.          zId
126d0 78 20 3d 20 26 7a 45 6e 64 48 64 72 5b 31 5d 3b  x = &zEndHdr[1];
126e0 20 20 2f 2a 20 46 6f 72 63 65 73 20 53 51 4c 49    /* Forces SQLI
126f0 54 45 5f 43 4f 52 52 55 50 54 20 72 65 74 75 72  TE_CORRUPT retur
12700 6e 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  n below */.     
12710 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12720 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
12730 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  e{.        /* If
12740 20 69 20 69 73 20 6c 65 73 73 20 74 68 61 74 20   i is less that 
12750 6e 46 69 65 6c 64 2c 20 74 68 65 6e 20 74 68 65  nField, then the
12760 72 65 20 61 72 65 20 6c 65 73 73 20 66 69 65 6c  re are less fiel
12770 64 73 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20  ds in this.     
12780 20 20 20 2a 2a 20 72 65 63 6f 72 64 20 74 68 61     ** record tha
12790 6e 20 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20  n SetNumColumns 
127a0 69 6e 64 69 63 61 74 65 64 20 74 68 65 72 65 20  indicated there 
127b0 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  are columns in t
127c0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  he.        ** ta
127d0 62 6c 65 2e 20 53 65 74 20 74 68 65 20 6f 66 66  ble. Set the off
127e0 73 65 74 20 66 6f 72 20 61 6e 79 20 65 78 74 72  set for any extr
127f0 61 20 63 6f 6c 75 6d 6e 73 20 6e 6f 74 20 70 72  a columns not pr
12800 65 73 65 6e 74 20 69 6e 0a 20 20 20 20 20 20 20  esent in.       
12810 20 2a 2a 20 74 68 65 20 72 65 63 6f 72 64 20 74   ** the record t
12820 6f 20 30 2e 20 54 68 69 73 20 74 65 6c 6c 73 20  o 0. This tells 
12830 63 6f 64 65 20 62 65 6c 6f 77 20 74 6f 20 73 74  code below to st
12840 6f 72 65 20 61 20 4e 55 4c 4c 0a 20 20 20 20 20  ore a NULL.     
12850 20 20 20 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66     ** instead of
12860 20 64 65 73 65 72 69 61 6c 69 7a 69 6e 67 20 61   deserializing a
12870 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
12880 72 65 63 6f 72 64 2e 0a 20 20 20 20 20 20 20 20  record..        
12890 2a 2f 0a 20 20 20 20 20 20 20 20 61 4f 66 66 73  */.        aOffs
128a0 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  et[i] = 0;.     
128b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
128c0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
128d0 73 65 28 26 73 4d 65 6d 29 3b 0a 20 20 20 20 73  se(&sMem);.    s
128e0 4d 65 6d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  Mem.flags = MEM_
128f0 4e 75 6c 6c 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Null;..    /* If
12900 20 77 65 20 68 61 76 65 20 72 65 61 64 20 6d 6f   we have read mo
12910 72 65 20 68 65 61 64 65 72 20 64 61 74 61 20 74  re header data t
12920 68 61 6e 20 77 61 73 20 63 6f 6e 74 61 69 6e 65  han was containe
12930 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2c  d in the header,
12940 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  .    ** or if th
12950 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73  e end of the las
12960 74 20 66 69 65 6c 64 20 61 70 70 65 61 72 73 20  t field appears 
12970 74 6f 20 62 65 20 70 61 73 74 20 74 68 65 20 65  to be past the e
12980 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
12990 20 72 65 63 6f 72 64 2c 20 6f 72 20 69 66 20 74   record, or if t
129a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61  he end of the la
129b0 73 74 20 66 69 65 6c 64 20 61 70 70 65 61 72 73  st field appears
129c0 20 74 6f 20 62 65 20 62 65 66 6f 72 65 20 74 68   to be before th
129d0 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20  e end.    ** of 
129e0 74 68 65 20 72 65 63 6f 72 64 20 28 77 68 65 6e  the record (when
129f0 20 61 6c 6c 20 66 69 65 6c 64 73 20 70 72 65 73   all fields pres
12a00 65 6e 74 29 2c 20 74 68 65 6e 20 77 65 20 6d 75  ent), then we mu
12a10 73 74 20 62 65 20 64 65 61 6c 69 6e 67 20 0a 20  st be dealing . 
12a20 20 20 20 2a 2a 20 77 69 74 68 20 61 20 63 6f 72     ** with a cor
12a30 72 75 70 74 20 64 61 74 61 62 61 73 65 2e 0a 20  rupt database.. 
12a40 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 7a     */.    if( (z
12a50 49 64 78 20 3e 20 7a 45 6e 64 48 64 72 29 20 7c  Idx > zEndHdr) |
12a60 7c 20 28 6f 66 66 73 65 74 20 3e 20 70 61 79 6c  | (offset > payl
12a70 6f 61 64 53 69 7a 65 29 0a 20 20 20 20 20 20 20  oadSize).       
12a80 20 20 7c 7c 20 28 7a 49 64 78 3d 3d 7a 45 6e 64    || (zIdx==zEnd
12a90 48 64 72 20 26 26 20 6f 66 66 73 65 74 21 3d 70  Hdr && offset!=p
12aa0 61 79 6c 6f 61 64 53 69 7a 65 29 20 29 7b 0a 20  ayloadSize) ){. 
12ab0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12ac0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
12ad0 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c       goto op_col
12ae0 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  umn_out;.    }. 
12af0 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65   }..  /* Get the
12b00 20 63 6f 6c 75 6d 6e 20 69 6e 66 6f 72 6d 61 74   column informat
12b10 69 6f 6e 2e 20 49 66 20 61 4f 66 66 73 65 74 5b  ion. If aOffset[
12b20 70 32 5d 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  p2] is non-zero,
12b30 20 74 68 65 6e 20 0a 20 20 2a 2a 20 64 65 73 65   then .  ** dese
12b40 72 69 61 6c 69 7a 65 20 74 68 65 20 76 61 6c 75  rialize the valu
12b50 65 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72  e from the recor
12b60 64 2e 20 49 66 20 61 4f 66 66 73 65 74 5b 70 32  d. If aOffset[p2
12b70 5d 20 69 73 20 7a 65 72 6f 2c 0a 20 20 2a 2a 20  ] is zero,.  ** 
12b80 74 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e  then there are n
12b90 6f 74 20 65 6e 6f 75 67 68 20 66 69 65 6c 64 73  ot enough fields
12ba0 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 74   in the record t
12bb0 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 20 20  o satisfy the.  
12bc0 2a 2a 20 72 65 71 75 65 73 74 2e 20 20 49 6e 20  ** request.  In 
12bd0 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74  this case, set t
12be0 68 65 20 76 61 6c 75 65 20 4e 55 4c 4c 20 6f 72  he value NULL or
12bf0 20 74 6f 20 50 34 20 69 66 20 50 34 20 69 73 0a   to P4 if P4 is.
12c00 20 20 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74    ** a pointer t
12c10 6f 20 61 20 4d 65 6d 20 6f 62 6a 65 63 74 2e 0a  o a Mem object..
12c20 20 20 2a 2f 0a 20 20 69 66 28 20 61 4f 66 66 73    */.  if( aOffs
12c30 65 74 5b 70 32 5d 20 29 7b 0a 20 20 20 20 61 73  et[p2] ){.    as
12c40 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
12c50 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  _OK );.    if( z
12c60 52 65 63 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  Rec ){.      Mem
12c70 52 65 6c 65 61 73 65 45 78 74 28 70 44 65 73 74  ReleaseExt(pDest
12c80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12c90 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
12ca0 38 20 2a 29 26 7a 52 65 63 5b 61 4f 66 66 73 65  8 *)&zRec[aOffse
12cb0 74 5b 70 32 5d 5d 2c 20 61 54 79 70 65 5b 70 32  t[p2]], aType[p2
12cc0 5d 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 7d  ], pDest);.    }
12cd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 65 6e 20  else{.      len 
12ce0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
12cf0 69 61 6c 54 79 70 65 4c 65 6e 28 61 54 79 70 65  ialTypeLen(aType
12d00 5b 70 32 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c  [p2]);.      sql
12d10 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28  ite3VdbeMemMove(
12d20 26 73 4d 65 6d 2c 20 70 44 65 73 74 29 3b 0a 20  &sMem, pDest);. 
12d30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12d40 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
12d50 65 28 70 43 72 73 72 2c 20 61 4f 66 66 73 65 74  e(pCrsr, aOffset
12d60 5b 70 32 5d 2c 20 6c 65 6e 2c 20 70 43 2d 3e 69  [p2], len, pC->i
12d70 73 49 6e 64 65 78 2c 20 26 73 4d 65 6d 29 3b 0a  sIndex, &sMem);.
12d80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
12d90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12da0 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d     goto op_colum
12db0 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  n_out;.      }. 
12dc0 20 20 20 20 20 7a 44 61 74 61 20 3d 20 73 4d 65       zData = sMe
12dd0 6d 2e 7a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  m.z;.      sqlit
12de0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
12df0 28 75 38 2a 29 7a 44 61 74 61 2c 20 61 54 79 70  (u8*)zData, aTyp
12e00 65 5b 70 32 5d 2c 20 70 44 65 73 74 29 3b 0a 20  e[p2], pDest);. 
12e10 20 20 20 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e     }.    pDest->
12e20 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a  enc = encoding;.
12e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
12e40 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
12e50 5f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71  _MEM ){.      sq
12e60 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
12e70 6c 6f 77 43 6f 70 79 28 70 44 65 73 74 2c 20 70  lowCopy(pDest, p
12e80 4f 70 2d 3e 70 34 2e 70 4d 65 6d 2c 20 4d 45 4d  Op->p4.pMem, MEM
12e90 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 7d 65  _Static);.    }e
12ea0 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65 6d 53 65  lse{.      MemSe
12eb0 74 54 79 70 65 46 6c 61 67 28 70 44 65 73 74 2c  tTypeFlag(pDest,
12ec0 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20   MEM_Null);.    
12ed0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  }.  }..  /* If w
12ee0 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  e dynamically al
12ef0 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20 74 6f  located space to
12f00 20 68 6f 6c 64 20 74 68 65 20 64 61 74 61 20 28   hold the data (
12f10 69 6e 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  in the.  ** sqli
12f20 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
12f30 72 65 65 28 29 20 63 61 6c 6c 20 61 62 6f 76 65  ree() call above
12f40 29 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  ) then transfer 
12f50 63 6f 6e 74 72 6f 6c 20 6f 66 20 74 68 61 74 0a  control of that.
12f60 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79    ** dynamically
12f70 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
12f80 20 6f 76 65 72 20 74 6f 20 74 68 65 20 70 44 65   over to the pDe
12f90 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  st structure..  
12fa0 2a 2a 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  ** This prevents
12fb0 20 61 20 6d 65 6d 6f 72 79 20 63 6f 70 79 2e 0a   a memory copy..
12fc0 20 20 2a 2f 0a 20 20 69 66 28 20 73 4d 65 6d 2e    */.  if( sMem.
12fd0 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 61  zMalloc ){.    a
12fe0 73 73 65 72 74 28 20 73 4d 65 6d 2e 7a 3d 3d 73  ssert( sMem.z==s
12ff0 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63 20 29 3b 0a 20  Mem.zMalloc );. 
13000 20 20 20 61 73 73 65 72 74 28 20 21 28 70 44 65     assert( !(pDe
13010 73 74 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  st->flags & MEM_
13020 44 79 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65  Dyn) );.    asse
13030 72 74 28 20 21 28 70 44 65 73 74 2d 3e 66 6c 61  rt( !(pDest->fla
13040 67 73 20 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c 4d  gs & (MEM_Blob|M
13050 45 4d 5f 53 74 72 29 29 20 7c 7c 20 70 44 65 73  EM_Str)) || pDes
13060 74 2d 3e 7a 3d 3d 73 4d 65 6d 2e 7a 20 29 3b 0a  t->z==sMem.z );.
13070 20 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73      pDest->flags
13080 20 26 3d 20 7e 28 4d 45 4d 5f 45 70 68 65 6d 7c   &= ~(MEM_Ephem|
13090 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20 20  MEM_Static);.   
130a0 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 7c 3d   pDest->flags |=
130b0 20 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 70   MEM_Term;.    p
130c0 44 65 73 74 2d 3e 7a 20 3d 20 73 4d 65 6d 2e 7a  Dest->z = sMem.z
130d0 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 7a 4d 61  ;.    pDest->zMa
130e0 6c 6c 6f 63 20 3d 20 73 4d 65 6d 2e 7a 4d 61 6c  lloc = sMem.zMal
130f0 6c 6f 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  loc;.  }..  rc =
13100 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d   sqlite3VdbeMemM
13110 61 6b 65 57 72 69 74 65 61 62 6c 65 28 70 44 65  akeWriteable(pDe
13120 73 74 29 3b 0a 0a 6f 70 5f 63 6f 6c 75 6d 6e 5f  st);..op_column_
13130 6f 75 74 3a 0a 20 20 55 50 44 41 54 45 5f 4d 41  out:.  UPDATE_MA
13140 58 5f 42 4c 4f 42 53 49 5a 45 28 70 44 65 73 74  X_BLOBSIZE(pDest
13150 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  );.  REGISTER_TR
13160 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 44 65  ACE(pOp->p3, pDe
13170 73 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  st);.  break;.}.
13180 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 66 66 69  ./* Opcode: Affi
13190 6e 69 74 79 20 50 31 20 50 32 20 2a 20 50 34 20  nity P1 P2 * P4 
131a0 2a 0a 2a 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 66  *.**.** Apply af
131b0 66 69 6e 69 74 69 65 73 20 74 6f 20 61 20 72 61  finities to a ra
131c0 6e 67 65 20 6f 66 20 50 32 20 72 65 67 69 73 74  nge of P2 regist
131d0 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74  ers starting wit
131e0 68 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69  h P1..**.** P4 i
131f0 73 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  s a string that 
13200 69 73 20 50 32 20 63 68 61 72 61 63 74 65 72 73  is P2 characters
13210 20 6c 6f 6e 67 2e 20 54 68 65 20 6e 74 68 20 63   long. The nth c
13220 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 0a  haracter of the.
13230 2a 2a 20 73 74 72 69 6e 67 20 69 6e 64 69 63 61  ** string indica
13240 74 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  tes the column a
13250 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
13260 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20  uld be used for 
13270 74 68 65 20 6e 74 68 0a 2a 2a 20 6d 65 6d 6f 72  the nth.** memor
13280 79 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 72 61  y cell in the ra
13290 6e 67 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  nge..*/.case OP_
132a0 41 66 66 69 6e 69 74 79 3a 20 7b 0a 20 20 63 6f  Affinity: {.  co
132b0 6e 73 74 20 63 68 61 72 20 2a 7a 41 66 66 69 6e  nst char *zAffin
132c0 69 74 79 3b 20 20 20 2f 2a 20 54 68 65 20 61 66  ity;   /* The af
132d0 66 69 6e 69 74 79 20 74 6f 20 62 65 20 61 70 70  finity to be app
132e0 6c 69 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 63  lied */.  char c
132f0 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aff;            
13300 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63     /* A single c
13310 68 61 72 61 63 74 65 72 20 6f 66 20 61 66 66 69  haracter of affi
13320 6e 69 74 79 20 2a 2f 0a 0a 20 20 7a 41 66 66 69  nity */..  zAffi
13330 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  nity = pOp->p4.z
13340 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66 66  ;.  assert( zAff
13350 69 6e 69 74 79 21 3d 30 20 29 3b 0a 20 20 61 73  inity!=0 );.  as
13360 73 65 72 74 28 20 7a 41 66 66 69 6e 69 74 79 5b  sert( zAffinity[
13370 70 4f 70 2d 3e 70 32 5d 3d 3d 30 20 29 3b 0a 20  pOp->p2]==0 );. 
13380 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
13390 70 2d 3e 70 31 5d 3b 0a 20 20 77 68 69 6c 65 28  p->p1];.  while(
133a0 20 28 63 41 66 66 20 3d 20 2a 28 7a 41 66 66 69   (cAff = *(zAffi
133b0 6e 69 74 79 2b 2b 29 29 21 3d 30 20 29 7b 0a 20  nity++))!=0 ){. 
133c0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 20     assert( pIn1 
133d0 3c 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 2d 3e 6e  <= &p->aMem[p->n
133e0 4d 65 6d 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  Mem] );.    asse
133f0 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70  rt( memIsValid(p
13400 49 6e 31 29 20 29 3b 0a 20 20 20 20 45 78 70 61  In1) );.    Expa
13410 6e 64 42 6c 6f 62 28 70 49 6e 31 29 3b 0a 20 20  ndBlob(pIn1);.  
13420 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28    applyAffinity(
13430 70 49 6e 31 2c 20 63 41 66 66 2c 20 65 6e 63 6f  pIn1, cAff, enco
13440 64 69 6e 67 29 3b 0a 20 20 20 20 70 49 6e 31 2b  ding);.    pIn1+
13450 2b 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  +;.  }.  break;.
13460 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 61  }../* Opcode: Ma
13470 6b 65 52 65 63 6f 72 64 20 50 31 20 50 32 20 50  keRecord P1 P2 P
13480 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6e  3 P4 *.**.** Con
13490 76 65 72 74 20 50 32 20 72 65 67 69 73 74 65 72  vert P2 register
134a0 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  s beginning with
134b0 20 50 31 20 69 6e 74 6f 20 74 68 65 20 5b 72 65   P1 into the [re
134c0 63 6f 72 64 20 66 6f 72 6d 61 74 5d 0a 2a 2a 20  cord format].** 
134d0 75 73 65 20 61 73 20 61 20 64 61 74 61 20 72 65  use as a data re
134e0 63 6f 72 64 20 69 6e 20 61 20 64 61 74 61 62 61  cord in a databa
134f0 73 65 20 74 61 62 6c 65 20 6f 72 20 61 73 20 61  se table or as a
13500 20 6b 65 79 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e   key.** in an in
13510 64 65 78 2e 20 20 54 68 65 20 4f 50 5f 43 6f 6c  dex.  The OP_Col
13520 75 6d 6e 20 6f 70 63 6f 64 65 20 63 61 6e 20 64  umn opcode can d
13530 65 63 6f 64 65 20 74 68 65 20 72 65 63 6f 72 64  ecode the record
13540 20 6c 61 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 50 34   later..**.** P4
13550 20 6d 61 79 20 62 65 20 61 20 73 74 72 69 6e 67   may be a string
13560 20 74 68 61 74 20 69 73 20 50 32 20 63 68 61 72   that is P2 char
13570 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20 20 54 68  acters long.  Th
13580 65 20 6e 74 68 20 63 68 61 72 61 63 74 65 72 20  e nth character 
13590 6f 66 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67  of the.** string
135a0 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 63   indicates the c
135b0 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 74  olumn affinity t
135c0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
135d0 65 64 20 66 6f 72 20 74 68 65 20 6e 74 68 0a 2a  ed for the nth.*
135e0 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69  * field of the i
135f0 6e 64 65 78 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  ndex key..**.** 
13600 54 68 65 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d  The mapping from
13610 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 61 66   character to af
13620 66 69 6e 69 74 79 20 69 73 20 67 69 76 65 6e 20  finity is given 
13630 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  by the SQLITE_AF
13640 46 5f 0a 2a 2a 20 6d 61 63 72 6f 73 20 64 65 66  F_.** macros def
13650 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e  ined in sqliteIn
13660 74 2e 68 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34  t.h..**.** If P4
13670 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 6c   is NULL then al
13680 6c 20 69 6e 64 65 78 20 66 69 65 6c 64 73 20 68  l index fields h
13690 61 76 65 20 74 68 65 20 61 66 66 69 6e 69 74 79  ave the affinity
136a0 20 4e 4f 4e 45 2e 0a 2a 2f 0a 63 61 73 65 20 4f   NONE..*/.case O
136b0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 3a 20 7b 0a  P_MakeRecord: {.
136c0 20 20 75 38 20 2a 7a 4e 65 77 52 65 63 6f 72 64    u8 *zNewRecord
136d0 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 75  ;        /* A bu
136e0 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
136f0 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 6e 65   data for the ne
13700 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65  w record */.  Me
13710 6d 20 2a 70 52 65 63 3b 20 20 20 20 20 20 20 20  m *pRec;        
13720 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
13730 72 65 63 6f 72 64 20 2a 2f 0a 20 20 75 36 34 20  record */.  u64 
13740 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
13750 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13760 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 73 70  bytes of data sp
13770 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 64  ace */.  int nHd
13780 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
13790 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
137a0 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 70 61  es of header spa
137b0 63 65 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74  ce */.  i64 nByt
137c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
137d0 2a 20 44 61 74 61 20 73 70 61 63 65 20 72 65 71  * Data space req
137e0 75 69 72 65 64 20 66 6f 72 20 74 68 69 73 20 72  uired for this r
137f0 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
13800 5a 65 72 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Zero;           
13810 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a    /* Number of z
13820 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65  ero bytes at the
13830 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f   end of the reco
13840 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  rd */.  int nVar
13850 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  int;           /
13860 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
13870 73 20 69 6e 20 61 20 76 61 72 69 6e 74 20 2a 2f  s in a varint */
13880 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
13890 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 79 70  pe;       /* Typ
138a0 65 20 66 69 65 6c 64 20 2a 2f 0a 20 20 4d 65 6d  e field */.  Mem
138b0 20 2a 70 44 61 74 61 30 3b 20 20 20 20 20 20 20   *pData0;       
138c0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66 69 65      /* First fie
138d0 6c 64 20 74 6f 20 62 65 20 63 6f 6d 62 69 6e 65  ld to be combine
138e0 64 20 69 6e 74 6f 20 74 68 65 20 72 65 63 6f 72  d into the recor
138f0 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4c 61 73  d */.  Mem *pLas
13900 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
13910 20 4c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   Last field of t
13920 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  he record */.  i
13930 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20  nt nField;      
13940 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13950 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  of fields in the
13960 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61   record */.  cha
13970 72 20 2a 7a 41 66 66 69 6e 69 74 79 3b 20 20 20  r *zAffinity;   
13980 20 20 20 20 2f 2a 20 54 68 65 20 61 66 66 69 6e      /* The affin
13990 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 74  ity string for t
139a0 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  he record */.  i
139b0 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3b 20  nt file_format; 
139c0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 66 6f        /* File fo
139d0 72 6d 61 74 20 74 6f 20 75 73 65 20 66 6f 72 20  rmat to use for 
139e0 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  encoding */.  in
139f0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
13a00 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73       /* Space us
13a10 65 64 20 69 6e 20 7a 4e 65 77 52 65 63 6f 72 64  ed in zNewRecord
13a20 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b  [] */.  int len;
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13a40 2a 20 4c 65 6e 67 74 68 20 6f 66 20 61 20 66 69  * Length of a fi
13a50 65 6c 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 73 73  eld */..  /* Ass
13a60 75 6d 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  uming the record
13a70 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c   contains N fiel
13a80 64 73 2c 20 74 68 65 20 72 65 63 6f 72 64 20 66  ds, the record f
13a90 6f 72 6d 61 74 20 6c 6f 6f 6b 73 0a 20 20 2a 2a  ormat looks.  **
13aa0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
13ab0 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .  ** ----------
13ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
13b00 20 2a 2a 20 7c 20 68 64 72 2d 73 69 7a 65 20 7c   ** | hdr-size |
13b10 20 74 79 70 65 20 30 20 7c 20 74 79 70 65 20 31   type 0 | type 1
13b20 20 7c 20 2e 2e 2e 20 7c 20 74 79 70 65 20 4e 2d   | ... | type N-
13b30 31 20 7c 20 64 61 74 61 30 20 7c 20 2e 2e 2e 20  1 | data0 | ... 
13b40 7c 20 64 61 74 61 20 4e 2d 31 20 7c 20 0a 20 20  | data N-1 | .  
13b50 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
13b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a  -----------.  **
13ba0 0a 20 20 2a 2a 20 44 61 74 61 28 30 29 20 69 73  .  ** Data(0) is
13bb0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69   taken from regi
13bc0 73 74 65 72 20 50 31 2e 20 20 44 61 74 61 28 31  ster P1.  Data(1
13bd0 29 20 63 6f 6d 65 73 20 66 72 6f 6d 20 72 65 67  ) comes from reg
13be0 69 73 74 65 72 20 50 31 2b 31 0a 20 20 2a 2a 20  ister P1+1.  ** 
13bf0 61 6e 64 20 73 6f 20 66 72 6f 74 68 2e 0a 20 20  and so froth..  
13c00 2a 2a 0a 20 20 2a 2a 20 45 61 63 68 20 74 79 70  **.  ** Each typ
13c10 65 20 66 69 65 6c 64 20 69 73 20 61 20 76 61 72  e field is a var
13c20 69 6e 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  int representing
13c30 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
13c40 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f   of the .  ** co
13c50 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61  rresponding data
13c60 20 65 6c 65 6d 65 6e 74 20 28 73 65 65 20 73 71   element (see sq
13c70 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
13c80 79 70 65 28 29 29 2e 20 54 68 65 0a 20 20 2a 2a  ype()). The.  **
13c90 20 68 64 72 2d 73 69 7a 65 20 66 69 65 6c 64 20   hdr-size field 
13ca0 69 73 20 61 6c 73 6f 20 61 20 76 61 72 69 6e 74  is also a varint
13cb0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6f 66   which is the of
13cc0 66 73 65 74 20 66 72 6f 6d 20 74 68 65 20 62 65  fset from the be
13cd0 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20  ginning.  ** of 
13ce0 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 64 61  the record to da
13cf0 74 61 30 2e 0a 20 20 2a 2f 0a 20 20 6e 44 61 74  ta0..  */.  nDat
13d00 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  a = 0;         /
13d10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
13d20 73 20 6f 66 20 64 61 74 61 20 73 70 61 63 65 20  s of data space 
13d30 2a 2f 0a 20 20 6e 48 64 72 20 3d 20 30 3b 20 20  */.  nHdr = 0;  
13d40 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13d50 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 68 65  r of bytes of he
13d60 61 64 65 72 20 73 70 61 63 65 20 2a 2f 0a 20 20  ader space */.  
13d70 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20  nZero = 0;      
13d80 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13d90 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68  zero bytes at th
13da0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 63  e end of the rec
13db0 6f 72 64 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20  ord */.  nField 
13dc0 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 41 66  = pOp->p1;.  zAf
13dd0 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34  finity = pOp->p4
13de0 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46  .z;.  assert( nF
13df0 69 65 6c 64 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ield>0 && pOp->p
13e00 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 6e  2>0 && pOp->p2+n
13e10 46 69 65 6c 64 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31  Field<=p->nMem+1
13e20 20 29 3b 0a 20 20 70 44 61 74 61 30 20 3d 20 26   );.  pData0 = &
13e30 61 4d 65 6d 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20  aMem[nField];.  
13e40 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 32  nField = pOp->p2
13e50 3b 0a 20 20 70 4c 61 73 74 20 3d 20 26 70 44 61  ;.  pLast = &pDa
13e60 74 61 30 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a 20  ta0[nField-1];. 
13e70 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 70   file_format = p
13e80 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f  ->minWriteFileFo
13e90 72 6d 61 74 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e  rmat;..  /* Iden
13ea0 74 69 66 79 20 74 68 65 20 6f 75 74 70 75 74 20  tify the output 
13eb0 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 61 73  register */.  as
13ec0 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f  sert( pOp->p3<pO
13ed0 70 2d 3e 70 31 20 7c 7c 20 70 4f 70 2d 3e 70 33  p->p1 || pOp->p3
13ee0 3e 3d 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70  >=pOp->p1+pOp->p
13ef0 32 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61  2 );.  pOut = &a
13f00 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
13f10 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
13f20 28 70 2c 20 70 4f 75 74 29 3b 0a 0a 20 20 2f 2a  (p, pOut);..  /*
13f30 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
13f40 65 20 65 6c 65 6d 65 6e 74 73 20 74 68 61 74 20  e elements that 
13f50 77 69 6c 6c 20 6d 61 6b 65 20 75 70 20 74 68 65  will make up the
13f60 20 72 65 63 6f 72 64 20 74 6f 20 66 69 67 75 72   record to figur
13f70 65 0a 20 20 2a 2a 20 6f 75 74 20 68 6f 77 20 6d  e.  ** out how m
13f80 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71  uch space is req
13f90 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 6e 65  uired for the ne
13fa0 77 20 72 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20  w record..  */. 
13fb0 20 66 6f 72 28 70 52 65 63 3d 70 44 61 74 61 30   for(pRec=pData0
13fc0 3b 20 70 52 65 63 3c 3d 70 4c 61 73 74 3b 20 70  ; pRec<=pLast; p
13fd0 52 65 63 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  Rec++){.    asse
13fe0 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70  rt( memIsValid(p
13ff0 52 65 63 29 20 29 3b 0a 20 20 20 20 69 66 28 20  Rec) );.    if( 
14000 7a 41 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  zAffinity ){.   
14010 20 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79     applyAffinity
14020 28 70 52 65 63 2c 20 7a 41 66 66 69 6e 69 74 79  (pRec, zAffinity
14030 5b 70 52 65 63 2d 70 44 61 74 61 30 5d 2c 20 65  [pRec-pData0], e
14040 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 7d 0a  ncoding);.    }.
14050 20 20 20 20 69 66 28 20 70 52 65 63 2d 3e 66 6c      if( pRec->fl
14060 61 67 73 26 4d 45 4d 5f 5a 65 72 6f 20 26 26 20  ags&MEM_Zero && 
14070 70 52 65 63 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  pRec->n>0 ){.   
14080 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
14090 6d 45 78 70 61 6e 64 42 6c 6f 62 28 70 52 65 63  mExpandBlob(pRec
140a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 72  );.    }.    ser
140b0 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74  ial_type = sqlit
140c0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
140d0 28 70 52 65 63 2c 20 66 69 6c 65 5f 66 6f 72 6d  (pRec, file_form
140e0 61 74 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  at);.    len = s
140f0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14100 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
14110 79 70 65 29 3b 0a 20 20 20 20 6e 44 61 74 61 20  ype);.    nData 
14120 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 6e 48 64 72  += len;.    nHdr
14130 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e   += sqlite3Varin
14140 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  tLen(serial_type
14150 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 63 2d  );.    if( pRec-
14160 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
14170 6f 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  o ){.      /* On
14180 6c 79 20 70 75 72 65 20 7a 65 72 6f 2d 66 69 6c  ly pure zero-fil
14190 6c 65 64 20 42 4c 4f 42 73 20 63 61 6e 20 62 65  led BLOBs can be
141a0 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 4f   input to this O
141b0 70 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2a 20  pcode..      ** 
141c0 57 65 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  We do not allow 
141d0 62 6c 6f 62 73 20 77 69 74 68 20 61 20 70 72 65  blobs with a pre
141e0 66 69 78 20 61 6e 64 20 61 20 7a 65 72 6f 2d 66  fix and a zero-f
141f0 69 6c 6c 65 64 20 74 61 69 6c 2e 20 2a 2f 0a 20  illed tail. */. 
14200 20 20 20 20 20 6e 5a 65 72 6f 20 2b 3d 20 70 52       nZero += pR
14210 65 63 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  ec->u.nZero;.   
14220 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 6e 20 29   }else if( len )
14230 7b 0a 20 20 20 20 20 20 6e 5a 65 72 6f 20 3d 20  {.      nZero = 
14240 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
14250 2f 2a 20 41 64 64 20 74 68 65 20 69 6e 69 74 69  /* Add the initi
14260 61 6c 20 68 65 61 64 65 72 20 76 61 72 69 6e 74  al header varint
14270 20 61 6e 64 20 74 6f 74 61 6c 20 74 68 65 20 73   and total the s
14280 69 7a 65 20 2a 2f 0a 20 20 6e 48 64 72 20 2b 3d  ize */.  nHdr +=
14290 20 6e 56 61 72 69 6e 74 20 3d 20 73 71 6c 69 74   nVarint = sqlit
142a0 65 33 56 61 72 69 6e 74 4c 65 6e 28 6e 48 64 72  e3VarintLen(nHdr
142b0 29 3b 0a 20 20 69 66 28 20 6e 56 61 72 69 6e 74  );.  if( nVarint
142c0 3c 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65  <sqlite3VarintLe
142d0 6e 28 6e 48 64 72 29 20 29 7b 0a 20 20 20 20 6e  n(nHdr) ){.    n
142e0 48 64 72 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 42 79  Hdr++;.  }.  nBy
142f0 74 65 20 3d 20 6e 48 64 72 2b 6e 44 61 74 61 2d  te = nHdr+nData-
14300 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 6e 42 79  nZero;.  if( nBy
14310 74 65 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  te>db->aLimit[SQ
14320 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
14330 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  H] ){.    goto t
14340 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a 20 20 2f  oo_big;.  }..  /
14350 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
14360 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  output register 
14370 68 61 73 20 61 20 62 75 66 66 65 72 20 6c 61 72  has a buffer lar
14380 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 73 74 6f  ge enough to sto
14390 72 65 20 0a 20 20 2a 2a 20 74 68 65 20 6e 65 77  re .  ** the new
143a0 20 72 65 63 6f 72 64 2e 20 54 68 65 20 6f 75 74   record. The out
143b0 70 75 74 20 72 65 67 69 73 74 65 72 20 28 70 4f  put register (pO
143c0 70 2d 3e 70 33 29 20 69 73 20 6e 6f 74 20 61 6c  p->p3) is not al
143d0 6c 6f 77 65 64 20 74 6f 0a 20 20 2a 2a 20 62 65  lowed to.  ** be
143e0 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 70 75   one of the inpu
143f0 74 20 72 65 67 69 73 74 65 72 73 20 28 62 65 63  t registers (bec
14400 61 75 73 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ause the followi
14410 6e 67 20 63 61 6c 6c 20 74 6f 0a 20 20 2a 2a 20  ng call to.  ** 
14420 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72  sqlite3VdbeMemGr
14430 6f 77 28 29 20 63 6f 75 6c 64 20 63 6c 6f 62 62  ow() could clobb
14440 65 72 20 74 68 65 20 76 61 6c 75 65 20 62 65 66  er the value bef
14450 6f 72 65 20 69 74 20 69 73 20 75 73 65 64 29 2e  ore it is used).
14460 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
14470 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
14480 4f 75 74 2c 20 28 69 6e 74 29 6e 42 79 74 65 2c  Out, (int)nByte,
14490 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   0) ){.    goto 
144a0 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 7a 4e  no_mem;.  }.  zN
144b0 65 77 52 65 63 6f 72 64 20 3d 20 28 75 38 20 2a  ewRecord = (u8 *
144c0 29 70 4f 75 74 2d 3e 7a 3b 0a 0a 20 20 2f 2a 20  )pOut->z;..  /* 
144d0 57 72 69 74 65 20 74 68 65 20 72 65 63 6f 72 64  Write the record
144e0 20 2a 2f 0a 20 20 69 20 3d 20 70 75 74 56 61 72   */.  i = putVar
144f0 69 6e 74 33 32 28 7a 4e 65 77 52 65 63 6f 72 64  int32(zNewRecord
14500 2c 20 6e 48 64 72 29 3b 0a 20 20 66 6f 72 28 70  , nHdr);.  for(p
14510 52 65 63 3d 70 44 61 74 61 30 3b 20 70 52 65 63  Rec=pData0; pRec
14520 3c 3d 70 4c 61 73 74 3b 20 70 52 65 63 2b 2b 29  <=pLast; pRec++)
14530 7b 0a 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70  {.    serial_typ
14540 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  e = sqlite3VdbeS
14550 65 72 69 61 6c 54 79 70 65 28 70 52 65 63 2c 20  erialType(pRec, 
14560 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20  file_format);.  
14570 20 20 69 20 2b 3d 20 70 75 74 56 61 72 69 6e 74    i += putVarint
14580 33 32 28 26 7a 4e 65 77 52 65 63 6f 72 64 5b 69  32(&zNewRecord[i
14590 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
145a0 20 20 20 20 20 20 2f 2a 20 73 65 72 69 61 6c 20        /* serial 
145b0 74 79 70 65 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f  type */.  }.  fo
145c0 72 28 70 52 65 63 3d 70 44 61 74 61 30 3b 20 70  r(pRec=pData0; p
145d0 52 65 63 3c 3d 70 4c 61 73 74 3b 20 70 52 65 63  Rec<=pLast; pRec
145e0 2b 2b 29 7b 20 20 2f 2a 20 73 65 72 69 61 6c 20  ++){  /* serial 
145f0 64 61 74 61 20 2a 2f 0a 20 20 20 20 69 20 2b 3d  data */.    i +=
14600 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
14610 61 6c 50 75 74 28 26 7a 4e 65 77 52 65 63 6f 72  alPut(&zNewRecor
14620 64 5b 69 5d 2c 20 28 69 6e 74 29 28 6e 42 79 74  d[i], (int)(nByt
14630 65 2d 69 29 2c 20 70 52 65 63 2c 66 69 6c 65 5f  e-i), pRec,file_
14640 66 6f 72 6d 61 74 29 3b 0a 20 20 7d 0a 20 20 61  format);.  }.  a
14650 73 73 65 72 74 28 20 69 3d 3d 6e 42 79 74 65 20  ssert( i==nByte 
14660 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  );..  assert( pO
14670 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e  p->p3>0 && pOp->
14680 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  p3<=p->nMem );. 
14690 20 70 4f 75 74 2d 3e 6e 20 3d 20 28 69 6e 74 29   pOut->n = (int)
146a0 6e 42 79 74 65 3b 0a 20 20 70 4f 75 74 2d 3e 66  nByte;.  pOut->f
146b0 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20  lags = MEM_Blob 
146c0 7c 20 4d 45 4d 5f 44 79 6e 3b 0a 20 20 70 4f 75  | MEM_Dyn;.  pOu
146d0 74 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 69  t->xDel = 0;.  i
146e0 66 28 20 6e 5a 65 72 6f 20 29 7b 0a 20 20 20 20  f( nZero ){.    
146f0 70 4f 75 74 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20  pOut->u.nZero = 
14700 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4f 75 74 2d  nZero;.    pOut-
14710 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 5a 65  >flags |= MEM_Ze
14720 72 6f 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e  ro;.  }.  pOut->
14730 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
14740 38 3b 20 20 2f 2a 20 49 6e 20 63 61 73 65 20 74  8;  /* In case t
14750 68 65 20 62 6c 6f 62 20 69 73 20 65 76 65 72 20  he blob is ever 
14760 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 74 65 78  converted to tex
14770 74 20 2a 2f 0a 20 20 52 45 47 49 53 54 45 52 5f  t */.  REGISTER_
14780 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70  TRACE(pOp->p3, p
14790 4f 75 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d  Out);.  UPDATE_M
147a0 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74  AX_BLOBSIZE(pOut
147b0 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
147c0 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 75 6e 74 20  * Opcode: Count 
147d0 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
147e0 2a 20 53 74 6f 72 65 20 74 68 65 20 6e 75 6d 62  * Store the numb
147f0 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 28 61  er of entries (a
14800 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 29  n integer value)
14810 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
14820 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 70 65 6e 65   index .** opene
14830 64 20 62 79 20 63 75 72 73 6f 72 20 50 31 20 69  d by cursor P1 i
14840 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2f  n register P2.*/
14850 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14860 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a  OMIT_BTREECOUNT.
14870 63 61 73 65 20 4f 50 5f 43 6f 75 6e 74 3a 20 7b  case OP_Count: {
14880 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
14890 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20  -prerelease */. 
148a0 20 69 36 34 20 6e 45 6e 74 72 79 3b 0a 20 20 42   i64 nEntry;.  B
148b0 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a  tCursor *pCrsr;.
148c0 0a 20 20 70 43 72 73 72 20 3d 20 70 2d 3e 61 70  .  pCrsr = p->ap
148d0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 70 43  Csr[pOp->p1]->pC
148e0 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 41 4c 57  ursor;.  if( ALW
148f0 41 59 53 28 70 43 72 73 72 29 20 29 7b 0a 20 20  AYS(pCrsr) ){.  
14900 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
14910 72 65 65 43 6f 75 6e 74 28 70 43 72 73 72 2c 20  reeCount(pCrsr, 
14920 26 6e 45 6e 74 72 79 29 3b 0a 20 20 7d 65 6c 73  &nEntry);.  }els
14930 65 7b 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d 20  e{.    nEntry = 
14940 30 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75  0;.  }.  pOut->u
14950 2e 69 20 3d 20 6e 45 6e 74 72 79 3b 0a 20 20 62  .i = nEntry;.  b
14960 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  reak;.}.#endif..
14970 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 61 76 65 70  /* Opcode: Savep
14980 6f 69 6e 74 20 50 31 20 2a 20 2a 20 50 34 20 2a  oint P1 * * P4 *
14990 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 2c 20 72 65 6c  .**.** Open, rel
149a0 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
149b0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6e   the savepoint n
149c0 61 6d 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  amed by paramete
149d0 72 20 50 34 2c 20 64 65 70 65 6e 64 69 6e 67 0a  r P4, depending.
149e0 2a 2a 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ** on the value 
149f0 6f 66 20 50 31 2e 20 54 6f 20 6f 70 65 6e 20 61  of P1. To open a
14a00 20 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 2c 20   new savepoint, 
14a10 50 31 3d 3d 30 2e 20 54 6f 20 72 65 6c 65 61 73  P1==0. To releas
14a20 65 20 28 63 6f 6d 6d 69 74 29 20 61 6e 0a 2a 2a  e (commit) an.**
14a30 20 65 78 69 73 74 69 6e 67 20 73 61 76 65 70 6f   existing savepo
14a40 69 6e 74 2c 20 50 31 3d 3d 31 2c 20 6f 72 20 74  int, P1==1, or t
14a50 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 65 78  o rollback an ex
14a60 69 73 74 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  isting savepoint
14a70 20 50 31 3d 3d 32 2e 0a 2a 2f 0a 63 61 73 65 20   P1==2..*/.case 
14a80 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a  OP_Savepoint: {.
14a90 20 20 69 6e 74 20 70 31 3b 20 20 20 20 20 20 20    int p1;       
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ab0 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 50 31    /* Value of P1
14ac0 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 68   operand */.  ch
14ad0 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
14ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14af0 20 4e 61 6d 65 20 6f 66 20 73 61 76 65 70 6f 69   Name of savepoi
14b00 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  nt */.  int nNam
14b10 65 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  e;.  Savepoint *
14b20 70 4e 65 77 3b 0a 20 20 53 61 76 65 70 6f 69 6e  pNew;.  Savepoin
14b30 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20  t *pSavepoint;. 
14b40 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70   Savepoint *pTmp
14b50 3b 0a 20 20 69 6e 74 20 69 53 61 76 65 70 6f 69  ;.  int iSavepoi
14b60 6e 74 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20  nt;.  int ii;.. 
14b70 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20   p1 = pOp->p1;. 
14b80 20 7a 4e 61 6d 65 20 3d 20 70 4f 70 2d 3e 70 34   zName = pOp->p4
14b90 2e 7a 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74  .z;..  /* Assert
14ba0 20 74 68 61 74 20 74 68 65 20 70 31 20 70 61 72   that the p1 par
14bb0 61 6d 65 74 65 72 20 69 73 20 76 61 6c 69 64 2e  ameter is valid.
14bc0 20 41 6c 73 6f 20 74 68 61 74 20 69 66 20 74 68   Also that if th
14bd0 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 0a 20  ere is no open. 
14be0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c   ** transaction,
14bf0 20 74 68 65 6e 20 74 68 65 72 65 20 63 61 6e 6e   then there cann
14c00 6f 74 20 62 65 20 61 6e 79 20 73 61 76 65 70 6f  ot be any savepo
14c10 69 6e 74 73 2e 20 0a 20 20 2a 2f 0a 20 20 61 73  ints. .  */.  as
14c20 73 65 72 74 28 20 64 62 2d 3e 70 53 61 76 65 70  sert( db->pSavep
14c30 6f 69 6e 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  oint==0 || db->a
14c40 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 3b 0a  utoCommit==0 );.
14c50 20 20 61 73 73 65 72 74 28 20 70 31 3d 3d 53 41    assert( p1==SA
14c60 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 7c 7c 70  VEPOINT_BEGIN||p
14c70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  1==SAVEPOINT_REL
14c80 45 41 53 45 7c 7c 70 31 3d 3d 53 41 56 45 50 4f  EASE||p1==SAVEPO
14c90 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
14ca0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 53    assert( db->pS
14cb0 61 76 65 70 6f 69 6e 74 20 7c 7c 20 64 62 2d 3e  avepoint || db->
14cc0 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76  isTransactionSav
14cd0 65 70 6f 69 6e 74 3d 3d 30 20 29 3b 0a 20 20 61  epoint==0 );.  a
14ce0 73 73 65 72 74 28 20 63 68 65 63 6b 53 61 76 65  ssert( checkSave
14cf0 70 6f 69 6e 74 43 6f 75 6e 74 28 64 62 29 20 29  pointCount(db) )
14d00 3b 0a 0a 20 20 69 66 28 20 70 31 3d 3d 53 41 56  ;..  if( p1==SAV
14d10 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 29 7b 0a  EPOINT_BEGIN ){.
14d20 20 20 20 20 69 66 28 20 64 62 2d 3e 77 72 69 74      if( db->writ
14d30 65 56 64 62 65 43 6e 74 3e 30 20 29 7b 0a 20 20  eVdbeCnt>0 ){.  
14d40 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 61 76      /* A new sav
14d50 65 70 6f 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  epoint cannot be
14d60 20 63 72 65 61 74 65 64 20 69 66 20 74 68 65 72   created if ther
14d70 65 20 61 72 65 20 61 63 74 69 76 65 20 77 72 69  e are active wri
14d80 74 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  te .      ** sta
14d90 74 65 6d 65 6e 74 73 20 28 69 2e 65 2e 20 6f 70  tements (i.e. op
14da0 65 6e 20 72 65 61 64 2f 77 72 69 74 65 20 69 6e  en read/write in
14db0 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 68  cremental blob h
14dc0 61 6e 64 6c 65 73 29 2e 0a 20 20 20 20 20 20 2a  andles)..      *
14dd0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
14de0 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
14df0 72 4d 73 67 2c 20 64 62 2c 20 22 63 61 6e 6e 6f  rMsg, db, "canno
14e00 74 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  t open savepoint
14e10 20 2d 20 22 0a 20 20 20 20 20 20 20 20 22 53 51   - ".        "SQ
14e20 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  L statements in 
14e30 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20 20 20  progress");.    
14e40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
14e50 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  SY;.    }else{. 
14e60 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c       nName = sql
14e70 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
14e80 6d 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  me);..#ifndef SQ
14e90 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
14ea0 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20  LTABLE.      /* 
14eb0 54 68 69 73 20 63 61 6c 6c 20 69 73 20 4f 6b 20  This call is Ok 
14ec0 65 76 65 6e 20 69 66 20 74 68 69 73 20 73 61 76  even if this sav
14ed0 65 70 6f 69 6e 74 20 69 73 20 61 63 74 75 61 6c  epoint is actual
14ee0 6c 79 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ly a transaction
14ef0 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 65 70 6f  .      ** savepo
14f00 69 6e 74 20 28 61 6e 64 20 74 68 65 72 65 66 6f  int (and therefo
14f10 72 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 70 72  re should not pr
14f20 6f 6d 70 74 20 78 53 61 76 65 70 6f 69 6e 74 28  ompt xSavepoint(
14f30 29 29 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20  )) callbacks..  
14f40 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
14f50 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
14f60 73 61 76 65 70 6f 69 6e 74 20 62 65 69 6e 67 20  savepoint being 
14f70 6f 70 65 6e 65 64 2c 20 69 74 20 69 73 20 67 75  opened, it is gu
14f80 61 72 61 6e 74 65 65 64 0a 20 20 20 20 20 20 2a  aranteed.      *
14f90 2a 20 74 68 61 74 20 74 68 65 20 64 62 2d 3e 61  * that the db->a
14fa0 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 20 69  VTrans[] array i
14fb0 73 20 65 6d 70 74 79 2e 20 20 2a 2f 0a 20 20 20  s empty.  */.   
14fc0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
14fd0 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20  utoCommit==0 || 
14fe0 64 62 2d 3e 6e 56 54 72 61 6e 73 3d 3d 30 20 29  db->nVTrans==0 )
14ff0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
15000 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
15010 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
15020 42 45 47 49 4e 2c 0a 20 20 20 20 20 20 20 20 20  BEGIN,.         
15030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15040 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74         db->nStat
15050 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70  ement+db->nSavep
15060 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  oint);.      if(
15070 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15080 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
15090 74 6f 5f 65 72 72 6f 72 3b 0a 23 65 6e 64 69 66  to_error;.#endif
150a0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  ..      /* Creat
150b0 65 20 61 20 6e 65 77 20 73 61 76 65 70 6f 69 6e  e a new savepoin
150c0 74 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  t structure. */.
150d0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
150e0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
150f0 64 62 2c 20 73 69 7a 65 6f 66 28 53 61 76 65 70  db, sizeof(Savep
15100 6f 69 6e 74 29 2b 6e 4e 61 6d 65 2b 31 29 3b 0a  oint)+nName+1);.
15110 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
15120 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
15130 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29  zName = (char *)
15140 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20  &pNew[1];.      
15150 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a    memcpy(pNew->z
15160 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Name, zName, nNa
15170 6d 65 2b 31 29 3b 0a 20 20 20 20 0a 20 20 20 20  me+1);.    .    
15180 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
15190 69 73 20 6e 6f 20 6f 70 65 6e 20 74 72 61 6e 73  is no open trans
151a0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6d 61 72  action, then mar
151b0 6b 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63  k this as a spec
151c0 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  ial.        ** "
151d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
151e0 70 6f 69 6e 74 22 2e 20 2a 2f 0a 20 20 20 20 20  point". */.     
151f0 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43     if( db->autoC
15200 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  ommit ){.       
15210 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
15220 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
15230 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69   db->isTransacti
15240 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 31 3b  onSavepoint = 1;
15250 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
15260 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53            db->nS
15270 61 76 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20  avepoint++;.    
15280 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20      }.    .     
15290 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e     /* Link the n
152a0 65 77 20 73 61 76 65 70 6f 69 6e 74 20 69 6e 74  ew savepoint int
152b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  o the database h
152c0 61 6e 64 6c 65 27 73 20 6c 69 73 74 2e 20 2a 2f  andle's list. */
152d0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
152e0 4e 65 78 74 20 3d 20 64 62 2d 3e 70 53 61 76 65  Next = db->pSave
152f0 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 64  point;.        d
15300 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20  b->pSavepoint = 
15310 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4e  pNew;.        pN
15320 65 77 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  ew->nDeferredCon
15330 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72 65  s = db->nDeferre
15340 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 7d 0a 20  dCons;.      }. 
15350 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
15360 20 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 30    iSavepoint = 0
15370 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74  ;..    /* Find t
15380 68 65 20 6e 61 6d 65 64 20 73 61 76 65 70 6f 69  he named savepoi
15390 6e 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  nt. If there is 
153a0 6e 6f 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e  no such savepoin
153b0 74 2c 20 74 68 65 6e 20 61 6e 0a 20 20 20 20 2a  t, then an.    *
153c0 2a 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  * an error is re
153d0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73  turned to the us
153e0 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  er.  */.    for(
153f0 0a 20 20 20 20 20 20 70 53 61 76 65 70 6f 69 6e  .      pSavepoin
15400 74 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  t = db->pSavepoi
15410 6e 74 3b 20 0a 20 20 20 20 20 20 70 53 61 76 65  nt; .      pSave
15420 70 6f 69 6e 74 20 26 26 20 73 71 6c 69 74 65 33  point && sqlite3
15430 53 74 72 49 43 6d 70 28 70 53 61 76 65 70 6f 69  StrICmp(pSavepoi
15440 6e 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  nt->zName, zName
15450 29 3b 0a 20 20 20 20 20 20 70 53 61 76 65 70 6f  );.      pSavepo
15460 69 6e 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  int = pSavepoint
15470 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 7b 0a 20  ->pNext.    ){. 
15480 20 20 20 20 20 69 53 61 76 65 70 6f 69 6e 74 2b       iSavepoint+
15490 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
154a0 20 21 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a   !pSavepoint ){.
154b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
154c0 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
154d0 73 67 2c 20 64 62 2c 20 22 6e 6f 20 73 75 63 68  sg, db, "no such
154e0 20 73 61 76 65 70 6f 69 6e 74 3a 20 25 73 22 2c   savepoint: %s",
154f0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72   zName);.      r
15500 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
15510 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
15520 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 77 72 69  .        db->wri
15530 74 65 56 64 62 65 43 6e 74 3e 30 20 7c 7c 20 28  teVdbeCnt>0 || (
15540 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p1==SAVEPOINT_RO
15550 4c 4c 42 41 43 4b 20 26 26 20 64 62 2d 3e 61 63  LLBACK && db->ac
15560 74 69 76 65 56 64 62 65 43 6e 74 3e 31 29 20 0a  tiveVdbeCnt>1) .
15570 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
15580 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
15590 6c 65 20 74 6f 20 72 65 6c 65 61 73 65 20 28 63  le to release (c
155a0 6f 6d 6d 69 74 29 20 61 20 73 61 76 65 70 6f 69  ommit) a savepoi
155b0 6e 74 20 69 66 20 74 68 65 72 65 20 61 72 65 20  nt if there are 
155c0 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 69 76 65  .      ** active
155d0 20 77 72 69 74 65 20 73 74 61 74 65 6d 65 6e 74   write statement
155e0 73 2e 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  s. It is not pos
155f0 73 69 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63  sible to rollbac
15600 6b 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 20 20  k a savepoint.  
15610 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20      ** if there 
15620 61 72 65 20 61 6e 79 20 61 63 74 69 76 65 20 73  are any active s
15630 74 61 74 65 6d 65 6e 74 73 20 61 74 20 61 6c 6c  tatements at all
15640 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
15650 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
15660 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  g(&p->zErrMsg, d
15670 62 2c 20 0a 20 20 20 20 20 20 20 20 22 63 61 6e  b, .        "can
15680 6e 6f 74 20 25 73 20 73 61 76 65 70 6f 69 6e 74  not %s savepoint
15690 20 2d 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74   - SQL statement
156a0 73 20 69 6e 20 70 72 6f 67 72 65 73 73 22 2c 0a  s in progress",.
156b0 20 20 20 20 20 20 20 20 28 70 31 3d 3d 53 41 56          (p1==SAV
156c0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
156d0 3f 20 22 72 6f 6c 6c 62 61 63 6b 22 3a 20 22 72  ? "rollback": "r
156e0 65 6c 65 61 73 65 22 29 0a 20 20 20 20 20 20 29  elease").      )
156f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
15700 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65  ITE_BUSY;.    }e
15710 6c 73 65 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 44  lse{..      /* D
15720 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
15730 20 6f 72 20 6e 6f 74 20 74 68 69 73 20 69 73 20   or not this is 
15740 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  a transaction sa
15750 76 65 70 6f 69 6e 74 2e 20 49 66 20 73 6f 2c 0a  vepoint. If so,.
15760 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 69        ** and thi
15770 73 20 69 73 20 61 20 52 45 4c 45 41 53 45 20 63  s is a RELEASE c
15780 6f 6d 6d 61 6e 64 2c 20 74 68 65 6e 20 74 68 65  ommand, then the
15790 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
157a0 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 69  tion .      ** i
157b0 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 0a 20 20  s committed. .  
157c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
157d0 20 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d   isTransaction =
157e0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65   pSavepoint->pNe
157f0 78 74 3d 3d 30 20 26 26 20 64 62 2d 3e 69 73 54  xt==0 && db->isT
15800 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f  ransactionSavepo
15810 69 6e 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69  int;.      if( i
15820 73 54 72 61 6e 73 61 63 74 69 6f 6e 20 26 26 20  sTransaction && 
15830 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  p1==SAVEPOINT_RE
15840 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 20  LEASE ){.       
15850 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
15860 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c  e3VdbeCheckFk(p,
15870 20 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   1))!=SQLITE_OK 
15880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
15890 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20  o vdbe_return;. 
158a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
158b0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
158c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 1;.        if(
158d0 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
158e0 28 70 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  (p)==SQLITE_BUSY
158f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
15900 3e 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 20 20  >pc = pc;.      
15910 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
15920 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
15930 20 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53    p->rc = rc = S
15940 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
15950 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f        goto vdbe_
15960 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
15970 7d 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 69 73  }.        db->is
15980 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70  TransactionSavep
15990 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  oint = 0;.      
159a0 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20    rc = p->rc;.  
159b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
159c0 20 20 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20     iSavepoint = 
159d0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2d  db->nSavepoint -
159e0 20 69 53 61 76 65 70 6f 69 6e 74 20 2d 20 31 3b   iSavepoint - 1;
159f0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
15a00 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  0; ii<db->nDb; i
15a10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
15a20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
15a30 65 53 61 76 65 70 6f 69 6e 74 28 64 62 2d 3e 61  eSavepoint(db->a
15a40 44 62 5b 69 69 5d 2e 70 42 74 2c 20 70 31 2c 20  Db[ii].pBt, p1, 
15a50 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
15a60 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
15a70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15a80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f          goto abo
15a90 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
15aa0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
15ac0 66 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54  f( p1==SAVEPOINT
15ad0 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20 28 64 62  _ROLLBACK && (db
15ae0 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49  ->flags&SQLITE_I
15af0 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21 3d 30  nternChanges)!=0
15b00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
15b10 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
15b20 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
15b30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
15b40 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
15b50 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d 31 29 3b  lSchema(db, -1);
15b60 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66  .          db->f
15b70 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  lags = (db->flag
15b80 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65 72  s | SQLITE_Inter
15b90 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20 20  nChanges);.     
15ba0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a     }.      }.  .
15bb0 20 20 20 20 20 20 2f 2a 20 52 65 67 61 72 64 6c        /* Regardl
15bc0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74  ess of whether t
15bd0 68 69 73 20 69 73 20 61 20 52 45 4c 45 41 53 45  his is a RELEASE
15be0 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2c 20 64 65   or ROLLBACK, de
15bf0 73 74 72 6f 79 20 61 6c 6c 20 0a 20 20 20 20 20  stroy all .     
15c00 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 6e   ** savepoints n
15c10 65 73 74 65 64 20 69 6e 73 69 64 65 20 6f 66 20  ested inside of 
15c20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 62 65  the savepoint be
15c30 69 6e 67 20 6f 70 65 72 61 74 65 64 20 6f 6e 2e  ing operated on.
15c40 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
15c50 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 21   db->pSavepoint!
15c60 3d 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20  =pSavepoint ){. 
15c70 20 20 20 20 20 20 20 70 54 6d 70 20 3d 20 64 62         pTmp = db
15c80 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20  ->pSavepoint;.  
15c90 20 20 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70        db->pSavep
15ca0 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65  oint = pTmp->pNe
15cb0 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  xt;.        sqli
15cc0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
15cd0 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  mp);.        db-
15ce0 3e 6e 53 61 76 65 70 6f 69 6e 74 2d 2d 3b 0a 20  >nSavepoint--;. 
15cf0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
15d00 20 49 66 20 69 74 20 69 73 20 61 20 52 45 4c 45   If it is a RELE
15d10 41 53 45 2c 20 74 68 65 6e 20 64 65 73 74 72 6f  ASE, then destro
15d20 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  y the savepoint 
15d30 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64 20 6f  being operated o
15d40 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6f 2e  n .      ** too.
15d50 20 49 66 20 69 74 20 69 73 20 61 20 52 4f 4c 4c   If it is a ROLL
15d60 42 41 43 4b 20 54 4f 2c 20 74 68 65 6e 20 73 65  BACK TO, then se
15d70 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
15d80 64 65 66 65 72 72 65 64 20 0a 20 20 20 20 20 20  deferred .      
15d90 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69  ** constraint vi
15da0 6f 6c 61 74 69 6f 6e 73 20 70 72 65 73 65 6e 74  olations present
15db0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
15dc0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 74   to the value st
15dd0 6f 72 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 68  ored.      ** wh
15de0 65 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  en the savepoint
15df0 20 77 61 73 20 63 72 65 61 74 65 64 2e 20 20 2a   was created.  *
15e00 2f 0a 20 20 20 20 20 20 69 66 28 20 70 31 3d 3d  /.      if( p1==
15e10 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
15e20 45 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  E ){.        ass
15e30 65 72 74 28 20 70 53 61 76 65 70 6f 69 6e 74 3d  ert( pSavepoint=
15e40 3d 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20  =db->pSavepoint 
15e50 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 70  );.        db->p
15e60 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 53 61 76  Savepoint = pSav
15e70 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 3b 0a 20  epoint->pNext;. 
15e80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
15e90 46 72 65 65 28 64 62 2c 20 70 53 61 76 65 70 6f  Free(db, pSavepo
15ea0 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  int);.        if
15eb0 28 20 21 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  ( !isTransaction
15ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62   ){.          db
15ed0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2d 2d 3b 0a  ->nSavepoint--;.
15ee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15ef0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64  }else{.        d
15f00 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
15f10 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e   = pSavepoint->n
15f20 44 65 66 65 72 72 65 64 43 6f 6e 73 3b 0a 20 20  DeferredCons;.  
15f30 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
15f40 20 21 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 20   !isTransaction 
15f50 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
15f60 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
15f70 6f 69 6e 74 28 64 62 2c 20 70 31 2c 20 69 53 61  oint(db, p1, iSa
15f80 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
15f90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15fa0 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  _OK ) goto abort
15fb0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
15fc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15fd0 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ..  break;.}../*
15fe0 20 4f 70 63 6f 64 65 3a 20 41 75 74 6f 43 6f 6d   Opcode: AutoCom
15ff0 6d 69 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  mit P1 P2 * * *.
16000 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 61  **.** Set the da
16010 74 61 62 61 73 65 20 61 75 74 6f 2d 63 6f 6d 6d  tabase auto-comm
16020 69 74 20 66 6c 61 67 20 74 6f 20 50 31 20 28 31  it flag to P1 (1
16030 20 6f 72 20 30 29 2e 20 49 66 20 50 32 20 69 73   or 0). If P2 is
16040 20 74 72 75 65 2c 20 72 6f 6c 6c 0a 2a 2a 20 62   true, roll.** b
16050 61 63 6b 20 61 6e 79 20 63 75 72 72 65 6e 74 6c  ack any currentl
16060 79 20 61 63 74 69 76 65 20 62 74 72 65 65 20 74  y active btree t
16070 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 49 66 20  ransactions. If 
16080 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 61 63  there are any ac
16090 74 69 76 65 0a 2a 2a 20 56 4d 73 20 28 61 70 61  tive.** VMs (apa
160a0 72 74 20 66 72 6f 6d 20 74 68 69 73 20 6f 6e 65  rt from this one
160b0 29 2c 20 74 68 65 6e 20 61 20 52 4f 4c 4c 42 41  ), then a ROLLBA
160c0 43 4b 20 66 61 69 6c 73 2e 20 20 41 20 43 4f 4d  CK fails.  A COM
160d0 4d 49 54 20 66 61 69 6c 73 20 69 66 0a 2a 2a 20  MIT fails if.** 
160e0 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
160f0 20 77 72 69 74 69 6e 67 20 56 4d 73 20 6f 72 20   writing VMs or 
16100 61 63 74 69 76 65 20 56 4d 73 20 74 68 61 74 20  active VMs that 
16110 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65  use shared cache
16120 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73  ..**.** This ins
16130 74 72 75 63 74 69 6f 6e 20 63 61 75 73 65 73 20  truction causes 
16140 74 68 65 20 56 4d 20 74 6f 20 68 61 6c 74 2e 0a  the VM to halt..
16150 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 75 74 6f 43  */.case OP_AutoC
16160 6f 6d 6d 69 74 3a 20 7b 0a 20 20 69 6e 74 20 64  ommit: {.  int d
16170 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
16180 3b 0a 20 20 69 6e 74 20 69 52 6f 6c 6c 62 61 63  ;.  int iRollbac
16190 6b 3b 0a 20 20 69 6e 74 20 74 75 72 6e 4f 6e 41  k;.  int turnOnA
161a0 43 3b 0a 0a 20 20 64 65 73 69 72 65 64 41 75 74  C;..  desiredAut
161b0 6f 43 6f 6d 6d 69 74 20 3d 20 70 4f 70 2d 3e 70  oCommit = pOp->p
161c0 31 3b 0a 20 20 69 52 6f 6c 6c 62 61 63 6b 20 3d  1;.  iRollback =
161d0 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 74 75 72 6e   pOp->p2;.  turn
161e0 4f 6e 41 43 20 3d 20 64 65 73 69 72 65 64 41 75  OnAC = desiredAu
161f0 74 6f 43 6f 6d 6d 69 74 20 26 26 20 21 64 62 2d  toCommit && !db-
16200 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20 61  >autoCommit;.  a
16210 73 73 65 72 74 28 20 64 65 73 69 72 65 64 41 75  ssert( desiredAu
16220 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 64  toCommit==1 || d
16230 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
16240 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
16250 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d   desiredAutoComm
16260 69 74 3d 3d 31 20 7c 7c 20 69 52 6f 6c 6c 62 61  it==1 || iRollba
16270 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
16280 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62  t( db->activeVdb
16290 65 43 6e 74 3e 30 20 29 3b 20 20 2f 2a 20 41 74  eCnt>0 );  /* At
162a0 20 6c 65 61 73 74 20 74 68 69 73 20 6f 6e 65 20   least this one 
162b0 56 4d 20 69 73 20 61 63 74 69 76 65 20 2a 2f 0a  VM is active */.
162c0 0a 20 20 69 66 28 20 74 75 72 6e 4f 6e 41 43 20  .  if( turnOnAC 
162d0 26 26 20 69 52 6f 6c 6c 62 61 63 6b 20 26 26 20  && iRollback && 
162e0 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
162f0 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  t>1 ){.    /* If
16300 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
16310 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 52  n implements a R
16320 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 6f 74 68 65  OLLBACK and othe
16330 72 20 56 4d 73 20 61 72 65 0a 20 20 20 20 2a 2a  r VMs are.    **
16340 20 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 2c 20   still running, 
16350 61 6e 64 20 61 20 74 72 61 6e 73 61 63 74 69 6f  and a transactio
16360 6e 20 69 73 20 61 63 74 69 76 65 2c 20 72 65 74  n is active, ret
16370 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 64  urn an error ind
16380 69 63 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74  icating.    ** t
16390 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 56 4d  hat the other VM
163a0 73 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20  s must complete 
163b0 66 69 72 73 74 2e 20 0a 20 20 20 20 2a 2f 0a 20  first. .    */. 
163c0 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
163d0 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
163e0 20 64 62 2c 20 22 63 61 6e 6e 6f 74 20 72 6f 6c   db, "cannot rol
163f0 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f  lback transactio
16400 6e 20 2d 20 22 0a 20 20 20 20 20 20 20 20 22 53  n - ".        "S
16410 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  QL statements in
16420 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20 20   progress");.   
16430 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
16440 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 74  Y;.  }else if( t
16450 75 72 6e 4f 6e 41 43 20 26 26 20 21 69 52 6f 6c  urnOnAC && !iRol
16460 6c 62 61 63 6b 20 26 26 20 64 62 2d 3e 77 72 69  lback && db->wri
16470 74 65 56 64 62 65 43 6e 74 3e 30 20 29 7b 0a 20  teVdbeCnt>0 ){. 
16480 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e     /* If this in
16490 73 74 72 75 63 74 69 6f 6e 20 69 6d 70 6c 65 6d  struction implem
164a0 65 6e 74 73 20 61 20 43 4f 4d 4d 49 54 20 61 6e  ents a COMMIT an
164b0 64 20 6f 74 68 65 72 20 56 4d 73 20 61 72 65 20  d other VMs are 
164c0 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 72  writing.    ** r
164d0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69  eturn an error i
164e0 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74  ndicating that t
164f0 68 65 20 6f 74 68 65 72 20 56 4d 73 20 6d 75 73  he other VMs mus
16500 74 20 63 6f 6d 70 6c 65 74 65 20 66 69 72 73 74  t complete first
16510 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  . .    */.    sq
16520 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
16530 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
16540 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 74  "cannot commit t
16550 72 61 6e 73 61 63 74 69 6f 6e 20 2d 20 22 0a 20  ransaction - ". 
16560 20 20 20 20 20 20 20 22 53 51 4c 20 73 74 61 74         "SQL stat
16570 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65  ements in progre
16580 73 73 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ss");.    rc = S
16590 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
165a0 6c 73 65 20 69 66 28 20 64 65 73 69 72 65 64 41  lse if( desiredA
165b0 75 74 6f 43 6f 6d 6d 69 74 21 3d 64 62 2d 3e 61  utoCommit!=db->a
165c0 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  utoCommit ){.   
165d0 20 69 66 28 20 69 52 6f 6c 6c 62 61 63 6b 20 29   if( iRollback )
165e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
165f0 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69  desiredAutoCommi
16600 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  t==1 );.      sq
16610 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
16620 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  (db);.      db->
16630 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
16640 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72      }else if( (r
16650 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
16660 68 65 63 6b 46 6b 28 70 2c 20 31 29 29 21 3d 53  heckFk(p, 1))!=S
16670 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16680 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75    goto vdbe_retu
16690 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rn;.    }else{. 
166a0 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
166b0 6d 69 74 20 3d 20 28 75 38 29 64 65 73 69 72 65  mit = (u8)desire
166c0 64 41 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20 20  dAutoCommit;.   
166d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
166e0 62 65 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54  beHalt(p)==SQLIT
166f0 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
16700 20 20 70 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20    p->pc = pc;.  
16710 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
16720 6d 6d 69 74 20 3d 20 28 75 38 29 28 31 2d 64 65  mmit = (u8)(1-de
16730 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 29  siredAutoCommit)
16740 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  ;.        p->rc 
16750 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55  = rc = SQLITE_BU
16760 53 59 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  SY;.        goto
16770 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20   vdbe_return;.  
16780 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16790 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61  assert( db->nSta
167a0 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 20  tement==0 );.   
167b0 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
167c0 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
167d0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
167e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
167f0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
16800 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16810 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
16820 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67  ROR;.    }.    g
16830 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b  oto vdbe_return;
16840 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
16850 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
16860 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 0a  p->zErrMsg, db,.
16870 20 20 20 20 20 20 20 20 28 21 64 65 73 69 72 65          (!desire
16880 64 41 75 74 6f 43 6f 6d 6d 69 74 29 3f 22 63 61  dAutoCommit)?"ca
16890 6e 6e 6f 74 20 73 74 61 72 74 20 61 20 74 72 61  nnot start a tra
168a0 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 69 6e 20  nsaction within 
168b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 3a 28  a transaction":(
168c0 0a 20 20 20 20 20 20 20 20 28 69 52 6f 6c 6c 62  .        (iRollb
168d0 61 63 6b 29 3f 22 63 61 6e 6e 6f 74 20 72 6f 6c  ack)?"cannot rol
168e0 6c 62 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73  lback - no trans
168f0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
16900 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ":.             
16910 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 6f        "cannot co
16920 6d 6d 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61  mmit - no transa
16930 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22  ction is active"
16940 29 29 3b 0a 20 20 20 20 20 20 20 20 20 0a 20 20  ));.         .  
16950 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
16960 52 4f 52 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  ROR;.  }.  break
16970 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
16980 54 72 61 6e 73 61 63 74 69 6f 6e 20 50 31 20 50  Transaction P1 P
16990 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 42 65  2 * * *.**.** Be
169a0 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  gin a transactio
169b0 6e 2e 20 20 54 68 65 20 74 72 61 6e 73 61 63 74  n.  The transact
169c0 69 6f 6e 20 65 6e 64 73 20 77 68 65 6e 20 61 20  ion ends when a 
169d0 43 6f 6d 6d 69 74 20 6f 72 20 52 6f 6c 6c 62 61  Commit or Rollba
169e0 63 6b 0a 2a 2a 20 6f 70 63 6f 64 65 20 69 73 20  ck.** opcode is 
169f0 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 20 44 65  encountered.  De
16a00 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 4f  pending on the O
16a10 4e 20 43 4f 4e 46 4c 49 43 54 20 73 65 74 74 69  N CONFLICT setti
16a20 6e 67 2c 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  ng, the.** trans
16a30 61 63 74 69 6f 6e 20 6d 69 67 68 74 20 61 6c 73  action might als
16a40 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
16a50 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
16a60 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
16a70 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69 6e 64  ** P1 is the ind
16a80 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
16a90 73 65 20 66 69 6c 65 20 6f 6e 20 77 68 69 63 68  se file on which
16aa0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16ab0 20 69 73 0a 2a 2a 20 73 74 61 72 74 65 64 2e 20   is.** started. 
16ac0 20 49 6e 64 65 78 20 30 20 69 73 20 74 68 65 20   Index 0 is the 
16ad0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
16ae0 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 31 20 69  le and index 1 i
16af0 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 75 73  s the.** file us
16b00 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  ed for temporary
16b10 20 74 61 62 6c 65 73 2e 20 20 49 6e 64 69 63 65   tables.  Indice
16b20 73 20 6f 66 20 32 20 6f 72 20 6d 6f 72 65 20 61  s of 2 or more a
16b30 72 65 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 61  re used for.** a
16b40 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
16b50 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32 20 69  s..**.** If P2 i
16b60 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
16b70 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
16b80 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2e  tion is started.
16b90 20 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63    A RESERVED loc
16ba0 6b 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  k is.** obtained
16bb0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
16bc0 20 66 69 6c 65 20 77 68 65 6e 20 61 20 77 72 69   file when a wri
16bd0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
16be0 73 20 73 74 61 72 74 65 64 2e 20 20 4e 6f 0a 2a  s started.  No.*
16bf0 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  * other process 
16c00 63 61 6e 20 73 74 61 72 74 20 61 6e 6f 74 68 65  can start anothe
16c10 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
16c20 69 6f 6e 20 77 68 69 6c 65 20 74 68 69 73 20 74  ion while this t
16c30 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a  ransaction is.**
16c40 20 75 6e 64 65 72 77 61 79 2e 20 20 53 74 61 72   underway.  Star
16c50 74 69 6e 67 20 61 20 77 72 69 74 65 20 74 72 61  ting a write tra
16c60 6e 73 61 63 74 69 6f 6e 20 61 6c 73 6f 20 63 72  nsaction also cr
16c70 65 61 74 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  eates a rollback
16c80 20 6a 6f 75 72 6e 61 6c 2e 20 41 0a 2a 2a 20 77   journal. A.** w
16c90 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
16ca0 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
16cb0 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
16cc0 67 65 73 20 63 61 6e 20 62 65 20 6d 61 64 65 20  ges can be made 
16cd0 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  to the.** databa
16ce0 73 65 2e 20 20 49 66 20 50 32 20 69 73 20 32 20  se.  If P2 is 2 
16cf0 6f 72 20 67 72 65 61 74 65 72 20 74 68 65 6e 20  or greater then 
16d00 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
16d10 6b 20 69 73 20 61 6c 73 6f 20 6f 62 74 61 69 6e  k is also obtain
16d20 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c  ed.** on the fil
16d30 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 77 72  e..**.** If a wr
16d40 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
16d50 69 73 20 73 74 61 72 74 65 64 20 61 6e 64 20 74  is started and t
16d60 68 65 20 56 64 62 65 2e 75 73 65 73 53 74 6d 74  he Vdbe.usesStmt
16d70 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 0a  Journal flag is.
16d80 2a 2a 20 74 72 75 65 20 28 74 68 69 73 20 66 6c  ** true (this fl
16d90 61 67 20 69 73 20 73 65 74 20 69 66 20 74 68 65  ag is set if the
16da0 20 56 64 62 65 20 6d 61 79 20 6d 6f 64 69 66 79   Vdbe may modify
16db0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
16dc0 6f 77 20 61 6e 64 20 6d 61 79 0a 2a 2a 20 74 68  ow and may.** th
16dd0 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63  row an ABORT exc
16de0 65 70 74 69 6f 6e 29 2c 20 61 20 73 74 61 74 65  eption), a state
16df0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
16e00 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 6f 70 65   may also be ope
16e10 6e 65 64 2e 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ned..** More spe
16e20 63 69 66 69 63 61 6c 6c 79 2c 20 61 20 73 74 61  cifically, a sta
16e30 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
16e40 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 69 66 66  on is opened iff
16e50 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
16e60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63   connection is c
16e70 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 69 6e 20  urrently not in 
16e80 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c  autocommit mode,
16e90 20 6f 72 20 69 66 20 74 68 65 72 65 20 61 72 65   or if there are
16ea0 20 6f 74 68 65 72 0a 2a 2a 20 61 63 74 69 76 65   other.** active
16eb0 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 41 20 73   statements. A s
16ec0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
16ed0 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 74 68 65 20  tion allows the 
16ee0 61 66 66 65 63 74 73 20 6f 66 20 74 68 69 73 0a  affects of this.
16ef0 2a 2a 20 56 44 42 45 20 74 6f 20 62 65 20 72 6f  ** VDBE to be ro
16f00 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 20  lled back after 
16f10 61 6e 20 65 72 72 6f 72 20 77 69 74 68 6f 75 74  an error without
16f20 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 20   having to roll 
16f30 62 61 63 6b 20 74 68 65 0a 2a 2a 20 65 6e 74 69  back the.** enti
16f40 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  re transaction. 
16f50 49 66 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 65  If no error is e
16f60 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 20  ncountered, the 
16f70 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
16f80 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 61 75  ction.** will au
16f90 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6d 6d  tomatically comm
16fa0 69 74 20 77 68 65 6e 20 74 68 65 20 56 44 42 45  it when the VDBE
16fb0 20 68 61 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   halts..**.** If
16fc0 20 50 32 20 69 73 20 7a 65 72 6f 2c 20 74 68 65   P2 is zero, the
16fd0 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73  n a read-lock is
16fe0 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
16ff0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
17000 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 72 61 6e 73  */.case OP_Trans
17010 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 42 74 72 65  action: {.  Btre
17020 65 20 2a 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  e *pBt;..  asser
17030 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
17040 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62   pOp->p1<db->nDb
17050 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
17060 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28  ->btreeMask & ((
17070 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70  (yDbMask)1)<<pOp
17080 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a 20 20 70  ->p1))!=0 );.  p
17090 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70  Bt = db->aDb[pOp
170a0 2d 3e 70 31 5d 2e 70 42 74 3b 0a 0a 20 20 69 66  ->p1].pBt;..  if
170b0 28 20 70 42 74 20 29 7b 0a 20 20 20 20 72 63 20  ( pBt ){.    rc 
170c0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
170d0 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 70 4f  ginTrans(pBt, pO
170e0 70 2d 3e 70 32 29 3b 0a 20 20 20 20 69 66 28 20  p->p2);.    if( 
170f0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
17100 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 63 20 3d  ){.      p->pc =
17110 20 70 63 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63   pc;.      p->rc
17120 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42   = rc = SQLITE_B
17130 55 53 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  USY;.      goto 
17140 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20  vdbe_return;.   
17150 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
17160 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17170 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
17180 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  _to_error;.    }
17190 0a 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  ..    if( pOp->p
171a0 32 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  2 && p->usesStmt
171b0 4a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 20 26 26  Journal .     &&
171c0 20 28 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   (db->autoCommit
171d0 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 63 74 69 76  ==0 || db->activ
171e0 65 56 64 62 65 43 6e 74 3e 31 29 20 0a 20 20 20  eVdbeCnt>1) .   
171f0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
17200 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
17210 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 3b 0a  InTrans(pBt) );.
17220 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 53 74        if( p->iSt
17230 61 74 65 6d 65 6e 74 3d 3d 30 20 29 7b 0a 20 20  atement==0 ){.  
17240 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
17250 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 3d 30 20  ->nStatement>=0 
17260 26 26 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  && db->nSavepoin
17270 74 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t>=0 );.        
17280 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 2b  db->nStatement++
17290 3b 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 53  ; .        p->iS
172a0 74 61 74 65 6d 65 6e 74 20 3d 20 64 62 2d 3e 6e  tatement = db->n
172b0 53 61 76 65 70 6f 69 6e 74 20 2b 20 64 62 2d 3e  Savepoint + db->
172c0 6e 53 74 61 74 65 6d 65 6e 74 3b 0a 20 20 20 20  nStatement;.    
172d0 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20    }..      rc = 
172e0 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
172f0 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
17300 4e 54 5f 42 45 47 49 4e 2c 20 70 2d 3e 69 53 74  NT_BEGIN, p->iSt
17310 61 74 65 6d 65 6e 74 2d 31 29 3b 0a 20 20 20 20  atement-1);.    
17320 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17330 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
17340 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
17350 42 65 67 69 6e 53 74 6d 74 28 70 42 74 2c 20 70  BeginStmt(pBt, p
17360 2d 3e 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  ->iStatement);. 
17370 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
17380 20 53 74 6f 72 65 20 74 68 65 20 63 75 72 72 65   Store the curre
17390 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  nt value of the 
173a0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73  database handles
173b0 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
173c0 61 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  aint.      ** co
173d0 75 6e 74 65 72 2e 20 49 66 20 74 68 65 20 73 74  unter. If the st
173e0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
173f0 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ion needs to be 
17400 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 0a 20 20 20  rolled back,.   
17410 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
17420 6f 66 20 74 68 69 73 20 63 6f 75 6e 74 65 72 20  of this counter 
17430 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
17440 6f 72 65 64 20 74 6f 6f 2e 20 20 2a 2f 0a 20 20  ored too.  */.  
17450 20 20 20 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43      p->nStmtDefC
17460 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72  ons = db->nDefer
17470 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20  redCons;.    }. 
17480 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
17490 2a 20 4f 70 63 6f 64 65 3a 20 52 65 61 64 43 6f  * Opcode: ReadCo
174a0 6f 6b 69 65 20 50 31 20 50 32 20 50 33 20 2a 20  okie P1 P2 P3 * 
174b0 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 63 6f 6f  *.**.** Read coo
174c0 6b 69 65 20 6e 75 6d 62 65 72 20 50 33 20 66 72  kie number P3 fr
174d0 6f 6d 20 64 61 74 61 62 61 73 65 20 50 31 20 61  om database P1 a
174e0 6e 64 20 77 72 69 74 65 20 69 74 20 69 6e 74 6f  nd write it into
174f0 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
17500 20 50 33 3d 3d 31 20 69 73 20 74 68 65 20 73 63   P3==1 is the sc
17510 68 65 6d 61 20 76 65 72 73 69 6f 6e 2e 20 20 50  hema version.  P
17520 33 3d 3d 32 20 69 73 20 74 68 65 20 64 61 74 61  3==2 is the data
17530 62 61 73 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  base format..** 
17540 50 33 3d 3d 33 20 69 73 20 74 68 65 20 72 65 63  P3==3 is the rec
17550 6f 6d 6d 65 6e 64 65 64 20 70 61 67 65 72 20 63  ommended pager c
17560 61 63 68 65 20 73 69 7a 65 2c 20 61 6e 64 20 73  ache size, and s
17570 6f 20 66 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20  o forth.  P1==0 
17580 69 73 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64  is.** the main d
17590 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
175a0 20 50 31 3d 3d 31 20 69 73 20 74 68 65 20 64 61   P1==1 is the da
175b0 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
175c0 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d   to store.** tem
175d0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 2a  porary tables..*
175e0 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
175f0 62 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  be a read-lock o
17600 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
17610 65 69 74 68 65 72 20 61 20 74 72 61 6e 73 61 63  either a transac
17620 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20  tion.** must be 
17630 73 74 61 72 74 65 64 20 6f 72 20 74 68 65 72 65  started or there
17640 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
17650 20 63 75 72 73 6f 72 29 20 62 65 66 6f 72 65 0a   cursor) before.
17660 2a 2a 20 65 78 65 63 75 74 69 6e 67 20 74 68 69  ** executing thi
17670 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  s instruction..*
17680 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61 64 43 6f  /.case OP_ReadCo
17690 6f 6b 69 65 3a 20 7b 20 20 20 20 20 20 20 20 20  okie: {         
176a0 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72        /* out2-pr
176b0 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e  erelease */.  in
176c0 74 20 69 4d 65 74 61 3b 0a 20 20 69 6e 74 20 69  t iMeta;.  int i
176d0 44 62 3b 0a 20 20 69 6e 74 20 69 43 6f 6f 6b 69  Db;.  int iCooki
176e0 65 3b 0a 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d  e;..  iDb = pOp-
176f0 3e 70 31 3b 0a 20 20 69 43 6f 6f 6b 69 65 20 3d  >p1;.  iCookie =
17700 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65   pOp->p3;.  asse
17710 72 74 28 20 70 4f 70 2d 3e 70 33 3c 53 51 4c 49  rt( pOp->p3<SQLI
17720 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20  TE_N_BTREE_META 
17730 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
17740 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
17750 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
17760 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
17770 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
17780 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26   (p->btreeMask &
17790 20 28 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c   (((yDbMask)1)<<
177a0 69 44 62 29 29 21 3d 30 20 29 3b 0a 0a 20 20 73  iDb))!=0 );..  s
177b0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
177c0 74 61 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  ta(db->aDb[iDb].
177d0 70 42 74 2c 20 69 43 6f 6f 6b 69 65 2c 20 28 75  pBt, iCookie, (u
177e0 33 32 20 2a 29 26 69 4d 65 74 61 29 3b 0a 20 20  32 *)&iMeta);.  
177f0 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 4d 65 74  pOut->u.i = iMet
17800 61 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  a;.  break;.}../
17810 2a 20 4f 70 63 6f 64 65 3a 20 53 65 74 43 6f 6f  * Opcode: SetCoo
17820 6b 69 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a  kie P1 P2 P3 * *
17830 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
17840 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69   content of regi
17850 73 74 65 72 20 50 33 20 28 69 6e 74 65 72 70 72  ster P3 (interpr
17860 65 74 65 64 20 61 73 20 61 6e 20 69 6e 74 65 67  eted as an integ
17870 65 72 29 0a 2a 2a 20 69 6e 74 6f 20 63 6f 6f 6b  er).** into cook
17880 69 65 20 6e 75 6d 62 65 72 20 50 32 20 6f 66 20  ie number P2 of 
17890 64 61 74 61 62 61 73 65 20 50 31 2e 20 20 50 32  database P1.  P2
178a0 3d 3d 31 20 69 73 20 74 68 65 20 73 63 68 65 6d  ==1 is the schem
178b0 61 20 76 65 72 73 69 6f 6e 2e 20 20 0a 2a 2a 20  a version.  .** 
178c0 50 32 3d 3d 32 20 69 73 20 74 68 65 20 64 61 74  P2==2 is the dat
178d0 61 62 61 73 65 20 66 6f 72 6d 61 74 2e 20 50 32  abase format. P2
178e0 3d 3d 33 20 69 73 20 74 68 65 20 72 65 63 6f 6d  ==3 is the recom
178f0 6d 65 6e 64 65 64 20 70 61 67 65 72 20 63 61 63  mended pager cac
17900 68 65 20 0a 2a 2a 20 73 69 7a 65 2c 20 61 6e 64  he .** size, and
17910 20 73 6f 20 66 6f 72 74 68 2e 20 20 50 31 3d 3d   so forth.  P1==
17920 30 20 69 73 20 74 68 65 20 6d 61 69 6e 20 64 61  0 is the main da
17930 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
17940 50 31 3d 3d 31 20 69 73 20 74 68 65 20 0a 2a 2a  P1==1 is the .**
17950 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
17960 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 65 6d  sed to store tem
17970 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 2a  porary tables..*
17980 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69  *.** A transacti
17990 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
179a0 65 64 20 62 65 66 6f 72 65 20 65 78 65 63 75 74  ed before execut
179b0 69 6e 67 20 74 68 69 73 20 6f 70 63 6f 64 65 2e  ing this opcode.
179c0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 74 43  .*/.case OP_SetC
179d0 6f 6f 6b 69 65 3a 20 7b 20 20 20 20 20 20 20 2f  ookie: {       /
179e0 2a 20 69 6e 33 20 2a 2f 0a 20 20 44 62 20 2a 70  * in3 */.  Db *p
179f0 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  Db;.  assert( pO
17a00 70 2d 3e 70 32 3c 53 51 4c 49 54 45 5f 4e 5f 42  p->p2<SQLITE_N_B
17a10 54 52 45 45 5f 4d 45 54 41 20 29 3b 0a 20 20 61  TREE_META );.  a
17a20 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
17a30 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d  0 && pOp->p1<db-
17a40 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
17a50 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  ( (p->btreeMask 
17a60 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31 29 3c  & (((yDbMask)1)<
17a70 3c 70 4f 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b  <pOp->p1))!=0 );
17a80 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
17a90 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  b[pOp->p1];.  as
17aa0 73 65 72 74 28 20 70 44 62 2d 3e 70 42 74 21 3d  sert( pDb->pBt!=
17ab0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
17ac0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
17ad0 78 48 65 6c 64 28 64 62 2c 20 70 4f 70 2d 3e 70  xHeld(db, pOp->p
17ae0 31 2c 20 30 29 20 29 3b 0a 20 20 70 49 6e 33 20  1, 0) );.  pIn3 
17af0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
17b00 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
17b10 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e  emIntegerify(pIn
17b20 33 29 3b 0a 20 20 2f 2a 20 53 65 65 20 6e 6f 74  3);.  /* See not
17b30 65 20 61 62 6f 75 74 20 69 6e 64 65 78 20 73 68  e about index sh
17b40 69 66 74 69 6e 67 20 6f 6e 20 4f 50 5f 52 65 61  ifting on OP_Rea
17b50 64 43 6f 6f 6b 69 65 20 2a 2f 0a 20 20 72 63 20  dCookie */.  rc 
17b60 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
17b70 64 61 74 65 4d 65 74 61 28 70 44 62 2d 3e 70 42  dateMeta(pDb->pB
17b80 74 2c 20 70 4f 70 2d 3e 70 32 2c 20 28 69 6e 74  t, pOp->p2, (int
17b90 29 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 69  )pIn3->u.i);.  i
17ba0 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 42 54 52 45  f( pOp->p2==BTRE
17bb0 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e  E_SCHEMA_VERSION
17bc0 20 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20   ){.    /* When 
17bd0 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
17be0 65 20 63 68 61 6e 67 65 73 2c 20 72 65 63 6f 72  e changes, recor
17bf0 64 20 74 68 65 20 6e 65 77 20 63 6f 6f 6b 69 65  d the new cookie
17c00 20 69 6e 74 65 72 6e 61 6c 6c 79 20 2a 2f 0a 20   internally */. 
17c10 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d     pDb->pSchema-
17c20 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d  >schema_cookie =
17c30 20 28 69 6e 74 29 70 49 6e 33 2d 3e 75 2e 69 3b   (int)pIn3->u.i;
17c40 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
17c50 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
17c60 68 61 6e 67 65 73 3b 0a 20 20 7d 65 6c 73 65 20  hanges;.  }else 
17c70 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 42 54 52  if( pOp->p2==BTR
17c80 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 20 29  EE_FILE_FORMAT )
17c90 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20  {.    /* Record 
17ca0 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 66  changes in the f
17cb0 69 6c 65 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ile format */.  
17cc0 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e    pDb->pSchema->
17cd0 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 28 75  file_format = (u
17ce0 38 29 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 7d  8)pIn3->u.i;.  }
17cf0 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d  .  if( pOp->p1==
17d00 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 76 61  1 ){.    /* Inva
17d10 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 70 61  lidate all prepa
17d20 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 77  red statements w
17d30 68 65 6e 65 76 65 72 20 74 68 65 20 54 45 4d 50  henever the TEMP
17d40 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
17d50 20 73 63 68 65 6d 61 20 69 73 20 63 68 61 6e 67   schema is chang
17d60 65 64 2e 20 20 54 69 63 6b 65 74 20 23 31 36 34  ed.  Ticket #164
17d70 34 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  4 */.    sqlite3
17d80 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
17d90 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
17da0 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
17db0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
17dc0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 65 72  ../* Opcode: Ver
17dd0 69 66 79 43 6f 6f 6b 69 65 20 50 31 20 50 32 20  ifyCookie P1 P2 
17de0 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 65  P3 * *.**.** Che
17df0 63 6b 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ck the value of 
17e00 67 6c 6f 62 61 6c 20 64 61 74 61 62 61 73 65 20  global database 
17e10 70 61 72 61 6d 65 74 65 72 20 6e 75 6d 62 65 72  parameter number
17e20 20 30 20 28 74 68 65 0a 2a 2a 20 73 63 68 65 6d   0 (the.** schem
17e30 61 20 76 65 72 73 69 6f 6e 29 20 61 6e 64 20 6d  a version) and m
17e40 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 65  ake sure it is e
17e50 71 75 61 6c 20 74 6f 20 50 32 20 61 6e 64 20 74  qual to P2 and t
17e60 68 61 74 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72  hat the.** gener
17e70 61 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 6f 6e  ation counter on
17e80 20 74 68 65 20 6c 6f 63 61 6c 20 73 63 68 65 6d   the local schem
17e90 61 20 70 61 72 73 65 20 65 71 75 61 6c 73 20 50  a parse equals P
17ea0 33 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74  3..**.** P1 is t
17eb0 68 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  he database numb
17ec0 65 72 20 77 68 69 63 68 20 69 73 20 30 20 66 6f  er which is 0 fo
17ed0 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
17ee0 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  ase file.** and 
17ef0 31 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 68  1 for the file h
17f00 6f 6c 64 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  olding temporary
17f10 20 74 61 62 6c 65 73 20 61 6e 64 20 73 6f 6d 65   tables and some
17f20 20 68 69 67 68 65 72 20 6e 75 6d 62 65 72 0a 2a   higher number.*
17f30 2a 20 66 6f 72 20 61 75 78 69 6c 69 61 72 79 20  * for auxiliary 
17f40 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a  databases..**.**
17f50 20 54 68 65 20 63 6f 6f 6b 69 65 20 63 68 61 6e   The cookie chan
17f60 67 65 73 20 69 74 73 20 76 61 6c 75 65 20 77 68  ges its value wh
17f70 65 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62  enever the datab
17f80 61 73 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ase schema chang
17f90 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72  es..** This oper
17fa0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
17fb0 20 64 65 74 65 63 74 20 77 68 65 6e 20 74 68 61   detect when tha
17fc0 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 68 61 73  t the cookie has
17fd0 20 63 68 61 6e 67 65 64 0a 2a 2a 20 61 6e 64 20   changed.** and 
17fe0 74 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  that the current
17ff0 20 70 72 6f 63 65 73 73 20 6e 65 65 64 73 20 74   process needs t
18000 6f 20 72 65 72 65 61 64 20 74 68 65 20 73 63 68  o reread the sch
18010 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  ema..**.** Eithe
18020 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
18030 6e 65 65 64 73 20 74 6f 20 68 61 76 65 20 62 65  needs to have be
18040 65 6e 20 73 74 61 72 74 65 64 20 6f 72 20 61 6e  en started or an
18050 20 4f 50 5f 4f 70 65 6e 20 6e 65 65 64 73 0a 2a   OP_Open needs.*
18060 2a 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64  * to be executed
18070 20 28 74 6f 20 65 73 74 61 62 6c 69 73 68 20 61   (to establish a
18080 20 72 65 61 64 20 6c 6f 63 6b 29 20 62 65 66 6f   read lock) befo
18090 72 65 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69  re this opcode i
180a0 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f  s.** invoked..*/
180b0 0a 63 61 73 65 20 4f 50 5f 56 65 72 69 66 79 43  .case OP_VerifyC
180c0 6f 6f 6b 69 65 3a 20 7b 0a 20 20 69 6e 74 20 69  ookie: {.  int i
180d0 4d 65 74 61 3b 0a 20 20 69 6e 74 20 69 47 65 6e  Meta;.  int iGen
180e0 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a  ;.  Btree *pBt;.
180f0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
18100 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
18110 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
18120 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d  sert( (p->btreeM
18130 61 73 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b  ask & (((yDbMask
18140 29 31 29 3c 3c 70 4f 70 2d 3e 70 31 29 29 21 3d  )1)<<pOp->p1))!=
18150 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
18160 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
18170 78 48 65 6c 64 28 64 62 2c 20 70 4f 70 2d 3e 70  xHeld(db, pOp->p
18180 31 2c 20 30 29 20 29 3b 0a 20 20 70 42 74 20 3d  1, 0) );.  pBt =
18190 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31   db->aDb[pOp->p1
181a0 5d 2e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74  ].pBt;.  if( pBt
181b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
181c0 74 72 65 65 47 65 74 4d 65 74 61 28 70 42 74 2c  treeGetMeta(pBt,
181d0 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45   BTREE_SCHEMA_VE
181e0 52 53 49 4f 4e 2c 20 28 75 33 32 20 2a 29 26 69  RSION, (u32 *)&i
181f0 4d 65 74 61 29 3b 0a 20 20 20 20 69 47 65 6e 20  Meta);.    iGen 
18200 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70  = db->aDb[pOp->p
18210 31 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e  1].pSchema->iGen
18220 65 72 61 74 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65  eration;.  }else
18230 7b 0a 20 20 20 20 69 47 65 6e 20 3d 20 69 4d 65  {.    iGen = iMe
18240 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ta = 0;.  }.  if
18250 28 20 69 4d 65 74 61 21 3d 70 4f 70 2d 3e 70 32  ( iMeta!=pOp->p2
18260 20 7c 7c 20 69 47 65 6e 21 3d 70 4f 70 2d 3e 70   || iGen!=pOp->p
18270 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  3 ){.    sqlite3
18280 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
18290 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
182a0 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
182b0 44 62 53 74 72 44 75 70 28 64 62 2c 20 22 64 61  DbStrDup(db, "da
182c0 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61  tabase schema ha
182d0 73 20 63 68 61 6e 67 65 64 22 29 3b 0a 20 20 20  s changed");.   
182e0 20 2f 2a 20 49 66 20 74 68 65 20 73 63 68 65 6d   /* If the schem
182f0 61 2d 63 6f 6f 6b 69 65 20 66 72 6f 6d 20 74 68  a-cookie from th
18300 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18310 6d 61 74 63 68 65 73 20 74 68 65 20 63 6f 6f 6b  matches the cook
18320 69 65 20 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  ie .    ** store
18330 64 20 77 69 74 68 20 74 68 65 20 69 6e 2d 6d 65  d with the in-me
18340 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
18350 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 68 65 6d  ion of the schem
18360 61 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74  a, do.    ** not
18370 20 72 65 6c 6f 61 64 20 74 68 65 20 73 63 68 65   reload the sche
18380 6d 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ma from the data
18390 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
183a0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 76 69 72 74  *.    ** If virt
183b0 75 61 6c 2d 74 61 62 6c 65 73 20 61 72 65 20 69  ual-tables are i
183c0 6e 20 75 73 65 2c 20 74 68 69 73 20 69 73 20 6e  n use, this is n
183d0 6f 74 20 6a 75 73 74 20 61 6e 20 6f 70 74 69 6d  ot just an optim
183e0 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20  ization..    ** 
183f0 4f 66 74 65 6e 2c 20 76 2d 74 61 62 6c 65 73 20  Often, v-tables 
18400 73 74 6f 72 65 20 74 68 65 69 72 20 64 61 74 61  store their data
18410 20 69 6e 20 6f 74 68 65 72 20 53 51 4c 69 74 65   in other SQLite
18420 20 74 61 62 6c 65 73 2c 20 77 68 69 63 68 0a 20   tables, which. 
18430 20 20 20 2a 2a 20 61 72 65 20 71 75 65 72 69 65     ** are querie
18440 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 78 4e  d from within xN
18450 65 78 74 28 29 20 61 6e 64 20 6f 74 68 65 72 20  ext() and other 
18460 76 2d 74 61 62 6c 65 20 6d 65 74 68 6f 64 73 20  v-table methods 
18470 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 70 72 65  using.    ** pre
18480 70 61 72 65 64 20 71 75 65 72 69 65 73 2e 20 49  pared queries. I
18490 66 20 73 75 63 68 20 61 20 71 75 65 72 79 20 69  f such a query i
184a0 73 20 6f 75 74 2d 6f 66 2d 64 61 74 65 2c 20 77  s out-of-date, w
184b0 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
184c0 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 20  .    ** discard 
184d0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
184e0 65 6d 61 2c 20 61 73 20 74 68 65 20 75 73 65 72  ema, as the user
184f0 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 69   code implementi
18500 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 2d  ng the.    ** v-
18510 74 61 62 6c 65 20 77 6f 75 6c 64 20 68 61 76 65  table would have
18520 20 74 6f 20 62 65 20 72 65 61 64 79 20 66 6f 72   to be ready for
18530 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61   the sqlite3_vta
18540 62 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  b structure itse
18550 6c 66 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  lf.    ** to be 
18560 69 6e 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e  invalidated when
18570 65 76 65 72 20 73 71 6c 69 74 65 33 5f 73 74 65  ever sqlite3_ste
18580 70 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 72  p() is called fr
18590 6f 6d 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a  om within .    *
185a0 2a 20 61 20 76 2d 74 61 62 6c 65 20 6d 65 74 68  * a v-table meth
185b0 6f 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  od..    */.    i
185c0 66 28 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e  f( db->aDb[pOp->
185d0 70 31 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68  p1].pSchema->sch
185e0 65 6d 61 5f 63 6f 6f 6b 69 65 21 3d 69 4d 65 74  ema_cookie!=iMet
185f0 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  a ){.      sqlit
18600 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
18610 63 68 65 6d 61 28 64 62 2c 20 70 4f 70 2d 3e 70  chema(db, pOp->p
18620 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  1);.    }..    p
18630 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
18640 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 53     rc = SQLITE_S
18650 43 48 45 4d 41 3b 0a 20 20 7d 0a 20 20 62 72 65  CHEMA;.  }.  bre
18660 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
18670 3a 20 4f 70 65 6e 52 65 61 64 20 50 31 20 50 32  : OpenRead P1 P2
18680 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20   P3 P4 P5.**.** 
18690 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Open a read-only
186a0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
186b0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 77  database table w
186c0 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 20 69  hose root page i
186d0 73 0a 2a 2a 20 50 32 20 69 6e 20 61 20 64 61 74  s.** P2 in a dat
186e0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
186f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
18700 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
18710 50 33 2e 20 0a 2a 2a 20 50 33 3d 3d 30 20 6d 65  P3. .** P3==0 me
18720 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ans the main dat
18730 61 62 61 73 65 2c 20 50 33 3d 3d 31 20 6d 65 61  abase, P3==1 mea
18740 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
18750 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20 74 65 6d  used for .** tem
18760 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2c 20 61  porary tables, a
18770 6e 64 20 50 33 3e 31 20 6d 65 61 6e 73 20 75 73  nd P3>1 means us
18780 65 64 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  ed the correspon
18790 64 69 6e 67 20 61 74 74 61 63 68 65 64 0a 2a 2a  ding attached.**
187a0 20 64 61 74 61 62 61 73 65 2e 20 20 47 69 76 65   database.  Give
187b0 20 74 68 65 20 6e 65 77 20 63 75 72 73 6f 72 20   the new cursor 
187c0 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f 66  an identifier of
187d0 20 50 31 2e 20 20 54 68 65 20 50 31 0a 2a 2a 20   P1.  The P1.** 
187e0 76 61 6c 75 65 73 20 6e 65 65 64 20 6e 6f 74 20  values need not 
187f0 62 65 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 75  be contiguous bu
18800 74 20 61 6c 6c 20 50 31 20 76 61 6c 75 65 73 20  t all P1 values 
18810 73 68 6f 75 6c 64 20 62 65 20 73 6d 61 6c 6c 20  should be small 
18820 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 20 49 74 20  integers..** It 
18830 69 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20  is an error for 
18840 50 31 20 74 6f 20 62 65 20 6e 65 67 61 74 69 76  P1 to be negativ
18850 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 21 3d  e..**.** If P5!=
18860 30 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 63  0 then use the c
18870 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74  ontent of regist
18880 65 72 20 50 32 20 61 73 20 74 68 65 20 72 6f 6f  er P2 as the roo
18890 74 20 70 61 67 65 2c 20 6e 6f 74 0a 2a 2a 20 74  t page, not.** t
188a0 68 65 20 76 61 6c 75 65 20 6f 66 20 50 32 20 69  he value of P2 i
188b0 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tself..**.** The
188c0 72 65 20 77 69 6c 6c 20 62 65 20 61 20 72 65 61  re will be a rea
188d0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
188e0 74 61 62 61 73 65 20 77 68 65 6e 65 76 65 72 20  tabase whenever 
188f0 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 6f  there is an.** o
18900 70 65 6e 20 63 75 72 73 6f 72 2e 20 20 49 66 20  pen cursor.  If 
18910 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
18920 20 75 6e 6c 6f 63 6b 65 64 20 70 72 69 6f 72 20   unlocked prior 
18930 74 6f 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  to this instruct
18940 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20 61 20 72 65  ion.** then a re
18950 61 64 20 6c 6f 63 6b 20 69 73 20 61 63 71 75 69  ad lock is acqui
18960 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
18970 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  his instruction.
18980 20 20 41 20 72 65 61 64 0a 2a 2a 20 6c 6f 63 6b    A read.** lock
18990 20 61 6c 6c 6f 77 73 20 6f 74 68 65 72 20 70 72   allows other pr
189a0 6f 63 65 73 73 65 73 20 74 6f 20 72 65 61 64 20  ocesses to read 
189b0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74  the database but
189c0 20 70 72 6f 68 69 62 69 74 73 0a 2a 2a 20 61 6e   prohibits.** an
189d0 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  y other process 
189e0 66 72 6f 6d 20 6d 6f 64 69 66 79 69 6e 67 20 74  from modifying t
189f0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
18a00 65 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 0a 2a  e read lock is.*
18a10 2a 20 72 65 6c 65 61 73 65 64 20 77 68 65 6e 20  * released when 
18a20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20  all cursors are 
18a30 63 6c 6f 73 65 64 2e 20 20 49 66 20 74 68 69 73  closed.  If this
18a40 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 74   instruction att
18a50 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 67 65 74 20  empts.** to get 
18a60 61 20 72 65 61 64 20 6c 6f 63 6b 20 62 75 74 20  a read lock but 
18a70 66 61 69 6c 73 2c 20 74 68 65 20 73 63 72 69 70  fails, the scrip
18a80 74 20 74 65 72 6d 69 6e 61 74 65 73 20 77 69 74  t terminates wit
18a90 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  h an.** SQLITE_B
18aa0 55 53 59 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  USY error code..
18ab0 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 76 61 6c  **.** The P4 val
18ac0 75 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  ue may be either
18ad0 20 61 6e 20 69 6e 74 65 67 65 72 20 28 50 34 5f   an integer (P4_
18ae0 49 4e 54 33 32 29 20 6f 72 20 61 20 70 6f 69 6e  INT32) or a poin
18af0 74 65 72 20 74 6f 0a 2a 2a 20 61 20 4b 65 79 49  ter to.** a KeyI
18b00 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 28 50  nfo structure (P
18b10 34 5f 4b 45 59 49 4e 46 4f 29 2e 20 49 66 20 69  4_KEYINFO). If i
18b20 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
18b30 6f 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20  o a KeyInfo .** 
18b40 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 20  structure, then 
18b50 73 61 69 64 20 73 74 72 75 63 74 75 72 65 20 64  said structure d
18b60 65 66 69 6e 65 73 20 74 68 65 20 63 6f 6e 74 65  efines the conte
18b70 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  nt and collating
18b80 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66   .** sequence of
18b90 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
18ba0 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65 72 77 69   opened. Otherwi
18bb0 73 65 2c 20 69 66 20 50 34 20 69 73 20 61 6e 20  se, if P4 is an 
18bc0 69 6e 74 65 67 65 72 20 0a 2a 2a 20 76 61 6c 75  integer .** valu
18bd0 65 2c 20 69 74 20 69 73 20 73 65 74 20 74 6f 20  e, it is set to 
18be0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
18bf0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
18c00 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  le..**.** See al
18c10 73 6f 20 4f 70 65 6e 57 72 69 74 65 2e 0a 2a 2f  so OpenWrite..*/
18c20 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e  ./* Opcode: Open
18c30 57 72 69 74 65 20 50 31 20 50 32 20 50 33 20 50  Write P1 P2 P3 P
18c40 34 20 50 35 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  4 P5.**.** Open 
18c50 61 20 72 65 61 64 2f 77 72 69 74 65 20 63 75 72  a read/write cur
18c60 73 6f 72 20 6e 61 6d 65 64 20 50 31 20 6f 6e 20  sor named P1 on 
18c70 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
18c80 65 78 20 77 68 6f 73 65 20 72 6f 6f 74 0a 2a 2a  ex whose root.**
18c90 20 70 61 67 65 20 69 73 20 50 32 2e 20 20 4f 72   page is P2.  Or
18ca0 20 69 66 20 50 35 21 3d 30 20 75 73 65 20 74 68   if P5!=0 use th
18cb0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67  e content of reg
18cc0 69 73 74 65 72 20 50 32 20 74 6f 20 66 69 6e 64  ister P2 to find
18cd0 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
18ce0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20  e..**.** The P4 
18cf0 76 61 6c 75 65 20 6d 61 79 20 62 65 20 65 69 74  value may be eit
18d00 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20 28  her an integer (
18d10 50 34 5f 49 4e 54 33 32 29 20 6f 72 20 61 20 70  P4_INT32) or a p
18d20 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20 4b  ointer to.** a K
18d30 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
18d40 20 28 50 34 5f 4b 45 59 49 4e 46 4f 29 2e 20 49   (P4_KEYINFO). I
18d50 66 20 69 74 20 69 73 20 61 20 70 6f 69 6e 74 65  f it is a pointe
18d60 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 0a  r to a KeyInfo .
18d70 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  ** structure, th
18d80 65 6e 20 73 61 69 64 20 73 74 72 75 63 74 75 72  en said structur
18d90 65 20 64 65 66 69 6e 65 73 20 74 68 65 20 63 6f  e defines the co
18da0 6e 74 65 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74  ntent and collat
18db0 69 6e 67 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ing .** sequence
18dc0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 62 65   of the index be
18dd0 69 6e 67 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65  ing opened. Othe
18de0 72 77 69 73 65 2c 20 69 66 20 50 34 20 69 73 20  rwise, if P4 is 
18df0 61 6e 20 69 6e 74 65 67 65 72 20 0a 2a 2a 20 76  an integer .** v
18e00 61 6c 75 65 2c 20 69 74 20 69 73 20 73 65 74 20  alue, it is set 
18e10 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
18e20 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
18e30 74 61 62 6c 65 2c 20 6f 72 20 74 6f 20 74 68 65  table, or to the
18e40 0a 2a 2a 20 6c 61 72 67 65 73 74 20 69 6e 64 65  .** largest inde
18e50 78 20 6f 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  x of any column 
18e60 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
18e70 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 75 73  t is actually us
18e80 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ed..**.** This i
18e90 6e 73 74 72 75 63 74 69 6f 6e 20 77 6f 72 6b 73  nstruction works
18ea0 20 6a 75 73 74 20 6c 69 6b 65 20 4f 70 65 6e 52   just like OpenR
18eb0 65 61 64 20 65 78 63 65 70 74 20 74 68 61 74 20  ead except that 
18ec0 69 74 20 6f 70 65 6e 73 20 74 68 65 20 63 75 72  it opens the cur
18ed0 73 6f 72 0a 2a 2a 20 69 6e 20 72 65 61 64 2f 77  sor.** in read/w
18ee0 72 69 74 65 20 6d 6f 64 65 2e 20 20 46 6f 72 20  rite mode.  For 
18ef0 61 20 67 69 76 65 6e 20 74 61 62 6c 65 2c 20 74  a given table, t
18f00 68 65 72 65 20 63 61 6e 20 62 65 20 6f 6e 65 20  here can be one 
18f10 6f 72 20 6d 6f 72 65 20 72 65 61 64 2d 6f 6e 6c  or more read-onl
18f20 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 72 20  y.** cursors or 
18f30 61 20 73 69 6e 67 6c 65 20 72 65 61 64 2f 77 72  a single read/wr
18f40 69 74 65 20 63 75 72 73 6f 72 20 62 75 74 20 6e  ite cursor but n
18f50 6f 74 20 62 6f 74 68 2e 0a 2a 2a 0a 2a 2a 20 53  ot both..**.** S
18f60 65 65 20 61 6c 73 6f 20 4f 70 65 6e 52 65 61 64  ee also OpenRead
18f70 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65  ..*/.case OP_Ope
18f80 6e 52 65 61 64 3a 0a 63 61 73 65 20 4f 50 5f 4f  nRead:.case OP_O
18f90 70 65 6e 57 72 69 74 65 3a 20 7b 0a 20 20 69 6e  penWrite: {.  in
18fa0 74 20 6e 46 69 65 6c 64 3b 0a 20 20 4b 65 79 49  t nField;.  KeyI
18fb0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
18fc0 20 69 6e 74 20 70 32 3b 0a 20 20 69 6e 74 20 69   int p2;.  int i
18fd0 44 62 3b 0a 20 20 69 6e 74 20 77 72 46 6c 61 67  Db;.  int wrFlag
18fe0 3b 0a 20 20 42 74 72 65 65 20 2a 70 58 3b 0a 20  ;.  Btree *pX;. 
18ff0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75   VdbeCursor *pCu
19000 72 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  r;.  Db *pDb;.. 
19010 20 69 66 28 20 70 2d 3e 65 78 70 69 72 65 64 20   if( p->expired 
19020 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
19030 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20 62 72  TE_ABORT;.    br
19040 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 6e 46 69 65  eak;.  }..  nFie
19050 6c 64 20 3d 20 30 3b 0a 20 20 70 4b 65 79 49 6e  ld = 0;.  pKeyIn
19060 66 6f 20 3d 20 30 3b 0a 20 20 70 32 20 3d 20 70  fo = 0;.  p2 = p
19070 4f 70 2d 3e 70 32 3b 0a 20 20 69 44 62 20 3d 20  Op->p2;.  iDb = 
19080 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72  pOp->p3;.  asser
19090 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
190a0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
190b0 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d  sert( (p->btreeM
190c0 61 73 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b  ask & (((yDbMask
190d0 29 31 29 3c 3c 69 44 62 29 29 21 3d 30 20 29 3b  )1)<<iDb))!=0 );
190e0 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
190f0 62 5b 69 44 62 5d 3b 0a 20 20 70 58 20 3d 20 70  b[iDb];.  pX = p
19100 44 62 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  Db->pBt;.  asser
19110 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 69 66  t( pX!=0 );.  if
19120 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
19130 50 5f 4f 70 65 6e 57 72 69 74 65 20 29 7b 0a 20  P_OpenWrite ){. 
19140 20 20 20 77 72 46 6c 61 67 20 3d 20 31 3b 0a 20     wrFlag = 1;. 
19150 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
19160 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
19170 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
19180 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53  .    if( pDb->pS
19190 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
191a0 61 74 20 3c 20 70 2d 3e 6d 69 6e 57 72 69 74 65  at < p->minWrite
191b0 46 69 6c 65 46 6f 72 6d 61 74 20 29 7b 0a 20 20  FileFormat ){.  
191c0 20 20 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46      p->minWriteF
191d0 69 6c 65 46 6f 72 6d 61 74 20 3d 20 70 44 62 2d  ileFormat = pDb-
191e0 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66  >pSchema->file_f
191f0 6f 72 6d 61 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  ormat;.    }.  }
19200 65 6c 73 65 7b 0a 20 20 20 20 77 72 46 6c 61 67  else{.    wrFlag
19210 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
19220 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 61  pOp->p5 ){.    a
19230 73 73 65 72 74 28 20 70 32 3e 30 20 29 3b 0a 20  ssert( p2>0 );. 
19240 20 20 20 61 73 73 65 72 74 28 20 70 32 3c 3d 70     assert( p2<=p
19250 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 70 49  ->nMem );.    pI
19260 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a  n2 = &aMem[p2];.
19270 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
19280 73 56 61 6c 69 64 28 70 49 6e 32 29 20 29 3b 0a  sValid(pIn2) );.
19290 20 20 20 20 61 73 73 65 72 74 28 20 28 70 49 6e      assert( (pIn
192a0 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  2->flags & MEM_I
192b0 6e 74 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 71  nt)!=0 );.    sq
192c0 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65  lite3VdbeMemInte
192d0 67 65 72 69 66 79 28 70 49 6e 32 29 3b 0a 20 20  gerify(pIn2);.  
192e0 20 20 70 32 20 3d 20 28 69 6e 74 29 70 49 6e 32    p2 = (int)pIn2
192f0 2d 3e 75 2e 69 3b 0a 20 20 20 20 2f 2a 20 54 68  ->u.i;.    /* Th
19300 65 20 70 32 20 76 61 6c 75 65 20 61 6c 77 61 79  e p2 value alway
19310 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61 20 70  s comes from a p
19320 72 69 6f 72 20 4f 50 5f 43 72 65 61 74 65 54 61  rior OP_CreateTa
19330 62 6c 65 20 6f 70 63 6f 64 65 20 61 6e 64 0a 20  ble opcode and. 
19340 20 20 20 2a 2a 20 74 68 61 74 20 6f 70 63 6f 64     ** that opcod
19350 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 73 65  e will always se
19360 74 20 74 68 65 20 70 32 20 76 61 6c 75 65 20 74  t the p2 value t
19370 6f 20 32 20 6f 72 20 6d 6f 72 65 20 6f 72 20 65  o 2 or more or e
19380 6c 73 65 20 66 61 69 6c 2e 0a 20 20 20 20 2a 2a  lse fail..    **
19390 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 61   If there were a
193a0 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 70 72   failure, the pr
193b0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
193c0 20 77 6f 75 6c 64 20 68 61 76 65 20 68 61 6c 74   would have halt
193d0 65 64 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  ed.    ** before
193e0 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 69   reaching this i
193f0 6e 73 74 72 75 63 74 69 6f 6e 2e 20 2a 2f 0a 20  nstruction. */. 
19400 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 32 3c     if( NEVER(p2<
19410 32 29 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20  2) ) {.      rc 
19420 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
19430 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
19440 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
19450 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
19460 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
19470 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b  e==P4_KEYINFO ){
19480 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
19490 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
194a0 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e  ;.    pKeyInfo->
194b0 65 6e 63 20 3d 20 45 4e 43 28 70 2d 3e 64 62 29  enc = ENC(p->db)
194c0 3b 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 70  ;.    nField = p
194d0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
194e0 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
194f0 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49  Op->p4type==P4_I
19500 4e 54 33 32 20 29 7b 0a 20 20 20 20 6e 46 69 65  NT32 ){.    nFie
19510 6c 64 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  ld = pOp->p4.i;.
19520 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4f    }.  assert( pO
19530 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 70 43  p->p1>=0 );.  pC
19540 75 72 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72  ur = allocateCur
19550 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20  sor(p, pOp->p1, 
19560 6e 46 69 65 6c 64 2c 20 69 44 62 2c 20 31 29 3b  nField, iDb, 1);
19570 0a 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29  .  if( pCur==0 )
19580 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
19590 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20  pCur->nullRow = 
195a0 31 3b 0a 20 20 70 43 75 72 2d 3e 69 73 4f 72 64  1;.  pCur->isOrd
195b0 65 72 65 64 20 3d 20 31 3b 0a 20 20 72 63 20 3d  ered = 1;.  rc =
195c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
195d0 73 6f 72 28 70 58 2c 20 70 32 2c 20 77 72 46 6c  sor(pX, p2, wrFl
195e0 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
195f0 75 72 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20  ur->pCursor);.  
19600 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
19610 20 70 4b 65 79 49 6e 66 6f 3b 0a 0a 20 20 2f 2a   pKeyInfo;..  /*
19620 20 53 69 6e 63 65 20 69 74 20 70 65 72 66 6f 72   Since it perfor
19630 6d 73 20 6e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  ms no memory all
19640 6f 63 61 74 69 6f 6e 20 6f 72 20 49 4f 2c 20 74  ocation or IO, t
19650 68 65 20 6f 6e 6c 79 20 76 61 6c 75 65 20 74 68  he only value th
19660 61 74 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 42  at.  ** sqlite3B
19670 74 72 65 65 43 75 72 73 6f 72 28 29 20 6d 61 79  treeCursor() may
19680 20 72 65 74 75 72 6e 20 69 73 20 53 51 4c 49 54   return is SQLIT
19690 45 5f 4f 4b 2e 20 2a 2f 0a 20 20 61 73 73 65 72  E_OK. */.  asser
196a0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
196b0 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
196c0 65 20 56 64 62 65 43 75 72 73 6f 72 2e 69 73 54  e VdbeCursor.isT
196d0 61 62 6c 65 20 61 6e 64 20 69 73 49 6e 64 65 78  able and isIndex
196e0 20 76 61 72 69 61 62 6c 65 73 2e 20 50 72 65 76   variables. Prev
196f0 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66  ious versions of
19700 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 75 73 65  .  ** SQLite use
19710 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
19720 65 20 72 6f 6f 74 2d 70 61 67 65 20 66 6c 61 67  e root-page flag
19730 73 20 77 65 72 65 20 73 61 6e 65 20 61 74 20 74  s were sane at t
19740 68 69 73 20 70 6f 69 6e 74 0a 20 20 2a 2a 20 61  his point.  ** a
19750 6e 64 20 72 65 70 6f 72 74 20 64 61 74 61 62 61  nd report databa
19760 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66  se corruption if
19770 20 74 68 65 79 20 77 65 72 65 20 6e 6f 74 2c 20   they were not, 
19780 62 75 74 20 74 68 69 73 20 63 68 65 63 6b 20 68  but this check h
19790 61 73 0a 20 20 2a 2a 20 73 69 6e 63 65 20 6d 6f  as.  ** since mo
197a0 76 65 64 20 69 6e 74 6f 20 74 68 65 20 62 74 72  ved into the btr
197b0 65 65 20 6c 61 79 65 72 2e 20 20 2a 2f 20 20 0a  ee layer.  */  .
197c0 20 20 70 43 75 72 2d 3e 69 73 54 61 62 6c 65 20    pCur->isTable 
197d0 3d 20 70 4f 70 2d 3e 70 34 74 79 70 65 21 3d 50  = pOp->p4type!=P
197e0 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 70 43 75  4_KEYINFO;.  pCu
197f0 72 2d 3e 69 73 49 6e 64 65 78 20 3d 20 21 70 43  r->isIndex = !pC
19800 75 72 2d 3e 69 73 54 61 62 6c 65 3b 0a 20 20 62  ur->isTable;.  b
19810 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
19820 64 65 3a 20 4f 70 65 6e 45 70 68 65 6d 65 72 61  de: OpenEphemera
19830 6c 20 50 31 20 50 32 20 2a 20 50 34 20 50 35 0a  l P1 P2 * P4 P5.
19840 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  **.** Open a new
19850 20 63 75 72 73 6f 72 20 50 31 20 74 6f 20 61 20   cursor P1 to a 
19860 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 2e  transient table.
19870 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69  .** The cursor i
19880 73 20 61 6c 77 61 79 73 20 6f 70 65 6e 65 64 20  s always opened 
19890 72 65 61 64 2f 77 72 69 74 65 20 65 76 65 6e 20  read/write even 
198a0 69 66 20 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20  if .** the main 
198b0 64 61 74 61 62 61 73 65 20 69 73 20 72 65 61 64  database is read
198c0 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 65 70 68 65  -only.  The ephe
198d0 6d 65 72 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 69  meral.** table i
198e0 73 20 64 65 6c 65 74 65 64 20 61 75 74 6f 6d 61  s deleted automa
198f0 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
19900 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65   cursor is close
19910 64 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73 20 74  d..**.** P2 is t
19920 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
19930 75 6d 6e 73 20 69 6e 20 74 68 65 20 65 70 68 65  umns in the ephe
19940 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20  meral table..** 
19950 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  The cursor point
19960 73 20 74 6f 20 61 20 42 54 72 65 65 20 74 61 62  s to a BTree tab
19970 6c 65 20 69 66 20 50 34 3d 3d 30 20 61 6e 64 20  le if P4==0 and 
19980 74 6f 20 61 20 42 54 72 65 65 20 69 6e 64 65 78  to a BTree index
19990 0a 2a 2a 20 69 66 20 50 34 20 69 73 20 6e 6f 74  .** if P4 is not
199a0 20 30 2e 20 20 49 66 20 50 34 20 69 73 20 6e 6f   0.  If P4 is no
199b0 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74  t NULL, it point
199c0 73 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73  s to a KeyInfo s
199d0 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74  tructure.** that
199e0 20 64 65 66 69 6e 65 73 20 74 68 65 20 66 6f 72   defines the for
199f0 6d 61 74 20 6f 66 20 6b 65 79 73 20 69 6e 20 74  mat of keys in t
19a00 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  he index..**.** 
19a10 54 68 69 73 20 6f 70 63 6f 64 65 20 77 61 73 20  This opcode was 
19a20 6f 6e 63 65 20 63 61 6c 6c 65 64 20 4f 70 65 6e  once called Open
19a30 54 65 6d 70 2e 20 20 42 75 74 20 74 68 61 74 20  Temp.  But that 
19a40 63 72 65 61 74 65 64 0a 2a 2a 20 63 6f 6e 66 75  created.** confu
19a50 73 69 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65  sion because the
19a60 20 74 65 72 6d 20 22 74 65 6d 70 20 74 61 62 6c   term "temp tabl
19a70 65 22 2c 20 6d 69 67 68 74 20 72 65 66 65 72 20  e", might refer 
19a80 65 69 74 68 65 72 0a 2a 2a 20 74 6f 20 61 20 54  either.** to a T
19a90 45 4d 50 20 74 61 62 6c 65 20 61 74 20 74 68 65  EMP table at the
19aa0 20 53 51 4c 20 6c 65 76 65 6c 2c 20 6f 72 20 74   SQL level, or t
19ab0 6f 20 61 20 74 61 62 6c 65 20 6f 70 65 6e 65 64  o a table opened
19ac0 20 62 79 0a 2a 2a 20 74 68 69 73 20 6f 70 63 6f   by.** this opco
19ad0 64 65 2e 20 20 54 68 65 6e 20 74 68 69 73 20 6f  de.  Then this o
19ae0 70 63 6f 64 65 20 77 61 73 20 63 61 6c 6c 20 4f  pcode was call O
19af0 70 65 6e 56 69 72 74 75 61 6c 2e 20 20 42 75 74  penVirtual.  But
19b00 0a 2a 2a 20 74 68 61 74 20 63 72 65 61 74 65 64  .** that created
19b10 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20   confusion with 
19b20 74 68 65 20 77 68 6f 6c 65 20 76 69 72 74 75 61  the whole virtua
19b30 6c 2d 74 61 62 6c 65 20 69 64 65 61 2e 0a 2a 2a  l-table idea..**
19b40 0a 2a 2a 20 54 68 65 20 50 35 20 70 61 72 61 6d  .** The P5 param
19b50 65 74 65 72 20 63 61 6e 20 62 65 20 61 20 6d 61  eter can be a ma
19b60 73 6b 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f  sk of the BTREE_
19b70 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 0a  * flags defined.
19b80 2a 2a 20 69 6e 20 62 74 72 65 65 2e 68 2e 20 20  ** in btree.h.  
19b90 54 68 65 73 65 20 66 6c 61 67 73 20 63 6f 6e 74  These flags cont
19ba0 72 6f 6c 20 61 73 70 65 63 74 73 20 6f 66 20 74  rol aspects of t
19bb0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 0a  he operation of.
19bc0 2a 2a 20 74 68 65 20 62 74 72 65 65 2e 20 20 54  ** the btree.  T
19bd0 68 65 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f  he BTREE_OMIT_JO
19be0 55 52 4e 41 4c 20 61 6e 64 20 42 54 52 45 45 5f  URNAL and BTREE_
19bf0 53 49 4e 47 4c 45 20 66 6c 61 67 73 20 61 72 65  SINGLE flags are
19c00 0a 2a 2a 20 61 64 64 65 64 20 61 75 74 6f 6d 61  .** added automa
19c10 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 2f 2a 20 4f  tically..*/./* O
19c20 70 63 6f 64 65 3a 20 4f 70 65 6e 41 75 74 6f 69  pcode: OpenAutoi
19c30 6e 64 65 78 20 50 31 20 50 32 20 2a 20 50 34 20  ndex P1 P2 * P4 
19c40 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  *.**.** This opc
19c50 6f 64 65 20 77 6f 72 6b 73 20 74 68 65 20 73 61  ode works the sa
19c60 6d 65 20 61 73 20 4f 50 5f 4f 70 65 6e 45 70 68  me as OP_OpenEph
19c70 65 6d 65 72 61 6c 2e 20 20 49 74 20 68 61 73 20  emeral.  It has 
19c80 61 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 6e  a.** different n
19c90 61 6d 65 20 74 6f 20 64 69 73 74 69 6e 67 75 69  ame to distingui
19ca0 73 68 20 69 74 73 20 75 73 65 2e 20 20 54 61 62  sh its use.  Tab
19cb0 6c 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e  les created usin
19cc0 67 0a 2a 2a 20 62 79 20 74 68 69 73 20 6f 70 63  g.** by this opc
19cd0 6f 64 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ode will be used
19ce0 20 66 6f 72 20 61 75 74 6f 6d 61 74 69 63 61 6c   for automatical
19cf0 6c 79 20 63 72 65 61 74 65 64 20 74 72 61 6e 73  ly created trans
19d00 69 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 65 73 20  ient.** indices 
19d10 69 6e 20 6a 6f 69 6e 73 2e 0a 2a 2f 0a 63 61 73  in joins..*/.cas
19d20 65 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64  e OP_OpenAutoind
19d30 65 78 3a 20 0a 63 61 73 65 20 4f 50 5f 4f 70 65  ex: .case OP_Ope
19d40 6e 45 70 68 65 6d 65 72 61 6c 3a 20 7b 0a 20 20  nEphemeral: {.  
19d50 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b  VdbeCursor *pCx;
19d60 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
19d70 69 6e 74 20 76 66 73 46 6c 61 67 73 20 3d 20 0a  int vfsFlags = .
19d80 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
19d90 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20  N_READWRITE |.  
19da0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
19db0 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 53  CREATE |.      S
19dc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
19dd0 53 49 56 45 20 7c 0a 20 20 20 20 20 20 53 51 4c  SIVE |.      SQL
19de0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
19df0 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 53  NCLOSE |.      S
19e00 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
19e10 49 45 4e 54 5f 44 42 3b 0a 0a 20 20 61 73 73 65  IENT_DB;..  asse
19e20 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29  rt( pOp->p1>=0 )
19e30 3b 0a 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61  ;.  pCx = alloca
19e40 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d  teCursor(p, pOp-
19e50 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d 31  >p1, pOp->p2, -1
19e60 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 78 3d  , 1);.  if( pCx=
19e70 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
19e80 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c 52 6f 77  ;.  pCx->nullRow
19e90 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 1;.  rc = sql
19ea0 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62  ite3BtreeOpen(db
19eb0 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20 26  ->pVfs, 0, db, &
19ec0 70 43 78 2d 3e 70 42 74 2c 20 0a 20 20 20 20 20  pCx->pBt, .     
19ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ee0 20 20 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f     BTREE_OMIT_JO
19ef0 55 52 4e 41 4c 20 7c 20 42 54 52 45 45 5f 53 49  URNAL | BTREE_SI
19f00 4e 47 4c 45 20 7c 20 70 4f 70 2d 3e 70 35 2c 20  NGLE | pOp->p5, 
19f10 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 69 66 28  vfsFlags);.  if(
19f20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19f30 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
19f40 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
19f50 73 28 70 43 78 2d 3e 70 42 74 2c 20 31 29 3b 0a  s(pCx->pBt, 1);.
19f60 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
19f70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
19f80 2a 20 49 66 20 61 20 74 72 61 6e 73 69 65 6e 74  * If a transient
19f90 20 69 6e 64 65 78 20 69 73 20 72 65 71 75 69 72   index is requir
19fa0 65 64 2c 20 63 72 65 61 74 65 20 69 74 20 62 79  ed, create it by
19fb0 20 63 61 6c 6c 69 6e 67 0a 20 20 20 20 2a 2a 20   calling.    ** 
19fc0 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
19fd0 74 65 54 61 62 6c 65 28 29 20 77 69 74 68 20 74  teTable() with t
19fe0 68 65 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59  he BTREE_BLOBKEY
19ff0 20 66 6c 61 67 20 62 65 66 6f 72 65 0a 20 20 20   flag before.   
1a000 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 69 74 2e 20   ** opening it. 
1a010 49 66 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  If a transient t
1a020 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
1a030 2c 20 6a 75 73 74 20 75 73 65 20 74 68 65 0a 20  , just use the. 
1a040 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61     ** automatica
1a050 6c 6c 79 20 63 72 65 61 74 65 64 20 74 61 62 6c  lly created tabl
1a060 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
1a070 20 31 20 28 61 6e 20 42 4c 4f 42 5f 49 4e 54 4b   1 (an BLOB_INTK
1a080 45 59 20 74 61 62 6c 65 29 2e 0a 20 20 20 20 2a  EY table)..    *
1a090 2f 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  /.    if( pOp->p
1a0a0 34 2e 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  4.pKeyInfo ){.  
1a0b0 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20      int pgno;.  
1a0c0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
1a0d0 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49  >p4type==P4_KEYI
1a0e0 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20 72 63 20  NFO );.      rc 
1a0f0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72  = sqlite3BtreeCr
1a100 65 61 74 65 54 61 62 6c 65 28 70 43 78 2d 3e 70  eateTable(pCx->p
1a110 42 74 2c 20 26 70 67 6e 6f 2c 20 42 54 52 45 45  Bt, &pgno, BTREE
1a120 5f 42 4c 4f 42 4b 45 59 20 7c 20 70 4f 70 2d 3e  _BLOBKEY | pOp->
1a130 70 35 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20  p5); .      if( 
1a140 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a150 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1a160 20 70 67 6e 6f 3d 3d 4d 41 53 54 45 52 5f 52 4f   pgno==MASTER_RO
1a170 4f 54 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  OT+1 );.        
1a180 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1a190 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 42 74  eCursor(pCx->pBt
1a1a0 2c 20 70 67 6e 6f 2c 20 31 2c 20 0a 20 20 20 20  , pgno, 1, .    
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 28 4b 65 79              (Key
1a1d0 49 6e 66 6f 2a 29 70 4f 70 2d 3e 70 34 2e 7a 2c  Info*)pOp->p4.z,
1a1e0 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a   pCx->pCursor);.
1a1f0 20 20 20 20 20 20 20 20 70 43 78 2d 3e 70 4b 65          pCx->pKe
1a200 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e  yInfo = pOp->p4.
1a210 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pKeyInfo;.      
1a220 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d    pCx->pKeyInfo-
1a230 3e 65 6e 63 20 3d 20 45 4e 43 28 70 2d 3e 64 62  >enc = ENC(p->db
1a240 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1a250 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20   pCx->isTable = 
1a260 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1a270 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a280 42 74 72 65 65 43 75 72 73 6f 72 28 70 43 78 2d  BtreeCursor(pCx-
1a290 3e 70 42 74 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  >pBt, MASTER_ROO
1a2a0 54 2c 20 31 2c 20 30 2c 20 70 43 78 2d 3e 70 43  T, 1, 0, pCx->pC
1a2b0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 43  ursor);.      pC
1a2c0 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20 31 3b 0a  x->isTable = 1;.
1a2d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 78 2d      }.  }.  pCx-
1a2e0 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 70 4f  >isOrdered = (pO
1a2f0 70 2d 3e 70 35 21 3d 42 54 52 45 45 5f 55 4e 4f  p->p5!=BTREE_UNO
1a300 52 44 45 52 45 44 29 3b 0a 20 20 70 43 78 2d 3e  RDERED);.  pCx->
1a310 69 73 49 6e 64 65 78 20 3d 20 21 70 43 78 2d 3e  isIndex = !pCx->
1a320 69 73 54 61 62 6c 65 3b 0a 20 20 62 72 65 61 6b  isTable;.  break
1a330 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1a340 4f 70 65 6e 53 6f 72 74 65 72 20 50 31 20 50 32  OpenSorter P1 P2
1a350 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68   * P4 *.**.** Th
1a360 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20  is opcode works 
1a370 6c 69 6b 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65  like OP_OpenEphe
1a380 6d 65 72 61 6c 20 65 78 63 65 70 74 20 74 68 61  meral except tha
1a390 74 20 69 74 20 6f 70 65 6e 73 0a 2a 2a 20 61 20  t it opens.** a 
1a3a0 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
1a3b0 74 68 61 74 20 69 73 20 73 70 65 63 69 66 69 63  that is specific
1a3c0 61 6c 6c 79 20 64 65 73 69 67 6e 65 64 20 74 6f  ally designed to
1a3d0 20 73 6f 72 74 20 6c 61 72 67 65 0a 2a 2a 20 74   sort large.** t
1a3e0 61 62 6c 65 73 20 75 73 69 6e 67 20 61 6e 20 65  ables using an e
1a3f0 78 74 65 72 6e 61 6c 20 6d 65 72 67 65 2d 73 6f  xternal merge-so
1a400 72 74 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2f  rt algorithm..*/
1a410 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4f  .case OP_SorterO
1a420 70 65 6e 3a 20 7b 0a 20 20 56 64 62 65 43 75 72  pen: {.  VdbeCur
1a430 73 6f 72 20 2a 70 43 78 3b 0a 23 69 66 6e 64 65  sor *pCx;.#ifnde
1a440 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
1a450 52 47 45 5f 53 4f 52 54 0a 20 20 70 43 78 20 3d  RGE_SORT.  pCx =
1a460 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
1a470 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  p, pOp->p1, pOp-
1a480 3e 70 32 2c 20 2d 31 2c 20 31 29 3b 0a 20 20 69  >p2, -1, 1);.  i
1a490 66 28 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f  f( pCx==0 ) goto
1a4a0 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e   no_mem;.  pCx->
1a4b0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
1a4c0 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70  p4.pKeyInfo;.  p
1a4d0 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  Cx->pKeyInfo->en
1a4e0 63 20 3d 20 45 4e 43 28 70 2d 3e 64 62 29 3b 0a  c = ENC(p->db);.
1a4f0 20 20 70 43 78 2d 3e 69 73 53 6f 72 74 65 72 20    pCx->isSorter 
1a500 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 1;.  rc = sqli
1a510 74 65 33 56 64 62 65 53 6f 72 74 65 72 49 6e 69  te3VdbeSorterIni
1a520 74 28 64 62 2c 20 70 43 78 29 3b 0a 23 65 6c 73  t(db, pCx);.#els
1a530 65 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  e.  pOp->opcode 
1a540 3d 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  = OP_OpenEphemer
1a550 61 6c 3b 0a 20 20 70 63 2d 2d 3b 0a 23 65 6e 64  al;.  pc--;.#end
1a560 69 66 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  if.  break;.}../
1a570 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 50 73  * Opcode: OpenPs
1a580 65 75 64 6f 20 50 31 20 50 32 20 50 33 20 2a 20  eudo P1 P2 P3 * 
1a590 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  *.**.** Open a n
1a5a0 65 77 20 63 75 72 73 6f 72 20 74 68 61 74 20 70  ew cursor that p
1a5b0 6f 69 6e 74 73 20 74 6f 20 61 20 66 61 6b 65 20  oints to a fake 
1a5c0 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61  table that conta
1a5d0 69 6e 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  ins a single.** 
1a5e0 72 6f 77 20 6f 66 20 64 61 74 61 2e 20 20 54 68  row of data.  Th
1a5f0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 61  e content of tha
1a600 74 20 6f 6e 65 20 72 6f 77 20 69 6e 20 74 68 65  t one row in the
1a610 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6d 65 6d 6f   content of memo
1a620 72 79 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50  ry.** register P
1a630 32 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  2.  In other wor
1a640 64 73 2c 20 63 75 72 73 6f 72 20 50 31 20 62 65  ds, cursor P1 be
1a650 63 6f 6d 65 73 20 61 6e 20 61 6c 69 61 73 20 66  comes an alias f
1a660 6f 72 20 74 68 65 20 0a 2a 2a 20 4d 45 4d 5f 42  or the .** MEM_B
1a670 6c 6f 62 20 63 6f 6e 74 65 6e 74 20 63 6f 6e 74  lob content cont
1a680 61 69 6e 65 64 20 69 6e 20 72 65 67 69 73 74 65  ained in registe
1a690 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 73  r P2..**.** A ps
1a6a0 65 75 64 6f 2d 74 61 62 6c 65 20 63 72 65 61 74  eudo-table creat
1a6b0 65 64 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64  ed by this opcod
1a6c0 65 20 69 73 20 75 73 65 64 20 74 6f 20 68 6f 6c  e is used to hol
1a6d0 64 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f  d a single.** ro
1a6e0 77 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 74 68  w output from th
1a6f0 65 20 73 6f 72 74 65 72 20 73 6f 20 74 68 61 74  e sorter so that
1a700 20 74 68 65 20 72 6f 77 20 63 61 6e 20 62 65 20   the row can be 
1a710 64 65 63 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 0a  decomposed into.
1a720 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f  ** individual co
1a730 6c 75 6d 6e 73 20 75 73 69 6e 67 20 74 68 65 20  lumns using the 
1a740 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65  OP_Column opcode
1a750 2e 20 20 54 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e  .  The OP_Column
1a760 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 74 68   opcode.** is th
1a770 65 20 6f 6e 6c 79 20 63 75 72 73 6f 72 20 6f 70  e only cursor op
1a780 63 6f 64 65 20 74 68 61 74 20 77 6f 72 6b 73 20  code that works 
1a790 77 69 74 68 20 61 20 70 73 65 75 64 6f 2d 74 61  with a pseudo-ta
1a7a0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 50 33 20 69 73  ble..**.** P3 is
1a7b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
1a7c0 69 65 6c 64 73 20 69 6e 20 74 68 65 20 72 65 63  ields in the rec
1a7d0 6f 72 64 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ords that will b
1a7e0 65 20 73 74 6f 72 65 64 20 62 79 0a 2a 2a 20 74  e stored by.** t
1a7f0 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  he pseudo-table.
1a800 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e  .*/.case OP_Open
1a810 50 73 65 75 64 6f 3a 20 7b 0a 20 20 56 64 62 65  Pseudo: {.  Vdbe
1a820 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 0a 20 20  Cursor *pCx;..  
1a830 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
1a840 3d 30 20 29 3b 0a 20 20 70 43 78 20 3d 20 61 6c  =0 );.  pCx = al
1a850 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20  locateCursor(p, 
1a860 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 33  pOp->p1, pOp->p3
1a870 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  , -1, 0);.  if( 
1a880 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  pCx==0 ) goto no
1a890 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c  _mem;.  pCx->nul
1a8a0 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 78 2d  lRow = 1;.  pCx-
1a8b0 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67 20  >pseudoTableReg 
1a8c0 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 43 78  = pOp->p2;.  pCx
1a8d0 2d 3e 69 73 54 61 62 6c 65 20 3d 20 31 3b 0a 20  ->isTable = 1;. 
1a8e0 20 70 43 78 2d 3e 69 73 49 6e 64 65 78 20 3d 20   pCx->isIndex = 
1a8f0 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  0;.  break;.}../
1a900 2a 20 4f 70 63 6f 64 65 3a 20 43 6c 6f 73 65 20  * Opcode: Close 
1a910 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  P1 * * * *.**.**
1a920 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20   Close a cursor 
1a930 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65  previously opene
1a940 64 20 61 73 20 50 31 2e 20 20 49 66 20 50 31 20  d as P1.  If P1 
1a950 69 73 20 6e 6f 74 0a 2a 2a 20 63 75 72 72 65 6e  is not.** curren
1a960 74 6c 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 69  tly open, this i
1a970 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 20  nstruction is a 
1a980 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63 61 73 65 20 4f  no-op..*/.case O
1a990 50 5f 43 6c 6f 73 65 3a 20 7b 0a 20 20 61 73 73  P_Close: {.  ass
1a9a0 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
1a9b0 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
1a9c0 75 72 73 6f 72 20 29 3b 0a 20 20 73 71 6c 69 74  ursor );.  sqlit
1a9d0 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
1a9e0 28 70 2c 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  (p, p->apCsr[pOp
1a9f0 2d 3e 70 31 5d 29 3b 0a 20 20 70 2d 3e 61 70 43  ->p1]);.  p->apC
1aa00 73 72 5b 70 4f 70 2d 3e 70 31 5d 20 3d 20 30 3b  sr[pOp->p1] = 0;
1aa10 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
1aa20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 47 65 20 50  Opcode: SeekGe P
1aa30 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a  1 P2 P3 P4 *.**.
1aa40 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31 20  ** If cursor P1 
1aa50 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c  refers to an SQL
1aa60 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74   table (B-Tree t
1aa70 68 61 74 20 75 73 65 73 20 69 6e 74 65 67 65 72  hat uses integer
1aa80 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20   keys), .** use 
1aa90 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
1aaa0 69 73 74 65 72 20 50 33 20 61 73 20 74 68 65 20  ister P3 as the 
1aab0 6b 65 79 2e 20 20 49 66 20 63 75 72 73 6f 72 20  key.  If cursor 
1aac0 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f  P1 refers .** to
1aad0 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74   an SQL index, t
1aae0 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66 69  hen P3 is the fi
1aaf0 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20  rst in an array 
1ab00 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20  of P4 registers 
1ab10 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73 65  .** that are use
1ab20 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64  d as an unpacked
1ab30 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a   index key. .**.
1ab40 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75  ** Reposition cu
1ab50 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20  rsor P1 so that 
1ab60 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
1ab70 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72 79  e smallest entry
1ab80 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72 65   that .** is gre
1ab90 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
1aba0 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61  al to the key va
1abb0 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72  lue. If there ar
1abc0 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a 2a 2a  e no records .**
1abd0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
1abe0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65   equal to the ke
1abf0 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74 20  y and P2 is not 
1ac00 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20  zero, then jump 
1ac10 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  to P2..**.** See
1ac20 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f   also: Found, No
1ac30 74 46 6f 75 6e 64 2c 20 44 69 73 74 69 6e 63 74  tFound, Distinct
1ac40 2c 20 53 65 65 6b 4c 74 2c 20 53 65 65 6b 47 74  , SeekLt, SeekGt
1ac50 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f  , SeekLe.*/./* O
1ac60 70 63 6f 64 65 3a 20 53 65 65 6b 47 74 20 50 31  pcode: SeekGt P1
1ac70 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a   P2 P3 P4 *.**.*
1ac80 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72  * If cursor P1 r
1ac90 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20  efers to an SQL 
1aca0 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68  table (B-Tree th
1acb0 61 74 20 75 73 65 73 20 69 6e 74 65 67 65 72 20  at uses integer 
1acc0 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74  keys), .** use t
1acd0 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
1ace0 73 74 65 72 20 50 33 20 61 73 20 61 20 6b 65 79  ster P3 as a key
1acf0 2e 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72  . If cursor P1 r
1ad00 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20  efers .** to an 
1ad10 53 51 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20  SQL index, then 
1ad20 50 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20  P3 is the first 
1ad30 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 50  in an array of P
1ad40 34 20 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20  4 registers .** 
1ad50 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73  that are used as
1ad60 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64   an unpacked ind
1ad70 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52  ex key. .**.** R
1ad80 65 70 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f 72  eposition cursor
1ad90 20 50 31 20 73 6f 20 74 68 61 74 20 20 69 74 20   P1 so that  it 
1ada0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d  points to the sm
1adb0 61 6c 6c 65 73 74 20 65 6e 74 72 79 20 74 68 61  allest entry tha
1adc0 74 20 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  t .** is greater
1add0 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61   than the key va
1ade0 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72  lue. If there ar
1adf0 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 67 72 65  e no records gre
1ae00 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 74 68  ater than .** th
1ae10 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20  e key and P2 is 
1ae20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a  not zero, then j
1ae30 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a  ump to P2..**.**
1ae40 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64   See also: Found
1ae50 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73 74  , NotFound, Dist
1ae60 69 6e 63 74 2c 20 53 65 65 6b 4c 74 2c 20 53 65  inct, SeekLt, Se
1ae70 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a  ekGe, SeekLe.*/.
1ae80 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c  /* Opcode: SeekL
1ae90 74 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 20  t P1 P2 P3 P4 * 
1aea0 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  .**.** If cursor
1aeb0 20 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e   P1 refers to an
1aec0 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72   SQL table (B-Tr
1aed0 65 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74  ee that uses int
1aee0 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20  eger keys), .** 
1aef0 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  use the value in
1af00 20 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20   register P3 as 
1af10 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72  a key. If cursor
1af20 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74   P1 refers .** t
1af30 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20  o an SQL index, 
1af40 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66  then P3 is the f
1af50 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
1af60 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73   of P4 registers
1af70 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73   .** that are us
1af80 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65  ed as an unpacke
1af90 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a  d index key. .**
1afa0 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63  .** Reposition c
1afb0 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
1afc0 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74    it points to t
1afd0 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79  he largest entry
1afe0 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 6c 65 73   that .** is les
1aff0 73 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76  s than the key v
1b000 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61  alue. If there a
1b010 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 6c 65  re no records le
1b020 73 73 20 74 68 61 6e 20 0a 2a 2a 20 74 68 65 20  ss than .** the 
1b030 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f  key and P2 is no
1b040 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d  t zero, then jum
1b050 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53  p to P2..**.** S
1b060 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20  ee also: Found, 
1b070 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73 74 69 6e  NotFound, Distin
1b080 63 74 2c 20 53 65 65 6b 47 74 2c 20 53 65 65 6b  ct, SeekGt, Seek
1b090 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a  Ge, SeekLe.*/./*
1b0a0 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c 65 20   Opcode: SeekLe 
1b0b0 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a  P1 P2 P3 P4 *.**
1b0c0 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31  .** If cursor P1
1b0d0 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51   refers to an SQ
1b0e0 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20  L table (B-Tree 
1b0f0 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67 65  that uses intege
1b100 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65  r keys), .** use
1b110 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
1b120 67 69 73 74 65 72 20 50 33 20 61 73 20 61 20 6b  gister P3 as a k
1b130 65 79 2e 20 49 66 20 63 75 72 73 6f 72 20 50 31  ey. If cursor P1
1b140 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61   refers .** to a
1b150 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68 65  n SQL index, the
1b160 6e 20 50 33 20 69 73 20 74 68 65 20 66 69 72 73  n P3 is the firs
1b170 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  t in an array of
1b180 20 50 34 20 72 65 67 69 73 74 65 72 73 20 0a 2a   P4 registers .*
1b190 2a 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  * that are used 
1b1a0 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69  as an unpacked i
1b1b0 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a  ndex key. .**.**
1b1c0 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72 73   Reposition curs
1b1d0 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 69 74  or P1 so that it
1b1e0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
1b1f0 61 72 67 65 73 74 20 65 6e 74 72 79 20 74 68 61  argest entry tha
1b200 74 20 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68  t .** is less th
1b210 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
1b220 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66  he key value. If
1b230 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65   there are no re
1b240 63 6f 72 64 73 20 0a 2a 2a 20 6c 65 73 73 20 74  cords .** less t
1b250 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1b260 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69  the key and P2 i
1b270 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
1b280 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a   jump to P2..**.
1b290 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
1b2a0 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69  nd, NotFound, Di
1b2b0 73 74 69 6e 63 74 2c 20 53 65 65 6b 47 74 2c 20  stinct, SeekGt, 
1b2c0 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c 74 0a 2a  SeekGe, SeekLt.*
1b2d0 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 4c 74  /.case OP_SeekLt
1b2e0 3a 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d  :         /* jum
1b2f0 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  p, in3 */.case O
1b300 50 5f 53 65 65 6b 4c 65 3a 20 20 20 20 20 20 20  P_SeekLe:       
1b310 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
1b320 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 47 65  /.case OP_SeekGe
1b330 3a 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d  :         /* jum
1b340 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  p, in3 */.case O
1b350 50 5f 53 65 65 6b 47 74 3a 20 7b 20 20 20 20 20  P_SeekGt: {     
1b360 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
1b370 2f 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69  /.  int res;.  i
1b380 6e 74 20 6f 63 3b 0a 20 20 56 64 62 65 43 75 72  nt oc;.  VdbeCur
1b390 73 6f 72 20 2a 70 43 3b 0a 20 20 55 6e 70 61 63  sor *pC;.  Unpac
1b3a0 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a 20 20 69  kedRecord r;.  i
1b3b0 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 36 34  nt nField;.  i64
1b3c0 20 69 4b 65 79 3b 20 20 20 20 20 20 2f 2a 20 54   iKey;      /* T
1b3d0 68 65 20 72 6f 77 69 64 20 77 65 20 61 72 65 20  he rowid we are 
1b3e0 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 0a 20  to seek to */.. 
1b3f0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
1b400 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
1b410 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61  ->nCursor );.  a
1b420 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 21 3d  ssert( pOp->p2!=
1b430 30 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  0 );.  pC = p->a
1b440 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
1b450 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
1b460 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
1b470 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67 3d 3d  pseudoTableReg==
1b480 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f  0 );.  assert( O
1b490 50 5f 53 65 65 6b 4c 65 20 3d 3d 20 4f 50 5f 53  P_SeekLe == OP_S
1b4a0 65 65 6b 4c 74 2b 31 20 29 3b 0a 20 20 61 73 73  eekLt+1 );.  ass
1b4b0 65 72 74 28 20 4f 50 5f 53 65 65 6b 47 65 20 3d  ert( OP_SeekGe =
1b4c0 3d 20 4f 50 5f 53 65 65 6b 4c 74 2b 32 20 29 3b  = OP_SeekLt+2 );
1b4d0 0a 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65  .  assert( OP_Se
1b4e0 65 6b 47 74 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c  ekGt == OP_SeekL
1b4f0 74 2b 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t+3 );.  assert(
1b500 20 70 43 2d 3e 69 73 4f 72 64 65 72 65 64 20 29   pC->isOrdered )
1b510 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
1b520 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 29 20 29  C->pCursor!=0) )
1b530 7b 0a 20 20 20 20 6f 63 20 3d 20 70 4f 70 2d 3e  {.    oc = pOp->
1b540 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70 43 2d 3e  opcode;.    pC->
1b550 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 20  nullRow = 0;.   
1b560 20 69 66 28 20 70 43 2d 3e 69 73 54 61 62 6c 65   if( pC->isTable
1b570 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
1b580 20 69 6e 70 75 74 20 76 61 6c 75 65 20 69 6e 20   input value in 
1b590 50 33 20 6d 69 67 68 74 20 62 65 20 6f 66 20 61  P3 might be of a
1b5a0 6e 79 20 74 79 70 65 3a 20 69 6e 74 65 67 65 72  ny type: integer
1b5b0 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e 67 2c 0a  , real, string,.
1b5c0 20 20 20 20 20 20 2a 2a 20 62 6c 6f 62 2c 20 6f        ** blob, o
1b5d0 72 20 4e 55 4c 4c 2e 20 20 42 75 74 20 69 74 20  r NULL.  But it 
1b5e0 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6e 20 69  needs to be an i
1b5f0 6e 74 65 67 65 72 20 62 65 66 6f 72 65 20 77 65  nteger before we
1b600 20 63 61 6e 20 64 6f 0a 20 20 20 20 20 20 2a 2a   can do.      **
1b610 20 74 68 65 20 73 65 65 6b 2c 20 73 6f 20 63 6f   the seek, so co
1b620 76 65 72 74 20 69 74 2e 20 2a 2f 0a 20 20 20 20  vert it. */.    
1b630 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
1b640 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20 61  Op->p3];.      a
1b650 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e  pplyNumericAffin
1b660 69 74 79 28 70 49 6e 33 29 3b 0a 20 20 20 20 20  ity(pIn3);.     
1b670 20 69 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56   iKey = sqlite3V
1b680 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 33  dbeIntValue(pIn3
1b690 29 3b 0a 20 20 20 20 20 20 70 43 2d 3e 72 6f 77  );.      pC->row
1b6a0 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 0a  idIsValid = 0;..
1b6b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1b6c0 50 33 20 76 61 6c 75 65 20 63 6f 75 6c 64 20 6e  P3 value could n
1b6d0 6f 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ot be converted 
1b6e0 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  into an integer 
1b6f0 77 69 74 68 6f 75 74 0a 20 20 20 20 20 20 2a 2a  without.      **
1b700 20 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72 6d 61   loss of informa
1b710 74 69 6f 6e 2c 20 74 68 65 6e 20 73 70 65 63 69  tion, then speci
1b720 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  al processing is
1b730 20 72 65 71 75 69 72 65 64 2e 2e 2e 20 2a 2f 0a   required... */.
1b740 20 20 20 20 20 20 69 66 28 20 28 70 49 6e 33 2d        if( (pIn3-
1b750 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
1b760 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1b770 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73  if( (pIn3->flags
1b780 20 26 20 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20   & MEM_Real)==0 
1b790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1b7a0 49 66 20 74 68 65 20 50 33 20 76 61 6c 75 65 20  If the P3 value 
1b7b0 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72  cannot be conver
1b7c0 74 65 64 20 69 6e 74 6f 20 61 6e 79 20 6b 69 6e  ted into any kin
1b7d0 64 20 6f 66 20 61 20 6e 75 6d 62 65 72 2c 0a 20  d of a number,. 
1b7e0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e           ** then
1b7f0 20 74 68 65 20 73 65 65 6b 20 69 73 20 6e 6f 74   the seek is not
1b800 20 70 6f 73 73 69 62 6c 65 2c 20 73 6f 20 6a 75   possible, so ju
1b810 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20 20 20 20  mp to P2 */.    
1b820 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e        pc = pOp->
1b830 70 32 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  p2 - 1;.        
1b840 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1b850 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66   }.        /* If
1b860 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
1b870 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 50  oint, then the P
1b880 33 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20  3 value must be 
1b890 61 20 66 6c 6f 61 74 69 6e 67 0a 20 20 20 20 20  a floating.     
1b8a0 20 20 20 2a 2a 20 70 6f 69 6e 74 20 6e 75 6d 62     ** point numb
1b8b0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  er. */.        a
1b8c0 73 73 65 72 74 28 20 28 70 49 6e 33 2d 3e 66 6c  ssert( (pIn3->fl
1b8d0 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21  ags & MEM_Real)!
1b8e0 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  =0 );..        i
1b8f0 66 28 20 69 4b 65 79 3d 3d 53 4d 41 4c 4c 45 53  f( iKey==SMALLES
1b900 54 5f 49 4e 54 36 34 20 26 26 20 28 70 49 6e 33  T_INT64 && (pIn3
1b910 2d 3e 72 3c 28 64 6f 75 62 6c 65 29 69 4b 65 79  ->r<(double)iKey
1b920 20 7c 7c 20 70 49 6e 33 2d 3e 72 3e 30 29 20 29   || pIn3->r>0) )
1b930 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
1b940 68 65 20 50 33 20 76 61 6c 75 65 20 69 73 20 74  he P3 value is t
1b950 6f 6f 20 6c 61 72 67 65 20 69 6e 20 6d 61 67 6e  oo large in magn
1b960 69 74 75 64 65 20 74 6f 20 62 65 20 65 78 70 72  itude to be expr
1b970 65 73 73 65 64 20 61 73 20 61 6e 0a 20 20 20 20  essed as an.    
1b980 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72        ** integer
1b990 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1b9a0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
1b9b0 20 20 69 66 28 20 70 49 6e 33 2d 3e 72 3c 30 20    if( pIn3->r<0 
1b9c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
1b9d0 66 28 20 6f 63 3e 3d 4f 50 5f 53 65 65 6b 47 65  f( oc>=OP_SeekGe
1b9e0 20 29 7b 20 20 61 73 73 65 72 74 28 20 6f 63 3d   ){  assert( oc=
1b9f0 3d 4f 50 5f 53 65 65 6b 47 65 20 7c 7c 20 6f 63  =OP_SeekGe || oc
1ba00 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20  ==OP_SeekGt );. 
1ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
1ba20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  = sqlite3BtreeFi
1ba30 72 73 74 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c  rst(pC->pCursor,
1ba40 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20   &res);.        
1ba50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1ba60 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
1ba70 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
1ba80 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  r;.            }
1ba90 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1baa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
1bab0 28 20 6f 63 3c 3d 4f 50 5f 53 65 65 6b 4c 65 20  ( oc<=OP_SeekLe 
1bac0 29 7b 20 20 61 73 73 65 72 74 28 20 6f 63 3d 3d  ){  assert( oc==
1bad0 4f 50 5f 53 65 65 6b 4c 74 20 7c 7c 20 6f 63 3d  OP_SeekLt || oc=
1bae0 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20  =OP_SeekLe );.  
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1bb00 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
1bb10 74 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26  t(pC->pCursor, &
1bb20 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  res);.          
1bb30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1bb40 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f  TE_OK ) goto abo
1bb50 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
1bb60 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1bb70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1bb80 20 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a       if( res ){.
1bb90 20 20 20 20 20 20 20 20 20 20 20 20 70 63 20 3d              pc =
1bba0 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
1bbb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bbc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1bbd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 63 3d     }else if( oc=
1bbe0 3d 4f 50 5f 53 65 65 6b 4c 74 20 7c 7c 20 6f 63  =OP_SeekLt || oc
1bbf0 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 7b 0a 20  ==OP_SeekGe ){. 
1bc00 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
1bc10 74 68 65 20 63 65 69 6c 69 6e 67 28 29 20 66 75  the ceiling() fu
1bc20 6e 63 74 69 6f 6e 20 74 6f 20 63 6f 6e 76 65 72  nction to conver
1bc30 74 20 72 65 61 6c 2d 3e 69 6e 74 20 2a 2f 0a 20  t real->int */. 
1bc40 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e           if( pIn
1bc50 33 2d 3e 72 20 3e 20 28 64 6f 75 62 6c 65 29 69  3->r > (double)i
1bc60 4b 65 79 20 29 20 69 4b 65 79 2b 2b 3b 0a 20 20  Key ) iKey++;.  
1bc70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1bc80 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
1bc90 65 20 66 6c 6f 6f 72 28 29 20 66 75 6e 63 74 69  e floor() functi
1bca0 6f 6e 20 74 6f 20 63 6f 6e 76 65 72 74 20 72 65  on to convert re
1bcb0 61 6c 2d 3e 69 6e 74 20 2a 2f 0a 20 20 20 20 20  al->int */.     
1bcc0 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 3d       assert( oc=
1bcd0 3d 4f 50 5f 53 65 65 6b 4c 65 20 7c 7c 20 6f 63  =OP_SeekLe || oc
1bce0 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20  ==OP_SeekGt );. 
1bcf0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e           if( pIn
1bd00 33 2d 3e 72 20 3c 20 28 64 6f 75 62 6c 65 29 69  3->r < (double)i
1bd10 4b 65 79 20 29 20 69 4b 65 79 2d 2d 3b 0a 20 20  Key ) iKey--;.  
1bd20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
1bd30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1bd40 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
1bd50 70 61 63 6b 65 64 28 70 43 2d 3e 70 43 75 72 73  packed(pC->pCurs
1bd60 6f 72 2c 20 30 2c 20 28 75 36 34 29 69 4b 65 79  or, 0, (u64)iKey
1bd70 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  , 0, &res);.    
1bd80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bd90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1bda0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1bdb0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a  _error;.      }.
1bdc0 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
1bdd0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e   ){.        pC->
1bde0 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 31  rowidIsValid = 1
1bdf0 3b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 6c 61  ;.        pC->la
1be00 73 74 52 6f 77 69 64 20 3d 20 69 4b 65 79 3b 0a  stRowid = iKey;.
1be10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1be20 65 7b 0a 20 20 20 20 20 20 6e 46 69 65 6c 64 20  e{.      nField 
1be30 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20  = pOp->p4.i;.   
1be40 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
1be50 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32  p4type==P4_INT32
1be60 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1be70 28 20 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20  ( nField>0 );.  
1be80 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d      r.pKeyInfo =
1be90 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20   pC->pKeyInfo;. 
1bea0 20 20 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20       r.nField = 
1beb0 28 75 31 36 29 6e 46 69 65 6c 64 3b 0a 0a 20 20  (u16)nField;..  
1bec0 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
1bed0 6c 69 6e 65 20 6f 66 20 63 6f 64 65 20 63 6f 6d  line of code com
1bee0 70 75 74 65 73 20 61 73 20 66 6f 6c 6c 6f 77 73  putes as follows
1bef0 2c 20 6f 6e 6c 79 20 66 61 73 74 65 72 3a 0a 20  , only faster:. 
1bf00 20 20 20 20 20 2a 2a 20 20 20 69 66 28 20 6f 63       **   if( oc
1bf10 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 7c 7c 20 6f  ==OP_SeekGt || o
1bf20 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 7b 0a  c==OP_SeekLe ){.
1bf30 20 20 20 20 20 20 2a 2a 20 20 20 20 20 72 2e 66        **     r.f
1bf40 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f  lags = UNPACKED_
1bf50 49 4e 43 52 4b 45 59 3b 0a 20 20 20 20 20 20 2a  INCRKEY;.      *
1bf60 2a 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20  *   }else{.     
1bf70 20 2a 2a 20 20 20 20 20 72 2e 66 6c 61 67 73 20   **     r.flags 
1bf80 3d 20 30 3b 0a 20 20 20 20 20 20 2a 2a 20 20 20  = 0;.      **   
1bf90 7d 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  }.      */.     
1bfa0 20 72 2e 66 6c 61 67 73 20 3d 20 28 75 31 36 29   r.flags = (u16)
1bfb0 28 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45  (UNPACKED_INCRKE
1bfc0 59 20 2a 20 28 31 20 26 20 28 6f 63 20 2d 20 4f  Y * (1 & (oc - O
1bfd0 50 5f 53 65 65 6b 4c 74 29 29 29 3b 0a 20 20 20  P_SeekLt)));.   
1bfe0 20 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f     assert( oc!=O
1bff0 50 5f 53 65 65 6b 47 74 20 7c 7c 20 72 2e 66 6c  P_SeekGt || r.fl
1c000 61 67 73 3d 3d 55 4e 50 41 43 4b 45 44 5f 49 4e  ags==UNPACKED_IN
1c010 43 52 4b 45 59 20 29 3b 0a 20 20 20 20 20 20 61  CRKEY );.      a
1c020 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65  ssert( oc!=OP_Se
1c030 65 6b 4c 65 20 7c 7c 20 72 2e 66 6c 61 67 73 3d  ekLe || r.flags=
1c040 3d 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45  =UNPACKED_INCRKE
1c050 59 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Y );.      asser
1c060 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 47 65  t( oc!=OP_SeekGe
1c070 20 7c 7c 20 72 2e 66 6c 61 67 73 3d 3d 30 20 29   || r.flags==0 )
1c080 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c090 6f 63 21 3d 4f 50 5f 53 65 65 6b 4c 74 20 7c 7c  oc!=OP_SeekLt ||
1c0a0 20 72 2e 66 6c 61 67 73 3d 3d 30 20 29 3b 0a 0a   r.flags==0 );..
1c0b0 20 20 20 20 20 20 72 2e 61 4d 65 6d 20 3d 20 26        r.aMem = &
1c0c0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 23  aMem[pOp->p3];.#
1c0d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1c0e0 55 47 0a 20 20 20 20 20 20 7b 20 69 6e 74 20 69  UG.      { int i
1c0f0 3b 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 2e 6e  ; for(i=0; i<r.n
1c100 46 69 65 6c 64 3b 20 69 2b 2b 29 20 61 73 73 65  Field; i++) asse
1c110 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26  rt( memIsValid(&
1c120 72 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a  r.aMem[i]) ); }.
1c130 23 65 6e 64 69 66 0a 20 20 20 20 20 20 45 78 70  #endif.      Exp
1c140 61 6e 64 42 6c 6f 62 28 72 2e 61 4d 65 6d 29 3b  andBlob(r.aMem);
1c150 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1c160 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
1c170 70 61 63 6b 65 64 28 70 43 2d 3e 70 43 75 72 73  packed(pC->pCurs
1c180 6f 72 2c 20 26 72 2c 20 30 2c 20 30 2c 20 26 72  or, &r, 0, 0, &r
1c190 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  es);.      if( r
1c1a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c1b0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f          goto abo
1c1c0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
1c1d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1c1e0 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  C->rowidIsValid 
1c1f0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
1c200 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
1c210 6f 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63  o = 0;.    pC->c
1c220 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
1c230 48 45 5f 53 54 41 4c 45 3b 0a 23 69 66 64 65 66  HE_STALE;.#ifdef
1c240 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
1c250 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
1c260 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
1c270 20 20 20 20 69 66 28 20 6f 63 3e 3d 4f 50 5f 53      if( oc>=OP_S
1c280 65 65 6b 47 65 20 29 7b 20 20 61 73 73 65 72 74  eekGe ){  assert
1c290 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 65 20  ( oc==OP_SeekGe 
1c2a0 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 74  || oc==OP_SeekGt
1c2b0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65   );.      if( re
1c2c0 73 3c 30 20 7c 7c 20 28 72 65 73 3d 3d 30 20 26  s<0 || (res==0 &
1c2d0 26 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 74 29  & oc==OP_SeekGt)
1c2e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1c2f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
1c300 74 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26  t(pC->pCursor, &
1c310 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  res);.        if
1c320 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c330 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
1c340 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
1c350 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61     pC->rowidIsVa
1c360 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  lid = 0;.      }
1c370 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
1c380 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
1c390 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c3a0 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53  assert( oc==OP_S
1c3b0 65 65 6b 4c 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f  eekLt || oc==OP_
1c3c0 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 20 20  SeekLe );.      
1c3d0 69 66 28 20 72 65 73 3e 30 20 7c 7c 20 28 72 65  if( res>0 || (re
1c3e0 73 3d 3d 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53  s==0 && oc==OP_S
1c3f0 65 65 6b 4c 74 29 20 29 7b 0a 20 20 20 20 20 20  eekLt) ){.      
1c400 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1c410 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 2d 3e  reePrevious(pC->
1c420 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a  pCursor, &res);.
1c430 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1c440 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1c450 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
1c460 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 43 2d  ror;.        pC-
1c470 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20  >rowidIsValid = 
1c480 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
1c490 20 20 20 20 20 20 20 20 2f 2a 20 72 65 73 20 6d          /* res m
1c4a0 69 67 68 74 20 62 65 20 6e 65 67 61 74 69 76 65  ight be negative
1c4b0 20 62 65 63 61 75 73 65 20 74 68 65 20 74 61 62   because the tab
1c4c0 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 20 43 68  le is empty.  Ch
1c4d0 65 63 6b 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  eck to.        *
1c4e0 2a 20 73 65 65 20 69 66 20 74 68 69 73 20 69 73  * see if this is
1c4f0 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 20   the case..     
1c500 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65     */.        re
1c510 73 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  s = sqlite3Btree
1c520 45 6f 66 28 70 43 2d 3e 70 43 75 72 73 6f 72 29  Eof(pC->pCursor)
1c530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c540 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
1c550 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20 69 66 28  >p2>0 );.    if(
1c560 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 70 63   res ){.      pc
1c570 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
1c580 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1c590 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
1c5a0 6e 73 20 77 68 65 6e 20 61 74 74 65 6d 70 74 69  ns when attempti
1c5b0 6e 67 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 73  ng to open the s
1c5c0 71 6c 69 74 65 33 5f 6d 61 73 74 65 72 20 74 61  qlite3_master ta
1c5d0 62 6c 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 72  ble.    ** for r
1c5e0 65 61 64 20 61 63 63 65 73 73 20 72 65 74 75 72  ead access retur
1c5f0 6e 73 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 2e  ns SQLITE_EMPTY.
1c600 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
1c610 77 61 79 73 0a 20 20 20 20 2a 2a 20 74 61 6b 65  ways.    ** take
1c620 20 74 68 65 20 6a 75 6d 70 20 28 73 69 6e 63 65   the jump (since
1c630 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65   there are no re
1c640 63 6f 72 64 73 20 69 6e 20 74 68 65 20 74 61 62  cords in the tab
1c650 6c 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  le)..    */.    
1c660 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
1c670 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
1c680 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65  ../* Opcode: See
1c690 6b 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  k P1 P2 * * *.**
1c6a0 0a 2a 2a 20 50 31 20 69 73 20 61 6e 20 6f 70 65  .** P1 is an ope
1c6b0 6e 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 61  n table cursor a
1c6c0 6e 64 20 50 32 20 69 73 20 61 20 72 6f 77 69 64  nd P2 is a rowid
1c6d0 20 69 6e 74 65 67 65 72 2e 20 20 41 72 72 61 6e   integer.  Arran
1c6e0 67 65 0a 2a 2a 20 66 6f 72 20 50 31 20 74 6f 20  ge.** for P1 to 
1c6f0 6d 6f 76 65 20 73 6f 20 74 68 61 74 20 69 74 20  move so that it 
1c700 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 6f  points to the ro
1c710 77 69 64 20 67 69 76 65 6e 20 62 79 20 50 32 2e  wid given by P2.
1c720 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
1c730 63 74 75 61 6c 6c 79 20 61 20 64 65 66 65 72 72  ctually a deferr
1c740 65 64 20 73 65 65 6b 2e 20 20 4e 6f 74 68 69 6e  ed seek.  Nothin
1c750 67 20 61 63 74 75 61 6c 6c 79 20 68 61 70 70 65  g actually happe
1c760 6e 73 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20  ns until.** the 
1c770 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 74  cursor is used t
1c780 6f 20 72 65 61 64 20 61 20 72 65 63 6f 72 64 2e  o read a record.
1c790 20 20 54 68 61 74 20 77 61 79 2c 20 69 66 20 6e    That way, if n
1c7a0 6f 20 72 65 61 64 73 0a 2a 2a 20 6f 63 63 75 72  o reads.** occur
1c7b0 2c 20 6e 6f 20 75 6e 6e 65 63 65 73 73 61 72 79  , no unnecessary
1c7c0 20 49 2f 4f 20 68 61 70 70 65 6e 73 2e 0a 2a 2f   I/O happens..*/
1c7d0 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 3a 20 7b  .case OP_Seek: {
1c7e0 20 20 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20      /* in2 */.  
1c7f0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
1c800 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1c810 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
1c820 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
1c830 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
1c840 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
1c850 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 69 66  t( pC!=0 );.  if
1c860 28 20 41 4c 57 41 59 53 28 70 43 2d 3e 70 43 75  ( ALWAYS(pC->pCu
1c870 72 73 6f 72 21 3d 30 29 20 29 7b 0a 20 20 20 20  rsor!=0) ){.    
1c880 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61  assert( pC->isTa
1c890 62 6c 65 20 29 3b 0a 20 20 20 20 70 43 2d 3e 6e  ble );.    pC->n
1c8a0 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  ullRow = 0;.    
1c8b0 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn2 = &aMem[pOp
1c8c0 2d 3e 70 32 5d 3b 0a 20 20 20 20 70 43 2d 3e 6d  ->p2];.    pC->m
1c8d0 6f 76 65 74 6f 54 61 72 67 65 74 20 3d 20 73 71  ovetoTarget = sq
1c8e0 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
1c8f0 65 28 70 49 6e 32 29 3b 0a 20 20 20 20 70 43 2d  e(pIn2);.    pC-
1c900 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20  >rowidIsValid = 
1c910 30 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72  0;.    pC->defer
1c920 72 65 64 4d 6f 76 65 74 6f 20 3d 20 31 3b 0a 20  redMoveto = 1;. 
1c930 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 20 20   }.  break;.}.  
1c940 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6f 75  ../* Opcode: Fou
1c950 6e 64 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  nd P1 P2 P3 P4 *
1c960 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d 3d 30 20  .**.** If P4==0 
1c970 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33  then register P3
1c980 20 68 6f 6c 64 73 20 61 20 62 6c 6f 62 20 63 6f   holds a blob co
1c990 6e 73 74 72 75 63 74 65 64 20 62 79 20 4d 61 6b  nstructed by Mak
1c9a0 65 52 65 63 6f 72 64 2e 20 20 49 66 0a 2a 2a 20  eRecord.  If.** 
1c9b0 50 34 3e 30 20 74 68 65 6e 20 72 65 67 69 73 74  P4>0 then regist
1c9c0 65 72 20 50 33 20 69 73 20 74 68 65 20 66 69 72  er P3 is the fir
1c9d0 73 74 20 6f 66 20 50 34 20 72 65 67 69 73 74 65  st of P4 registe
1c9e0 72 73 20 74 68 61 74 20 66 6f 72 6d 20 61 6e 20  rs that form an 
1c9f0 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 72 65 63 6f  unpacked.** reco
1ca00 72 64 2e 0a 2a 2a 0a 2a 2a 20 43 75 72 73 6f 72  rd..**.** Cursor
1ca10 20 50 31 20 69 73 20 6f 6e 20 61 6e 20 69 6e 64   P1 is on an ind
1ca20 65 78 20 62 74 72 65 65 2e 20 20 49 66 20 74 68  ex btree.  If th
1ca30 65 20 72 65 63 6f 72 64 20 69 64 65 6e 74 69 66  e record identif
1ca40 69 65 64 20 62 79 20 50 33 20 61 6e 64 20 50 34  ied by P3 and P4
1ca50 0a 2a 2a 20 69 73 20 61 20 70 72 65 66 69 78 20  .** is a prefix 
1ca60 6f 66 20 61 6e 79 20 65 6e 74 72 79 20 69 6e 20  of any entry in 
1ca70 50 31 20 74 68 65 6e 20 61 20 6a 75 6d 70 20 69  P1 then a jump i
1ca80 73 20 6d 61 64 65 20 74 6f 20 50 32 20 61 6e 64  s made to P2 and
1ca90 0a 2a 2a 20 50 31 20 69 73 20 6c 65 66 74 20 70  .** P1 is left p
1caa0 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6d  ointing at the m
1cab0 61 74 63 68 69 6e 67 20 65 6e 74 72 79 2e 0a 2a  atching entry..*
1cac0 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74  /./* Opcode: Not
1cad0 46 6f 75 6e 64 20 50 31 20 50 32 20 50 33 20 50  Found P1 P2 P3 P
1cae0 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d  4 *.**.** If P4=
1caf0 3d 30 20 74 68 65 6e 20 72 65 67 69 73 74 65 72  =0 then register
1cb00 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f 62   P3 holds a blob
1cb10 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
1cb20 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 49 66 0a  MakeRecord.  If.
1cb30 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20 72 65 67  ** P4>0 then reg
1cb40 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65 20  ister P3 is the 
1cb50 66 69 72 73 74 20 6f 66 20 50 34 20 72 65 67 69  first of P4 regi
1cb60 73 74 65 72 73 20 74 68 61 74 20 66 6f 72 6d 20  sters that form 
1cb70 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 72  an unpacked.** r
1cb80 65 63 6f 72 64 2e 0a 2a 2a 20 0a 2a 2a 20 43 75  ecord..** .** Cu
1cb90 72 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61 6e  rsor P1 is on an
1cba0 20 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20 49   index btree.  I
1cbb0 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 64 65  f the record ide
1cbc0 6e 74 69 66 69 65 64 20 62 79 20 50 33 20 61 6e  ntified by P3 an
1cbd0 64 20 50 34 0a 2a 2a 20 69 73 20 6e 6f 74 20 74  d P4.** is not t
1cbe0 68 65 20 70 72 65 66 69 78 20 6f 66 20 61 6e 79  he prefix of any
1cbf0 20 65 6e 74 72 79 20 69 6e 20 50 31 20 74 68 65   entry in P1 the
1cc00 6e 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  n a jump is made
1cc10 20 74 6f 20 50 32 2e 20 20 49 66 20 50 31 20 0a   to P2.  If P1 .
1cc20 2a 2a 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20  ** does contain 
1cc30 61 6e 20 65 6e 74 72 79 20 77 68 6f 73 65 20 70  an entry whose p
1cc40 72 65 66 69 78 20 6d 61 74 63 68 65 73 20 74 68  refix matches th
1cc50 65 20 50 33 2f 50 34 20 72 65 63 6f 72 64 20 74  e P3/P4 record t
1cc60 68 65 6e 20 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 66  hen control.** f
1cc70 61 6c 6c 73 20 74 68 72 6f 75 67 68 20 74 6f 20  alls through to 
1cc80 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
1cc90 74 69 6f 6e 20 61 6e 64 20 50 31 20 69 73 20 6c  tion and P1 is l
1cca0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
1ccb0 74 68 65 0a 2a 2a 20 6d 61 74 63 68 69 6e 67 20  the.** matching 
1ccc0 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  entry..**.** See
1ccd0 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f   also: Found, No
1cce0 74 45 78 69 73 74 73 2c 20 49 73 55 6e 69 71 75  tExists, IsUniqu
1ccf0 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74  e.*/.case OP_Not
1cd00 46 6f 75 6e 64 3a 20 20 20 20 20 20 20 2f 2a 20  Found:       /* 
1cd10 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73  jump, in3 */.cas
1cd20 65 20 4f 50 5f 46 6f 75 6e 64 3a 20 7b 20 20 20  e OP_Found: {   
1cd30 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
1cd40 33 20 2a 2f 0a 20 20 69 6e 74 20 61 6c 72 65 61  3 */.  int alrea
1cd50 64 79 45 78 69 73 74 73 3b 0a 20 20 56 64 62 65  dyExists;.  Vdbe
1cd60 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e  Cursor *pC;.  in
1cd70 74 20 72 65 73 3b 0a 20 20 63 68 61 72 20 2a 70  t res;.  char *p
1cd80 46 72 65 65 3b 0a 20 20 55 6e 70 61 63 6b 65 64  Free;.  Unpacked
1cd90 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b  Record *pIdxKey;
1cda0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1cdb0 64 20 72 3b 0a 20 20 63 68 61 72 20 61 54 65 6d  d r;.  char aTem
1cdc0 70 52 65 63 5b 52 4f 55 4e 44 38 28 73 69 7a 65  pRec[ROUND8(size
1cdd0 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
1cde0 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
1cdf0 29 2a 33 20 2b 20 37 5d 3b 0a 0a 23 69 66 64 65  )*3 + 7];..#ifde
1ce00 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
1ce10 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f  sqlite3_found_co
1ce20 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
1ce30 20 61 6c 72 65 61 64 79 45 78 69 73 74 73 20 3d   alreadyExists =
1ce40 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   0;.  assert( pO
1ce50 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
1ce60 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
1ce70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1ce80 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
1ce90 32 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  2 );.  pC = p->a
1cea0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
1ceb0 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
1cec0 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d  ;.  pIn3 = &aMem
1ced0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28  [pOp->p3];.  if(
1cee0 20 41 4c 57 41 59 53 28 70 43 2d 3e 70 43 75 72   ALWAYS(pC->pCur
1cef0 73 6f 72 21 3d 30 29 20 29 7b 0a 0a 20 20 20 20  sor!=0) ){..    
1cf00 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61  assert( pC->isTa
1cf10 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ble==0 );.    if
1cf20 28 20 70 4f 70 2d 3e 70 34 2e 69 3e 30 20 29 7b  ( pOp->p4.i>0 ){
1cf30 0a 20 20 20 20 20 20 72 2e 70 4b 65 79 49 6e 66  .      r.pKeyInf
1cf40 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f  o = pC->pKeyInfo
1cf50 3b 0a 20 20 20 20 20 20 72 2e 6e 46 69 65 6c 64  ;.      r.nField
1cf60 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 34 2e   = (u16)pOp->p4.
1cf70 69 3b 0a 20 20 20 20 20 20 72 2e 61 4d 65 6d 20  i;.      r.aMem 
1cf80 3d 20 70 49 6e 33 3b 0a 23 69 66 64 65 66 20 53  = pIn3;.#ifdef S
1cf90 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
1cfa0 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28 69    { int i; for(i
1cfb0 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20  =0; i<r.nField; 
1cfc0 69 2b 2b 29 20 61 73 73 65 72 74 28 20 6d 65 6d  i++) assert( mem
1cfd0 49 73 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b  IsValid(&r.aMem[
1cfe0 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a  i]) ); }.#endif.
1cff0 20 20 20 20 20 20 72 2e 66 6c 61 67 73 20 3d 20        r.flags = 
1d000 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f  UNPACKED_PREFIX_
1d010 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70 49 64  MATCH;.      pId
1d020 78 4b 65 79 20 3d 20 26 72 3b 0a 20 20 20 20 7d  xKey = &r;.    }
1d030 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 64 78  else{.      pIdx
1d040 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Key = sqlite3Vdb
1d050 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65  eAllocUnpackedRe
1d060 63 6f 72 64 28 0a 20 20 20 20 20 20 20 20 20 20  cord(.          
1d070 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 54  pC->pKeyInfo, aT
1d080 65 6d 70 52 65 63 2c 20 73 69 7a 65 6f 66 28 61  empRec, sizeof(a
1d090 54 65 6d 70 52 65 63 29 2c 20 26 70 46 72 65 65  TempRec), &pFree
1d0a0 0a 20 20 20 20 20 20 29 3b 20 0a 20 20 20 20 20  .      ); .     
1d0b0 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20   if( pIdxKey==0 
1d0c0 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
1d0d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
1d0e0 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  3->flags & MEM_B
1d0f0 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73  lob );.      ass
1d100 65 72 74 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67  ert( (pIn3->flag
1d110 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30  s & MEM_Zero)==0
1d120 20 29 3b 20 20 2f 2a 20 7a 65 72 6f 62 6c 6f 62   );  /* zeroblob
1d130 73 20 61 6c 72 65 61 64 79 20 65 78 70 61 6e 64  s already expand
1d140 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ed */.      sqli
1d150 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
1d160 61 63 6b 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f  ack(pC->pKeyInfo
1d170 2c 20 70 49 6e 33 2d 3e 6e 2c 20 70 49 6e 33 2d  , pIn3->n, pIn3-
1d180 3e 7a 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  >z, pIdxKey);.  
1d190 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 66 6c 61      pIdxKey->fla
1d1a0 67 73 20 7c 3d 20 55 4e 50 41 43 4b 45 44 5f 50  gs |= UNPACKED_P
1d1b0 52 45 46 49 58 5f 4d 41 54 43 48 3b 0a 20 20 20  REFIX_MATCH;.   
1d1c0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
1d1d0 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
1d1e0 70 61 63 6b 65 64 28 70 43 2d 3e 70 43 75 72 73  packed(pC->pCurs
1d1f0 6f 72 2c 20 70 49 64 78 4b 65 79 2c 20 30 2c 20  or, pIdxKey, 0, 
1d200 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66  0, &res);.    if
1d210 28 20 70 4f 70 2d 3e 70 34 2e 69 3d 3d 30 20 29  ( pOp->p4.i==0 )
1d220 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
1d230 62 46 72 65 65 28 64 62 2c 20 70 46 72 65 65 29  bFree(db, pFree)
1d240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1d250 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d260 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d270 20 20 7d 0a 20 20 20 20 61 6c 72 65 61 64 79 45    }.    alreadyE
1d280 78 69 73 74 73 20 3d 20 28 72 65 73 3d 3d 30 29  xists = (res==0)
1d290 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72  ;.    pC->deferr
1d2a0 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
1d2b0 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
1d2c0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
1d2d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e  .  }.  if( pOp->
1d2e0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6f 75 6e 64  opcode==OP_Found
1d2f0 20 29 7b 0a 20 20 20 20 69 66 28 20 61 6c 72 65   ){.    if( alre
1d300 61 64 79 45 78 69 73 74 73 20 29 20 70 63 20 3d  adyExists ) pc =
1d310 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
1d320 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 21  }else{.    if( !
1d330 61 6c 72 65 61 64 79 45 78 69 73 74 73 20 29 20  alreadyExists ) 
1d340 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
1d350 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
1d360 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 73 55  ../* Opcode: IsU
1d370 6e 69 71 75 65 20 50 31 20 50 32 20 50 33 20 50  nique P1 P2 P3 P
1d380 34 20 2a 0a 2a 2a 0a 2a 2a 20 43 75 72 73 6f 72  4 *.**.** Cursor
1d390 20 50 31 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61   P1 is open on a
1d3a0 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2d  n index b-tree -
1d3b0 20 74 68 61 74 20 69 73 20 74 6f 20 73 61 79 2c   that is to say,
1d3c0 20 61 20 62 74 72 65 65 20 77 68 69 63 68 0a 2a   a btree which.*
1d3d0 2a 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 77 68  * no data and wh
1d3e0 65 72 65 20 74 68 65 20 6b 65 79 20 61 72 65 20  ere the key are 
1d3f0 72 65 63 6f 72 64 73 20 67 65 6e 65 72 61 74 65  records generate
1d400 64 20 62 79 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  d by OP_MakeReco
1d410 72 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6c  rd with.** the l
1d420 69 73 74 20 66 69 65 6c 64 20 62 65 69 6e 67 20  ist field being 
1d430 74 68 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49  the integer ROWI
1d440 44 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74  D of the entry t
1d450 68 61 74 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a  hat the index.**
1d460 20 65 6e 74 72 79 20 72 65 66 65 72 73 20 74 6f   entry refers to
1d470 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 33 20 72  ..**.** The P3 r
1d480 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 73  egister contains
1d490 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 63 6f   an integer reco
1d4a0 72 64 20 6e 75 6d 62 65 72 2e 20 43 61 6c 6c 20  rd number. Call 
1d4b0 74 68 69 73 20 72 65 63 6f 72 64 20 0a 2a 2a 20  this record .** 
1d4c0 6e 75 6d 62 65 72 20 52 2e 20 52 65 67 69 73 74  number R. Regist
1d4d0 65 72 20 50 34 20 69 73 20 74 68 65 20 66 69 72  er P4 is the fir
1d4e0 73 74 20 69 6e 20 61 20 73 65 74 20 6f 66 20 4e  st in a set of N
1d4f0 20 63 6f 6e 74 69 67 75 6f 75 73 20 72 65 67 69   contiguous regi
1d500 73 74 65 72 73 0a 2a 2a 20 74 68 61 74 20 6d 61  sters.** that ma
1d510 6b 65 20 75 70 20 61 6e 20 75 6e 70 61 63 6b 65  ke up an unpacke
1d520 64 20 69 6e 64 65 78 20 6b 65 79 20 74 68 61 74  d index key that
1d530 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
1d540 68 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 20  h cursor P1..** 
1d550 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 20 63  The value of N c
1d560 61 6e 20 62 65 20 69 6e 66 65 72 72 65 64 20 66  an be inferred f
1d570 72 6f 6d 20 74 68 65 20 63 75 72 73 6f 72 2e 20  rom the cursor. 
1d580 4e 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 72  N includes the r
1d590 6f 77 69 64 0a 2a 2a 20 76 61 6c 75 65 20 61 70  owid.** value ap
1d5a0 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 65 6e  pended to the en
1d5b0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72  d of the index r
1d5c0 65 63 6f 72 64 2e 20 54 68 69 73 20 72 6f 77 69  ecord. This rowi
1d5d0 64 20 76 61 6c 75 65 20 6d 61 79 0a 2a 2a 20 6f  d value may.** o
1d5e0 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65  r may not be the
1d5f0 20 73 61 6d 65 20 61 73 20 52 2e 0a 2a 2a 0a 2a   same as R..**.*
1d600 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
1d610 4e 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69  N registers begi
1d620 6e 6e 69 6e 67 20 77 69 74 68 20 72 65 67 69 73  nning with regis
1d630 74 65 72 20 50 34 20 63 6f 6e 74 61 69 6e 73 20  ter P4 contains 
1d640 61 20 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 75 65 2c  a NULL.** value,
1d650 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
1d660 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 4f  y to P2..**.** O
1d670 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 69  therwise, this i
1d680 6e 73 74 72 75 63 74 69 6f 6e 20 63 68 65 63 6b  nstruction check
1d690 73 20 69 66 20 63 75 72 73 6f 72 20 50 31 20 63  s if cursor P1 c
1d6a0 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74 72 79  ontains an entry
1d6b0 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 66 69  .** where the fi
1d6c0 72 73 74 20 28 4e 2d 31 29 20 66 69 65 6c 64 73  rst (N-1) fields
1d6d0 20 6d 61 74 63 68 20 62 75 74 20 74 68 65 20 72   match but the r
1d6e0 6f 77 69 64 20 76 61 6c 75 65 20 61 74 20 74 68  owid value at th
1d6f0 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 74 68 65 20  e end.** of the 
1d700 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 6e  index entry is n
1d710 6f 74 20 52 2e 20 49 66 20 74 68 65 72 65 20 69  ot R. If there i
1d720 73 20 6e 6f 20 73 75 63 68 20 65 6e 74 72 79 2c  s no such entry,
1d730 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 2a   control jumps.*
1d740 2a 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e  * to instruction
1d750 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20   P2. Otherwise, 
1d760 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
1d770 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 69 6e 64   conflicting ind
1d780 65 78 0a 2a 2a 20 65 6e 74 72 79 20 69 73 20 63  ex.** entry is c
1d790 6f 70 69 65 64 20 74 6f 20 72 65 67 69 73 74 65  opied to registe
1d7a0 72 20 50 33 20 61 6e 64 20 63 6f 6e 74 72 6f 6c  r P3 and control
1d7b0 20 66 61 6c 6c 73 20 74 68 72 6f 75 67 68 20 74   falls through t
1d7c0 6f 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e  o the next.** in
1d7d0 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
1d7e0 20 53 65 65 20 61 6c 73 6f 3a 20 4e 6f 74 46 6f   See also: NotFo
1d7f0 75 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73 2c 20  und, NotExists, 
1d800 46 6f 75 6e 64 0a 2a 2f 0a 63 61 73 65 20 4f 50  Found.*/.case OP
1d810 5f 49 73 55 6e 69 71 75 65 3a 20 7b 20 20 20 20  _IsUnique: {    
1d820 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33      /* jump, in3
1d830 20 2a 2f 0a 20 20 75 31 36 20 69 69 3b 0a 20 20   */.  u16 ii;.  
1d840 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b  VdbeCursor *pCx;
1d850 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72  .  BtCursor *pCr
1d860 73 72 3b 0a 20 20 75 31 36 20 6e 46 69 65 6c 64  sr;.  u16 nField
1d870 3b 0a 20 20 4d 65 6d 20 2a 61 4d 78 3b 0a 20 20  ;.  Mem *aMx;.  
1d880 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72  UnpackedRecord r
1d890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d8a0 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 69 6e 64     /* B-Tree ind
1d8b0 65 78 20 73 65 61 72 63 68 20 6b 65 79 20 2a 2f  ex search key */
1d8c0 0a 20 20 69 36 34 20 52 3b 20 20 20 20 20 20 20  .  i64 R;       
1d8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8e0 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 73        /* Rowid s
1d8f0 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
1d900 72 20 50 33 20 2a 2f 0a 0a 20 20 70 49 6e 33 20  r P3 */..  pIn3 
1d910 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
1d920 3b 0a 20 20 61 4d 78 20 3d 20 26 61 4d 65 6d 5b  ;.  aMx = &aMem[
1d930 70 4f 70 2d 3e 70 34 2e 69 5d 3b 0a 20 20 2f 2a  pOp->p4.i];.  /*
1d940 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
1d950 20 76 61 6c 75 65 73 20 6f 66 20 70 61 72 61 6d   values of param
1d960 65 74 65 72 73 20 50 31 20 61 6e 64 20 50 34 20  eters P1 and P4 
1d970 61 72 65 20 69 6e 20 72 61 6e 67 65 2e 20 2a 2f  are in range. */
1d980 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1d990 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32  p4type==P4_INT32
1d9a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
1d9b0 70 2d 3e 70 34 2e 69 3e 30 20 26 26 20 70 4f 70  p->p4.i>0 && pOp
1d9c0 2d 3e 70 34 2e 69 3c 3d 70 2d 3e 6e 4d 65 6d 20  ->p4.i<=p->nMem 
1d9d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
1d9e0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
1d9f0 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
1da00 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
1da10 69 6e 64 65 78 20 63 75 72 73 6f 72 2e 20 2a 2f  index cursor. */
1da20 0a 20 20 70 43 78 20 3d 20 70 2d 3e 61 70 43 73  .  pCx = p->apCs
1da30 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
1da40 73 65 72 74 28 20 70 43 78 2d 3e 64 65 66 65 72  sert( pCx->defer
1da50 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a  redMoveto==0 );.
1da60 20 20 70 43 78 2d 3e 73 65 65 6b 52 65 73 75 6c    pCx->seekResul
1da70 74 20 3d 20 30 3b 0a 20 20 70 43 78 2d 3e 63 61  t = 0;.  pCx->ca
1da80 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
1da90 45 5f 53 54 41 4c 45 3b 0a 20 20 70 43 72 73 72  E_STALE;.  pCrsr
1daa0 20 3d 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 3b   = pCx->pCursor;
1dab0 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66  ..  /* If any of
1dac0 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20   the values are 
1dad0 4e 55 4c 4c 2c 20 74 61 6b 65 20 74 68 65 20 6a  NULL, take the j
1dae0 75 6d 70 2e 20 2a 2f 0a 20 20 6e 46 69 65 6c 64  ump. */.  nField
1daf0 20 3d 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f   = pCx->pKeyInfo
1db00 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 66 6f 72 28  ->nField;.  for(
1db10 69 69 3d 30 3b 20 69 69 3c 6e 46 69 65 6c 64 3b  ii=0; ii<nField;
1db20 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
1db30 61 4d 78 5b 69 69 5d 2e 66 6c 61 67 73 20 26 20  aMx[ii].flags & 
1db40 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
1db50 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
1db60 20 31 3b 0a 20 20 20 20 20 20 70 43 72 73 72 20   1;.      pCrsr 
1db70 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
1db80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
1db90 73 65 72 74 28 20 28 61 4d 78 5b 6e 46 69 65 6c  sert( (aMx[nFiel
1dba0 64 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  d].flags & MEM_N
1dbb0 75 6c 6c 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  ull)==0 );..  if
1dbc0 28 20 70 43 72 73 72 21 3d 30 20 29 7b 0a 20 20  ( pCrsr!=0 ){.  
1dbd0 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
1dbe0 65 20 69 6e 64 65 78 20 73 65 61 72 63 68 20 6b  e index search k
1dbf0 65 79 2e 20 2a 2f 0a 20 20 20 20 72 2e 70 4b 65  ey. */.    r.pKe
1dc00 79 49 6e 66 6f 20 3d 20 70 43 78 2d 3e 70 4b 65  yInfo = pCx->pKe
1dc10 79 49 6e 66 6f 3b 0a 20 20 20 20 72 2e 6e 46 69  yInfo;.    r.nFi
1dc20 65 6c 64 20 3d 20 6e 46 69 65 6c 64 20 2b 20 31  eld = nField + 1
1dc30 3b 0a 20 20 20 20 72 2e 66 6c 61 67 73 20 3d 20  ;.    r.flags = 
1dc40 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f  UNPACKED_PREFIX_
1dc50 53 45 41 52 43 48 3b 0a 20 20 20 20 72 2e 61 4d  SEARCH;.    r.aM
1dc60 65 6d 20 3d 20 61 4d 78 3b 0a 23 69 66 64 65 66  em = aMx;.#ifdef
1dc70 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1dc80 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28 69    { int i; for(i
1dc90 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20  =0; i<r.nField; 
1dca0 69 2b 2b 29 20 61 73 73 65 72 74 28 20 6d 65 6d  i++) assert( mem
1dcb0 49 73 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b  IsValid(&r.aMem[
1dcc0 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a  i]) ); }.#endif.
1dcd0 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20  .    /* Extract 
1dce0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 52 20 66  the value of R f
1dcf0 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50 33 2e  rom register P3.
1dd00 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
1dd10 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79  dbeMemIntegerify
1dd20 28 70 49 6e 33 29 3b 0a 20 20 20 20 52 20 3d 20  (pIn3);.    R = 
1dd30 70 49 6e 33 2d 3e 75 2e 69 3b 0a 0a 20 20 20 20  pIn3->u.i;..    
1dd40 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 42 2d  /* Search the B-
1dd50 54 72 65 65 20 69 6e 64 65 78 2e 20 49 66 20 6e  Tree index. If n
1dd60 6f 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 65  o conflicting re
1dd70 63 6f 72 64 20 69 73 20 66 6f 75 6e 64 2c 20 6a  cord is found, j
1dd80 75 6d 70 0a 20 20 20 20 2a 2a 20 74 6f 20 50 32  ump.    ** to P2
1dd90 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 63 6f 70  . Otherwise, cop
1dda0 79 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  y the rowid of t
1ddb0 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72  he conflicting r
1ddc0 65 63 6f 72 64 20 74 6f 0a 20 20 20 20 2a 2a 20  ecord to.    ** 
1ddd0 72 65 67 69 73 74 65 72 20 50 33 20 61 6e 64 20  register P3 and 
1dde0 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
1ddf0 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
1de00 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 72 63  tion.  */.    rc
1de10 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
1de20 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
1de30 72 73 72 2c 20 26 72 2c 20 30 2c 20 30 2c 20 26  rsr, &r, 0, 0, &
1de40 70 43 78 2d 3e 73 65 65 6b 52 65 73 75 6c 74 29  pCx->seekResult)
1de50 3b 0a 20 20 20 20 69 66 28 20 28 72 2e 66 6c 61  ;.    if( (r.fla
1de60 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs & UNPACKED_PR
1de70 45 46 49 58 5f 53 45 41 52 43 48 29 20 7c 7c 20  EFIX_SEARCH) || 
1de80 72 2e 72 6f 77 69 64 3d 3d 52 20 29 7b 0a 20 20  r.rowid==R ){.  
1de90 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
1dea0 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
1deb0 0a 20 20 20 20 20 20 70 49 6e 33 2d 3e 75 2e 69  .      pIn3->u.i
1dec0 20 3d 20 72 2e 72 6f 77 69 64 3b 0a 20 20 20 20   = r.rowid;.    
1ded0 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  }.  }.  break;.}
1dee0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74  ../* Opcode: Not
1def0 45 78 69 73 74 73 20 50 31 20 50 32 20 50 33 20  Exists P1 P2 P3 
1df00 2a 20 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  * *.**.** Use th
1df10 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67  e content of reg
1df20 69 73 74 65 72 20 50 33 20 61 73 20 61 6e 20 69  ister P3 as an i
1df30 6e 74 65 67 65 72 20 6b 65 79 2e 20 20 49 66 20  nteger key.  If 
1df40 61 20 72 65 63 6f 72 64 20 0a 2a 2a 20 77 69 74  a record .** wit
1df50 68 20 74 68 61 74 20 6b 65 79 20 64 6f 65 73 20  h that key does 
1df60 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 61 62  not exist in tab
1df70 6c 65 20 6f 66 20 50 31 2c 20 74 68 65 6e 20 6a  le of P1, then j
1df80 75 6d 70 20 74 6f 20 50 32 2e 20 0a 2a 2a 20 49  ump to P2. .** I
1df90 66 20 74 68 65 20 72 65 63 6f 72 64 20 64 6f 65  f the record doe
1dfa0 73 20 65 78 69 73 74 2c 20 74 68 65 6e 20 66 61  s exist, then fa
1dfb0 6c 6c 20 74 68 72 6f 75 67 68 2e 20 20 54 68 65  ll through.  The
1dfc0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
1dfd0 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  .** pointing to 
1dfe0 74 68 65 20 72 65 63 6f 72 64 20 69 66 20 69 74  the record if it
1dff0 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54   exists..**.** T
1e000 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
1e010 74 77 65 65 6e 20 74 68 69 73 20 6f 70 65 72 61  tween this opera
1e020 74 69 6f 6e 20 61 6e 64 20 4e 6f 74 46 6f 75 6e  tion and NotFoun
1e030 64 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  d is that this.*
1e040 2a 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 73 75  * operation assu
1e050 6d 65 73 20 74 68 65 20 6b 65 79 20 69 73 20 61  mes the key is a
1e060 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20 74 68  n integer and th
1e070 61 74 20 50 31 20 69 73 20 61 20 74 61 62 6c 65  at P1 is a table
1e080 20 77 68 65 72 65 61 73 0a 2a 2a 20 4e 6f 74 46   whereas.** NotF
1e090 6f 75 6e 64 20 61 73 73 75 6d 65 73 20 6b 65 79  ound assumes key
1e0a0 20 69 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74   is a blob const
1e0b0 72 75 63 74 65 64 20 66 72 6f 6d 20 4d 61 6b 65  ructed from Make
1e0c0 52 65 63 6f 72 64 20 61 6e 64 0a 2a 2a 20 50 31  Record and.** P1
1e0d0 20 69 73 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2a   is an index..**
1e0e0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f  .** See also: Fo
1e0f0 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 49  und, NotFound, I
1e100 73 55 6e 69 71 75 65 0a 2a 2f 0a 63 61 73 65 20  sUnique.*/.case 
1e110 4f 50 5f 4e 6f 74 45 78 69 73 74 73 3a 20 7b 20  OP_NotExists: { 
1e120 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
1e130 69 6e 33 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  in3 */.  VdbeCur
1e140 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72  sor *pC;.  BtCur
1e150 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e  sor *pCrsr;.  in
1e160 74 20 72 65 73 3b 0a 20 20 75 36 34 20 69 4b 65  t res;.  u64 iKe
1e170 79 3b 0a 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d  y;..  pIn3 = &aM
1e180 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61  em[pOp->p3];.  a
1e190 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61  ssert( pIn3->fla
1e1a0 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a  gs & MEM_Int );.
1e1b0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1e1c0 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
1e1d0 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
1e1e0 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
1e1f0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
1e200 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
1e210 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65  ert( pC->isTable
1e220 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1e230 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67  ->pseudoTableReg
1e240 3d 3d 30 20 29 3b 0a 20 20 70 43 72 73 72 20 3d  ==0 );.  pCrsr =
1e250 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20   pC->pCursor;.  
1e260 69 66 28 20 41 4c 57 41 59 53 28 70 43 72 73 72  if( ALWAYS(pCrsr
1e270 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 73 20  !=0) ){.    res 
1e280 3d 20 30 3b 0a 20 20 20 20 69 4b 65 79 20 3d 20  = 0;.    iKey = 
1e290 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 20 20 72  pIn3->u.i;.    r
1e2a0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1e2b0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
1e2c0 43 72 73 72 2c 20 30 2c 20 69 4b 65 79 2c 20 30  Crsr, 0, iKey, 0
1e2d0 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 70 43 2d  , &res);.    pC-
1e2e0 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 49 6e  >lastRowid = pIn
1e2f0 33 2d 3e 75 2e 69 3b 0a 20 20 20 20 70 43 2d 3e  3->u.i;.    pC->
1e300 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 72  rowidIsValid = r
1e310 65 73 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 20 20  es==0 ?1:0;.    
1e320 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b  pC->nullRow = 0;
1e330 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74  .    pC->cacheSt
1e340 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
1e350 4c 45 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66 65  LE;.    pC->defe
1e360 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a  rredMoveto = 0;.
1e370 20 20 20 20 69 66 28 20 72 65 73 21 3d 30 20 29      if( res!=0 )
1e380 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70  {.      pc = pOp
1e390 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20 20  ->p2 - 1;.      
1e3a0 61 73 73 65 72 74 28 20 70 43 2d 3e 72 6f 77 69  assert( pC->rowi
1e3b0 64 49 73 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20  dIsValid==0 );. 
1e3c0 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e 73 65 65     }.    pC->see
1e3d0 6b 52 65 73 75 6c 74 20 3d 20 72 65 73 3b 0a 20  kResult = res;. 
1e3e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
1e3f0 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
1e400 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6f   an attempt to o
1e410 70 65 6e 20 61 20 72 65 61 64 20 63 75 72 73 6f  pen a read curso
1e420 72 20 6f 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a  r on the .    **
1e430 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
1e440 61 62 6c 65 20 72 65 74 75 72 6e 73 20 53 51 4c  able returns SQL
1e450 49 54 45 5f 45 4d 50 54 59 2e 0a 20 20 20 20 2a  ITE_EMPTY..    *
1e460 2f 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e  /.    pc = pOp->
1e470 70 32 20 2d 20 31 3b 0a 20 20 20 20 61 73 73 65  p2 - 1;.    asse
1e480 72 74 28 20 70 43 2d 3e 72 6f 77 69 64 49 73 56  rt( pC->rowidIsV
1e490 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20 70  alid==0 );.    p
1e4a0 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d 20  C->seekResult = 
1e4b0 30 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  0;.  }.  break;.
1e4c0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65  }../* Opcode: Se
1e4d0 71 75 65 6e 63 65 20 50 31 20 50 32 20 2a 20 2a  quence P1 P2 * *
1e4e0 20 2a 0a 2a 2a 0a 2a 2a 20 46 69 6e 64 20 74 68   *.**.** Find th
1e4f0 65 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  e next available
1e500 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72   sequence number
1e510 20 66 6f 72 20 63 75 72 73 6f 72 20 50 31 2e 0a   for cursor P1..
1e520 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 71  ** Write the seq
1e530 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 69 6e 74  uence number int
1e540 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  o register P2..*
1e550 2a 20 54 68 65 20 73 65 71 75 65 6e 63 65 20 6e  * The sequence n
1e560 75 6d 62 65 72 20 6f 6e 20 74 68 65 20 63 75 72  umber on the cur
1e570 73 6f 72 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  sor is increment
1e580 65 64 20 61 66 74 65 72 20 74 68 69 73 0a 2a 2a  ed after this.**
1e590 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a   instruction.  .
1e5a0 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 71 75 65  */.case OP_Seque
1e5b0 6e 63 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20  nce: {          
1e5c0 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65   /* out2-prerele
1e5d0 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ase */.  assert(
1e5e0 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
1e5f0 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
1e600 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
1e610 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
1e620 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75  !=0 );.  pOut->u
1e630 2e 69 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  .i = p->apCsr[pO
1e640 70 2d 3e 70 31 5d 2d 3e 73 65 71 43 6f 75 6e 74  p->p1]->seqCount
1e650 2b 2b 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  ++;.  break;.}..
1e660 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 77 52  ./* Opcode: NewR
1e670 6f 77 69 64 20 50 31 20 50 32 20 50 33 20 2a 20  owid P1 P2 P3 * 
1e680 2a 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61 20 6e 65  *.**.** Get a ne
1e690 77 20 69 6e 74 65 67 65 72 20 72 65 63 6f 72 64  w integer record
1e6a0 20 6e 75 6d 62 65 72 20 28 61 2e 6b 2e 61 20 22   number (a.k.a "
1e6b0 72 6f 77 69 64 22 29 20 75 73 65 64 20 61 73 20  rowid") used as 
1e6c0 74 68 65 20 6b 65 79 20 74 6f 20 61 20 74 61 62  the key to a tab
1e6d0 6c 65 2e 0a 2a 2a 20 54 68 65 20 72 65 63 6f 72  le..** The recor
1e6e0 64 20 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20  d number is not 
1e6f0 70 72 65 76 69 6f 75 73 6c 79 20 75 73 65 64 20  previously used 
1e700 61 73 20 61 20 6b 65 79 20 69 6e 20 74 68 65 20  as a key in the 
1e710 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
1e720 65 20 74 68 61 74 20 63 75 72 73 6f 72 20 50 31  e that cursor P1
1e730 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 54 68 65   points to.  The
1e740 20 6e 65 77 20 72 65 63 6f 72 64 20 6e 75 6d 62   new record numb
1e750 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  er is written.**
1e760 20 77 72 69 74 74 65 6e 20 74 6f 20 72 65 67 69   written to regi
1e770 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49  ster P2..**.** I
1e780 66 20 50 33 3e 30 20 74 68 65 6e 20 50 33 20 69  f P3>0 then P3 i
1e790 73 20 61 20 72 65 67 69 73 74 65 72 20 69 6e 20  s a register in 
1e7a0 74 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 6f  the root frame o
1e7b0 66 20 74 68 69 73 20 56 44 42 45 20 74 68 61 74  f this VDBE that
1e7c0 20 68 6f 6c 64 73 20 0a 2a 2a 20 74 68 65 20 6c   holds .** the l
1e7d0 61 72 67 65 73 74 20 70 72 65 76 69 6f 75 73 6c  argest previousl
1e7e0 79 20 67 65 6e 65 72 61 74 65 64 20 72 65 63 6f  y generated reco
1e7f0 72 64 20 6e 75 6d 62 65 72 2e 20 4e 6f 20 6e 65  rd number. No ne
1e800 77 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 73  w record numbers
1e810 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20   are.** allowed 
1e820 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  to be less than 
1e830 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e  this value. When
1e840 20 74 68 69 73 20 76 61 6c 75 65 20 72 65 61 63   this value reac
1e850 68 65 73 20 69 74 73 20 6d 61 78 69 6d 75 6d 2c  hes its maximum,
1e860 20 0a 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f 46   .** an SQLITE_F
1e870 55 4c 4c 20 65 72 72 6f 72 20 69 73 20 67 65 6e  ULL error is gen
1e880 65 72 61 74 65 64 2e 20 54 68 65 20 50 33 20 72  erated. The P3 r
1e890 65 67 69 73 74 65 72 20 69 73 20 75 70 64 61 74  egister is updat
1e8a0 65 64 20 77 69 74 68 20 74 68 65 20 27 0a 2a 2a  ed with the '.**
1e8b0 20 67 65 6e 65 72 61 74 65 64 20 72 65 63 6f 72   generated recor
1e8c0 64 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 50  d number. This P
1e8d0 33 20 6d 65 63 68 61 6e 69 73 6d 20 69 73 20 75  3 mechanism is u
1e8e0 73 65 64 20 74 6f 20 68 65 6c 70 20 69 6d 70 6c  sed to help impl
1e8f0 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 41 55 54  ement the.** AUT
1e900 4f 49 4e 43 52 45 4d 45 4e 54 20 66 65 61 74 75  OINCREMENT featu
1e910 72 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e  re..*/.case OP_N
1e920 65 77 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20  ewRowid: {      
1e930 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65       /* out2-pre
1e940 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 36 34  release */.  i64
1e950 20 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   v;             
1e960 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72      /* The new r
1e970 6f 77 69 64 20 2a 2f 0a 20 20 56 64 62 65 43 75  owid */.  VdbeCu
1e980 72 73 6f 72 20 2a 70 43 3b 20 20 20 20 20 20 20  rsor *pC;       
1e990 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 61   /* Cursor of ta
1e9a0 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20 6e  ble to get the n
1e9b0 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e  ew rowid */.  in
1e9c0 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
1e9d0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
1e9e0 66 20 61 6e 20 73 71 6c 69 74 65 33 42 74 72 65  f an sqlite3Btre
1e9f0 65 4c 61 73 74 28 29 20 2a 2f 0a 20 20 69 6e 74  eLast() */.  int
1ea00 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
1ea10 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 74      /* Counter t
1ea20 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d 62  o limit the numb
1ea30 65 72 20 6f 66 20 73 65 61 72 63 68 65 73 20 2a  er of searches *
1ea40 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 20 20  /.  Mem *pMem;  
1ea50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ea60 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6c  gister holding l
1ea70 61 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f 72  argest rowid for
1ea80 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 2a   AUTOINCREMENT *
1ea90 2f 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70  /.  VdbeFrame *p
1eaa0 46 72 61 6d 65 3b 20 20 20 20 20 2f 2a 20 52 6f  Frame;     /* Ro
1eab0 6f 74 20 66 72 61 6d 65 20 6f 66 20 56 44 42 45  ot frame of VDBE
1eac0 20 2a 2f 0a 0a 20 20 76 20 3d 20 30 3b 0a 20 20   */..  v = 0;.  
1ead0 72 65 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  res = 0;.  asser
1eae0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
1eaf0 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
1eb00 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
1eb10 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
1eb20 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
1eb30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
1eb40 70 43 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 29 20  pC->pCursor==0) 
1eb50 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 7a 65  ){.    /* The ze
1eb60 72 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ro initializatio
1eb70 6e 20 61 62 6f 76 65 20 69 73 20 61 6c 6c 20 74  n above is all t
1eb80 68 61 74 20 69 73 20 6e 65 65 64 65 64 20 2a 2f  hat is needed */
1eb90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1eba0 20 54 68 65 20 6e 65 78 74 20 72 6f 77 69 64 20   The next rowid 
1ebb0 6f 72 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  or record number
1ebc0 20 28 64 69 66 66 65 72 65 6e 74 20 74 65 72 6d   (different term
1ebd0 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 0a 20  s for the same. 
1ebe0 20 20 20 2a 2a 20 74 68 69 6e 67 29 20 69 73 20     ** thing) is 
1ebf0 6f 62 74 61 69 6e 65 64 20 69 6e 20 61 20 74 77  obtained in a tw
1ec00 6f 2d 73 74 65 70 20 61 6c 67 6f 72 69 74 68 6d  o-step algorithm
1ec10 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1ec20 46 69 72 73 74 20 77 65 20 61 74 74 65 6d 70 74  First we attempt
1ec30 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72   to find the lar
1ec40 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 72 6f  gest existing ro
1ec50 77 69 64 20 61 6e 64 20 61 64 64 20 6f 6e 65 0a  wid and add one.
1ec60 20 20 20 20 2a 2a 20 74 6f 20 74 68 61 74 2e 20      ** to that. 
1ec70 20 42 75 74 20 69 66 20 74 68 65 20 6c 61 72 67   But if the larg
1ec80 65 73 74 20 65 78 69 73 74 69 6e 67 20 72 6f 77  est existing row
1ec90 69 64 20 69 73 20 61 6c 72 65 61 64 79 20 74 68  id is already th
1eca0 65 20 6d 61 78 69 6d 75 6d 0a 20 20 20 20 2a 2a  e maximum.    **
1ecb0 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
1ecc0 72 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 61  r, we have to fa
1ecd0 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
1ece0 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20  e second.    ** 
1ecf0 70 72 6f 62 61 62 69 6c 69 73 74 69 63 20 61 6c  probabilistic al
1ed00 67 6f 72 69 74 68 6d 0a 20 20 20 20 2a 2a 0a 20  gorithm.    **. 
1ed10 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64     ** The second
1ed20 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 74 6f   algorithm is to
1ed30 20 73 65 6c 65 63 74 20 61 20 72 6f 77 69 64 20   select a rowid 
1ed40 61 74 20 72 61 6e 64 6f 6d 20 61 6e 64 20 73 65  at random and se
1ed50 65 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20 61  e if.    ** it a
1ed60 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
1ed70 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49 66 20   the table.  If 
1ed80 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
1ed90 74 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a  t, we have.    *
1eda0 2a 20 73 75 63 63 65 65 64 65 64 2e 20 20 49 66  * succeeded.  If
1edb0 20 74 68 65 20 72 61 6e 64 6f 6d 20 72 6f 77 69   the random rowi
1edc0 64 20 64 6f 65 73 20 65 78 69 73 74 2c 20 77 65  d does exist, we
1edd0 20 73 65 6c 65 63 74 20 61 20 6e 65 77 20 6f 6e   select a new on
1ede0 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 72 79  e.    ** and try
1edf0 20 61 67 61 69 6e 2c 20 75 70 20 74 6f 20 31 30   again, up to 10
1ee00 30 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2f 0a  0 times..    */.
1ee10 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
1ee20 69 73 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 64  isTable );..#ifd
1ee30 65 66 20 53 51 4c 49 54 45 5f 33 32 42 49 54 5f  ef SQLITE_32BIT_
1ee40 52 4f 57 49 44 0a 23 20 20 20 64 65 66 69 6e 65  ROWID.#   define
1ee50 20 4d 41 58 5f 52 4f 57 49 44 20 30 78 37 66 66   MAX_ROWID 0x7ff
1ee60 66 66 66 66 66 0a 23 65 6c 73 65 0a 20 20 20 20  fffff.#else.    
1ee70 2f 2a 20 53 6f 6d 65 20 63 6f 6d 70 69 6c 65 72  /* Some compiler
1ee80 73 20 63 6f 6d 70 6c 61 69 6e 20 61 62 6f 75 74  s complain about
1ee90 20 63 6f 6e 73 74 61 6e 74 73 20 6f 66 20 74 68   constants of th
1eea0 65 20 66 6f 72 6d 20 30 78 37 66 66 66 66 66 66  e form 0x7ffffff
1eeb0 66 66 66 66 66 66 66 66 66 2e 0a 20 20 20 20 2a  fffffffff..    *
1eec0 2a 20 4f 74 68 65 72 73 20 63 6f 6d 70 6c 61 69  * Others complai
1eed0 6e 20 61 62 6f 75 74 20 30 78 37 66 66 66 66 66  n about 0x7fffff
1eee0 66 66 66 66 66 66 66 66 66 66 66 4c 4c 2e 20 20  fffffffffffLL.  
1eef0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  The following ma
1ef00 63 72 6f 20 73 65 65 6d 73 0a 20 20 20 20 2a 2a  cro seems.    **
1ef10 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
1ef20 63 6f 6e 73 74 61 6e 74 20 77 68 69 6c 65 20 6d  constant while m
1ef30 61 6b 69 6e 67 20 61 6c 6c 20 63 6f 6d 70 69 6c  aking all compil
1ef40 65 72 73 20 68 61 70 70 79 2e 0a 20 20 20 20 2a  ers happy..    *
1ef50 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58  /.#   define MAX
1ef60 5f 52 4f 57 49 44 20 20 28 69 36 34 29 28 20 28  _ROWID  (i64)( (
1ef70 28 28 75 36 34 29 30 78 37 66 66 66 66 66 66 66  ((u64)0x7fffffff
1ef80 29 3c 3c 33 32 29 20 7c 20 28 75 36 34 29 30 78  )<<32) | (u64)0x
1ef90 66 66 66 66 66 66 66 66 20 29 0a 23 65 6e 64 69  ffffffff ).#endi
1efa0 66 0a 0a 20 20 20 20 69 66 28 20 21 70 43 2d 3e  f..    if( !pC->
1efb0 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 29  useRandomRowid )
1efc0 7b 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69  {.      v = sqli
1efd0 74 65 33 42 74 72 65 65 47 65 74 43 61 63 68 65  te3BtreeGetCache
1efe0 64 52 6f 77 69 64 28 70 43 2d 3e 70 43 75 72 73  dRowid(pC->pCurs
1eff0 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76  or);.      if( v
1f000 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1f010 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1f020 4c 61 73 74 28 70 43 2d 3e 70 43 75 72 73 6f 72  Last(pC->pCursor
1f030 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20  , &res);.       
1f040 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f050 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1f060 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
1f070 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  o_error;.       
1f080 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
1f090 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
1f0a0 76 20 3d 20 31 3b 20 20 20 2f 2a 20 49 4d 50 3a  v = 1;   /* IMP:
1f0b0 20 52 2d 36 31 39 31 34 2d 34 38 30 37 34 20 2a   R-61914-48074 *
1f0c0 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
1f0d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1f0e0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
1f0f0 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 2d  ursorIsValid(pC-
1f100 3e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20  >pCursor) );.   
1f110 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1f120 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
1f130 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 76 29  pC->pCursor, &v)
1f140 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1f150 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
1f160 4b 20 29 3b 20 20 20 2f 2a 20 43 61 6e 6e 6f 74  K );   /* Cannot
1f170 20 66 61 69 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20   fail following 
1f180 42 74 72 65 65 4c 61 73 74 28 29 20 2a 2f 0a 20  BtreeLast() */. 
1f190 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3d 3d           if( v==
1f1a0 4d 41 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  MAX_ROWID ){.   
1f1b0 20 20 20 20 20 20 20 20 20 70 43 2d 3e 75 73 65           pC->use
1f1c0 52 61 6e 64 6f 6d 52 6f 77 69 64 20 3d 20 31 3b  RandomRowid = 1;
1f1d0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1f1e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2b  {.            v+
1f1f0 2b 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  +;   /* IMP: R-2
1f200 39 35 33 38 2d 33 34 39 38 37 20 2a 2f 0a 20 20  9538-34987 */.  
1f210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f220 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 23 69 66    }.      }..#if
1f230 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f240 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
1f250 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 33       if( pOp->p3
1f260 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
1f270 73 73 65 72 74 20 74 68 61 74 20 50 33 20 69 73  ssert that P3 is
1f280 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20   a valid memory 
1f290 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20  cell. */.       
1f2a0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
1f2b0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
1f2c0 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20  ( p->pFrame ){. 
1f2d0 20 20 20 20 20 20 20 20 20 66 6f 72 28 70 46 72           for(pFr
1f2e0 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70  ame=p->pFrame; p
1f2f0 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20  Frame->pParent; 
1f300 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70  pFrame=pFrame->p
1f310 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  Parent);.       
1f320 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61     /* Assert tha
1f330 74 20 50 33 20 69 73 20 61 20 76 61 6c 69 64 20  t P3 is a valid 
1f340 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a  memory cell. */.
1f350 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1f360 28 20 70 4f 70 2d 3e 70 33 3c 3d 70 46 72 61 6d  ( pOp->p3<=pFram
1f370 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20  e->nMem );.     
1f380 20 20 20 20 20 70 4d 65 6d 20 3d 20 26 70 46 72       pMem = &pFr
1f390 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70  ame->aMem[pOp->p
1f3a0 33 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  3];.        }els
1f3b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1f3c0 41 73 73 65 72 74 20 74 68 61 74 20 50 33 20 69  Assert that P3 i
1f3d0 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79  s a valid memory
1f3e0 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   cell. */.      
1f3f0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
1f400 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a  >p3<=p->nMem );.
1f410 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d            pMem =
1f420 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
1f430 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 41 62  .          memAb
1f440 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70  outToChange(p, p
1f450 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Mem);.        }.
1f460 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1f470 6d 65 6d 49 73 56 61 6c 69 64 28 70 4d 65 6d 29  memIsValid(pMem)
1f480 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 52 45 47   );..        REG
1f490 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
1f4a0 3e 70 33 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  >p3, pMem);.    
1f4b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1f4c0 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 4d 65  emIntegerify(pMe
1f4d0 6d 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  m);.        asse
1f4e0 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73  rt( (pMem->flags
1f4f0 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29   & MEM_Int)!=0 )
1f500 3b 20 20 2f 2a 20 6d 65 6d 28 50 33 29 20 68 6f  ;  /* mem(P3) ho
1f510 6c 64 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a  lds an integer *
1f520 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  /.        if( pM
1f530 65 6d 2d 3e 75 2e 69 3d 3d 4d 41 58 5f 52 4f 57  em->u.i==MAX_ROW
1f540 49 44 20 7c 7c 20 70 43 2d 3e 75 73 65 52 61 6e  ID || pC->useRan
1f550 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  domRowid ){.    
1f560 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1f570 45 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50  E_FULL;   /* IMP
1f580 3a 20 52 2d 31 32 32 37 35 2d 36 31 33 33 38 20  : R-12275-61338 
1f590 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
1f5a0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
1f5b0 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rror;.        }.
1f5c0 20 20 20 20 20 20 20 20 69 66 28 20 76 3c 70 4d          if( v<pM
1f5d0 65 6d 2d 3e 75 2e 69 2b 31 20 29 7b 0a 20 20 20  em->u.i+1 ){.   
1f5e0 20 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d         v = pMem-
1f5f0 3e 75 2e 69 20 2b 20 31 3b 0a 20 20 20 20 20 20  >u.i + 1;.      
1f600 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4d 65 6d    }.        pMem
1f610 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 20 20 20  ->u.i = v;.     
1f620 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
1f630 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
1f640 43 61 63 68 65 64 52 6f 77 69 64 28 70 43 2d 3e  CachedRowid(pC->
1f650 70 43 75 72 73 6f 72 2c 20 76 3c 4d 41 58 5f 52  pCursor, v<MAX_R
1f660 4f 57 49 44 20 3f 20 76 2b 31 20 3a 20 30 29 3b  OWID ? v+1 : 0);
1f670 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1f680 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69  C->useRandomRowi
1f690 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 4d  d ){.      /* IM
1f6a0 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
1f6b0 20 52 2d 30 37 36 37 37 2d 34 31 38 38 31 20 49   R-07677-41881 I
1f6c0 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 52 4f  f the largest RO
1f6d0 57 49 44 20 69 73 20 65 71 75 61 6c 20 74 6f 20  WID is equal to 
1f6e0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72  the.      ** lar
1f6f0 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 69 6e  gest possible in
1f700 74 65 67 65 72 20 28 39 32 32 33 33 37 32 30 33  teger (922337203
1f710 36 38 35 34 37 37 35 38 30 37 29 20 74 68 65 6e  6854775807) then
1f720 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1f730 20 20 20 20 2a 2a 20 65 6e 67 69 6e 65 20 73 74      ** engine st
1f740 61 72 74 73 20 70 69 63 6b 69 6e 67 20 70 6f 73  arts picking pos
1f750 69 74 69 76 65 20 63 61 6e 64 69 64 61 74 65 20  itive candidate 
1f760 52 4f 57 49 44 73 20 61 74 20 72 61 6e 64 6f 6d  ROWIDs at random
1f770 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 2a 2a 20   until.      ** 
1f780 69 74 20 66 69 6e 64 73 20 6f 6e 65 20 74 68 61  it finds one tha
1f790 74 20 69 73 20 6e 6f 74 20 70 72 65 76 69 6f 75  t is not previou
1f7a0 73 6c 79 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20  sly used. */.   
1f7b0 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
1f7c0 70 33 3d 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20  p3==0 );  /* We 
1f7d0 63 61 6e 6e 6f 74 20 62 65 20 69 6e 20 72 61 6e  cannot be in ran
1f7e0 64 6f 6d 20 72 6f 77 69 64 20 6d 6f 64 65 20 69  dom rowid mode i
1f7f0 66 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20  f this is.      
1f800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f810 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 41 55 54         ** an AUT
1f820 4f 49 4e 43 52 45 4d 45 4e 54 20 74 61 62 6c 65  OINCREMENT table
1f830 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 6f 6e  . */.      /* on
1f840 20 74 68 65 20 66 69 72 73 74 20 61 74 74 65 6d   the first attem
1f850 70 74 2c 20 73 69 6d 70 6c 79 20 64 6f 20 6f 6e  pt, simply do on
1f860 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 72 65 76  e more than prev
1f870 69 6f 75 73 20 2a 2f 0a 20 20 20 20 20 20 76 20  ious */.      v 
1f880 3d 20 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 20  = lastRowid;.   
1f890 20 20 20 76 20 26 3d 20 28 4d 41 58 5f 52 4f 57     v &= (MAX_ROW
1f8a0 49 44 3e 3e 31 29 3b 20 2f 2a 20 65 6e 73 75 72  ID>>1); /* ensur
1f8b0 65 20 64 6f 65 73 6e 27 74 20 67 6f 20 6e 65 67  e doesn't go neg
1f8c0 61 74 69 76 65 20 2a 2f 0a 20 20 20 20 20 20 76  ative */.      v
1f8d0 2b 2b 3b 20 2f 2a 20 65 6e 73 75 72 65 20 6e 6f  ++; /* ensure no
1f8e0 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20  n-zero */.      
1f8f0 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  cnt = 0;.      w
1f900 68 69 6c 65 28 20 20 20 28 28 72 63 20 3d 20 73  hile(   ((rc = s
1f910 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
1f920 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 70 43  oUnpacked(pC->pC
1f930 75 72 73 6f 72 2c 20 30 2c 20 28 75 36 34 29 76  ursor, 0, (u64)v
1f940 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f970 20 20 20 30 2c 20 26 72 65 73 29 29 3d 3d 53 51     0, &res))==SQ
1f980 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20 20  LITE_OK).       
1f990 20 20 20 20 20 26 26 20 28 72 65 73 3d 3d 30 29       && (res==0)
1f9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
1f9b0 28 2b 2b 63 6e 74 3c 31 30 30 29 29 7b 0a 20 20  (++cnt<100)){.  
1f9c0 20 20 20 20 20 20 2f 2a 20 63 6f 6c 6c 69 73 69        /* collisi
1f9d0 6f 6e 20 2d 20 74 72 79 20 61 6e 6f 74 68 65 72  on - try another
1f9e0 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20 2a 2f   random rowid */
1f9f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1fa00 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
1fa10 6f 66 28 76 29 2c 20 26 76 29 3b 0a 20 20 20 20  of(v), &v);.    
1fa20 20 20 20 20 69 66 28 20 63 6e 74 3c 35 20 29 7b      if( cnt<5 ){
1fa30 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72  .          /* tr
1fa40 79 20 22 73 6d 61 6c 6c 22 20 72 61 6e 64 6f 6d  y "small" random
1fa50 20 72 6f 77 69 64 73 20 66 6f 72 20 74 68 65 20   rowids for the 
1fa60 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 73  initial attempts
1fa70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 20   */.          v 
1fa80 26 3d 20 30 78 66 66 66 66 66 66 3b 0a 20 20 20  &= 0xffffff;.   
1fa90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1faa0 20 20 20 20 20 20 76 20 26 3d 20 28 4d 41 58 5f        v &= (MAX_
1fab0 52 4f 57 49 44 3e 3e 31 29 3b 20 2f 2a 20 65 6e  ROWID>>1); /* en
1fac0 73 75 72 65 20 64 6f 65 73 6e 27 74 20 67 6f 20  sure doesn't go 
1fad0 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 20 20  negative */.    
1fae0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 76 2b      }.        v+
1faf0 2b 3b 20 2f 2a 20 65 6e 73 75 72 65 20 6e 6f 6e  +; /* ensure non
1fb00 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 7d  -zero */.      }
1fb10 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1fb20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 3d  QLITE_OK && res=
1fb30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1fb40 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 20   = SQLITE_FULL; 
1fb50 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 38 32 31    /* IMP: R-3821
1fb60 39 2d 35 33 30 30 32 20 2a 2f 0a 20 20 20 20 20  9-53002 */.     
1fb70 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
1fb80 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
1fb90 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
1fba0 28 20 76 3e 30 20 29 3b 20 20 2f 2a 20 45 56 3a  ( v>0 );  /* EV:
1fbb0 20 52 2d 34 30 38 31 32 2d 30 33 35 37 30 20 2a   R-40812-03570 *
1fbc0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e  /.    }.    pC->
1fbd0 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30  rowidIsValid = 0
1fbe0 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72  ;.    pC->deferr
1fbf0 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
1fc00 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
1fc10 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
1fc20 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69  .  }.  pOut->u.i
1fc30 20 3d 20 76 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d   = v;.  break;.}
1fc40 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 73  ../* Opcode: Ins
1fc50 65 72 74 20 50 31 20 50 32 20 50 33 20 50 34 20  ert P1 P2 P3 P4 
1fc60 50 35 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61  P5.**.** Write a
1fc70 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
1fc80 20 74 61 62 6c 65 20 6f 66 20 63 75 72 73 6f 72   table of cursor
1fc90 20 50 31 2e 20 20 41 20 6e 65 77 20 65 6e 74 72   P1.  A new entr
1fca0 79 20 69 73 0a 2a 2a 20 63 72 65 61 74 65 64 20  y is.** created 
1fcb0 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 61 6c  if it doesn't al
1fcc0 72 65 61 64 79 20 65 78 69 73 74 20 6f 72 20 74  ready exist or t
1fcd0 68 65 20 64 61 74 61 20 66 6f 72 20 61 6e 20 65  he data for an e
1fce0 78 69 73 74 69 6e 67 0a 2a 2a 20 65 6e 74 72 79  xisting.** entry
1fcf0 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 2e   is overwritten.
1fd00 20 20 54 68 65 20 64 61 74 61 20 69 73 20 74 68    The data is th
1fd10 65 20 76 61 6c 75 65 20 4d 45 4d 5f 42 6c 6f 62  e value MEM_Blob
1fd20 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
1fd30 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 32  ter.** number P2
1fd40 2e 20 54 68 65 20 6b 65 79 20 69 73 20 73 74 6f  . The key is sto
1fd50 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
1fd60 50 33 2e 20 54 68 65 20 6b 65 79 20 6d 75 73 74  P3. The key must
1fd70 0a 2a 2a 20 62 65 20 61 20 4d 45 4d 5f 49 6e 74  .** be a MEM_Int
1fd80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f  ..**.** If the O
1fd90 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 66 6c  PFLAG_NCHANGE fl
1fda0 61 67 20 6f 66 20 50 35 20 69 73 20 73 65 74 2c  ag of P5 is set,
1fdb0 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 63 68   then the row ch
1fdc0 61 6e 67 65 20 63 6f 75 6e 74 20 69 73 0a 2a 2a  ange count is.**
1fdd0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 28 6f 74   incremented (ot
1fde0 68 65 72 77 69 73 65 20 6e 6f 74 29 2e 20 20 49  herwise not).  I
1fdf0 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4c 41 53  f the OPFLAG_LAS
1fe00 54 52 4f 57 49 44 20 66 6c 61 67 20 6f 66 20 50  TROWID flag of P
1fe10 35 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  5 is set,.** the
1fe20 6e 20 72 6f 77 69 64 20 69 73 20 73 74 6f 72 65  n rowid is store
1fe30 64 20 66 6f 72 20 73 75 62 73 65 71 75 65 6e 74  d for subsequent
1fe40 20 72 65 74 75 72 6e 20 62 79 20 74 68 65 0a 2a   return by the.*
1fe50 2a 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  * sqlite3_last_i
1fe60 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 66 75  nsert_rowid() fu
1fe70 6e 63 74 69 6f 6e 20 28 6f 74 68 65 72 77 69 73  nction (otherwis
1fe80 65 20 69 74 20 69 73 20 75 6e 6d 6f 64 69 66 69  e it is unmodifi
1fe90 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ed)..**.** If th
1fea0 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  e OPFLAG_USESEEK
1feb0 52 45 53 55 4c 54 20 66 6c 61 67 20 6f 66 20 50  RESULT flag of P
1fec0 35 20 69 73 20 73 65 74 20 61 6e 64 20 69 66 20  5 is set and if 
1fed0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
1fee0 20 74 68 65 20 6c 61 73 74 20 73 65 65 6b 20 6f   the last seek o
1fef0 70 65 72 61 74 69 6f 6e 20 28 4f 50 5f 4e 6f 74  peration (OP_Not
1ff00 45 78 69 73 74 73 29 20 77 61 73 20 61 20 73 75  Exists) was a su
1ff10 63 63 65 73 73 2c 20 74 68 65 6e 20 74 68 69 73  ccess, then this
1ff20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 77 69  .** operation wi
1ff30 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  ll not attempt t
1ff40 6f 20 66 69 6e 64 20 74 68 65 20 61 70 70 72 6f  o find the appro
1ff50 70 72 69 61 74 65 20 72 6f 77 20 62 65 66 6f 72  priate row befor
1ff60 65 20 64 6f 69 6e 67 0a 2a 2a 20 74 68 65 20 69  e doing.** the i
1ff70 6e 73 65 72 74 20 62 75 74 20 77 69 6c 6c 20 69  nsert but will i
1ff80 6e 73 74 65 61 64 20 6f 76 65 72 77 72 69 74 65  nstead overwrite
1ff90 20 74 68 65 20 72 6f 77 20 74 68 61 74 20 74 68   the row that th
1ffa0 65 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63  e cursor is.** c
1ffb0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
1ffc0 67 20 74 6f 2e 20 20 50 72 65 73 75 6d 61 62 6c  g to.  Presumabl
1ffd0 79 2c 20 74 68 65 20 70 72 69 6f 72 20 4f 50 5f  y, the prior OP_
1ffe0 4e 6f 74 45 78 69 73 74 73 20 6f 70 63 6f 64 65  NotExists opcode
1fff0 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
20000 70 6f 73 69 74 69 6f 6e 65 64 20 74 68 65 20 63  positioned the c
20010 75 72 73 6f 72 20 63 6f 72 72 65 63 74 6c 79 2e  ursor correctly.
20020 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74    This is an opt
20030 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 74 68 61  imization.** tha
20040 74 20 62 6f 6f 73 74 73 20 70 65 72 66 6f 72 6d  t boosts perform
20050 61 6e 63 65 20 62 79 20 61 76 6f 69 64 69 6e 67  ance by avoiding
20060 20 72 65 64 75 6e 64 61 6e 74 20 73 65 65 6b 73   redundant seeks
20070 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f  ..**.** If the O
20080 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 20 66  PFLAG_ISUPDATE f
20090 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
200a0 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   this opcode is 
200b0 70 61 72 74 20 6f 66 20 61 6e 0a 2a 2a 20 55 50  part of an.** UP
200c0 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2e 20  DATE operation. 
200d0 20 4f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   Otherwise (if t
200e0 68 65 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  he flag is clear
200f0 29 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63 6f  ) then this opco
20100 64 65 0a 2a 2a 20 69 73 20 70 61 72 74 20 6f 66  de.** is part of
20110 20 61 6e 20 49 4e 53 45 52 54 20 6f 70 65 72 61   an INSERT opera
20120 74 69 6f 6e 2e 20 20 54 68 65 20 64 69 66 66 65  tion.  The diffe
20130 72 65 6e 63 65 20 69 73 20 6f 6e 6c 79 20 69 6d  rence is only im
20140 70 6f 72 74 61 6e 74 20 74 6f 0a 2a 2a 20 74 68  portant to.** th
20150 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 2e 0a 2a  e update hook..*
20160 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 50  *.** Parameter P
20170 34 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61  4 may point to a
20180 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
20190 6e 67 20 74 68 65 20 74 61 62 6c 65 2d 6e 61 6d  ng the table-nam
201a0 65 2c 20 6f 72 0a 2a 2a 20 6d 61 79 20 62 65 20  e, or.** may be 
201b0 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20 6e  NULL. If it is n
201c0 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
201d0 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 0a 2a  e update-hook .*
201e0 2a 20 28 73 71 6c 69 74 65 33 2e 78 55 70 64 61  * (sqlite3.xUpda
201f0 74 65 43 61 6c 6c 62 61 63 6b 29 20 69 73 20 69  teCallback) is i
20200 6e 76 6f 6b 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  nvoked following
20210 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 69 6e   a successful in
20220 73 65 72 74 2e 0a 2a 2a 0a 2a 2a 20 28 57 41 52  sert..**.** (WAR
20230 4e 49 4e 47 2f 54 4f 44 4f 3a 20 49 66 20 50 31  NING/TODO: If P1
20240 20 69 73 20 61 20 70 73 65 75 64 6f 2d 63 75 72   is a pseudo-cur
20250 73 6f 72 20 61 6e 64 20 50 32 20 69 73 20 64 79  sor and P2 is dy
20260 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c  namically.** all
20270 6f 63 61 74 65 64 2c 20 74 68 65 6e 20 6f 77 6e  ocated, then own
20280 65 72 73 68 69 70 20 6f 66 20 50 32 20 69 73 20  ership of P2 is 
20290 74 72 61 6e 73 66 65 72 72 65 64 20 74 6f 20 74  transferred to t
202a0 68 65 20 70 73 65 75 64 6f 2d 63 75 72 73 6f 72  he pseudo-cursor
202b0 0a 2a 2a 20 61 6e 64 20 72 65 67 69 73 74 65 72  .** and register
202c0 20 50 32 20 62 65 63 6f 6d 65 73 20 65 70 68 65   P2 becomes ephe
202d0 6d 65 72 61 6c 2e 20 20 49 66 20 74 68 65 20 63  meral.  If the c
202e0 75 72 73 6f 72 20 69 73 20 63 68 61 6e 67 65 64  ursor is changed
202f0 2c 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  , the.** value o
20300 66 20 72 65 67 69 73 74 65 72 20 50 32 20 77 69  f register P2 wi
20310 6c 6c 20 74 68 65 6e 20 63 68 61 6e 67 65 2e 20  ll then change. 
20320 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20   Make sure this 
20330 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 61 75 73  does not.** caus
20340 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 29  e any problems.)
20350 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74  .**.** This inst
20360 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72  ruction only wor
20370 6b 73 20 6f 6e 20 74 61 62 6c 65 73 2e 20 20 54  ks on tables.  T
20380 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e  he equivalent in
20390 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72  struction.** for
203a0 20 69 6e 64 69 63 65 73 20 69 73 20 4f 50 5f 49   indices is OP_I
203b0 64 78 49 6e 73 65 72 74 2e 0a 2a 2f 0a 2f 2a 20  dxInsert..*/./* 
203c0 4f 70 63 6f 64 65 3a 20 49 6e 73 65 72 74 49 6e  Opcode: InsertIn
203d0 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  t P1 P2 P3 P4 P5
203e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
203f0 73 20 65 78 61 63 74 6c 79 20 6c 69 6b 65 20 4f  s exactly like O
20400 50 5f 49 6e 73 65 72 74 20 65 78 63 65 70 74 20  P_Insert except 
20410 74 68 61 74 20 74 68 65 20 6b 65 79 20 69 73 20  that the key is 
20420 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 76  the.** integer v
20430 61 6c 75 65 20 50 33 2c 20 6e 6f 74 20 74 68 65  alue P3, not the
20440 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
20450 74 65 67 65 72 20 73 74 6f 72 65 64 20 69 6e 20  teger stored in 
20460 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2f 0a  register P3..*/.
20470 63 61 73 65 20 4f 50 5f 49 6e 73 65 72 74 3a 20  case OP_Insert: 
20480 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65 72 74 49  .case OP_InsertI
20490 6e 74 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 44 61  nt: {.  Mem *pDa
204a0 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d  ta;       /* MEM
204b0 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 64 61   cell holding da
204c0 74 61 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ta for the recor
204d0 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  d to be inserted
204e0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4b 65 79 3b   */.  Mem *pKey;
204f0 20 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 20 63          /* MEM c
20500 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 6b 65 79 20  ell holding key 
20510 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20   for the record 
20520 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 3b 20 20  */.  i64 iKey;  
20530 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
20540 74 65 67 65 72 20 52 4f 57 49 44 20 6f 72 20 6b  teger ROWID or k
20550 65 79 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ey for the recor
20560 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  d to be inserted
20570 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
20580 20 2a 70 43 3b 20 20 20 2f 2a 20 43 75 72 73 6f   *pC;   /* Curso
20590 72 20 74 6f 20 74 61 62 6c 65 20 69 6e 74 6f 20  r to table into 
205a0 77 68 69 63 68 20 69 6e 73 65 72 74 20 69 73 20  which insert is 
205b0 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74  written */.  int
205c0 20 6e 5a 65 72 6f 3b 20 20 20 20 20 20 20 20 2f   nZero;        /
205d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a 65 72 6f  * Number of zero
205e0 2d 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64  -bytes to append
205f0 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b 52 65   */.  int seekRe
20600 73 75 6c 74 3b 20 20 20 2f 2a 20 52 65 73 75 6c  sult;   /* Resul
20610 74 20 6f 66 20 70 72 69 6f 72 20 73 65 65 6b 20  t of prior seek 
20620 6f 72 20 30 20 69 66 20 6e 6f 20 55 53 45 53 45  or 0 if no USESE
20630 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 2a 2f  EKRESULT flag */
20640 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
20650 44 62 3b 20 20 2f 2a 20 64 61 74 61 62 61 73 65  Db;  /* database
20660 20 6e 61 6d 65 20 2d 20 75 73 65 64 20 62 79 20   name - used by 
20670 74 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 20  the update hook 
20680 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
20690 2a 7a 54 62 6c 3b 20 2f 2a 20 54 61 62 6c 65 20  *zTbl; /* Table 
206a0 6e 61 6d 65 20 2d 20 75 73 65 64 20 62 79 20 74  name - used by t
206b0 68 65 20 6f 70 64 61 74 65 20 68 6f 6f 6b 20 2a  he opdate hook *
206c0 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
206d0 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20        /* Opcode 
206e0 66 6f 72 20 75 70 64 61 74 65 20 68 6f 6f 6b 3a  for update hook:
206f0 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 6f   SQLITE_UPDATE o
20700 72 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20  r SQLITE_INSERT 
20710 2a 2f 0a 0a 20 20 70 44 61 74 61 20 3d 20 26 61  */..  pData = &a
20720 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
20730 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
20740 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
20750 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73  >nCursor );.  as
20760 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
20770 28 70 44 61 74 61 29 20 29 3b 0a 20 20 70 43 20  (pData) );.  pC 
20780 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
20790 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
207a0 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
207b0 28 20 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30  ( pC->pCursor!=0
207c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
207d0 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67  ->pseudoTableReg
207e0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
207f0 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a   pC->isTable );.
20800 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
20810 28 70 4f 70 2d 3e 70 32 2c 20 70 44 61 74 61 29  (pOp->p2, pData)
20820 3b 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  ;..  if( pOp->op
20830 63 6f 64 65 3d 3d 4f 50 5f 49 6e 73 65 72 74 20  code==OP_Insert 
20840 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 26 61  ){.    pKey = &a
20850 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
20860 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 2d 3e    assert( pKey->
20870 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
20880 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
20890 65 6d 49 73 56 61 6c 69 64 28 70 4b 65 79 29 20  emIsValid(pKey) 
208a0 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  );.    REGISTER_
208b0 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70  TRACE(pOp->p3, p
208c0 4b 65 79 29 3b 0a 20 20 20 20 69 4b 65 79 20 3d  Key);.    iKey =
208d0 20 70 4b 65 79 2d 3e 75 2e 69 3b 0a 20 20 7d 65   pKey->u.i;.  }e
208e0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
208f0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
20900 5f 49 6e 73 65 72 74 49 6e 74 20 29 3b 0a 20 20  _InsertInt );.  
20910 20 20 69 4b 65 79 20 3d 20 70 4f 70 2d 3e 70 33    iKey = pOp->p3
20920 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 70  ;.  }..  if( pOp
20930 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 4e 43  ->p5 & OPFLAG_NC
20940 48 41 4e 47 45 20 29 20 70 2d 3e 6e 43 68 61 6e  HANGE ) p->nChan
20950 67 65 2b 2b 3b 0a 20 20 69 66 28 20 70 4f 70 2d  ge++;.  if( pOp-
20960 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 4c 41 53  >p5 & OPFLAG_LAS
20970 54 52 4f 57 49 44 20 29 20 64 62 2d 3e 6c 61 73  TROWID ) db->las
20980 74 52 6f 77 69 64 20 3d 20 6c 61 73 74 52 6f 77  tRowid = lastRow
20990 69 64 20 3d 20 69 4b 65 79 3b 0a 20 20 69 66 28  id = iKey;.  if(
209a0 20 70 44 61 74 61 2d 3e 66 6c 61 67 73 20 26 20   pData->flags & 
209b0 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
209c0 70 44 61 74 61 2d 3e 7a 20 3d 20 30 3b 0a 20 20  pData->z = 0;.  
209d0 20 20 70 44 61 74 61 2d 3e 6e 20 3d 20 30 3b 0a    pData->n = 0;.
209e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
209f0 65 72 74 28 20 70 44 61 74 61 2d 3e 66 6c 61 67  ert( pData->flag
20a00 73 20 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c 4d 45  s & (MEM_Blob|ME
20a10 4d 5f 53 74 72 29 20 29 3b 0a 20 20 7d 0a 20 20  M_Str) );.  }.  
20a20 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 28 28 70  seekResult = ((p
20a30 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
20a40 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 20 3f  USESEEKRESULT) ?
20a50 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20   pC->seekResult 
20a60 3a 20 30 29 3b 0a 20 20 69 66 28 20 70 44 61 74  : 0);.  if( pDat
20a70 61 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  a->flags & MEM_Z
20a80 65 72 6f 20 29 7b 0a 20 20 20 20 6e 5a 65 72 6f  ero ){.    nZero
20a90 20 3d 20 70 44 61 74 61 2d 3e 75 2e 6e 5a 65 72   = pData->u.nZer
20aa0 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  o;.  }else{.    
20ab0 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20  nZero = 0;.  }. 
20ac0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
20ad0 43 61 63 68 65 64 52 6f 77 69 64 28 70 43 2d 3e  CachedRowid(pC->
20ae0 70 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 72  pCursor, 0);.  r
20af0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
20b00 49 6e 73 65 72 74 28 70 43 2d 3e 70 43 75 72 73  Insert(pC->pCurs
20b10 6f 72 2c 20 30 2c 20 69 4b 65 79 2c 0a 20 20 20  or, 0, iKey,.   
20b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b30 20 20 20 20 20 20 20 70 44 61 74 61 2d 3e 7a 2c         pData->z,
20b40 20 70 44 61 74 61 2d 3e 6e 2c 20 6e 5a 65 72 6f   pData->n, nZero
20b50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20b60 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
20b70 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 41 50 50  >p5 & OPFLAG_APP
20b80 45 4e 44 2c 20 73 65 65 6b 52 65 73 75 6c 74 0a  END, seekResult.
20b90 20 20 29 3b 0a 20 20 70 43 2d 3e 72 6f 77 69 64    );.  pC->rowid
20ba0 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 70  IsValid = 0;.  p
20bb0 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
20bc0 6f 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63  o = 0;.  pC->cac
20bd0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
20be0 5f 53 54 41 4c 45 3b 0a 0a 20 20 2f 2a 20 49 6e  _STALE;..  /* In
20bf0 76 6f 6b 65 20 74 68 65 20 75 70 64 61 74 65 2d  voke the update-
20c00 68 6f 6f 6b 20 69 66 20 72 65 71 75 69 72 65 64  hook if required
20c10 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
20c20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e  QLITE_OK && db->
20c30 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20  xUpdateCallback 
20c40 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a  && pOp->p4.z ){.
20c50 20 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44      zDb = db->aD
20c60 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65  b[pC->iDb].zName
20c70 3b 0a 20 20 20 20 7a 54 62 6c 20 3d 20 70 4f 70  ;.    zTbl = pOp
20c80 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 6f 70 20 3d  ->p4.z;.    op =
20c90 20 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46   ((pOp->p5 & OPF
20ca0 4c 41 47 5f 49 53 55 50 44 41 54 45 29 20 3f 20  LAG_ISUPDATE) ? 
20cb0 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 3a 20  SQLITE_UPDATE : 
20cc0 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 29 3b 0a  SQLITE_INSERT);.
20cd0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
20ce0 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 64  isTable );.    d
20cf0 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61  b->xUpdateCallba
20d00 63 6b 28 64 62 2d 3e 70 55 70 64 61 74 65 41 72  ck(db->pUpdateAr
20d10 67 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c  g, op, zDb, zTbl
20d20 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 61 73 73  , iKey);.    ass
20d30 65 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20  ert( pC->iDb>=0 
20d40 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
20d50 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65  }../* Opcode: De
20d60 6c 65 74 65 20 50 31 20 50 32 20 2a 20 50 34 20  lete P1 P2 * P4 
20d70 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  *.**.** Delete t
20d80 68 65 20 72 65 63 6f 72 64 20 61 74 20 77 68 69  he record at whi
20d90 63 68 20 74 68 65 20 50 31 20 63 75 72 73 6f 72  ch the P1 cursor
20da0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
20db0 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
20dc0 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 62 65  e cursor will be
20dd0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
20de0 74 20 65 69 74 68 65 72 20 74 68 65 20 6e 65 78  t either the nex
20df0 74 20 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75  t or the previou
20e00 73 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e 20 74  s.** record in t
20e10 68 65 20 74 61 62 6c 65 2e 20 49 66 20 69 74 20  he table. If it 
20e20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
20e30 20 61 74 20 74 68 65 20 6e 65 78 74 20 72 65 63   at the next rec
20e40 6f 72 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ord, then.** the
20e50 20 6e 65 78 74 20 4e 65 78 74 20 69 6e 73 74 72   next Next instr
20e60 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61  uction will be a
20e70 20 6e 6f 2d 6f 70 2e 20 20 48 65 6e 63 65 20 69   no-op.  Hence i
20e80 74 20 69 73 20 4f 4b 20 74 6f 20 64 65 6c 65 74  t is OK to delet
20e90 65 0a 2a 2a 20 61 20 72 65 63 6f 72 64 20 66 72  e.** a record fr
20ea0 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20 4e 65 78  om within an Nex
20eb0 74 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66  t loop..**.** If
20ec0 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41   the OPFLAG_NCHA
20ed0 4e 47 45 20 66 6c 61 67 20 6f 66 20 50 32 20 69  NGE flag of P2 i
20ee0 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
20ef0 72 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  row change count
20f00 20 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74   is.** increment
20f10 65 64 20 28 6f 74 68 65 72 77 69 73 65 20 6e 6f  ed (otherwise no
20f20 74 29 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 6d 75 73  t)..**.** P1 mus
20f30 74 20 6e 6f 74 20 62 65 20 70 73 65 75 64 6f 2d  t not be pseudo-
20f40 74 61 62 6c 65 2e 20 20 49 74 20 68 61 73 20 74  table.  It has t
20f50 6f 20 62 65 20 61 20 72 65 61 6c 20 74 61 62 6c  o be a real tabl
20f60 65 20 77 69 74 68 0a 2a 2a 20 6d 75 6c 74 69 70  e with.** multip
20f70 6c 65 20 72 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 49  le rows..**.** I
20f80 66 20 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  f P4 is not NULL
20f90 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
20fa0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
20fb0 6c 65 20 74 68 61 74 20 50 31 20 69 73 0a 2a 2a  le that P1 is.**
20fc0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
20fd0 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 20 77  he update hook w
20fe0 69 6c 6c 20 62 65 20 69 6e 76 6f 6b 65 64 2c 20  ill be invoked, 
20ff0 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a 2a 2a  if it exists..**
21000 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20 4e 55   If P4 is not NU
21010 4c 4c 20 74 68 65 6e 20 74 68 65 20 50 31 20 63  LL then the P1 c
21020 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
21030 62 65 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 0a  been positioned.
21040 2a 2a 20 75 73 69 6e 67 20 4f 50 5f 4e 6f 74 46  ** using OP_NotF
21050 6f 75 6e 64 20 70 72 69 6f 72 20 74 6f 20 69 6e  ound prior to in
21060 76 6f 6b 69 6e 67 20 74 68 69 73 20 6f 70 63 6f  voking this opco
21070 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44  de..*/.case OP_D
21080 65 6c 65 74 65 3a 20 7b 0a 20 20 69 36 34 20 69  elete: {.  i64 i
21090 4b 65 79 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  Key;.  VdbeCurso
210a0 72 20 2a 70 43 3b 0a 0a 20 20 69 4b 65 79 20 3d  r *pC;..  iKey =
210b0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   0;.  assert( pO
210c0 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
210d0 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
210e0 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
210f0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
21100 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
21110 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70 43 75   assert( pC->pCu
21120 72 73 6f 72 21 3d 30 20 29 3b 20 20 2f 2a 20 4f  rsor!=0 );  /* O
21130 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 72 65  nly valid for re
21140 61 6c 20 74 61 62 6c 65 73 2c 20 6e 6f 20 70 73  al tables, no ps
21150 65 75 64 6f 74 61 62 6c 65 73 20 2a 2f 0a 0a 20  eudotables */.. 
21160 20 2f 2a 20 49 66 20 74 68 65 20 75 70 64 61 74   /* If the updat
21170 65 2d 68 6f 6f 6b 20 77 69 6c 6c 20 62 65 20 69  e-hook will be i
21180 6e 76 6f 6b 65 64 2c 20 73 65 74 20 69 4b 65 79  nvoked, set iKey
21190 20 74 6f 20 74 68 65 20 72 6f 77 69 64 20 6f 66   to the rowid of
211a0 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 20 62 65   the.  ** row be
211b0 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 20 20 2a  ing deleted..  *
211c0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 55 70 64  /.  if( db->xUpd
211d0 61 74 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 70  ateCallback && p
211e0 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20 20  Op->p4.z ){.    
211f0 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61  assert( pC->isTa
21200 62 6c 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ble );.    asser
21210 74 28 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61  t( pC->rowidIsVa
21220 6c 69 64 20 29 3b 20 20 2f 2a 20 6c 61 73 74 52  lid );  /* lastR
21230 6f 77 69 64 20 73 65 74 20 62 79 20 70 72 65 76  owid set by prev
21240 69 6f 75 73 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  ious OP_NotFound
21250 20 2a 2f 0a 20 20 20 20 69 4b 65 79 20 3d 20 70   */.    iKey = p
21260 43 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20  C->lastRowid;.  
21270 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 50 5f 44  }..  /* The OP_D
21280 65 6c 65 74 65 20 6f 70 63 6f 64 65 20 61 6c 77  elete opcode alw
21290 61 79 73 20 66 6f 6c 6c 6f 77 73 20 61 6e 20 4f  ays follows an O
212a0 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f 72 20 4f  P_NotExists or O
212b0 50 5f 4c 61 73 74 20 6f 72 0a 20 20 2a 2a 20 4f  P_Last or.  ** O
212c0 50 5f 43 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  P_Column on the 
212d0 73 61 6d 65 20 74 61 62 6c 65 20 77 69 74 68 6f  same table witho
212e0 75 74 20 61 6e 79 20 69 6e 74 65 72 76 65 6e 69  ut any interveni
212f0 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68  ng operations th
21300 61 74 0a 20 20 2a 2a 20 6d 69 67 68 74 20 6d 6f  at.  ** might mo
21310 76 65 20 6f 72 20 69 6e 76 61 6c 69 64 61 74 65  ve or invalidate
21320 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 48 65   the cursor.  He
21330 6e 63 65 20 63 75 72 73 6f 72 20 70 43 20 69 73  nce cursor pC is
21340 20 61 6c 77 61 79 73 20 70 6f 69 6e 74 69 6e 67   always pointing
21350 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 6f 77  .  ** to the row
21360 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 61   to be deleted a
21370 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  nd the sqlite3Vd
21380 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29  beCursorMoveto()
21390 20 6f 70 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20   operation.  ** 
213a0 62 65 6c 6f 77 20 69 73 20 61 6c 77 61 79 73 20  below is always 
213b0 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 63 61 6e 6e  a no-op and cann
213c0 6f 74 20 66 61 69 6c 2e 20 20 57 65 20 77 69 6c  ot fail.  We wil
213d0 6c 20 72 75 6e 20 69 74 20 61 6e 79 68 6f 77 2c  l run it anyhow,
213e0 20 74 68 6f 75 67 68 2c 0a 20 20 2a 2a 20 74 6f   though,.  ** to
213f0 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 66   guard against f
21400 75 74 75 72 65 20 63 68 61 6e 67 65 73 20 74 6f  uture changes to
21410 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
21420 74 6f 72 2e 0a 20 20 2a 2a 2f 0a 20 20 61 73 73  tor..  **/.  ass
21430 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65  ert( pC->deferre
21440 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20  dMoveto==0 );.  
21450 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
21460 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29  CursorMoveto(pC)
21470 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 72 63  ;.  if( NEVER(rc
21480 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 20 67  !=SQLITE_OK) ) g
21490 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
214a0 5f 65 72 72 6f 72 3b 0a 0a 20 20 73 71 6c 69 74  _error;..  sqlit
214b0 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 64  e3BtreeSetCached
214c0 52 6f 77 69 64 28 70 43 2d 3e 70 43 75 72 73 6f  Rowid(pC->pCurso
214d0 72 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  r, 0);.  rc = sq
214e0 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
214f0 28 70 43 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20  (pC->pCursor);. 
21500 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
21510 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
21520 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  /* Invoke the
21530 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20   update-hook if 
21540 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
21550 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21560 20 26 26 20 64 62 2d 3e 78 55 70 64 61 74 65 43   && db->xUpdateC
21570 61 6c 6c 62 61 63 6b 20 26 26 20 70 4f 70 2d 3e  allback && pOp->
21580 70 34 2e 7a 20 29 7b 0a 20 20 20 20 63 6f 6e 73  p4.z ){.    cons
21590 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
215a0 2d 3e 61 44 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a  ->aDb[pC->iDb].z
215b0 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
215c0 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 4f 70  char *zTbl = pOp
215d0 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 64 62 2d 3e  ->p4.z;.    db->
215e0 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28  xUpdateCallback(
215f0 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 2c 20  db->pUpdateArg, 
21600 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
21610 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 29 3b  Db, zTbl, iKey);
21620 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
21630 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20  >iDb>=0 );.  }. 
21640 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 26 20 4f   if( pOp->p2 & O
21650 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29 20  PFLAG_NCHANGE ) 
21660 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20  p->nChange++;.  
21670 62 72 65 61 6b 3b 0a 7d 0a 2f 2a 20 4f 70 63 6f  break;.}./* Opco
21680 64 65 3a 20 52 65 73 65 74 43 6f 75 6e 74 20 2a  de: ResetCount *
21690 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54   * * * *.**.** T
216a0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
216b0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 69  change counter i
216c0 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20  s copied to the 
216d0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
216e0 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  ** change counte
216f0 72 20 28 72 65 74 75 72 6e 65 64 20 62 79 20 73  r (returned by s
21700 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
21710 74 6f 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  to sqlite3_chang
21720 65 73 28 29 29 2e 0a 2a 2a 20 54 68 65 6e 20 74  es())..** Then t
21730 68 65 20 56 4d 73 20 69 6e 74 65 72 6e 61 6c 20  he VMs internal 
21740 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 72  change counter r
21750 65 73 65 74 73 20 74 6f 20 30 2e 0a 2a 2a 20 54  esets to 0..** T
21760 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74  his is used by t
21770 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
21780 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 65  .*/.case OP_Rese
21790 74 43 6f 75 6e 74 3a 20 7b 0a 20 20 73 71 6c 69  tCount: {.  sqli
217a0 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
217b0 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
217c0 29 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20  );.  p->nChange 
217d0 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  = 0;.  break;.}.
217e0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74  ./* Opcode: Sort
217f0 65 72 43 6f 6d 70 61 72 65 20 50 31 20 50 32 20  erCompare P1 P2 
21800 50 33 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61  P3.**.** P1 is a
21810 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72 2e 20   sorter cursor. 
21820 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  This instruction
21830 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 72 65   compares the re
21840 63 6f 72 64 20 62 6c 6f 62 20 69 6e 20 0a 2a 2a  cord blob in .**
21850 20 72 65 67 69 73 74 65 72 20 50 33 20 77 69 74   register P3 wit
21860 68 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  h the entry that
21870 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73   the sorter curs
21880 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
21890 6e 74 73 20 74 6f 2e 0a 2a 2a 20 49 66 2c 20 65  nts to..** If, e
218a0 78 63 6c 75 64 69 6e 67 20 74 68 65 20 72 6f 77  xcluding the row
218b0 69 64 20 66 69 65 6c 64 73 20 61 74 20 74 68 65  id fields at the
218c0 20 65 6e 64 2c 20 74 68 65 20 74 77 6f 20 72 65   end, the two re
218d0 63 6f 72 64 73 20 61 72 65 20 61 20 6d 61 74 63  cords are a matc
218e0 68 2c 0a 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75  h,.** fall throu
218f0 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
21900 6e 73 74 72 75 63 74 69 6f 6e 2e 20 4f 74 68 65  nstruction. Othe
21910 72 77 69 73 65 2c 20 6a 75 6d 70 20 74 6f 20 69  rwise, jump to i
21920 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 0a 2a  nstruction P2..*
21930 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72  /.case OP_Sorter
21940 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 56 64 62  Compare: {.  Vdb
21950 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69  eCursor *pC;.  i
21960 6e 74 20 72 65 73 3b 0a 0a 20 20 70 43 20 3d 20  nt res;..  pC = 
21970 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
21980 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  ];.  assert( isS
21990 6f 72 74 65 72 28 70 43 29 20 29 3b 0a 20 20 70  orter(pC) );.  p
219a0 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In3 = &aMem[pOp-
219b0 3e 70 33 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  >p3];.  rc = sql
219c0 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6f  ite3VdbeSorterCo
219d0 6d 70 61 72 65 28 70 43 2c 20 70 49 6e 33 2c 20  mpare(pC, pIn3, 
219e0 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 65 73  &res);.  if( res
219f0 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70   ){.    pc = pOp
21a00 2d 3e 70 32 2d 31 3b 0a 20 20 7d 0a 20 20 62 72  ->p2-1;.  }.  br
21a10 65 61 6b 3b 0a 7d 3b 0a 0a 2f 2a 20 4f 70 63 6f  eak;.};../* Opco
21a20 64 65 3a 20 53 6f 72 74 65 72 44 61 74 61 20 50  de: SorterData P
21a30 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
21a40 20 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67 69   Write into regi
21a50 73 74 65 72 20 50 32 20 74 68 65 20 63 75 72 72  ster P2 the curr
21a60 65 6e 74 20 73 6f 72 74 65 72 20 64 61 74 61 20  ent sorter data 
21a70 66 6f 72 20 73 6f 72 74 65 72 20 63 75 72 73 6f  for sorter curso
21a80 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  r P1..*/.case OP
21a90 5f 53 6f 72 74 65 72 44 61 74 61 3a 20 7b 0a 20  _SorterData: {. 
21aa0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
21ab0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21ac0 4f 4d 49 54 5f 4d 45 52 47 45 5f 53 4f 52 54 0a  OMIT_MERGE_SORT.
21ad0 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
21ae0 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 43 20 3d 20  Op->p2];.  pC = 
21af0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
21b00 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  ];.  assert( pC-
21b10 3e 69 73 53 6f 72 74 65 72 20 29 3b 0a 20 20 72  >isSorter );.  r
21b20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  c = sqlite3VdbeS
21b30 6f 72 74 65 72 52 6f 77 6b 65 79 28 70 43 2c 20  orterRowkey(pC, 
21b40 70 4f 75 74 29 3b 0a 23 65 6c 73 65 0a 20 20 70  pOut);.#else.  p
21b50 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
21b60 52 6f 77 4b 65 79 3b 0a 20 20 70 63 2d 2d 3b 0a  RowKey;.  pc--;.
21b70 23 65 6e 64 69 66 0a 20 20 62 72 65 61 6b 3b 0a  #endif.  break;.
21b80 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f  }../* Opcode: Ro
21b90 77 44 61 74 61 20 50 31 20 50 32 20 2a 20 2a 20  wData P1 P2 * * 
21ba0 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e  *.**.** Write in
21bb0 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 20 74  to register P2 t
21bc0 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 6f 77 20  he complete row 
21bd0 64 61 74 61 20 66 6f 72 20 63 75 72 73 6f 72 20  data for cursor 
21be0 50 31 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  P1..** There is 
21bf0 6e 6f 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f  no interpretatio
21c00 6e 20 6f 66 20 74 68 65 20 64 61 74 61 2e 20 20  n of the data.  
21c10 0a 2a 2a 20 49 74 20 69 73 20 6a 75 73 74 20 63  .** It is just c
21c20 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68 65 20 50  opied onto the P
21c30 32 20 72 65 67 69 73 74 65 72 20 65 78 61 63 74  2 register exact
21c40 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20 69 73 20  ly as .** it is 
21c50 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74  found in the dat
21c60 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
21c70 2a 20 49 66 20 74 68 65 20 50 31 20 63 75 72 73  * If the P1 curs
21c80 6f 72 20 6d 75 73 74 20 62 65 20 70 6f 69 6e 74  or must be point
21c90 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72  ing to a valid r
21ca0 6f 77 20 28 6e 6f 74 20 61 20 4e 55 4c 4c 20 72  ow (not a NULL r
21cb0 6f 77 29 0a 2a 2a 20 6f 66 20 61 20 72 65 61 6c  ow).** of a real
21cc0 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73   table, not a ps
21cd0 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 2f  eudo-table..*/./
21ce0 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 4b 65 79  * Opcode: RowKey
21cf0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
21d00 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 72 65  ** Write into re
21d10 67 69 73 74 65 72 20 50 32 20 74 68 65 20 63 6f  gister P2 the co
21d20 6d 70 6c 65 74 65 20 72 6f 77 20 6b 65 79 20 66  mplete row key f
21d30 6f 72 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a  or cursor P1..**
21d40 20 54 68 65 72 65 20 69 73 20 6e 6f 20 69 6e 74   There is no int
21d50 65 72 70 72 65 74 61 74 69 6f 6e 20 6f 66 20 74  erpretation of t
21d60 68 65 20 64 61 74 61 2e 20 20 0a 2a 2a 20 54 68  he data.  .** Th
21d70 65 20 6b 65 79 20 69 73 20 63 6f 70 69 65 64 20  e key is copied 
21d80 6f 6e 74 6f 20 74 68 65 20 50 33 20 72 65 67 69  onto the P3 regi
21d90 73 74 65 72 20 65 78 61 63 74 6c 79 20 61 73 20  ster exactly as 
21da0 0a 2a 2a 20 69 74 20 69 73 20 66 6f 75 6e 64 20  .** it is found 
21db0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
21dc0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
21dd0 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73  he P1 cursor mus
21de0 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  t be pointing to
21df0 20 61 20 76 61 6c 69 64 20 72 6f 77 20 28 6e 6f   a valid row (no
21e00 74 20 61 20 4e 55 4c 4c 20 72 6f 77 29 0a 2a 2a  t a NULL row).**
21e10 20 6f 66 20 61 20 72 65 61 6c 20 74 61 62 6c 65   of a real table
21e20 2c 20 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d 74  , not a pseudo-t
21e30 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  able..*/.case OP
21e40 5f 52 6f 77 4b 65 79 3a 0a 63 61 73 65 20 4f 50  _RowKey:.case OP
21e50 5f 52 6f 77 44 61 74 61 3a 20 7b 0a 20 20 56 64  _RowData: {.  Vd
21e60 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
21e70 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
21e80 0a 20 20 75 33 32 20 6e 3b 0a 20 20 69 36 34 20  .  u32 n;.  i64 
21e90 6e 36 34 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 26  n64;..  pOut = &
21ea0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
21eb0 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
21ec0 65 28 70 2c 20 70 4f 75 74 29 3b 0a 0a 20 20 2f  e(p, pOut);..  /
21ed0 2a 20 4e 6f 74 65 20 74 68 61 74 20 52 6f 77 4b  * Note that RowK
21ee0 65 79 20 61 6e 64 20 52 6f 77 44 61 74 61 20 61  ey and RowData a
21ef0 72 65 20 72 65 61 6c 6c 79 20 65 78 61 63 74 6c  re really exactl
21f00 79 20 74 68 65 20 73 61 6d 65 20 69 6e 73 74 72  y the same instr
21f10 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65  uction */.  asse
21f20 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
21f30 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
21f40 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
21f50 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
21f60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
21f70 69 73 53 6f 72 74 65 72 3d 3d 30 20 29 3b 0a 20  isSorter==0 );. 
21f80 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54   assert( pC->isT
21f90 61 62 6c 65 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63  able || pOp->opc
21fa0 6f 64 65 21 3d 4f 50 5f 52 6f 77 44 61 74 61 20  ode!=OP_RowData 
21fb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
21fc0 3e 69 73 49 6e 64 65 78 20 7c 7c 20 70 4f 70 2d  >isIndex || pOp-
21fd0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 44  >opcode==OP_RowD
21fe0 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
21ff0 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
22000 72 74 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 3d  rt( pC->nullRow=
22010 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
22020 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52  pC->pseudoTableR
22030 65 67 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  eg==0 );.  asser
22040 74 28 20 21 70 43 2d 3e 69 73 53 6f 72 74 65 72  t( !pC->isSorter
22050 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
22060 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  ->pCursor!=0 );.
22070 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 70 43    pCrsr = pC->pC
22080 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  ursor;.  assert(
22090 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
220a0 73 6f 72 49 73 56 61 6c 69 64 28 70 43 72 73 72  sorIsValid(pCrsr
220b0 29 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f  ) );..  /* The O
220c0 50 5f 52 6f 77 4b 65 79 20 61 6e 64 20 4f 50 5f  P_RowKey and OP_
220d0 52 6f 77 44 61 74 61 20 6f 70 63 6f 64 65 73 20  RowData opcodes 
220e0 61 6c 77 61 79 73 20 66 6f 6c 6c 6f 77 20 4f 50  always follow OP
220f0 5f 4e 6f 74 45 78 69 73 74 73 20 6f 72 0a 20 20  _NotExists or.  
22100 2a 2a 20 4f 50 5f 52 65 77 69 6e 64 2f 4f 70 5f  ** OP_Rewind/Op_
22110 4e 65 78 74 20 77 69 74 68 20 6e 6f 20 69 6e 74  Next with no int
22120 65 72 76 65 6e 69 6e 67 20 69 6e 73 74 72 75 63  ervening instruc
22130 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74  tions that might
22140 20 69 6e 76 61 6c 69 64 61 74 65 0a 20 20 2a 2a   invalidate.  **
22150 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 48 65   the cursor.  He
22160 6e 63 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  nce the followin
22170 67 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  g sqlite3VdbeCur
22180 73 6f 72 4d 6f 76 65 74 6f 28 29 20 63 61 6c 6c  sorMoveto() call
22190 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20   is always.  ** 
221a0 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 63 61 6e 20  a no-op and can 
221b0 6e 65 76 65 72 20 66 61 69 6c 2e 20 20 42 75 74  never fail.  But
221c0 20 77 65 20 6c 65 61 76 65 20 69 74 20 69 6e 20   we leave it in 
221d0 70 6c 61 63 65 20 61 73 20 61 20 73 61 66 65 74  place as a safet
221e0 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  y..  */.  assert
221f0 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f  ( pC->deferredMo
22200 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 72 63 20  veto==0 );.  rc 
22210 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
22220 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20  sorMoveto(pC);. 
22230 20 69 66 28 20 4e 45 56 45 52 28 72 63 21 3d 53   if( NEVER(rc!=S
22240 51 4c 49 54 45 5f 4f 4b 29 20 29 20 67 6f 74 6f  QLITE_OK) ) goto
22250 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
22260 72 6f 72 3b 0a 0a 20 20 69 66 28 20 70 43 2d 3e  ror;..  if( pC->
22270 69 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 61  isIndex ){.    a
22280 73 73 65 72 74 28 20 21 70 43 2d 3e 69 73 54 61  ssert( !pC->isTa
22290 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ble );.    rc = 
222a0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
222b0 69 7a 65 28 70 43 72 73 72 2c 20 26 6e 36 34 29  ize(pCrsr, &n64)
222c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
222d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
222e0 20 20 2f 2a 20 54 72 75 65 20 62 65 63 61 75 73    /* True becaus
222f0 65 20 6f 66 20 43 75 72 73 6f 72 4d 6f 76 65 74  e of CursorMovet
22300 6f 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 20 2a  o() call above *
22310 2f 0a 20 20 20 20 69 66 28 20 6e 36 34 3e 64 62  /.    if( n64>db
22320 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
22330 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b  LIMIT_LENGTH] ){
22340 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f  .      goto too_
22350 62 69 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  big;.    }.    n
22360 20 3d 20 28 75 33 32 29 6e 36 34 3b 0a 20 20 7d   = (u32)n64;.  }
22370 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
22380 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
22390 69 7a 65 28 70 43 72 73 72 2c 20 26 6e 29 3b 0a  ize(pCrsr, &n);.
223a0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
223b0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20  SQLITE_OK );    
223c0 2f 2a 20 44 61 74 61 53 69 7a 65 28 29 20 63 61  /* DataSize() ca
223d0 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 20  nnot fail */.   
223e0 20 69 66 28 20 6e 3e 28 75 33 32 29 64 62 2d 3e   if( n>(u32)db->
223f0 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
22400 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20  MIT_LENGTH] ){. 
22410 20 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69       goto too_bi
22420 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  g;.    }.  }.  i
22430 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
22440 6d 47 72 6f 77 28 70 4f 75 74 2c 20 6e 2c 20 30  mGrow(pOut, n, 0
22450 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f  ) ){.    goto no
22460 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 70 4f 75 74  _mem;.  }.  pOut
22470 2d 3e 6e 20 3d 20 6e 3b 0a 20 20 4d 65 6d 53 65  ->n = n;.  MemSe
22480 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20  tTypeFlag(pOut, 
22490 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 20 20 69 66 28  MEM_Blob);.  if(
224a0 20 70 43 2d 3e 69 73 49 6e 64 65 78 20 29 7b 0a   pC->isIndex ){.
224b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
224c0 42 74 72 65 65 4b 65 79 28 70 43 72 73 72 2c 20  BtreeKey(pCrsr, 
224d0 30 2c 20 6e 2c 20 70 4f 75 74 2d 3e 7a 29 3b 0a  0, n, pOut->z);.
224e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
224f0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  = sqlite3BtreeDa
22500 74 61 28 70 43 72 73 72 2c 20 30 2c 20 6e 2c 20  ta(pCrsr, 0, n, 
22510 70 4f 75 74 2d 3e 7a 29 3b 0a 20 20 7d 0a 20 20  pOut->z);.  }.  
22520 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pOut->enc = SQLI
22530 54 45 5f 55 54 46 38 3b 20 20 2f 2a 20 49 6e 20  TE_UTF8;  /* In 
22540 63 61 73 65 20 74 68 65 20 62 6c 6f 62 20 69 73  case the blob is
22550 20 65 76 65 72 20 63 61 73 74 20 74 6f 20 74 65   ever cast to te
22560 78 74 20 2a 2f 0a 20 20 55 50 44 41 54 45 5f 4d  xt */.  UPDATE_M
22570 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74  AX_BLOBSIZE(pOut
22580 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
22590 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 69 64 20  * Opcode: Rowid 
225a0 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
225b0 2a 20 53 74 6f 72 65 20 69 6e 20 72 65 67 69 73  * Store in regis
225c0 74 65 72 20 50 32 20 61 6e 20 69 6e 74 65 67 65  ter P2 an intege
225d0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6b  r which is the k
225e0 65 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ey of the table 
225f0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 50 31  entry that.** P1
22600 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
22610 69 6e 74 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 50 31  int to..**.** P1
22620 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 61   can be either a
22630 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
22640 20 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61   or a virtual ta
22650 62 6c 65 2e 20 20 54 68 65 72 65 20 75 73 65 64  ble.  There used
22660 20 74 6f 0a 2a 2a 20 62 65 20 61 20 73 65 70 61   to.** be a sepa
22670 72 61 74 65 20 4f 50 5f 56 52 6f 77 69 64 20 6f  rate OP_VRowid o
22680 70 63 6f 64 65 20 66 6f 72 20 75 73 65 20 77 69  pcode for use wi
22690 74 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  th virtual table
226a0 73 2c 20 62 75 74 20 74 68 69 73 0a 2a 2a 20 6f  s, but this.** o
226b0 6e 65 20 6f 70 63 6f 64 65 20 6e 6f 77 20 77 6f  ne opcode now wo
226c0 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 74 61 62  rks for both tab
226d0 6c 65 20 74 79 70 65 73 2e 0a 2a 2f 0a 63 61 73  le types..*/.cas
226e0 65 20 4f 50 5f 52 6f 77 69 64 3a 20 7b 20 20 20  e OP_Rowid: {   
226f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22700 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65   out2-prerelease
22710 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
22720 20 2a 70 43 3b 0a 20 20 69 36 34 20 76 3b 0a 20   *pC;.  i64 v;. 
22730 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
22740 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71  Vtab;.  const sq
22750 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
22760 6f 64 75 6c 65 3b 0a 0a 20 20 61 73 73 65 72 74  odule;..  assert
22770 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
22780 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
22790 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
227a0 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
227b0 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
227c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
227d0 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67 3d  >pseudoTableReg=
227e0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 2d 3e  =0 );.  if( pC->
227f0 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 70  nullRow ){.    p
22800 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
22810 5f 4e 75 6c 6c 3b 0a 20 20 20 20 62 72 65 61 6b  _Null;.    break
22820 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  ;.  }else if( pC
22830 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
22840 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 43 2d 3e   ){.    v = pC->
22850 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b 0a 23 69  movetoTarget;.#i
22860 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22870 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
22880 20 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 70   }else if( pC->p
22890 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20  VtabCursor ){.  
228a0 20 20 70 56 74 61 62 20 3d 20 70 43 2d 3e 70 56    pVtab = pC->pV
228b0 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  tabCursor->pVtab
228c0 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 20 3d 20  ;.    pModule = 
228d0 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
228e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 6f 64      assert( pMod
228f0 75 6c 65 2d 3e 78 52 6f 77 69 64 20 29 3b 0a 20  ule->xRowid );. 
22900 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d     rc = pModule-
22910 3e 78 52 6f 77 69 64 28 70 43 2d 3e 70 56 74 61  >xRowid(pC->pVta
22920 62 43 75 72 73 6f 72 2c 20 26 76 29 3b 0a 20 20  bCursor, &v);.  
22930 20 20 69 6d 70 6f 72 74 56 74 61 62 45 72 72 4d    importVtabErrM
22940 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 23 65  sg(p, pVtab);.#e
22950 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
22960 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
22970 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
22980 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70 43 75   assert( pC->pCu
22990 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 72  rsor!=0 );.    r
229a0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
229b0 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b  ursorMoveto(pC);
229c0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
229d0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
229e0 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70  error;.    if( p
229f0 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  C->rowidIsValid 
22a00 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 43 2d  ){.      v = pC-
22a10 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 20 20  >lastRowid;.    
22a20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
22a30 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
22a40 79 53 69 7a 65 28 70 43 2d 3e 70 43 75 72 73 6f  ySize(pC->pCurso
22a50 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 61 73  r, &v);.      as
22a60 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
22a70 5f 4f 4b 20 29 3b 20 20 2f 2a 20 41 6c 77 61 79  _OK );  /* Alway
22a80 73 20 73 6f 20 62 65 63 61 75 73 65 20 6f 66 20  s so because of 
22a90 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29 20 61  CursorMoveto() a
22aa0 62 6f 76 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  bove */.    }.  
22ab0 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  }.  pOut->u.i = 
22ac0 76 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  v;.  break;.}../
22ad0 2a 20 4f 70 63 6f 64 65 3a 20 4e 75 6c 6c 52 6f  * Opcode: NullRo
22ae0 77 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  w P1 * * * *.**.
22af0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
22b00 6f 72 20 50 31 20 74 6f 20 61 20 6e 75 6c 6c 20  or P1 to a null 
22b10 72 6f 77 2e 20 20 41 6e 79 20 4f 50 5f 43 6f 6c  row.  Any OP_Col
22b20 75 6d 6e 20 6f 70 65 72 61 74 69 6f 6e 73 0a 2a  umn operations.*
22b30 2a 20 74 68 61 74 20 6f 63 63 75 72 20 77 68 69  * that occur whi
22b40 6c 65 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  le the cursor is
22b50 20 6f 6e 20 74 68 65 20 6e 75 6c 6c 20 72 6f 77   on the null row
22b60 20 77 69 6c 6c 20 61 6c 77 61 79 73 0a 2a 2a 20   will always.** 
22b70 77 72 69 74 65 20 61 20 4e 55 4c 4c 2e 0a 2a 2f  write a NULL..*/
22b80 0a 63 61 73 65 20 4f 50 5f 4e 75 6c 6c 52 6f 77  .case OP_NullRow
22b90 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
22ba0 20 2a 70 43 3b 0a 0a 20 20 61 73 73 65 72 74 28   *pC;..  assert(
22bb0 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
22bc0 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
22bd0 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  r );.  pC = p->a
22be0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
22bf0 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
22c00 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20  ;.  pC->nullRow 
22c10 3d 20 31 3b 0a 20 20 70 43 2d 3e 72 6f 77 69 64  = 1;.  pC->rowid
22c20 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 61  IsValid = 0;.  a
22c30 73 73 65 72 74 28 20 70 43 2d 3e 70 43 75 72 73  ssert( pC->pCurs
22c40 6f 72 20 7c 7c 20 70 43 2d 3e 70 56 74 61 62 43  or || pC->pVtabC
22c50 75 72 73 6f 72 20 29 3b 0a 20 20 69 66 28 20 70  ursor );.  if( p
22c60 43 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  C->pCursor ){.  
22c70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
22c80 65 61 72 43 75 72 73 6f 72 28 70 43 2d 3e 70 43  earCursor(pC->pC
22c90 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 62 72  ursor);.  }.  br
22ca0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
22cb0 65 3a 20 4c 61 73 74 20 50 31 20 50 32 20 2a 20  e: Last P1 P2 * 
22cc0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  * *.**.** The ne
22cd0 78 74 20 75 73 65 20 6f 66 20 74 68 65 20 52 6f  xt use of the Ro
22ce0 77 69 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72  wid or Column or
22cf0 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   Next instructio
22d00 6e 20 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c  n for P1 .** wil
22d10 6c 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 6c  l refer to the l
22d20 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
22d30 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
22d40 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20  or index..** If 
22d50 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
22d60 65 78 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20  ex is empty and 
22d70 50 32 3e 30 2c 20 74 68 65 6e 20 6a 75 6d 70 20  P2>0, then jump 
22d80 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50  immediately to P
22d90 32 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 30  2..** If P2 is 0
22da0 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65   or if the table
22db0 20 6f 72 20 69 6e 64 65 78 20 69 73 20 6e 6f 74   or index is not
22dc0 20 65 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68 72   empty, fall thr
22dd0 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ough.** to the f
22de0 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63  ollowing instruc
22df0 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  tion..*/.case OP
22e00 5f 4c 61 73 74 3a 20 7b 20 20 20 20 20 20 20 20  _Last: {        
22e10 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62  /* jump */.  Vdb
22e20 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42  eCursor *pC;.  B
22e30 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a  tCursor *pCrsr;.
22e40 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73    int res;..  as
22e50 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
22e60 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
22e70 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
22e80 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
22e90 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
22ea0 21 3d 30 20 29 3b 0a 20 20 70 43 72 73 72 20 3d  !=0 );.  pCrsr =
22eb0 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20   pC->pCursor;.  
22ec0 69 66 28 20 4e 45 56 45 52 28 70 43 72 73 72 3d  if( NEVER(pCrsr=
22ed0 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  =0) ){.    res =
22ee0 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
22ef0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
22f00 65 65 4c 61 73 74 28 70 43 72 73 72 2c 20 26 72  eeLast(pCrsr, &r
22f10 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 2d 3e 6e  es);.  }.  pC->n
22f20 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29 72 65 73  ullRow = (u8)res
22f30 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64  ;.  pC->deferred
22f40 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43  Moveto = 0;.  pC
22f50 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d  ->rowidIsValid =
22f60 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53   0;.  pC->cacheS
22f70 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
22f80 41 4c 45 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  ALE;.  if( pOp->
22f90 70 32 3e 30 20 26 26 20 72 65 73 20 29 7b 0a 20  p2>0 && res ){. 
22fa0 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
22fb0 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  - 1;.  }.  break
22fc0 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ;.}.../* Opcode:
22fd0 20 53 6f 72 74 20 50 31 20 50 32 20 2a 20 2a 20   Sort P1 P2 * * 
22fe0 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  *.**.** This opc
22ff0 6f 64 65 20 64 6f 65 73 20 65 78 61 63 74 6c 79  ode does exactly
23000 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20   the same thing 
23010 61 73 20 4f 50 5f 52 65 77 69 6e 64 20 65 78 63  as OP_Rewind exc
23020 65 70 74 20 74 68 61 74 0a 2a 2a 20 69 74 20 69  ept that.** it i
23030 6e 63 72 65 6d 65 6e 74 73 20 61 6e 20 75 6e 64  ncrements an und
23040 6f 63 75 6d 65 6e 74 65 64 20 67 6c 6f 62 61 6c  ocumented global
23050 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20 66   variable used f
23060 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2a 0a 2a  or testing..**.*
23070 2a 20 53 6f 72 74 69 6e 67 20 69 73 20 61 63 63  * Sorting is acc
23080 6f 6d 70 6c 69 73 68 65 64 20 62 79 20 77 72 69  omplished by wri
23090 74 69 6e 67 20 72 65 63 6f 72 64 73 20 69 6e 74  ting records int
230a0 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  o a sorting inde
230b0 78 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 77 69 6e  x,.** then rewin
230c0 64 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20  ding that index 
230d0 61 6e 64 20 70 6c 61 79 69 6e 67 20 69 74 20 62  and playing it b
230e0 61 63 6b 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69  ack from beginni
230f0 6e 67 20 74 6f 0a 2a 2a 20 65 6e 64 2e 20 20 57  ng to.** end.  W
23100 65 20 75 73 65 20 74 68 65 20 4f 50 5f 53 6f 72  e use the OP_Sor
23110 74 20 6f 70 63 6f 64 65 20 69 6e 73 74 65 61 64  t opcode instead
23120 20 6f 66 20 4f 50 5f 52 65 77 69 6e 64 20 74 6f   of OP_Rewind to
23130 20 64 6f 20 74 68 65 0a 2a 2a 20 72 65 77 69 6e   do the.** rewin
23140 64 69 6e 67 20 73 6f 20 74 68 61 74 20 74 68 65  ding so that the
23150 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
23160 20 77 69 6c 6c 20 62 65 20 69 6e 63 72 65 6d 65   will be increme
23170 6e 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 67 72  nted and.** regr
23180 65 73 73 69 6f 6e 20 74 65 73 74 73 20 63 61 6e  ession tests can
23190 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
231a0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6f 70  er or not the op
231b0 74 69 6d 69 7a 65 72 20 69 73 0a 2a 2a 20 63 6f  timizer is.** co
231c0 72 72 65 63 74 6c 79 20 6f 70 74 69 6d 69 7a 69  rrectly optimizi
231d0 6e 67 20 6f 75 74 20 73 6f 72 74 73 2e 0a 2a 2f  ng out sorts..*/
231e0 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 53  .case OP_SorterS
231f0 6f 72 74 3a 20 20 20 20 2f 2a 20 6a 75 6d 70 20  ort:    /* jump 
23200 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
23210 5f 4f 4d 49 54 5f 4d 45 52 47 45 5f 53 4f 52 54  _OMIT_MERGE_SORT
23220 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
23230 20 4f 50 5f 53 6f 72 74 3b 0a 23 65 6e 64 69 66   OP_Sort;.#endif
23240 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 3a 20 7b  .case OP_Sort: {
23250 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
23260 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
23270 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
23280 73 6f 72 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  sort_count++;.  
23290 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
232a0 6f 75 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20  ount--;.#endif. 
232b0 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c   p->aCounter[SQL
232c0 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53  ITE_STMTSTATUS_S
232d0 4f 52 54 2d 31 5d 2b 2b 3b 0a 20 20 2f 2a 20 46  ORT-1]++;.  /* F
232e0 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f  all through into
232f0 20 4f 50 5f 52 65 77 69 6e 64 20 2a 2f 0a 7d 0a   OP_Rewind */.}.
23300 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 77 69 6e  /* Opcode: Rewin
23310 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  d P1 P2 * * *.**
23320 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 75 73 65  .** The next use
23330 20 6f 66 20 74 68 65 20 52 6f 77 69 64 20 6f 72   of the Rowid or
23340 20 43 6f 6c 75 6d 6e 20 6f 72 20 4e 65 78 74 20   Column or Next 
23350 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72 20  instruction for 
23360 50 31 20 0a 2a 2a 20 77 69 6c 6c 20 72 65 66 65  P1 .** will refe
23370 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  r to the first e
23380 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
23390 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  base table or in
233a0 64 65 78 2e 0a 2a 2a 20 49 66 20 74 68 65 20 74  dex..** If the t
233b0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73  able or index is
233c0 20 65 6d 70 74 79 20 61 6e 64 20 50 32 3e 30 2c   empty and P2>0,
233d0 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64   then jump immed
233e0 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a  iately to P2..**
233f0 20 49 66 20 50 32 20 69 73 20 30 20 6f 72 20 69   If P2 is 0 or i
23400 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
23410 6e 64 65 78 20 69 73 20 6e 6f 74 20 65 6d 70 74  ndex is not empt
23420 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a  y, fall through.
23430 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  ** to the follow
23440 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ing instruction.
23450 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 77 69  .*/.case OP_Rewi
23460 6e 64 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  nd: {        /* 
23470 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43 75  jump */.  VdbeCu
23480 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75  rsor *pC;.  BtCu
23490 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 69  rsor *pCrsr;.  i
234a0 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72  nt res;..  asser
234b0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
234c0 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
234d0 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
234e0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
234f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
23500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
23510 2d 3e 69 73 53 6f 72 74 65 72 3d 3d 28 70 4f 70  ->isSorter==(pOp
23520 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72  ->opcode==OP_Sor
23530 74 65 72 53 6f 72 74 29 20 29 3b 0a 20 20 72 65  terSort) );.  re
23540 73 20 3d 20 31 3b 0a 20 20 69 66 28 20 69 73 53  s = 1;.  if( isS
23550 6f 72 74 65 72 28 70 43 29 20 29 7b 0a 20 20 20  orter(pC) ){.   
23560 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
23570 65 53 6f 72 74 65 72 52 65 77 69 6e 64 28 64 62  eSorterRewind(db
23580 2c 20 70 43 2c 20 26 72 65 73 29 3b 0a 20 20 7d  , pC, &res);.  }
23590 65 6c 73 65 7b 0a 20 20 20 20 70 43 72 73 72 20  else{.    pCrsr 
235a0 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20  = pC->pCursor;. 
235b0 20 20 20 61 73 73 65 72 74 28 20 70 43 72 73 72     assert( pCrsr
235c0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
235d0 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 70  ite3BtreeFirst(p
235e0 43 72 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 20  Crsr, &res);.   
235f0 20 70 43 2d 3e 61 74 46 69 72 73 74 20 3d 20 72   pC->atFirst = r
23600 65 73 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 20 20  es==0 ?1:0;.    
23610 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
23620 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e  to = 0;.    pC->
23630 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
23640 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 70  CHE_STALE;.    p
23650 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  C->rowidIsValid 
23660 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 2d 3e 6e  = 0;.  }.  pC->n
23670 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29 72 65 73  ullRow = (u8)res
23680 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
23690 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32  >p2>0 && pOp->p2
236a0 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28  <p->nOp );.  if(
236b0 20 72 65 73 20 29 7b 0a 20 20 20 20 70 63 20 3d   res ){.    pc =
236c0 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
236d0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
236e0 20 4f 70 63 6f 64 65 3a 20 4e 65 78 74 20 50 31   Opcode: Next P1
236f0 20 50 32 20 2a 20 50 34 20 50 35 0a 2a 2a 0a 2a   P2 * P4 P5.**.*
23700 2a 20 41 64 76 61 6e 63 65 20 63 75 72 73 6f 72  * Advance cursor
23710 20 50 31 20 73 6f 20 74 68 61 74 20 69 74 20 70   P1 so that it p
23720 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 65 78  oints to the nex
23730 74 20 6b 65 79 2f 64 61 74 61 20 70 61 69 72 20  t key/data pair 
23740 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62 6c 65 20  in its.** table 
23750 6f 72 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68  or index.  If th
23760 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
23770 6b 65 79 2f 76 61 6c 75 65 20 70 61 69 72 73 20  key/value pairs 
23780 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67  then fall throug
23790 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c  h.** to the foll
237a0 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f  owing instructio
237b0 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 63  n.  But if the c
237c0 75 72 73 6f 72 20 61 64 76 61 6e 63 65 20 77 61  ursor advance wa
237d0 73 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  s successful,.**
237e0 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
237f0 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54  y to P2..**.** T
23800 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73  he P1 cursor mus
23810 74 20 62 65 20 66 6f 72 20 61 20 72 65 61 6c 20  t be for a real 
23820 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65  table, not a pse
23830 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  udo-table..**.**
23840 20 50 34 20 69 73 20 61 6c 77 61 79 73 20 6f 66   P4 is always of
23850 20 74 79 70 65 20 50 34 5f 41 44 56 41 4e 43 45   type P4_ADVANCE
23860 2e 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 70  . The function p
23870 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  ointer points to
23880 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
23890 4e 65 78 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Next()..**.** If
238a0 20 50 35 20 69 73 20 70 6f 73 69 74 69 76 65 20   P5 is positive 
238b0 61 6e 64 20 74 68 65 20 6a 75 6d 70 20 69 73 20  and the jump is 
238c0 74 61 6b 65 6e 2c 20 74 68 65 6e 20 65 76 65 6e  taken, then even
238d0 74 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 6e 75 6d  t counter.** num
238e0 62 65 72 20 50 35 2d 31 20 69 6e 20 74 68 65 20  ber P5-1 in the 
238f0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
23900 6e 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  nt is incremente
23910 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  d..**.** See als
23920 6f 3a 20 50 72 65 76 0a 2a 2f 0a 2f 2a 20 4f 70  o: Prev.*/./* Op
23930 63 6f 64 65 3a 20 50 72 65 76 20 50 31 20 50 32  code: Prev P1 P2
23940 20 2a 20 2a 20 50 35 0a 2a 2a 0a 2a 2a 20 42 61   * * P5.**.** Ba
23950 63 6b 20 75 70 20 63 75 72 73 6f 72 20 50 31 20  ck up cursor P1 
23960 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
23970 73 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  s to the previou
23980 73 20 6b 65 79 2f 64 61 74 61 20 70 61 69 72 20  s key/data pair 
23990 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62 6c 65 20  in its.** table 
239a0 6f 72 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68  or index.  If th
239b0 65 72 65 20 69 73 20 6e 6f 20 70 72 65 76 69 6f  ere is no previo
239c0 75 73 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69  us key/value pai
239d0 72 73 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  rs then fall thr
239e0 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ough.** to the f
239f0 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63  ollowing instruc
23a00 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 20 74 68  tion.  But if th
23a10 65 20 63 75 72 73 6f 72 20 62 61 63 6b 75 70 20  e cursor backup 
23a20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 0a  was successful,.
23a30 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  ** jump immediat
23a40 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a  ely to P2..**.**
23a50 20 54 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d   The P1 cursor m
23a60 75 73 74 20 62 65 20 66 6f 72 20 61 20 72 65 61  ust be for a rea
23a70 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70  l table, not a p
23a80 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a  seudo-table..**.
23a90 2a 2a 20 50 34 20 69 73 20 61 6c 77 61 79 73 20  ** P4 is always 
23aa0 6f 66 20 74 79 70 65 20 50 34 5f 41 44 56 41 4e  of type P4_ADVAN
23ab0 43 45 2e 20 54 68 65 20 66 75 6e 63 74 69 6f 6e  CE. The function
23ac0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
23ad0 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  to.** sqlite3Btr
23ae0 65 65 50 72 65 76 69 6f 75 73 28 29 2e 0a 2a 2a  eePrevious()..**
23af0 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 70 6f 73  .** If P5 is pos
23b00 69 74 69 76 65 20 61 6e 64 20 74 68 65 20 6a 75  itive and the ju
23b10 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20 74 68 65  mp is taken, the
23b20 6e 20 65 76 65 6e 74 20 63 6f 75 6e 74 65 72 0a  n event counter.
23b30 2a 2a 20 6e 75 6d 62 65 72 20 50 35 2d 31 20 69  ** number P5-1 i
23b40 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
23b50 74 61 74 65 6d 65 6e 74 20 69 73 20 69 6e 63 72  tatement is incr
23b60 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 63 61 73 65  emented..*/.case
23b70 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20   OP_SorterNext: 
23b80 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 23 69     /* jump */.#i
23b90 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
23ba0 5f 4d 45 52 47 45 5f 53 4f 52 54 0a 20 20 70 4f  _MERGE_SORT.  pO
23bb0 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
23bc0 65 78 74 3b 0a 23 65 6e 64 69 66 0a 63 61 73 65  ext;.#endif.case
23bd0 20 4f 50 5f 50 72 65 76 3a 20 20 20 20 20 20 20   OP_Prev:       
23be0 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61     /* jump */.ca
23bf0 73 65 20 4f 50 5f 4e 65 78 74 3a 20 7b 20 20 20  se OP_Next: {   
23c00 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
23c10 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
23c20 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20  ;.  int res;..  
23c30 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52 52  CHECK_FOR_INTERR
23c40 55 50 54 3b 0a 20 20 61 73 73 65 72 74 28 20 70  UPT;.  assert( p
23c50 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
23c60 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
23c70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
23c80 2d 3e 70 35 3c 3d 41 72 72 61 79 53 69 7a 65 28  ->p5<=ArraySize(
23c90 70 2d 3e 61 43 6f 75 6e 74 65 72 29 20 29 3b 0a  p->aCounter) );.
23ca0 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
23cb0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20  pOp->p1];.  if( 
23cc0 70 43 3d 3d 30 20 29 7b 0a 20 20 20 20 62 72 65  pC==0 ){.    bre
23cd0 61 6b 3b 20 20 2f 2a 20 53 65 65 20 74 69 63 6b  ak;  /* See tick
23ce0 65 74 20 23 32 32 37 33 20 2a 2f 0a 20 20 7d 0a  et #2273 */.  }.
23cf0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73    assert( pC->is
23d00 53 6f 72 74 65 72 3d 3d 28 70 4f 70 2d 3e 6f 70  Sorter==(pOp->op
23d10 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 4e  code==OP_SorterN
23d20 65 78 74 29 20 29 3b 0a 20 20 69 66 28 20 69 73  ext) );.  if( is
23d30 53 6f 72 74 65 72 28 70 43 29 20 29 7b 0a 20 20  Sorter(pC) ){.  
23d40 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
23d50 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72  pcode==OP_Sorter
23d60 4e 65 78 74 20 29 3b 0a 20 20 20 20 72 63 20 3d  Next );.    rc =
23d70 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
23d80 65 72 4e 65 78 74 28 64 62 2c 20 70 43 2c 20 26  erNext(db, pC, &
23d90 72 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  res);.  }else{. 
23da0 20 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 20 20     res = 1;.    
23db0 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65  assert( pC->defe
23dc0 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
23dd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
23de0 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
23df0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
23e00 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 20 7c 7c 20  ode!=OP_Next || 
23e10 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
23e20 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  ==sqlite3BtreeNe
23e30 78 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  xt );.    assert
23e40 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f  ( pOp->opcode!=O
23e50 50 5f 50 72 65 76 20 7c 7c 20 70 4f 70 2d 3e 70  P_Prev || pOp->p
23e60 34 2e 78 41 64 76 61 6e 63 65 3d 3d 73 71 6c 69  4.xAdvance==sqli
23e70 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
23e80 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 4f 70   );.    rc = pOp
23e90 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 28 70 43  ->p4.xAdvance(pC
23ea0 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29  ->pCursor, &res)
23eb0 3b 0a 20 20 7d 0a 20 20 70 43 2d 3e 6e 75 6c 6c  ;.  }.  pC->null
23ec0 52 6f 77 20 3d 20 28 75 38 29 72 65 73 3b 0a 20  Row = (u8)res;. 
23ed0 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
23ee0 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
23ef0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
23f00 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
23f10 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 4f   - 1;.    if( pO
23f20 70 2d 3e 70 35 20 29 20 70 2d 3e 61 43 6f 75 6e  p->p5 ) p->aCoun
23f30 74 65 72 5b 70 4f 70 2d 3e 70 35 2d 31 5d 2b 2b  ter[pOp->p5-1]++
23f40 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
23f50 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33  TEST.    sqlite3
23f60 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b  _search_count++;
23f70 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 43  .#endif.  }.  pC
23f80 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d  ->rowidIsValid =
23f90 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   0;.  break;.}..
23fa0 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 49 6e  /* Opcode: IdxIn
23fb0 73 65 72 74 20 50 31 20 50 32 20 50 33 20 2a 20  sert P1 P2 P3 * 
23fc0 50 35 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65  P5.**.** Registe
23fd0 72 20 50 32 20 68 6f 6c 64 73 20 61 6e 20 53 51  r P2 holds an SQ
23fe0 4c 20 69 6e 64 65 78 20 6b 65 79 20 6d 61 64 65  L index key made
23ff0 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 4d 61   using the.** Ma
24000 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63  keRecord instruc
24010 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 6f 70 63  tions.  This opc
24020 6f 64 65 20 77 72 69 74 65 73 20 74 68 61 74 20  ode writes that 
24030 6b 65 79 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  key.** into the 
24040 69 6e 64 65 78 20 50 31 2e 20 20 44 61 74 61 20  index P1.  Data 
24050 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 69 73  for the entry is
24060 20 6e 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 33 20 69   nil..**.** P3 i
24070 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 70 72  s a flag that pr
24080 6f 76 69 64 65 73 20 61 20 68 69 6e 74 20 74 6f  ovides a hint to
24090 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65   the b-tree laye
240a0 72 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 69  r that this.** i
240b0 6e 73 65 72 74 20 69 73 20 6c 69 6b 65 6c 79 20  nsert is likely 
240c0 74 6f 20 62 65 20 61 6e 20 61 70 70 65 6e 64 2e  to be an append.
240d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74  .**.** This inst
240e0 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72  ruction only wor
240f0 6b 73 20 66 6f 72 20 69 6e 64 69 63 65 73 2e 20  ks for indices. 
24100 20 54 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   The equivalent 
24110 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66  instruction.** f
24120 6f 72 20 74 61 62 6c 65 73 20 69 73 20 4f 50 5f  or tables is OP_
24130 49 6e 73 65 72 74 2e 0a 2a 2f 0a 63 61 73 65 20  Insert..*/.case 
24140 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3a  OP_SorterInsert:
24150 20 20 20 20 20 20 20 2f 2a 20 69 6e 32 20 2a 2f         /* in2 */
24160 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
24170 4d 49 54 5f 4d 45 52 47 45 5f 53 4f 52 54 0a 20  MIT_MERGE_SORT. 
24180 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
24190 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a 23 65 6e  P_IdxInsert;.#en
241a0 64 69 66 0a 63 61 73 65 20 4f 50 5f 49 64 78 49  dif.case OP_IdxI
241b0 6e 73 65 72 74 3a 20 7b 20 20 20 20 20 20 20 20  nsert: {        
241c0 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56 64 62 65  /* in2 */.  Vdbe
241d0 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74  Cursor *pC;.  Bt
241e0 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20  Cursor *pCrsr;. 
241f0 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 63 6f 6e   int nKey;.  con
24200 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 0a  st char *zKey;..
24210 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
24220 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
24230 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
24240 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
24250 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
24260 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
24270 65 72 74 28 20 70 43 2d 3e 69 73 53 6f 72 74 65  ert( pC->isSorte
24280 72 3d 3d 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  r==(pOp->opcode=
24290 3d 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74  =OP_SorterInsert
242a0 29 20 29 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61  ) );.  pIn2 = &a
242b0 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
242c0 61 73 73 65 72 74 28 20 70 49 6e 32 2d 3e 66 6c  assert( pIn2->fl
242d0 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
242e0 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e  ;.  pCrsr = pC->
242f0 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 41  pCursor;.  if( A
24300 4c 57 41 59 53 28 70 43 72 73 72 21 3d 30 29 20  LWAYS(pCrsr!=0) 
24310 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
24320 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b  C->isTable==0 );
24330 0a 20 20 20 20 72 63 20 3d 20 45 78 70 61 6e 64  .    rc = Expand
24340 42 6c 6f 62 28 70 49 6e 32 29 3b 0a 20 20 20 20  Blob(pIn2);.    
24350 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24360 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
24370 73 53 6f 72 74 65 72 28 70 43 29 20 29 7b 0a 20  sSorter(pC) ){. 
24380 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
24390 74 65 33 56 64 62 65 53 6f 72 74 65 72 57 72 69  te3VdbeSorterWri
243a0 74 65 28 64 62 2c 20 70 43 2c 20 70 49 6e 32 29  te(db, pC, pIn2)
243b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
243c0 20 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 49         nKey = pI
243d0 6e 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7a  n2->n;.        z
243e0 4b 65 79 20 3d 20 70 49 6e 32 2d 3e 7a 3b 0a 20  Key = pIn2->z;. 
243f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
24400 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 70  te3BtreeInsert(p
24410 43 72 73 72 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79  Crsr, zKey, nKey
24420 2c 20 22 22 2c 20 30 2c 20 30 2c 20 70 4f 70 2d  , "", 0, 0, pOp-
24430 3e 70 33 2c 20 0a 20 20 20 20 20 20 20 20 20 20  >p3, .          
24440 20 20 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50    ((pOp->p5 & OP
24450 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
24460 4c 54 29 20 3f 20 70 43 2d 3e 73 65 65 6b 52 65  LT) ? pC->seekRe
24470 73 75 6c 74 20 3a 20 30 29 0a 20 20 20 20 20 20  sult : 0).      
24480 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
24490 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66   assert( pC->def
244a0 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29  erredMoveto==0 )
244b0 3b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 63 61  ;.        pC->ca
244c0 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
244d0 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20 7d  E_STALE;.      }
244e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
244f0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
24500 3a 20 49 64 78 44 65 6c 65 74 65 20 50 31 20 50  : IdxDelete P1 P
24510 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  2 P3 * *.**.** T
24520 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 50 33  he content of P3
24530 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
24540 69 6e 67 20 61 74 20 72 65 67 69 73 74 65 72 20  ing at register 
24550 50 32 20 66 6f 72 6d 0a 2a 2a 20 61 6e 20 75 6e  P2 form.** an un
24560 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
24570 2e 20 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65  . This opcode re
24580 6d 6f 76 65 73 20 74 68 61 74 20 65 6e 74 72 79  moves that entry
24590 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 69 6e   from the .** in
245a0 64 65 78 20 6f 70 65 6e 65 64 20 62 79 20 63 75  dex opened by cu
245b0 72 73 6f 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65  rsor P1..*/.case
245c0 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 3a 20 7b   OP_IdxDelete: {
245d0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
245e0 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  C;.  BtCursor *p
245f0 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b  Crsr;.  int res;
24600 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
24610 64 20 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  d r;..  assert( 
24620 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 61  pOp->p3>0 );.  a
24630 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30  ssert( pOp->p2>0
24640 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d   && pOp->p2+pOp-
24650 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29  >p3<=p->nMem+1 )
24660 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
24670 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
24680 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
24690 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
246a0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
246b0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70  rt( pC!=0 );.  p
246c0 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73  Crsr = pC->pCurs
246d0 6f 72 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  or;.  if( ALWAYS
246e0 28 70 43 72 73 72 21 3d 30 29 20 29 7b 0a 20 20  (pCrsr!=0) ){.  
246f0 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70    r.pKeyInfo = p
24700 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  C->pKeyInfo;.   
24710 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36   r.nField = (u16
24720 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 72 2e  )pOp->p3;.    r.
24730 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 72  flags = 0;.    r
24740 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f  .aMem = &aMem[pO
24750 70 2d 3e 70 32 5d 3b 0a 23 69 66 64 65 66 20 53  p->p2];.#ifdef S
24760 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
24770 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30  { int i; for(i=0
24780 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b  ; i<r.nField; i+
24790 2b 29 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73  +) assert( memIs
247a0 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d  Valid(&r.aMem[i]
247b0 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20  ) ); }.#endif.  
247c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
247d0 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
247e0 64 28 70 43 72 73 72 2c 20 26 72 2c 20 30 2c 20  d(pCrsr, &r, 0, 
247f0 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66  0, &res);.    if
24800 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24810 26 26 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  && res==0 ){.   
24820 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
24830 74 72 65 65 44 65 6c 65 74 65 28 70 43 72 73 72  treeDelete(pCrsr
24840 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
24850 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65  ert( pC->deferre
24860 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20  dMoveto==0 );.  
24870 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
24880 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
24890 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
248a0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 52  ./* Opcode: IdxR
248b0 6f 77 69 64 20 50 31 20 50 32 20 2a 20 2a 20 2a  owid P1 P2 * * *
248c0 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74  .**.** Write int
248d0 6f 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e  o register P2 an
248e0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
248f0 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  s the last entry
24900 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 61   in the record a
24910 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20  t.** the end of 
24920 74 68 65 20 69 6e 64 65 78 20 6b 65 79 20 70 6f  the index key po
24930 69 6e 74 65 64 20 74 6f 20 62 79 20 63 75 72 73  inted to by curs
24940 6f 72 20 50 31 2e 20 20 54 68 69 73 20 69 6e 74  or P1.  This int
24950 65 67 65 72 20 73 68 6f 75 6c 64 20 62 65 0a 2a  eger should be.*
24960 2a 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  * the rowid of t
24970 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 74  he table entry t
24980 6f 20 77 68 69 63 68 20 74 68 69 73 20 69 6e 64  o which this ind
24990 65 78 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 2e  ex entry points.
249a0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
249b0 20 52 6f 77 69 64 2c 20 4d 61 6b 65 52 65 63 6f   Rowid, MakeReco
249c0 72 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  rd..*/.case OP_I
249d0 64 78 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20  dxRowid: {      
249e0 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
249f0 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
24a00 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
24a10 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
24a20 43 3b 0a 20 20 69 36 34 20 72 6f 77 69 64 3b 0a  C;.  i64 rowid;.
24a30 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
24a40 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
24a50 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
24a60 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
24a70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
24a80 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70 43  t( pC!=0 );.  pC
24a90 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  rsr = pC->pCurso
24aa0 72 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  r;.  pOut->flags
24ab0 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 69   = MEM_Null;.  i
24ac0 66 28 20 41 4c 57 41 59 53 28 70 43 72 73 72 21  f( ALWAYS(pCrsr!
24ad0 3d 30 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =0) ){.    rc = 
24ae0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
24af0 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 20  rMoveto(pC);.   
24b00 20 69 66 28 20 4e 45 56 45 52 28 72 63 29 20 29   if( NEVER(rc) )
24b10 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
24b20 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 61 73  to_error;.    as
24b30 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72  sert( pC->deferr
24b40 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20  edMoveto==0 );. 
24b50 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
24b60 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  sTable==0 );.   
24b70 20 69 66 28 20 21 70 43 2d 3e 6e 75 6c 6c 52 6f   if( !pC->nullRo
24b80 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  w ){.      rc = 
24b90 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
24ba0 77 69 64 28 64 62 2c 20 70 43 72 73 72 2c 20 26  wid(db, pCrsr, &
24bb0 72 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66  rowid);.      if
24bc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24bd0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
24be0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
24bf0 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
24c00 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 6f    pOut->u.i = ro
24c10 77 69 64 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  wid;.      pOut-
24c20 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
24c30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
24c40 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
24c50 65 3a 20 49 64 78 47 45 20 50 31 20 50 32 20 50  e: IdxGE P1 P2 P
24c60 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68  3 P4 P5.**.** Th
24c70 65 20 50 34 20 72 65 67 69 73 74 65 72 20 76 61  e P4 register va
24c80 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77  lues beginning w
24c90 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e 20 75  ith P3 form an u
24ca0 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a  npacked index .*
24cb0 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69 74 73  * key that omits
24cc0 20 74 68 65 20 52 4f 57 49 44 2e 20 20 43 6f 6d   the ROWID.  Com
24cd0 70 61 72 65 20 74 68 69 73 20 6b 65 79 20 76 61  pare this key va
24ce0 6c 75 65 20 61 67 61 69 6e 73 74 20 74 68 65 20  lue against the 
24cf0 69 6e 64 65 78 20 0a 2a 2a 20 74 68 61 74 20 50  index .** that P
24d00 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  1 is currently p
24d10 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f  ointing to, igno
24d20 72 69 6e 67 20 74 68 65 20 52 4f 57 49 44 20 6f  ring the ROWID o
24d30 6e 20 74 68 65 20 50 31 20 69 6e 64 65 78 2e 0a  n the P1 index..
24d40 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20  **.** If the P1 
24d50 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 67  index entry is g
24d60 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
24d70 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20  qual to the key 
24d80 76 61 6c 75 65 0a 2a 2a 20 74 68 65 6e 20 6a 75  value.** then ju
24d90 6d 70 20 74 6f 20 50 32 2e 20 20 4f 74 68 65 72  mp to P2.  Other
24da0 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67  wise fall throug
24db0 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
24dc0 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
24dd0 20 49 66 20 50 35 20 69 73 20 6e 6f 6e 2d 7a 65   If P5 is non-ze
24de0 72 6f 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20  ro then the key 
24df0 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73  value is increas
24e00 65 64 20 62 79 20 61 6e 20 65 70 73 69 6c 6f 6e  ed by an epsilon
24e10 20 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68   .** prior to th
24e20 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  e comparison.  T
24e30 68 69 73 20 6d 61 6b 65 20 74 68 65 20 6f 70 63  his make the opc
24e40 6f 64 65 20 77 6f 72 6b 20 6c 69 6b 65 20 49 64  ode work like Id
24e50 78 47 54 20 65 78 63 65 70 74 0a 2a 2a 20 74 68  xGT except.** th
24e60 61 74 20 69 66 20 74 68 65 20 6b 65 79 20 66 72  at if the key fr
24e70 6f 6d 20 72 65 67 69 73 74 65 72 20 50 33 20 69  om register P3 i
24e80 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
24e90 65 20 6b 65 79 20 69 6e 20 74 68 65 20 63 75 72  e key in the cur
24ea0 73 6f 72 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75  sor,.** the resu
24eb0 6c 74 20 69 73 20 66 61 6c 73 65 20 77 68 65 72  lt is false wher
24ec0 65 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20  eas it would be 
24ed0 74 72 75 65 20 77 69 74 68 20 49 64 78 47 54 2e  true with IdxGT.
24ee0 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .*/./* Opcode: I
24ef0 64 78 4c 54 20 50 31 20 50 32 20 50 33 20 50 34  dxLT P1 P2 P3 P4
24f00 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34   P5.**.** The P4
24f10 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 73   register values
24f20 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
24f30 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63  P3 form an unpac
24f40 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b 65  ked index .** ke
24f50 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65  y that omits the
24f60 20 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72 65   ROWID.  Compare
24f70 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20   this key value 
24f80 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65  against the inde
24f90 78 20 0a 2a 2a 20 74 68 61 74 20 50 31 20 69 73  x .** that P1 is
24fa0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
24fb0 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67  ing to, ignoring
24fc0 20 74 68 65 20 52 4f 57 49 44 20 6f 6e 20 74 68   the ROWID on th
24fd0 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  e P1 index..**.*
24fe0 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e 64 65  * If the P1 inde
24ff0 78 20 65 6e 74 72 79 20 69 73 20 6c 65 73 73 20  x entry is less 
25000 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61 6c  than the key val
25010 75 65 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ue then jump to 
25020 50 32 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  P2..** Otherwise
25030 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
25040 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
25050 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
25060 50 35 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  P5 is non-zero t
25070 68 65 6e 20 74 68 65 20 6b 65 79 20 76 61 6c 75  hen the key valu
25080 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 62  e is increased b
25090 79 20 61 6e 20 65 70 73 69 6c 6f 6e 20 70 72 69  y an epsilon pri
250a0 6f 72 20 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f  or .** to the co
250b0 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 69 73 20  mparison.  This 
250c0 6d 61 6b 65 73 20 74 68 65 20 6f 70 63 6f 64 65  makes the opcode
250d0 20 77 6f 72 6b 20 6c 69 6b 65 20 49 64 78 4c 45   work like IdxLE
250e0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78  ..*/.case OP_Idx
250f0 4c 54 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  LT:          /* 
25100 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  jump */.case OP_
25110 49 64 78 47 45 3a 20 7b 20 20 20 20 20 20 20 20  IdxGE: {        
25120 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62  /* jump */.  Vdb
25130 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69  eCursor *pC;.  i
25140 6e 74 20 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b  nt res;.  Unpack
25150 65 64 52 65 63 6f 72 64 20 72 3b 0a 0a 20 20 61  edRecord r;..  a
25160 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
25170 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
25180 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
25190 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
251a0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
251b0 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
251c0 28 20 70 43 2d 3e 69 73 4f 72 64 65 72 65 64 20  ( pC->isOrdered 
251d0 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
251e0 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 29 20  pC->pCursor!=0) 
251f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
25200 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
25210 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  o==0 );.    asse
25220 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c  rt( pOp->p5==0 |
25230 7c 20 70 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b 0a  | pOp->p5==1 );.
25240 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
25250 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
25260 32 20 29 3b 0a 20 20 20 20 72 2e 70 4b 65 79 49  2 );.    r.pKeyI
25270 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e  nfo = pC->pKeyIn
25280 66 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64  fo;.    r.nField
25290 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 34 2e   = (u16)pOp->p4.
252a0 69 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  i;.    if( pOp->
252b0 70 35 20 29 7b 0a 20 20 20 20 20 20 72 2e 66 6c  p5 ){.      r.fl
252c0 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 49  ags = UNPACKED_I
252d0 4e 43 52 4b 45 59 20 7c 20 55 4e 50 41 43 4b 45  NCRKEY | UNPACKE
252e0 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 3b 0a  D_IGNORE_ROWID;.
252f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25300 20 72 2e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43   r.flags = UNPAC
25310 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44  KED_IGNORE_ROWID
25320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 2e 61 4d  ;.    }.    r.aM
25330 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  em = &aMem[pOp->
25340 70 33 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  p3];.#ifdef SQLI
25350 54 45 5f 44 45 42 55 47 0a 20 20 20 20 7b 20 69  TE_DEBUG.    { i
25360 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69  nt i; for(i=0; i
25370 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20  <r.nField; i++) 
25380 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
25390 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29  id(&r.aMem[i]) )
253a0 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  ; }.#endif.    r
253b0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49  c = sqlite3VdbeI
253c0 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 70 43 2c  dxKeyCompare(pC,
253d0 20 26 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20   &r, &res);.    
253e0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
253f0 3d 4f 50 5f 49 64 78 4c 54 20 29 7b 0a 20 20 20  =OP_IdxLT ){.   
25400 20 20 20 72 65 73 20 3d 20 2d 72 65 73 3b 0a 20     res = -res;. 
25410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25420 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
25430 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b  ode==OP_IdxGE );
25440 0a 20 20 20 20 20 20 72 65 73 2b 2b 3b 0a 20 20  .      res++;.  
25450 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 3e    }.    if( res>
25460 30 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20  0 ){.      pc = 
25470 70 4f 70 2d 3e 70 32 20 2d 20 31 20 3b 0a 20 20  pOp->p2 - 1 ;.  
25480 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
25490 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  .}../* Opcode: D
254a0 65 73 74 72 6f 79 20 50 31 20 50 32 20 50 33 20  estroy P1 P2 P3 
254b0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65  * *.**.** Delete
254c0 20 61 6e 20 65 6e 74 69 72 65 20 64 61 74 61 62   an entire datab
254d0 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ase table or ind
254e0 65 78 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61  ex whose root pa
254f0 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
25500 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 67 69  se.** file is gi
25510 76 65 6e 20 62 79 20 50 31 2e 0a 2a 2a 0a 2a 2a  ven by P1..**.**
25520 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
25530 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 69 6e   destroyed is in
25540 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
25550 73 65 20 66 69 6c 65 20 69 66 20 50 33 3d 3d 30  se file if P3==0
25560 2e 20 20 49 66 0a 2a 2a 20 50 33 3d 3d 31 20 74  .  If.** P3==1 t
25570 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f  hen the table to
25580 20 62 65 20 63 6c 65 61 72 20 69 73 20 69 6e 20   be clear is in 
25590 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
255a0 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74  tabase file.** t
255b0 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  hat is used to s
255c0 74 6f 72 65 20 74 61 62 6c 65 73 20 63 72 65 61  tore tables crea
255d0 74 65 20 75 73 69 6e 67 20 43 52 45 41 54 45 20  te using CREATE 
255e0 54 45 4d 50 4f 52 41 52 59 20 54 41 42 4c 45 2e  TEMPORARY TABLE.
255f0 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41  .**.** If AUTOVA
25600 43 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20  CUUM is enabled 
25610 74 68 65 6e 20 69 74 20 69 73 20 70 6f 73 73 69  then it is possi
25620 62 6c 65 20 74 68 61 74 20 61 6e 6f 74 68 65 72  ble that another
25630 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 6d 69   root page.** mi
25640 67 68 74 20 62 65 20 6d 6f 76 65 64 20 69 6e 74  ght be moved int
25650 6f 20 74 68 65 20 6e 65 77 6c 79 20 64 65 6c 65  o the newly dele
25660 74 65 64 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ted root page in
25670 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 61   order to keep a
25680 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73  ll.** root pages
25690 20 63 6f 6e 74 69 67 75 6f 75 73 20 61 74 20 74   contiguous at t
256a0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
256b0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
256c0 68 65 20 66 6f 72 6d 65 72 0a 2a 2a 20 76 61 6c  he former.** val
256d0 75 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 70  ue of the root p
256e0 61 67 65 20 74 68 61 74 20 6d 6f 76 65 64 20 2d  age that moved -
256f0 20 69 74 73 20 76 61 6c 75 65 20 62 65 66 6f 72   its value befor
25700 65 20 74 68 65 20 6d 6f 76 65 20 6f 63 63 75 72  e the move occur
25710 72 65 64 20 2d 0a 2a 2a 20 69 73 20 73 74 6f 72  red -.** is stor
25720 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
25730 32 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20 0a  2.  If no page .
25740 2a 2a 20 6d 6f 76 65 6d 65 6e 74 20 77 61 73 20  ** movement was 
25750 72 65 71 75 69 72 65 64 20 28 62 65 63 61 75 73  required (becaus
25760 65 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  e the table bein
25770 67 20 64 72 6f 70 70 65 64 20 77 61 73 20 61 6c  g dropped was al
25780 72 65 61 64 79 20 0a 2a 2a 20 74 68 65 20 6c 61  ready .** the la
25790 73 74 20 6f 6e 65 20 69 6e 20 74 68 65 20 64 61  st one in the da
257a0 74 61 62 61 73 65 29 20 74 68 65 6e 20 61 20 7a  tabase) then a z
257b0 65 72 6f 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ero is stored in
257c0 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
257d0 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69   If AUTOVACUUM i
257e0 73 20 64 69 73 61 62 6c 65 64 20 74 68 65 6e 20  s disabled then 
257f0 61 20 7a 65 72 6f 20 69 73 20 73 74 6f 72 65 64  a zero is stored
25800 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
25810 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
25820 20 43 6c 65 61 72 0a 2a 2f 0a 63 61 73 65 20 4f   Clear.*/.case O
25830 50 5f 44 65 73 74 72 6f 79 3a 20 7b 20 20 20 20  P_Destroy: {    
25840 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65   /* out2-prerele
25850 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 6f  ase */.  int iMo
25860 76 65 64 3b 0a 20 20 69 6e 74 20 69 43 6e 74 3b  ved;.  int iCnt;
25870 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65 3b 0a  .  Vdbe *pVdbe;.
25880 20 20 69 6e 74 20 69 44 62 3b 0a 23 69 66 6e 64    int iDb;.#ifnd
25890 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
258a0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 43  IRTUALTABLE.  iC
258b0 6e 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 56  nt = 0;.  for(pV
258c0 64 62 65 3d 64 62 2d 3e 70 56 64 62 65 3b 20 70  dbe=db->pVdbe; p
258d0 56 64 62 65 3b 20 70 56 64 62 65 20 3d 20 70 56  Vdbe; pVdbe = pV
258e0 64 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  dbe->pNext){.   
258f0 20 69 66 28 20 70 56 64 62 65 2d 3e 6d 61 67 69   if( pVdbe->magi
25900 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
25910 4e 20 26 26 20 70 56 64 62 65 2d 3e 69 6e 56 74  N && pVdbe->inVt
25920 61 62 4d 65 74 68 6f 64 3c 32 20 26 26 20 70 56  abMethod<2 && pV
25930 64 62 65 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  dbe->pc>=0 ){.  
25940 20 20 20 20 69 43 6e 74 2b 2b 3b 0a 20 20 20 20      iCnt++;.    
25950 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 43  }.  }.#else.  iC
25960 6e 74 20 3d 20 64 62 2d 3e 61 63 74 69 76 65 56  nt = db->activeV
25970 64 62 65 43 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  dbeCnt;.#endif. 
25980 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
25990 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 69 66 28 20 69  EM_Null;.  if( i
259a0 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20 72 63 20  Cnt>1 ){.    rc 
259b0 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  = SQLITE_LOCKED;
259c0 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  .    p->errorAct
259d0 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
259e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 44 62    }else{.    iDb
259f0 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20   = pOp->p3;.    
25a00 61 73 73 65 72 74 28 20 69 43 6e 74 3d 3d 31 20  assert( iCnt==1 
25a10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
25a20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28  p->btreeMask & (
25a30 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44  ((yDbMask)1)<<iD
25a40 62 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 72 63  b))!=0 );.    rc
25a50 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44   = sqlite3BtreeD
25a60 72 6f 70 54 61 62 6c 65 28 64 62 2d 3e 61 44 62  ropTable(db->aDb
25a70 5b 69 44 62 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e  [iDb].pBt, pOp->
25a80 70 31 2c 20 26 69 4d 6f 76 65 64 29 3b 0a 20 20  p1, &iMoved);.  
25a90 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
25aa0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4f 75  MEM_Int;.    pOu
25ab0 74 2d 3e 75 2e 69 20 3d 20 69 4d 6f 76 65 64 3b  t->u.i = iMoved;
25ac0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25ad0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
25ae0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25af0 54 45 5f 4f 4b 20 26 26 20 69 4d 6f 76 65 64 21  TE_OK && iMoved!
25b00 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
25b10 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64  te3RootPageMoved
25b20 28 64 62 2c 20 69 44 62 2c 20 69 4d 6f 76 65 64  (db, iDb, iMoved
25b30 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20  , pOp->p1);.    
25b40 20 20 2f 2a 20 41 6c 6c 20 4f 50 5f 44 65 73 74    /* All OP_Dest
25b50 72 6f 79 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  roy operations o
25b60 63 63 75 72 20 6f 6e 20 74 68 65 20 73 61 6d 65  ccur on the same
25b70 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20   btree */.      
25b80 61 73 73 65 72 74 28 20 72 65 73 65 74 53 63 68  assert( resetSch
25b90 65 6d 61 4f 6e 46 61 75 6c 74 3d 3d 30 20 7c 7c  emaOnFault==0 ||
25ba0 20 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61   resetSchemaOnFa
25bb0 75 6c 74 3d 3d 69 44 62 2b 31 20 29 3b 0a 20 20  ult==iDb+1 );.  
25bc0 20 20 20 20 72 65 73 65 74 53 63 68 65 6d 61 4f      resetSchemaO
25bd0 6e 46 61 75 6c 74 20 3d 20 69 44 62 2b 31 3b 0a  nFault = iDb+1;.
25be0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
25bf0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
25c00 4f 70 63 6f 64 65 3a 20 43 6c 65 61 72 20 50 31  Opcode: Clear P1
25c10 20 50 32 20 50 33 0a 2a 2a 0a 2a 2a 20 44 65 6c   P2 P3.**.** Del
25c20 65 74 65 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 73  ete all contents
25c30 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
25c40 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
25c50 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 0a  whose root page.
25c60 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
25c70 73 65 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  se file is given
25c80 20 62 79 20 50 31 2e 20 20 42 75 74 2c 20 75 6e   by P1.  But, un
25c90 6c 69 6b 65 20 44 65 73 74 72 6f 79 2c 20 64 6f  like Destroy, do
25ca0 20 6e 6f 74 0a 2a 2a 20 72 65 6d 6f 76 65 20 74   not.** remove t
25cb0 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
25cc0 78 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  x from the datab
25cd0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
25ce0 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
25cf0 63 6c 65 61 72 20 69 73 20 69 6e 20 74 68 65 20  clear is in the 
25d00 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
25d10 6c 65 20 69 66 20 50 32 3d 3d 30 2e 20 20 49 66  le if P2==0.  If
25d20 0a 2a 2a 20 50 32 3d 3d 31 20 74 68 65 6e 20 74  .** P2==1 then t
25d30 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 63  he table to be c
25d40 6c 65 61 72 20 69 73 20 69 6e 20 74 68 65 20 61  lear is in the a
25d50 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
25d60 65 20 66 69 6c 65 0a 2a 2a 20 74 68 61 74 20 69  e file.** that i
25d70 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
25d80 74 61 62 6c 65 73 20 63 72 65 61 74 65 20 75 73  tables create us
25d90 69 6e 67 20 43 52 45 41 54 45 20 54 45 4d 50 4f  ing CREATE TEMPO
25da0 52 41 52 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  RARY TABLE..**.*
25db0 2a 20 49 66 20 74 68 65 20 50 33 20 76 61 6c 75  * If the P3 valu
25dc0 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  e is non-zero, t
25dd0 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 72 65  hen the table re
25de0 66 65 72 72 65 64 20 74 6f 20 6d 75 73 74 20 62  ferred to must b
25df0 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 74  e an.** intkey t
25e00 61 62 6c 65 20 28 61 6e 20 53 51 4c 20 74 61 62  able (an SQL tab
25e10 6c 65 2c 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78  le, not an index
25e20 29 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ). In this case 
25e30 74 68 65 20 72 6f 77 20 63 68 61 6e 67 65 20 0a  the row change .
25e40 2a 2a 20 63 6f 75 6e 74 20 69 73 20 69 6e 63 72  ** count is incr
25e50 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e  emented by the n
25e60 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
25e70 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
25e80 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2a 20 49 66   cleared. .** If
25e90 20 50 33 20 69 73 20 67 72 65 61 74 65 72 20 74   P3 is greater t
25ea0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
25eb0 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
25ec0 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 69  in register P3 i
25ed0 73 0a 2a 2a 20 61 6c 73 6f 20 69 6e 63 72 65 6d  s.** also increm
25ee0 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  ented by the num
25ef0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
25f00 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63  he table being c
25f10 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  leared..**.** Se
25f20 65 20 61 6c 73 6f 3a 20 44 65 73 74 72 6f 79 0a  e also: Destroy.
25f30 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6c 65 61 72  */.case OP_Clear
25f40 3a 20 7b 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67  : {.  int nChang
25f50 65 3b 0a 20 0a 20 20 6e 43 68 61 6e 67 65 20 3d  e;. .  nChange =
25f60 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   0;.  assert( (p
25f70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28  ->btreeMask & ((
25f80 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70  (yDbMask)1)<<pOp
25f90 2d 3e 70 32 29 29 21 3d 30 20 29 3b 0a 20 20 72  ->p2))!=0 );.  r
25fa0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
25fb0 43 6c 65 61 72 54 61 62 6c 65 28 0a 20 20 20 20  ClearTable(.    
25fc0 20 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70    db->aDb[pOp->p
25fd0 32 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 31 2c  2].pBt, pOp->p1,
25fe0 20 28 70 4f 70 2d 3e 70 33 20 3f 20 26 6e 43 68   (pOp->p3 ? &nCh
25ff0 61 6e 67 65 20 3a 20 30 29 0a 20 20 29 3b 0a 20  ange : 0).  );. 
26000 20 69 66 28 20 70 4f 70 2d 3e 70 33 20 29 7b 0a   if( pOp->p3 ){.
26010 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 2b      p->nChange +
26020 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 20 20 69  = nChange;.    i
26030 66 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 7b 0a  f( pOp->p3>0 ){.
26040 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
26050 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70  mIsValid(&aMem[p
26060 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a 20 20 20 20  Op->p3]) );.    
26070 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
26080 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d  ge(p, &aMem[pOp-
26090 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20 61 4d 65  >p3]);.      aMe
260a0 6d 5b 70 4f 70 2d 3e 70 33 5d 2e 75 2e 69 20 2b  m[pOp->p3].u.i +
260b0 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 20 20 7d  = nChange;.    }
260c0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
260d0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 72 65 61  ./* Opcode: Crea
260e0 74 65 54 61 62 6c 65 20 50 31 20 50 32 20 2a 20  teTable P1 P2 * 
260f0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  * *.**.** Alloca
26100 74 65 20 61 20 6e 65 77 20 74 61 62 6c 65 20 69  te a new table i
26110 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
26120 61 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d  ase file if P1==
26130 30 20 6f 72 20 69 6e 20 74 68 65 0a 2a 2a 20 61  0 or in the.** a
26140 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
26150 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 31 20  e file if P1==1 
26160 6f 72 20 69 6e 20 61 6e 20 61 74 74 61 63 68 65  or in an attache
26170 64 20 64 61 74 61 62 61 73 65 20 69 66 0a 2a 2a  d database if.**
26180 20 50 31 3e 31 2e 20 20 57 72 69 74 65 20 74 68   P1>1.  Write th
26190 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
261a0 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  er of the new ta
261b0 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69  ble into.** regi
261c0 73 74 65 72 20 50 32 0a 2a 2a 0a 2a 2a 20 54 68  ster P2.**.** Th
261d0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
261e0 77 65 65 6e 20 61 20 74 61 62 6c 65 20 61 6e 64  ween a table and
261f0 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74 68 69   an index is thi
26200 73 3a 20 20 41 20 74 61 62 6c 65 20 6d 75 73 74  s:  A table must
26210 0a 2a 2a 20 68 61 76 65 20 61 20 34 2d 62 79 74  .** have a 4-byt
26220 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 61 6e  e integer key an
26230 64 20 63 61 6e 20 68 61 76 65 20 61 72 62 69 74  d can have arbit
26240 72 61 72 79 20 64 61 74 61 2e 20 20 41 6e 20 69  rary data.  An i
26250 6e 64 65 78 0a 2a 2a 20 68 61 73 20 61 6e 20 61  ndex.** has an a
26260 72 62 69 74 72 61 72 79 20 6b 65 79 20 62 75 74  rbitrary key but
26270 20 6e 6f 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20   no data..**.** 
26280 53 65 65 20 61 6c 73 6f 3a 20 43 72 65 61 74 65  See also: Create
26290 49 6e 64 65 78 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  Index.*/./* Opco
262a0 64 65 3a 20 43 72 65 61 74 65 49 6e 64 65 78 20  de: CreateIndex 
262b0 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
262c0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
262d0 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 6d 61   index in the ma
262e0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
262f0 20 69 66 20 50 31 3d 3d 30 20 6f 72 20 69 6e 20   if P1==0 or in 
26300 74 68 65 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79  the.** auxiliary
26310 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
26320 66 20 50 31 3d 3d 31 20 6f 72 20 69 6e 20 61 6e  f P1==1 or in an
26330 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
26340 73 65 20 69 66 0a 2a 2a 20 50 31 3e 31 2e 20 20  se if.** P1>1.  
26350 57 72 69 74 65 20 74 68 65 20 72 6f 6f 74 20 70  Write the root p
26360 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
26370 65 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 74 6f  e new table into
26380 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 32 2e  .** register P2.
26390 0a 2a 2a 0a 2a 2a 20 53 65 65 20 64 6f 63 75 6d  .**.** See docum
263a0 65 6e 74 61 74 69 6f 6e 20 6f 6e 20 4f 50 5f 43  entation on OP_C
263b0 72 65 61 74 65 54 61 62 6c 65 20 66 6f 72 20 61  reateTable for a
263c0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
263d0 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ation..*/.case O
263e0 50 5f 43 72 65 61 74 65 49 6e 64 65 78 3a 20 20  P_CreateIndex:  
263f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
26400 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a  2-prerelease */.
26410 63 61 73 65 20 4f 50 5f 43 72 65 61 74 65 54 61  case OP_CreateTa
26420 62 6c 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ble: {          
26430 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61  /* out2-prerelea
26440 73 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f  se */.  int pgno
26450 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20  ;.  int flags;. 
26460 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 70 67 6e   Db *pDb;..  pgn
26470 6f 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  o = 0;.  assert(
26480 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
26490 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29  Op->p1<db->nDb )
264a0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  ;.  assert( (p->
264b0 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79  btreeMask & (((y
264c0 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e  DbMask)1)<<pOp->
264d0 70 31 29 29 21 3d 30 20 29 3b 0a 20 20 70 44 62  p1))!=0 );.  pDb
264e0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 4f 70 2d   = &db->aDb[pOp-
264f0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
26500 70 44 62 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  pDb->pBt!=0 );. 
26510 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
26520 3d 3d 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  ==OP_CreateTable
26530 20 29 7b 0a 20 20 20 20 2f 2a 20 66 6c 61 67 73   ){.    /* flags
26540 20 3d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 3b   = BTREE_INTKEY;
26550 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d 20   */.    flags = 
26560 42 54 52 45 45 5f 49 4e 54 4b 45 59 3b 0a 20 20  BTREE_INTKEY;.  
26570 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c 61 67 73  }else{.    flags
26580 20 3d 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59   = BTREE_BLOBKEY
26590 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
265a0 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
265b0 61 62 6c 65 28 70 44 62 2d 3e 70 42 74 2c 20 26  able(pDb->pBt, &
265c0 70 67 6e 6f 2c 20 66 6c 61 67 73 29 3b 0a 20 20  pgno, flags);.  
265d0 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 67 6e 6f  pOut->u.i = pgno
265e0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
265f0 20 4f 70 63 6f 64 65 3a 20 50 61 72 73 65 53 63   Opcode: ParseSc
26600 68 65 6d 61 20 50 31 20 2a 20 2a 20 50 34 20 2a  hema P1 * * P4 *
26610 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20  .**.** Read and 
26620 70 61 72 73 65 20 61 6c 6c 20 65 6e 74 72 69 65  parse all entrie
26630 73 20 66 72 6f 6d 20 74 68 65 20 53 51 4c 49 54  s from the SQLIT
26640 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
26650 66 20 64 61 74 61 62 61 73 65 20 50 31 0a 2a 2a  f database P1.**
26660 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20   that match the 
26670 57 48 45 52 45 20 63 6c 61 75 73 65 20 50 34 2e  WHERE clause P4.
26680 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63   .**.** This opc
26690 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ode invokes the 
266a0 70 61 72 73 65 72 20 74 6f 20 63 72 65 61 74 65  parser to create
266b0 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 6d   a new virtual m
266c0 61 63 68 69 6e 65 2c 0a 2a 2a 20 74 68 65 6e 20  achine,.** then 
266d0 72 75 6e 73 20 74 68 65 20 6e 65 77 20 76 69 72  runs the new vir
266e0 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 49  tual machine.  I
266f0 74 20 69 73 20 74 68 75 73 20 61 20 72 65 2d 65  t is thus a re-e
26700 6e 74 72 61 6e 74 20 6f 70 63 6f 64 65 2e 0a 2a  ntrant opcode..*
26710 2f 0a 63 61 73 65 20 4f 50 5f 50 61 72 73 65 53  /.case OP_ParseS
26720 63 68 65 6d 61 3a 20 7b 0a 20 20 69 6e 74 20 69  chema: {.  int i
26730 44 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db;.  const char
26740 20 2a 7a 4d 61 73 74 65 72 3b 0a 20 20 63 68 61   *zMaster;.  cha
26750 72 20 2a 7a 53 71 6c 3b 0a 20 20 49 6e 69 74 44  r *zSql;.  InitD
26760 61 74 61 20 69 6e 69 74 44 61 74 61 3b 0a 0a 20  ata initData;.. 
26770 20 2f 2a 20 41 6e 79 20 70 72 65 70 61 72 65 64   /* Any prepared
26780 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
26790 69 6e 76 6f 6b 65 73 20 74 68 69 73 20 6f 70 63  invokes this opc
267a0 6f 64 65 20 77 69 6c 6c 20 68 6f 6c 64 20 6d 75  ode will hold mu
267b0 74 65 78 65 73 0a 20 20 2a 2a 20 6f 6e 20 65 76  texes.  ** on ev
267c0 65 72 79 20 62 74 72 65 65 2e 20 20 54 68 69 73  ery btree.  This
267d0 20 69 73 20 61 20 70 72 65 72 65 71 75 69 73 69   is a prerequisi
267e0 74 65 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20  te for invoking 
267f0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 49 6e 69  .  ** sqlite3Ini
26800 74 43 61 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 2a  tCallback()..  *
26810 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
26820 44 45 42 55 47 0a 20 20 66 6f 72 28 69 44 62 3d  DEBUG.  for(iDb=
26830 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  0; iDb<db->nDb; 
26840 69 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  iDb++){.    asse
26850 72 74 28 20 69 44 62 3d 3d 31 20 7c 7c 20 73 71  rt( iDb==1 || sq
26860 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
26870 75 74 65 78 28 64 62 2d 3e 61 44 62 5b 69 44 62  utex(db->aDb[iDb
26880 5d 2e 70 42 74 29 20 29 3b 0a 20 20 7d 0a 23 65  ].pBt) );.  }.#e
26890 6e 64 69 66 0a 0a 20 20 69 44 62 20 3d 20 70 4f  ndif..  iDb = pO
268a0 70 2d 3e 70 31 3b 0a 20 20 61 73 73 65 72 74 28  p->p1;.  assert(
268b0 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
268c0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
268d0 72 74 28 20 44 62 48 61 73 50 72 6f 70 65 72 74  rt( DbHasPropert
268e0 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 53 63  y(db, iDb, DB_Sc
268f0 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 3b 0a 20  hemaLoaded) );. 
26900 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20 61   /* Used to be a
26910 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 2a 2f 20   conditional */ 
26920 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
26930 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
26940 29 3b 0a 20 20 20 20 69 6e 69 74 44 61 74 61 2e  );.    initData.
26950 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 69 6e 69  db = db;.    ini
26960 74 44 61 74 61 2e 69 44 62 20 3d 20 70 4f 70 2d  tData.iDb = pOp-
26970 3e 70 31 3b 0a 20 20 20 20 69 6e 69 74 44 61 74  >p1;.    initDat
26980 61 2e 70 7a 45 72 72 4d 73 67 20 3d 20 26 70 2d  a.pzErrMsg = &p-
26990 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 7a 53  >zErrMsg;.    zS
269a0 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  ql = sqlite3MPri
269b0 6e 74 66 28 64 62 2c 0a 20 20 20 20 20 20 20 22  ntf(db,.       "
269c0 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 72 6f 6f  SELECT name, roo
269d0 74 70 61 67 65 2c 20 73 71 6c 20 46 52 4f 4d 20  tpage, sql FROM 
269e0 27 25 71 27 2e 25 73 20 57 48 45 52 45 20 25 73  '%q'.%s WHERE %s
269f0 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 22   ORDER BY rowid"
26a00 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ,.       db->aDb
26a10 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 4d 61  [iDb].zName, zMa
26a20 73 74 65 72 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  ster, pOp->p4.z)
26a30 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d  ;.    if( zSql==
26a40 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
26a50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
26a60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
26a70 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
26a80 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  busy==0 );.     
26a90 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d   db->init.busy =
26aa0 20 31 3b 0a 20 20 20 20 20 20 69 6e 69 74 44 61   1;.      initDa
26ab0 74 61 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  ta.rc = SQLITE_O
26ac0 4b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  K;.      assert(
26ad0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
26ae0 65 64 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ed );.      rc =
26af0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
26b00 2c 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65 33 49  , zSql, sqlite3I
26b10 6e 69 74 43 61 6c 6c 62 61 63 6b 2c 20 26 69 6e  nitCallback, &in
26b20 69 74 44 61 74 61 2c 20 30 29 3b 0a 20 20 20 20  itData, 0);.    
26b30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26b40 5f 4f 4b 20 29 20 72 63 20 3d 20 69 6e 69 74 44  _OK ) rc = initD
26b50 61 74 61 2e 72 63 3b 0a 20 20 20 20 20 20 73 71  ata.rc;.      sq
26b60 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
26b70 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 64 62 2d  zSql);.      db-
26b80 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20 30 3b 0a  >init.busy = 0;.
26b90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
26ba0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
26bb0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f   ){.    goto no_
26bc0 6d 65 6d 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  mem;.  }.  break
26bd0 3b 20 20 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  ;  .}..#if !defi
26be0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
26bf0 41 4e 41 4c 59 5a 45 29 0a 2f 2a 20 4f 70 63 6f  ANALYZE)./* Opco
26c00 64 65 3a 20 4c 6f 61 64 41 6e 61 6c 79 73 69 73  de: LoadAnalysis
26c10 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
26c20 2a 20 52 65 61 64 20 74 68 65 20 73 71 6c 69 74  * Read the sqlit
26c30 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 66 6f  e_stat1 table fo
26c40 72 20 64 61 74 61 62 61 73 65 20 50 31 20 61 6e  r database P1 an
26c50 64 20 6c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65  d load the conte
26c60 6e 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74 61  nt.** of that ta
26c70 62 6c 65 20 69 6e 74 6f 20 74 68 65 20 69 6e 74  ble into the int
26c80 65 72 6e 61 6c 20 69 6e 64 65 78 20 68 61 73 68  ernal index hash
26c90 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 77 69   table.  This wi
26ca0 6c 6c 20 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  ll cause.** the 
26cb0 61 6e 61 6c 79 73 69 73 20 74 6f 20 62 65 20 75  analysis to be u
26cc0 73 65 64 20 77 68 65 6e 20 70 72 65 70 61 72 69  sed when prepari
26cd0 6e 67 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  ng all subsequen
26ce0 74 20 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 63 61  t queries..*/.ca
26cf0 73 65 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73  se OP_LoadAnalys
26d00 69 73 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20  is: {.  assert( 
26d10 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
26d20 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b  p->p1<db->nDb );
26d30 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
26d40 6e 61 6c 79 73 69 73 4c 6f 61 64 28 64 62 2c 20  nalysisLoad(db, 
26d50 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 62 72 65 61  pOp->p1);.  brea
26d60 6b 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;  .}.#endif /*
26d70 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
26d80 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 29 20 2a  _OMIT_ANALYZE) *
26d90 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72  /../* Opcode: Dr
26da0 6f 70 54 61 62 6c 65 20 50 31 20 2a 20 2a 20 50  opTable P1 * * P
26db0 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65  4 *.**.** Remove
26dc0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28 69   the internal (i
26dd0 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20 73  n-memory) data s
26de0 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20 64  tructures that d
26df0 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20 74  escribe.** the t
26e00 61 62 6c 65 20 6e 61 6d 65 64 20 50 34 20 69 6e  able named P4 in
26e10 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 20 54   database P1.  T
26e20 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66  his is called af
26e30 74 65 72 20 61 20 74 61 62 6c 65 0a 2a 2a 20 69  ter a table.** i
26e40 73 20 64 72 6f 70 70 65 64 20 69 6e 20 6f 72 64  s dropped in ord
26e50 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 69  er to keep the i
26e60 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e  nternal represen
26e70 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  tation of the.**
26e80 20 73 63 68 65 6d 61 20 63 6f 6e 73 69 73 74 65   schema consiste
26e90 6e 74 20 77 69 74 68 20 77 68 61 74 20 69 73 20  nt with what is 
26ea0 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65  on disk..*/.case
26eb0 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 3a 20 7b   OP_DropTable: {
26ec0 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  .  sqlite3Unlink
26ed0 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 64  AndDeleteTable(d
26ee0 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  b, pOp->p1, pOp-
26ef0 3e 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b 3b  >p4.z);.  break;
26f00 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  .}../* Opcode: D
26f10 72 6f 70 49 6e 64 65 78 20 50 31 20 2a 20 2a 20  ropIndex P1 * * 
26f20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76  P4 *.**.** Remov
26f30 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28  e the internal (
26f40 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20  in-memory) data 
26f50 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20  structures that 
26f60 64 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20  describe.** the 
26f70 69 6e 64 65 78 20 6e 61 6d 65 64 20 50 34 20 69  index named P4 i
26f80 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 20  n database P1.  
26f90 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  This is called a
26fa0 66 74 65 72 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  fter an index.**
26fb0 20 69 73 20 64 72 6f 70 70 65 64 20 69 6e 20 6f   is dropped in o
26fc0 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
26fd0 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73   internal repres
26fe0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  entation of the.
26ff0 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73 69 73  ** schema consis
27000 74 65 6e 74 20 77 69 74 68 20 77 68 61 74 20 69  tent with what i
27010 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61  s on disk..*/.ca
27020 73 65 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 3a  se OP_DropIndex:
27030 20 7b 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69   {.  sqlite3Unli
27040 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
27050 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  (db, pOp->p1, pO
27060 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61  p->p4.z);.  brea
27070 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
27080 20 44 72 6f 70 54 72 69 67 67 65 72 20 50 31 20   DropTrigger P1 
27090 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52  * * P4 *.**.** R
270a0 65 6d 6f 76 65 20 74 68 65 20 69 6e 74 65 72 6e  emove the intern
270b0 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29 20 64  al (in-memory) d
270c0 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 74  ata structures t
270d0 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a 2a 20  hat describe.** 
270e0 74 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65  the trigger name
270f0 64 20 50 34 20 69 6e 20 64 61 74 61 62 61 73 65  d P4 in database
27100 20 50 31 2e 20 20 54 68 69 73 20 69 73 20 63 61   P1.  This is ca
27110 6c 6c 65 64 20 61 66 74 65 72 20 61 20 74 72 69  lled after a tri
27120 67 67 65 72 0a 2a 2a 20 69 73 20 64 72 6f 70 70  gger.** is dropp
27130 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  ed in order to k
27140 65 65 70 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  eep the internal
27150 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
27160 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61  of the.** schema
27170 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
27180 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b   what is on disk
27190 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f  ..*/.case OP_Dro
271a0 70 54 72 69 67 67 65 72 3a 20 7b 0a 20 20 73 71  pTrigger: {.  sq
271b0 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
271c0 6c 65 74 65 54 72 69 67 67 65 72 28 64 62 2c 20  leteTrigger(db, 
271d0 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34  pOp->p1, pOp->p4
271e0 2e 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .z);.  break;.}.
271f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
27200 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
27210 43 48 45 43 4b 0a 2f 2a 20 4f 70 63 6f 64 65 3a  CHECK./* Opcode:
27220 20 49 6e 74 65 67 72 69 74 79 43 6b 20 50 31 20   IntegrityCk P1 
27230 50 32 20 50 33 20 2a 20 50 35 0a 2a 2a 0a 2a 2a  P2 P3 * P5.**.**
27240 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20   Do an analysis 
27250 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  of the currently
27260 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e 20   open database. 
27270 20 53 74 6f 72 65 20 69 6e 0a 2a 2a 20 72 65 67   Store in.** reg
27280 69 73 74 65 72 20 50 31 20 74 68 65 20 74 65 78  ister P1 the tex
27290 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 20 6d 65  t of an error me
272a0 73 73 61 67 65 20 64 65 73 63 72 69 62 69 6e 67  ssage describing
272b0 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 2a   any problems..*
272c0 2a 20 49 66 20 6e 6f 20 70 72 6f 62 6c 65 6d 73  * If no problems
272d0 20 61 72 65 20 66 6f 75 6e 64 2c 20 73 74 6f 72   are found, stor
272e0 65 20 61 20 4e 55 4c 4c 20 69 6e 20 72 65 67 69  e a NULL in regi
272f0 73 74 65 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54  ster P1..**.** T
27300 68 65 20 72 65 67 69 73 74 65 72 20 50 33 20 63  he register P3 c
27310 6f 6e 74 61 69 6e 73 20 74 68 65 20 6d 61 78 69  ontains the maxi
27320 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 6c  mum number of al
27330 6c 6f 77 65 64 20 65 72 72 6f 72 73 2e 0a 2a 2a  lowed errors..**
27340 20 41 74 20 6d 6f 73 74 20 72 65 67 28 50 33 29   At most reg(P3)
27350 20 65 72 72 6f 72 73 20 77 69 6c 6c 20 62 65 20   errors will be 
27360 72 65 70 6f 72 74 65 64 2e 0a 2a 2a 20 49 6e 20  reported..** In 
27370 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
27380 20 61 6e 61 6c 79 73 69 73 20 73 74 6f 70 73 20   analysis stops 
27390 61 73 20 73 6f 6f 6e 20 61 73 20 72 65 67 28 50  as soon as reg(P
273a0 31 29 20 65 72 72 6f 72 73 20 61 72 65 20 0a 2a  1) errors are .*
273b0 2a 20 73 65 65 6e 2e 20 20 52 65 67 28 50 31 29  * seen.  Reg(P1)
273c0 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
273d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
273e0 72 72 6f 72 73 20 72 65 6d 61 69 6e 69 6e 67 2e  rrors remaining.
273f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20  .**.** The root 
27400 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6f 66 20  page numbers of 
27410 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  all tables in th
27420 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 69  e database are i
27430 6e 74 65 67 65 72 0a 2a 2a 20 73 74 6f 72 65 64  nteger.** stored
27440 20 69 6e 20 72 65 67 28 50 31 29 2c 20 72 65 67   in reg(P1), reg
27450 28 50 31 2b 31 29 2c 20 72 65 67 28 50 31 2b 32  (P1+1), reg(P1+2
27460 29 2c 20 2e 2e 2e 2e 20 20 54 68 65 72 65 20 61  ), ....  There a
27470 72 65 20 50 32 20 74 61 62 6c 65 73 0a 2a 2a 20  re P2 tables.** 
27480 74 6f 74 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  total..**.** If 
27490 50 35 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  P5 is not zero, 
274a0 74 68 65 20 63 68 65 63 6b 20 69 73 20 64 6f 6e  the check is don
274b0 65 20 6f 6e 20 74 68 65 20 61 75 78 69 6c 69 61  e on the auxilia
274c0 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ry database.** f
274d0 69 6c 65 2c 20 6e 6f 74 20 74 68 65 20 6d 61 69  ile, not the mai
274e0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
274f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
27500 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  de is used to im
27510 70 6c 65 6d 65 6e 74 20 74 68 65 20 69 6e 74 65  plement the inte
27520 67 72 69 74 79 5f 63 68 65 63 6b 20 70 72 61 67  grity_check prag
27530 6d 61 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  ma..*/.case OP_I
27540 6e 74 65 67 72 69 74 79 43 6b 3a 20 7b 0a 20 20  ntegrityCk: {.  
27550 69 6e 74 20 6e 52 6f 6f 74 3b 20 20 20 20 20 20  int nRoot;      
27560 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61 62  /* Number of tab
27570 6c 65 73 20 74 6f 20 63 68 65 63 6b 2e 20 20 28  les to check.  (
27580 4e 75 6d 62 65 72 20 6f 66 20 72 6f 6f 74 20 70  Number of root p
27590 61 67 65 73 2e 29 20 2a 2f 0a 20 20 69 6e 74 20  ages.) */.  int 
275a0 2a 61 52 6f 6f 74 3b 20 20 20 20 20 2f 2a 20 41  *aRoot;     /* A
275b0 72 72 61 79 20 6f 66 20 72 6f 6f 74 70 61 67 65  rray of rootpage
275c0 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 74 61 62   numbers for tab
275d0 6c 65 73 20 74 6f 20 62 65 20 63 68 65 63 6b 65  les to be checke
275e0 64 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  d */.  int j;   
275f0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
27600 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
27610 6e 45 72 72 3b 20 20 20 20 20 20 20 2f 2a 20 4e  nErr;       /* N
27620 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
27630 72 65 70 6f 72 74 65 64 20 2a 2f 0a 20 20 63 68  reported */.  ch
27640 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 2f 2a  ar *z;        /*
27650 20 54 65 78 74 20 6f 66 20 74 68 65 20 65 72 72   Text of the err
27660 6f 72 20 72 65 70 6f 72 74 20 2a 2f 0a 20 20 4d  or report */.  M
27670 65 6d 20 2a 70 6e 45 72 72 3b 20 20 20 20 20 2f  em *pnErr;     /
27680 2a 20 52 65 67 69 73 74 65 72 20 6b 65 65 70 69  * Register keepi
27690 6e 67 20 74 72 61 63 6b 20 6f 66 20 65 72 72 6f  ng track of erro
276a0 72 73 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a  rs remaining */.
276b0 20 20 0a 20 20 6e 52 6f 6f 74 20 3d 20 70 4f 70    .  nRoot = pOp
276c0 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p2;.  assert( 
276d0 6e 52 6f 6f 74 3e 30 20 29 3b 0a 20 20 61 52 6f  nRoot>0 );.  aRo
276e0 6f 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ot = sqlite3DbMa
276f0 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
27700 6f 66 28 69 6e 74 29 2a 28 6e 52 6f 6f 74 2b 31  of(int)*(nRoot+1
27710 29 20 29 3b 0a 20 20 69 66 28 20 61 52 6f 6f 74  ) );.  if( aRoot
27720 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
27730 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  m;.  assert( pOp
27740 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p3>0 && pOp->p
27750 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  3<=p->nMem );.  
27760 70 6e 45 72 72 20 3d 20 26 61 4d 65 6d 5b 70 4f  pnErr = &aMem[pO
27770 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74  p->p3];.  assert
27780 28 20 28 70 6e 45 72 72 2d 3e 66 6c 61 67 73 20  ( (pnErr->flags 
27790 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b  & MEM_Int)!=0 );
277a0 0a 20 20 61 73 73 65 72 74 28 20 28 70 6e 45 72  .  assert( (pnEr
277b0 72 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  r->flags & (MEM_
277c0 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d  Str|MEM_Blob))==
277d0 30 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61  0 );.  pIn1 = &a
277e0 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
277f0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 52 6f 6f 74  for(j=0; j<nRoot
27800 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 61 52 6f 6f  ; j++){.    aRoo
27810 74 5b 6a 5d 20 3d 20 28 69 6e 74 29 73 71 6c 69  t[j] = (int)sqli
27820 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28  te3VdbeIntValue(
27830 26 70 49 6e 31 5b 6a 5d 29 3b 0a 20 20 7d 0a 20  &pIn1[j]);.  }. 
27840 20 61 52 6f 6f 74 5b 6a 5d 20 3d 20 30 3b 0a 20   aRoot[j] = 0;. 
27850 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35   assert( pOp->p5
27860 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
27870 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d  sert( (p->btreeM
27880 61 73 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b  ask & (((yDbMask
27890 29 31 29 3c 3c 70 4f 70 2d 3e 70 35 29 29 21 3d  )1)<<pOp->p5))!=
278a0 30 20 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  0 );.  z = sqlit
278b0 65 33 42 74 72 65 65 49 6e 74 65 67 72 69 74 79  e3BtreeIntegrity
278c0 43 68 65 63 6b 28 64 62 2d 3e 61 44 62 5b 70 4f  Check(db->aDb[pO
278d0 70 2d 3e 70 35 5d 2e 70 42 74 2c 20 61 52 6f 6f  p->p5].pBt, aRoo
278e0 74 2c 20 6e 52 6f 6f 74 2c 0a 20 20 20 20 20 20  t, nRoot,.      
278f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27900 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
27910 70 6e 45 72 72 2d 3e 75 2e 69 2c 20 26 6e 45 72  pnErr->u.i, &nEr
27920 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  r);.  sqlite3DbF
27930 72 65 65 28 64 62 2c 20 61 52 6f 6f 74 29 3b 0a  ree(db, aRoot);.
27940 20 20 70 6e 45 72 72 2d 3e 75 2e 69 20 2d 3d 20    pnErr->u.i -= 
27950 6e 45 72 72 3b 0a 20 20 73 71 6c 69 74 65 33 56  nErr;.  sqlite3V
27960 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 49  dbeMemSetNull(pI
27970 6e 31 29 3b 0a 20 20 69 66 28 20 6e 45 72 72 3d  n1);.  if( nErr=
27980 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
27990 28 20 7a 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73  ( z==0 );.  }els
279a0 65 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20  e if( z==0 ){.  
279b0 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
279c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
279d0 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
279e0 28 70 49 6e 31 2c 20 7a 2c 20 2d 31 2c 20 53 51  (pIn1, z, -1, SQ
279f0 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74  LITE_UTF8, sqlit
27a00 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 20 20  e3_free);.  }.  
27a10 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
27a20 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20 73 71 6c  IZE(pIn1);.  sql
27a30 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e  ite3VdbeChangeEn
27a40 63 6f 64 69 6e 67 28 70 49 6e 31 2c 20 65 6e 63  coding(pIn1, enc
27a50 6f 64 69 6e 67 29 3b 0a 20 20 62 72 65 61 6b 3b  oding);.  break;
27a60 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
27a70 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
27a80 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 20  TY_CHECK */../* 
27a90 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 41 64  Opcode: RowSetAd
27aa0 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  d P1 P2 * * *.**
27ab0 0a 2a 2a 20 49 6e 73 65 72 74 20 74 68 65 20 69  .** Insert the i
27ac0 6e 74 65 67 65 72 20 76 61 6c 75 65 20 68 65 6c  nteger value hel
27ad0 64 20 62 79 20 72 65 67 69 73 74 65 72 20 50 32  d by register P2
27ae0 20 69 6e 74 6f 20 61 20 62 6f 6f 6c 65 61 6e 20   into a boolean 
27af0 69 6e 64 65 78 0a 2a 2a 20 68 65 6c 64 20 69 6e  index.** held in
27b00 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a   register P1..**
27b10 0a 2a 2a 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  .** An assertion
27b20 20 66 61 69 6c 73 20 69 66 20 50 32 20 69 73 20   fails if P2 is 
27b30 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a  not an integer..
27b40 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65  */.case OP_RowSe
27b50 74 41 64 64 3a 20 7b 20 20 20 20 20 20 20 2f 2a  tAdd: {       /*
27b60 20 69 6e 31 2c 20 69 6e 32 20 2a 2f 0a 20 20 70   in1, in2 */.  p
27b70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
27b80 3e 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26  >p1];.  pIn2 = &
27b90 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
27ba0 20 61 73 73 65 72 74 28 20 28 70 49 6e 32 2d 3e   assert( (pIn2->
27bb0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
27bc0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 49  !=0 );.  if( (pI
27bd0 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
27be0 52 6f 77 53 65 74 29 3d 3d 30 20 29 7b 0a 20 20  RowSet)==0 ){.  
27bf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
27c00 53 65 74 52 6f 77 53 65 74 28 70 49 6e 31 29 3b  SetRowSet(pIn1);
27c10 0a 20 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  .    if( (pIn1->
27c20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
27c30 65 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  et)==0 ) goto no
27c40 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  _mem;.  }.  sqli
27c50 74 65 33 52 6f 77 53 65 74 49 6e 73 65 72 74 28  te3RowSetInsert(
27c60 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c  pIn1->u.pRowSet,
27c70 20 70 49 6e 32 2d 3e 75 2e 69 29 3b 0a 20 20 62   pIn2->u.i);.  b
27c80 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
27c90 64 65 3a 20 52 6f 77 53 65 74 52 65 61 64 20 50  de: RowSetRead P
27ca0 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
27cb0 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 73 6d  * Extract the sm
27cc0 61 6c 6c 65 73 74 20 76 61 6c 75 65 20 66 72 6f  allest value fro
27cd0 6d 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20  m boolean index 
27ce0 50 31 20 61 6e 64 20 70 75 74 20 74 68 61 74 20  P1 and put that 
27cf0 76 61 6c 75 65 20 69 6e 74 6f 0a 2a 2a 20 72 65  value into.** re
27d00 67 69 73 74 65 72 20 50 33 2e 20 20 4f 72 2c 20  gister P3.  Or, 
27d10 69 66 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78  if boolean index
27d20 20 50 31 20 69 73 20 69 6e 69 74 69 61 6c 6c 79   P1 is initially
27d30 20 65 6d 70 74 79 2c 20 6c 65 61 76 65 20 50 33   empty, leave P3
27d40 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  .** unchanged an
27d50 64 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75  d jump to instru
27d60 63 74 69 6f 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73  ction P2..*/.cas
27d70 65 20 4f 50 5f 52 6f 77 53 65 74 52 65 61 64 3a  e OP_RowSetRead:
27d80 20 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70   {       /* jump
27d90 2c 20 69 6e 31 2c 20 6f 75 74 33 20 2a 2f 0a 20  , in1, out3 */. 
27da0 20 69 36 34 20 76 61 6c 3b 0a 20 20 43 48 45 43   i64 val;.  CHEC
27db0 4b 5f 46 4f 52 5f 49 4e 54 45 52 52 55 50 54 3b  K_FOR_INTERRUPT;
27dc0 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
27dd0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20  pOp->p1];.  if( 
27de0 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn1->flags & M
27df0 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 0a 20  EM_RowSet)==0 . 
27e00 20 20 7c 7c 20 73 71 6c 69 74 65 33 52 6f 77 53    || sqlite3RowS
27e10 65 74 4e 65 78 74 28 70 49 6e 31 2d 3e 75 2e 70  etNext(pIn1->u.p
27e20 52 6f 77 53 65 74 2c 20 26 76 61 6c 29 3d 3d 30  RowSet, &val)==0
27e30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  .  ){.    /* The
27e40 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20 69   boolean index i
27e50 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 73  s empty */.    s
27e60 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
27e70 4e 75 6c 6c 28 70 49 6e 31 29 3b 0a 20 20 20 20  Null(pIn1);.    
27e80 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
27e90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
27ea0 2a 20 41 20 76 61 6c 75 65 20 77 61 73 20 70 75  * A value was pu
27eb0 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  lled from the in
27ec0 64 65 78 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  dex */.    sqlit
27ed0 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36  e3VdbeMemSetInt6
27ee0 34 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  4(&aMem[pOp->p3]
27ef0 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20 62 72  , val);.  }.  br
27f00 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
27f10 65 3a 20 52 6f 77 53 65 74 54 65 73 74 20 50 31  e: RowSetTest P1
27f20 20 50 32 20 50 33 20 50 34 0a 2a 2a 0a 2a 2a 20   P2 P3 P4.**.** 
27f30 52 65 67 69 73 74 65 72 20 50 33 20 69 73 20 61  Register P3 is a
27f40 73 73 75 6d 65 64 20 74 6f 20 68 6f 6c 64 20 61  ssumed to hold a
27f50 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
27f60 76 61 6c 75 65 2e 20 49 66 20 72 65 67 69 73 74  value. If regist
27f70 65 72 20 50 31 0a 2a 2a 20 63 6f 6e 74 61 69 6e  er P1.** contain
27f80 73 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  s a RowSet objec
27f90 74 20 61 6e 64 20 74 68 61 74 20 52 6f 77 53 65  t and that RowSe
27fa0 74 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  t object contain
27fb0 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 68  s.** the value h
27fc0 65 6c 64 20 69 6e 20 50 33 2c 20 6a 75 6d 70 20  eld in P3, jump 
27fd0 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 20  to register P2. 
27fe0 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 73 65 72  Otherwise, inser
27ff0 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72  t the.** integer
28000 20 69 6e 20 50 33 20 69 6e 74 6f 20 74 68 65 20   in P3 into the 
28010 52 6f 77 53 65 74 20 61 6e 64 20 63 6f 6e 74 69  RowSet and conti
28020 6e 75 65 20 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a  nue on to the.**
28030 20 6e 65 78 74 20 6f 70 63 6f 64 65 2e 0a 2a 2a   next opcode..**
28040 0a 2a 2a 20 54 68 65 20 52 6f 77 53 65 74 20 6f  .** The RowSet o
28050 62 6a 65 63 74 20 69 73 20 6f 70 74 69 6d 69 7a  bject is optimiz
28060 65 64 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  ed for the case 
28070 77 68 65 72 65 20 73 75 63 63 65 73 73 69 76 65  where successive
28080 20 73 65 74 73 0a 2a 2a 20 6f 66 20 69 6e 74 65   sets.** of inte
28090 67 65 72 73 2c 20 77 68 65 72 65 20 65 61 63 68  gers, where each
280a0 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f   set contains no
280b0 20 64 75 70 6c 69 63 61 74 65 73 2e 20 45 61 63   duplicates. Eac
280c0 68 20 73 65 74 0a 2a 2a 20 6f 66 20 76 61 6c 75  h set.** of valu
280d0 65 73 20 69 73 20 69 64 65 6e 74 69 66 69 65 64  es is identified
280e0 20 62 79 20 61 20 75 6e 69 71 75 65 20 50 34 20   by a unique P4 
280f0 76 61 6c 75 65 2e 20 54 68 65 20 66 69 72 73 74  value. The first
28100 20 73 65 74 0a 2a 2a 20 6d 75 73 74 20 68 61 76   set.** must hav
28110 65 20 50 34 3d 3d 30 2c 20 74 68 65 20 66 69 6e  e P4==0, the fin
28120 61 6c 20 73 65 74 20 50 34 3d 2d 31 2e 20 20 50  al set P4=-1.  P
28130 34 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  4 must be either
28140 20 2d 31 20 6f 72 0a 2a 2a 20 6e 6f 6e 2d 6e 65   -1 or.** non-ne
28150 67 61 74 69 76 65 2e 20 20 46 6f 72 20 6e 6f 6e  gative.  For non
28160 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73  -negative values
28170 20 6f 66 20 50 34 20 6f 6e 6c 79 20 74 68 65 20   of P4 only the 
28180 6c 6f 77 65 72 20 34 0a 2a 2a 20 62 69 74 73 20  lower 4.** bits 
28190 61 72 65 20 73 69 67 6e 69 66 69 63 61 6e 74 2e  are significant.
281a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f  .**.** This allo
281b0 77 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ws optimizations
281c0 3a 20 28 61 29 20 77 68 65 6e 20 50 34 3d 3d 30  : (a) when P4==0
281d0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
281e0 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 65  d to test.** the
281f0 20 72 6f 77 73 65 74 20 6f 62 6a 65 63 74 20 66   rowset object f
28200 6f 72 20 50 33 2c 20 61 73 20 69 74 20 69 73 20  or P3, as it is 
28210 67 75 61 72 61 6e 74 65 65 64 20 6e 6f 74 20 74  guaranteed not t
28220 6f 20 63 6f 6e 74 61 69 6e 20 69 74 2c 0a 2a 2a  o contain it,.**
28230 20 28 62 29 20 77 68 65 6e 20 50 34 3d 3d 2d 31   (b) when P4==-1
28240 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
28250 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  d to insert the 
28260 76 61 6c 75 65 2c 20 61 73 20 69 74 20 77 69 6c  value, as it wil
28270 6c 0a 2a 2a 20 6e 65 76 65 72 20 62 65 20 74 65  l.** never be te
28280 73 74 65 64 20 66 6f 72 2c 20 61 6e 64 20 28 63  sted for, and (c
28290 29 20 77 68 65 6e 20 61 20 76 61 6c 75 65 20 74  ) when a value t
282a0 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 73  hat is part of s
282b0 65 74 20 58 20 69 73 0a 2a 2a 20 69 6e 73 65 72  et X is.** inser
282c0 74 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ted, there is no
282d0 20 6e 65 65 64 20 74 6f 20 73 65 61 72 63 68 20   need to search 
282e0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 61  to see if the sa
282f0 6d 65 20 76 61 6c 75 65 20 77 61 73 0a 2a 2a 20  me value was.** 
28300 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 65 72  previously inser
28310 74 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 73  ted as part of s
28320 65 74 20 58 20 28 6f 6e 6c 79 20 69 66 20 69 74  et X (only if it
28330 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a   was previously.
28340 2a 2a 20 69 6e 73 65 72 74 65 64 20 61 73 20 70  ** inserted as p
28350 61 72 74 20 6f 66 20 73 6f 6d 65 20 6f 74 68 65  art of some othe
28360 72 20 73 65 74 29 2e 0a 2a 2f 0a 63 61 73 65 20  r set)..*/.case 
28370 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 3a 20 7b  OP_RowSetTest: {
28380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28390 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
283a0 31 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20  1, in3 */.  int 
283b0 69 53 65 74 3b 0a 20 20 69 6e 74 20 65 78 69 73  iSet;.  int exis
283c0 74 73 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61  ts;..  pIn1 = &a
283d0 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
283e0 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn3 = &aMem[pOp
283f0 2d 3e 70 33 5d 3b 0a 20 20 69 53 65 74 20 3d 20  ->p3];.  iSet = 
28400 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 61 73 73  pOp->p4.i;.  ass
28410 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73  ert( pIn3->flags
28420 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 0a 20 20 2f  &MEM_Int );..  /
28430 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
28440 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ything other tha
28450 6e 20 61 20 72 6f 77 73 65 74 20 6f 62 6a 65 63  n a rowset objec
28460 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t in memory cell
28470 20 50 31 2c 0a 20 20 2a 2a 20 64 65 6c 65 74 65   P1,.  ** delete
28480 20 69 74 20 6e 6f 77 20 61 6e 64 20 69 6e 69 74   it now and init
28490 69 61 6c 69 7a 65 20 50 31 20 77 69 74 68 20 61  ialize P1 with a
284a0 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 0a 20  n empty rowset. 
284b0 20 2a 2f 0a 20 20 69 66 28 20 28 70 49 6e 31 2d   */.  if( (pIn1-
284c0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77  >flags & MEM_Row
284d0 53 65 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Set)==0 ){.    s
284e0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
284f0 52 6f 77 53 65 74 28 70 49 6e 31 29 3b 0a 20 20  RowSet(pIn1);.  
28500 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
28510 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29  gs & MEM_RowSet)
28520 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
28530 6d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  m;.  }..  assert
28540 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
28550 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 61 73 73  4_INT32 );.  ass
28560 65 72 74 28 20 69 53 65 74 3d 3d 2d 31 20 7c 7c  ert( iSet==-1 ||
28570 20 69 53 65 74 3e 3d 30 20 29 3b 0a 20 20 69 66   iSet>=0 );.  if
28580 28 20 69 53 65 74 20 29 7b 0a 20 20 20 20 65 78  ( iSet ){.    ex
28590 69 73 74 73 20 3d 20 73 71 6c 69 74 65 33 52 6f  ists = sqlite3Ro
285a0 77 53 65 74 54 65 73 74 28 70 49 6e 31 2d 3e 75  wSetTest(pIn1->u
285b0 2e 70 52 6f 77 53 65 74 2c 20 0a 20 20 20 20 20  .pRowSet, .     
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285d0 20 20 20 20 20 20 20 20 20 20 28 75 38 29 28 69            (u8)(i
285e0 53 65 74 3e 3d 30 20 3f 20 69 53 65 74 20 26 20  Set>=0 ? iSet & 
285f0 30 78 66 20 3a 20 30 78 66 66 29 2c 0a 20 20 20  0xf : 0xff),.   
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28610 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 33              pIn3
28620 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 69 66 28 20  ->u.i);.    if( 
28630 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  exists ){.      
28640 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
28650 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
28660 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
28670 53 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  Set>=0 ){.    sq
28680 6c 69 74 65 33 52 6f 77 53 65 74 49 6e 73 65 72  lite3RowSetInser
28690 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65  t(pIn1->u.pRowSe
286a0 74 2c 20 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20  t, pIn3->u.i);. 
286b0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a   }.  break;.}...
286c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
286d0 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a 2f 2a 20  MIT_TRIGGER../* 
286e0 4f 70 63 6f 64 65 3a 20 50 72 6f 67 72 61 6d 20  Opcode: Program 
286f0 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a  P1 P2 P3 P4 *.**
28700 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20  .** Execute the 
28710 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20  trigger program 
28720 70 61 73 73 65 64 20 61 73 20 50 34 20 28 74 79  passed as P4 (ty
28730 70 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  pe P4_SUBPROGRAM
28740 29 2e 20 0a 2a 2a 0a 2a 2a 20 50 31 20 63 6f 6e  ). .**.** P1 con
28750 74 61 69 6e 73 20 74 68 65 20 61 64 64 72 65 73  tains the addres
28760 73 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  s of the memory 
28770 63 65 6c 6c 20 74 68 61 74 20 63 6f 6e 74 61 69  cell that contai
28780 6e 73 20 74 68 65 20 66 69 72 73 74 20 6d 65 6d  ns the first mem
28790 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  ory .** cell in 
287a0 61 6e 20 61 72 72 61 79 20 6f 66 20 76 61 6c 75  an array of valu
287b0 65 73 20 75 73 65 64 20 61 73 20 61 72 67 75 6d  es used as argum
287c0 65 6e 74 73 20 74 6f 20 74 68 65 20 73 75 62 2d  ents to the sub-
287d0 70 72 6f 67 72 61 6d 2e 20 50 32 20 0a 2a 2a 20  program. P2 .** 
287e0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64  contains the add
287f0 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20  ress to jump to 
28800 69 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  if the sub-progr
28810 61 6d 20 74 68 72 6f 77 73 20 61 6e 20 49 47 4e  am throws an IGN
28820 4f 52 45 20 0a 2a 2a 20 65 78 63 65 70 74 69 6f  ORE .** exceptio
28830 6e 20 75 73 69 6e 67 20 74 68 65 20 52 41 49 53  n using the RAIS
28840 45 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 52 65  E() function. Re
28850 67 69 73 74 65 72 20 50 33 20 63 6f 6e 74 61 69  gister P3 contai
28860 6e 73 20 74 68 65 20 61 64 64 72 65 73 73 20 0a  ns the address .
28870 2a 2a 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 63  ** of a memory c
28880 65 6c 6c 20 69 6e 20 74 68 69 73 20 28 74 68 65  ell in this (the
28890 20 70 61 72 65 6e 74 29 20 56 4d 20 74 68 61 74   parent) VM that
288a0 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
288b0 63 61 74 65 20 74 68 65 20 0a 2a 2a 20 6d 65 6d  cate the .** mem
288c0 6f 72 79 20 72 65 71 75 69 72 65 64 20 62 79 20  ory required by 
288d0 74 68 65 20 73 75 62 2d 76 64 62 65 20 61 74 20  the sub-vdbe at 
288e0 72 75 6e 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 50  runtime..**.** P
288f0 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
28900 6f 20 74 68 65 20 56 4d 20 63 6f 6e 74 61 69 6e  o the VM contain
28910 69 6e 67 20 74 68 65 20 74 72 69 67 67 65 72 20  ing the trigger 
28920 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 63 61 73 65  program..*/.case
28930 20 4f 50 5f 50 72 6f 67 72 61 6d 3a 20 7b 20 20   OP_Program: {  
28940 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
28950 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20  .  int nMem;    
28960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
28970 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 72  mber of memory r
28980 65 67 69 73 74 65 72 73 20 66 6f 72 20 73 75 62  egisters for sub
28990 2d 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 69 6e  -program */.  in
289a0 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
289b0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
289c0 66 20 72 75 6e 74 69 6d 65 20 73 70 61 63 65 20  f runtime space 
289d0 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 75 62  required for sub
289e0 2d 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 4d 65  -program */.  Me
289f0 6d 20 2a 70 52 74 3b 20 20 20 20 20 20 20 20 20  m *pRt;         
28a00 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
28a10 72 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 72 75  r to allocate ru
28a20 6e 74 69 6d 65 20 73 70 61 63 65 20 2a 2f 0a 20  ntime space */. 
28a30 20 4d 65 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20   Mem *pMem;     
28a40 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
28a50 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
28a60 75 67 68 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  ugh memory cells
28a70 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 45 6e 64 3b   */.  Mem *pEnd;
28a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28a90 20 4c 61 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c   Last memory cel
28aa0 6c 20 69 6e 20 6e 65 77 20 61 72 72 61 79 20 2a  l in new array *
28ab0 2f 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70  /.  VdbeFrame *p
28ac0 46 72 61 6d 65 3b 20 20 20 20 20 20 2f 2a 20 4e  Frame;      /* N
28ad0 65 77 20 76 64 62 65 20 66 72 61 6d 65 20 74 6f  ew vdbe frame to
28ae0 20 65 78 65 63 75 74 65 20 69 6e 20 2a 2f 0a 20   execute in */. 
28af0 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 50 72   SubProgram *pPr
28b00 6f 67 72 61 6d 3b 20 20 20 2f 2a 20 53 75 62 2d  ogram;   /* Sub-
28b10 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75  program to execu
28b20 74 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 74 3b  te */.  void *t;
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b40 2f 2a 20 54 6f 6b 65 6e 20 69 64 65 6e 74 69 66  /* Token identif
28b50 79 69 6e 67 20 74 72 69 67 67 65 72 20 2a 2f 0a  ying trigger */.
28b60 0a 20 20 70 50 72 6f 67 72 61 6d 20 3d 20 70 4f  .  pProgram = pO
28b70 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  p->p4.pProgram;.
28b80 20 20 70 52 74 20 3d 20 26 61 4d 65 6d 5b 70 4f    pRt = &aMem[pO
28b90 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74  p->p3];.  assert
28ba0 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 52 74  ( memIsValid(pRt
28bb0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
28bc0 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3e 30 20 29  Program->nOp>0 )
28bd0 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 65  ;.  .  /* If the
28be0 20 70 35 20 66 6c 61 67 20 69 73 20 63 6c 65 61   p5 flag is clea
28bf0 72 2c 20 74 68 65 6e 20 72 65 63 75 72 73 69 76  r, then recursiv
28c00 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20  e invocation of 
28c10 74 72 69 67 67 65 72 73 20 69 73 20 0a 20 20 2a  triggers is .  *
28c20 2a 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 62  * disabled for b
28c30 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
28c40 62 69 6c 69 74 79 20 28 70 35 20 69 73 20 73 65  bility (p5 is se
28c50 74 20 69 66 20 74 68 69 73 20 73 75 62 2d 70 72  t if this sub-pr
28c60 6f 67 72 61 6d 0a 20 20 2a 2a 20 69 73 20 72 65  ogram.  ** is re
28c70 61 6c 6c 79 20 61 20 74 72 69 67 67 65 72 2c 20  ally a trigger, 
28c80 6e 6f 74 20 61 20 66 6f 72 65 69 67 6e 20 6b 65  not a foreign ke
28c90 79 20 61 63 74 69 6f 6e 2c 20 61 6e 64 20 74 68  y action, and th
28ca0 65 20 66 6c 61 67 20 73 65 74 0a 20 20 2a 2a 20  e flag set.  ** 
28cb0 61 6e 64 20 63 6c 65 61 72 65 64 20 62 79 20 74  and cleared by t
28cc0 68 65 20 22 50 52 41 47 4d 41 20 72 65 63 75 72  he "PRAGMA recur
28cd0 73 69 76 65 5f 74 72 69 67 67 65 72 73 22 20 63  sive_triggers" c
28ce0 6f 6d 6d 61 6e 64 20 69 73 20 63 6c 65 61 72 29  ommand is clear)
28cf0 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 74 20  ..  ** .  ** It 
28d00 69 73 20 72 65 63 75 72 73 69 76 65 20 69 6e 76  is recursive inv
28d10 6f 63 61 74 69 6f 6e 20 6f 66 20 74 72 69 67 67  ocation of trigg
28d20 65 72 73 2c 20 61 74 20 74 68 65 20 53 51 4c 20  ers, at the SQL 
28d30 6c 65 76 65 6c 2c 20 74 68 61 74 20 69 73 20 0a  level, that is .
28d40 20 20 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20 49    ** disabled. I
28d50 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 61 20 73  n some cases a s
28d60 69 6e 67 6c 65 20 74 72 69 67 67 65 72 20 6d 61  ingle trigger ma
28d70 79 20 67 65 6e 65 72 61 74 65 20 6d 6f 72 65 20  y generate more 
28d80 74 68 61 6e 20 6f 6e 65 20 0a 20 20 2a 2a 20 53  than one .  ** S
28d90 75 62 50 72 6f 67 72 61 6d 20 28 69 66 20 74 68  ubProgram (if th
28da0 65 20 74 72 69 67 67 65 72 20 6d 61 79 20 62 65  e trigger may be
28db0 20 65 78 65 63 75 74 65 64 20 77 69 74 68 20 6d   executed with m
28dc0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 69 66  ore than one dif
28dd0 66 65 72 65 6e 74 20 0a 20 20 2a 2a 20 4f 4e 20  ferent .  ** ON 
28de0 43 4f 4e 46 4c 49 43 54 20 61 6c 67 6f 72 69 74  CONFLICT algorit
28df0 68 6d 29 2e 20 53 75 62 50 72 6f 67 72 61 6d 20  hm). SubProgram 
28e00 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
28e10 69 61 74 65 64 20 77 69 74 68 20 61 0a 20 20 2a  iated with a.  *
28e20 2a 20 73 69 6e 67 6c 65 20 74 72 69 67 67 65 72  * single trigger
28e30 20 61 6c 6c 20 68 61 76 65 20 74 68 65 20 73 61   all have the sa
28e40 6d 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  me value for the
28e50 20 53 75 62 50 72 6f 67 72 61 6d 2e 74 6f 6b 65   SubProgram.toke
28e60 6e 20 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  n .  ** variable
28e70 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d  .  */.  if( pOp-
28e80 3e 70 35 20 29 7b 0a 20 20 20 20 74 20 3d 20 70  >p5 ){.    t = p
28e90 50 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a  Program->token;.
28ea0 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70      for(pFrame=p
28eb0 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65  ->pFrame; pFrame
28ec0 20 26 26 20 70 46 72 61 6d 65 2d 3e 74 6f 6b 65   && pFrame->toke
28ed0 6e 21 3d 74 3b 20 70 46 72 61 6d 65 3d 70 46 72  n!=t; pFrame=pFr
28ee0 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  ame->pParent);. 
28ef0 20 20 20 69 66 28 20 70 46 72 61 6d 65 20 29 20     if( pFrame ) 
28f00 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66  break;.  }..  if
28f10 28 20 70 2d 3e 6e 46 72 61 6d 65 3e 3d 64 62 2d  ( p->nFrame>=db-
28f20 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
28f30 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
28f40 54 48 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  TH] ){.    rc = 
28f50 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
28f60 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
28f70 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
28f80 64 62 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 6c 65  db, "too many le
28f90 76 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20  vels of trigger 
28fa0 72 65 63 75 72 73 69 6f 6e 22 29 3b 0a 20 20 20  recursion");.   
28fb0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
28fc0 2a 20 52 65 67 69 73 74 65 72 20 70 52 74 20 69  * Register pRt i
28fd0 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
28fe0 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69  the memory requi
28ff0 72 65 64 20 74 6f 20 73 61 76 65 20 74 68 65 20  red to save the 
29000 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68  state.  ** of th
29010 65 20 63 75 72 72 65 6e 74 20 70 72 6f 67 72 61  e current progra
29020 6d 2c 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  m, and the memor
29030 79 20 72 65 71 75 69 72 65 64 20 61 74 20 72 75  y required at ru
29040 6e 74 69 6d 65 20 74 6f 20 65 78 65 63 75 74 65  ntime to execute
29050 0a 20 20 2a 2a 20 74 68 65 20 74 72 69 67 67 65  .  ** the trigge
29060 72 20 70 72 6f 67 72 61 6d 2e 20 49 66 20 74 68  r program. If th
29070 69 73 20 74 72 69 67 67 65 72 20 68 61 73 20 62  is trigger has b
29080 65 65 6e 20 66 69 72 65 64 20 62 65 66 6f 72 65  een fired before
29090 2c 20 74 68 65 6e 20 70 52 74 20 0a 20 20 2a 2a  , then pRt .  **
290a0 20 69 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f   is already allo
290b0 63 61 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65  cated. Otherwise
290c0 2c 20 69 74 20 6d 75 73 74 20 62 65 20 69 6e 69  , it must be ini
290d0 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20 20  tialized.  */.  
290e0 69 66 28 20 28 70 52 74 2d 3e 66 6c 61 67 73 26  if( (pRt->flags&
290f0 4d 45 4d 5f 46 72 61 6d 65 29 3d 3d 30 20 29 7b  MEM_Frame)==0 ){
29100 0a 20 20 20 20 2f 2a 20 53 75 62 50 72 6f 67 72  .    /* SubProgr
29110 61 6d 2e 6e 4d 65 6d 20 69 73 20 73 65 74 20 74  am.nMem is set t
29120 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
29130 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 75 73 65  memory cells use
29140 64 20 62 79 20 74 68 65 20 0a 20 20 20 20 2a 2a  d by the .    **
29150 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64 20   program stored 
29160 69 6e 20 53 75 62 50 72 6f 67 72 61 6d 2e 61 4f  in SubProgram.aO
29170 70 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 74 68  p. As well as th
29180 65 73 65 2c 20 6f 6e 65 20 6d 65 6d 6f 72 79 0a  ese, one memory.
29190 20 20 20 20 2a 2a 20 63 65 6c 6c 20 69 73 20 72      ** cell is r
291a0 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
291b0 20 63 75 72 73 6f 72 20 75 73 65 64 20 62 79 20   cursor used by 
291c0 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 53 65 74  the program. Set
291d0 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61   local.    ** va
291e0 72 69 61 62 6c 65 20 6e 4d 65 6d 20 28 61 6e 64  riable nMem (and
291f0 20 6c 61 74 65 72 2c 20 56 64 62 65 46 72 61 6d   later, VdbeFram
29200 65 2e 6e 43 68 69 6c 64 4d 65 6d 29 20 74 6f 20  e.nChildMem) to 
29210 74 68 69 73 20 76 61 6c 75 65 2e 0a 20 20 20 20  this value..    
29220 2a 2f 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 70 50  */.    nMem = pP
29230 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20 2b 20 70  rogram->nMem + p
29240 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b 0a 20  Program->nCsr;. 
29250 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44     nByte = ROUND
29260 38 28 73 69 7a 65 6f 66 28 56 64 62 65 46 72 61  8(sizeof(VdbeFra
29270 6d 65 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  me)).           
29280 20 20 20 2b 20 6e 4d 65 6d 20 2a 20 73 69 7a 65     + nMem * size
29290 6f 66 28 4d 65 6d 29 0a 20 20 20 20 20 20 20 20  of(Mem).        
292a0 20 20 20 20 20 20 2b 20 70 50 72 6f 67 72 61 6d        + pProgram
292b0 2d 3e 6e 43 73 72 20 2a 20 73 69 7a 65 6f 66 28  ->nCsr * sizeof(
292c0 56 64 62 65 43 75 72 73 6f 72 20 2a 29 3b 0a 20  VdbeCursor *);. 
292d0 20 20 20 70 46 72 61 6d 65 20 3d 20 73 71 6c 69     pFrame = sqli
292e0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
292f0 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  db, nByte);.    
29300 69 66 28 20 21 70 46 72 61 6d 65 20 29 7b 0a 20  if( !pFrame ){. 
29310 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
29320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29330 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
29340 65 28 70 52 74 29 3b 0a 20 20 20 20 70 52 74 2d  e(pRt);.    pRt-
29350 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 46 72 61  >flags = MEM_Fra
29360 6d 65 3b 0a 20 20 20 20 70 52 74 2d 3e 75 2e 70  me;.    pRt->u.p
29370 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a  Frame = pFrame;.
29380 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 76 20 3d  .    pFrame->v =
29390 20 70 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e   p;.    pFrame->
293a0 6e 43 68 69 6c 64 4d 65 6d 20 3d 20 6e 4d 65 6d  nChildMem = nMem
293b0 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43  ;.    pFrame->nC
293c0 68 69 6c 64 43 73 72 20 3d 20 70 50 72 6f 67 72  hildCsr = pProgr
293d0 61 6d 2d 3e 6e 43 73 72 3b 0a 20 20 20 20 70 46  am->nCsr;.    pF
293e0 72 61 6d 65 2d 3e 70 63 20 3d 20 70 63 3b 0a 20  rame->pc = pc;. 
293f0 20 20 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 20     pFrame->aMem 
29400 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 70  = p->aMem;.    p
29410 46 72 61 6d 65 2d 3e 6e 4d 65 6d 20 3d 20 70 2d  Frame->nMem = p-
29420 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d  >nMem;.    pFram
29430 65 2d 3e 61 70 43 73 72 20 3d 20 70 2d 3e 61 70  e->apCsr = p->ap
29440 43 73 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d  Csr;.    pFrame-
29450 3e 6e 43 75 72 73 6f 72 20 3d 20 70 2d 3e 6e 43  >nCursor = p->nC
29460 75 72 73 6f 72 3b 0a 20 20 20 20 70 46 72 61 6d  ursor;.    pFram
29470 65 2d 3e 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b  e->aOp = p->aOp;
29480 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 4f 70  .    pFrame->nOp
29490 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 70   = p->nOp;.    p
294a0 46 72 61 6d 65 2d 3e 74 6f 6b 65 6e 20 3d 20 70  Frame->token = p
294b0 50 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a  Program->token;.
294c0 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 56 64 62  .    pEnd = &Vdb
294d0 65 46 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65  eFrameMem(pFrame
294e0 29 5b 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64  )[pFrame->nChild
294f0 4d 65 6d 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4d  Mem];.    for(pM
29500 65 6d 3d 56 64 62 65 46 72 61 6d 65 4d 65 6d 28  em=VdbeFrameMem(
29510 70 46 72 61 6d 65 29 3b 20 70 4d 65 6d 21 3d 70  pFrame); pMem!=p
29520 45 6e 64 3b 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20  End; pMem++){.  
29530 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
29540 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
29550 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 64 62 3b    pMem->db = db;
29560 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
29570 20 20 20 20 70 46 72 61 6d 65 20 3d 20 70 52 74      pFrame = pRt
29580 2d 3e 75 2e 70 46 72 61 6d 65 3b 0a 20 20 20 20  ->u.pFrame;.    
29590 61 73 73 65 72 74 28 20 70 50 72 6f 67 72 61 6d  assert( pProgram
295a0 2d 3e 6e 4d 65 6d 2b 70 50 72 6f 67 72 61 6d 2d  ->nMem+pProgram-
295b0 3e 6e 43 73 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e  >nCsr==pFrame->n
295c0 43 68 69 6c 64 4d 65 6d 20 29 3b 0a 20 20 20 20  ChildMem );.    
295d0 61 73 73 65 72 74 28 20 70 50 72 6f 67 72 61 6d  assert( pProgram
295e0 2d 3e 6e 43 73 72 3d 3d 70 46 72 61 6d 65 2d 3e  ->nCsr==pFrame->
295f0 6e 43 68 69 6c 64 43 73 72 20 29 3b 0a 20 20 20  nChildCsr );.   
29600 20 61 73 73 65 72 74 28 20 70 63 3d 3d 70 46 72   assert( pc==pFr
29610 61 6d 65 2d 3e 70 63 20 29 3b 0a 20 20 7d 0a 0a  ame->pc );.  }..
29620 20 20 70 2d 3e 6e 46 72 61 6d 65 2b 2b 3b 0a 20    p->nFrame++;. 
29630 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74   pFrame->pParent
29640 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20   = p->pFrame;.  
29650 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
29660 64 20 3d 20 6c 61 73 74 52 6f 77 69 64 3b 0a 20  d = lastRowid;. 
29670 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65   pFrame->nChange
29680 20 3d 20 70 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20   = p->nChange;. 
29690 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
296a0 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 70  .  p->pFrame = p
296b0 46 72 61 6d 65 3b 0a 20 20 70 2d 3e 61 4d 65 6d  Frame;.  p->aMem
296c0 20 3d 20 61 4d 65 6d 20 3d 20 26 56 64 62 65 46   = aMem = &VdbeF
296d0 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65 29 5b  rameMem(pFrame)[
296e0 2d 31 5d 3b 0a 20 20 70 2d 3e 6e 4d 65 6d 20 3d  -1];.  p->nMem =
296f0 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d   pFrame->nChildM
29700 65 6d 3b 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72  em;.  p->nCursor
29710 20 3d 20 28 75 31 36 29 70 46 72 61 6d 65 2d 3e   = (u16)pFrame->
29720 6e 43 68 69 6c 64 43 73 72 3b 0a 20 20 70 2d 3e  nChildCsr;.  p->
29730 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72  apCsr = (VdbeCur
29740 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e  sor **)&aMem[p->
29750 6e 4d 65 6d 2b 31 5d 3b 0a 20 20 70 2d 3e 61 4f  nMem+1];.  p->aO
29760 70 20 3d 20 61 4f 70 20 3d 20 70 50 72 6f 67 72  p = aOp = pProgr
29770 61 6d 2d 3e 61 4f 70 3b 0a 20 20 70 2d 3e 6e 4f  am->aOp;.  p->nO
29780 70 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f  p = pProgram->nO
29790 70 3b 0a 20 20 70 63 20 3d 20 2d 31 3b 0a 0a 20  p;.  pc = -1;.. 
297a0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
297b0 63 6f 64 65 3a 20 50 61 72 61 6d 20 50 31 20 50  code: Param P1 P
297c0 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68  2 * * *.**.** Th
297d0 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c  is opcode is onl
297e0 79 20 65 76 65 72 20 70 72 65 73 65 6e 74 20 69  y ever present i
297f0 6e 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63  n sub-programs c
29800 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 0a 2a  alled via the .*
29810 2a 20 4f 50 5f 50 72 6f 67 72 61 6d 20 69 6e 73  * OP_Program ins
29820 74 72 75 63 74 69 6f 6e 2e 20 43 6f 70 79 20 61  truction. Copy a
29830 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79   value currently
29840 20 73 74 6f 72 65 64 20 69 6e 20 61 20 6d 65 6d   stored in a mem
29850 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 6f 66 20  ory .** cell of 
29860 74 68 65 20 63 61 6c 6c 69 6e 67 20 28 70 61 72  the calling (par
29870 65 6e 74 29 20 66 72 61 6d 65 20 74 6f 20 63 65  ent) frame to ce
29880 6c 6c 20 50 32 20 69 6e 20 74 68 65 20 63 75 72  ll P2 in the cur
29890 72 65 6e 74 20 66 72 61 6d 65 73 20 0a 2a 2a 20  rent frames .** 
298a0 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 54  address space. T
298b0 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74  his is used by t
298c0 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 20  rigger programs 
298d0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 6e 65  to access the ne
298e0 77 2e 2a 20 0a 2a 2a 20 61 6e 64 20 6f 6c 64 2e  w.* .** and old.
298f0 2a 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20  * values..**.** 
29900 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  The address of t
29910 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70  he cell in the p
29920 61 72 65 6e 74 20 66 72 61 6d 65 20 69 73 20 64  arent frame is d
29930 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 64 64  etermined by add
29940 69 6e 67 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  ing.** the value
29950 20 6f 66 20 74 68 65 20 50 31 20 61 72 67 75 6d   of the P1 argum
29960 65 6e 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ent to the value
29970 20 6f 66 20 74 68 65 20 50 31 20 61 72 67 75 6d   of the P1 argum
29980 65 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61  ent to the.** ca
29990 6c 6c 69 6e 67 20 4f 50 5f 50 72 6f 67 72 61 6d  lling OP_Program
299a0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
299b0 0a 63 61 73 65 20 4f 50 5f 50 61 72 61 6d 3a 20  .case OP_Param: 
299c0 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  {           /* o
299d0 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a  ut2-prerelease *
299e0 2f 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70  /.  VdbeFrame *p
299f0 46 72 61 6d 65 3b 0a 20 20 4d 65 6d 20 2a 70 49  Frame;.  Mem *pI
29a00 6e 3b 0a 20 20 70 46 72 61 6d 65 20 3d 20 70 2d  n;.  pFrame = p-
29a10 3e 70 46 72 61 6d 65 3b 0a 20 20 70 49 6e 20 3d  >pFrame;.  pIn =
29a20 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70   &pFrame->aMem[p
29a30 4f 70 2d 3e 70 31 20 2b 20 70 46 72 61 6d 65 2d  Op->p1 + pFrame-
29a40 3e 61 4f 70 5b 70 46 72 61 6d 65 2d 3e 70 63 5d  >aOp[pFrame->pc]
29a50 2e 70 31 5d 3b 20 20 20 0a 20 20 73 71 6c 69 74  .p1];   .  sqlit
29a60 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
29a70 43 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 2c 20  Copy(pOut, pIn, 
29a80 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 62 72  MEM_Ephem);.  br
29a90 65 61 6b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  eak;.}..#endif /
29aa0 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
29ab0 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 20 2a 2f  _OMIT_TRIGGER */
29ac0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
29ad0 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
29ae0 59 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6b 43  Y./* Opcode: FkC
29af0 6f 75 6e 74 65 72 20 50 31 20 50 32 20 2a 20 2a  ounter P1 P2 * *
29b00 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65   *.**.** Increme
29b10 6e 74 20 61 20 22 63 6f 6e 73 74 72 61 69 6e 74  nt a "constraint
29b20 20 63 6f 75 6e 74 65 72 22 20 62 79 20 50 32 20   counter" by P2 
29b30 28 50 32 20 6d 61 79 20 62 65 20 6e 65 67 61 74  (P2 may be negat
29b40 69 76 65 20 6f 72 20 70 6f 73 69 74 69 76 65 29  ive or positive)
29b50 2e 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 6f  ..** If P1 is no
29b60 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 64 61 74 61  n-zero, the data
29b70 62 61 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  base constraint 
29b80 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 63 72 65  counter is incre
29b90 6d 65 6e 74 65 64 20 0a 2a 2a 20 28 64 65 66 65  mented .** (defe
29ba0 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  rred foreign key
29bb0 20 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e 20 4f   constraints). O
29bc0 74 68 65 72 77 69 73 65 2c 20 69 66 20 50 31 20  therwise, if P1 
29bd0 69 73 20 7a 65 72 6f 2c 20 74 68 65 20 0a 2a 2a  is zero, the .**
29be0 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 75 6e 74   statement count
29bf0 65 72 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  er is incremente
29c00 64 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  d (immediate for
29c10 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
29c20 69 6e 74 73 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ints)..*/.case O
29c30 50 5f 46 6b 43 6f 75 6e 74 65 72 3a 20 7b 0a 20  P_FkCounter: {. 
29c40 20 69 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a   if( pOp->p1 ){.
29c50 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
29c60 64 43 6f 6e 73 20 2b 3d 20 70 4f 70 2d 3e 70 32  dCons += pOp->p2
29c70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
29c80 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20  ->nFkConstraint 
29c90 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d 0a  += pOp->p2;.  }.
29ca0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
29cb0 70 63 6f 64 65 3a 20 46 6b 49 66 5a 65 72 6f 20  pcode: FkIfZero 
29cc0 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
29cd0 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 74 65  * This opcode te
29ce0 73 74 73 20 69 66 20 61 20 66 6f 72 65 69 67 6e  sts if a foreign
29cf0 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 2d   key constraint-
29d00 63 6f 75 6e 74 65 72 20 69 73 20 63 75 72 72 65  counter is curre
29d10 6e 74 6c 79 20 7a 65 72 6f 2e 0a 2a 2a 20 49 66  ntly zero..** If
29d20 20 73 6f 2c 20 6a 75 6d 70 20 74 6f 20 69 6e 73   so, jump to ins
29d30 74 72 75 63 74 69 6f 6e 20 50 32 2e 20 4f 74 68  truction P2. Oth
29d40 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72  erwise, fall thr
29d50 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
29d60 20 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e   .** instruction
29d70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 31 20 69 73  ..**.** If P1 is
29d80 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
29d90 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65  the jump is take
29da0 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  n if the databas
29db0 65 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75  e constraint-cou
29dc0 6e 74 65 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20  nter.** is zero 
29dd0 28 74 68 65 20 6f 6e 65 20 74 68 61 74 20 63 6f  (the one that co
29de0 75 6e 74 73 20 64 65 66 65 72 72 65 64 20 63 6f  unts deferred co
29df0 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69  nstraint violati
29e00 6f 6e 73 29 2e 20 49 66 20 50 31 20 69 73 0a 2a  ons). If P1 is.*
29e10 2a 20 7a 65 72 6f 2c 20 74 68 65 20 6a 75 6d 70  * zero, the jump
29e20 20 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65   is taken if the
29e30 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 73 74   statement const
29e40 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72 20 69 73  raint-counter is
29e50 20 7a 65 72 6f 0a 2a 2a 20 28 69 6d 6d 65 64 69   zero.** (immedi
29e60 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
29e70 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
29e80 74 69 6f 6e 73 29 2e 0a 2a 2f 0a 63 61 73 65 20  tions)..*/.case 
29e90 4f 50 5f 46 6b 49 66 5a 65 72 6f 3a 20 7b 20 20  OP_FkIfZero: {  
29ea0 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
29eb0 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 20  /.  if( pOp->p1 
29ec0 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e  ){.    if( db->n
29ed0 44 65 66 65 72 72 65 64 43 6f 6e 73 3d 3d 30 20  DeferredCons==0 
29ee0 29 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31  ) pc = pOp->p2-1
29ef0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
29f00 66 28 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  f( p->nFkConstra
29f10 69 6e 74 3d 3d 30 20 29 20 70 63 20 3d 20 70 4f  int==0 ) pc = pO
29f20 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d 0a 20 20 62  p->p2-1;.  }.  b
29f30 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
29f40 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
29f50 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
29f60 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
29f70 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
29f80 43 52 45 4d 45 4e 54 0a 2f 2a 20 4f 70 63 6f 64  CREMENT./* Opcod
29f90 65 3a 20 4d 65 6d 4d 61 78 20 50 31 20 50 32 20  e: MemMax P1 P2 
29fa0 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 31 20 69  * * *.**.** P1 i
29fb0 73 20 61 20 72 65 67 69 73 74 65 72 20 69 6e 20  s a register in 
29fc0 74 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 6f  the root frame o
29fd0 66 20 74 68 69 73 20 56 4d 20 28 74 68 65 20 72  f this VM (the r
29fe0 6f 6f 74 20 66 72 61 6d 65 20 69 73 0a 2a 2a 20  oot frame is.** 
29ff0 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
2a000 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65  he current frame
2a010 20 69 66 20 74 68 69 73 20 69 6e 73 74 72 75 63   if this instruc
2a020 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 65 78  tion is being ex
2a030 65 63 75 74 65 64 0a 2a 2a 20 77 69 74 68 69 6e  ecuted.** within
2a040 20 61 20 73 75 62 2d 70 72 6f 67 72 61 6d 29 2e   a sub-program).
2a050 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
2a060 66 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f  f register P1 to
2a070 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20   the maximum of 
2a080 0a 2a 2a 20 69 74 73 20 63 75 72 72 65 6e 74 20  .** its current 
2a090 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 76 61  value and the va
2a0a0 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
2a0b0 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  P2..**.** This i
2a0c0 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 72 6f 77  nstruction throw
2a0d0 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  s an error if th
2a0e0 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 73  e memory cell is
2a0f0 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 0a 2a   not initially.*
2a100 2a 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  * an integer..*/
2a110 0a 63 61 73 65 20 4f 50 5f 4d 65 6d 4d 61 78 3a  .case OP_MemMax:
2a120 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 32   {        /* in2
2a130 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 31 3b   */.  Mem *pIn1;
2a140 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46  .  VdbeFrame *pF
2a150 72 61 6d 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70  rame;.  if( p->p
2a160 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72  Frame ){.    for
2a170 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d  (pFrame=p->pFram
2a180 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  e; pFrame->pPare
2a190 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d  nt; pFrame=pFram
2a1a0 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  e->pParent);.   
2a1b0 20 70 49 6e 31 20 3d 20 26 70 46 72 61 6d 65 2d   pIn1 = &pFrame-
2a1c0 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  >aMem[pOp->p1];.
2a1d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
2a1e0 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
2a1f0 31 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  1];.  }.  assert
2a200 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e  ( memIsValid(pIn
2a210 31 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  1) );.  sqlite3V
2a220 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79  dbeMemIntegerify
2a230 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e 32 20 3d  (pIn1);.  pIn2 =
2a240 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
2a250 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
2a260 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 32  mIntegerify(pIn2
2a270 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75  );.  if( pIn1->u
2a280 2e 69 3c 70 49 6e 32 2d 3e 75 2e 69 29 7b 0a 20  .i<pIn2->u.i){. 
2a290 20 20 20 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 70     pIn1->u.i = p
2a2a0 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20  In2->u.i;.  }.  
2a2b0 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
2a2c0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
2a2d0 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a  UTOINCREMENT */.
2a2e0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 50 6f  ./* Opcode: IfPo
2a2f0 73 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  s P1 P2 * * *.**
2a300 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65  .** If the value
2a310 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20   of register P1 
2a320 69 73 20 31 20 6f 72 20 67 72 65 61 74 65 72 2c  is 1 or greater,
2a330 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a   jump to P2..**.
2a340 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
2a350 20 74 6f 20 75 73 65 20 74 68 69 73 20 69 6e 73   to use this ins
2a360 74 72 75 63 74 69 6f 6e 20 6f 6e 20 61 20 72 65  truction on a re
2a370 67 69 73 74 65 72 20 74 68 61 74 20 64 6f 65 73  gister that does
2a380 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
2a390 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 41 6e 20  an integer.  An 
2a3a0 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
2a3b0 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 66 20 79  will result if y
2a3c0 6f 75 20 74 72 79 2e 0a 2a 2f 0a 63 61 73 65 20  ou try..*/.case 
2a3d0 4f 50 5f 49 66 50 6f 73 3a 20 7b 20 20 20 20 20  OP_IfPos: {     
2a3e0 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20     /* jump, in1 
2a3f0 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
2a400 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  m[pOp->p1];.  as
2a410 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67  sert( pIn1->flag
2a420 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 69  s&MEM_Int );.  i
2a430 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 30 20 29  f( pIn1->u.i>0 )
2a440 7b 0a 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  {.     pc = pOp-
2a450 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62  >p2 - 1;.  }.  b
2a460 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
2a470 64 65 3a 20 49 66 4e 65 67 20 50 31 20 50 32 20  de: IfNeg P1 P2 
2a480 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 74  * * *.**.** If t
2a490 68 65 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69  he value of regi
2a4a0 73 74 65 72 20 50 31 20 69 73 20 6c 65 73 73 20  ster P1 is less 
2a4b0 74 68 61 6e 20 7a 65 72 6f 2c 20 6a 75 6d 70 20  than zero, jump 
2a4c0 74 6f 20 50 32 2e 20 0a 2a 2a 0a 2a 2a 20 49 74  to P2. .**.** It
2a4d0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 75   is illegal to u
2a4e0 73 65 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  se this instruct
2a4f0 69 6f 6e 20 6f 6e 20 61 20 72 65 67 69 73 74 65  ion on a registe
2a500 72 20 74 68 61 74 20 64 6f 65 73 0a 2a 2a 20 6e  r that does.** n
2a510 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e  ot contain an in
2a520 74 65 67 65 72 2e 20 20 41 6e 20 61 73 73 65 72  teger.  An asser
2a530 74 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c 20  tion fault will 
2a540 72 65 73 75 6c 74 20 69 66 20 79 6f 75 20 74 72  result if you tr
2a550 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66  y..*/.case OP_If
2a560 4e 65 67 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  Neg: {        /*
2a570 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20   jump, in1 */.  
2a580 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
2a590 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2a5a0 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d   pIn1->flags&MEM
2a5b0 5f 49 6e 74 20 29 3b 0a 20 20 69 66 28 20 70 49  _Int );.  if( pI
2a5c0 6e 31 2d 3e 75 2e 69 3c 30 20 29 7b 0a 20 20 20  n1->u.i<0 ){.   
2a5d0 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
2a5e0 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   1;.  }.  break;
2a5f0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .}../* Opcode: I
2a600 66 5a 65 72 6f 20 50 31 20 50 32 20 50 33 20 2a  fZero P1 P2 P3 *
2a610 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67   *.**.** The reg
2a620 69 73 74 65 72 20 50 31 20 6d 75 73 74 20 63 6f  ister P1 must co
2a630 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72  ntain an integer
2a640 2e 20 20 41 64 64 20 6c 69 74 65 72 61 6c 20 50  .  Add literal P
2a650 33 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75  3 to the.** valu
2a660 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
2a670 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  .  If the result
2a680 20 69 73 20 65 78 61 63 74 6c 79 20 30 2c 20 6a   is exactly 0, j
2a690 75 6d 70 20 74 6f 20 50 32 2e 20 0a 2a 2a 0a 2a  ump to P2. .**.*
2a6a0 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
2a6b0 74 6f 20 75 73 65 20 74 68 69 73 20 69 6e 73 74  to use this inst
2a6c0 72 75 63 74 69 6f 6e 20 6f 6e 20 61 20 72 65 67  ruction on a reg
2a6d0 69 73 74 65 72 20 74 68 61 74 20 64 6f 65 73 0a  ister that does.
2a6e0 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
2a6f0 6e 20 69 6e 74 65 67 65 72 2e 20 20 41 6e 20 61  n integer.  An a
2a700 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77  ssertion fault w
2a710 69 6c 6c 20 72 65 73 75 6c 74 20 69 66 20 79 6f  ill result if yo
2a720 75 20 74 72 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f  u try..*/.case O
2a730 50 5f 49 66 5a 65 72 6f 3a 20 7b 20 20 20 20 20  P_IfZero: {     
2a740 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20     /* jump, in1 
2a750 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
2a760 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  m[pOp->p1];.  as
2a770 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67  sert( pIn1->flag
2a780 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 70  s&MEM_Int );.  p
2a790 49 6e 31 2d 3e 75 2e 69 20 2b 3d 20 70 4f 70 2d  In1->u.i += pOp-
2a7a0 3e 70 33 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d  >p3;.  if( pIn1-
2a7b0 3e 75 2e 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >u.i==0 ){.     
2a7c0 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
2a7d0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
2a7e0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67  ../* Opcode: Agg
2a7f0 53 74 65 70 20 2a 20 50 32 20 50 33 20 50 34 20  Step * P2 P3 P4 
2a800 50 35 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75 74 65  P5.**.** Execute
2a810 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69   the step functi
2a820 6f 6e 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67  on for an aggreg
2a830 61 74 65 2e 20 20 54 68 65 0a 2a 2a 20 66 75 6e  ate.  The.** fun
2a840 63 74 69 6f 6e 20 68 61 73 20 50 35 20 61 72 67  ction has P5 arg
2a850 75 6d 65 6e 74 73 2e 20 20 20 50 34 20 69 73 20  uments.   P4 is 
2a860 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2a870 20 46 75 6e 63 44 65 66 0a 2a 2a 20 73 74 72 75   FuncDef.** stru
2a880 63 74 75 72 65 20 74 68 61 74 20 73 70 65 63 69  cture that speci
2a890 66 69 65 73 20 74 68 65 20 66 75 6e 63 74 69 6f  fies the functio
2a8a0 6e 2e 20 20 55 73 65 20 72 65 67 69 73 74 65 72  n.  Use register
2a8b0 0a 2a 2a 20 50 33 20 61 73 20 74 68 65 20 61 63  .** P3 as the ac
2a8c0 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  cumulator..**.**
2a8d0 20 54 68 65 20 50 35 20 61 72 67 75 6d 65 6e 74   The P5 argument
2a8e0 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d  s are taken from
2a8f0 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 64   register P2 and
2a900 20 69 74 73 0a 2a 2a 20 73 75 63 63 65 73 73 6f   its.** successo
2a910 72 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41  rs..*/.case OP_A
2a920 67 67 53 74 65 70 3a 20 7b 0a 20 20 69 6e 74 20  ggStep: {.  int 
2a930 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65  n;.  int i;.  Me
2a940 6d 20 2a 70 4d 65 6d 3b 0a 20 20 4d 65 6d 20 2a  m *pMem;.  Mem *
2a950 70 52 65 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pRec;.  sqlite3_
2a960 63 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 73  context ctx;.  s
2a970 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2a980 70 56 61 6c 3b 0a 0a 20 20 6e 20 3d 20 70 4f 70  pVal;..  n = pOp
2a990 2d 3e 70 35 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p5;.  assert( 
2a9a0 6e 3e 3d 30 20 29 3b 0a 20 20 70 52 65 63 20 3d  n>=0 );.  pRec =
2a9b0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
2a9c0 0a 20 20 61 70 56 61 6c 20 3d 20 70 2d 3e 61 70  .  apVal = p->ap
2a9d0 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 61  Arg;.  assert( a
2a9e0 70 56 61 6c 20 7c 7c 20 6e 3d 3d 30 20 29 3b 0a  pVal || n==0 );.
2a9f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
2aa00 69 2b 2b 2c 20 70 52 65 63 2b 2b 29 7b 0a 20 20  i++, pRec++){.  
2aa10 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
2aa20 61 6c 69 64 28 70 52 65 63 29 20 29 3b 0a 20 20  alid(pRec) );.  
2aa30 20 20 61 70 56 61 6c 5b 69 5d 20 3d 20 70 52 65    apVal[i] = pRe
2aa40 63 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74 54  c;.    memAboutT
2aa50 6f 43 68 61 6e 67 65 28 70 2c 20 70 52 65 63 29  oChange(p, pRec)
2aa60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2aa70 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28 70 52  eMemStoreType(pR
2aa80 65 63 29 3b 0a 20 20 7d 0a 20 20 63 74 78 2e 70  ec);.  }.  ctx.p
2aa90 46 75 6e 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Func = pOp->p4.p
2aaa0 46 75 6e 63 3b 0a 20 20 61 73 73 65 72 74 28 20  Func;.  assert( 
2aab0 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70  pOp->p3>0 && pOp
2aac0 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b  ->p3<=p->nMem );
2aad0 0a 20 20 63 74 78 2e 70 4d 65 6d 20 3d 20 70 4d  .  ctx.pMem = pM
2aae0 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  em = &aMem[pOp->
2aaf0 70 33 5d 3b 0a 20 20 70 4d 65 6d 2d 3e 6e 2b 2b  p3];.  pMem->n++
2ab00 3b 0a 20 20 63 74 78 2e 73 2e 66 6c 61 67 73 20  ;.  ctx.s.flags 
2ab10 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 63 74  = MEM_Null;.  ct
2ab20 78 2e 73 2e 7a 20 3d 20 30 3b 0a 20 20 63 74 78  x.s.z = 0;.  ctx
2ab30 2e 73 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  .s.zMalloc = 0;.
2ab40 20 20 63 74 78 2e 73 2e 78 44 65 6c 20 3d 20 30    ctx.s.xDel = 0
2ab50 3b 0a 20 20 63 74 78 2e 73 2e 64 62 20 3d 20 64  ;.  ctx.s.db = d
2ab60 62 3b 0a 20 20 63 74 78 2e 69 73 45 72 72 6f 72  b;.  ctx.isError
2ab70 20 3d 20 30 3b 0a 20 20 63 74 78 2e 70 43 6f 6c   = 0;.  ctx.pCol
2ab80 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 74 78  l = 0;.  if( ctx
2ab90 2e 70 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26 20  .pFunc->flags & 
2aba0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
2abb0 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 61 73 73 65  COLL ){.    asse
2abc0 72 74 28 20 70 4f 70 3e 70 2d 3e 61 4f 70 20 29  rt( pOp>p->aOp )
2abd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
2abe0 70 5b 2d 31 5d 2e 70 34 74 79 70 65 3d 3d 50 34  p[-1].p4type==P4
2abf0 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 20 20  _COLLSEQ );.    
2ac00 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
2ac10 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53  opcode==OP_CollS
2ac20 65 71 20 29 3b 0a 20 20 20 20 63 74 78 2e 70 43  eq );.    ctx.pC
2ac30 6f 6c 6c 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 34  oll = pOp[-1].p4
2ac40 2e 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 28 63  .pColl;.  }.  (c
2ac50 74 78 2e 70 46 75 6e 63 2d 3e 78 53 74 65 70 29  tx.pFunc->xStep)
2ac60 28 26 63 74 78 2c 20 6e 2c 20 61 70 56 61 6c 29  (&ctx, n, apVal)
2ac70 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 34 35 30  ; /* IMP: R-2450
2ac80 35 2d 32 33 32 33 30 20 2a 2f 0a 20 20 69 66 28  5-23230 */.  if(
2ac90 20 63 74 78 2e 69 73 45 72 72 6f 72 20 29 7b 0a   ctx.isError ){.
2aca0 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
2acb0 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
2acc0 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69  , db, "%s", sqli
2acd0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 26  te3_value_text(&
2ace0 63 74 78 2e 73 29 29 3b 0a 20 20 20 20 72 63 20  ctx.s));.    rc 
2acf0 3d 20 63 74 78 2e 69 73 45 72 72 6f 72 3b 0a 20  = ctx.isError;. 
2ad00 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62   }..  sqlite3Vdb
2ad10 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 74 78  eMemRelease(&ctx
2ad20 2e 73 29 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d  .s);..  break;.}
2ad30 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67  ../* Opcode: Agg
2ad40 46 69 6e 61 6c 20 50 31 20 50 32 20 2a 20 50 34  Final P1 P2 * P4
2ad50 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75 74 65   *.**.** Execute
2ad60 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 72 20 66   the finalizer f
2ad70 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 61  unction for an a
2ad80 67 67 72 65 67 61 74 65 2e 20 20 50 31 20 69 73  ggregate.  P1 is
2ad90 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 6c  .** the memory l
2ada0 6f 63 61 74 69 6f 6e 20 74 68 61 74 20 69 73 20  ocation that is 
2adb0 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
2adc0 66 6f 72 20 74 68 65 20 61 67 67 72 65 67 61 74  for the aggregat
2add0 65 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73 20 74  e..**.** P2 is t
2ade0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  he number of arg
2adf0 75 6d 65 6e 74 73 20 74 68 61 74 20 74 68 65 20  uments that the 
2ae00 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 74 61  step function ta
2ae10 6b 65 73 20 61 6e 64 0a 2a 2a 20 50 34 20 69 73  kes and.** P4 is
2ae20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2ae30 65 20 46 75 6e 63 44 65 66 20 66 6f 72 20 74 68  e FuncDef for th
2ae40 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  is function.  Th
2ae50 65 20 50 32 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  e P2.** argument
2ae60 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20   is not used by 
2ae70 74 68 69 73 20 6f 70 63 6f 64 65 2e 20 20 49 74  this opcode.  It
2ae80 20 69 73 20 6f 6e 6c 79 20 74 68 65 72 65 20 74   is only there t
2ae90 6f 20 64 69 73 61 6d 62 69 67 75 61 74 65 0a 2a  o disambiguate.*
2aea0 2a 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  * functions that
2aeb0 20 63 61 6e 20 74 61 6b 65 20 76 61 72 79 69 6e   can take varyin
2aec0 67 20 6e 75 6d 62 65 72 73 20 6f 66 20 61 72 67  g numbers of arg
2aed0 75 6d 65 6e 74 73 2e 20 20 54 68 65 0a 2a 2a 20  uments.  The.** 
2aee0 50 34 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f  P4 argument is o
2aef0 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 74  nly needed for t
2af00 68 65 20 64 65 67 65 6e 65 72 61 74 65 20 63 61  he degenerate ca
2af10 73 65 20 77 68 65 72 65 0a 2a 2a 20 74 68 65 20  se where.** the 
2af20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 77 61  step function wa
2af30 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79  s not previously
2af40 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 63 61 73 65   called..*/.case
2af50 20 4f 50 5f 41 67 67 46 69 6e 61 6c 3a 20 7b 0a   OP_AggFinal: {.
2af60 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 61    Mem *pMem;.  a
2af70 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30  ssert( pOp->p1>0
2af80 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e   && pOp->p1<=p->
2af90 6e 4d 65 6d 20 29 3b 0a 20 20 70 4d 65 6d 20 3d  nMem );.  pMem =
2afa0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
2afb0 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d  .  assert( (pMem
2afc0 2d 3e 66 6c 61 67 73 20 26 20 7e 28 4d 45 4d 5f  ->flags & ~(MEM_
2afd0 4e 75 6c 6c 7c 4d 45 4d 5f 41 67 67 29 29 3d 3d  Null|MEM_Agg))==
2afe0 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
2aff0 74 65 33 56 64 62 65 4d 65 6d 46 69 6e 61 6c 69  te3VdbeMemFinali
2b000 7a 65 28 70 4d 65 6d 2c 20 70 4f 70 2d 3e 70 34  ze(pMem, pOp->p4
2b010 2e 70 46 75 6e 63 29 3b 0a 20 20 69 66 28 20 72  .pFunc);.  if( r
2b020 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
2b030 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
2b040 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c  rrMsg, db, "%s",
2b050 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
2b060 65 78 74 28 70 4d 65 6d 29 29 3b 0a 20 20 7d 0a  ext(pMem));.  }.
2b070 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2b080 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4d 65 6d  ngeEncoding(pMem
2b090 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 55  , encoding);.  U
2b0a0 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49  PDATE_MAX_BLOBSI
2b0b0 5a 45 28 70 4d 65 6d 29 3b 0a 20 20 69 66 28 20  ZE(pMem);.  if( 
2b0c0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 6f  sqlite3VdbeMemTo
2b0d0 6f 42 69 67 28 70 4d 65 6d 29 20 29 7b 0a 20 20  oBig(pMem) ){.  
2b0e0 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a    goto too_big;.
2b0f0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
2b100 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b110 4d 49 54 5f 57 41 4c 0a 2f 2a 20 4f 70 63 6f 64  MIT_WAL./* Opcod
2b120 65 3a 20 43 68 65 63 6b 70 6f 69 6e 74 20 50 31  e: Checkpoint P1
2b130 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
2b140 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61   Checkpoint data
2b150 62 61 73 65 20 50 31 2e 20 54 68 69 73 20 69 73  base P1. This is
2b160 20 61 20 6e 6f 2d 6f 70 20 69 66 20 50 31 20 69   a no-op if P1 i
2b170 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
2b180 69 6e 0a 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 20  in.** WAL mode. 
2b190 50 61 72 61 6d 65 74 65 72 20 50 32 20 69 73 20  Parameter P2 is 
2b1a0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48  one of SQLITE_CH
2b1b0 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
2b1c0 2c 20 46 55 4c 4c 0a 2a 2a 20 6f 72 20 52 45 53  , FULL.** or RES
2b1d0 54 41 52 54 2e 20 20 57 72 69 74 65 20 31 20 6f  TART.  Write 1 o
2b1e0 72 20 30 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 5d  r 0 into mem[P3]
2b1f0 20 69 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69   if the checkpoi
2b200 6e 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51  nt returns.** SQ
2b210 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 6e 6f 74  LITE_BUSY or not
2b220 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
2b230 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
2b240 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
2b250 65 0a 2a 2a 20 57 41 4c 20 61 66 74 65 72 20 74  e.** WAL after t
2b260 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 6e  he checkpoint in
2b270 74 6f 20 6d 65 6d 5b 50 33 2b 31 5d 20 61 6e 64  to mem[P3+1] and
2b280 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
2b290 61 67 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 57  ages.** in the W
2b2a0 41 4c 20 74 68 61 74 20 68 61 76 65 20 62 65 65  AL that have bee
2b2b0 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 61  n checkpointed a
2b2c0 66 74 65 72 20 74 68 65 20 63 68 65 63 6b 70 6f  fter the checkpo
2b2d0 69 6e 74 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 73  int.** completes
2b2e0 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b 32 5d 2e   into mem[P3+2].
2b2f0 20 20 48 6f 77 65 76 65 72 20 6f 6e 20 61 6e 20    However on an 
2b300 65 72 72 6f 72 2c 20 6d 65 6d 5b 50 33 2b 31 5d  error, mem[P3+1]
2b310 20 61 6e 64 0a 2a 2a 20 6d 65 6d 5b 50 33 2b 32   and.** mem[P3+2
2b320 5d 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  ] are initialize
2b330 64 20 74 6f 20 2d 31 2e 0a 2a 2f 0a 63 61 73 65  d to -1..*/.case
2b340 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 20   OP_Checkpoint: 
2b350 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
2b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b370 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2b380 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 52 65  ter */.  int aRe
2b390 73 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20  s[3];           
2b3a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
2b3b0 6c 74 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  lts */.  Mem *pM
2b3c0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
2b3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2b3e0 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
2b3f0 2f 0a 0a 20 20 61 52 65 73 5b 30 5d 20 3d 20 30  /..  aRes[0] = 0
2b400 3b 0a 20 20 61 52 65 73 5b 31 5d 20 3d 20 61 52  ;.  aRes[1] = aR
2b410 65 73 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 61 73  es[2] = -1;.  as
2b420 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d 53  sert( pOp->p2==S
2b430 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
2b440 5f 50 41 53 53 49 56 45 0a 20 20 20 20 20 20 20  _PASSIVE.       
2b450 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49  || pOp->p2==SQLI
2b460 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55  TE_CHECKPOINT_FU
2b470 4c 4c 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70  LL.       || pOp
2b480 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45  ->p2==SQLITE_CHE
2b490 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 0a  CKPOINT_RESTART.
2b4a0 20 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69    );.  rc = sqli
2b4b0 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62  te3Checkpoint(db
2b4c0 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
2b4d0 70 32 2c 20 26 61 52 65 73 5b 31 5d 2c 20 26 61  p2, &aRes[1], &a
2b4e0 52 65 73 5b 32 5d 29 3b 0a 20 20 69 66 28 20 72  Res[2]);.  if( r
2b4f0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
2b500 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2b510 45 5f 4f 4b 3b 0a 20 20 20 20 61 52 65 73 5b 30  E_OK;.    aRes[0
2b520 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72  ] = 1;.  }.  for
2b530 28 69 3d 30 2c 20 70 4d 65 6d 20 3d 20 26 61 4d  (i=0, pMem = &aM
2b540 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 20 69 3c 33  em[pOp->p3]; i<3
2b550 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a  ; i++, pMem++){.
2b560 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
2b570 65 6d 53 65 74 49 6e 74 36 34 28 70 4d 65 6d 2c  emSetInt64(pMem,
2b580 20 28 69 36 34 29 61 52 65 73 5b 69 5d 29 3b 0a   (i64)aRes[i]);.
2b590 20 20 7d 20 20 20 20 0a 20 20 62 72 65 61 6b 3b    }    .  break;
2b5a0 0a 7d 3b 20 20 0a 23 65 6e 64 69 66 0a 0a 23 69  .};  .#endif..#i
2b5b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b5c0 54 5f 50 52 41 47 4d 41 0a 2f 2a 20 4f 70 63 6f  T_PRAGMA./* Opco
2b5d0 64 65 3a 20 4a 6f 75 72 6e 61 6c 4d 6f 64 65 20  de: JournalMode 
2b5e0 50 31 20 50 32 20 50 33 20 2a 20 50 35 0a 2a 2a  P1 P2 P3 * P5.**
2b5f0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6a  .** Change the j
2b600 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6f 66 20 64  ournal mode of d
2b610 61 74 61 62 61 73 65 20 50 31 20 74 6f 20 50 33  atabase P1 to P3
2b620 2e 20 50 33 20 6d 75 73 74 20 62 65 20 6f 6e 65  . P3 must be one
2b630 20 6f 66 20 74 68 65 0a 2a 2a 20 50 41 47 45 52   of the.** PAGER
2b640 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58  _JOURNALMODE_XXX
2b650 20 76 61 6c 75 65 73 2e 20 49 66 20 63 68 61 6e   values. If chan
2b660 67 69 6e 67 20 62 65 74 77 65 65 6e 20 74 68 65  ging between the
2b670 20 76 61 72 69 6f 75 73 20 72 6f 6c 6c 62 61 63   various rollbac
2b680 6b 0a 2a 2a 20 6d 6f 64 65 73 20 28 64 65 6c 65  k.** modes (dele
2b690 74 65 2c 20 74 72 75 6e 63 61 74 65 2c 20 70 65  te, truncate, pe
2b6a0 72 73 69 73 74 2c 20 6f 66 66 20 61 6e 64 20 6d  rsist, off and m
2b6b0 65 6d 6f 72 79 29 2c 20 74 68 69 73 20 69 73 20  emory), this is 
2b6c0 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 6f 70 65 72  a simple.** oper
2b6d0 61 74 69 6f 6e 2e 20 4e 6f 20 49 4f 20 69 73 20  ation. No IO is 
2b6e0 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  required..**.** 
2b6f0 49 66 20 63 68 61 6e 67 69 6e 67 20 69 6e 74 6f  If changing into
2b700 20 6f 72 20 6f 75 74 20 6f 66 20 57 41 4c 20 6d   or out of WAL m
2b710 6f 64 65 20 74 68 65 20 70 72 6f 63 65 64 75 72  ode the procedur
2b720 65 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 69  e is more compli
2b730 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 72 69  cated..**.** Wri
2b740 74 65 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  te a string cont
2b750 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6e 61 6c  aining the final
2b760 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 74 6f   journal-mode to
2b770 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f   register P2..*/
2b780 0a 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c  .case OP_Journal
2b790 4d 6f 64 65 3a 20 7b 20 20 20 20 2f 2a 20 6f 75  Mode: {    /* ou
2b7a0 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f  t2-prerelease */
2b7b0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 20 20  .  Btree *pBt;  
2b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7d0 20 20 20 2f 2a 20 42 74 72 65 65 20 74 6f 20 63     /* Btree to c
2b7e0 68 61 6e 67 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f  hange journal mo
2b7f0 64 65 20 6f 66 20 2a 2f 0a 20 20 50 61 67 65 72  de of */.  Pager
2b800 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20   *pPager;       
2b810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2b820 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77  ger associated w
2b830 69 74 68 20 70 42 74 20 2a 2f 0a 20 20 69 6e 74  ith pBt */.  int
2b840 20 65 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20   eNew;          
2b850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b860 4e 65 77 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  New journal mode
2b870 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 6c 64 3b 20   */.  int eOld; 
2b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b890 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6c 64        /* The old
2b8a0 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f   journal mode */
2b8b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2b8c0 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
2b8d0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61     /* Name of da
2b8e0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
2b8f0 70 50 61 67 65 72 20 2a 2f 0a 0a 20 20 65 4e 65  pPager */..  eNe
2b900 77 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61  w = pOp->p3;.  a
2b910 73 73 65 72 74 28 20 65 4e 65 77 3d 3d 50 41 47  ssert( eNew==PAG
2b920 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
2b930 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 7c 7c  ELETE .       ||
2b940 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55   eNew==PAGER_JOU
2b950 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
2b960 45 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65  E .       || eNe
2b970 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  w==PAGER_JOURNAL
2b980 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 0a 20 20  MODE_PERSIST .  
2b990 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41       || eNew==PA
2b9a0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2b9b0 4f 46 46 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e  OFF.       || eN
2b9c0 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ew==PAGER_JOURNA
2b9d0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a 20 20 20  LMODE_MEMORY.   
2b9e0 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47      || eNew==PAG
2b9f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
2ba00 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65  AL.       || eNe
2ba10 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  w==PAGER_JOURNAL
2ba20 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 29 3b 0a  MODE_QUERY.  );.
2ba30 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2ba40 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
2ba50 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 70 42  db->nDb );..  pB
2ba60 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d  t = db->aDb[pOp-
2ba70 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 70 50 61 67  >p1].pBt;.  pPag
2ba80 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
2ba90 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 65  ePager(pBt);.  e
2baa0 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Old = sqlite3Pag
2bab0 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65  erGetJournalMode
2bac0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
2bad0 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eNew==PAGER_JOUR
2bae0 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20 29 20  NALMODE_QUERY ) 
2baf0 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 69  eNew = eOld;.  i
2bb00 66 28 20 21 73 71 6c 69 74 65 33 50 61 67 65 72  f( !sqlite3Pager
2bb10 4f 6b 54 6f 43 68 61 6e 67 65 4a 6f 75 72 6e 61  OkToChangeJourna
2bb20 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 20 29 20  lMode(pPager) ) 
2bb30 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 0a 23 69  eNew = eOld;..#i
2bb40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2bb50 54 5f 57 41 4c 0a 20 20 7a 46 69 6c 65 6e 61 6d  T_WAL.  zFilenam
2bb60 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
2bb70 46 69 6c 65 6e 61 6d 65 28 70 50 61 67 65 72 29  Filename(pPager)
2bb80 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61  ;..  /* Do not a
2bb90 6c 6c 6f 77 20 61 20 74 72 61 6e 73 69 74 69 6f  llow a transitio
2bba0 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  n to journal_mod
2bbb0 65 3d 57 41 4c 20 66 6f 72 20 61 20 64 61 74 61  e=WAL for a data
2bbc0 62 61 73 65 0a 20 20 2a 2a 20 69 6e 20 74 65 6d  base.  ** in tem
2bbd0 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20 6f  porary storage o
2bbe0 72 20 69 66 20 74 68 65 20 56 46 53 20 64 6f 65  r if the VFS doe
2bbf0 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68  s not support sh
2bc00 61 72 65 64 20 6d 65 6d 6f 72 79 20 0a 20 20 2a  ared memory .  *
2bc10 2f 0a 20 20 69 66 28 20 65 4e 65 77 3d 3d 50 41  /.  if( eNew==PA
2bc20 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2bc30 57 41 4c 0a 20 20 20 26 26 20 28 7a 46 69 6c 65  WAL.   && (zFile
2bc40 6e 61 6d 65 5b 30 5d 3d 3d 30 20 20 20 20 20 20  name[0]==0      
2bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc60 20 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 20     /* Temp file 
2bc70 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20 21 73 71  */.       || !sq
2bc80 6c 69 74 65 33 50 61 67 65 72 57 61 6c 53 75 70  lite3PagerWalSup
2bc90 70 6f 72 74 65 64 28 70 50 61 67 65 72 29 29 20  ported(pPager)) 
2bca0 20 20 2f 2a 20 4e 6f 20 73 68 61 72 65 64 2d 6d    /* No shared-m
2bcb0 65 6d 6f 72 79 20 73 75 70 70 6f 72 74 20 2a 2f  emory support */
2bcc0 0a 20 20 29 7b 0a 20 20 20 20 65 4e 65 77 20 3d  .  ){.    eNew =
2bcd0 20 65 4f 6c 64 3b 0a 20 20 7d 0a 0a 20 20 69 66   eOld;.  }..  if
2bce0 28 20 28 65 4e 65 77 21 3d 65 4f 6c 64 29 0a 20  ( (eNew!=eOld). 
2bcf0 20 20 26 26 20 28 65 4f 6c 64 3d 3d 50 41 47 45    && (eOld==PAGE
2bd00 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
2bd10 4c 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52  L || eNew==PAGER
2bd20 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2bd30 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ).  ){.    if( !
2bd40 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 7c  db->autoCommit |
2bd50 7c 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  | db->activeVdbe
2bd60 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  Cnt>1 ){.      r
2bd70 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
2bd80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
2bd90 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
2bda0 72 4d 73 67 2c 20 64 62 2c 20 0a 20 20 20 20 20  rMsg, db, .     
2bdb0 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68 61       "cannot cha
2bdc0 6e 67 65 20 25 73 20 77 61 6c 20 6d 6f 64 65 20  nge %s wal mode 
2bdd0 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
2bde0 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20 20 20  ansaction",.    
2bdf0 20 20 20 20 20 20 28 65 4e 65 77 3d 3d 50 41 47        (eNew==PAG
2be00 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
2be10 41 4c 20 3f 20 22 69 6e 74 6f 22 20 3a 20 22 6f  AL ? "into" : "o
2be20 75 74 20 6f 66 22 29 0a 20 20 20 20 20 20 29 3b  ut of").      );
2be30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2be40 20 20 7d 65 6c 73 65 7b 0a 20 0a 20 20 20 20 20    }else{. .     
2be50 20 69 66 28 20 65 4f 6c 64 3d 3d 50 41 47 45 52   if( eOld==PAGER
2be60 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2be70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2be80 66 20 6c 65 61 76 69 6e 67 20 57 41 4c 20 6d 6f  f leaving WAL mo
2be90 64 65 2c 20 63 6c 6f 73 65 20 74 68 65 20 6c 6f  de, close the lo
2bea0 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65  g file. If succe
2beb0 73 73 66 75 6c 2c 20 74 68 65 20 63 61 6c 6c 0a  ssful, the call.
2bec0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 50 61          ** to Pa
2bed0 67 65 72 43 6c 6f 73 65 57 61 6c 28 29 20 63 68  gerCloseWal() ch
2bee0 65 63 6b 70 6f 69 6e 74 73 20 61 6e 64 20 64 65  eckpoints and de
2bef0 6c 65 74 65 73 20 74 68 65 20 77 72 69 74 65 2d  letes the write-
2bf00 61 68 65 61 64 2d 6c 6f 67 20 0a 20 20 20 20 20  ahead-log .     
2bf10 20 20 20 2a 2a 20 66 69 6c 65 2e 20 41 6e 20 45     ** file. An E
2bf20 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6d 61  XCLUSIVE lock ma
2bf30 79 20 73 74 69 6c 6c 20 62 65 20 68 65 6c 64 20  y still be held 
2bf40 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2bf50 66 69 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  file .        **
2bf60 20 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73   after a success
2bf70 66 75 6c 20 72 65 74 75 72 6e 2e 20 0a 20 20 20  ful return. .   
2bf80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2bf90 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2bfa0 72 43 6c 6f 73 65 57 61 6c 28 70 50 61 67 65 72  rCloseWal(pPager
2bfb0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2bfc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bfd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2bfe0 33 50 61 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c  3PagerSetJournal
2bff0 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4e 65  Mode(pPager, eNe
2c000 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  w);.        }.  
2c010 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f      }else if( eO
2c020 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ld==PAGER_JOURNA
2c030 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
2c040 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6e 6f          /* Canno
2c050 74 20 74 72 61 6e 73 69 74 69 6f 6e 20 64 69 72  t transition dir
2c060 65 63 74 6c 79 20 66 72 6f 6d 20 4d 45 4d 4f 52  ectly from MEMOR
2c070 59 20 74 6f 20 57 41 4c 2e 20 20 55 73 65 20 6d  Y to WAL.  Use m
2c080 6f 64 65 20 4f 46 46 0a 20 20 20 20 20 20 20 20  ode OFF.        
2c090 2a 2a 20 61 73 20 61 6e 20 69 6e 74 65 72 6d 65  ** as an interme
2c0a0 64 69 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 20  diate */.       
2c0b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
2c0c0 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67  JournalMode(pPag
2c0d0 65 72 2c 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  er, PAGER_JOURNA
2c0e0 4c 4d 4f 44 45 5f 4f 46 46 29 3b 0a 20 20 20 20  LMODE_OFF);.    
2c0f0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
2c100 4f 70 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  Open a transacti
2c110 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  on on the databa
2c120 73 65 20 66 69 6c 65 2e 20 52 65 67 61 72 64 6c  se file. Regardl
2c130 65 73 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ess of the journ
2c140 61 6c 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  al.      ** mode
2c150 2c 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  , this transacti
2c160 6f 6e 20 61 6c 77 61 79 73 20 75 73 65 73 20 61  on always uses a
2c170 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2c180 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
2c190 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2c1a0 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
2c1b0 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pBt)==0 );.     
2c1c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c1d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
2c1e0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
2c1f0 65 74 56 65 72 73 69 6f 6e 28 70 42 74 2c 20 28  etVersion(pBt, (
2c200 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eNew==PAGER_JOUR
2c210 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 3f 20 32 20  NALMODE_WAL ? 2 
2c220 3a 20 31 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  : 1));.      }. 
2c230 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
2c240 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
2c250 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 20 20  _OMIT_WAL */..  
2c260 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 65 4e  if( rc ){.    eN
2c270 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 7d 0a 20  ew = eOld;.  }. 
2c280 20 65 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50   eNew = sqlite3P
2c290 61 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f  agerSetJournalMo
2c2a0 64 65 28 70 50 61 67 65 72 2c 20 65 4e 65 77 29  de(pPager, eNew)
2c2b0 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65  ;..  pOut = &aMe
2c2c0 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f  m[pOp->p2];.  pO
2c2d0 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ut->flags = MEM_
2c2e0 53 74 72 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  Str|MEM_Static|M
2c2f0 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d  EM_Term;.  pOut-
2c300 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  >z = (char *)sql
2c310 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e  ite3JournalModen
2c320 61 6d 65 28 65 4e 65 77 29 3b 0a 20 20 70 4f 75  ame(eNew);.  pOu
2c330 74 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  t->n = sqlite3St
2c340 72 6c 65 6e 33 30 28 70 4f 75 74 2d 3e 7a 29 3b  rlen30(pOut->z);
2c350 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 53  .  pOut->enc = S
2c360 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 73 71  QLITE_UTF8;.  sq
2c370 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45  lite3VdbeChangeE
2c380 6e 63 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65 6e  ncoding(pOut, en
2c390 63 6f 64 69 6e 67 29 3b 0a 20 20 62 72 65 61 6b  coding);.  break
2c3a0 3b 0a 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.};.#endif /* S
2c3b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d  QLITE_OMIT_PRAGM
2c3c0 41 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  A */..#if !defin
2c3d0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
2c3e0 41 43 55 55 4d 29 20 26 26 20 21 64 65 66 69 6e  ACUUM) && !defin
2c3f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed(SQLITE_OMIT_A
2c400 54 54 41 43 48 29 0a 2f 2a 20 4f 70 63 6f 64 65  TTACH)./* Opcode
2c410 3a 20 56 61 63 75 75 6d 20 2a 20 2a 20 2a 20 2a  : Vacuum * * * *
2c420 20 2a 0a 2a 2a 0a 2a 2a 20 56 61 63 75 75 6d 20   *.**.** Vacuum 
2c430 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 62  the entire datab
2c440 61 73 65 2e 20 20 54 68 69 73 20 6f 70 63 6f 64  ase.  This opcod
2c450 65 20 77 69 6c 6c 20 63 61 75 73 65 20 6f 74 68  e will cause oth
2c460 65 72 20 76 69 72 74 75 61 6c 0a 2a 2a 20 6d 61  er virtual.** ma
2c470 63 68 69 6e 65 73 20 74 6f 20 62 65 20 63 72 65  chines to be cre
2c480 61 74 65 64 20 61 6e 64 20 72 75 6e 2e 20 20 49  ated and run.  I
2c490 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c  t may not be cal
2c4a0 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a  led from within.
2c4b0 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
2c4c0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 61 63  ..*/.case OP_Vac
2c4d0 75 75 6d 3a 20 7b 0a 20 20 72 63 20 3d 20 73 71  uum: {.  rc = sq
2c4e0 6c 69 74 65 33 52 75 6e 56 61 63 75 75 6d 28 26  lite3RunVacuum(&
2c4f0 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 29 3b  p->zErrMsg, db);
2c500 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
2c510 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
2c520 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54  (SQLITE_OMIT_AUT
2c530 4f 56 41 43 55 55 4d 29 0a 2f 2a 20 4f 70 63 6f  OVACUUM)./* Opco
2c540 64 65 3a 20 49 6e 63 72 56 61 63 75 75 6d 20 50  de: IncrVacuum P
2c550 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
2c560 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
2c570 65 20 73 74 65 70 20 6f 66 20 74 68 65 20 69 6e  e step of the in
2c580 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
2c590 20 70 72 6f 63 65 64 75 72 65 20 6f 6e 0a 2a 2a   procedure on.**
2c5a0 20 74 68 65 20 50 31 20 64 61 74 61 62 61 73 65   the P1 database
2c5b0 2e 20 49 66 20 74 68 65 20 76 61 63 75 75 6d 20  . If the vacuum 
2c5c0 68 61 73 20 66 69 6e 69 73 68 65 64 2c 20 6a 75  has finished, ju
2c5d0 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f  mp to instructio
2c5e0 6e 0a 2a 2a 20 50 32 2e 20 4f 74 68 65 72 77 69  n.** P2. Otherwi
2c5f0 73 65 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  se, fall through
2c600 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
2c610 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73  truction..*/.cas
2c620 65 20 4f 50 5f 49 6e 63 72 56 61 63 75 75 6d 3a  e OP_IncrVacuum:
2c630 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
2c640 70 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 42  p */.  Btree *pB
2c650 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  t;..  assert( pO
2c660 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
2c670 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  >p1<db->nDb );. 
2c680 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74 72   assert( (p->btr
2c690 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44 62 4d  eeMask & (((yDbM
2c6a0 61 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e 70 31 29  ask)1)<<pOp->p1)
2c6b0 29 21 3d 30 20 29 3b 0a 20 20 70 42 74 20 3d 20  )!=0 );.  pBt = 
2c6c0 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d  db->aDb[pOp->p1]
2c6d0 2e 70 42 74 3b 0a 20 20 72 63 20 3d 20 73 71 6c  .pBt;.  rc = sql
2c6e0 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
2c6f0 75 75 6d 28 70 42 74 29 3b 0a 20 20 69 66 28 20  uum(pBt);.  if( 
2c700 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
2c710 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  ){.    pc = pOp-
2c720 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 72 63 20  >p2 - 1;.    rc 
2c730 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
2c740 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
2c750 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45  if../* Opcode: E
2c760 78 70 69 72 65 20 50 31 20 2a 20 2a 20 2a 20 2a  xpire P1 * * * *
2c770 0a 2a 2a 0a 2a 2a 20 43 61 75 73 65 20 70 72 65  .**.** Cause pre
2c780 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
2c790 6e 74 73 20 74 6f 20 62 65 63 6f 6d 65 20 65 78  nts to become ex
2c7a0 70 69 72 65 64 2e 20 41 6e 20 65 78 70 69 72 65  pired. An expire
2c7b0 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 66  d statement.** f
2c7c0 61 69 6c 73 20 77 69 74 68 20 61 6e 20 65 72 72  ails with an err
2c7d0 6f 72 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54  or code of SQLIT
2c7e0 45 5f 53 43 48 45 4d 41 20 69 66 20 69 74 20 69  E_SCHEMA if it i
2c7f0 73 20 65 76 65 72 20 65 78 65 63 75 74 65 64 20  s ever executed 
2c800 0a 2a 2a 20 28 76 69 61 20 73 71 6c 69 74 65 33  .** (via sqlite3
2c810 5f 73 74 65 70 28 29 29 2e 0a 2a 2a 20 0a 2a 2a  _step())..** .**
2c820 20 49 66 20 50 31 20 69 73 20 30 2c 20 74 68 65   If P1 is 0, the
2c830 6e 20 61 6c 6c 20 53 51 4c 20 73 74 61 74 65 6d  n all SQL statem
2c840 65 6e 74 73 20 62 65 63 6f 6d 65 20 65 78 70 69  ents become expi
2c850 72 65 64 2e 20 49 66 20 50 31 20 69 73 20 6e 6f  red. If P1 is no
2c860 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20 74 68 65 6e 20  n-zero,.** then 
2c870 6f 6e 6c 79 20 74 68 65 20 63 75 72 72 65 6e 74  only the current
2c880 6c 79 20 65 78 65 63 75 74 69 6e 67 20 73 74 61  ly executing sta
2c890 74 65 6d 65 6e 74 20 69 73 20 61 66 66 65 63 74  tement is affect
2c8a0 65 64 2e 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ed. .*/.case OP_
2c8b0 45 78 70 69 72 65 3a 20 7b 0a 20 20 69 66 28 20  Expire: {.  if( 
2c8c0 21 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20  !pOp->p1 ){.    
2c8d0 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
2c8e0 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
2c8f0 64 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  db);.  }else{.  
2c900 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31    p->expired = 1
2c910 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
2c920 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c930 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c940 48 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 61  HE./* Opcode: Ta
2c950 62 6c 65 4c 6f 63 6b 20 50 31 20 50 32 20 50 33  bleLock P1 P2 P3
2c960 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 4f 62 74 61   P4 *.**.** Obta
2c970 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 70  in a lock on a p
2c980 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e  articular table.
2c990 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   This instructio
2c9a0 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77  n is only used w
2c9b0 68 65 6e 0a 2a 2a 20 74 68 65 20 73 68 61 72 65  hen.** the share
2c9c0 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
2c9d0 69 73 20 65 6e 61 62 6c 65 64 2e 20 0a 2a 2a 0a  is enabled. .**.
2c9e0 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69 6e 64  ** P1 is the ind
2c9f0 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
2ca00 73 65 20 69 6e 20 73 71 6c 69 74 65 33 2e 61 44  se in sqlite3.aD
2ca10 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74 61 62  b[] of the datab
2ca20 61 73 65 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20  ase.** on which 
2ca30 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 63 71 75  the lock is acqu
2ca40 69 72 65 64 2e 20 20 41 20 72 65 61 64 6c 6f 63  ired.  A readloc
2ca50 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69 66  k is obtained if
2ca60 20 50 33 3d 3d 30 20 6f 72 0a 2a 2a 20 61 20 77   P3==0 or.** a w
2ca70 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 50 33 3d  rite lock if P3=
2ca80 3d 31 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 63 6f 6e  =1..**.** P2 con
2ca90 74 61 69 6e 73 20 74 68 65 20 72 6f 6f 74 2d 70  tains the root-p
2caa0 61 67 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  age of the table
2cab0 20 74 6f 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20   to lock..**.** 
2cac0 50 34 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  P4 contains a po
2cad0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 61 6d  inter to the nam
2cae0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 62  e of the table b
2caf0 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 20 54 68 69  eing locked. Thi
2cb00 73 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 75 73 65  s is only.** use
2cb10 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  d to generate an
2cb20 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2cb30 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
2cb40 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a  t be obtained..*
2cb50 2f 0a 63 61 73 65 20 4f 50 5f 54 61 62 6c 65 4c  /.case OP_TableL
2cb60 6f 63 6b 3a 20 7b 0a 20 20 75 38 20 69 73 57 72  ock: {.  u8 isWr
2cb70 69 74 65 4c 6f 63 6b 20 3d 20 28 75 38 29 70 4f  iteLock = (u8)pO
2cb80 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 69 73 57  p->p3;.  if( isW
2cb90 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 30 3d 3d 28  riteLock || 0==(
2cba0 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
2cbb0 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
2cbc0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 31 20  ) ){.    int p1 
2cbd0 3d 20 70 4f 70 2d 3e 70 31 3b 20 0a 20 20 20 20  = pOp->p1; .    
2cbe0 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26  assert( p1>=0 &&
2cbf0 20 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20   p1<db->nDb );. 
2cc00 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62     assert( (p->b
2cc10 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44  treeMask & (((yD
2cc20 62 4d 61 73 6b 29 31 29 3c 3c 70 31 29 29 21 3d  bMask)1)<<p1))!=
2cc30 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2cc40 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 30 20   isWriteLock==0 
2cc50 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d  || isWriteLock==
2cc60 31 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  1 );.    rc = sq
2cc70 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61  lite3BtreeLockTa
2cc80 62 6c 65 28 64 62 2d 3e 61 44 62 5b 70 31 5d 2e  ble(db->aDb[p1].
2cc90 70 42 74 2c 20 70 4f 70 2d 3e 70 32 2c 20 69 73  pBt, pOp->p2, is
2cca0 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  WriteLock);.    
2ccb0 69 66 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53  if( (rc&0xFF)==S
2ccc0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a  QLITE_LOCKED ){.
2ccd0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2cce0 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b   *z = pOp->p4.z;
2ccf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
2cd00 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
2cd10 4d 73 67 2c 20 64 62 2c 20 22 64 61 74 61 62 61  Msg, db, "databa
2cd20 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
2cd30 65 64 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  ed: %s", z);.   
2cd40 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
2cd50 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2cd60 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
2cd70 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
2cd80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2cd90 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63  TUALTABLE./* Opc
2cda0 6f 64 65 3a 20 56 42 65 67 69 6e 20 2a 20 2a 20  ode: VBegin * * 
2cdb0 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20  * P4 *.**.** P4 
2cdc0 6d 61 79 20 62 65 20 61 20 70 6f 69 6e 74 65 72  may be a pointer
2cdd0 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76   to an sqlite3_v
2cde0 74 61 62 20 73 74 72 75 63 74 75 72 65 2e 20 49  tab structure. I
2cdf0 66 20 73 6f 2c 20 63 61 6c 6c 20 74 68 65 20 0a  f so, call the .
2ce00 2a 2a 20 78 42 65 67 69 6e 20 6d 65 74 68 6f 64  ** xBegin method
2ce10 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e   for that table.
2ce20 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 2c 20 77 68 65  .**.** Also, whe
2ce30 74 68 65 72 20 6f 72 20 6e 6f 74 20 50 34 20 69  ther or not P4 i
2ce40 73 20 73 65 74 2c 20 63 68 65 63 6b 20 74 68 61  s set, check tha
2ce50 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 62 65  t this is not be
2ce60 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 0a  ing called from.
2ce70 2a 2a 20 77 69 74 68 69 6e 20 61 20 63 61 6c 6c  ** within a call
2ce80 62 61 63 6b 20 74 6f 20 61 20 76 69 72 74 75 61  back to a virtua
2ce90 6c 20 74 61 62 6c 65 20 78 53 79 6e 63 28 29 20  l table xSync() 
2cea0 6d 65 74 68 6f 64 2e 20 49 66 20 69 74 20 69 73  method. If it is
2ceb0 2c 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63  , the error.** c
2cec0 6f 64 65 20 77 69 6c 6c 20 62 65 20 73 65 74 20  ode will be set 
2ced0 74 6f 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  to SQLITE_LOCKED
2cee0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 42 65  ..*/.case OP_VBe
2cef0 67 69 6e 3a 20 7b 0a 20 20 56 54 61 62 6c 65 20  gin: {.  VTable 
2cf00 2a 70 56 54 61 62 3b 0a 20 20 70 56 54 61 62 20  *pVTab;.  pVTab 
2cf10 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b  = pOp->p4.pVtab;
2cf20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
2cf30 74 61 62 42 65 67 69 6e 28 64 62 2c 20 70 56 54  tabBegin(db, pVT
2cf40 61 62 29 3b 0a 20 20 69 66 28 20 70 56 54 61 62  ab);.  if( pVTab
2cf50 20 29 20 69 6d 70 6f 72 74 56 74 61 62 45 72 72   ) importVtabErr
2cf60 4d 73 67 28 70 2c 20 70 56 54 61 62 2d 3e 70 56  Msg(p, pVTab->pV
2cf70 74 61 62 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  tab);.  break;.}
2cf80 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2cf90 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2cfa0 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  BLE */..#ifndef 
2cfb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2cfc0 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f  UALTABLE./* Opco
2cfd0 64 65 3a 20 56 43 72 65 61 74 65 20 50 31 20 2a  de: VCreate P1 *
2cfe0 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34   * P4 *.**.** P4
2cff0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
2d000 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
2d010 69 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e 20  in database P1. 
2d020 43 61 6c 6c 20 74 68 65 20 78 43 72 65 61 74 65  Call the xCreate
2d030 20 6d 65 74 68 6f 64 0a 2a 2a 20 66 6f 72 20 74   method.** for t
2d040 68 61 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61  hat table..*/.ca
2d050 73 65 20 4f 50 5f 56 43 72 65 61 74 65 3a 20 7b  se OP_VCreate: {
2d060 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
2d070 74 61 62 43 61 6c 6c 43 72 65 61 74 65 28 64 62  tabCallCreate(db
2d080 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
2d090 70 34 2e 7a 2c 20 26 70 2d 3e 7a 45 72 72 4d 73  p4.z, &p->zErrMs
2d0a0 67 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  g);.  break;.}.#
2d0b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2d0c0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2d0d0 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2d0e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2d0f0 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65  LTABLE./* Opcode
2d100 3a 20 56 44 65 73 74 72 6f 79 20 50 31 20 2a 20  : VDestroy P1 * 
2d110 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20  * P4 *.**.** P4 
2d120 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
2d130 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
2d140 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 20  n database P1.  
2d150 43 61 6c 6c 20 74 68 65 20 78 44 65 73 74 72 6f  Call the xDestro
2d160 79 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74  y method.** of t
2d170 68 61 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61  hat table..*/.ca
2d180 73 65 20 4f 50 5f 56 44 65 73 74 72 6f 79 3a 20  se OP_VDestroy: 
2d190 7b 0a 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74  {.  p->inVtabMet
2d1a0 68 6f 64 20 3d 20 32 3b 0a 20 20 72 63 20 3d 20  hod = 2;.  rc = 
2d1b0 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 44  sqlite3VtabCallD
2d1c0 65 73 74 72 6f 79 28 64 62 2c 20 70 4f 70 2d 3e  estroy(db, pOp->
2d1d0 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  p1, pOp->p4.z);.
2d1e0 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f    p->inVtabMetho
2d1f0 64 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a  d = 0;.  break;.
2d200 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2d210 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2d220 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ABLE */..#ifndef
2d230 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2d240 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63  TUALTABLE./* Opc
2d250 6f 64 65 3a 20 56 4f 70 65 6e 20 50 31 20 2a 20  ode: VOpen P1 * 
2d260 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20  * P4 *.**.** P4 
2d270 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
2d280 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
2d290 6f 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c 69 74  object, an sqlit
2d2a0 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
2d2b0 65 2e 0a 2a 2a 20 50 31 20 69 73 20 61 20 63 75  e..** P1 is a cu
2d2c0 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 54 68  rsor number.  Th
2d2d0 69 73 20 6f 70 63 6f 64 65 20 6f 70 65 6e 73 20  is opcode opens 
2d2e0 61 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  a cursor to the 
2d2f0 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65  virtual.** table
2d300 20 61 6e 64 20 73 74 6f 72 65 73 20 74 68 61 74   and stores that
2d310 20 63 75 72 73 6f 72 20 69 6e 20 50 31 2e 0a 2a   cursor in P1..*
2d320 2f 0a 63 61 73 65 20 4f 50 5f 56 4f 70 65 6e 3a  /.case OP_VOpen:
2d330 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20   {.  VdbeCursor 
2d340 2a 70 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33  *pCur;.  sqlite3
2d350 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
2d360 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 73 71 6c  tabCursor;.  sql
2d370 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
2d380 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  ;.  sqlite3_modu
2d390 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20  le *pModule;..  
2d3a0 70 43 75 72 20 3d 20 30 3b 0a 20 20 70 56 74 61  pCur = 0;.  pVta
2d3b0 62 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70  bCursor = 0;.  p
2d3c0 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Vtab = pOp->p4.p
2d3d0 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 70  Vtab->pVtab;.  p
2d3e0 4d 6f 64 75 6c 65 20 3d 20 28 73 71 6c 69 74 65  Module = (sqlite
2d3f0 33 5f 6d 6f 64 75 6c 65 20 2a 29 70 56 74 61 62  3_module *)pVtab
2d400 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 73  ->pModule;.  ass
2d410 65 72 74 28 70 56 74 61 62 20 26 26 20 70 4d 6f  ert(pVtab && pMo
2d420 64 75 6c 65 29 3b 0a 20 20 72 63 20 3d 20 70 4d  dule);.  rc = pM
2d430 6f 64 75 6c 65 2d 3e 78 4f 70 65 6e 28 70 56 74  odule->xOpen(pVt
2d440 61 62 2c 20 26 70 56 74 61 62 43 75 72 73 6f 72  ab, &pVtabCursor
2d450 29 3b 0a 20 20 69 6d 70 6f 72 74 56 74 61 62 45  );.  importVtabE
2d460 72 72 4d 73 67 28 70 2c 20 70 56 74 61 62 29 3b  rrMsg(p, pVtab);
2d470 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
2d480 3d 3d 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ==rc ){.    /* I
2d490 6e 69 74 69 61 6c 69 7a 65 20 73 71 6c 69 74 65  nitialize sqlite
2d4a0 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61  3_vtab_cursor ba
2d4b0 73 65 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20 20  se class */.    
2d4c0 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
2d4d0 61 62 20 3d 20 70 56 74 61 62 3b 0a 0a 20 20 20  ab = pVtab;..   
2d4e0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 73 65 20 76   /* Initialise v
2d4f0 64 62 65 20 63 75 72 73 6f 72 20 6f 62 6a 65 63  dbe cursor objec
2d500 74 20 2a 2f 0a 20 20 20 20 70 43 75 72 20 3d 20  t */.    pCur = 
2d510 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70  allocateCursor(p
2d520 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 2d 31  , pOp->p1, 0, -1
2d530 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , 0);.    if( pC
2d540 75 72 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ur ){.      pCur
2d550 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20  ->pVtabCursor = 
2d560 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20  pVtabCursor;.   
2d570 20 20 20 70 43 75 72 2d 3e 70 4d 6f 64 75 6c 65     pCur->pModule
2d580 20 3d 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e   = pVtabCursor->
2d590 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
2d5a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d5b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2d5c0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4d 6f  d = 1;.      pMo
2d5d0 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74  dule->xClose(pVt
2d5e0 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d  abCursor);.    }
2d5f0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
2d600 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2d610 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2d620 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  LE */..#ifndef S
2d630 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2d640 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64  ALTABLE./* Opcod
2d650 65 3a 20 56 46 69 6c 74 65 72 20 50 31 20 50 32  e: VFilter P1 P2
2d660 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50   P3 P4 *.**.** P
2d670 31 20 69 73 20 61 20 63 75 72 73 6f 72 20 6f 70  1 is a cursor op
2d680 65 6e 65 64 20 75 73 69 6e 67 20 56 4f 70 65 6e  ened using VOpen
2d690 2e 20 20 50 32 20 69 73 20 61 6e 20 61 64 64 72  .  P2 is an addr
2d6a0 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  ess to jump to i
2d6b0 66 0a 2a 2a 20 74 68 65 20 66 69 6c 74 65 72 65  f.** the filtere
2d6c0 64 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20  d result set is 
2d6d0 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 50 34 20  empty..**.** P4 
2d6e0 69 73 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f  is either NULL o
2d6f0 72 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  r a string that 
2d700 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 62 79  was generated by
2d710 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 0a   the xBestIndex.
2d720 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ** method of the
2d730 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 69 6e   module.  The in
2d740 74 65 72 70 72 65 74 61 74 69 6f 6e 20 6f 66 20  terpretation of 
2d750 74 68 65 20 50 34 20 73 74 72 69 6e 67 20 69 73  the P4 string is
2d760 20 6c 65 66 74 0a 2a 2a 20 74 6f 20 74 68 65 20   left.** to the 
2d770 6d 6f 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74  module implement
2d780 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
2d790 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73  s opcode invokes
2d7a0 20 74 68 65 20 78 46 69 6c 74 65 72 20 6d 65 74   the xFilter met
2d7b0 68 6f 64 20 6f 6e 20 74 68 65 20 76 69 72 74 75  hod on the virtu
2d7c0 61 6c 20 74 61 62 6c 65 20 73 70 65 63 69 66 69  al table specifi
2d7d0 65 64 0a 2a 2a 20 62 79 20 50 31 2e 20 20 54 68  ed.** by P1.  Th
2d7e0 65 20 69 6e 74 65 67 65 72 20 71 75 65 72 79 20  e integer query 
2d7f0 70 6c 61 6e 20 70 61 72 61 6d 65 74 65 72 20 74  plan parameter t
2d800 6f 20 78 46 69 6c 74 65 72 20 69 73 20 73 74 6f  o xFilter is sto
2d810 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 0a  red in register.
2d820 2a 2a 20 50 33 2e 20 52 65 67 69 73 74 65 72 20  ** P3. Register 
2d830 50 33 2b 31 20 73 74 6f 72 65 73 20 74 68 65 20  P3+1 stores the 
2d840 61 72 67 63 20 70 61 72 61 6d 65 74 65 72 20 74  argc parameter t
2d850 6f 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 74  o be passed to t
2d860 68 65 0a 2a 2a 20 78 46 69 6c 74 65 72 20 6d 65  he.** xFilter me
2d870 74 68 6f 64 2e 20 52 65 67 69 73 74 65 72 73 20  thod. Registers 
2d880 50 33 2b 32 2e 2e 50 33 2b 31 2b 61 72 67 63 20  P3+2..P3+1+argc 
2d890 61 72 65 20 74 68 65 20 61 72 67 63 0a 2a 2a 20  are the argc.** 
2d8a0 61 64 64 69 74 69 6f 6e 61 6c 20 70 61 72 61 6d  additional param
2d8b0 65 74 65 72 73 20 77 68 69 63 68 20 61 72 65 20  eters which are 
2d8c0 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 78 46 69  passed to.** xFi
2d8d0 6c 74 65 72 20 61 73 20 61 72 67 76 2e 20 52 65  lter as argv. Re
2d8e0 67 69 73 74 65 72 20 50 33 2b 32 20 62 65 63 6f  gister P3+2 beco
2d8f0 6d 65 73 20 61 72 67 76 5b 30 5d 20 77 68 65 6e  mes argv[0] when
2d900 20 70 61 73 73 65 64 20 74 6f 20 78 46 69 6c 74   passed to xFilt
2d910 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70  er..**.** A jump
2d920 20 69 73 20 6d 61 64 65 20 74 6f 20 50 32 20 69   is made to P2 i
2d930 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
2d940 20 61 66 74 65 72 20 66 69 6c 74 65 72 69 6e 67   after filtering
2d950 20 77 6f 75 6c 64 20 62 65 20 65 6d 70 74 79 2e   would be empty.
2d960 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 46 69 6c  .*/.case OP_VFil
2d970 74 65 72 3a 20 7b 20 20 20 2f 2a 20 6a 75 6d 70  ter: {   /* jump
2d980 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a   */.  int nArg;.
2d990 20 20 69 6e 74 20 69 51 75 65 72 79 3b 0a 20 20    int iQuery;.  
2d9a0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
2d9b0 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20  dule *pModule;. 
2d9c0 20 4d 65 6d 20 2a 70 51 75 65 72 79 3b 0a 20 20   Mem *pQuery;.  
2d9d0 4d 65 6d 20 2a 70 41 72 67 63 3b 0a 20 20 73 71  Mem *pArgc;.  sq
2d9e0 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
2d9f0 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  r *pVtabCursor;.
2da00 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
2da10 70 56 74 61 62 3b 0a 20 20 56 64 62 65 43 75 72  pVtab;.  VdbeCur
2da20 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
2da30 20 72 65 73 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   res;.  int i;. 
2da40 20 4d 65 6d 20 2a 2a 61 70 41 72 67 3b 0a 0a 20   Mem **apArg;.. 
2da50 20 70 51 75 65 72 79 20 3d 20 26 61 4d 65 6d 5b   pQuery = &aMem[
2da60 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 41 72 67  pOp->p3];.  pArg
2da70 63 20 3d 20 26 70 51 75 65 72 79 5b 31 5d 3b 0a  c = &pQuery[1];.
2da80 20 20 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73    pCur = p->apCs
2da90 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
2daa0 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
2dab0 28 70 51 75 65 72 79 29 20 29 3b 0a 20 20 52 45  (pQuery) );.  RE
2dac0 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
2dad0 2d 3e 70 33 2c 20 70 51 75 65 72 79 29 3b 0a 20  ->p3, pQuery);. 
2dae0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2daf0 56 74 61 62 43 75 72 73 6f 72 20 29 3b 0a 20 20  VtabCursor );.  
2db00 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43  pVtabCursor = pC
2db10 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b  ur->pVtabCursor;
2db20 0a 20 20 70 56 74 61 62 20 3d 20 70 56 74 61 62  .  pVtab = pVtab
2db30 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20  Cursor->pVtab;. 
2db40 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62   pModule = pVtab
2db50 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 2f 2a  ->pModule;..  /*
2db60 20 47 72 61 62 20 74 68 65 20 69 6e 64 65 78 20   Grab the index 
2db70 6e 75 6d 62 65 72 20 61 6e 64 20 61 72 67 63 20  number and argc 
2db80 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
2db90 61 73 73 65 72 74 28 20 28 70 51 75 65 72 79 2d  assert( (pQuery-
2dba0 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 29 21  >flags&MEM_Int)!
2dbb0 3d 30 20 26 26 20 70 41 72 67 63 2d 3e 66 6c 61  =0 && pArgc->fla
2dbc0 67 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  gs==MEM_Int );. 
2dbd0 20 6e 41 72 67 20 3d 20 28 69 6e 74 29 70 41 72   nArg = (int)pAr
2dbe0 67 63 2d 3e 75 2e 69 3b 0a 20 20 69 51 75 65 72  gc->u.i;.  iQuer
2dbf0 79 20 3d 20 28 69 6e 74 29 70 51 75 65 72 79 2d  y = (int)pQuery-
2dc00 3e 75 2e 69 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f  >u.i;..  /* Invo
2dc10 6b 65 20 74 68 65 20 78 46 69 6c 74 65 72 20 6d  ke the xFilter m
2dc20 65 74 68 6f 64 20 2a 2f 0a 20 20 7b 0a 20 20 20  ethod */.  {.   
2dc30 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 61 70   res = 0;.    ap
2dc40 41 72 67 20 3d 20 70 2d 3e 61 70 41 72 67 3b 0a  Arg = p->apArg;.
2dc50 20 20 20 20 66 6f 72 28 69 20 3d 20 30 3b 20 69      for(i = 0; i
2dc60 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
2dc70 20 20 20 61 70 41 72 67 5b 69 5d 20 3d 20 26 70     apArg[i] = &p
2dc80 41 72 67 63 5b 69 2b 31 5d 3b 0a 20 20 20 20 20  Argc[i+1];.     
2dc90 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
2dca0 74 6f 72 65 54 79 70 65 28 61 70 41 72 67 5b 69  toreType(apArg[i
2dcb0 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ]);.    }..    p
2dcc0 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
2dcd0 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 70 4d 6f   1;.    rc = pMo
2dce0 64 75 6c 65 2d 3e 78 46 69 6c 74 65 72 28 70 56  dule->xFilter(pV
2dcf0 74 61 62 43 75 72 73 6f 72 2c 20 69 51 75 65 72  tabCursor, iQuer
2dd00 79 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 6e 41  y, pOp->p4.z, nA
2dd10 72 67 2c 20 61 70 41 72 67 29 3b 0a 20 20 20 20  rg, apArg);.    
2dd20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
2dd30 3d 20 30 3b 0a 20 20 20 20 69 6d 70 6f 72 74 56  = 0;.    importV
2dd40 74 61 62 45 72 72 4d 73 67 28 70 2c 20 70 56 74  tabErrMsg(p, pVt
2dd50 61 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ab);.    if( rc=
2dd60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2dd70 20 20 20 20 72 65 73 20 3d 20 70 4d 6f 64 75 6c      res = pModul
2dd80 65 2d 3e 78 45 6f 66 28 70 56 74 61 62 43 75 72  e->xEof(pVtabCur
2dd90 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  sor);.    }..   
2dda0 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
2ddb0 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
2ddc0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
2ddd0 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20  pCur->nullRow = 
2dde0 30 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  0;..  break;.}.#
2ddf0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2de00 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2de10 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2de20 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2de30 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65  LTABLE./* Opcode
2de40 3a 20 56 43 6f 6c 75 6d 6e 20 50 31 20 50 32 20  : VColumn P1 P2 
2de50 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 74 6f  P3 * *.**.** Sto
2de60 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
2de70 74 68 65 20 50 32 2d 74 68 20 63 6f 6c 75 6d 6e  the P2-th column
2de80 20 6f 66 0a 2a 2a 20 74 68 65 20 72 6f 77 20 6f   of.** the row o
2de90 66 20 74 68 65 20 76 69 72 74 75 61 6c 2d 74 61  f the virtual-ta
2dea0 62 6c 65 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  ble that the .**
2deb0 20 50 31 20 63 75 72 73 6f 72 20 69 73 20 70 6f   P1 cursor is po
2dec0 69 6e 74 69 6e 67 20 74 6f 20 69 6e 74 6f 20 72  inting to into r
2ded0 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2f 0a 63  egister P3..*/.c
2dee0 61 73 65 20 4f 50 5f 56 43 6f 6c 75 6d 6e 3a 20  ase OP_VColumn: 
2def0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
2df00 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74   *pVtab;.  const
2df10 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
2df20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d 20  *pModule;.  Mem 
2df30 2a 70 44 65 73 74 3b 0a 20 20 73 71 6c 69 74 65  *pDest;.  sqlite
2df40 33 5f 63 6f 6e 74 65 78 74 20 73 43 6f 6e 74 65  3_context sConte
2df50 78 74 3b 0a 0a 20 20 56 64 62 65 43 75 72 73 6f  xt;..  VdbeCurso
2df60 72 20 2a 70 43 75 72 20 3d 20 70 2d 3e 61 70 43  r *pCur = p->apC
2df70 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
2df80 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 56 74  ssert( pCur->pVt
2df90 61 62 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73  abCursor );.  as
2dfa0 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20  sert( pOp->p3>0 
2dfb0 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e  && pOp->p3<=p->n
2dfc0 4d 65 6d 20 29 3b 0a 20 20 70 44 65 73 74 20 3d  Mem );.  pDest =
2dfd0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
2dfe0 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61  .  memAboutToCha
2dff0 6e 67 65 28 70 2c 20 70 44 65 73 74 29 3b 0a 20  nge(p, pDest);. 
2e000 20 69 66 28 20 70 43 75 72 2d 3e 6e 75 6c 6c 52   if( pCur->nullR
2e010 6f 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ow ){.    sqlite
2e020 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
2e030 70 44 65 73 74 29 3b 0a 20 20 20 20 62 72 65 61  pDest);.    brea
2e040 6b 3b 0a 20 20 7d 0a 20 20 70 56 74 61 62 20 3d  k;.  }.  pVtab =
2e050 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73   pCur->pVtabCurs
2e060 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f  or->pVtab;.  pMo
2e070 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d  dule = pVtab->pM
2e080 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  odule;.  assert(
2e090 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d   pModule->xColum
2e0a0 6e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n );.  memset(&s
2e0b0 43 6f 6e 74 65 78 74 2c 20 30 2c 20 73 69 7a 65  Context, 0, size
2e0c0 6f 66 28 73 43 6f 6e 74 65 78 74 29 29 3b 0a 0a  of(sContext));..
2e0d0 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20    /* The output 
2e0e0 63 65 6c 6c 20 6d 61 79 20 61 6c 72 65 61 64 79  cell may already
2e0f0 20 68 61 76 65 20 61 20 62 75 66 66 65 72 20 61   have a buffer a
2e100 6c 6c 6f 63 61 74 65 64 2e 20 4d 6f 76 65 0a 20  llocated. Move. 
2e110 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
2e120 63 6f 6e 74 65 6e 74 73 20 74 6f 20 73 43 6f 6e  contents to sCon
2e130 74 65 78 74 2e 73 20 73 6f 20 69 6e 20 63 61 73  text.s so in cas
2e140 65 20 74 68 65 20 75 73 65 72 2d 66 75 6e 63 74  e the user-funct
2e150 69 6f 6e 20 0a 20 20 2a 2a 20 63 61 6e 20 75 73  ion .  ** can us
2e160 65 20 74 68 65 20 61 6c 72 65 61 64 79 20 61 6c  e the already al
2e170 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 69  located buffer i
2e180 6e 73 74 65 61 64 20 6f 66 20 61 6c 6c 6f 63 61  nstead of alloca
2e190 74 69 6e 67 20 61 20 0a 20 20 2a 2a 20 6e 65 77  ting a .  ** new
2e1a0 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c   one..  */.  sql
2e1b0 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28  ite3VdbeMemMove(
2e1c0 26 73 43 6f 6e 74 65 78 74 2e 73 2c 20 70 44 65  &sContext.s, pDe
2e1d0 73 74 29 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70  st);.  MemSetTyp
2e1e0 65 46 6c 61 67 28 26 73 43 6f 6e 74 65 78 74 2e  eFlag(&sContext.
2e1f0 73 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 0a 20  s, MEM_Null);.. 
2e200 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78   rc = pModule->x
2e210 43 6f 6c 75 6d 6e 28 70 43 75 72 2d 3e 70 56 74  Column(pCur->pVt
2e220 61 62 43 75 72 73 6f 72 2c 20 26 73 43 6f 6e 74  abCursor, &sCont
2e230 65 78 74 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a 20  ext, pOp->p2);. 
2e240 20 69 6d 70 6f 72 74 56 74 61 62 45 72 72 4d 73   importVtabErrMs
2e250 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20 69  g(p, pVtab);.  i
2e260 66 28 20 73 43 6f 6e 74 65 78 74 2e 69 73 45 72  f( sContext.isEr
2e270 72 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ror ){.    rc = 
2e280 73 43 6f 6e 74 65 78 74 2e 69 73 45 72 72 6f 72  sContext.isError
2e290 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 70 79  ;.  }..  /* Copy
2e2a0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
2e2b0 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74  he function to t
2e2c0 68 65 20 50 33 20 72 65 67 69 73 74 65 72 2e 20  he P3 register. 
2e2d0 57 65 0a 20 20 2a 2a 20 64 6f 20 74 68 69 73 20  We.  ** do this 
2e2e0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
2e2f0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20  ether or not an 
2e300 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 74  error occurred t
2e310 6f 20 65 6e 73 75 72 65 20 61 6e 79 0a 20 20 2a  o ensure any.  *
2e320 2a 20 64 79 6e 61 6d 69 63 20 61 6c 6c 6f 63 61  * dynamic alloca
2e330 74 69 6f 6e 20 69 6e 20 73 43 6f 6e 74 65 78 74  tion in sContext
2e340 2e 73 20 28 61 20 4d 65 6d 20 73 74 72 75 63 74  .s (a Mem struct
2e350 29 20 69 73 20 20 72 65 6c 65 61 73 65 64 2e 0a  ) is  released..
2e360 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
2e370 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67  beChangeEncoding
2e380 28 26 73 43 6f 6e 74 65 78 74 2e 73 2c 20 65 6e  (&sContext.s, en
2e390 63 6f 64 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74  coding);.  sqlit
2e3a0 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 70 44  e3VdbeMemMove(pD
2e3b0 65 73 74 2c 20 26 73 43 6f 6e 74 65 78 74 2e 73  est, &sContext.s
2e3c0 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  );.  REGISTER_TR
2e3d0 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 44 65  ACE(pOp->p3, pDe
2e3e0 73 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  st);.  UPDATE_MA
2e3f0 58 5f 42 4c 4f 42 53 49 5a 45 28 70 44 65 73 74  X_BLOBSIZE(pDest
2e400 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  );..  if( sqlite
2e410 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70  3VdbeMemTooBig(p
2e420 44 65 73 74 29 20 29 7b 0a 20 20 20 20 67 6f 74  Dest) ){.    got
2e430 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20  o too_big;.  }. 
2e440 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
2e450 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2e460 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
2e470 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e480 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2e490 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 4e 65  E./* Opcode: VNe
2e4a0 78 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  xt P1 P2 * * *.*
2e4b0 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 76 69 72  *.** Advance vir
2e4c0 74 75 61 6c 20 74 61 62 6c 65 20 50 31 20 74 6f  tual table P1 to
2e4d0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
2e4e0 20 69 74 73 20 72 65 73 75 6c 74 20 73 65 74 20   its result set 
2e4f0 61 6e 64 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 69  and.** jump to i
2e500 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 20 20  nstruction P2.  
2e510 4f 72 2c 20 69 66 20 74 68 65 20 76 69 72 74 75  Or, if the virtu
2e520 61 6c 20 74 61 62 6c 65 20 68 61 73 20 72 65 61  al table has rea
2e530 63 68 65 64 0a 2a 2a 20 74 68 65 20 65 6e 64 20  ched.** the end 
2e540 6f 66 20 69 74 73 20 72 65 73 75 6c 74 20 73 65  of its result se
2e550 74 2c 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  t, then fall thr
2e560 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
2e570 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
2e580 0a 63 61 73 65 20 4f 50 5f 56 4e 65 78 74 3a 20  .case OP_VNext: 
2e590 7b 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20  {   /* jump */. 
2e5a0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
2e5b0 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71  Vtab;.  const sq
2e5c0 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
2e5d0 6f 64 75 6c 65 3b 0a 20 20 69 6e 74 20 72 65 73  odule;.  int res
2e5e0 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  ;.  VdbeCursor *
2e5f0 70 43 75 72 3b 0a 0a 20 20 72 65 73 20 3d 20 30  pCur;..  res = 0
2e600 3b 0a 20 20 70 43 75 72 20 3d 20 70 2d 3e 61 70  ;.  pCur = p->ap
2e610 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
2e620 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 56  assert( pCur->pV
2e630 74 61 62 43 75 72 73 6f 72 20 29 3b 0a 20 20 69  tabCursor );.  i
2e640 66 28 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77  f( pCur->nullRow
2e650 20 29 7b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20   ){.    break;. 
2e660 20 7d 0a 20 20 70 56 74 61 62 20 3d 20 70 43 75   }.  pVtab = pCu
2e670 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 2d 3e  r->pVtabCursor->
2e680 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64 75 6c 65  pVtab;.  pModule
2e690 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c   = pVtab->pModul
2e6a0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 6f  e;.  assert( pMo
2e6b0 64 75 6c 65 2d 3e 78 4e 65 78 74 20 29 3b 0a 0a  dule->xNext );..
2e6c0 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
2e6d0 78 4e 65 78 74 28 29 20 6d 65 74 68 6f 64 20 6f  xNext() method o
2e6e0 66 20 74 68 65 20 6d 6f 64 75 6c 65 2e 20 54 68  f the module. Th
2e6f0 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f  ere is no way fo
2e700 72 20 74 68 65 0a 20 20 2a 2a 20 75 6e 64 65 72  r the.  ** under
2e710 6c 79 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  lying implementa
2e720 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 61  tion to return a
2e730 6e 20 65 72 72 6f 72 20 69 66 20 6f 6e 65 20 6f  n error if one o
2e740 63 63 75 72 73 20 64 75 72 69 6e 67 0a 20 20 2a  ccurs during.  *
2e750 2a 20 78 4e 65 78 74 28 29 2e 20 49 6e 73 74 65  * xNext(). Inste
2e760 61 64 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ad, if an error 
2e770 6f 63 63 75 72 73 2c 20 74 72 75 65 20 69 73 20  occurs, true is 
2e780 72 65 74 75 72 6e 65 64 20 28 69 6e 64 69 63 61  returned (indica
2e790 74 69 6e 67 20 74 68 61 74 20 0a 20 20 2a 2a 20  ting that .  ** 
2e7a0 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
2e7b0 65 29 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  e) and the error
2e7c0 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 77   code returned w
2e7d0 68 65 6e 20 78 43 6f 6c 75 6d 6e 20 6f 72 0a 20  hen xColumn or. 
2e7e0 20 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 6d   ** some other m
2e7f0 65 74 68 6f 64 20 69 73 20 6e 65 78 74 20 69 6e  ethod is next in
2e800 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20 73 61 76  voked on the sav
2e810 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
2e820 63 75 72 73 6f 72 2e 0a 20 20 2a 2f 0a 20 20 70  cursor..  */.  p
2e830 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
2e840 20 31 3b 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75   1;.  rc = pModu
2e850 6c 65 2d 3e 78 4e 65 78 74 28 70 43 75 72 2d 3e  le->xNext(pCur->
2e860 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20  pVtabCursor);.  
2e870 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
2e880 3d 20 30 3b 0a 20 20 69 6d 70 6f 72 74 56 74 61  = 0;.  importVta
2e890 62 45 72 72 4d 73 67 28 70 2c 20 70 56 74 61 62  bErrMsg(p, pVtab
2e8a0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2e8b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2e8c0 73 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 45 6f  s = pModule->xEo
2e8d0 66 28 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72  f(pCur->pVtabCur
2e8e0 73 6f 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  sor);.  }..  if(
2e8f0 20 21 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20   !res ){.    /* 
2e900 49 66 20 74 68 65 72 65 20 69 73 20 64 61 74 61  If there is data
2e910 2c 20 6a 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a  , jump to P2 */.
2e920 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
2e930 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61   - 1;.  }.  brea
2e940 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  k;.}.#endif /* S
2e950 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2e960 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e  ALTABLE */..#ifn
2e970 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e980 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20  VIRTUALTABLE./* 
2e990 4f 70 63 6f 64 65 3a 20 56 52 65 6e 61 6d 65 20  Opcode: VRename 
2e9a0 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
2e9b0 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65  * P4 is a pointe
2e9c0 72 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74  r to a virtual t
2e9d0 61 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20  able object, an 
2e9e0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72  sqlite3_vtab str
2e9f0 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 69 73 20  ucture..** This 
2ea00 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74  opcode invokes t
2ea10 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2ea20 20 78 52 65 6e 61 6d 65 20 6d 65 74 68 6f 64 2e   xRename method.
2ea30 20 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e   The value.** in
2ea40 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20   register P1 is 
2ea50 70 61 73 73 65 64 20 61 73 20 74 68 65 20 7a 4e  passed as the zN
2ea60 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ame argument to 
2ea70 74 68 65 20 78 52 65 6e 61 6d 65 20 6d 65 74 68  the xRename meth
2ea80 6f 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56  od..*/.case OP_V
2ea90 52 65 6e 61 6d 65 3a 20 7b 0a 20 20 73 71 6c 69  Rename: {.  sqli
2eaa0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b  te3_vtab *pVtab;
2eab0 0a 20 20 4d 65 6d 20 2a 70 4e 61 6d 65 3b 0a 0a  .  Mem *pName;..
2eac0 20 20 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70    pVtab = pOp->p
2ead0 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a  4.pVtab->pVtab;.
2eae0 20 20 70 4e 61 6d 65 20 3d 20 26 61 4d 65 6d 5b    pName = &aMem[
2eaf0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
2eb00 72 74 28 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  rt( pVtab->pModu
2eb10 6c 65 2d 3e 78 52 65 6e 61 6d 65 20 29 3b 0a 20  le->xRename );. 
2eb20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
2eb30 6c 69 64 28 70 4e 61 6d 65 29 20 29 3b 0a 20 20  lid(pName) );.  
2eb40 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
2eb50 4f 70 2d 3e 70 31 2c 20 70 4e 61 6d 65 29 3b 0a  Op->p1, pName);.
2eb60 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
2eb70 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  >flags & MEM_Str
2eb80 20 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62   );.  rc = pVtab
2eb90 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 52 65 6e 61  ->pModule->xRena
2eba0 6d 65 28 70 56 74 61 62 2c 20 70 4e 61 6d 65 2d  me(pVtab, pName-
2ebb0 3e 7a 29 3b 0a 20 20 69 6d 70 6f 72 74 56 74 61  >z);.  importVta
2ebc0 62 45 72 72 4d 73 67 28 70 2c 20 70 56 74 61 62  bErrMsg(p, pVtab
2ebd0 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20  );.  p->expired 
2ebe0 3d 20 30 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d  = 0;..  break;.}
2ebf0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
2ec00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2ec10 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63  TUALTABLE./* Opc
2ec20 6f 64 65 3a 20 56 55 70 64 61 74 65 20 50 31 20  ode: VUpdate P1 
2ec30 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  P2 P3 P4 *.**.**
2ec40 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72   P4 is a pointer
2ec50 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61   to a virtual ta
2ec60 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73  ble object, an s
2ec70 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75  qlite3_vtab stru
2ec80 63 74 75 72 65 2e 0a 2a 2a 20 54 68 69 73 20 6f  cture..** This o
2ec90 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68  pcode invokes th
2eca0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
2ecb0 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64 2e 20  xUpdate method. 
2ecc0 50 32 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65  P2 values.** are
2ecd0 20 63 6f 6e 74 69 67 75 6f 75 73 20 6d 65 6d 6f   contiguous memo
2ece0 72 79 20 63 65 6c 6c 73 20 73 74 61 72 74 69 6e  ry cells startin
2ecf0 67 20 61 74 20 50 33 20 74 6f 20 70 61 73 73 20  g at P3 to pass 
2ed00 74 6f 20 74 68 65 20 78 55 70 64 61 74 65 20 0a  to the xUpdate .
2ed10 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 54  ** invocation. T
2ed20 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
2ed30 73 74 65 72 20 28 50 33 2b 50 32 2d 31 29 20 63  ster (P3+P2-1) c
2ed40 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
2ed50 65 20 0a 2a 2a 20 70 32 74 68 20 65 6c 65 6d 65  e .** p2th eleme
2ed60 6e 74 20 6f 66 20 74 68 65 20 61 72 67 76 20 61  nt of the argv a
2ed70 72 72 61 79 20 70 61 73 73 65 64 20 74 6f 20 78  rray passed to x
2ed80 55 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  Update..**.** Th
2ed90 65 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64  e xUpdate method
2eda0 20 77 69 6c 6c 20 64 6f 20 61 20 44 45 4c 45 54   will do a DELET
2edb0 45 20 6f 72 20 61 6e 20 49 4e 53 45 52 54 20 6f  E or an INSERT o
2edc0 72 20 62 6f 74 68 2e 0a 2a 2a 20 54 68 65 20 61  r both..** The a
2edd0 72 67 76 5b 30 5d 20 65 6c 65 6d 65 6e 74 20 28  rgv[0] element (
2ede0 77 68 69 63 68 20 63 6f 72 72 65 73 70 6f 6e 64  which correspond
2edf0 73 20 74 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  s to memory cell
2ee00 20 50 33 29 0a 2a 2a 20 69 73 20 74 68 65 20 72   P3).** is the r
2ee10 6f 77 69 64 20 6f 66 20 61 20 72 6f 77 20 74 6f  owid of a row to
2ee20 20 64 65 6c 65 74 65 2e 20 20 49 66 20 61 72 67   delete.  If arg
2ee30 76 5b 30 5d 20 69 73 20 4e 55 4c 4c 20 74 68 65  v[0] is NULL the
2ee40 6e 20 6e 6f 20 0a 2a 2a 20 64 65 6c 65 74 69 6f  n no .** deletio
2ee50 6e 20 6f 63 63 75 72 73 2e 20 20 54 68 65 20 61  n occurs.  The a
2ee60 72 67 76 5b 31 5d 20 65 6c 65 6d 65 6e 74 20 69  rgv[1] element i
2ee70 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  s the rowid of t
2ee80 68 65 20 6e 65 77 20 0a 2a 2a 20 72 6f 77 2e 20  he new .** row. 
2ee90 20 54 68 69 73 20 63 61 6e 20 62 65 20 4e 55 4c   This can be NUL
2eea0 4c 20 74 6f 20 68 61 76 65 20 74 68 65 20 76 69  L to have the vi
2eeb0 72 74 75 61 6c 20 74 61 62 6c 65 20 73 65 6c 65  rtual table sele
2eec0 63 74 20 74 68 65 20 6e 65 77 20 0a 2a 2a 20 72  ct the new .** r
2eed0 6f 77 69 64 20 66 6f 72 20 69 74 73 65 6c 66 2e  owid for itself.
2eee0 20 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74    The subsequent
2eef0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
2ef00 20 61 72 72 61 79 20 61 72 65 20 0a 2a 2a 20 74   array are .** t
2ef10 68 65 20 76 61 6c 75 65 73 20 6f 66 20 63 6f 6c  he values of col
2ef20 75 6d 6e 73 20 69 6e 20 74 68 65 20 6e 65 77 20  umns in the new 
2ef30 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32  row..**.** If P2
2ef40 3d 3d 31 20 74 68 65 6e 20 6e 6f 20 69 6e 73 65  ==1 then no inse
2ef50 72 74 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  rt is performed.
2ef60 20 20 61 72 67 76 5b 30 5d 20 69 73 20 74 68 65    argv[0] is the
2ef70 20 72 6f 77 69 64 20 6f 66 0a 2a 2a 20 61 20 72   rowid of.** a r
2ef80 6f 77 20 74 6f 20 64 65 6c 65 74 65 2e 0a 2a 2a  ow to delete..**
2ef90 0a 2a 2a 20 50 31 20 69 73 20 61 20 62 6f 6f 6c  .** P1 is a bool
2efa0 65 61 6e 20 66 6c 61 67 2e 20 49 66 20 69 74 20  ean flag. If it 
2efb0 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61  is set to true a
2efc0 6e 64 20 74 68 65 20 78 55 70 64 61 74 65 20 63  nd the xUpdate c
2efd0 61 6c 6c 0a 2a 2a 20 69 73 20 73 75 63 63 65 73  all.** is succes
2efe0 73 66 75 6c 2c 20 74 68 65 6e 20 74 68 65 20 76  sful, then the v
2eff0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
2f000 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
2f010 73 65 72 74 5f 72 6f 77 69 64 28 29 20 0a 2a 2a  sert_rowid() .**
2f020 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
2f030 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f 77 69  alue of the rowi
2f040 64 20 66 6f 72 20 74 68 65 20 72 6f 77 20 6a 75  d for the row ju
2f050 73 74 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  st inserted..*/.
2f060 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a  case OP_VUpdate:
2f070 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61   {.  sqlite3_vta
2f080 62 20 2a 70 56 74 61 62 3b 0a 20 20 73 71 6c 69  b *pVtab;.  sqli
2f090 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
2f0a0 75 6c 65 3b 0a 20 20 69 6e 74 20 6e 41 72 67 3b  ule;.  int nArg;
2f0b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
2f0c0 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64 3b 0a  te_int64 rowid;.
2f0d0 20 20 4d 65 6d 20 2a 2a 61 70 41 72 67 3b 0a 20    Mem **apArg;. 
2f0e0 20 4d 65 6d 20 2a 70 58 3b 0a 0a 20 20 61 73 73   Mem *pX;..  ass
2f0f0 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d 31 20  ert( pOp->p2==1 
2f100 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70         || pOp->p
2f110 35 3d 3d 4f 45 5f 46 61 69 6c 20 20 20 7c 7c 20  5==OE_Fail   || 
2f120 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 52 6f 6c 6c  pOp->p5==OE_Roll
2f130 62 61 63 6b 20 0a 20 20 20 20 20 20 20 7c 7c 20  back .       || 
2f140 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 41 62 6f 72  pOp->p5==OE_Abor
2f150 74 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45  t || pOp->p5==OE
2f160 5f 49 67 6e 6f 72 65 20 7c 7c 20 70 4f 70 2d 3e  _Ignore || pOp->
2f170 70 35 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 0a 20  p5==OE_Replace. 
2f180 20 29 3b 0a 20 20 70 56 74 61 62 20 3d 20 70 4f   );.  pVtab = pO
2f190 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74  p->p4.pVtab->pVt
2f1a0 61 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20  ab;.  pModule = 
2f1b0 28 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20  (sqlite3_module 
2f1c0 2a 29 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  *)pVtab->pModule
2f1d0 3b 0a 20 20 6e 41 72 67 20 3d 20 70 4f 70 2d 3e  ;.  nArg = pOp->
2f1e0 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  p2;.  assert( pO
2f1f0 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 56 54  p->p4type==P4_VT
2f200 41 42 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  AB );.  if( ALWA
2f210 59 53 28 70 4d 6f 64 75 6c 65 2d 3e 78 55 70 64  YS(pModule->xUpd
2f220 61 74 65 29 20 29 7b 0a 20 20 20 20 75 38 20 76  ate) ){.    u8 v
2f230 74 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 20 3d 20  tabOnConflict = 
2f240 64 62 2d 3e 76 74 61 62 4f 6e 43 6f 6e 66 6c 69  db->vtabOnConfli
2f250 63 74 3b 0a 20 20 20 20 61 70 41 72 67 20 3d 20  ct;.    apArg = 
2f260 70 2d 3e 61 70 41 72 67 3b 0a 20 20 20 20 70 58  p->apArg;.    pX
2f270 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
2f280 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ];.    for(i=0; 
2f290 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
2f2a0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
2f2b0 73 56 61 6c 69 64 28 70 58 29 20 29 3b 0a 20 20  sValid(pX) );.  
2f2c0 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68      memAboutToCh
2f2d0 61 6e 67 65 28 70 2c 20 70 58 29 3b 0a 20 20 20  ange(p, pX);.   
2f2e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
2f2f0 6d 53 74 6f 72 65 54 79 70 65 28 70 58 29 3b 0a  mStoreType(pX);.
2f300 20 20 20 20 20 20 61 70 41 72 67 5b 69 5d 20 3d        apArg[i] =
2f310 20 70 58 3b 0a 20 20 20 20 20 20 70 58 2b 2b 3b   pX;.      pX++;
2f320 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 76  .    }.    db->v
2f330 74 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 20 3d 20  tabOnConflict = 
2f340 70 4f 70 2d 3e 70 35 3b 0a 20 20 20 20 72 63 20  pOp->p5;.    rc 
2f350 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 55 70 64 61  = pModule->xUpda
2f360 74 65 28 70 56 74 61 62 2c 20 6e 41 72 67 2c 20  te(pVtab, nArg, 
2f370 61 70 41 72 67 2c 20 26 72 6f 77 69 64 29 3b 0a  apArg, &rowid);.
2f380 20 20 20 20 64 62 2d 3e 76 74 61 62 4f 6e 43 6f      db->vtabOnCo
2f390 6e 66 6c 69 63 74 20 3d 20 76 74 61 62 4f 6e 43  nflict = vtabOnC
2f3a0 6f 6e 66 6c 69 63 74 3b 0a 20 20 20 20 69 6d 70  onflict;.    imp
2f3b0 6f 72 74 56 74 61 62 45 72 72 4d 73 67 28 70 2c  ortVtabErrMsg(p,
2f3c0 20 70 56 74 61 62 29 3b 0a 20 20 20 20 69 66 28   pVtab);.    if(
2f3d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2f3e0 26 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20  & pOp->p1 ){.   
2f3f0 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3e     assert( nArg>
2f400 31 20 26 26 20 61 70 41 72 67 5b 30 5d 20 26 26  1 && apArg[0] &&
2f410 20 28 61 70 41 72 67 5b 30 5d 2d 3e 66 6c 61 67   (apArg[0]->flag
2f420 73 26 4d 45 4d 5f 4e 75 6c 6c 29 20 29 3b 0a 20  s&MEM_Null) );. 
2f430 20 20 20 20 20 64 62 2d 3e 6c 61 73 74 52 6f 77       db->lastRow
2f440 69 64 20 3d 20 6c 61 73 74 52 6f 77 69 64 20 3d  id = lastRowid =
2f450 20 72 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 20 20   rowid;.    }.  
2f460 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f470 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70  _CONSTRAINT && p
2f480 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 62 43  Op->p4.pVtab->bC
2f490 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20  onstraint ){.   
2f4a0 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3d 3d     if( pOp->p5==
2f4b0 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  OE_Ignore ){.   
2f4c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2f4d0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
2f4e0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 72 72  {.        p->err
2f4f0 6f 72 41 63 74 69 6f 6e 20 3d 20 28 28 70 4f 70  orAction = ((pOp
2f500 2d 3e 70 35 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  ->p5==OE_Replace
2f510 29 20 3f 20 4f 45 5f 41 62 6f 72 74 20 3a 20 70  ) ? OE_Abort : p
2f520 4f 70 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 7d  Op->p5);.      }
2f530 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f540 20 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a    p->nChange++;.
2f550 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
2f560 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  k;.}.#endif /* S
2f570 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2f580 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e  ALTABLE */..#ifn
2f590 64 65 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54  def  SQLITE_OMIT
2f5a0 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
2f5b0 2a 20 4f 70 63 6f 64 65 3a 20 50 61 67 65 63 6f  * Opcode: Pageco
2f5c0 75 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  unt P1 P2 * * *.
2f5d0 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
2f5e0 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  current number o
2f5f0 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
2f600 61 73 65 20 50 31 20 74 6f 20 6d 65 6d 6f 72 79  ase P1 to memory
2f610 20 63 65 6c 6c 20 50 32 2e 0a 2a 2f 0a 63 61 73   cell P2..*/.cas
2f620 65 20 4f 50 5f 50 61 67 65 63 6f 75 6e 74 3a 20  e OP_Pagecount: 
2f630 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  {            /* 
2f640 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20  out2-prerelease 
2f650 2a 2f 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  */.  pOut->u.i =
2f660 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
2f670 74 50 61 67 65 28 64 62 2d 3e 61 44 62 5b 70 4f  tPage(db->aDb[pO
2f680 70 2d 3e 70 31 5d 2e 70 42 74 29 3b 0a 20 20 62  p->p1].pBt);.  b
2f690 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  reak;.}.#endif..
2f6a0 0a 23 69 66 6e 64 65 66 20 20 53 51 4c 49 54 45  .#ifndef  SQLITE
2f6b0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
2f6c0 4d 41 53 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d  MAS./* Opcode: M
2f6d0 61 78 50 67 63 6e 74 20 50 31 20 50 32 20 50 33  axPgcnt P1 P2 P3
2f6e0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74   * *.**.** Try t
2f6f0 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
2f700 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72  m page count for
2f710 20 64 61 74 61 62 61 73 65 20 50 31 20 74 6f 20   database P1 to 
2f720 74 68 65 20 76 61 6c 75 65 20 69 6e 20 50 33 2e  the value in P3.
2f730 0a 2a 2a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74  .** Do not let t
2f740 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
2f750 63 6f 75 6e 74 20 66 61 6c 6c 20 62 65 6c 6f 77  count fall below
2f760 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2f770 65 20 63 6f 75 6e 74 20 61 6e 64 0a 2a 2a 20 64  e count and.** d
2f780 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  o not change the
2f790 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
2f7a0 75 6e 74 20 76 61 6c 75 65 20 69 66 20 50 33 3d  unt value if P3=
2f7b0 3d 30 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20  =0..**.** Store 
2f7c0 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
2f7d0 20 63 6f 75 6e 74 20 61 66 74 65 72 20 74 68 65   count after the
2f7e0 20 63 68 61 6e 67 65 20 69 6e 20 72 65 67 69 73   change in regis
2f7f0 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20  ter P2..*/.case 
2f800 4f 50 5f 4d 61 78 50 67 63 6e 74 3a 20 7b 20 20  OP_MaxPgcnt: {  
2f810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
2f820 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a  2-prerelease */.
2f830 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e    unsigned int n
2f840 65 77 4d 61 78 3b 0a 20 20 42 74 72 65 65 20 2a  ewMax;.  Btree *
2f850 70 42 74 3b 0a 0a 20 20 70 42 74 20 3d 20 64 62  pBt;..  pBt = db
2f860 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70  ->aDb[pOp->p1].p
2f870 42 74 3b 0a 20 20 6e 65 77 4d 61 78 20 3d 20 30  Bt;.  newMax = 0
2f880 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 20  ;.  if( pOp->p3 
2f890 29 7b 0a 20 20 20 20 6e 65 77 4d 61 78 20 3d 20  ){.    newMax = 
2f8a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
2f8b0 50 61 67 65 28 70 42 74 29 3b 0a 20 20 20 20 69  Page(pBt);.    i
2f8c0 66 28 20 6e 65 77 4d 61 78 20 3c 20 28 75 6e 73  f( newMax < (uns
2f8d0 69 67 6e 65 64 29 70 4f 70 2d 3e 70 33 20 29 20  igned)pOp->p3 ) 
2f8e0 6e 65 77 4d 61 78 20 3d 20 28 75 6e 73 69 67 6e  newMax = (unsign
2f8f0 65 64 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 0a  ed)pOp->p3;.  }.
2f900 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 73 71    pOut->u.i = sq
2f910 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
2f920 65 43 6f 75 6e 74 28 70 42 74 2c 20 6e 65 77 4d  eCount(pBt, newM
2f930 61 78 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ax);.  break;.}.
2f940 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66  #endif...#ifndef
2f950 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
2f960 43 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 72  CE./* Opcode: Tr
2f970 61 63 65 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a  ace * * * P4 *.*
2f980 2a 0a 2a 2a 20 49 66 20 74 72 61 63 69 6e 67 20  *.** If tracing 
2f990 69 73 20 65 6e 61 62 6c 65 64 20 28 62 79 20 74  is enabled (by t
2f9a0 68 65 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65  he sqlite3_trace
2f9b0 28 29 29 20 69 6e 74 65 72 66 61 63 65 2c 20 74  ()) interface, t
2f9c0 68 65 6e 0a 2a 2a 20 74 68 65 20 55 54 46 2d 38  hen.** the UTF-8
2f9d0 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 65   string containe
2f9e0 64 20 69 6e 20 50 34 20 69 73 20 65 6d 69 74 74  d in P4 is emitt
2f9f0 65 64 20 6f 6e 20 74 68 65 20 74 72 61 63 65 20  ed on the trace 
2fa00 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 63 61 73  callback..*/.cas
2fa10 65 20 4f 50 5f 54 72 61 63 65 3a 20 7b 0a 20 20  e OP_Trace: {.  
2fa20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20  char *zTrace;.  
2fa30 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20  char *z;..  if( 
2fa40 64 62 2d 3e 78 54 72 61 63 65 20 26 26 20 28 7a  db->xTrace && (z
2fa50 54 72 61 63 65 20 3d 20 28 70 4f 70 2d 3e 70 34  Trace = (pOp->p4
2fa60 2e 7a 20 3f 20 70 4f 70 2d 3e 70 34 2e 7a 20 3a  .z ? pOp->p4.z :
2fa70 20 70 2d 3e 7a 53 71 6c 29 29 21 3d 30 20 29 7b   p->zSql))!=0 ){
2fa80 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
2fa90 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 70 2c  VdbeExpandSql(p,
2faa0 20 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 64 62   zTrace);.    db
2fab0 2d 3e 78 54 72 61 63 65 28 64 62 2d 3e 70 54 72  ->xTrace(db->pTr
2fac0 61 63 65 41 72 67 2c 20 7a 29 3b 0a 20 20 20 20  aceArg, z);.    
2fad0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2fae0 2c 20 7a 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  , z);.  }.#ifdef
2faf0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2fb00 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
2fb10 20 53 51 4c 49 54 45 5f 53 71 6c 54 72 61 63 65   SQLITE_SqlTrace
2fb20 29 21 3d 30 0a 20 20 20 26 26 20 28 7a 54 72 61  )!=0.   && (zTra
2fb30 63 65 20 3d 20 28 70 4f 70 2d 3e 70 34 2e 7a 20  ce = (pOp->p4.z 
2fb40 3f 20 70 4f 70 2d 3e 70 34 2e 7a 20 3a 20 70 2d  ? pOp->p4.z : p-
2fb50 3e 7a 53 71 6c 29 29 21 3d 30 0a 20 20 29 7b 0a  >zSql))!=0.  ){.
2fb60 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2fb70 50 72 69 6e 74 66 28 22 53 51 4c 2d 74 72 61 63  Printf("SQL-trac
2fb80 65 3a 20 25 73 5c 6e 22 2c 20 7a 54 72 61 63 65  e: %s\n", zTrace
2fb90 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
2fba0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
2fbb0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
2fbc0 69 66 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  if.../* Opcode: 
2fbd0 4e 6f 6f 70 20 2a 20 2a 20 2a 20 2a 20 2a 0a 2a  Noop * * * * *.*
2fbe0 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 2e  *.** Do nothing.
2fbf0 20 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69    This instructi
2fc00 6f 6e 20 69 73 20 6f 66 74 65 6e 20 75 73 65 66  on is often usef
2fc10 75 6c 20 61 73 20 61 20 6a 75 6d 70 0a 2a 2a 20  ul as a jump.** 
2fc20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a  destination..*/.
2fc30 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 67 69 63 20  /*.** The magic 
2fc40 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 61  Explain opcode a
2fc50 72 65 20 6f 6e 6c 79 20 69 6e 73 65 72 74 65 64  re only inserted
2fc60 20 77 68 65 6e 20 65 78 70 6c 61 69 6e 3d 3d 32   when explain==2
2fc70 20 28 77 68 69 63 68 0a 2a 2a 20 69 73 20 74 6f   (which.** is to
2fc80 20 73 61 79 20 77 68 65 6e 20 74 68 65 20 45 58   say when the EX
2fc90 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
2fca0 20 73 79 6e 74 61 78 20 69 73 20 75 73 65 64 2e   syntax is used.
2fcb0 29 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  ).** This opcode
2fcc0 20 72 65 63 6f 72 64 73 20 69 6e 66 6f 72 6d 61   records informa
2fcd0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 6f 70  tion from the op
2fce0 74 69 6d 69 7a 65 72 2e 20 20 49 74 20 69 73 20  timizer.  It is 
2fcf0 74 68 65 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20  the.** the same 
2fd00 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 69  as a no-op.  Thi
2fd10 73 20 6f 70 63 6f 64 65 73 6e 65 76 65 72 20 61  s opcodesnever a
2fd20 70 70 65 61 72 73 20 69 6e 20 61 20 72 65 61 6c  ppears in a real
2fd30 20 56 4d 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a   VM program..*/.
2fd40 64 65 66 61 75 6c 74 3a 20 7b 20 20 20 20 20 20  default: {      
2fd50 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 72      /* This is r
2fd60 65 61 6c 6c 79 20 4f 50 5f 4e 6f 6f 70 20 61 6e  eally OP_Noop an
2fd70 64 20 4f 50 5f 45 78 70 6c 61 69 6e 20 2a 2f 0a  d OP_Explain */.
2fd80 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
2fd90 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 7c  pcode==OP_Noop |
2fda0 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
2fdb0 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 62  P_Explain );.  b
2fdc0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  reak;.}../******
2fdd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fde0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fdf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fe00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fe10 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63  *******.** The c
2fe20 61 73 65 73 20 6f 66 20 74 68 65 20 73 77 69 74  ases of the swit
2fe30 63 68 20 73 74 61 74 65 6d 65 6e 74 20 61 62 6f  ch statement abo
2fe40 76 65 20 74 68 69 73 20 6c 69 6e 65 20 73 68 6f  ve this line sho
2fe50 75 6c 64 20 61 6c 6c 20 62 65 20 69 6e 64 65 6e  uld all be inden
2fe60 74 65 64 0a 2a 2a 20 62 79 20 36 20 73 70 61 63  ted.** by 6 spac
2fe70 65 73 2e 20 20 42 75 74 20 74 68 65 20 6c 65 66  es.  But the lef
2fe80 74 2d 6d 6f 73 74 20 36 20 73 70 61 63 65 73 20  t-most 6 spaces 
2fe90 68 61 76 65 20 62 65 65 6e 20 72 65 6d 6f 76 65  have been remove
2fea0 64 20 74 6f 20 69 6d 70 72 6f 76 65 20 74 68 65  d to improve the
2feb0 0a 2a 2a 20 72 65 61 64 61 62 69 6c 69 74 79 2e  .** readability.
2fec0 20 20 46 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e    From this poin
2fed0 74 20 6f 6e 20 64 6f 77 6e 2c 20 74 68 65 20 6e  t on down, the n
2fee0 6f 72 6d 61 6c 20 69 6e 64 65 6e 74 61 74 69 6f  ormal indentatio
2fef0 6e 20 72 75 6c 65 73 20 61 72 65 0a 2a 2a 20 72  n rules are.** r
2ff00 65 73 74 6f 72 65 64 2e 0a 2a 2a 2a 2a 2a 2a 2a  estored..*******
2ff10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ff20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ff30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ff40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ff50 2a 2a 2a 2a 2a 2a 2f 0a 20 20 20 20 7d 0a 0a 23  ******/.    }..#
2ff60 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
2ff70 4c 45 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 75  LE.    {.      u
2ff80 36 34 20 65 6c 61 70 73 65 64 20 3d 20 73 71 6c  64 elapsed = sql
2ff90 69 74 65 33 48 77 74 69 6d 65 28 29 20 2d 20 73  ite3Hwtime() - s
2ffa0 74 61 72 74 3b 0a 20 20 20 20 20 20 70 4f 70 2d  tart;.      pOp-
2ffb0 3e 63 79 63 6c 65 73 20 2b 3d 20 65 6c 61 70 73  >cycles += elaps
2ffc0 65 64 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 63  ed;.      pOp->c
2ffd0 6e 74 2b 2b 3b 0a 23 69 66 20 30 0a 20 20 20 20  nt++;.#if 0.    
2ffe0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f      fprintf(stdo
2fff0 75 74 2c 20 22 25 31 30 6c 6c 75 20 22 2c 20 65  ut, "%10llu ", e
30000 6c 61 70 73 65 64 29 3b 0a 20 20 20 20 20 20 20  lapsed);.       
30010 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
30020 74 4f 70 28 73 74 64 6f 75 74 2c 20 6f 72 69 67  tOp(stdout, orig
30030 50 63 2c 20 26 61 4f 70 5b 6f 72 69 67 50 63 5d  Pc, &aOp[origPc]
30040 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
30050 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54  #endif..    /* T
30060 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
30070 65 20 61 64 64 73 20 6e 6f 74 68 69 6e 67 20 74  e adds nothing t
30080 6f 20 74 68 65 20 61 63 74 75 61 6c 20 66 75 6e  o the actual fun
30090 63 74 69 6f 6e 61 6c 69 74 79 0a 20 20 20 20 2a  ctionality.    *
300a0 2a 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  * of the program
300b0 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 68 65  .  It is only he
300c0 72 65 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  re for testing a
300d0 6e 64 20 64 65 62 75 67 67 69 6e 67 2e 0a 20 20  nd debugging..  
300e0 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
300f0 72 20 68 61 6e 64 2c 20 69 74 20 64 6f 65 73 20  r hand, it does 
30100 62 75 72 6e 20 43 50 55 20 63 79 63 6c 65 73 20  burn CPU cycles 
30110 65 76 65 72 79 20 74 69 6d 65 20 74 68 72 6f 75  every time throu
30120 67 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 76  gh.    ** the ev
30130 61 6c 75 61 74 6f 72 20 6c 6f 6f 70 2e 20 20 53  aluator loop.  S
30140 6f 20 77 65 20 63 61 6e 20 6c 65 61 76 65 20 69  o we can leave i
30150 74 20 6f 75 74 20 77 68 65 6e 20 4e 44 45 42 55  t out when NDEBU
30160 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20  G is defined..  
30170 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45    */.#ifndef NDE
30180 42 55 47 0a 20 20 20 20 61 73 73 65 72 74 28 20  BUG.    assert( 
30190 70 63 3e 3d 2d 31 20 26 26 20 70 63 3c 70 2d 3e  pc>=-1 && pc<p->
301a0 6e 4f 70 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  nOp );..#ifdef S
301b0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
301c0 69 66 28 20 70 2d 3e 74 72 61 63 65 20 29 7b 0a  if( p->trace ){.
301d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
301e0 29 20 66 70 72 69 6e 74 66 28 70 2d 3e 74 72 61  ) fprintf(p->tra
301f0 63 65 2c 22 72 63 3d 25 64 5c 6e 22 2c 72 63 29  ce,"rc=%d\n",rc)
30200 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  ;.      if( pOp-
30210 3e 6f 70 66 6c 61 67 73 20 26 20 28 4f 50 46 4c  >opflags & (OPFL
30220 47 5f 4f 55 54 32 5f 50 52 45 52 45 4c 45 41 53  G_OUT2_PRERELEAS
30230 45 7c 4f 50 46 4c 47 5f 4f 55 54 32 29 20 29 7b  E|OPFLG_OUT2) ){
30240 0a 20 20 20 20 20 20 20 20 72 65 67 69 73 74 65  .        registe
30250 72 54 72 61 63 65 28 70 2d 3e 74 72 61 63 65 2c  rTrace(p->trace,
30260 20 70 4f 70 2d 3e 70 32 2c 20 26 61 4d 65 6d 5b   pOp->p2, &aMem[
30270 70 4f 70 2d 3e 70 32 5d 29 3b 0a 20 20 20 20 20  pOp->p2]);.     
30280 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70   }.      if( pOp
30290 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c  ->opflags & OPFL
302a0 47 5f 4f 55 54 33 20 29 7b 0a 20 20 20 20 20 20  G_OUT3 ){.      
302b0 20 20 72 65 67 69 73 74 65 72 54 72 61 63 65 28    registerTrace(
302c0 70 2d 3e 74 72 61 63 65 2c 20 70 4f 70 2d 3e 70  p->trace, pOp->p
302d0 33 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33  3, &aMem[pOp->p3
302e0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
302f0 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  }.#endif  /* SQL
30300 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 23 65 6e  ITE_DEBUG */.#en
30310 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a  dif  /* NDEBUG *
30320 2f 0a 20 20 7d 20 20 2f 2a 20 54 68 65 20 65 6e  /.  }  /* The en
30330 64 20 6f 66 20 74 68 65 20 66 6f 72 28 3b 3b 29  d of the for(;;)
30340 20 6c 6f 6f 70 20 74 68 65 20 6c 6f 6f 70 73 20   loop the loops 
30350 74 68 72 6f 75 67 68 20 6f 70 63 6f 64 65 73 20  through opcodes 
30360 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72  */..  /* If we r
30370 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
30380 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65   it means that e
30390 78 65 63 75 74 69 6f 6e 20 69 73 20 66 69 6e 69  xecution is fini
303a0 73 68 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 61  shed with.  ** a
303b0 6e 20 65 72 72 6f 72 20 6f 66 20 73 6f 6d 65 20  n error of some 
303c0 6b 69 6e 64 2e 0a 20 20 2a 2f 0a 76 64 62 65 5f  kind..  */.vdbe_
303d0 65 72 72 6f 72 5f 68 61 6c 74 3a 0a 20 20 61 73  error_halt:.  as
303e0 73 65 72 74 28 20 72 63 20 29 3b 0a 20 20 70 2d  sert( rc );.  p-
303f0 3e 72 63 20 3d 20 72 63 3b 0a 20 20 74 65 73 74  >rc = rc;.  test
30400 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
30410 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
30420 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  0 );.  sqlite3_l
30430 6f 67 28 72 63 2c 20 22 73 74 61 74 65 6d 65 6e  og(rc, "statemen
30440 74 20 61 62 6f 72 74 73 20 61 74 20 25 64 3a 20  t aborts at %d: 
30450 5b 25 73 5d 20 25 73 22 2c 20 0a 20 20 20 20 20  [%s] %s", .     
30460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 63                pc
30470 2c 20 70 2d 3e 7a 53 71 6c 2c 20 70 2d 3e 7a 45  , p->zSql, p->zE
30480 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
30490 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20  3VdbeHalt(p);.  
304a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
304b0 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d  OERR_NOMEM ) db-
304c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
304d0 31 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  1;.  rc = SQLITE
304e0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 65  _ERROR;.  if( re
304f0 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74  setSchemaOnFault
30500 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
30510 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
30520 68 65 6d 61 28 64 62 2c 20 72 65 73 65 74 53 63  hema(db, resetSc
30530 68 65 6d 61 4f 6e 46 61 75 6c 74 2d 31 29 3b 0a  hemaOnFault-1);.
30540 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69    }..  /* This i
30550 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 6f  s the only way o
30560 75 74 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  ut of this proce
30570 64 75 72 65 2e 20 20 57 65 20 68 61 76 65 20 74  dure.  We have t
30580 6f 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 74  o.  ** release t
30590 68 65 20 6d 75 74 65 78 65 73 20 6f 6e 20 62 74  he mutexes on bt
305a0 72 65 65 73 20 74 68 61 74 20 77 65 72 65 20 61  rees that were a
305b0 63 71 75 69 72 65 64 20 61 74 20 74 68 65 0a 20  cquired at the. 
305c0 20 2a 2a 20 74 6f 70 2e 20 2a 2f 0a 76 64 62 65   ** top. */.vdbe
305d0 5f 72 65 74 75 72 6e 3a 0a 20 20 64 62 2d 3e 6c  _return:.  db->l
305e0 61 73 74 52 6f 77 69 64 20 3d 20 6c 61 73 74 52  astRowid = lastR
305f0 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 56  owid;.  sqlite3V
30600 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  dbeLeave(p);.  r
30610 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
30620 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20  Jump to here if 
30630 61 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  a string or blob
30640 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c   larger than SQL
30650 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 20  ITE_MAX_LENGTH. 
30660 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
30670 65 64 2e 0a 20 20 2a 2f 0a 74 6f 6f 5f 62 69 67  ed..  */.too_big
30680 3a 0a 20 20 73 71 6c 69 74 65 33 53 65 74 53 74  :.  sqlite3SetSt
30690 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
306a0 2c 20 64 62 2c 20 22 73 74 72 69 6e 67 20 6f 72  , db, "string or
306b0 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 29 3b   blob too big");
306c0 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 54  .  rc = SQLITE_T
306d0 4f 4f 42 49 47 3b 0a 20 20 67 6f 74 6f 20 76 64  OOBIG;.  goto vd
306e0 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 0a  be_error_halt;..
306f0 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
30700 65 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  e if a malloc() 
30710 66 61 69 6c 73 2e 0a 20 20 2a 2f 0a 6e 6f 5f 6d  fails..  */.no_m
30720 65 6d 3a 0a 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  em:.  db->malloc
30730 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 73 71  Failed = 1;.  sq
30740 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
30750 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
30760 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29  "out of memory")
30770 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  ;.  rc = SQLITE_
30780 4e 4f 4d 45 4d 3b 0a 20 20 67 6f 74 6f 20 76 64  NOMEM;.  goto vd
30790 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 0a  be_error_halt;..
307a0 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
307b0 65 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  e for any other 
307c0 6b 69 6e 64 20 6f 66 20 66 61 74 61 6c 20 65 72  kind of fatal er
307d0 72 6f 72 2e 20 20 54 68 65 20 22 72 63 22 20 76  ror.  The "rc" v
307e0 61 72 69 61 62 6c 65 0a 20 20 2a 2a 20 73 68 6f  ariable.  ** sho
307f0 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 72 72  uld hold the err
30800 6f 72 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a  or number..  */.
30810 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
30820 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  or:.  assert( p-
30830 3e 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 20  >zErrMsg==0 );. 
30840 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
30850 61 69 6c 65 64 20 29 20 72 63 20 3d 20 53 51 4c  ailed ) rc = SQL
30860 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28  ITE_NOMEM;.  if(
30870 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
30880 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73  R_NOMEM ){.    s
30890 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
308a0 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
308b0 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72   "%s", sqlite3Er
308c0 72 53 74 72 28 72 63 29 29 3b 0a 20 20 7d 0a 20  rStr(rc));.  }. 
308d0 20 67 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f 72   goto vdbe_error
308e0 5f 68 61 6c 74 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  _halt;..  /* Jum
308f0 70 20 74 6f 20 68 65 72 65 20 69 66 20 74 68 65  p to here if the
30900 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
30910 70 74 28 29 20 41 50 49 20 73 65 74 73 20 74 68  pt() API sets th
30920 65 20 69 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a  e interrupt.  **
30930 20 66 6c 61 67 2e 0a 20 20 2a 2f 0a 61 62 6f 72   flag..  */.abor
30940 74 5f 64 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75  t_due_to_interru
30950 70 74 3a 0a 20 20 61 73 73 65 72 74 28 20 64 62  pt:.  assert( db
30960 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
30970 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c  ed );.  rc = SQL
30980 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20  ITE_INTERRUPT;. 
30990 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 73   p->rc = rc;.  s
309a0 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
309b0 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
309c0 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72   "%s", sqlite3Er
309d0 72 53 74 72 28 72 63 29 29 3b 0a 20 20 67 6f 74  rStr(rc));.  got
309e0 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c  o vdbe_error_hal
309f0 74 3b 0a 7d 0a                                   t;.}.