/ Hex Artifact Content
Login

Artifact 4a1b6078e0a38106ab022f764ed285dc03450d15:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ******.** The co
0180: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
0190: 69 6d 70 6c 65 6d 65 6e 74 73 20 65 78 65 63 75  implements execu
01a0: 74 69 6f 6e 20 6d 65 74 68 6f 64 20 6f 66 20 74  tion method of t
01b0: 68 65 20 0a 2a 2a 20 56 69 72 74 75 61 6c 20 44  he .** Virtual D
01c0: 61 74 61 62 61 73 65 20 45 6e 67 69 6e 65 20 28  atabase Engine (
01d0: 56 44 42 45 29 2e 20 20 41 20 73 65 70 61 72 61  VDBE).  A separa
01e0: 74 65 20 66 69 6c 65 20 28 22 76 64 62 65 61 75  te file ("vdbeau
01f0: 78 2e 63 22 29 0a 2a 2a 20 68 61 6e 64 6c 65 73  x.c").** handles
0200: 20 68 6f 75 73 65 6b 65 65 70 69 6e 67 20 64 65   housekeeping de
0210: 74 61 69 6c 73 20 73 75 63 68 20 61 73 20 63 72  tails such as cr
0220: 65 61 74 69 6e 67 20 61 6e 64 20 64 65 6c 65 74  eating and delet
0230: 69 6e 67 0a 2a 2a 20 56 44 42 45 20 69 6e 73 74  ing.** VDBE inst
0240: 61 6e 63 65 73 2e 20 20 54 68 69 73 20 66 69 6c  ances.  This fil
0250: 65 20 69 73 20 73 6f 6c 65 6c 79 20 69 6e 74 65  e is solely inte
0260: 72 65 73 74 65 64 20 69 6e 20 65 78 65 63 75 74  rested in execut
0270: 69 6e 67 0a 2a 2a 20 74 68 65 20 56 44 42 45 20  ing.** the VDBE 
0280: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
0290: 6e 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 69  n the external i
02a0: 6e 74 65 72 66 61 63 65 2c 20 61 6e 20 22 73 71  nterface, an "sq
02b0: 6c 69 74 65 33 5f 73 74 6d 74 2a 22 20 69 73 20  lite3_stmt*" is 
02c0: 61 6e 20 6f 70 61 71 75 65 20 70 6f 69 6e 74 65  an opaque pointe
02d0: 72 0a 2a 2a 20 74 6f 20 61 20 56 44 42 45 2e 0a  r.** to a VDBE..
02e0: 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 20 70 61  **.** The SQL pa
02f0: 72 73 65 72 20 67 65 6e 65 72 61 74 65 73 20 61  rser generates a
0300: 20 70 72 6f 67 72 61 6d 20 77 68 69 63 68 20 69   program which i
0310: 73 20 74 68 65 6e 20 65 78 65 63 75 74 65 64 20  s then executed 
0320: 62 79 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 74  by.** the VDBE t
0330: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
0340: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
0350: 6e 74 2e 20 20 56 44 42 45 20 70 72 6f 67 72 61  nt.  VDBE progra
0360: 6d 73 20 61 72 65 20 0a 2a 2a 20 73 69 6d 69 6c  ms are .** simil
0370: 61 72 20 69 6e 20 66 6f 72 6d 20 74 6f 20 61 73  ar in form to as
0380: 73 65 6d 62 6c 79 20 6c 61 6e 67 75 61 67 65 2e  sembly language.
0390: 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 63 6f    The program co
03a0: 6e 73 69 73 74 73 20 6f 66 0a 2a 2a 20 61 20 6c  nsists of.** a l
03b0: 69 6e 65 61 72 20 73 65 71 75 65 6e 63 65 20 6f  inear sequence o
03c0: 66 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 45  f operations.  E
03d0: 61 63 68 20 6f 70 65 72 61 74 69 6f 6e 20 68 61  ach operation ha
03e0: 73 20 61 6e 20 6f 70 63 6f 64 65 20 0a 2a 2a 20  s an opcode .** 
03f0: 61 6e 64 20 35 20 6f 70 65 72 61 6e 64 73 2e 20  and 5 operands. 
0400: 20 4f 70 65 72 61 6e 64 73 20 50 31 2c 20 50 32   Operands P1, P2
0410: 2c 20 61 6e 64 20 50 33 20 61 72 65 20 69 6e 74  , and P3 are int
0420: 65 67 65 72 73 2e 20 20 4f 70 65 72 61 6e 64 20  egers.  Operand 
0430: 50 34 20 0a 2a 2a 20 69 73 20 61 20 6e 75 6c 6c  P4 .** is a null
0440: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
0450: 6e 67 2e 20 20 4f 70 65 72 61 6e 64 20 50 35 20  ng.  Operand P5 
0460: 69 73 20 61 6e 20 75 6e 73 69 67 6e 65 64 20 63  is an unsigned c
0470: 68 61 72 61 63 74 65 72 2e 0a 2a 2a 20 46 65 77  haracter..** Few
0480: 20 6f 70 63 6f 64 65 73 20 75 73 65 20 61 6c 6c   opcodes use all
0490: 20 35 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2a 0a   5 operands..**.
04a0: 2a 2a 20 43 6f 6d 70 75 74 61 74 69 6f 6e 20 72  ** Computation r
04b0: 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
04c0: 64 20 6f 6e 20 61 20 73 65 74 20 6f 66 20 72 65  d on a set of re
04d0: 67 69 73 74 65 72 73 20 6e 75 6d 62 65 72 65 64  gisters numbered
04e0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69   beginning.** wi
04f0: 74 68 20 31 20 61 6e 64 20 67 6f 69 6e 67 20 75  th 1 and going u
0500: 70 20 74 6f 20 56 64 62 65 2e 6e 4d 65 6d 2e 20  p to Vdbe.nMem. 
0510: 20 45 61 63 68 20 72 65 67 69 73 74 65 72 20 63   Each register c
0520: 61 6e 20 73 74 6f 72 65 0a 2a 2a 20 65 69 74 68  an store.** eith
0530: 65 72 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61  er an integer, a
0540: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
0550: 20 73 74 72 69 6e 67 2c 20 61 20 66 6c 6f 61 74   string, a float
0560: 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d  ing point.** num
0570: 62 65 72 2c 20 6f 72 20 74 68 65 20 53 51 4c 20  ber, or the SQL 
0580: 22 4e 55 4c 4c 22 20 76 61 6c 75 65 2e 20 20 41  "NULL" value.  A
0590: 6e 20 69 6d 70 6c 69 63 69 74 20 63 6f 6e 76 65  n implicit conve
05a0: 72 73 69 6f 6e 20 66 72 6f 6d 20 6f 6e 65 0a 2a  rsion from one.*
05b0: 2a 20 74 79 70 65 20 74 6f 20 74 68 65 20 6f 74  * type to the ot
05c0: 68 65 72 20 6f 63 63 75 72 73 20 61 73 20 6e 65  her occurs as ne
05d0: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 0a 2a 2a 20  cessary..** .** 
05e0: 4d 6f 73 74 20 6f 66 20 74 68 65 20 63 6f 64 65  Most of the code
05f0: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69 73   in this file is
0600: 20 74 61 6b 65 6e 20 75 70 20 62 79 20 74 68 65   taken up by the
0610: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
0620: 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  ().** function w
0630: 68 69 63 68 20 64 6f 65 73 20 74 68 65 20 77 6f  hich does the wo
0640: 72 6b 20 6f 66 20 69 6e 74 65 72 70 72 65 74 69  rk of interpreti
0650: 6e 67 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  ng a VDBE progra
0660: 6d 2e 0a 2a 2a 20 42 75 74 20 6f 74 68 65 72 20  m..** But other 
0670: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 73  routines are als
0680: 6f 20 70 72 6f 76 69 64 65 64 20 74 6f 20 68 65  o provided to he
0690: 6c 70 20 69 6e 20 62 75 69 6c 64 69 6e 67 20 75  lp in building u
06a0: 70 0a 2a 2a 20 61 20 70 72 6f 67 72 61 6d 20 69  p.** a program i
06b0: 6e 73 74 72 75 63 74 69 6f 6e 20 62 79 20 69 6e  nstruction by in
06c0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
06d0: 20 56 61 72 69 6f 75 73 20 73 63 72 69 70 74 73   Various scripts
06e0: 20 73 63 61 6e 20 74 68 69 73 20 73 6f 75 72 63   scan this sourc
06f0: 65 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  e file in order 
0700: 74 6f 20 67 65 6e 65 72 61 74 65 20 48 54 4d 4c  to generate HTML
0710: 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .** documentatio
0720: 6e 2c 20 68 65 61 64 65 72 73 20 66 69 6c 65 73  n, headers files
0730: 2c 20 6f 72 20 6f 74 68 65 72 20 64 65 72 69 76  , or other deriv
0740: 65 64 20 66 69 6c 65 73 2e 20 20 54 68 65 20 66  ed files.  The f
0750: 6f 72 6d 61 74 74 69 6e 67 0a 2a 2a 20 6f 66 20  ormatting.** of 
0760: 74 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73  the code in this
0770: 20 66 69 6c 65 20 69 73 2c 20 74 68 65 72 65 66   file is, theref
0780: 6f 72 65 2c 20 69 6d 70 6f 72 74 61 6e 74 2e 20  ore, important. 
0790: 20 53 65 65 20 6f 74 68 65 72 20 63 6f 6d 6d 65   See other comme
07a0: 6e 74 73 0a 2a 2a 20 69 6e 20 74 68 69 73 20 66  nts.** in this f
07b0: 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ile for details.
07c0: 20 20 49 66 20 69 6e 20 64 6f 75 62 74 2c 20 64    If in doubt, d
07d0: 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72  o not deviate fr
07e0: 6f 6d 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 63  om existing.** c
07f0: 6f 6d 6d 65 6e 74 69 6e 67 20 61 6e 64 20 69 6e  ommenting and in
0800: 64 65 6e 74 61 74 69 6f 6e 20 70 72 61 63 74 69  dentation practi
0810: 63 65 73 20 77 68 65 6e 20 63 68 61 6e 67 69 6e  ces when changin
0820: 67 20 6f 72 20 61 64 64 69 6e 67 20 63 6f 64 65  g or adding code
0830: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
0840: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0850: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
0860: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
0870: 68 69 73 20 6d 61 63 72 6f 20 6f 6e 20 6d 65 6d  his macro on mem
0880: 6f 72 79 20 63 65 6c 6c 73 20 6a 75 73 74 20 70  ory cells just p
0890: 72 69 6f 72 20 74 6f 20 63 68 61 6e 67 69 6e 67  rior to changing
08a0: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
08b0: 20 74 68 65 20 63 65 6c 6c 2e 20 20 54 68 69 73   the cell.  This
08c0: 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73 20   macro verifies 
08d0: 74 68 61 74 20 73 68 61 6c 6c 6f 77 20 63 6f 70  that shallow cop
08e0: 69 65 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 6d  ies are.** not m
08f0: 69 73 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65  isused..*/.#ifde
0900: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 23  f SQLITE_DEBUG.#
0910: 20 64 65 66 69 6e 65 20 6d 65 6d 41 62 6f 75 74   define memAbout
0920: 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 20 73 71  ToChange(P,M) sq
0930: 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72 65 70  lite3VdbeMemPrep
0940: 61 72 65 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29  areToChange(P,M)
0950: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
0960: 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
0970: 28 50 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (P,M).#endif../*
0980: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
0990: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
09a0: 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
09b0: 20 65 76 65 72 79 20 74 69 6d 65 20 61 20 63 75   every time a cu
09c0: 72 73 6f 72 0a 2a 2a 20 6d 6f 76 65 73 2c 20 65  rsor.** moves, e
09d0: 69 74 68 65 72 20 62 79 20 74 68 65 20 4f 50 5f  ither by the OP_
09e0: 53 65 65 6b 58 58 2c 20 4f 50 5f 4e 65 78 74 2c  SeekXX, OP_Next,
09f0: 20 6f 72 20 4f 50 5f 50 72 65 76 20 6f 70 63 6f   or OP_Prev opco
0a00: 64 65 73 2e 20 20 54 68 65 20 74 65 73 74 0a 2a  des.  The test.*
0a10: 2a 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 65  * procedures use
0a20: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
0a30: 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  n to make sure t
0a40: 68 61 74 20 69 6e 64 69 63 65 73 20 61 72 65 0a  hat indices are.
0a50: 2a 2a 20 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65  ** working corre
0a60: 63 74 6c 79 2e 20 20 54 68 69 73 20 76 61 72 69  ctly.  This vari
0a70: 61 62 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63  able has no func
0a80: 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  tion other than 
0a90: 74 6f 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66  to.** help verif
0aa0: 79 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70  y the correct op
0ab0: 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
0ac0: 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65  ibrary..*/.#ifde
0ad0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
0ae0: 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
0af0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
0b00: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  if../*.** When t
0b10: 68 69 73 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  his global varia
0b20: 62 6c 65 20 69 73 20 70 6f 73 69 74 69 76 65 2c  ble is positive,
0b30: 20 69 74 20 67 65 74 73 20 64 65 63 72 65 6d 65   it gets decreme
0b40: 6e 74 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nted once before
0b50: 0a 2a 2a 20 65 61 63 68 20 69 6e 73 74 72 75 63  .** each instruc
0b60: 74 69 6f 6e 20 69 6e 20 74 68 65 20 56 44 42 45  tion in the VDBE
0b70: 2e 20 20 57 68 65 6e 20 72 65 61 63 68 65 73 20  .  When reaches 
0b80: 7a 65 72 6f 2c 20 74 68 65 20 75 31 2e 69 73 49  zero, the u1.isI
0b90: 6e 74 65 72 72 75 70 74 65 64 0a 2a 2a 20 66 69  nterrupted.** fi
0ba0: 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74  eld of the sqlit
0bb0: 65 33 20 73 74 72 75 63 74 75 72 65 20 69 73 20  e3 structure is 
0bc0: 73 65 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  set in order to 
0bd0: 73 69 6d 75 6c 61 74 65 20 61 6e 64 20 69 6e 74  simulate and int
0be0: 65 72 72 75 70 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  errupt..**.** Th
0bf0: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 75  is facility is u
0c00: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
0c10: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
0c20: 49 74 20 64 6f 65 73 20 6e 6f 74 20 66 75 6e 63  It does not func
0c30: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 6e 20 6f 72  tion.** in an or
0c40: 64 69 6e 61 72 79 20 62 75 69 6c 64 2e 0a 2a 2f  dinary build..*/
0c50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
0c60: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
0c70: 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 20  interrupt_count 
0c80: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
0c90: 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f 62  ** The next glob
0ca0: 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
0cb0: 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68 20  ncremented each 
0cc0: 74 79 70 65 20 74 68 65 20 4f 50 5f 53 6f 72 74  type the OP_Sort
0cd0: 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65 78   opcode.** is ex
0ce0: 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65 73  ecuted.  The tes
0cf0: 74 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 65  t procedures use
0d00: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
0d10: 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  n to make sure t
0d20: 68 61 74 0a 2a 2a 20 73 6f 72 74 69 6e 67 20 69  hat.** sorting i
0d30: 73 20 6f 63 63 75 72 72 69 6e 67 20 6f 72 20 6e  s occurring or n
0d40: 6f 74 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20  ot occurring at 
0d50: 61 70 70 72 6f 70 72 69 61 74 65 20 74 69 6d 65  appropriate time
0d60: 73 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62  s.   This variab
0d70: 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75 6e  le.** has no fun
0d80: 63 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ction other than
0d90: 20 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79 20   to help verify 
0da0: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
0db0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
0dc0: 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64  library..*/.#ifd
0dd0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
0de0: 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f  nt sqlite3_sort_
0df0: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0e00: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  f../*.** The nex
0e10: 74 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  t global variabl
0e20: 65 20 72 65 63 6f 72 64 73 20 74 68 65 20 73 69  e records the si
0e30: 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73  ze of the larges
0e40: 74 20 4d 45 4d 5f 42 6c 6f 62 0a 2a 2a 20 6f 72  t MEM_Blob.** or
0e50: 20 4d 45 4d 5f 53 74 72 20 74 68 61 74 20 68 61   MEM_Str that ha
0e60: 73 20 62 65 65 6e 20 75 73 65 64 20 62 79 20 61  s been used by a
0e70: 20 56 44 42 45 20 6f 70 63 6f 64 65 2e 20 20 54   VDBE opcode.  T
0e80: 68 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72  he test procedur
0e90: 65 73 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 69  es.** use this i
0ea0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6d 61  nformation to ma
0eb0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
0ec0: 20 7a 65 72 6f 2d 62 6c 6f 62 20 66 75 6e 63 74   zero-blob funct
0ed0: 69 6f 6e 61 6c 69 74 79 0a 2a 2a 20 69 73 20 77  ionality.** is w
0ee0: 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 74 6c 79  orking correctly
0ef0: 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62 6c  .   This variabl
0f00: 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69 6f  e has no functio
0f10: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f 0a  n other than to.
0f20: 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79 20 74  ** help verify t
0f30: 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
0f40: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62 72  tion of the libr
0f50: 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ary..*/.#ifdef S
0f60: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
0f70: 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73  qlite3_max_blobs
0f80: 69 7a 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ize = 0;.static 
0f90: 76 6f 69 64 20 75 70 64 61 74 65 4d 61 78 42 6c  void updateMaxBl
0fa0: 6f 62 73 69 7a 65 28 4d 65 6d 20 2a 70 29 7b 0a  obsize(Mem *p){.
0fb0: 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20    if( (p->flags 
0fc0: 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  & (MEM_Str|MEM_B
0fd0: 6c 6f 62 29 29 21 3d 30 20 26 26 20 70 2d 3e 6e  lob))!=0 && p->n
0fe0: 3e 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f  >sqlite3_max_blo
0ff0: 62 73 69 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c  bsize ){.    sql
1000: 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a  ite3_max_blobsiz
1010: 65 20 3d 20 70 2d 3e 6e 3b 0a 20 20 7d 0a 7d 0a  e = p->n;.  }.}.
1020: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1030: 65 20 6e 65 78 74 20 67 6c 6f 62 61 6c 20 76 61  e next global va
1040: 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
1050: 65 6e 74 65 64 20 65 61 63 68 20 74 79 70 65 20  ented each type 
1060: 74 68 65 20 4f 50 5f 46 6f 75 6e 64 20 6f 70 63  the OP_Found opc
1070: 6f 64 65 0a 2a 2a 20 69 73 20 65 78 65 63 75 74  ode.** is execut
1080: 65 64 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  ed. This is used
1090: 20 74 6f 20 74 65 73 74 20 77 68 65 74 68 65 72   to test whether
10a0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 66 6f 72 65   or not the fore
10b0: 69 67 6e 20 6b 65 79 0a 2a 2a 20 6f 70 65 72 61  ign key.** opera
10c0: 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  tion implemented
10d0: 20 75 73 69 6e 67 20 4f 50 5f 46 6b 49 73 5a 65   using OP_FkIsZe
10e0: 72 6f 20 69 73 20 77 6f 72 6b 69 6e 67 2e 20 54  ro is working. T
10f0: 68 69 73 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  his variable.** 
1100: 68 61 73 20 6e 6f 20 66 75 6e 63 74 69 6f 6e 20  has no function 
1110: 6f 74 68 65 72 20 74 68 61 6e 20 74 6f 20 68 65  other than to he
1120: 6c 70 20 76 65 72 69 66 79 20 74 68 65 20 63 6f  lp verify the co
1130: 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
1140: 6f 66 20 74 68 65 0a 2a 2a 20 6c 69 62 72 61 72  of the.** librar
1150: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
1160: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
1170: 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74  ite3_found_count
1180: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
1190: 0a 2a 2a 20 54 65 73 74 20 61 20 72 65 67 69 73  .** Test a regis
11a0: 74 65 72 20 74 6f 20 73 65 65 20 69 66 20 69 74  ter to see if it
11b0: 20 65 78 63 65 65 64 73 20 74 68 65 20 63 75 72   exceeds the cur
11c0: 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 62 6c 6f  rent maximum blo
11d0: 62 20 73 69 7a 65 2e 0a 2a 2a 20 49 66 20 69 74  b size..** If it
11e0: 20 64 6f 65 73 2c 20 72 65 63 6f 72 64 20 74 68   does, record th
11f0: 65 20 6e 65 77 20 6d 61 78 69 6d 75 6d 20 62 6c  e new maximum bl
1200: 6f 62 20 73 69 7a 65 2e 0a 2a 2f 0a 23 69 66 20  ob size..*/.#if 
1210: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1220: 45 53 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  EST) && !defined
1230: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49  (SQLITE_OMIT_BUI
1240: 4c 54 49 4e 5f 54 45 53 54 29 0a 23 20 64 65 66  LTIN_TEST).# def
1250: 69 6e 65 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ine UPDATE_MAX_B
1260: 4c 4f 42 53 49 5a 45 28 50 29 20 20 75 70 64 61  LOBSIZE(P)  upda
1270: 74 65 4d 61 78 42 6c 6f 62 73 69 7a 65 28 50 29  teMaxBlobsize(P)
1280: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1290: 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
12a0: 49 5a 45 28 50 29 0a 23 65 6e 64 69 66 0a 0a 2f  IZE(P).#endif../
12b0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65  *.** Convert the
12c0: 20 67 69 76 65 6e 20 72 65 67 69 73 74 65 72 20   given register 
12d0: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 69 66  into a string if
12e0: 20 69 74 20 69 73 6e 27 74 20 6f 6e 65 0a 2a 2a   it isn't one.**
12f0: 20 61 6c 72 65 61 64 79 2e 20 52 65 74 75 72 6e   already. Return
1300: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 6d   non-zero if a m
1310: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
1320: 2f 0a 23 64 65 66 69 6e 65 20 53 74 72 69 6e 67  /.#define String
1330: 69 66 79 28 50 2c 20 65 6e 63 29 20 5c 0a 20 20  ify(P, enc) \.  
1340: 20 69 66 28 28 28 50 29 2d 3e 66 6c 61 67 73 26   if(((P)->flags&
1350: 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
1360: 62 29 29 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  b))==0 && sqlite
1370: 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67 69 66  3VdbeMemStringif
1380: 79 28 50 2c 65 6e 63 29 29 20 5c 0a 20 20 20 20  y(P,enc)) \.    
1390: 20 7b 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 20   { goto no_mem; 
13a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 65 70 68 65  }../*.** An ephe
13b0: 6d 65 72 61 6c 20 73 74 72 69 6e 67 20 76 61 6c  meral string val
13c0: 75 65 20 28 73 69 67 6e 69 66 69 65 64 20 62 79  ue (signified by
13d0: 20 74 68 65 20 4d 45 4d 5f 45 70 68 65 6d 20 66   the MEM_Ephem f
13e0: 6c 61 67 29 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  lag) contains.**
13f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1400: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
1410: 63 61 74 65 64 20 73 74 72 69 6e 67 20 77 68 65  cated string whe
1420: 72 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 6e  re some other en
1430: 74 69 74 79 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tity.** is respo
1440: 6e 73 69 62 6c 65 20 66 6f 72 20 64 65 61 6c 6c  nsible for deall
1450: 6f 63 61 74 69 6e 67 20 74 68 61 74 20 73 74 72  ocating that str
1460: 69 6e 67 2e 20 20 42 65 63 61 75 73 65 20 74 68  ing.  Because th
1470: 65 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 64 6f  e register.** do
1480: 65 73 20 6e 6f 74 20 63 6f 6e 74 72 6f 6c 20 74  es not control t
1490: 68 65 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 69  he string, it mi
14a0: 67 68 74 20 62 65 20 64 65 6c 65 74 65 64 20 77  ght be deleted w
14b0: 69 74 68 6f 75 74 20 74 68 65 20 72 65 67 69 73  ithout the regis
14c0: 74 65 72 0a 2a 2a 20 6b 6e 6f 77 69 6e 67 20 69  ter.** knowing i
14d0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
14e0: 75 74 69 6e 65 20 63 6f 6e 76 65 72 74 73 20 61  utine converts a
14f0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69  n ephemeral stri
1500: 6e 67 20 69 6e 74 6f 20 61 20 64 79 6e 61 6d 69  ng into a dynami
1510: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 0a  cally allocated.
1520: 2a 2a 20 73 74 72 69 6e 67 20 74 68 61 74 20 74  ** string that t
1530: 68 65 20 72 65 67 69 73 74 65 72 20 69 74 73 65  he register itse
1540: 6c 66 20 63 6f 6e 74 72 6f 6c 73 2e 20 20 49 6e  lf controls.  In
1550: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74   other words, it
1560: 0a 2a 2a 20 63 6f 6e 76 65 72 74 73 20 61 6e 20  .** converts an 
1570: 4d 45 4d 5f 45 70 68 65 6d 20 73 74 72 69 6e 67  MEM_Ephem string
1580: 20 69 6e 74 6f 20 61 6e 20 4d 45 4d 5f 44 79 6e   into an MEM_Dyn
1590: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 23 64 65 66   string..*/.#def
15a0: 69 6e 65 20 44 65 65 70 68 65 6d 65 72 61 6c 69  ine Deephemerali
15b0: 7a 65 28 50 29 20 5c 0a 20 20 20 69 66 28 20 28  ze(P) \.   if( (
15c0: 28 50 29 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 45  (P)->flags&MEM_E
15d0: 70 68 65 6d 29 21 3d 30 20 5c 0a 20 20 20 20 20  phem)!=0 \.     
15e0: 20 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65    && sqlite3Vdbe
15f0: 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c 65  MemMakeWriteable
1600: 28 50 29 20 29 7b 20 67 6f 74 6f 20 6e 6f 5f 6d  (P) ){ goto no_m
1610: 65 6d 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  em;}../*.** Call
1620: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 45   sqlite3VdbeMemE
1630: 78 70 61 6e 64 42 6c 6f 62 28 29 20 6f 6e 20 74  xpandBlob() on t
1640: 68 65 20 73 75 70 70 6c 69 65 64 20 76 61 6c 75  he supplied valu
1650: 65 20 28 74 79 70 65 20 4d 65 6d 2a 29 0a 2a 2a  e (type Mem*).**
1660: 20 50 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a   P if required..
1670: 2a 2f 0a 23 64 65 66 69 6e 65 20 45 78 70 61 6e  */.#define Expan
1680: 64 42 6c 6f 62 28 50 29 20 28 28 28 50 29 2d 3e  dBlob(P) (((P)->
1690: 66 6c 61 67 73 26 4d 45 4d 5f 5a 65 72 6f 29 3f  flags&MEM_Zero)?
16a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 45 78  sqlite3VdbeMemEx
16b0: 70 61 6e 64 42 6c 6f 62 28 50 29 3a 30 29 0a 0a  pandBlob(P):0)..
16c0: 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
16d0: 4d 65 6d 20 70 6f 69 6e 74 73 20 61 74 20 61 20  Mem points at a 
16e0: 72 65 67 69 73 74 65 72 20 74 68 61 74 20 77 69  register that wi
16f0: 6c 6c 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  ll be passed to 
1700: 61 0a 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65  a.** user-define
1710: 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 72 65  d function or re
1720: 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73  turned to the us
1730: 65 72 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  er as the result
1740: 20 6f 66 20 61 20 71 75 65 72 79 2e 0a 2a 2a 20   of a query..** 
1750: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
1760: 73 20 74 68 65 20 70 4d 65 6d 2d 3e 74 79 70 65  s the pMem->type
1770: 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20 62   variable used b
1780: 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 61  y the sqlite3_va
1790: 6c 75 65 5f 2a 28 29 20 0a 2a 2a 20 72 6f 75 74  lue_*() .** rout
17a0: 69 6e 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ines..*/.void sq
17b0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f 72  lite3VdbeMemStor
17c0: 65 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 29  eType(Mem *pMem)
17d0: 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  {.  int flags = 
17e0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  pMem->flags;.  i
17f0: 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  f( flags & MEM_N
1800: 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d  ull ){.    pMem-
1810: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e  >type = SQLITE_N
1820: 55 4c 4c 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20  ULL;.  }.  else 
1830: 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  if( flags & MEM_
1840: 49 6e 74 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d  Int ){.    pMem-
1850: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  >type = SQLITE_I
1860: 4e 54 45 47 45 52 3b 0a 20 20 7d 0a 20 20 65 6c  NTEGER;.  }.  el
1870: 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  se if( flags & M
1880: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 70  EM_Real ){.    p
1890: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
18a0: 54 45 5f 46 4c 4f 41 54 3b 0a 20 20 7d 0a 20 20  TE_FLOAT;.  }.  
18b0: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
18c0: 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
18d0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
18e0: 49 54 45 5f 54 45 58 54 3b 0a 20 20 7d 65 6c 73  ITE_TEXT;.  }els
18f0: 65 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  e{.    pMem->typ
1900: 65 20 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3b  e = SQLITE_BLOB;
1910: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
1920: 6c 6f 63 61 74 65 20 56 64 62 65 43 75 72 73 6f  locate VdbeCurso
1930: 72 20 6e 75 6d 62 65 72 20 69 43 75 72 2e 20 20  r number iCur.  
1940: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1950: 20 74 6f 20 69 74 2e 20 20 52 65 74 75 72 6e 20   to it.  Return 
1960: 4e 55 4c 4c 0a 2a 2a 20 69 66 20 77 65 20 72 75  NULL.** if we ru
1970: 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
1980: 0a 2a 2f 0a 73 74 61 74 69 63 20 56 64 62 65 43  .*/.static VdbeC
1990: 75 72 73 6f 72 20 2a 61 6c 6c 6f 63 61 74 65 43  ursor *allocateC
19a0: 75 72 73 6f 72 28 0a 20 20 56 64 62 65 20 2a 70  ursor(.  Vdbe *p
19b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
19c0: 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
19d0: 63 68 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 69  chine */.  int i
19e0: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
19f0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1a00: 20 6e 65 77 20 56 64 62 65 43 75 72 73 6f 72 20   new VdbeCursor 
1a10: 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c  */.  int nField,
1a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1a30: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
1a40: 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  n the table or i
1a50: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 44  ndex */.  int iD
1a60: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1a70: 2f 2a 20 57 68 65 6e 20 64 61 74 61 62 61 73 65  /* When database
1a80: 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 6c 6f   the cursor belo
1a90: 6e 67 73 20 74 6f 2c 20 6f 72 20 2d 31 20 2a 2f  ngs to, or -1 */
1aa0: 0a 20 20 69 6e 74 20 69 73 42 74 72 65 65 43 75  .  int isBtreeCu
1ab0: 72 73 6f 72 20 20 20 20 20 2f 2a 20 54 72 75 65  rsor     /* True
1ac0: 20 66 6f 72 20 42 2d 54 72 65 65 2e 20 20 46 61   for B-Tree.  Fa
1ad0: 6c 73 65 20 66 6f 72 20 70 73 65 75 64 6f 2d 74  lse for pseudo-t
1ae0: 61 62 6c 65 20 6f 72 20 76 74 61 62 20 2a 2f 0a  able or vtab */.
1af0: 29 7b 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ){.  /* Find the
1b00: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
1b10: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
1b20: 6f 20 73 74 6f 72 65 20 74 68 65 20 62 6c 6f 62  o store the blob
1b30: 20 6f 66 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20   of memory.  ** 
1b40: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 69  required for thi
1b50: 73 20 56 64 62 65 43 75 72 73 6f 72 20 73 74 72  s VdbeCursor str
1b60: 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 63 6f  ucture. It is co
1b70: 6e 76 65 6e 69 65 6e 74 20 74 6f 20 75 73 65 20  nvenient to use 
1b80: 61 20 0a 20 20 2a 2a 20 76 64 62 65 20 6d 65 6d  a .  ** vdbe mem
1b90: 6f 72 79 20 63 65 6c 6c 20 74 6f 20 6d 61 6e 61  ory cell to mana
1ba0: 67 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  ge the memory al
1bb0: 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 69 72 65  location require
1bc0: 64 20 66 6f 72 20 61 0a 20 20 2a 2a 20 56 64 62  d for a.  ** Vdb
1bd0: 65 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72  eCursor structur
1be0: 65 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77  e for the follow
1bf0: 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a 20 20 2a  ing reasons:.  *
1c00: 2a 0a 20 20 2a 2a 20 20 20 2a 20 53 6f 6d 65 74  *.  **   * Somet
1c10: 69 6d 65 73 20 63 75 72 73 6f 72 20 6e 75 6d 62  imes cursor numb
1c20: 65 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72  ers are used for
1c30: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
1c40: 66 65 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20 20  ferent.  **     
1c50: 70 75 72 70 6f 73 65 73 20 69 6e 20 61 20 76 64  purposes in a vd
1c60: 62 65 20 70 72 6f 67 72 61 6d 2e 20 54 68 65 20  be program. The 
1c70: 64 69 66 66 65 72 65 6e 74 20 75 73 65 73 20 6d  different uses m
1c80: 69 67 68 74 20 72 65 71 75 69 72 65 0a 20 20 2a  ight require.  *
1c90: 2a 20 20 20 20 20 64 69 66 66 65 72 65 6e 74 20  *     different 
1ca0: 73 69 7a 65 64 20 61 6c 6c 6f 63 61 74 69 6f 6e  sized allocation
1cb0: 73 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  s. Memory cells 
1cc0: 70 72 6f 76 69 64 65 20 67 72 6f 77 61 62 6c 65  provide growable
1cd0: 0a 20 20 2a 2a 20 20 20 20 20 61 6c 6c 6f 63 61  .  **     alloca
1ce0: 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
1cf0: 20 20 20 2a 20 57 68 65 6e 20 75 73 69 6e 67 20     * When using 
1d00: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
1d10: 4e 41 47 45 4d 45 4e 54 2c 20 6d 65 6d 6f 72 79  NAGEMENT, memory
1d20: 20 63 65 6c 6c 20 62 75 66 66 65 72 73 20 63 61   cell buffers ca
1d30: 6e 0a 20 20 2a 2a 20 20 20 20 20 62 65 20 66 72  n.  **     be fr
1d40: 65 65 64 20 6c 61 7a 69 6c 79 20 76 69 61 20 74  eed lazily via t
1d50: 68 65 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  he sqlite3_relea
1d60: 73 65 5f 6d 65 6d 6f 72 79 28 29 20 41 50 49 2e  se_memory() API.
1d70: 20 54 68 69 73 0a 20 20 2a 2a 20 20 20 20 20 6d   This.  **     m
1d80: 69 6e 69 6d 69 7a 65 73 20 74 68 65 20 6e 75 6d  inimizes the num
1d90: 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 20 63 61  ber of malloc ca
1da0: 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  lls made by the 
1db0: 73 79 73 74 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  system..  **.  *
1dc0: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  * Memory cells f
1dd0: 6f 72 20 63 75 72 73 6f 72 73 20 61 72 65 20 61  or cursors are a
1de0: 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65 20  llocated at the 
1df0: 74 6f 70 20 6f 66 20 74 68 65 20 61 64 64 72 65  top of the addre
1e00: 73 73 0a 20 20 2a 2a 20 73 70 61 63 65 2e 20 4d  ss.  ** space. M
1e10: 65 6d 6f 72 79 20 63 65 6c 6c 20 28 70 2d 3e 6e  emory cell (p->n
1e20: 4d 65 6d 29 20 63 6f 72 72 65 73 70 6f 6e 64 73  Mem) corresponds
1e30: 20 74 6f 20 63 75 72 73 6f 72 20 30 2e 20 53 70   to cursor 0. Sp
1e40: 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 63 75 72  ace for.  ** cur
1e50: 73 6f 72 20 31 20 69 73 20 6d 61 6e 61 67 65 64  sor 1 is managed
1e60: 20 62 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   by memory cell 
1e70: 28 70 2d 3e 6e 4d 65 6d 2d 31 29 2c 20 65 74 63  (p->nMem-1), etc
1e80: 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ..  */.  Mem *pM
1e90: 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 2d  em = &p->aMem[p-
1ea0: 3e 6e 4d 65 6d 2d 69 43 75 72 5d 3b 0a 0a 20 20  >nMem-iCur];..  
1eb0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 56 64 62  int nByte;.  Vdb
1ec0: 65 43 75 72 73 6f 72 20 2a 70 43 78 20 3d 20 30  eCursor *pCx = 0
1ed0: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 0a 20 20 20  ;.  nByte = .   
1ee0: 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
1ef0: 28 56 64 62 65 43 75 72 73 6f 72 29 29 20 2b 20  (VdbeCursor)) + 
1f00: 0a 20 20 20 20 20 20 28 69 73 42 74 72 65 65 43  .      (isBtreeC
1f10: 75 72 73 6f 72 3f 73 71 6c 69 74 65 33 42 74 72  ursor?sqlite3Btr
1f20: 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 3a 30  eeCursorSize():0
1f30: 29 20 2b 20 0a 20 20 20 20 20 20 32 2a 6e 46 69  ) + .      2*nFi
1f40: 65 6c 64 2a 73 69 7a 65 6f 66 28 75 33 32 29 3b  eld*sizeof(u32);
1f50: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43 75 72  ..  assert( iCur
1f60: 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
1f70: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 5b 69 43   if( p->apCsr[iC
1f80: 75 72 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ur] ){.    sqlit
1f90: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
1fa0: 28 70 2c 20 70 2d 3e 61 70 43 73 72 5b 69 43 75  (p, p->apCsr[iCu
1fb0: 72 5d 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73  r]);.    p->apCs
1fc0: 72 5b 69 43 75 72 5d 20 3d 20 30 3b 0a 20 20 7d  r[iCur] = 0;.  }
1fd0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1fe0: 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ==sqlite3VdbeMem
1ff0: 47 72 6f 77 28 70 4d 65 6d 2c 20 6e 42 79 74 65  Grow(pMem, nByte
2000: 2c 20 30 29 20 29 7b 0a 20 20 20 20 70 2d 3e 61  , 0) ){.    p->a
2010: 70 43 73 72 5b 69 43 75 72 5d 20 3d 20 70 43 78  pCsr[iCur] = pCx
2020: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 2a 29   = (VdbeCursor*)
2030: 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 6d 65 6d  pMem->z;.    mem
2040: 73 65 74 28 70 43 78 2c 20 30 2c 20 73 69 7a 65  set(pCx, 0, size
2050: 6f 66 28 56 64 62 65 43 75 72 73 6f 72 29 29 3b  of(VdbeCursor));
2060: 0a 20 20 20 20 70 43 78 2d 3e 69 44 62 20 3d 20  .    pCx->iDb = 
2070: 69 44 62 3b 0a 20 20 20 20 70 43 78 2d 3e 6e 46  iDb;.    pCx->nF
2080: 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20  ield = nField;. 
2090: 20 20 20 69 66 28 20 6e 46 69 65 6c 64 20 29 7b     if( nField ){
20a0: 0a 20 20 20 20 20 20 70 43 78 2d 3e 61 54 79 70  .      pCx->aTyp
20b0: 65 20 3d 20 28 75 33 32 20 2a 29 26 70 4d 65 6d  e = (u32 *)&pMem
20c0: 2d 3e 7a 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  ->z[ROUND8(sizeo
20d0: 66 28 56 64 62 65 43 75 72 73 6f 72 29 29 5d 3b  f(VdbeCursor))];
20e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
20f0: 73 42 74 72 65 65 43 75 72 73 6f 72 20 29 7b 0a  sBtreeCursor ){.
2100: 20 20 20 20 20 20 70 43 78 2d 3e 70 43 75 72 73        pCx->pCurs
2110: 6f 72 20 3d 20 28 42 74 43 75 72 73 6f 72 2a 29  or = (BtCursor*)
2120: 0a 20 20 20 20 20 20 20 20 20 20 26 70 4d 65 6d  .          &pMem
2130: 2d 3e 7a 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  ->z[ROUND8(sizeo
2140: 66 28 56 64 62 65 43 75 72 73 6f 72 29 29 2b 32  f(VdbeCursor))+2
2150: 2a 6e 46 69 65 6c 64 2a 73 69 7a 65 6f 66 28 75  *nField*sizeof(u
2160: 33 32 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  32)];.      sqli
2170: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65  te3BtreeCursorZe
2180: 72 6f 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  ro(pCx->pCursor)
2190: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
21a0: 74 75 72 6e 20 70 43 78 3b 0a 7d 0a 0a 2f 2a 0a  turn pCx;.}../*.
21b0: 2a 2a 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72  ** Try to conver
21c0: 74 20 61 20 76 61 6c 75 65 20 69 6e 74 6f 20 61  t a value into a
21d0: 20 6e 75 6d 65 72 69 63 20 72 65 70 72 65 73 65   numeric represe
21e0: 6e 74 61 74 69 6f 6e 20 69 66 20 77 65 20 63 61  ntation if we ca
21f0: 6e 0a 2a 2a 20 64 6f 20 73 6f 20 77 69 74 68 6f  n.** do so witho
2200: 75 74 20 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72  ut loss of infor
2210: 6d 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65  mation.  In othe
2220: 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20  r words, if the 
2230: 73 74 72 69 6e 67 0a 2a 2a 20 6c 6f 6f 6b 73 20  string.** looks 
2240: 6c 69 6b 65 20 61 20 6e 75 6d 62 65 72 2c 20 63  like a number, c
2250: 6f 6e 76 65 72 74 20 69 74 20 69 6e 74 6f 20 61  onvert it into a
2260: 20 6e 75 6d 62 65 72 2e 20 20 49 66 20 69 74 20   number.  If it 
2270: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 6c 6f 6f 6b  does not.** look
2280: 20 6c 69 6b 65 20 61 20 6e 75 6d 62 65 72 2c 20   like a number, 
2290: 6c 65 61 76 65 20 69 74 20 61 6c 6f 6e 65 2e 0a  leave it alone..
22a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
22b0: 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e  pplyNumericAffin
22c0: 69 74 79 28 4d 65 6d 20 2a 70 52 65 63 29 7b 0a  ity(Mem *pRec){.
22d0: 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66 6c 61    if( (pRec->fla
22e0: 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d  gs & (MEM_Real|M
22f0: 45 4d 5f 49 6e 74 29 29 3d 3d 30 20 29 7b 0a 20  EM_Int))==0 ){. 
2300: 20 20 20 64 6f 75 62 6c 65 20 72 56 61 6c 75 65     double rValue
2310: 3b 0a 20 20 20 20 69 36 34 20 69 56 61 6c 75 65  ;.    i64 iValue
2320: 3b 0a 20 20 20 20 75 38 20 65 6e 63 20 3d 20 70  ;.    u8 enc = p
2330: 52 65 63 2d 3e 65 6e 63 3b 0a 20 20 20 20 69 66  Rec->enc;.    if
2340: 28 20 28 70 52 65 63 2d 3e 66 6c 61 67 73 26 4d  ( (pRec->flags&M
2350: 45 4d 5f 53 74 72 29 3d 3d 30 20 29 20 72 65 74  EM_Str)==0 ) ret
2360: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  urn;.    if( sql
2370: 69 74 65 33 41 74 6f 46 28 70 52 65 63 2d 3e 7a  ite3AtoF(pRec->z
2380: 2c 20 26 72 56 61 6c 75 65 2c 20 70 52 65 63 2d  , &rValue, pRec-
2390: 3e 6e 2c 20 65 6e 63 29 3d 3d 30 20 29 20 72 65  >n, enc)==0 ) re
23a0: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 30 3d  turn;.    if( 0=
23b0: 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 70  =sqlite3Atoi64(p
23c0: 52 65 63 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 2c  Rec->z, &iValue,
23d0: 20 70 52 65 63 2d 3e 6e 2c 20 65 6e 63 29 20 29   pRec->n, enc) )
23e0: 7b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 75 2e  {.      pRec->u.
23f0: 69 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20  i = iValue;.    
2400: 20 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 7c 3d    pRec->flags |=
2410: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 7d 65   MEM_Int;.    }e
2420: 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 65 63 2d  lse{.      pRec-
2430: 3e 72 20 3d 20 72 56 61 6c 75 65 3b 0a 20 20 20  >r = rValue;.   
2440: 20 20 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 7c     pRec->flags |
2450: 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20  = MEM_Real;.    
2460: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  }.  }.}../*.** P
2470: 72 6f 63 65 73 73 69 6e 67 20 69 73 20 64 65 74  rocessing is det
2480: 65 72 6d 69 6e 65 20 62 79 20 74 68 65 20 61 66  ermine by the af
2490: 66 69 6e 69 74 79 20 70 61 72 61 6d 65 74 65 72  finity parameter
24a0: 3a 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  :.**.** SQLITE_A
24b0: 46 46 5f 49 4e 54 45 47 45 52 3a 0a 2a 2a 20 53  FF_INTEGER:.** S
24c0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3a 0a  QLITE_AFF_REAL:.
24d0: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ** SQLITE_AFF_NU
24e0: 4d 45 52 49 43 3a 0a 2a 2a 20 20 20 20 54 72 79  MERIC:.**    Try
24f0: 20 74 6f 20 63 6f 6e 76 65 72 74 20 70 52 65 63   to convert pRec
2500: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 72   to an integer r
2510: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72  epresentation or
2520: 20 61 20 0a 2a 2a 20 20 20 20 66 6c 6f 61 74 69   a .**    floati
2530: 6e 67 2d 70 6f 69 6e 74 20 72 65 70 72 65 73 65  ng-point represe
2540: 6e 74 61 74 69 6f 6e 20 69 66 20 61 6e 20 69 6e  ntation if an in
2550: 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61  teger representa
2560: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 6e 6f  tion.**    is no
2570: 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 4e 6f 74  t possible.  Not
2580: 65 20 74 68 61 74 20 74 68 65 20 69 6e 74 65 67  e that the integ
2590: 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  er representatio
25a0: 6e 20 69 73 0a 2a 2a 20 20 20 20 61 6c 77 61 79  n is.**    alway
25b0: 73 20 70 72 65 66 65 72 72 65 64 2c 20 65 76 65  s preferred, eve
25c0: 6e 20 69 66 20 74 68 65 20 61 66 66 69 6e 69 74  n if the affinit
25d0: 79 20 69 73 20 52 45 41 4c 2c 20 62 65 63 61 75  y is REAL, becau
25e0: 73 65 0a 2a 2a 20 20 20 20 61 6e 20 69 6e 74 65  se.**    an inte
25f0: 67 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69  ger representati
2600: 6f 6e 20 69 73 20 6d 6f 72 65 20 73 70 61 63 65  on is more space
2610: 20 65 66 66 69 63 69 65 6e 74 20 6f 6e 20 64 69   efficient on di
2620: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  sk..**.** SQLITE
2630: 5f 41 46 46 5f 54 45 58 54 3a 0a 2a 2a 20 20 20  _AFF_TEXT:.**   
2640: 20 43 6f 6e 76 65 72 74 20 70 52 65 63 20 74 6f   Convert pRec to
2650: 20 61 20 74 65 78 74 20 72 65 70 72 65 73 65 6e   a text represen
2660: 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 51  tation..**.** SQ
2670: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 2a  LITE_AFF_NONE:.*
2680: 2a 20 20 20 20 4e 6f 2d 6f 70 2e 20 20 70 52 65  *    No-op.  pRe
2690: 63 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  c is unchanged..
26a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
26b0: 70 70 6c 79 41 66 66 69 6e 69 74 79 28 0a 20 20  pplyAffinity(.  
26c0: 4d 65 6d 20 2a 70 52 65 63 2c 20 20 20 20 20 20  Mem *pRec,      
26d0: 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
26e0: 20 74 6f 20 61 70 70 6c 79 20 61 66 66 69 6e 69   to apply affini
26f0: 74 79 20 74 6f 20 2a 2f 0a 20 20 63 68 61 72 20  ty to */.  char 
2700: 61 66 66 69 6e 69 74 79 2c 20 20 20 20 20 20 2f  affinity,      /
2710: 2a 20 54 68 65 20 61 66 66 69 6e 69 74 79 20 74  * The affinity t
2720: 6f 20 62 65 20 61 70 70 6c 69 65 64 20 2a 2f 0a  o be applied */.
2730: 20 20 75 38 20 65 6e 63 20 20 20 20 20 20 20 20    u8 enc        
2740: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69        /* Use thi
2750: 73 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  s text encoding 
2760: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 61 66 66 69  */.){.  if( affi
2770: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
2780: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 2f 2a 20  _TEXT ){.    /* 
2790: 4f 6e 6c 79 20 61 74 74 65 6d 70 74 20 74 68 65  Only attempt the
27a0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 54   conversion to T
27b0: 45 58 54 20 69 66 20 74 68 65 72 65 20 69 73 20  EXT if there is 
27c0: 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 72 65  an integer or re
27d0: 61 6c 0a 20 20 20 20 2a 2a 20 72 65 70 72 65 73  al.    ** repres
27e0: 65 6e 74 61 74 69 6f 6e 20 28 62 6c 6f 62 20 61  entation (blob a
27f0: 6e 64 20 4e 55 4c 4c 20 64 6f 20 6e 6f 74 20 67  nd NULL do not g
2800: 65 74 20 63 6f 6e 76 65 72 74 65 64 29 20 62 75  et converted) bu
2810: 74 20 6e 6f 20 73 74 72 69 6e 67 0a 20 20 20 20  t no string.    
2820: 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ** representatio
2830: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
2840: 28 20 30 3d 3d 28 70 52 65 63 2d 3e 66 6c 61 67  ( 0==(pRec->flag
2850: 73 26 4d 45 4d 5f 53 74 72 29 20 26 26 20 28 70  s&MEM_Str) && (p
2860: 52 65 63 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f  Rec->flags&(MEM_
2870: 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 29 29 20 29  Real|MEM_Int)) )
2880: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2890: 64 62 65 4d 65 6d 53 74 72 69 6e 67 69 66 79 28  dbeMemStringify(
28a0: 70 52 65 63 2c 20 65 6e 63 29 3b 0a 20 20 20 20  pRec, enc);.    
28b0: 7d 0a 20 20 20 20 70 52 65 63 2d 3e 66 6c 61 67  }.    pRec->flag
28c0: 73 20 26 3d 20 7e 28 4d 45 4d 5f 52 65 61 6c 7c  s &= ~(MEM_Real|
28d0: 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 65 6c 73  MEM_Int);.  }els
28e0: 65 20 69 66 28 20 61 66 66 69 6e 69 74 79 21 3d  e if( affinity!=
28f0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
2900: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  ){.    assert( a
2910: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
2920: 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
2930: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
2940: 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 20  AFF_REAL.       
2950: 20 20 20 20 20 20 7c 7c 20 61 66 66 69 6e 69 74        || affinit
2960: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  y==SQLITE_AFF_NU
2970: 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 61 70 70  MERIC );.    app
2980: 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  lyNumericAffinit
2990: 79 28 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28  y(pRec);.    if(
29a0: 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20 4d   pRec->flags & M
29b0: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
29c0: 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 65   sqlite3VdbeInte
29d0: 67 65 72 41 66 66 69 6e 69 74 79 28 70 52 65 63  gerAffinity(pRec
29e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
29f0: 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 63 6f 6e  /*.** Try to con
2a00: 76 65 72 74 20 74 68 65 20 74 79 70 65 20 6f 66  vert the type of
2a10: 20 61 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75   a function argu
2a20: 6d 65 6e 74 20 6f 72 20 61 20 72 65 73 75 6c 74  ment or a result
2a30: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 74 6f 20   column.** into 
2a40: 61 20 6e 75 6d 65 72 69 63 20 72 65 70 72 65 73  a numeric repres
2a50: 65 6e 74 61 74 69 6f 6e 2e 20 20 55 73 65 20 65  entation.  Use e
2a60: 69 74 68 65 72 20 49 4e 54 45 47 45 52 20 6f 72  ither INTEGER or
2a70: 20 52 45 41 4c 20 77 68 69 63 68 65 76 65 72 0a   REAL whichever.
2a80: 2a 2a 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  ** is appropriat
2a90: 65 2e 20 20 42 75 74 20 6f 6e 6c 79 20 64 6f 20  e.  But only do 
2aa0: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69  the conversion i
2ab0: 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
2ac0: 20 77 69 74 68 6f 75 74 0a 2a 2a 20 6c 6f 73 73   without.** loss
2ad0: 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   of information 
2ae0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72  and return the r
2af0: 65 76 69 73 65 64 20 74 79 70 65 20 6f 66 20 74  evised type of t
2b00: 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  he argument..*/.
2b10: 69 6e 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  int sqlite3_valu
2b20: 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 73  e_numeric_type(s
2b30: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
2b40: 61 6c 29 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  al){.  Mem *pMem
2b50: 20 3d 20 28 4d 65 6d 2a 29 70 56 61 6c 3b 0a 20   = (Mem*)pVal;. 
2b60: 20 69 66 28 20 70 4d 65 6d 2d 3e 74 79 70 65 3d   if( pMem->type=
2b70: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
2b80: 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63      applyNumeric
2b90: 41 66 66 69 6e 69 74 79 28 70 4d 65 6d 29 3b 0a  Affinity(pMem);.
2ba0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
2bb0: 65 6d 53 74 6f 72 65 54 79 70 65 28 70 4d 65 6d  emStoreType(pMem
2bc0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2bd0: 70 4d 65 6d 2d 3e 74 79 70 65 3b 0a 7d 0a 0a 2f  pMem->type;.}../
2be0: 2a 0a 2a 2a 20 45 78 70 6f 72 74 65 64 20 76 65  *.** Exported ve
2bf0: 72 73 69 6f 6e 20 6f 66 20 61 70 70 6c 79 41 66  rsion of applyAf
2c00: 66 69 6e 69 74 79 28 29 2e 20 54 68 69 73 20 6f  finity(). This o
2c10: 6e 65 20 77 6f 72 6b 73 20 6f 6e 20 73 71 6c 69  ne works on sqli
2c20: 74 65 33 5f 76 61 6c 75 65 2a 2c 20 0a 2a 2a 20  te3_value*, .** 
2c30: 6e 6f 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  not the internal
2c40: 20 4d 65 6d 2a 20 74 79 70 65 2e 0a 2a 2f 0a 76   Mem* type..*/.v
2c50: 6f 69 64 20 73 71 6c 69 74 65 33 56 61 6c 75 65  oid sqlite3Value
2c60: 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 0a 20  ApplyAffinity(. 
2c70: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2c80: 70 56 61 6c 2c 20 0a 20 20 75 38 20 61 66 66 69  pVal, .  u8 affi
2c90: 6e 69 74 79 2c 20 0a 20 20 75 38 20 65 6e 63 0a  nity, .  u8 enc.
2ca0: 29 7b 0a 20 20 61 70 70 6c 79 41 66 66 69 6e 69  ){.  applyAffini
2cb0: 74 79 28 28 4d 65 6d 20 2a 29 70 56 61 6c 2c 20  ty((Mem *)pVal, 
2cc0: 61 66 66 69 6e 69 74 79 2c 20 65 6e 63 29 3b 0a  affinity, enc);.
2cd0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2ce0: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 57 72 69  _DEBUG./*.** Wri
2cf0: 74 65 20 61 20 6e 69 63 65 20 73 74 72 69 6e 67  te a nice string
2d00: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2d10: 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  of the contents 
2d20: 6f 66 20 63 65 6c 6c 20 70 4d 65 6d 0a 2a 2a 20  of cell pMem.** 
2d30: 69 6e 74 6f 20 62 75 66 66 65 72 20 7a 42 75 66  into buffer zBuf
2d40: 2c 20 6c 65 6e 67 74 68 20 6e 42 75 66 2e 0a 2a  , length nBuf..*
2d50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
2d60: 62 65 4d 65 6d 50 72 65 74 74 79 50 72 69 6e 74  beMemPrettyPrint
2d70: 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 63 68 61 72  (Mem *pMem, char
2d80: 20 2a 7a 42 75 66 29 7b 0a 20 20 63 68 61 72 20   *zBuf){.  char 
2d90: 2a 7a 43 73 72 20 3d 20 7a 42 75 66 3b 0a 20 20  *zCsr = zBuf;.  
2da0: 69 6e 74 20 66 20 3d 20 70 4d 65 6d 2d 3e 66 6c  int f = pMem->fl
2db0: 61 67 73 3b 0a 0a 20 20 73 74 61 74 69 63 20 63  ags;..  static c
2dc0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
2dd0: 20 65 6e 63 6e 61 6d 65 73 5b 5d 20 3d 20 7b 22   encnames[] = {"
2de0: 28 58 29 22 2c 20 22 28 38 29 22 2c 20 22 28 31  (X)", "(8)", "(1
2df0: 36 4c 45 29 22 2c 20 22 28 31 36 42 45 29 22 7d  6LE)", "(16BE)"}
2e00: 3b 0a 0a 20 20 69 66 28 20 66 26 4d 45 4d 5f 42  ;..  if( f&MEM_B
2e10: 6c 6f 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  lob ){.    int i
2e20: 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20  ;.    char c;.  
2e30: 20 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 44 79    if( f & MEM_Dy
2e40: 6e 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 27  n ){.      c = '
2e50: 7a 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  z';.      assert
2e60: 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74  ( (f & (MEM_Stat
2e70: 69 63 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d  ic|MEM_Ephem))==
2e80: 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  0 );.    }else i
2e90: 66 28 20 66 20 26 20 4d 45 4d 5f 53 74 61 74 69  f( f & MEM_Stati
2ea0: 63 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 27  c ){.      c = '
2eb0: 74 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t';.      assert
2ec0: 28 20 28 66 20 26 20 28 4d 45 4d 5f 44 79 6e 7c  ( (f & (MEM_Dyn|
2ed0: 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20 29  MEM_Ephem))==0 )
2ee0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2ef0: 66 20 26 20 4d 45 4d 5f 45 70 68 65 6d 20 29 7b  f & MEM_Ephem ){
2f00: 0a 20 20 20 20 20 20 63 20 3d 20 27 65 27 3b 0a  .      c = 'e';.
2f10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 66        assert( (f
2f20: 20 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d   & (MEM_Static|M
2f30: 45 4d 5f 44 79 6e 29 29 3d 3d 30 20 29 3b 0a 20  EM_Dyn))==0 );. 
2f40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f50: 63 20 3d 20 27 73 27 3b 0a 20 20 20 20 7d 0a 0a  c = 's';.    }..
2f60: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2f70: 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 20  intf(100, zCsr, 
2f80: 22 25 63 22 2c 20 63 29 3b 0a 20 20 20 20 7a 43  "%c", c);.    zC
2f90: 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  sr += sqlite3Str
2fa0: 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20 20  len30(zCsr);.   
2fb0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2fc0: 66 28 31 30 30 2c 20 7a 43 73 72 2c 20 22 25 64  f(100, zCsr, "%d
2fd0: 5b 22 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20  [", pMem->n);.  
2fe0: 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65    zCsr += sqlite
2ff0: 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b  3Strlen30(zCsr);
3000: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3010: 31 36 20 26 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b  16 && i<pMem->n;
3020: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
3030: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
3040: 30 2c 20 7a 43 73 72 2c 20 22 25 30 32 58 22 2c  0, zCsr, "%02X",
3050: 20 28 28 69 6e 74 29 70 4d 65 6d 2d 3e 7a 5b 69   ((int)pMem->z[i
3060: 5d 20 26 20 30 78 46 46 29 29 3b 0a 20 20 20 20  ] & 0xFF));.    
3070: 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65    zCsr += sqlite
3080: 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b  3Strlen30(zCsr);
3090: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
30a0: 3d 30 3b 20 69 3c 31 36 20 26 26 20 69 3c 70 4d  =0; i<16 && i<pM
30b0: 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  em->n; i++){.   
30c0: 20 20 20 63 68 61 72 20 7a 20 3d 20 70 4d 65 6d     char z = pMem
30d0: 2d 3e 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ->z[i];.      if
30e0: 28 20 7a 3c 33 32 20 7c 7c 20 7a 3e 31 32 36 20  ( z<32 || z>126 
30f0: 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 27 2e 27 3b  ) *zCsr++ = '.';
3100: 0a 20 20 20 20 20 20 65 6c 73 65 20 2a 7a 43 73  .      else *zCs
3110: 72 2b 2b 20 3d 20 7a 3b 0a 20 20 20 20 7d 0a 0a  r++ = z;.    }..
3120: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
3130: 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 20  intf(100, zCsr, 
3140: 22 5d 25 73 22 2c 20 65 6e 63 6e 61 6d 65 73 5b  "]%s", encnames[
3150: 70 4d 65 6d 2d 3e 65 6e 63 5d 29 3b 0a 20 20 20  pMem->enc]);.   
3160: 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33   zCsr += sqlite3
3170: 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a  Strlen30(zCsr);.
3180: 20 20 20 20 69 66 28 20 66 20 26 20 4d 45 4d 5f      if( f & MEM_
3190: 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 73 71  Zero ){.      sq
31a0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
31b0: 30 30 2c 20 7a 43 73 72 2c 22 2b 25 64 7a 22 2c  00, zCsr,"+%dz",
31c0: 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 29 3b 0a  pMem->u.nZero);.
31d0: 20 20 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71        zCsr += sq
31e0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
31f0: 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  sr);.    }.    *
3200: 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  zCsr = '\0';.  }
3210: 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d  else if( f & MEM
3220: 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  _Str ){.    int 
3230: 6a 2c 20 6b 3b 0a 20 20 20 20 7a 42 75 66 5b 30  j, k;.    zBuf[0
3240: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 69 66 28  ] = ' ';.    if(
3250: 20 66 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a   f & MEM_Dyn ){.
3260: 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20        zBuf[1] = 
3270: 27 7a 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72  'z';.      asser
3280: 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61  t( (f & (MEM_Sta
3290: 74 69 63 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d  tic|MEM_Ephem))=
32a0: 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  =0 );.    }else 
32b0: 69 66 28 20 66 20 26 20 4d 45 4d 5f 53 74 61 74  if( f & MEM_Stat
32c0: 69 63 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66  ic ){.      zBuf
32d0: 5b 31 5d 20 3d 20 27 74 27 3b 0a 20 20 20 20 20  [1] = 't';.     
32e0: 20 61 73 73 65 72 74 28 20 28 66 20 26 20 28 4d   assert( (f & (M
32f0: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d  EM_Dyn|MEM_Ephem
3300: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c  ))==0 );.    }el
3310: 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 45  se if( f & MEM_E
3320: 70 68 65 6d 20 29 7b 0a 20 20 20 20 20 20 7a 42  phem ){.      zB
3330: 75 66 5b 31 5d 20 3d 20 27 65 27 3b 0a 20 20 20  uf[1] = 'e';.   
3340: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20     assert( (f & 
3350: 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f  (MEM_Static|MEM_
3360: 44 79 6e 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Dyn))==0 );.    
3370: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 42 75  }else{.      zBu
3380: 66 5b 31 5d 20 3d 20 27 73 27 3b 0a 20 20 20 20  f[1] = 's';.    
3390: 7d 0a 20 20 20 20 6b 20 3d 20 32 3b 0a 20 20 20  }.    k = 2;.   
33a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
33b0: 66 28 31 30 30 2c 20 26 7a 42 75 66 5b 6b 5d 2c  f(100, &zBuf[k],
33c0: 20 22 25 64 22 2c 20 70 4d 65 6d 2d 3e 6e 29 3b   "%d", pMem->n);
33d0: 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65  .    k += sqlite
33e0: 33 53 74 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b  3Strlen30(&zBuf[
33f0: 6b 5d 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b  k]);.    zBuf[k+
3400: 2b 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 20 66 6f  +] = '[';.    fo
3410: 72 28 6a 3d 30 3b 20 6a 3c 31 35 20 26 26 20 6a  r(j=0; j<15 && j
3420: 3c 70 4d 65 6d 2d 3e 6e 3b 20 6a 2b 2b 29 7b 0a  <pMem->n; j++){.
3430: 20 20 20 20 20 20 75 38 20 63 20 3d 20 70 4d 65        u8 c = pMe
3440: 6d 2d 3e 7a 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  m->z[j];.      i
3450: 66 28 20 63 3e 3d 30 78 32 30 20 26 26 20 63 3c  f( c>=0x20 && c<
3460: 30 78 37 66 20 29 7b 0a 20 20 20 20 20 20 20 20  0x7f ){.        
3470: 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 63 3b 0a 20  zBuf[k++] = c;. 
3480: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3490: 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20      zBuf[k++] = 
34a0: 27 2e 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  '.';.      }.   
34b0: 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d   }.    zBuf[k++]
34c0: 20 3d 20 27 5d 27 3b 0a 20 20 20 20 73 71 6c 69   = ']';.    sqli
34d0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30  te3_snprintf(100
34e0: 2c 26 7a 42 75 66 5b 6b 5d 2c 20 65 6e 63 6e 61  ,&zBuf[k], encna
34f0: 6d 65 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d 29 3b  mes[pMem->enc]);
3500: 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65  .    k += sqlite
3510: 33 53 74 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b  3Strlen30(&zBuf[
3520: 6b 5d 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b  k]);.    zBuf[k+
3530: 2b 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  +] = 0;.  }.}.#e
3540: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
3550: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
3560: 50 72 69 6e 74 20 74 68 65 20 76 61 6c 75 65 20  Print the value 
3570: 6f 66 20 61 20 72 65 67 69 73 74 65 72 20 66 6f  of a register fo
3580: 72 20 74 72 61 63 69 6e 67 20 70 75 72 70 6f 73  r tracing purpos
3590: 65 73 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es:.*/.static vo
35a0: 69 64 20 6d 65 6d 54 72 61 63 65 50 72 69 6e 74  id memTracePrint
35b0: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 4d 65 6d 20  (FILE *out, Mem 
35c0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 66 6c  *p){.  if( p->fl
35d0: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
35e0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
35f0: 74 2c 20 22 20 4e 55 4c 4c 22 29 3b 0a 20 20 7d  t, " NULL");.  }
3600: 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 66 6c 61  else if( (p->fla
3610: 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45  gs & (MEM_Int|ME
3620: 4d 5f 53 74 72 29 29 3d 3d 28 4d 45 4d 5f 49 6e  M_Str))==(MEM_In
3630: 74 7c 4d 45 4d 5f 53 74 72 29 20 29 7b 0a 20 20  t|MEM_Str) ){.  
3640: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
3650: 20 73 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e   si:%lld", p->u.
3660: 69 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  i);.  }else if( 
3670: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  p->flags & MEM_I
3680: 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  nt ){.    fprint
3690: 66 28 6f 75 74 2c 20 22 20 69 3a 25 6c 6c 64 22  f(out, " i:%lld"
36a0: 2c 20 70 2d 3e 75 2e 69 29 3b 0a 23 69 66 6e 64  , p->u.i);.#ifnd
36b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
36c0: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
36d0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61  }else if( p->fla
36e0: 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b  gs & MEM_Real ){
36f0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
3700: 2c 20 22 20 72 3a 25 67 22 2c 20 70 2d 3e 72 29  , " r:%g", p->r)
3710: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
3720: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
3730: 4d 45 4d 5f 52 6f 77 53 65 74 20 29 7b 0a 20 20  MEM_RowSet ){.  
3740: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
3750: 20 28 72 6f 77 73 65 74 29 22 29 3b 0a 20 20 7d   (rowset)");.  }
3760: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a  else{.    char z
3770: 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 73 71  Buf[200];.    sq
3780: 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72 65 74  lite3VdbeMemPret
3790: 74 79 50 72 69 6e 74 28 70 2c 20 7a 42 75 66 29  tyPrint(p, zBuf)
37a0: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
37b0: 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 66 70 72  t, " ");.    fpr
37c0: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
37d0: 7a 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  zBuf);.  }.}.sta
37e0: 74 69 63 20 76 6f 69 64 20 72 65 67 69 73 74 65  tic void registe
37f0: 72 54 72 61 63 65 28 46 49 4c 45 20 2a 6f 75 74  rTrace(FILE *out
3800: 2c 20 69 6e 74 20 69 52 65 67 2c 20 4d 65 6d 20  , int iReg, Mem 
3810: 2a 70 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f  *p){.  fprintf(o
3820: 75 74 2c 20 22 52 45 47 5b 25 64 5d 20 3d 20 22  ut, "REG[%d] = "
3830: 2c 20 69 52 65 67 29 3b 0a 20 20 6d 65 6d 54 72  , iReg);.  memTr
3840: 61 63 65 50 72 69 6e 74 28 6f 75 74 2c 20 70 29  acePrint(out, p)
3850: 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
3860: 20 22 5c 6e 22 29 3b 0a 7d 0a 23 65 6e 64 69 66   "\n");.}.#endif
3870: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
3880: 44 45 42 55 47 0a 23 20 20 64 65 66 69 6e 65 20  DEBUG.#  define 
3890: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 52  REGISTER_TRACE(R
38a0: 2c 4d 29 20 69 66 28 70 2d 3e 74 72 61 63 65 29  ,M) if(p->trace)
38b0: 72 65 67 69 73 74 65 72 54 72 61 63 65 28 70 2d  registerTrace(p-
38c0: 3e 74 72 61 63 65 2c 52 2c 4d 29 0a 23 65 6c 73  >trace,R,M).#els
38d0: 65 0a 23 20 20 64 65 66 69 6e 65 20 52 45 47 49  e.#  define REGI
38e0: 53 54 45 52 5f 54 52 41 43 45 28 52 2c 4d 29 0a  STER_TRACE(R,M).
38f0: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20  #endif...#ifdef 
3900: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 0a 2f 2a  VDBE_PROFILE../*
3910: 20 0a 2a 2a 20 68 77 74 69 6d 65 2e 68 20 63 6f   .** hwtime.h co
3920: 6e 74 61 69 6e 73 20 69 6e 6c 69 6e 65 20 61 73  ntains inline as
3930: 73 65 6d 62 6c 65 72 20 63 6f 64 65 20 66 6f 72  sembler code for
3940: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 0a 2a   implementing .*
3950: 2a 20 68 69 67 68 2d 70 65 72 66 6f 72 6d 61 6e  * high-performan
3960: 63 65 20 74 69 6d 69 6e 67 20 72 6f 75 74 69 6e  ce timing routin
3970: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
3980: 22 68 77 74 69 6d 65 2e 68 22 0a 0a 23 65 6e 64  "hwtime.h"..#end
3990: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  if../*.** The CH
39a0: 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52 52 55 50  ECK_FOR_INTERRUP
39b0: 54 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 20  T macro defined 
39c0: 68 65 72 65 20 6c 6f 6f 6b 73 20 74 6f 20 73 65  here looks to se
39d0: 65 20 69 66 20 74 68 65 0a 2a 2a 20 73 71 6c 69  e if the.** sqli
39e0: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 29 20  te3_interrupt() 
39f0: 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e  routine has been
3a00: 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 74 20   called.  If it 
3a10: 68 61 73 20 62 65 65 6e 2c 20 74 68 65 6e 0a 2a  has been, then.*
3a20: 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20  * processing of 
3a30: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
3a40: 20 69 73 20 69 6e 74 65 72 72 75 70 74 65 64 2e   is interrupted.
3a50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72  .**.** This macr
3a60: 6f 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79  o added to every
3a70: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
3a80: 74 20 64 6f 65 73 20 61 20 6a 75 6d 70 20 69 6e  t does a jump in
3a90: 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 69 6d 70   order to.** imp
3aa0: 6c 65 6d 65 6e 74 20 61 20 6c 6f 6f 70 2e 20 20  lement a loop.  
3ab0: 54 68 69 73 20 74 65 73 74 20 75 73 65 64 20 74  This test used t
3ac0: 6f 20 62 65 20 6f 6e 20 65 76 65 72 79 20 73 69  o be on every si
3ad0: 6e 67 6c 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  ngle instruction
3ae0: 2c 0a 2a 2a 20 62 75 74 20 74 68 61 74 20 6d 65  ,.** but that me
3af0: 61 6e 74 20 77 65 20 6d 6f 72 65 20 74 65 73 74  ant we more test
3b00: 69 6e 67 20 74 68 61 74 20 77 65 20 6e 65 65 64  ing that we need
3b10: 65 64 2e 20 20 42 79 20 6f 6e 6c 79 20 74 65 73  ed.  By only tes
3b20: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 66 6c 61 67  ting the.** flag
3b30: 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63   on jump instruc
3b40: 74 69 6f 6e 73 2c 20 77 65 20 67 65 74 20 61 20  tions, we get a 
3b50: 28 73 6d 61 6c 6c 29 20 73 70 65 65 64 20 69 6d  (small) speed im
3b60: 70 72 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 23 64  provement..*/.#d
3b70: 65 66 69 6e 65 20 43 48 45 43 4b 5f 46 4f 52 5f  efine CHECK_FOR_
3b80: 49 4e 54 45 52 52 55 50 54 20 5c 0a 20 20 20 69  INTERRUPT \.   i
3b90: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
3ba0: 72 72 75 70 74 65 64 20 29 20 67 6f 74 6f 20 61  rrupted ) goto a
3bb0: 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 69 6e 74 65  bort_due_to_inte
3bc0: 72 72 75 70 74 3b 0a 0a 0a 23 69 66 6e 64 65 66  rrupt;...#ifndef
3bd0: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68   NDEBUG./*.** Th
3be0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
3bf0: 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  nly called from 
3c00: 77 69 74 68 69 6e 20 61 6e 20 61 73 73 65 72 74  within an assert
3c10: 28 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 49  () expression. I
3c20: 74 0a 2a 2a 20 63 68 65 63 6b 73 20 74 68 61 74  t.** checks that
3c30: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 54 72   the sqlite3.nTr
3c40: 61 6e 73 61 63 74 69 6f 6e 20 76 61 72 69 61 62  ansaction variab
3c50: 6c 65 20 69 73 20 63 6f 72 72 65 63 74 6c 79 20  le is correctly 
3c60: 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 75  set to.** the nu
3c70: 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 74 72 61 6e  mber of non-tran
3c80: 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
3c90: 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  ts currently in 
3ca0: 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
3cb0: 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20  ist starting at 
3cc0: 73 71 6c 69 74 65 33 2e 70 53 61 76 65 70 6f 69  sqlite3.pSavepoi
3cd0: 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 55 73 61 67 65  nt..** .** Usage
3ce0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 73 73 65  :.**.**     asse
3cf0: 72 74 28 20 63 68 65 63 6b 53 61 76 65 70 6f 69  rt( checkSavepoi
3d00: 6e 74 43 6f 75 6e 74 28 64 62 29 20 29 3b 0a 2a  ntCount(db) );.*
3d10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
3d20: 63 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74  ckSavepointCount
3d30: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
3d40: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 53 61   int n = 0;.  Sa
3d50: 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20 20 66 6f  vepoint *p;.  fo
3d60: 72 28 70 3d 64 62 2d 3e 70 53 61 76 65 70 6f 69  r(p=db->pSavepoi
3d70: 6e 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  nt; p; p=p->pNex
3d80: 74 29 20 6e 2b 2b 3b 0a 20 20 61 73 73 65 72 74  t) n++;.  assert
3d90: 28 20 6e 3d 3d 28 64 62 2d 3e 6e 53 61 76 65 70  ( n==(db->nSavep
3da0: 6f 69 6e 74 20 2b 20 64 62 2d 3e 69 73 54 72 61  oint + db->isTra
3db0: 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
3dc0: 74 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  t) );.  return 1
3dd0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
3de0: 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72  * Transfer error
3df0: 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 66 72   message text fr
3e00: 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74  om an sqlite3_vt
3e10: 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74  ab.zErrMsg (text
3e20: 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65   stored.** in me
3e30: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
3e40: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
3e50: 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a  c) into a Vdbe.z
3e60: 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f  ErrMsg (text sto
3e70: 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  red.** in memory
3e80: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
3e90: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e  qlite3DbMalloc).
3ea0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3eb0: 69 6d 70 6f 72 74 56 74 61 62 45 72 72 4d 73 67  importVtabErrMsg
3ec0: 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65  (Vdbe *p, sqlite
3ed0: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
3ee0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3ef0: 70 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33  p->db;.  sqlite3
3f00: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
3f10: 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
3f20: 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62  rMsg = sqlite3Db
3f30: 53 74 72 44 75 70 28 64 62 2c 20 70 56 74 61 62  StrDup(db, pVtab
3f40: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71  ->zErrMsg);.  sq
3f50: 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
3f60: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56  ->zErrMsg);.  pV
3f70: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
3f80: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  ;.}.../*.** Exec
3f90: 75 74 65 20 61 73 20 6d 75 63 68 20 6f 66 20 61  ute as much of a
3fa0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 73   VDBE program as
3fb0: 20 77 65 20 63 61 6e 20 74 68 65 6e 20 72 65 74   we can then ret
3fc0: 75 72 6e 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  urn..**.** sqlit
3fd0: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
3fe0: 29 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  ) must be called
3ff0: 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
4000: 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
4010: 0a 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 70 72  .** close the pr
4020: 6f 67 72 61 6d 20 77 69 74 68 20 61 20 66 69 6e  ogram with a fin
4030: 61 6c 20 4f 50 5f 48 61 6c 74 20 61 6e 64 20 74  al OP_Halt and t
4040: 6f 20 73 65 74 20 75 70 20 74 68 65 20 63 61 6c  o set up the cal
4050: 6c 62 61 63 6b 73 0a 2a 2a 20 61 6e 64 20 74 68  lbacks.** and th
4060: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
4070: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57  pointer..**.** W
4080: 68 65 6e 65 76 65 72 20 61 20 72 6f 77 20 6f 72  henever a row or
4090: 20 72 65 73 75 6c 74 20 64 61 74 61 20 69 73 20   result data is 
40a0: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20  available, this 
40b0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 65 69 74  routine will eit
40c0: 68 65 72 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  her.** invoke th
40d0: 65 20 72 65 73 75 6c 74 20 63 61 6c 6c 62 61 63  e result callbac
40e0: 6b 20 28 69 66 20 74 68 65 72 65 20 69 73 20 6f  k (if there is o
40f0: 6e 65 29 20 6f 72 20 72 65 74 75 72 6e 20 77 69  ne) or return wi
4100: 74 68 0a 2a 2a 20 53 51 4c 49 54 45 5f 52 4f 57  th.** SQLITE_ROW
4110: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 61 74  ..**.** If an at
4120: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
4130: 20 6f 70 65 6e 20 61 20 6c 6f 63 6b 65 64 20 64   open a locked d
4140: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68  atabase, then th
4150: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 69  is routine.** wi
4160: 6c 6c 20 65 69 74 68 65 72 20 69 6e 76 6f 6b 65  ll either invoke
4170: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
4180: 63 6b 20 28 69 66 20 74 68 65 72 65 20 69 73 20  ck (if there is 
4190: 6f 6e 65 29 20 6f 72 20 69 74 20 77 69 6c 6c 0a  one) or it will.
41a0: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
41b0: 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _BUSY..**.** If 
41c0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
41d0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
41e0: 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  e is written to 
41f0: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a  memory obtained.
4200: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ** from sqlite3_
4210: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 2d 3e  malloc() and p->
4220: 7a 45 72 72 4d 73 67 20 69 73 20 6d 61 64 65 20  zErrMsg is made 
4230: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
4240: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 20 54 68 65 20   memory..** The 
4250: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 74  error code is st
4260: 6f 72 65 64 20 69 6e 20 70 2d 3e 72 63 20 61 6e  ored in p->rc an
4270: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
4280: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 52  eturns SQLITE_ER
4290: 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ROR..**.** If th
42a0: 65 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72 20  e callback ever 
42b0: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
42c0: 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 67 72  , then the progr
42d0: 61 6d 20 65 78 69 74 73 0a 2a 2a 20 69 6d 6d 65  am exits.** imme
42e0: 64 69 61 74 65 6c 79 2e 20 20 54 68 65 72 65 20  diately.  There 
42f0: 77 69 6c 6c 20 62 65 20 6e 6f 20 65 72 72 6f 72  will be no error
4300: 20 6d 65 73 73 61 67 65 20 62 75 74 20 74 68 65   message but the
4310: 20 70 2d 3e 72 63 20 66 69 65 6c 64 20 69 73 0a   p->rc field is.
4320: 2a 2a 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  ** set to SQLITE
4330: 5f 41 42 4f 52 54 20 61 6e 64 20 74 68 69 73 20  _ABORT and this 
4340: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
4350: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
4360: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6d 65 6d 6f 72 79  ..**.** A memory
4370: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
4380: 72 20 63 61 75 73 65 73 20 70 2d 3e 72 63 20 74  r causes p->rc t
4390: 6f 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49  o be set to SQLI
43a0: 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 74 68 69  TE_NOMEM and thi
43b0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  s.** routine to 
43c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
43d0: 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ROR..**.** Other
43e0: 20 66 61 74 61 6c 20 65 72 72 6f 72 73 20 72 65   fatal errors re
43f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
4400: 52 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  R..**.** After t
4410: 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
4420: 66 69 6e 69 73 68 65 64 2c 20 73 71 6c 69 74 65  finished, sqlite
4430: 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 29 20  3VdbeFinalize() 
4440: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 73 65  should be.** use
4450: 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68  d to clean up th
4460: 65 20 6d 65 73 73 20 74 68 61 74 20 77 61 73 20  e mess that was 
4470: 6c 65 66 74 20 62 65 68 69 6e 64 2e 0a 2a 2f 0a  left behind..*/.
4480: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 45  int sqlite3VdbeE
4490: 78 65 63 28 0a 20 20 56 64 62 65 20 2a 70 20 20  xec(.  Vdbe *p  
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44b0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
44c0: 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3d 30 3b 20  .){.  int pc=0; 
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 2f 2a 20 54 68 65 20 70 72 6f 67 72 61 6d 20   /* The program 
44f0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4f 70 20  counter */.  Op 
4500: 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 20 20  *aOp = p->aOp;  
4510: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
4520: 6f 66 20 70 2d 3e 61 4f 70 20 2a 2f 0a 20 20 4f  of p->aOp */.  O
4530: 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20  p *pOp;         
4540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4550: 72 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a  rent operation *
4560: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
4570: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 2f  ITE_OK;        /
4580: 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
4590: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  n */.  sqlite3 *
45a0: 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20  db = p->db;     
45b0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
45c0: 65 20 2a 2f 0a 20 20 75 38 20 72 65 73 65 74 53  e */.  u8 resetS
45d0: 63 68 65 6d 61 4f 6e 46 61 75 6c 74 20 3d 20 30  chemaOnFault = 0
45e0: 3b 20 2f 2a 20 52 65 73 65 74 20 73 63 68 65 6d  ; /* Reset schem
45f0: 61 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72  a after an error
4600: 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a   if positive */.
4610: 20 20 75 38 20 65 6e 63 6f 64 69 6e 67 20 3d 20    u8 encoding = 
4620: 45 4e 43 28 64 62 29 3b 20 20 20 20 20 2f 2a 20  ENC(db);     /* 
4630: 54 68 65 20 64 61 74 61 62 61 73 65 20 65 6e 63  The database enc
4640: 6f 64 69 6e 67 20 2a 2f 0a 23 69 66 6e 64 65 66  oding */.#ifndef
4650: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
4660: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20  GRESS_CALLBACK. 
4670: 20 69 6e 74 20 63 68 65 63 6b 50 72 6f 67 72 65   int checkProgre
4680: 73 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ss;         /* T
4690: 72 75 65 20 69 66 20 70 72 6f 67 72 65 73 73 20  rue if progress 
46a0: 63 61 6c 6c 62 61 63 6b 73 20 61 72 65 20 65 6e  callbacks are en
46b0: 61 62 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  abled */.  int n
46c0: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b  ProgressOps = 0;
46d0: 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 73        /* Opcodes
46e0: 20 65 78 65 63 75 74 65 64 20 73 69 6e 63 65 20   executed since 
46f0: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
4700: 6b 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 4d  k. */.#endif.  M
4710: 65 6d 20 2a 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d  em *aMem = p->aM
4720: 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  em;       /* Cop
4730: 79 20 6f 66 20 70 2d 3e 61 4d 65 6d 20 2a 2f 0a  y of p->aMem */.
4740: 20 20 4d 65 6d 20 2a 70 49 6e 31 20 3d 20 30 3b    Mem *pIn1 = 0;
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4760: 31 73 74 20 69 6e 70 75 74 20 6f 70 65 72 61 6e  1st input operan
4770: 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 32  d */.  Mem *pIn2
4780: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
4790: 20 20 2f 2a 20 32 6e 64 20 69 6e 70 75 74 20 6f    /* 2nd input o
47a0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20  perand */.  Mem 
47b0: 2a 70 49 6e 33 20 3d 20 30 3b 20 20 20 20 20 20  *pIn3 = 0;      
47c0: 20 20 20 20 20 20 20 2f 2a 20 33 72 64 20 69 6e         /* 3rd in
47d0: 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  put operand */. 
47e0: 20 4d 65 6d 20 2a 70 4f 75 74 20 3d 20 30 3b 20   Mem *pOut = 0; 
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4800: 75 74 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f  utput operand */
4810: 0a 20 20 69 6e 74 20 69 43 6f 6d 70 61 72 65 20  .  int iCompare 
4820: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
4830: 20 52 65 73 75 6c 74 20 6f 66 20 6c 61 73 74 20   Result of last 
4840: 4f 50 5f 43 6f 6d 70 61 72 65 20 6f 70 65 72 61  OP_Compare opera
4850: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  tion */.  int *a
4860: 50 65 72 6d 75 74 65 20 3d 20 30 3b 20 20 20 20  Permute = 0;    
4870: 20 20 20 20 20 2f 2a 20 50 65 72 6d 75 74 61 74       /* Permutat
4880: 69 6f 6e 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66  ion of columns f
4890: 6f 72 20 4f 50 5f 43 6f 6d 70 61 72 65 20 2a 2f  or OP_Compare */
48a0: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
48b0: 46 49 4c 45 0a 20 20 75 36 34 20 73 74 61 72 74  FILE.  u64 start
48c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
48d0: 20 20 2f 2a 20 43 50 55 20 63 6c 6f 63 6b 20 63    /* CPU clock c
48e0: 6f 75 6e 74 20 61 74 20 73 74 61 72 74 20 6f 66  ount at start of
48f0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
4900: 20 6f 72 69 67 50 63 3b 20 20 20 20 20 20 20 20   origPc;        
4910: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72          /* Progr
4920: 61 6d 20 63 6f 75 6e 74 65 72 20 61 74 20 73 74  am counter at st
4930: 61 72 74 20 6f 66 20 6f 70 63 6f 64 65 20 2a 2f  art of opcode */
4940: 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 2a 2a 20 49  .#endif.  /*** I
4950: 4e 53 45 52 54 20 53 54 41 43 4b 20 55 4e 49 4f  NSERT STACK UNIO
4960: 4e 20 48 45 52 45 20 2a 2a 2a 2f 0a 0a 20 20 61  N HERE ***/..  a
4970: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
4980: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
4990: 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 73  );  /* sqlite3_s
49a0: 74 65 70 28 29 20 76 65 72 69 66 69 65 73 20 74  tep() verifies t
49b0: 68 69 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  his */.  sqlite3
49c0: 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  VdbeEnter(p);.  
49d0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
49e0: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f  E_NOMEM ){.    /
49f0: 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  * This happens i
4a00: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73  f a malloc() ins
4a10: 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ide a call to sq
4a20: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
4a30: 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  t() or.    ** sq
4a40: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
4a50: 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a  t16() failed.  *
4a60: 2f 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65  /.    goto no_me
4a70: 6d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  m;.  }.  assert(
4a80: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
4a90: 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
4aa0: 54 45 5f 42 55 53 59 20 7c 7c 20 28 28 70 2d 3e  TE_BUSY || ((p->
4ab0: 72 63 26 30 78 46 46 29 20 3d 3d 20 53 51 4c 49  rc&0xFF) == SQLI
4ac0: 54 45 5f 4c 4f 43 4b 45 44 29 29 3b 0a 20 20 70  TE_LOCKED));.  p
4ad0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
4ae0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
4af0: 78 70 6c 61 69 6e 3d 3d 30 20 29 3b 0a 20 20 70  xplain==0 );.  p
4b00: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
4b10: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
4b20: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
4b30: 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52   CHECK_FOR_INTER
4b40: 52 55 50 54 3b 0a 20 20 73 71 6c 69 74 65 33 56  RUPT;.  sqlite3V
4b50: 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 70 29  dbeIOTraceSql(p)
4b60: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
4b70: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
4b80: 41 4c 4c 42 41 43 4b 0a 20 20 63 68 65 63 6b 50  ALLBACK.  checkP
4b90: 72 6f 67 72 65 73 73 20 3d 20 64 62 2d 3e 78 50  rogress = db->xP
4ba0: 72 6f 67 72 65 73 73 21 3d 30 3b 0a 23 65 6e 64  rogress!=0;.#end
4bb0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
4bc0: 5f 44 45 42 55 47 0a 20 20 73 71 6c 69 74 65 33  _DEBUG.  sqlite3
4bd0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
4be0: 63 28 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 63  c();.  if( p->pc
4bf0: 3d 3d 30 20 20 26 26 20 28 70 2d 3e 64 62 2d 3e  ==0  && (p->db->
4c00: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
4c10: 64 62 65 4c 69 73 74 69 6e 67 29 21 3d 30 20 29  dbeListing)!=0 )
4c20: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
4c30: 20 70 72 69 6e 74 66 28 22 56 44 42 45 20 50 72   printf("VDBE Pr
4c40: 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67 3a 5c 6e  ogram Listing:\n
4c50: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ");.    sqlite3V
4c60: 64 62 65 50 72 69 6e 74 53 71 6c 28 70 29 3b 0a  dbePrintSql(p);.
4c70: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4c80: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
4c90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
4ca0: 69 6e 74 4f 70 28 73 74 64 6f 75 74 2c 20 69 2c  intOp(stdout, i,
4cb0: 20 26 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 7d   &aOp[i]);.    }
4cc0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e  .  }.  sqlite3En
4cd0: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
4ce0: 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 70 63  .#endif.  for(pc
4cf0: 3d 70 2d 3e 70 63 3b 20 72 63 3d 3d 53 51 4c 49  =p->pc; rc==SQLI
4d00: 54 45 5f 4f 4b 3b 20 70 63 2b 2b 29 7b 0a 20 20  TE_OK; pc++){.  
4d10: 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 30 20    assert( pc>=0 
4d20: 26 26 20 70 63 3c 70 2d 3e 6e 4f 70 20 29 3b 0a  && pc<p->nOp );.
4d30: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
4d40: 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
4d50: 6e 6f 5f 6d 65 6d 3b 0a 23 69 66 64 65 66 20 56  no_mem;.#ifdef V
4d60: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 20 20  DBE_PROFILE.    
4d70: 6f 72 69 67 50 63 20 3d 20 70 63 3b 0a 20 20 20  origPc = pc;.   
4d80: 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
4d90: 48 77 74 69 6d 65 28 29 3b 0a 23 65 6e 64 69 66  Hwtime();.#endif
4da0: 0a 20 20 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b  .    pOp = &aOp[
4db0: 70 63 5d 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c  pc];..    /* Onl
4dc0: 79 20 61 6c 6c 6f 77 20 74 72 61 63 69 6e 67 20  y allow tracing 
4dd0: 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  if SQLITE_DEBUG 
4de0: 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 20  is defined..    
4df0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4e00: 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70  _DEBUG.    if( p
4e10: 2d 3e 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20  ->trace ){.     
4e20: 20 69 66 28 20 70 63 3d 3d 30 20 29 7b 0a 20 20   if( pc==0 ){.  
4e30: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 56 44        printf("VD
4e40: 42 45 20 45 78 65 63 75 74 69 6f 6e 20 54 72 61  BE Execution Tra
4e50: 63 65 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ce:\n");.       
4e60: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
4e70: 74 53 71 6c 28 70 29 3b 0a 20 20 20 20 20 20 7d  tSql(p);.      }
4e80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4e90: 62 65 50 72 69 6e 74 4f 70 28 70 2d 3e 74 72 61  bePrintOp(p->tra
4ea0: 63 65 2c 20 70 63 2c 20 70 4f 70 29 3b 0a 20 20  ce, pc, pOp);.  
4eb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
4ec0: 20 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20   ..    /* Check 
4ed0: 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65  to see if we nee
4ee0: 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
4ef0: 20 69 6e 74 65 72 72 75 70 74 2e 20 20 54 68 69   interrupt.  Thi
4f00: 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 0a 20  s only happens. 
4f10: 20 20 20 2a 2a 20 69 66 20 77 65 20 68 61 76 65     ** if we have
4f20: 20 61 20 73 70 65 63 69 61 6c 20 74 65 73 74 20   a special test 
4f30: 62 75 69 6c 64 2e 0a 20 20 20 20 2a 2f 0a 23 69  build..    */.#i
4f40: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
4f50: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
4f60: 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
4f70: 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
4f80: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f  te3_interrupt_co
4f90: 75 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  unt--;.      if(
4fa0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
4fb0: 70 74 5f 63 6f 75 6e 74 3d 3d 30 20 29 7b 0a 20  pt_count==0 ){. 
4fc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
4fd0: 6e 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20 20  nterrupt(db);.  
4fe0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
4ff0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
5000: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
5010: 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 2f 2a  _CALLBACK.    /*
5020: 20 43 61 6c 6c 20 74 68 65 20 70 72 6f 67 72 65   Call the progre
5030: 73 73 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 69  ss callback if i
5040: 74 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  t is configured 
5050: 61 6e 64 20 74 68 65 20 72 65 71 75 69 72 65 64  and the required
5060: 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2a 20 6f   number.    ** o
5070: 66 20 56 44 42 45 20 6f 70 73 20 68 61 76 65 20  f VDBE ops have 
5080: 62 65 65 6e 20 65 78 65 63 75 74 65 64 20 28 65  been executed (e
5090: 69 74 68 65 72 20 73 69 6e 63 65 20 74 68 69 73  ither since this
50a0: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 0a 20   invocation of. 
50b0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62     ** sqlite3Vdb
50c0: 65 45 78 65 63 28 29 20 6f 72 20 73 69 6e 63 65  eExec() or since
50d0: 20 6c 61 73 74 20 74 69 6d 65 20 74 68 65 20 70   last time the p
50e0: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
50f0: 20 77 61 73 20 63 61 6c 6c 65 64 29 2e 0a 20 20   was called)..  
5100: 20 20 2a 2a 20 49 66 20 74 68 65 20 70 72 6f 67    ** If the prog
5110: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 72 65  ress callback re
5120: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
5130: 65 78 69 74 20 74 68 65 20 76 69 72 74 75 61 6c  exit the virtual
5140: 20 6d 61 63 68 69 6e 65 20 77 69 74 68 0a 20 20   machine with.  
5150: 20 20 2a 2a 20 61 20 72 65 74 75 72 6e 20 63 6f    ** a return co
5160: 64 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 2e  de SQLITE_ABORT.
5170: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
5180: 63 68 65 63 6b 50 72 6f 67 72 65 73 73 20 29 7b  checkProgress ){
5190: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6e  .      if( db->n
51a0: 50 72 6f 67 72 65 73 73 4f 70 73 3d 3d 6e 50 72  ProgressOps==nPr
51b0: 6f 67 72 65 73 73 4f 70 73 20 29 7b 0a 20 20 20  ogressOps ){.   
51c0: 20 20 20 20 20 69 6e 74 20 70 72 63 3b 0a 20 20       int prc;.  
51d0: 20 20 20 20 20 20 70 72 63 20 3d 20 64 62 2d 3e        prc = db->
51e0: 78 50 72 6f 67 72 65 73 73 28 64 62 2d 3e 70 50  xProgress(db->pP
51f0: 72 6f 67 72 65 73 73 41 72 67 29 3b 0a 20 20 20  rogressArg);.   
5200: 20 20 20 20 20 69 66 28 20 70 72 63 21 3d 30 20       if( prc!=0 
5210: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
5220: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
5230: 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
5240: 74 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68 61  to vdbe_error_ha
5250: 6c 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  lt;.        }.  
5260: 20 20 20 20 20 20 6e 50 72 6f 67 72 65 73 73 4f        nProgressO
5270: 70 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ps = 0;.      }.
5280: 20 20 20 20 20 20 6e 50 72 6f 67 72 65 73 73 4f        nProgressO
5290: 70 73 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ps++;.    }.#end
52a0: 69 66 0a 0a 20 20 20 20 2f 2a 20 4f 6e 20 61 6e  if..    /* On an
52b0: 79 20 6f 70 63 6f 64 65 20 77 69 74 68 20 74 68  y opcode with th
52c0: 65 20 22 6f 75 74 32 2d 70 72 65 72 65 6c 61 73  e "out2-prerelas
52d0: 65 22 20 74 61 67 2c 20 66 72 65 65 20 61 6e 79  e" tag, free any
52e0: 0a 20 20 20 20 2a 2a 20 65 78 74 65 72 6e 61 6c  .    ** external
52f0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 75 74   allocations out
5300: 20 6f 66 20 6d 65 6d 5b 70 32 5d 20 61 6e 64 20   of mem[p2] and 
5310: 73 65 74 20 6d 65 6d 5b 70 32 5d 20 74 6f 20 62  set mem[p2] to b
5320: 65 0a 20 20 20 20 2a 2a 20 61 6e 20 75 6e 64 65  e.    ** an unde
5330: 66 69 6e 65 64 20 69 6e 74 65 67 65 72 2e 20 20  fined integer.  
5340: 4f 70 63 6f 64 65 73 20 77 69 6c 6c 20 65 69 74  Opcodes will eit
5350: 68 65 72 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  her fill in the 
5360: 69 6e 74 65 67 65 72 0a 20 20 20 20 2a 2a 20 76  integer.    ** v
5370: 61 6c 75 65 20 6f 72 20 63 6f 6e 76 65 72 74 20  alue or convert 
5380: 6d 65 6d 5b 70 32 5d 20 74 6f 20 61 20 64 69 66  mem[p2] to a dif
5390: 66 65 72 65 6e 74 20 74 79 70 65 2e 0a 20 20 20  ferent type..   
53a0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
53b0: 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 3d 3d 73 71  pOp->opflags==sq
53c0: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
53d0: 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d  rty[pOp->opcode]
53e0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d   );.    if( pOp-
53f0: 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47  >opflags & OPFLG
5400: 5f 4f 55 54 32 5f 50 52 45 52 45 4c 45 41 53 45  _OUT2_PRERELEASE
5410: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
5420: 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20  ( pOp->p2>0 );. 
5430: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
5440: 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b  ->p2<=p->nMem );
5450: 0a 20 20 20 20 20 20 70 4f 75 74 20 3d 20 26 61  .      pOut = &a
5460: 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
5470: 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68      memAboutToCh
5480: 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20  ange(p, pOut);. 
5490: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
54a0: 4d 65 6d 52 65 6c 65 61 73 65 45 78 74 65 72 6e  MemReleaseExtern
54b0: 61 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20  al(pOut);.      
54c0: 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
54d0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  M_Int;.    }..  
54e0: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
54f0: 6b 69 6e 67 20 6f 6e 20 6f 74 68 65 72 20 6f 70  king on other op
5500: 65 72 61 6e 64 73 20 2a 2f 0a 23 69 66 64 65 66  erands */.#ifdef
5510: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
5520: 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c    if( (pOp->opfl
5530: 61 67 73 20 26 20 4f 50 46 4c 47 5f 49 4e 31 29  ags & OPFLG_IN1)
5540: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
5550: 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 29  ert( pOp->p1>0 )
5560: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
5570: 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p1<=p->nMem
5580: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
5590: 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d  ( memIsValid(&aM
55a0: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20 29 3b 0a  em[pOp->p1]) );.
55b0: 20 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54        REGISTER_T
55c0: 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 26 61  RACE(pOp->p1, &a
55d0: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 3b 0a 20  Mem[pOp->p1]);. 
55e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 4f     }.    if( (pO
55f0: 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46  p->opflags & OPF
5600: 4c 47 5f 49 4e 32 29 21 3d 30 20 29 7b 0a 20 20  LG_IN2)!=0 ){.  
5610: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
5620: 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  >p2>0 );.      a
5630: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d  ssert( pOp->p2<=
5640: 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20  p->nMem );.     
5650: 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
5660: 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  lid(&aMem[pOp->p
5670: 32 5d 29 20 29 3b 0a 20 20 20 20 20 20 52 45 47  2]) );.      REG
5680: 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
5690: 3e 70 32 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  >p2, &aMem[pOp->
56a0: 70 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p2]);.    }.    
56b0: 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67  if( (pOp->opflag
56c0: 73 20 26 20 4f 50 46 4c 47 5f 49 4e 33 29 21 3d  s & OPFLG_IN3)!=
56d0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
56e0: 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a  t( pOp->p3>0 );.
56f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
5700: 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29  p->p3<=p->nMem )
5710: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
5720: 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d  memIsValid(&aMem
5730: 5b 70 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a 20 20  [pOp->p3]) );.  
5740: 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
5750: 43 45 28 70 4f 70 2d 3e 70 33 2c 20 26 61 4d 65  CE(pOp->p3, &aMe
5760: 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20  m[pOp->p3]);.   
5770: 20 7d 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d   }.    if( (pOp-
5780: 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47  >opflags & OPFLG
5790: 5f 4f 55 54 32 29 21 3d 30 20 29 7b 0a 20 20 20  _OUT2)!=0 ){.   
57a0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
57b0: 70 32 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  p2>0 );.      as
57c0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 70  sert( pOp->p2<=p
57d0: 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20  ->nMem );.      
57e0: 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
57f0: 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  (p, &aMem[pOp->p
5800: 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  2]);.    }.    i
5810: 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73  f( (pOp->opflags
5820: 20 26 20 4f 50 46 4c 47 5f 4f 55 54 33 29 21 3d   & OPFLG_OUT3)!=
5830: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
5840: 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a  t( pOp->p3>0 );.
5850: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
5860: 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29  p->p3<=p->nMem )
5870: 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74  ;.      memAbout
5880: 54 6f 43 68 61 6e 67 65 28 70 2c 20 26 61 4d 65  ToChange(p, &aMe
5890: 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20  m[pOp->p3]);.   
58a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20   }.#endif.  .   
58b0: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70   switch( pOp->op
58c0: 63 6f 64 65 20 29 7b 0a 0a 2f 2a 2a 2a 2a 2a 2a  code ){../******
58d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
58e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
58f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5910: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 57 68 61 74 20  *******.** What 
5920: 66 6f 6c 6c 6f 77 73 20 69 73 20 61 20 6d 61 73  follows is a mas
5930: 73 69 76 65 20 73 77 69 74 63 68 20 73 74 61 74  sive switch stat
5940: 65 6d 65 6e 74 20 77 68 65 72 65 20 65 61 63 68  ement where each
5950: 20 63 61 73 65 20 69 6d 70 6c 65 6d 65 6e 74 73   case implements
5960: 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69   a.** separate i
5970: 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
5980: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
5990: 65 2e 20 20 49 66 20 77 65 20 66 6f 6c 6c 6f 77  e.  If we follow
59a0: 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 69 6e   the usual.** in
59b0: 64 65 6e 74 61 74 69 6f 6e 20 63 6f 6e 76 65 6e  dentation conven
59c0: 74 69 6f 6e 73 2c 20 65 61 63 68 20 63 61 73 65  tions, each case
59d0: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e   should be inden
59e0: 74 65 64 20 62 79 20 36 20 73 70 61 63 65 73 2e  ted by 6 spaces.
59f0: 20 20 42 75 74 0a 2a 2a 20 74 68 61 74 20 69 73    But.** that is
5a00: 20 61 20 6c 6f 74 20 6f 66 20 77 61 73 74 65 64   a lot of wasted
5a10: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 6c 65   space on the le
5a20: 66 74 20 6d 61 72 67 69 6e 2e 20 20 53 6f 20 74  ft margin.  So t
5a30: 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 0a 2a  he code within.*
5a40: 2a 20 74 68 65 20 73 77 69 74 63 68 20 73 74 61  * the switch sta
5a50: 74 65 6d 65 6e 74 20 77 69 6c 6c 20 62 72 65 61  tement will brea
5a60: 6b 20 77 69 74 68 20 63 6f 6e 76 65 6e 74 69 6f  k with conventio
5a70: 6e 20 61 6e 64 20 62 65 20 66 6c 75 73 68 2d 6c  n and be flush-l
5a80: 65 66 74 2e 20 41 6e 6f 74 68 65 72 0a 2a 2a 20  eft. Another.** 
5a90: 62 69 67 20 63 6f 6d 6d 65 6e 74 20 28 73 69 6d  big comment (sim
5aa0: 69 6c 61 72 20 74 6f 20 74 68 69 73 20 6f 6e 65  ilar to this one
5ab0: 29 20 77 69 6c 6c 20 6d 61 72 6b 20 74 68 65 20  ) will mark the 
5ac0: 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
5ad0: 65 20 77 68 65 72 65 0a 2a 2a 20 77 65 20 74 72  e where.** we tr
5ae0: 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b 20 74 6f  ansition back to
5af0: 20 6e 6f 72 6d 61 6c 20 69 6e 64 65 6e 74 61 74   normal indentat
5b00: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
5b10: 6f 72 6d 61 74 74 69 6e 67 20 6f 66 20 65 61 63  ormatting of eac
5b20: 68 20 63 61 73 65 20 69 73 20 69 6d 70 6f 72 74  h case is import
5b30: 61 6e 74 2e 20 20 54 68 65 20 6d 61 6b 65 66 69  ant.  The makefi
5b40: 6c 65 20 66 6f 72 20 53 51 4c 69 74 65 0a 2a 2a  le for SQLite.**
5b50: 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20 43   generates two C
5b60: 20 66 69 6c 65 73 20 22 6f 70 63 6f 64 65 73 2e   files "opcodes.
5b70: 68 22 20 61 6e 64 20 22 6f 70 63 6f 64 65 73 2e  h" and "opcodes.
5b80: 63 22 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74  c" by scanning t
5b90: 68 69 73 0a 2a 2a 20 66 69 6c 65 20 6c 6f 6f 6b  his.** file look
5ba0: 69 6e 67 20 66 6f 72 20 6c 69 6e 65 73 20 74 68  ing for lines th
5bb0: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 22 63  at begin with "c
5bc0: 61 73 65 20 4f 50 5f 22 2e 20 20 54 68 65 20 6f  ase OP_".  The o
5bd0: 70 63 6f 64 65 73 2e 68 20 66 69 6c 65 73 0a 2a  pcodes.h files.*
5be0: 2a 20 77 69 6c 6c 20 62 65 20 66 69 6c 6c 65 64  * will be filled
5bf0: 20 77 69 74 68 20 23 64 65 66 69 6e 65 73 20 74   with #defines t
5c00: 68 61 74 20 67 69 76 65 20 75 6e 69 71 75 65 20  hat give unique 
5c10: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 74  integer values t
5c20: 6f 20 65 61 63 68 0a 2a 2a 20 6f 70 63 6f 64 65  o each.** opcode
5c30: 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 73   and the opcodes
5c40: 2e 63 20 66 69 6c 65 20 69 73 20 66 69 6c 6c 65  .c file is fille
5c50: 64 20 77 69 74 68 20 61 6e 20 61 72 72 61 79 20  d with an array 
5c60: 6f 66 20 73 74 72 69 6e 67 73 20 77 68 65 72 65  of strings where
5c70: 0a 2a 2a 20 65 61 63 68 20 73 74 72 69 6e 67 20  .** each string 
5c80: 69 73 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20  is the symbolic 
5c90: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 72  name for the cor
5ca0: 72 65 73 70 6f 6e 64 69 6e 67 20 6f 70 63 6f 64  responding opcod
5cb0: 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 61  e.  If the.** ca
5cc0: 73 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  se statement is 
5cd0: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 63 6f  followed by a co
5ce0: 6d 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 72  mment of the for
5cf0: 6d 20 22 2f 23 20 73 61 6d 65 20 61 73 20 2e 2e  m "/# same as ..
5d00: 2e 20 23 2f 22 0a 2a 2a 20 74 68 61 74 20 63 6f  . #/".** that co
5d10: 6d 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f  mment is used to
5d20: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70   determine the p
5d30: 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20  articular value 
5d40: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a  of the opcode..*
5d50: 2a 0a 2a 2a 20 4f 74 68 65 72 20 6b 65 79 77 6f  *.** Other keywo
5d60: 72 64 73 20 69 6e 20 74 68 65 20 63 6f 6d 6d 65  rds in the comme
5d70: 6e 74 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  nt that follows 
5d80: 65 61 63 68 20 63 61 73 65 20 61 72 65 20 75 73  each case are us
5d90: 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e 73 74 72 75  ed to.** constru
5da0: 63 74 20 74 68 65 20 4f 50 46 4c 47 5f 49 4e 49  ct the OPFLG_INI
5db0: 54 49 41 4c 49 5a 45 52 20 76 61 6c 75 65 20 74  TIALIZER value t
5dc0: 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  hat initializes 
5dd0: 6f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 5d  opcodeProperty[]
5de0: 2e 0a 2a 2a 20 4b 65 79 77 6f 72 64 73 20 69 6e  ..** Keywords in
5df0: 63 6c 75 64 65 3a 20 69 6e 31 2c 20 69 6e 32 2c  clude: in1, in2,
5e00: 20 69 6e 33 2c 20 6f 75 74 32 5f 70 72 65 72 65   in3, out2_prere
5e10: 6c 65 61 73 65 2c 20 6f 75 74 32 2c 20 6f 75 74  lease, out2, out
5e20: 33 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 6d  3.  See.** the m
5e30: 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
5e40: 69 70 74 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ipt for addition
5e50: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
5e60: 2a 2a 0a 2a 2a 20 44 6f 63 75 6d 65 6e 74 61 74  **.** Documentat
5e70: 69 6f 6e 20 61 62 6f 75 74 20 56 44 42 45 20 6f  ion about VDBE o
5e80: 70 63 6f 64 65 73 20 69 73 20 67 65 6e 65 72 61  pcodes is genera
5e90: 74 65 64 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  ted by scanning 
5ea0: 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20 66 6f 72  this file.** for
5eb0: 20 6c 69 6e 65 73 20 6f 66 20 74 68 61 74 20 63   lines of that c
5ec0: 6f 6e 74 61 69 6e 20 22 4f 70 63 6f 64 65 3a 22  ontain "Opcode:"
5ed0: 2e 20 20 54 68 61 74 20 6c 69 6e 65 20 61 6e 64  .  That line and
5ee0: 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
5ef0: 2a 2a 20 63 6f 6d 6d 65 6e 74 20 6c 69 6e 65 73  ** comment lines
5f00: 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 65   are used in the
5f10: 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74   generation of t
5f20: 68 65 20 6f 70 63 6f 64 65 2e 68 74 6d 6c 20 64  he opcode.html d
5f30: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  ocumentation.** 
5f40: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 55 4d 4d  file..**.** SUMM
5f50: 41 52 59 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 46  ARY:.**.**     F
5f60: 6f 72 6d 61 74 74 69 6e 67 20 69 73 20 69 6d 70  ormatting is imp
5f70: 6f 72 74 61 6e 74 20 74 6f 20 73 63 72 69 70 74  ortant to script
5f80: 73 20 74 68 61 74 20 73 63 61 6e 20 74 68 69 73  s that scan this
5f90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 44 6f   file..**     Do
5fa0: 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72 6f   not deviate fro
5fb0: 6d 20 74 68 65 20 66 6f 72 6d 61 74 74 69 6e 67  m the formatting
5fc0: 20 73 74 79 6c 65 20 63 75 72 72 65 6e 74 6c 79   style currently
5fd0: 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 2a 2a   in use..**.****
5fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 4f  *********/../* O
6030: 70 63 6f 64 65 3a 20 20 47 6f 74 6f 20 2a 20 50  pcode:  Goto * P
6040: 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 6e  2 * * *.**.** An
6050: 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a   unconditional j
6060: 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73 20 50  ump to address P
6070: 32 2e 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 69  2..** The next i
6080: 6e 73 74 72 75 63 74 69 6f 6e 20 65 78 65 63 75  nstruction execu
6090: 74 65 64 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20  ted will be .** 
60a0: 74 68 65 20 6f 6e 65 20 61 74 20 69 6e 64 65 78  the one at index
60b0: 20 50 32 20 66 72 6f 6d 20 74 68 65 20 62 65 67   P2 from the beg
60c0: 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
60d0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 63 61 73   program..*/.cas
60e0: 65 20 4f 50 5f 47 6f 74 6f 3a 20 7b 20 20 20 20  e OP_Goto: {    
60f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
6100: 20 2a 2f 0a 20 20 43 48 45 43 4b 5f 46 4f 52 5f   */.  CHECK_FOR_
6110: 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 70 63 20  INTERRUPT;.  pc 
6120: 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
6130: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
6140: 63 6f 64 65 3a 20 20 47 6f 73 75 62 20 50 31 20  code:  Gosub P1 
6150: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57  P2 * * *.**.** W
6160: 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
6170: 20 61 64 64 72 65 73 73 20 6f 6e 74 6f 20 72 65   address onto re
6180: 67 69 73 74 65 72 20 50 31 0a 2a 2a 20 61 6e 64  gister P1.** and
6190: 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 61 64   then jump to ad
61a0: 64 72 65 73 73 20 50 32 2e 0a 2a 2f 0a 63 61 73  dress P2..*/.cas
61b0: 65 20 4f 50 5f 47 6f 73 75 62 3a 20 7b 20 20 20  e OP_Gosub: {   
61c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
61d0: 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  , in1 */.  pIn1 
61e0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
61f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 6e  ;.  assert( (pIn
6200: 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  1->flags & MEM_D
6210: 79 6e 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 41  yn)==0 );.  memA
6220: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
6230: 70 49 6e 31 29 3b 0a 20 20 70 49 6e 31 2d 3e 66  pIn1);.  pIn1->f
6240: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
6250: 20 20 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 70 63    pIn1->u.i = pc
6260: 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41  ;.  REGISTER_TRA
6270: 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70 49 6e 31  CE(pOp->p1, pIn1
6280: 29 3b 0a 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70  );.  pc = pOp->p
6290: 32 20 2d 20 31 3b 0a 20 20 62 72 65 61 6b 3b 0a  2 - 1;.  break;.
62a0: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 52  }../* Opcode:  R
62b0: 65 74 75 72 6e 20 50 31 20 2a 20 2a 20 2a 20 2a  eturn P1 * * * *
62c0: 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 74  .**.** Jump to t
62d0: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
62e0: 69 6f 6e 20 61 66 74 65 72 20 74 68 65 20 61 64  ion after the ad
62f0: 64 72 65 73 73 20 69 6e 20 72 65 67 69 73 74 65  dress in registe
6300: 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  r P1..*/.case OP
6310: 5f 52 65 74 75 72 6e 3a 20 7b 20 20 20 20 20 20  _Return: {      
6320: 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20       /* in1 */. 
6330: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
6340: 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
6350: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20  ( pIn1->flags & 
6360: 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 70 63 20  MEM_Int );.  pc 
6370: 3d 20 28 69 6e 74 29 70 49 6e 31 2d 3e 75 2e 69  = (int)pIn1->u.i
6380: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
6390: 20 4f 70 63 6f 64 65 3a 20 20 59 69 65 6c 64 20   Opcode:  Yield 
63a0: 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  P1 * * * *.**.**
63b0: 20 53 77 61 70 20 74 68 65 20 70 72 6f 67 72 61   Swap the progra
63c0: 6d 20 63 6f 75 6e 74 65 72 20 77 69 74 68 20 74  m counter with t
63d0: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
63e0: 73 74 65 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65  ster P1..*/.case
63f0: 20 4f 50 5f 59 69 65 6c 64 3a 20 7b 20 20 20 20   OP_Yield: {    
6400: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a          /* in1 *
6410: 2f 0a 20 20 69 6e 74 20 70 63 44 65 73 74 3b 0a  /.  int pcDest;.
6420: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
6430: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
6440: 74 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  t( (pIn1->flags 
6450: 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d 30 20 29 3b  & MEM_Dyn)==0 );
6460: 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d  .  pIn1->flags =
6470: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 70 63 44 65   MEM_Int;.  pcDe
6480: 73 74 20 3d 20 28 69 6e 74 29 70 49 6e 31 2d 3e  st = (int)pIn1->
6490: 75 2e 69 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69  u.i;.  pIn1->u.i
64a0: 20 3d 20 70 63 3b 0a 20 20 52 45 47 49 53 54 45   = pc;.  REGISTE
64b0: 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c  R_TRACE(pOp->p1,
64c0: 20 70 49 6e 31 29 3b 0a 20 20 70 63 20 3d 20 70   pIn1);.  pc = p
64d0: 63 44 65 73 74 3b 0a 20 20 62 72 65 61 6b 3b 0a  cDest;.  break;.
64e0: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 48  }../* Opcode:  H
64f0: 61 6c 74 49 66 4e 75 6c 6c 20 20 50 31 20 50 32  altIfNull  P1 P2
6500: 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 43   P3 P4 *.**.** C
6510: 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65 20 69  heck the value i
6520: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 20 20  n register P3.  
6530: 49 66 20 69 73 20 69 73 20 4e 55 4c 4c 20 74 68  If is is NULL th
6540: 65 6e 20 48 61 6c 74 20 75 73 69 6e 67 0a 2a 2a  en Halt using.**
6550: 20 70 61 72 61 6d 65 74 65 72 20 50 31 2c 20 50   parameter P1, P
6560: 32 2c 20 61 6e 64 20 50 34 20 61 73 20 69 66 20  2, and P4 as if 
6570: 74 68 69 73 20 77 65 72 65 20 61 20 48 61 6c 74  this were a Halt
6580: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49   instruction.  I
6590: 66 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69  f the.** value i
65a0: 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73  n register P3 is
65b0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
65c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
65d0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63 61 73 65  a no-op..*/.case
65e0: 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 3a 20   OP_HaltIfNull: 
65f0: 7b 20 20 20 20 20 20 2f 2a 20 69 6e 33 20 2a 2f  {      /* in3 */
6600: 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b  .  pIn3 = &aMem[
6610: 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20  pOp->p3];.  if( 
6620: 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn3->flags & M
6630: 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 20 62 72  EM_Null)==0 ) br
6640: 65 61 6b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74  eak;.  /* Fall t
6650: 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 48  hrough into OP_H
6660: 61 6c 74 20 2a 2f 0a 7d 0a 0a 2f 2a 20 4f 70 63  alt */.}../* Opc
6670: 6f 64 65 3a 20 20 48 61 6c 74 20 50 31 20 50 32  ode:  Halt P1 P2
6680: 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 45 78   * P4 *.**.** Ex
6690: 69 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  it immediately. 
66a0: 20 41 6c 6c 20 6f 70 65 6e 20 63 75 72 73 6f 72   All open cursor
66b0: 73 2c 20 65 74 63 20 61 72 65 20 63 6c 6f 73 65  s, etc are close
66c0: 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
66d0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20  ly..**.** P1 is 
66e0: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20  the result code 
66f0: 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
6700: 74 65 33 5f 65 78 65 63 28 29 2c 20 73 71 6c 69  te3_exec(), sqli
6710: 74 65 33 5f 72 65 73 65 74 28 29 2c 0a 2a 2a 20  te3_reset(),.** 
6720: 6f 72 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  or sqlite3_final
6730: 69 7a 65 28 29 2e 20 20 46 6f 72 20 61 20 6e 6f  ize().  For a no
6740: 72 6d 61 6c 20 68 61 6c 74 2c 20 74 68 69 73 20  rmal halt, this 
6750: 73 68 6f 75 6c 64 20 62 65 20 53 51 4c 49 54 45  should be SQLITE
6760: 5f 4f 4b 20 28 30 29 2e 0a 2a 2a 20 46 6f 72 20  _OK (0)..** For 
6770: 65 72 72 6f 72 73 2c 20 69 74 20 63 61 6e 20 62  errors, it can b
6780: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 76 61 6c  e some other val
6790: 75 65 2e 20 20 49 66 20 50 31 21 3d 30 20 74 68  ue.  If P1!=0 th
67a0: 65 6e 20 50 32 20 77 69 6c 6c 20 64 65 74 65 72  en P2 will deter
67b0: 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20  mine.** whether 
67c0: 6f 72 20 6e 6f 74 20 74 6f 20 72 6f 6c 6c 62 61  or not to rollba
67d0: 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ck the current t
67e0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 44 6f 20  ransaction.  Do 
67f0: 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  not rollback.** 
6800: 69 66 20 50 32 3d 3d 4f 45 5f 46 61 69 6c 2e 20  if P2==OE_Fail. 
6810: 44 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  Do the rollback 
6820: 69 66 20 50 32 3d 3d 4f 45 5f 52 6f 6c 6c 62 61  if P2==OE_Rollba
6830: 63 6b 2e 20 20 49 66 20 50 32 3d 3d 4f 45 5f 41  ck.  If P2==OE_A
6840: 62 6f 72 74 2c 0a 2a 2a 20 74 68 65 6e 20 62 61  bort,.** then ba
6850: 63 6b 20 6f 75 74 20 61 6c 6c 20 63 68 61 6e 67  ck out all chang
6860: 65 73 20 74 68 61 74 20 68 61 76 65 20 6f 63 63  es that have occ
6870: 75 72 72 65 64 20 64 75 72 69 6e 67 20 74 68 69  urred during thi
6880: 73 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  s execution of t
6890: 68 65 0a 2a 2a 20 56 44 42 45 2c 20 62 75 74 20  he.** VDBE, but 
68a0: 64 6f 20 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20  do not rollback 
68b0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
68c0: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73   .**.** If P4 is
68d0: 20 6e 6f 74 20 6e 75 6c 6c 20 74 68 65 6e 20 69   not null then i
68e0: 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  t is an error me
68f0: 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a 2a 2a  ssage string..**
6900: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6e 20  .** There is an 
6910: 69 6d 70 6c 69 65 64 20 22 48 61 6c 74 20 30 20  implied "Halt 0 
6920: 30 20 30 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  0 0" instruction
6930: 20 69 6e 73 65 72 74 65 64 20 61 74 20 74 68 65   inserted at the
6940: 20 76 65 72 79 20 65 6e 64 20 6f 66 0a 2a 2a 20   very end of.** 
6950: 65 76 65 72 79 20 70 72 6f 67 72 61 6d 2e 20 20  every program.  
6960: 53 6f 20 61 20 6a 75 6d 70 20 70 61 73 74 20 74  So a jump past t
6970: 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74  he last instruct
6980: 69 6f 6e 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ion of the progr
6990: 61 6d 0a 2a 2a 20 69 73 20 74 68 65 20 73 61 6d  am.** is the sam
69a0: 65 20 61 73 20 65 78 65 63 75 74 69 6e 67 20 48  e as executing H
69b0: 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  alt..*/.case OP_
69c0: 48 61 6c 74 3a 20 7b 0a 20 20 69 66 28 20 70 4f  Halt: {.  if( pO
69d0: 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->p1==SQLITE_OK
69e0: 20 26 26 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b   && p->pFrame ){
69f0: 0a 20 20 20 20 2f 2a 20 48 61 6c 74 20 74 68 65  .    /* Halt the
6a00: 20 73 75 62 2d 70 72 6f 67 72 61 6d 2e 20 52 65   sub-program. Re
6a10: 74 75 72 6e 20 63 6f 6e 74 72 6f 6c 20 74 6f 20  turn control to 
6a20: 74 68 65 20 70 61 72 65 6e 74 20 66 72 61 6d 65  the parent frame
6a30: 2e 20 2a 2f 0a 20 20 20 20 56 64 62 65 46 72 61  . */.    VdbeFra
6a40: 6d 65 20 2a 70 46 72 61 6d 65 20 3d 20 70 2d 3e  me *pFrame = p->
6a50: 70 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70  pFrame;.    p->p
6a60: 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 2d 3e  Frame = pFrame->
6a70: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 2d 3e  pParent;.    p->
6a80: 6e 46 72 61 6d 65 2d 2d 3b 0a 20 20 20 20 73 71  nFrame--;.    sq
6a90: 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
6aa0: 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
6ab0: 67 65 29 3b 0a 20 20 20 20 70 63 20 3d 20 73 71  ge);.    pc = sq
6ac0: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
6ad0: 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20  store(pFrame);. 
6ae0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d     if( pOp->p2==
6af0: 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  OE_Ignore ){.   
6b00: 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f     /* Instructio
6b10: 6e 20 70 63 20 69 73 20 74 68 65 20 4f 50 5f 50  n pc is the OP_P
6b20: 72 6f 67 72 61 6d 20 74 68 61 74 20 69 6e 76 6f  rogram that invo
6b30: 6b 65 64 20 74 68 65 20 73 75 62 2d 70 72 6f 67  ked the sub-prog
6b40: 72 61 6d 20 0a 20 20 20 20 20 20 2a 2a 20 63 75  ram .      ** cu
6b50: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 68 61  rrently being ha
6b60: 6c 74 65 64 2e 20 49 66 20 74 68 65 20 70 32 20  lted. If the p2 
6b70: 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74  instruction of t
6b80: 68 69 73 20 4f 50 5f 48 61 6c 74 0a 20 20 20 20  his OP_Halt.    
6b90: 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
6ba0: 20 69 73 20 73 65 74 20 74 6f 20 4f 45 5f 49 67   is set to OE_Ig
6bb0: 6e 6f 72 65 2c 20 74 68 65 6e 20 74 68 65 20 73  nore, then the s
6bc0: 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 74 68  ub-program is th
6bd0: 72 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  rowing.      ** 
6be0: 61 6e 20 49 47 4e 4f 52 45 20 65 78 63 65 70 74  an IGNORE except
6bf0: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
6c00: 65 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 61 64  e jump to the ad
6c10: 64 72 65 73 73 20 73 70 65 63 69 66 69 65 64 0a  dress specified.
6c20: 20 20 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20        ** as the 
6c30: 70 32 20 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e  p2 of the callin
6c40: 67 20 4f 50 5f 50 72 6f 67 72 61 6d 2e 20 20 2a  g OP_Program.  *
6c50: 2f 0a 20 20 20 20 20 20 70 63 20 3d 20 70 2d 3e  /.      pc = p->
6c60: 61 4f 70 5b 70 63 5d 2e 70 32 2d 31 3b 0a 20 20  aOp[pc].p2-1;.  
6c70: 20 20 7d 0a 20 20 20 20 61 4f 70 20 3d 20 70 2d    }.    aOp = p-
6c80: 3e 61 4f 70 3b 0a 20 20 20 20 61 4d 65 6d 20 3d  >aOp;.    aMem =
6c90: 20 70 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 62 72   p->aMem;.    br
6ca0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72  eak;.  }..  p->r
6cb0: 63 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70  c = pOp->p1;.  p
6cc0: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
6cd0: 28 75 38 29 70 4f 70 2d 3e 70 32 3b 0a 20 20 70  (u8)pOp->p2;.  p
6ce0: 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20 69 66 28  ->pc = pc;.  if(
6cf0: 20 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20   pOp->p4.z ){.  
6d00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
6d10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
6d20: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
6d30: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
6d40: 64 62 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70  db, "%s", pOp->p
6d50: 34 2e 7a 29 3b 0a 20 20 20 20 74 65 73 74 63 61  4.z);.    testca
6d60: 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
6d70: 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
6d80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  );.    sqlite3_l
6d90: 6f 67 28 70 4f 70 2d 3e 70 31 2c 20 22 61 62 6f  og(pOp->p1, "abo
6da0: 72 74 20 61 74 20 25 64 20 69 6e 20 5b 25 73 5d  rt at %d in [%s]
6db0: 3a 20 25 73 22 2c 20 70 63 2c 20 70 2d 3e 7a 53  : %s", pc, p->zS
6dc0: 71 6c 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  ql, pOp->p4.z);.
6dd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72    }else if( p->r
6de0: 63 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  c ){.    testcas
6df0: 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
6e00: 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
6e10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  ;.    sqlite3_lo
6e20: 67 28 70 4f 70 2d 3e 70 31 2c 20 22 63 6f 6e 73  g(pOp->p1, "cons
6e30: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 20 61 74  traint failed at
6e40: 20 25 64 20 69 6e 20 5b 25 73 5d 22 2c 20 70 63   %d in [%s]", pc
6e50: 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d 0a  , p->zSql);.  }.
6e60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
6e70: 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 61 73 73  beHalt(p);.  ass
6e80: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
6e90: 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  BUSY || rc==SQLI
6ea0: 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
6eb0: 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69  ITE_ERROR );.  i
6ec0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
6ed0: 53 59 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  SY ){.    p->rc 
6ee0: 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55  = rc = SQLITE_BU
6ef0: 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SY;.  }else{.   
6f00: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
6f10: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
6f20: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
6f30: 4e 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  NT );.    assert
6f40: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6f50: 7c 7c 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  || db->nDeferred
6f60: 43 6f 6e 73 3e 30 20 29 3b 0a 20 20 20 20 72 63  Cons>0 );.    rc
6f70: 20 3d 20 70 2d 3e 72 63 20 3f 20 53 51 4c 49 54   = p->rc ? SQLIT
6f80: 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45  E_ERROR : SQLITE
6f90: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 67 6f 74  _DONE;.  }.  got
6fa0: 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 7d  o vdbe_return;.}
6fb0: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74  ../* Opcode: Int
6fc0: 65 67 65 72 20 50 31 20 50 32 20 2a 20 2a 20 2a  eger P1 P2 * * *
6fd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 33 32 2d 62 69  .**.** The 32-bi
6fe0: 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  t integer value 
6ff0: 50 31 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  P1 is written in
7000: 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
7010: 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65 67  */.case OP_Integ
7020: 65 72 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a  er: {         /*
7030: 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65   out2-prerelease
7040: 20 2a 2f 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20   */.  pOut->u.i 
7050: 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 62 72 65  = pOp->p1;.  bre
7060: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
7070: 3a 20 49 6e 74 36 34 20 2a 20 50 32 20 2a 20 50  : Int64 * P2 * P
7080: 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20  4 *.**.** P4 is 
7090: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 36  a pointer to a 6
70a0: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61  4-bit integer va
70b0: 6c 75 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68  lue..** Write th
70c0: 61 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65  at value into re
70d0: 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61  gister P2..*/.ca
70e0: 73 65 20 4f 50 5f 49 6e 74 36 34 3a 20 7b 20 20  se OP_Int64: {  
70f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
7100: 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20  -prerelease */. 
7110: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
7120: 2e 70 49 36 34 21 3d 30 20 29 3b 0a 20 20 70 4f  .pI64!=0 );.  pO
7130: 75 74 2d 3e 75 2e 69 20 3d 20 2a 70 4f 70 2d 3e  ut->u.i = *pOp->
7140: 70 34 2e 70 49 36 34 3b 0a 20 20 62 72 65 61 6b  p4.pI64;.  break
7150: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
7160: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
7170: 47 5f 50 4f 49 4e 54 0a 2f 2a 20 4f 70 63 6f 64  G_POINT./* Opcod
7180: 65 3a 20 52 65 61 6c 20 2a 20 50 32 20 2a 20 50  e: Real * P2 * P
7190: 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20  4 *.**.** P4 is 
71a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 36  a pointer to a 6
71b0: 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70  4-bit floating p
71c0: 6f 69 6e 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 57  oint value..** W
71d0: 72 69 74 65 20 74 68 61 74 20 76 61 6c 75 65 20  rite that value 
71e0: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  into register P2
71f0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61  ..*/.case OP_Rea
7200: 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  l: {            
7210: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 46 4c  /* same as TK_FL
7220: 4f 41 54 2c 20 6f 75 74 32 2d 70 72 65 72 65 6c  OAT, out2-prerel
7230: 65 61 73 65 20 2a 2f 0a 20 20 70 4f 75 74 2d 3e  ease */.  pOut->
7240: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c  flags = MEM_Real
7250: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c  ;.  assert( !sql
7260: 69 74 65 33 49 73 4e 61 4e 28 2a 70 4f 70 2d 3e  ite3IsNaN(*pOp->
7270: 70 34 2e 70 52 65 61 6c 29 20 29 3b 0a 20 20 70  p4.pReal) );.  p
7280: 4f 75 74 2d 3e 72 20 3d 20 2a 70 4f 70 2d 3e 70  Out->r = *pOp->p
7290: 34 2e 70 52 65 61 6c 3b 0a 20 20 62 72 65 61 6b  4.pReal;.  break
72a0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f  ;.}.#endif../* O
72b0: 70 63 6f 64 65 3a 20 53 74 72 69 6e 67 38 20 2a  pcode: String8 *
72c0: 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a   P2 * P4 *.**.**
72d0: 20 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20   P4 points to a 
72e0: 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 55  nul terminated U
72f0: 54 46 2d 38 20 73 74 72 69 6e 67 2e 20 54 68 69  TF-8 string. Thi
7300: 73 20 6f 70 63 6f 64 65 20 69 73 20 74 72 61 6e  s opcode is tran
7310: 73 66 6f 72 6d 65 64 20 0a 2a 2a 20 69 6e 74 6f  sformed .** into
7320: 20 61 6e 20 4f 50 5f 53 74 72 69 6e 67 20 62 65   an OP_String be
7330: 66 6f 72 65 20 69 74 20 69 73 20 65 78 65 63 75  fore it is execu
7340: 74 65 64 20 66 6f 72 20 74 68 65 20 66 69 72 73  ted for the firs
7350: 74 20 74 69 6d 65 2e 0a 2a 2f 0a 63 61 73 65 20  t time..*/.case 
7360: 4f 50 5f 53 74 72 69 6e 67 38 3a 20 7b 20 20 20  OP_String8: {   
7370: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
7380: 20 54 4b 5f 53 54 52 49 4e 47 2c 20 6f 75 74 32   TK_STRING, out2
7390: 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20  -prerelease */. 
73a0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
73b0: 2e 7a 21 3d 30 20 29 3b 0a 20 20 70 4f 70 2d 3e  .z!=0 );.  pOp->
73c0: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53 74 72 69  opcode = OP_Stri
73d0: 6e 67 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20  ng;.  pOp->p1 = 
73e0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
73f0: 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 0a 23 69 66  pOp->p4.z);..#if
7400: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7410: 5f 55 54 46 31 36 0a 20 20 69 66 28 20 65 6e 63  _UTF16.  if( enc
7420: 6f 64 69 6e 67 21 3d 53 51 4c 49 54 45 5f 55 54  oding!=SQLITE_UT
7430: 46 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  F8 ){.    rc = s
7440: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
7450: 53 74 72 28 70 4f 75 74 2c 20 70 4f 70 2d 3e 70  Str(pOut, pOp->p
7460: 34 2e 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  4.z, -1, SQLITE_
7470: 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
7480: 54 49 43 29 3b 0a 20 20 20 20 69 66 28 20 72 63  TIC);.    if( rc
7490: 3d 3d 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20  ==SQLITE_TOOBIG 
74a0: 29 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a  ) goto too_big;.
74b0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
74c0: 4b 21 3d 73 71 6c 69 74 65 33 56 64 62 65 43 68  K!=sqlite3VdbeCh
74d0: 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4f 75  angeEncoding(pOu
74e0: 74 2c 20 65 6e 63 6f 64 69 6e 67 29 20 29 20 67  t, encoding) ) g
74f0: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
7500: 61 73 73 65 72 74 28 20 70 4f 75 74 2d 3e 7a 4d  assert( pOut->zM
7510: 61 6c 6c 6f 63 3d 3d 70 4f 75 74 2d 3e 7a 20 29  alloc==pOut->z )
7520: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
7530: 75 74 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ut->flags & MEM_
7540: 44 79 6e 20 29 3b 0a 20 20 20 20 70 4f 75 74 2d  Dyn );.    pOut-
7550: 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  >zMalloc = 0;.  
7560: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d    pOut->flags |=
7570: 20 4d 45 4d 5f 53 74 61 74 69 63 3b 0a 20 20 20   MEM_Static;.   
7580: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 26 3d 20   pOut->flags &= 
7590: 7e 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20 20 69 66  ~MEM_Dyn;.    if
75a0: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
75b0: 34 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  4_DYNAMIC ){.   
75c0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
75d0: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  (db, pOp->p4.z);
75e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 70 2d 3e  .    }.    pOp->
75f0: 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41  p4type = P4_DYNA
7600: 4d 49 43 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  MIC;.    pOp->p4
7610: 2e 7a 20 3d 20 70 4f 75 74 2d 3e 7a 3b 0a 20 20  .z = pOut->z;.  
7620: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 75 74    pOp->p1 = pOut
7630: 2d 3e 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ->n;.  }.#endif.
7640: 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3e 64 62    if( pOp->p1>db
7650: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
7660: 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b  LIMIT_LENGTH] ){
7670: 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69  .    goto too_bi
7680: 67 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 61 6c 6c  g;.  }.  /* Fall
7690: 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
76a0: 6e 65 78 74 20 63 61 73 65 2c 20 4f 50 5f 53 74  next case, OP_St
76b0: 72 69 6e 67 20 2a 2f 0a 7d 0a 20 20 0a 2f 2a 20  ring */.}.  ./* 
76c0: 4f 70 63 6f 64 65 3a 20 53 74 72 69 6e 67 20 50  Opcode: String P
76d0: 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  1 P2 * P4 *.**.*
76e0: 2a 20 54 68 65 20 73 74 72 69 6e 67 20 76 61 6c  * The string val
76f0: 75 65 20 50 34 20 6f 66 20 6c 65 6e 67 74 68 20  ue P4 of length 
7700: 50 31 20 28 62 79 74 65 73 29 20 69 73 20 73 74  P1 (bytes) is st
7710: 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
7720: 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
7730: 53 74 72 69 6e 67 3a 20 7b 20 20 20 20 20 20 20  String: {       
7740: 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65     /* out2-prere
7750: 6c 65 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  lease */.  asser
7760: 74 28 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  t( pOp->p4.z!=0 
7770: 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  );.  pOut->flags
7780: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53   = MEM_Str|MEM_S
7790: 74 61 74 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  tatic|MEM_Term;.
77a0: 20 20 70 4f 75 74 2d 3e 7a 20 3d 20 70 4f 70 2d    pOut->z = pOp-
77b0: 3e 70 34 2e 7a 3b 0a 20 20 70 4f 75 74 2d 3e 6e  >p4.z;.  pOut->n
77c0: 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 4f   = pOp->p1;.  pO
77d0: 75 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69  ut->enc = encodi
77e0: 6e 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58  ng;.  UPDATE_MAX
77f0: 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b  _BLOBSIZE(pOut);
7800: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
7810: 4f 70 63 6f 64 65 3a 20 4e 75 6c 6c 20 2a 20 50  Opcode: Null * P
7820: 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72  2 * * *.**.** Wr
7830: 69 74 65 20 61 20 4e 55 4c 4c 20 69 6e 74 6f 20  ite a NULL into 
7840: 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a  register P2..*/.
7850: 63 61 73 65 20 4f 50 5f 4e 75 6c 6c 3a 20 7b 20  case OP_Null: { 
7860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
7870: 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a  2-prerelease */.
7880: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
7890: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 62 72 65 61  MEM_Null;.  brea
78a0: 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65  k;.}.../* Opcode
78b0: 3a 20 42 6c 6f 62 20 50 31 20 50 32 20 2a 20 50  : Blob P1 P2 * P
78c0: 34 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74  4.**.** P4 point
78d0: 73 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 64  s to a blob of d
78e0: 61 74 61 20 50 31 20 62 79 74 65 73 20 6c 6f 6e  ata P1 bytes lon
78f0: 67 2e 20 20 53 74 6f 72 65 20 74 68 69 73 0a 2a  g.  Store this.*
7900: 2a 20 62 6c 6f 62 20 69 6e 20 72 65 67 69 73 74  * blob in regist
7910: 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f  er P2..*/.case O
7920: 50 5f 42 6c 6f 62 3a 20 7b 20 20 20 20 20 20 20  P_Blob: {       
7930: 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
7940: 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20  -prerelease */. 
7950: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
7960: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c   <= SQLITE_MAX_L
7970: 45 4e 47 54 48 20 29 3b 0a 20 20 73 71 6c 69 74  ENGTH );.  sqlit
7980: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
7990: 70 4f 75 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c  pOut, pOp->p4.z,
79a0: 20 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 30 29 3b   pOp->p1, 0, 0);
79b0: 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 65  .  pOut->enc = e
79c0: 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41 54  ncoding;.  UPDAT
79d0: 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70  E_MAX_BLOBSIZE(p
79e0: 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  Out);.  break;.}
79f0: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 61 72  ../* Opcode: Var
7a00: 69 61 62 6c 65 20 50 31 20 50 32 20 2a 20 50 34  iable P1 P2 * P4
7a10: 20 2a 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65   *.**.** Transfe
7a20: 72 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  r the values of 
7a30: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20  bound parameter 
7a40: 50 31 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  P1 into register
7a50: 20 50 32 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65   P2.**.** If the
7a60: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 61   parameter is na
7a70: 6d 65 64 2c 20 74 68 65 6e 20 69 74 73 20 6e 61  med, then its na
7a80: 6d 65 20 61 70 70 65 61 72 73 20 69 6e 20 50 34  me appears in P4
7a90: 20 61 6e 64 20 50 33 3d 3d 31 2e 0a 2a 2a 20 54   and P3==1..** T
7aa0: 68 65 20 50 34 20 76 61 6c 75 65 20 69 73 20 75  he P4 value is u
7ab0: 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 62  sed by sqlite3_b
7ac0: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
7ad0: 6d 65 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  me()..*/.case OP
7ae0: 5f 56 61 72 69 61 62 6c 65 3a 20 7b 20 20 20 20  _Variable: {    
7af0: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
7b00: 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
7b10: 4d 65 6d 20 2a 70 56 61 72 3b 20 20 20 20 20 20  Mem *pVar;      
7b20: 20 2f 2a 20 56 61 6c 75 65 20 62 65 69 6e 67 20   /* Value being 
7b30: 74 72 61 6e 73 66 65 72 72 65 64 20 2a 2f 0a 0a  transferred */..
7b40: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
7b50: 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d  1>0 && pOp->p1<=
7b60: 70 2d 3e 6e 56 61 72 20 29 3b 0a 20 20 70 56 61  p->nVar );.  pVa
7b70: 72 20 3d 20 26 70 2d 3e 61 56 61 72 5b 70 4f 70  r = &p->aVar[pOp
7b80: 2d 3e 70 31 20 2d 20 31 5d 3b 0a 20 20 69 66 28  ->p1 - 1];.  if(
7b90: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54   sqlite3VdbeMemT
7ba0: 6f 6f 42 69 67 28 70 56 61 72 29 20 29 7b 0a 20  ooBig(pVar) ){. 
7bb0: 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b     goto too_big;
7bc0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
7bd0: 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
7be0: 28 70 4f 75 74 2c 20 70 56 61 72 2c 20 4d 45 4d  (pOut, pVar, MEM
7bf0: 5f 53 74 61 74 69 63 29 3b 0a 20 20 55 50 44 41  _Static);.  UPDA
7c00: 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
7c10: 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  pOut);.  break;.
7c20: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 6f  }../* Opcode: Mo
7c30: 76 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  ve P1 P2 P3 * *.
7c40: 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 76  **.** Move the v
7c50: 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65  alues in registe
7c60: 72 20 50 31 2e 2e 50 31 2b 50 33 2d 31 20 6f 76  r P1..P1+P3-1 ov
7c70: 65 72 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73  er into.** regis
7c80: 74 65 72 73 20 50 32 2e 2e 50 32 2b 50 33 2d 31  ters P2..P2+P3-1
7c90: 2e 20 20 52 65 67 69 73 74 65 72 73 20 50 31 2e  .  Registers P1.
7ca0: 2e 50 31 2b 50 31 2d 31 20 61 72 65 0a 2a 2a 20  .P1+P1-1 are.** 
7cb0: 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 20 4e  left holding a N
7cc0: 55 4c 4c 2e 20 20 49 74 20 69 73 20 61 6e 20 65  ULL.  It is an e
7cd0: 72 72 6f 72 20 66 6f 72 20 72 65 67 69 73 74 65  rror for registe
7ce0: 72 20 72 61 6e 67 65 73 0a 2a 2a 20 50 31 2e 2e  r ranges.** P1..
7cf0: 50 31 2b 50 33 2d 31 20 61 6e 64 20 50 32 2e 2e  P1+P3-1 and P2..
7d00: 50 32 2b 50 33 2d 31 20 74 6f 20 6f 76 65 72 6c  P2+P3-1 to overl
7d10: 61 70 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d  ap..*/.case OP_M
7d20: 6f 76 65 3a 20 7b 0a 20 20 63 68 61 72 20 2a 7a  ove: {.  char *z
7d30: 4d 61 6c 6c 6f 63 3b 20 20 20 2f 2a 20 48 6f 6c  Malloc;   /* Hol
7d40: 64 69 6e 67 20 76 61 72 69 61 62 6c 65 20 66 6f  ding variable fo
7d50: 72 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  r allocated memo
7d60: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ry */.  int n;  
7d70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7d80: 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  er of registers 
7d90: 6c 65 66 74 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  left to copy */.
7da0: 20 20 69 6e 74 20 70 31 3b 20 20 20 20 20 20 20    int p1;       
7db0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
7dc0: 6f 20 63 6f 70 79 20 66 72 6f 6d 20 2a 2f 0a 20  o copy from */. 
7dd0: 20 69 6e 74 20 70 32 3b 20 20 20 20 20 20 20 20   int p2;        
7de0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f    /* Register to
7df0: 20 63 6f 70 79 20 74 6f 20 2a 2f 0a 0a 20 20 6e   copy to */..  n
7e00: 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 70 31   = pOp->p3;.  p1
7e10: 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 32   = pOp->p1;.  p2
7e20: 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73   = pOp->p2;.  as
7e30: 73 65 72 74 28 20 6e 3e 30 20 26 26 20 70 31 3e  sert( n>0 && p1>
7e40: 30 20 26 26 20 70 32 3e 30 20 29 3b 0a 20 20 61  0 && p2>0 );.  a
7e50: 73 73 65 72 74 28 20 70 31 2b 6e 3c 3d 70 32 20  ssert( p1+n<=p2 
7e60: 7c 7c 20 70 32 2b 6e 3c 3d 70 31 20 29 3b 0a 0a  || p2+n<=p1 );..
7e70: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
7e80: 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d  1];.  pOut = &aM
7e90: 65 6d 5b 70 32 5d 3b 0a 20 20 77 68 69 6c 65 28  em[p2];.  while(
7ea0: 20 6e 2d 2d 20 29 7b 0a 20 20 20 20 61 73 73 65   n-- ){.    asse
7eb0: 72 74 28 20 70 4f 75 74 3c 3d 26 61 4d 65 6d 5b  rt( pOut<=&aMem[
7ec0: 70 2d 3e 6e 4d 65 6d 5d 20 29 3b 0a 20 20 20 20  p->nMem] );.    
7ed0: 61 73 73 65 72 74 28 20 70 49 6e 31 3c 3d 26 61  assert( pIn1<=&a
7ee0: 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 5d 20 29 3b 0a  Mem[p->nMem] );.
7ef0: 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
7f00: 73 56 61 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a  sValid(pIn1) );.
7f10: 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68      memAboutToCh
7f20: 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20  ange(p, pOut);. 
7f30: 20 20 20 7a 4d 61 6c 6c 6f 63 20 3d 20 70 4f 75     zMalloc = pOu
7f40: 74 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20  t->zMalloc;.    
7f50: 70 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20  pOut->zMalloc = 
7f60: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  0;.    sqlite3Vd
7f70: 62 65 4d 65 6d 4d 6f 76 65 28 70 4f 75 74 2c 20  beMemMove(pOut, 
7f80: 70 49 6e 31 29 3b 0a 20 20 20 20 70 49 6e 31 2d  pIn1);.    pIn1-
7f90: 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 7a 4d 61 6c 6c  >zMalloc = zMall
7fa0: 6f 63 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52  oc;.    REGISTER
7fb0: 5f 54 52 41 43 45 28 70 32 2b 2b 2c 20 70 4f 75  _TRACE(p2++, pOu
7fc0: 74 29 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a  t);.    pIn1++;.
7fd0: 20 20 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 7d 0a      pOut++;.  }.
7fe0: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
7ff0: 70 63 6f 64 65 3a 20 43 6f 70 79 20 50 31 20 50  pcode: Copy P1 P
8000: 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 61  2 * * *.**.** Ma
8010: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 72 65 67  ke a copy of reg
8020: 69 73 74 65 72 20 50 31 20 69 6e 74 6f 20 72 65  ister P1 into re
8030: 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a  gister P2..**.**
8040: 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   This instructio
8050: 6e 20 6d 61 6b 65 73 20 61 20 64 65 65 70 20 63  n makes a deep c
8060: 6f 70 79 20 6f 66 20 74 68 65 20 76 61 6c 75 65  opy of the value
8070: 2e 20 20 41 20 64 75 70 6c 69 63 61 74 65 0a 2a  .  A duplicate.*
8080: 2a 20 69 73 20 6d 61 64 65 20 6f 66 20 61 6e 79  * is made of any
8090: 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   string or blob 
80a0: 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 61  constant.  See a
80b0: 6c 73 6f 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a 2f  lso OP_SCopy..*/
80c0: 0a 63 61 73 65 20 4f 50 5f 43 6f 70 79 3a 20 7b  .case OP_Copy: {
80d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
80e0: 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20 20 70  in1, out2 */.  p
80f0: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
8100: 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26  >p1];.  pOut = &
8110: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
8120: 20 61 73 73 65 72 74 28 20 70 4f 75 74 21 3d 70   assert( pOut!=p
8130: 49 6e 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  In1 );.  sqlite3
8140: 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
8150: 70 79 28 70 4f 75 74 2c 20 70 49 6e 31 2c 20 4d  py(pOut, pIn1, M
8160: 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 44 65 65  EM_Ephem);.  Dee
8170: 70 68 65 6d 65 72 61 6c 69 7a 65 28 70 4f 75 74  phemeralize(pOut
8180: 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  );.  REGISTER_TR
8190: 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75  ACE(pOp->p2, pOu
81a0: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
81b0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 43 6f 70 79  /* Opcode: SCopy
81c0: 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
81d0: 2a 2a 20 4d 61 6b 65 20 61 20 73 68 61 6c 6c 6f  ** Make a shallo
81e0: 77 20 63 6f 70 79 20 6f 66 20 72 65 67 69 73 74  w copy of regist
81f0: 65 72 20 50 31 20 69 6e 74 6f 20 72 65 67 69 73  er P1 into regis
8200: 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68  ter P2..**.** Th
8210: 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6d  is instruction m
8220: 61 6b 65 73 20 61 20 73 68 61 6c 6c 6f 77 20 63  akes a shallow c
8230: 6f 70 79 20 6f 66 20 74 68 65 20 76 61 6c 75 65  opy of the value
8240: 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a  .  If the value.
8250: 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6f  ** is a string o
8260: 72 20 62 6c 6f 62 2c 20 74 68 65 6e 20 74 68 65  r blob, then the
8270: 20 63 6f 70 79 20 69 73 20 6f 6e 6c 79 20 61 20   copy is only a 
8280: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
8290: 2a 20 6f 72 69 67 69 6e 61 6c 20 61 6e 64 20 68  * original and h
82a0: 65 6e 63 65 20 69 66 20 74 68 65 20 6f 72 69 67  ence if the orig
82b0: 69 6e 61 6c 20 63 68 61 6e 67 65 73 20 73 6f 20  inal changes so 
82c0: 77 69 6c 6c 20 74 68 65 20 63 6f 70 79 2e 0a 2a  will the copy..*
82d0: 2a 20 57 6f 72 73 65 2c 20 69 66 20 74 68 65 20  * Worse, if the 
82e0: 6f 72 69 67 69 6e 61 6c 20 69 73 20 64 65 61 6c  original is deal
82f0: 6c 6f 63 61 74 65 64 2c 20 74 68 65 20 63 6f 70  located, the cop
8300: 79 20 62 65 63 6f 6d 65 73 20 69 6e 76 61 6c 69  y becomes invali
8310: 64 2e 0a 2a 2a 20 54 68 75 73 20 74 68 65 20 70  d..** Thus the p
8320: 72 6f 67 72 61 6d 20 6d 75 73 74 20 67 75 61 72  rogram must guar
8330: 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 6f  antee that the o
8340: 72 69 67 69 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  riginal will not
8350: 20 63 68 61 6e 67 65 0a 2a 2a 20 64 75 72 69 6e   change.** durin
8360: 67 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f  g the lifetime o
8370: 66 20 74 68 65 20 63 6f 70 79 2e 20 20 55 73 65  f the copy.  Use
8380: 20 4f 50 5f 43 6f 70 79 20 74 6f 20 6d 61 6b 65   OP_Copy to make
8390: 20 61 20 63 6f 6d 70 6c 65 74 65 0a 2a 2a 20 63   a complete.** c
83a0: 6f 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  opy..*/.case OP_
83b0: 53 43 6f 70 79 3a 20 7b 20 20 20 20 20 20 20 20  SCopy: {        
83c0: 20 20 20 20 2f 2a 20 69 6e 31 2c 20 6f 75 74 32      /* in1, out2
83d0: 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
83e0: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70  em[pOp->p1];.  p
83f0: 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
8400: 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p2];.  assert( 
8410: 70 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a 20 20  pOut!=pIn1 );.  
8420: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
8430: 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20  allowCopy(pOut, 
8440: 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29  pIn1, MEM_Ephem)
8450: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
8460: 44 45 42 55 47 0a 20 20 69 66 28 20 70 4f 75 74  DEBUG.  if( pOut
8470: 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3d 3d 30 20  ->pScopyFrom==0 
8480: 29 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72  ) pOut->pScopyFr
8490: 6f 6d 20 3d 20 70 49 6e 31 3b 0a 23 65 6e 64 69  om = pIn1;.#endi
84a0: 66 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41  f.  REGISTER_TRA
84b0: 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75 74  CE(pOp->p2, pOut
84c0: 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
84d0: 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 75 6c 74  * Opcode: Result
84e0: 52 6f 77 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  Row P1 P2 * * *.
84f0: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74  **.** The regist
8500: 65 72 73 20 50 31 20 74 68 72 6f 75 67 68 20 50  ers P1 through P
8510: 31 2b 50 32 2d 31 20 63 6f 6e 74 61 69 6e 20 61  1+P2-1 contain a
8520: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 0a 2a   single row of.*
8530: 2a 20 72 65 73 75 6c 74 73 2e 20 54 68 69 73 20  * results. This 
8540: 6f 70 63 6f 64 65 20 63 61 75 73 65 73 20 74 68  opcode causes th
8550: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
8560: 20 63 61 6c 6c 20 74 6f 20 74 65 72 6d 69 6e 61   call to termina
8570: 74 65 0a 2a 2a 20 77 69 74 68 20 61 6e 20 53 51  te.** with an SQ
8580: 4c 49 54 45 5f 52 4f 57 20 72 65 74 75 72 6e 20  LITE_ROW return 
8590: 63 6f 64 65 20 61 6e 64 20 69 74 20 73 65 74 73  code and it sets
85a0: 20 75 70 20 74 68 65 20 73 71 6c 69 74 65 33 5f   up the sqlite3_
85b0: 73 74 6d 74 0a 2a 2a 20 73 74 72 75 63 74 75 72  stmt.** structur
85c0: 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61 63 63  e to provide acc
85d0: 65 73 73 20 74 6f 20 74 68 65 20 74 6f 70 20 50  ess to the top P
85e0: 31 20 76 61 6c 75 65 73 20 61 73 20 74 68 65 20  1 values as the 
85f0: 72 65 73 75 6c 74 0a 2a 2a 20 72 6f 77 2e 0a 2a  result.** row..*
8600: 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 75 6c 74  /.case OP_Result
8610: 52 6f 77 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d  Row: {.  Mem *pM
8620: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  em;.  int i;.  a
8630: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 73 43 6f  ssert( p->nResCo
8640: 6c 75 6d 6e 3d 3d 70 4f 70 2d 3e 70 32 20 29 3b  lumn==pOp->p2 );
8650: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
8660: 70 31 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p1>0 );.  assert
8670: 28 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70  ( pOp->p1+pOp->p
8680: 32 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29 3b 0a  2<=p->nMem+1 );.
8690: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 74  .  /* If this st
86a0: 61 74 65 6d 65 6e 74 20 68 61 73 20 76 69 6f 6c  atement has viol
86b0: 61 74 65 64 20 69 6d 6d 65 64 69 61 74 65 20 66  ated immediate f
86c0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
86d0: 72 61 69 6e 74 73 2c 20 64 6f 0a 20 20 2a 2a 20  raints, do.  ** 
86e0: 6e 6f 74 20 72 65 74 75 72 6e 20 74 68 65 20 6e  not return the n
86f0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6d 6f  umber of rows mo
8700: 64 69 66 69 65 64 2e 20 41 6e 64 20 64 6f 20 6e  dified. And do n
8710: 6f 74 20 52 45 4c 45 41 53 45 20 74 68 65 20 73  ot RELEASE the s
8720: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72  tatement.  ** tr
8730: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 6e 65  ansaction. It ne
8740: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
8750: 20 62 61 63 6b 2e 20 20 2a 2f 0a 20 20 69 66 28   back.  */.  if(
8760: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
8770: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
8780: 63 6b 46 6b 28 70 2c 20 30 29 29 20 29 7b 0a 20  ckFk(p, 0)) ){. 
8790: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 66     assert( db->f
87a0: 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6f 75 6e  lags&SQLITE_Coun
87b0: 74 52 6f 77 73 20 29 3b 0a 20 20 20 20 61 73 73  tRows );.    ass
87c0: 65 72 74 28 20 70 2d 3e 75 73 65 73 53 74 6d 74  ert( p->usesStmt
87d0: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 62  Journal );.    b
87e0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
87f0: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 43 6f  If the SQLITE_Co
8800: 75 6e 74 52 6f 77 73 20 66 6c 61 67 20 69 73 20  untRows flag is 
8810: 73 65 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 66  set in sqlite3.f
8820: 6c 61 67 73 20 6d 61 73 6b 2c 20 74 68 65 6e 20  lags mask, then 
8830: 0a 20 20 2a 2a 20 44 4d 4c 20 73 74 61 74 65 6d  .  ** DML statem
8840: 65 6e 74 73 20 69 6e 76 6f 6b 65 20 74 68 69 73  ents invoke this
8850: 20 6f 70 63 6f 64 65 20 74 6f 20 72 65 74 75 72   opcode to retur
8860: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
8870: 72 6f 77 73 20 0a 20 20 2a 2a 20 6d 6f 64 69 66  rows .  ** modif
8880: 69 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e  ied to the user.
8890: 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   This is the onl
88a0: 79 20 77 61 79 20 74 68 61 74 20 61 20 56 4d 20  y way that a VM 
88b0: 74 68 61 74 0a 20 20 2a 2a 20 6f 70 65 6e 73 20  that.  ** opens 
88c0: 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
88d0: 73 61 63 74 69 6f 6e 20 6d 61 79 20 69 6e 76 6f  saction may invo
88e0: 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a  ke this opcode..
88f0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63 61 73    **.  ** In cas
8900: 65 20 74 68 69 73 20 69 73 20 73 75 63 68 20 61  e this is such a
8910: 20 73 74 61 74 65 6d 65 6e 74 2c 20 63 6c 6f 73   statement, clos
8920: 65 20 61 6e 79 20 73 74 61 74 65 6d 65 6e 74 20  e any statement 
8930: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
8940: 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20   opened by this 
8950: 56 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  VM before return
8960: 69 6e 67 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74  ing control to t
8970: 68 65 20 75 73 65 72 2e 20 54 68 69 73 20 69 73  he user. This is
8980: 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20   to.  ** ensure 
8990: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2d 74  that statement-t
89a0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
89b0: 61 6c 77 61 79 73 20 6e 65 73 74 65 64 2c 20 6e  always nested, n
89c0: 6f 74 20 6f 76 65 72 6c 61 70 70 69 6e 67 2e 0a  ot overlapping..
89d0: 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 6e    ** If the open
89e0: 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
89f0: 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6c  action is not cl
8a00: 6f 73 65 64 20 68 65 72 65 2c 20 74 68 65 6e 20  osed here, then 
8a10: 74 68 65 20 75 73 65 72 0a 20 20 2a 2a 20 6d 61  the user.  ** ma
8a20: 79 20 73 74 65 70 20 61 6e 6f 74 68 65 72 20 56  y step another V
8a30: 4d 20 74 68 61 74 20 6f 70 65 6e 73 20 69 74 73  M that opens its
8a40: 20 6f 77 6e 20 73 74 61 74 65 6d 65 6e 74 20 74   own statement t
8a50: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
8a60: 0a 20 20 2a 2a 20 6d 61 79 20 6c 65 61 64 20 74  .  ** may lead t
8a70: 6f 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 73 74  o overlapping st
8a80: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
8a90: 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ions..  **.  ** 
8aa0: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  The statement tr
8ab0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 76  ansaction is nev
8ac0: 65 72 20 61 20 74 6f 70 2d 6c 65 76 65 6c 20 74  er a top-level t
8ad0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 48 65 6e  ransaction.  Hen
8ae0: 63 65 0a 20 20 2a 2a 20 74 68 65 20 52 45 4c 45  ce.  ** the RELE
8af0: 41 53 45 20 63 61 6c 6c 20 62 65 6c 6f 77 20 63  ASE call below c
8b00: 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a 20  an never fail.. 
8b10: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
8b20: 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 7c  >iStatement==0 |
8b30: 7c 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  | db->flags&SQLI
8b40: 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 3b 0a  TE_CountRows );.
8b50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
8b60: 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
8b70: 28 70 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  (p, SAVEPOINT_RE
8b80: 4c 45 41 53 45 29 3b 0a 20 20 69 66 28 20 4e 45  LEASE);.  if( NE
8b90: 56 45 52 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f  VER(rc!=SQLITE_O
8ba0: 4b 29 20 29 7b 0a 20 20 20 20 62 72 65 61 6b 3b  K) ){.    break;
8bb0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 76 61 6c  .  }..  /* Inval
8bc0: 69 64 61 74 65 20 61 6c 6c 20 65 70 68 65 6d 65  idate all epheme
8bd0: 72 61 6c 20 63 75 72 73 6f 72 20 72 6f 77 20 63  ral cursor row c
8be0: 61 63 68 65 73 20 2a 2f 0a 20 20 70 2d 3e 63 61  aches */.  p->ca
8bf0: 63 68 65 43 74 72 20 3d 20 28 70 2d 3e 63 61 63  cheCtr = (p->cac
8c00: 68 65 43 74 72 20 2b 20 32 29 7c 31 3b 0a 0a 20  heCtr + 2)|1;.. 
8c10: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
8c20: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
8c30: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 61 72 65   current row are
8c40: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
8c50: 0a 20 20 2a 2a 20 61 6e 64 20 68 61 76 65 20 61  .  ** and have a
8c60: 6e 20 61 73 73 69 67 6e 65 64 20 74 79 70 65 2e  n assigned type.
8c70: 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
8c80: 65 20 64 65 2d 65 70 68 65 6d 65 72 61 6c 69 7a  e de-ephemeraliz
8c90: 65 64 20 61 73 0a 20 20 2a 2a 20 61 73 20 73 69  ed as.  ** as si
8ca0: 64 65 20 65 66 66 65 63 74 2e 0a 20 20 2a 2f 0a  de effect..  */.
8cb0: 20 20 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73    pMem = p->pRes
8cc0: 75 6c 74 53 65 74 20 3d 20 26 61 4d 65 6d 5b 70  ultSet = &aMem[p
8cd0: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 66 6f 72 28 69  Op->p1];.  for(i
8ce0: 3d 30 3b 20 69 3c 70 4f 70 2d 3e 70 32 3b 20 69  =0; i<pOp->p2; i
8cf0: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
8d00: 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 70 4d 65   memIsValid(&pMe
8d10: 6d 5b 69 5d 29 20 29 3b 0a 20 20 20 20 44 65 65  m[i]) );.    Dee
8d20: 70 68 65 6d 65 72 61 6c 69 7a 65 28 26 70 4d 65  phemeralize(&pMe
8d30: 6d 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  m[i]);.    asser
8d40: 74 28 20 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67  t( (pMem[i].flag
8d50: 73 20 26 20 4d 45 4d 5f 45 70 68 65 6d 29 3d 3d  s & MEM_Ephem)==
8d60: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
8d70: 20 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20   (pMem[i].flags 
8d80: 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  & (MEM_Str|MEM_B
8d90: 6c 6f 62 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  lob))==0 );.    
8da0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e 75  sqlite3VdbeMemNu
8db0: 6c 54 65 72 6d 69 6e 61 74 65 28 26 70 4d 65 6d  lTerminate(&pMem
8dc0: 5b 69 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  [i]);.    sqlite
8dd0: 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70  3VdbeMemStoreTyp
8de0: 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 20  e(&pMem[i]);.   
8df0: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
8e00: 70 4f 70 2d 3e 70 31 2b 69 2c 20 26 70 4d 65 6d  pOp->p1+i, &pMem
8e10: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [i]);.  }.  if( 
8e20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8e30: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
8e40: 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 53 51 4c  .  /* Return SQL
8e50: 49 54 45 5f 52 4f 57 0a 20 20 2a 2f 0a 20 20 70  ITE_ROW.  */.  p
8e60: 2d 3e 70 63 20 3d 20 70 63 20 2b 20 31 3b 0a 20  ->pc = pc + 1;. 
8e70: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
8e80: 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65  ;.  goto vdbe_re
8e90: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  turn;.}../* Opco
8ea0: 64 65 3a 20 43 6f 6e 63 61 74 20 50 31 20 50 32  de: Concat P1 P2
8eb0: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 64   P3 * *.**.** Ad
8ec0: 64 20 74 68 65 20 74 65 78 74 20 69 6e 20 72 65  d the text in re
8ed0: 67 69 73 74 65 72 20 50 31 20 6f 6e 74 6f 20 74  gister P1 onto t
8ee0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 65  he end of the te
8ef0: 78 74 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74 65  xt in.** registe
8f00: 72 20 50 32 20 61 6e 64 20 73 74 6f 72 65 20 74  r P2 and store t
8f10: 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  he result in reg
8f20: 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20  ister P3..** If 
8f30: 65 69 74 68 65 72 20 74 68 65 20 50 31 20 6f 72  either the P1 or
8f40: 20 50 32 20 74 65 78 74 20 61 72 65 20 4e 55 4c   P2 text are NUL
8f50: 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 4e 55 4c  L then store NUL
8f60: 4c 20 69 6e 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 20  L in P3..**.**  
8f70: 20 50 33 20 3d 20 50 32 20 7c 7c 20 50 31 0a 2a   P3 = P2 || P1.*
8f80: 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  *.** It is illeg
8f90: 61 6c 20 66 6f 72 20 50 31 20 61 6e 64 20 50 33  al for P1 and P3
8fa0: 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 20   to be the same 
8fb0: 72 65 67 69 73 74 65 72 2e 20 53 6f 6d 65 74 69  register. Someti
8fc0: 6d 65 73 2c 0a 2a 2a 20 69 66 20 50 33 20 69 73  mes,.** if P3 is
8fd0: 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74   the same regist
8fe0: 65 72 20 61 73 20 50 32 2c 20 74 68 65 20 69 6d  er as P2, the im
8ff0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
9000: 61 62 6c 65 0a 2a 2a 20 74 6f 20 61 76 6f 69 64  able.** to avoid
9010: 20 61 20 6d 65 6d 63 70 79 28 29 2e 0a 2a 2f 0a   a memcpy()..*/.
9020: 63 61 73 65 20 4f 50 5f 43 6f 6e 63 61 74 3a 20  case OP_Concat: 
9030: 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  {           /* s
9040: 61 6d 65 20 61 73 20 54 4b 5f 43 4f 4e 43 41 54  ame as TK_CONCAT
9050: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
9060: 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74 65 3b   */.  i64 nByte;
9070: 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ..  pIn1 = &aMem
9080: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e  [pOp->p1];.  pIn
9090: 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  2 = &aMem[pOp->p
90a0: 32 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d  2];.  pOut = &aM
90b0: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61  em[pOp->p3];.  a
90c0: 73 73 65 72 74 28 20 70 49 6e 31 21 3d 70 4f 75  ssert( pIn1!=pOu
90d0: 74 20 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31  t );.  if( (pIn1
90e0: 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e  ->flags | pIn2->
90f0: 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 4e 75 6c  flags) & MEM_Nul
9100: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
9110: 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70  VdbeMemSetNull(p
9120: 4f 75 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  Out);.    break;
9130: 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 61 6e  .  }.  if( Expan
9140: 64 42 6c 6f 62 28 70 49 6e 31 29 20 7c 7c 20 45  dBlob(pIn1) || E
9150: 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29 20  xpandBlob(pIn2) 
9160: 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
9170: 20 53 74 72 69 6e 67 69 66 79 28 70 49 6e 31 2c   Stringify(pIn1,
9180: 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 53 74   encoding);.  St
9190: 72 69 6e 67 69 66 79 28 70 49 6e 32 2c 20 65 6e  ringify(pIn2, en
91a0: 63 6f 64 69 6e 67 29 3b 0a 20 20 6e 42 79 74 65  coding);.  nByte
91b0: 20 3d 20 70 49 6e 31 2d 3e 6e 20 2b 20 70 49 6e   = pIn1->n + pIn
91c0: 32 2d 3e 6e 3b 0a 20 20 69 66 28 20 6e 42 79 74  2->n;.  if( nByt
91d0: 65 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  e>db->aLimit[SQL
91e0: 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
91f0: 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f  ] ){.    goto to
9200: 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 4d 65 6d  o_big;.  }.  Mem
9210: 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
9220: 2c 20 4d 45 4d 5f 53 74 72 29 3b 0a 20 20 69 66  , MEM_Str);.  if
9230: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
9240: 47 72 6f 77 28 70 4f 75 74 2c 20 28 69 6e 74 29  Grow(pOut, (int)
9250: 6e 42 79 74 65 2b 32 2c 20 70 4f 75 74 3d 3d 70  nByte+2, pOut==p
9260: 49 6e 32 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  In2) ){.    goto
9270: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 69   no_mem;.  }.  i
9280: 66 28 20 70 4f 75 74 21 3d 70 49 6e 32 20 29 7b  f( pOut!=pIn2 ){
9290: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74  .    memcpy(pOut
92a0: 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 7a 2c 20 70 49  ->z, pIn2->z, pI
92b0: 6e 32 2d 3e 6e 29 3b 0a 20 20 7d 0a 20 20 6d 65  n2->n);.  }.  me
92c0: 6d 63 70 79 28 26 70 4f 75 74 2d 3e 7a 5b 70 49  mcpy(&pOut->z[pI
92d0: 6e 32 2d 3e 6e 5d 2c 20 70 49 6e 31 2d 3e 7a 2c  n2->n], pIn1->z,
92e0: 20 70 49 6e 31 2d 3e 6e 29 3b 0a 20 20 70 4f 75   pIn1->n);.  pOu
92f0: 74 2d 3e 7a 5b 6e 42 79 74 65 5d 20 3d 20 30 3b  t->z[nByte] = 0;
9300: 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74 65  .  pOut->z[nByte
9310: 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 4f 75 74 2d  +1] = 0;.  pOut-
9320: 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65  >flags |= MEM_Te
9330: 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20  rm;.  pOut->n = 
9340: 28 69 6e 74 29 6e 42 79 74 65 3b 0a 20 20 70 4f  (int)nByte;.  pO
9350: 75 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69  ut->enc = encodi
9360: 6e 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58  ng;.  UPDATE_MAX
9370: 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b  _BLOBSIZE(pOut);
9380: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
9390: 4f 70 63 6f 64 65 3a 20 41 64 64 20 50 31 20 50  Opcode: Add P1 P
93a0: 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41  2 P3 * *.**.** A
93b0: 64 64 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  dd the value in 
93c0: 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20 74  register P1 to t
93d0: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
93e0: 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73  ster P2.** and s
93f0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
9400: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
9410: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70  ** If either inp
9420: 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  ut is NULL, the 
9430: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
9440: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 75  */./* Opcode: Mu
9450: 6c 74 69 70 6c 79 20 50 31 20 50 32 20 50 33 20  ltiply P1 P2 P3 
9460: 2a 20 2a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4d 75 6c  * *.**.**.** Mul
9470: 74 69 70 6c 79 20 74 68 65 20 76 61 6c 75 65 20  tiply the value 
9480: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 62  in register P1 b
9490: 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  y the value in r
94a0: 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e  egister P2.** an
94b0: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
94c0: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
94d0: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
94e0: 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74  input is NULL, t
94f0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
9500: 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  L..*/./* Opcode:
9510: 20 53 75 62 74 72 61 63 74 20 50 31 20 50 32 20   Subtract P1 P2 
9520: 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 75 62  P3 * *.**.** Sub
9530: 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
9540: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 66  in register P1 f
9550: 72 6f 6d 20 74 68 65 20 76 61 6c 75 65 20 69 6e  rom the value in
9560: 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20   register P2.** 
9570: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
9580: 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72  sult in register
9590: 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65   P3..** If eithe
95a0: 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c  r input is NULL,
95b0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
95c0: 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ULL..*/./* Opcod
95d0: 65 3a 20 44 69 76 69 64 65 20 50 31 20 50 32 20  e: Divide P1 P2 
95e0: 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 69 76  P3 * *.**.** Div
95f0: 69 64 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ide the value in
9600: 20 72 65 67 69 73 74 65 72 20 50 31 20 62 79 20   register P1 by 
9610: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
9620: 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20  ister P2.** and 
9630: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
9640: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20   in register P3 
9650: 28 50 33 3d 50 32 2f 50 31 29 2e 20 49 66 20 74  (P3=P2/P1). If t
9660: 68 65 20 76 61 6c 75 65 20 69 6e 20 0a 2a 2a 20  he value in .** 
9670: 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 7a  register P1 is z
9680: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ero, then the re
9690: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 49 66  sult is NULL. If
96a0: 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73   either input is
96b0: 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 72   .** NULL, the r
96c0: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
96d0: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6d  /./* Opcode: Rem
96e0: 61 69 6e 64 65 72 20 50 31 20 50 32 20 50 33 20  ainder P1 P2 P3 
96f0: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74  * *.**.** Comput
9700: 65 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  e the remainder 
9710: 61 66 74 65 72 20 69 6e 74 65 67 65 72 20 64 69  after integer di
9720: 76 69 73 69 6f 6e 20 6f 66 20 74 68 65 20 76 61  vision of the va
9730: 6c 75 65 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74  lue in.** regist
9740: 65 72 20 50 31 20 62 79 20 74 68 65 20 76 61 6c  er P1 by the val
9750: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
9760: 32 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  2 and store the 
9770: 72 65 73 75 6c 74 20 69 6e 20 50 33 2e 20 0a 2a  result in P3. .*
9780: 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69  * If the value i
9790: 6e 20 72 65 67 69 73 74 65 72 20 50 32 20 69 73  n register P2 is
97a0: 20 7a 65 72 6f 20 74 68 65 20 72 65 73 75 6c 74   zero the result
97b0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 66 20   is NULL..** If 
97c0: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
97d0: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75  s NULL, the resu
97e0: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63  lt is NULL..*/.c
97f0: 61 73 65 20 4f 50 5f 41 64 64 3a 20 20 20 20 20  ase OP_Add:     
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9810: 20 73 61 6d 65 20 61 73 20 54 4b 5f 50 4c 55 53   same as TK_PLUS
9820: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
9830: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 75 62 74   */.case OP_Subt
9840: 72 61 63 74 3a 20 20 20 20 20 20 20 20 20 20 20  ract:           
9850: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
9860: 5f 4d 49 4e 55 53 2c 20 69 6e 31 2c 20 69 6e 32  _MINUS, in1, in2
9870: 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f  , out3 */.case O
9880: 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20 20  P_Multiply:     
9890: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
98a0: 20 61 73 20 54 4b 5f 53 54 41 52 2c 20 69 6e 31   as TK_STAR, in1
98b0: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63  , in2, out3 */.c
98c0: 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 20  ase OP_Divide:  
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98e0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 4c 41 53   same as TK_SLAS
98f0: 48 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  H, in1, in2, out
9900: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 6d  3 */.case OP_Rem
9910: 61 69 6e 64 65 72 3a 20 7b 20 20 20 20 20 20 20  ainder: {       
9920: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
9930: 4b 5f 52 45 4d 2c 20 69 6e 31 2c 20 69 6e 32 2c  K_REM, in1, in2,
9940: 20 6f 75 74 33 20 2a 2f 0a 20 20 69 6e 74 20 66   out3 */.  int f
9950: 6c 61 67 73 3b 20 20 20 20 20 20 2f 2a 20 43 6f  lags;      /* Co
9960: 6d 62 69 6e 65 64 20 4d 45 4d 5f 2a 20 66 6c 61  mbined MEM_* fla
9970: 67 73 20 66 72 6f 6d 20 62 6f 74 68 20 69 6e 70  gs from both inp
9980: 75 74 73 20 2a 2f 0a 20 20 69 36 34 20 69 41 3b  uts */.  i64 iA;
9990: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
99a0: 67 65 72 20 76 61 6c 75 65 20 6f 66 20 6c 65 66  ger value of lef
99b0: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
99c0: 36 34 20 69 42 3b 20 20 20 20 20 20 20 20 20 2f  64 iB;         /
99d0: 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65 20  * Integer value 
99e0: 6f 66 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  of right operand
99f0: 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 41 3b   */.  double rA;
9a00: 20 20 20 20 20 20 2f 2a 20 52 65 61 6c 20 76 61        /* Real va
9a10: 6c 75 65 20 6f 66 20 6c 65 66 74 20 6f 70 65 72  lue of left oper
9a20: 61 6e 64 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  and */.  double 
9a30: 72 42 3b 20 20 20 20 20 20 2f 2a 20 52 65 61 6c  rB;      /* Real
9a40: 20 76 61 6c 75 65 20 6f 66 20 72 69 67 68 74 20   value of right 
9a50: 6f 70 65 72 61 6e 64 20 2a 2f 0a 0a 20 20 70 49  operand */..  pI
9a60: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
9a70: 70 31 5d 3b 0a 20 20 61 70 70 6c 79 4e 75 6d 65  p1];.  applyNume
9a80: 72 69 63 41 66 66 69 6e 69 74 79 28 70 49 6e 31  ricAffinity(pIn1
9a90: 29 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65  );.  pIn2 = &aMe
9aa0: 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 70  m[pOp->p2];.  ap
9ab0: 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  plyNumericAffini
9ac0: 74 79 28 70 49 6e 32 29 3b 0a 20 20 70 4f 75 74  ty(pIn2);.  pOut
9ad0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
9ae0: 5d 3b 0a 20 20 66 6c 61 67 73 20 3d 20 70 49 6e  ];.  flags = pIn
9af0: 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d  1->flags | pIn2-
9b00: 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 66  >flags;.  if( (f
9b10: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
9b20: 21 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68  !=0 ) goto arith
9b30: 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f  metic_result_is_
9b40: 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 28 70 49 6e  null;.  if( (pIn
9b50: 31 2d 3e 66 6c 61 67 73 20 26 20 70 49 6e 32 2d  1->flags & pIn2-
9b60: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
9b70: 29 3d 3d 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  )==MEM_Int ){.  
9b80: 20 20 69 41 20 3d 20 70 49 6e 31 2d 3e 75 2e 69    iA = pIn1->u.i
9b90: 3b 0a 20 20 20 20 69 42 20 3d 20 70 49 6e 32 2d  ;.    iB = pIn2-
9ba0: 3e 75 2e 69 3b 0a 20 20 20 20 73 77 69 74 63 68  >u.i;.    switch
9bb0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b  ( pOp->opcode ){
9bc0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41  .      case OP_A
9bd0: 64 64 3a 20 20 20 20 20 20 20 69 66 28 20 73 71  dd:       if( sq
9be0: 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28 26 69  lite3AddInt64(&i
9bf0: 42 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 70 5f  B,iA) ) goto fp_
9c00: 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20  math;  break;.  
9c10: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 75 62 74      case OP_Subt
9c20: 72 61 63 74 3a 20 20 69 66 28 20 73 71 6c 69 74  ract:  if( sqlit
9c30: 65 33 53 75 62 49 6e 74 36 34 28 26 69 42 2c 69  e3SubInt64(&iB,i
9c40: 41 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74  A) ) goto fp_mat
9c50: 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  h;  break;.     
9c60: 20 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c   case OP_Multipl
9c70: 79 3a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d  y:  if( sqlite3M
9c80: 75 6c 49 6e 74 36 34 28 26 69 42 2c 69 41 29 20  ulInt64(&iB,iA) 
9c90: 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 20  ) goto fp_math; 
9ca0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9cb0: 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 7b 0a  se OP_Divide: {.
9cc0: 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d          if( iA==
9cd0: 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d 65  0 ) goto arithme
9ce0: 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75  tic_result_is_nu
9cf0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ll;.        if( 
9d00: 69 41 3d 3d 2d 31 20 26 26 20 69 42 3d 3d 53 4d  iA==-1 && iB==SM
9d10: 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29 20 67  ALLEST_INT64 ) g
9d20: 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 0a 20 20 20  oto fp_math;.   
9d30: 20 20 20 20 20 69 42 20 2f 3d 20 69 41 3b 0a 20       iB /= iA;. 
9d40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9d50: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61      }.      defa
9d60: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ult: {.        i
9d70: 66 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20  f( iA==0 ) goto 
9d80: 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c  arithmetic_resul
9d90: 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20  t_is_null;.     
9da0: 20 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 29 20     if( iA==-1 ) 
9db0: 69 41 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  iA = 1;.        
9dc0: 69 42 20 25 3d 20 69 41 3b 0a 20 20 20 20 20 20  iB %= iA;.      
9dd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
9de0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74 2d  .    }.    pOut-
9df0: 3e 75 2e 69 20 3d 20 69 42 3b 0a 20 20 20 20 4d  >u.i = iB;.    M
9e00: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
9e10: 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20  ut, MEM_Int);.  
9e20: 7d 65 6c 73 65 7b 0a 66 70 5f 6d 61 74 68 3a 0a  }else{.fp_math:.
9e30: 20 20 20 20 72 41 20 3d 20 73 71 6c 69 74 65 33      rA = sqlite3
9e40: 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28 70 49  VdbeRealValue(pI
9e50: 6e 31 29 3b 0a 20 20 20 20 72 42 20 3d 20 73 71  n1);.    rB = sq
9e60: 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56 61 6c  lite3VdbeRealVal
9e70: 75 65 28 70 49 6e 32 29 3b 0a 20 20 20 20 73 77  ue(pIn2);.    sw
9e80: 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  itch( pOp->opcod
9e90: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
9ea0: 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20 20 20  OP_Add:         
9eb0: 72 42 20 2b 3d 20 72 41 3b 20 20 20 20 20 20 20  rB += rA;       
9ec0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9ed0: 65 20 4f 50 5f 53 75 62 74 72 61 63 74 3a 20 20  e OP_Subtract:  
9ee0: 20 20 72 42 20 2d 3d 20 72 41 3b 20 20 20 20 20    rB -= rA;     
9ef0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9f00: 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a  ase OP_Multiply:
9f10: 20 20 20 20 72 42 20 2a 3d 20 72 41 3b 20 20 20      rB *= rA;   
9f20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9f30: 20 63 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a   case OP_Divide:
9f40: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 28 64   {.        /* (d
9f50: 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20  ouble)0 In case 
9f60: 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  of SQLITE_OMIT_F
9f70: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e  LOATING_POINT...
9f80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
9f90: 72 41 3d 3d 28 64 6f 75 62 6c 65 29 30 20 29 20  rA==(double)0 ) 
9fa0: 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f  goto arithmetic_
9fb0: 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a  result_is_null;.
9fc0: 20 20 20 20 20 20 20 20 72 42 20 2f 3d 20 72 41          rB /= rA
9fd0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9fe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
9ff0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
a000: 20 20 69 41 20 3d 20 28 69 36 34 29 72 41 3b 0a    iA = (i64)rA;.
a010: 20 20 20 20 20 20 20 20 69 42 20 3d 20 28 69 36          iB = (i6
a020: 34 29 72 42 3b 0a 20 20 20 20 20 20 20 20 69 66  4)rB;.        if
a030: 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61  ( iA==0 ) goto a
a040: 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74  rithmetic_result
a050: 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20  _is_null;.      
a060: 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 29 20 69    if( iA==-1 ) i
a070: 41 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  A = 1;.        r
a080: 42 20 3d 20 28 64 6f 75 62 6c 65 29 28 69 42 20  B = (double)(iB 
a090: 25 20 69 41 29 3b 0a 20 20 20 20 20 20 20 20 62  % iA);.        b
a0a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
a0b0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
a0c0: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
a0d0: 50 4f 49 4e 54 0a 20 20 20 20 70 4f 75 74 2d 3e  POINT.    pOut->
a0e0: 75 2e 69 20 3d 20 72 42 3b 0a 20 20 20 20 4d 65  u.i = rB;.    Me
a0f0: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
a100: 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 23 65 6c  t, MEM_Int);.#el
a110: 73 65 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  se.    if( sqlit
a120: 65 33 49 73 4e 61 4e 28 72 42 29 20 29 7b 0a 20  e3IsNaN(rB) ){. 
a130: 20 20 20 20 20 67 6f 74 6f 20 61 72 69 74 68 6d       goto arithm
a140: 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e  etic_result_is_n
a150: 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ull;.    }.    p
a160: 4f 75 74 2d 3e 72 20 3d 20 72 42 3b 0a 20 20 20  Out->r = rB;.   
a170: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
a180: 70 4f 75 74 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b  pOut, MEM_Real);
a190: 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
a1a0: 26 20 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20 29  & MEM_Real)==0 )
a1b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
a1c0: 64 62 65 49 6e 74 65 67 65 72 41 66 66 69 6e 69  dbeIntegerAffini
a1d0: 74 79 28 70 4f 75 74 29 3b 0a 20 20 20 20 7d 0a  ty(pOut);.    }.
a1e0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 62 72 65  #endif.  }.  bre
a1f0: 61 6b 3b 0a 0a 61 72 69 74 68 6d 65 74 69 63 5f  ak;..arithmetic_
a200: 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3a 0a  result_is_null:.
a210: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
a220: 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
a230: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
a240: 63 6f 64 65 3a 20 43 6f 6c 6c 53 65 71 20 2a 20  code: CollSeq * 
a250: 2a 20 50 34 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  * P4.**.** P4 is
a260: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
a270: 43 6f 6c 6c 53 65 71 20 73 74 72 75 63 74 2e 20  CollSeq struct. 
a280: 49 66 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  If the next call
a290: 20 74 6f 20 61 20 75 73 65 72 20 66 75 6e 63 74   to a user funct
a2a0: 69 6f 6e 0a 2a 2a 20 6f 72 20 61 67 67 72 65 67  ion.** or aggreg
a2b0: 61 74 65 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ate calls sqlite
a2c0: 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28  3GetFuncCollSeq(
a2d0: 29 2c 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f  ), this collatio
a2e0: 6e 20 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 0a  n sequence will.
a2f0: 2a 2a 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ** be returned. 
a300: 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
a310: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e  the built-in min
a320: 28 29 2c 20 6d 61 78 28 29 20 61 6e 64 20 6e 75  (), max() and nu
a330: 6c 6c 69 66 28 29 0a 2a 2a 20 66 75 6e 63 74 69  llif().** functi
a340: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ons..**.** The i
a350: 6e 74 65 72 66 61 63 65 20 75 73 65 64 20 62 79  nterface used by
a360: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
a370: 69 6f 6e 20 6f 66 20 74 68 65 20 61 66 6f 72 65  ion of the afore
a380: 6d 65 6e 74 69 6f 6e 65 64 20 66 75 6e 63 74 69  mentioned functi
a390: 6f 6e 73 0a 2a 2a 20 74 6f 20 72 65 74 72 69 65  ons.** to retrie
a3a0: 76 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ve the collation
a3b0: 20 73 65 71 75 65 6e 63 65 20 73 65 74 20 62 79   sequence set by
a3c0: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   this opcode is 
a3d0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  not available.**
a3e0: 20 70 75 62 6c 69 63 6c 79 2c 20 6f 6e 6c 79 20   publicly, only 
a3f0: 74 6f 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  to user function
a400: 73 20 64 65 66 69 6e 65 64 20 69 6e 20 66 75 6e  s defined in fun
a410: 63 2e 63 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  c.c..*/.case OP_
a420: 43 6f 6c 6c 53 65 71 3a 20 7b 0a 20 20 61 73 73  CollSeq: {.  ass
a430: 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
a440: 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a  ==P4_COLLSEQ );.
a450: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
a460: 70 63 6f 64 65 3a 20 46 75 6e 63 74 69 6f 6e 20  pcode: Function 
a470: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
a480: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 61 20 75 73  *.** Invoke a us
a490: 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 50 34 20  er function (P4 
a4a0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
a4b0: 61 20 46 75 6e 63 74 69 6f 6e 20 73 74 72 75 63  a Function struc
a4c0: 74 75 72 65 20 74 68 61 74 0a 2a 2a 20 64 65 66  ture that.** def
a4d0: 69 6e 65 73 20 74 68 65 20 66 75 6e 63 74 69 6f  ines the functio
a4e0: 6e 29 20 77 69 74 68 20 50 35 20 61 72 67 75 6d  n) with P5 argum
a4f0: 65 6e 74 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  ents taken from 
a500: 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 64 0a  register P2 and.
a510: 2a 2a 20 73 75 63 63 65 73 73 6f 72 73 2e 20 20  ** successors.  
a520: 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  The result of th
a530: 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 74  e function is st
a540: 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
a550: 20 50 33 2e 0a 2a 2a 20 52 65 67 69 73 74 65 72   P3..** Register
a560: 20 50 33 20 6d 75 73 74 20 6e 6f 74 20 62 65 20   P3 must not be 
a570: 6f 6e 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74  one of the funct
a580: 69 6f 6e 20 69 6e 70 75 74 73 2e 0a 2a 2a 0a 2a  ion inputs..**.*
a590: 2a 20 50 31 20 69 73 20 61 20 33 32 2d 62 69 74  * P1 is a 32-bit
a5a0: 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74   bitmask indicat
a5b0: 69 6e 67 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ing whether or n
a5c0: 6f 74 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  ot each argument
a5d0: 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66 75 6e 63   to the .** func
a5e0: 74 69 6f 6e 20 77 61 73 20 64 65 74 65 72 6d 69  tion was determi
a5f0: 6e 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 74 61  ned to be consta
a600: 6e 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  nt at compile ti
a610: 6d 65 2e 20 49 66 20 74 68 65 20 66 69 72 73 74  me. If the first
a620: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 77 61 73  .** argument was
a630: 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 62   constant then b
a640: 69 74 20 30 20 6f 66 20 50 31 20 69 73 20 73 65  it 0 of P1 is se
a650: 74 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  t. This is used 
a660: 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  to determine.** 
a670: 77 68 65 74 68 65 72 20 6d 65 74 61 20 64 61 74  whether meta dat
a680: 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
a690: 68 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f  h a user functio
a6a0: 6e 20 61 72 67 75 6d 65 6e 74 20 75 73 69 6e 67  n argument using
a6b0: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
a6c0: 73 65 74 5f 61 75 78 64 61 74 61 28 29 20 41 50  set_auxdata() AP
a6d0: 49 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20  I may be safely 
a6e0: 72 65 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 74  retained until t
a6f0: 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 76 6f 63  he next.** invoc
a700: 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 6f 70  ation of this op
a710: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  code..**.** See 
a720: 61 6c 73 6f 3a 20 41 67 67 53 74 65 70 20 61 6e  also: AggStep an
a730: 64 20 41 67 67 46 69 6e 61 6c 0a 2a 2f 0a 63 61  d AggFinal.*/.ca
a740: 73 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 3a 20  se OP_Function: 
a750: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d  {.  int i;.  Mem
a760: 20 2a 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65   *pArg;.  sqlite
a770: 33 5f 63 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20  3_context ctx;. 
a780: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
a790: 2a 61 70 56 61 6c 3b 0a 20 20 69 6e 74 20 6e 3b  *apVal;.  int n;
a7a0: 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 35 3b  ..  n = pOp->p5;
a7b0: 0a 20 20 61 70 56 61 6c 20 3d 20 70 2d 3e 61 70  .  apVal = p->ap
a7c0: 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 61  Arg;.  assert( a
a7d0: 70 56 61 6c 20 7c 7c 20 6e 3d 3d 30 20 29 3b 0a  pVal || n==0 );.
a7e0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
a7f0: 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d  3>0 && pOp->p3<=
a800: 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 4f 75  p->nMem );.  pOu
a810: 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
a820: 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f  3];.  memAboutTo
a830: 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b  Change(p, pOut);
a840: 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 30  ..  assert( n==0
a850: 20 7c 7c 20 28 70 4f 70 2d 3e 70 32 3e 30 20 26   || (pOp->p2>0 &
a860: 26 20 70 4f 70 2d 3e 70 32 2b 6e 3c 3d 70 2d 3e  & pOp->p2+n<=p->
a870: 6e 4d 65 6d 2b 31 29 20 29 3b 0a 20 20 61 73 73  nMem+1) );.  ass
a880: 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f 70  ert( pOp->p3<pOp
a890: 2d 3e 70 32 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e  ->p2 || pOp->p3>
a8a0: 3d 70 4f 70 2d 3e 70 32 2b 6e 20 29 3b 0a 20 20  =pOp->p2+n );.  
a8b0: 70 41 72 67 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pArg = &aMem[pOp
a8c0: 2d 3e 70 32 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ->p2];.  for(i=0
a8d0: 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 41 72 67  ; i<n; i++, pArg
a8e0: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
a8f0: 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 41 72 67   memIsValid(pArg
a900: 29 20 29 3b 0a 20 20 20 20 61 70 56 61 6c 5b 69  ) );.    apVal[i
a910: 5d 20 3d 20 70 41 72 67 3b 0a 20 20 20 20 44 65  ] = pArg;.    De
a920: 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 70 41 72  ephemeralize(pAr
a930: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  g);.    sqlite3V
a940: 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28  dbeMemStoreType(
a950: 70 41 72 67 29 3b 0a 20 20 20 20 52 45 47 49 53  pArg);.    REGIS
a960: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
a970: 32 2b 69 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a  2+i, pArg);.  }.
a980: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
a990: 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43 44  p4type==P4_FUNCD
a9a0: 45 46 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70  EF || pOp->p4typ
a9b0: 65 3d 3d 50 34 5f 56 44 42 45 46 55 4e 43 20 29  e==P4_VDBEFUNC )
a9c0: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74  ;.  if( pOp->p4t
a9d0: 79 70 65 3d 3d 50 34 5f 46 55 4e 43 44 45 46 20  ype==P4_FUNCDEF 
a9e0: 29 7b 0a 20 20 20 20 63 74 78 2e 70 46 75 6e 63  ){.    ctx.pFunc
a9f0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63   = pOp->p4.pFunc
aa00: 3b 0a 20 20 20 20 63 74 78 2e 70 56 64 62 65 46  ;.    ctx.pVdbeF
aa10: 75 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  unc = 0;.  }else
aa20: 7b 0a 20 20 20 20 63 74 78 2e 70 56 64 62 65 46  {.    ctx.pVdbeF
aa30: 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63 2a  unc = (VdbeFunc*
aa40: 29 70 4f 70 2d 3e 70 34 2e 70 56 64 62 65 46 75  )pOp->p4.pVdbeFu
aa50: 6e 63 3b 0a 20 20 20 20 63 74 78 2e 70 46 75 6e  nc;.    ctx.pFun
aa60: 63 20 3d 20 63 74 78 2e 70 56 64 62 65 46 75 6e  c = ctx.pVdbeFun
aa70: 63 2d 3e 70 46 75 6e 63 3b 0a 20 20 7d 0a 0a 20  c->pFunc;.  }.. 
aa80: 20 63 74 78 2e 73 2e 66 6c 61 67 73 20 3d 20 4d   ctx.s.flags = M
aa90: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 63 74 78 2e 73  EM_Null;.  ctx.s
aaa0: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 63 74 78 2e  .db = db;.  ctx.
aab0: 73 2e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 63 74  s.xDel = 0;.  ct
aac0: 78 2e 73 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  x.s.zMalloc = 0;
aad0: 0a 0a 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75  ..  /* The outpu
aae0: 74 20 63 65 6c 6c 20 6d 61 79 20 61 6c 72 65 61  t cell may alrea
aaf0: 64 79 20 68 61 76 65 20 61 20 62 75 66 66 65 72  dy have a buffer
ab00: 20 61 6c 6c 6f 63 61 74 65 64 2e 20 4d 6f 76 65   allocated. Move
ab10: 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
ab20: 72 20 74 6f 20 63 74 78 2e 73 20 73 6f 20 69 6e  r to ctx.s so in
ab30: 20 63 61 73 65 20 74 68 65 20 75 73 65 72 2d 66   case the user-f
ab40: 75 6e 63 74 69 6f 6e 20 63 61 6e 20 75 73 65 0a  unction can use.
ab50: 20 20 2a 2a 20 74 68 65 20 61 6c 72 65 61 64 79    ** the already
ab60: 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
ab70: 72 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6c 6c  r instead of all
ab80: 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e  ocating a new on
ab90: 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
aba0: 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 26 63 74  3VdbeMemMove(&ct
abb0: 78 2e 73 2c 20 70 4f 75 74 29 3b 0a 20 20 4d 65  x.s, pOut);.  Me
abc0: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 26 63 74  mSetTypeFlag(&ct
abd0: 78 2e 73 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  x.s, MEM_Null);.
abe0: 0a 20 20 63 74 78 2e 69 73 45 72 72 6f 72 20 3d  .  ctx.isError =
abf0: 20 30 3b 0a 20 20 69 66 28 20 63 74 78 2e 70 46   0;.  if( ctx.pF
ac00: 75 6e 63 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  unc->flags & SQL
ac10: 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
ac20: 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  L ){.    assert(
ac30: 20 70 4f 70 3e 61 4f 70 20 29 3b 0a 20 20 20 20   pOp>aOp );.    
ac40: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
ac50: 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53  p4type==P4_COLLS
ac60: 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
ac70: 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65  ( pOp[-1].opcode
ac80: 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71 20 29 3b 0a  ==OP_CollSeq );.
ac90: 20 20 20 20 63 74 78 2e 70 43 6f 6c 6c 20 3d 20      ctx.pColl = 
aca0: 70 4f 70 5b 2d 31 5d 2e 70 34 2e 70 43 6f 6c 6c  pOp[-1].p4.pColl
acb0: 3b 0a 20 20 7d 0a 20 20 28 2a 63 74 78 2e 70 46  ;.  }.  (*ctx.pF
acc0: 75 6e 63 2d 3e 78 46 75 6e 63 29 28 26 63 74 78  unc->xFunc)(&ctx
acd0: 2c 20 6e 2c 20 61 70 56 61 6c 29 3b 20 2f 2a 20  , n, apVal); /* 
ace0: 49 4d 50 3a 20 52 2d 32 34 35 30 35 2d 32 33 32  IMP: R-24505-232
acf0: 33 30 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  30 */.  if( db->
ad00: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
ad10: 20 20 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75      /* Even thou
ad20: 67 68 20 61 20 6d 61 6c 6c 6f 63 28 29 20 68 61  gh a malloc() ha
ad30: 73 20 66 61 69 6c 65 64 2c 20 74 68 65 20 69 6d  s failed, the im
ad40: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
ad50: 74 68 65 0a 20 20 20 20 2a 2a 20 75 73 65 72 20  the.    ** user 
ad60: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 68 61 76  function may hav
ad70: 65 20 63 61 6c 6c 65 64 20 61 6e 20 73 71 6c 69  e called an sqli
ad80: 74 65 33 5f 72 65 73 75 6c 74 5f 58 58 58 28 29  te3_result_XXX()
ad90: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a   function.    **
ada0: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 76 61 6c   to return a val
adb0: 75 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ue. The followin
adc0: 67 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 73 20  g call releases 
add0: 61 6e 79 20 72 65 73 6f 75 72 63 65 73 0a 20 20  any resources.  
ade0: 20 20 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20    ** associated 
adf0: 77 69 74 68 20 73 75 63 68 20 61 20 76 61 6c 75  with such a valu
ae00: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
ae10: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
ae20: 61 73 65 28 26 63 74 78 2e 73 29 3b 0a 20 20 20  ase(&ctx.s);.   
ae30: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
ae40: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 61  }..  /* If any a
ae50: 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 66 75  uxiliary data fu
ae60: 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65  nctions have bee
ae70: 6e 20 63 61 6c 6c 65 64 20 62 79 20 74 68 69 73  n called by this
ae80: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2c 0a   user function,.
ae90: 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
aea0: 20 63 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75   call the destru
aeb0: 63 74 6f 72 20 66 6f 72 20 61 6e 79 20 6e 6f 6e  ctor for any non
aec0: 2d 73 74 61 74 69 63 20 76 61 6c 75 65 73 2e 0a  -static values..
aed0: 20 20 2a 2f 0a 20 20 69 66 28 20 63 74 78 2e 70    */.  if( ctx.p
aee0: 56 64 62 65 46 75 6e 63 20 29 7b 0a 20 20 20 20  VdbeFunc ){.    
aef0: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
af00: 65 41 75 78 44 61 74 61 28 63 74 78 2e 70 56 64  eAuxData(ctx.pVd
af10: 62 65 46 75 6e 63 2c 20 70 4f 70 2d 3e 70 31 29  beFunc, pOp->p1)
af20: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 56  ;.    pOp->p4.pV
af30: 64 62 65 46 75 6e 63 20 3d 20 63 74 78 2e 70 56  dbeFunc = ctx.pV
af40: 64 62 65 46 75 6e 63 3b 0a 20 20 20 20 70 4f 70  dbeFunc;.    pOp
af50: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56 44  ->p4type = P4_VD
af60: 42 45 46 55 4e 43 3b 0a 20 20 7d 0a 0a 20 20 2f  BEFUNC;.  }..  /
af70: 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f  * If the functio
af80: 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72  n returned an er
af90: 72 6f 72 2c 20 74 68 72 6f 77 20 61 6e 20 65 78  ror, throw an ex
afa0: 63 65 70 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28  ception */.  if(
afb0: 20 63 74 78 2e 69 73 45 72 72 6f 72 20 29 7b 0a   ctx.isError ){.
afc0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
afd0: 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
afe0: 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69  , db, "%s", sqli
aff0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 26  te3_value_text(&
b000: 63 74 78 2e 73 29 29 3b 0a 20 20 20 20 72 63 20  ctx.s));.    rc 
b010: 3d 20 63 74 78 2e 69 73 45 72 72 6f 72 3b 0a 20  = ctx.isError;. 
b020: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68   }..  /* Copy th
b030: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
b040: 66 75 6e 63 74 69 6f 6e 20 69 6e 74 6f 20 72 65  function into re
b050: 67 69 73 74 65 72 20 50 33 20 2a 2f 0a 20 20 73  gister P3 */.  s
b060: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
b070: 45 6e 63 6f 64 69 6e 67 28 26 63 74 78 2e 73 2c  Encoding(&ctx.s,
b080: 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 73 71   encoding);.  sq
b090: 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65  lite3VdbeMemMove
b0a0: 28 70 4f 75 74 2c 20 26 63 74 78 2e 73 29 3b 0a  (pOut, &ctx.s);.
b0b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
b0c0: 65 4d 65 6d 54 6f 6f 42 69 67 28 70 4f 75 74 29  eMemTooBig(pOut)
b0d0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f   ){.    goto too
b0e0: 5f 62 69 67 3b 0a 20 20 7d 0a 0a 23 69 66 20 30  _big;.  }..#if 0
b0f0: 0a 20 20 2f 2a 20 54 68 65 20 61 70 70 2d 64 65  .  /* The app-de
b100: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 20 68  fined function h
b110: 61 73 20 64 6f 6e 65 20 73 6f 6d 65 74 68 69 6e  as done somethin
b120: 67 20 74 68 61 74 20 61 73 20 63 61 75 73 65 64  g that as caused
b130: 20 74 68 69 73 0a 20 20 2a 2a 20 73 74 61 74 65   this.  ** state
b140: 6d 65 6e 74 20 74 6f 20 65 78 70 69 72 65 2e 20  ment to expire. 
b150: 20 28 50 65 72 68 61 70 73 20 74 68 65 20 66 75   (Perhaps the fu
b160: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 73 71  nction called sq
b170: 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 20 20 2a  lite3_exec().  *
b180: 2a 20 77 69 74 68 20 61 20 43 52 45 41 54 45 20  * with a CREATE 
b190: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
b1a0: 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ).  */.  if( p->
b1b0: 65 78 70 69 72 65 64 20 29 20 72 63 20 3d 20 53  expired ) rc = S
b1c0: 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 23 65 6e  QLITE_ABORT;.#en
b1d0: 64 69 66 0a 0a 20 20 52 45 47 49 53 54 45 52 5f  dif..  REGISTER_
b1e0: 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70  TRACE(pOp->p3, p
b1f0: 4f 75 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d  Out);.  UPDATE_M
b200: 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74  AX_BLOBSIZE(pOut
b210: 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
b220: 2a 20 4f 70 63 6f 64 65 3a 20 42 69 74 41 6e 64  * Opcode: BitAnd
b230: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
b240: 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 62 69 74  .** Take the bit
b250: 2d 77 69 73 65 20 41 4e 44 20 6f 66 20 74 68 65  -wise AND of the
b260: 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73   values in regis
b270: 74 65 72 20 50 31 20 61 6e 64 20 50 32 20 61 6e  ter P1 and P2 an
b280: 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72  d.** store the r
b290: 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65  esult in registe
b2a0: 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68  r P3..** If eith
b2b0: 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c  er input is NULL
b2c0: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
b2d0: 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  NULL..*/./* Opco
b2e0: 64 65 3a 20 42 69 74 4f 72 20 50 31 20 50 32 20  de: BitOr P1 P2 
b2f0: 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 61 6b  P3 * *.**.** Tak
b300: 65 20 74 68 65 20 62 69 74 2d 77 69 73 65 20 4f  e the bit-wise O
b310: 52 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  R of the values 
b320: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 61  in register P1 a
b330: 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f  nd P2 and.** sto
b340: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
b350: 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
b360: 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74   If either input
b370: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   is NULL, the re
b380: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  sult is NULL..*/
b390: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68 69 66  ./* Opcode: Shif
b3a0: 74 4c 65 66 74 20 50 31 20 50 32 20 50 33 20 2a  tLeft P1 P2 P3 *
b3b0: 20 2a 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74 20 74   *.**.** Shift t
b3c0: 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
b3d0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 20   in register P2 
b3e0: 74 6f 20 74 68 65 20 6c 65 66 74 20 62 79 20 74  to the left by t
b3f0: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
b400: 62 69 74 73 20 73 70 65 63 69 66 69 65 64 20 62  bits specified b
b410: 79 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 6e  y the integer in
b420: 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a   register P1..**
b430: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
b440: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  t in register P3
b450: 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69  ..** If either i
b460: 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  nput is NULL, th
b470: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
b480: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
b490: 53 68 69 66 74 52 69 67 68 74 20 50 31 20 50 32  ShiftRight P1 P2
b4a0: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 68   P3 * *.**.** Sh
b4b0: 69 66 74 20 74 68 65 20 69 6e 74 65 67 65 72 20  ift the integer 
b4c0: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
b4d0: 72 20 50 32 20 74 6f 20 74 68 65 20 72 69 67 68  r P2 to the righ
b4e0: 74 20 62 79 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  t by the.** numb
b4f0: 65 72 20 6f 66 20 62 69 74 73 20 73 70 65 63 69  er of bits speci
b500: 66 69 65 64 20 62 79 20 74 68 65 20 69 6e 74 65  fied by the inte
b510: 67 65 72 20 69 6e 20 72 65 67 69 73 74 65 72 20  ger in register 
b520: 50 31 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65  P1..** Store the
b530: 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73   result in regis
b540: 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69  ter P3..** If ei
b550: 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55  ther input is NU
b560: 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  LL, the result i
b570: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20  s NULL..*/.case 
b580: 4f 50 5f 42 69 74 41 6e 64 3a 20 20 20 20 20 20  OP_BitAnd:      
b590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
b5a0: 6d 65 20 61 73 20 54 4b 5f 42 49 54 41 4e 44 2c  me as TK_BITAND,
b5b0: 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
b5c0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74 4f 72  */.case OP_BitOr
b5d0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
b5e0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
b5f0: 5f 42 49 54 4f 52 2c 20 69 6e 31 2c 20 69 6e 32  _BITOR, in1, in2
b600: 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f  , out3 */.case O
b610: 50 5f 53 68 69 66 74 4c 65 66 74 3a 20 20 20 20  P_ShiftLeft:    
b620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
b630: 65 20 61 73 20 54 4b 5f 4c 53 48 49 46 54 2c 20  e as TK_LSHIFT, 
b640: 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a  in1, in2, out3 *
b650: 2f 0a 63 61 73 65 20 4f 50 5f 53 68 69 66 74 52  /.case OP_ShiftR
b660: 69 67 68 74 3a 20 7b 20 20 20 20 20 20 20 20 20  ight: {         
b670: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
b680: 52 53 48 49 46 54 2c 20 69 6e 31 2c 20 69 6e 32  RSHIFT, in1, in2
b690: 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34 20  , out3 */.  i64 
b6a0: 69 41 3b 0a 20 20 75 36 34 20 75 41 3b 0a 20 20  iA;.  u64 uA;.  
b6b0: 69 36 34 20 69 42 3b 0a 20 20 75 38 20 6f 70 3b  i64 iB;.  u8 op;
b6c0: 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ..  pIn1 = &aMem
b6d0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e  [pOp->p1];.  pIn
b6e0: 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  2 = &aMem[pOp->p
b6f0: 32 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d  2];.  pOut = &aM
b700: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69  em[pOp->p3];.  i
b710: 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
b720: 7c 20 70 49 6e 32 2d 3e 66 6c 61 67 73 29 20 26  | pIn2->flags) &
b730: 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   MEM_Null ){.   
b740: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
b750: 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20  etNull(pOut);.  
b760: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69    break;.  }.  i
b770: 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49  A = sqlite3VdbeI
b780: 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 3b 0a 20  ntValue(pIn2);. 
b790: 20 69 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62   iB = sqlite3Vdb
b7a0: 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 3b  eIntValue(pIn1);
b7b0: 0a 20 20 6f 70 20 3d 20 70 4f 70 2d 3e 6f 70 63  .  op = pOp->opc
b7c0: 6f 64 65 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 4f  ode;.  if( op==O
b7d0: 50 5f 42 69 74 41 6e 64 20 29 7b 0a 20 20 20 20  P_BitAnd ){.    
b7e0: 69 41 20 26 3d 20 69 42 3b 0a 20 20 7d 65 6c 73  iA &= iB;.  }els
b7f0: 65 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 42 69 74  e if( op==OP_Bit
b800: 4f 72 20 29 7b 0a 20 20 20 20 69 41 20 7c 3d 20  Or ){.    iA |= 
b810: 69 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  iB;.  }else if( 
b820: 69 42 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  iB!=0 ){.    ass
b830: 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 53 68 69 66  ert( op==OP_Shif
b840: 74 52 69 67 68 74 20 7c 7c 20 6f 70 3d 3d 4f 50  tRight || op==OP
b850: 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 0a 20  _ShiftLeft );.. 
b860: 20 20 20 2f 2a 20 49 66 20 73 68 69 66 74 69 6e     /* If shiftin
b870: 67 20 62 79 20 61 20 6e 65 67 61 74 69 76 65 20  g by a negative 
b880: 61 6d 6f 75 6e 74 2c 20 73 68 69 66 74 20 69 6e  amount, shift in
b890: 20 74 68 65 20 6f 74 68 65 72 20 64 69 72 65 63   the other direc
b8a0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tion */.    if( 
b8b0: 69 42 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73  iB<0 ){.      as
b8c0: 73 65 72 74 28 20 4f 50 5f 53 68 69 66 74 52 69  sert( OP_ShiftRi
b8d0: 67 68 74 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66  ght==OP_ShiftLef
b8e0: 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 6f 70 20  t+1 );.      op 
b8f0: 3d 20 32 2a 4f 50 5f 53 68 69 66 74 4c 65 66 74  = 2*OP_ShiftLeft
b900: 20 2b 20 31 20 2d 20 6f 70 3b 0a 20 20 20 20 20   + 1 - op;.     
b910: 20 69 42 20 3d 20 69 42 3e 28 2d 36 34 29 20 3f   iB = iB>(-64) ?
b920: 20 2d 69 42 20 3a 20 36 34 3b 0a 20 20 20 20 7d   -iB : 64;.    }
b930: 0a 0a 20 20 20 20 69 66 28 20 69 42 3e 3d 36 34  ..    if( iB>=64
b940: 20 29 7b 0a 20 20 20 20 20 20 69 41 20 3d 20 28   ){.      iA = (
b950: 69 41 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  iA>=0 || op==OP_
b960: 53 68 69 66 74 4c 65 66 74 29 20 3f 20 30 20 3a  ShiftLeft) ? 0 :
b970: 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
b980: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 75 41        memcpy(&uA
b990: 2c 20 26 69 41 2c 20 73 69 7a 65 6f 66 28 75 41  , &iA, sizeof(uA
b9a0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  ));.      if( op
b9b0: 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29  ==OP_ShiftLeft )
b9c0: 7b 0a 20 20 20 20 20 20 20 20 75 41 20 3c 3c 3d  {.        uA <<=
b9d0: 20 69 42 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   iB;.      }else
b9e0: 7b 0a 20 20 20 20 20 20 20 20 75 41 20 3e 3e 3d  {.        uA >>=
b9f0: 20 69 42 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20   iB;.        /* 
ba00: 53 69 67 6e 2d 65 78 74 65 6e 64 20 6f 6e 20 61  Sign-extend on a
ba10: 20 72 69 67 68 74 20 73 68 69 66 74 20 6f 66 20   right shift of 
ba20: 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
ba30: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  r */.        if(
ba40: 20 69 41 3c 30 20 29 20 75 41 20 7c 3d 20 28 28   iA<0 ) uA |= ((
ba50: 28 28 75 36 34 29 30 78 66 66 66 66 66 66 66 66  ((u64)0xffffffff
ba60: 29 3c 3c 33 32 29 7c 30 78 66 66 66 66 66 66 66  )<<32)|0xfffffff
ba70: 66 29 20 3c 3c 20 28 36 34 2d 69 42 29 3b 0a 20  f) << (64-iB);. 
ba80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
ba90: 63 70 79 28 26 69 41 2c 20 26 75 41 2c 20 73 69  cpy(&iA, &uA, si
baa0: 7a 65 6f 66 28 69 41 29 29 3b 0a 20 20 20 20 7d  zeof(iA));.    }
bab0: 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69  .  }.  pOut->u.i
bac0: 20 3d 20 69 41 3b 0a 20 20 4d 65 6d 53 65 74 54   = iA;.  MemSetT
bad0: 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45  ypeFlag(pOut, ME
bae0: 4d 5f 49 6e 74 29 3b 0a 20 20 62 72 65 61 6b 3b  M_Int);.  break;
baf0: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41  .}../* Opcode: A
bb00: 64 64 49 6d 6d 20 20 50 31 20 50 32 20 2a 20 2a  ddImm  P1 P2 * *
bb10: 20 2a 0a 2a 2a 20 0a 2a 2a 20 41 64 64 20 74 68   *.** .** Add th
bb20: 65 20 63 6f 6e 73 74 61 6e 74 20 50 32 20 74 6f  e constant P2 to
bb30: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
bb40: 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20 54 68  gister P1..** Th
bb50: 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61  e result is alwa
bb60: 79 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a  ys an integer..*
bb70: 2a 0a 2a 2a 20 54 6f 20 66 6f 72 63 65 20 61 6e  *.** To force an
bb80: 79 20 72 65 67 69 73 74 65 72 20 74 6f 20 62 65  y register to be
bb90: 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 6a 75 73   an integer, jus
bba0: 74 20 61 64 64 20 30 2e 0a 2a 2f 0a 63 61 73 65  t add 0..*/.case
bbb0: 20 4f 50 5f 41 64 64 49 6d 6d 3a 20 7b 20 20 20   OP_AddImm: {   
bbc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20           /* in1 
bbd0: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
bbe0: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 6d 65  m[pOp->p1];.  me
bbf0: 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
bc00: 2c 20 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69 74  , pIn1);.  sqlit
bc10: 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72  e3VdbeMemInteger
bc20: 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e  ify(pIn1);.  pIn
bc30: 31 2d 3e 75 2e 69 20 2b 3d 20 70 4f 70 2d 3e 70  1->u.i += pOp->p
bc40: 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  2;.  break;.}../
bc50: 2a 20 4f 70 63 6f 64 65 3a 20 4d 75 73 74 42 65  * Opcode: MustBe
bc60: 49 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  Int P1 P2 * * *.
bc70: 2a 2a 20 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65  ** .** Force the
bc80: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
bc90: 65 72 20 50 31 20 74 6f 20 62 65 20 61 6e 20 69  er P1 to be an i
bca0: 6e 74 65 67 65 72 2e 20 20 49 66 20 74 68 65 20  nteger.  If the 
bcb0: 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20 69  value.** in P1 i
bcc0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
bcd0: 20 61 6e 64 20 63 61 6e 6e 6f 74 20 62 65 20 63   and cannot be c
bce0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e  onverted into an
bcf0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 77 69 74 68   integer.** with
bd00: 6f 75 74 20 64 61 74 61 20 6c 6f 73 73 2c 20 74  out data loss, t
bd10: 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  hen jump immedia
bd20: 74 65 6c 79 20 74 6f 20 50 32 2c 20 6f 72 20 69  tely to P2, or i
bd30: 66 20 50 32 3d 3d 30 0a 2a 2a 20 72 61 69 73 65  f P2==0.** raise
bd40: 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41   an SQLITE_MISMA
bd50: 54 43 48 20 65 78 63 65 70 74 69 6f 6e 2e 0a 2a  TCH exception..*
bd60: 2f 0a 63 61 73 65 20 4f 50 5f 4d 75 73 74 42 65  /.case OP_MustBe
bd70: 49 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20  Int: {          
bd80: 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a    /* jump, in1 *
bd90: 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
bda0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 70 70  [pOp->p1];.  app
bdb0: 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c  lyAffinity(pIn1,
bdc0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
bdd0: 52 49 43 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  RIC, encoding);.
bde0: 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
bdf0: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30  gs & MEM_Int)==0
be00: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d   ){.    if( pOp-
be10: 3e 70 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >p2==0 ){.      
be20: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 4d  rc = SQLITE_MISM
be30: 41 54 43 48 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ATCH;.      goto
be40: 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
be50: 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ror;.    }else{.
be60: 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e        pc = pOp->
be70: 70 32 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  p2 - 1;.    }.  
be80: 7d 65 6c 73 65 7b 0a 20 20 20 20 4d 65 6d 53 65  }else{.    MemSe
be90: 74 54 79 70 65 46 6c 61 67 28 70 49 6e 31 2c 20  tTypeFlag(pIn1, 
bea0: 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 20 20  MEM_Int);.  }.  
beb0: 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  break;.}..#ifnde
bec0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
bed0: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 20  OATING_POINT./* 
bee0: 4f 70 63 6f 64 65 3a 20 52 65 61 6c 41 66 66 69  Opcode: RealAffi
bef0: 6e 69 74 79 20 50 31 20 2a 20 2a 20 2a 20 2a 0a  nity P1 * * * *.
bf00: 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 69 73 74 65  **.** If registe
bf10: 72 20 50 31 20 68 6f 6c 64 73 20 61 6e 20 69 6e  r P1 holds an in
bf20: 74 65 67 65 72 20 63 6f 6e 76 65 72 74 20 69 74  teger convert it
bf30: 20 74 6f 20 61 20 72 65 61 6c 20 76 61 6c 75 65   to a real value
bf40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
bf50: 6f 64 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  ode is used when
bf60: 20 65 78 74 72 61 63 74 69 6e 67 20 69 6e 66 6f   extracting info
bf70: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 63  rmation from a c
bf80: 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 68 61  olumn that.** ha
bf90: 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2e  s REAL affinity.
bfa0: 20 20 53 75 63 68 20 63 6f 6c 75 6d 6e 20 76 61    Such column va
bfb0: 6c 75 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  lues may still b
bfc0: 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 69  e stored as.** i
bfd0: 6e 74 65 67 65 72 73 2c 20 66 6f 72 20 73 70 61  ntegers, for spa
bfe0: 63 65 20 65 66 66 69 63 69 65 6e 63 79 2c 20 62  ce efficiency, b
bff0: 75 74 20 61 66 74 65 72 20 65 78 74 72 61 63 74  ut after extract
c000: 69 6f 6e 20 77 65 20 77 61 6e 74 20 74 68 65 6d  ion we want them
c010: 0a 2a 2a 20 74 6f 20 68 61 76 65 20 6f 6e 6c 79  .** to have only
c020: 20 61 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a 2a   a real value..*
c030: 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61 6c 41 66  /.case OP_RealAf
c040: 66 69 6e 69 74 79 3a 20 7b 20 20 20 20 20 20 20  finity: {       
c050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
c060: 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61  1 */.  pIn1 = &a
c070: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
c080: 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  if( pIn1->flags 
c090: 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  & MEM_Int ){.   
c0a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
c0b0: 65 61 6c 69 66 79 28 70 49 6e 31 29 3b 0a 20 20  ealify(pIn1);.  
c0c0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  }.  break;.}.#en
c0d0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
c0e0: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 2f 2a  ITE_OMIT_CAST./*
c0f0: 20 4f 70 63 6f 64 65 3a 20 54 6f 54 65 78 74 20   Opcode: ToText 
c100: 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  P1 * * * *.**.**
c110: 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75 65   Force the value
c120: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
c130: 74 6f 20 62 65 20 74 65 78 74 2e 0a 2a 2a 20 49  to be text..** I
c140: 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 6e  f the value is n
c150: 75 6d 65 72 69 63 2c 20 63 6f 6e 76 65 72 74 20  umeric, convert 
c160: 69 74 20 74 6f 20 61 20 73 74 72 69 6e 67 20 75  it to a string u
c170: 73 69 6e 67 20 74 68 65 0a 2a 2a 20 65 71 75 69  sing the.** equi
c180: 76 61 6c 65 6e 74 20 6f 66 20 70 72 69 6e 74 66  valent of printf
c190: 28 29 2e 20 20 42 6c 6f 62 20 76 61 6c 75 65 73  ().  Blob values
c1a0: 20 61 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61   are unchanged a
c1b0: 6e 64 0a 2a 2a 20 61 72 65 20 61 66 74 65 72 77  nd.** are afterw
c1c0: 61 72 64 73 20 73 69 6d 70 6c 79 20 69 6e 74 65  ards simply inte
c1d0: 72 70 72 65 74 65 64 20 61 73 20 74 65 78 74 2e  rpreted as text.
c1e0: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76 61  .**.** A NULL va
c1f0: 6c 75 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  lue is not chang
c200: 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
c210: 6e 65 2e 20 20 49 74 20 72 65 6d 61 69 6e 73 20  ne.  It remains 
c220: 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  NULL..*/.case OP
c230: 5f 54 6f 54 65 78 74 3a 20 7b 20 20 20 20 20 20  _ToText: {      
c240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
c250: 61 6d 65 20 61 73 20 54 4b 5f 54 4f 5f 54 45 58  ame as TK_TO_TEX
c260: 54 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31  T, in1 */.  pIn1
c270: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
c280: 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43  ];.  memAboutToC
c290: 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a  hange(p, pIn1);.
c2a0: 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67    if( pIn1->flag
c2b0: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 20 62  s & MEM_Null ) b
c2c0: 72 65 61 6b 3b 0a 20 20 61 73 73 65 72 74 28 20  reak;.  assert( 
c2d0: 4d 45 4d 5f 53 74 72 3d 3d 28 4d 45 4d 5f 42 6c  MEM_Str==(MEM_Bl
c2e0: 6f 62 3e 3e 33 29 20 29 3b 0a 20 20 70 49 6e 31  ob>>3) );.  pIn1
c2f0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 49 6e 31  ->flags |= (pIn1
c300: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62  ->flags&MEM_Blob
c310: 29 3e 3e 33 3b 0a 20 20 61 70 70 6c 79 41 66 66  )>>3;.  applyAff
c320: 69 6e 69 74 79 28 70 49 6e 31 2c 20 53 51 4c 49  inity(pIn1, SQLI
c330: 54 45 5f 41 46 46 5f 54 45 58 54 2c 20 65 6e 63  TE_AFF_TEXT, enc
c340: 6f 64 69 6e 67 29 3b 0a 20 20 72 63 20 3d 20 45  oding);.  rc = E
c350: 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31 29 3b  xpandBlob(pIn1);
c360: 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d  .  assert( pIn1-
c370: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  >flags & MEM_Str
c380: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
c390: 69 6c 65 64 20 29 3b 0a 20 20 70 49 6e 31 2d 3e  iled );.  pIn1->
c3a0: 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 49  flags &= ~(MEM_I
c3b0: 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  nt|MEM_Real|MEM_
c3c0: 42 6c 6f 62 7c 4d 45 4d 5f 5a 65 72 6f 29 3b 0a  Blob|MEM_Zero);.
c3d0: 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
c3e0: 42 53 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20 62  BSIZE(pIn1);.  b
c3f0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
c400: 64 65 3a 20 54 6f 42 6c 6f 62 20 50 31 20 2a 20  de: ToBlob P1 * 
c410: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72 63  * * *.**.** Forc
c420: 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  e the value in r
c430: 65 67 69 73 74 65 72 20 50 31 20 74 6f 20 62 65  egister P1 to be
c440: 20 61 20 42 4c 4f 42 2e 0a 2a 2a 20 49 66 20 74   a BLOB..** If t
c450: 68 65 20 76 61 6c 75 65 20 69 73 20 6e 75 6d 65  he value is nume
c460: 72 69 63 2c 20 63 6f 6e 76 65 72 74 20 69 74 20  ric, convert it 
c470: 74 6f 20 61 20 73 74 72 69 6e 67 20 66 69 72 73  to a string firs
c480: 74 2e 0a 2a 2a 20 53 74 72 69 6e 67 73 20 61 72  t..** Strings ar
c490: 65 20 73 69 6d 70 6c 79 20 72 65 69 6e 74 65 72  e simply reinter
c4a0: 70 72 65 74 65 64 20 61 73 20 62 6c 6f 62 73 20  preted as blobs 
c4b0: 77 69 74 68 20 6e 6f 20 63 68 61 6e 67 65 0a 2a  with no change.*
c4c0: 2a 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79  * to the underly
c4d0: 69 6e 67 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  ing data..**.** 
c4e0: 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20  A NULL value is 
c4f0: 6e 6f 74 20 63 68 61 6e 67 65 64 20 62 79 20 74  not changed by t
c500: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 49 74  his routine.  It
c510: 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a   remains NULL..*
c520: 2f 0a 63 61 73 65 20 4f 50 5f 54 6f 42 6c 6f 62  /.case OP_ToBlob
c530: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
c540: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
c550: 54 4b 5f 54 4f 5f 42 4c 4f 42 2c 20 69 6e 31 20  TK_TO_BLOB, in1 
c560: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
c570: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66  m[pOp->p1];.  if
c580: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20  ( pIn1->flags & 
c590: 4d 45 4d 5f 4e 75 6c 6c 20 29 20 62 72 65 61 6b  MEM_Null ) break
c5a0: 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66  ;.  if( (pIn1->f
c5b0: 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 29  lags & MEM_Blob)
c5c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 70 70 6c 79  ==0 ){.    apply
c5d0: 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 53  Affinity(pIn1, S
c5e0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 2c 20  QLITE_AFF_TEXT, 
c5f0: 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 61  encoding);.    a
c600: 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61  ssert( pIn1->fla
c610: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 7c 7c 20  gs & MEM_Str || 
c620: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c630: 20 29 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79   );.    MemSetTy
c640: 70 65 46 6c 61 67 28 70 49 6e 31 2c 20 4d 45 4d  peFlag(pIn1, MEM
c650: 5f 42 6c 6f 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  _Blob);.  }else{
c660: 0a 20 20 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73  .    pIn1->flags
c670: 20 26 3d 20 7e 28 4d 45 4d 5f 54 79 70 65 4d 61   &= ~(MEM_TypeMa
c680: 73 6b 26 7e 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 20  sk&~MEM_Blob);. 
c690: 20 7d 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f   }.  UPDATE_MAX_
c6a0: 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31 29 3b 0a  BLOBSIZE(pIn1);.
c6b0: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
c6c0: 70 63 6f 64 65 3a 20 54 6f 4e 75 6d 65 72 69 63  pcode: ToNumeric
c6d0: 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
c6e0: 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75  * Force the valu
c6f0: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
c700: 20 74 6f 20 62 65 20 6e 75 6d 65 72 69 63 20 28   to be numeric (
c710: 65 69 74 68 65 72 20 61 6e 0a 2a 2a 20 69 6e 74  either an.** int
c720: 65 67 65 72 20 6f 72 20 61 20 66 6c 6f 61 74 69  eger or a floati
c730: 6e 67 2d 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e  ng-point number.
c740: 29 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75  ).** If the valu
c750: 65 20 69 73 20 74 65 78 74 20 6f 72 20 62 6c 6f  e is text or blo
c760: 62 2c 20 74 72 79 20 74 6f 20 63 6f 6e 76 65 72  b, try to conver
c770: 74 20 69 74 20 74 6f 20 61 6e 20 75 73 69 6e 67  t it to an using
c780: 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65   the.** equivale
c790: 6e 74 20 6f 66 20 61 74 6f 69 28 29 20 6f 72 20  nt of atoi() or 
c7a0: 61 74 6f 66 28 29 20 61 6e 64 20 73 74 6f 72 65  atof() and store
c7b0: 20 30 20 69 66 20 6e 6f 20 73 75 63 68 20 63 6f   0 if no such co
c7c0: 6e 76 65 72 73 69 6f 6e 20 0a 2a 2a 20 69 73 20  nversion .** is 
c7d0: 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  possible..**.** 
c7e0: 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20  A NULL value is 
c7f0: 6e 6f 74 20 63 68 61 6e 67 65 64 20 62 79 20 74  not changed by t
c800: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 49 74  his routine.  It
c810: 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a   remains NULL..*
c820: 2f 0a 63 61 73 65 20 4f 50 5f 54 6f 4e 75 6d 65  /.case OP_ToNume
c830: 72 69 63 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ric: {          
c840: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
c850: 61 73 20 54 4b 5f 54 4f 5f 4e 55 4d 45 52 49 43  as TK_TO_NUMERIC
c860: 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  , in1 */.  pIn1 
c870: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
c880: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
c890: 65 6d 4e 75 6d 65 72 69 66 79 28 70 49 6e 31 29  emNumerify(pIn1)
c8a0: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
c8b0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
c8c0: 49 54 5f 43 41 53 54 20 2a 2f 0a 0a 2f 2a 20 4f  IT_CAST */../* O
c8d0: 70 63 6f 64 65 3a 20 54 6f 49 6e 74 20 50 31 20  pcode: ToInt P1 
c8e0: 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f  * * * *.**.** Fo
c8f0: 72 63 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  rce the value in
c900: 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20   register P1 to 
c910: 62 65 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  be an integer.  
c920: 49 66 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  If.** The value 
c930: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 20 72  is currently a r
c940: 65 61 6c 20 6e 75 6d 62 65 72 2c 20 64 72 6f 70  eal number, drop
c950: 20 69 74 73 20 66 72 61 63 74 69 6f 6e 61 6c 20   its fractional 
c960: 70 61 72 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20  part..** If the 
c970: 76 61 6c 75 65 20 69 73 20 74 65 78 74 20 6f 72  value is text or
c980: 20 62 6c 6f 62 2c 20 74 72 79 20 74 6f 20 63 6f   blob, try to co
c990: 6e 76 65 72 74 20 69 74 20 74 6f 20 61 6e 20 69  nvert it to an i
c9a0: 6e 74 65 67 65 72 20 75 73 69 6e 67 20 74 68 65  nteger using the
c9b0: 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 6f  .** equivalent o
c9c0: 66 20 61 74 6f 69 28 29 20 61 6e 64 20 73 74 6f  f atoi() and sto
c9d0: 72 65 20 30 20 69 66 20 6e 6f 20 73 75 63 68 20  re 0 if no such 
c9e0: 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 70 6f  conversion is po
c9f0: 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  ssible..**.** A 
ca00: 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f  NULL value is no
ca10: 74 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 69  t changed by thi
ca20: 73 20 72 6f 75 74 69 6e 65 2e 20 20 49 74 20 72  s routine.  It r
ca30: 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  emains NULL..*/.
ca40: 63 61 73 65 20 4f 50 5f 54 6f 49 6e 74 3a 20 7b  case OP_ToInt: {
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca60: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
ca70: 54 4f 5f 49 4e 54 2c 20 69 6e 31 20 2a 2f 0a 20  TO_INT, in1 */. 
ca80: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
ca90: 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 28 70  p->p1];.  if( (p
caa0: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
cab0: 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  _Null)==0 ){.   
cac0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
cad0: 6e 74 65 67 65 72 69 66 79 28 70 49 6e 31 29 3b  ntegerify(pIn1);
cae0: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
caf0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
cb00: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 29 20  LITE_OMIT_CAST) 
cb10: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
cb20: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
cb30: 5f 50 4f 49 4e 54 29 0a 2f 2a 20 4f 70 63 6f 64  _POINT)./* Opcod
cb40: 65 3a 20 54 6f 52 65 61 6c 20 50 31 20 2a 20 2a  e: ToReal P1 * *
cb50: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65   * *.**.** Force
cb60: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
cb70: 67 69 73 74 65 72 20 50 31 20 74 6f 20 62 65 20  gister P1 to be 
cb80: 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  a floating point
cb90: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 49 66 20 54   number..** If T
cba0: 68 65 20 76 61 6c 75 65 20 69 73 20 63 75 72 72  he value is curr
cbb0: 65 6e 74 6c 79 20 61 6e 20 69 6e 74 65 67 65 72  ently an integer
cbc0: 2c 20 63 6f 6e 76 65 72 74 20 69 74 2e 0a 2a 2a  , convert it..**
cbd0: 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   If the value is
cbe0: 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 2c 20 74   text or blob, t
cbf0: 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 69 74  ry to convert it
cc00: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 75   to an integer u
cc10: 73 69 6e 67 20 74 68 65 0a 2a 2a 20 65 71 75 69  sing the.** equi
cc20: 76 61 6c 65 6e 74 20 6f 66 20 61 74 6f 69 28 29  valent of atoi()
cc30: 20 61 6e 64 20 73 74 6f 72 65 20 30 2e 30 20 69   and store 0.0 i
cc40: 66 20 6e 6f 20 73 75 63 68 20 63 6f 6e 76 65 72  f no such conver
cc50: 73 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65  sion is possible
cc60: 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76  ..**.** A NULL v
cc70: 61 6c 75 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  alue is not chan
cc80: 67 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ged by this rout
cc90: 69 6e 65 2e 20 20 49 74 20 72 65 6d 61 69 6e 73  ine.  It remains
cca0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f   NULL..*/.case O
ccb0: 50 5f 54 6f 52 65 61 6c 3a 20 7b 20 20 20 20 20  P_ToReal: {     
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ccd0: 73 61 6d 65 20 61 73 20 54 4b 5f 54 4f 5f 52 45  same as TK_TO_RE
cce0: 41 4c 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e  AL, in1 */.  pIn
ccf0: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
cd00: 31 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f  1];.  memAboutTo
cd10: 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b  Change(p, pIn1);
cd20: 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
cd30: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d  ags & MEM_Null)=
cd40: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
cd50: 33 56 64 62 65 4d 65 6d 52 65 61 6c 69 66 79 28  3VdbeMemRealify(
cd60: 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65  pIn1);.  }.  bre
cd70: 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ak;.}.#endif /* 
cd80: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
cd90: 4f 4d 49 54 5f 43 41 53 54 29 20 26 26 20 21 64  OMIT_CAST) && !d
cda0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
cdb0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
cdc0: 54 29 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65  T) */../* Opcode
cdd0: 3a 20 4c 74 20 50 31 20 50 32 20 50 33 20 50 34  : Lt P1 P2 P3 P4
cde0: 20 50 35 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72   P5.**.** Compar
cdf0: 65 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20  e the values in 
ce00: 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64 20  register P1 and 
ce10: 50 33 2e 20 20 49 66 20 72 65 67 28 50 33 29 3c  P3.  If reg(P3)<
ce20: 72 65 67 28 50 31 29 20 74 68 65 6e 0a 2a 2a 20  reg(P1) then.** 
ce30: 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73 20  jump to address 
ce40: 50 32 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  P2.  .**.** If t
ce50: 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  he SQLITE_JUMPIF
ce60: 4e 55 4c 4c 20 62 69 74 20 6f 66 20 50 35 20 69  NULL bit of P5 i
ce70: 73 20 73 65 74 20 61 6e 64 20 65 69 74 68 65 72  s set and either
ce80: 20 72 65 67 28 50 31 29 20 6f 72 0a 2a 2a 20 72   reg(P1) or.** r
ce90: 65 67 28 50 33 29 20 69 73 20 4e 55 4c 4c 20 74  eg(P3) is NULL t
cea0: 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  hen take the jum
ceb0: 70 2e 20 20 49 66 20 74 68 65 20 53 51 4c 49 54  p.  If the SQLIT
cec0: 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 0a 2a 2a  E_JUMPIFNULL .**
ced0: 20 62 69 74 20 69 73 20 63 6c 65 61 72 20 74 68   bit is clear th
cee0: 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  en fall through 
cef0: 69 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e  if either operan
cf00: 64 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  d is NULL..**.**
cf10: 20 54 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f   The SQLITE_AFF_
cf20: 4d 41 53 4b 20 70 6f 72 74 69 6f 6e 20 6f 66 20  MASK portion of 
cf30: 50 35 20 6d 75 73 74 20 62 65 20 61 6e 20 61 66  P5 must be an af
cf40: 66 69 6e 69 74 79 20 63 68 61 72 61 63 74 65 72  finity character
cf50: 20 2d 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46   -.** SQLITE_AFF
cf60: 5f 54 45 58 54 2c 20 53 51 4c 49 54 45 5f 41 46  _TEXT, SQLITE_AF
cf70: 46 5f 49 4e 54 45 47 45 52 2c 20 61 6e 64 20 73  F_INTEGER, and s
cf80: 6f 20 66 6f 72 74 68 2e 20 41 6e 20 61 74 74 65  o forth. An atte
cf90: 6d 70 74 20 69 73 20 6d 61 64 65 20 0a 2a 2a 20  mpt is made .** 
cfa0: 74 6f 20 63 6f 65 72 63 65 20 62 6f 74 68 20 69  to coerce both i
cfb0: 6e 70 75 74 73 20 61 63 63 6f 72 64 69 6e 67 20  nputs according 
cfc0: 74 6f 20 74 68 69 73 20 61 66 66 69 6e 69 74 79  to this affinity
cfd0: 20 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20 63   before the.** c
cfe0: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64  omparison is mad
cff0: 65 2e 20 49 66 20 74 68 65 20 53 51 4c 49 54 45  e. If the SQLITE
d000: 5f 41 46 46 5f 4d 41 53 4b 20 69 73 20 30 78 30  _AFF_MASK is 0x0
d010: 30 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 0a  0, then numeric.
d020: 2a 2a 20 61 66 66 69 6e 69 74 79 20 69 73 20 75  ** affinity is u
d030: 73 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  sed. Note that t
d040: 68 65 20 61 66 66 69 6e 69 74 79 20 63 6f 6e 76  he affinity conv
d050: 65 72 73 69 6f 6e 73 20 61 72 65 20 73 74 6f 72  ersions are stor
d060: 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 74 6f 20  ed.** back into 
d070: 74 68 65 20 69 6e 70 75 74 20 72 65 67 69 73 74  the input regist
d080: 65 72 73 20 50 31 20 61 6e 64 20 50 33 2e 20 20  ers P1 and P3.  
d090: 53 6f 20 74 68 69 73 20 6f 70 63 6f 64 65 20 63  So this opcode c
d0a0: 61 6e 20 63 61 75 73 65 0a 2a 2a 20 70 65 72 73  an cause.** pers
d0b0: 69 73 74 65 6e 74 20 63 68 61 6e 67 65 73 20 74  istent changes t
d0c0: 6f 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61  o registers P1 a
d0d0: 6e 64 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  nd P3..**.** Onc
d0e0: 65 20 61 6e 79 20 63 6f 6e 76 65 72 73 69 6f 6e  e any conversion
d0f0: 73 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61  s have taken pla
d100: 63 65 2c 20 61 6e 64 20 6e 65 69 74 68 65 72 20  ce, and neither 
d110: 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 0a  value is NULL, .
d120: 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 72  ** the values ar
d130: 65 20 63 6f 6d 70 61 72 65 64 2e 20 49 66 20 62  e compared. If b
d140: 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65 20 62  oth values are b
d150: 6c 6f 62 73 20 74 68 65 6e 20 6d 65 6d 63 6d 70  lobs then memcmp
d160: 28 29 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  () is.** used to
d170: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 72   determine the r
d180: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 63 6f  esults of the co
d190: 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66 20 62 6f  mparison.  If bo
d1a0: 74 68 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65  th values.** are
d1b0: 20 74 65 78 74 2c 20 74 68 65 6e 20 74 68 65 20   text, then the 
d1c0: 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c  appropriate coll
d1d0: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 73  ating function s
d1e0: 70 65 63 69 66 69 65 64 20 69 6e 0a 2a 2a 20 50  pecified in.** P
d1f0: 34 20 69 73 20 20 75 73 65 64 20 74 6f 20 64 6f  4 is  used to do
d200: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
d210: 20 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20 73    If P4 is not s
d220: 70 65 63 69 66 69 65 64 20 74 68 65 6e 0a 2a 2a  pecified then.**
d230: 20 6d 65 6d 63 6d 70 28 29 20 69 73 20 75 73 65   memcmp() is use
d240: 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 65 78  d to compare tex
d250: 74 20 73 74 72 69 6e 67 2e 20 20 49 66 20 62 6f  t string.  If bo
d260: 74 68 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a  th values are.**
d270: 20 6e 75 6d 65 72 69 63 2c 20 74 68 65 6e 20 61   numeric, then a
d280: 20 6e 75 6d 65 72 69 63 20 63 6f 6d 70 61 72 69   numeric compari
d290: 73 6f 6e 20 69 73 20 75 73 65 64 2e 20 49 66 20  son is used. If 
d2a0: 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a  the two values.*
d2b0: 2a 20 61 72 65 20 6f 66 20 64 69 66 66 65 72 65  * are of differe
d2c0: 6e 74 20 74 79 70 65 73 2c 20 74 68 65 6e 20 6e  nt types, then n
d2d0: 75 6d 62 65 72 73 20 61 72 65 20 63 6f 6e 73 69  umbers are consi
d2e0: 64 65 72 65 64 20 6c 65 73 73 20 74 68 61 6e 0a  dered less than.
d2f0: 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e 64 20 73  ** strings and s
d300: 74 72 69 6e 67 73 20 61 72 65 20 63 6f 6e 73 69  trings are consi
d310: 64 65 72 65 64 20 6c 65 73 73 20 74 68 61 6e 20  dered less than 
d320: 62 6c 6f 62 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  blobs..**.** If 
d330: 74 68 65 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  the SQLITE_STORE
d340: 50 32 20 62 69 74 20 6f 66 20 50 35 20 69 73 20  P2 bit of P5 is 
d350: 73 65 74 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  set, then do not
d360: 20 6a 75 6d 70 2e 20 20 49 6e 73 74 65 61 64 2c   jump.  Instead,
d370: 0a 2a 2a 20 73 74 6f 72 65 20 61 20 62 6f 6f 6c  .** store a bool
d380: 65 61 6e 20 72 65 73 75 6c 74 20 28 65 69 74 68  ean result (eith
d390: 65 72 20 30 2c 20 6f 72 20 31 2c 20 6f 72 20 4e  er 0, or 1, or N
d3a0: 55 4c 4c 29 20 69 6e 20 72 65 67 69 73 74 65 72  ULL) in register
d3b0: 20 50 32 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64   P2..*/./* Opcod
d3c0: 65 3a 20 4e 65 20 50 31 20 50 32 20 50 33 20 50  e: Ne P1 P2 P3 P
d3d0: 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4 P5.**.** This 
d3e0: 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20  works just like 
d3f0: 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78  the Lt opcode ex
d400: 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6a 75  cept that the ju
d410: 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a  mp is taken if.*
d420: 2a 20 74 68 65 20 6f 70 65 72 61 6e 64 73 20 69  * the operands i
d430: 6e 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61  n registers P1 a
d440: 6e 64 20 50 33 20 61 72 65 20 6e 6f 74 20 65 71  nd P3 are not eq
d450: 75 61 6c 2e 20 20 53 65 65 20 74 68 65 20 4c 74  ual.  See the Lt
d460: 20 6f 70 63 6f 64 65 20 66 6f 72 0a 2a 2a 20 61   opcode for.** a
d470: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
d480: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
d490: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73  SQLITE_NULLEQ is
d4a0: 20 73 65 74 20 69 6e 20 50 35 20 74 68 65 6e 20   set in P5 then 
d4b0: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  the result of co
d4c0: 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 6c 77 61  mparison is alwa
d4d0: 79 73 20 65 69 74 68 65 72 0a 2a 2a 20 74 72 75  ys either.** tru
d4e0: 65 20 6f 72 20 66 61 6c 73 65 20 61 6e 64 20 69  e or false and i
d4f0: 73 20 6e 65 76 65 72 20 4e 55 4c 4c 2e 20 20 49  s never NULL.  I
d500: 66 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20  f both operands 
d510: 61 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68  are NULL then th
d520: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 66 20 63  e result.** of c
d530: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 66 61 6c  omparison is fal
d540: 73 65 2e 20 20 49 66 20 65 69 74 68 65 72 20 6f  se.  If either o
d550: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74  perand is NULL t
d560: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
d570: 73 20 74 72 75 65 2e 0a 2a 2a 20 49 66 20 6e 65  s true..** If ne
d580: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
d590: 20 4e 55 4c 4c 20 74 68 65 20 74 68 65 20 72 65   NULL the the re
d5a0: 73 75 6c 74 20 69 73 20 74 68 65 20 73 61 6d 65  sult is the same
d5b0: 20 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20   as it would be 
d5c0: 69 66 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  if.** the SQLITE
d5d0: 5f 4e 55 4c 4c 45 51 20 66 6c 61 67 20 77 65 72  _NULLEQ flag wer
d5e0: 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 50  e omitted from P
d5f0: 35 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  5..*/./* Opcode:
d600: 20 45 71 20 50 31 20 50 32 20 50 33 20 50 34 20   Eq P1 P2 P3 P4 
d610: 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  P5.**.** This wo
d620: 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68  rks just like th
d630: 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65  e Lt opcode exce
d640: 70 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70  pt that the jump
d650: 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20   is taken if.** 
d660: 74 68 65 20 6f 70 65 72 61 6e 64 73 20 69 6e 20  the operands in 
d670: 72 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64  registers P1 and
d680: 20 50 33 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a   P3 are equal..*
d690: 2a 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63  * See the Lt opc
d6a0: 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ode for addition
d6b0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
d6c0: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
d6d0: 4e 55 4c 4c 45 51 20 69 73 20 73 65 74 20 69 6e  NULLEQ is set in
d6e0: 20 50 35 20 74 68 65 6e 20 74 68 65 20 72 65 73   P5 then the res
d6f0: 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
d700: 6e 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68  n is always eith
d710: 65 72 0a 2a 2a 20 74 72 75 65 20 6f 72 20 66 61  er.** true or fa
d720: 6c 73 65 20 61 6e 64 20 69 73 20 6e 65 76 65 72  lse and is never
d730: 20 4e 55 4c 4c 2e 20 20 49 66 20 62 6f 74 68 20   NULL.  If both 
d740: 6f 70 65 72 61 6e 64 73 20 61 72 65 20 4e 55 4c  operands are NUL
d750: 4c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  L then the resul
d760: 74 0a 2a 2a 20 6f 66 20 63 6f 6d 70 61 72 69 73  t.** of comparis
d770: 6f 6e 20 69 73 20 74 72 75 65 2e 20 20 49 66 20  on is true.  If 
d780: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
d790: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20  s NULL then the 
d7a0: 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65 2e  result is false.
d7b0: 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 6f  .** If neither o
d7c0: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74  perand is NULL t
d7d0: 68 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  he the result is
d7e0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 69 74 20   the same as it 
d7f0: 77 6f 75 6c 64 20 62 65 20 69 66 0a 2a 2a 20 74  would be if.** t
d800: 68 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  he SQLITE_NULLEQ
d810: 20 66 6c 61 67 20 77 65 72 65 20 6f 6d 69 74 74   flag were omitt
d820: 65 64 20 66 72 6f 6d 20 50 35 2e 0a 2a 2f 0a 2f  ed from P5..*/./
d830: 2a 20 4f 70 63 6f 64 65 3a 20 4c 65 20 50 31 20  * Opcode: Le P1 
d840: 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
d850: 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
d860: 74 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70  t like the Lt op
d870: 63 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74  code except that
d880: 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
d890: 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e  en if.** the con
d8a0: 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72  tent of register
d8b0: 20 50 33 20 69 73 20 6c 65 73 73 20 74 68 61 6e   P3 is less than
d8c0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
d8d0: 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72   content of.** r
d8e0: 65 67 69 73 74 65 72 20 50 31 2e 20 20 53 65 65  egister P1.  See
d8f0: 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66   the Lt opcode f
d900: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
d910: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a  formation..*/./*
d920: 20 4f 70 63 6f 64 65 3a 20 47 74 20 50 31 20 50   Opcode: Gt P1 P
d930: 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
d940: 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74   This works just
d950: 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63   like the Lt opc
d960: 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74 20  ode except that 
d970: 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65  the jump is take
d980: 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  n if.** the cont
d990: 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20  ent of register 
d9a0: 50 33 20 69 73 20 67 72 65 61 74 65 72 20 74 68  P3 is greater th
d9b0: 61 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  an the content o
d9c0: 66 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31  f.** register P1
d9d0: 2e 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70  .  See the Lt op
d9e0: 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f  code for additio
d9f0: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
da00: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 47  .*/./* Opcode: G
da10: 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  e P1 P2 P3 P4 P5
da20: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
da30: 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20  s just like the 
da40: 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74  Lt opcode except
da50: 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69   that the jump i
da60: 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68  s taken if.** th
da70: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67  e content of reg
da80: 69 73 74 65 72 20 50 33 20 69 73 20 67 72 65 61  ister P3 is grea
da90: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
daa0: 6c 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  l to the content
dab0: 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65 72 20   of.** register 
dac0: 50 31 2e 20 20 53 65 65 20 74 68 65 20 4c 74 20  P1.  See the Lt 
dad0: 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74  opcode for addit
dae0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
daf0: 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 71  n..*/.case OP_Eq
db00: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
db10: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 45 51  /* same as TK_EQ
db20: 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33  , jump, in1, in3
db30: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 3a 20   */.case OP_Ne: 
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
db50: 20 73 61 6d 65 20 61 73 20 54 4b 5f 4e 45 2c 20   same as TK_NE, 
db60: 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a  jump, in1, in3 *
db70: 2f 0a 63 61 73 65 20 4f 50 5f 4c 74 3a 20 20 20  /.case OP_Lt:   
db80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
db90: 61 6d 65 20 61 73 20 54 4b 5f 4c 54 2c 20 6a 75  ame as TK_LT, ju
dba0: 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a  mp, in1, in3 */.
dbb0: 63 61 73 65 20 4f 50 5f 4c 65 3a 20 20 20 20 20  case OP_Le:     
dbc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
dbd0: 65 20 61 73 20 54 4b 5f 4c 45 2c 20 6a 75 6d 70  e as TK_LE, jump
dbe0: 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61  , in1, in3 */.ca
dbf0: 73 65 20 4f 50 5f 47 74 3a 20 20 20 20 20 20 20  se OP_Gt:       
dc00: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
dc10: 61 73 20 54 4b 5f 47 54 2c 20 6a 75 6d 70 2c 20  as TK_GT, jump, 
dc20: 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65  in1, in3 */.case
dc30: 20 4f 50 5f 47 65 3a 20 7b 20 20 20 20 20 20 20   OP_Ge: {       
dc40: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
dc50: 20 54 4b 5f 47 45 2c 20 6a 75 6d 70 2c 20 69 6e   TK_GE, jump, in
dc60: 31 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20  1, in3 */.  int 
dc70: 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
dc80: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 74 68 65  /* Result of the
dc90: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 70   comparison of p
dca0: 49 6e 31 20 61 67 61 69 6e 73 74 20 70 49 6e 33  In1 against pIn3
dcb0: 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69 6e   */.  char affin
dcc0: 69 74 79 3b 20 20 20 20 20 20 2f 2a 20 41 66 66  ity;      /* Aff
dcd0: 69 6e 69 74 79 20 74 6f 20 75 73 65 20 66 6f 72  inity to use for
dce0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20   comparison */. 
dcf0: 20 75 31 36 20 66 6c 61 67 73 31 3b 20 20 20 20   u16 flags1;    
dd00: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
dd10: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  initial value of
dd20: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 2a 2f 0a   pIn1->flags */.
dd30: 20 20 75 31 36 20 66 6c 61 67 73 33 3b 20 20 20    u16 flags3;   
dd40: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
dd50: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   initial value o
dd60: 66 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 2a 2f  f pIn3->flags */
dd70: 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ..  pIn1 = &aMem
dd80: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e  [pOp->p1];.  pIn
dd90: 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  3 = &aMem[pOp->p
dda0: 33 5d 3b 0a 20 20 66 6c 61 67 73 31 20 3d 20 70  3];.  flags1 = p
ddb0: 49 6e 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 6c  In1->flags;.  fl
ddc0: 61 67 73 33 20 3d 20 70 49 6e 33 2d 3e 66 6c 61  ags3 = pIn3->fla
ddd0: 67 73 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d  gs;.  if( (pIn1-
dde0: 3e 66 6c 61 67 73 20 7c 20 70 49 6e 33 2d 3e 66  >flags | pIn3->f
ddf0: 6c 61 67 73 29 26 4d 45 4d 5f 4e 75 6c 6c 20 29  lags)&MEM_Null )
de00: 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20  {.    /* One or 
de10: 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72  both operands ar
de20: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 69 66  e NULL */.    if
de30: 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49  ( pOp->p5 & SQLI
de40: 54 45 5f 4e 55 4c 4c 45 51 20 29 7b 0a 20 20 20  TE_NULLEQ ){.   
de50: 20 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f     /* If SQLITE_
de60: 4e 55 4c 4c 45 51 20 69 73 20 73 65 74 20 28 77  NULLEQ is set (w
de70: 68 69 63 68 20 77 69 6c 6c 20 6f 6e 6c 79 20 68  hich will only h
de80: 61 70 70 65 6e 20 69 66 20 74 68 65 20 6f 70 65  appen if the ope
de90: 72 61 74 6f 72 20 69 73 0a 20 20 20 20 20 20 2a  rator is.      *
dea0: 2a 20 4f 50 5f 45 71 20 6f 72 20 4f 50 5f 4e 65  * OP_Eq or OP_Ne
deb0: 29 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20  ) then take the 
dec0: 6a 75 6d 70 20 6f 72 20 6e 6f 74 20 64 65 70 65  jump or not depe
ded0: 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
dee0: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 6e 6f 74  .      ** or not
def0: 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61   both operands a
df00: 72 65 20 6e 75 6c 6c 2e 0a 20 20 20 20 20 20 2a  re null..      *
df10: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
df20: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
df30: 45 71 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64  Eq || pOp->opcod
df40: 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20  e==OP_Ne );.    
df50: 20 20 72 65 73 20 3d 20 28 70 49 6e 31 2d 3e 66    res = (pIn1->f
df60: 6c 61 67 73 20 26 20 70 49 6e 33 2d 3e 66 6c 61  lags & pIn3->fla
df70: 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d  gs & MEM_Null)==
df80: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
df90: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55      /* SQLITE_NU
dfa0: 4c 4c 45 51 20 69 73 20 63 6c 65 61 72 20 61 6e  LLEQ is clear an
dfb0: 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  d at least one o
dfc0: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c 0a  perand is NULL,.
dfd0: 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
dfe0: 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61  e result is alwa
dff0: 79 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 2a  ys NULL..      *
e000: 2a 20 54 68 65 20 6a 75 6d 70 20 69 73 20 74 61  * The jump is ta
e010: 6b 65 6e 20 69 66 20 74 68 65 20 53 51 4c 49 54  ken if the SQLIT
e020: 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 62 69 74  E_JUMPIFNULL bit
e030: 20 69 73 20 73 65 74 2e 0a 20 20 20 20 20 20 2a   is set..      *
e040: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  /.      if( pOp-
e050: 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f  >p5 & SQLITE_STO
e060: 52 45 50 32 20 29 7b 0a 20 20 20 20 20 20 20 20  REP2 ){.        
e070: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
e080: 2d 3e 70 32 5d 3b 0a 20 20 20 20 20 20 20 20 4d  ->p2];.        M
e090: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
e0a0: 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  ut, MEM_Null);. 
e0b0: 20 20 20 20 20 20 20 52 45 47 49 53 54 45 52 5f         REGISTER_
e0c0: 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70  TRACE(pOp->p2, p
e0d0: 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Out);.      }els
e0e0: 65 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20  e if( pOp->p5 & 
e0f0: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
e100: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20  L ){.        pc 
e110: 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 20  = pOp->p2-1;.   
e120: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
e130: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
e140: 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20  .    /* Neither 
e150: 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2e  operand is NULL.
e160: 20 20 44 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f    Do a compariso
e170: 6e 2e 20 2a 2f 0a 20 20 20 20 61 66 66 69 6e 69  n. */.    affini
e180: 74 79 20 3d 20 70 4f 70 2d 3e 70 35 20 26 20 53  ty = pOp->p5 & S
e190: 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 3b 0a  QLITE_AFF_MASK;.
e1a0: 20 20 20 20 69 66 28 20 61 66 66 69 6e 69 74 79      if( affinity
e1b0: 20 29 7b 0a 20 20 20 20 20 20 61 70 70 6c 79 41   ){.      applyA
e1c0: 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 61 66  ffinity(pIn1, af
e1d0: 66 69 6e 69 74 79 2c 20 65 6e 63 6f 64 69 6e 67  finity, encoding
e1e0: 29 3b 0a 20 20 20 20 20 20 61 70 70 6c 79 41 66  );.      applyAf
e1f0: 66 69 6e 69 74 79 28 70 49 6e 33 2c 20 61 66 66  finity(pIn3, aff
e200: 69 6e 69 74 79 2c 20 65 6e 63 6f 64 69 6e 67 29  inity, encoding)
e210: 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
e220: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
e230: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
e240: 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
e250: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 43  Op->p4type==P4_C
e260: 4f 4c 4c 53 45 51 20 7c 7c 20 70 4f 70 2d 3e 70  OLLSEQ || pOp->p
e270: 34 2e 70 43 6f 6c 6c 3d 3d 30 20 29 3b 0a 20 20  4.pColl==0 );.  
e280: 20 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e    ExpandBlob(pIn
e290: 31 29 3b 0a 20 20 20 20 45 78 70 61 6e 64 42 6c  1);.    ExpandBl
e2a0: 6f 62 28 70 49 6e 33 29 3b 0a 20 20 20 20 72 65  ob(pIn3);.    re
e2b0: 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  s = sqlite3MemCo
e2c0: 6d 70 61 72 65 28 70 49 6e 33 2c 20 70 49 6e 31  mpare(pIn3, pIn1
e2d0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 29  , pOp->p4.pColl)
e2e0: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
e2f0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20  pOp->opcode ){. 
e300: 20 20 20 63 61 73 65 20 4f 50 5f 45 71 3a 20 20     case OP_Eq:  
e310: 20 20 72 65 73 20 3d 20 72 65 73 3d 3d 30 3b 20    res = res==0; 
e320: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
e330: 61 73 65 20 4f 50 5f 4e 65 3a 20 20 20 20 72 65  ase OP_Ne:    re
e340: 73 20 3d 20 72 65 73 21 3d 30 3b 20 20 20 20 20  s = res!=0;     
e350: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
e360: 4f 50 5f 4c 74 3a 20 20 20 20 72 65 73 20 3d 20  OP_Lt:    res = 
e370: 72 65 73 3c 30 3b 20 20 20 20 20 20 62 72 65 61  res<0;      brea
e380: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 4c  k;.    case OP_L
e390: 65 3a 20 20 20 20 72 65 73 20 3d 20 72 65 73 3c  e:    res = res<
e3a0: 3d 30 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  =0;     break;. 
e3b0: 20 20 20 63 61 73 65 20 4f 50 5f 47 74 3a 20 20     case OP_Gt:  
e3c0: 20 20 72 65 73 20 3d 20 72 65 73 3e 30 3b 20 20    res = res>0;  
e3d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
e3e0: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 72 65  efault:       re
e3f0: 73 20 3d 20 72 65 73 3e 3d 30 3b 20 20 20 20 20  s = res>=0;     
e400: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66  break;.  }..  if
e410: 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49  ( pOp->p5 & SQLI
e420: 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 20  TE_STOREP2 ){.  
e430: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
e440: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 6d 65 6d  Op->p2];.    mem
e450: 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
e460: 20 70 4f 75 74 29 3b 0a 20 20 20 20 4d 65 6d 53   pOut);.    MemS
e470: 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c  etTypeFlag(pOut,
e480: 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 20 20 70   MEM_Int);.    p
e490: 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 65 73 3b 0a  Out->u.i = res;.
e4a0: 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
e4b0: 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75 74  CE(pOp->p2, pOut
e4c0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  );.  }else if( r
e4d0: 65 73 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70  es ){.    pc = p
e4e0: 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d 0a 0a 20  Op->p2-1;.  }.. 
e4f0: 20 2f 2a 20 55 6e 64 6f 20 61 6e 79 20 63 68 61   /* Undo any cha
e500: 6e 67 65 73 20 6d 61 64 65 20 62 79 20 61 70 70  nges made by app
e510: 6c 79 41 66 66 69 6e 69 74 79 28 29 20 74 6f 20  lyAffinity() to 
e520: 74 68 65 20 69 6e 70 75 74 20 72 65 67 69 73 74  the input regist
e530: 65 72 73 2e 20 2a 2f 0a 20 20 70 49 6e 31 2d 3e  ers. */.  pIn1->
e540: 66 6c 61 67 73 20 3d 20 28 70 49 6e 31 2d 3e 66  flags = (pIn1->f
e550: 6c 61 67 73 26 7e 4d 45 4d 5f 54 79 70 65 4d 61  lags&~MEM_TypeMa
e560: 73 6b 29 20 7c 20 28 66 6c 61 67 73 31 26 4d 45  sk) | (flags1&ME
e570: 4d 5f 54 79 70 65 4d 61 73 6b 29 3b 0a 20 20 70  M_TypeMask);.  p
e580: 49 6e 33 2d 3e 66 6c 61 67 73 20 3d 20 28 70 49  In3->flags = (pI
e590: 6e 33 2d 3e 66 6c 61 67 73 26 7e 4d 45 4d 5f 54  n3->flags&~MEM_T
e5a0: 79 70 65 4d 61 73 6b 29 20 7c 20 28 66 6c 61 67  ypeMask) | (flag
e5b0: 73 33 26 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29  s3&MEM_TypeMask)
e5c0: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
e5d0: 20 4f 70 63 6f 64 65 3a 20 50 65 72 6d 75 74 61   Opcode: Permuta
e5e0: 74 69 6f 6e 20 2a 20 2a 20 2a 20 50 34 20 2a 0a  tion * * * P4 *.
e5f0: 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 65  **.** Set the pe
e600: 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 62  rmutation used b
e610: 79 20 74 68 65 20 4f 50 5f 43 6f 6d 70 61 72 65  y the OP_Compare
e620: 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
e630: 74 68 65 20 61 72 72 61 79 0a 2a 2a 20 6f 66 20  the array.** of 
e640: 69 6e 74 65 67 65 72 73 20 69 6e 20 50 34 2e 0a  integers in P4..
e650: 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 6d 75 74  **.** The permut
e660: 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 76 61  ation is only va
e670: 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 6e 65  lid until the ne
e680: 78 74 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f  xt OP_Permutatio
e690: 6e 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 0a 2a  n, OP_Compare,.*
e6a0: 2a 20 4f 50 5f 48 61 6c 74 2c 20 6f 72 20 4f 50  * OP_Halt, or OP
e6b0: 5f 52 65 73 75 6c 74 52 6f 77 2e 20 20 54 79 70  _ResultRow.  Typ
e6c0: 69 63 61 6c 6c 79 20 74 68 65 20 4f 50 5f 50 65  ically the OP_Pe
e6d0: 72 6d 75 74 61 74 69 6f 6e 20 73 68 6f 75 6c 64  rmutation should
e6e0: 20 6f 63 63 75 72 0a 2a 2a 20 69 6d 6d 65 64 69   occur.** immedi
e6f0: 61 74 65 6c 79 20 70 72 69 6f 72 20 74 6f 20 74  ately prior to t
e700: 68 65 20 4f 50 5f 43 6f 6d 70 61 72 65 2e 0a 2a  he OP_Compare..*
e710: 2f 0a 63 61 73 65 20 4f 50 5f 50 65 72 6d 75 74  /.case OP_Permut
e720: 61 74 69 6f 6e 3a 20 7b 0a 20 20 61 73 73 65 72  ation: {.  asser
e730: 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
e740: 50 34 5f 49 4e 54 41 52 52 41 59 20 29 3b 0a 20  P4_INTARRAY );. 
e750: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
e760: 2e 61 69 20 29 3b 0a 20 20 61 50 65 72 6d 75 74  .ai );.  aPermut
e770: 65 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a  e = pOp->p4.ai;.
e780: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
e790: 70 63 6f 64 65 3a 20 43 6f 6d 70 61 72 65 20 50  pcode: Compare P
e7a0: 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a  1 P2 P3 P4 *.**.
e7b0: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 76  ** Compare two v
e7c0: 65 63 74 6f 72 73 20 6f 66 20 72 65 67 69 73 74  ectors of regist
e7d0: 65 72 73 20 69 6e 20 72 65 67 28 50 31 29 2e 2e  ers in reg(P1)..
e7e0: 72 65 67 28 50 31 2b 50 33 2d 31 29 20 28 63 61  reg(P1+P3-1) (ca
e7f0: 6c 6c 20 74 68 69 73 0a 2a 2a 20 76 65 63 74 6f  ll this.** vecto
e800: 72 20 22 41 22 29 20 61 6e 64 20 69 6e 20 72 65  r "A") and in re
e810: 67 28 50 32 29 2e 2e 72 65 67 28 50 32 2b 50 33  g(P2)..reg(P2+P3
e820: 2d 31 29 20 28 22 42 22 29 2e 20 20 53 61 76 65  -1) ("B").  Save
e830: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
e840: 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * the comparison
e850: 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
e860: 6e 65 78 74 20 4f 50 5f 4a 75 6d 70 20 69 6e 73  next OP_Jump ins
e870: 74 72 75 63 74 2e 0a 2a 2a 0a 2a 2a 20 50 34 20  truct..**.** P4 
e880: 69 73 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  is a KeyInfo str
e890: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69  ucture that defi
e8a0: 6e 65 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  nes collating se
e8b0: 71 75 65 6e 63 65 73 20 61 6e 64 20 73 6f 72 74  quences and sort
e8c0: 0a 2a 2a 20 6f 72 64 65 72 73 20 66 6f 72 20 74  .** orders for t
e8d0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  he comparison.  
e8e0: 54 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  The permutation 
e8f0: 61 70 70 6c 69 65 73 20 74 6f 20 72 65 67 69 73  applies to regis
e900: 74 65 72 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 20 54  ters.** only.  T
e910: 68 65 20 4b 65 79 49 6e 66 6f 20 65 6c 65 6d 65  he KeyInfo eleme
e920: 6e 74 73 20 61 72 65 20 75 73 65 64 20 73 65 71  nts are used seq
e930: 75 65 6e 74 69 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a  uentially..**.**
e940: 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
e950: 69 73 20 61 20 73 6f 72 74 20 63 6f 6d 70 61 72  is a sort compar
e960: 69 73 6f 6e 2c 20 73 6f 20 4e 55 4c 4c 73 20 63  ison, so NULLs c
e970: 6f 6d 70 61 72 65 20 65 71 75 61 6c 2c 0a 2a 2a  ompare equal,.**
e980: 20 4e 55 4c 4c 73 20 61 72 65 20 6c 65 73 73 20   NULLs are less 
e990: 74 68 61 6e 20 6e 75 6d 62 65 72 73 2c 20 6e 75  than numbers, nu
e9a0: 6d 62 65 72 73 20 61 72 65 20 6c 65 73 73 20 74  mbers are less t
e9b0: 68 61 6e 20 73 74 72 69 6e 67 73 2c 0a 2a 2a 20  han strings,.** 
e9c0: 61 6e 64 20 73 74 72 69 6e 67 73 20 61 72 65 20  and strings are 
e9d0: 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f 62 73 2e  less than blobs.
e9e0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6d 70  .*/.case OP_Comp
e9f0: 61 72 65 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a  are: {.  int n;.
ea00: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 70    int i;.  int p
ea10: 31 3b 0a 20 20 69 6e 74 20 70 32 3b 0a 20 20 63  1;.  int p2;.  c
ea20: 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  onst KeyInfo *pK
ea30: 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 69 64  eyInfo;.  int id
ea40: 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  x;.  CollSeq *pC
ea50: 6f 6c 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61  oll;    /* Colla
ea60: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
ea70: 20 75 73 65 20 6f 6e 20 74 68 69 73 20 74 65 72   use on this ter
ea80: 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b  m */.  int bRev;
ea90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
eaa0: 65 20 66 6f 72 20 44 45 53 43 45 4e 44 49 4e 47  e for DESCENDING
eab0: 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 0a   sort order */..
eac0: 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20    n = pOp->p3;. 
ead0: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d   pKeyInfo = pOp-
eae0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
eaf0: 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20  assert( n>0 );. 
eb00: 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
eb10: 6f 21 3d 30 20 29 3b 0a 20 20 70 31 20 3d 20 70  o!=0 );.  p1 = p
eb20: 4f 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70  Op->p1;.  p2 = p
eb30: 4f 70 2d 3e 70 32 3b 0a 23 69 66 20 53 51 4c 49  Op->p2;.#if SQLI
eb40: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 61  TE_DEBUG.  if( a
eb50: 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 69  Permute ){.    i
eb60: 6e 74 20 6b 2c 20 6d 78 20 3d 20 30 3b 0a 20 20  nt k, mx = 0;.  
eb70: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 3b 20    for(k=0; k<n; 
eb80: 6b 2b 2b 29 20 69 66 28 20 61 50 65 72 6d 75 74  k++) if( aPermut
eb90: 65 5b 6b 5d 3e 6d 78 20 29 20 6d 78 20 3d 20 61  e[k]>mx ) mx = a
eba0: 50 65 72 6d 75 74 65 5b 6b 5d 3b 0a 20 20 20 20  Permute[k];.    
ebb0: 61 73 73 65 72 74 28 20 70 31 3e 30 20 26 26 20  assert( p1>0 && 
ebc0: 70 31 2b 6d 78 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31  p1+mx<=p->nMem+1
ebd0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ebe0: 70 32 3e 30 20 26 26 20 70 32 2b 6d 78 3c 3d 70  p2>0 && p2+mx<=p
ebf0: 2d 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 20 20 7d 65  ->nMem+1 );.  }e
ec00: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
ec10: 20 70 31 3e 30 20 26 26 20 70 31 2b 6e 3c 3d 70   p1>0 && p1+n<=p
ec20: 2d 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 20 20 20 20  ->nMem+1 );.    
ec30: 61 73 73 65 72 74 28 20 70 32 3e 30 20 26 26 20  assert( p2>0 && 
ec40: 70 32 2b 6e 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20  p2+n<=p->nMem+1 
ec50: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
ec60: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
ec70: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b  .  for(i=0; i<n;
ec80: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 64 78 20 3d   i++){.    idx =
ec90: 20 61 50 65 72 6d 75 74 65 20 3f 20 61 50 65 72   aPermute ? aPer
eca0: 6d 75 74 65 5b 69 5d 20 3a 20 69 3b 0a 20 20 20  mute[i] : i;.   
ecb0: 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
ecc0: 6c 69 64 28 26 61 4d 65 6d 5b 70 31 2b 69 64 78  lid(&aMem[p1+idx
ecd0: 5d 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ]) );.    assert
ece0: 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d  ( memIsValid(&aM
ecf0: 65 6d 5b 70 32 2b 69 64 78 5d 29 20 29 3b 0a 20  em[p2+idx]) );. 
ed00: 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
ed10: 45 28 70 31 2b 69 64 78 2c 20 26 61 4d 65 6d 5b  E(p1+idx, &aMem[
ed20: 70 31 2b 69 64 78 5d 29 3b 0a 20 20 20 20 52 45  p1+idx]);.    RE
ed30: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 32 2b  GISTER_TRACE(p2+
ed40: 69 64 78 2c 20 26 61 4d 65 6d 5b 70 32 2b 69 64  idx, &aMem[p2+id
ed50: 78 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  x]);.    assert(
ed60: 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   i<pKeyInfo->nFi
ed70: 65 6c 64 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  eld );.    pColl
ed80: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
ed90: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 62 52 65 76 20  ll[i];.    bRev 
eda0: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  = pKeyInfo->aSor
edb0: 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 69  tOrder[i];.    i
edc0: 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65  Compare = sqlite
edd0: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 61 4d 65  3MemCompare(&aMe
ede0: 6d 5b 70 31 2b 69 64 78 5d 2c 20 26 61 4d 65 6d  m[p1+idx], &aMem
edf0: 5b 70 32 2b 69 64 78 5d 2c 20 70 43 6f 6c 6c 29  [p2+idx], pColl)
ee00: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6d 70 61  ;.    if( iCompa
ee10: 72 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  re ){.      if( 
ee20: 62 52 65 76 20 29 20 69 43 6f 6d 70 61 72 65 20  bRev ) iCompare 
ee30: 3d 20 2d 69 43 6f 6d 70 61 72 65 3b 0a 20 20 20  = -iCompare;.   
ee40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ee50: 20 20 7d 0a 20 20 61 50 65 72 6d 75 74 65 20 3d    }.  aPermute =
ee60: 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   0;.  break;.}..
ee70: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4a 75 6d 70 20  /* Opcode: Jump 
ee80: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
ee90: 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 69  ** Jump to the i
eea0: 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20 61 64  nstruction at ad
eeb0: 64 72 65 73 73 20 50 31 2c 20 50 32 2c 20 6f 72  dress P1, P2, or
eec0: 20 50 33 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e   P3 depending on
eed0: 20 77 68 65 74 68 65 72 0a 2a 2a 20 69 6e 20 74   whether.** in t
eee0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 4f  he most recent O
eef0: 50 5f 43 6f 6d 70 61 72 65 20 69 6e 73 74 72 75  P_Compare instru
ef00: 63 74 69 6f 6e 20 74 68 65 20 50 31 20 76 65 63  ction the P1 vec
ef10: 74 6f 72 20 77 61 73 20 6c 65 73 73 20 74 68 61  tor was less tha
ef20: 6e 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f  n.** equal to, o
ef30: 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
ef40: 68 65 20 50 32 20 76 65 63 74 6f 72 2c 20 72 65  he P2 vector, re
ef50: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 63  spectively..*/.c
ef60: 61 73 65 20 4f 50 5f 4a 75 6d 70 3a 20 7b 20 20  ase OP_Jump: {  
ef70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75             /* ju
ef80: 6d 70 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6d  mp */.  if( iCom
ef90: 70 61 72 65 3c 30 20 29 7b 0a 20 20 20 20 70 63  pare<0 ){.    pc
efa0: 20 3d 20 70 4f 70 2d 3e 70 31 20 2d 20 31 3b 0a   = pOp->p1 - 1;.
efb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6d    }else if( iCom
efc0: 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pare==0 ){.    p
efd0: 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
efe0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 63  .  }else{.    pc
eff0: 20 3d 20 70 4f 70 2d 3e 70 33 20 2d 20 31 3b 0a   = pOp->p3 - 1;.
f000: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
f010: 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 6e 64 20 50  /* Opcode: And P
f020: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
f030: 2a 20 54 61 6b 65 20 74 68 65 20 6c 6f 67 69 63  * Take the logic
f040: 61 6c 20 41 4e 44 20 6f 66 20 74 68 65 20 76 61  al AND of the va
f050: 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72  lues in register
f060: 73 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a  s P1 and P2 and.
f070: 2a 2a 20 77 72 69 74 65 20 74 68 65 20 72 65 73  ** write the res
f080: 75 6c 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65  ult into registe
f090: 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  r P3..**.** If e
f0a0: 69 74 68 65 72 20 50 31 20 6f 72 20 50 32 20 69  ither P1 or P2 i
f0b0: 73 20 30 20 28 66 61 6c 73 65 29 20 74 68 65 6e  s 0 (false) then
f0c0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 30   the result is 0
f0d0: 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20   even if.** the 
f0e0: 6f 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  other input is N
f0f0: 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c 20 61 6e 64  ULL.  A NULL and
f100: 20 74 72 75 65 20 6f 72 20 74 77 6f 20 4e 55 4c   true or two NUL
f110: 4c 73 20 67 69 76 65 0a 2a 2a 20 61 20 4e 55 4c  Ls give.** a NUL
f120: 4c 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 2f 2a 20  L output..*/./* 
f130: 4f 70 63 6f 64 65 3a 20 4f 72 20 50 31 20 50 32  Opcode: Or P1 P2
f140: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 61   P3 * *.**.** Ta
f150: 6b 65 20 74 68 65 20 6c 6f 67 69 63 61 6c 20 4f  ke the logical O
f160: 52 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  R of the values 
f170: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 61  in register P1 a
f180: 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f  nd P2 and.** sto
f190: 72 65 20 74 68 65 20 61 6e 73 77 65 72 20 69 6e  re the answer in
f1a0: 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
f1b0: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 50 31  .** If either P1
f1c0: 20 6f 72 20 50 32 20 69 73 20 6e 6f 6e 7a 65 72   or P2 is nonzer
f1d0: 6f 20 28 74 72 75 65 29 20 74 68 65 6e 20 74 68  o (true) then th
f1e0: 65 20 72 65 73 75 6c 74 20 69 73 20 31 20 28 74  e result is 1 (t
f1f0: 72 75 65 29 0a 2a 2a 20 65 76 65 6e 20 69 66 20  rue).** even if 
f200: 74 68 65 20 6f 74 68 65 72 20 69 6e 70 75 74 20  the other input 
f210: 69 73 20 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c  is NULL.  A NULL
f220: 20 61 6e 64 20 66 61 6c 73 65 20 6f 72 20 74 77   and false or tw
f230: 6f 20 4e 55 4c 4c 73 0a 2a 2a 20 67 69 76 65 20  o NULLs.** give 
f240: 61 20 4e 55 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a  a NULL output..*
f250: 2f 0a 63 61 73 65 20 4f 50 5f 41 6e 64 3a 20 20  /.case OP_And:  
f260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
f270: 61 6d 65 20 61 73 20 54 4b 5f 41 4e 44 2c 20 69  ame as TK_AND, i
f280: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
f290: 0a 63 61 73 65 20 4f 50 5f 4f 72 3a 20 7b 20 20  .case OP_Or: {  
f2a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
f2b0: 6d 65 20 61 73 20 54 4b 5f 4f 52 2c 20 69 6e 31  me as TK_OR, in1
f2c0: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20  , in2, out3 */. 
f2d0: 20 69 6e 74 20 76 31 3b 20 20 20 20 2f 2a 20 4c   int v1;    /* L
f2e0: 65 66 74 20 6f 70 65 72 61 6e 64 3a 20 20 30 3d  eft operand:  0=
f2f0: 3d 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c  =FALSE, 1==TRUE,
f300: 20 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e   2==UNKNOWN or N
f310: 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 76 32 3b  ULL */.  int v2;
f320: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65      /* Right ope
f330: 72 61 6e 64 3a 20 30 3d 3d 46 41 4c 53 45 2c 20  rand: 0==FALSE, 
f340: 31 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e  1==TRUE, 2==UNKN
f350: 4f 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 0a  OWN or NULL */..
f360: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
f370: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70  Op->p1];.  if( p
f380: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
f390: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 76 31 20  _Null ){.    v1 
f3a0: 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 2;.  }else{.  
f3b0: 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 64    v1 = sqlite3Vd
f3c0: 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29  beIntValue(pIn1)
f3d0: 21 3d 30 3b 0a 20 20 7d 0a 20 20 70 49 6e 32 20  !=0;.  }.  pIn2 
f3e0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
f3f0: 3b 0a 20 20 69 66 28 20 70 49 6e 32 2d 3e 66 6c  ;.  if( pIn2->fl
f400: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
f410: 7b 0a 20 20 20 20 76 32 20 3d 20 32 3b 0a 20 20  {.    v2 = 2;.  
f420: 7d 65 6c 73 65 7b 0a 20 20 20 20 76 32 20 3d 20  }else{.    v2 = 
f430: 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
f440: 6c 75 65 28 70 49 6e 32 29 21 3d 30 3b 0a 20 20  lue(pIn2)!=0;.  
f450: 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  }.  if( pOp->opc
f460: 6f 64 65 3d 3d 4f 50 5f 41 6e 64 20 29 7b 0a 20  ode==OP_And ){. 
f470: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
f480: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 6e  unsigned char an
f490: 64 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20 30 2c  d_logic[] = { 0,
f4a0: 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20   0, 0, 0, 1, 2, 
f4b0: 30 2c 20 32 2c 20 32 20 7d 3b 0a 20 20 20 20 76  0, 2, 2 };.    v
f4c0: 31 20 3d 20 61 6e 64 5f 6c 6f 67 69 63 5b 76 31  1 = and_logic[v1
f4d0: 2a 33 2b 76 32 5d 3b 0a 20 20 7d 65 6c 73 65 7b  *3+v2];.  }else{
f4e0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
f4f0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
f500: 6f 72 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20 30  or_logic[] = { 0
f510: 2c 20 31 2c 20 32 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 2, 1, 1, 1,
f520: 20 32 2c 20 31 2c 20 32 20 7d 3b 0a 20 20 20 20   2, 1, 2 };.    
f530: 76 31 20 3d 20 6f 72 5f 6c 6f 67 69 63 5b 76 31  v1 = or_logic[v1
f540: 2a 33 2b 76 32 5d 3b 0a 20 20 7d 0a 20 20 70 4f  *3+v2];.  }.  pO
f550: 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
f560: 70 33 5d 3b 0a 20 20 69 66 28 20 76 31 3d 3d 32  p3];.  if( v1==2
f570: 20 29 7b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79   ){.    MemSetTy
f580: 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d  peFlag(pOut, MEM
f590: 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  _Null);.  }else{
f5a0: 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  .    pOut->u.i =
f5b0: 20 76 31 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54   v1;.    MemSetT
f5c0: 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45  ypeFlag(pOut, ME
f5d0: 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 20 20 62 72  M_Int);.  }.  br
f5e0: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
f5f0: 65 3a 20 4e 6f 74 20 50 31 20 50 32 20 2a 20 2a  e: Not P1 P2 * *
f600: 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72   *.**.** Interpr
f610: 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  et the value in 
f620: 72 65 67 69 73 74 65 72 20 50 31 20 61 73 20 61  register P1 as a
f630: 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20   boolean value. 
f640: 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20 62 6f   Store the.** bo
f650: 6f 6c 65 61 6e 20 63 6f 6d 70 6c 65 6d 65 6e 74  olean complement
f660: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
f670: 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69    If the value i
f680: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  n register P1 is
f690: 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   .** NULL, then 
f6a0: 61 20 4e 55 4c 4c 20 69 73 20 73 74 6f 72 65 64  a NULL is stored
f6b0: 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20   in P2..*/.case 
f6c0: 4f 50 5f 4e 6f 74 3a 20 7b 20 20 20 20 20 20 20  OP_Not: {       
f6d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
f6e0: 20 61 73 20 54 4b 5f 4e 4f 54 2c 20 69 6e 31 2c   as TK_NOT, in1,
f6f0: 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20   out2 */.  pIn1 
f700: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
f710: 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  ;.  pOut = &aMem
f720: 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69 66 28  [pOp->p2];.  if(
f730: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn1->flags & M
f740: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73  EM_Null ){.    s
f750: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
f760: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 7d 65  Null(pOut);.  }e
f770: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
f780: 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28  VdbeMemSetInt64(
f790: 70 4f 75 74 2c 20 21 73 71 6c 69 74 65 33 56 64  pOut, !sqlite3Vd
f7a0: 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29  beIntValue(pIn1)
f7b0: 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
f7c0: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69  }../* Opcode: Bi
f7d0: 74 4e 6f 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  tNot P1 P2 * * *
f7e0: 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  .**.** Interpret
f7f0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
f800: 72 65 67 69 73 74 65 72 20 50 31 20 61 73 20 61  register P1 as a
f810: 6e 20 69 6e 74 65 67 65 72 2e 20 20 53 74 6f 72  n integer.  Stor
f820: 65 20 74 68 65 0a 2a 2a 20 6f 6e 65 73 2d 63 6f  e the.** ones-co
f830: 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20  mplement of the 
f840: 50 31 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65  P1 value into re
f850: 67 69 73 74 65 72 20 50 32 2e 20 20 49 66 20 50  gister P2.  If P
f860: 31 20 68 6f 6c 64 73 0a 2a 2a 20 61 20 4e 55 4c  1 holds.** a NUL
f870: 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 61 20 4e  L then store a N
f880: 55 4c 4c 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61  ULL in P2..*/.ca
f890: 73 65 20 4f 50 5f 42 69 74 4e 6f 74 3a 20 7b 20  se OP_BitNot: { 
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
f8b0: 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 4e 4f 54  ame as TK_BITNOT
f8c0: 2c 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20  , in1, out2 */. 
f8d0: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
f8e0: 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d  p->p1];.  pOut =
f8f0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
f900: 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61  .  if( pIn1->fla
f910: 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  gs & MEM_Null ){
f920: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f930: 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29  MemSetNull(pOut)
f940: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
f950: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
f960: 49 6e 74 36 34 28 70 4f 75 74 2c 20 7e 73 71 6c  Int64(pOut, ~sql
f970: 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65  ite3VdbeIntValue
f980: 28 70 49 6e 31 29 29 3b 0a 20 20 7d 0a 20 20 62  (pIn1));.  }.  b
f990: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
f9a0: 64 65 3a 20 49 66 20 50 31 20 50 32 20 50 33 20  de: If P1 P2 P3 
f9b0: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74  * *.**.** Jump t
f9c0: 6f 20 50 32 20 69 66 20 74 68 65 20 76 61 6c 75  o P2 if the valu
f9d0: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
f9e0: 20 69 73 20 74 72 75 65 2e 20 20 54 68 65 20 76   is true.  The v
f9f0: 61 6c 75 65 20 69 73 0a 2a 2a 20 69 73 20 63 6f  alue is.** is co
fa00: 6e 73 69 64 65 72 65 64 20 74 72 75 65 20 69 66  nsidered true if
fa10: 20 69 74 20 69 73 20 6e 75 6d 65 72 69 63 20 61   it is numeric a
fa20: 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66  nd non-zero.  If
fa30: 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e   the value.** in
fa40: 20 50 31 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e   P1 is NULL then
fa50: 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
fa60: 66 20 50 33 20 69 73 20 74 72 75 65 2e 0a 2a 2f  f P3 is true..*/
fa70: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 4e 6f  ./* Opcode: IfNo
fa80: 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  t P1 P2 P3 * *.*
fa90: 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20  *.** Jump to P2 
faa0: 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  if the value in 
fab0: 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 46  register P1 is F
fac0: 61 6c 73 65 2e 20 20 54 68 65 20 76 61 6c 75 65  alse.  The value
fad0: 20 69 73 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64   is.** is consid
fae0: 65 72 65 64 20 74 72 75 65 20 69 66 20 69 74 20  ered true if it 
faf0: 68 61 73 20 61 20 6e 75 6d 65 72 69 63 20 76 61  has a numeric va
fb00: 6c 75 65 20 6f 66 20 7a 65 72 6f 2e 20 20 49 66  lue of zero.  If
fb10: 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e   the value.** in
fb20: 20 50 31 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e   P1 is NULL then
fb30: 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
fb40: 66 20 50 33 20 69 73 20 74 72 75 65 2e 0a 2a 2f  f P3 is true..*/
fb50: 0a 63 61 73 65 20 4f 50 5f 49 66 3a 20 20 20 20  .case OP_If:    
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fb70: 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 63 61 73  jump, in1 */.cas
fb80: 65 20 4f 50 5f 49 66 4e 6f 74 3a 20 7b 20 20 20  e OP_IfNot: {   
fb90: 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
fba0: 2c 20 69 6e 31 20 2a 2f 0a 20 20 69 6e 74 20 63  , in1 */.  int c
fbb0: 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ;.  pIn1 = &aMem
fbc0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28  [pOp->p1];.  if(
fbd0: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn1->flags & M
fbe0: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 63  EM_Null ){.    c
fbf0: 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 65   = pOp->p3;.  }e
fc00: 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
fc10: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
fc20: 5f 50 4f 49 4e 54 0a 20 20 20 20 63 20 3d 20 73  _POINT.    c = s
fc30: 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c  qlite3VdbeIntVal
fc40: 75 65 28 70 49 6e 31 29 21 3d 30 3b 0a 23 65 6c  ue(pIn1)!=0;.#el
fc50: 73 65 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74  se.    c = sqlit
fc60: 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28  e3VdbeRealValue(
fc70: 70 49 6e 31 29 21 3d 30 2e 30 3b 0a 23 65 6e 64  pIn1)!=0.0;.#end
fc80: 69 66 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  if.    if( pOp->
fc90: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 66 4e 6f 74  opcode==OP_IfNot
fca0: 20 29 20 63 20 3d 20 21 63 3b 0a 20 20 7d 0a 20   ) c = !c;.  }. 
fcb0: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 70 63   if( c ){.    pc
fcc0: 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20   = pOp->p2-1;.  
fcd0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
fce0: 20 4f 70 63 6f 64 65 3a 20 49 73 4e 75 6c 6c 20   Opcode: IsNull 
fcf0: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
fd00: 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20  * Jump to P2 if 
fd10: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
fd20: 69 73 74 65 72 20 50 31 20 69 73 20 4e 55 4c 4c  ister P1 is NULL
fd30: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 73 4e  ..*/.case OP_IsN
fd40: 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ull: {          
fd50: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
fd60: 49 53 4e 55 4c 4c 2c 20 6a 75 6d 70 2c 20 69 6e  ISNULL, jump, in
fd70: 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61  1 */.  pIn1 = &a
fd80: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
fd90: 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
fda0: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20   & MEM_Null)!=0 
fdb0: 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  ){.    pc = pOp-
fdc0: 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62  >p2 - 1;.  }.  b
fdd0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
fde0: 64 65 3a 20 4e 6f 74 4e 75 6c 6c 20 50 31 20 50  de: NotNull P1 P
fdf0: 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75  2 * * *.**.** Ju
fe00: 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 20  mp to P2 if the 
fe10: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
fe20: 72 20 50 31 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  r P1 is not NULL
fe30: 2e 20 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e  .  .*/.case OP_N
fe40: 6f 74 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20  otNull: {       
fe50: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
fe60: 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 6a 75 6d 70  TK_NOTNULL, jump
fe70: 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  , in1 */.  pIn1 
fe80: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
fe90: 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66  ;.  if( (pIn1->f
fea0: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
feb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 63 20 3d 20  ==0 ){.    pc = 
fec0: 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d  pOp->p2 - 1;.  }
fed0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
fee0: 4f 70 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e 20 50  Opcode: Column P
fef0: 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
ff00: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
ff10: 65 20 64 61 74 61 20 74 68 61 74 20 63 75 72 73  e data that curs
ff20: 6f 72 20 50 31 20 70 6f 69 6e 74 73 20 74 6f 20  or P1 points to 
ff30: 61 73 20 61 20 73 74 72 75 63 74 75 72 65 20 62  as a structure b
ff40: 75 69 6c 74 20 75 73 69 6e 67 0a 2a 2a 20 74 68  uilt using.** th
ff50: 65 20 4d 61 6b 65 52 65 63 6f 72 64 20 69 6e 73  e MakeRecord ins
ff60: 74 72 75 63 74 69 6f 6e 2e 20 20 28 53 65 65 20  truction.  (See 
ff70: 74 68 65 20 4d 61 6b 65 52 65 63 6f 72 64 20 6f  the MakeRecord o
ff80: 70 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69  pcode for additi
ff90: 6f 6e 61 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  onal.** informat
ffa0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 6f  ion about the fo
ffb0: 72 6d 61 74 20 6f 66 20 74 68 65 20 64 61 74 61  rmat of the data
ffc0: 2e 29 20 20 45 78 74 72 61 63 74 20 74 68 65 20  .)  Extract the 
ffd0: 50 32 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  P2-th column.** 
ffe0: 66 72 6f 6d 20 74 68 69 73 20 72 65 63 6f 72 64  from this record
fff0: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
10000 6c 65 73 73 20 74 68 61 74 20 28 50 32 2b 31 29  less that (P2+1)
10010 20 0a 2a 2a 20 76 61 6c 75 65 73 20 69 6e 20 74   .** values in t
10020 68 65 20 72 65 63 6f 72 64 2c 20 65 78 74 72 61  he record, extra
10030 63 74 20 61 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  ct a NULL..**.**
10040 20 54 68 65 20 76 61 6c 75 65 20 65 78 74 72 61   The value extra
10050 63 74 65 64 20 69 73 20 73 74 6f 72 65 64 20 69  cted is stored i
10060 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
10070 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6c 75  *.** If the colu
10080 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65  mn contains fewe
10090 72 20 74 68 61 6e 20 50 32 20 66 69 65 6c 64 73  r than P2 fields
100a0 2c 20 74 68 65 6e 20 65 78 74 72 61 63 74 20 61  , then extract a
100b0 20 4e 55 4c 4c 2e 20 20 4f 72 2c 0a 2a 2a 20 69   NULL.  Or,.** i
100c0 66 20 74 68 65 20 50 34 20 61 72 67 75 6d 65 6e  f the P4 argumen
100d0 74 20 69 73 20 61 20 50 34 5f 4d 45 4d 20 75 73  t is a P4_MEM us
100e0 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
100f0 68 65 20 50 34 20 61 72 67 75 6d 65 6e 74 20 61  he P4 argument a
10100 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2e  s.** the result.
10110 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50  .**.** If the OP
10120 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 20  FLAG_CLEARCACHE 
10130 62 69 74 20 69 73 20 73 65 74 20 6f 6e 20 50 35  bit is set on P5
10140 20 61 6e 64 20 50 31 20 69 73 20 61 20 70 73 65   and P1 is a pse
10150 75 64 6f 2d 74 61 62 6c 65 20 63 75 72 73 6f 72  udo-table cursor
10160 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61  ,.** then the ca
10170 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  che of the curso
10180 72 20 69 73 20 72 65 73 65 74 20 70 72 69 6f 72  r is reset prior
10190 20 74 6f 20 65 78 74 72 61 63 74 69 6e 67 20 74   to extracting t
101a0 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54 68  he column..** Th
101b0 65 20 66 69 72 73 74 20 4f 50 5f 43 6f 6c 75 6d  e first OP_Colum
101c0 6e 20 61 67 61 69 6e 73 74 20 61 20 70 73 65 75  n against a pseu
101d0 64 6f 2d 74 61 62 6c 65 20 61 66 74 65 72 20 74  do-table after t
101e0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
101f0 63 6f 6e 74 65 6e 74 0a 2a 2a 20 72 65 67 69 73  content.** regis
10200 74 65 72 20 68 61 73 20 63 68 61 6e 67 65 64 20  ter has changed 
10210 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 69 73  should have this
10220 20 62 69 74 20 73 65 74 2e 0a 2a 2f 0a 63 61 73   bit set..*/.cas
10230 65 20 4f 50 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20  e OP_Column: {. 
10240 20 75 33 32 20 70 61 79 6c 6f 61 64 53 69 7a 65   u32 payloadSize
10250 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
10260 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 72 65   bytes in the re
10270 63 6f 72 64 20 2a 2f 0a 20 20 69 36 34 20 70 61  cord */.  i64 pa
10280 79 6c 6f 61 64 53 69 7a 65 36 34 3b 20 2f 2a 20  yloadSize64; /* 
10290 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
102a0 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  in the record */
102b0 0a 20 20 69 6e 74 20 70 31 3b 20 20 20 20 20 20  .  int p1;      
102c0 20 20 20 20 20 20 2f 2a 20 50 31 20 76 61 6c 75        /* P1 valu
102d0 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  e of the opcode 
102e0 2a 2f 0a 20 20 69 6e 74 20 70 32 3b 20 20 20 20  */.  int p2;    
102f0 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6c 75 6d          /* colum
10300 6e 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 74 72  n number to retr
10310 69 65 76 65 20 2a 2f 0a 20 20 56 64 62 65 43 75  ieve */.  VdbeCu
10320 72 73 6f 72 20 2a 70 43 3b 20 20 20 20 2f 2a 20  rsor *pC;    /* 
10330 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
10340 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 65 63 3b  */.  char *zRec;
10350 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
10360 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 72  er to complete r
10370 65 63 6f 72 64 2d 64 61 74 61 20 2a 2f 0a 20 20  ecord-data */.  
10380 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
10390 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20     /* The BTree 
103a0 63 75 72 73 6f 72 20 2a 2f 0a 20 20 75 33 32 20  cursor */.  u32 
103b0 2a 61 54 79 70 65 3b 20 20 20 20 20 20 20 20 2f  *aType;        /
103c0 2a 20 61 54 79 70 65 5b 69 5d 20 68 6f 6c 64 73  * aType[i] holds
103d0 20 74 68 65 20 6e 75 6d 65 72 69 63 20 74 79 70   the numeric typ
103e0 65 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 6f  e of the i-th co
103f0 6c 75 6d 6e 20 2a 2f 0a 20 20 75 33 32 20 2a 61  lumn */.  u32 *a
10400 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
10410 61 4f 66 66 73 65 74 5b 69 5d 20 69 73 20 6f 66  aOffset[i] is of
10420 66 73 65 74 20 74 6f 20 73 74 61 72 74 20 6f 66  fset to start of
10430 20 64 61 74 61 20 66 6f 72 20 69 2d 74 68 20 63   data for i-th c
10440 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  olumn */.  int n
10450 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20 2f 2a  Field;        /*
10460 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
10470 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20  s in the record 
10480 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20  */.  int len;   
10490 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
104a0 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 65 72  ength of the ser
104b0 69 61 6c 69 7a 65 64 20 64 61 74 61 20 66 6f 72  ialized data for
104c0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20   the column */. 
104d0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
104e0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
104f0 74 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ter */.  char *z
10500 44 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 50  Data;       /* P
10510 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
10520 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20  d being decoded 
10530 2a 2f 0a 20 20 4d 65 6d 20 2a 70 44 65 73 74 3b  */.  Mem *pDest;
10540 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
10550 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 65 78   to write the ex
10560 74 72 61 63 74 65 64 20 76 61 6c 75 65 20 2a 2f  tracted value */
10570 0a 20 20 4d 65 6d 20 73 4d 65 6d 3b 20 20 20 20  .  Mem sMem;    
10580 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 74 6f        /* For sto
10590 72 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ring the record 
105a0 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f  being decoded */
105b0 0a 20 20 75 38 20 2a 7a 49 64 78 3b 20 20 20 20  .  u8 *zIdx;    
105c0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
105d0 6e 74 6f 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nto header */.  
105e0 75 38 20 2a 7a 45 6e 64 48 64 72 3b 20 20 20 20  u8 *zEndHdr;    
105f0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
10600 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65   first byte afte
10610 72 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  r the header */.
10620 20 20 75 33 32 20 6f 66 66 73 65 74 3b 20 20 20    u32 offset;   
10630 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
10640 6e 74 6f 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  nto the data */.
10650 20 20 75 33 32 20 73 7a 46 69 65 6c 64 3b 20 20    u32 szField;  
10660 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10670 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
10680 6f 6e 74 65 6e 74 20 6f 66 20 61 20 66 69 65 6c  ontent of a fiel
10690 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 48 64 72  d */.  int szHdr
106a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  ;         /* Siz
106b0 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
106c0 73 69 7a 65 20 66 69 65 6c 64 20 61 74 20 73 74  size field at st
106d0 61 72 74 20 6f 66 20 72 65 63 6f 72 64 20 2a 2f  art of record */
106e0 0a 20 20 69 6e 74 20 61 76 61 69 6c 3b 20 20 20  .  int avail;   
106f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
10700 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
10710 6c 61 62 6c 65 20 64 61 74 61 20 2a 2f 0a 20 20  lable data */.  
10720 4d 65 6d 20 2a 70 52 65 67 3b 20 20 20 20 20 20  Mem *pReg;      
10730 20 20 20 2f 2a 20 50 73 65 75 64 6f 54 61 62 6c     /* PseudoTabl
10740 65 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72  e input register
10750 20 2a 2f 0a 0a 0a 20 20 70 31 20 3d 20 70 4f 70   */...  p1 = pOp
10760 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70 4f 70  ->p1;.  p2 = pOp
10770 2d 3e 70 32 3b 0a 20 20 70 43 20 3d 20 30 3b 0a  ->p2;.  pC = 0;.
10780 20 20 6d 65 6d 73 65 74 28 26 73 4d 65 6d 2c 20    memset(&sMem, 
10790 30 2c 20 73 69 7a 65 6f 66 28 73 4d 65 6d 29 29  0, sizeof(sMem))
107a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 3c 70  ;.  assert( p1<p
107b0 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61  ->nCursor );.  a
107c0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30  ssert( pOp->p3>0
107d0 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e   && pOp->p3<=p->
107e0 6e 4d 65 6d 20 29 3b 0a 20 20 70 44 65 73 74 20  nMem );.  pDest 
107f0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
10800 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68  ;.  memAboutToCh
10810 61 6e 67 65 28 70 2c 20 70 44 65 73 74 29 3b 0a  ange(p, pDest);.
10820 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
10830 28 70 44 65 73 74 2c 20 4d 45 4d 5f 4e 75 6c 6c  (pDest, MEM_Null
10840 29 3b 0a 20 20 7a 52 65 63 20 3d 20 30 3b 0a 0a  );.  zRec = 0;..
10850 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
10860 73 65 74 73 20 74 68 65 20 76 61 72 69 61 62 6c  sets the variabl
10870 65 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 74 6f  e payloadSize to
10880 20 62 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   be the total nu
10890 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 79 74  mber of.  ** byt
108a0 65 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  es in the record
108b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 7a 52 65 63  ..  **.  ** zRec
108c0 20 69 73 20 73 65 74 20 74 6f 20 62 65 20 74 68   is set to be th
108d0 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
108e0 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 66  of the record if
108f0 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65   it is available
10900 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6d 70 6c  ..  ** The compl
10910 65 74 65 20 72 65 63 6f 72 64 20 74 65 78 74 20  ete record text 
10920 69 73 20 61 6c 77 61 79 73 20 61 76 61 69 6c 61  is always availa
10930 62 6c 65 20 66 6f 72 20 70 73 65 75 64 6f 2d 74  ble for pseudo-t
10940 61 62 6c 65 73 0a 20 20 2a 2a 20 49 66 20 74 68  ables.  ** If th
10950 65 20 72 65 63 6f 72 64 20 69 73 20 73 74 6f 72  e record is stor
10960 65 64 20 69 6e 20 61 20 63 75 72 73 6f 72 2c 20  ed in a cursor, 
10970 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 65 63  the complete rec
10980 6f 72 64 20 74 65 78 74 0a 20 20 2a 2a 20 6d 69  ord text.  ** mi
10990 67 68 74 20 62 65 20 61 76 61 69 6c 61 62 6c 65  ght be available
109a0 20 69 6e 20 74 68 65 20 20 70 43 2d 3e 61 52 6f   in the  pC->aRo
109b0 77 20 63 61 63 68 65 2e 20 20 4f 72 20 69 74 20  w cache.  Or it 
109c0 6d 69 67 68 74 20 6e 6f 74 20 62 65 2e 0a 20 20  might not be..  
109d0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 20 69  ** If the data i
109e0 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2c 20 20  s unavailable,  
109f0 7a 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 4e  zRec is set to N
10a00 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ULL..  **.  ** W
10a10 65 20 61 6c 73 6f 20 63 6f 6d 70 75 74 65 20 74  e also compute t
10a20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
10a30 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 6f  umns in the reco
10a40 72 64 2e 20 20 46 6f 72 20 63 75 72 73 6f 72 73  rd.  For cursors
10a50 2c 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65  ,.  ** the numbe
10a60 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 73 20  r of columns is 
10a70 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64  stored in the Vd
10a80 62 65 43 75 72 73 6f 72 2e 6e 46 69 65 6c 64 20  beCursor.nField 
10a90 65 6c 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  element..  */.  
10aa0 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 31  pC = p->apCsr[p1
10ab0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  ];.  assert( pC!
10ac0 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
10ad0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
10ae0 4c 54 41 42 4c 45 0a 20 20 61 73 73 65 72 74 28  LTABLE.  assert(
10af0 20 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f 72   pC->pVtabCursor
10b00 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==0 );.#endif.  
10b10 70 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72  pCrsr = pC->pCur
10b20 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 72 73 72  sor;.  if( pCrsr
10b30 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  !=0 ){.    /* Th
10b40 65 20 72 65 63 6f 72 64 20 69 73 20 73 74 6f 72  e record is stor
10b50 65 64 20 69 6e 20 61 20 42 2d 54 72 65 65 20 2a  ed in a B-Tree *
10b60 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
10b70 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
10b80 74 6f 28 70 43 29 3b 0a 20 20 20 20 69 66 28 20  to(pC);.    if( 
10b90 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
10ba0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
10bb0 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f    if( pC->nullRo
10bc0 77 20 29 7b 0a 20 20 20 20 20 20 70 61 79 6c 6f  w ){.      paylo
10bd0 61 64 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  adSize = 0;.    
10be0 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 63 61  }else if( pC->ca
10bf0 63 68 65 53 74 61 74 75 73 3d 3d 70 2d 3e 63 61  cheStatus==p->ca
10c00 63 68 65 43 74 72 20 29 7b 0a 20 20 20 20 20 20  cheCtr ){.      
10c10 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 70 43  payloadSize = pC
10c20 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 3b 0a 20  ->payloadSize;. 
10c30 20 20 20 20 20 7a 52 65 63 20 3d 20 28 63 68 61       zRec = (cha
10c40 72 2a 29 70 43 2d 3e 61 52 6f 77 3b 0a 20 20 20  r*)pC->aRow;.   
10c50 20 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 69   }else if( pC->i
10c60 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  sIndex ){.      
10c70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
10c80 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
10c90 64 28 70 43 72 73 72 29 20 29 3b 0a 20 20 20 20  d(pCrsr) );.    
10ca0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
10cb0 72 65 65 4b 65 79 53 69 7a 65 28 70 43 72 73 72  reeKeySize(pCrsr
10cc0 2c 20 26 70 61 79 6c 6f 61 64 53 69 7a 65 36 34  , &payloadSize64
10cd0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10ce0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10cf0 3b 20 20 20 2f 2a 20 54 72 75 65 20 62 65 63 61  ;   /* True beca
10d00 75 73 65 20 6f 66 20 43 75 72 73 6f 72 4d 6f 76  use of CursorMov
10d10 65 74 6f 28 29 20 63 61 6c 6c 20 61 62 6f 76 65  eto() call above
10d20 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c   */.      /* sql
10d30 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
10d40 6c 6c 50 74 72 28 29 20 75 73 65 73 20 67 65 74  llPtr() uses get
10d50 56 61 72 69 6e 74 33 32 28 29 20 74 6f 20 65 78  Varint32() to ex
10d60 74 72 61 63 74 20 74 68 65 0a 20 20 20 20 20 20  tract the.      
10d70 2a 2a 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 2c  ** payload size,
10d80 20 73 6f 20 69 74 20 69 73 20 69 6d 70 6f 73 73   so it is imposs
10d90 69 62 6c 65 20 66 6f 72 20 70 61 79 6c 6f 61 64  ible for payload
10da0 53 69 7a 65 36 34 20 74 6f 20 62 65 0a 20 20 20  Size64 to be.   
10db0 20 20 20 2a 2a 20 6c 61 72 67 65 72 20 74 68 61     ** larger tha
10dc0 6e 20 33 32 20 62 69 74 73 2e 20 2a 2f 0a 20 20  n 32 bits. */.  
10dd0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 79      assert( (pay
10de0 6c 6f 61 64 53 69 7a 65 36 34 20 26 20 53 51 4c  loadSize64 & SQL
10df0 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75  ITE_MAX_U32)==(u
10e00 36 34 29 70 61 79 6c 6f 61 64 53 69 7a 65 36 34  64)payloadSize64
10e10 20 29 3b 0a 20 20 20 20 20 20 70 61 79 6c 6f 61   );.      payloa
10e20 64 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 79  dSize = (u32)pay
10e30 6c 6f 61 64 53 69 7a 65 36 34 3b 0a 20 20 20 20  loadSize64;.    
10e40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
10e50 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
10e60 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
10e70 43 72 73 72 29 20 29 3b 0a 20 20 20 20 20 20 72  Crsr) );.      r
10e80 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
10e90 44 61 74 61 53 69 7a 65 28 70 43 72 73 72 2c 20  DataSize(pCrsr, 
10ea0 26 70 61 79 6c 6f 61 64 53 69 7a 65 29 3b 0a 20  &payloadSize);. 
10eb0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
10ec0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
10ed0 2f 2a 20 44 61 74 61 53 69 7a 65 28 29 20 63 61  /* DataSize() ca
10ee0 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 20  nnot fail */.   
10ef0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
10f00 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65  C->pseudoTableRe
10f10 67 3e 30 20 29 7b 0a 20 20 20 20 70 52 65 67 20  g>0 ){.    pReg 
10f20 3d 20 26 61 4d 65 6d 5b 70 43 2d 3e 70 73 65 75  = &aMem[pC->pseu
10f30 64 6f 54 61 62 6c 65 52 65 67 5d 3b 0a 20 20 20  doTableReg];.   
10f40 20 61 73 73 65 72 74 28 20 70 52 65 67 2d 3e 66   assert( pReg->f
10f50 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
10f60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
10f70 65 6d 49 73 56 61 6c 69 64 28 70 52 65 67 29 20  emIsValid(pReg) 
10f80 29 3b 0a 20 20 20 20 70 61 79 6c 6f 61 64 53 69  );.    payloadSi
10f90 7a 65 20 3d 20 70 52 65 67 2d 3e 6e 3b 0a 20 20  ze = pReg->n;.  
10fa0 20 20 7a 52 65 63 20 3d 20 70 52 65 67 2d 3e 7a    zRec = pReg->z
10fb0 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53  ;.    pC->cacheS
10fc0 74 61 74 75 73 20 3d 20 28 70 4f 70 2d 3e 70 35  tatus = (pOp->p5
10fd0 26 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43  &OPFLAG_CLEARCAC
10fe0 48 45 29 20 3f 20 43 41 43 48 45 5f 53 54 41 4c  HE) ? CACHE_STAL
10ff0 45 20 3a 20 70 2d 3e 63 61 63 68 65 43 74 72 3b  E : p->cacheCtr;
11000 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 79  .    assert( pay
11010 6c 6f 61 64 53 69 7a 65 3d 3d 30 20 7c 7c 20 7a  loadSize==0 || z
11020 52 65 63 21 3d 30 20 29 3b 0a 20 20 7d 65 6c 73  Rec!=0 );.  }els
11030 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64  e{.    /* Consid
11040 65 72 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65  er the row to be
11050 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 70 61 79   NULL */.    pay
11060 6c 6f 61 64 53 69 7a 65 20 3d 20 30 3b 0a 20 20  loadSize = 0;.  
11070 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 61 79 6c 6f  }..  /* If paylo
11080 61 64 53 69 7a 65 20 69 73 20 30 2c 20 74 68 65  adSize is 0, the
11090 6e 20 6a 75 73 74 20 73 74 6f 72 65 20 61 20 4e  n just store a N
110a0 55 4c 4c 20 2a 2f 0a 20 20 69 66 28 20 70 61 79  ULL */.  if( pay
110b0 6c 6f 61 64 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  loadSize==0 ){. 
110c0 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74     assert( pDest
110d0 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  ->flags&MEM_Null
110e0 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 5f   );.    goto op_
110f0 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 7d 0a  column_out;.  }.
11100 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 4c    assert( db->aL
11110 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
11120 54 5f 4c 45 4e 47 54 48 5d 3e 3d 30 20 29 3b 0a  T_LENGTH]>=0 );.
11130 20 20 69 66 28 20 70 61 79 6c 6f 61 64 53 69 7a    if( payloadSiz
11140 65 20 3e 20 28 75 33 32 29 64 62 2d 3e 61 4c 69  e > (u32)db->aLi
11150 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
11160 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20  _LENGTH] ){.    
11170 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20  goto too_big;.  
11180 7d 0a 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 43  }..  nField = pC
11190 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 61 73 73 65  ->nField;.  asse
111a0 72 74 28 20 70 32 3c 6e 46 69 65 6c 64 20 29 3b  rt( p2<nField );
111b0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20  ..  /* Read and 
111c0 70 61 72 73 65 20 74 68 65 20 74 61 62 6c 65 20  parse the table 
111d0 68 65 61 64 65 72 2e 20 20 53 74 6f 72 65 20 74  header.  Store t
111e0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
111f0 65 20 70 61 72 73 65 0a 20 20 2a 2a 20 69 6e 74  e parse.  ** int
11200 6f 20 74 68 65 20 72 65 63 6f 72 64 20 68 65 61  o the record hea
11210 64 65 72 20 63 61 63 68 65 20 66 69 65 6c 64 73  der cache fields
11220 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 0a   of the cursor..
11230 20 20 2a 2f 0a 20 20 61 54 79 70 65 20 3d 20 70    */.  aType = p
11240 43 2d 3e 61 54 79 70 65 3b 0a 20 20 69 66 28 20  C->aType;.  if( 
11250 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 3d  pC->cacheStatus=
11260 3d 70 2d 3e 63 61 63 68 65 43 74 72 20 29 7b 0a  =p->cacheCtr ){.
11270 20 20 20 20 61 4f 66 66 73 65 74 20 3d 20 70 43      aOffset = pC
11280 2d 3e 61 4f 66 66 73 65 74 3b 0a 20 20 7d 65 6c  ->aOffset;.  }el
11290 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 61  se{.    assert(a
112a0 54 79 70 65 29 3b 0a 20 20 20 20 61 76 61 69 6c  Type);.    avail
112b0 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 61 4f   = 0;.    pC->aO
112c0 66 66 73 65 74 20 3d 20 61 4f 66 66 73 65 74 20  ffset = aOffset 
112d0 3d 20 26 61 54 79 70 65 5b 6e 46 69 65 6c 64 5d  = &aType[nField]
112e0 3b 0a 20 20 20 20 70 43 2d 3e 70 61 79 6c 6f 61  ;.    pC->payloa
112f0 64 53 69 7a 65 20 3d 20 70 61 79 6c 6f 61 64 53  dSize = payloadS
11300 69 7a 65 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63  ize;.    pC->cac
11310 68 65 53 74 61 74 75 73 20 3d 20 70 2d 3e 63 61  heStatus = p->ca
11320 63 68 65 43 74 72 3b 0a 0a 20 20 20 20 2f 2a 20  cheCtr;..    /* 
11330 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
11340 61 6e 79 20 62 79 74 65 73 20 61 72 65 20 69 6e  any bytes are in
11350 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
11360 20 20 20 69 66 28 20 7a 52 65 63 20 29 7b 0a 20     if( zRec ){. 
11370 20 20 20 20 20 7a 44 61 74 61 20 3d 20 7a 52 65       zData = zRe
11380 63 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  c;.    }else{.  
11390 20 20 20 20 69 66 28 20 70 43 2d 3e 69 73 49 6e      if( pC->isIn
113a0 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  dex ){.        z
113b0 44 61 74 61 20 3d 20 28 63 68 61 72 2a 29 73 71  Data = (char*)sq
113c0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74  lite3BtreeKeyFet
113d0 63 68 28 70 43 72 73 72 2c 20 26 61 76 61 69 6c  ch(pCrsr, &avail
113e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
113f0 20 20 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20          zData = 
11400 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 42 74  (char*)sqlite3Bt
11410 72 65 65 44 61 74 61 46 65 74 63 68 28 70 43 72  reeDataFetch(pCr
11420 73 72 2c 20 26 61 76 61 69 6c 29 3b 0a 20 20 20  sr, &avail);.   
11430 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66     }.      /* If
11440 20 4b 65 79 46 65 74 63 68 28 29 2f 44 61 74 61   KeyFetch()/Data
11450 46 65 74 63 68 28 29 20 6d 61 6e 61 67 65 64 20  Fetch() managed 
11460 74 6f 20 67 65 74 20 74 68 65 20 65 6e 74 69 72  to get the entir
11470 65 20 70 61 79 6c 6f 61 64 2c 0a 20 20 20 20 20  e payload,.     
11480 20 2a 2a 20 73 61 76 65 20 74 68 65 20 70 61 79   ** save the pay
11490 6c 6f 61 64 20 69 6e 20 74 68 65 20 70 43 2d 3e  load in the pC->
114a0 61 52 6f 77 20 63 61 63 68 65 2e 20 20 54 68 61  aRow cache.  Tha
114b0 74 20 77 69 6c 6c 20 73 61 76 65 20 75 73 20 66  t will save us f
114c0 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 76  rom.      ** hav
114d0 69 6e 67 20 74 6f 20 6d 61 6b 65 20 61 64 64 69  ing to make addi
114e0 74 69 6f 6e 61 6c 20 63 61 6c 6c 73 20 74 6f 20  tional calls to 
114f0 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
11500 74 20 70 6f 72 74 69 6f 6e 20 6f 66 0a 20 20 20  t portion of.   
11510 20 20 20 2a 2a 20 74 68 65 20 72 65 63 6f 72 64     ** the record
11520 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11530 20 61 73 73 65 72 74 28 20 61 76 61 69 6c 3e 3d   assert( avail>=
11540 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
11550 61 79 6c 6f 61 64 53 69 7a 65 20 3c 3d 20 28 75  ayloadSize <= (u
11560 33 32 29 61 76 61 69 6c 20 29 7b 0a 20 20 20 20  32)avail ){.    
11570 20 20 20 20 7a 52 65 63 20 3d 20 7a 44 61 74 61      zRec = zData
11580 3b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 61 52  ;.        pC->aR
11590 6f 77 20 3d 20 28 75 38 2a 29 7a 44 61 74 61 3b  ow = (u8*)zData;
115a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
115b0 20 20 20 20 20 20 70 43 2d 3e 61 52 6f 77 20 3d        pC->aRow =
115c0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
115d0 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  }.    /* The fol
115e0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 69 73  lowing assert is
115f0 20 74 72 75 65 20 69 6e 20 61 6c 6c 20 63 61 73   true in all cas
11600 65 73 20 61 63 63 65 70 74 20 77 68 65 6e 0a 20  es accept when. 
11610 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
11620 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
11630 20 63 6f 72 72 75 70 74 65 64 20 65 78 74 65 72   corrupted exter
11640 6e 61 6c 6c 79 2e 0a 20 20 20 20 2a 2a 20 20 20  nally..    **   
11650 20 61 73 73 65 72 74 28 20 7a 52 65 63 21 3d 30   assert( zRec!=0
11660 20 7c 7c 20 61 76 61 69 6c 3e 3d 70 61 79 6c 6f   || avail>=paylo
11670 61 64 53 69 7a 65 20 7c 7c 20 61 76 61 69 6c 3e  adSize || avail>
11680 3d 39 20 29 3b 20 2a 2f 0a 20 20 20 20 73 7a 48  =9 ); */.    szH
11690 64 72 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dr = getVarint32
116a0 28 28 75 38 2a 29 7a 44 61 74 61 2c 20 6f 66 66  ((u8*)zData, off
116b0 73 65 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61  set);..    /* Ma
116c0 6b 65 20 73 75 72 65 20 61 20 63 6f 72 72 75 70  ke sure a corrup
116d0 74 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e  t database has n
116e0 6f 74 20 67 69 76 65 6e 20 75 73 20 61 6e 20 6f  ot given us an o
116f0 76 65 72 73 69 7a 65 20 68 65 61 64 65 72 2e 0a  versize header..
11700 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 6e      ** Do this n
11710 6f 77 20 74 6f 20 61 76 6f 69 64 20 61 6e 20 6f  ow to avoid an o
11720 76 65 72 73 69 7a 65 20 6d 65 6d 6f 72 79 20 61  versize memory a
11730 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  llocation..    *
11740 2a 0a 20 20 20 20 2a 2a 20 54 79 70 65 20 65 6e  *.    ** Type en
11750 74 72 69 65 73 20 63 61 6e 20 62 65 20 62 65 74  tries can be bet
11760 77 65 65 6e 20 31 20 61 6e 64 20 35 20 62 79 74  ween 1 and 5 byt
11770 65 73 20 65 61 63 68 2e 20 20 42 75 74 20 34 20  es each.  But 4 
11780 61 6e 64 20 35 20 62 79 74 65 0a 20 20 20 20 2a  and 5 byte.    *
11790 2a 20 74 79 70 65 73 20 75 73 65 20 73 6f 20 6d  * types use so m
117a0 75 63 68 20 64 61 74 61 20 73 70 61 63 65 20 74  uch data space t
117b0 68 61 74 20 74 68 65 72 65 20 63 61 6e 20 6f 6e  hat there can on
117c0 6c 79 20 62 65 20 34 30 39 36 20 61 6e 64 20 33  ly be 4096 and 3
117d0 32 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 6d  2 of.    ** them
117e0 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
117f0 20 53 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   So the maximum 
11800 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20 72 65  header length re
11810 73 75 6c 74 73 20 66 72 6f 6d 20 61 0a 20 20 20  sults from a.   
11820 20 2a 2a 20 33 2d 62 79 74 65 20 74 79 70 65 20   ** 3-byte type 
11830 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 20  for each of the 
11840 6d 61 78 69 6d 75 6d 20 6f 66 20 33 32 37 36 38  maximum of 32768
11850 20 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 20 74 68   columns plus th
11860 72 65 65 0a 20 20 20 20 2a 2a 20 65 78 74 72 61  ree.    ** extra
11870 20 62 79 74 65 73 20 66 6f 72 20 74 68 65 20 68   bytes for the h
11880 65 61 64 65 72 20 6c 65 6e 67 74 68 20 69 74 73  eader length its
11890 65 6c 66 2e 20 20 33 32 37 36 38 2a 33 20 2b 20  elf.  32768*3 + 
118a0 33 20 3d 20 39 38 33 30 37 2e 0a 20 20 20 20 2a  3 = 98307..    *
118b0 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  /.    if( offset
118c0 20 3e 20 39 38 33 30 37 20 29 7b 0a 20 20 20 20   > 98307 ){.    
118d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
118e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
118f0 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e    goto op_column
11900 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
11910 20 2f 2a 20 43 6f 6d 70 75 74 65 20 69 6e 20 6c   /* Compute in l
11920 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
11930 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 77   bytes of data w
11940 65 20 6e 65 65 64 20 74 6f 20 72 65 61 64 20 69  e need to read i
11950 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 74  n order.    ** t
11960 6f 20 67 65 74 20 6e 46 69 65 6c 64 20 74 79 70  o get nField typ
11970 65 20 76 61 6c 75 65 73 2e 20 20 6f 66 66 73 65  e values.  offse
11980 74 20 69 73 20 61 6e 20 75 70 70 65 72 20 62 6f  t is an upper bo
11990 75 6e 64 20 6f 6e 20 74 68 69 73 2e 20 20 42 75  und on this.  Bu
119a0 74 0a 20 20 20 20 2a 2a 20 6e 46 69 65 6c 64 20  t.    ** nField 
119b0 6d 69 67 68 74 20 62 65 20 73 69 67 6e 69 66 69  might be signifi
119c0 63 61 6e 74 6c 79 20 6c 65 73 73 20 74 68 61 6e  cantly less than
119d0 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
119e0 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20   of columns.    
119f0 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c  ** in the table,
11a00 20 61 6e 64 20 69 6e 20 74 68 61 74 20 63 61 73   and in that cas
11a10 65 2c 20 35 2a 6e 46 69 65 6c 64 2b 33 20 6d 69  e, 5*nField+3 mi
11a20 67 68 74 20 62 65 20 73 6d 61 6c 6c 65 72 20 74  ght be smaller t
11a30 68 61 6e 20 6f 66 66 73 65 74 2e 0a 20 20 20 20  han offset..    
11a40 2a 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 6d 69  ** We want to mi
11a50 6e 69 6d 69 7a 65 20 6c 65 6e 20 69 6e 20 6f 72  nimize len in or
11a60 64 65 72 20 74 6f 20 6c 69 6d 69 74 20 74 68 65  der to limit the
11a70 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65 6d   size of the mem
11a80 6f 72 79 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 63  ory.    ** alloc
11a90 61 74 69 6f 6e 2c 20 65 73 70 65 63 69 61 6c 6c  ation, especiall
11aa0 79 20 69 66 20 61 20 63 6f 72 72 75 70 74 20 64  y if a corrupt d
11ab0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
11ac0 20 63 61 75 73 65 64 20 6f 66 66 73 65 74 0a 20   caused offset. 
11ad0 20 20 20 2a 2a 20 74 6f 20 62 65 20 6f 76 65 72     ** to be over
11ae0 73 69 7a 65 64 2e 20 4f 66 66 73 65 74 20 69 73  sized. Offset is
11af0 20 6c 69 6d 69 74 65 64 20 74 6f 20 39 38 33 30   limited to 9830
11b00 37 20 61 62 6f 76 65 2e 20 20 42 75 74 20 39 38  7 above.  But 98
11b10 33 30 37 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a  307 might.    **
11b20 20 73 74 69 6c 6c 20 65 78 63 65 65 64 20 52 6f   still exceed Ro
11b30 62 73 6f 6e 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  bson memory allo
11b40 63 61 74 69 6f 6e 20 6c 69 6d 69 74 73 20 6f 6e  cation limits on
11b50 20 73 6f 6d 65 20 63 6f 6e 66 69 67 75 72 61 74   some configurat
11b60 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 4f 6e 20  ions..    ** On 
11b70 73 79 73 74 65 6d 73 20 74 68 61 74 20 63 61 6e  systems that can
11b80 6e 6f 74 20 74 6f 6c 65 72 61 74 65 20 6c 61 72  not tolerate lar
11b90 67 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ge memory alloca
11ba0 74 69 6f 6e 73 2c 20 6e 46 69 65 6c 64 2a 35 2b  tions, nField*5+
11bb0 33 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6c 69  3.    ** will li
11bc0 6b 65 6c 79 20 62 65 20 6d 75 63 68 20 73 6d 61  kely be much sma
11bd0 6c 6c 65 72 20 73 69 6e 63 65 20 6e 46 69 65 6c  ller since nFiel
11be0 64 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 62 65  d will likely be
11bf0 20 6c 65 73 73 20 74 68 61 6e 0a 20 20 20 20 2a   less than.    *
11c00 2a 20 32 30 20 6f 72 20 73 6f 2e 20 20 54 68 69  * 20 or so.  Thi
11c10 73 20 69 6e 73 75 72 65 73 20 74 68 61 74 20 52  s insures that R
11c20 6f 62 73 6f 6e 20 6d 65 6d 6f 72 79 20 61 6c 6c  obson memory all
11c30 6f 63 61 74 69 6f 6e 20 6c 69 6d 69 74 73 20 61  ocation limits a
11c40 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 78  re.    ** not ex
11c50 63 65 65 64 65 64 20 65 76 65 6e 20 66 6f 72 20  ceeded even for 
11c60 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
11c70 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   files..    */. 
11c80 20 20 20 6c 65 6e 20 3d 20 6e 46 69 65 6c 64 2a     len = nField*
11c90 35 20 2b 20 33 3b 0a 20 20 20 20 69 66 28 20 6c  5 + 3;.    if( l
11ca0 65 6e 20 3e 20 28 69 6e 74 29 6f 66 66 73 65 74  en > (int)offset
11cb0 20 29 20 6c 65 6e 20 3d 20 28 69 6e 74 29 6f 66   ) len = (int)of
11cc0 66 73 65 74 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  fset;..    /* Th
11cd0 65 20 4b 65 79 46 65 74 63 68 28 29 20 6f 72 20  e KeyFetch() or 
11ce0 44 61 74 61 46 65 74 63 68 28 29 20 61 62 6f 76  DataFetch() abov
11cf0 65 20 61 72 65 20 66 61 73 74 20 61 6e 64 20 77  e are fast and w
11d00 69 6c 6c 20 67 65 74 20 74 68 65 20 65 6e 74 69  ill get the enti
11d10 72 65 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64  re.    ** record
11d20 20 68 65 61 64 65 72 20 69 6e 20 6d 6f 73 74 20   header in most 
11d30 63 61 73 65 73 2e 20 20 42 75 74 20 74 68 65 79  cases.  But they
11d40 20 77 69 6c 6c 20 66 61 69 6c 20 74 6f 20 67 65   will fail to ge
11d50 74 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 0a 20  t the complete. 
11d60 20 20 20 2a 2a 20 72 65 63 6f 72 64 20 68 65 61     ** record hea
11d70 64 65 72 20 69 66 20 74 68 65 20 72 65 63 6f 72  der if the recor
11d80 64 20 68 65 61 64 65 72 20 64 6f 65 73 20 6e 6f  d header does no
11d90 74 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c  t fit on a singl
11da0 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  e page.    ** in
11db0 20 74 68 65 20 42 2d 54 72 65 65 2e 20 20 57 68   the B-Tree.  Wh
11dc0 65 6e 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c  en that happens,
11dd0 20 75 73 65 20 73 71 6c 69 74 65 33 56 64 62 65   use sqlite3Vdbe
11de0 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 29 20 74  MemFromBtree() t
11df0 6f 0a 20 20 20 20 2a 2a 20 61 63 71 75 69 72 65  o.    ** acquire
11e00 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 68 65   the complete he
11e10 61 64 65 72 20 74 65 78 74 2e 0a 20 20 20 20 2a  ader text..    *
11e20 2f 0a 20 20 20 20 69 66 28 20 21 7a 52 65 63 20  /.    if( !zRec 
11e30 26 26 20 61 76 61 69 6c 3c 6c 65 6e 20 29 7b 0a  && avail<len ){.
11e40 20 20 20 20 20 20 73 4d 65 6d 2e 66 6c 61 67 73        sMem.flags
11e50 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 4d 65 6d   = 0;.      sMem
11e60 2e 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  .db = 0;.      r
11e70 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
11e80 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 72 73  emFromBtree(pCrs
11e90 72 2c 20 30 2c 20 6c 65 6e 2c 20 70 43 2d 3e 69  r, 0, len, pC->i
11ea0 73 49 6e 64 65 78 2c 20 26 73 4d 65 6d 29 3b 0a  sIndex, &sMem);.
11eb0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
11ec0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11ed0 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d     goto op_colum
11ee0 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  n_out;.      }. 
11ef0 20 20 20 20 20 7a 44 61 74 61 20 3d 20 73 4d 65       zData = sMe
11f00 6d 2e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  m.z;.    }.    z
11f10 45 6e 64 48 64 72 20 3d 20 28 75 38 20 2a 29 26  EndHdr = (u8 *)&
11f20 7a 44 61 74 61 5b 6c 65 6e 5d 3b 0a 20 20 20 20  zData[len];.    
11f30 7a 49 64 78 20 3d 20 28 75 38 20 2a 29 26 7a 44  zIdx = (u8 *)&zD
11f40 61 74 61 5b 73 7a 48 64 72 5d 3b 0a 0a 20 20 20  ata[szHdr];..   
11f50 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 68 65 61   /* Scan the hea
11f60 64 65 72 20 61 6e 64 20 75 73 65 20 69 74 20 74  der and use it t
11f70 6f 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 61 54  o fill in the aT
11f80 79 70 65 5b 5d 20 61 6e 64 20 61 4f 66 66 73 65  ype[] and aOffse
11f90 74 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79  t[].    ** array
11fa0 73 2e 20 20 61 54 79 70 65 5b 69 5d 20 77 69 6c  s.  aType[i] wil
11fb0 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 79  l contain the ty
11fc0 70 65 20 69 6e 74 65 67 65 72 20 66 6f 72 20 74  pe integer for t
11fd0 68 65 20 69 2d 74 68 0a 20 20 20 20 2a 2a 20 63  he i-th.    ** c
11fe0 6f 6c 75 6d 6e 20 61 6e 64 20 61 4f 66 66 73 65  olumn and aOffse
11ff0 74 5b 69 5d 20 77 69 6c 6c 20 63 6f 6e 74 61 69  t[i] will contai
12000 6e 20 74 68 65 20 6f 66 66 73 65 74 20 66 72 6f  n the offset fro
12010 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  m the beginning.
12020 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 65      ** of the re
12030 63 6f 72 64 20 74 6f 20 74 68 65 20 73 74 61 72  cord to the star
12040 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 66 6f  t of the data fo
12050 72 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d  r the i-th colum
12060 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  n.    */.    for
12070 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64 3b 20  (i=0; i<nField; 
12080 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
12090 7a 49 64 78 3c 7a 45 6e 64 48 64 72 20 29 7b 0a  zIdx<zEndHdr ){.
120a0 20 20 20 20 20 20 20 20 61 4f 66 66 73 65 74 5b          aOffset[
120b0 69 5d 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20  i] = offset;.   
120c0 20 20 20 20 20 7a 49 64 78 20 2b 3d 20 67 65 74       zIdx += get
120d0 56 61 72 69 6e 74 33 32 28 7a 49 64 78 2c 20 61  Varint32(zIdx, a
120e0 54 79 70 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Type[i]);.      
120f0 20 20 73 7a 46 69 65 6c 64 20 3d 20 73 71 6c 69    szField = sqli
12100 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
12110 65 4c 65 6e 28 61 54 79 70 65 5b 69 5d 29 3b 0a  eLen(aType[i]);.
12120 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b          offset +
12130 3d 20 73 7a 46 69 65 6c 64 3b 0a 20 20 20 20 20  = szField;.     
12140 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 73 7a     if( offset<sz
12150 46 69 65 6c 64 20 29 7b 20 20 2f 2a 20 54 72 75  Field ){  /* Tru
12160 65 20 69 66 20 6f 66 66 73 65 74 20 6f 76 65 72  e if offset over
12170 66 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20  flows */.       
12180 20 20 20 7a 49 64 78 20 3d 20 26 7a 45 6e 64 48     zIdx = &zEndH
12190 64 72 5b 31 5d 3b 20 20 2f 2a 20 46 6f 72 63 65  dr[1];  /* Force
121a0 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
121b0 20 72 65 74 75 72 6e 20 62 65 6c 6f 77 20 2a 2f   return below */
121c0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
121d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
121e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
121f0 20 2f 2a 20 49 66 20 69 20 69 73 20 6c 65 73 73   /* If i is less
12200 20 74 68 61 74 20 6e 46 69 65 6c 64 2c 20 74 68   that nField, th
12210 65 6e 20 74 68 65 72 65 20 61 72 65 20 6c 65 73  en there are les
12220 73 20 66 69 65 6c 64 73 20 69 6e 20 74 68 69 73  s fields in this
12230 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 63 6f  .        ** reco
12240 72 64 20 74 68 61 6e 20 53 65 74 4e 75 6d 43 6f  rd than SetNumCo
12250 6c 75 6d 6e 73 20 69 6e 64 69 63 61 74 65 64 20  lumns indicated 
12260 74 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e  there are column
12270 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
12280 20 2a 2a 20 74 61 62 6c 65 2e 20 53 65 74 20 74   ** table. Set t
12290 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20 61 6e  he offset for an
122a0 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  y extra columns 
122b0 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 0a 20  not present in. 
122c0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65         ** the re
122d0 63 6f 72 64 20 74 6f 20 30 2e 20 54 68 69 73 20  cord to 0. This 
122e0 74 65 6c 6c 73 20 63 6f 64 65 20 62 65 6c 6f 77  tells code below
122f0 20 74 6f 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c   to store a NULL
12300 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 74  .        ** inst
12310 65 61 64 20 6f 66 20 64 65 73 65 72 69 61 6c 69  ead of deseriali
12320 7a 69 6e 67 20 61 20 76 61 6c 75 65 20 66 72 6f  zing a value fro
12330 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 0a 20 20  m the record..  
12340 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
12350 20 61 4f 66 66 73 65 74 5b 69 5d 20 3d 20 30 3b   aOffset[i] = 0;
12360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12370 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
12380 6d 52 65 6c 65 61 73 65 28 26 73 4d 65 6d 29 3b  mRelease(&sMem);
12390 0a 20 20 20 20 73 4d 65 6d 2e 66 6c 61 67 73 20  .    sMem.flags 
123a0 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 0a 20 20 20  = MEM_Null;..   
123b0 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 72   /* If we have r
123c0 65 61 64 20 6d 6f 72 65 20 68 65 61 64 65 72 20  ead more header 
123d0 64 61 74 61 20 74 68 61 6e 20 77 61 73 20 63 6f  data than was co
123e0 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 68  ntained in the h
123f0 65 61 64 65 72 2c 0a 20 20 20 20 2a 2a 20 6f 72  eader,.    ** or
12400 20 69 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   if the end of t
12410 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 61 70  he last field ap
12420 70 65 61 72 73 20 74 6f 20 62 65 20 70 61 73 74  pears to be past
12430 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
12440 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2c 20 6f      ** record, o
12450 72 20 69 66 20 74 68 65 20 65 6e 64 20 6f 66 20  r if the end of 
12460 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 61  the last field a
12470 70 70 65 61 72 73 20 74 6f 20 62 65 20 62 65 66  ppears to be bef
12480 6f 72 65 20 74 68 65 20 65 6e 64 0a 20 20 20 20  ore the end.    
12490 2a 2a 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  ** of the record
124a0 20 28 77 68 65 6e 20 61 6c 6c 20 66 69 65 6c 64   (when all field
124b0 73 20 70 72 65 73 65 6e 74 29 2c 20 74 68 65 6e  s present), then
124c0 20 77 65 20 6d 75 73 74 20 62 65 20 64 65 61 6c   we must be deal
124d0 69 6e 67 20 0a 20 20 20 20 2a 2a 20 77 69 74 68  ing .    ** with
124e0 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
124f0 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
12500 69 66 28 20 28 7a 49 64 78 20 3e 20 7a 45 6e 64  if( (zIdx > zEnd
12510 48 64 72 29 20 7c 7c 20 28 6f 66 66 73 65 74 20  Hdr) || (offset 
12520 3e 20 70 61 79 6c 6f 61 64 53 69 7a 65 29 0a 20  > payloadSize). 
12530 20 20 20 20 20 20 20 20 7c 7c 20 28 7a 49 64 78          || (zIdx
12540 3d 3d 7a 45 6e 64 48 64 72 20 26 26 20 6f 66 66  ==zEndHdr && off
12550 73 65 74 21 3d 70 61 79 6c 6f 61 64 53 69 7a 65  set!=payloadSize
12560 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
12570 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
12580 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
12590 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20  op_column_out;. 
125a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47     }.  }..  /* G
125b0 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  et the column in
125c0 66 6f 72 6d 61 74 69 6f 6e 2e 20 49 66 20 61 4f  formation. If aO
125d0 66 66 73 65 74 5b 70 32 5d 20 69 73 20 6e 6f 6e  ffset[p2] is non
125e0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 0a 20 20 2a  -zero, then .  *
125f0 2a 20 64 65 73 65 72 69 61 6c 69 7a 65 20 74 68  * deserialize th
12600 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
12610 20 72 65 63 6f 72 64 2e 20 49 66 20 61 4f 66 66   record. If aOff
12620 73 65 74 5b 70 32 5d 20 69 73 20 7a 65 72 6f 2c  set[p2] is zero,
12630 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65  .  ** then there
12640 20 61 72 65 20 6e 6f 74 20 65 6e 6f 75 67 68 20   are not enough 
12650 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 72 65  fields in the re
12660 63 6f 72 64 20 74 6f 20 73 61 74 69 73 66 79 20  cord to satisfy 
12670 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74  the.  ** request
12680 2e 20 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  .  In this case,
12690 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 4e   set the value N
126a0 55 4c 4c 20 6f 72 20 74 6f 20 50 34 20 69 66 20  ULL or to P4 if 
126b0 50 34 20 69 73 0a 20 20 2a 2a 20 61 20 70 6f 69  P4 is.  ** a poi
126c0 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 20 6f 62  nter to a Mem ob
126d0 6a 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ject..  */.  if(
126e0 20 61 4f 66 66 73 65 74 5b 70 32 5d 20 29 7b 0a   aOffset[p2] ){.
126f0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
12700 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
12710 20 69 66 28 20 7a 52 65 63 20 29 7b 0a 20 20 20   if( zRec ){.   
12720 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
12730 6d 52 65 6c 65 61 73 65 45 78 74 65 72 6e 61 6c  mReleaseExternal
12740 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 73  (pDest);.      s
12750 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
12760 47 65 74 28 28 75 38 20 2a 29 26 7a 52 65 63 5b  Get((u8 *)&zRec[
12770 61 4f 66 66 73 65 74 5b 70 32 5d 5d 2c 20 61 54  aOffset[p2]], aT
12780 79 70 65 5b 70 32 5d 2c 20 70 44 65 73 74 29 3b  ype[p2], pDest);
12790 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
127a0 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 56    len = sqlite3V
127b0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
127c0 28 61 54 79 70 65 5b 70 32 5d 29 3b 0a 20 20 20  (aType[p2]);.   
127d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
127e0 6d 4d 6f 76 65 28 26 73 4d 65 6d 2c 20 70 44 65  mMove(&sMem, pDe
127f0 73 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  st);.      rc = 
12800 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
12810 6f 6d 42 74 72 65 65 28 70 43 72 73 72 2c 20 61  omBtree(pCrsr, a
12820 4f 66 66 73 65 74 5b 70 32 5d 2c 20 6c 65 6e 2c  Offset[p2], len,
12830 20 70 43 2d 3e 69 73 49 6e 64 65 78 2c 20 26 73   pC->isIndex, &s
12840 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Mem);.      if( 
12850 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12860 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  .        goto op
12870 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20  _column_out;.   
12880 20 20 20 7d 0a 20 20 20 20 20 20 7a 44 61 74 61     }.      zData
12890 20 3d 20 73 4d 65 6d 2e 7a 3b 0a 20 20 20 20 20   = sMem.z;.     
128a0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
128b0 61 6c 47 65 74 28 28 75 38 2a 29 7a 44 61 74 61  alGet((u8*)zData
128c0 2c 20 61 54 79 70 65 5b 70 32 5d 2c 20 70 44 65  , aType[p2], pDe
128d0 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  st);.    }.    p
128e0 44 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f  Dest->enc = enco
128f0 64 69 6e 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ding;.  }else{. 
12900 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79     if( pOp->p4ty
12910 70 65 3d 3d 50 34 5f 4d 45 4d 20 29 7b 0a 20 20  pe==P4_MEM ){.  
12920 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
12930 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 44  emShallowCopy(pD
12940 65 73 74 2c 20 70 4f 70 2d 3e 70 34 2e 70 4d 65  est, pOp->p4.pMe
12950 6d 2c 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a  m, MEM_Static);.
12960 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12970 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
12980 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
12990 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
129a0 2a 20 49 66 20 77 65 20 64 79 6e 61 6d 69 63 61  * If we dynamica
129b0 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 70  lly allocated sp
129c0 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
129d0 64 61 74 61 20 28 69 6e 20 74 68 65 0a 20 20 2a  data (in the.  *
129e0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  * sqlite3VdbeMem
129f0 46 72 6f 6d 42 74 72 65 65 28 29 20 63 61 6c 6c  FromBtree() call
12a00 20 61 62 6f 76 65 29 20 74 68 65 6e 20 74 72 61   above) then tra
12a10 6e 73 66 65 72 20 63 6f 6e 74 72 6f 6c 20 6f 66  nsfer control of
12a20 20 74 68 61 74 0a 20 20 2a 2a 20 64 79 6e 61 6d   that.  ** dynam
12a30 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
12a40 20 73 70 61 63 65 20 6f 76 65 72 20 74 6f 20 74   space over to t
12a50 68 65 20 70 44 65 73 74 20 73 74 72 75 63 74 75  he pDest structu
12a60 72 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72  re..  ** This pr
12a70 65 76 65 6e 74 73 20 61 20 6d 65 6d 6f 72 79 20  events a memory 
12a80 63 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  copy..  */.  if(
12a90 20 73 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63 20 29 7b   sMem.zMalloc ){
12aa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 4d 65  .    assert( sMe
12ab0 6d 2e 7a 3d 3d 73 4d 65 6d 2e 7a 4d 61 6c 6c 6f  m.z==sMem.zMallo
12ac0 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c );.    assert(
12ad0 20 21 28 70 44 65 73 74 2d 3e 66 6c 61 67 73 20   !(pDest->flags 
12ae0 26 20 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20  & MEM_Dyn) );.  
12af0 20 20 61 73 73 65 72 74 28 20 21 28 70 44 65 73    assert( !(pDes
12b00 74 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  t->flags & (MEM_
12b10 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29 29 20 7c  Blob|MEM_Str)) |
12b20 7c 20 70 44 65 73 74 2d 3e 7a 3d 3d 73 4d 65 6d  | pDest->z==sMem
12b30 2e 7a 20 29 3b 0a 20 20 20 20 70 44 65 73 74 2d  .z );.    pDest-
12b40 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f  >flags &= ~(MEM_
12b50 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 61 74 69 63  Ephem|MEM_Static
12b60 29 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 66 6c  );.    pDest->fl
12b70 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d 3b  ags |= MEM_Term;
12b80 0a 20 20 20 20 70 44 65 73 74 2d 3e 7a 20 3d 20  .    pDest->z = 
12b90 73 4d 65 6d 2e 7a 3b 0a 20 20 20 20 70 44 65 73  sMem.z;.    pDes
12ba0 74 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 73 4d 65  t->zMalloc = sMe
12bb0 6d 2e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 7d 0a 0a  m.zMalloc;.  }..
12bc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
12bd0 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62  beMemMakeWriteab
12be0 6c 65 28 70 44 65 73 74 29 3b 0a 0a 6f 70 5f 63  le(pDest);..op_c
12bf0 6f 6c 75 6d 6e 5f 6f 75 74 3a 0a 20 20 55 50 44  olumn_out:.  UPD
12c00 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
12c10 28 70 44 65 73 74 29 3b 0a 20 20 52 45 47 49 53  (pDest);.  REGIS
12c20 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
12c30 33 2c 20 70 44 65 73 74 29 3b 0a 20 20 62 72 65  3, pDest);.  bre
12c40 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
12c50 3a 20 41 66 66 69 6e 69 74 79 20 50 31 20 50 32  : Affinity P1 P2
12c60 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 41 70   * P4 *.**.** Ap
12c70 70 6c 79 20 61 66 66 69 6e 69 74 69 65 73 20 74  ply affinities t
12c80 6f 20 61 20 72 61 6e 67 65 20 6f 66 20 50 32 20  o a range of P2 
12c90 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
12ca0 6e 67 20 77 69 74 68 20 50 31 2e 0a 2a 2a 0a 2a  ng with P1..**.*
12cb0 2a 20 50 34 20 69 73 20 61 20 73 74 72 69 6e 67  * P4 is a string
12cc0 20 74 68 61 74 20 69 73 20 50 32 20 63 68 61 72   that is P2 char
12cd0 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20 54 68 65  acters long. The
12ce0 20 6e 74 68 20 63 68 61 72 61 63 74 65 72 20 6f   nth character o
12cf0 66 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20  f the.** string 
12d00 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 63 6f  indicates the co
12d10 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 74 68  lumn affinity th
12d20 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
12d30 64 20 66 6f 72 20 74 68 65 20 6e 74 68 0a 2a 2a  d for the nth.**
12d40 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
12d50 74 68 65 20 72 61 6e 67 65 2e 0a 2a 2f 0a 63 61  the range..*/.ca
12d60 73 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 3a 20  se OP_Affinity: 
12d70 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
12d80 7a 41 66 66 69 6e 69 74 79 3b 20 20 20 2f 2a 20  zAffinity;   /* 
12d90 54 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  The affinity to 
12da0 62 65 20 61 70 70 6c 69 65 64 20 2a 2f 0a 20 20  be applied */.  
12db0 63 68 61 72 20 63 41 66 66 3b 20 20 20 20 20 20  char cAff;      
12dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
12dd0 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 20 6f  ngle character o
12de0 66 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 0a 20  f affinity */.. 
12df0 20 7a 41 66 66 69 6e 69 74 79 20 3d 20 70 4f 70   zAffinity = pOp
12e00 2d 3e 70 34 2e 7a 3b 0a 20 20 61 73 73 65 72 74  ->p4.z;.  assert
12e10 28 20 7a 41 66 66 69 6e 69 74 79 21 3d 30 20 29  ( zAffinity!=0 )
12e20 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66 66  ;.  assert( zAff
12e30 69 6e 69 74 79 5b 70 4f 70 2d 3e 70 32 5d 3d 3d  inity[pOp->p2]==
12e40 30 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61  0 );.  pIn1 = &a
12e50 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
12e60 77 68 69 6c 65 28 20 28 63 41 66 66 20 3d 20 2a  while( (cAff = *
12e70 28 7a 41 66 66 69 6e 69 74 79 2b 2b 29 29 21 3d  (zAffinity++))!=
12e80 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
12e90 20 70 49 6e 31 20 3c 3d 20 26 70 2d 3e 61 4d 65   pIn1 <= &p->aMe
12ea0 6d 5b 70 2d 3e 6e 4d 65 6d 5d 20 29 3b 0a 20 20  m[p->nMem] );.  
12eb0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
12ec0 61 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20  alid(pIn1) );.  
12ed0 20 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e    ExpandBlob(pIn
12ee0 31 29 3b 0a 20 20 20 20 61 70 70 6c 79 41 66 66  1);.    applyAff
12ef0 69 6e 69 74 79 28 70 49 6e 31 2c 20 63 41 66 66  inity(pIn1, cAff
12f00 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20  , encoding);.   
12f10 20 70 49 6e 31 2b 2b 3b 0a 20 20 7d 0a 20 20 62   pIn1++;.  }.  b
12f20 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
12f30 64 65 3a 20 4d 61 6b 65 52 65 63 6f 72 64 20 50  de: MakeRecord P
12f40 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a  1 P2 P3 P4 *.**.
12f50 2a 2a 20 43 6f 6e 76 65 72 74 20 50 32 20 72 65  ** Convert P2 re
12f60 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e  gisters beginnin
12f70 67 20 77 69 74 68 20 50 31 20 69 6e 74 6f 20 74  g with P1 into t
12f80 68 65 20 5b 72 65 63 6f 72 64 20 66 6f 72 6d 61  he [record forma
12f90 74 5d 0a 2a 2a 20 75 73 65 20 61 73 20 61 20 64  t].** use as a d
12fa0 61 74 61 20 72 65 63 6f 72 64 20 69 6e 20 61 20  ata record in a 
12fb0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f  database table o
12fc0 72 20 61 73 20 61 20 6b 65 79 0a 2a 2a 20 69 6e  r as a key.** in
12fd0 20 61 6e 20 69 6e 64 65 78 2e 20 20 54 68 65 20   an index.  The 
12fe0 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65  OP_Column opcode
12ff0 20 63 61 6e 20 64 65 63 6f 64 65 20 74 68 65 20   can decode the 
13000 72 65 63 6f 72 64 20 6c 61 74 65 72 2e 0a 2a 2a  record later..**
13010 0a 2a 2a 20 50 34 20 6d 61 79 20 62 65 20 61 20  .** P4 may be a 
13020 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 50  string that is P
13030 32 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f 6e  2 characters lon
13040 67 2e 20 20 54 68 65 20 6e 74 68 20 63 68 61 72  g.  The nth char
13050 61 63 74 65 72 20 6f 66 20 74 68 65 0a 2a 2a 20  acter of the.** 
13060 73 74 72 69 6e 67 20 69 6e 64 69 63 61 74 65 73  string indicates
13070 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
13080 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64  nity that should
13090 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
130a0 20 6e 74 68 0a 2a 2a 20 66 69 65 6c 64 20 6f 66   nth.** field of
130b0 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 2e 0a   the index key..
130c0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 70 70 69 6e  **.** The mappin
130d0 67 20 66 72 6f 6d 20 63 68 61 72 61 63 74 65 72  g from character
130e0 20 74 6f 20 61 66 66 69 6e 69 74 79 20 69 73 20   to affinity is 
130f0 67 69 76 65 6e 20 62 79 20 74 68 65 20 53 51 4c  given by the SQL
13100 49 54 45 5f 41 46 46 5f 0a 2a 2a 20 6d 61 63 72  ITE_AFF_.** macr
13110 6f 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71  os defined in sq
13120 6c 69 74 65 49 6e 74 2e 68 2e 0a 2a 2a 0a 2a 2a  liteInt.h..**.**
13130 20 49 66 20 50 34 20 69 73 20 4e 55 4c 4c 20 74   If P4 is NULL t
13140 68 65 6e 20 61 6c 6c 20 69 6e 64 65 78 20 66 69  hen all index fi
13150 65 6c 64 73 20 68 61 76 65 20 74 68 65 20 61 66  elds have the af
13160 66 69 6e 69 74 79 20 4e 4f 4e 45 2e 0a 2a 2f 0a  finity NONE..*/.
13170 63 61 73 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  case OP_MakeReco
13180 72 64 3a 20 7b 0a 20 20 75 38 20 2a 7a 4e 65 77  rd: {.  u8 *zNew
13190 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 2f  Record;        /
131a0 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
131b0 6c 64 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  ld the data for 
131c0 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
131d0 2f 0a 20 20 4d 65 6d 20 2a 70 52 65 63 3b 20 20  /.  Mem *pRec;  
131e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
131f0 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
13200 20 20 75 36 34 20 6e 44 61 74 61 3b 20 20 20 20    u64 nData;    
13210 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13220 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
13230 61 74 61 20 73 70 61 63 65 20 2a 2f 0a 20 20 69  ata space */.  i
13240 6e 74 20 6e 48 64 72 3b 20 20 20 20 20 20 20 20  nt nHdr;        
13250 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13260 6f 66 20 62 79 74 65 73 20 6f 66 20 68 65 61 64  of bytes of head
13270 65 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 36  er space */.  i6
13280 34 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  4 nByte;        
13290 20 20 20 20 20 2f 2a 20 44 61 74 61 20 73 70 61       /* Data spa
132a0 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
132b0 74 68 69 73 20 72 65 63 6f 72 64 20 2a 2f 0a 20  this record */. 
132c0 20 69 6e 74 20 6e 5a 65 72 6f 3b 20 20 20 20 20   int nZero;     
132d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
132e0 72 20 6f 66 20 7a 65 72 6f 20 62 79 74 65 73 20  r of zero bytes 
132f0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
13300 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  e record */.  in
13310 74 20 6e 56 61 72 69 6e 74 3b 20 20 20 20 20 20  t nVarint;      
13320 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13330 66 20 62 79 74 65 73 20 69 6e 20 61 20 76 61 72  f bytes in a var
13340 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  int */.  u32 ser
13350 69 61 6c 5f 74 79 70 65 3b 20 20 20 20 20 20 20  ial_type;       
13360 2f 2a 20 54 79 70 65 20 66 69 65 6c 64 20 2a 2f  /* Type field */
13370 0a 20 20 4d 65 6d 20 2a 70 44 61 74 61 30 3b 20  .  Mem *pData0; 
13380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
13390 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 63  st field to be c
133a0 6f 6d 62 69 6e 65 64 20 69 6e 74 6f 20 74 68 65  ombined into the
133b0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65 6d   record */.  Mem
133c0 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 20 20   *pLast;        
133d0 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 69 65 6c      /* Last fiel
133e0 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  d of the record 
133f0 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  */.  int nField;
13400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13410 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
13420 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  in the record */
13430 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 69 6e 69  .  char *zAffini
13440 74 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ty;       /* The
13450 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
13460 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20   for the record 
13470 2a 2f 0a 20 20 69 6e 74 20 66 69 6c 65 5f 66 6f  */.  int file_fo
13480 72 6d 61 74 3b 20 20 20 20 20 20 20 2f 2a 20 46  rmat;       /* F
13490 69 6c 65 20 66 6f 72 6d 61 74 20 74 6f 20 75 73  ile format to us
134a0 65 20 66 6f 72 20 65 6e 63 6f 64 69 6e 67 20 2a  e for encoding *
134b0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
134c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
134d0 61 63 65 20 75 73 65 64 20 69 6e 20 7a 4e 65 77  ace used in zNew
134e0 52 65 63 6f 72 64 5b 5d 20 2a 2f 0a 20 20 69 6e  Record[] */.  in
134f0 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  t len;          
13500 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
13510 66 20 61 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20  f a field */..  
13520 2f 2a 20 41 73 73 75 6d 69 6e 67 20 74 68 65 20  /* Assuming the 
13530 72 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 73 20  record contains 
13540 4e 20 66 69 65 6c 64 73 2c 20 74 68 65 20 72 65  N fields, the re
13550 63 6f 72 64 20 66 6f 72 6d 61 74 20 6c 6f 6f 6b  cord format look
13560 73 0a 20 20 2a 2a 20 6c 69 6b 65 20 74 68 69 73  s.  ** like this
13570 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 2d 2d 2d 2d  :.  **.  ** ----
13580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135c0 2d 2d 2d 2d 0a 20 20 2a 2a 20 7c 20 68 64 72 2d  ----.  ** | hdr-
135d0 73 69 7a 65 20 7c 20 74 79 70 65 20 30 20 7c 20  size | type 0 | 
135e0 74 79 70 65 20 31 20 7c 20 2e 2e 2e 20 7c 20 74  type 1 | ... | t
135f0 79 70 65 20 4e 2d 31 20 7c 20 64 61 74 61 30 20  ype N-1 | data0 
13600 7c 20 2e 2e 2e 20 7c 20 64 61 74 61 20 4e 2d 31  | ... | data N-1
13610 20 7c 20 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d   | .  ** -------
13620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13660 2d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 61 74 61  -.  **.  ** Data
13670 28 30 29 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  (0) is taken fro
13680 6d 20 72 65 67 69 73 74 65 72 20 50 31 2e 20 20  m register P1.  
13690 44 61 74 61 28 31 29 20 63 6f 6d 65 73 20 66 72  Data(1) comes fr
136a0 6f 6d 20 72 65 67 69 73 74 65 72 20 50 31 2b 31  om register P1+1
136b0 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20 66 72 6f  .  ** and so fro
136c0 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  th..  **.  ** Ea
136d0 63 68 20 74 79 70 65 20 66 69 65 6c 64 20 69 73  ch type field is
136e0 20 61 20 76 61 72 69 6e 74 20 72 65 70 72 65 73   a varint repres
136f0 65 6e 74 69 6e 67 20 74 68 65 20 73 65 72 69 61  enting the seria
13700 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 0a 20  l type of the . 
13710 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e   ** correspondin
13720 67 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 28  g data element (
13730 73 65 65 20 73 71 6c 69 74 65 33 56 64 62 65 53  see sqlite3VdbeS
13740 65 72 69 61 6c 54 79 70 65 28 29 29 2e 20 54 68  erialType()). Th
13750 65 0a 20 20 2a 2a 20 68 64 72 2d 73 69 7a 65 20  e.  ** hdr-size 
13760 66 69 65 6c 64 20 69 73 20 61 6c 73 6f 20 61 20  field is also a 
13770 76 61 72 69 6e 74 20 77 68 69 63 68 20 69 73 20  varint which is 
13780 74 68 65 20 6f 66 66 73 65 74 20 66 72 6f 6d 20  the offset from 
13790 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
137a0 2a 2a 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  ** of the record
137b0 20 74 6f 20 64 61 74 61 30 2e 0a 20 20 2a 2f 0a   to data0..  */.
137c0 20 20 6e 44 61 74 61 20 3d 20 30 3b 20 20 20 20    nData = 0;    
137d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
137e0 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
137f0 73 70 61 63 65 20 2a 2f 0a 20 20 6e 48 64 72 20  space */.  nHdr 
13800 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
13810 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
13820 20 6f 66 20 68 65 61 64 65 72 20 73 70 61 63 65   of header space
13830 20 2a 2f 0a 20 20 6e 5a 65 72 6f 20 3d 20 30 3b   */.  nZero = 0;
13840 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13850 65 72 20 6f 66 20 7a 65 72 6f 20 62 79 74 65 73  er of zero bytes
13860 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
13870 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 6e  he record */.  n
13880 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 31 3b  Field = pOp->p1;
13890 0a 20 20 7a 41 66 66 69 6e 69 74 79 20 3d 20 70  .  zAffinity = p
138a0 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 61 73 73 65  Op->p4.z;.  asse
138b0 72 74 28 20 6e 46 69 65 6c 64 3e 30 20 26 26 20  rt( nField>0 && 
138c0 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70  pOp->p2>0 && pOp
138d0 2d 3e 70 32 2b 6e 46 69 65 6c 64 3c 3d 70 2d 3e  ->p2+nField<=p->
138e0 6e 4d 65 6d 2b 31 20 29 3b 0a 20 20 70 44 61 74  nMem+1 );.  pDat
138f0 61 30 20 3d 20 26 61 4d 65 6d 5b 6e 46 69 65 6c  a0 = &aMem[nFiel
13900 64 5d 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70  d];.  nField = p
13910 4f 70 2d 3e 70 32 3b 0a 20 20 70 4c 61 73 74 20  Op->p2;.  pLast 
13920 3d 20 26 70 44 61 74 61 30 5b 6e 46 69 65 6c 64  = &pData0[nField
13930 2d 31 5d 3b 0a 20 20 66 69 6c 65 5f 66 6f 72 6d  -1];.  file_form
13940 61 74 20 3d 20 70 2d 3e 6d 69 6e 57 72 69 74 65  at = p->minWrite
13950 46 69 6c 65 46 6f 72 6d 61 74 3b 0a 0a 20 20 2f  FileFormat;..  /
13960 2a 20 49 64 65 6e 74 69 66 79 20 74 68 65 20 6f  * Identify the o
13970 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20 2a  utput register *
13980 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  /.  assert( pOp-
13990 3e 70 33 3c 70 4f 70 2d 3e 70 31 20 7c 7c 20 70  >p3<pOp->p1 || p
139a0 4f 70 2d 3e 70 33 3e 3d 70 4f 70 2d 3e 70 31 2b  Op->p3>=pOp->p1+
139b0 70 4f 70 2d 3e 70 32 20 29 3b 0a 20 20 70 4f 75  pOp->p2 );.  pOu
139c0 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
139d0 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f  3];.  memAboutTo
139e0 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b  Change(p, pOut);
139f0 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f  ..  /* Loop thro
13a00 75 67 68 20 74 68 65 20 65 6c 65 6d 65 6e 74 73  ugh the elements
13a10 20 74 68 61 74 20 77 69 6c 6c 20 6d 61 6b 65 20   that will make 
13a20 75 70 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f  up the record to
13a30 20 66 69 67 75 72 65 0a 20 20 2a 2a 20 6f 75 74   figure.  ** out
13a40 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
13a50 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
13a60 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e 0a  the new record..
13a70 20 20 2a 2f 0a 20 20 66 6f 72 28 70 52 65 63 3d    */.  for(pRec=
13a80 70 44 61 74 61 30 3b 20 70 52 65 63 3c 3d 70 4c  pData0; pRec<=pL
13a90 61 73 74 3b 20 70 52 65 63 2b 2b 29 7b 0a 20 20  ast; pRec++){.  
13aa0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
13ab0 61 6c 69 64 28 70 52 65 63 29 20 29 3b 0a 20 20  alid(pRec) );.  
13ac0 20 20 69 66 28 20 7a 41 66 66 69 6e 69 74 79 20    if( zAffinity 
13ad0 29 7b 0a 20 20 20 20 20 20 61 70 70 6c 79 41 66  ){.      applyAf
13ae0 66 69 6e 69 74 79 28 70 52 65 63 2c 20 7a 41 66  finity(pRec, zAf
13af0 66 69 6e 69 74 79 5b 70 52 65 63 2d 70 44 61 74  finity[pRec-pDat
13b00 61 30 5d 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  a0], encoding);.
13b10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52      }.    if( pR
13b20 65 63 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 5a 65  ec->flags&MEM_Ze
13b30 72 6f 20 26 26 20 70 52 65 63 2d 3e 6e 3e 30 20  ro && pRec->n>0 
13b40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13b50 56 64 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f  VdbeMemExpandBlo
13b60 62 28 70 52 65 63 29 3b 0a 20 20 20 20 7d 0a 20  b(pRec);.    }. 
13b70 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
13b80 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
13b90 61 6c 54 79 70 65 28 70 52 65 63 2c 20 66 69 6c  alType(pRec, fil
13ba0 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 6c  e_format);.    l
13bb0 65 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  en = sqlite3Vdbe
13bc0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
13bd0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
13be0 6e 44 61 74 61 20 2b 3d 20 6c 65 6e 3b 0a 20 20  nData += len;.  
13bf0 20 20 6e 48 64 72 20 2b 3d 20 73 71 6c 69 74 65    nHdr += sqlite
13c00 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61  3VarintLen(seria
13c10 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28  l_type);.    if(
13c20 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20 4d   pRec->flags & M
13c30 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20  EM_Zero ){.     
13c40 20 2f 2a 20 4f 6e 6c 79 20 70 75 72 65 20 7a 65   /* Only pure ze
13c50 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f 42 73 20  ro-filled BLOBs 
13c60 63 61 6e 20 62 65 20 69 6e 70 75 74 20 74 6f 20  can be input to 
13c70 74 68 69 73 20 4f 70 63 6f 64 65 2e 0a 20 20 20  this Opcode..   
13c80 20 20 20 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20     ** We do not 
13c90 61 6c 6c 6f 77 20 62 6c 6f 62 73 20 77 69 74 68  allow blobs with
13ca0 20 61 20 70 72 65 66 69 78 20 61 6e 64 20 61 20   a prefix and a 
13cb0 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
13cc0 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 5a 65 72 6f  . */.      nZero
13cd0 20 2b 3d 20 70 52 65 63 2d 3e 75 2e 6e 5a 65 72   += pRec->u.nZer
13ce0 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  o;.    }else if(
13cf0 20 6c 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 5a   len ){.      nZ
13d00 65 72 6f 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ero = 0;.    }. 
13d10 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65   }..  /* Add the
13d20 20 69 6e 69 74 69 61 6c 20 68 65 61 64 65 72 20   initial header 
13d30 76 61 72 69 6e 74 20 61 6e 64 20 74 6f 74 61 6c  varint and total
13d40 20 74 68 65 20 73 69 7a 65 20 2a 2f 0a 20 20 6e   the size */.  n
13d50 48 64 72 20 2b 3d 20 6e 56 61 72 69 6e 74 20 3d  Hdr += nVarint =
13d60 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65   sqlite3VarintLe
13d70 6e 28 6e 48 64 72 29 3b 0a 20 20 69 66 28 20 6e  n(nHdr);.  if( n
13d80 56 61 72 69 6e 74 3c 73 71 6c 69 74 65 33 56 61  Varint<sqlite3Va
13d90 72 69 6e 74 4c 65 6e 28 6e 48 64 72 29 20 29 7b  rintLen(nHdr) ){
13da0 0a 20 20 20 20 6e 48 64 72 2b 2b 3b 0a 20 20 7d  .    nHdr++;.  }
13db0 0a 20 20 6e 42 79 74 65 20 3d 20 6e 48 64 72 2b  .  nByte = nHdr+
13dc0 6e 44 61 74 61 2d 6e 5a 65 72 6f 3b 0a 20 20 69  nData-nZero;.  i
13dd0 66 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69  f( nByte>db->aLi
13de0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
13df0 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20  _LENGTH] ){.    
13e00 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20  goto too_big;.  
13e10 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
13e20 65 20 74 68 65 20 6f 75 74 70 75 74 20 72 65 67  e the output reg
13e30 69 73 74 65 72 20 68 61 73 20 61 20 62 75 66 66  ister has a buff
13e40 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  er large enough 
13e50 74 6f 20 73 74 6f 72 65 20 0a 20 20 2a 2a 20 74  to store .  ** t
13e60 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e 20 54  he new record. T
13e70 68 65 20 6f 75 74 70 75 74 20 72 65 67 69 73 74  he output regist
13e80 65 72 20 28 70 4f 70 2d 3e 70 33 29 20 69 73 20  er (pOp->p3) is 
13e90 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20  not allowed to. 
13ea0 20 2a 2a 20 62 65 20 6f 6e 65 20 6f 66 20 74 68   ** be one of th
13eb0 65 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72  e input register
13ec0 73 20 28 62 65 63 61 75 73 65 20 74 68 65 20 66  s (because the f
13ed0 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f  ollowing call to
13ee0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  .  ** sqlite3Vdb
13ef0 65 4d 65 6d 47 72 6f 77 28 29 20 63 6f 75 6c 64  eMemGrow() could
13f00 20 63 6c 6f 62 62 65 72 20 74 68 65 20 76 61 6c   clobber the val
13f10 75 65 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  ue before it is 
13f20 75 73 65 64 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  used)..  */.  if
13f30 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
13f40 47 72 6f 77 28 70 4f 75 74 2c 20 28 69 6e 74 29  Grow(pOut, (int)
13f50 6e 42 79 74 65 2c 20 30 29 20 29 7b 0a 20 20 20  nByte, 0) ){.   
13f60 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
13f70 7d 0a 20 20 7a 4e 65 77 52 65 63 6f 72 64 20 3d  }.  zNewRecord =
13f80 20 28 75 38 20 2a 29 70 4f 75 74 2d 3e 7a 3b 0a   (u8 *)pOut->z;.
13f90 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
13fa0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 20 3d 20  record */.  i = 
13fb0 70 75 74 56 61 72 69 6e 74 33 32 28 7a 4e 65 77  putVarint32(zNew
13fc0 52 65 63 6f 72 64 2c 20 6e 48 64 72 29 3b 0a 20  Record, nHdr);. 
13fd0 20 66 6f 72 28 70 52 65 63 3d 70 44 61 74 61 30   for(pRec=pData0
13fe0 3b 20 70 52 65 63 3c 3d 70 4c 61 73 74 3b 20 70  ; pRec<=pLast; p
13ff0 52 65 63 2b 2b 29 7b 0a 20 20 20 20 73 65 72 69  Rec++){.    seri
14000 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65  al_type = sqlite
14010 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
14020 70 52 65 63 2c 20 66 69 6c 65 5f 66 6f 72 6d 61  pRec, file_forma
14030 74 29 3b 0a 20 20 20 20 69 20 2b 3d 20 70 75 74  t);.    i += put
14040 56 61 72 69 6e 74 33 32 28 26 7a 4e 65 77 52 65  Varint32(&zNewRe
14050 63 6f 72 64 5b 69 5d 2c 20 73 65 72 69 61 6c 5f  cord[i], serial_
14060 74 79 70 65 29 3b 20 20 20 20 20 20 2f 2a 20 73  type);      /* s
14070 65 72 69 61 6c 20 74 79 70 65 20 2a 2f 0a 20 20  erial type */.  
14080 7d 0a 20 20 66 6f 72 28 70 52 65 63 3d 70 44 61  }.  for(pRec=pDa
14090 74 61 30 3b 20 70 52 65 63 3c 3d 70 4c 61 73 74  ta0; pRec<=pLast
140a0 3b 20 70 52 65 63 2b 2b 29 7b 20 20 2f 2a 20 73  ; pRec++){  /* s
140b0 65 72 69 61 6c 20 64 61 74 61 20 2a 2f 0a 20 20  erial data */.  
140c0 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    i += sqlite3Vd
140d0 62 65 53 65 72 69 61 6c 50 75 74 28 26 7a 4e 65  beSerialPut(&zNe
140e0 77 52 65 63 6f 72 64 5b 69 5d 2c 20 28 69 6e 74  wRecord[i], (int
140f0 29 28 6e 42 79 74 65 2d 69 29 2c 20 70 52 65 63  )(nByte-i), pRec
14100 2c 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20  ,file_format);. 
14110 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 3d 3d   }.  assert( i==
14120 6e 42 79 74 65 20 29 3b 0a 0a 20 20 61 73 73 65  nByte );..  asse
14130 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26  rt( pOp->p3>0 &&
14140 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65   pOp->p3<=p->nMe
14150 6d 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d  m );.  pOut->n =
14160 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a 20 20 70   (int)nByte;.  p
14170 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
14180 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 44 79 6e 3b  _Blob | MEM_Dyn;
14190 0a 20 20 70 4f 75 74 2d 3e 78 44 65 6c 20 3d 20  .  pOut->xDel = 
141a0 30 3b 0a 20 20 69 66 28 20 6e 5a 65 72 6f 20 29  0;.  if( nZero )
141b0 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 6e 5a  {.    pOut->u.nZ
141c0 65 72 6f 20 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20  ero = nZero;.   
141d0 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20   pOut->flags |= 
141e0 4d 45 4d 5f 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20  MEM_Zero;.  }.  
141f0 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pOut->enc = SQLI
14200 54 45 5f 55 54 46 38 3b 20 20 2f 2a 20 49 6e 20  TE_UTF8;  /* In 
14210 63 61 73 65 20 74 68 65 20 62 6c 6f 62 20 69 73  case the blob is
14220 20 65 76 65 72 20 63 6f 6e 76 65 72 74 65 64 20   ever converted 
14230 74 6f 20 74 65 78 74 20 2a 2f 0a 20 20 52 45 47  to text */.  REG
14240 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
14250 3e 70 33 2c 20 70 4f 75 74 29 3b 0a 20 20 55 50  >p3, pOut);.  UP
14260 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
14270 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b  E(pOut);.  break
14280 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
14290 43 6f 75 6e 74 20 50 31 20 50 32 20 2a 20 2a 20  Count P1 P2 * * 
142a0 2a 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 74 68  *.**.** Store th
142b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
142c0 69 65 73 20 28 61 6e 20 69 6e 74 65 67 65 72 20  ies (an integer 
142d0 76 61 6c 75 65 29 20 69 6e 20 74 68 65 20 74 61  value) in the ta
142e0 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 0a 2a 2a  ble or index .**
142f0 20 6f 70 65 6e 65 64 20 62 79 20 63 75 72 73 6f   opened by curso
14300 72 20 50 31 20 69 6e 20 72 65 67 69 73 74 65 72  r P1 in register
14310 20 50 32 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53   P2.*/.#ifndef S
14320 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
14330 43 4f 55 4e 54 0a 63 61 73 65 20 4f 50 5f 43 6f  COUNT.case OP_Co
14340 75 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20 2f  unt: {         /
14350 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73  * out2-prereleas
14360 65 20 2a 2f 0a 20 20 69 36 34 20 6e 45 6e 74 72  e */.  i64 nEntr
14370 79 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  y;.  BtCursor *p
14380 43 72 73 72 3b 0a 0a 20 20 70 43 72 73 72 20 3d  Crsr;..  pCrsr =
14390 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
143a0 31 5d 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  1]->pCursor;.  i
143b0 66 28 20 70 43 72 73 72 20 29 7b 0a 20 20 20 20  f( pCrsr ){.    
143c0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
143d0 65 43 6f 75 6e 74 28 70 43 72 73 72 2c 20 26 6e  eCount(pCrsr, &n
143e0 45 6e 74 72 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  Entry);.  }else{
143f0 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d 20 30 3b  .    nEntry = 0;
14400 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69  .  }.  pOut->u.i
14410 20 3d 20 6e 45 6e 74 72 79 3b 0a 20 20 62 72 65   = nEntry;.  bre
14420 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ak;.}.#endif../*
14430 20 4f 70 63 6f 64 65 3a 20 53 61 76 65 70 6f 69   Opcode: Savepoi
14440 6e 74 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a  nt P1 * * P4 *.*
14450 2a 0a 2a 2a 20 4f 70 65 6e 2c 20 72 65 6c 65 61  *.** Open, relea
14460 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 74  se or rollback t
14470 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6e 61 6d  he savepoint nam
14480 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
14490 50 34 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a  P4, depending.**
144a0 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
144b0 20 50 31 2e 20 54 6f 20 6f 70 65 6e 20 61 20 6e   P1. To open a n
144c0 65 77 20 73 61 76 65 70 6f 69 6e 74 2c 20 50 31  ew savepoint, P1
144d0 3d 3d 30 2e 20 54 6f 20 72 65 6c 65 61 73 65 20  ==0. To release 
144e0 28 63 6f 6d 6d 69 74 29 20 61 6e 0a 2a 2a 20 65  (commit) an.** e
144f0 78 69 73 74 69 6e 67 20 73 61 76 65 70 6f 69 6e  xisting savepoin
14500 74 2c 20 50 31 3d 3d 31 2c 20 6f 72 20 74 6f 20  t, P1==1, or to 
14510 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 65 78 69 73  rollback an exis
14520 74 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20 50  ting savepoint P
14530 31 3d 3d 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  1==2..*/.case OP
14540 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20  _Savepoint: {.  
14550 69 6e 74 20 70 31 3b 20 20 20 20 20 20 20 20 20  int p1;         
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14570 2f 2a 20 56 61 6c 75 65 20 6f 66 20 50 31 20 6f  /* Value of P1 o
14580 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 68 61 72  perand */.  char
14590 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
145a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
145b0 61 6d 65 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ame of savepoint
145c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
145d0 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 4e  .  Savepoint *pN
145e0 65 77 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20  ew;.  Savepoint 
145f0 2a 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 53  *pSavepoint;.  S
14600 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 3b 0a  avepoint *pTmp;.
14610 20 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74    int iSavepoint
14620 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 70  ;.  int ii;..  p
14630 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a  1 = pOp->p1;.  z
14640 4e 61 6d 65 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  Name = pOp->p4.z
14650 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
14660 68 61 74 20 74 68 65 20 70 31 20 70 61 72 61 6d  hat the p1 param
14670 65 74 65 72 20 69 73 20 76 61 6c 69 64 2e 20 41  eter is valid. A
14680 6c 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 72  lso that if ther
14690 65 20 69 73 20 6e 6f 20 6f 70 65 6e 0a 20 20 2a  e is no open.  *
146a0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  * transaction, t
146b0 68 65 6e 20 74 68 65 72 65 20 63 61 6e 6e 6f 74  hen there cannot
146c0 20 62 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e   be any savepoin
146d0 74 73 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ts. .  */.  asse
146e0 72 74 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  rt( db->pSavepoi
146f0 6e 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 75 74  nt==0 || db->aut
14700 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 3b 0a 20 20  oCommit==0 );.  
14710 61 73 73 65 72 74 28 20 70 31 3d 3d 53 41 56 45  assert( p1==SAVE
14720 50 4f 49 4e 54 5f 42 45 47 49 4e 7c 7c 70 31 3d  POINT_BEGIN||p1=
14730 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
14740 53 45 7c 7c 70 31 3d 3d 53 41 56 45 50 4f 49 4e  SE||p1==SAVEPOIN
14750 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  T_ROLLBACK );.  
14760 61 73 73 65 72 74 28 20 64 62 2d 3e 70 53 61 76  assert( db->pSav
14770 65 70 6f 69 6e 74 20 7c 7c 20 64 62 2d 3e 69 73  epoint || db->is
14780 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70  TransactionSavep
14790 6f 69 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  oint==0 );.  ass
147a0 65 72 74 28 20 63 68 65 63 6b 53 61 76 65 70 6f  ert( checkSavepo
147b0 69 6e 74 43 6f 75 6e 74 28 64 62 29 20 29 3b 0a  intCount(db) );.
147c0 0a 20 20 69 66 28 20 70 31 3d 3d 53 41 56 45 50  .  if( p1==SAVEP
147d0 4f 49 4e 54 5f 42 45 47 49 4e 20 29 7b 0a 20 20  OINT_BEGIN ){.  
147e0 20 20 69 66 28 20 64 62 2d 3e 77 72 69 74 65 56    if( db->writeV
147f0 64 62 65 43 6e 74 3e 30 20 29 7b 0a 20 20 20 20  dbeCnt>0 ){.    
14800 20 20 2f 2a 20 41 20 6e 65 77 20 73 61 76 65 70    /* A new savep
14810 6f 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 63  oint cannot be c
14820 72 65 61 74 65 64 20 69 66 20 74 68 65 72 65 20  reated if there 
14830 61 72 65 20 61 63 74 69 76 65 20 77 72 69 74 65  are active write
14840 20 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65   .      ** state
14850 6d 65 6e 74 73 20 28 69 2e 65 2e 20 6f 70 65 6e  ments (i.e. open
14860 20 72 65 61 64 2f 77 72 69 74 65 20 69 6e 63 72   read/write incr
14870 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 68 61 6e  emental blob han
14880 64 6c 65 73 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  dles)..      */.
14890 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
148a0 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
148b0 73 67 2c 20 64 62 2c 20 22 63 61 6e 6e 6f 74 20  sg, db, "cannot 
148c0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 20 2d  open savepoint -
148d0 20 22 0a 20 20 20 20 20 20 20 20 22 53 51 4c 20   ".        "SQL 
148e0 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70 72  statements in pr
148f0 6f 67 72 65 73 73 22 29 3b 0a 20 20 20 20 20 20  ogress");.      
14900 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
14910 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14920 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74     nName = sqlit
14930 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
14940 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65  );..      /* Cre
14950 61 74 65 20 61 20 6e 65 77 20 73 61 76 65 70 6f  ate a new savepo
14960 69 6e 74 20 73 74 72 75 63 74 75 72 65 2e 20 2a  int structure. *
14970 2f 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  /.      pNew = s
14980 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
14990 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 61 76  w(db, sizeof(Sav
149a0 65 70 6f 69 6e 74 29 2b 6e 4e 61 6d 65 2b 31 29  epoint)+nName+1)
149b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
149c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
149d0 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 20  ->zName = (char 
149e0 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20  *)&pNew[1];.    
149f0 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d      memcpy(pNew-
14a00 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e  >zName, zName, n
14a10 4e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 0a 20 20  Name+1);.    .  
14a20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
14a30 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 74 72 61  e is no open tra
14a40 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6d  nsaction, then m
14a50 61 72 6b 20 74 68 69 73 20 61 73 20 61 20 73 70  ark this as a sp
14a60 65 63 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  ecial.        **
14a70 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61   "transaction sa
14a80 76 65 70 6f 69 6e 74 22 2e 20 2a 2f 0a 20 20 20  vepoint". */.   
14a90 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74       if( db->aut
14aa0 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  oCommit ){.     
14ab0 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
14ac0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
14ad0 20 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63     db->isTransac
14ae0 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  tionSavepoint = 
14af0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
14b00 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  {.          db->
14b10 6e 53 61 76 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20  nSavepoint++;.  
14b20 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20        }.    .   
14b30 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65       /* Link the
14b40 20 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20 69   new savepoint i
14b50 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
14b60 20 68 61 6e 64 6c 65 27 73 20 6c 69 73 74 2e 20   handle's list. 
14b70 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
14b80 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 53 61  >pNext = db->pSa
14b90 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20  vepoint;.       
14ba0 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
14bb0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
14bc0 70 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65 64 43  pNew->nDeferredC
14bd0 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72  ons = db->nDefer
14be0 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 7d  redCons;.      }
14bf0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
14c00 20 20 20 20 69 53 61 76 65 70 6f 69 6e 74 20 3d      iSavepoint =
14c10 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   0;..    /* Find
14c20 20 74 68 65 20 6e 61 6d 65 64 20 73 61 76 65 70   the named savep
14c30 6f 69 6e 74 2e 20 49 66 20 74 68 65 72 65 20 69  oint. If there i
14c40 73 20 6e 6f 20 73 75 63 68 20 73 61 76 65 70 6f  s no such savepo
14c50 69 6e 74 2c 20 74 68 65 6e 20 61 6e 0a 20 20 20  int, then an.   
14c60 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 69 73 20   ** an error is 
14c70 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
14c80 75 73 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 6f  user.  */.    fo
14c90 72 28 0a 20 20 20 20 20 20 70 53 61 76 65 70 6f  r(.      pSavepo
14ca0 69 6e 74 20 3d 20 64 62 2d 3e 70 53 61 76 65 70  int = db->pSavep
14cb0 6f 69 6e 74 3b 20 0a 20 20 20 20 20 20 70 53 61  oint; .      pSa
14cc0 76 65 70 6f 69 6e 74 20 26 26 20 73 71 6c 69 74  vepoint && sqlit
14cd0 65 33 53 74 72 49 43 6d 70 28 70 53 61 76 65 70  e3StrICmp(pSavep
14ce0 6f 69 6e 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  oint->zName, zNa
14cf0 6d 65 29 3b 0a 20 20 20 20 20 20 70 53 61 76 65  me);.      pSave
14d00 70 6f 69 6e 74 20 3d 20 70 53 61 76 65 70 6f 69  point = pSavepoi
14d10 6e 74 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 7b  nt->pNext.    ){
14d20 0a 20 20 20 20 20 20 69 53 61 76 65 70 6f 69 6e  .      iSavepoin
14d30 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  t++;.    }.    i
14d40 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 29  f( !pSavepoint )
14d50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
14d60 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
14d70 72 4d 73 67 2c 20 64 62 2c 20 22 6e 6f 20 73 75  rMsg, db, "no su
14d80 63 68 20 73 61 76 65 70 6f 69 6e 74 3a 20 25 73  ch savepoint: %s
14d90 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
14da0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
14db0 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
14dc0 28 20 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 77  ( .        db->w
14dd0 72 69 74 65 56 64 62 65 43 6e 74 3e 30 20 7c 7c  riteVdbeCnt>0 ||
14de0 20 28 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   (p1==SAVEPOINT_
14df0 52 4f 4c 4c 42 41 43 4b 20 26 26 20 64 62 2d 3e  ROLLBACK && db->
14e00 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 31 29  activeVdbeCnt>1)
14e10 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f   .    ){.      /
14e20 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
14e30 69 62 6c 65 20 74 6f 20 72 65 6c 65 61 73 65 20  ible to release 
14e40 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76 65 70  (commit) a savep
14e50 6f 69 6e 74 20 69 66 20 74 68 65 72 65 20 61 72  oint if there ar
14e60 65 20 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 69  e .      ** acti
14e70 76 65 20 77 72 69 74 65 20 73 74 61 74 65 6d 65  ve write stateme
14e80 6e 74 73 2e 20 49 74 20 69 73 20 6e 6f 74 20 70  nts. It is not p
14e90 6f 73 73 69 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  ossible to rollb
14ea0 61 63 6b 20 61 20 73 61 76 65 70 6f 69 6e 74 0a  ack a savepoint.
14eb0 20 20 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72        ** if ther
14ec0 65 20 61 72 65 20 61 6e 79 20 61 63 74 69 76 65  e are any active
14ed0 20 73 74 61 74 65 6d 65 6e 74 73 20 61 74 20 61   statements at a
14ee0 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ll..      */.   
14ef0 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
14f00 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
14f10 20 64 62 2c 20 0a 20 20 20 20 20 20 20 20 22 63   db, .        "c
14f20 61 6e 6e 6f 74 20 25 73 20 73 61 76 65 70 6f 69  annot %s savepoi
14f30 6e 74 20 2d 20 53 51 4c 20 73 74 61 74 65 6d 65  nt - SQL stateme
14f40 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73 22  nts in progress"
14f50 2c 0a 20 20 20 20 20 20 20 20 28 70 31 3d 3d 53  ,.        (p1==S
14f60 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
14f70 4b 20 3f 20 22 72 6f 6c 6c 62 61 63 6b 22 3a 20  K ? "rollback": 
14f80 22 72 65 6c 65 61 73 65 22 29 0a 20 20 20 20 20  "release").     
14f90 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   );.      rc = S
14fa0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
14fb0 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 20 20 2f 2a  }else{..      /*
14fc0 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
14fd0 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 20 69  er or not this i
14fe0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
14ff0 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 73 6f  savepoint. If so
15000 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74  ,.      ** and t
15010 68 69 73 20 69 73 20 61 20 52 45 4c 45 41 53 45  his is a RELEASE
15020 20 63 6f 6d 6d 61 6e 64 2c 20 74 68 65 6e 20 74   command, then t
15030 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
15040 61 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2a  action .      **
15050 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 0a   is committed. .
15060 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
15070 6e 74 20 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  nt isTransaction
15080 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 70   = pSavepoint->p
15090 4e 65 78 74 3d 3d 30 20 26 26 20 64 62 2d 3e 69  Next==0 && db->i
150a0 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65  sTransactionSave
150b0 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 69 66 28  point;.      if(
150c0 20 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 20 26   isTransaction &
150d0 26 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  & p1==SAVEPOINT_
150e0 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20  RELEASE ){.     
150f0 20 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c     if( (rc = sql
15100 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
15110 70 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f  p, 1))!=SQLITE_O
15120 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
15130 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b  oto vdbe_return;
15140 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15150 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
15160 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  t = 1;.        i
15170 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  f( sqlite3VdbeHa
15180 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45 5f 42 55  lt(p)==SQLITE_BU
15190 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  SY ){.          
151a0 70 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20 20 20  p->pc = pc;.    
151b0 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
151c0 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  mmit = 0;.      
151d0 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d      p->rc = rc =
151e0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
151f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62          goto vdb
15200 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  e_return;.      
15210 20 20 7d 0a 20 20 20 20 20 20 20 20 64 62 2d 3e    }.        db->
15220 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76  isTransactionSav
15230 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20  epoint = 0;.    
15240 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a      rc = p->rc;.
15250 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15260 20 20 20 20 20 69 53 61 76 65 70 6f 69 6e 74 20       iSavepoint 
15270 3d 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  = db->nSavepoint
15280 20 2d 20 69 53 61 76 65 70 6f 69 6e 74 20 2d 20   - iSavepoint - 
15290 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  1;.        for(i
152a0 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b  i=0; ii<db->nDb;
152b0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
152c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
152d0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 64 62 2d  reeSavepoint(db-
152e0 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c 20 70 31  >aDb[ii].pBt, p1
152f0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
15300 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
15310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15320 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
15330 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
15340 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
15350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15360 20 69 66 28 20 70 31 3d 3d 53 41 56 45 50 4f 49   if( p1==SAVEPOI
15370 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20 28  NT_ROLLBACK && (
15380 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
15390 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21  _InternChanges)!
153a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
153b0 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
153c0 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
153d0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  db);.          s
153e0 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
153f0 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d 31  nalSchema(db, -1
15400 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
15410 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c  >flags = (db->fl
15420 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74  ags | SQLITE_Int
15430 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20  ernChanges);.   
15440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15450 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 67 61 72   .      /* Regar
15460 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
15470 20 74 68 69 73 20 69 73 20 61 20 52 45 4c 45 41   this is a RELEA
15480 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2c 20  SE or ROLLBACK, 
15490 64 65 73 74 72 6f 79 20 61 6c 6c 20 0a 20 20 20  destroy all .   
154a0 20 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73     ** savepoints
154b0 20 6e 65 73 74 65 64 20 69 6e 73 69 64 65 20 6f   nested inside o
154c0 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
154d0 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64 20 6f  being operated o
154e0 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  n. */.      whil
154f0 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e  e( db->pSavepoin
15500 74 21 3d 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  t!=pSavepoint ){
15510 0a 20 20 20 20 20 20 20 20 70 54 6d 70 20 3d 20  .        pTmp = 
15520 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a  db->pSavepoint;.
15530 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53 61 76          db->pSav
15540 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70  epoint = pTmp->p
15550 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71  Next;.        sq
15560 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
15570 70 54 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 64  pTmp);.        d
15580 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2d 2d 3b  b->nSavepoint--;
15590 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
155a0 2f 2a 20 49 66 20 69 74 20 69 73 20 61 20 52 45  /* If it is a RE
155b0 4c 45 41 53 45 2c 20 74 68 65 6e 20 64 65 73 74  LEASE, then dest
155c0 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e  roy the savepoin
155d0 74 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64  t being operated
155e0 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f   on .      ** to
155f0 6f 2e 20 49 66 20 69 74 20 69 73 20 61 20 52 4f  o. If it is a RO
15600 4c 4c 42 41 43 4b 20 54 4f 2c 20 74 68 65 6e 20  LLBACK TO, then 
15610 73 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  set the number o
15620 66 20 64 65 66 65 72 72 65 64 20 0a 20 20 20 20  f deferred .    
15630 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
15640 76 69 6f 6c 61 74 69 6f 6e 73 20 70 72 65 73 65  violations prese
15650 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nt in the databa
15660 73 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  se to the value 
15670 73 74 6f 72 65 64 0a 20 20 20 20 20 20 2a 2a 20  stored.      ** 
15680 77 68 65 6e 20 74 68 65 20 73 61 76 65 70 6f 69  when the savepoi
15690 6e 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 20  nt was created. 
156a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 31   */.      if( p1
156b0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
156c0 41 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ASE ){.        a
156d0 73 73 65 72 74 28 20 70 53 61 76 65 70 6f 69 6e  ssert( pSavepoin
156e0 74 3d 3d 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e  t==db->pSavepoin
156f0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  t );.        db-
15700 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 53  >pSavepoint = pS
15710 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 3b  avepoint->pNext;
15720 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15730 44 62 46 72 65 65 28 64 62 2c 20 70 53 61 76 65  DbFree(db, pSave
15740 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
15750 69 66 28 20 21 69 73 54 72 61 6e 73 61 63 74 69  if( !isTransacti
15760 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  on ){.          
15770 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2d 2d  db->nSavepoint--
15780 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15790 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
157a0 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
157b0 6e 73 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ns = pSavepoint-
157c0 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3b 0a  >nDeferredCons;.
157d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
157e0 7d 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  }..  break;.}../
157f0 2a 20 4f 70 63 6f 64 65 3a 20 41 75 74 6f 43 6f  * Opcode: AutoCo
15800 6d 6d 69 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  mmit P1 P2 * * *
15810 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64  .**.** Set the d
15820 61 74 61 62 61 73 65 20 61 75 74 6f 2d 63 6f 6d  atabase auto-com
15830 6d 69 74 20 66 6c 61 67 20 74 6f 20 50 31 20 28  mit flag to P1 (
15840 31 20 6f 72 20 30 29 2e 20 49 66 20 50 32 20 69  1 or 0). If P2 i
15850 73 20 74 72 75 65 2c 20 72 6f 6c 6c 0a 2a 2a 20  s true, roll.** 
15860 62 61 63 6b 20 61 6e 79 20 63 75 72 72 65 6e 74  back any current
15870 6c 79 20 61 63 74 69 76 65 20 62 74 72 65 65 20  ly active btree 
15880 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 49 66  transactions. If
15890 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 61   there are any a
158a0 63 74 69 76 65 0a 2a 2a 20 56 4d 73 20 28 61 70  ctive.** VMs (ap
158b0 61 72 74 20 66 72 6f 6d 20 74 68 69 73 20 6f 6e  art from this on
158c0 65 29 2c 20 74 68 65 6e 20 61 20 52 4f 4c 4c 42  e), then a ROLLB
158d0 41 43 4b 20 66 61 69 6c 73 2e 20 20 41 20 43 4f  ACK fails.  A CO
158e0 4d 4d 49 54 20 66 61 69 6c 73 20 69 66 0a 2a 2a  MMIT fails if.**
158f0 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
15900 65 20 77 72 69 74 69 6e 67 20 56 4d 73 20 6f 72  e writing VMs or
15910 20 61 63 74 69 76 65 20 56 4d 73 20 74 68 61 74   active VMs that
15920 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68   use shared cach
15930 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  e..**.** This in
15940 73 74 72 75 63 74 69 6f 6e 20 63 61 75 73 65 73  struction causes
15950 20 74 68 65 20 56 4d 20 74 6f 20 68 61 6c 74 2e   the VM to halt.
15960 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 75 74 6f  .*/.case OP_Auto
15970 43 6f 6d 6d 69 74 3a 20 7b 0a 20 20 69 6e 74 20  Commit: {.  int 
15980 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69  desiredAutoCommi
15990 74 3b 0a 20 20 69 6e 74 20 69 52 6f 6c 6c 62 61  t;.  int iRollba
159a0 63 6b 3b 0a 20 20 69 6e 74 20 74 75 72 6e 4f 6e  ck;.  int turnOn
159b0 41 43 3b 0a 0a 20 20 64 65 73 69 72 65 64 41 75  AC;..  desiredAu
159c0 74 6f 43 6f 6d 6d 69 74 20 3d 20 70 4f 70 2d 3e  toCommit = pOp->
159d0 70 31 3b 0a 20 20 69 52 6f 6c 6c 62 61 63 6b 20  p1;.  iRollback 
159e0 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 74 75 72  = pOp->p2;.  tur
159f0 6e 4f 6e 41 43 20 3d 20 64 65 73 69 72 65 64 41  nOnAC = desiredA
15a00 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 21 64 62  utoCommit && !db
15a10 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20  ->autoCommit;.  
15a20 61 73 73 65 72 74 28 20 64 65 73 69 72 65 64 41  assert( desiredA
15a30 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20  utoCommit==1 || 
15a40 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69  desiredAutoCommi
15a50 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t==0 );.  assert
15a60 28 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  ( desiredAutoCom
15a70 6d 69 74 3d 3d 31 20 7c 7c 20 69 52 6f 6c 6c 62  mit==1 || iRollb
15a80 61 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ack==0 );.  asse
15a90 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  rt( db->activeVd
15aa0 62 65 43 6e 74 3e 30 20 29 3b 20 20 2f 2a 20 41  beCnt>0 );  /* A
15ab0 74 20 6c 65 61 73 74 20 74 68 69 73 20 6f 6e 65  t least this one
15ac0 20 56 4d 20 69 73 20 61 63 74 69 76 65 20 2a 2f   VM is active */
15ad0 0a 0a 20 20 69 66 28 20 74 75 72 6e 4f 6e 41 43  ..  if( turnOnAC
15ae0 20 26 26 20 69 52 6f 6c 6c 62 61 63 6b 20 26 26   && iRollback &&
15af0 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
15b00 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  nt>1 ){.    /* I
15b10 66 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  f this instructi
15b20 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20  on implements a 
15b30 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 6f 74 68  ROLLBACK and oth
15b40 65 72 20 56 4d 73 20 61 72 65 0a 20 20 20 20 2a  er VMs are.    *
15b50 2a 20 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 2c  * still running,
15b60 20 61 6e 64 20 61 20 74 72 61 6e 73 61 63 74 69   and a transacti
15b70 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 72 65  on is active, re
15b80 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e  turn an error in
15b90 64 69 63 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20  dicating.    ** 
15ba0 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 56  that the other V
15bb0 4d 73 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  Ms must complete
15bc0 20 66 69 72 73 74 2e 20 0a 20 20 20 20 2a 2f 0a   first. .    */.
15bd0 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
15be0 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
15bf0 2c 20 64 62 2c 20 22 63 61 6e 6e 6f 74 20 72 6f  , db, "cannot ro
15c00 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69  llback transacti
15c10 6f 6e 20 2d 20 22 0a 20 20 20 20 20 20 20 20 22  on - ".        "
15c20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69  SQL statements i
15c30 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20  n progress");.  
15c40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
15c50 53 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  SY;.  }else if( 
15c60 74 75 72 6e 4f 6e 41 43 20 26 26 20 21 69 52 6f  turnOnAC && !iRo
15c70 6c 6c 62 61 63 6b 20 26 26 20 64 62 2d 3e 77 72  llback && db->wr
15c80 69 74 65 56 64 62 65 43 6e 74 3e 30 20 29 7b 0a  iteVdbeCnt>0 ){.
15c90 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
15ca0 6e 73 74 72 75 63 74 69 6f 6e 20 69 6d 70 6c 65  nstruction imple
15cb0 6d 65 6e 74 73 20 61 20 43 4f 4d 4d 49 54 20 61  ments a COMMIT a
15cc0 6e 64 20 6f 74 68 65 72 20 56 4d 73 20 61 72 65  nd other VMs are
15cd0 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20   writing.    ** 
15ce0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
15cf0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
15d00 74 68 65 20 6f 74 68 65 72 20 56 4d 73 20 6d 75  the other VMs mu
15d10 73 74 20 63 6f 6d 70 6c 65 74 65 20 66 69 72 73  st complete firs
15d20 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  t. .    */.    s
15d30 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
15d40 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
15d50 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20   "cannot commit 
15d60 74 72 61 6e 73 61 63 74 69 6f 6e 20 2d 20 22 0a  transaction - ".
15d70 20 20 20 20 20 20 20 20 22 53 51 4c 20 73 74 61          "SQL sta
15d80 74 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72  tements in progr
15d90 65 73 73 22 29 3b 0a 20 20 20 20 72 63 20 3d 20  ess");.    rc = 
15da0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
15db0 65 6c 73 65 20 69 66 28 20 64 65 73 69 72 65 64  else if( desired
15dc0 41 75 74 6f 43 6f 6d 6d 69 74 21 3d 64 62 2d 3e  AutoCommit!=db->
15dd0 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
15de0 20 20 69 66 28 20 69 52 6f 6c 6c 62 61 63 6b 20    if( iRollback 
15df0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
15e00 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d   desiredAutoComm
15e10 69 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  it==1 );.      s
15e20 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
15e30 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 2d  l(db);.      db-
15e40 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
15e50 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
15e60 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
15e70 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 29 21 3d  CheckFk(p, 1))!=
15e80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15e90 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74     goto vdbe_ret
15ea0 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  urn;.    }else{.
15eb0 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
15ec0 6d 6d 69 74 20 3d 20 28 75 38 29 64 65 73 69 72  mmit = (u8)desir
15ed0 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20  edAutoCommit;.  
15ee0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
15ef0 64 62 65 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49  dbeHalt(p)==SQLI
15f00 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
15f10 20 20 20 70 2d 3e 70 63 20 3d 20 70 63 3b 0a 20     p->pc = pc;. 
15f20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
15f30 6f 6d 6d 69 74 20 3d 20 28 75 38 29 28 31 2d 64  ommit = (u8)(1-d
15f40 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
15f50 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  );.        p->rc
15f60 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42   = rc = SQLITE_B
15f70 55 53 59 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  USY;.        got
15f80 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20  o vdbe_return;. 
15f90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15fa0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74   assert( db->nSt
15fb0 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  atement==0 );.  
15fc0 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
15fd0 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
15fe0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
15ff0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16000 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
16010 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16020 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
16030 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
16040 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e  goto vdbe_return
16050 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
16060 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
16070 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
16080 0a 20 20 20 20 20 20 20 20 28 21 64 65 73 69 72  .        (!desir
16090 65 64 41 75 74 6f 43 6f 6d 6d 69 74 29 3f 22 63  edAutoCommit)?"c
160a0 61 6e 6e 6f 74 20 73 74 61 72 74 20 61 20 74 72  annot start a tr
160b0 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 69 6e  ansaction within
160c0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 3a   a transaction":
160d0 28 0a 20 20 20 20 20 20 20 20 28 69 52 6f 6c 6c  (.        (iRoll
160e0 62 61 63 6b 29 3f 22 63 61 6e 6e 6f 74 20 72 6f  back)?"cannot ro
160f0 6c 6c 62 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e  llback - no tran
16100 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
16110 65 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  e":.            
16120 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63         "cannot c
16130 6f 6d 6d 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73  ommit - no trans
16140 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
16150 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 0a 20  "));.         . 
16160 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
16170 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 62 72 65 61  RROR;.  }.  brea
16180 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
16190 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 50 31 20   Transaction P1 
161a0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 42  P2 * * *.**.** B
161b0 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
161c0 6f 6e 2e 20 20 54 68 65 20 74 72 61 6e 73 61 63  on.  The transac
161d0 74 69 6f 6e 20 65 6e 64 73 20 77 68 65 6e 20 61  tion ends when a
161e0 20 43 6f 6d 6d 69 74 20 6f 72 20 52 6f 6c 6c 62   Commit or Rollb
161f0 61 63 6b 0a 2a 2a 20 6f 70 63 6f 64 65 20 69 73  ack.** opcode is
16200 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 20 44   encountered.  D
16210 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
16220 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 73 65 74 74  ON CONFLICT sett
16230 69 6e 67 2c 20 74 68 65 0a 2a 2a 20 74 72 61 6e  ing, the.** tran
16240 73 61 63 74 69 6f 6e 20 6d 69 67 68 74 20 61 6c  saction might al
16250 73 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  so be rolled bac
16260 6b 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  k if an error is
16270 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
16280 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69 6e  .** P1 is the in
16290 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
162a0 61 73 65 20 66 69 6c 65 20 6f 6e 20 77 68 69 63  ase file on whic
162b0 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  h the transactio
162c0 6e 20 69 73 0a 2a 2a 20 73 74 61 72 74 65 64 2e  n is.** started.
162d0 20 20 49 6e 64 65 78 20 30 20 69 73 20 74 68 65    Index 0 is the
162e0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
162f0 69 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 31 20  ile and index 1 
16300 69 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 75  is the.** file u
16310 73 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  sed for temporar
16320 79 20 74 61 62 6c 65 73 2e 20 20 49 6e 64 69 63  y tables.  Indic
16330 65 73 20 6f 66 20 32 20 6f 72 20 6d 6f 72 65 20  es of 2 or more 
16340 61 72 65 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  are used for.** 
16350 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
16360 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32 20  es..**.** If P2 
16370 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
16380 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
16390 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
163a0 2e 20 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f  .  A RESERVED lo
163b0 63 6b 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65  ck is.** obtaine
163c0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
163d0 65 20 66 69 6c 65 20 77 68 65 6e 20 61 20 77 72  e file when a wr
163e0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
163f0 69 73 20 73 74 61 72 74 65 64 2e 20 20 4e 6f 0a  is started.  No.
16400 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ** other process
16410 20 63 61 6e 20 73 74 61 72 74 20 61 6e 6f 74 68   can start anoth
16420 65 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  er write transac
16430 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 69 73 20  tion while this 
16440 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a  transaction is.*
16450 2a 20 75 6e 64 65 72 77 61 79 2e 20 20 53 74 61  * underway.  Sta
16460 72 74 69 6e 67 20 61 20 77 72 69 74 65 20 74 72  rting a write tr
16470 61 6e 73 61 63 74 69 6f 6e 20 61 6c 73 6f 20 63  ansaction also c
16480 72 65 61 74 65 73 20 61 20 72 6f 6c 6c 62 61 63  reates a rollbac
16490 6b 20 6a 6f 75 72 6e 61 6c 2e 20 41 0a 2a 2a 20  k journal. A.** 
164a0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
164b0 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65  n must be starte
164c0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
164d0 6e 67 65 73 20 63 61 6e 20 62 65 20 6d 61 64 65  nges can be made
164e0 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
164f0 61 73 65 2e 20 20 49 66 20 50 32 20 69 73 20 32  ase.  If P2 is 2
16500 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 65 6e   or greater then
16510 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
16520 63 6b 20 69 73 20 61 6c 73 6f 20 6f 62 74 61 69  ck is also obtai
16530 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 66 69  ned.** on the fi
16540 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 77  le..**.** If a w
16550 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
16560 20 69 73 20 73 74 61 72 74 65 64 20 61 6e 64 20   is started and 
16570 74 68 65 20 56 64 62 65 2e 75 73 65 73 53 74 6d  the Vdbe.usesStm
16580 74 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73  tJournal flag is
16590 0a 2a 2a 20 74 72 75 65 20 28 74 68 69 73 20 66  .** true (this f
165a0 6c 61 67 20 69 73 20 73 65 74 20 69 66 20 74 68  lag is set if th
165b0 65 20 56 64 62 65 20 6d 61 79 20 6d 6f 64 69 66  e Vdbe may modif
165c0 79 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  y more than one 
165d0 72 6f 77 20 61 6e 64 20 6d 61 79 0a 2a 2a 20 74  row and may.** t
165e0 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78  hrow an ABORT ex
165f0 63 65 70 74 69 6f 6e 29 2c 20 61 20 73 74 61 74  ception), a stat
16600 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
16610 6e 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 6f 70  n may also be op
16620 65 6e 65 64 2e 0a 2a 2a 20 4d 6f 72 65 20 73 70  ened..** More sp
16630 65 63 69 66 69 63 61 6c 6c 79 2c 20 61 20 73 74  ecifically, a st
16640 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
16650 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 69 66  ion is opened if
16660 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
16670 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  * connection is 
16680 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 69 6e  currently not in
16690 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   autocommit mode
166a0 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 61 72  , or if there ar
166b0 65 20 6f 74 68 65 72 0a 2a 2a 20 61 63 74 69 76  e other.** activ
166c0 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 41 20  e statements. A 
166d0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
166e0 63 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 74 68 65  ction allows the
166f0 20 61 66 66 65 63 74 73 20 6f 66 20 74 68 69 73   affects of this
16700 0a 2a 2a 20 56 44 42 45 20 74 6f 20 62 65 20 72  .** VDBE to be r
16710 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72  olled back after
16720 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 6f 75   an error withou
16730 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
16740 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 65 6e 74   back the.** ent
16750 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ire transaction.
16760 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 69 73 20   If no error is 
16770 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
16780 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
16790 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 61  action.** will a
167a0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6d  utomatically com
167b0 6d 69 74 20 77 68 65 6e 20 74 68 65 20 56 44 42  mit when the VDB
167c0 45 20 68 61 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49  E halts..**.** I
167d0 66 20 50 32 20 69 73 20 7a 65 72 6f 2c 20 74 68  f P2 is zero, th
167e0 65 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  en a read-lock i
167f0 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  s obtained on th
16800 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
16810 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 72 61 6e  .*/.case OP_Tran
16820 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 42 74 72  saction: {.  Btr
16830 65 65 20 2a 70 42 74 3b 0a 0a 20 20 61 73 73 65  ee *pBt;..  asse
16840 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
16850 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44  & pOp->p1<db->nD
16860 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  b );.  assert( (
16870 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28  p->btreeMask & (
16880 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f  ((yDbMask)1)<<pO
16890 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a 20 20  p->p1))!=0 );.  
168a0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f  pBt = db->aDb[pO
168b0 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 0a 20 20 69  p->p1].pBt;..  i
168c0 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 72 63  f( pBt ){.    rc
168d0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
168e0 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 70  eginTrans(pBt, p
168f0 4f 70 2d 3e 70 32 29 3b 0a 20 20 20 20 69 66 28  Op->p2);.    if(
16900 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
16910 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 63 20   ){.      p->pc 
16920 3d 20 70 63 3b 0a 20 20 20 20 20 20 70 2d 3e 72  = pc;.      p->r
16930 63 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  c = rc = SQLITE_
16940 42 55 53 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BUSY;.      goto
16950 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20   vdbe_return;.  
16960 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
16970 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16980 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
16990 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
169a0 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  }..    if( pOp->
169b0 70 32 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d  p2 && p->usesStm
169c0 74 4a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 20 26  tJournal .     &
169d0 26 20 28 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  & (db->autoCommi
169e0 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 63 74 69  t==0 || db->acti
169f0 76 65 56 64 62 65 43 6e 74 3e 31 29 20 0a 20 20  veVdbeCnt>1) .  
16a00 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
16a10 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  t( sqlite3BtreeI
16a20 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 3b  sInTrans(pBt) );
16a30 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 53  .      if( p->iS
16a40 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 7b 0a 20  tatement==0 ){. 
16a50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
16a60 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 3d 30  b->nStatement>=0
16a70 20 26 26 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69   && db->nSavepoi
16a80 6e 74 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nt>=0 );.       
16a90 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b   db->nStatement+
16aa0 2b 3b 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 69  +; .        p->i
16ab0 53 74 61 74 65 6d 65 6e 74 20 3d 20 64 62 2d 3e  Statement = db->
16ac0 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20 64 62 2d  nSavepoint + db-
16ad0 3e 6e 53 74 61 74 65 6d 65 6e 74 3b 0a 20 20 20  >nStatement;.   
16ae0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
16af0 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
16b00 6e 53 74 6d 74 28 70 42 74 2c 20 70 2d 3e 69 53  nStmt(pBt, p->iS
16b10 74 61 74 65 6d 65 6e 74 29 3b 0a 0a 20 20 20 20  tatement);..    
16b20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 63    /* Store the c
16b30 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
16b40 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
16b50 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f  dles deferred co
16b60 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20 2a  nstraint.      *
16b70 2a 20 63 6f 75 6e 74 65 72 2e 20 49 66 20 74 68  * counter. If th
16b80 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
16b90 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
16ba0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   be rolled back,
16bb0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61  .      ** the va
16bc0 6c 75 65 20 6f 66 20 74 68 69 73 20 63 6f 75 6e  lue of this coun
16bd0 74 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ter needs to be 
16be0 72 65 73 74 6f 72 65 64 20 74 6f 6f 2e 20 20 2a  restored too.  *
16bf0 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74 6d 74  /.      p->nStmt
16c00 44 65 66 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44  DefCons = db->nD
16c10 65 66 65 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20  eferredCons;.   
16c20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
16c30 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  }../* Opcode: Re
16c40 61 64 43 6f 6f 6b 69 65 20 50 31 20 50 32 20 50  adCookie P1 P2 P
16c50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64  3 * *.**.** Read
16c60 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20 50   cookie number P
16c70 33 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20  3 from database 
16c80 50 31 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  P1 and write it 
16c90 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  into register P2
16ca0 2e 0a 2a 2a 20 50 33 3d 3d 31 20 69 73 20 74 68  ..** P3==1 is th
16cb0 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e  e schema version
16cc0 2e 20 20 50 33 3d 3d 32 20 69 73 20 74 68 65 20  .  P3==2 is the 
16cd0 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 2e  database format.
16ce0 0a 2a 2a 20 50 33 3d 3d 33 20 69 73 20 74 68 65  .** P3==3 is the
16cf0 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61 67   recommended pag
16d00 65 72 20 63 61 63 68 65 20 73 69 7a 65 2c 20 61  er cache size, a
16d10 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 50 31  nd so forth.  P1
16d20 3d 3d 30 20 69 73 0a 2a 2a 20 74 68 65 20 6d 61  ==0 is.** the ma
16d30 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
16d40 20 61 6e 64 20 50 31 3d 3d 31 20 69 73 20 74 68   and P1==1 is th
16d50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
16d60 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
16d70 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
16d80 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  s..**.** There m
16d90 75 73 74 20 62 65 20 61 20 72 65 61 64 2d 6c 6f  ust be a read-lo
16da0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
16db0 73 65 20 28 65 69 74 68 65 72 20 61 20 74 72 61  se (either a tra
16dc0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  nsaction.** must
16dd0 20 62 65 20 73 74 61 72 74 65 64 20 6f 72 20 74   be started or t
16de0 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
16df0 6f 70 65 6e 20 63 75 72 73 6f 72 29 20 62 65 66  open cursor) bef
16e00 6f 72 65 0a 2a 2a 20 65 78 65 63 75 74 69 6e 67  ore.** executing
16e10 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
16e20 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65  n..*/.case OP_Re
16e30 61 64 43 6f 6f 6b 69 65 3a 20 7b 20 20 20 20 20  adCookie: {     
16e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
16e50 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a  2-prerelease */.
16e60 20 20 69 6e 74 20 69 4d 65 74 61 3b 0a 20 20 69    int iMeta;.  i
16e70 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 43  nt iDb;.  int iC
16e80 6f 6f 6b 69 65 3b 0a 0a 20 20 69 44 62 20 3d 20  ookie;..  iDb = 
16e90 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 43 6f 6f 6b  pOp->p1;.  iCook
16ea0 69 65 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  ie = pOp->p3;.  
16eb0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c  assert( pOp->p3<
16ec0 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d  SQLITE_N_BTREE_M
16ed0 45 54 41 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ETA );.  assert(
16ee0 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
16ef0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
16f00 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  rt( db->aDb[iDb]
16f10 2e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  .pBt!=0 );.  ass
16f20 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61  ert( (p->btreeMa
16f30 73 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29  sk & (((yDbMask)
16f40 31 29 3c 3c 69 44 62 29 29 21 3d 30 20 29 3b 0a  1)<<iDb))!=0 );.
16f50 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  .  sqlite3BtreeG
16f60 65 74 4d 65 74 61 28 64 62 2d 3e 61 44 62 5b 69  etMeta(db->aDb[i
16f70 44 62 5d 2e 70 42 74 2c 20 69 43 6f 6f 6b 69 65  Db].pBt, iCookie
16f80 2c 20 28 75 33 32 20 2a 29 26 69 4d 65 74 61 29  , (u32 *)&iMeta)
16f90 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  ;.  pOut->u.i = 
16fa0 69 4d 65 74 61 3b 0a 20 20 62 72 65 61 6b 3b 0a  iMeta;.  break;.
16fb0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65  }../* Opcode: Se
16fc0 74 43 6f 6f 6b 69 65 20 50 31 20 50 32 20 50 33  tCookie P1 P2 P3
16fd0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65   * *.**.** Write
16fe0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
16ff0 72 65 67 69 73 74 65 72 20 50 33 20 28 69 6e 74  register P3 (int
17000 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 69  erpreted as an i
17010 6e 74 65 67 65 72 29 0a 2a 2a 20 69 6e 74 6f 20  nteger).** into 
17020 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20 50 32  cookie number P2
17030 20 6f 66 20 64 61 74 61 62 61 73 65 20 50 31 2e   of database P1.
17040 20 20 50 32 3d 3d 31 20 69 73 20 74 68 65 20 73    P2==1 is the s
17050 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 2e 20 20  chema version.  
17060 0a 2a 2a 20 50 32 3d 3d 32 20 69 73 20 74 68 65  .** P2==2 is the
17070 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74   database format
17080 2e 20 50 32 3d 3d 33 20 69 73 20 74 68 65 20 72  . P2==3 is the r
17090 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61 67 65 72  ecommended pager
170a0 20 63 61 63 68 65 20 0a 2a 2a 20 73 69 7a 65 2c   cache .** size,
170b0 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   and so forth.  
170c0 50 31 3d 3d 30 20 69 73 20 74 68 65 20 6d 61 69  P1==0 is the mai
170d0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
170e0 61 6e 64 20 50 31 3d 3d 31 20 69 73 20 74 68 65  and P1==1 is the
170f0 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
17100 6c 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  le used to store
17110 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
17120 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73  s..**.** A trans
17130 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
17140 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 65 78  tarted before ex
17150 65 63 75 74 69 6e 67 20 74 68 69 73 20 6f 70 63  ecuting this opc
17160 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ode..*/.case OP_
17170 53 65 74 43 6f 6f 6b 69 65 3a 20 7b 20 20 20 20  SetCookie: {    
17180 20 20 20 2f 2a 20 69 6e 33 20 2a 2f 0a 20 20 44     /* in3 */.  D
17190 62 20 2a 70 44 62 3b 0a 20 20 61 73 73 65 72 74  b *pDb;.  assert
171a0 28 20 70 4f 70 2d 3e 70 32 3c 53 51 4c 49 54 45  ( pOp->p2<SQLITE
171b0 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20 29 3b  _N_BTREE_META );
171c0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
171d0 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
171e0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
171f0 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d  sert( (p->btreeM
17200 61 73 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b  ask & (((yDbMask
17210 29 31 29 3c 3c 70 4f 70 2d 3e 70 31 29 29 21 3d  )1)<<pOp->p1))!=
17220 30 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62  0 );.  pDb = &db
17230 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  ->aDb[pOp->p1];.
17240 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
17250 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
17260 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
17270 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 70 4f  MutexHeld(db, pO
17280 70 2d 3e 70 31 2c 20 30 29 20 29 3b 0a 20 20 70  p->p1, 0) );.  p
17290 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In3 = &aMem[pOp-
172a0 3e 70 33 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56  >p3];.  sqlite3V
172b0 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79  dbeMemIntegerify
172c0 28 70 49 6e 33 29 3b 0a 20 20 2f 2a 20 53 65 65  (pIn3);.  /* See
172d0 20 6e 6f 74 65 20 61 62 6f 75 74 20 69 6e 64 65   note about inde
172e0 78 20 73 68 69 66 74 69 6e 67 20 6f 6e 20 4f 50  x shifting on OP
172f0 5f 52 65 61 64 43 6f 6f 6b 69 65 20 2a 2f 0a 20  _ReadCookie */. 
17300 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
17310 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 44 62  eeUpdateMeta(pDb
17320 2d 3e 70 42 74 2c 20 70 4f 70 2d 3e 70 32 2c 20  ->pBt, pOp->p2, 
17330 28 69 6e 74 29 70 49 6e 33 2d 3e 75 2e 69 29 3b  (int)pIn3->u.i);
17340 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d  .  if( pOp->p2==
17350 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52  BTREE_SCHEMA_VER
17360 53 49 4f 4e 20 29 7b 0a 20 20 20 20 2f 2a 20 57  SION ){.    /* W
17370 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63  hen the schema c
17380 6f 6f 6b 69 65 20 63 68 61 6e 67 65 73 2c 20 72  ookie changes, r
17390 65 63 6f 72 64 20 74 68 65 20 6e 65 77 20 63 6f  ecord the new co
173a0 6f 6b 69 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20  okie internally 
173b0 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 70 53 63 68  */.    pDb->pSch
173c0 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
173d0 69 65 20 3d 20 28 69 6e 74 29 70 49 6e 33 2d 3e  ie = (int)pIn3->
173e0 75 2e 69 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  u.i;.    db->fla
173f0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
17400 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 65  ernChanges;.  }e
17410 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d  lse if( pOp->p2=
17420 3d 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d  =BTREE_FILE_FORM
17430 41 54 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63  AT ){.    /* Rec
17440 6f 72 64 20 63 68 61 6e 67 65 73 20 69 6e 20 74  ord changes in t
17450 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 2a  he file format *
17460 2f 0a 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65  /.    pDb->pSche
17470 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20  ma->file_format 
17480 3d 20 28 75 38 29 70 49 6e 33 2d 3e 75 2e 69 3b  = (u8)pIn3->u.i;
17490 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e  .  }.  if( pOp->
174a0 70 31 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20  p1==1 ){.    /* 
174b0 49 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  Invalidate all p
174c0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
174d0 74 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ts whenever the 
174e0 54 45 4d 50 20 64 61 74 61 62 61 73 65 0a 20 20  TEMP database.  
174f0 20 20 2a 2a 20 73 63 68 65 6d 61 20 69 73 20 63    ** schema is c
17500 68 61 6e 67 65 64 2e 20 20 54 69 63 6b 65 74 20  hanged.  Ticket 
17510 23 31 36 34 34 20 2a 2f 0a 20 20 20 20 73 71 6c  #1644 */.    sql
17520 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
17530 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
17540 3b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  ;.    p->expired
17550 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 62 72 65 61   = 0;.  }.  brea
17560 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
17570 20 56 65 72 69 66 79 43 6f 6f 6b 69 65 20 50 31   VerifyCookie P1
17580 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
17590 20 43 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65   Check the value
175a0 20 6f 66 20 67 6c 6f 62 61 6c 20 64 61 74 61 62   of global datab
175b0 61 73 65 20 70 61 72 61 6d 65 74 65 72 20 6e 75  ase parameter nu
175c0 6d 62 65 72 20 30 20 28 74 68 65 0a 2a 2a 20 73  mber 0 (the.** s
175d0 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 29 20 61  chema version) a
175e0 6e 64 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20  nd make sure it 
175f0 69 73 20 65 71 75 61 6c 20 74 6f 20 50 32 20 61  is equal to P2 a
17600 6e 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 67  nd that the.** g
17610 65 6e 65 72 61 74 69 6f 6e 20 63 6f 75 6e 74 65  eneration counte
17620 72 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 73  r on the local s
17630 63 68 65 6d 61 20 70 61 72 73 65 20 65 71 75 61  chema parse equa
17640 6c 73 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 50 31 20  ls P3..**.** P1 
17650 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
17660 6e 75 6d 62 65 72 20 77 68 69 63 68 20 69 73 20  number which is 
17670 30 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  0 for the main d
17680 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
17690 61 6e 64 20 31 20 66 6f 72 20 74 68 65 20 66 69  and 1 for the fi
176a0 6c 65 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f  le holding tempo
176b0 72 61 72 79 20 74 61 62 6c 65 73 20 61 6e 64 20  rary tables and 
176c0 73 6f 6d 65 20 68 69 67 68 65 72 20 6e 75 6d 62  some higher numb
176d0 65 72 0a 2a 2a 20 66 6f 72 20 61 75 78 69 6c 69  er.** for auxili
176e0 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ary databases..*
176f0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20  *.** The cookie 
17700 63 68 61 6e 67 65 73 20 69 74 73 20 76 61 6c 75  changes its valu
17710 65 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 64  e whenever the d
17720 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 63  atabase schema c
17730 68 61 6e 67 65 73 2e 0a 2a 2a 20 54 68 69 73 20  hanges..** This 
17740 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 75 73 65  operation is use
17750 64 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e  d to detect when
17760 20 74 68 61 74 20 74 68 65 20 63 6f 6f 6b 69 65   that the cookie
17770 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20   has changed.** 
17780 61 6e 64 20 74 68 61 74 20 74 68 65 20 63 75 72  and that the cur
17790 72 65 6e 74 20 70 72 6f 63 65 73 73 20 6e 65 65  rent process nee
177a0 64 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65  ds to reread the
177b0 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 45   schema..**.** E
177c0 69 74 68 65 72 20 61 20 74 72 61 6e 73 61 63 74  ither a transact
177d0 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 68 61 76  ion needs to hav
177e0 65 20 62 65 65 6e 20 73 74 61 72 74 65 64 20 6f  e been started o
177f0 72 20 61 6e 20 4f 50 5f 4f 70 65 6e 20 6e 65 65  r an OP_Open nee
17800 64 73 0a 2a 2a 20 74 6f 20 62 65 20 65 78 65 63  ds.** to be exec
17810 75 74 65 64 20 28 74 6f 20 65 73 74 61 62 6c 69  uted (to establi
17820 73 68 20 61 20 72 65 61 64 20 6c 6f 63 6b 29 20  sh a read lock) 
17830 62 65 66 6f 72 65 20 74 68 69 73 20 6f 70 63 6f  before this opco
17840 64 65 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64  de is.** invoked
17850 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 65 72  ..*/.case OP_Ver
17860 69 66 79 43 6f 6f 6b 69 65 3a 20 7b 0a 20 20 69  ifyCookie: {.  i
17870 6e 74 20 69 4d 65 74 61 3b 0a 20 20 69 6e 74 20  nt iMeta;.  int 
17880 69 47 65 6e 3b 0a 20 20 42 74 72 65 65 20 2a 70  iGen;.  Btree *p
17890 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Bt;..  assert( p
178a0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
178b0 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  ->p1<db->nDb );.
178c0 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74    assert( (p->bt
178d0 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44 62  reeMask & (((yDb
178e0 4d 61 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e 70 31  Mask)1)<<pOp->p1
178f0 29 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))!=0 );.  asser
17900 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
17910 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 70 4f  MutexHeld(db, pO
17920 70 2d 3e 70 31 2c 20 30 29 20 29 3b 0a 20 20 70  p->p1, 0) );.  p
17930 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70  Bt = db->aDb[pOp
17940 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 69 66 28  ->p1].pBt;.  if(
17950 20 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69   pBt ){.    sqli
17960 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
17970 70 42 74 2c 20 42 54 52 45 45 5f 53 43 48 45 4d  pBt, BTREE_SCHEM
17980 41 5f 56 45 52 53 49 4f 4e 2c 20 28 75 33 32 20  A_VERSION, (u32 
17990 2a 29 26 69 4d 65 74 61 29 3b 0a 20 20 20 20 69  *)&iMeta);.    i
179a0 47 65 6e 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f  Gen = db->aDb[pO
179b0 70 2d 3e 70 31 5d 2e 70 53 63 68 65 6d 61 2d 3e  p->p1].pSchema->
179c0 69 47 65 6e 65 72 61 74 69 6f 6e 3b 0a 20 20 7d  iGeneration;.  }
179d0 65 6c 73 65 7b 0a 20 20 20 20 69 47 65 6e 20 3d  else{.    iGen =
179e0 20 69 4d 65 74 61 20 3d 20 30 3b 0a 20 20 7d 0a   iMeta = 0;.  }.
179f0 20 20 69 66 28 20 69 4d 65 74 61 21 3d 70 4f 70    if( iMeta!=pOp
17a00 2d 3e 70 32 20 7c 7c 20 69 47 65 6e 21 3d 70 4f  ->p2 || iGen!=pO
17a10 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20 73 71 6c  p->p3 ){.    sql
17a20 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
17a30 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
17a40 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  p->zErrMsg = sql
17a50 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
17a60 20 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d   "database schem
17a70 61 20 68 61 73 20 63 68 61 6e 67 65 64 22 29 3b  a has changed");
17a80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
17a90 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 66 72 6f  chema-cookie fro
17aa0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
17ab0 69 6c 65 20 6d 61 74 63 68 65 73 20 74 68 65 20  ile matches the 
17ac0 63 6f 6f 6b 69 65 20 0a 20 20 20 20 2a 2a 20 73  cookie .    ** s
17ad0 74 6f 72 65 64 20 77 69 74 68 20 74 68 65 20 69  tored with the i
17ae0 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
17af0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
17b00 63 68 65 6d 61 2c 20 64 6f 0a 20 20 20 20 2a 2a  chema, do.    **
17b10 20 6e 6f 74 20 72 65 6c 6f 61 64 20 74 68 65 20   not reload the 
17b20 73 63 68 65 6d 61 20 66 72 6f 6d 20 74 68 65 20  schema from the 
17b30 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
17b40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
17b50 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 73 20 61  virtual-tables a
17b60 72 65 20 69 6e 20 75 73 65 2c 20 74 68 69 73 20  re in use, this 
17b70 69 73 20 6e 6f 74 20 6a 75 73 74 20 61 6e 20 6f  is not just an o
17b80 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20  ptimization..   
17b90 20 2a 2a 20 4f 66 74 65 6e 2c 20 76 2d 74 61 62   ** Often, v-tab
17ba0 6c 65 73 20 73 74 6f 72 65 20 74 68 65 69 72 20  les store their 
17bb0 64 61 74 61 20 69 6e 20 6f 74 68 65 72 20 53 51  data in other SQ
17bc0 4c 69 74 65 20 74 61 62 6c 65 73 2c 20 77 68 69  Lite tables, whi
17bd0 63 68 0a 20 20 20 20 2a 2a 20 61 72 65 20 71 75  ch.    ** are qu
17be0 65 72 69 65 64 20 66 72 6f 6d 20 77 69 74 68 69  eried from withi
17bf0 6e 20 78 4e 65 78 74 28 29 20 61 6e 64 20 6f 74  n xNext() and ot
17c00 68 65 72 20 76 2d 74 61 62 6c 65 20 6d 65 74 68  her v-table meth
17c10 6f 64 73 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a  ods using.    **
17c20 20 70 72 65 70 61 72 65 64 20 71 75 65 72 69 65   prepared querie
17c30 73 2e 20 49 66 20 73 75 63 68 20 61 20 71 75 65  s. If such a que
17c40 72 79 20 69 73 20 6f 75 74 2d 6f 66 2d 64 61 74  ry is out-of-dat
17c50 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e  e, we do not wan
17c60 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 63  t to.    ** disc
17c70 61 72 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ard the database
17c80 20 73 63 68 65 6d 61 2c 20 61 73 20 74 68 65 20   schema, as the 
17c90 75 73 65 72 20 63 6f 64 65 20 69 6d 70 6c 65 6d  user code implem
17ca0 65 6e 74 69 6e 67 20 74 68 65 0a 20 20 20 20 2a  enting the.    *
17cb0 2a 20 76 2d 74 61 62 6c 65 20 77 6f 75 6c 64 20  * v-table would 
17cc0 68 61 76 65 20 74 6f 20 62 65 20 72 65 61 64 79  have to be ready
17cd0 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
17ce0 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65 20  _vtab structure 
17cf0 69 74 73 65 6c 66 0a 20 20 20 20 2a 2a 20 74 6f  itself.    ** to
17d00 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
17d10 77 68 65 6e 65 76 65 72 20 73 71 6c 69 74 65 33  whenever sqlite3
17d20 5f 73 74 65 70 28 29 20 69 73 20 63 61 6c 6c 65  _step() is calle
17d30 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 0a 20  d from within . 
17d40 20 20 20 2a 2a 20 61 20 76 2d 74 61 62 6c 65 20     ** a v-table 
17d50 6d 65 74 68 6f 64 2e 0a 20 20 20 20 2a 2f 0a 20  method..    */. 
17d60 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 70     if( db->aDb[p
17d70 4f 70 2d 3e 70 31 5d 2e 70 53 63 68 65 6d 61 2d  Op->p1].pSchema-
17d80 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 21 3d  >schema_cookie!=
17d90 69 4d 65 74 61 20 29 7b 0a 20 20 20 20 20 20 73  iMeta ){.      s
17da0 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
17db0 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 70 4f  nalSchema(db, pO
17dc0 70 2d 3e 70 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  p->p1);.    }.. 
17dd0 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
17de0 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  1;.    rc = SQLI
17df0 54 45 5f 53 43 48 45 4d 41 3b 0a 20 20 7d 0a 20  TE_SCHEMA;.  }. 
17e00 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
17e10 63 6f 64 65 3a 20 4f 70 65 6e 52 65 61 64 20 50  code: OpenRead P
17e20 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
17e30 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d  .** Open a read-
17e40 6f 6e 6c 79 20 63 75 72 73 6f 72 20 66 6f 72 20  only cursor for 
17e50 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62  the database tab
17e60 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61  le whose root pa
17e70 67 65 20 69 73 0a 2a 2a 20 50 32 20 69 6e 20 61  ge is.** P2 in a
17e80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
17e90 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
17ea0 6c 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  le is determined
17eb0 20 62 79 20 50 33 2e 20 0a 2a 2a 20 50 33 3d 3d   by P3. .** P3==
17ec0 30 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  0 means the main
17ed0 20 64 61 74 61 62 61 73 65 2c 20 50 33 3d 3d 31   database, P3==1
17ee0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
17ef0 61 73 65 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a  ase used for .**
17f00 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
17f10 73 2c 20 61 6e 64 20 50 33 3e 31 20 6d 65 61 6e  s, and P3>1 mean
17f20 73 20 75 73 65 64 20 74 68 65 20 63 6f 72 72 65  s used the corre
17f30 73 70 6f 6e 64 69 6e 67 20 61 74 74 61 63 68 65  sponding attache
17f40 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20  d.** database.  
17f50 47 69 76 65 20 74 68 65 20 6e 65 77 20 63 75 72  Give the new cur
17f60 73 6f 72 20 61 6e 20 69 64 65 6e 74 69 66 69 65  sor an identifie
17f70 72 20 6f 66 20 50 31 2e 20 20 54 68 65 20 50 31  r of P1.  The P1
17f80 0a 2a 2a 20 76 61 6c 75 65 73 20 6e 65 65 64 20  .** values need 
17f90 6e 6f 74 20 62 65 20 63 6f 6e 74 69 67 75 6f 75  not be contiguou
17fa0 73 20 62 75 74 20 61 6c 6c 20 50 31 20 76 61 6c  s but all P1 val
17fb0 75 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 6d  ues should be sm
17fc0 61 6c 6c 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a  all integers..**
17fd0 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
17fe0 66 6f 72 20 50 31 20 74 6f 20 62 65 20 6e 65 67  for P1 to be neg
17ff0 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ative..**.** If 
18000 50 35 21 3d 30 20 74 68 65 6e 20 75 73 65 20 74  P5!=0 then use t
18010 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65  he content of re
18020 67 69 73 74 65 72 20 50 32 20 61 73 20 74 68 65  gister P2 as the
18030 20 72 6f 6f 74 20 70 61 67 65 2c 20 6e 6f 74 0a   root page, not.
18040 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
18050 50 32 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a  P2 itself..**.**
18060 20 54 68 65 72 65 20 77 69 6c 6c 20 62 65 20 61   There will be a
18070 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
18080 65 20 64 61 74 61 62 61 73 65 20 77 68 65 6e 65  e database whene
18090 76 65 72 20 74 68 65 72 65 20 69 73 20 61 6e 0a  ver there is an.
180a0 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 2e 20  ** open cursor. 
180b0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
180c0 20 77 61 73 20 75 6e 6c 6f 63 6b 65 64 20 70 72   was unlocked pr
180d0 69 6f 72 20 74 6f 20 74 68 69 73 20 69 6e 73 74  ior to this inst
180e0 72 75 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20  ruction.** then 
180f0 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 61  a read lock is a
18100 63 71 75 69 72 65 64 20 61 73 20 70 61 72 74 20  cquired as part 
18110 6f 66 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  of this instruct
18120 69 6f 6e 2e 20 20 41 20 72 65 61 64 0a 2a 2a 20  ion.  A read.** 
18130 6c 6f 63 6b 20 61 6c 6c 6f 77 73 20 6f 74 68 65  lock allows othe
18140 72 20 70 72 6f 63 65 73 73 65 73 20 74 6f 20 72  r processes to r
18150 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
18160 20 62 75 74 20 70 72 6f 68 69 62 69 74 73 0a 2a   but prohibits.*
18170 2a 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  * any other proc
18180 65 73 73 20 66 72 6f 6d 20 6d 6f 64 69 66 79 69  ess from modifyi
18190 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
181a0 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
181b0 69 73 0a 2a 2a 20 72 65 6c 65 61 73 65 64 20 77  is.** released w
181c0 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  hen all cursors 
181d0 61 72 65 20 63 6c 6f 73 65 64 2e 20 20 49 66 20  are closed.  If 
181e0 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
181f0 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
18200 67 65 74 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  get a read lock 
18210 62 75 74 20 66 61 69 6c 73 2c 20 74 68 65 20 73  but fails, the s
18220 63 72 69 70 74 20 74 65 72 6d 69 6e 61 74 65 73  cript terminates
18230 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49   with an.** SQLI
18240 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 63 6f  TE_BUSY error co
18250 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34  de..**.** The P4
18260 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 65 69   value may be ei
18270 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20  ther an integer 
18280 28 50 34 5f 49 4e 54 33 32 29 20 6f 72 20 61 20  (P4_INT32) or a 
18290 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20  pointer to.** a 
182a0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
182b0 65 20 28 50 34 5f 4b 45 59 49 4e 46 4f 29 2e 20  e (P4_KEYINFO). 
182c0 49 66 20 69 74 20 69 73 20 61 20 70 6f 69 6e 74  If it is a point
182d0 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
182e0 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74  .** structure, t
182f0 68 65 6e 20 73 61 69 64 20 73 74 72 75 63 74 75  hen said structu
18300 72 65 20 64 65 66 69 6e 65 73 20 74 68 65 20 63  re defines the c
18310 6f 6e 74 65 6e 74 20 61 6e 64 20 63 6f 6c 6c 61  ontent and colla
18320 74 69 6e 67 20 0a 2a 2a 20 73 65 71 75 65 6e 63  ting .** sequenc
18330 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 62  e of the index b
18340 65 69 6e 67 20 6f 70 65 6e 65 64 2e 20 4f 74 68  eing opened. Oth
18350 65 72 77 69 73 65 2c 20 69 66 20 50 34 20 69 73  erwise, if P4 is
18360 20 61 6e 20 69 6e 74 65 67 65 72 20 0a 2a 2a 20   an integer .** 
18370 76 61 6c 75 65 2c 20 69 74 20 69 73 20 73 65 74  value, it is set
18380 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
18390 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
183a0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 65   table..**.** Se
183b0 65 20 61 6c 73 6f 20 4f 70 65 6e 57 72 69 74 65  e also OpenWrite
183c0 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
183d0 4f 70 65 6e 57 72 69 74 65 20 50 31 20 50 32 20  OpenWrite P1 P2 
183e0 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 4f  P3 P4 P5.**.** O
183f0 70 65 6e 20 61 20 72 65 61 64 2f 77 72 69 74 65  pen a read/write
18400 20 63 75 72 73 6f 72 20 6e 61 6d 65 64 20 50 31   cursor named P1
18410 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   on the table or
18420 20 69 6e 64 65 78 20 77 68 6f 73 65 20 72 6f 6f   index whose roo
18430 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 50 32 2e  t.** page is P2.
18440 20 20 4f 72 20 69 66 20 50 35 21 3d 30 20 75 73    Or if P5!=0 us
18450 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
18460 20 72 65 67 69 73 74 65 72 20 50 32 20 74 6f 20   register P2 to 
18470 66 69 6e 64 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  find the.** root
18480 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
18490 20 50 34 20 76 61 6c 75 65 20 6d 61 79 20 62 65   P4 value may be
184a0 20 65 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67   either an integ
184b0 65 72 20 28 50 34 5f 49 4e 54 33 32 29 20 6f 72  er (P4_INT32) or
184c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a   a pointer to.**
184d0 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
184e0 74 75 72 65 20 28 50 34 5f 4b 45 59 49 4e 46 4f  ture (P4_KEYINFO
184f0 29 2e 20 49 66 20 69 74 20 69 73 20 61 20 70 6f  ). If it is a po
18500 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
18510 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  fo .** structure
18520 2c 20 74 68 65 6e 20 73 61 69 64 20 73 74 72 75  , then said stru
18530 63 74 75 72 65 20 64 65 66 69 6e 65 73 20 74 68  cture defines th
18540 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 63 6f  e content and co
18550 6c 6c 61 74 69 6e 67 20 0a 2a 2a 20 73 65 71 75  llating .** sequ
18560 65 6e 63 65 20 6f 66 20 74 68 65 20 69 6e 64 65  ence of the inde
18570 78 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 2e 20  x being opened. 
18580 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 50 34  Otherwise, if P4
18590 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 0a   is an integer .
185a0 2a 2a 20 76 61 6c 75 65 2c 20 69 74 20 69 73 20  ** value, it is 
185b0 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
185c0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
185d0 74 68 65 20 74 61 62 6c 65 2c 20 6f 72 20 74 6f  the table, or to
185e0 20 74 68 65 0a 2a 2a 20 6c 61 72 67 65 73 74 20   the.** largest 
185f0 69 6e 64 65 78 20 6f 66 20 61 6e 79 20 63 6f 6c  index of any col
18600 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
18610 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c   that is actuall
18620 79 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  y used..**.** Th
18630 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  is instruction w
18640 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 4f  orks just like O
18650 70 65 6e 52 65 61 64 20 65 78 63 65 70 74 20 74  penRead except t
18660 68 61 74 20 69 74 20 6f 70 65 6e 73 20 74 68 65  hat it opens the
18670 20 63 75 72 73 6f 72 0a 2a 2a 20 69 6e 20 72 65   cursor.** in re
18680 61 64 2f 77 72 69 74 65 20 6d 6f 64 65 2e 20 20  ad/write mode.  
18690 46 6f 72 20 61 20 67 69 76 65 6e 20 74 61 62 6c  For a given tabl
186a0 65 2c 20 74 68 65 72 65 20 63 61 6e 20 62 65 20  e, there can be 
186b0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72 65 61 64  one or more read
186c0 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73  -only.** cursors
186d0 20 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 61   or a single rea
186e0 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72 20 62  d/write cursor b
186f0 75 74 20 6e 6f 74 20 62 6f 74 68 2e 0a 2a 2a 0a  ut not both..**.
18700 2a 2a 20 53 65 65 20 61 6c 73 6f 20 4f 70 65 6e  ** See also Open
18710 52 65 61 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  Read..*/.case OP
18720 5f 4f 70 65 6e 52 65 61 64 3a 0a 63 61 73 65 20  _OpenRead:.case 
18730 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3a 20 7b 0a  OP_OpenWrite: {.
18740 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20    int nField;.  
18750 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
18760 6f 3b 0a 20 20 69 6e 74 20 70 32 3b 0a 20 20 69  o;.  int p2;.  i
18770 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 77 72  nt iDb;.  int wr
18780 46 6c 61 67 3b 0a 20 20 42 74 72 65 65 20 2a 70  Flag;.  Btree *p
18790 58 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  X;.  VdbeCursor 
187a0 2a 70 43 75 72 3b 0a 20 20 44 62 20 2a 70 44 62  *pCur;.  Db *pDb
187b0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 69  ;..  if( p->expi
187c0 72 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  red ){.    rc = 
187d0 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
187e0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
187f0 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 70 4b  nField = 0;.  pK
18800 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 70 32  eyInfo = 0;.  p2
18810 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 44   = pOp->p2;.  iD
18820 62 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61  b = pOp->p3;.  a
18830 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
18840 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
18850 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74    assert( (p->bt
18860 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44 62  reeMask & (((yDb
18870 4d 61 73 6b 29 31 29 3c 3c 69 44 62 29 29 21 3d  Mask)1)<<iDb))!=
18880 30 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62  0 );.  pDb = &db
18890 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 58  ->aDb[iDb];.  pX
188a0 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 61   = pDb->pBt;.  a
188b0 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a  ssert( pX!=0 );.
188c0 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
188d0 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20  e==OP_OpenWrite 
188e0 29 7b 0a 20 20 20 20 77 72 46 6c 61 67 20 3d 20  ){.    wrFlag = 
188f0 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  1;.    assert( s
18900 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
18910 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
18920 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 44 62  ) );.    if( pDb
18930 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f  ->pSchema->file_
18940 66 6f 72 6d 61 74 20 3c 20 70 2d 3e 6d 69 6e 57  format < p->minW
18950 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 29  riteFileFormat )
18960 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 69 6e 57 72  {.      p->minWr
18970 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20  iteFileFormat = 
18980 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  pDb->pSchema->fi
18990 6c 65 5f 66 6f 72 6d 61 74 3b 0a 20 20 20 20 7d  le_format;.    }
189a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 72  .  }else{.    wr
189b0 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Flag = 0;.  }.  
189c0 69 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20  if( pOp->p5 ){. 
189d0 20 20 20 61 73 73 65 72 74 28 20 70 32 3e 30 20     assert( p2>0 
189e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
189f0 32 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  2<=p->nMem );.  
18a00 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70    pIn2 = &aMem[p
18a10 32 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  2];.    assert( 
18a20 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e 32 29  memIsValid(pIn2)
18a30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18a40 28 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn2->flags & M
18a50 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20  EM_Int)!=0 );.  
18a60 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
18a70 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 32 29  Integerify(pIn2)
18a80 3b 0a 20 20 20 20 70 32 20 3d 20 28 69 6e 74 29  ;.    p2 = (int)
18a90 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 2f  pIn2->u.i;.    /
18aa0 2a 20 54 68 65 20 70 32 20 76 61 6c 75 65 20 61  * The p2 value a
18ab0 6c 77 61 79 73 20 63 6f 6d 65 73 20 66 72 6f 6d  lways comes from
18ac0 20 61 20 70 72 69 6f 72 20 4f 50 5f 43 72 65 61   a prior OP_Crea
18ad0 74 65 54 61 62 6c 65 20 6f 70 63 6f 64 65 20 61  teTable opcode a
18ae0 6e 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 6f  nd.    ** that o
18af0 70 63 6f 64 65 20 77 69 6c 6c 20 61 6c 77 61 79  pcode will alway
18b00 73 20 73 65 74 20 74 68 65 20 70 32 20 76 61 6c  s set the p2 val
18b10 75 65 20 74 6f 20 32 20 6f 72 20 6d 6f 72 65 20  ue to 2 or more 
18b20 6f 72 20 65 6c 73 65 20 66 61 69 6c 2e 0a 20 20  or else fail..  
18b30 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 77 65    ** If there we
18b40 72 65 20 61 20 66 61 69 6c 75 72 65 2c 20 74 68  re a failure, th
18b50 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
18b60 6d 65 6e 74 20 77 6f 75 6c 64 20 68 61 76 65 20  ment would have 
18b70 68 61 6c 74 65 64 0a 20 20 20 20 2a 2a 20 62 65  halted.    ** be
18b80 66 6f 72 65 20 72 65 61 63 68 69 6e 67 20 74 68  fore reaching th
18b90 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  is instruction. 
18ba0 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  */.    if( NEVER
18bb0 28 70 32 3c 32 29 20 29 20 7b 0a 20 20 20 20 20  (p2<2) ) {.     
18bc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
18bd0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
18be0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
18bf0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  to_error;.    }.
18c00 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70    }.  if( pOp->p
18c10 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46  4type==P4_KEYINF
18c20 4f 20 29 7b 0a 20 20 20 20 70 4b 65 79 49 6e 66  O ){.    pKeyInf
18c30 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  o = pOp->p4.pKey
18c40 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Info;.    pKeyIn
18c50 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 70 2d  fo->enc = ENC(p-
18c60 3e 64 62 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64  >db);.    nField
18c70 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   = pKeyInfo->nFi
18c80 65 6c 64 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69  eld+1;.  }else i
18c90 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
18ca0 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
18cb0 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 34  nField = pOp->p4
18cc0 2e 69 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  .i;.  }.  assert
18cd0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a  ( pOp->p1>=0 );.
18ce0 20 20 70 43 75 72 20 3d 20 61 6c 6c 6f 63 61 74    pCur = allocat
18cf0 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e  eCursor(p, pOp->
18d00 70 31 2c 20 6e 46 69 65 6c 64 2c 20 69 44 62 2c  p1, nField, iDb,
18d10 20 31 29 3b 0a 20 20 69 66 28 20 70 43 75 72 3d   1);.  if( pCur=
18d20 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
18d30 3b 0a 20 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f  ;.  pCur->nullRo
18d40 77 20 3d 20 31 3b 0a 20 20 70 43 75 72 2d 3e 69  w = 1;.  pCur->i
18d50 73 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20  sOrdered = 1;.  
18d60 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
18d70 65 43 75 72 73 6f 72 28 70 58 2c 20 70 32 2c 20  eCursor(pX, p2, 
18d80 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f  wrFlag, pKeyInfo
18d90 2c 20 70 43 75 72 2d 3e 70 43 75 72 73 6f 72 29  , pCur->pCursor)
18da0 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ;.  pCur->pKeyIn
18db0 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 0a  fo = pKeyInfo;..
18dc0 20 20 2f 2a 20 53 69 6e 63 65 20 69 74 20 70 65    /* Since it pe
18dd0 72 66 6f 72 6d 73 20 6e 6f 20 6d 65 6d 6f 72 79  rforms no memory
18de0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 49   allocation or I
18df0 4f 2c 20 74 68 65 20 6f 6e 6c 79 20 76 61 6c 75  O, the only valu
18e00 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 73 71 6c  es that.  ** sql
18e10 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
18e20 29 20 6d 61 79 20 72 65 74 75 72 6e 20 61 72 65  ) may return are
18e30 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 61 6e   SQLITE_EMPTY an
18e40 64 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 20 20  d SQLITE_OK. .  
18e50 2a 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 20  ** SQLITE_EMPTY 
18e60 69 73 20 6f 6e 6c 79 20 72 65 74 75 72 6e 65 64  is only returned
18e70 20 77 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   when attempting
18e80 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 74 61 62   to open the tab
18e90 6c 65 0a 20 20 2a 2a 20 72 6f 6f 74 65 64 20 61  le.  ** rooted a
18ea0 74 20 70 61 67 65 20 31 20 6f 66 20 61 20 7a 65  t page 1 of a ze
18eb0 72 6f 2d 62 79 74 65 20 64 61 74 61 62 61 73 65  ro-byte database
18ec0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
18ed0 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59  rc==SQLITE_EMPTY
18ee0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
18ef0 4b 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  K );.  if( rc==S
18f00 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20  QLITE_EMPTY ){. 
18f10 20 20 20 70 43 75 72 2d 3e 70 43 75 72 73 6f 72     pCur->pCursor
18f20 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 0;.    rc = S
18f30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
18f40 20 2f 2a 20 53 65 74 20 74 68 65 20 56 64 62 65   /* Set the Vdbe
18f50 43 75 72 73 6f 72 2e 69 73 54 61 62 6c 65 20 61  Cursor.isTable a
18f60 6e 64 20 69 73 49 6e 64 65 78 20 76 61 72 69 61  nd isIndex varia
18f70 62 6c 65 73 2e 20 50 72 65 76 69 6f 75 73 20 76  bles. Previous v
18f80 65 72 73 69 6f 6e 73 20 6f 66 0a 20 20 2a 2a 20  ersions of.  ** 
18f90 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20 63  SQLite used to c
18fa0 68 65 63 6b 20 69 66 20 74 68 65 20 72 6f 6f 74  heck if the root
18fb0 2d 70 61 67 65 20 66 6c 61 67 73 20 77 65 72 65  -page flags were
18fc0 20 73 61 6e 65 20 61 74 20 74 68 69 73 20 70 6f   sane at this po
18fd0 69 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 72 65 70  int.  ** and rep
18fe0 6f 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72  ort database cor
18ff0 72 75 70 74 69 6f 6e 20 69 66 20 74 68 65 79 20  ruption if they 
19000 77 65 72 65 20 6e 6f 74 2c 20 62 75 74 20 74 68  were not, but th
19010 69 73 20 63 68 65 63 6b 20 68 61 73 0a 20 20 2a  is check has.  *
19020 2a 20 73 69 6e 63 65 20 6d 6f 76 65 64 20 69 6e  * since moved in
19030 74 6f 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  to the btree lay
19040 65 72 2e 20 20 2a 2f 20 20 0a 20 20 70 43 75 72  er.  */  .  pCur
19050 2d 3e 69 73 54 61 62 6c 65 20 3d 20 70 4f 70 2d  ->isTable = pOp-
19060 3e 70 34 74 79 70 65 21 3d 50 34 5f 4b 45 59 49  >p4type!=P4_KEYI
19070 4e 46 4f 3b 0a 20 20 70 43 75 72 2d 3e 69 73 49  NFO;.  pCur->isI
19080 6e 64 65 78 20 3d 20 21 70 43 75 72 2d 3e 69 73  ndex = !pCur->is
19090 54 61 62 6c 65 3b 0a 20 20 62 72 65 61 6b 3b 0a  Table;.  break;.
190a0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70  }../* Opcode: Op
190b0 65 6e 45 70 68 65 6d 65 72 61 6c 20 50 31 20 50  enEphemeral P1 P
190c0 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 4f  2 * P4 *.**.** O
190d0 70 65 6e 20 61 20 6e 65 77 20 63 75 72 73 6f 72  pen a new cursor
190e0 20 50 31 20 74 6f 20 61 20 74 72 61 6e 73 69 65   P1 to a transie
190f0 6e 74 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65  nt table..** The
19100 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
19110 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72  s opened read/wr
19120 69 74 65 20 65 76 65 6e 20 69 66 20 0a 2a 2a 20  ite even if .** 
19130 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
19140 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  e is read-only. 
19150 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c 0a 2a   The ephemeral.*
19160 2a 20 74 61 62 6c 65 20 69 73 20 64 65 6c 65 74  * table is delet
19170 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
19180 20 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   when the cursor
19190 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
191a0 2a 20 50 32 20 69 73 20 74 68 65 20 6e 75 6d 62  * P2 is the numb
191b0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
191c0 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
191d0 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 63 75 72  able..** The cur
191e0 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  sor points to a 
191f0 42 54 72 65 65 20 74 61 62 6c 65 20 69 66 20 50  BTree table if P
19200 34 3d 3d 30 20 61 6e 64 20 74 6f 20 61 20 42 54  4==0 and to a BT
19210 72 65 65 20 69 6e 64 65 78 0a 2a 2a 20 69 66 20  ree index.** if 
19220 50 34 20 69 73 20 6e 6f 74 20 30 2e 20 20 49 66  P4 is not 0.  If
19230 20 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c   P4 is not NULL,
19240 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20   it points to a 
19250 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
19260 65 0a 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65  e.** that define
19270 73 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20  s the format of 
19280 6b 65 79 73 20 69 6e 20 74 68 65 20 69 6e 64 65  keys in the inde
19290 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  x..**.** This op
192a0 63 6f 64 65 20 77 61 73 20 6f 6e 63 65 20 63 61  code was once ca
192b0 6c 6c 65 64 20 4f 70 65 6e 54 65 6d 70 2e 20 20  lled OpenTemp.  
192c0 42 75 74 20 74 68 61 74 20 63 72 65 61 74 65 64  But that created
192d0 0a 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 62 65  .** confusion be
192e0 63 61 75 73 65 20 74 68 65 20 74 65 72 6d 20 22  cause the term "
192f0 74 65 6d 70 20 74 61 62 6c 65 22 2c 20 6d 69 67  temp table", mig
19300 68 74 20 72 65 66 65 72 20 65 69 74 68 65 72 0a  ht refer either.
19310 2a 2a 20 74 6f 20 61 20 54 45 4d 50 20 74 61 62  ** to a TEMP tab
19320 6c 65 20 61 74 20 74 68 65 20 53 51 4c 20 6c 65  le at the SQL le
19330 76 65 6c 2c 20 6f 72 20 74 6f 20 61 20 74 61 62  vel, or to a tab
19340 6c 65 20 6f 70 65 6e 65 64 20 62 79 0a 2a 2a 20  le opened by.** 
19350 74 68 69 73 20 6f 70 63 6f 64 65 2e 20 20 54 68  this opcode.  Th
19360 65 6e 20 74 68 69 73 20 6f 70 63 6f 64 65 20 77  en this opcode w
19370 61 73 20 63 61 6c 6c 20 4f 70 65 6e 56 69 72 74  as call OpenVirt
19380 75 61 6c 2e 20 20 42 75 74 0a 2a 2a 20 74 68 61  ual.  But.** tha
19390 74 20 63 72 65 61 74 65 64 20 63 6f 6e 66 75 73  t created confus
193a0 69 6f 6e 20 77 69 74 68 20 74 68 65 20 77 68 6f  ion with the who
193b0 6c 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65  le virtual-table
193c0 20 69 64 65 61 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63   idea..*/./* Opc
193d0 6f 64 65 3a 20 4f 70 65 6e 41 75 74 6f 69 6e 64  ode: OpenAutoind
193e0 65 78 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a  ex P1 P2 * P4 *.
193f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
19400 65 20 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65  e works the same
19410 20 61 73 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   as OP_OpenEphem
19420 65 72 61 6c 2e 20 20 49 74 20 68 61 73 20 61 0a  eral.  It has a.
19430 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 6e 61 6d  ** different nam
19440 65 20 74 6f 20 64 69 73 74 69 6e 67 75 69 73 68  e to distinguish
19450 20 69 74 73 20 75 73 65 2e 20 20 54 61 62 6c 65   its use.  Table
19460 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a  s created using.
19470 2a 2a 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64  ** by this opcod
19480 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  e will be used f
19490 6f 72 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  or automatically
194a0 20 63 72 65 61 74 65 64 20 74 72 61 6e 73 69 65   created transie
194b0 6e 74 0a 2a 2a 20 69 6e 64 69 63 65 73 20 69 6e  nt.** indices in
194c0 20 6a 6f 69 6e 73 2e 0a 2a 2f 0a 63 61 73 65 20   joins..*/.case 
194d0 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78  OP_OpenAutoindex
194e0 3a 20 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 45  : .case OP_OpenE
194f0 70 68 65 6d 65 72 61 6c 3a 20 7b 0a 20 20 56 64  phemeral: {.  Vd
19500 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 20  beCursor *pCx;. 
19510 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
19520 74 20 76 66 73 46 6c 61 67 73 20 3d 20 0a 20 20  t vfsFlags = .  
19530 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
19540 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20  READWRITE |.    
19550 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
19560 45 41 54 45 20 7c 0a 20 20 20 20 20 20 53 51 4c  EATE |.      SQL
19570 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
19580 56 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54  VE |.      SQLIT
19590 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
195a0 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 53 51 4c  LOSE |.      SQL
195b0 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
195c0 4e 54 5f 44 42 3b 0a 0a 20 20 61 73 73 65 72 74  NT_DB;..  assert
195d0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a  ( pOp->p1>=0 );.
195e0 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65    pCx = allocate
195f0 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70  Cursor(p, pOp->p
19600 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d 31 2c 20  1, pOp->p2, -1, 
19610 31 29 3b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  1);.  if( pCx==0
19620 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
19630 20 20 70 43 78 2d 3e 6e 75 6c 6c 52 6f 77 20 3d    pCx->nullRow =
19640 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   1;.  rc = sqlit
19650 65 33 42 74 72 65 65 4f 70 65 6e 28 30 2c 20 64  e3BtreeOpen(0, d
19660 62 2c 20 26 70 43 78 2d 3e 70 42 74 2c 20 0a 20  b, &pCx->pBt, . 
19670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19680 20 20 20 20 20 20 20 42 54 52 45 45 5f 4f 4d 49         BTREE_OMI
19690 54 5f 4a 4f 55 52 4e 41 4c 20 7c 20 42 54 52 45  T_JOURNAL | BTRE
196a0 45 5f 53 49 4e 47 4c 45 20 7c 20 70 4f 70 2d 3e  E_SINGLE | pOp->
196b0 70 35 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 20  p5, vfsFlags);. 
196c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
196d0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
196e0 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
196f0 54 72 61 6e 73 28 70 43 78 2d 3e 70 42 74 2c 20  Trans(pCx->pBt, 
19700 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  1);.  }.  if( rc
19710 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19720 20 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73     /* If a trans
19730 69 65 6e 74 20 69 6e 64 65 78 20 69 73 20 72 65  ient index is re
19740 71 75 69 72 65 64 2c 20 63 72 65 61 74 65 20 69  quired, create i
19750 74 20 62 79 20 63 61 6c 6c 69 6e 67 0a 20 20 20  t by calling.   
19760 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
19770 43 72 65 61 74 65 54 61 62 6c 65 28 29 20 77 69  CreateTable() wi
19780 74 68 20 74 68 65 20 42 54 52 45 45 5f 42 4c 4f  th the BTREE_BLO
19790 42 4b 45 59 20 66 6c 61 67 20 62 65 66 6f 72 65  BKEY flag before
197a0 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
197b0 69 74 2e 20 49 66 20 61 20 74 72 61 6e 73 69 65  it. If a transie
197c0 6e 74 20 74 61 62 6c 65 20 69 73 20 72 65 71 75  nt table is requ
197d0 69 72 65 64 2c 20 6a 75 73 74 20 75 73 65 20 74  ired, just use t
197e0 68 65 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61  he.    ** automa
197f0 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20  tically created 
19800 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
19810 70 61 67 65 20 31 20 28 61 6e 20 42 4c 4f 42 5f  page 1 (an BLOB_
19820 49 4e 54 4b 45 59 20 74 61 62 6c 65 29 2e 0a 20  INTKEY table).. 
19830 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f     */.    if( pO
19840 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 29  p->p4.pKeyInfo )
19850 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 67 6e 6f  {.      int pgno
19860 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19870 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
19880 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20  KEYINFO );.     
19890 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
198a0 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 43  eeCreateTable(pC
198b0 78 2d 3e 70 42 74 2c 20 26 70 67 6e 6f 2c 20 42  x->pBt, &pgno, B
198c0 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 20 0a  TREE_BLOBKEY); .
198d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
198e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
198f0 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d     assert( pgno=
19900 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 2b 31 20 29  =MASTER_ROOT+1 )
19910 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
19920 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
19930 72 28 70 43 78 2d 3e 70 42 74 2c 20 70 67 6e 6f  r(pCx->pBt, pgno
19940 2c 20 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 1, .          
19950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19960 20 20 20 20 20 20 28 4b 65 79 49 6e 66 6f 2a 29        (KeyInfo*)
19970 70 4f 70 2d 3e 70 34 2e 7a 2c 20 70 43 78 2d 3e  pOp->p4.z, pCx->
19980 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  pCursor);.      
19990 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20    pCx->pKeyInfo 
199a0 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
199b0 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 43 78 2d  fo;.        pCx-
199c0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d  >pKeyInfo->enc =
199d0 20 45 4e 43 28 70 2d 3e 64 62 29 3b 0a 20 20 20   ENC(p->db);.   
199e0 20 20 20 7d 0a 20 20 20 20 20 20 70 43 78 2d 3e     }.      pCx->
199f0 69 73 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  isTable = 0;.   
19a00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
19a10 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
19a20 75 72 73 6f 72 28 70 43 78 2d 3e 70 42 74 2c 20  ursor(pCx->pBt, 
19a30 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20  MASTER_ROOT, 1, 
19a40 30 2c 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  0, pCx->pCursor)
19a50 3b 0a 20 20 20 20 20 20 70 43 78 2d 3e 69 73 54  ;.      pCx->isT
19a60 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  able = 1;.    }.
19a70 20 20 7d 0a 20 20 70 43 78 2d 3e 69 73 4f 72 64    }.  pCx->isOrd
19a80 65 72 65 64 20 3d 20 28 70 4f 70 2d 3e 70 35 21  ered = (pOp->p5!
19a90 3d 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44  =BTREE_UNORDERED
19aa0 29 3b 0a 20 20 70 43 78 2d 3e 69 73 49 6e 64 65  );.  pCx->isInde
19ab0 78 20 3d 20 21 70 43 78 2d 3e 69 73 54 61 62 6c  x = !pCx->isTabl
19ac0 65 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  e;.  break;.}../
19ad0 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 50 73  * Opcode: OpenPs
19ae0 65 75 64 6f 20 50 31 20 50 32 20 50 33 20 2a 20  eudo P1 P2 P3 * 
19af0 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  *.**.** Open a n
19b00 65 77 20 63 75 72 73 6f 72 20 74 68 61 74 20 70  ew cursor that p
19b10 6f 69 6e 74 73 20 74 6f 20 61 20 66 61 6b 65 20  oints to a fake 
19b20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61  table that conta
19b30 69 6e 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  ins a single.** 
19b40 72 6f 77 20 6f 66 20 64 61 74 61 2e 20 20 54 68  row of data.  Th
19b50 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 61  e content of tha
19b60 74 20 6f 6e 65 20 72 6f 77 20 69 6e 20 74 68 65  t one row in the
19b70 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6d 65 6d 6f   content of memo
19b80 72 79 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50  ry.** register P
19b90 32 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  2.  In other wor
19ba0 64 73 2c 20 63 75 72 73 6f 72 20 50 31 20 62 65  ds, cursor P1 be
19bb0 63 6f 6d 65 73 20 61 6e 20 61 6c 69 61 73 20 66  comes an alias f
19bc0 6f 72 20 74 68 65 20 0a 2a 2a 20 4d 45 4d 5f 42  or the .** MEM_B
19bd0 6c 6f 62 20 63 6f 6e 74 65 6e 74 20 63 6f 6e 74  lob content cont
19be0 61 69 6e 65 64 20 69 6e 20 72 65 67 69 73 74 65  ained in registe
19bf0 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 73  r P2..**.** A ps
19c00 65 75 64 6f 2d 74 61 62 6c 65 20 63 72 65 61 74  eudo-table creat
19c10 65 64 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64  ed by this opcod
19c20 65 20 69 73 20 75 73 65 64 20 74 6f 20 68 6f 6c  e is used to hol
19c30 64 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f  d a single.** ro
19c40 77 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 74 68  w output from th
19c50 65 20 73 6f 72 74 65 72 20 73 6f 20 74 68 61 74  e sorter so that
19c60 20 74 68 65 20 72 6f 77 20 63 61 6e 20 62 65 20   the row can be 
19c70 64 65 63 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 0a  decomposed into.
19c80 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f  ** individual co
19c90 6c 75 6d 6e 73 20 75 73 69 6e 67 20 74 68 65 20  lumns using the 
19ca0 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65  OP_Column opcode
19cb0 2e 20 20 54 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e  .  The OP_Column
19cc0 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 74 68   opcode.** is th
19cd0 65 20 6f 6e 6c 79 20 63 75 72 73 6f 72 20 6f 70  e only cursor op
19ce0 63 6f 64 65 20 74 68 61 74 20 77 6f 72 6b 73 20  code that works 
19cf0 77 69 74 68 20 61 20 70 73 65 75 64 6f 2d 74 61  with a pseudo-ta
19d00 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 50 33 20 69 73  ble..**.** P3 is
19d10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
19d20 69 65 6c 64 73 20 69 6e 20 74 68 65 20 72 65 63  ields in the rec
19d30 6f 72 64 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ords that will b
19d40 65 20 73 74 6f 72 65 64 20 62 79 0a 2a 2a 20 74  e stored by.** t
19d50 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  he pseudo-table.
19d60 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e  .*/.case OP_Open
19d70 50 73 65 75 64 6f 3a 20 7b 0a 20 20 56 64 62 65  Pseudo: {.  Vdbe
19d80 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 0a 20 20  Cursor *pCx;..  
19d90 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
19da0 3d 30 20 29 3b 0a 20 20 70 43 78 20 3d 20 61 6c  =0 );.  pCx = al
19db0 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20  locateCursor(p, 
19dc0 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 33  pOp->p1, pOp->p3
19dd0 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  , -1, 0);.  if( 
19de0 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  pCx==0 ) goto no
19df0 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c  _mem;.  pCx->nul
19e00 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 78 2d  lRow = 1;.  pCx-
19e10 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67 20  >pseudoTableReg 
19e20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 43 78  = pOp->p2;.  pCx
19e30 2d 3e 69 73 54 61 62 6c 65 20 3d 20 31 3b 0a 20  ->isTable = 1;. 
19e40 20 70 43 78 2d 3e 69 73 49 6e 64 65 78 20 3d 20   pCx->isIndex = 
19e50 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  0;.  break;.}../
19e60 2a 20 4f 70 63 6f 64 65 3a 20 43 6c 6f 73 65 20  * Opcode: Close 
19e70 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  P1 * * * *.**.**
19e80 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20   Close a cursor 
19e90 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65  previously opene
19ea0 64 20 61 73 20 50 31 2e 20 20 49 66 20 50 31 20  d as P1.  If P1 
19eb0 69 73 20 6e 6f 74 0a 2a 2a 20 63 75 72 72 65 6e  is not.** curren
19ec0 74 6c 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 69  tly open, this i
19ed0 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 20  nstruction is a 
19ee0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63 61 73 65 20 4f  no-op..*/.case O
19ef0 50 5f 43 6c 6f 73 65 3a 20 7b 0a 20 20 61 73 73  P_Close: {.  ass
19f00 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
19f10 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
19f20 75 72 73 6f 72 20 29 3b 0a 20 20 73 71 6c 69 74  ursor );.  sqlit
19f30 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
19f40 28 70 2c 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  (p, p->apCsr[pOp
19f50 2d 3e 70 31 5d 29 3b 0a 20 20 70 2d 3e 61 70 43  ->p1]);.  p->apC
19f60 73 72 5b 70 4f 70 2d 3e 70 31 5d 20 3d 20 30 3b  sr[pOp->p1] = 0;
19f70 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
19f80 4f 70 63 6f 64 65 3a 20 53 65 65 6b 47 65 20 50  Opcode: SeekGe P
19f90 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a  1 P2 P3 P4 *.**.
19fa0 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31 20  ** If cursor P1 
19fb0 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c  refers to an SQL
19fc0 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74   table (B-Tree t
19fd0 68 61 74 20 75 73 65 73 20 69 6e 74 65 67 65 72  hat uses integer
19fe0 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20   keys), .** use 
19ff0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
1a000 69 73 74 65 72 20 50 33 20 61 73 20 74 68 65 20  ister P3 as the 
1a010 6b 65 79 2e 20 20 49 66 20 63 75 72 73 6f 72 20  key.  If cursor 
1a020 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f  P1 refers .** to
1a030 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74   an SQL index, t
1a040 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66 69  hen P3 is the fi
1a050 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20  rst in an array 
1a060 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20  of P4 registers 
1a070 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73 65  .** that are use
1a080 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64  d as an unpacked
1a090 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a   index key. .**.
1a0a0 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75  ** Reposition cu
1a0b0 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20  rsor P1 so that 
1a0c0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
1a0d0 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72 79  e smallest entry
1a0e0 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72 65   that .** is gre
1a0f0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
1a100 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61  al to the key va
1a110 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72  lue. If there ar
1a120 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a 2a 2a  e no records .**
1a130 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
1a140 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65   equal to the ke
1a150 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74 20  y and P2 is not 
1a160 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20  zero, then jump 
1a170 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  to P2..**.** See
1a180 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f   also: Found, No
1a190 74 46 6f 75 6e 64 2c 20 44 69 73 74 69 6e 63 74  tFound, Distinct
1a1a0 2c 20 53 65 65 6b 4c 74 2c 20 53 65 65 6b 47 74  , SeekLt, SeekGt
1a1b0 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f  , SeekLe.*/./* O
1a1c0 70 63 6f 64 65 3a 20 53 65 65 6b 47 74 20 50 31  pcode: SeekGt P1
1a1d0 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a   P2 P3 P4 *.**.*
1a1e0 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72  * If cursor P1 r
1a1f0 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20  efers to an SQL 
1a200 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68  table (B-Tree th
1a210 61 74 20 75 73 65 73 20 69 6e 74 65 67 65 72 20  at uses integer 
1a220 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74  keys), .** use t
1a230 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
1a240 73 74 65 72 20 50 33 20 61 73 20 61 20 6b 65 79  ster P3 as a key
1a250 2e 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72  . If cursor P1 r
1a260 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20  efers .** to an 
1a270 53 51 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20  SQL index, then 
1a280 50 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20  P3 is the first 
1a290 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 50  in an array of P
1a2a0 34 20 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20  4 registers .** 
1a2b0 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73  that are used as
1a2c0 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64   an unpacked ind
1a2d0 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52  ex key. .**.** R
1a2e0 65 70 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f 72  eposition cursor
1a2f0 20 50 31 20 73 6f 20 74 68 61 74 20 20 69 74 20   P1 so that  it 
1a300 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d  points to the sm
1a310 61 6c 6c 65 73 74 20 65 6e 74 72 79 20 74 68 61  allest entry tha
1a320 74 20 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  t .** is greater
1a330 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61   than the key va
1a340 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72  lue. If there ar
1a350 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 67 72 65  e no records gre
1a360 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 74 68  ater than .** th
1a370 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20  e key and P2 is 
1a380 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a  not zero, then j
1a390 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a  ump to P2..**.**
1a3a0 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64   See also: Found
1a3b0 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73 74  , NotFound, Dist
1a3c0 69 6e 63 74 2c 20 53 65 65 6b 4c 74 2c 20 53 65  inct, SeekLt, Se
1a3d0 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a  ekGe, SeekLe.*/.
1a3e0 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c  /* Opcode: SeekL
1a3f0 74 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 20  t P1 P2 P3 P4 * 
1a400 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  .**.** If cursor
1a410 20 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e   P1 refers to an
1a420 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72   SQL table (B-Tr
1a430 65 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74  ee that uses int
1a440 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20  eger keys), .** 
1a450 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  use the value in
1a460 20 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20   register P3 as 
1a470 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72  a key. If cursor
1a480 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74   P1 refers .** t
1a490 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20  o an SQL index, 
1a4a0 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66  then P3 is the f
1a4b0 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
1a4c0 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73   of P4 registers
1a4d0 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73   .** that are us
1a4e0 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65  ed as an unpacke
1a4f0 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a  d index key. .**
1a500 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63  .** Reposition c
1a510 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
1a520 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74    it points to t
1a530 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79  he largest entry
1a540 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 6c 65 73   that .** is les
1a550 73 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76  s than the key v
1a560 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61  alue. If there a
1a570 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 6c 65  re no records le
1a580 73 73 20 74 68 61 6e 20 0a 2a 2a 20 74 68 65 20  ss than .** the 
1a590 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f  key and P2 is no
1a5a0 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d  t zero, then jum
1a5b0 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53  p to P2..**.** S
1a5c0 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20  ee also: Found, 
1a5d0 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73 74 69 6e  NotFound, Distin
1a5e0 63 74 2c 20 53 65 65 6b 47 74 2c 20 53 65 65 6b  ct, SeekGt, Seek
1a5f0 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a  Ge, SeekLe.*/./*
1a600 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c 65 20   Opcode: SeekLe 
1a610 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a  P1 P2 P3 P4 *.**
1a620 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31  .** If cursor P1
1a630 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51   refers to an SQ
1a640 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20  L table (B-Tree 
1a650 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67 65  that uses intege
1a660 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65  r keys), .** use
1a670 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
1a680 67 69 73 74 65 72 20 50 33 20 61 73 20 61 20 6b  gister P3 as a k
1a690 65 79 2e 20 49 66 20 63 75 72 73 6f 72 20 50 31  ey. If cursor P1
1a6a0 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61   refers .** to a
1a6b0 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68 65  n SQL index, the
1a6c0 6e 20 50 33 20 69 73 20 74 68 65 20 66 69 72 73  n P3 is the firs
1a6d0 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  t in an array of
1a6e0 20 50 34 20 72 65 67 69 73 74 65 72 73 20 0a 2a   P4 registers .*
1a6f0 2a 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  * that are used 
1a700 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69  as an unpacked i
1a710 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a  ndex key. .**.**
1a720 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72 73   Reposition curs
1a730 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 69 74  or P1 so that it
1a740 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
1a750 61 72 67 65 73 74 20 65 6e 74 72 79 20 74 68 61  argest entry tha
1a760 74 20 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68  t .** is less th
1a770 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
1a780 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66  he key value. If
1a790 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65   there are no re
1a7a0 63 6f 72 64 73 20 0a 2a 2a 20 6c 65 73 73 20 74  cords .** less t
1a7b0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1a7c0 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69  the key and P2 i
1a7d0 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
1a7e0 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a   jump to P2..**.
1a7f0 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
1a800 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69  nd, NotFound, Di
1a810 73 74 69 6e 63 74 2c 20 53 65 65 6b 47 74 2c 20  stinct, SeekGt, 
1a820 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c 74 0a 2a  SeekGe, SeekLt.*
1a830 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 4c 74  /.case OP_SeekLt
1a840 3a 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d  :         /* jum
1a850 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  p, in3 */.case O
1a860 50 5f 53 65 65 6b 4c 65 3a 20 20 20 20 20 20 20  P_SeekLe:       
1a870 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
1a880 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 47 65  /.case OP_SeekGe
1a890 3a 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d  :         /* jum
1a8a0 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  p, in3 */.case O
1a8b0 50 5f 53 65 65 6b 47 74 3a 20 7b 20 20 20 20 20  P_SeekGt: {     
1a8c0 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
1a8d0 2f 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69  /.  int res;.  i
1a8e0 6e 74 20 6f 63 3b 0a 20 20 56 64 62 65 43 75 72  nt oc;.  VdbeCur
1a8f0 73 6f 72 20 2a 70 43 3b 0a 20 20 55 6e 70 61 63  sor *pC;.  Unpac
1a900 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a 20 20 69  kedRecord r;.  i
1a910 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 36 34  nt nField;.  i64
1a920 20 69 4b 65 79 3b 20 20 20 20 20 20 2f 2a 20 54   iKey;      /* T
1a930 68 65 20 72 6f 77 69 64 20 77 65 20 61 72 65 20  he rowid we are 
1a940 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 0a 20  to seek to */.. 
1a950 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
1a960 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
1a970 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61  ->nCursor );.  a
1a980 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 21 3d  ssert( pOp->p2!=
1a990 30 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  0 );.  pC = p->a
1a9a0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
1a9b0 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
1a9c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
1a9d0 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67 3d 3d  pseudoTableReg==
1a9e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f  0 );.  assert( O
1a9f0 50 5f 53 65 65 6b 4c 65 20 3d 3d 20 4f 50 5f 53  P_SeekLe == OP_S
1aa00 65 65 6b 4c 74 2b 31 20 29 3b 0a 20 20 61 73 73  eekLt+1 );.  ass
1aa10 65 72 74 28 20 4f 50 5f 53 65 65 6b 47 65 20 3d  ert( OP_SeekGe =
1aa20 3d 20 4f 50 5f 53 65 65 6b 4c 74 2b 32 20 29 3b  = OP_SeekLt+2 );
1aa30 0a 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65  .  assert( OP_Se
1aa40 65 6b 47 74 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c  ekGt == OP_SeekL
1aa50 74 2b 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t+3 );.  assert(
1aa60 20 70 43 2d 3e 69 73 4f 72 64 65 72 65 64 20 29   pC->isOrdered )
1aa70 3b 0a 20 20 69 66 28 20 70 43 2d 3e 70 43 75 72  ;.  if( pC->pCur
1aa80 73 6f 72 21 3d 30 20 29 7b 0a 20 20 20 20 6f 63  sor!=0 ){.    oc
1aa90 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
1aaa0 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20      pC->nullRow 
1aab0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 43 2d  = 0;.    if( pC-
1aac0 3e 69 73 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  >isTable ){.    
1aad0 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 76    /* The input v
1aae0 61 6c 75 65 20 69 6e 20 50 33 20 6d 69 67 68 74  alue in P3 might
1aaf0 20 62 65 20 6f 66 20 61 6e 79 20 74 79 70 65 3a   be of any type:
1ab00 20 69 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c 20   integer, real, 
1ab10 73 74 72 69 6e 67 2c 0a 20 20 20 20 20 20 2a 2a  string,.      **
1ab20 20 62 6c 6f 62 2c 20 6f 72 20 4e 55 4c 4c 2e 20   blob, or NULL. 
1ab30 20 42 75 74 20 69 74 20 6e 65 65 64 73 20 74 6f   But it needs to
1ab40 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 62   be an integer b
1ab50 65 66 6f 72 65 20 77 65 20 63 61 6e 20 64 6f 0a  efore we can do.
1ab60 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 65        ** the see
1ab70 6b 2c 20 73 6f 20 63 6f 76 65 72 74 20 69 74 2e  k, so covert it.
1ab80 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e 33 20 3d   */.      pIn3 =
1ab90 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
1aba0 0a 20 20 20 20 20 20 61 70 70 6c 79 4e 75 6d 65  .      applyNume
1abb0 72 69 63 41 66 66 69 6e 69 74 79 28 70 49 6e 33  ricAffinity(pIn3
1abc0 29 3b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20  );.      iKey = 
1abd0 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
1abe0 6c 75 65 28 70 49 6e 33 29 3b 0a 20 20 20 20 20  lue(pIn3);.     
1abf0 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69   pC->rowidIsVali
1ac00 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  d = 0;..      /*
1ac10 20 49 66 20 74 68 65 20 50 33 20 76 61 6c 75 65   If the P3 value
1ac20 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6f   could not be co
1ac30 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20  nverted into an 
1ac40 69 6e 74 65 67 65 72 20 77 69 74 68 6f 75 74 0a  integer without.
1ac50 20 20 20 20 20 20 2a 2a 20 6c 6f 73 73 20 6f 66        ** loss of
1ac60 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20 74 68   information, th
1ac70 65 6e 20 73 70 65 63 69 61 6c 20 70 72 6f 63 65  en special proce
1ac80 73 73 69 6e 67 20 69 73 20 72 65 71 75 69 72 65  ssing is require
1ac90 64 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  d... */.      if
1aca0 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26  ( (pIn3->flags &
1acb0 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a   MEM_Int)==0 ){.
1acc0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 49 6e          if( (pIn
1acd0 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  3->flags & MEM_R
1ace0 65 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  eal)==0 ){.     
1acf0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50       /* If the P
1ad00 33 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62  3 value cannot b
1ad10 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
1ad20 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 61 20 6e   any kind of a n
1ad30 75 6d 62 65 72 2c 0a 20 20 20 20 20 20 20 20 20  umber,.         
1ad40 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 73 65 65   ** then the see
1ad50 6b 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  k is not possibl
1ad60 65 2c 20 73 6f 20 6a 75 6d 70 20 74 6f 20 50 32  e, so jump to P2
1ad70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 63   */.          pc
1ad80 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
1ad90 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1ada0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1adb0 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
1adc0 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  h this point, th
1add0 65 6e 20 74 68 65 20 50 33 20 76 61 6c 75 65 20  en the P3 value 
1ade0 6d 75 73 74 20 62 65 20 61 20 66 6c 6f 61 74 69  must be a floati
1adf0 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  ng.        ** po
1ae00 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20  int number. */. 
1ae10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
1ae20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
1ae30 4d 5f 52 65 61 6c 29 21 3d 30 20 29 3b 0a 0a 20  M_Real)!=0 );.. 
1ae40 20 20 20 20 20 20 20 69 66 28 20 69 4b 65 79 3d         if( iKey=
1ae50 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20  =SMALLEST_INT64 
1ae60 26 26 20 28 70 49 6e 33 2d 3e 72 3c 28 64 6f 75  && (pIn3->r<(dou
1ae70 62 6c 65 29 69 4b 65 79 20 7c 7c 20 70 49 6e 33  ble)iKey || pIn3
1ae80 2d 3e 72 3e 30 29 20 29 7b 0a 20 20 20 20 20 20  ->r>0) ){.      
1ae90 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 76 61      /* The P3 va
1aea0 6c 75 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  lue is too large
1aeb0 20 69 6e 20 6d 61 67 6e 69 74 75 64 65 20 74 6f   in magnitude to
1aec0 20 62 65 20 65 78 70 72 65 73 73 65 64 20 61 73   be expressed as
1aed0 20 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   an.          **
1aee0 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
1aef0 20 20 20 20 20 20 20 72 65 73 20 3d 20 31 3b 0a         res = 1;.
1af00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
1af10 6e 33 2d 3e 72 3c 30 20 29 7b 0a 20 20 20 20 20  n3->r<0 ){.     
1af20 20 20 20 20 20 20 20 69 66 28 20 6f 63 3e 3d 4f         if( oc>=O
1af30 50 5f 53 65 65 6b 47 65 20 29 7b 20 20 61 73 73  P_SeekGe ){  ass
1af40 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  ert( oc==OP_Seek
1af50 47 65 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65  Ge || oc==OP_See
1af60 6b 47 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  kGt );.         
1af70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1af80 33 42 74 72 65 65 46 69 72 73 74 28 70 43 2d 3e  3BtreeFirst(pC->
1af90 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a  pCursor, &res);.
1afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1afb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1afc0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
1afd0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
1afe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1aff0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b000 20 20 20 20 20 20 69 66 28 20 6f 63 3c 3d 4f 50        if( oc<=OP
1b010 5f 53 65 65 6b 4c 65 20 29 7b 20 20 61 73 73 65  _SeekLe ){  asse
1b020 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c  rt( oc==OP_SeekL
1b030 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  t || oc==OP_Seek
1b040 4c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Le );.          
1b050 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b060 42 74 72 65 65 4c 61 73 74 28 70 43 2d 3e 70 43  BtreeLast(pC->pC
1b070 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20  ursor, &res);.  
1b080 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1b090 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1b0a0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
1b0b0 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  o_error;.       
1b0c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b0d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
1b0e0 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20   res ){.        
1b0f0 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
1b100 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
1b110 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
1b120 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1b130 20 69 66 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b   if( oc==OP_Seek
1b140 4c 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65  Lt || oc==OP_See
1b150 6b 47 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  kGe ){.         
1b160 20 2f 2a 20 55 73 65 20 74 68 65 20 63 65 69 6c   /* Use the ceil
1b170 69 6e 67 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  ing() function t
1b180 6f 20 63 6f 6e 76 65 72 74 20 72 65 61 6c 2d 3e  o convert real->
1b190 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  int */.         
1b1a0 20 69 66 28 20 70 49 6e 33 2d 3e 72 20 3e 20 28   if( pIn3->r > (
1b1b0 64 6f 75 62 6c 65 29 69 4b 65 79 20 29 20 69 4b  double)iKey ) iK
1b1c0 65 79 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  ey++;.        }e
1b1d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1b1e0 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 6f 72 28  * Use the floor(
1b1f0 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 6f  ) function to co
1b200 6e 76 65 72 74 20 72 65 61 6c 2d 3e 69 6e 74 20  nvert real->int 
1b210 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
1b220 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  ert( oc==OP_Seek
1b230 4c 65 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65  Le || oc==OP_See
1b240 6b 47 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  kGt );.         
1b250 20 69 66 28 20 70 49 6e 33 2d 3e 72 20 3c 20 28   if( pIn3->r < (
1b260 64 6f 75 62 6c 65 29 69 4b 65 79 20 29 20 69 4b  double)iKey ) iK
1b270 65 79 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ey--;.        }.
1b280 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 72        } .      r
1b290 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1b2a0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
1b2b0 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28  C->pCursor, 0, (
1b2c0 75 36 34 29 69 4b 65 79 2c 20 30 2c 20 26 72 65  u64)iKey, 0, &re
1b2d0 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
1b2e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b2f0 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72         goto abor
1b300 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
1b310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1b320 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
1b330 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56      pC->rowidIsV
1b340 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  alid = 1;.      
1b350 20 20 70 43 2d 3e 6c 61 73 74 52 6f 77 69 64 20    pC->lastRowid 
1b360 3d 20 69 4b 65 79 3b 0a 20 20 20 20 20 20 7d 0a  = iKey;.      }.
1b370 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b380 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70   nField = pOp->p
1b390 34 2e 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72  4.i;.      asser
1b3a0 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
1b3b0 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 20 20  P4_INT32 );.    
1b3c0 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64    assert( nField
1b3d0 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 2e 70 4b  >0 );.      r.pK
1b3e0 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65  eyInfo = pC->pKe
1b3f0 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 72 2e 6e  yInfo;.      r.n
1b400 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 46 69  Field = (u16)nFi
1b410 65 6c 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  eld;..      /* T
1b420 68 65 20 6e 65 78 74 20 6c 69 6e 65 20 6f 66 20  he next line of 
1b430 63 6f 64 65 20 63 6f 6d 70 75 74 65 73 20 61 73  code computes as
1b440 20 66 6f 6c 6c 6f 77 73 2c 20 6f 6e 6c 79 20 66   follows, only f
1b450 61 73 74 65 72 3a 0a 20 20 20 20 20 20 2a 2a 20  aster:.      ** 
1b460 20 20 69 66 28 20 6f 63 3d 3d 4f 50 5f 53 65 65    if( oc==OP_See
1b470 6b 47 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65  kGt || oc==OP_Se
1b480 65 6b 4c 65 20 29 7b 0a 20 20 20 20 20 20 2a 2a  ekLe ){.      **
1b490 20 20 20 20 20 72 2e 66 6c 61 67 73 20 3d 20 55       r.flags = U
1b4a0 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 3b  NPACKED_INCRKEY;
1b4b0 0a 20 20 20 20 20 20 2a 2a 20 20 20 7d 65 6c 73  .      **   }els
1b4c0 65 7b 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  e{.      **     
1b4d0 72 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  r.flags = 0;.   
1b4e0 20 20 20 2a 2a 20 20 20 7d 0a 20 20 20 20 20 20     **   }.      
1b4f0 2a 2f 0a 20 20 20 20 20 20 72 2e 66 6c 61 67 73  */.      r.flags
1b500 20 3d 20 28 75 31 36 29 28 55 4e 50 41 43 4b 45   = (u16)(UNPACKE
1b510 44 5f 49 4e 43 52 4b 45 59 20 2a 20 28 31 20 26  D_INCRKEY * (1 &
1b520 20 28 6f 63 20 2d 20 4f 50 5f 53 65 65 6b 4c 74   (oc - OP_SeekLt
1b530 29 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  )));.      asser
1b540 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 47 74  t( oc!=OP_SeekGt
1b550 20 7c 7c 20 72 2e 66 6c 61 67 73 3d 3d 55 4e 50   || r.flags==UNP
1b560 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 29 3b  ACKED_INCRKEY );
1b570 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
1b580 63 21 3d 4f 50 5f 53 65 65 6b 4c 65 20 7c 7c 20  c!=OP_SeekLe || 
1b590 72 2e 66 6c 61 67 73 3d 3d 55 4e 50 41 43 4b 45  r.flags==UNPACKE
1b5a0 44 5f 49 4e 43 52 4b 45 59 20 29 3b 0a 20 20 20  D_INCRKEY );.   
1b5b0 20 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f     assert( oc!=O
1b5c0 50 5f 53 65 65 6b 47 65 20 7c 7c 20 72 2e 66 6c  P_SeekGe || r.fl
1b5d0 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ags==0 );.      
1b5e0 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53  assert( oc!=OP_S
1b5f0 65 65 6b 4c 74 20 7c 7c 20 72 2e 66 6c 61 67 73  eekLt || r.flags
1b600 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 72 2e  ==0 );..      r.
1b610 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  aMem = &aMem[pOp
1b620 2d 3e 70 33 5d 3b 0a 23 69 66 64 65 66 20 53 51  ->p3];.#ifdef SQ
1b630 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
1b640 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d   { int i; for(i=
1b650 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69  0; i<r.nField; i
1b660 2b 2b 29 20 61 73 73 65 72 74 28 20 6d 65 6d 49  ++) assert( memI
1b670 73 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69  sValid(&r.aMem[i
1b680 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20  ]) ); }.#endif. 
1b690 20 20 20 20 20 45 78 70 61 6e 64 42 6c 6f 62 28       ExpandBlob(
1b6a0 72 2e 61 4d 65 6d 29 3b 0a 20 20 20 20 20 20 72  r.aMem);.      r
1b6b0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1b6c0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
1b6d0 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 2c 20  C->pCursor, &r, 
1b6e0 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20  0, 0, &res);.   
1b6f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b700 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b710 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
1b720 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  o_error;.      }
1b730 0a 20 20 20 20 20 20 70 43 2d 3e 72 6f 77 69 64  .      pC->rowid
1b740 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20  IsValid = 0;.   
1b750 20 7d 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72   }.    pC->defer
1b760 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
1b770 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74     pC->cacheStat
1b780 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
1b790 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1b7a0 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33  TEST.    sqlite3
1b7b0 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b  _search_count++;
1b7c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1b7d0 6f 63 3e 3d 4f 50 5f 53 65 65 6b 47 65 20 29 7b  oc>=OP_SeekGe ){
1b7e0 20 20 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50    assert( oc==OP
1b7f0 5f 53 65 65 6b 47 65 20 7c 7c 20 6f 63 3d 3d 4f  _SeekGe || oc==O
1b800 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20  P_SeekGt );.    
1b810 20 20 69 66 28 20 72 65 73 3c 30 20 7c 7c 20 28    if( res<0 || (
1b820 72 65 73 3d 3d 30 20 26 26 20 6f 63 3d 3d 4f 50  res==0 && oc==OP
1b830 5f 53 65 65 6b 47 74 29 20 29 7b 0a 20 20 20 20  _SeekGt) ){.    
1b840 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b850 42 74 72 65 65 4e 65 78 74 28 70 43 2d 3e 70 43  BtreeNext(pC->pC
1b860 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20  ursor, &res);.  
1b870 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b880 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
1b890 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
1b8a0 72 3b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 72  r;.        pC->r
1b8b0 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b  owidIsValid = 0;
1b8c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b8d0 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20        res = 0;. 
1b8e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1b8f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b900 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 7c 7c  oc==OP_SeekLt ||
1b910 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29   oc==OP_SeekLe )
1b920 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3e  ;.      if( res>
1b930 30 20 7c 7c 20 28 72 65 73 3d 3d 30 20 26 26 20  0 || (res==0 && 
1b940 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74 29 20 29  oc==OP_SeekLt) )
1b950 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1b960 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
1b970 6f 75 73 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c  ous(pC->pCursor,
1b980 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20   &res);.        
1b990 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b9a0 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  K ) goto abort_d
1b9b0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
1b9c0 20 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73       pC->rowidIs
1b9d0 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  Valid = 0;.     
1b9e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b9f0 2f 2a 20 72 65 73 20 6d 69 67 68 74 20 62 65 20  /* res might be 
1ba00 6e 65 67 61 74 69 76 65 20 62 65 63 61 75 73 65  negative because
1ba10 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1ba20 70 74 79 2e 20 20 43 68 65 63 6b 20 74 6f 0a 20  pty.  Check to. 
1ba30 20 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66         ** see if
1ba40 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
1ba50 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
1ba60 20 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69        res = sqli
1ba70 74 65 33 42 74 72 65 65 45 6f 66 28 70 43 2d 3e  te3BtreeEof(pC->
1ba80 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  pCursor);.      
1ba90 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1baa0 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b  rt( pOp->p2>0 );
1bab0 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
1bac0 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e        pc = pOp->
1bad0 70 32 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  p2 - 1;.    }.  
1bae0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
1baf0 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
1bb00 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f 70  attempting to op
1bb10 65 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6d  en the sqlite3_m
1bb20 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 20 20  aster table.    
1bb30 2a 2a 20 66 6f 72 20 72 65 61 64 20 61 63 63 65  ** for read acce
1bb40 73 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ss returns SQLIT
1bb50 45 5f 45 4d 50 54 59 2e 20 49 6e 20 74 68 69 73  E_EMPTY. In this
1bb60 20 63 61 73 65 20 61 6c 77 61 79 73 0a 20 20 20   case always.   
1bb70 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d   ** take the jum
1bb80 70 20 28 73 69 6e 63 65 20 74 68 65 72 65 20 61  p (since there a
1bb90 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 69 6e  re no records in
1bba0 20 74 68 65 20 74 61 62 6c 65 29 2e 0a 20 20 20   the table)..   
1bbb0 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 70 4f 70   */.    pc = pOp
1bbc0 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  ->p2 - 1;.  }.  
1bbd0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
1bbe0 6f 64 65 3a 20 53 65 65 6b 20 50 31 20 50 32 20  ode: Seek P1 P2 
1bbf0 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 31 20 69  * * *.**.** P1 i
1bc00 73 20 61 6e 20 6f 70 65 6e 20 74 61 62 6c 65 20  s an open table 
1bc10 63 75 72 73 6f 72 20 61 6e 64 20 50 32 20 69 73  cursor and P2 is
1bc20 20 61 20 72 6f 77 69 64 20 69 6e 74 65 67 65 72   a rowid integer
1bc30 2e 20 20 41 72 72 61 6e 67 65 0a 2a 2a 20 66 6f  .  Arrange.** fo
1bc40 72 20 50 31 20 74 6f 20 6d 6f 76 65 20 73 6f 20  r P1 to move so 
1bc50 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
1bc60 6f 20 74 68 65 20 72 6f 77 69 64 20 67 69 76 65  o the rowid give
1bc70 6e 20 62 79 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54  n by P2..**.** T
1bc80 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20  his is actually 
1bc90 61 20 64 65 66 65 72 72 65 64 20 73 65 65 6b 2e  a deferred seek.
1bca0 20 20 4e 6f 74 68 69 6e 67 20 61 63 74 75 61 6c    Nothing actual
1bcb0 6c 79 20 68 61 70 70 65 6e 73 20 75 6e 74 69 6c  ly happens until
1bcc0 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
1bcd0 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 61  s used to read a
1bce0 20 72 65 63 6f 72 64 2e 20 20 54 68 61 74 20 77   record.  That w
1bcf0 61 79 2c 20 69 66 20 6e 6f 20 72 65 61 64 73 0a  ay, if no reads.
1bd00 2a 2a 20 6f 63 63 75 72 2c 20 6e 6f 20 75 6e 6e  ** occur, no unn
1bd10 65 63 65 73 73 61 72 79 20 49 2f 4f 20 68 61 70  ecessary I/O hap
1bd20 70 65 6e 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  pens..*/.case OP
1bd30 5f 53 65 65 6b 3a 20 7b 20 20 20 20 2f 2a 20 69  _Seek: {    /* i
1bd40 6e 32 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  n2 */.  VdbeCurs
1bd50 6f 72 20 2a 70 43 3b 0a 0a 20 20 61 73 73 65 72  or *pC;..  asser
1bd60 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
1bd70 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
1bd80 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
1bd90 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
1bda0 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
1bdb0 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
1bdc0 28 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 29  (pC->pCursor!=0)
1bdd0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1bde0 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20  pC->isTable );. 
1bdf0 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d     pC->nullRow =
1be00 20 30 3b 0a 20 20 20 20 70 49 6e 32 20 3d 20 26   0;.    pIn2 = &
1be10 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
1be20 20 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72     pC->movetoTar
1be30 67 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  get = sqlite3Vdb
1be40 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 3b  eIntValue(pIn2);
1be50 0a 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73  .    pC->rowidIs
1be60 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70  Valid = 0;.    p
1be70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
1be80 6f 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65  o = 1;.  }.  bre
1be90 61 6b 3b 0a 7d 0a 20 20 0a 0a 2f 2a 20 4f 70 63  ak;.}.  ../* Opc
1bea0 6f 64 65 3a 20 46 6f 75 6e 64 20 50 31 20 50 32  ode: Found P1 P2
1beb0 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 49   P3 P4 *.**.** I
1bec0 66 20 50 34 3d 3d 30 20 74 68 65 6e 20 72 65 67  f P4==0 then reg
1bed0 69 73 74 65 72 20 50 33 20 68 6f 6c 64 73 20 61  ister P3 holds a
1bee0 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74 65   blob constructe
1bef0 64 20 62 79 20 4d 61 6b 65 52 65 63 6f 72 64 2e  d by MakeRecord.
1bf00 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74 68 65    If.** P4>0 the
1bf10 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73  n register P3 is
1bf20 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 50 34   the first of P4
1bf30 20 72 65 67 69 73 74 65 72 73 20 74 68 61 74 20   registers that 
1bf40 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64  form an unpacked
1bf50 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  .** record..**.*
1bf60 2a 20 43 75 72 73 6f 72 20 50 31 20 69 73 20 6f  * Cursor P1 is o
1bf70 6e 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65  n an index btree
1bf80 2e 20 20 49 66 20 74 68 65 20 72 65 63 6f 72 64  .  If the record
1bf90 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 50   identified by P
1bfa0 33 20 61 6e 64 20 50 34 0a 2a 2a 20 69 73 20 61  3 and P4.** is a
1bfb0 20 70 72 65 66 69 78 20 6f 66 20 61 6e 79 20 65   prefix of any e
1bfc0 6e 74 72 79 20 69 6e 20 50 31 20 74 68 65 6e 20  ntry in P1 then 
1bfd0 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74  a jump is made t
1bfe0 6f 20 50 32 20 61 6e 64 0a 2a 2a 20 50 31 20 69  o P2 and.** P1 i
1bff0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
1c000 61 74 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  at the matching 
1c010 65 6e 74 72 79 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  entry..*/./* Opc
1c020 6f 64 65 3a 20 4e 6f 74 46 6f 75 6e 64 20 50 31  ode: NotFound P1
1c030 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a   P2 P3 P4 *.**.*
1c040 2a 20 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20  * If P4==0 then 
1c050 72 65 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64  register P3 hold
1c060 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75  s a blob constru
1c070 63 74 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f  cted by MakeReco
1c080 72 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20  rd.  If.** P4>0 
1c090 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33  then register P3
1c0a0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 66   is the first of
1c0b0 20 50 34 20 72 65 67 69 73 74 65 72 73 20 74 68   P4 registers th
1c0c0 61 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63  at form an unpac
1c0d0 6b 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a  ked.** record..*
1c0e0 2a 20 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20  * .** Cursor P1 
1c0f0 69 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62  is on an index b
1c100 74 72 65 65 2e 20 20 49 66 20 74 68 65 20 72 65  tree.  If the re
1c110 63 6f 72 64 20 69 64 65 6e 74 69 66 69 65 64 20  cord identified 
1c120 62 79 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20  by P3 and P4.** 
1c130 69 73 20 6e 6f 74 20 74 68 65 20 70 72 65 66 69  is not the prefi
1c140 78 20 6f 66 20 61 6e 79 20 65 6e 74 72 79 20 69  x of any entry i
1c150 6e 20 50 31 20 74 68 65 6e 20 61 20 6a 75 6d 70  n P1 then a jump
1c160 20 69 73 20 6d 61 64 65 20 74 6f 20 50 32 2e 20   is made to P2. 
1c170 20 49 66 20 50 31 20 0a 2a 2a 20 64 6f 65 73 20   If P1 .** does 
1c180 63 6f 6e 74 61 69 6e 20 61 6e 20 65 6e 74 72 79  contain an entry
1c190 20 77 68 6f 73 65 20 70 72 65 66 69 78 20 6d 61   whose prefix ma
1c1a0 74 63 68 65 73 20 74 68 65 20 50 33 2f 50 34 20  tches the P3/P4 
1c1b0 72 65 63 6f 72 64 20 74 68 65 6e 20 63 6f 6e 74  record then cont
1c1c0 72 6f 6c 0a 2a 2a 20 66 61 6c 6c 73 20 74 68 72  rol.** falls thr
1c1d0 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
1c1e0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64   instruction and
1c1f0 20 50 31 20 69 73 20 6c 65 66 74 20 70 6f 69 6e   P1 is left poin
1c200 74 69 6e 67 20 61 74 20 74 68 65 0a 2a 2a 20 6d  ting at the.** m
1c210 61 74 63 68 69 6e 67 20 65 6e 74 72 79 2e 0a 2a  atching entry..*
1c220 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46  *.** See also: F
1c230 6f 75 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73 2c  ound, NotExists,
1c240 20 49 73 55 6e 69 71 75 65 0a 2a 2f 0a 63 61 73   IsUnique.*/.cas
1c250 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 3a 20 20  e OP_NotFound:  
1c260 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
1c270 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 6f 75  3 */.case OP_Fou
1c280 6e 64 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  nd: {        /* 
1c290 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 69  jump, in3 */.  i
1c2a0 6e 74 20 61 6c 72 65 61 64 79 45 78 69 73 74 73  nt alreadyExists
1c2b0 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  ;.  VdbeCursor *
1c2c0 70 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  pC;.  int res;. 
1c2d0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1c2e0 2a 70 49 64 78 4b 65 79 3b 0a 20 20 55 6e 70 61  *pIdxKey;.  Unpa
1c2f0 63 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a 20 20  ckedRecord r;.  
1c300 63 68 61 72 20 61 54 65 6d 70 52 65 63 5b 52 4f  char aTempRec[RO
1c310 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
1c320 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73  ckedRecord)) + s
1c330 69 7a 65 6f 66 28 4d 65 6d 29 2a 33 20 2b 20 37  izeof(Mem)*3 + 7
1c340 5d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ];..#ifdef SQLIT
1c350 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
1c360 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 2b 2b 3b 0a  _found_count++;.
1c370 23 65 6e 64 69 66 0a 0a 20 20 61 6c 72 65 61 64  #endif..  alread
1c380 79 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 61  yExists = 0;.  a
1c390 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
1c3a0 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
1c3b0 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73  nCursor );.  ass
1c3c0 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
1c3d0 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20  ==P4_INT32 );.  
1c3e0 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
1c3f0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
1c400 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70 49 6e  ( pC!=0 );.  pIn
1c410 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  3 = &aMem[pOp->p
1c420 33 5d 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  3];.  if( ALWAYS
1c430 28 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 29  (pC->pCursor!=0)
1c440 20 29 7b 0a 0a 20 20 20 20 61 73 73 65 72 74 28   ){..    assert(
1c450 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20   pC->isTable==0 
1c460 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  );.    if( pOp->
1c470 70 34 2e 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  p4.i>0 ){.      
1c480 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d  r.pKeyInfo = pC-
1c490 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20  >pKeyInfo;.     
1c4a0 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36   r.nField = (u16
1c4b0 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20  )pOp->p4.i;.    
1c4c0 20 20 72 2e 61 4d 65 6d 20 3d 20 70 49 6e 33 3b    r.aMem = pIn3;
1c4d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1c4e0 45 42 55 47 0a 20 20 20 20 20 20 7b 20 69 6e 74  EBUG.      { int
1c4f0 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72   i; for(i=0; i<r
1c500 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20 61 73  .nField; i++) as
1c510 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
1c520 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b 20  (&r.aMem[i]) ); 
1c530 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
1c540 2e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45  .flags = UNPACKE
1c550 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 3b 0a  D_PREFIX_MATCH;.
1c560 20 20 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20        pIdxKey = 
1c570 26 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  &r;.    }else{. 
1c580 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
1c590 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  3->flags & MEM_B
1c5a0 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73  lob );.      ass
1c5b0 65 72 74 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67  ert( (pIn3->flag
1c5c0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30  s & MEM_Zero)==0
1c5d0 20 29 3b 20 20 2f 2a 20 7a 65 72 6f 62 6c 6f 62   );  /* zeroblob
1c5e0 73 20 61 6c 72 65 61 64 79 20 65 78 70 61 6e 64  s already expand
1c5f0 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 49 64 78  ed */.      pIdx
1c600 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Key = sqlite3Vdb
1c610 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
1c620 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 70 49 6e 33  ->pKeyInfo, pIn3
1c630 2d 3e 6e 2c 20 70 49 6e 33 2d 3e 7a 2c 0a 20 20  ->n, pIn3->z,.  
1c640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c660 20 20 20 20 20 20 61 54 65 6d 70 52 65 63 2c 20        aTempRec, 
1c670 73 69 7a 65 6f 66 28 61 54 65 6d 70 52 65 63 29  sizeof(aTempRec)
1c680 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
1c690 78 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  xKey==0 ){.     
1c6a0 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
1c6b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
1c6c0 64 78 4b 65 79 2d 3e 66 6c 61 67 73 20 7c 3d 20  dxKey->flags |= 
1c6d0 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f  UNPACKED_PREFIX_
1c6e0 4d 41 54 43 48 3b 0a 20 20 20 20 7d 0a 20 20 20  MATCH;.    }.   
1c6f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1c700 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
1c710 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 70 49  (pC->pCursor, pI
1c720 64 78 4b 65 79 2c 20 30 2c 20 30 2c 20 26 72 65  dxKey, 0, 0, &re
1c730 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  s);.    if( pOp-
1c740 3e 70 34 2e 69 3d 3d 30 20 29 7b 0a 20 20 20 20  >p4.i==0 ){.    
1c750 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
1c760 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  eteUnpackedRecor
1c770 64 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  d(pIdxKey);.    
1c780 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
1c790 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c7a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1c7b0 20 20 61 6c 72 65 61 64 79 45 78 69 73 74 73 20    alreadyExists 
1c7c0 3d 20 28 72 65 73 3d 3d 30 29 3b 0a 20 20 20 20  = (res==0);.    
1c7d0 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
1c7e0 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e  to = 0;.    pC->
1c7f0 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
1c800 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20  CHE_STALE;.  }. 
1c810 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
1c820 3d 3d 4f 50 5f 46 6f 75 6e 64 20 29 7b 0a 20 20  ==OP_Found ){.  
1c830 20 20 69 66 28 20 61 6c 72 65 61 64 79 45 78 69    if( alreadyExi
1c840 73 74 73 20 29 20 70 63 20 3d 20 70 4f 70 2d 3e  sts ) pc = pOp->
1c850 70 32 20 2d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  p2 - 1;.  }else{
1c860 0a 20 20 20 20 69 66 28 20 21 61 6c 72 65 61 64  .    if( !alread
1c870 79 45 78 69 73 74 73 20 29 20 70 63 20 3d 20 70  yExists ) pc = p
1c880 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a  Op->p2 - 1;.  }.
1c890 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
1c8a0 70 63 6f 64 65 3a 20 49 73 55 6e 69 71 75 65 20  pcode: IsUnique 
1c8b0 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a  P1 P2 P3 P4 *.**
1c8c0 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69 73  .** Cursor P1 is
1c8d0 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 64 65   open on an inde
1c8e0 78 20 62 2d 74 72 65 65 20 2d 20 74 68 61 74 20  x b-tree - that 
1c8f0 69 73 20 74 6f 20 73 61 79 2c 20 61 20 62 74 72  is to say, a btr
1c900 65 65 20 77 68 69 63 68 0a 2a 2a 20 6e 6f 20 64  ee which.** no d
1c910 61 74 61 20 61 6e 64 20 77 68 65 72 65 20 74 68  ata and where th
1c920 65 20 6b 65 79 20 61 72 65 20 72 65 63 6f 72 64  e key are record
1c930 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 4f  s generated by O
1c940 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 77 69 74  P_MakeRecord wit
1c950 68 0a 2a 2a 20 74 68 65 20 6c 69 73 74 20 66 69  h.** the list fi
1c960 65 6c 64 20 62 65 69 6e 67 20 74 68 65 20 69 6e  eld being the in
1c970 74 65 67 65 72 20 52 4f 57 49 44 20 6f 66 20 74  teger ROWID of t
1c980 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
1c990 65 20 69 6e 64 65 78 0a 2a 2a 20 65 6e 74 72 79  e index.** entry
1c9a0 20 72 65 66 65 72 73 20 74 6f 2e 0a 2a 2a 0a 2a   refers to..**.*
1c9b0 2a 20 54 68 65 20 50 33 20 72 65 67 69 73 74 65  * The P3 registe
1c9c0 72 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  r contains an in
1c9d0 74 65 67 65 72 20 72 65 63 6f 72 64 20 6e 75 6d  teger record num
1c9e0 62 65 72 2e 20 43 61 6c 6c 20 74 68 69 73 20 72  ber. Call this r
1c9f0 65 63 6f 72 64 20 0a 2a 2a 20 6e 75 6d 62 65 72  ecord .** number
1ca00 20 52 2e 20 52 65 67 69 73 74 65 72 20 50 34 20   R. Register P4 
1ca10 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  is the first in 
1ca20 61 20 73 65 74 20 6f 66 20 4e 20 63 6f 6e 74 69  a set of N conti
1ca30 67 75 6f 75 73 20 72 65 67 69 73 74 65 72 73 0a  guous registers.
1ca40 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ** that make up 
1ca50 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65  an unpacked inde
1ca60 78 20 6b 65 79 20 74 68 61 74 20 63 61 6e 20 62  x key that can b
1ca70 65 20 75 73 65 64 20 77 69 74 68 20 63 75 72 73  e used with curs
1ca80 6f 72 20 50 31 2e 0a 2a 2a 20 54 68 65 20 76 61  or P1..** The va
1ca90 6c 75 65 20 6f 66 20 4e 20 63 61 6e 20 62 65 20  lue of N can be 
1caa0 69 6e 66 65 72 72 65 64 20 66 72 6f 6d 20 74 68  inferred from th
1cab0 65 20 63 75 72 73 6f 72 2e 20 4e 20 69 6e 63 6c  e cursor. N incl
1cac0 75 64 65 73 20 74 68 65 20 72 6f 77 69 64 0a 2a  udes the rowid.*
1cad0 2a 20 76 61 6c 75 65 20 61 70 70 65 6e 64 65 64  * value appended
1cae0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1caf0 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2e  he index record.
1cb00 20 54 68 69 73 20 72 6f 77 69 64 20 76 61 6c 75   This rowid valu
1cb10 65 20 6d 61 79 0a 2a 2a 20 6f 72 20 6d 61 79 20  e may.** or may 
1cb20 6e 6f 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  not be the same 
1cb30 61 73 20 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  as R..**.** If a
1cb40 6e 79 20 6f 66 20 74 68 65 20 4e 20 72 65 67 69  ny of the N regi
1cb50 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20  sters beginning 
1cb60 77 69 74 68 20 72 65 67 69 73 74 65 72 20 50 34  with register P4
1cb70 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c   contains a NULL
1cb80 0a 2a 2a 20 76 61 6c 75 65 2c 20 6a 75 6d 70 20  .** value, jump 
1cb90 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50  immediately to P
1cba0 32 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  2..**.** Otherwi
1cbb0 73 65 2c 20 74 68 69 73 20 69 6e 73 74 72 75 63  se, this instruc
1cbc0 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 63  tion checks if c
1cbd0 75 72 73 6f 72 20 50 31 20 63 6f 6e 74 61 69 6e  ursor P1 contain
1cbe0 73 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 77 68  s an entry.** wh
1cbf0 65 72 65 20 74 68 65 20 66 69 72 73 74 20 28 4e  ere the first (N
1cc00 2d 31 29 20 66 69 65 6c 64 73 20 6d 61 74 63 68  -1) fields match
1cc10 20 62 75 74 20 74 68 65 20 72 6f 77 69 64 20 76   but the rowid v
1cc20 61 6c 75 65 20 61 74 20 74 68 65 20 65 6e 64 0a  alue at the end.
1cc30 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ** of the index 
1cc40 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 52 2e 20  entry is not R. 
1cc50 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
1cc60 75 63 68 20 65 6e 74 72 79 2c 20 63 6f 6e 74 72  uch entry, contr
1cc70 6f 6c 20 6a 75 6d 70 73 0a 2a 2a 20 74 6f 20 69  ol jumps.** to i
1cc80 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 20 4f  nstruction P2. O
1cc90 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 72 6f  therwise, the ro
1cca0 77 69 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 6c  wid of the confl
1ccb0 69 63 74 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20  icting index.** 
1ccc0 65 6e 74 72 79 20 69 73 20 63 6f 70 69 65 64 20  entry is copied 
1ccd0 74 6f 20 72 65 67 69 73 74 65 72 20 50 33 20 61  to register P3 a
1cce0 6e 64 20 63 6f 6e 74 72 6f 6c 20 66 61 6c 6c 73  nd control falls
1ccf0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
1cd00 6e 65 78 74 0a 2a 2a 20 69 6e 73 74 72 75 63 74  next.** instruct
1cd10 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ion..**.** See a
1cd20 6c 73 6f 3a 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e  lso: NotFound, N
1cd30 6f 74 45 78 69 73 74 73 2c 20 46 6f 75 6e 64 0a  otExists, Found.
1cd40 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 73 55 6e 69  */.case OP_IsUni
1cd50 71 75 65 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  que: {        /*
1cd60 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20   jump, in3 */.  
1cd70 75 31 36 20 69 69 3b 0a 20 20 56 64 62 65 43 75  u16 ii;.  VdbeCu
1cd80 72 73 6f 72 20 2a 70 43 78 3b 0a 20 20 42 74 43  rsor *pCx;.  BtC
1cd90 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20  ursor *pCrsr;.  
1cda0 75 31 36 20 6e 46 69 65 6c 64 3b 0a 20 20 4d 65  u16 nField;.  Me
1cdb0 6d 20 2a 61 4d 78 3b 0a 20 20 55 6e 70 61 63 6b  m *aMx;.  Unpack
1cdc0 65 64 52 65 63 6f 72 64 20 72 3b 20 20 20 20 20  edRecord r;     
1cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cde0 42 2d 54 72 65 65 20 69 6e 64 65 78 20 73 65 61  B-Tree index sea
1cdf0 72 63 68 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  rch key */.  i64
1ce00 20 52 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   R;             
1ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce20 2f 2a 20 52 6f 77 69 64 20 73 74 6f 72 65 64 20  /* Rowid stored 
1ce30 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 2a  in register P3 *
1ce40 2f 0a 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65  /..  pIn3 = &aMe
1ce50 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 4d  m[pOp->p3];.  aM
1ce60 78 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  x = &aMem[pOp->p
1ce70 34 2e 69 5d 3b 0a 20 20 2f 2a 20 41 73 73 65 72  4.i];.  /* Asser
1ce80 74 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  t that the value
1ce90 73 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20  s of parameters 
1cea0 50 31 20 61 6e 64 20 50 34 20 61 72 65 20 69 6e  P1 and P4 are in
1ceb0 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 61 73 73   range. */.  ass
1cec0 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
1ced0 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20  ==P4_INT32 );.  
1cee0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e  assert( pOp->p4.
1cef0 69 3e 30 20 26 26 20 70 4f 70 2d 3e 70 34 2e 69  i>0 && pOp->p4.i
1cf00 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 61  <=p->nMem );.  a
1cf10 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
1cf20 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
1cf30 6e 43 75 72 73 6f 72 20 29 3b 0a 0a 20 20 2f 2a  nCursor );..  /*
1cf40 20 46 69 6e 64 20 74 68 65 20 69 6e 64 65 78 20   Find the index 
1cf50 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 70 43 78  cursor. */.  pCx
1cf60 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
1cf70 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
1cf80 70 43 78 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  pCx->deferredMov
1cf90 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 70 43 78 2d  eto==0 );.  pCx-
1cfa0 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 30 3b  >seekResult = 0;
1cfb0 0a 20 20 70 43 78 2d 3e 63 61 63 68 65 53 74 61  .  pCx->cacheSta
1cfc0 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
1cfd0 45 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 78  E;.  pCrsr = pCx
1cfe0 2d 3e 70 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  ->pCursor;..  /*
1cff0 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 76   If any of the v
1d000 61 6c 75 65 73 20 61 72 65 20 4e 55 4c 4c 2c 20  alues are NULL, 
1d010 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 2e 20 2a  take the jump. *
1d020 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 43 78  /.  nField = pCx
1d030 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ->pKeyInfo->nFie
1d040 6c 64 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  ld;.  for(ii=0; 
1d050 69 69 3c 6e 46 69 65 6c 64 3b 20 69 69 2b 2b 29  ii<nField; ii++)
1d060 7b 0a 20 20 20 20 69 66 28 20 61 4d 78 5b 69 69  {.    if( aMx[ii
1d070 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ].flags & MEM_Nu
1d080 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d  ll ){.      pc =
1d090 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
1d0a0 20 20 20 20 70 43 72 73 72 20 3d 20 30 3b 0a 20      pCrsr = 0;. 
1d0b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d0c0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
1d0d0 28 61 4d 78 5b 6e 46 69 65 6c 64 5d 2e 66 6c 61  (aMx[nField].fla
1d0e0 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d  gs & MEM_Null)==
1d0f0 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 72 73  0 );..  if( pCrs
1d100 72 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 50  r!=0 ){.    /* P
1d110 6f 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65  opulate the inde
1d120 78 20 73 65 61 72 63 68 20 6b 65 79 2e 20 2a 2f  x search key. */
1d130 0a 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20  .    r.pKeyInfo 
1d140 3d 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 3b  = pCx->pKeyInfo;
1d150 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20  .    r.nField = 
1d160 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 20 20  nField + 1;.    
1d170 72 2e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b  r.flags = UNPACK
1d180 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48  ED_PREFIX_SEARCH
1d190 3b 0a 20 20 20 20 72 2e 61 4d 65 6d 20 3d 20 61  ;.    r.aMem = a
1d1a0 4d 78 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  Mx;.#ifdef SQLIT
1d1b0 45 5f 44 45 42 55 47 0a 20 20 20 20 7b 20 69 6e  E_DEBUG.    { in
1d1c0 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t i; for(i=0; i<
1d1d0 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20 61  r.nField; i++) a
1d1e0 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
1d1f0 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b  d(&r.aMem[i]) );
1d200 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
1d210 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
1d220 6c 75 65 20 6f 66 20 52 20 66 72 6f 6d 20 72 65  lue of R from re
1d230 67 69 73 74 65 72 20 50 33 2e 20 2a 2f 0a 20 20  gister P3. */.  
1d240 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1d250 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 33 29  Integerify(pIn3)
1d260 3b 0a 20 20 20 20 52 20 3d 20 70 49 6e 33 2d 3e  ;.    R = pIn3->
1d270 75 2e 69 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 61  u.i;..    /* Sea
1d280 72 63 68 20 74 68 65 20 42 2d 54 72 65 65 20 69  rch the B-Tree i
1d290 6e 64 65 78 2e 20 49 66 20 6e 6f 20 63 6f 6e 66  ndex. If no conf
1d2a0 6c 69 63 74 69 6e 67 20 72 65 63 6f 72 64 20 69  licting record i
1d2b0 73 20 66 6f 75 6e 64 2c 20 6a 75 6d 70 0a 20 20  s found, jump.  
1d2c0 20 20 2a 2a 20 74 6f 20 50 32 2e 20 4f 74 68 65    ** to P2. Othe
1d2d0 72 77 69 73 65 2c 20 63 6f 70 79 20 74 68 65 20  rwise, copy the 
1d2e0 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63 6f 6e  rowid of the con
1d2f0 66 6c 69 63 74 69 6e 67 20 72 65 63 6f 72 64 20  flicting record 
1d300 74 6f 0a 20 20 20 20 2a 2a 20 72 65 67 69 73 74  to.    ** regist
1d310 65 72 20 50 33 20 61 6e 64 20 66 61 6c 6c 20 74  er P3 and fall t
1d320 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
1d330 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  xt instruction. 
1d340 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1d350 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
1d360 6e 70 61 63 6b 65 64 28 70 43 72 73 72 2c 20 26  npacked(pCrsr, &
1d370 72 2c 20 30 2c 20 30 2c 20 26 70 43 78 2d 3e 73  r, 0, 0, &pCx->s
1d380 65 65 6b 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  eekResult);.    
1d390 69 66 28 20 28 72 2e 66 6c 61 67 73 20 26 20 55  if( (r.flags & U
1d3a0 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53  NPACKED_PREFIX_S
1d3b0 45 41 52 43 48 29 20 7c 7c 20 72 2e 72 6f 77 69  EARCH) || r.rowi
1d3c0 64 3d 3d 52 20 29 7b 0a 20 20 20 20 20 20 70 63  d==R ){.      pc
1d3d0 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
1d3e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d3f0 20 70 49 6e 33 2d 3e 75 2e 69 20 3d 20 72 2e 72   pIn3->u.i = r.r
1d400 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  owid;.    }.  }.
1d410 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
1d420 70 63 6f 64 65 3a 20 4e 6f 74 45 78 69 73 74 73  pcode: NotExists
1d430 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
1d440 0a 2a 2a 20 55 73 65 20 74 68 65 20 63 6f 6e 74  .** Use the cont
1d450 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20  ent of register 
1d460 50 33 20 61 73 20 61 20 69 6e 74 65 67 65 72 20  P3 as a integer 
1d470 6b 65 79 2e 20 20 49 66 20 61 20 72 65 63 6f 72  key.  If a recor
1d480 64 20 0a 2a 2a 20 77 69 74 68 20 74 68 61 74 20  d .** with that 
1d490 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  key does not exi
1d4a0 73 74 20 69 6e 20 74 61 62 6c 65 20 6f 66 20 50  st in table of P
1d4b0 31 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  1, then jump to 
1d4c0 50 32 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 72  P2. .** If the r
1d4d0 65 63 6f 72 64 20 64 6f 65 73 20 65 78 69 73 74  ecord does exist
1d4e0 2c 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  , then fall thro
1d4f0 75 67 68 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ugh.  The cursor
1d500 20 69 73 20 6c 65 66 74 20 0a 2a 2a 20 70 6f 69   is left .** poi
1d510 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 72 65 63  nting to the rec
1d520 6f 72 64 20 69 66 20 69 74 20 65 78 69 73 74 73  ord if it exists
1d530 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
1d540 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
1d550 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e  his operation an
1d560 64 20 4e 6f 74 46 6f 75 6e 64 20 69 73 20 74 68  d NotFound is th
1d570 61 74 20 74 68 69 73 0a 2a 2a 20 6f 70 65 72 61  at this.** opera
1d580 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 65  tion assumes the
1d590 20 6b 65 79 20 69 73 20 61 6e 20 69 6e 74 65 67   key is an integ
1d5a0 65 72 20 61 6e 64 20 74 68 61 74 20 50 31 20 69  er and that P1 i
1d5b0 73 20 61 20 74 61 62 6c 65 20 77 68 65 72 65 61  s a table wherea
1d5c0 73 0a 2a 2a 20 4e 6f 74 46 6f 75 6e 64 20 61 73  s.** NotFound as
1d5d0 73 75 6d 65 73 20 6b 65 79 20 69 73 20 61 20 62  sumes key is a b
1d5e0 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20  lob constructed 
1d5f0 66 72 6f 6d 20 4d 61 6b 65 52 65 63 6f 72 64 20  from MakeRecord 
1d600 61 6e 64 0a 2a 2a 20 50 31 20 69 73 20 61 6e 20  and.** P1 is an 
1d610 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  index..**.** See
1d620 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f   also: Found, No
1d630 74 46 6f 75 6e 64 2c 20 49 73 55 6e 69 71 75 65  tFound, IsUnique
1d640 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 45  .*/.case OP_NotE
1d650 78 69 73 74 73 3a 20 7b 20 20 20 20 20 20 20 20  xists: {        
1d660 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a  /* jump, in3 */.
1d670 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
1d680 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
1d690 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  rsr;.  int res;.
1d6a0 20 20 75 36 34 20 69 4b 65 79 3b 0a 0a 20 20 70    u64 iKey;..  p
1d6b0 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In3 = &aMem[pOp-
1d6c0 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p3];.  assert( 
1d6d0 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
1d6e0 4d 5f 49 6e 74 20 29 3b 0a 20 20 61 73 73 65 72  M_Int );.  asser
1d6f0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
1d700 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
1d710 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
1d720 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
1d730 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
1d740 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1d750 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 61  ->isTable );.  a
1d760 73 73 65 72 74 28 20 70 43 2d 3e 70 73 65 75 64  ssert( pC->pseud
1d770 6f 54 61 62 6c 65 52 65 67 3d 3d 30 20 29 3b 0a  oTableReg==0 );.
1d780 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 70 43    pCrsr = pC->pC
1d790 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 72  ursor;.  if( pCr
1d7a0 73 72 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 73  sr!=0 ){.    res
1d7b0 20 3d 20 30 3b 0a 20 20 20 20 69 4b 65 79 20 3d   = 0;.    iKey =
1d7c0 20 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 20 20   pIn3->u.i;.    
1d7d0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1d7e0 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
1d7f0 70 43 72 73 72 2c 20 30 2c 20 69 4b 65 79 2c 20  pCrsr, 0, iKey, 
1d800 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 70 43  0, &res);.    pC
1d810 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 49  ->lastRowid = pI
1d820 6e 33 2d 3e 75 2e 69 3b 0a 20 20 20 20 70 43 2d  n3->u.i;.    pC-
1d830 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20  >rowidIsValid = 
1d840 72 65 73 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 20  res==0 ?1:0;.   
1d850 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30   pC->nullRow = 0
1d860 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53  ;.    pC->cacheS
1d870 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
1d880 41 4c 45 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66  ALE;.    pC->def
1d890 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
1d8a0 0a 20 20 20 20 69 66 28 20 72 65 73 21 3d 30 20  .    if( res!=0 
1d8b0 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f  ){.      pc = pO
1d8c0 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20  p->p2 - 1;.     
1d8d0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 72 6f 77   assert( pC->row
1d8e0 69 64 49 73 56 61 6c 69 64 3d 3d 30 20 29 3b 0a  idIsValid==0 );.
1d8f0 20 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e 73 65      }.    pC->se
1d900 65 6b 52 65 73 75 6c 74 20 3d 20 72 65 73 3b 0a  ekResult = res;.
1d910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1d920 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
1d930 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  n an attempt to 
1d940 6f 70 65 6e 20 61 20 72 65 61 64 20 63 75 72 73  open a read curs
1d950 6f 72 20 6f 6e 20 74 68 65 20 0a 20 20 20 20 2a  or on the .    *
1d960 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
1d970 74 61 62 6c 65 20 72 65 74 75 72 6e 73 20 53 51  table returns SQ
1d980 4c 49 54 45 5f 45 4d 50 54 59 2e 0a 20 20 20 20  LITE_EMPTY..    
1d990 2a 2f 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  */.    pc = pOp-
1d9a0 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 61 73 73  >p2 - 1;.    ass
1d9b0 65 72 74 28 20 70 43 2d 3e 72 6f 77 69 64 49 73  ert( pC->rowidIs
1d9c0 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20  Valid==0 );.    
1d9d0 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d  pC->seekResult =
1d9e0 20 30 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   0;.  }.  break;
1d9f0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .}../* Opcode: S
1da00 65 71 75 65 6e 63 65 20 50 31 20 50 32 20 2a 20  equence P1 P2 * 
1da10 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 69 6e 64 20 74  * *.**.** Find t
1da20 68 65 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c  he next availabl
1da30 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65  e sequence numbe
1da40 72 20 66 6f 72 20 63 75 72 73 6f 72 20 50 31 2e  r for cursor P1.
1da50 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
1da60 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 69 6e  quence number in
1da70 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
1da80 2a 2a 20 54 68 65 20 73 65 71 75 65 6e 63 65 20  ** The sequence 
1da90 6e 75 6d 62 65 72 20 6f 6e 20 74 68 65 20 63 75  number on the cu
1daa0 72 73 6f 72 20 69 73 20 69 6e 63 72 65 6d 65 6e  rsor is incremen
1dab0 74 65 64 20 61 66 74 65 72 20 74 68 69 73 0a 2a  ted after this.*
1dac0 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  * instruction.  
1dad0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 71 75  .*/.case OP_Sequ
1dae0 65 6e 63 65 3a 20 7b 20 20 20 20 20 20 20 20 20  ence: {         
1daf0 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c    /* out2-prerel
1db00 65 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ease */.  assert
1db10 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
1db20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
1db30 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  or );.  assert( 
1db40 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
1db50 5d 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74 2d 3e  ]!=0 );.  pOut->
1db60 75 2e 69 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70  u.i = p->apCsr[p
1db70 4f 70 2d 3e 70 31 5d 2d 3e 73 65 71 43 6f 75 6e  Op->p1]->seqCoun
1db80 74 2b 2b 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  t++;.  break;.}.
1db90 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 77  ../* Opcode: New
1dba0 52 6f 77 69 64 20 50 31 20 50 32 20 50 33 20 2a  Rowid P1 P2 P3 *
1dbb0 20 2a 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61 20 6e   *.**.** Get a n
1dbc0 65 77 20 69 6e 74 65 67 65 72 20 72 65 63 6f 72  ew integer recor
1dbd0 64 20 6e 75 6d 62 65 72 20 28 61 2e 6b 2e 61 20  d number (a.k.a 
1dbe0 22 72 6f 77 69 64 22 29 20 75 73 65 64 20 61 73  "rowid") used as
1dbf0 20 74 68 65 20 6b 65 79 20 74 6f 20 61 20 74 61   the key to a ta
1dc00 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 72 65 63 6f  ble..** The reco
1dc10 72 64 20 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74  rd number is not
1dc20 20 70 72 65 76 69 6f 75 73 6c 79 20 75 73 65 64   previously used
1dc30 20 61 73 20 61 20 6b 65 79 20 69 6e 20 74 68 65   as a key in the
1dc40 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
1dc50 6c 65 20 74 68 61 74 20 63 75 72 73 6f 72 20 50  le that cursor P
1dc60 31 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 54 68  1 points to.  Th
1dc70 65 20 6e 65 77 20 72 65 63 6f 72 64 20 6e 75 6d  e new record num
1dc80 62 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ber is written.*
1dc90 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 72 65 67  * written to reg
1dca0 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  ister P2..**.** 
1dcb0 49 66 20 50 33 3e 30 20 74 68 65 6e 20 50 33 20  If P3>0 then P3 
1dcc0 69 73 20 61 20 72 65 67 69 73 74 65 72 20 69 6e  is a register in
1dcd0 20 74 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20   the root frame 
1dce0 6f 66 20 74 68 69 73 20 56 44 42 45 20 74 68 61  of this VDBE tha
1dcf0 74 20 68 6f 6c 64 73 20 0a 2a 2a 20 74 68 65 20  t holds .** the 
1dd00 6c 61 72 67 65 73 74 20 70 72 65 76 69 6f 75 73  largest previous
1dd10 6c 79 20 67 65 6e 65 72 61 74 65 64 20 72 65 63  ly generated rec
1dd20 6f 72 64 20 6e 75 6d 62 65 72 2e 20 4e 6f 20 6e  ord number. No n
1dd30 65 77 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  ew record number
1dd40 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77 65 64  s are.** allowed
1dd50 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e   to be less than
1dd60 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65   this value. Whe
1dd70 6e 20 74 68 69 73 20 76 61 6c 75 65 20 72 65 61  n this value rea
1dd80 63 68 65 73 20 69 74 73 20 6d 61 78 69 6d 75 6d  ches its maximum
1dd90 2c 20 0a 2a 2a 20 61 20 53 51 4c 49 54 45 5f 46  , .** a SQLITE_F
1dda0 55 4c 4c 20 65 72 72 6f 72 20 69 73 20 67 65 6e  ULL error is gen
1ddb0 65 72 61 74 65 64 2e 20 54 68 65 20 50 33 20 72  erated. The P3 r
1ddc0 65 67 69 73 74 65 72 20 69 73 20 75 70 64 61 74  egister is updat
1ddd0 65 64 20 77 69 74 68 20 74 68 65 20 27 0a 2a 2a  ed with the '.**
1dde0 20 67 65 6e 65 72 61 74 65 64 20 72 65 63 6f 72   generated recor
1ddf0 64 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 50  d number. This P
1de00 33 20 6d 65 63 68 61 6e 69 73 6d 20 69 73 20 75  3 mechanism is u
1de10 73 65 64 20 74 6f 20 68 65 6c 70 20 69 6d 70 6c  sed to help impl
1de20 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 41 55 54  ement the.** AUT
1de30 4f 49 4e 43 52 45 4d 45 4e 54 20 66 65 61 74 75  OINCREMENT featu
1de40 72 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e  re..*/.case OP_N
1de50 65 77 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20  ewRowid: {      
1de60 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65       /* out2-pre
1de70 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 36 34  release */.  i64
1de80 20 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   v;             
1de90 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72      /* The new r
1dea0 6f 77 69 64 20 2a 2f 0a 20 20 56 64 62 65 43 75  owid */.  VdbeCu
1deb0 72 73 6f 72 20 2a 70 43 3b 20 20 20 20 20 20 20  rsor *pC;       
1dec0 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 61   /* Cursor of ta
1ded0 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20 6e  ble to get the n
1dee0 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e  ew rowid */.  in
1def0 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
1df00 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
1df10 66 20 61 6e 20 73 71 6c 69 74 65 33 42 74 72 65  f an sqlite3Btre
1df20 65 4c 61 73 74 28 29 20 2a 2f 0a 20 20 69 6e 74  eLast() */.  int
1df30 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
1df40 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 74      /* Counter t
1df50 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d 62  o limit the numb
1df60 65 72 20 6f 66 20 73 65 61 72 63 68 65 73 20 2a  er of searches *
1df70 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 20 20  /.  Mem *pMem;  
1df80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1df90 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6c  gister holding l
1dfa0 61 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f 72  argest rowid for
1dfb0 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 2a   AUTOINCREMENT *
1dfc0 2f 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70  /.  VdbeFrame *p
1dfd0 46 72 61 6d 65 3b 20 20 20 20 20 2f 2a 20 52 6f  Frame;     /* Ro
1dfe0 6f 74 20 66 72 61 6d 65 20 6f 66 20 56 44 42 45  ot frame of VDBE
1dff0 20 2a 2f 0a 0a 20 20 76 20 3d 20 30 3b 0a 20 20   */..  v = 0;.  
1e000 72 65 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  res = 0;.  asser
1e010 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
1e020 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
1e030 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
1e040 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
1e050 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
1e060 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
1e070 70 43 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 29 20  pC->pCursor==0) 
1e080 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 7a 65  ){.    /* The ze
1e090 72 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ro initializatio
1e0a0 6e 20 61 62 6f 76 65 20 69 73 20 61 6c 6c 20 74  n above is all t
1e0b0 68 61 74 20 69 73 20 6e 65 65 64 65 64 20 2a 2f  hat is needed */
1e0c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1e0d0 20 54 68 65 20 6e 65 78 74 20 72 6f 77 69 64 20   The next rowid 
1e0e0 6f 72 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  or record number
1e0f0 20 28 64 69 66 66 65 72 65 6e 74 20 74 65 72 6d   (different term
1e100 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 0a 20  s for the same. 
1e110 20 20 20 2a 2a 20 74 68 69 6e 67 29 20 69 73 20     ** thing) is 
1e120 6f 62 74 61 69 6e 65 64 20 69 6e 20 61 20 74 77  obtained in a tw
1e130 6f 2d 73 74 65 70 20 61 6c 67 6f 72 69 74 68 6d  o-step algorithm
1e140 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1e150 46 69 72 73 74 20 77 65 20 61 74 74 65 6d 70 74  First we attempt
1e160 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72   to find the lar
1e170 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 72 6f  gest existing ro
1e180 77 69 64 20 61 6e 64 20 61 64 64 20 6f 6e 65 0a  wid and add one.
1e190 20 20 20 20 2a 2a 20 74 6f 20 74 68 61 74 2e 20      ** to that. 
1e1a0 20 42 75 74 20 69 66 20 74 68 65 20 6c 61 72 67   But if the larg
1e1b0 65 73 74 20 65 78 69 73 74 69 6e 67 20 72 6f 77  est existing row
1e1c0 69 64 20 69 73 20 61 6c 72 65 61 64 79 20 74 68  id is already th
1e1d0 65 20 6d 61 78 69 6d 75 6d 0a 20 20 20 20 2a 2a  e maximum.    **
1e1e0 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
1e1f0 72 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 61  r, we have to fa
1e200 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
1e210 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20  e second.    ** 
1e220 70 72 6f 62 61 62 69 6c 69 73 74 69 63 20 61 6c  probabilistic al
1e230 67 6f 72 69 74 68 6d 0a 20 20 20 20 2a 2a 0a 20  gorithm.    **. 
1e240 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64     ** The second
1e250 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 74 6f   algorithm is to
1e260 20 73 65 6c 65 63 74 20 61 20 72 6f 77 69 64 20   select a rowid 
1e270 61 74 20 72 61 6e 64 6f 6d 20 61 6e 64 20 73 65  at random and se
1e280 65 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20 61  e if.    ** it a
1e290 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
1e2a0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49 66 20   the table.  If 
1e2b0 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
1e2c0 74 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a  t, we have.    *
1e2d0 2a 20 73 75 63 63 65 65 64 65 64 2e 20 20 49 66  * succeeded.  If
1e2e0 20 74 68 65 20 72 61 6e 64 6f 6d 20 72 6f 77 69   the random rowi
1e2f0 64 20 64 6f 65 73 20 65 78 69 73 74 2c 20 77 65  d does exist, we
1e300 20 73 65 6c 65 63 74 20 61 20 6e 65 77 20 6f 6e   select a new on
1e310 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 72 79  e.    ** and try
1e320 20 61 67 61 69 6e 2c 20 75 70 20 74 6f 20 31 30   again, up to 10
1e330 30 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2f 0a  0 times..    */.
1e340 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
1e350 69 73 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 64  isTable );..#ifd
1e360 65 66 20 53 51 4c 49 54 45 5f 33 32 42 49 54 5f  ef SQLITE_32BIT_
1e370 52 4f 57 49 44 0a 23 20 20 20 64 65 66 69 6e 65  ROWID.#   define
1e380 20 4d 41 58 5f 52 4f 57 49 44 20 30 78 37 66 66   MAX_ROWID 0x7ff
1e390 66 66 66 66 66 0a 23 65 6c 73 65 0a 20 20 20 20  fffff.#else.    
1e3a0 2f 2a 20 53 6f 6d 65 20 63 6f 6d 70 69 6c 65 72  /* Some compiler
1e3b0 73 20 63 6f 6d 70 6c 61 69 6e 20 61 62 6f 75 74  s complain about
1e3c0 20 63 6f 6e 73 74 61 6e 74 73 20 6f 66 20 74 68   constants of th
1e3d0 65 20 66 6f 72 6d 20 30 78 37 66 66 66 66 66 66  e form 0x7ffffff
1e3e0 66 66 66 66 66 66 66 66 66 2e 0a 20 20 20 20 2a  fffffffff..    *
1e3f0 2a 20 4f 74 68 65 72 73 20 63 6f 6d 70 6c 61 69  * Others complai
1e400 6e 20 61 62 6f 75 74 20 30 78 37 66 66 66 66 66  n about 0x7fffff
1e410 66 66 66 66 66 66 66 66 66 66 66 4c 4c 2e 20 20  fffffffffffLL.  
1e420 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  The following ma
1e430 63 72 6f 20 73 65 65 6d 73 0a 20 20 20 20 2a 2a  cro seems.    **
1e440 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
1e450 63 6f 6e 73 74 61 6e 74 20 77 68 69 6c 65 20 6d  constant while m
1e460 61 6b 69 6e 67 20 61 6c 6c 20 63 6f 6d 70 69 6c  aking all compil
1e470 65 72 73 20 68 61 70 70 79 2e 0a 20 20 20 20 2a  ers happy..    *
1e480 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58  /.#   define MAX
1e490 5f 52 4f 57 49 44 20 20 28 69 36 34 29 28 20 28  _ROWID  (i64)( (
1e4a0 28 28 75 36 34 29 30 78 37 66 66 66 66 66 66 66  ((u64)0x7fffffff
1e4b0 29 3c 3c 33 32 29 20 7c 20 28 75 36 34 29 30 78  )<<32) | (u64)0x
1e4c0 66 66 66 66 66 66 66 66 20 29 0a 23 65 6e 64 69  ffffffff ).#endi
1e4d0 66 0a 0a 20 20 20 20 69 66 28 20 21 70 43 2d 3e  f..    if( !pC->
1e4e0 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 29  useRandomRowid )
1e4f0 7b 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69  {.      v = sqli
1e500 74 65 33 42 74 72 65 65 47 65 74 43 61 63 68 65  te3BtreeGetCache
1e510 64 52 6f 77 69 64 28 70 43 2d 3e 70 43 75 72 73  dRowid(pC->pCurs
1e520 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76  or);.      if( v
1e530 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1e540 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1e550 4c 61 73 74 28 70 43 2d 3e 70 43 75 72 73 6f 72  Last(pC->pCursor
1e560 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20  , &res);.       
1e570 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e580 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1e590 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
1e5a0 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  o_error;.       
1e5b0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
1e5c0 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
1e5d0 76 20 3d 20 31 3b 20 20 20 2f 2a 20 49 4d 50 3a  v = 1;   /* IMP:
1e5e0 20 52 2d 36 31 39 31 34 2d 34 38 30 37 34 20 2a   R-61914-48074 *
1e5f0 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
1e600 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1e610 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
1e620 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 2d  ursorIsValid(pC-
1e630 3e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20  >pCursor) );.   
1e640 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1e650 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
1e660 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 76 29  pC->pCursor, &v)
1e670 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1e680 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
1e690 4b 20 29 3b 20 20 20 2f 2a 20 43 61 6e 6e 6f 74  K );   /* Cannot
1e6a0 20 66 61 69 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20   fail following 
1e6b0 42 74 72 65 65 4c 61 73 74 28 29 20 2a 2f 0a 20  BtreeLast() */. 
1e6c0 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3d 3d           if( v==
1e6d0 4d 41 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  MAX_ROWID ){.   
1e6e0 20 20 20 20 20 20 20 20 20 70 43 2d 3e 75 73 65           pC->use
1e6f0 52 61 6e 64 6f 6d 52 6f 77 69 64 20 3d 20 31 3b  RandomRowid = 1;
1e700 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1e710 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2b  {.            v+
1e720 2b 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  +;   /* IMP: R-2
1e730 39 35 33 38 2d 33 34 39 38 37 20 2a 2f 0a 20 20  9538-34987 */.  
1e740 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e750 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 23 69 66    }.      }..#if
1e760 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e770 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
1e780 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 33       if( pOp->p3
1e790 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
1e7a0 73 73 65 72 74 20 74 68 61 74 20 50 33 20 69 73  ssert that P3 is
1e7b0 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20   a valid memory 
1e7c0 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20  cell. */.       
1e7d0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
1e7e0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
1e7f0 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20  ( p->pFrame ){. 
1e800 20 20 20 20 20 20 20 20 20 66 6f 72 28 70 46 72           for(pFr
1e810 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70  ame=p->pFrame; p
1e820 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20  Frame->pParent; 
1e830 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70  pFrame=pFrame->p
1e840 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  Parent);.       
1e850 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61     /* Assert tha
1e860 74 20 50 33 20 69 73 20 61 20 76 61 6c 69 64 20  t P3 is a valid 
1e870 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a  memory cell. */.
1e880 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1e890 28 20 70 4f 70 2d 3e 70 33 3c 3d 70 46 72 61 6d  ( pOp->p3<=pFram
1e8a0 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20  e->nMem );.     
1e8b0 20 20 20 20 20 70 4d 65 6d 20 3d 20 26 70 46 72       pMem = &pFr
1e8c0 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70  ame->aMem[pOp->p
1e8d0 33 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  3];.        }els
1e8e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1e8f0 41 73 73 65 72 74 20 74 68 61 74 20 50 33 20 69  Assert that P3 i
1e900 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79  s a valid memory
1e910 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   cell. */.      
1e920 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
1e930 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a  >p3<=p->nMem );.
1e940 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d            pMem =
1e950 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
1e960 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 41 62  .          memAb
1e970 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70  outToChange(p, p
1e980 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Mem);.        }.
1e990 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e9a0 6d 65 6d 49 73 56 61 6c 69 64 28 70 4d 65 6d 29  memIsValid(pMem)
1e9b0 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 52 45 47   );..        REG
1e9c0 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
1e9d0 3e 70 33 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  >p3, pMem);.    
1e9e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1e9f0 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 4d 65  emIntegerify(pMe
1ea00 6d 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  m);.        asse
1ea10 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73  rt( (pMem->flags
1ea20 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29   & MEM_Int)!=0 )
1ea30 3b 20 20 2f 2a 20 6d 65 6d 28 50 33 29 20 68 6f  ;  /* mem(P3) ho
1ea40 6c 64 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a  lds an integer *
1ea50 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  /.        if( pM
1ea60 65 6d 2d 3e 75 2e 69 3d 3d 4d 41 58 5f 52 4f 57  em->u.i==MAX_ROW
1ea70 49 44 20 7c 7c 20 70 43 2d 3e 75 73 65 52 61 6e  ID || pC->useRan
1ea80 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  domRowid ){.    
1ea90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1eaa0 45 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50  E_FULL;   /* IMP
1eab0 3a 20 52 2d 31 32 32 37 35 2d 36 31 33 33 38 20  : R-12275-61338 
1eac0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
1ead0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
1eae0 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rror;.        }.
1eaf0 20 20 20 20 20 20 20 20 69 66 28 20 76 3c 70 4d          if( v<pM
1eb00 65 6d 2d 3e 75 2e 69 2b 31 20 29 7b 0a 20 20 20  em->u.i+1 ){.   
1eb10 20 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d         v = pMem-
1eb20 3e 75 2e 69 20 2b 20 31 3b 0a 20 20 20 20 20 20  >u.i + 1;.      
1eb30 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4d 65 6d    }.        pMem
1eb40 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 20 20 20  ->u.i = v;.     
1eb50 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
1eb60 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
1eb70 43 61 63 68 65 64 52 6f 77 69 64 28 70 43 2d 3e  CachedRowid(pC->
1eb80 70 43 75 72 73 6f 72 2c 20 76 3c 4d 41 58 5f 52  pCursor, v<MAX_R
1eb90 4f 57 49 44 20 3f 20 76 2b 31 20 3a 20 30 29 3b  OWID ? v+1 : 0);
1eba0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1ebb0 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69  C->useRandomRowi
1ebc0 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 4d  d ){.      /* IM
1ebd0 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
1ebe0 20 52 2d 30 37 36 37 37 2d 34 31 38 38 31 20 49   R-07677-41881 I
1ebf0 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 52 4f  f the largest RO
1ec00 57 49 44 20 69 73 20 65 71 75 61 6c 20 74 6f 20  WID is equal to 
1ec10 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72  the.      ** lar
1ec20 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 69 6e  gest possible in
1ec30 74 65 67 65 72 20 28 39 32 32 33 33 37 32 30 33  teger (922337203
1ec40 36 38 35 34 37 37 35 38 30 37 29 20 74 68 65 6e  6854775807) then
1ec50 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1ec60 20 20 20 20 2a 2a 20 65 6e 67 69 6e 65 20 73 74      ** engine st
1ec70 61 72 74 73 20 70 69 63 6b 69 6e 67 20 70 6f 73  arts picking pos
1ec80 69 74 69 76 65 20 63 61 6e 64 69 64 61 74 65 20  itive candidate 
1ec90 52 4f 57 49 44 73 20 61 74 20 72 61 6e 64 6f 6d  ROWIDs at random
1eca0 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 2a 2a 20   until.      ** 
1ecb0 69 74 20 66 69 6e 64 73 20 6f 6e 65 20 74 68 61  it finds one tha
1ecc0 74 20 69 73 20 6e 6f 74 20 70 72 65 76 69 6f 75  t is not previou
1ecd0 73 6c 79 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20  sly used. */.   
1ece0 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
1ecf0 70 33 3d 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20  p3==0 );  /* We 
1ed00 63 61 6e 6e 6f 74 20 62 65 20 69 6e 20 72 61 6e  cannot be in ran
1ed10 64 6f 6d 20 72 6f 77 69 64 20 6d 6f 64 65 20 69  dom rowid mode i
1ed20 66 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20  f this is.      
1ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed40 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 41 55 54         ** an AUT
1ed50 4f 49 4e 43 52 45 4d 45 4e 54 20 74 61 62 6c 65  OINCREMENT table
1ed60 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 6f 6e  . */.      /* on
1ed70 20 74 68 65 20 66 69 72 73 74 20 61 74 74 65 6d   the first attem
1ed80 70 74 2c 20 73 69 6d 70 6c 79 20 64 6f 20 6f 6e  pt, simply do on
1ed90 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 72 65 76  e more than prev
1eda0 69 6f 75 73 20 2a 2f 0a 20 20 20 20 20 20 76 20  ious */.      v 
1edb0 3d 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b  = db->lastRowid;
1edc0 0a 20 20 20 20 20 20 76 20 26 3d 20 28 4d 41 58  .      v &= (MAX
1edd0 5f 52 4f 57 49 44 3e 3e 31 29 3b 20 2f 2a 20 65  _ROWID>>1); /* e
1ede0 6e 73 75 72 65 20 64 6f 65 73 6e 27 74 20 67 6f  nsure doesn't go
1edf0 20 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 20   negative */.   
1ee00 20 20 20 76 2b 2b 3b 20 2f 2a 20 65 6e 73 75 72     v++; /* ensur
1ee10 65 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20  e non-zero */.  
1ee20 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20      cnt = 0;.   
1ee30 20 20 20 77 68 69 6c 65 28 20 20 20 28 28 72 63     while(   ((rc
1ee40 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
1ee50 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
1ee60 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75  ->pCursor, 0, (u
1ee70 36 34 29 76 2c 0a 20 20 20 20 20 20 20 20 20 20  64)v,.          
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eea0 20 20 20 20 20 20 20 30 2c 20 26 72 65 73 29 29         0, &res))
1eeb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20  ==SQLITE_OK).   
1eec0 20 20 20 20 20 20 20 20 20 26 26 20 28 72 65 73           && (res
1eed0 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  ==0).           
1eee0 20 26 26 20 28 2b 2b 63 6e 74 3c 31 30 30 29 29   && (++cnt<100))
1eef0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6c  {.        /* col
1ef00 6c 69 73 69 6f 6e 20 2d 20 74 72 79 20 61 6e 6f  lision - try ano
1ef10 74 68 65 72 20 72 61 6e 64 6f 6d 20 72 6f 77 69  ther random rowi
1ef20 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  d */.        sql
1ef30 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
1ef40 73 69 7a 65 6f 66 28 76 29 2c 20 26 76 29 3b 0a  sizeof(v), &v);.
1ef50 20 20 20 20 20 20 20 20 69 66 28 20 63 6e 74 3c          if( cnt<
1ef60 35 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  5 ){.          /
1ef70 2a 20 74 72 79 20 22 73 6d 61 6c 6c 22 20 72 61  * try "small" ra
1ef80 6e 64 6f 6d 20 72 6f 77 69 64 73 20 66 6f 72 20  ndom rowids for 
1ef90 74 68 65 20 69 6e 69 74 69 61 6c 20 61 74 74 65  the initial atte
1efa0 6d 70 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  mpts */.        
1efb0 20 20 76 20 26 3d 20 30 78 66 66 66 66 66 66 3b    v &= 0xffffff;
1efc0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1efd0 20 20 20 20 20 20 20 20 20 20 76 20 26 3d 20 28            v &= (
1efe0 4d 41 58 5f 52 4f 57 49 44 3e 3e 31 29 3b 20 2f  MAX_ROWID>>1); /
1eff0 2a 20 65 6e 73 75 72 65 20 64 6f 65 73 6e 27 74  * ensure doesn't
1f000 20 67 6f 20 6e 65 67 61 74 69 76 65 20 2a 2f 0a   go negative */.
1f010 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f020 20 20 76 2b 2b 3b 20 2f 2a 20 65 6e 73 75 72 65    v++; /* ensure
1f030 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20   non-zero */.   
1f040 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1f050 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1f060 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
1f070 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
1f080 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  LL;   /* IMP: R-
1f090 33 38 32 31 39 2d 35 33 30 30 32 20 2a 2f 0a 20  38219-53002 */. 
1f0a0 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72         goto abor
1f0b0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
1f0c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
1f0d0 73 65 72 74 28 20 76 3e 30 20 29 3b 20 20 2f 2a  sert( v>0 );  /*
1f0e0 20 45 56 3a 20 52 2d 34 30 38 31 32 2d 30 33 35   EV: R-40812-035
1f0f0 37 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  70 */.    }.    
1f100 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64  pC->rowidIsValid
1f110 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 64 65   = 0;.    pC->de
1f120 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
1f130 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53  ;.    pC->cacheS
1f140 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
1f150 41 4c 45 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d  ALE;.  }.  pOut-
1f160 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 62 72 65 61  >u.i = v;.  brea
1f170 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
1f180 20 49 6e 73 65 72 74 20 50 31 20 50 32 20 50 33   Insert P1 P2 P3
1f190 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 57 72 69   P4 P5.**.** Wri
1f1a0 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
1f1b0 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 63 75   the table of cu
1f1c0 72 73 6f 72 20 50 31 2e 20 20 41 20 6e 65 77 20  rsor P1.  A new 
1f1d0 65 6e 74 72 79 20 69 73 0a 2a 2a 20 63 72 65 61  entry is.** crea
1f1e0 74 65 64 20 69 66 20 69 74 20 64 6f 65 73 6e 27  ted if it doesn'
1f1f0 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 20  t already exist 
1f200 6f 72 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  or the data for 
1f210 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 65  an existing.** e
1f220 6e 74 72 79 20 69 73 20 6f 76 65 72 77 72 69 74  ntry is overwrit
1f230 74 65 6e 2e 20 20 54 68 65 20 64 61 74 61 20 69  ten.  The data i
1f240 73 20 74 68 65 20 76 61 6c 75 65 20 4d 45 4d 5f  s the value MEM_
1f250 42 6c 6f 62 20 73 74 6f 72 65 64 20 69 6e 20 72  Blob stored in r
1f260 65 67 69 73 74 65 72 0a 2a 2a 20 6e 75 6d 62 65  egister.** numbe
1f270 72 20 50 32 2e 20 54 68 65 20 6b 65 79 20 69 73  r P2. The key is
1f280 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
1f290 74 65 72 20 50 33 2e 20 54 68 65 20 6b 65 79 20  ter P3. The key 
1f2a0 6d 75 73 74 0a 2a 2a 20 62 65 20 61 20 4d 45 4d  must.** be a MEM
1f2b0 5f 49 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  _Int..**.** If t
1f2c0 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47  he OPFLAG_NCHANG
1f2d0 45 20 66 6c 61 67 20 6f 66 20 50 35 20 69 73 20  E flag of P5 is 
1f2e0 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  set, then the ro
1f2f0 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20 69  w change count i
1f300 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64  s.** incremented
1f310 20 28 6f 74 68 65 72 77 69 73 65 20 6e 6f 74 29   (otherwise not)
1f320 2e 20 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  .  If the OPFLAG
1f330 5f 4c 41 53 54 52 4f 57 49 44 20 66 6c 61 67 20  _LASTROWID flag 
1f340 6f 66 20 50 35 20 69 73 20 73 65 74 2c 0a 2a 2a  of P5 is set,.**
1f350 20 74 68 65 6e 20 72 6f 77 69 64 20 69 73 20 73   then rowid is s
1f360 74 6f 72 65 64 20 66 6f 72 20 73 75 62 73 65 71  tored for subseq
1f370 75 65 6e 74 20 72 65 74 75 72 6e 20 62 79 20 74  uent return by t
1f380 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 61  he.** sqlite3_la
1f390 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
1f3a0 29 20 66 75 6e 63 74 69 6f 6e 20 28 6f 74 68 65  ) function (othe
1f3b0 72 77 69 73 65 20 69 74 20 69 73 20 75 6e 6d 6f  rwise it is unmo
1f3c0 64 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49  dified)..**.** I
1f3d0 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53 45  f the OPFLAG_USE
1f3e0 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20  SEEKRESULT flag 
1f3f0 6f 66 20 50 35 20 69 73 20 73 65 74 20 61 6e 64  of P5 is set and
1f400 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f   if the result o
1f410 66 0a 2a 2a 20 74 68 65 20 6c 61 73 74 20 73 65  f.** the last se
1f420 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20 28 4f 50  ek operation (OP
1f430 5f 4e 6f 74 45 78 69 73 74 73 29 20 77 61 73 20  _NotExists) was 
1f440 61 20 73 75 63 63 65 73 73 2c 20 74 68 65 6e 20  a success, then 
1f450 74 68 69 73 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  this.** operatio
1f460 6e 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d  n will not attem
1f470 70 74 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61  pt to find the a
1f480 70 70 72 6f 70 72 69 61 74 65 20 72 6f 77 20 62  ppropriate row b
1f490 65 66 6f 72 65 20 64 6f 69 6e 67 0a 2a 2a 20 74  efore doing.** t
1f4a0 68 65 20 69 6e 73 65 72 74 20 62 75 74 20 77 69  he insert but wi
1f4b0 6c 6c 20 69 6e 73 74 65 61 64 20 6f 76 65 72 77  ll instead overw
1f4c0 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 68 61  rite the row tha
1f4d0 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a  t the cursor is.
1f4e0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ** currently poi
1f4f0 6e 74 69 6e 67 20 74 6f 2e 20 20 50 72 65 73 75  nting to.  Presu
1f500 6d 61 62 6c 79 2c 20 74 68 65 20 70 72 69 6f 72  mably, the prior
1f510 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f 70   OP_NotExists op
1f520 63 6f 64 65 0a 2a 2a 20 68 61 73 20 61 6c 72 65  code.** has alre
1f530 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 74  ady positioned t
1f540 68 65 20 63 75 72 73 6f 72 20 63 6f 72 72 65 63  he cursor correc
1f550 74 6c 79 2e 20 20 54 68 69 73 20 69 73 20 61 6e  tly.  This is an
1f560 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a   optimization.**
1f570 20 74 68 61 74 20 62 6f 6f 73 74 73 20 70 65 72   that boosts per
1f580 66 6f 72 6d 61 6e 63 65 20 62 79 20 61 76 6f 69  formance by avoi
1f590 64 69 6e 67 20 72 65 64 75 6e 64 61 6e 74 20 73  ding redundant s
1f5a0 65 65 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eeks..**.** If t
1f5b0 68 65 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41  he OPFLAG_ISUPDA
1f5c0 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  TE flag is set, 
1f5d0 74 68 65 6e 20 74 68 69 73 20 6f 70 63 6f 64 65  then this opcode
1f5e0 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 0a 2a   is part of an.*
1f5f0 2a 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69  * UPDATE operati
1f600 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 20 28  on.  Otherwise (
1f610 69 66 20 74 68 65 20 66 6c 61 67 20 69 73 20 63  if the flag is c
1f620 6c 65 61 72 29 20 74 68 65 6e 20 74 68 69 73 20  lear) then this 
1f630 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 70 61 72  opcode.** is par
1f640 74 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 6f  t of an INSERT o
1f650 70 65 72 61 74 69 6f 6e 2e 20 20 54 68 65 20 64  peration.  The d
1f660 69 66 66 65 72 65 6e 63 65 20 69 73 20 6f 6e 6c  ifference is onl
1f670 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 0a 2a  y important to.*
1f680 2a 20 74 68 65 20 75 70 64 61 74 65 20 68 6f 6f  * the update hoo
1f690 6b 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  k..**.** Paramet
1f6a0 65 72 20 50 34 20 6d 61 79 20 70 6f 69 6e 74 20  er P4 may point 
1f6b0 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
1f6c0 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
1f6d0 2d 6e 61 6d 65 2c 20 6f 72 0a 2a 2a 20 6d 61 79  -name, or.** may
1f6e0 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69 74 20   be NULL. If it 
1f6f0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
1f700 6e 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f  n the update-hoo
1f710 6b 20 0a 2a 2a 20 28 73 71 6c 69 74 65 33 2e 78  k .** (sqlite3.x
1f720 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 29 20  UpdateCallback) 
1f730 69 73 20 69 6e 76 6f 6b 65 64 20 66 6f 6c 6c 6f  is invoked follo
1f740 77 69 6e 67 20 61 20 73 75 63 63 65 73 73 66 75  wing a successfu
1f750 6c 20 69 6e 73 65 72 74 2e 0a 2a 2a 0a 2a 2a 20  l insert..**.** 
1f760 28 57 41 52 4e 49 4e 47 2f 54 4f 44 4f 3a 20 49  (WARNING/TODO: I
1f770 66 20 50 31 20 69 73 20 61 20 70 73 65 75 64 6f  f P1 is a pseudo
1f780 2d 63 75 72 73 6f 72 20 61 6e 64 20 50 32 20 69  -cursor and P2 i
1f790 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  s dynamically.**
1f7a0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 6e   allocated, then
1f7b0 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 50 32   ownership of P2
1f7c0 20 69 73 20 74 72 61 6e 73 66 65 72 72 65 64 20   is transferred 
1f7d0 74 6f 20 74 68 65 20 70 73 65 75 64 6f 2d 63 75  to the pseudo-cu
1f7e0 72 73 6f 72 0a 2a 2a 20 61 6e 64 20 72 65 67 69  rsor.** and regi
1f7f0 73 74 65 72 20 50 32 20 62 65 63 6f 6d 65 73 20  ster P2 becomes 
1f800 65 70 68 65 6d 65 72 61 6c 2e 20 20 49 66 20 74  ephemeral.  If t
1f810 68 65 20 63 75 72 73 6f 72 20 69 73 20 63 68 61  he cursor is cha
1f820 6e 67 65 64 2c 20 74 68 65 0a 2a 2a 20 76 61 6c  nged, the.** val
1f830 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  ue of register P
1f840 32 20 77 69 6c 6c 20 74 68 65 6e 20 63 68 61 6e  2 will then chan
1f850 67 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ge.  Make sure t
1f860 68 69 73 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  his does not.** 
1f870 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
1f880 6d 73 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ms.).**.** This 
1f890 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 6c 79  instruction only
1f8a0 20 77 6f 72 6b 73 20 6f 6e 20 74 61 62 6c 65 73   works on tables
1f8b0 2e 20 20 54 68 65 20 65 71 75 69 76 61 6c 65 6e  .  The equivalen
1f8c0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a  t instruction.**
1f8d0 20 66 6f 72 20 69 6e 64 69 63 65 73 20 69 73 20   for indices is 
1f8e0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2e 0a 2a 2f  OP_IdxInsert..*/
1f8f0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 73 65  ./* Opcode: Inse
1f900 72 74 49 6e 74 20 50 31 20 50 32 20 50 33 20 50  rtInt P1 P2 P3 P
1f910 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4 P5.**.** This 
1f920 77 6f 72 6b 73 20 65 78 61 63 74 6c 79 20 6c 69  works exactly li
1f930 6b 65 20 4f 50 5f 49 6e 73 65 72 74 20 65 78 63  ke OP_Insert exc
1f940 65 70 74 20 74 68 61 74 20 74 68 65 20 6b 65 79  ept that the key
1f950 20 69 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67   is the.** integ
1f960 65 72 20 76 61 6c 75 65 20 50 33 2c 20 6e 6f 74  er value P3, not
1f970 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1f980 65 20 69 6e 74 65 67 65 72 20 73 74 6f 72 65 64  e integer stored
1f990 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
1f9a0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65  .*/.case OP_Inse
1f9b0 72 74 3a 20 0a 63 61 73 65 20 4f 50 5f 49 6e 73  rt: .case OP_Ins
1f9c0 65 72 74 49 6e 74 3a 20 7b 0a 20 20 4d 65 6d 20  ertInt: {.  Mem 
1f9d0 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 2f 2a  *pData;       /*
1f9e0 20 4d 45 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e   MEM cell holdin
1f9f0 67 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72  g data for the r
1fa00 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65  ecord to be inse
1fa10 72 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  rted */.  Mem *p
1fa20 4b 65 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  Key;        /* M
1fa30 45 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20  EM cell holding 
1fa40 6b 65 79 20 20 66 6f 72 20 74 68 65 20 72 65 63  key  for the rec
1fa50 6f 72 64 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65  ord */.  i64 iKe
1fa60 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  y;         /* Th
1fa70 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20  e integer ROWID 
1fa80 6f 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72  or key for the r
1fa90 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65  ecord to be inse
1faa0 72 74 65 64 20 2a 2f 0a 20 20 56 64 62 65 43 75  rted */.  VdbeCu
1fab0 72 73 6f 72 20 2a 70 43 3b 20 20 20 2f 2a 20 43  rsor *pC;   /* C
1fac0 75 72 73 6f 72 20 74 6f 20 74 61 62 6c 65 20 69  ursor to table i
1fad0 6e 74 6f 20 77 68 69 63 68 20 69 6e 73 65 72 74  nto which insert
1fae0 20 69 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   is written */. 
1faf0 20 69 6e 74 20 6e 5a 65 72 6f 3b 20 20 20 20 20   int nZero;     
1fb00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1fb10 7a 65 72 6f 2d 62 79 74 65 73 20 74 6f 20 61 70  zero-bytes to ap
1fb20 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65  pend */.  int se
1fb30 65 6b 52 65 73 75 6c 74 3b 20 20 20 2f 2a 20 52  ekResult;   /* R
1fb40 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20 73  esult of prior s
1fb50 65 65 6b 20 6f 72 20 30 20 69 66 20 6e 6f 20 55  eek or 0 if no U
1fb60 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61  SESEEKRESULT fla
1fb70 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  g */.  const cha
1fb80 72 20 2a 7a 44 62 3b 20 20 2f 2a 20 64 61 74 61  r *zDb;  /* data
1fb90 62 61 73 65 20 6e 61 6d 65 20 2d 20 75 73 65 64  base name - used
1fba0 20 62 79 20 74 68 65 20 75 70 64 61 74 65 20 68   by the update h
1fbb0 6f 6f 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ook */.  const c
1fbc0 68 61 72 20 2a 7a 54 62 6c 3b 20 2f 2a 20 54 61  har *zTbl; /* Ta
1fbd0 62 6c 65 20 6e 61 6d 65 20 2d 20 75 73 65 64 20  ble name - used 
1fbe0 62 79 20 74 68 65 20 6f 70 64 61 74 65 20 68 6f  by the opdate ho
1fbf0 6f 6b 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  ok */.  int op; 
1fc00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63            /* Opc
1fc10 6f 64 65 20 66 6f 72 20 75 70 64 61 74 65 20 68  ode for update h
1fc20 6f 6f 6b 3a 20 53 51 4c 49 54 45 5f 55 50 44 41  ook: SQLITE_UPDA
1fc30 54 45 20 6f 72 20 53 51 4c 49 54 45 5f 49 4e 53  TE or SQLITE_INS
1fc40 45 52 54 20 2a 2f 0a 0a 20 20 70 44 61 74 61 20  ERT */..  pData 
1fc50 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
1fc60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1fc70 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
1fc80 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
1fc90 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
1fca0 61 6c 69 64 28 70 44 61 74 61 29 20 29 3b 0a 20  alid(pData) );. 
1fcb0 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
1fcc0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
1fcd0 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73  t( pC!=0 );.  as
1fce0 73 65 72 74 28 20 70 43 2d 3e 70 43 75 72 73 6f  sert( pC->pCurso
1fcf0 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1fd00 28 20 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c  ( pC->pseudoTabl
1fd10 65 52 65 67 3d 3d 30 20 29 3b 0a 20 20 61 73 73  eReg==0 );.  ass
1fd20 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65  ert( pC->isTable
1fd30 20 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54   );.  REGISTER_T
1fd40 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 44  RACE(pOp->p2, pD
1fd50 61 74 61 29 3b 0a 0a 20 20 69 66 28 20 70 4f 70  ata);..  if( pOp
1fd60 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 73  ->opcode==OP_Ins
1fd70 65 72 74 20 29 7b 0a 20 20 20 20 70 4b 65 79 20  ert ){.    pKey 
1fd80 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
1fd90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4b  ;.    assert( pK
1fda0 65 79 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ey->flags & MEM_
1fdb0 49 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Int );.    asser
1fdc0 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 4b  t( memIsValid(pK
1fdd0 65 79 29 20 29 3b 0a 20 20 20 20 52 45 47 49 53  ey) );.    REGIS
1fde0 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
1fdf0 33 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 69 4b  3, pKey);.    iK
1fe00 65 79 20 3d 20 70 4b 65 79 2d 3e 75 2e 69 3b 0a  ey = pKey->u.i;.
1fe10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
1fe20 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
1fe30 3d 3d 4f 50 5f 49 6e 73 65 72 74 49 6e 74 20 29  ==OP_InsertInt )
1fe40 3b 0a 20 20 20 20 69 4b 65 79 20 3d 20 70 4f 70  ;.    iKey = pOp
1fe50 2d 3e 70 33 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ->p3;.  }..  if(
1fe60 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41   pOp->p5 & OPFLA
1fe70 47 5f 4e 43 48 41 4e 47 45 20 29 20 70 2d 3e 6e  G_NCHANGE ) p->n
1fe80 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 69 66 28 20  Change++;.  if( 
1fe90 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
1fea0 5f 4c 41 53 54 52 4f 57 49 44 20 29 20 64 62 2d  _LASTROWID ) db-
1feb0 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 69 4b 65  >lastRowid = iKe
1fec0 79 3b 0a 20 20 69 66 28 20 70 44 61 74 61 2d 3e  y;.  if( pData->
1fed0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
1fee0 20 29 7b 0a 20 20 20 20 70 44 61 74 61 2d 3e 7a   ){.    pData->z
1fef0 20 3d 20 30 3b 0a 20 20 20 20 70 44 61 74 61 2d   = 0;.    pData-
1ff00 3e 6e 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  >n = 0;.  }else{
1ff10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 61  .    assert( pDa
1ff20 74 61 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d  ta->flags & (MEM
1ff30 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29 20 29  _Blob|MEM_Str) )
1ff40 3b 0a 20 20 7d 0a 20 20 73 65 65 6b 52 65 73 75  ;.  }.  seekResu
1ff50 6c 74 20 3d 20 28 28 70 4f 70 2d 3e 70 35 20 26  lt = ((pOp->p5 &
1ff60 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
1ff70 45 53 55 4c 54 29 20 3f 20 70 43 2d 3e 73 65 65  ESULT) ? pC->see
1ff80 6b 52 65 73 75 6c 74 20 3a 20 30 29 3b 0a 20 20  kResult : 0);.  
1ff90 69 66 28 20 70 44 61 74 61 2d 3e 66 6c 61 67 73  if( pData->flags
1ffa0 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
1ffb0 20 20 20 6e 5a 65 72 6f 20 3d 20 70 44 61 74 61     nZero = pData
1ffc0 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 65 6c  ->u.nZero;.  }el
1ffd0 73 65 7b 0a 20 20 20 20 6e 5a 65 72 6f 20 3d 20  se{.    nZero = 
1ffe0 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
1fff0 42 74 72 65 65 53 65 74 43 61 63 68 65 64 52 6f  BtreeSetCachedRo
20000 77 69 64 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c  wid(pC->pCursor,
20010 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
20020 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 70  te3BtreeInsert(p
20030 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 69  C->pCursor, 0, i
20040 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Key,.           
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
20060 44 61 74 61 2d 3e 7a 2c 20 70 44 61 74 61 2d 3e  Data->z, pData->
20070 6e 2c 20 6e 5a 65 72 6f 2c 0a 20 20 20 20 20 20  n, nZero,.      
20080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20090 20 20 20 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50      pOp->p5 & OP
200a0 46 4c 41 47 5f 41 50 50 45 4e 44 2c 20 73 65 65  FLAG_APPEND, see
200b0 6b 52 65 73 75 6c 74 0a 20 20 29 3b 0a 20 20 70  kResult.  );.  p
200c0 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  C->rowidIsValid 
200d0 3d 20 30 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72  = 0;.  pC->defer
200e0 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
200f0 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
20100 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
20110 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  /* Invoke the
20120 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20   update-hook if 
20130 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
20140 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20150 20 26 26 20 64 62 2d 3e 78 55 70 64 61 74 65 43   && db->xUpdateC
20160 61 6c 6c 62 61 63 6b 20 26 26 20 70 4f 70 2d 3e  allback && pOp->
20170 70 34 2e 7a 20 29 7b 0a 20 20 20 20 7a 44 62 20  p4.z ){.    zDb 
20180 3d 20 64 62 2d 3e 61 44 62 5b 70 43 2d 3e 69 44  = db->aDb[pC->iD
20190 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7a 54  b].zName;.    zT
201a0 62 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  bl = pOp->p4.z;.
201b0 20 20 20 20 6f 70 20 3d 20 28 28 70 4f 70 2d 3e      op = ((pOp->
201c0 70 35 20 26 20 4f 50 46 4c 41 47 5f 49 53 55 50  p5 & OPFLAG_ISUP
201d0 44 41 54 45 29 20 3f 20 53 51 4c 49 54 45 5f 55  DATE) ? SQLITE_U
201e0 50 44 41 54 45 20 3a 20 53 51 4c 49 54 45 5f 49  PDATE : SQLITE_I
201f0 4e 53 45 52 54 29 3b 0a 20 20 20 20 61 73 73 65  NSERT);.    asse
20200 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20  rt( pC->isTable 
20210 29 3b 0a 20 20 20 20 64 62 2d 3e 78 55 70 64 61  );.    db->xUpda
20220 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  teCallback(db->p
20230 55 70 64 61 74 65 41 72 67 2c 20 6f 70 2c 20 7a  UpdateArg, op, z
20240 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 29 3b  Db, zTbl, iKey);
20250 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
20260 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20  >iDb>=0 );.  }. 
20270 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
20280 63 6f 64 65 3a 20 44 65 6c 65 74 65 20 50 31 20  code: Delete P1 
20290 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  P2 * P4 *.**.** 
202a0 44 65 6c 65 74 65 20 74 68 65 20 72 65 63 6f 72  Delete the recor
202b0 64 20 61 74 20 77 68 69 63 68 20 74 68 65 20 50  d at which the P
202c0 31 20 63 75 72 73 6f 72 20 69 73 20 63 75 72 72  1 cursor is curr
202d0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
202e0 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  **.** The cursor
202f0 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f   will be left po
20300 69 6e 74 69 6e 67 20 61 74 20 65 69 74 68 65 72  inting at either
20310 20 74 68 65 20 6e 65 78 74 20 6f 72 20 74 68 65   the next or the
20320 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 72 65 63   previous.** rec
20330 6f 72 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ord in the table
20340 2e 20 49 66 20 69 74 20 69 73 20 6c 65 66 74 20  . If it is left 
20350 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
20360 6e 65 78 74 20 72 65 63 6f 72 64 2c 20 74 68 65  next record, the
20370 6e 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 4e 65  n.** the next Ne
20380 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  xt instruction w
20390 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20  ill be a no-op. 
203a0 20 48 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20   Hence it is OK 
203b0 74 6f 20 64 65 6c 65 74 65 0a 2a 2a 20 61 20 72  to delete.** a r
203c0 65 63 6f 72 64 20 66 72 6f 6d 20 77 69 74 68 69  ecord from withi
203d0 6e 20 61 6e 20 4e 65 78 74 20 6c 6f 6f 70 2e 0a  n an Next loop..
203e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46  **.** If the OPF
203f0 4c 41 47 5f 4e 43 48 41 4e 47 45 20 66 6c 61 67  LAG_NCHANGE flag
20400 20 6f 66 20 50 32 20 69 73 20 73 65 74 2c 20 74   of P2 is set, t
20410 68 65 6e 20 74 68 65 20 72 6f 77 20 63 68 61 6e  hen the row chan
20420 67 65 20 63 6f 75 6e 74 20 69 73 0a 2a 2a 20 69  ge count is.** i
20430 6e 63 72 65 6d 65 6e 74 65 64 20 28 6f 74 68 65  ncremented (othe
20440 72 77 69 73 65 20 6e 6f 74 29 2e 0a 2a 2a 0a 2a  rwise not)..**.*
20450 2a 20 50 31 20 6d 75 73 74 20 6e 6f 74 20 62 65  * P1 must not be
20460 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 20   pseudo-table.  
20470 49 74 20 68 61 73 20 74 6f 20 62 65 20 61 20 72  It has to be a r
20480 65 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 2a  eal table with.*
20490 2a 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 2e  * multiple rows.
204a0 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73 20  .**.** If P4 is 
204b0 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
204c0 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
204d0 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
204e0 50 31 20 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e  P1 is.** pointin
204f0 67 20 74 6f 2e 20 20 54 68 65 20 75 70 64 61 74  g to.  The updat
20500 65 20 68 6f 6f 6b 20 77 69 6c 6c 20 62 65 20 69  e hook will be i
20510 6e 76 6f 6b 65 64 2c 20 69 66 20 69 74 20 65 78  nvoked, if it ex
20520 69 73 74 73 2e 0a 2a 2a 20 49 66 20 50 34 20 69  ists..** If P4 i
20530 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
20540 74 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75  the P1 cursor mu
20550 73 74 20 68 61 76 65 20 62 65 65 6e 20 70 6f 73  st have been pos
20560 69 74 69 6f 6e 65 64 0a 2a 2a 20 75 73 69 6e 67  itioned.** using
20570 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 70 72 69   OP_NotFound pri
20580 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
20590 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63  his opcode..*/.c
205a0 61 73 65 20 4f 50 5f 44 65 6c 65 74 65 3a 20 7b  ase OP_Delete: {
205b0 0a 20 20 69 36 34 20 69 4b 65 79 3b 0a 20 20 56  .  i64 iKey;.  V
205c0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 0a  dbeCursor *pC;..
205d0 20 20 69 4b 65 79 20 3d 20 30 3b 0a 20 20 61 73    iKey = 0;.  as
205e0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
205f0 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
20600 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
20610 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
20620 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
20630 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
20640 20 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20   pC->pCursor!=0 
20650 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 76 61 6c 69  );  /* Only vali
20660 64 20 66 6f 72 20 72 65 61 6c 20 74 61 62 6c 65  d for real table
20670 73 2c 20 6e 6f 20 70 73 65 75 64 6f 74 61 62 6c  s, no pseudotabl
20680 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  es */..  /* If t
20690 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 77  he update-hook w
206a0 69 6c 6c 20 62 65 20 69 6e 76 6f 6b 65 64 2c 20  ill be invoked, 
206b0 73 65 74 20 69 4b 65 79 20 74 6f 20 74 68 65 20  set iKey to the 
206c0 72 6f 77 69 64 20 6f 66 20 74 68 65 0a 20 20 2a  rowid of the.  *
206d0 2a 20 72 6f 77 20 62 65 69 6e 67 20 64 65 6c 65  * row being dele
206e0 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ted..  */.  if( 
206f0 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  db->xUpdateCallb
20700 61 63 6b 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  ack && pOp->p4.z
20710 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
20720 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20  pC->isTable );. 
20730 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 72     assert( pC->r
20740 6f 77 69 64 49 73 56 61 6c 69 64 20 29 3b 20 20  owidIsValid );  
20750 2f 2a 20 6c 61 73 74 52 6f 77 69 64 20 73 65 74  /* lastRowid set
20760 20 62 79 20 70 72 65 76 69 6f 75 73 20 4f 50 5f   by previous OP_
20770 4e 6f 74 46 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  NotFound */.    
20780 69 4b 65 79 20 3d 20 70 43 2d 3e 6c 61 73 74 52  iKey = pC->lastR
20790 6f 77 69 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  owid;.  }..  /* 
207a0 54 68 65 20 4f 50 5f 44 65 6c 65 74 65 20 6f 70  The OP_Delete op
207b0 63 6f 64 65 20 61 6c 77 61 79 73 20 66 6f 6c 6c  code always foll
207c0 6f 77 73 20 61 6e 20 4f 50 5f 4e 6f 74 45 78 69  ows an OP_NotExi
207d0 73 74 73 20 6f 72 20 4f 50 5f 4c 61 73 74 20 6f  sts or OP_Last o
207e0 72 0a 20 20 2a 2a 20 4f 50 5f 43 6f 6c 75 6d 6e  r.  ** OP_Column
207f0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
20800 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 79 20 69  le without any i
20810 6e 74 65 72 76 65 6e 69 6e 67 20 6f 70 65 72 61  ntervening opera
20820 74 69 6f 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  tions that.  ** 
20830 6d 69 67 68 74 20 6d 6f 76 65 20 6f 72 20 69 6e  might move or in
20840 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 75 72  validate the cur
20850 73 6f 72 2e 20 20 48 65 6e 63 65 20 63 75 72 73  sor.  Hence curs
20860 6f 72 20 70 43 20 69 73 20 61 6c 77 61 79 73 20  or pC is always 
20870 70 6f 69 6e 74 69 6e 67 0a 20 20 2a 2a 20 74 6f  pointing.  ** to
20880 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65 20 64   the row to be d
20890 65 6c 65 74 65 64 20 61 6e 64 20 74 68 65 20 73  eleted and the s
208a0 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
208b0 4d 6f 76 65 74 6f 28 29 20 6f 70 65 72 61 74 69  Moveto() operati
208c0 6f 6e 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 69 73  on.  ** below is
208d0 20 61 6c 77 61 79 73 20 61 20 6e 6f 2d 6f 70 20   always a no-op 
208e0 61 6e 64 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  and cannot fail.
208f0 20 20 57 65 20 77 69 6c 6c 20 72 75 6e 20 69 74    We will run it
20900 20 61 6e 79 68 6f 77 2c 20 74 68 6f 75 67 68 2c   anyhow, though,
20910 0a 20 20 2a 2a 20 74 6f 20 67 75 61 72 64 20 61  .  ** to guard a
20920 67 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68  gainst future ch
20930 61 6e 67 65 73 20 74 6f 20 74 68 65 20 63 6f 64  anges to the cod
20940 65 20 67 65 6e 65 72 61 74 6f 72 2e 0a 20 20 2a  e generator..  *
20950 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  */.  assert( pC-
20960 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d  >deferredMoveto=
20970 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
20980 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
20990 76 65 74 6f 28 70 43 29 3b 0a 20 20 69 66 28 20  veto(pC);.  if( 
209a0 4e 45 56 45 52 28 72 63 21 3d 53 51 4c 49 54 45  NEVER(rc!=SQLITE
209b0 5f 4f 4b 29 20 29 20 67 6f 74 6f 20 61 62 6f 72  _OK) ) goto abor
209c0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
209d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  .  sqlite3BtreeS
209e0 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 70 43  etCachedRowid(pC
209f0 2d 3e 70 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20  ->pCursor, 0);. 
20a00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
20a10 65 65 44 65 6c 65 74 65 28 70 43 2d 3e 70 43 75  eeDelete(pC->pCu
20a20 72 73 6f 72 29 3b 0a 20 20 70 43 2d 3e 63 61 63  rsor);.  pC->cac
20a30 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
20a40 5f 53 54 41 4c 45 3b 0a 0a 20 20 2f 2a 20 49 6e  _STALE;..  /* In
20a50 76 6f 6b 65 20 74 68 65 20 75 70 64 61 74 65 2d  voke the update-
20a60 68 6f 6f 6b 20 69 66 20 72 65 71 75 69 72 65 64  hook if required
20a70 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
20a80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e  QLITE_OK && db->
20a90 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20  xUpdateCallback 
20aa0 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a  && pOp->p4.z ){.
20ab0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
20ac0 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 43  zDb = db->aDb[pC
20ad0 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->iDb].zName;.  
20ae0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
20af0 62 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  bl = pOp->p4.z;.
20b00 20 20 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43      db->xUpdateC
20b10 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 55 70 64  allback(db->pUpd
20b20 61 74 65 41 72 67 2c 20 53 51 4c 49 54 45 5f 44  ateArg, SQLITE_D
20b30 45 4c 45 54 45 2c 20 7a 44 62 2c 20 7a 54 62 6c  ELETE, zDb, zTbl
20b40 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 61 73 73  , iKey);.    ass
20b50 65 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20  ert( pC->iDb>=0 
20b60 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70  );.  }.  if( pOp
20b70 2d 3e 70 32 20 26 20 4f 50 46 4c 41 47 5f 4e 43  ->p2 & OPFLAG_NC
20b80 48 41 4e 47 45 20 29 20 70 2d 3e 6e 43 68 61 6e  HANGE ) p->nChan
20b90 67 65 2b 2b 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  ge++;.  break;.}
20ba0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 65  ./* Opcode: Rese
20bb0 74 43 6f 75 6e 74 20 2a 20 2a 20 2a 20 2a 20 2a  tCount * * * * *
20bc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
20bd0 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 20 63   of the change c
20be0 6f 75 6e 74 65 72 20 69 73 20 63 6f 70 69 65 64  ounter is copied
20bf0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
20c00 20 68 61 6e 64 6c 65 0a 2a 2a 20 63 68 61 6e 67   handle.** chang
20c10 65 20 63 6f 75 6e 74 65 72 20 28 72 65 74 75 72  e counter (retur
20c20 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
20c30 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
20c40 65 33 5f 63 68 61 6e 67 65 73 28 29 29 2e 0a 2a  e3_changes())..*
20c50 2a 20 54 68 65 6e 20 74 68 65 20 56 4d 73 20 69  * Then the VMs i
20c60 6e 74 65 72 6e 61 6c 20 63 68 61 6e 67 65 20 63  nternal change c
20c70 6f 75 6e 74 65 72 20 72 65 73 65 74 73 20 74 6f  ounter resets to
20c80 20 30 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 75   0..** This is u
20c90 73 65 64 20 62 79 20 74 72 69 67 67 65 72 20 70  sed by trigger p
20ca0 72 6f 67 72 61 6d 73 2e 0a 2a 2f 0a 63 61 73 65  rograms..*/.case
20cb0 20 4f 50 5f 52 65 73 65 74 43 6f 75 6e 74 3a 20   OP_ResetCount: 
20cc0 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  {.  sqlite3VdbeS
20cd0 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d  etChanges(db, p-
20ce0 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 70 2d 3e  >nChange);.  p->
20cf0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 62  nChange = 0;.  b
20d00 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
20d10 64 65 3a 20 52 6f 77 44 61 74 61 20 50 31 20 50  de: RowData P1 P
20d20 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72  2 * * *.**.** Wr
20d30 69 74 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65  ite into registe
20d40 72 20 50 32 20 74 68 65 20 63 6f 6d 70 6c 65 74  r P2 the complet
20d50 65 20 72 6f 77 20 64 61 74 61 20 66 6f 72 20 63  e row data for c
20d60 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 20 54 68 65  ursor P1..** The
20d70 72 65 20 69 73 20 6e 6f 20 69 6e 74 65 72 70 72  re is no interpr
20d80 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  etation of the d
20d90 61 74 61 2e 20 20 0a 2a 2a 20 49 74 20 69 73 20  ata.  .** It is 
20da0 6a 75 73 74 20 63 6f 70 69 65 64 20 6f 6e 74 6f  just copied onto
20db0 20 74 68 65 20 50 32 20 72 65 67 69 73 74 65 72   the P2 register
20dc0 20 65 78 61 63 74 6c 79 20 61 73 20 0a 2a 2a 20   exactly as .** 
20dd0 69 74 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  it is found in t
20de0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20df0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
20e00 31 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65  1 cursor must be
20e10 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76   pointing to a v
20e20 61 6c 69 64 20 72 6f 77 20 28 6e 6f 74 20 61 20  alid row (not a 
20e30 4e 55 4c 4c 20 72 6f 77 29 0a 2a 2a 20 6f 66 20  NULL row).** of 
20e40 61 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f  a real table, no
20e50 74 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  t a pseudo-table
20e60 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
20e70 52 6f 77 4b 65 79 20 50 31 20 50 32 20 2a 20 2a  RowKey P1 P2 * *
20e80 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69   *.**.** Write i
20e90 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 20  nto register P2 
20ea0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 6f 77  the complete row
20eb0 20 6b 65 79 20 66 6f 72 20 63 75 72 73 6f 72 20   key for cursor 
20ec0 50 31 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  P1..** There is 
20ed0 6e 6f 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f  no interpretatio
20ee0 6e 20 6f 66 20 74 68 65 20 64 61 74 61 2e 20 20  n of the data.  
20ef0 0a 2a 2a 20 54 68 65 20 6b 65 79 20 69 73 20 63  .** The key is c
20f00 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68 65 20 50  opied onto the P
20f10 33 20 72 65 67 69 73 74 65 72 20 65 78 61 63 74  3 register exact
20f20 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20 69 73 20  ly as .** it is 
20f30 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74  found in the dat
20f40 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
20f50 2a 20 49 66 20 74 68 65 20 50 31 20 63 75 72 73  * If the P1 curs
20f60 6f 72 20 6d 75 73 74 20 62 65 20 70 6f 69 6e 74  or must be point
20f70 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72  ing to a valid r
20f80 6f 77 20 28 6e 6f 74 20 61 20 4e 55 4c 4c 20 72  ow (not a NULL r
20f90 6f 77 29 0a 2a 2a 20 6f 66 20 61 20 72 65 61 6c  ow).** of a real
20fa0 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73   table, not a ps
20fb0 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 63  eudo-table..*/.c
20fc0 61 73 65 20 4f 50 5f 52 6f 77 4b 65 79 3a 0a 63  ase OP_RowKey:.c
20fd0 61 73 65 20 4f 50 5f 52 6f 77 44 61 74 61 3a 20  ase OP_RowData: 
20fe0 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
20ff0 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  pC;.  BtCursor *
21000 70 43 72 73 72 3b 0a 20 20 75 33 32 20 6e 3b 0a  pCrsr;.  u32 n;.
21010 20 20 69 36 34 20 6e 36 34 3b 0a 0a 20 20 70 4f    i64 n64;..  pO
21020 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
21030 70 32 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54  p2];.  memAboutT
21040 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29  oChange(p, pOut)
21050 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61  ;..  /* Note tha
21060 74 20 52 6f 77 4b 65 79 20 61 6e 64 20 52 6f 77  t RowKey and Row
21070 44 61 74 61 20 61 72 65 20 72 65 61 6c 6c 79 20  Data are really 
21080 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
21090 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
210a0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
210b0 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
210c0 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
210d0 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
210e0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
210f0 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 7c 7c  ( pC->isTable ||
21100 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
21110 5f 52 6f 77 4b 65 79 20 29 3b 0a 20 20 61 73 73  _RowKey );.  ass
21120 65 72 74 28 20 70 43 2d 3e 69 73 49 6e 64 65 78  ert( pC->isIndex
21130 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   || pOp->opcode=
21140 3d 4f 50 5f 52 6f 77 44 61 74 61 20 29 3b 0a 20  =OP_RowData );. 
21150 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
21160 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
21170 6e 75 6c 6c 52 6f 77 3d 3d 30 20 29 3b 0a 20 20  nullRow==0 );.  
21180 61 73 73 65 72 74 28 20 70 43 2d 3e 70 73 65 75  assert( pC->pseu
21190 64 6f 54 61 62 6c 65 52 65 67 3d 3d 30 20 29 3b  doTableReg==0 );
211a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70  .  assert( pC->p
211b0 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 70  Cursor!=0 );.  p
211c0 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73  Crsr = pC->pCurs
211d0 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  or;.  assert( sq
211e0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
211f0 49 73 56 61 6c 69 64 28 70 43 72 73 72 29 20 29  IsValid(pCrsr) )
21200 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 50 5f 52  ;..  /* The OP_R
21210 6f 77 4b 65 79 20 61 6e 64 20 4f 50 5f 52 6f 77  owKey and OP_Row
21220 44 61 74 61 20 6f 70 63 6f 64 65 73 20 61 6c 77  Data opcodes alw
21230 61 79 73 20 66 6f 6c 6c 6f 77 20 4f 50 5f 4e 6f  ays follow OP_No
21240 74 45 78 69 73 74 73 20 6f 72 0a 20 20 2a 2a 20  tExists or.  ** 
21250 4f 50 5f 52 65 77 69 6e 64 2f 4f 70 5f 4e 65 78  OP_Rewind/Op_Nex
21260 74 20 77 69 74 68 20 6e 6f 20 69 6e 74 65 72 76  t with no interv
21270 65 6e 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f  ening instructio
21280 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 69 6e  ns that might in
21290 76 61 6c 69 64 61 74 65 0a 20 20 2a 2a 20 74 68  validate.  ** th
212a0 65 20 63 75 72 73 6f 72 2e 20 20 48 65 6e 63 65  e cursor.  Hence
212b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
212c0 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
212d0 4d 6f 76 65 74 6f 28 29 20 63 61 6c 6c 20 69 73  Moveto() call is
212e0 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 61 20 6e   always.  ** a n
212f0 6f 2d 6f 70 20 61 6e 64 20 63 61 6e 20 6e 65 76  o-op and can nev
21300 65 72 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65  er fail.  But we
21310 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61   leave it in pla
21320 63 65 20 61 73 20 61 20 73 61 66 65 74 79 2e 0a  ce as a safety..
21330 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
21340 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
21350 6f 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  o==0 );.  rc = s
21360 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
21370 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 69 66  Moveto(pC);.  if
21380 28 20 4e 45 56 45 52 28 72 63 21 3d 53 51 4c 49  ( NEVER(rc!=SQLI
21390 54 45 5f 4f 4b 29 20 29 20 67 6f 74 6f 20 61 62  TE_OK) ) goto ab
213a0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
213b0 3b 0a 0a 20 20 69 66 28 20 70 43 2d 3e 69 73 49  ;..  if( pC->isI
213c0 6e 64 65 78 20 29 7b 0a 20 20 20 20 61 73 73 65  ndex ){.    asse
213d0 72 74 28 20 21 70 43 2d 3e 69 73 54 61 62 6c 65  rt( !pC->isTable
213e0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
213f0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
21400 28 70 43 72 73 72 2c 20 26 6e 36 34 29 3b 0a 20  (pCrsr, &n64);. 
21410 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
21420 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f  QLITE_OK );    /
21430 2a 20 54 72 75 65 20 62 65 63 61 75 73 65 20 6f  * True because o
21440 66 20 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29  f CursorMoveto()
21450 20 63 61 6c 6c 20 61 62 6f 76 65 20 2a 2f 0a 20   call above */. 
21460 20 20 20 69 66 28 20 6e 36 34 3e 64 62 2d 3e 61     if( n64>db->a
21470 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
21480 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
21490 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67      goto too_big
214a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
214b0 28 75 33 32 29 6e 36 34 3b 0a 20 20 7d 65 6c 73  (u32)n64;.  }els
214c0 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
214d0 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
214e0 28 70 43 72 73 72 2c 20 26 6e 29 3b 0a 20 20 20  (pCrsr, &n);.   
214f0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
21500 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20  ITE_OK );    /* 
21510 44 61 74 61 53 69 7a 65 28 29 20 63 61 6e 6e 6f  DataSize() canno
21520 74 20 66 61 69 6c 20 2a 2f 0a 20 20 20 20 69 66  t fail */.    if
21530 28 20 6e 3e 28 75 33 32 29 64 62 2d 3e 61 4c 69  ( n>(u32)db->aLi
21540 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
21550 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20  _LENGTH] ){.    
21560 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a    goto too_big;.
21570 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
21580 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72  sqlite3VdbeMemGr
21590 6f 77 28 70 4f 75 74 2c 20 6e 2c 20 30 29 20 29  ow(pOut, n, 0) )
215a0 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65  {.    goto no_me
215b0 6d 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 6e  m;.  }.  pOut->n
215c0 20 3d 20 6e 3b 0a 20 20 4d 65 6d 53 65 74 54 79   = n;.  MemSetTy
215d0 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d  peFlag(pOut, MEM
215e0 5f 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 70 43  _Blob);.  if( pC
215f0 2d 3e 69 73 49 6e 64 65 78 20 29 7b 0a 20 20 20  ->isIndex ){.   
21600 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
21610 65 65 4b 65 79 28 70 43 72 73 72 2c 20 30 2c 20  eeKey(pCrsr, 0, 
21620 6e 2c 20 70 4f 75 74 2d 3e 7a 29 3b 0a 20 20 7d  n, pOut->z);.  }
21630 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
21640 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28  qlite3BtreeData(
21650 70 43 72 73 72 2c 20 30 2c 20 6e 2c 20 70 4f 75  pCrsr, 0, n, pOu
21660 74 2d 3e 7a 29 3b 0a 20 20 7d 0a 20 20 70 4f 75  t->z);.  }.  pOu
21670 74 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  t->enc = SQLITE_
21680 55 54 46 38 3b 20 20 2f 2a 20 49 6e 20 63 61 73  UTF8;  /* In cas
21690 65 20 74 68 65 20 62 6c 6f 62 20 69 73 20 65 76  e the blob is ev
216a0 65 72 20 63 61 73 74 20 74 6f 20 74 65 78 74 20  er cast to text 
216b0 2a 2f 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  */.  UPDATE_MAX_
216c0 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a  BLOBSIZE(pOut);.
216d0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
216e0 70 63 6f 64 65 3a 20 52 6f 77 69 64 20 50 31 20  pcode: Rowid P1 
216f0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53  P2 * * *.**.** S
21700 74 6f 72 65 20 69 6e 20 72 65 67 69 73 74 65 72  tore in register
21710 20 50 32 20 61 6e 20 69 6e 74 65 67 65 72 20 77   P2 an integer w
21720 68 69 63 68 20 69 73 20 74 68 65 20 6b 65 79 20  hich is the key 
21730 6f 66 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  of the table ent
21740 72 79 20 74 68 61 74 0a 2a 2a 20 50 31 20 69 73  ry that.** P1 is
21750 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
21760 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 63 61   to..**.** P1 ca
21770 6e 20 62 65 20 65 69 74 68 65 72 20 61 6e 20 6f  n be either an o
21780 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
21790 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
217a0 2e 20 20 54 68 65 72 65 20 75 73 65 64 20 74 6f  .  There used to
217b0 0a 2a 2a 20 62 65 20 61 20 73 65 70 61 72 61 74  .** be a separat
217c0 65 20 4f 50 5f 56 52 6f 77 69 64 20 6f 70 63 6f  e OP_VRowid opco
217d0 64 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  de for use with 
217e0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20  virtual tables, 
217f0 62 75 74 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 20  but this.** one 
21800 6f 70 63 6f 64 65 20 6e 6f 77 20 77 6f 72 6b 73  opcode now works
21810 20 66 6f 72 20 62 6f 74 68 20 74 61 62 6c 65 20   for both table 
21820 74 79 70 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f  types..*/.case O
21830 50 5f 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20  P_Rowid: {      
21840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
21850 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f  t2-prerelease */
21860 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
21870 43 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 73 71  C;.  i64 v;.  sq
21880 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
21890 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  b;.  const sqlit
218a0 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
218b0 6c 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  le;..  assert( p
218c0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
218d0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
218e0 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
218f0 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
21900 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
21910 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70 73    assert( pC->ps
21920 65 75 64 6f 54 61 62 6c 65 52 65 67 3d 3d 30 20  eudoTableReg==0 
21930 29 3b 0a 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c  );.  if( pC->nul
21940 6c 52 6f 77 20 29 7b 0a 20 20 20 20 70 4f 75 74  lRow ){.    pOut
21950 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
21960 6c 6c 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ll;.    break;. 
21970 20 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 64   }else if( pC->d
21980 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
21990 0a 20 20 20 20 76 20 3d 20 70 43 2d 3e 6d 6f 76  .    v = pC->mov
219a0 65 74 6f 54 61 72 67 65 74 3b 0a 23 69 66 6e 64  etoTarget;.#ifnd
219b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
219c0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 7d 65  IRTUALTABLE.  }e
219d0 6c 73 65 20 69 66 28 20 70 43 2d 3e 70 56 74 61  lse if( pC->pVta
219e0 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 70  bCursor ){.    p
219f0 56 74 61 62 20 3d 20 70 43 2d 3e 70 56 74 61 62  Vtab = pC->pVtab
21a00 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20  Cursor->pVtab;. 
21a10 20 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74     pModule = pVt
21a20 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  ab->pModule;.   
21a30 20 61 73 73 65 72 74 28 20 70 4d 6f 64 75 6c 65   assert( pModule
21a40 2d 3e 78 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  ->xRowid );.    
21a50 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 52  rc = pModule->xR
21a60 6f 77 69 64 28 70 43 2d 3e 70 56 74 61 62 43 75  owid(pC->pVtabCu
21a70 72 73 6f 72 2c 20 26 76 29 3b 0a 20 20 20 20 69  rsor, &v);.    i
21a80 6d 70 6f 72 74 56 74 61 62 45 72 72 4d 73 67 28  mportVtabErrMsg(
21a90 70 2c 20 70 56 74 61 62 29 3b 0a 23 65 6e 64 69  p, pVtab);.#endi
21aa0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
21ab0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
21ac0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
21ad0 73 65 72 74 28 20 70 43 2d 3e 70 43 75 72 73 6f  sert( pC->pCurso
21ae0 72 21 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  r!=0 );.    rc =
21af0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
21b00 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20  orMoveto(pC);.  
21b10 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
21b20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
21b30 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e  or;.    if( pC->
21b40 72 6f 77 69 64 49 73 56 61 6c 69 64 20 29 7b 0a  rowidIsValid ){.
21b50 20 20 20 20 20 20 76 20 3d 20 70 43 2d 3e 6c 61        v = pC->la
21b60 73 74 52 6f 77 69 64 3b 0a 20 20 20 20 7d 65 6c  stRowid;.    }el
21b70 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
21b80 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
21b90 7a 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ze(pC->pCursor, 
21ba0 26 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  &v);.      asser
21bb0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
21bc0 20 29 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 73   );  /* Always s
21bd0 6f 20 62 65 63 61 75 73 65 20 6f 66 20 43 75 72  o because of Cur
21be0 73 6f 72 4d 6f 76 65 74 6f 28 29 20 61 62 6f 76  sorMoveto() abov
21bf0 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e */.    }.  }. 
21c00 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 3b 0a   pOut->u.i = v;.
21c10 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
21c20 70 63 6f 64 65 3a 20 4e 75 6c 6c 52 6f 77 20 50  pcode: NullRow P
21c30 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  1 * * * *.**.** 
21c40 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
21c50 50 31 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  P1 to a null row
21c60 2e 20 20 41 6e 79 20 4f 50 5f 43 6f 6c 75 6d 6e  .  Any OP_Column
21c70 20 6f 70 65 72 61 74 69 6f 6e 73 0a 2a 2a 20 74   operations.** t
21c80 68 61 74 20 6f 63 63 75 72 20 77 68 69 6c 65 20  hat occur while 
21c90 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 6e  the cursor is on
21ca0 20 74 68 65 20 6e 75 6c 6c 20 72 6f 77 20 77 69   the null row wi
21cb0 6c 6c 20 61 6c 77 61 79 73 0a 2a 2a 20 77 72 69  ll always.** wri
21cc0 74 65 20 61 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61  te a NULL..*/.ca
21cd0 73 65 20 4f 50 5f 4e 75 6c 6c 52 6f 77 3a 20 7b  se OP_NullRow: {
21ce0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
21cf0 43 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  C;..  assert( pO
21d00 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
21d10 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
21d20 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
21d30 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
21d40 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
21d50 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31   pC->nullRow = 1
21d60 3b 0a 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56  ;.  pC->rowidIsV
21d70 61 6c 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  alid = 0;.  if( 
21d80 70 43 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  pC->pCursor ){. 
21d90 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
21da0 6c 65 61 72 43 75 72 73 6f 72 28 70 43 2d 3e 70  learCursor(pC->p
21db0 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 62  Cursor);.  }.  b
21dc0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
21dd0 64 65 3a 20 4c 61 73 74 20 50 31 20 50 32 20 2a  de: Last P1 P2 *
21de0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e   * *.**.** The n
21df0 65 78 74 20 75 73 65 20 6f 66 20 74 68 65 20 52  ext use of the R
21e00 6f 77 69 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f  owid or Column o
21e10 72 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69  r Next instructi
21e20 6f 6e 20 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69  on for P1 .** wi
21e30 6c 6c 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  ll refer to the 
21e40 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
21e50 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  e database table
21e60 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66   or index..** If
21e70 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
21e80 64 65 78 20 69 73 20 65 6d 70 74 79 20 61 6e 64  dex is empty and
21e90 20 50 32 3e 30 2c 20 74 68 65 6e 20 6a 75 6d 70   P2>0, then jump
21ea0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
21eb0 50 32 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73 20  P2..** If P2 is 
21ec0 30 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  0 or if the tabl
21ed0 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20 6e 6f  e or index is no
21ee0 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68  t empty, fall th
21ef0 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20  rough.** to the 
21f00 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75  following instru
21f10 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ction..*/.case O
21f20 50 5f 4c 61 73 74 3a 20 7b 20 20 20 20 20 20 20  P_Last: {       
21f30 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64   /* jump */.  Vd
21f40 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
21f50 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
21f60 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61  .  int res;..  a
21f70 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
21f80 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
21f90 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
21fa0 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
21fb0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
21fc0 43 21 3d 30 20 29 3b 0a 20 20 70 43 72 73 72 20  C!=0 );.  pCrsr 
21fd0 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20  = pC->pCursor;. 
21fe0 20 69 66 28 20 70 43 72 73 72 3d 3d 30 20 29 7b   if( pCrsr==0 ){
21ff0 0a 20 20 20 20 72 65 73 20 3d 20 31 3b 0a 20 20  .    res = 1;.  
22000 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
22010 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
22020 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b 0a 20  (pCrsr, &res);. 
22030 20 7d 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77   }.  pC->nullRow
22040 20 3d 20 28 75 38 29 72 65 73 3b 0a 20 20 70 43   = (u8)res;.  pC
22050 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
22060 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 72 6f 77 69   = 0;.  pC->rowi
22070 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  dIsValid = 0;.  
22080 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
22090 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
220a0 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26   if( pOp->p2>0 &
220b0 26 20 72 65 73 20 29 7b 0a 20 20 20 20 70 63 20  & res ){.    pc 
220c0 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
220d0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a   }.  break;.}...
220e0 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 20  /* Opcode: Sort 
220f0 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
22100 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 64 6f  * This opcode do
22110 65 73 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  es exactly the s
22120 61 6d 65 20 74 68 69 6e 67 20 61 73 20 4f 50 5f  ame thing as OP_
22130 52 65 77 69 6e 64 20 65 78 63 65 70 74 20 74 68  Rewind except th
22140 61 74 0a 2a 2a 20 69 74 20 69 6e 63 72 65 6d 65  at.** it increme
22150 6e 74 73 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e  nts an undocumen
22160 74 65 64 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ted global varia
22170 62 6c 65 20 75 73 65 64 20 66 6f 72 20 74 65 73  ble used for tes
22180 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 53 6f 72 74  ting..**.** Sort
22190 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73  ing is accomplis
221a0 68 65 64 20 62 79 20 77 72 69 74 69 6e 67 20 72  hed by writing r
221b0 65 63 6f 72 64 73 20 69 6e 74 6f 20 61 20 73 6f  ecords into a so
221c0 72 74 69 6e 67 20 69 6e 64 65 78 2c 0a 2a 2a 20  rting index,.** 
221d0 74 68 65 6e 20 72 65 77 69 6e 64 69 6e 67 20 74  then rewinding t
221e0 68 61 74 20 69 6e 64 65 78 20 61 6e 64 20 70 6c  hat index and pl
221f0 61 79 69 6e 67 20 69 74 20 62 61 63 6b 20 66 72  aying it back fr
22200 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a  om beginning to.
22210 2a 2a 20 65 6e 64 2e 20 20 57 65 20 75 73 65 20  ** end.  We use 
22220 74 68 65 20 4f 50 5f 53 6f 72 74 20 6f 70 63 6f  the OP_Sort opco
22230 64 65 20 69 6e 73 74 65 61 64 20 6f 66 20 4f 50  de instead of OP
22240 5f 52 65 77 69 6e 64 20 74 6f 20 64 6f 20 74 68  _Rewind to do th
22250 65 0a 2a 2a 20 72 65 77 69 6e 64 69 6e 67 20 73  e.** rewinding s
22260 6f 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  o that the globa
22270 6c 20 76 61 72 69 61 62 6c 65 20 77 69 6c 6c 20  l variable will 
22280 62 65 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 61  be incremented a
22290 6e 64 0a 2a 2a 20 72 65 67 72 65 73 73 69 6f 6e  nd.** regression
222a0 20 74 65 73 74 73 20 63 61 6e 20 64 65 74 65 72   tests can deter
222b0 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
222c0 6e 6f 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65  not the optimize
222d0 72 20 69 73 0a 2a 2a 20 63 6f 72 72 65 63 74 6c  r is.** correctl
222e0 79 20 6f 70 74 69 6d 69 7a 69 6e 67 20 6f 75 74  y optimizing out
222f0 20 73 6f 72 74 73 2e 0a 2a 2f 0a 63 61 73 65 20   sorts..*/.case 
22300 4f 50 5f 53 6f 72 74 3a 20 7b 20 20 20 20 20 20  OP_Sort: {      
22310 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 23 69 66    /* jump */.#if
22320 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
22330 20 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63    sqlite3_sort_c
22340 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  ount++;.  sqlite
22350 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2d 2d  3_search_count--
22360 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 61 43  ;.#endif.  p->aC
22370 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53 54  ounter[SQLITE_ST
22380 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2d 31 5d  MTSTATUS_SORT-1]
22390 2b 2b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68  ++;.  /* Fall th
223a0 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 52 65  rough into OP_Re
223b0 77 69 6e 64 20 2a 2f 0a 7d 0a 2f 2a 20 4f 70 63  wind */.}./* Opc
223c0 6f 64 65 3a 20 52 65 77 69 6e 64 20 50 31 20 50  ode: Rewind P1 P
223d0 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68  2 * * *.**.** Th
223e0 65 20 6e 65 78 74 20 75 73 65 20 6f 66 20 74 68  e next use of th
223f0 65 20 52 6f 77 69 64 20 6f 72 20 43 6f 6c 75 6d  e Rowid or Colum
22400 6e 20 6f 72 20 4e 65 78 74 20 69 6e 73 74 72 75  n or Next instru
22410 63 74 69 6f 6e 20 66 6f 72 20 50 31 20 0a 2a 2a  ction for P1 .**
22420 20 77 69 6c 6c 20 72 65 66 65 72 20 74 6f 20 74   will refer to t
22430 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
22440 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  n the database t
22450 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a  able or index..*
22460 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6f  * If the table o
22470 72 20 69 6e 64 65 78 20 69 73 20 65 6d 70 74 79  r index is empty
22480 20 61 6e 64 20 50 32 3e 30 2c 20 74 68 65 6e 20   and P2>0, then 
22490 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
224a0 20 74 6f 20 50 32 2e 0a 2a 2a 20 49 66 20 50 32   to P2..** If P2
224b0 20 69 73 20 30 20 6f 72 20 69 66 20 74 68 65 20   is 0 or if the 
224c0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
224d0 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61 6c  s not empty, fal
224e0 6c 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20  l through.** to 
224f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e  the following in
22500 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  struction..*/.ca
22510 73 65 20 4f 50 5f 52 65 77 69 6e 64 3a 20 7b 20  se OP_Rewind: { 
22520 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
22530 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
22540 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  pC;.  BtCursor *
22550 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73  pCrsr;.  int res
22560 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
22570 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
22580 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
22590 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
225a0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
225b0 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
225c0 72 65 73 20 3d 20 31 3b 0a 20 20 69 66 28 20 28  res = 1;.  if( (
225d0 70 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72  pCrsr = pC->pCur
225e0 73 6f 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  sor)!=0 ){.    r
225f0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
22600 46 69 72 73 74 28 70 43 72 73 72 2c 20 26 72 65  First(pCrsr, &re
22610 73 29 3b 0a 20 20 20 20 70 43 2d 3e 61 74 46 69  s);.    pC->atFi
22620 72 73 74 20 3d 20 72 65 73 3d 3d 30 20 3f 31 3a  rst = res==0 ?1:
22630 30 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72  0;.    pC->defer
22640 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
22650 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74     pC->cacheStat
22660 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
22670 3b 0a 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49  ;.    pC->rowidI
22680 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a  sValid = 0;.  }.
22690 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20    pC->nullRow = 
226a0 28 75 38 29 72 65 73 3b 0a 20 20 61 73 73 65 72  (u8)res;.  asser
226b0 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20  t( pOp->p2>0 && 
226c0 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29  pOp->p2<p->nOp )
226d0 3b 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20  ;.  if( res ){. 
226e0 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
226f0 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  - 1;.  }.  break
22700 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
22710 4e 65 78 74 20 50 31 20 50 32 20 2a 20 2a 20 50  Next P1 P2 * * P
22720 35 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  5.**.** Advance 
22730 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61  cursor P1 so tha
22740 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
22750 68 65 20 6e 65 78 74 20 6b 65 79 2f 64 61 74 61  he next key/data
22760 20 70 61 69 72 20 69 6e 20 69 74 73 0a 2a 2a 20   pair in its.** 
22770 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20  table or index. 
22780 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
22790 20 6d 6f 72 65 20 6b 65 79 2f 76 61 6c 75 65 20   more key/value 
227a0 70 61 69 72 73 20 74 68 65 6e 20 66 61 6c 6c 20  pairs then fall 
227b0 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68  through.** to th
227c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74  e following inst
227d0 72 75 63 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  ruction.  But if
227e0 20 74 68 65 20 63 75 72 73 6f 72 20 61 64 76 61   the cursor adva
227f0 6e 63 65 20 77 61 73 20 73 75 63 63 65 73 73 66  nce was successf
22800 75 6c 2c 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65  ul,.** jump imme
22810 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a  diately to P2..*
22820 2a 0a 2a 2a 20 54 68 65 20 50 31 20 63 75 72 73  *.** The P1 curs
22830 6f 72 20 6d 75 73 74 20 62 65 20 66 6f 72 20 61  or must be for a
22840 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74   real table, not
22850 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e   a pseudo-table.
22860 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20  .**.** If P5 is 
22870 70 6f 73 69 74 69 76 65 20 61 6e 64 20 74 68 65  positive and the
22880 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20   jump is taken, 
22890 74 68 65 6e 20 65 76 65 6e 74 20 63 6f 75 6e 74  then event count
228a0 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 35 2d  er.** number P5-
228b0 31 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  1 in the prepare
228c0 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 69  d statement is i
228d0 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a  ncremented..**.*
228e0 2a 20 53 65 65 20 61 6c 73 6f 3a 20 50 72 65 76  * See also: Prev
228f0 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50  .*/./* Opcode: P
22900 72 65 76 20 50 31 20 50 32 20 2a 20 2a 20 50 35  rev P1 P2 * * P5
22910 0a 2a 2a 0a 2a 2a 20 42 61 63 6b 20 75 70 20 63  .**.** Back up c
22920 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
22930 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
22940 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2f 64  e previous key/d
22950 61 74 61 20 70 61 69 72 20 69 6e 20 69 74 73 0a  ata pair in its.
22960 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ** table or inde
22970 78 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  x.  If there is 
22980 6e 6f 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2f  no previous key/
22990 76 61 6c 75 65 20 70 61 69 72 73 20 74 68 65 6e  value pairs then
229a0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a   fall through.**
229b0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
229c0 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  g instruction.  
229d0 42 75 74 20 69 66 20 74 68 65 20 63 75 72 73 6f  But if the curso
229e0 72 20 62 61 63 6b 75 70 20 77 61 73 20 73 75 63  r backup was suc
229f0 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 6a 75 6d 70  cessful,.** jump
22a00 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
22a10 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 31  P2..**.** The P1
22a20 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 20   cursor must be 
22a30 66 6f 72 20 61 20 72 65 61 6c 20 74 61 62 6c 65  for a real table
22a40 2c 20 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d 74  , not a pseudo-t
22a50 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  able..**.** If P
22a60 35 20 69 73 20 70 6f 73 69 74 69 76 65 20 61 6e  5 is positive an
22a70 64 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61  d the jump is ta
22a80 6b 65 6e 2c 20 74 68 65 6e 20 65 76 65 6e 74 20  ken, then event 
22a90 63 6f 75 6e 74 65 72 0a 2a 2a 20 6e 75 6d 62 65  counter.** numbe
22aa0 72 20 50 35 2d 31 20 69 6e 20 74 68 65 20 70 72  r P5-1 in the pr
22ab0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
22ac0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e   is incremented.
22ad0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 72 65 76  .*/.case OP_Prev
22ae0 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  :          /* ju
22af0 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65  mp */.case OP_Ne
22b00 78 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  xt: {        /* 
22b10 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43 75  jump */.  VdbeCu
22b20 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75  rsor *pC;.  BtCu
22b30 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 69  rsor *pCrsr;.  i
22b40 6e 74 20 72 65 73 3b 0a 0a 20 20 43 48 45 43 4b  nt res;..  CHECK
22b50 5f 46 4f 52 5f 49 4e 54 45 52 52 55 50 54 3b 0a  _FOR_INTERRUPT;.
22b60 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
22b70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
22b80 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
22b90 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c  assert( pOp->p5<
22ba0 3d 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 43  =ArraySize(p->aC
22bb0 6f 75 6e 74 65 72 29 20 29 3b 0a 20 20 70 43 20  ounter) );.  pC 
22bc0 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
22bd0 70 31 5d 3b 0a 20 20 69 66 28 20 70 43 3d 3d 30  p1];.  if( pC==0
22be0 20 29 7b 0a 20 20 20 20 62 72 65 61 6b 3b 20 20   ){.    break;  
22bf0 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20 23 32  /* See ticket #2
22c00 32 37 33 20 2a 2f 0a 20 20 7d 0a 20 20 70 43 72  273 */.  }.  pCr
22c10 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72  sr = pC->pCursor
22c20 3b 0a 20 20 69 66 28 20 70 43 72 73 72 3d 3d 30  ;.  if( pCrsr==0
22c30 20 29 7b 0a 20 20 20 20 70 43 2d 3e 6e 75 6c 6c   ){.    pC->null
22c40 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 62 72 65  Row = 1;.    bre
22c50 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 73 20 3d 20  ak;.  }.  res = 
22c60 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  1;.  assert( pC-
22c70 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d  >deferredMoveto=
22c80 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 70 4f 70  =0 );.  rc = pOp
22c90 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 78  ->opcode==OP_Nex
22ca0 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65  t ? sqlite3Btree
22cb0 4e 65 78 74 28 70 43 72 73 72 2c 20 26 72 65 73  Next(pCrsr, &res
22cc0 29 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) :.            
22cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ce0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72    sqlite3BtreePr
22cf0 65 76 69 6f 75 73 28 70 43 72 73 72 2c 20 26 72  evious(pCrsr, &r
22d00 65 73 29 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52  es);.  pC->nullR
22d10 6f 77 20 3d 20 28 75 38 29 72 65 73 3b 0a 20 20  ow = (u8)res;.  
22d20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
22d30 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
22d40 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
22d50 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
22d60 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  - 1;.    if( pOp
22d70 2d 3e 70 35 20 29 20 70 2d 3e 61 43 6f 75 6e 74  ->p5 ) p->aCount
22d80 65 72 5b 70 4f 70 2d 3e 70 35 2d 31 5d 2b 2b 3b  er[pOp->p5-1]++;
22d90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
22da0 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
22db0 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
22dc0 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 43 2d  #endif.  }.  pC-
22dd0 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20  >rowidIsValid = 
22de0 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  0;.  break;.}../
22df0 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 49 6e 73  * Opcode: IdxIns
22e00 65 72 74 20 50 31 20 50 32 20 50 33 20 2a 20 50  ert P1 P2 P3 * P
22e10 35 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  5.**.** Register
22e20 20 50 32 20 68 6f 6c 64 73 20 61 20 53 51 4c 20   P2 holds a SQL 
22e30 69 6e 64 65 78 20 6b 65 79 20 6d 61 64 65 20 75  index key made u
22e40 73 69 6e 67 20 74 68 65 0a 2a 2a 20 4d 61 6b 65  sing the.** Make
22e50 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69  Record instructi
22e60 6f 6e 73 2e 20 20 54 68 69 73 20 6f 70 63 6f 64  ons.  This opcod
22e70 65 20 77 72 69 74 65 73 20 74 68 61 74 20 6b 65  e writes that ke
22e80 79 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 69 6e  y.** into the in
22e90 64 65 78 20 50 31 2e 20 20 44 61 74 61 20 66 6f  dex P1.  Data fo
22ea0 72 20 74 68 65 20 65 6e 74 72 79 20 69 73 20 6e  r the entry is n
22eb0 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 33 20 69 73 20  il..**.** P3 is 
22ec0 61 20 66 6c 61 67 20 74 68 61 74 20 70 72 6f 76  a flag that prov
22ed0 69 64 65 73 20 61 20 68 69 6e 74 20 74 6f 20 74  ides a hint to t
22ee0 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20  he b-tree layer 
22ef0 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 69 6e 73  that this.** ins
22f00 65 72 74 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f  ert is likely to
22f10 20 62 65 20 61 6e 20 61 70 70 65 6e 64 2e 0a 2a   be an append..*
22f20 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75  *.** This instru
22f30 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73  ction only works
22f40 20 66 6f 72 20 69 6e 64 69 63 65 73 2e 20 20 54   for indices.  T
22f50 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e  he equivalent in
22f60 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72  struction.** for
22f70 20 74 61 62 6c 65 73 20 69 73 20 4f 50 5f 49 6e   tables is OP_In
22f80 73 65 72 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  sert..*/.case OP
22f90 5f 49 64 78 49 6e 73 65 72 74 3a 20 7b 20 20 20  _IdxInsert: {   
22fa0 20 20 20 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20       /* in2 */. 
22fb0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
22fc0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72  .  BtCursor *pCr
22fd0 73 72 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a  sr;.  int nKey;.
22fe0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b    const char *zK
22ff0 65 79 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ey;..  assert( p
23000 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
23010 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
23020 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
23030 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
23040 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
23050 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70    pIn2 = &aMem[p
23060 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72  Op->p2];.  asser
23070 74 28 20 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26  t( pIn2->flags &
23080 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 70   MEM_Blob );.  p
23090 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73  Crsr = pC->pCurs
230a0 6f 72 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  or;.  if( ALWAYS
230b0 28 70 43 72 73 72 21 3d 30 29 20 29 7b 0a 20 20  (pCrsr!=0) ){.  
230c0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73    assert( pC->is
230d0 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
230e0 72 63 20 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28  rc = ExpandBlob(
230f0 70 49 6e 32 29 3b 0a 20 20 20 20 69 66 28 20 72  pIn2);.    if( r
23100 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23110 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 49 6e        nKey = pIn
23120 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 4b 65 79  2->n;.      zKey
23130 20 3d 20 70 49 6e 32 2d 3e 7a 3b 0a 20 20 20 20   = pIn2->z;.    
23140 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
23150 72 65 65 49 6e 73 65 72 74 28 70 43 72 73 72 2c  reeInsert(pCrsr,
23160 20 7a 4b 65 79 2c 20 6e 4b 65 79 2c 20 22 22 2c   zKey, nKey, "",
23170 20 30 2c 20 30 2c 20 70 4f 70 2d 3e 70 33 2c 20   0, 0, pOp->p3, 
23180 0a 20 20 20 20 20 20 20 20 20 20 28 28 70 4f 70  .          ((pOp
23190 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 55 53  ->p5 & OPFLAG_US
231a0 45 53 45 45 4b 52 45 53 55 4c 54 29 20 3f 20 70  ESEEKRESULT) ? p
231b0 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3a 20  C->seekResult : 
231c0 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  0).      );.    
231d0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65    assert( pC->de
231e0 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20  ferredMoveto==0 
231f0 29 3b 0a 20 20 20 20 20 20 70 43 2d 3e 63 61 63  );.      pC->cac
23200 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
23210 5f 53 54 41 4c 45 3b 0a 20 20 20 20 7d 0a 20 20  _STALE;.    }.  
23220 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
23230 20 4f 70 63 6f 64 65 3a 20 49 64 78 44 65 6c 65   Opcode: IdxDele
23240 74 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  te P1 P2 P3 * *.
23250 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  **.** The conten
23260 74 20 6f 66 20 50 33 20 72 65 67 69 73 74 65 72  t of P3 register
23270 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65  s starting at re
23280 67 69 73 74 65 72 20 50 32 20 66 6f 72 6d 0a 2a  gister P2 form.*
23290 2a 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e  * an unpacked in
232a0 64 65 78 20 6b 65 79 2e 20 54 68 69 73 20 6f 70  dex key. This op
232b0 63 6f 64 65 20 72 65 6d 6f 76 65 73 20 74 68 61  code removes tha
232c0 74 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  t entry from the
232d0 20 0a 2a 2a 20 69 6e 64 65 78 20 6f 70 65 6e 65   .** index opene
232e0 64 20 62 79 20 63 75 72 73 6f 72 20 50 31 2e 0a  d by cursor P1..
232f0 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 44 65  */.case OP_IdxDe
23300 6c 65 74 65 3a 20 7b 0a 20 20 56 64 62 65 43 75  lete: {.  VdbeCu
23310 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75  rsor *pC;.  BtCu
23320 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 69  rsor *pCrsr;.  i
23330 6e 74 20 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b  nt res;.  Unpack
23340 65 64 52 65 63 6f 72 64 20 72 3b 0a 0a 20 20 61  edRecord r;..  a
23350 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30  ssert( pOp->p3>0
23360 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
23370 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e  p->p2>0 && pOp->
23380 70 32 2b 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e  p2+pOp->p3<=p->n
23390 4d 65 6d 2b 31 20 29 3b 0a 20 20 61 73 73 65 72  Mem+1 );.  asser
233a0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
233b0 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
233c0 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
233d0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
233e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
233f0 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43   );.  pCrsr = pC
23400 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  ->pCursor;.  if(
23410 20 41 4c 57 41 59 53 28 70 43 72 73 72 21 3d 30   ALWAYS(pCrsr!=0
23420 29 20 29 7b 0a 20 20 20 20 72 2e 70 4b 65 79 49  ) ){.    r.pKeyI
23430 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e  nfo = pC->pKeyIn
23440 66 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64  fo;.    r.nField
23450 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 33 3b   = (u16)pOp->p3;
23460 0a 20 20 20 20 72 2e 66 6c 61 67 73 20 3d 20 30  .    r.flags = 0
23470 3b 0a 20 20 20 20 72 2e 61 4d 65 6d 20 3d 20 26  ;.    r.aMem = &
23480 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 23  aMem[pOp->p2];.#
23490 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
234a0 55 47 0a 20 20 20 20 7b 20 69 6e 74 20 69 3b 20  UG.    { int i; 
234b0 66 6f 72 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 69  for(i=0; i<r.nFi
234c0 65 6c 64 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  eld; i++) assert
234d0 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 72 2e  ( memIsValid(&r.
234e0 61 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23 65  aMem[i]) ); }.#e
234f0 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
23500 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
23510 55 6e 70 61 63 6b 65 64 28 70 43 72 73 72 2c 20  Unpacked(pCrsr, 
23520 26 72 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b  &r, 0, 0, &res);
23530 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23540 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 3d 3d 30  ITE_OK && res==0
23550 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
23560 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
23570 65 28 70 43 72 73 72 29 3b 0a 20 20 20 20 7d 0a  e(pCrsr);.    }.
23580 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
23590 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d  deferredMoveto==
235a0 30 20 29 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63  0 );.    pC->cac
235b0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
235c0 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 62 72  _STALE;.  }.  br
235d0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
235e0 65 3a 20 49 64 78 52 6f 77 69 64 20 50 31 20 50  e: IdxRowid P1 P
235f0 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72  2 * * *.**.** Wr
23600 69 74 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65  ite into registe
23610 72 20 50 32 20 61 6e 20 69 6e 74 65 67 65 72 20  r P2 an integer 
23620 77 68 69 63 68 20 69 73 20 74 68 65 20 6c 61 73  which is the las
23630 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72  t entry in the r
23640 65 63 6f 72 64 20 61 74 0a 2a 2a 20 74 68 65 20  ecord at.** the 
23650 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
23660 20 6b 65 79 20 70 6f 69 6e 74 65 64 20 74 6f 20   key pointed to 
23670 62 79 20 63 75 72 73 6f 72 20 50 31 2e 20 20 54  by cursor P1.  T
23680 68 69 73 20 69 6e 74 65 67 65 72 20 73 68 6f 75  his integer shou
23690 6c 64 20 62 65 0a 2a 2a 20 74 68 65 20 72 6f 77  ld be.** the row
236a0 69 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  id of the table 
236b0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
236c0 68 69 73 20 69 6e 64 65 78 20 65 6e 74 72 79 20  his index entry 
236d0 70 6f 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 53 65  points..**.** Se
236e0 65 20 61 6c 73 6f 3a 20 52 6f 77 69 64 2c 20 4d  e also: Rowid, M
236f0 61 6b 65 52 65 63 6f 72 64 2e 0a 2a 2f 0a 63 61  akeRecord..*/.ca
23700 73 65 20 4f 50 5f 49 64 78 52 6f 77 69 64 3a 20  se OP_IdxRowid: 
23710 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  {              /
23720 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73  * out2-prereleas
23730 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  e */.  BtCursor 
23740 2a 70 43 72 73 72 3b 0a 20 20 56 64 62 65 43 75  *pCrsr;.  VdbeCu
23750 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 36 34 20  rsor *pC;.  i64 
23760 72 6f 77 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  rowid;..  assert
23770 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
23780 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
23790 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
237a0 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
237b0 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
237c0 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d  );.  pCrsr = pC-
237d0 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 4f 75 74  >pCursor;.  pOut
237e0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
237f0 6c 6c 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  ll;.  if( ALWAYS
23800 28 70 43 72 73 72 21 3d 30 29 20 29 7b 0a 20 20  (pCrsr!=0) ){.  
23810 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
23820 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70  beCursorMoveto(p
23830 43 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  C);.    if( NEVE
23840 52 28 72 63 29 20 29 20 67 6f 74 6f 20 61 62 6f  R(rc) ) goto abo
23850 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
23860 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
23870 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d  >deferredMoveto=
23880 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
23890 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30  ( pC->isTable==0
238a0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 2d   );.    if( !pC-
238b0 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20  >nullRow ){.    
238c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
238d0 62 65 49 64 78 52 6f 77 69 64 28 64 62 2c 20 70  beIdxRowid(db, p
238e0 43 72 73 72 2c 20 26 72 6f 77 69 64 29 3b 0a 20  Crsr, &rowid);. 
238f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
23900 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23910 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
23920 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
23930 20 7d 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 75   }.      pOut->u
23940 2e 69 20 3d 20 72 6f 77 69 64 3b 0a 20 20 20 20  .i = rowid;.    
23950 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
23960 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 7d 0a 20  MEM_Int;.    }. 
23970 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
23980 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 47 45 20  * Opcode: IdxGE 
23990 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
239a0 2a 0a 2a 2a 20 54 68 65 20 50 34 20 72 65 67 69  *.** The P4 regi
239b0 73 74 65 72 20 76 61 6c 75 65 73 20 62 65 67 69  ster values begi
239c0 6e 6e 69 6e 67 20 77 69 74 68 20 50 33 20 66 6f  nning with P3 fo
239d0 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69  rm an unpacked i
239e0 6e 64 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61  ndex .** key tha
239f0 74 20 6f 6d 69 74 73 20 74 68 65 20 52 4f 57 49  t omits the ROWI
23a00 44 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 69 73  D.  Compare this
23a10 20 6b 65 79 20 76 61 6c 75 65 20 61 67 61 69 6e   key value again
23a20 73 74 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  st the index .**
23a30 20 74 68 61 74 20 50 31 20 69 73 20 63 75 72 72   that P1 is curr
23a40 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
23a50 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 20  o, ignoring the 
23a60 52 4f 57 49 44 20 6f 6e 20 74 68 65 20 50 31 20  ROWID on the P1 
23a70 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  index..**.** If 
23a80 74 68 65 20 50 31 20 69 6e 64 65 78 20 65 6e 74  the P1 index ent
23a90 72 79 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ry is greater th
23aa0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
23ab0 68 65 20 6b 65 79 20 76 61 6c 75 65 0a 2a 2a 20  he key value.** 
23ac0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e  then jump to P2.
23ad0 20 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c    Otherwise fall
23ae0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
23af0 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
23b00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73  ..**.** If P5 is
23b10 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74   non-zero then t
23b20 68 65 20 6b 65 79 20 76 61 6c 75 65 20 69 73 20  he key value is 
23b30 69 6e 63 72 65 61 73 65 64 20 62 79 20 61 6e 20  increased by an 
23b40 65 70 73 69 6c 6f 6e 20 0a 2a 2a 20 70 72 69 6f  epsilon .** prio
23b50 72 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  r to the compari
23b60 73 6f 6e 2e 20 20 54 68 69 73 20 6d 61 6b 65 20  son.  This make 
23b70 74 68 65 20 6f 70 63 6f 64 65 20 77 6f 72 6b 20  the opcode work 
23b80 6c 69 6b 65 20 49 64 78 47 54 20 65 78 63 65 70  like IdxGT excep
23b90 74 0a 2a 2a 20 74 68 61 74 20 69 66 20 74 68 65  t.** that if the
23ba0 20 6b 65 79 20 66 72 6f 6d 20 72 65 67 69 73 74   key from regist
23bb0 65 72 20 50 33 20 69 73 20 61 20 70 72 65 66 69  er P3 is a prefi
23bc0 78 20 6f 66 20 74 68 65 20 6b 65 79 20 69 6e 20  x of the key in 
23bd0 74 68 65 20 63 75 72 73 6f 72 2c 0a 2a 2a 20 74  the cursor,.** t
23be0 68 65 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c  he result is fal
23bf0 73 65 20 77 68 65 72 65 61 73 20 69 74 20 77 6f  se whereas it wo
23c00 75 6c 64 20 62 65 20 74 72 75 65 20 77 69 74 68  uld be true with
23c10 20 49 64 78 47 54 2e 0a 2a 2f 0a 2f 2a 20 4f 70   IdxGT..*/./* Op
23c20 63 6f 64 65 3a 20 49 64 78 4c 54 20 50 31 20 50  code: IdxLT P1 P
23c30 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
23c40 20 54 68 65 20 50 34 20 72 65 67 69 73 74 65 72   The P4 register
23c50 20 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e   values beginnin
23c60 67 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20 61  g with P3 form a
23c70 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  n unpacked index
23c80 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d   .** key that om
23c90 69 74 73 20 74 68 65 20 52 4f 57 49 44 2e 20 20  its the ROWID.  
23ca0 43 6f 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79  Compare this key
23cb0 20 76 61 6c 75 65 20 61 67 61 69 6e 73 74 20 74   value against t
23cc0 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 74 68 61  he index .** tha
23cd0 74 20 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c  t P1 is currentl
23ce0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69  y pointing to, i
23cf0 67 6e 6f 72 69 6e 67 20 74 68 65 20 52 4f 57 49  gnoring the ROWI
23d00 44 20 6f 6e 20 74 68 65 20 50 31 20 69 6e 64 65  D on the P1 inde
23d10 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  x..**.** If the 
23d20 50 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69  P1 index entry i
23d30 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
23d40 6b 65 79 20 76 61 6c 75 65 20 74 68 65 6e 20 6a  key value then j
23d50 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 20 4f 74  ump to P2..** Ot
23d60 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68 72  herwise fall thr
23d70 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
23d80 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
23d90 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 6e  .** If P5 is non
23da0 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 65 20 6b  -zero then the k
23db0 65 79 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72  ey value is incr
23dc0 65 61 73 65 64 20 62 79 20 61 6e 20 65 70 73 69  eased by an epsi
23dd0 6c 6f 6e 20 70 72 69 6f 72 20 0a 2a 2a 20 74 6f  lon prior .** to
23de0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
23df0 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65    This makes the
23e00 20 6f 70 63 6f 64 65 20 77 6f 72 6b 20 6c 69 6b   opcode work lik
23e10 65 20 49 64 78 4c 45 2e 0a 2a 2f 0a 63 61 73 65  e IdxLE..*/.case
23e20 20 4f 50 5f 49 64 78 4c 54 3a 20 20 20 20 20 20   OP_IdxLT:      
23e30 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63      /* jump */.c
23e40 61 73 65 20 4f 50 5f 49 64 78 47 45 3a 20 7b 20  ase OP_IdxGE: { 
23e50 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
23e60 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
23e70 70 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  pC;.  int res;. 
23e80 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
23e90 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  r;..  assert( pO
23ea0 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
23eb0 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
23ec0 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
23ed0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
23ee0 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
23ef0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 4f   assert( pC->isO
23f00 72 64 65 72 65 64 20 29 3b 0a 20 20 69 66 28 20  rdered );.  if( 
23f10 41 4c 57 41 59 53 28 70 43 2d 3e 70 43 75 72 73  ALWAYS(pC->pCurs
23f20 6f 72 21 3d 30 29 20 29 7b 0a 20 20 20 20 61 73  or!=0) ){.    as
23f30 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72  sert( pC->deferr
23f40 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20  edMoveto==0 );. 
23f50 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
23f60 70 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 35  p5==0 || pOp->p5
23f70 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
23f80 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
23f90 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 20 20  P4_INT32 );.    
23fa0 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d  r.pKeyInfo = pC-
23fb0 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 72  >pKeyInfo;.    r
23fc0 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 70  .nField = (u16)p
23fd0 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 69 66  Op->p4.i;.    if
23fe0 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20  ( pOp->p5 ){.   
23ff0 20 20 20 72 2e 66 6c 61 67 73 20 3d 20 55 4e 50     r.flags = UNP
24000 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 7c 20  ACKED_INCRKEY | 
24010 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f  UNPACKED_IGNORE_
24020 52 4f 57 49 44 3b 0a 20 20 20 20 7d 65 6c 73 65  ROWID;.    }else
24030 7b 0a 20 20 20 20 20 20 72 2e 66 6c 61 67 73 20  {.      r.flags 
24040 3d 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52  = UNPACKED_IGNOR
24050 45 5f 52 4f 57 49 44 3b 0a 20 20 20 20 7d 0a 20  E_ROWID;.    }. 
24060 20 20 20 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65     r.aMem = &aMe
24070 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 23 69 66 64  m[pOp->p3];.#ifd
24080 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
24090 20 20 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72      { int i; for
240a0 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64  (i=0; i<r.nField
240b0 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 6d  ; i++) assert( m
240c0 65 6d 49 73 56 61 6c 69 64 28 26 72 2e 61 4d 65  emIsValid(&r.aMe
240d0 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69  m[i]) ); }.#endi
240e0 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
240f0 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70  e3VdbeIdxKeyComp
24100 61 72 65 28 70 43 2c 20 26 72 2c 20 26 72 65 73  are(pC, &r, &res
24110 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  );.    if( pOp->
24120 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54  opcode==OP_IdxLT
24130 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
24140 2d 72 65 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  -res;.    }else{
24150 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24160 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
24170 64 78 47 45 20 29 3b 0a 20 20 20 20 20 20 72 65  dxGE );.      re
24180 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  s++;.    }.    i
24190 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
241a0 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
241b0 20 31 20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   1 ;.    }.  }. 
241c0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
241d0 63 6f 64 65 3a 20 44 65 73 74 72 6f 79 20 50 31  code: Destroy P1
241e0 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
241f0 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
24200 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  e database table
24210 20 6f 72 20 69 6e 64 65 78 20 77 68 6f 73 65 20   or index whose 
24220 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65  root page in the
24230 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
24240 65 20 69 73 20 67 69 76 65 6e 20 62 79 20 50 31  e is given by P1
24250 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
24260 65 20 62 65 69 6e 67 20 64 65 73 74 72 6f 79 65  e being destroye
24270 64 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  d is in the main
24280 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
24290 66 20 50 33 3d 3d 30 2e 20 20 49 66 0a 2a 2a 20  f P3==0.  If.** 
242a0 50 33 3d 3d 31 20 74 68 65 6e 20 74 68 65 20 74  P3==1 then the t
242b0 61 62 6c 65 20 74 6f 20 62 65 20 63 6c 65 61 72  able to be clear
242c0 20 69 73 20 69 6e 20 74 68 65 20 61 75 78 69 6c   is in the auxil
242d0 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  iary database fi
242e0 6c 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 75 73  le.** that is us
242f0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 61 62 6c  ed to store tabl
24300 65 73 20 63 72 65 61 74 65 20 75 73 69 6e 67 20  es create using 
24310 43 52 45 41 54 45 20 54 45 4d 50 4f 52 41 52 59  CREATE TEMPORARY
24320 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 49 66   TABLE..**.** If
24330 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65   AUTOVACUUM is e
24340 6e 61 62 6c 65 64 20 74 68 65 6e 20 69 74 20 69  nabled then it i
24350 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
24360 61 6e 6f 74 68 65 72 20 72 6f 6f 74 20 70 61 67  another root pag
24370 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 6d 6f  e.** might be mo
24380 76 65 64 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ved into the new
24390 6c 79 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 20  ly deleted root 
243a0 70 61 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  page in order to
243b0 20 6b 65 65 70 20 61 6c 6c 0a 2a 2a 20 72 6f 6f   keep all.** roo
243c0 74 20 70 61 67 65 73 20 63 6f 6e 74 69 67 75 6f  t pages contiguo
243d0 75 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  us at the beginn
243e0 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
243f0 61 73 65 2e 20 20 54 68 65 20 66 6f 72 6d 65 72  ase.  The former
24400 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65  .** value of the
24410 20 72 6f 6f 74 20 70 61 67 65 20 74 68 61 74 20   root page that 
24420 6d 6f 76 65 64 20 2d 20 69 74 73 20 76 61 6c 75  moved - its valu
24430 65 20 62 65 66 6f 72 65 20 74 68 65 20 6d 6f 76  e before the mov
24440 65 20 6f 63 63 75 72 72 65 64 20 2d 0a 2a 2a 20  e occurred -.** 
24450 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
24460 69 73 74 65 72 20 50 32 2e 20 20 49 66 20 6e 6f  ister P2.  If no
24470 20 70 61 67 65 20 0a 2a 2a 20 6d 6f 76 65 6d 65   page .** moveme
24480 6e 74 20 77 61 73 20 72 65 71 75 69 72 65 64 20  nt was required 
24490 28 62 65 63 61 75 73 65 20 74 68 65 20 74 61 62  (because the tab
244a0 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
244b0 20 77 61 73 20 61 6c 72 65 61 64 79 20 0a 2a 2a   was already .**
244c0 20 74 68 65 20 6c 61 73 74 20 6f 6e 65 20 69 6e   the last one in
244d0 20 74 68 65 20 64 61 74 61 62 61 73 65 29 20 74   the database) t
244e0 68 65 6e 20 61 20 7a 65 72 6f 20 69 73 20 73 74  hen a zero is st
244f0 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
24500 20 50 32 2e 0a 2a 2a 20 49 66 20 41 55 54 4f 56   P2..** If AUTOV
24510 41 43 55 55 4d 20 69 73 20 64 69 73 61 62 6c 65  ACUUM is disable
24520 64 20 74 68 65 6e 20 61 20 7a 65 72 6f 20 69 73  d then a zero is
24530 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
24540 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65  ter P2..**.** Se
24550 65 20 61 6c 73 6f 3a 20 43 6c 65 61 72 0a 2a 2f  e also: Clear.*/
24560 0a 63 61 73 65 20 4f 50 5f 44 65 73 74 72 6f 79  .case OP_Destroy
24570 3a 20 7b 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d  : {     /* out2-
24580 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
24590 69 6e 74 20 69 4d 6f 76 65 64 3b 0a 20 20 69 6e  int iMoved;.  in
245a0 74 20 69 43 6e 74 3b 0a 20 20 56 64 62 65 20 2a  t iCnt;.  Vdbe *
245b0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 44 62  pVdbe;.  int iDb
245c0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
245d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
245e0 4c 45 0a 20 20 69 43 6e 74 20 3d 20 30 3b 0a 20  LE.  iCnt = 0;. 
245f0 20 66 6f 72 28 70 56 64 62 65 3d 64 62 2d 3e 70   for(pVdbe=db->p
24600 56 64 62 65 3b 20 70 56 64 62 65 3b 20 70 56 64  Vdbe; pVdbe; pVd
24610 62 65 20 3d 20 70 56 64 62 65 2d 3e 70 4e 65 78  be = pVdbe->pNex
24620 74 29 7b 0a 20 20 20 20 69 66 28 20 70 56 64 62  t){.    if( pVdb
24630 65 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  e->magic==VDBE_M
24640 41 47 49 43 5f 52 55 4e 20 26 26 20 70 56 64 62  AGIC_RUN && pVdb
24650 65 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 3c  e->inVtabMethod<
24660 32 20 26 26 20 70 56 64 62 65 2d 3e 70 63 3e 3d  2 && pVdbe->pc>=
24670 30 20 29 7b 0a 20 20 20 20 20 20 69 43 6e 74 2b  0 ){.      iCnt+
24680 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  +;.    }.  }.#el
24690 73 65 0a 20 20 69 43 6e 74 20 3d 20 64 62 2d 3e  se.  iCnt = db->
246a0 61 63 74 69 76 65 56 64 62 65 43 6e 74 3b 0a 23  activeVdbeCnt;.#
246b0 65 6e 64 69 66 0a 20 20 70 4f 75 74 2d 3e 66 6c  endif.  pOut->fl
246c0 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
246d0 20 20 69 66 28 20 69 43 6e 74 3e 31 20 29 7b 0a    if( iCnt>1 ){.
246e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
246f0 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 70 2d 3e 65  LOCKED;.    p->e
24700 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
24710 41 62 6f 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Abort;.  }else{.
24720 20 20 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70      iDb = pOp->p
24730 33 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  3;.    assert( i
24740 43 6e 74 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73  Cnt==1 );.    as
24750 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d  sert( (p->btreeM
24760 61 73 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b  ask & (((yDbMask
24770 29 31 29 3c 3c 69 44 62 29 29 21 3d 30 20 29 3b  )1)<<iDb))!=0 );
24780 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24790 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28  3BtreeDropTable(
247a0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
247b0 2c 20 70 4f 70 2d 3e 70 31 2c 20 26 69 4d 6f 76  , pOp->p1, &iMov
247c0 65 64 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66  ed);.    pOut->f
247d0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
247e0 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20      pOut->u.i = 
247f0 69 4d 6f 76 65 64 3b 0a 23 69 66 6e 64 65 66 20  iMoved;.#ifndef 
24800 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
24810 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 72  VACUUM.    if( r
24820 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24830 69 4d 6f 76 65 64 21 3d 30 20 29 7b 0a 20 20 20  iMoved!=0 ){.   
24840 20 20 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61     sqlite3RootPa
24850 67 65 4d 6f 76 65 64 28 64 62 2c 20 69 44 62 2c  geMoved(db, iDb,
24860 20 69 4d 6f 76 65 64 2c 20 70 4f 70 2d 3e 70 31   iMoved, pOp->p1
24870 29 3b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20  );.      /* All 
24880 4f 50 5f 44 65 73 74 72 6f 79 20 6f 70 65 72 61  OP_Destroy opera
24890 74 69 6f 6e 73 20 6f 63 63 75 72 20 6f 6e 20 74  tions occur on t
248a0 68 65 20 73 61 6d 65 20 62 74 72 65 65 20 2a 2f  he same btree */
248b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
248c0 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c  esetSchemaOnFaul
248d0 74 3d 3d 30 20 7c 7c 20 72 65 73 65 74 53 63 68  t==0 || resetSch
248e0 65 6d 61 4f 6e 46 61 75 6c 74 3d 3d 69 44 62 2b  emaOnFault==iDb+
248f0 31 20 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  1 );.      reset
24900 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 20 3d 20  SchemaOnFault = 
24910 69 44 62 2b 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  iDb+1;.    }.#en
24920 64 69 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  dif.  }.  break;
24930 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  .}../* Opcode: C
24940 6c 65 61 72 20 50 31 20 50 32 20 50 33 0a 2a 2a  lear P1 P2 P3.**
24950 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 63  .** Delete all c
24960 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
24970 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
24980 20 69 6e 64 65 78 20 77 68 6f 73 65 20 72 6f 6f   index whose roo
24990 74 20 70 61 67 65 0a 2a 2a 20 69 6e 20 74 68 65  t page.** in the
249a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
249b0 73 20 67 69 76 65 6e 20 62 79 20 50 31 2e 20 20  s given by P1.  
249c0 42 75 74 2c 20 75 6e 6c 69 6b 65 20 44 65 73 74  But, unlike Dest
249d0 72 6f 79 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 72  roy, do not.** r
249e0 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
249f0 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68  or index from th
24a00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
24a10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
24a20 20 62 65 69 6e 67 20 63 6c 65 61 72 20 69 73 20   being clear is 
24a30 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
24a40 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 32 3d  base file if P2=
24a50 3d 30 2e 20 20 49 66 0a 2a 2a 20 50 32 3d 3d 31  =0.  If.** P2==1
24a60 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20   then the table 
24a70 74 6f 20 62 65 20 63 6c 65 61 72 20 69 73 20 69  to be clear is i
24a80 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  n the auxiliary 
24a90 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
24aa0 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f   that is used to
24ab0 20 73 74 6f 72 65 20 74 61 62 6c 65 73 20 63 72   store tables cr
24ac0 65 61 74 65 20 75 73 69 6e 67 20 43 52 45 41 54  eate using CREAT
24ad0 45 20 54 45 4d 50 4f 52 41 52 59 20 54 41 42 4c  E TEMPORARY TABL
24ae0 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E..**.** If the 
24af0 50 33 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  P3 value is non-
24b00 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 74  zero, then the t
24b10 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f  able referred to
24b20 20 6d 75 73 74 20 62 65 20 61 6e 0a 2a 2a 20 69   must be an.** i
24b30 6e 74 6b 65 79 20 74 61 62 6c 65 20 28 61 6e 20  ntkey table (an 
24b40 53 51 4c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  SQL table, not a
24b50 6e 20 69 6e 64 65 78 29 2e 20 49 6e 20 74 68 69  n index). In thi
24b60 73 20 63 61 73 65 20 74 68 65 20 72 6f 77 20 63  s case the row c
24b70 68 61 6e 67 65 20 0a 2a 2a 20 63 6f 75 6e 74 20  hange .** count 
24b80 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62  is incremented b
24b90 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  y the number of 
24ba0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
24bb0 65 20 62 65 69 6e 67 20 63 6c 65 61 72 65 64 2e  e being cleared.
24bc0 20 0a 2a 2a 20 49 66 20 50 33 20 69 73 20 67 72   .** If P3 is gr
24bd0 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
24be0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
24bf0 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
24c00 65 72 20 50 33 20 69 73 0a 2a 2a 20 61 6c 73 6f  er P3 is.** also
24c10 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20   incremented by 
24c20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
24c30 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
24c40 62 65 69 6e 67 20 63 6c 65 61 72 65 64 2e 0a 2a  being cleared..*
24c50 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 44  *.** See also: D
24c60 65 73 74 72 6f 79 0a 2a 2f 0a 63 61 73 65 20 4f  estroy.*/.case O
24c70 50 5f 43 6c 65 61 72 3a 20 7b 0a 20 20 69 6e 74  P_Clear: {.  int
24c80 20 6e 43 68 61 6e 67 65 3b 0a 20 0a 20 20 6e 43   nChange;. .  nC
24c90 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 61 73 73  hange = 0;.  ass
24ca0 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61  ert( (p->btreeMa
24cb0 73 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29  sk & (((yDbMask)
24cc0 31 29 3c 3c 70 4f 70 2d 3e 70 32 29 29 21 3d 30  1)<<pOp->p2))!=0
24cd0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
24ce0 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
24cf0 65 28 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  e(.      db->aDb
24d00 5b 70 4f 70 2d 3e 70 32 5d 2e 70 42 74 2c 20 70  [pOp->p2].pBt, p
24d10 4f 70 2d 3e 70 31 2c 20 28 70 4f 70 2d 3e 70 33  Op->p1, (pOp->p3
24d20 20 3f 20 26 6e 43 68 61 6e 67 65 20 3a 20 30 29   ? &nChange : 0)
24d30 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d  .  );.  if( pOp-
24d40 3e 70 33 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 43  >p3 ){.    p->nC
24d50 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65  hange += nChange
24d60 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  ;.    if( pOp->p
24d70 33 3e 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  3>0 ){.      ass
24d80 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
24d90 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20  &aMem[pOp->p3]) 
24da0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62 6f 75  );.      memAbou
24db0 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 26 61 4d  tToChange(p, &aM
24dc0 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20  em[pOp->p3]);.  
24dd0 20 20 20 20 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33      aMem[pOp->p3
24de0 5d 2e 75 2e 69 20 2b 3d 20 6e 43 68 61 6e 67 65  ].u.i += nChange
24df0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
24e00 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
24e10 65 3a 20 43 72 65 61 74 65 54 61 62 6c 65 20 50  e: CreateTable P
24e20 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
24e30 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
24e40 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69  table in the mai
24e50 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
24e60 69 66 20 50 31 3d 3d 30 20 6f 72 20 69 6e 20 74  if P1==0 or in t
24e70 68 65 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20  he.** auxiliary 
24e80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
24e90 20 50 31 3d 3d 31 20 6f 72 20 69 6e 20 61 6e 20   P1==1 or in an 
24ea0 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
24eb0 65 20 69 66 0a 2a 2a 20 50 31 3e 31 2e 20 20 57  e if.** P1>1.  W
24ec0 72 69 74 65 20 74 68 65 20 72 6f 6f 74 20 70 61  rite the root pa
24ed0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
24ee0 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 74 6f 0a   new table into.
24ef0 2a 2a 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a  ** register P2.*
24f00 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
24f10 6e 63 65 20 62 65 74 77 65 65 6e 20 61 20 74 61  nce between a ta
24f20 62 6c 65 20 61 6e 64 20 61 6e 20 69 6e 64 65 78  ble and an index
24f30 20 69 73 20 74 68 69 73 3a 20 20 41 20 74 61 62   is this:  A tab
24f40 6c 65 20 6d 75 73 74 0a 2a 2a 20 68 61 76 65 20  le must.** have 
24f50 61 20 34 2d 62 79 74 65 20 69 6e 74 65 67 65 72  a 4-byte integer
24f60 20 6b 65 79 20 61 6e 64 20 63 61 6e 20 68 61 76   key and can hav
24f70 65 20 61 72 62 69 74 72 61 72 79 20 64 61 74 61  e arbitrary data
24f80 2e 20 20 41 6e 20 69 6e 64 65 78 0a 2a 2a 20 68  .  An index.** h
24f90 61 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 20  as an arbitrary 
24fa0 6b 65 79 20 62 75 74 20 6e 6f 20 64 61 74 61 2e  key but no data.
24fb0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
24fc0 20 43 72 65 61 74 65 49 6e 64 65 78 0a 2a 2f 0a   CreateIndex.*/.
24fd0 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 72 65 61 74  /* Opcode: Creat
24fe0 65 49 6e 64 65 78 20 50 31 20 50 32 20 2a 20 2a  eIndex P1 P2 * *
24ff0 20 2a 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74   *.**.** Allocat
25000 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 69 6e  e a new index in
25010 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
25020 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 30  se file if P1==0
25030 20 6f 72 20 69 6e 20 74 68 65 0a 2a 2a 20 61 75   or in the.** au
25040 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
25050 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 31 20 6f   file if P1==1 o
25060 72 20 69 6e 20 61 6e 20 61 74 74 61 63 68 65 64  r in an attached
25070 20 64 61 74 61 62 61 73 65 20 69 66 0a 2a 2a 20   database if.** 
25080 50 31 3e 31 2e 20 20 57 72 69 74 65 20 74 68 65  P1>1.  Write the
25090 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
250a0 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  r of the new tab
250b0 6c 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73  le into.** regis
250c0 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65  ter P2..**.** Se
250d0 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  e documentation 
250e0 6f 6e 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  on OP_CreateTabl
250f0 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
25100 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
25110 0a 63 61 73 65 20 4f 50 5f 43 72 65 61 74 65 49  .case OP_CreateI
25120 6e 64 65 78 3a 20 20 20 20 20 20 20 20 20 20 20  ndex:           
25130 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65   /* out2-prerele
25140 61 73 65 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  ase */.case OP_C
25150 72 65 61 74 65 54 61 62 6c 65 3a 20 7b 20 20 20  reateTable: {   
25160 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70         /* out2-p
25170 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  rerelease */.  i
25180 6e 74 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 66  nt pgno;.  int f
25190 6c 61 67 73 3b 0a 20 20 44 62 20 2a 70 44 62 3b  lags;.  Db *pDb;
251a0 0a 0a 20 20 70 67 6e 6f 20 3d 20 30 3b 0a 20 20  ..  pgno = 0;.  
251b0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
251c0 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62  =0 && pOp->p1<db
251d0 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
251e0 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  t( (p->btreeMask
251f0 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31 29   & (((yDbMask)1)
25200 3c 3c 70 4f 70 2d 3e 70 31 29 29 21 3d 30 20 29  <<pOp->p1))!=0 )
25210 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
25220 44 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  Db[pOp->p1];.  a
25230 73 73 65 72 74 28 20 70 44 62 2d 3e 70 42 74 21  ssert( pDb->pBt!
25240 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d  =0 );.  if( pOp-
25250 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61  >opcode==OP_Crea
25260 74 65 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f  teTable ){.    /
25270 2a 20 66 6c 61 67 73 20 3d 20 42 54 52 45 45 5f  * flags = BTREE_
25280 49 4e 54 4b 45 59 3b 20 2a 2f 0a 20 20 20 20 66  INTKEY; */.    f
25290 6c 61 67 73 20 3d 20 42 54 52 45 45 5f 49 4e 54  lags = BTREE_INT
252a0 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KEY;.  }else{.  
252b0 20 20 66 6c 61 67 73 20 3d 20 42 54 52 45 45 5f    flags = BTREE_
252c0 42 4c 4f 42 4b 45 59 3b 0a 20 20 7d 0a 20 20 72  BLOBKEY;.  }.  r
252d0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
252e0 43 72 65 61 74 65 54 61 62 6c 65 28 70 44 62 2d  CreateTable(pDb-
252f0 3e 70 42 74 2c 20 26 70 67 6e 6f 2c 20 66 6c 61  >pBt, &pgno, fla
25300 67 73 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69  gs);.  pOut->u.i
25310 20 3d 20 70 67 6e 6f 3b 0a 20 20 62 72 65 61 6b   = pgno;.  break
25320 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
25330 50 61 72 73 65 53 63 68 65 6d 61 20 50 31 20 2a  ParseSchema P1 *
25340 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65   * P4 *.**.** Re
25350 61 64 20 61 6e 64 20 70 61 72 73 65 20 61 6c 6c  ad and parse all
25360 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68   entries from th
25370 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
25380 74 61 62 6c 65 20 6f 66 20 64 61 74 61 62 61 73  table of databas
25390 65 20 50 31 0a 2a 2a 20 74 68 61 74 20 6d 61 74  e P1.** that mat
253a0 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ch the WHERE cla
253b0 75 73 65 20 50 34 2e 20 0a 2a 2a 0a 2a 2a 20 54  use P4. .**.** T
253c0 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b  his opcode invok
253d0 65 73 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  es the parser to
253e0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69   create a new vi
253f0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2c 0a 2a  rtual machine,.*
25400 2a 20 74 68 65 6e 20 72 75 6e 73 20 74 68 65 20  * then runs the 
25410 6e 65 77 20 76 69 72 74 75 61 6c 20 6d 61 63 68  new virtual mach
25420 69 6e 65 2e 20 20 49 74 20 69 73 20 74 68 75 73  ine.  It is thus
25430 20 61 20 72 65 2d 65 6e 74 72 61 6e 74 20 6f 70   a re-entrant op
25440 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  code..*/.case OP
25450 5f 50 61 72 73 65 53 63 68 65 6d 61 3a 20 7b 0a  _ParseSchema: {.
25460 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 63 6f 6e    int iDb;.  con
25470 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
25480 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
25490 20 20 49 6e 69 74 44 61 74 61 20 69 6e 69 74 44    InitData initD
254a0 61 74 61 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 70  ata;..  /* Any p
254b0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
254c0 74 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20 74  t that invokes t
254d0 68 69 73 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20  his opcode will 
254e0 68 6f 6c 64 20 6d 75 74 65 78 65 73 0a 20 20 2a  hold mutexes.  *
254f0 2a 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65  * on every btree
25500 2e 20 20 54 68 69 73 20 69 73 20 61 20 70 72 65  .  This is a pre
25510 72 65 71 75 69 73 69 74 65 20 66 6f 72 20 69 6e  requisite for in
25520 76 6f 6b 69 6e 67 20 0a 20 20 2a 2a 20 73 71 6c  voking .  ** sql
25530 69 74 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b  ite3InitCallback
25540 28 29 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ()..  */.#ifdef 
25550 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
25560 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62  or(iDb=0; iDb<db
25570 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20  ->nDb; iDb++){. 
25580 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d     assert( iDb==
25590 31 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  1 || sqlite3Btre
255a0 65 48 6f 6c 64 73 4d 75 74 65 78 28 64 62 2d 3e  eHoldsMutex(db->
255b0 61 44 62 5b 69 44 62 5d 2e 70 42 74 29 20 29 3b  aDb[iDb].pBt) );
255c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
255d0 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  Db = pOp->p1;.  
255e0 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
255f0 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
25600 0a 20 20 61 73 73 65 72 74 28 20 44 62 48 61 73  .  assert( DbHas
25610 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
25620 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65  , DB_SchemaLoade
25630 64 29 20 29 3b 0a 20 20 2f 2a 20 55 73 65 64 20  d) );.  /* Used 
25640 74 6f 20 62 65 20 61 20 63 6f 6e 64 69 74 69 6f  to be a conditio
25650 6e 61 6c 20 2a 2f 20 7b 0a 20 20 20 20 7a 4d 61  nal */ {.    zMa
25660 73 74 65 72 20 3d 20 53 43 48 45 4d 41 5f 54 41  ster = SCHEMA_TA
25670 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 6e  BLE(iDb);.    in
25680 69 74 44 61 74 61 2e 64 62 20 3d 20 64 62 3b 0a  itData.db = db;.
25690 20 20 20 20 69 6e 69 74 44 61 74 61 2e 69 44 62      initData.iDb
256a0 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20 20   = pOp->p1;.    
256b0 69 6e 69 74 44 61 74 61 2e 70 7a 45 72 72 4d 73  initData.pzErrMs
256c0 67 20 3d 20 26 70 2d 3e 7a 45 72 72 4d 73 67 3b  g = &p->zErrMsg;
256d0 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
256e0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 0a 20  te3MPrintf(db,. 
256f0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
25700 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71  me, rootpage, sq
25710 6c 20 46 52 4f 4d 20 27 25 71 27 2e 25 73 20 57  l FROM '%q'.%s W
25720 48 45 52 45 20 25 73 20 4f 52 44 45 52 20 42 59  HERE %s ORDER BY
25730 20 72 6f 77 69 64 22 2c 0a 20 20 20 20 20 20 20   rowid",.       
25740 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
25750 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4f 70  me, zMaster, pOp
25760 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 69 66 28  ->p4.z);.    if(
25770 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
25780 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
25790 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
257a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
257b0 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
257c0 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74  ;.      db->init
257d0 2e 62 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20  .busy = 1;.     
257e0 20 69 6e 69 74 44 61 74 61 2e 72 63 20 3d 20 53   initData.rc = S
257f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
25800 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
25810 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
25820 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
25830 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 73  exec(db, zSql, s
25840 71 6c 69 74 65 33 49 6e 69 74 43 61 6c 6c 62 61  qlite3InitCallba
25850 63 6b 2c 20 26 69 6e 69 74 44 61 74 61 2c 20 30  ck, &initData, 0
25860 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
25870 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
25880 3d 20 69 6e 69 74 44 61 74 61 2e 72 63 3b 0a 20  = initData.rc;. 
25890 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
258a0 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20  ee(db, zSql);.  
258b0 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73      db->init.bus
258c0 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = 0;.    }.  }
258d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
258e0 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 67  E_NOMEM ){.    g
258f0 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a  oto no_mem;.  }.
25900 20 20 62 72 65 61 6b 3b 20 20 0a 7d 0a 0a 23 69    break;  .}..#i
25910 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
25920 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 29 0a  E_OMIT_ANALYZE).
25930 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 6f 61 64 41  /* Opcode: LoadA
25940 6e 61 6c 79 73 69 73 20 50 31 20 2a 20 2a 20 2a  nalysis P1 * * *
25950 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 74 68   *.**.** Read th
25960 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  e sqlite_stat1 t
25970 61 62 6c 65 20 66 6f 72 20 64 61 74 61 62 61 73  able for databas
25980 65 20 50 31 20 61 6e 64 20 6c 6f 61 64 20 74 68  e P1 and load th
25990 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20  e content.** of 
259a0 74 68 61 74 20 74 61 62 6c 65 20 69 6e 74 6f 20  that table into 
259b0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 69 6e 64  the internal ind
259c0 65 78 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  ex hash table.  
259d0 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 0a  This will cause.
259e0 2a 2a 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  ** the analysis 
259f0 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  to be used when 
25a00 70 72 65 70 61 72 69 6e 67 20 61 6c 6c 20 73 75  preparing all su
25a10 62 73 65 71 75 65 6e 74 20 71 75 65 72 69 65 73  bsequent queries
25a20 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 6f 61  ..*/.case OP_Loa
25a30 64 41 6e 61 6c 79 73 69 73 3a 20 7b 0a 20 20 61  dAnalysis: {.  a
25a40 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
25a50 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d  0 && pOp->p1<db-
25a60 3e 6e 44 62 20 29 3b 0a 20 20 72 63 20 3d 20 73  >nDb );.  rc = s
25a70 71 6c 69 74 65 33 41 6e 61 6c 79 73 69 73 4c 6f  qlite3AnalysisLo
25a80 61 64 28 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b  ad(db, pOp->p1);
25a90 0a 20 20 62 72 65 61 6b 3b 20 20 0a 7d 0a 23 65  .  break;  .}.#e
25aa0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
25ab0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41  (SQLITE_OMIT_ANA
25ac0 4c 59 5a 45 29 20 2a 2f 0a 0a 2f 2a 20 4f 70 63  LYZE) */../* Opc
25ad0 6f 64 65 3a 20 44 72 6f 70 54 61 62 6c 65 20 50  ode: DropTable P
25ae0 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  1 * * P4 *.**.**
25af0 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 74 65   Remove the inte
25b00 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29  rnal (in-memory)
25b10 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
25b20 20 74 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a   that describe.*
25b30 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
25b40 64 20 50 34 20 69 6e 20 64 61 74 61 62 61 73 65  d P4 in database
25b50 20 50 31 2e 20 20 54 68 69 73 20 69 73 20 63 61   P1.  This is ca
25b60 6c 6c 65 64 20 61 66 74 65 72 20 61 20 74 61 62  lled after a tab
25b70 6c 65 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65 64  le.** is dropped
25b80 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
25b90 70 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72  p the internal r
25ba0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
25bb0 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63   the.** schema c
25bc0 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 77  onsistent with w
25bd0 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a  hat is on disk..
25be0 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70 54  */.case OP_DropT
25bf0 61 62 6c 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65  able: {.  sqlite
25c00 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
25c10 54 61 62 6c 65 28 64 62 2c 20 70 4f 70 2d 3e 70  Table(db, pOp->p
25c20 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  1, pOp->p4.z);. 
25c30 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
25c40 63 6f 64 65 3a 20 44 72 6f 70 49 6e 64 65 78 20  code: DropIndex 
25c50 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
25c60 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 74  * Remove the int
25c70 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79  ernal (in-memory
25c80 29 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  ) data structure
25c90 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 0a  s that describe.
25ca0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  ** the index nam
25cb0 65 64 20 50 34 20 69 6e 20 64 61 74 61 62 61 73  ed P4 in databas
25cc0 65 20 50 31 2e 20 20 54 68 69 73 20 69 73 20 63  e P1.  This is c
25cd0 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20 69  alled after an i
25ce0 6e 64 65 78 0a 2a 2a 20 69 73 20 64 72 6f 70 70  ndex.** is dropp
25cf0 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  ed in order to k
25d00 65 65 70 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  eep the internal
25d10 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
25d20 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61  of the.** schema
25d30 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
25d40 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b   what is on disk
25d50 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f  ..*/.case OP_Dro
25d60 70 49 6e 64 65 78 3a 20 7b 0a 20 20 73 71 6c 69  pIndex: {.  sqli
25d70 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
25d80 74 65 49 6e 64 65 78 28 64 62 2c 20 70 4f 70 2d  teIndex(db, pOp-
25d90 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  >p1, pOp->p4.z);
25da0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
25db0 4f 70 63 6f 64 65 3a 20 44 72 6f 70 54 72 69 67  Opcode: DropTrig
25dc0 67 65 72 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a  ger P1 * * P4 *.
25dd0 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  **.** Remove the
25de0 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65   internal (in-me
25df0 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72 75 63  mory) data struc
25e00 74 75 72 65 73 20 74 68 61 74 20 64 65 73 63 72  tures that descr
25e10 69 62 65 0a 2a 2a 20 74 68 65 20 74 72 69 67 67  ibe.** the trigg
25e20 65 72 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64  er named P4 in d
25e30 61 74 61 62 61 73 65 20 50 31 2e 20 20 54 68 69  atabase P1.  Thi
25e40 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  s is called afte
25e50 72 20 61 20 74 72 69 67 67 65 72 0a 2a 2a 20 69  r a trigger.** i
25e60 73 20 64 72 6f 70 70 65 64 20 69 6e 20 6f 72 64  s dropped in ord
25e70 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 69  er to keep the i
25e80 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e  nternal represen
25e90 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  tation of the.**
25ea0 20 73 63 68 65 6d 61 20 63 6f 6e 73 69 73 74 65   schema consiste
25eb0 6e 74 20 77 69 74 68 20 77 68 61 74 20 69 73 20  nt with what is 
25ec0 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65  on disk..*/.case
25ed0 20 4f 50 5f 44 72 6f 70 54 72 69 67 67 65 72 3a   OP_DropTrigger:
25ee0 20 7b 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69   {.  sqlite3Unli
25ef0 6e 6b 41 6e 64 44 65 6c 65 74 65 54 72 69 67 67  nkAndDeleteTrigg
25f00 65 72 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20  er(db, pOp->p1, 
25f10 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72  pOp->p4.z);.  br
25f20 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  eak;.}...#ifndef
25f30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
25f40 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 20  EGRITY_CHECK./* 
25f50 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67 72 69 74  Opcode: Integrit
25f60 79 43 6b 20 50 31 20 50 32 20 50 33 20 2a 20 50  yCk P1 P2 P3 * P
25f70 35 0a 2a 2a 0a 2a 2a 20 44 6f 20 61 6e 20 61 6e  5.**.** Do an an
25f80 61 6c 79 73 69 73 20 6f 66 20 74 68 65 20 63 75  alysis of the cu
25f90 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74  rrently open dat
25fa0 61 62 61 73 65 2e 20 20 53 74 6f 72 65 20 69 6e  abase.  Store in
25fb0 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 20  .** register P1 
25fc0 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65  the text of an e
25fd0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 64 65 73  rror message des
25fe0 63 72 69 62 69 6e 67 20 61 6e 79 20 70 72 6f 62  cribing any prob
25ff0 6c 65 6d 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 70  lems..** If no p
26000 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e  roblems are foun
26010 64 2c 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c 20  d, store a NULL 
26020 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a  in register P1..
26030 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74  **.** The regist
26040 65 72 20 50 33 20 63 6f 6e 74 61 69 6e 73 20 74  er P3 contains t
26050 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
26060 72 20 6f 66 20 61 6c 6c 6f 77 65 64 20 65 72 72  r of allowed err
26070 6f 72 73 2e 0a 2a 2a 20 41 74 20 6d 6f 73 74 20  ors..** At most 
26080 72 65 67 28 50 33 29 20 65 72 72 6f 72 73 20 77  reg(P3) errors w
26090 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 2e  ill be reported.
260a0 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
260b0 64 73 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73  ds, the analysis
260c0 20 73 74 6f 70 73 20 61 73 20 73 6f 6f 6e 20 61   stops as soon a
260d0 73 20 72 65 67 28 50 31 29 20 65 72 72 6f 72 73  s reg(P1) errors
260e0 20 61 72 65 20 0a 2a 2a 20 73 65 65 6e 2e 20 20   are .** seen.  
260f0 52 65 67 28 50 31 29 20 69 73 20 75 70 64 61 74  Reg(P1) is updat
26100 65 64 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62  ed with the numb
26110 65 72 20 6f 66 20 65 72 72 6f 72 73 20 72 65 6d  er of errors rem
26120 61 69 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  aining..**.** Th
26130 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
26140 65 72 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ers of all table
26150 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
26160 65 20 61 72 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e are integer.**
26170 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 28 50   stored in reg(P
26180 31 29 2c 20 72 65 67 28 50 31 2b 31 29 2c 20 72  1), reg(P1+1), r
26190 65 67 28 50 31 2b 32 29 2c 20 2e 2e 2e 2e 20 20  eg(P1+2), ....  
261a0 54 68 65 72 65 20 61 72 65 20 50 32 20 74 61 62  There are P2 tab
261b0 6c 65 73 0a 2a 2a 20 74 6f 74 61 6c 2e 0a 2a 2a  les.** total..**
261c0 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 74  .** If P5 is not
261d0 20 7a 65 72 6f 2c 20 74 68 65 20 63 68 65 63 6b   zero, the check
261e0 20 69 73 20 64 6f 6e 65 20 6f 6e 20 74 68 65 20   is done on the 
261f0 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
26200 73 65 0a 2a 2a 20 66 69 6c 65 2c 20 6e 6f 74 20  se.** file, not 
26210 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
26220 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
26230 69 73 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  is opcode is use
26240 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
26250 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
26260 63 6b 20 70 72 61 67 6d 61 2e 0a 2a 2f 0a 63 61  ck pragma..*/.ca
26270 73 65 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43  se OP_IntegrityC
26280 6b 3a 20 7b 0a 20 20 69 6e 74 20 6e 52 6f 6f 74  k: {.  int nRoot
26290 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
262a0 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 63 68   of tables to ch
262b0 65 63 6b 2e 20 20 28 4e 75 6d 62 65 72 20 6f 66  eck.  (Number of
262c0 20 72 6f 6f 74 20 70 61 67 65 73 2e 29 20 2a 2f   root pages.) */
262d0 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 20 20  .  int *aRoot;  
262e0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72     /* Array of r
262f0 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 73 20  ootpage numbers 
26300 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 62 65  for tables to be
26310 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e   checked */.  in
26320 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  t j;          /*
26330 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
26340 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20  .  int nErr;    
26350 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26360 65 72 72 6f 72 73 20 72 65 70 6f 72 74 65 64 20  errors reported 
26370 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  */.  char *z;   
26380 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
26390 74 68 65 20 65 72 72 6f 72 20 72 65 70 6f 72 74  the error report
263a0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 6e 45 72 72   */.  Mem *pnErr
263b0 3b 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65  ;     /* Registe
263c0 72 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20  r keeping track 
263d0 6f 66 20 65 72 72 6f 72 73 20 72 65 6d 61 69 6e  of errors remain
263e0 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 6e 52 6f 6f  ing */.  .  nRoo
263f0 74 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61  t = pOp->p2;.  a
26400 73 73 65 72 74 28 20 6e 52 6f 6f 74 3e 30 20 29  ssert( nRoot>0 )
26410 3b 0a 20 20 61 52 6f 6f 74 20 3d 20 73 71 6c 69  ;.  aRoot = sqli
26420 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
26430 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28  b, sizeof(int)*(
26440 6e 52 6f 6f 74 2b 31 29 20 29 3b 0a 20 20 69 66  nRoot+1) );.  if
26450 28 20 61 52 6f 6f 74 3d 3d 30 20 29 20 67 6f 74  ( aRoot==0 ) got
26460 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 61 73 73 65  o no_mem;.  asse
26470 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26  rt( pOp->p3>0 &&
26480 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65   pOp->p3<=p->nMe
26490 6d 20 29 3b 0a 20 20 70 6e 45 72 72 20 3d 20 26  m );.  pnErr = &
264a0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
264b0 20 61 73 73 65 72 74 28 20 28 70 6e 45 72 72 2d   assert( (pnErr-
264c0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
264d0 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
264e0 28 20 28 70 6e 45 72 72 2d 3e 66 6c 61 67 73 20  ( (pnErr->flags 
264f0 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  & (MEM_Str|MEM_B
26500 6c 6f 62 29 29 3d 3d 30 20 29 3b 0a 20 20 70 49  lob))==0 );.  pI
26510 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
26520 70 31 5d 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  p1];.  for(j=0; 
26530 6a 3c 6e 52 6f 6f 74 3b 20 6a 2b 2b 29 7b 0a 20  j<nRoot; j++){. 
26540 20 20 20 61 52 6f 6f 74 5b 6a 5d 20 3d 20 28 69     aRoot[j] = (i
26550 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 49 6e  nt)sqlite3VdbeIn
26560 74 56 61 6c 75 65 28 26 70 49 6e 31 5b 6a 5d 29  tValue(&pIn1[j])
26570 3b 0a 20 20 7d 0a 20 20 61 52 6f 6f 74 5b 6a 5d  ;.  }.  aRoot[j]
26580 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
26590 70 4f 70 2d 3e 70 35 3c 64 62 2d 3e 6e 44 62 20  pOp->p5<db->nDb 
265a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
265b0 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28  >btreeMask & (((
265c0 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70 2d  yDbMask)1)<<pOp-
265d0 3e 70 35 29 29 21 3d 30 20 29 3b 0a 20 20 7a 20  >p5))!=0 );.  z 
265e0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
265f0 74 65 67 72 69 74 79 43 68 65 63 6b 28 64 62 2d  tegrityCheck(db-
26600 3e 61 44 62 5b 70 4f 70 2d 3e 70 35 5d 2e 70 42  >aDb[pOp->p5].pB
26610 74 2c 20 61 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c  t, aRoot, nRoot,
26620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26640 20 20 28 69 6e 74 29 70 6e 45 72 72 2d 3e 75 2e    (int)pnErr->u.
26650 69 2c 20 26 6e 45 72 72 29 3b 0a 20 20 73 71 6c  i, &nErr);.  sql
26660 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
26670 52 6f 6f 74 29 3b 0a 20 20 70 6e 45 72 72 2d 3e  Root);.  pnErr->
26680 75 2e 69 20 2d 3d 20 6e 45 72 72 3b 0a 20 20 73  u.i -= nErr;.  s
26690 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
266a0 4e 75 6c 6c 28 70 49 6e 31 29 3b 0a 20 20 69 66  Null(pIn1);.  if
266b0 28 20 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ( nErr==0 ){.   
266c0 20 61 73 73 65 72 74 28 20 7a 3d 3d 30 20 29 3b   assert( z==0 );
266d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 3d 3d  .  }else if( z==
266e0 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f  0 ){.    goto no
266f0 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _mem;.  }else{. 
26700 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
26710 6d 53 65 74 53 74 72 28 70 49 6e 31 2c 20 7a 2c  mSetStr(pIn1, z,
26720 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
26730 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
26740 0a 20 20 7d 0a 20 20 55 50 44 41 54 45 5f 4d 41  .  }.  UPDATE_MA
26750 58 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31 29  X_BLOBSIZE(pIn1)
26760 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
26770 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 49  hangeEncoding(pI
26780 6e 31 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  n1, encoding);. 
26790 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
267a0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
267b0 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
267c0 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  */../* Opcode: R
267d0 6f 77 53 65 74 41 64 64 20 50 31 20 50 32 20 2a  owSetAdd P1 P2 *
267e0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 73 65 72   * *.**.** Inser
267f0 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  t the integer va
26800 6c 75 65 20 68 65 6c 64 20 62 79 20 72 65 67 69  lue held by regi
26810 73 74 65 72 20 50 32 20 69 6e 74 6f 20 61 20 62  ster P2 into a b
26820 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  oolean index.** 
26830 68 65 6c 64 20 69 6e 20 72 65 67 69 73 74 65 72  held in register
26840 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 61 73   P1..**.** An as
26850 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
26860 20 50 32 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e   P2 is not an in
26870 74 65 67 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f  teger..*/.case O
26880 50 5f 52 6f 77 53 65 74 41 64 64 3a 20 7b 20 20  P_RowSetAdd: {  
26890 20 20 20 20 20 2f 2a 20 69 6e 31 2c 20 69 6e 32       /* in1, in2
268a0 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
268b0 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70  em[pOp->p1];.  p
268c0 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In2 = &aMem[pOp-
268d0 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p2];.  assert( 
268e0 28 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn2->flags & M
268f0 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20  EM_Int)!=0 );.  
26900 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
26910 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d   & MEM_RowSet)==
26920 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
26930 56 64 62 65 4d 65 6d 53 65 74 52 6f 77 53 65 74  VdbeMemSetRowSet
26940 28 70 49 6e 31 29 3b 0a 20 20 20 20 69 66 28 20  (pIn1);.    if( 
26950 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn1->flags & M
26960 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 20  EM_RowSet)==0 ) 
26970 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
26980 0a 20 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74  .  sqlite3RowSet
26990 49 6e 73 65 72 74 28 70 49 6e 31 2d 3e 75 2e 70  Insert(pIn1->u.p
269a0 52 6f 77 53 65 74 2c 20 70 49 6e 32 2d 3e 75 2e  RowSet, pIn2->u.
269b0 69 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  i);.  break;.}..
269c0 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65  /* Opcode: RowSe
269d0 74 52 65 61 64 20 50 31 20 50 32 20 50 33 20 2a  tRead P1 P2 P3 *
269e0 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 74 72 61 63 74   *.**.** Extract
269f0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 76 61   the smallest va
26a00 6c 75 65 20 66 72 6f 6d 20 62 6f 6f 6c 65 61 6e  lue from boolean
26a10 20 69 6e 64 65 78 20 50 31 20 61 6e 64 20 70 75   index P1 and pu
26a20 74 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e 74  t that value int
26a30 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 33  o.** register P3
26a40 2e 20 20 4f 72 2c 20 69 66 20 62 6f 6f 6c 65 61  .  Or, if boolea
26a50 6e 20 69 6e 64 65 78 20 50 31 20 69 73 20 69 6e  n index P1 is in
26a60 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2c 20 6c  itially empty, l
26a70 65 61 76 65 20 50 33 0a 2a 2a 20 75 6e 63 68 61  eave P3.** uncha
26a80 6e 67 65 64 20 61 6e 64 20 6a 75 6d 70 20 74 6f  nged and jump to
26a90 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e   instruction P2.
26aa0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53  .*/.case OP_RowS
26ab0 65 74 52 65 61 64 3a 20 7b 20 20 20 20 20 20 20  etRead: {       
26ac0 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 6f 75  /* jump, in1, ou
26ad0 74 33 20 2a 2f 0a 20 20 69 36 34 20 76 61 6c 3b  t3 */.  i64 val;
26ae0 0a 20 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54  .  CHECK_FOR_INT
26af0 45 52 52 55 50 54 3b 0a 20 20 70 49 6e 31 20 3d  ERRUPT;.  pIn1 =
26b00 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
26b10 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
26b20 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
26b30 29 3d 3d 30 20 0a 20 20 20 7c 7c 20 73 71 6c 69  )==0 .   || sqli
26b40 74 65 33 52 6f 77 53 65 74 4e 65 78 74 28 70 49  te3RowSetNext(pI
26b50 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20 26  n1->u.pRowSet, &
26b60 76 61 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  val)==0.  ){.   
26b70 20 2f 2a 20 54 68 65 20 62 6f 6f 6c 65 61 6e 20   /* The boolean 
26b80 69 6e 64 65 78 20 69 73 20 65 6d 70 74 79 20 2a  index is empty *
26b90 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
26ba0 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 49 6e 31  eMemSetNull(pIn1
26bb0 29 3b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  );.    pc = pOp-
26bc0 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 65 6c 73 65  >p2 - 1;.  }else
26bd0 7b 0a 20 20 20 20 2f 2a 20 41 20 76 61 6c 75 65  {.    /* A value
26be0 20 77 61 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d   was pulled from
26bf0 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
26c00 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
26c10 53 65 74 49 6e 74 36 34 28 26 61 4d 65 6d 5b 70  SetInt64(&aMem[p
26c20 4f 70 2d 3e 70 33 5d 2c 20 76 61 6c 29 3b 0a 20  Op->p3], val);. 
26c30 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
26c40 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65 74  * Opcode: RowSet
26c50 54 65 73 74 20 50 31 20 50 32 20 50 33 20 50 34  Test P1 P2 P3 P4
26c60 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  .**.** Register 
26c70 50 33 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  P3 is assumed to
26c80 20 68 6f 6c 64 20 61 20 36 34 2d 62 69 74 20 69   hold a 64-bit i
26c90 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 20 49 66  nteger value. If
26ca0 20 72 65 67 69 73 74 65 72 20 50 31 0a 2a 2a 20   register P1.** 
26cb0 63 6f 6e 74 61 69 6e 73 20 61 20 52 6f 77 53 65  contains a RowSe
26cc0 74 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61  t object and tha
26cd0 74 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20  t RowSet object 
26ce0 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20  contains.** the 
26cf0 76 61 6c 75 65 20 68 65 6c 64 20 69 6e 20 50 33  value held in P3
26d00 2c 20 6a 75 6d 70 20 74 6f 20 72 65 67 69 73 74  , jump to regist
26d10 65 72 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65  er P2. Otherwise
26d20 2c 20 69 6e 73 65 72 74 20 74 68 65 0a 2a 2a 20  , insert the.** 
26d30 69 6e 74 65 67 65 72 20 69 6e 20 50 33 20 69 6e  integer in P3 in
26d40 74 6f 20 74 68 65 20 52 6f 77 53 65 74 20 61 6e  to the RowSet an
26d50 64 20 63 6f 6e 74 69 6e 75 65 20 6f 6e 20 74 6f  d continue on to
26d60 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 6f 70 63   the.** next opc
26d70 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52  ode..**.** The R
26d80 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 69 73 20  owSet object is 
26d90 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72 20 74 68  optimized for th
26da0 65 20 63 61 73 65 20 77 68 65 72 65 20 73 75 63  e case where suc
26db0 63 65 73 73 69 76 65 20 73 65 74 73 0a 2a 2a 20  cessive sets.** 
26dc0 6f 66 20 69 6e 74 65 67 65 72 73 2c 20 77 68 65  of integers, whe
26dd0 72 65 20 65 61 63 68 20 73 65 74 20 63 6f 6e 74  re each set cont
26de0 61 69 6e 73 20 6e 6f 20 64 75 70 6c 69 63 61 74  ains no duplicat
26df0 65 73 2e 20 45 61 63 68 20 73 65 74 0a 2a 2a 20  es. Each set.** 
26e00 6f 66 20 76 61 6c 75 65 73 20 69 73 20 69 64 65  of values is ide
26e10 6e 74 69 66 69 65 64 20 62 79 20 61 20 75 6e 69  ntified by a uni
26e20 71 75 65 20 50 34 20 76 61 6c 75 65 2e 20 54 68  que P4 value. Th
26e30 65 20 66 69 72 73 74 20 73 65 74 0a 2a 2a 20 6d  e first set.** m
26e40 75 73 74 20 68 61 76 65 20 50 34 3d 3d 30 2c 20  ust have P4==0, 
26e50 74 68 65 20 66 69 6e 61 6c 20 73 65 74 20 50 34  the final set P4
26e60 3d 2d 31 2e 20 20 50 34 20 6d 75 73 74 20 62 65  =-1.  P4 must be
26e70 20 65 69 74 68 65 72 20 2d 31 20 6f 72 0a 2a 2a   either -1 or.**
26e80 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 20 20   non-negative.  
26e90 46 6f 72 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  For non-negative
26ea0 20 76 61 6c 75 65 73 20 6f 66 20 50 34 20 6f 6e   values of P4 on
26eb0 6c 79 20 74 68 65 20 6c 6f 77 65 72 20 34 0a 2a  ly the lower 4.*
26ec0 2a 20 62 69 74 73 20 61 72 65 20 73 69 67 6e 69  * bits are signi
26ed0 66 69 63 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ficant..**.** Th
26ee0 69 73 20 61 6c 6c 6f 77 73 20 6f 70 74 69 6d 69  is allows optimi
26ef0 7a 61 74 69 6f 6e 73 3a 20 28 61 29 20 77 68 65  zations: (a) whe
26f00 6e 20 50 34 3d 3d 30 20 74 68 65 72 65 20 69 73  n P4==0 there is
26f10 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74   no need to test
26f20 0a 2a 2a 20 74 68 65 20 72 6f 77 73 65 74 20 6f  .** the rowset o
26f30 62 6a 65 63 74 20 66 6f 72 20 50 33 2c 20 61 73  bject for P3, as
26f40 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
26f50 64 20 6e 6f 74 20 74 6f 20 63 6f 6e 74 61 69 6e  d not to contain
26f60 20 69 74 2c 0a 2a 2a 20 28 62 29 20 77 68 65 6e   it,.** (b) when
26f70 20 50 34 3d 3d 2d 31 20 74 68 65 72 65 20 69 73   P4==-1 there is
26f80 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 73 65   no need to inse
26f90 72 74 20 74 68 65 20 76 61 6c 75 65 2c 20 61 73  rt the value, as
26fa0 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 6e 65 76 65   it will.** neve
26fb0 72 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 2c  r be tested for,
26fc0 20 61 6e 64 20 28 63 29 20 77 68 65 6e 20 61 20   and (c) when a 
26fd0 76 61 6c 75 65 20 74 68 61 74 20 69 73 20 70 61  value that is pa
26fe0 72 74 20 6f 66 20 73 65 74 20 58 20 69 73 0a 2a  rt of set X is.*
26ff0 2a 20 69 6e 73 65 72 74 65 64 2c 20 74 68 65 72  * inserted, ther
27000 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
27010 73 65 61 72 63 68 20 74 6f 20 73 65 65 20 69 66  search to see if
27020 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
27030 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c  was.** previousl
27040 79 20 69 6e 73 65 72 74 65 64 20 61 73 20 70 61  y inserted as pa
27050 72 74 20 6f 66 20 73 65 74 20 58 20 28 6f 6e 6c  rt of set X (onl
27060 79 20 69 66 20 69 74 20 77 61 73 20 70 72 65 76  y if it was prev
27070 69 6f 75 73 6c 79 0a 2a 2a 20 69 6e 73 65 72 74  iously.** insert
27080 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 73 6f  ed as part of so
27090 6d 65 20 6f 74 68 65 72 20 73 65 74 29 2e 0a 2a  me other set)..*
270a0 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65 74  /.case OP_RowSet
270b0 54 65 73 74 3a 20 7b 20 20 20 20 20 20 20 20 20  Test: {         
270c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
270d0 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f  ump, in1, in3 */
270e0 0a 20 20 69 6e 74 20 69 53 65 74 3b 0a 20 20 69  .  int iSet;.  i
270f0 6e 74 20 65 78 69 73 74 73 3b 0a 0a 20 20 70 49  nt exists;..  pI
27100 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
27110 70 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61  p1];.  pIn3 = &a
27120 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
27130 69 53 65 74 20 3d 20 70 4f 70 2d 3e 70 34 2e 69  iSet = pOp->p4.i
27140 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 33  ;.  assert( pIn3
27150 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ->flags&MEM_Int 
27160 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
27170 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74  e is anything ot
27180 68 65 72 20 74 68 61 6e 20 61 20 72 6f 77 73 65  her than a rowse
27190 74 20 6f 62 6a 65 63 74 20 69 6e 20 6d 65 6d 6f  t object in memo
271a0 72 79 20 63 65 6c 6c 20 50 31 2c 0a 20 20 2a 2a  ry cell P1,.  **
271b0 20 64 65 6c 65 74 65 20 69 74 20 6e 6f 77 20 61   delete it now a
271c0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 50 31  nd initialize P1
271d0 20 77 69 74 68 20 61 6e 20 65 6d 70 74 79 20 72   with an empty r
271e0 6f 77 73 65 74 0a 20 20 2a 2f 0a 20 20 69 66 28  owset.  */.  if(
271f0 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
27200 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29  MEM_RowSet)==0 )
27210 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
27220 65 4d 65 6d 53 65 74 52 6f 77 53 65 74 28 70 49  eMemSetRowSet(pI
27230 6e 31 29 3b 0a 20 20 20 20 69 66 28 20 28 70 49  n1);.    if( (pI
27240 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
27250 52 6f 77 53 65 74 29 3d 3d 30 20 29 20 67 6f 74  RowSet)==0 ) got
27260 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 0a 20  o no_mem;.  }.. 
27270 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
27280 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29  type==P4_INT32 )
27290 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 65 74  ;.  assert( iSet
272a0 3d 3d 2d 31 20 7c 7c 20 69 53 65 74 3e 3d 30 20  ==-1 || iSet>=0 
272b0 29 3b 0a 20 20 69 66 28 20 69 53 65 74 20 29 7b  );.  if( iSet ){
272c0 0a 20 20 20 20 65 78 69 73 74 73 20 3d 20 73 71  .    exists = sq
272d0 6c 69 74 65 33 52 6f 77 53 65 74 54 65 73 74 28  lite3RowSetTest(
272e0 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c  pIn1->u.pRowSet,
272f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
27300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27310 20 28 75 38 29 28 69 53 65 74 3e 3d 30 20 3f 20   (u8)(iSet>=0 ? 
27320 69 53 65 74 20 26 20 30 78 66 20 3a 20 30 78 66  iSet & 0xf : 0xf
27330 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  f),.            
27340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27350 20 20 20 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20     pIn3->u.i);. 
27360 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
27370 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  .      pc = pOp-
27380 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20 20 62  >p2 - 1;.      b
27390 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
273a0 20 20 69 66 28 20 69 53 65 74 3e 3d 30 20 29 7b    if( iSet>=0 ){
273b0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 6f 77 53  .    sqlite3RowS
273c0 65 74 49 6e 73 65 72 74 28 70 49 6e 31 2d 3e 75  etInsert(pIn1->u
273d0 2e 70 52 6f 77 53 65 74 2c 20 70 49 6e 33 2d 3e  .pRowSet, pIn3->
273e0 75 2e 69 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  u.i);.  }.  brea
273f0 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  k;.}...#ifndef S
27400 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
27410 45 52 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50  ER../* Opcode: P
27420 72 6f 67 72 61 6d 20 50 31 20 50 32 20 50 33 20  rogram P1 P2 P3 
27430 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75  P4 *.**.** Execu
27440 74 65 20 74 68 65 20 74 72 69 67 67 65 72 20 70  te the trigger p
27450 72 6f 67 72 61 6d 20 70 61 73 73 65 64 20 61 73  rogram passed as
27460 20 50 34 20 28 74 79 70 65 20 50 34 5f 53 55 42   P4 (type P4_SUB
27470 50 52 4f 47 52 41 4d 29 2e 20 0a 2a 2a 0a 2a 2a  PROGRAM). .**.**
27480 20 50 31 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   P1 contains the
27490 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
274a0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74  memory cell that
274b0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69   contains the fi
274c0 72 73 74 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63  rst memory .** c
274d0 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72 61 79 20  ell in an array 
274e0 6f 66 20 76 61 6c 75 65 73 20 75 73 65 64 20 61  of values used a
274f0 73 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  s arguments to t
27500 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 2e 20  he sub-program. 
27510 50 32 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  P2 .** contains 
27520 74 68 65 20 61 64 64 72 65 73 73 20 74 6f 20 6a  the address to j
27530 75 6d 70 20 74 6f 20 69 66 20 74 68 65 20 73 75  ump to if the su
27540 62 2d 70 72 6f 67 72 61 6d 20 74 68 72 6f 77 73  b-program throws
27550 20 61 6e 20 49 47 4e 4f 52 45 20 0a 2a 2a 20 65   an IGNORE .** e
27560 78 63 65 70 74 69 6f 6e 20 75 73 69 6e 67 20 74  xception using t
27570 68 65 20 52 41 49 53 45 28 29 20 66 75 6e 63 74  he RAISE() funct
27580 69 6f 6e 2e 20 52 65 67 69 73 74 65 72 20 50 33  ion. Register P3
27590 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 64   contains the ad
275a0 64 72 65 73 73 20 0a 2a 2a 20 6f 66 20 61 20 6d  dress .** of a m
275b0 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74 68  emory cell in th
275c0 69 73 20 28 74 68 65 20 70 61 72 65 6e 74 29 20  is (the parent) 
275d0 56 4d 20 74 68 61 74 20 69 73 20 75 73 65 64 20  VM that is used 
275e0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  to allocate the 
275f0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 72 65 71 75 69  .** memory requi
27600 72 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 76  red by the sub-v
27610 64 62 65 20 61 74 20 72 75 6e 74 69 6d 65 2e 0a  dbe at runtime..
27620 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f  **.** P4 is a po
27630 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56 4d 20  inter to the VM 
27640 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
27650 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2e 0a  rigger program..
27660 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 72 6f 67 72  */.case OP_Progr
27670 61 6d 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  am: {        /* 
27680 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  jump */.  int nM
27690 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
276a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
276b0 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 20  emory registers 
276c0 66 6f 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  for sub-program 
276d0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
276e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
276f0 42 79 74 65 73 20 6f 66 20 72 75 6e 74 69 6d 65  Bytes of runtime
27700 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
27710 66 6f 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  for sub-program 
27720 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 74 3b 20 20  */.  Mem *pRt;  
27730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27740 52 65 67 69 73 74 65 72 20 74 6f 20 61 6c 6c 6f  Register to allo
27750 63 61 74 65 20 72 75 6e 74 69 6d 65 20 73 70 61  cate runtime spa
27760 63 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ce */.  Mem *pMe
27770 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
27780 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
27790 74 65 20 74 68 72 6f 75 67 68 20 6d 65 6d 6f 72  te through memor
277a0 79 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 4d 65 6d  y cells */.  Mem
277b0 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *pEnd;         
277c0 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6d 65 6d       /* Last mem
277d0 6f 72 79 20 63 65 6c 6c 20 69 6e 20 6e 65 77 20  ory cell in new 
277e0 61 72 72 61 79 20 2a 2f 0a 20 20 56 64 62 65 46  array */.  VdbeF
277f0 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 20 20 20  rame *pFrame;   
27800 20 20 20 2f 2a 20 4e 65 77 20 76 64 62 65 20 66     /* New vdbe f
27810 72 61 6d 65 20 74 6f 20 65 78 65 63 75 74 65 20  rame to execute 
27820 69 6e 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72  in */.  SubProgr
27830 61 6d 20 2a 70 50 72 6f 67 72 61 6d 3b 20 20 20  am *pProgram;   
27840 2f 2a 20 53 75 62 2d 70 72 6f 67 72 61 6d 20 74  /* Sub-program t
27850 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 76  o execute */.  v
27860 6f 69 64 20 2a 74 3b 20 20 20 20 20 20 20 20 20  oid *t;         
27870 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20         /* Token 
27880 69 64 65 6e 74 69 66 79 69 6e 67 20 74 72 69 67  identifying trig
27890 67 65 72 20 2a 2f 0a 0a 20 20 70 50 72 6f 67 72  ger */..  pProgr
278a0 61 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72  am = pOp->p4.pPr
278b0 6f 67 72 61 6d 3b 0a 20 20 70 52 74 20 3d 20 26  ogram;.  pRt = &
278c0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
278d0 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
278e0 6c 69 64 28 70 52 74 29 20 29 3b 0a 20 20 61 73  lid(pRt) );.  as
278f0 73 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e  sert( pProgram->
27900 6e 4f 70 3e 30 20 29 3b 0a 20 20 0a 20 20 2f 2a  nOp>0 );.  .  /*
27910 20 49 66 20 74 68 65 20 70 35 20 66 6c 61 67 20   If the p5 flag 
27920 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 72  is clear, then r
27930 65 63 75 72 73 69 76 65 20 69 6e 76 6f 63 61 74  ecursive invocat
27940 69 6f 6e 20 6f 66 20 74 72 69 67 67 65 72 73 20  ion of triggers 
27950 69 73 20 0a 20 20 2a 2a 20 64 69 73 61 62 6c 65  is .  ** disable
27960 64 20 66 6f 72 20 62 61 63 6b 77 61 72 64 73 20  d for backwards 
27970 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 28 70  compatibility (p
27980 35 20 69 73 20 73 65 74 20 69 66 20 74 68 69 73  5 is set if this
27990 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 20 20 2a   sub-program.  *
279a0 2a 20 69 73 20 72 65 61 6c 6c 79 20 61 20 74 72  * is really a tr
279b0 69 67 67 65 72 2c 20 6e 6f 74 20 61 20 66 6f 72  igger, not a for
279c0 65 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 2c  eign key action,
279d0 20 61 6e 64 20 74 68 65 20 66 6c 61 67 20 73 65   and the flag se
279e0 74 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72  t.  ** and clear
279f0 65 64 20 62 79 20 74 68 65 20 22 50 52 41 47 4d  ed by the "PRAGM
27a00 41 20 72 65 63 75 72 73 69 76 65 5f 74 72 69 67  A recursive_trig
27a10 67 65 72 73 22 20 63 6f 6d 6d 61 6e 64 20 69 73  gers" command is
27a20 20 63 6c 65 61 72 29 2e 0a 20 20 2a 2a 20 0a 20   clear)..  ** . 
27a30 20 2a 2a 20 49 74 20 69 73 20 72 65 63 75 72 73   ** It is recurs
27a40 69 76 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ive invocation o
27a50 66 20 74 72 69 67 67 65 72 73 2c 20 61 74 20 74  f triggers, at t
27a60 68 65 20 53 51 4c 20 6c 65 76 65 6c 2c 20 74 68  he SQL level, th
27a70 61 74 20 69 73 20 0a 20 20 2a 2a 20 64 69 73 61  at is .  ** disa
27a80 62 6c 65 64 2e 20 49 6e 20 73 6f 6d 65 20 63 61  bled. In some ca
27a90 73 65 73 20 61 20 73 69 6e 67 6c 65 20 74 72 69  ses a single tri
27aa0 67 67 65 72 20 6d 61 79 20 67 65 6e 65 72 61 74  gger may generat
27ab0 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  e more than one 
27ac0 0a 20 20 2a 2a 20 53 75 62 50 72 6f 67 72 61 6d  .  ** SubProgram
27ad0 20 28 69 66 20 74 68 65 20 74 72 69 67 67 65 72   (if the trigger
27ae0 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64   may be executed
27af0 20 77 69 74 68 20 6d 6f 72 65 20 74 68 61 6e 20   with more than 
27b00 6f 6e 65 20 64 69 66 66 65 72 65 6e 74 20 0a 20  one different . 
27b10 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   ** ON CONFLICT 
27b20 61 6c 67 6f 72 69 74 68 6d 29 2e 20 53 75 62 50  algorithm). SubP
27b30 72 6f 67 72 61 6d 20 73 74 72 75 63 74 75 72 65  rogram structure
27b40 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
27b50 68 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65 20  h a.  ** single 
27b60 74 72 69 67 67 65 72 20 61 6c 6c 20 68 61 76 65  trigger all have
27b70 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
27b80 66 6f 72 20 74 68 65 20 53 75 62 50 72 6f 67 72  for the SubProgr
27b90 61 6d 2e 74 6f 6b 65 6e 20 0a 20 20 2a 2a 20 76  am.token .  ** v
27ba0 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69  ariable.  */.  i
27bb0 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20  f( pOp->p5 ){.  
27bc0 20 20 74 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e    t = pProgram->
27bd0 74 6f 6b 65 6e 3b 0a 20 20 20 20 66 6f 72 28 70  token;.    for(p
27be0 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b  Frame=p->pFrame;
27bf0 20 70 46 72 61 6d 65 20 26 26 20 70 46 72 61 6d   pFrame && pFram
27c00 65 2d 3e 74 6f 6b 65 6e 21 3d 74 3b 20 70 46 72  e->token!=t; pFr
27c10 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72  ame=pFrame->pPar
27c20 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ent);.    if( pF
27c30 72 61 6d 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  rame ) break;.  
27c40 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 46 72 61  }..  if( p->nFra
27c50 6d 65 3e 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  me>=db->aLimit[S
27c60 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47  QLITE_LIMIT_TRIG
27c70 47 45 52 5f 44 45 50 54 48 5d 20 29 7b 0a 20 20  GER_DEPTH] ){.  
27c80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
27c90 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
27ca0 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
27cb0 72 72 4d 73 67 2c 20 64 62 2c 20 22 74 6f 6f 20  rrMsg, db, "too 
27cc0 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74  many levels of t
27cd0 72 69 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e  rigger recursion
27ce0 22 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ");.    break;. 
27cf0 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65   }..  /* Registe
27d00 72 20 70 52 74 20 69 73 20 75 73 65 64 20 74 6f  r pRt is used to
27d10 20 73 74 6f 72 65 20 74 68 65 20 6d 65 6d 6f 72   store the memor
27d20 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 61  y required to sa
27d30 76 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a  ve the state.  *
27d40 2a 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  * of the current
27d50 20 70 72 6f 67 72 61 6d 2c 20 61 6e 64 20 74 68   program, and th
27d60 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65  e memory require
27d70 64 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20  d at runtime to 
27d80 65 78 65 63 75 74 65 0a 20 20 2a 2a 20 74 68 65  execute.  ** the
27d90 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
27da0 2e 20 49 66 20 74 68 69 73 20 74 72 69 67 67 65  . If this trigge
27db0 72 20 68 61 73 20 62 65 65 6e 20 66 69 72 65 64  r has been fired
27dc0 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 70 52   before, then pR
27dd0 74 20 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  t .  ** is alrea
27de0 64 79 20 61 6c 6c 6f 63 61 74 65 64 2e 20 4f 74  dy allocated. Ot
27df0 68 65 72 77 69 73 65 2c 20 69 74 20 6d 75 73 74  herwise, it must
27e00 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
27e10 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 52 74 2d    */.  if( (pRt-
27e20 3e 66 6c 61 67 73 26 4d 45 4d 5f 46 72 61 6d 65  >flags&MEM_Frame
27e30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53  )==0 ){.    /* S
27e40 75 62 50 72 6f 67 72 61 6d 2e 6e 4d 65 6d 20 69  ubProgram.nMem i
27e50 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
27e60 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  ber of memory ce
27e70 6c 6c 73 20 75 73 65 64 20 62 79 20 74 68 65 20  lls used by the 
27e80 0a 20 20 20 20 2a 2a 20 70 72 6f 67 72 61 6d 20  .    ** program 
27e90 73 74 6f 72 65 64 20 69 6e 20 53 75 62 50 72 6f  stored in SubPro
27ea0 67 72 61 6d 2e 61 4f 70 2e 20 41 73 20 77 65 6c  gram.aOp. As wel
27eb0 6c 20 61 73 20 74 68 65 73 65 2c 20 6f 6e 65 20  l as these, one 
27ec0 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 63 65  memory.    ** ce
27ed0 6c 6c 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ll is required f
27ee0 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 75  or each cursor u
27ef0 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 67 72  sed by the progr
27f00 61 6d 2e 20 53 65 74 20 6c 6f 63 61 6c 0a 20 20  am. Set local.  
27f10 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 4d    ** variable nM
27f20 65 6d 20 28 61 6e 64 20 6c 61 74 65 72 2c 20 56  em (and later, V
27f30 64 62 65 46 72 61 6d 65 2e 6e 43 68 69 6c 64 4d  dbeFrame.nChildM
27f40 65 6d 29 20 74 6f 20 74 68 69 73 20 76 61 6c 75  em) to this valu
27f50 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4d  e..    */.    nM
27f60 65 6d 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 6e  em = pProgram->n
27f70 4d 65 6d 20 2b 20 70 50 72 6f 67 72 61 6d 2d 3e  Mem + pProgram->
27f80 6e 43 73 72 3b 0a 20 20 20 20 6e 42 79 74 65 20  nCsr;.    nByte 
27f90 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
27fa0 56 64 62 65 46 72 61 6d 65 29 29 0a 20 20 20 20  VdbeFrame)).    
27fb0 20 20 20 20 20 20 20 20 20 20 2b 20 6e 4d 65 6d            + nMem
27fc0 20 2a 20 73 69 7a 65 6f 66 28 4d 65 6d 29 0a 20   * sizeof(Mem). 
27fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 70               + p
27fe0 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 20 2a 20  Program->nCsr * 
27ff0 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
28000 72 20 2a 29 3b 0a 20 20 20 20 70 46 72 61 6d 65  r *);.    pFrame
28010 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
28020 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
28030 29 3b 0a 20 20 20 20 69 66 28 20 21 70 46 72 61  );.    if( !pFra
28040 6d 65 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  me ){.      goto
28050 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
28060 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
28070 6d 52 65 6c 65 61 73 65 28 70 52 74 29 3b 0a 20  mRelease(pRt);. 
28080 20 20 20 70 52 74 2d 3e 66 6c 61 67 73 20 3d 20     pRt->flags = 
28090 4d 45 4d 5f 46 72 61 6d 65 3b 0a 20 20 20 20 70  MEM_Frame;.    p
280a0 52 74 2d 3e 75 2e 70 46 72 61 6d 65 20 3d 20 70  Rt->u.pFrame = p
280b0 46 72 61 6d 65 3b 0a 0a 20 20 20 20 70 46 72 61  Frame;..    pFra
280c0 6d 65 2d 3e 76 20 3d 20 70 3b 0a 20 20 20 20 70  me->v = p;.    p
280d0 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d  Frame->nChildMem
280e0 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 70 46 72   = nMem;.    pFr
280f0 61 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72 20 3d  ame->nChildCsr =
28100 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b   pProgram->nCsr;
28110 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 70 63 20  .    pFrame->pc 
28120 3d 20 70 63 3b 0a 20 20 20 20 70 46 72 61 6d 65  = pc;.    pFrame
28130 2d 3e 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d  ->aMem = p->aMem
28140 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 4d  ;.    pFrame->nM
28150 65 6d 20 3d 20 70 2d 3e 6e 4d 65 6d 3b 0a 20 20  em = p->nMem;.  
28160 20 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 20    pFrame->apCsr 
28170 3d 20 70 2d 3e 61 70 43 73 72 3b 0a 20 20 20 20  = p->apCsr;.    
28180 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 20  pFrame->nCursor 
28190 3d 20 70 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20  = p->nCursor;.  
281a0 20 20 70 46 72 61 6d 65 2d 3e 61 4f 70 20 3d 20    pFrame->aOp = 
281b0 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 70 46 72 61  p->aOp;.    pFra
281c0 6d 65 2d 3e 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  me->nOp = p->nOp
281d0 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 74 6f  ;.    pFrame->to
281e0 6b 65 6e 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e  ken = pProgram->
281f0 74 6f 6b 65 6e 3b 0a 0a 20 20 20 20 70 45 6e 64  token;..    pEnd
28200 20 3d 20 26 56 64 62 65 46 72 61 6d 65 4d 65 6d   = &VdbeFrameMem
28210 28 70 46 72 61 6d 65 29 5b 70 46 72 61 6d 65 2d  (pFrame)[pFrame-
28220 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 20  >nChildMem];.   
28230 20 66 6f 72 28 70 4d 65 6d 3d 56 64 62 65 46 72   for(pMem=VdbeFr
28240 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65 29 3b 20  ameMem(pFrame); 
28250 70 4d 65 6d 21 3d 70 45 6e 64 3b 20 70 4d 65 6d  pMem!=pEnd; pMem
28260 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ++){.      pMem-
28270 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
28280 6c 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 64  l;.      pMem->d
28290 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20  b = db;.    }.  
282a0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 72 61 6d  }else{.    pFram
282b0 65 20 3d 20 70 52 74 2d 3e 75 2e 70 46 72 61 6d  e = pRt->u.pFram
282c0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
282d0 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 2b 70 50  Program->nMem+pP
282e0 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 70 46  rogram->nCsr==pF
282f0 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 20  rame->nChildMem 
28300 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
28310 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 70  Program->nCsr==p
28320 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72  Frame->nChildCsr
28330 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
28340 70 63 3d 3d 70 46 72 61 6d 65 2d 3e 70 63 20 29  pc==pFrame->pc )
28350 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 6e 46 72 61  ;.  }..  p->nFra
28360 6d 65 2b 2b 3b 0a 20 20 70 46 72 61 6d 65 2d 3e  me++;.  pFrame->
28370 70 50 61 72 65 6e 74 20 3d 20 70 2d 3e 70 46 72  pParent = p->pFr
28380 61 6d 65 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 6c  ame;.  pFrame->l
28390 61 73 74 52 6f 77 69 64 20 3d 20 64 62 2d 3e 6c  astRowid = db->l
283a0 61 73 74 52 6f 77 69 64 3b 0a 20 20 70 46 72 61  astRowid;.  pFra
283b0 6d 65 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 2d  me->nChange = p-
283c0 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 70 2d 3e 6e  >nChange;.  p->n
283d0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d  Change = 0;.  p-
283e0 3e 70 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65  >pFrame = pFrame
283f0 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 4d  ;.  p->aMem = aM
28400 65 6d 20 3d 20 26 56 64 62 65 46 72 61 6d 65 4d  em = &VdbeFrameM
28410 65 6d 28 70 46 72 61 6d 65 29 5b 2d 31 5d 3b 0a  em(pFrame)[-1];.
28420 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61    p->nMem = pFra
28430 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 3b 0a 20  me->nChildMem;. 
28440 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75   p->nCursor = (u
28450 31 36 29 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c  16)pFrame->nChil
28460 64 43 73 72 3b 0a 20 20 70 2d 3e 61 70 43 73 72  dCsr;.  p->apCsr
28470 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
28480 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 2b  *)&aMem[p->nMem+
28490 31 5d 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 61  1];.  p->aOp = a
284a0 4f 70 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 61  Op = pProgram->a
284b0 4f 70 3b 0a 20 20 70 2d 3e 6e 4f 70 20 3d 20 70  Op;.  p->nOp = p
284c0 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3b 0a 20 20  Program->nOp;.  
284d0 70 63 20 3d 20 2d 31 3b 0a 0a 20 20 62 72 65 61  pc = -1;..  brea
284e0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
284f0 20 50 61 72 61 6d 20 50 31 20 50 32 20 2a 20 2a   Param P1 P2 * *
28500 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70   *.**.** This op
28510 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  code is only eve
28520 72 20 70 72 65 73 65 6e 74 20 69 6e 20 73 75 62  r present in sub
28530 2d 70 72 6f 67 72 61 6d 73 20 63 61 6c 6c 65 64  -programs called
28540 20 76 69 61 20 74 68 65 20 0a 2a 2a 20 4f 50 5f   via the .** OP_
28550 50 72 6f 67 72 61 6d 20 69 6e 73 74 72 75 63 74  Program instruct
28560 69 6f 6e 2e 20 43 6f 70 79 20 61 20 76 61 6c 75  ion. Copy a valu
28570 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  e currently stor
28580 65 64 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 0a  ed in a memory .
28590 2a 2a 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 63  ** cell of the c
285a0 61 6c 6c 69 6e 67 20 28 70 61 72 65 6e 74 29 20  alling (parent) 
285b0 66 72 61 6d 65 20 74 6f 20 63 65 6c 6c 20 50 32  frame to cell P2
285c0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
285d0 66 72 61 6d 65 73 20 0a 2a 2a 20 61 64 64 72 65  frames .** addre
285e0 73 73 20 73 70 61 63 65 2e 20 54 68 69 73 20 69  ss space. This i
285f0 73 20 75 73 65 64 20 62 79 20 74 72 69 67 67 65  s used by trigge
28600 72 20 70 72 6f 67 72 61 6d 73 20 74 6f 20 61 63  r programs to ac
28610 63 65 73 73 20 74 68 65 20 6e 65 77 2e 2a 20 0a  cess the new.* .
28620 2a 2a 20 61 6e 64 20 6f 6c 64 2e 2a 20 76 61 6c  ** and old.* val
28630 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ues..**.** The a
28640 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 63 65  ddress of the ce
28650 6c 6c 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ll in the parent
28660 20 66 72 61 6d 65 20 69 73 20 64 65 74 65 72 6d   frame is determ
28670 69 6e 65 64 20 62 79 20 61 64 64 69 6e 67 0a 2a  ined by adding.*
28680 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
28690 68 65 20 50 31 20 61 72 67 75 6d 65 6e 74 20 74  he P1 argument t
286a0 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  o the value of t
286b0 68 65 20 50 31 20 61 72 67 75 6d 65 6e 74 20 74  he P1 argument t
286c0 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67  o the.** calling
286d0 20 4f 50 5f 50 72 6f 67 72 61 6d 20 69 6e 73 74   OP_Program inst
286e0 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  ruction..*/.case
286f0 20 4f 50 5f 50 61 72 61 6d 3a 20 7b 20 20 20 20   OP_Param: {    
28700 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70         /* out2-p
28710 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 56  rerelease */.  V
28720 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
28730 3b 0a 20 20 4d 65 6d 20 2a 70 49 6e 3b 0a 20 20  ;.  Mem *pIn;.  
28740 70 46 72 61 6d 65 20 3d 20 70 2d 3e 70 46 72 61  pFrame = p->pFra
28750 6d 65 3b 0a 20 20 70 49 6e 20 3d 20 26 70 46 72  me;.  pIn = &pFr
28760 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70  ame->aMem[pOp->p
28770 31 20 2b 20 70 46 72 61 6d 65 2d 3e 61 4f 70 5b  1 + pFrame->aOp[
28780 70 46 72 61 6d 65 2d 3e 70 63 5d 2e 70 31 5d 3b  pFrame->pc].p1];
28790 20 20 20 0a 20 20 73 71 6c 69 74 65 33 56 64 62     .  sqlite3Vdb
287a0 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
287b0 70 4f 75 74 2c 20 70 49 6e 2c 20 4d 45 4d 5f 45  pOut, pIn, MEM_E
287c0 70 68 65 6d 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  phem);.  break;.
287d0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66  }..#endif /* #if
287e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
287f0 5f 54 52 49 47 47 45 52 20 2a 2f 0a 0a 23 69 66  _TRIGGER */..#if
28800 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28810 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 2f 2a 20  _FOREIGN_KEY./* 
28820 4f 70 63 6f 64 65 3a 20 46 6b 43 6f 75 6e 74 65  Opcode: FkCounte
28830 72 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  r P1 P2 * * *.**
28840 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 61 20  .** Increment a 
28850 22 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e  "constraint coun
28860 74 65 72 22 20 62 79 20 50 32 20 28 50 32 20 6d  ter" by P2 (P2 m
28870 61 79 20 62 65 20 6e 65 67 61 74 69 76 65 20 6f  ay be negative o
28880 72 20 70 6f 73 69 74 69 76 65 29 2e 0a 2a 2a 20  r positive)..** 
28890 49 66 20 50 31 20 69 73 20 6e 6f 6e 2d 7a 65 72  If P1 is non-zer
288a0 6f 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  o, the database 
288b0 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74  constraint count
288c0 65 72 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  er is incremente
288d0 64 20 0a 2a 2a 20 28 64 65 66 65 72 72 65 64 20  d .** (deferred 
288e0 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
288f0 74 72 61 69 6e 74 73 29 2e 20 4f 74 68 65 72 77  traints). Otherw
28900 69 73 65 2c 20 69 66 20 50 31 20 69 73 20 7a 65  ise, if P1 is ze
28910 72 6f 2c 20 74 68 65 20 0a 2a 2a 20 73 74 61 74  ro, the .** stat
28920 65 6d 65 6e 74 20 63 6f 75 6e 74 65 72 20 69 73  ement counter is
28930 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 28 69 6d   incremented (im
28940 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
28950 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 29  key constraints)
28960 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 6b 43  ..*/.case OP_FkC
28970 6f 75 6e 74 65 72 3a 20 7b 0a 20 20 69 66 28 20  ounter: {.  if( 
28980 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 64  pOp->p1 ){.    d
28990 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
289a0 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d   += pOp->p2;.  }
289b0 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 46 6b  else{.    p->nFk
289c0 43 6f 6e 73 74 72 61 69 6e 74 20 2b 3d 20 70 4f  Constraint += pO
289d0 70 2d 3e 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65  p->p2;.  }.  bre
289e0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
289f0 3a 20 46 6b 49 66 5a 65 72 6f 20 50 31 20 50 32  : FkIfZero P1 P2
28a00 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69   * * *.**.** Thi
28a10 73 20 6f 70 63 6f 64 65 20 74 65 73 74 73 20 69  s opcode tests i
28a20 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  f a foreign key 
28a30 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74  constraint-count
28a40 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
28a50 7a 65 72 6f 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20  zero..** If so, 
28a60 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74  jump to instruct
28a70 69 6f 6e 20 50 32 2e 20 4f 74 68 65 72 77 69 73  ion P2. Otherwis
28a80 65 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  e, fall through 
28a90 74 6f 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20  to the next .** 
28aa0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  instruction..**.
28ab0 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 6f 6e 2d  ** If P1 is non-
28ac0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a  zero, then the j
28ad0 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 20  ump is taken if 
28ae0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
28af0 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72 0a  straint-counter.
28b00 2a 2a 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20  ** is zero (the 
28b10 6f 6e 65 20 74 68 61 74 20 63 6f 75 6e 74 73 20  one that counts 
28b20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
28b30 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e  int violations).
28b40 20 49 66 20 50 31 20 69 73 0a 2a 2a 20 7a 65 72   If P1 is.** zer
28b50 6f 2c 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74  o, the jump is t
28b60 61 6b 65 6e 20 69 66 20 74 68 65 20 73 74 61 74  aken if the stat
28b70 65 6d 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  ement constraint
28b80 2d 63 6f 75 6e 74 65 72 20 69 73 20 7a 65 72 6f  -counter is zero
28b90 0a 2a 2a 20 28 69 6d 6d 65 64 69 61 74 65 20 66  .** (immediate f
28ba0 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
28bb0 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73  raint violations
28bc0 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 6b  )..*/.case OP_Fk
28bd0 49 66 5a 65 72 6f 3a 20 7b 20 20 20 20 20 20 20  IfZero: {       
28be0 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69    /* jump */.  i
28bf0 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20  f( pOp->p1 ){.  
28c00 20 20 69 66 28 20 64 62 2d 3e 6e 44 65 66 65 72    if( db->nDefer
28c10 72 65 64 43 6f 6e 73 3d 3d 30 20 29 20 70 63 20  redCons==0 ) pc 
28c20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d  = pOp->p2-1;.  }
28c30 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 2d  else{.    if( p-
28c40 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3d 3d  >nFkConstraint==
28c50 30 20 29 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32  0 ) pc = pOp->p2
28c60 2d 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  -1;.  }.  break;
28c70 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66  .}.#endif /* #if
28c80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28c90 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20 2a 2f 0a  _FOREIGN_KEY */.
28ca0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28cb0 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
28cc0 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 65  NT./* Opcode: Me
28cd0 6d 4d 61 78 20 50 31 20 50 32 20 2a 20 2a 20 2a  mMax P1 P2 * * *
28ce0 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 72  .**.** P1 is a r
28cf0 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72  egister in the r
28d00 6f 6f 74 20 66 72 61 6d 65 20 6f 66 20 74 68 69  oot frame of thi
28d10 73 20 56 4d 20 28 74 68 65 20 72 6f 6f 74 20 66  s VM (the root f
28d20 72 61 6d 65 20 69 73 0a 2a 2a 20 64 69 66 66 65  rame is.** diffe
28d30 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 63 75  rent from the cu
28d40 72 72 65 6e 74 20 66 72 61 6d 65 20 69 66 20 74  rrent frame if t
28d50 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
28d60 69 73 20 62 65 69 6e 67 20 65 78 65 63 75 74 65  is being execute
28d70 64 0a 2a 2a 20 77 69 74 68 69 6e 20 61 20 73 75  d.** within a su
28d80 62 2d 70 72 6f 67 72 61 6d 29 2e 20 53 65 74 20  b-program). Set 
28d90 74 68 65 20 76 61 6c 75 65 20 6f 66 20 72 65 67  the value of reg
28da0 69 73 74 65 72 20 50 31 20 74 6f 20 74 68 65 20  ister P1 to the 
28db0 6d 61 78 69 6d 75 6d 20 6f 66 20 0a 2a 2a 20 69  maximum of .** i
28dc0 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
28dd0 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 69   and the value i
28de0 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  n register P2..*
28df0 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75  *.** This instru
28e00 63 74 69 6f 6e 20 74 68 72 6f 77 73 20 61 6e 20  ction throws an 
28e10 65 72 72 6f 72 20 69 66 20 74 68 65 20 6d 65 6d  error if the mem
28e20 6f 72 79 20 63 65 6c 6c 20 69 73 20 6e 6f 74 20  ory cell is not 
28e30 69 6e 69 74 69 61 6c 6c 79 0a 2a 2a 20 61 6e 20  initially.** an 
28e40 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 63 61 73 65  integer..*/.case
28e50 20 4f 50 5f 4d 65 6d 4d 61 78 3a 20 7b 20 20 20   OP_MemMax: {   
28e60 20 20 20 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20       /* in2 */. 
28e70 20 4d 65 6d 20 2a 70 49 6e 31 3b 0a 20 20 56 64   Mem *pIn1;.  Vd
28e80 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b  beFrame *pFrame;
28e90 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65  .  if( p->pFrame
28ea0 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 46 72 61   ){.    for(pFra
28eb0 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46  me=p->pFrame; pF
28ec0 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70  rame->pParent; p
28ed0 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50  Frame=pFrame->pP
28ee0 61 72 65 6e 74 29 3b 0a 20 20 20 20 70 49 6e 31  arent);.    pIn1
28ef0 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d   = &pFrame->aMem
28f00 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 7d 65 6c  [pOp->p1];.  }el
28f10 73 65 7b 0a 20 20 20 20 70 49 6e 31 20 3d 20 26  se{.    pIn1 = &
28f20 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
28f30 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d   }.  assert( mem
28f40 49 73 56 61 6c 69 64 28 70 49 6e 31 29 20 29 3b  IsValid(pIn1) );
28f50 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
28f60 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 31  mIntegerify(pIn1
28f70 29 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65  );.  pIn2 = &aMe
28f80 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71  m[pOp->p2];.  sq
28f90 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65  lite3VdbeMemInte
28fa0 67 65 72 69 66 79 28 70 49 6e 32 29 3b 0a 20 20  gerify(pIn2);.  
28fb0 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3c 70 49  if( pIn1->u.i<pI
28fc0 6e 32 2d 3e 75 2e 69 29 7b 0a 20 20 20 20 70 49  n2->u.i){.    pI
28fd0 6e 31 2d 3e 75 2e 69 20 3d 20 70 49 6e 32 2d 3e  n1->u.i = pIn2->
28fe0 75 2e 69 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  u.i;.  }.  break
28ff0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
29000 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
29010 43 52 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 20 4f  CREMENT */../* O
29020 70 63 6f 64 65 3a 20 49 66 50 6f 73 20 50 31 20  pcode: IfPos P1 
29030 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49  P2 * * *.**.** I
29040 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 72  f the value of r
29050 65 67 69 73 74 65 72 20 50 31 20 69 73 20 31 20  egister P1 is 1 
29060 6f 72 20 67 72 65 61 74 65 72 2c 20 6a 75 6d 70  or greater, jump
29070 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 74   to P2..**.** It
29080 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 75   is illegal to u
29090 73 65 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  se this instruct
290a0 69 6f 6e 20 6f 6e 20 61 20 72 65 67 69 73 74 65  ion on a registe
290b0 72 20 74 68 61 74 20 64 6f 65 73 0a 2a 2a 20 6e  r that does.** n
290c0 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e  ot contain an in
290d0 74 65 67 65 72 2e 20 20 41 6e 20 61 73 73 65 72  teger.  An asser
290e0 74 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c 20  tion fault will 
290f0 72 65 73 75 6c 74 20 69 66 20 79 6f 75 20 74 72  result if you tr
29100 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66  y..*/.case OP_If
29110 50 6f 73 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  Pos: {        /*
29120 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20   jump, in1 */.  
29130 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
29140 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
29150 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d   pIn1->flags&MEM
29160 5f 49 6e 74 20 29 3b 0a 20 20 69 66 28 20 70 49  _Int );.  if( pI
29170 6e 31 2d 3e 75 2e 69 3e 30 20 29 7b 0a 20 20 20  n1->u.i>0 ){.   
29180 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
29190 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   1;.  }.  break;
291a0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .}../* Opcode: I
291b0 66 4e 65 67 20 50 31 20 50 32 20 2a 20 2a 20 2a  fNeg P1 P2 * * *
291c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 76 61  .**.** If the va
291d0 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20  lue of register 
291e0 50 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  P1 is less than 
291f0 7a 65 72 6f 2c 20 6a 75 6d 70 20 74 6f 20 50 32  zero, jump to P2
29200 2e 20 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  . .**.** It is i
29210 6c 6c 65 67 61 6c 20 74 6f 20 75 73 65 20 74 68  llegal to use th
29220 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f  is instruction o
29230 6e 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61  n a register tha
29240 74 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  t does.** not co
29250 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72  ntain an integer
29260 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
29270 66 61 75 6c 74 20 77 69 6c 6c 20 72 65 73 75 6c  fault will resul
29280 74 20 69 66 20 79 6f 75 20 74 72 79 2e 0a 2a 2f  t if you try..*/
29290 0a 63 61 73 65 20 4f 50 5f 49 66 4e 65 67 3a 20  .case OP_IfNeg: 
292a0 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
292b0 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  , in1 */.  pIn1 
292c0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
292d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31  ;.  assert( pIn1
292e0 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ->flags&MEM_Int 
292f0 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75  );.  if( pIn1->u
29300 2e 69 3c 30 20 29 7b 0a 20 20 20 20 20 70 63 20  .i<0 ){.     pc 
29310 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
29320 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
29330 2a 20 4f 70 63 6f 64 65 3a 20 49 66 5a 65 72 6f  * Opcode: IfZero
29340 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
29350 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74 65 72  .** The register
29360 20 50 31 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e   P1 must contain
29370 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 41 64   an integer.  Ad
29380 64 20 6c 69 74 65 72 61 6c 20 50 33 20 74 6f 20  d literal P3 to 
29390 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20  the.** value in 
293a0 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 49 66  register P1.  If
293b0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 65   the result is e
293c0 78 61 63 74 6c 79 20 30 2c 20 6a 75 6d 70 20 74  xactly 0, jump t
293d0 6f 20 50 32 2e 20 0a 2a 2a 0a 2a 2a 20 49 74 20  o P2. .**.** It 
293e0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 75 73  is illegal to us
293f0 65 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  e this instructi
29400 6f 6e 20 6f 6e 20 61 20 72 65 67 69 73 74 65 72  on on a register
29410 20 74 68 61 74 20 64 6f 65 73 0a 2a 2a 20 6e 6f   that does.** no
29420 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74  t contain an int
29430 65 67 65 72 2e 20 20 41 6e 20 61 73 73 65 72 74  eger.  An assert
29440 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c 20 72  ion fault will r
29450 65 73 75 6c 74 20 69 66 20 79 6f 75 20 74 72 79  esult if you try
29460 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 5a  ..*/.case OP_IfZ
29470 65 72 6f 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  ero: {        /*
29480 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20   jump, in1 */.  
29490 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
294a0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
294b0 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d   pIn1->flags&MEM
294c0 5f 49 6e 74 20 29 3b 0a 20 20 70 49 6e 31 2d 3e  _Int );.  pIn1->
294d0 75 2e 69 20 2b 3d 20 70 4f 70 2d 3e 70 33 3b 0a  u.i += pOp->p3;.
294e0 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3d    if( pIn1->u.i=
294f0 3d 30 20 29 7b 0a 20 20 20 20 20 70 63 20 3d 20  =0 ){.     pc = 
29500 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d  pOp->p2 - 1;.  }
29510 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
29520 4f 70 63 6f 64 65 3a 20 41 67 67 53 74 65 70 20  Opcode: AggStep 
29530 2a 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  * P2 P3 P4 P5.**
29540 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20  .** Execute the 
29550 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f  step function fo
29560 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  r an aggregate. 
29570 20 54 68 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e   The.** function
29580 20 68 61 73 20 50 35 20 61 72 67 75 6d 65 6e 74   has P5 argument
29590 73 2e 20 20 20 50 34 20 69 73 20 61 20 70 6f 69  s.   P4 is a poi
295a0 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63  nter to the Func
295b0 44 65 66 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  Def.** structure
295c0 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73 20   that specifies 
295d0 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 55  the function.  U
295e0 73 65 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 50  se register.** P
295f0 33 20 61 73 20 74 68 65 20 61 63 63 75 6d 75 6c  3 as the accumul
29600 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
29610 50 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  P5 arguments are
29620 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69   taken from regi
29630 73 74 65 72 20 50 32 20 61 6e 64 20 69 74 73 0a  ster P2 and its.
29640 2a 2a 20 73 75 63 63 65 73 73 6f 72 73 2e 0a 2a  ** successors..*
29650 2f 0a 63 61 73 65 20 4f 50 5f 41 67 67 53 74 65  /.case OP_AggSte
29660 70 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  p: {.  int n;.  
29670 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 70 4d  int i;.  Mem *pM
29680 65 6d 3b 0a 20 20 4d 65 6d 20 2a 70 52 65 63 3b  em;.  Mem *pRec;
29690 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
296a0 78 74 20 63 74 78 3b 0a 20 20 73 71 6c 69 74 65  xt ctx;.  sqlite
296b0 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 3b  3_value **apVal;
296c0 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 35 3b  ..  n = pOp->p5;
296d0 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20  .  assert( n>=0 
296e0 29 3b 0a 20 20 70 52 65 63 20 3d 20 26 61 4d 65  );.  pRec = &aMe
296f0 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 70  m[pOp->p2];.  ap
29700 56 61 6c 20 3d 20 70 2d 3e 61 70 41 72 67 3b 0a  Val = p->apArg;.
29710 20 20 61 73 73 65 72 74 28 20 61 70 56 61 6c 20    assert( apVal 
29720 7c 7c 20 6e 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  || n==0 );.  for
29730 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20  (i=0; i<n; i++, 
29740 70 52 65 63 2b 2b 29 7b 0a 20 20 20 20 61 73 73  pRec++){.    ass
29750 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
29760 70 52 65 63 29 20 29 3b 0a 20 20 20 20 61 70 56  pRec) );.    apV
29770 61 6c 5b 69 5d 20 3d 20 70 52 65 63 3b 0a 20 20  al[i] = pRec;.  
29780 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
29790 67 65 28 70 2c 20 70 52 65 63 29 3b 0a 20 20 20  ge(p, pRec);.   
297a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
297b0 74 6f 72 65 54 79 70 65 28 70 52 65 63 29 3b 0a  toreType(pRec);.
297c0 20 20 7d 0a 20 20 63 74 78 2e 70 46 75 6e 63 20    }.  ctx.pFunc 
297d0 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b  = pOp->p4.pFunc;
297e0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
297f0 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c  p3>0 && pOp->p3<
29800 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 63 74  =p->nMem );.  ct
29810 78 2e 70 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d 20  x.pMem = pMem = 
29820 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
29830 20 20 70 4d 65 6d 2d 3e 6e 2b 2b 3b 0a 20 20 63    pMem->n++;.  c
29840 74 78 2e 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  tx.s.flags = MEM
29850 5f 4e 75 6c 6c 3b 0a 20 20 63 74 78 2e 73 2e 7a  _Null;.  ctx.s.z
29860 20 3d 20 30 3b 0a 20 20 63 74 78 2e 73 2e 7a 4d   = 0;.  ctx.s.zM
29870 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 63 74 78  alloc = 0;.  ctx
29880 2e 73 2e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 63  .s.xDel = 0;.  c
29890 74 78 2e 73 2e 64 62 20 3d 20 64 62 3b 0a 20 20  tx.s.db = db;.  
298a0 63 74 78 2e 69 73 45 72 72 6f 72 20 3d 20 30 3b  ctx.isError = 0;
298b0 0a 20 20 63 74 78 2e 70 43 6f 6c 6c 20 3d 20 30  .  ctx.pColl = 0
298c0 3b 0a 20 20 69 66 28 20 63 74 78 2e 70 46 75 6e  ;.  if( ctx.pFun
298d0 63 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  c->flags & SQLIT
298e0 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
298f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
29900 4f 70 3e 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20  Op>p->aOp );.   
29910 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
29920 2e 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c  .p4type==P4_COLL
29930 53 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  SEQ );.    asser
29940 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64  t( pOp[-1].opcod
29950 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71 20 29 3b  e==OP_CollSeq );
29960 0a 20 20 20 20 63 74 78 2e 70 43 6f 6c 6c 20 3d  .    ctx.pColl =
29970 20 70 4f 70 5b 2d 31 5d 2e 70 34 2e 70 43 6f 6c   pOp[-1].p4.pCol
29980 6c 3b 0a 20 20 7d 0a 20 20 28 63 74 78 2e 70 46  l;.  }.  (ctx.pF
29990 75 6e 63 2d 3e 78 53 74 65 70 29 28 26 63 74 78  unc->xStep)(&ctx
299a0 2c 20 6e 2c 20 61 70 56 61 6c 29 3b 20 2f 2a 20  , n, apVal); /* 
299b0 49 4d 50 3a 20 52 2d 32 34 35 30 35 2d 32 33 32  IMP: R-24505-232
299c0 33 30 20 2a 2f 0a 20 20 69 66 28 20 63 74 78 2e  30 */.  if( ctx.
299d0 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 73  isError ){.    s
299e0 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
299f0 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
29a00 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76   "%s", sqlite3_v
29a10 61 6c 75 65 5f 74 65 78 74 28 26 63 74 78 2e 73  alue_text(&ctx.s
29a20 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 74 78  ));.    rc = ctx
29a30 2e 69 73 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20  .isError;.  }.. 
29a40 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
29a50 65 6c 65 61 73 65 28 26 63 74 78 2e 73 29 3b 0a  elease(&ctx.s);.
29a60 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
29a70 4f 70 63 6f 64 65 3a 20 41 67 67 46 69 6e 61 6c  Opcode: AggFinal
29a80 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a   P1 P2 * P4 *.**
29a90 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20  .** Execute the 
29aa0 66 69 6e 61 6c 69 7a 65 72 20 66 75 6e 63 74 69  finalizer functi
29ab0 6f 6e 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67  on for an aggreg
29ac0 61 74 65 2e 20 20 50 31 20 69 73 0a 2a 2a 20 74  ate.  P1 is.** t
29ad0 68 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  he memory locati
29ae0 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 61  on that is the a
29af0 63 63 75 6d 75 6c 61 74 6f 72 20 66 6f 72 20 74  ccumulator for t
29b00 68 65 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a  he aggregate..**
29b10 0a 2a 2a 20 50 32 20 69 73 20 74 68 65 20 6e 75  .** P2 is the nu
29b20 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
29b30 73 20 74 68 61 74 20 74 68 65 20 73 74 65 70 20  s that the step 
29b40 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 61  function takes a
29b50 6e 64 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f  nd.** P4 is a po
29b60 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e  inter to the Fun
29b70 63 44 65 66 20 66 6f 72 20 74 68 69 73 20 66 75  cDef for this fu
29b80 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 50 32 0a  nction.  The P2.
29b90 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ** argument is n
29ba0 6f 74 20 75 73 65 64 20 62 79 20 74 68 69 73 20  ot used by this 
29bb0 6f 70 63 6f 64 65 2e 20 20 49 74 20 69 73 20 6f  opcode.  It is o
29bc0 6e 6c 79 20 74 68 65 72 65 20 74 6f 20 64 69 73  nly there to dis
29bd0 61 6d 62 69 67 75 61 74 65 0a 2a 2a 20 66 75 6e  ambiguate.** fun
29be0 63 74 69 6f 6e 73 20 74 68 61 74 20 63 61 6e 20  ctions that can 
29bf0 74 61 6b 65 20 76 61 72 79 69 6e 67 20 6e 75 6d  take varying num
29c00 62 65 72 73 20 6f 66 20 61 72 67 75 6d 65 6e 74  bers of argument
29c10 73 2e 20 20 54 68 65 0a 2a 2a 20 50 34 20 61 72  s.  The.** P4 ar
29c20 67 75 6d 65 6e 74 20 69 73 20 6f 6e 6c 79 20 6e  gument is only n
29c30 65 65 64 65 64 20 66 6f 72 20 74 68 65 20 64 65  eeded for the de
29c40 67 65 6e 65 72 61 74 65 20 63 61 73 65 20 77 68  generate case wh
29c50 65 72 65 0a 2a 2a 20 74 68 65 20 73 74 65 70 20  ere.** the step 
29c60 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  function was not
29c70 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
29c80 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41  ed..*/.case OP_A
29c90 67 67 46 69 6e 61 6c 3a 20 7b 0a 20 20 4d 65 6d  ggFinal: {.  Mem
29ca0 20 2a 70 4d 65 6d 3b 0a 20 20 61 73 73 65 72 74   *pMem;.  assert
29cb0 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70  ( pOp->p1>0 && p
29cc0 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 4d 65 6d 20  Op->p1<=p->nMem 
29cd0 29 3b 0a 20 20 70 4d 65 6d 20 3d 20 26 61 4d 65  );.  pMem = &aMe
29ce0 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  m[pOp->p1];.  as
29cf0 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61  sert( (pMem->fla
29d00 67 73 20 26 20 7e 28 4d 45 4d 5f 4e 75 6c 6c 7c  gs & ~(MEM_Null|
29d10 4d 45 4d 5f 41 67 67 29 29 3d 3d 30 20 29 3b 0a  MEM_Agg))==0 );.
29d20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
29d30 62 65 4d 65 6d 46 69 6e 61 6c 69 7a 65 28 70 4d  beMemFinalize(pM
29d40 65 6d 2c 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  em, pOp->p4.pFun
29d50 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  c);.  if( rc ){.
29d60 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
29d70 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
29d80 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69  , db, "%s", sqli
29d90 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
29da0 4d 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Mem));.  }.  sql
29db0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e  ite3VdbeChangeEn
29dc0 63 6f 64 69 6e 67 28 70 4d 65 6d 2c 20 65 6e 63  coding(pMem, enc
29dd0 6f 64 69 6e 67 29 3b 0a 20 20 55 50 44 41 54 45  oding);.  UPDATE
29de0 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4d  _MAX_BLOBSIZE(pM
29df0 65 6d 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  em);.  if( sqlit
29e00 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28  e3VdbeMemTooBig(
29e10 70 4d 65 6d 29 20 29 7b 0a 20 20 20 20 67 6f 74  pMem) ){.    got
29e20 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20  o too_big;.  }. 
29e30 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64   break;.}..#ifnd
29e40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
29e50 41 4c 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 68  AL./* Opcode: Ch
29e60 65 63 6b 70 6f 69 6e 74 20 50 31 20 50 32 20 50  eckpoint P1 P2 P
29e70 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  3 * *.**.** Chec
29e80 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20  kpoint database 
29e90 50 31 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  P1. This is a no
29ea0 2d 6f 70 20 69 66 20 50 31 20 69 73 20 6e 6f 74  -op if P1 is not
29eb0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a   currently in.**
29ec0 20 57 41 4c 20 6d 6f 64 65 2e 20 50 61 72 61 6d   WAL mode. Param
29ed0 65 74 65 72 20 50 32 20 69 73 20 6f 6e 65 20 6f  eter P2 is one o
29ee0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  f SQLITE_CHECKPO
29ef0 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c  INT_PASSIVE, FUL
29f00 4c 0a 2a 2a 20 6f 72 20 52 45 53 54 41 52 54 2e  L.** or RESTART.
29f10 20 20 57 72 69 74 65 20 31 20 6f 72 20 30 20 69    Write 1 or 0 i
29f20 6e 74 6f 20 6d 65 6d 5b 50 33 5d 20 69 66 20 74  nto mem[P3] if t
29f30 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 72 65  he checkpoint re
29f40 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45 5f  turns.** SQLITE_
29f50 42 55 53 59 20 6f 72 20 6e 6f 74 2c 20 72 65 73  BUSY or not, res
29f60 70 65 63 74 69 76 65 6c 79 2e 20 20 57 72 69 74  pectively.  Writ
29f70 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
29f80 70 61 67 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pages in the.** 
29f90 57 41 4c 20 61 66 74 65 72 20 74 68 65 20 63 68  WAL after the ch
29fa0 65 63 6b 70 6f 69 6e 74 20 69 6e 74 6f 20 6d 65  eckpoint into me
29fb0 6d 5b 50 33 2b 31 5d 20 61 6e 64 20 74 68 65 20  m[P3+1] and the 
29fc0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
29fd0 2a 2a 20 69 6e 20 74 68 65 20 57 41 4c 20 74 68  ** in the WAL th
29fe0 61 74 20 68 61 76 65 20 62 65 65 6e 20 63 68 65  at have been che
29ff0 63 6b 70 6f 69 6e 74 65 64 20 61 66 74 65 72 20  ckpointed after 
2a000 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  the checkpoint.*
2a010 2a 20 63 6f 6d 70 6c 65 74 65 73 20 69 6e 74 6f  * completes into
2a020 20 6d 65 6d 5b 50 33 2b 32 5d 2e 20 20 48 6f 77   mem[P3+2].  How
2a030 65 76 65 72 20 6f 6e 20 61 6e 20 65 72 72 6f 72  ever on an error
2a040 2c 20 6d 65 6d 5b 50 33 2b 31 5d 20 61 6e 64 0a  , mem[P3+1] and.
2a050 2a 2a 20 6d 65 6d 5b 50 33 2b 32 5d 20 61 72 65  ** mem[P3+2] are
2a060 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
2a070 2d 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  -1..*/.case OP_C
2a080 68 65 63 6b 70 6f 69 6e 74 3a 20 7b 0a 20 20 69  heckpoint: {.  i
2a090 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
2a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a0b0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2a0c0 2f 0a 20 20 69 6e 74 20 61 52 65 73 5b 33 5d 3b  /.  int aRes[3];
2a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0e0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a      /* Results *
2a0f0 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 20 20  /.  Mem *pMem;  
2a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a110 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
2a120 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 0a 20 20  ults here */..  
2a130 61 52 65 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 61  aRes[0] = 0;.  a
2a140 52 65 73 5b 31 5d 20 3d 20 61 52 65 73 5b 32 5d  Res[1] = aRes[2]
2a150 20 3d 20 2d 31 3b 0a 20 20 61 73 73 65 72 74 28   = -1;.  assert(
2a160 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45   pOp->p2==SQLITE
2a170 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
2a180 49 56 45 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f  IVE.       || pO
2a190 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48  p->p2==SQLITE_CH
2a1a0 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 0a 20 20  ECKPOINT_FULL.  
2a1b0 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d       || pOp->p2=
2a1c0 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  =SQLITE_CHECKPOI
2a1d0 4e 54 5f 52 45 53 54 41 52 54 0a 20 20 29 3b 0a  NT_RESTART.  );.
2a1e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68    rc = sqlite3Ch
2a1f0 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 70 4f 70  eckpoint(db, pOp
2a200 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 26  ->p1, pOp->p2, &
2a210 61 52 65 73 5b 31 5d 2c 20 26 61 52 65 73 5b 32  aRes[1], &aRes[2
2a220 5d 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ]);.  if( rc==SQ
2a230 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
2a240 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a250 0a 20 20 20 20 61 52 65 73 5b 30 5d 20 3d 20 31  .    aRes[0] = 1
2a260 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c  ;.  }.  for(i=0,
2a270 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f   pMem = &aMem[pO
2a280 70 2d 3e 70 33 5d 3b 20 69 3c 33 3b 20 69 2b 2b  p->p3]; i<3; i++
2a290 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 73  , pMem++){.    s
2a2a0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
2a2b0 49 6e 74 36 34 28 70 4d 65 6d 2c 20 28 69 36 34  Int64(pMem, (i64
2a2c0 29 61 52 65 73 5b 69 5d 29 3b 0a 20 20 7d 20 20  )aRes[i]);.  }  
2a2d0 20 20 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 20 20    .  break;.};  
2a2e0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
2a2f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41   SQLITE_OMIT_PRA
2a300 47 4d 41 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4a  GMA./* Opcode: J
2a310 6f 75 72 6e 61 6c 4d 6f 64 65 20 50 31 20 50 32  ournalMode P1 P2
2a320 20 50 33 20 2a 20 50 35 0a 2a 2a 0a 2a 2a 20 43   P3 * P5.**.** C
2a330 68 61 6e 67 65 20 74 68 65 20 6a 6f 75 72 6e 61  hange the journa
2a340 6c 20 6d 6f 64 65 20 6f 66 20 64 61 74 61 62 61  l mode of databa
2a350 73 65 20 50 31 20 74 6f 20 50 33 2e 20 50 33 20  se P1 to P3. P3 
2a360 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74  must be one of t
2a370 68 65 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  he.** PAGER_JOUR
2a380 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 76 61 6c 75  NALMODE_XXX valu
2a390 65 73 2e 20 49 66 20 63 68 61 6e 67 69 6e 67 20  es. If changing 
2a3a0 62 65 74 77 65 65 6e 20 74 68 65 20 76 61 72 69  between the vari
2a3b0 6f 75 73 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  ous rollback.** 
2a3c0 6d 6f 64 65 73 20 28 64 65 6c 65 74 65 2c 20 74  modes (delete, t
2a3d0 72 75 6e 63 61 74 65 2c 20 70 65 72 73 69 73 74  runcate, persist
2a3e0 2c 20 6f 66 66 20 61 6e 64 20 6d 65 6d 6f 72 79  , off and memory
2a3f0 29 2c 20 74 68 69 73 20 69 73 20 61 20 73 69 6d  ), this is a sim
2a400 70 6c 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ple.** operation
2a410 2e 20 4e 6f 20 49 4f 20 69 73 20 72 65 71 75 69  . No IO is requi
2a420 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 68  red..**.** If ch
2a430 61 6e 67 69 6e 67 20 69 6e 74 6f 20 6f 72 20 6f  anging into or o
2a440 75 74 20 6f 66 20 57 41 4c 20 6d 6f 64 65 20 74  ut of WAL mode t
2a450 68 65 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  he procedure is 
2a460 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
2a470 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ..**.** Write a 
2a480 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
2a490 67 20 74 68 65 20 66 69 6e 61 6c 20 6a 6f 75 72  g the final jour
2a4a0 6e 61 6c 2d 6d 6f 64 65 20 74 6f 20 72 65 67 69  nal-mode to regi
2a4b0 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  ster P2..*/.case
2a4c0 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a   OP_JournalMode:
2a4d0 20 7b 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72   {    /* out2-pr
2a4e0 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 42 74  erelease */.  Bt
2a4f0 72 65 65 20 2a 70 42 74 3b 20 20 20 20 20 20 20  ree *pBt;       
2a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a510 20 42 74 72 65 65 20 74 6f 20 63 68 61 6e 67 65   Btree to change
2a520 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6f 66   journal mode of
2a530 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61   */.  Pager *pPa
2a540 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ger;            
2a550 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 61        /* Pager a
2a560 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
2a570 42 74 20 2a 2f 0a 20 20 69 6e 74 20 65 4e 65 77  Bt */.  int eNew
2a580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a590 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6a          /* New j
2a5a0 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 20  ournal mode */. 
2a5b0 20 69 6e 74 20 65 4f 6c 64 3b 20 20 20 20 20 20   int eOld;      
2a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5d0 20 2f 2a 20 54 68 65 20 6f 6c 64 20 6a 6f 75 72   /* The old jour
2a5e0 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 20 20 63 6f  nal mode */.  co
2a5f0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2a600 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ame;          /*
2a610 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62 61 73   Name of databas
2a620 65 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65  e file for pPage
2a630 72 20 2a 2f 0a 0a 20 20 65 4e 65 77 20 3d 20 70  r */..  eNew = p
2a640 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72 74  Op->p3;.  assert
2a650 28 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f  ( eNew==PAGER_JO
2a660 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
2a670 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77   .       || eNew
2a680 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2a690 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 0a 20 20  ODE_TRUNCATE .  
2a6a0 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41       || eNew==PA
2a6b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2a6c0 50 45 52 53 49 53 54 20 0a 20 20 20 20 20 20 20  PERSIST .       
2a6d0 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a  || eNew==PAGER_J
2a6e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 20  OURNALMODE_OFF. 
2a6f0 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50        || eNew==P
2a700 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2a710 5f 4d 45 4d 4f 52 59 0a 20 20 20 20 20 20 20 7c  _MEMORY.       |
2a720 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f  | eNew==PAGER_JO
2a730 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 20 20  URNALMODE_WAL.  
2a740 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41       || eNew==PA
2a750 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2a760 51 55 45 52 59 0a 20 20 29 3b 0a 20 20 61 73 73  QUERY.  );.  ass
2a770 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
2a780 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e  && pOp->p1<db->n
2a790 44 62 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20 64  Db );..  pBt = d
2a7a0 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e  b->aDb[pOp->p1].
2a7b0 70 42 74 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  pBt;.  pPager = 
2a7c0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
2a7d0 72 28 70 42 74 29 3b 0a 20 20 65 4f 6c 64 20 3d  r(pBt);.  eOld =
2a7e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2a7f0 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67  JournalMode(pPag
2a800 65 72 29 3b 0a 20 20 69 66 28 20 65 4e 65 77 3d  er);.  if( eNew=
2a810 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2a820 44 45 5f 51 55 45 52 59 20 29 20 65 4e 65 77 20  DE_QUERY ) eNew 
2a830 3d 20 65 4f 6c 64 3b 0a 20 20 69 66 28 20 21 73  = eOld;.  if( !s
2a840 71 6c 69 74 65 33 50 61 67 65 72 4f 6b 54 6f 43  qlite3PagerOkToC
2a850 68 61 6e 67 65 4a 6f 75 72 6e 61 6c 4d 6f 64 65  hangeJournalMode
2a860 28 70 50 61 67 65 72 29 20 29 20 65 4e 65 77 20  (pPager) ) eNew 
2a870 3d 20 65 4f 6c 64 3b 0a 0a 23 69 66 6e 64 65 66  = eOld;..#ifndef
2a880 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
2a890 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73  .  zFilename = s
2a8a0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
2a8b0 61 6d 65 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  ame(pPager);..  
2a8c0 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
2a8d0 61 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20  a transition to 
2a8e0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 57 41 4c  journal_mode=WAL
2a8f0 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 0a   for a database.
2a900 20 20 2a 2a 20 69 6e 20 74 65 6d 70 6f 72 61 72    ** in temporar
2a910 79 20 73 74 6f 72 61 67 65 20 6f 72 20 69 66 20  y storage or if 
2a920 74 68 65 20 56 46 53 20 64 6f 65 73 20 6e 6f 74  the VFS does not
2a930 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 20   support shared 
2a940 6d 65 6d 6f 72 79 20 0a 20 20 2a 2f 0a 20 20 69  memory .  */.  i
2a950 66 28 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a  f( eNew==PAGER_J
2a960 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 20  OURNALMODE_WAL. 
2a970 20 20 26 26 20 28 7a 46 69 6c 65 6e 61 6d 65 5b    && (zFilename[
2a980 30 5d 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  0]==0           
2a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a9a0 20 54 65 6d 70 20 66 69 6c 65 20 2a 2f 0a 20 20   Temp file */.  
2a9b0 20 20 20 20 20 7c 7c 20 21 73 71 6c 69 74 65 33       || !sqlite3
2a9c0 50 61 67 65 72 57 61 6c 53 75 70 70 6f 72 74 65  PagerWalSupporte
2a9d0 64 28 70 50 61 67 65 72 29 29 20 20 20 2f 2a 20  d(pPager))   /* 
2a9e0 4e 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  No shared-memory
2a9f0 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 29 7b   support */.  ){
2aa00 0a 20 20 20 20 65 4e 65 77 20 3d 20 65 4f 6c 64  .    eNew = eOld
2aa10 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 28 65 4e  ;.  }..  if( (eN
2aa20 65 77 21 3d 65 4f 6c 64 29 0a 20 20 20 26 26 20  ew!=eOld).   && 
2aa30 28 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55  (eOld==PAGER_JOU
2aa40 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 7c 7c 20  RNALMODE_WAL || 
2aa50 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eNew==PAGER_JOUR
2aa60 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 29  NALMODE_WAL).  )
2aa70 7b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 61  {.    if( !db->a
2aa80 75 74 6f 43 6f 6d 6d 69 74 20 7c 7c 20 64 62 2d  utoCommit || db-
2aa90 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 31  >activeVdbeCnt>1
2aaa0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2aab0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
2aac0 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
2aad0 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
2aae0 20 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20   db, .          
2aaf0 22 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 25  "cannot change %
2ab00 73 20 77 61 6c 20 6d 6f 64 65 20 66 72 6f 6d 20  s wal mode from 
2ab10 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
2ab20 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  tion",.         
2ab30 20 28 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f   (eNew==PAGER_JO
2ab40 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 3f 20  URNALMODE_WAL ? 
2ab50 22 69 6e 74 6f 22 20 3a 20 22 6f 75 74 20 6f 66  "into" : "out of
2ab60 22 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ").      );.    
2ab70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
2ab80 73 65 7b 0a 20 0a 20 20 20 20 20 20 69 66 28 20  se{. .      if( 
2ab90 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eOld==PAGER_JOUR
2aba0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20  NALMODE_WAL ){. 
2abb0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6c 65 61         /* If lea
2abc0 76 69 6e 67 20 57 41 4c 20 6d 6f 64 65 2c 20 63  ving WAL mode, c
2abd0 6c 6f 73 65 20 74 68 65 20 6c 6f 67 20 66 69 6c  lose the log fil
2abe0 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  e. If successful
2abf0 2c 20 74 68 65 20 63 61 6c 6c 0a 20 20 20 20 20  , the call.     
2ac00 20 20 20 2a 2a 20 74 6f 20 50 61 67 65 72 43 6c     ** to PagerCl
2ac10 6f 73 65 57 61 6c 28 29 20 63 68 65 63 6b 70 6f  oseWal() checkpo
2ac20 69 6e 74 73 20 61 6e 64 20 64 65 6c 65 74 65 73  ints and deletes
2ac30 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64   the write-ahead
2ac40 2d 6c 6f 67 20 0a 20 20 20 20 20 20 20 20 2a 2a  -log .        **
2ac50 20 66 69 6c 65 2e 20 41 6e 20 45 58 43 4c 55 53   file. An EXCLUS
2ac60 49 56 45 20 6c 6f 63 6b 20 6d 61 79 20 73 74 69  IVE lock may sti
2ac70 6c 6c 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ll be held on th
2ac80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2ac90 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 66 74 65  .        ** afte
2aca0 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 72  r a successful r
2acb0 65 74 75 72 6e 2e 20 0a 20 20 20 20 20 20 20 20  eturn. .        
2acc0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
2acd0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
2ace0 65 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  eWal(pPager);.  
2acf0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2ad00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ad10 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
2ad20 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  rSetJournalMode(
2ad30 70 50 61 67 65 72 2c 20 65 4e 65 77 29 3b 0a 20  pPager, eNew);. 
2ad40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2ad50 65 6c 73 65 20 69 66 28 20 65 4f 6c 64 3d 3d 50  else if( eOld==P
2ad60 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2ad70 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
2ad80 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 74 72 61     /* Cannot tra
2ad90 6e 73 69 74 69 6f 6e 20 64 69 72 65 63 74 6c 79  nsition directly
2ada0 20 66 72 6f 6d 20 4d 45 4d 4f 52 59 20 74 6f 20   from MEMORY to 
2adb0 57 41 4c 2e 20 20 55 73 65 20 6d 6f 64 65 20 4f  WAL.  Use mode O
2adc0 46 46 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  FF.        ** as
2add0 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65   an intermediate
2ade0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
2adf0 74 65 33 50 61 67 65 72 53 65 74 4a 6f 75 72 6e  te3PagerSetJourn
2ae00 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 50  alMode(pPager, P
2ae10 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2ae20 5f 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20  _OFF);.      }. 
2ae30 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20   .      /* Open 
2ae40 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  a transaction on
2ae50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ae60 6c 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  le. Regardless o
2ae70 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
2ae80 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 69      ** mode, thi
2ae90 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c  s transaction al
2aea0 77 61 79 73 20 75 73 65 73 20 61 20 72 6f 6c 6c  ways uses a roll
2aeb0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  back journal..  
2aec0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
2aed0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
2aee0 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 3d  eIsInTrans(pBt)=
2aef0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2af00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2af10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2af20 6c 69 74 65 33 42 74 72 65 65 53 65 74 56 65 72  lite3BtreeSetVer
2af30 73 69 6f 6e 28 70 42 74 2c 20 28 65 4e 65 77 3d  sion(pBt, (eNew=
2af40 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2af50 44 45 5f 57 41 4c 20 3f 20 32 20 3a 20 31 29 29  DE_WAL ? 2 : 1))
2af60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2af70 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66    }.#endif /* if
2af80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2af90 5f 57 41 4c 20 2a 2f 0a 0a 20 20 69 66 28 20 72  _WAL */..  if( r
2afa0 63 20 29 7b 0a 20 20 20 20 65 4e 65 77 20 3d 20  c ){.    eNew = 
2afb0 65 4f 6c 64 3b 0a 20 20 7d 0a 20 20 65 4e 65 77  eOld;.  }.  eNew
2afc0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
2afd0 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50  etJournalMode(pP
2afe0 61 67 65 72 2c 20 65 4e 65 77 29 3b 0a 0a 20 20  ager, eNew);..  
2aff0 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
2b000 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75 74 2d 3e 66  ->p2];.  pOut->f
2b010 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
2b020 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 54 65  EM_Static|MEM_Te
2b030 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e 7a 20 3d 20  rm;.  pOut->z = 
2b040 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 4a  (char *)sqlite3J
2b050 6f 75 72 6e 61 6c 4d 6f 64 65 6e 61 6d 65 28 65  ournalModename(e
2b060 4e 65 77 29 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20  New);.  pOut->n 
2b070 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2b080 30 28 70 4f 75 74 2d 3e 7a 29 3b 0a 20 20 70 4f  0(pOut->z);.  pO
2b090 75 74 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  ut->enc = SQLITE
2b0a0 5f 55 54 46 38 3b 0a 20 20 73 71 6c 69 74 65 33  _UTF8;.  sqlite3
2b0b0 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69  VdbeChangeEncodi
2b0c0 6e 67 28 70 4f 75 74 2c 20 65 6e 63 6f 64 69 6e  ng(pOut, encodin
2b0d0 67 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a  g);.  break;.};.
2b0e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2b0f0 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 20 2a 2f 0a  _OMIT_PRAGMA */.
2b100 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
2b110 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
2b120 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
2b130 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48  LITE_OMIT_ATTACH
2b140 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 61 63  )./* Opcode: Vac
2b150 75 75 6d 20 2a 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  uum * * * * *.**
2b160 0a 2a 2a 20 56 61 63 75 75 6d 20 74 68 65 20 65  .** Vacuum the e
2b170 6e 74 69 72 65 20 64 61 74 61 62 61 73 65 2e 20  ntire database. 
2b180 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 69 6c   This opcode wil
2b190 6c 20 63 61 75 73 65 20 6f 74 68 65 72 20 76 69  l cause other vi
2b1a0 72 74 75 61 6c 0a 2a 2a 20 6d 61 63 68 69 6e 65  rtual.** machine
2b1b0 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  s to be created 
2b1c0 61 6e 64 20 72 75 6e 2e 20 20 49 74 20 6d 61 79  and run.  It may
2b1d0 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 66   not be called f
2b1e0 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  rom within.** a 
2b1f0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
2b200 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 20  case OP_Vacuum: 
2b210 7b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  {.  rc = sqlite3
2b220 52 75 6e 56 61 63 75 75 6d 28 26 70 2d 3e 7a 45  RunVacuum(&p->zE
2b230 72 72 4d 73 67 2c 20 64 62 29 3b 0a 20 20 62 72  rrMsg, db);.  br
2b240 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  eak;.}.#endif..#
2b250 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2b260 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2b270 55 4d 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  UM)./* Opcode: I
2b280 6e 63 72 56 61 63 75 75 6d 20 50 31 20 50 32 20  ncrVacuum P1 P2 
2b290 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 65 72 66  * * *.**.** Perf
2b2a0 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65  orm a single ste
2b2b0 70 20 6f 66 20 74 68 65 20 69 6e 63 72 65 6d 65  p of the increme
2b2c0 6e 74 61 6c 20 76 61 63 75 75 6d 20 70 72 6f 63  ntal vacuum proc
2b2d0 65 64 75 72 65 20 6f 6e 0a 2a 2a 20 74 68 65 20  edure on.** the 
2b2e0 50 31 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  P1 database. If 
2b2f0 74 68 65 20 76 61 63 75 75 6d 20 68 61 73 20 66  the vacuum has f
2b300 69 6e 69 73 68 65 64 2c 20 6a 75 6d 70 20 74 6f  inished, jump to
2b310 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20   instruction.** 
2b320 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66  P2. Otherwise, f
2b330 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
2b340 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
2b350 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ion..*/.case OP_
2b360 49 6e 63 72 56 61 63 75 75 6d 3a 20 7b 20 20 20  IncrVacuum: {   
2b370 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
2b380 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 0a 20    Btree *pBt;.. 
2b390 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
2b3a0 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64  >=0 && pOp->p1<d
2b3b0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
2b3c0 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73  rt( (p->btreeMas
2b3d0 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31  k & (((yDbMask)1
2b3e0 29 3c 3c 70 4f 70 2d 3e 70 31 29 29 21 3d 30 20  )<<pOp->p1))!=0 
2b3f0 29 3b 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61  );.  pBt = db->a
2b400 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b  Db[pOp->p1].pBt;
2b410 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
2b420 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 70  treeIncrVacuum(p
2b430 42 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  Bt);.  if( rc==S
2b440 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
2b450 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
2b460 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   1;.    rc = SQL
2b470 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 62 72  ITE_OK;.  }.  br
2b480 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  eak;.}.#endif../
2b490 2a 20 4f 70 63 6f 64 65 3a 20 45 78 70 69 72 65  * Opcode: Expire
2b4a0 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
2b4b0 2a 20 43 61 75 73 65 20 70 72 65 63 6f 6d 70 69  * Cause precompi
2b4c0 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 74  led statements t
2b4d0 6f 20 62 65 63 6f 6d 65 20 65 78 70 69 72 65 64  o become expired
2b4e0 2e 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61  . An expired sta
2b4f0 74 65 6d 65 6e 74 0a 2a 2a 20 66 61 69 6c 73 20  tement.** fails 
2b500 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 63 6f  with an error co
2b510 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 43 48  de of SQLITE_SCH
2b520 45 4d 41 20 69 66 20 69 74 20 69 73 20 65 76 65  EMA if it is eve
2b530 72 20 65 78 65 63 75 74 65 64 20 0a 2a 2a 20 28  r executed .** (
2b540 76 69 61 20 73 71 6c 69 74 65 33 5f 73 74 65 70  via sqlite3_step
2b550 28 29 29 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 50  ())..** .** If P
2b560 31 20 69 73 20 30 2c 20 74 68 65 6e 20 61 6c 6c  1 is 0, then all
2b570 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
2b580 62 65 63 6f 6d 65 20 65 78 70 69 72 65 64 2e 20  become expired. 
2b590 49 66 20 50 31 20 69 73 20 6e 6f 6e 2d 7a 65 72  If P1 is non-zer
2b5a0 6f 2c 0a 2a 2a 20 74 68 65 6e 20 6f 6e 6c 79 20  o,.** then only 
2b5b0 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  the currently ex
2b5c0 65 63 75 74 69 6e 67 20 73 74 61 74 65 6d 65 6e  ecuting statemen
2b5d0 74 20 69 73 20 61 66 66 65 63 74 65 64 2e 20 0a  t is affected. .
2b5e0 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 78 70 69 72  */.case OP_Expir
2b5f0 65 3a 20 7b 0a 20 20 69 66 28 20 21 70 4f 70 2d  e: {.  if( !pOp-
2b600 3e 70 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >p1 ){.    sqlit
2b610 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
2b620 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
2b630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
2b640 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
2b650 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66  .  break;.}..#if
2b660 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b670 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
2b680 20 4f 70 63 6f 64 65 3a 20 54 61 62 6c 65 4c 6f   Opcode: TableLo
2b690 63 6b 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  ck P1 P2 P3 P4 *
2b6a0 0a 2a 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20  .**.** Obtain a 
2b6b0 6c 6f 63 6b 20 6f 6e 20 61 20 70 61 72 74 69 63  lock on a partic
2b6c0 75 6c 61 72 20 74 61 62 6c 65 2e 20 54 68 69 73  ular table. This
2b6d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
2b6e0 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 0a 2a  only used when.*
2b6f0 2a 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63  * the shared-cac
2b700 68 65 20 66 65 61 74 75 72 65 20 69 73 20 65 6e  he feature is en
2b710 61 62 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 50 31  abled. .**.** P1
2b720 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
2b730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
2b740 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 6f   sqlite3.aDb[] o
2b750 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
2b760 2a 20 6f 6e 20 77 68 69 63 68 20 74 68 65 20 6c  * on which the l
2b770 6f 63 6b 20 69 73 20 61 63 71 75 69 72 65 64 2e  ock is acquired.
2b780 20 20 41 20 72 65 61 64 6c 6f 63 6b 20 69 73 20    A readlock is 
2b790 6f 62 74 61 69 6e 65 64 20 69 66 20 50 33 3d 3d  obtained if P3==
2b7a0 30 20 6f 72 0a 2a 2a 20 61 20 77 72 69 74 65 20  0 or.** a write 
2b7b0 6c 6f 63 6b 20 69 66 20 50 33 3d 3d 31 2e 0a 2a  lock if P3==1..*
2b7c0 2a 0a 2a 2a 20 50 32 20 63 6f 6e 74 61 69 6e 73  *.** P2 contains
2b7d0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f   the root-page o
2b7e0 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 6c  f the table to l
2b7f0 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 63 6f  ock..**.** P4 co
2b800 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
2b810 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   to the name of 
2b820 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
2b830 6c 6f 63 6b 65 64 2e 20 54 68 69 73 20 69 73 20  locked. This is 
2b840 6f 6e 6c 79 0a 2a 2a 20 75 73 65 64 20 74 6f 20  only.** used to 
2b850 67 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f  generate an erro
2b860 72 20 6d 65 73 73 61 67 65 20 69 66 20 74 68 65  r message if the
2b870 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
2b880 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 63 61 73  obtained..*/.cas
2b890 65 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 3a 20  e OP_TableLock: 
2b8a0 7b 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f  {.  u8 isWriteLo
2b8b0 63 6b 20 3d 20 28 75 38 29 70 4f 70 2d 3e 70 33  ck = (u8)pOp->p3
2b8c0 3b 0a 20 20 69 66 28 20 69 73 57 72 69 74 65 4c  ;.  if( isWriteL
2b8d0 6f 63 6b 20 7c 7c 20 30 3d 3d 28 64 62 2d 3e 66  ock || 0==(db->f
2b8e0 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
2b8f0 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 29 7b 0a  Uncommitted) ){.
2b900 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 4f 70      int p1 = pOp
2b910 2d 3e 70 31 3b 20 0a 20 20 20 20 61 73 73 65 72  ->p1; .    asser
2b920 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 64  t( p1>=0 && p1<d
2b930 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73  b->nDb );.    as
2b940 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d  sert( (p->btreeM
2b950 61 73 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b  ask & (((yDbMask
2b960 29 31 29 3c 3c 70 31 29 29 21 3d 30 20 29 3b 0a  )1)<<p1))!=0 );.
2b970 20 20 20 20 61 73 73 65 72 74 28 20 69 73 57 72      assert( isWr
2b980 69 74 65 4c 6f 63 6b 3d 3d 30 20 7c 7c 20 69 73  iteLock==0 || is
2b990 57 72 69 74 65 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  WriteLock==1 );.
2b9a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b9b0 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65 28 64  BtreeLockTable(d
2b9c0 62 2d 3e 61 44 62 5b 70 31 5d 2e 70 42 74 2c 20  b->aDb[p1].pBt, 
2b9d0 70 4f 70 2d 3e 70 32 2c 20 69 73 57 72 69 74 65  pOp->p2, isWrite
2b9e0 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 28  Lock);.    if( (
2b9f0 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45  rc&0xFF)==SQLITE
2ba00 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
2ba10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
2ba20 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
2ba30 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
2ba40 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
2ba50 64 62 2c 20 22 64 61 74 61 62 61 73 65 20 74 61  db, "database ta
2ba60 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 3a 20 25  ble is locked: %
2ba70 73 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  s", z);.    }.  
2ba80 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  }.  break;.}.#en
2ba90 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2baa0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
2bab0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
2bac0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2bad0 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ABLE./* Opcode: 
2bae0 56 42 65 67 69 6e 20 2a 20 2a 20 2a 20 50 34 20  VBegin * * * P4 
2baf0 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61 79 20 62  *.**.** P4 may b
2bb00 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
2bb10 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73  n sqlite3_vtab s
2bb20 74 72 75 63 74 75 72 65 2e 20 49 66 20 73 6f 2c  tructure. If so,
2bb30 20 63 61 6c 6c 20 74 68 65 20 0a 2a 2a 20 78 42   call the .** xB
2bb40 65 67 69 6e 20 6d 65 74 68 6f 64 20 66 6f 72 20  egin method for 
2bb50 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  that table..**.*
2bb60 2a 20 41 6c 73 6f 2c 20 77 68 65 74 68 65 72 20  * Also, whether 
2bb70 6f 72 20 6e 6f 74 20 50 34 20 69 73 20 73 65 74  or not P4 is set
2bb80 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 69  , check that thi
2bb90 73 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 63  s is not being c
2bba0 61 6c 6c 65 64 20 66 72 6f 6d 0a 2a 2a 20 77 69  alled from.** wi
2bbb0 74 68 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b 20  thin a callback 
2bbc0 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  to a virtual tab
2bbd0 6c 65 20 78 53 79 6e 63 28 29 20 6d 65 74 68 6f  le xSync() metho
2bbe0 64 2e 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  d. If it is, the
2bbf0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 77   error.** code w
2bc00 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 53 51  ill be set to SQ
2bc10 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2f 0a  LITE_LOCKED..*/.
2bc20 63 61 73 65 20 4f 50 5f 56 42 65 67 69 6e 3a 20  case OP_VBegin: 
2bc30 7b 0a 20 20 56 54 61 62 6c 65 20 2a 70 56 54 61  {.  VTable *pVTa
2bc40 62 3b 0a 20 20 70 56 54 61 62 20 3d 20 70 4f 70  b;.  pVTab = pOp
2bc50 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20 20 72 63  ->p4.pVtab;.  rc
2bc60 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 42 65   = sqlite3VtabBe
2bc70 67 69 6e 28 64 62 2c 20 70 56 54 61 62 29 3b 0a  gin(db, pVTab);.
2bc80 20 20 69 66 28 20 70 56 54 61 62 20 29 20 69 6d    if( pVTab ) im
2bc90 70 6f 72 74 56 74 61 62 45 72 72 4d 73 67 28 70  portVtabErrMsg(p
2bca0 2c 20 70 56 54 61 62 2d 3e 70 56 74 61 62 29 3b  , pVTab->pVtab);
2bcb0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
2bcc0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2bcd0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
2bce0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2bcf0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2bd00 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56  BLE./* Opcode: V
2bd10 43 72 65 61 74 65 20 50 31 20 2a 20 2a 20 50 34  Create P1 * * P4
2bd20 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 74   *.**.** P4 is t
2bd30 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 69 72  he name of a vir
2bd40 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 64 61  tual table in da
2bd50 74 61 62 61 73 65 20 50 31 2e 20 43 61 6c 6c 20  tabase P1. Call 
2bd60 74 68 65 20 78 43 72 65 61 74 65 20 6d 65 74 68  the xCreate meth
2bd70 6f 64 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 74  od.** for that t
2bd80 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  able..*/.case OP
2bd90 5f 56 43 72 65 61 74 65 3a 20 7b 0a 20 20 72 63  _VCreate: {.  rc
2bda0 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 43 61   = sqlite3VtabCa
2bdb0 6c 6c 43 72 65 61 74 65 28 64 62 2c 20 70 4f 70  llCreate(db, pOp
2bdc0 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c  ->p1, pOp->p4.z,
2bdd0 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20   &p->zErrMsg);. 
2bde0 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
2bdf0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2be00 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
2be10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2be20 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2be30 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 44 65  E./* Opcode: VDe
2be40 73 74 72 6f 79 20 50 31 20 2a 20 2a 20 50 34 20  stroy P1 * * P4 
2be50 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 74 68  *.**.** P4 is th
2be60 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 69 72 74  e name of a virt
2be70 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 64 61 74  ual table in dat
2be80 61 62 61 73 65 20 50 31 2e 20 20 43 61 6c 6c 20  abase P1.  Call 
2be90 74 68 65 20 78 44 65 73 74 72 6f 79 20 6d 65 74  the xDestroy met
2bea0 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74  hod.** of that t
2beb0 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  able..*/.case OP
2bec0 5f 56 44 65 73 74 72 6f 79 3a 20 7b 0a 20 20 70  _VDestroy: {.  p
2bed0 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
2bee0 20 32 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   2;.  rc = sqlit
2bef0 65 33 56 74 61 62 43 61 6c 6c 44 65 73 74 72 6f  e3VtabCallDestro
2bf00 79 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  y(db, pOp->p1, p
2bf10 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 70 2d 3e  Op->p4.z);.  p->
2bf20 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30  inVtabMethod = 0
2bf30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
2bf40 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2bf50 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
2bf60 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
2bf70 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2bf80 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ABLE./* Opcode: 
2bf90 56 4f 70 65 6e 20 50 31 20 2a 20 2a 20 50 34 20  VOpen P1 * * P4 
2bfa0 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20  *.**.** P4 is a 
2bfb0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 76 69 72  pointer to a vir
2bfc0 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63  tual table objec
2bfd0 74 2c 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74  t, an sqlite3_vt
2bfe0 61 62 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ab structure..**
2bff0 20 50 31 20 69 73 20 61 20 63 75 72 73 6f 72 20   P1 is a cursor 
2c000 6e 75 6d 62 65 72 2e 20 20 54 68 69 73 20 6f 70  number.  This op
2c010 63 6f 64 65 20 6f 70 65 6e 73 20 61 20 63 75 72  code opens a cur
2c020 73 6f 72 20 74 6f 20 74 68 65 20 76 69 72 74 75  sor to the virtu
2c030 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  al.** table and 
2c040 73 74 6f 72 65 73 20 74 68 61 74 20 63 75 72 73  stores that curs
2c050 6f 72 20 69 6e 20 50 31 2e 0a 2a 2f 0a 63 61 73  or in P1..*/.cas
2c060 65 20 4f 50 5f 56 4f 70 65 6e 3a 20 7b 0a 20 20  e OP_VOpen: {.  
2c070 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72  VdbeCursor *pCur
2c080 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ;.  sqlite3_vtab
2c090 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
2c0a0 72 73 6f 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f  rsor;.  sqlite3_
2c0b0 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 73  vtab *pVtab;.  s
2c0c0 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
2c0d0 4d 6f 64 75 6c 65 3b 0a 0a 20 20 70 43 75 72 20  Module;..  pCur 
2c0e0 3d 20 30 3b 0a 20 20 70 56 74 61 62 43 75 72 73  = 0;.  pVtabCurs
2c0f0 6f 72 20 3d 20 30 3b 0a 20 20 70 56 74 61 62 20  or = 0;.  pVtab 
2c100 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d  = pOp->p4.pVtab-
2c110 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64 75 6c  >pVtab;.  pModul
2c120 65 20 3d 20 28 73 71 6c 69 74 65 33 5f 6d 6f 64  e = (sqlite3_mod
2c130 75 6c 65 20 2a 29 70 56 74 61 62 2d 3e 70 4d 6f  ule *)pVtab->pMo
2c140 64 75 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 70  dule;.  assert(p
2c150 56 74 61 62 20 26 26 20 70 4d 6f 64 75 6c 65 29  Vtab && pModule)
2c160 3b 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65  ;.  rc = pModule
2c170 2d 3e 78 4f 70 65 6e 28 70 56 74 61 62 2c 20 26  ->xOpen(pVtab, &
2c180 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20  pVtabCursor);.  
2c190 69 6d 70 6f 72 74 56 74 61 62 45 72 72 4d 73 67  importVtabErrMsg
2c1a0 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20 69 66  (p, pVtab);.  if
2c1b0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20  ( SQLITE_OK==rc 
2c1c0 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  ){.    /* Initia
2c1d0 6c 69 7a 65 20 73 71 6c 69 74 65 33 5f 76 74 61  lize sqlite3_vta
2c1e0 62 5f 63 75 72 73 6f 72 20 62 61 73 65 20 63 6c  b_cursor base cl
2c1f0 61 73 73 20 2a 2f 0a 20 20 20 20 70 56 74 61 62  ass */.    pVtab
2c200 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 20 3d 20  Cursor->pVtab = 
2c210 70 56 74 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 49  pVtab;..    /* I
2c220 6e 69 74 69 61 6c 69 73 65 20 76 64 62 65 20 63  nitialise vdbe c
2c230 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  ursor object */.
2c240 20 20 20 20 70 43 75 72 20 3d 20 61 6c 6c 6f 63      pCur = alloc
2c250 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70  ateCursor(p, pOp
2c260 2d 3e 70 31 2c 20 30 2c 20 2d 31 2c 20 30 29 3b  ->p1, 0, -1, 0);
2c270 0a 20 20 20 20 69 66 28 20 70 43 75 72 20 29 7b  .    if( pCur ){
2c280 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 56 74  .      pCur->pVt
2c290 61 62 43 75 72 73 6f 72 20 3d 20 70 56 74 61 62  abCursor = pVtab
2c2a0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 70 43  Cursor;.      pC
2c2b0 75 72 2d 3e 70 4d 6f 64 75 6c 65 20 3d 20 70 56  ur->pModule = pV
2c2c0 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  tabCursor->pVtab
2c2d0 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 7d  ->pModule;.    }
2c2e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e  else{.      db->
2c2f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
2c300 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d  ;.      pModule-
2c310 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72  >xClose(pVtabCur
2c320 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  sor);.    }.  }.
2c330 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
2c340 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2c350 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
2c360 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c370 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2c380 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 46  LE./* Opcode: VF
2c390 69 6c 74 65 72 20 50 31 20 50 32 20 50 33 20 50  ilter P1 P2 P3 P
2c3a0 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20  4 *.**.** P1 is 
2c3b0 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20  a cursor opened 
2c3c0 75 73 69 6e 67 20 56 4f 70 65 6e 2e 20 20 50 32  using VOpen.  P2
2c3d0 20 69 73 20 61 6e 20 61 64 64 72 65 73 73 20 74   is an address t
2c3e0 6f 20 6a 75 6d 70 20 74 6f 20 69 66 0a 2a 2a 20  o jump to if.** 
2c3f0 74 68 65 20 66 69 6c 74 65 72 65 64 20 72 65 73  the filtered res
2c400 75 6c 74 20 73 65 74 20 69 73 20 65 6d 70 74 79  ult set is empty
2c410 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 65 69  ..**.** P4 is ei
2c420 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20 73  ther NULL or a s
2c430 74 72 69 6e 67 20 74 68 61 74 20 77 61 73 20 67  tring that was g
2c440 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
2c450 78 42 65 73 74 49 6e 64 65 78 0a 2a 2a 20 6d 65  xBestIndex.** me
2c460 74 68 6f 64 20 6f 66 20 74 68 65 20 6d 6f 64 75  thod of the modu
2c470 6c 65 2e 20 20 54 68 65 20 69 6e 74 65 72 70 72  le.  The interpr
2c480 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50  etation of the P
2c490 34 20 73 74 72 69 6e 67 20 69 73 20 6c 65 66 74  4 string is left
2c4a0 0a 2a 2a 20 74 6f 20 74 68 65 20 6d 6f 64 75 6c  .** to the modul
2c4b0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2c4c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
2c4d0 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ode invokes the 
2c4e0 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 20 6f  xFilter method o
2c4f0 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  n the virtual ta
2c500 62 6c 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ble specified.**
2c510 20 62 79 20 50 31 2e 20 20 54 68 65 20 69 6e 74   by P1.  The int
2c520 65 67 65 72 20 71 75 65 72 79 20 70 6c 61 6e 20  eger query plan 
2c530 70 61 72 61 6d 65 74 65 72 20 74 6f 20 78 46 69  parameter to xFi
2c540 6c 74 65 72 20 69 73 20 73 74 6f 72 65 64 20 69  lter is stored i
2c550 6e 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 50 33  n register.** P3
2c560 2e 20 52 65 67 69 73 74 65 72 20 50 33 2b 31 20  . Register P3+1 
2c570 73 74 6f 72 65 73 20 74 68 65 20 61 72 67 63 20  stores the argc 
2c580 70 61 72 61 6d 65 74 65 72 20 74 6f 20 62 65 20  parameter to be 
2c590 70 61 73 73 65 64 20 74 6f 20 74 68 65 0a 2a 2a  passed to the.**
2c5a0 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e   xFilter method.
2c5b0 20 52 65 67 69 73 74 65 72 73 20 50 33 2b 32 2e   Registers P3+2.
2c5c0 2e 50 33 2b 31 2b 61 72 67 63 20 61 72 65 20 74  .P3+1+argc are t
2c5d0 68 65 20 61 72 67 63 0a 2a 2a 20 61 64 64 69 74  he argc.** addit
2c5e0 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 73  ional parameters
2c5f0 20 77 68 69 63 68 20 61 72 65 20 70 61 73 73 65   which are passe
2c600 64 20 74 6f 0a 2a 2a 20 78 46 69 6c 74 65 72 20  d to.** xFilter 
2c610 61 73 20 61 72 67 76 2e 20 52 65 67 69 73 74 65  as argv. Registe
2c620 72 20 50 33 2b 32 20 62 65 63 6f 6d 65 73 20 61  r P3+2 becomes a
2c630 72 67 76 5b 30 5d 20 77 68 65 6e 20 70 61 73 73  rgv[0] when pass
2c640 65 64 20 74 6f 20 78 46 69 6c 74 65 72 2e 0a 2a  ed to xFilter..*
2c650 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 69 73 20 6d  *.** A jump is m
2c660 61 64 65 20 74 6f 20 50 32 20 69 66 20 74 68 65  ade to P2 if the
2c670 20 72 65 73 75 6c 74 20 73 65 74 20 61 66 74 65   result set afte
2c680 72 20 66 69 6c 74 65 72 69 6e 67 20 77 6f 75 6c  r filtering woul
2c690 64 20 62 65 20 65 6d 70 74 79 2e 0a 2a 2f 0a 63  d be empty..*/.c
2c6a0 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20  ase OP_VFilter: 
2c6b0 7b 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20  {   /* jump */. 
2c6c0 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74   int nArg;.  int
2c6d0 20 69 51 75 65 72 79 3b 0a 20 20 63 6f 6e 73 74   iQuery;.  const
2c6e0 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
2c6f0 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d 20  *pModule;.  Mem 
2c700 2a 70 51 75 65 72 79 3b 0a 20 20 4d 65 6d 20 2a  *pQuery;.  Mem *
2c710 70 41 72 67 63 3b 0a 20 20 73 71 6c 69 74 65 33  pArgc;.  sqlite3
2c720 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
2c730 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 73 71 6c  tabCursor;.  sql
2c740 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
2c750 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  ;.  VdbeCursor *
2c760 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b  pCur;.  int res;
2c770 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20  .  int i;.  Mem 
2c780 2a 2a 61 70 41 72 67 3b 0a 0a 20 20 70 51 75 65  **apArg;..  pQue
2c790 72 79 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ry = &aMem[pOp->
2c7a0 70 33 5d 3b 0a 20 20 70 41 72 67 63 20 3d 20 26  p3];.  pArgc = &
2c7b0 70 51 75 65 72 79 5b 31 5d 3b 0a 20 20 70 43 75  pQuery[1];.  pCu
2c7c0 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  r = p->apCsr[pOp
2c7d0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2c7e0 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 51 75 65   memIsValid(pQue
2c7f0 72 79 29 20 29 3b 0a 20 20 52 45 47 49 53 54 45  ry) );.  REGISTE
2c800 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c  R_TRACE(pOp->p3,
2c810 20 70 51 75 65 72 79 29 3b 0a 20 20 61 73 73 65   pQuery);.  asse
2c820 72 74 28 20 70 43 75 72 2d 3e 70 56 74 61 62 43  rt( pCur->pVtabC
2c830 75 72 73 6f 72 20 29 3b 0a 20 20 70 56 74 61 62  ursor );.  pVtab
2c840 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70  Cursor = pCur->p
2c850 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 70 56  VtabCursor;.  pV
2c860 74 61 62 20 3d 20 70 56 74 61 62 43 75 72 73 6f  tab = pVtabCurso
2c870 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64  r->pVtab;.  pMod
2c880 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f  ule = pVtab->pMo
2c890 64 75 6c 65 3b 0a 0a 20 20 2f 2a 20 47 72 61 62  dule;..  /* Grab
2c8a0 20 74 68 65 20 69 6e 64 65 78 20 6e 75 6d 62 65   the index numbe
2c8b0 72 20 61 6e 64 20 61 72 67 63 20 70 61 72 61 6d  r and argc param
2c8c0 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72  eters */.  asser
2c8d0 74 28 20 28 70 51 75 65 72 79 2d 3e 66 6c 61 67  t( (pQuery->flag
2c8e0 73 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 26 26  s&MEM_Int)!=0 &&
2c8f0 20 70 41 72 67 63 2d 3e 66 6c 61 67 73 3d 3d 4d   pArgc->flags==M
2c900 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 6e 41 72 67  EM_Int );.  nArg
2c910 20 3d 20 28 69 6e 74 29 70 41 72 67 63 2d 3e 75   = (int)pArgc->u
2c920 2e 69 3b 0a 20 20 69 51 75 65 72 79 20 3d 20 28  .i;.  iQuery = (
2c930 69 6e 74 29 70 51 75 65 72 79 2d 3e 75 2e 69 3b  int)pQuery->u.i;
2c940 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68  ..  /* Invoke th
2c950 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64  e xFilter method
2c960 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 72 65 73 20   */.  {.    res 
2c970 3d 20 30 3b 0a 20 20 20 20 61 70 41 72 67 20 3d  = 0;.    apArg =
2c980 20 70 2d 3e 61 70 41 72 67 3b 0a 20 20 20 20 66   p->apArg;.    f
2c990 6f 72 28 69 20 3d 20 30 3b 20 69 3c 6e 41 72 67  or(i = 0; i<nArg
2c9a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 70  ; i++){.      ap
2c9b0 41 72 67 5b 69 5d 20 3d 20 26 70 41 72 67 63 5b  Arg[i] = &pArgc[
2c9c0 69 2b 31 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  i+1];.      sqli
2c9d0 74 65 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54  te3VdbeMemStoreT
2c9e0 79 70 65 28 61 70 41 72 67 5b 69 5d 29 3b 0a 20  ype(apArg[i]);. 
2c9f0 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 69 6e 56     }..    p->inV
2ca00 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20  tabMethod = 1;. 
2ca10 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d     rc = pModule-
2ca20 3e 78 46 69 6c 74 65 72 28 70 56 74 61 62 43 75  >xFilter(pVtabCu
2ca30 72 73 6f 72 2c 20 69 51 75 65 72 79 2c 20 70 4f  rsor, iQuery, pO
2ca40 70 2d 3e 70 34 2e 7a 2c 20 6e 41 72 67 2c 20 61  p->p4.z, nArg, a
2ca50 70 41 72 67 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  pArg);.    p->in
2ca60 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a  VtabMethod = 0;.
2ca70 20 20 20 20 69 6d 70 6f 72 74 56 74 61 62 45 72      importVtabEr
2ca80 72 4d 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a  rMsg(p, pVtab);.
2ca90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2caa0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2cab0 65 73 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 45  es = pModule->xE
2cac0 6f 66 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b  of(pVtabCursor);
2cad0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2cae0 72 65 73 20 29 7b 0a 20 20 20 20 20 20 70 63 20  res ){.      pc 
2caf0 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
2cb00 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d     }.  }.  pCur-
2cb10 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 0a 20  >nullRow = 0;.. 
2cb20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
2cb30 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2cb40 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
2cb50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2cb60 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2cb70 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 43 6f  E./* Opcode: VCo
2cb80 6c 75 6d 6e 20 50 31 20 50 32 20 50 33 20 2a 20  lumn P1 P2 P3 * 
2cb90 2a 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 74 68  *.**.** Store th
2cba0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
2cbb0 32 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  2-th column of.*
2cbc0 2a 20 74 68 65 20 72 6f 77 20 6f 66 20 74 68 65  * the row of the
2cbd0 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 74   virtual-table t
2cbe0 68 61 74 20 74 68 65 20 0a 2a 2a 20 50 31 20 63  hat the .** P1 c
2cbf0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
2cc00 67 20 74 6f 20 69 6e 74 6f 20 72 65 67 69 73 74  g to into regist
2cc10 65 72 20 50 33 2e 0a 2a 2f 0a 63 61 73 65 20 4f  er P3..*/.case O
2cc20 50 5f 56 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 73  P_VColumn: {.  s
2cc30 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
2cc40 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  ab;.  const sqli
2cc50 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
2cc60 75 6c 65 3b 0a 20 20 4d 65 6d 20 2a 70 44 65 73  ule;.  Mem *pDes
2cc70 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  t;.  sqlite3_con
2cc80 74 65 78 74 20 73 43 6f 6e 74 65 78 74 3b 0a 0a  text sContext;..
2cc90 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
2cca0 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  ur = p->apCsr[pO
2ccb0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
2ccc0 28 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72  ( pCur->pVtabCur
2ccd0 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sor );.  assert(
2cce0 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f   pOp->p3>0 && pO
2ccf0 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29  p->p3<=p->nMem )
2cd00 3b 0a 20 20 70 44 65 73 74 20 3d 20 26 61 4d 65  ;.  pDest = &aMe
2cd10 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65  m[pOp->p3];.  me
2cd20 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
2cd30 2c 20 70 44 65 73 74 29 3b 0a 20 20 69 66 28 20  , pDest);.  if( 
2cd40 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b  pCur->nullRow ){
2cd50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2cd60 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 44 65 73 74  MemSetNull(pDest
2cd70 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
2cd80 7d 0a 20 20 70 56 74 61 62 20 3d 20 70 43 75 72  }.  pVtab = pCur
2cd90 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70  ->pVtabCursor->p
2cda0 56 74 61 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20  Vtab;.  pModule 
2cdb0 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  = pVtab->pModule
2cdc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 6f 64  ;.  assert( pMod
2cdd0 75 6c 65 2d 3e 78 43 6f 6c 75 6d 6e 20 29 3b 0a  ule->xColumn );.
2cde0 20 20 6d 65 6d 73 65 74 28 26 73 43 6f 6e 74 65    memset(&sConte
2cdf0 78 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43  xt, 0, sizeof(sC
2ce00 6f 6e 74 65 78 74 29 29 3b 0a 0a 20 20 2f 2a 20  ontext));..  /* 
2ce10 54 68 65 20 6f 75 74 70 75 74 20 63 65 6c 6c 20  The output cell 
2ce20 6d 61 79 20 61 6c 72 65 61 64 79 20 68 61 76 65  may already have
2ce30 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61   a buffer alloca
2ce40 74 65 64 2e 20 4d 6f 76 65 0a 20 20 2a 2a 20 74  ted. Move.  ** t
2ce50 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
2ce60 6e 74 73 20 74 6f 20 73 43 6f 6e 74 65 78 74 2e  nts to sContext.
2ce70 73 20 73 6f 20 69 6e 20 63 61 73 65 20 74 68 65  s so in case the
2ce80 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 0a   user-function .
2ce90 20 20 2a 2a 20 63 61 6e 20 75 73 65 20 74 68 65    ** can use the
2cea0 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74   already allocat
2ceb0 65 64 20 62 75 66 66 65 72 20 69 6e 73 74 65 61  ed buffer instea
2cec0 64 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6e 67 20  d of allocating 
2ced0 61 20 0a 20 20 2a 2a 20 6e 65 77 20 6f 6e 65 2e  a .  ** new one.
2cee0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
2cef0 64 62 65 4d 65 6d 4d 6f 76 65 28 26 73 43 6f 6e  dbeMemMove(&sCon
2cf00 74 65 78 74 2e 73 2c 20 70 44 65 73 74 29 3b 0a  text.s, pDest);.
2cf10 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
2cf20 28 26 73 43 6f 6e 74 65 78 74 2e 73 2c 20 4d 45  (&sContext.s, ME
2cf30 4d 5f 4e 75 6c 6c 29 3b 0a 0a 20 20 72 63 20 3d  M_Null);..  rc =
2cf40 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d   pModule->xColum
2cf50 6e 28 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72  n(pCur->pVtabCur
2cf60 73 6f 72 2c 20 26 73 43 6f 6e 74 65 78 74 2c 20  sor, &sContext, 
2cf70 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 69 6d 70 6f  pOp->p2);.  impo
2cf80 72 74 56 74 61 62 45 72 72 4d 73 67 28 70 2c 20  rtVtabErrMsg(p, 
2cf90 70 56 74 61 62 29 3b 0a 20 20 69 66 28 20 73 43  pVtab);.  if( sC
2cfa0 6f 6e 74 65 78 74 2e 69 73 45 72 72 6f 72 20 29  ontext.isError )
2cfb0 7b 0a 20 20 20 20 72 63 20 3d 20 73 43 6f 6e 74  {.    rc = sCont
2cfc0 65 78 74 2e 69 73 45 72 72 6f 72 3b 0a 20 20 7d  ext.isError;.  }
2cfd0 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20  ..  /* Copy the 
2cfe0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75  result of the fu
2cff0 6e 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 50 33  nction to the P3
2d000 20 72 65 67 69 73 74 65 72 2e 20 57 65 0a 20 20   register. We.  
2d010 2a 2a 20 64 6f 20 74 68 69 73 20 72 65 67 61 72  ** do this regar
2d020 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
2d030 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   or not an error
2d040 20 6f 63 63 75 72 72 65 64 20 74 6f 20 65 6e 73   occurred to ens
2d050 75 72 65 20 61 6e 79 0a 20 20 2a 2a 20 64 79 6e  ure any.  ** dyn
2d060 61 6d 69 63 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  amic allocation 
2d070 69 6e 20 73 43 6f 6e 74 65 78 74 2e 73 20 28 61  in sContext.s (a
2d080 20 4d 65 6d 20 73 74 72 75 63 74 29 20 69 73 20   Mem struct) is 
2d090 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
2d0a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2d0b0 6e 67 65 45 6e 63 6f 64 69 6e 67 28 26 73 43 6f  ngeEncoding(&sCo
2d0c0 6e 74 65 78 74 2e 73 2c 20 65 6e 63 6f 64 69 6e  ntext.s, encodin
2d0d0 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  g);.  sqlite3Vdb
2d0e0 65 4d 65 6d 4d 6f 76 65 28 70 44 65 73 74 2c 20  eMemMove(pDest, 
2d0f0 26 73 43 6f 6e 74 65 78 74 2e 73 29 3b 0a 20 20  &sContext.s);.  
2d100 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
2d110 4f 70 2d 3e 70 33 2c 20 70 44 65 73 74 29 3b 0a  Op->p3, pDest);.
2d120 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
2d130 42 53 49 5a 45 28 70 44 65 73 74 29 3b 0a 0a 20  BSIZE(pDest);.. 
2d140 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
2d150 4d 65 6d 54 6f 6f 42 69 67 28 70 44 65 73 74 29  MemTooBig(pDest)
2d160 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f   ){.    goto too
2d170 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 62 72 65 61  _big;.  }.  brea
2d180 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  k;.}.#endif /* S
2d190 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2d1a0 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e  ALTABLE */..#ifn
2d1b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d1c0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20  VIRTUALTABLE./* 
2d1d0 4f 70 63 6f 64 65 3a 20 56 4e 65 78 74 20 50 31  Opcode: VNext P1
2d1e0 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
2d1f0 41 64 76 61 6e 63 65 20 76 69 72 74 75 61 6c 20  Advance virtual 
2d200 74 61 62 6c 65 20 50 31 20 74 6f 20 74 68 65 20  table P1 to the 
2d210 6e 65 78 74 20 72 6f 77 20 69 6e 20 69 74 73 20  next row in its 
2d220 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 0a 2a  result set and.*
2d230 2a 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75  * jump to instru
2d240 63 74 69 6f 6e 20 50 32 2e 20 20 4f 72 2c 20 69  ction P2.  Or, i
2d250 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
2d260 62 6c 65 20 68 61 73 20 72 65 61 63 68 65 64 0a  ble has reached.
2d270 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 69 74  ** the end of it
2d280 73 20 72 65 73 75 6c 74 20 73 65 74 2c 20 74 68  s result set, th
2d290 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  en fall through 
2d2a0 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
2d2b0 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  ruction..*/.case
2d2c0 20 4f 50 5f 56 4e 65 78 74 3a 20 7b 20 20 20 2f   OP_VNext: {   /
2d2d0 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 73 71 6c 69  * jump */.  sqli
2d2e0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b  te3_vtab *pVtab;
2d2f0 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
2d300 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
2d310 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 56  ;.  int res;.  V
2d320 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b  dbeCursor *pCur;
2d330 0a 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 70  ..  res = 0;.  p
2d340 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70  Cur = p->apCsr[p
2d350 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
2d360 74 28 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75  t( pCur->pVtabCu
2d370 72 73 6f 72 20 29 3b 0a 20 20 69 66 28 20 70 43  rsor );.  if( pC
2d380 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20  ur->nullRow ){. 
2d390 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
2d3a0 70 56 74 61 62 20 3d 20 70 43 75 72 2d 3e 70 56  pVtab = pCur->pV
2d3b0 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  tabCursor->pVtab
2d3c0 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56  ;.  pModule = pV
2d3d0 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  tab->pModule;.  
2d3e0 61 73 73 65 72 74 28 20 70 4d 6f 64 75 6c 65 2d  assert( pModule-
2d3f0 3e 78 4e 65 78 74 20 29 3b 0a 0a 20 20 2f 2a 20  >xNext );..  /* 
2d400 49 6e 76 6f 6b 65 20 74 68 65 20 78 4e 65 78 74  Invoke the xNext
2d410 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  () method of the
2d420 20 6d 6f 64 75 6c 65 2e 20 54 68 65 72 65 20 69   module. There i
2d430 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 74 68 65  s no way for the
2d440 0a 20 20 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67  .  ** underlying
2d450 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2d460 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
2d470 6f 72 20 69 66 20 6f 6e 65 20 6f 63 63 75 72 73  or if one occurs
2d480 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 78 4e 65   during.  ** xNe
2d490 78 74 28 29 2e 20 49 6e 73 74 65 61 64 2c 20 69  xt(). Instead, i
2d4a0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2d4b0 73 2c 20 74 72 75 65 20 69 73 20 72 65 74 75 72  s, true is retur
2d4c0 6e 65 64 20 28 69 6e 64 69 63 61 74 69 6e 67 20  ned (indicating 
2d4d0 74 68 61 74 20 0a 20 20 2a 2a 20 64 61 74 61 20  that .  ** data 
2d4e0 69 73 20 61 76 61 69 6c 61 62 6c 65 29 20 61 6e  is available) an
2d4f0 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
2d500 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 78   returned when x
2d510 43 6f 6c 75 6d 6e 20 6f 72 0a 20 20 2a 2a 20 73  Column or.  ** s
2d520 6f 6d 65 20 6f 74 68 65 72 20 6d 65 74 68 6f 64  ome other method
2d530 20 69 73 20 6e 65 78 74 20 69 6e 76 6f 6b 65 64   is next invoked
2d540 20 6f 6e 20 74 68 65 20 73 61 76 65 20 76 69 72   on the save vir
2d550 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f  tual table curso
2d560 72 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e 56  r..  */.  p->inV
2d570 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20  tabMethod = 1;. 
2d580 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78   rc = pModule->x
2d590 4e 65 78 74 28 70 43 75 72 2d 3e 70 56 74 61 62  Next(pCur->pVtab
2d5a0 43 75 72 73 6f 72 29 3b 0a 20 20 70 2d 3e 69 6e  Cursor);.  p->in
2d5b0 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a  VtabMethod = 0;.
2d5c0 20 20 69 6d 70 6f 72 74 56 74 61 62 45 72 72 4d    importVtabErrM
2d5d0 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20  sg(p, pVtab);.  
2d5e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2d5f0 4b 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  K ){.    res = p
2d600 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66 28 70 43 75  Module->xEof(pCu
2d610 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 29 3b  r->pVtabCursor);
2d620 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 72 65 73  .  }..  if( !res
2d630 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
2d640 65 72 65 20 69 73 20 64 61 74 61 2c 20 6a 75 6d  ere is data, jum
2d650 70 20 74 6f 20 50 32 20 2a 2f 0a 20 20 20 20 70  p to P2 */.    p
2d660 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
2d670 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
2d680 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2d690 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2d6a0 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  LE */..#ifndef S
2d6b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2d6c0 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64  ALTABLE./* Opcod
2d6d0 65 3a 20 56 52 65 6e 61 6d 65 20 50 31 20 2a 20  e: VRename P1 * 
2d6e0 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20  * P4 *.**.** P4 
2d6f0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
2d700 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
2d710 6f 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c 69 74  object, an sqlit
2d720 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
2d730 65 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  e..** This opcod
2d740 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f  e invokes the co
2d750 72 72 65 73 70 6f 6e 64 69 6e 67 20 78 52 65 6e  rresponding xRen
2d760 61 6d 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20  ame method. The 
2d770 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 72 65 67 69  value.** in regi
2d780 73 74 65 72 20 50 31 20 69 73 20 70 61 73 73 65  ster P1 is passe
2d790 64 20 61 73 20 74 68 65 20 7a 4e 61 6d 65 20 61  d as the zName a
2d7a0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 78  rgument to the x
2d7b0 52 65 6e 61 6d 65 20 6d 65 74 68 6f 64 2e 0a 2a  Rename method..*
2d7c0 2f 0a 63 61 73 65 20 4f 50 5f 56 52 65 6e 61 6d  /.case OP_VRenam
2d7d0 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  e: {.  sqlite3_v
2d7e0 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 4d 65  tab *pVtab;.  Me
2d7f0 6d 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 70 56 74  m *pName;..  pVt
2d800 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74  ab = pOp->p4.pVt
2d810 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4e 61  ab->pVtab;.  pNa
2d820 6d 65 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  me = &aMem[pOp->
2d830 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
2d840 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  Vtab->pModule->x
2d850 52 65 6e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65  Rename );.  asse
2d860 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70  rt( memIsValid(p
2d870 4e 61 6d 65 29 20 29 3b 0a 20 20 52 45 47 49 53  Name) );.  REGIS
2d880 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
2d890 31 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 61 73 73  1, pName);.  ass
2d8a0 65 72 74 28 20 70 4e 61 6d 65 2d 3e 66 6c 61 67  ert( pName->flag
2d8b0 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20  s & MEM_Str );. 
2d8c0 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f   rc = pVtab->pMo
2d8d0 64 75 6c 65 2d 3e 78 52 65 6e 61 6d 65 28 70 56  dule->xRename(pV
2d8e0 74 61 62 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a  tab, pName->z);.
2d8f0 20 20 69 6d 70 6f 72 74 56 74 61 62 45 72 72 4d    importVtabErrM
2d900 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20  sg(p, pVtab);.  
2d910 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
2d920 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
2d930 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
2d940 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2d950 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ABLE./* Opcode: 
2d960 56 55 70 64 61 74 65 20 50 31 20 50 32 20 50 33  VUpdate P1 P2 P3
2d970 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69   P4 *.**.** P4 i
2d980 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2d990 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f   virtual table o
2d9a0 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c 69 74 65  bject, an sqlite
2d9b0 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65  3_vtab structure
2d9c0 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  ..** This opcode
2d9d0 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 72   invokes the cor
2d9e0 72 65 73 70 6f 6e 64 69 6e 67 20 78 55 70 64 61  responding xUpda
2d9f0 74 65 20 6d 65 74 68 6f 64 2e 20 50 32 20 76 61  te method. P2 va
2da00 6c 75 65 73 0a 2a 2a 20 61 72 65 20 63 6f 6e 74  lues.** are cont
2da10 69 67 75 6f 75 73 20 6d 65 6d 6f 72 79 20 63 65  iguous memory ce
2da20 6c 6c 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  lls starting at 
2da30 50 33 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68  P3 to pass to th
2da40 65 20 78 55 70 64 61 74 65 20 0a 2a 2a 20 69 6e  e xUpdate .** in
2da50 76 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 76 61  vocation. The va
2da60 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
2da70 28 50 33 2b 50 32 2d 31 29 20 63 6f 72 72 65 73  (P3+P2-1) corres
2da80 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 0a 2a 2a  ponds to the .**
2da90 20 70 32 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66   p2th element of
2daa0 20 74 68 65 20 61 72 67 76 20 61 72 72 61 79 20   the argv array 
2dab0 70 61 73 73 65 64 20 74 6f 20 78 55 70 64 61 74  passed to xUpdat
2dac0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 55 70  e..**.** The xUp
2dad0 64 61 74 65 20 6d 65 74 68 6f 64 20 77 69 6c 6c  date method will
2dae0 20 64 6f 20 61 20 44 45 4c 45 54 45 20 6f 72 20   do a DELETE or 
2daf0 61 6e 20 49 4e 53 45 52 54 20 6f 72 20 62 6f 74  an INSERT or bot
2db00 68 2e 0a 2a 2a 20 54 68 65 20 61 72 67 76 5b 30  h..** The argv[0
2db10 5d 20 65 6c 65 6d 65 6e 74 20 28 77 68 69 63 68  ] element (which
2db20 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2db30 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 50 33 29 0a  memory cell P3).
2db40 2a 2a 20 69 73 20 74 68 65 20 72 6f 77 69 64 20  ** is the rowid 
2db50 6f 66 20 61 20 72 6f 77 20 74 6f 20 64 65 6c 65  of a row to dele
2db60 74 65 2e 20 20 49 66 20 61 72 67 76 5b 30 5d 20  te.  If argv[0] 
2db70 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 6e 6f 20  is NULL then no 
2db80 0a 2a 2a 20 64 65 6c 65 74 69 6f 6e 20 6f 63 63  .** deletion occ
2db90 75 72 73 2e 20 20 54 68 65 20 61 72 67 76 5b 31  urs.  The argv[1
2dba0 5d 20 65 6c 65 6d 65 6e 74 20 69 73 20 74 68 65  ] element is the
2dbb0 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 6e 65   rowid of the ne
2dbc0 77 20 0a 2a 2a 20 72 6f 77 2e 20 20 54 68 69 73  w .** row.  This
2dbd0 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 74 6f 20   can be NULL to 
2dbe0 68 61 76 65 20 74 68 65 20 76 69 72 74 75 61 6c  have the virtual
2dbf0 20 74 61 62 6c 65 20 73 65 6c 65 63 74 20 74 68   table select th
2dc00 65 20 6e 65 77 20 0a 2a 2a 20 72 6f 77 69 64 20  e new .** rowid 
2dc10 66 6f 72 20 69 74 73 65 6c 66 2e 20 20 54 68 65  for itself.  The
2dc20 20 73 75 62 73 65 71 75 65 6e 74 20 65 6c 65 6d   subsequent elem
2dc30 65 6e 74 73 20 69 6e 20 74 68 65 20 61 72 72 61  ents in the arra
2dc40 79 20 61 72 65 20 0a 2a 2a 20 74 68 65 20 76 61  y are .** the va
2dc50 6c 75 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  lues of columns 
2dc60 69 6e 20 74 68 65 20 6e 65 77 20 72 6f 77 2e 0a  in the new row..
2dc70 2a 2a 0a 2a 2a 20 49 66 20 50 32 3d 3d 31 20 74  **.** If P2==1 t
2dc80 68 65 6e 20 6e 6f 20 69 6e 73 65 72 74 20 69 73  hen no insert is
2dc90 20 70 65 72 66 6f 72 6d 65 64 2e 20 20 61 72 67   performed.  arg
2dca0 76 5b 30 5d 20 69 73 20 74 68 65 20 72 6f 77 69  v[0] is the rowi
2dcb0 64 20 6f 66 0a 2a 2a 20 61 20 72 6f 77 20 74 6f  d of.** a row to
2dcc0 20 64 65 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 50   delete..**.** P
2dcd0 31 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20 66  1 is a boolean f
2dce0 6c 61 67 2e 20 49 66 20 69 74 20 69 73 20 73 65  lag. If it is se
2dcf0 74 20 74 6f 20 74 72 75 65 20 61 6e 64 20 74 68  t to true and th
2dd00 65 20 78 55 70 64 61 74 65 20 63 61 6c 6c 0a 2a  e xUpdate call.*
2dd10 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  * is successful,
2dd20 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
2dd30 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
2dd40 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
2dd50 72 6f 77 69 64 28 29 20 0a 2a 2a 20 69 73 20 73  rowid() .** is s
2dd60 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
2dd70 6f 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72  of the rowid for
2dd80 20 74 68 65 20 72 6f 77 20 6a 75 73 74 20 69 6e   the row just in
2dd90 73 65 72 74 65 64 2e 0a 2a 2f 0a 63 61 73 65 20  serted..*/.case 
2dda0 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20  OP_VUpdate: {.  
2ddb0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
2ddc0 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  tab;.  sqlite3_m
2ddd0 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a  odule *pModule;.
2dde0 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e    int nArg;.  in
2ddf0 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 5f 69 6e  t i;.  sqlite_in
2de00 74 36 34 20 72 6f 77 69 64 3b 0a 20 20 4d 65 6d  t64 rowid;.  Mem
2de10 20 2a 2a 61 70 41 72 67 3b 0a 20 20 4d 65 6d 20   **apArg;.  Mem 
2de20 2a 70 58 3b 0a 0a 20 20 70 56 74 61 62 20 3d 20  *pX;..  pVtab = 
2de30 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70  pOp->p4.pVtab->p
2de40 56 74 61 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20  Vtab;.  pModule 
2de50 3d 20 28 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  = (sqlite3_modul
2de60 65 20 2a 29 70 56 74 61 62 2d 3e 70 4d 6f 64 75  e *)pVtab->pModu
2de70 6c 65 3b 0a 20 20 6e 41 72 67 20 3d 20 70 4f 70  le;.  nArg = pOp
2de80 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p2;.  assert( 
2de90 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
2dea0 56 54 41 42 20 29 3b 0a 20 20 69 66 28 20 41 4c  VTAB );.  if( AL
2deb0 57 41 59 53 28 70 4d 6f 64 75 6c 65 2d 3e 78 55  WAYS(pModule->xU
2dec0 70 64 61 74 65 29 20 29 7b 0a 20 20 20 20 61 70  pdate) ){.    ap
2ded0 41 72 67 20 3d 20 70 2d 3e 61 70 41 72 67 3b 0a  Arg = p->apArg;.
2dee0 20 20 20 20 70 58 20 3d 20 26 61 4d 65 6d 5b 70      pX = &aMem[p
2def0 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 66 6f 72  Op->p3];.    for
2df00 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
2df10 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
2df20 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 58 29  ( memIsValid(pX)
2df30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62 6f   );.      memAbo
2df40 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 58  utToChange(p, pX
2df50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2df60 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65  VdbeMemStoreType
2df70 28 70 58 29 3b 0a 20 20 20 20 20 20 61 70 41 72  (pX);.      apAr
2df80 67 5b 69 5d 20 3d 20 70 58 3b 0a 20 20 20 20 20  g[i] = pX;.     
2df90 20 70 58 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20   pX++;.    }.   
2dfa0 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78   rc = pModule->x
2dfb0 55 70 64 61 74 65 28 70 56 74 61 62 2c 20 6e 41  Update(pVtab, nA
2dfc0 72 67 2c 20 61 70 41 72 67 2c 20 26 72 6f 77 69  rg, apArg, &rowi
2dfd0 64 29 3b 0a 20 20 20 20 69 6d 70 6f 72 74 56 74  d);.    importVt
2dfe0 61 62 45 72 72 4d 73 67 28 70 2c 20 70 56 74 61  abErrMsg(p, pVta
2dff0 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  b);.    if( rc==
2e000 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4f 70  SQLITE_OK && pOp
2e010 2d 3e 70 31 20 29 7b 0a 20 20 20 20 20 20 61 73  ->p1 ){.      as
2e020 73 65 72 74 28 20 6e 41 72 67 3e 31 20 26 26 20  sert( nArg>1 && 
2e030 61 70 41 72 67 5b 30 5d 20 26 26 20 28 61 70 41  apArg[0] && (apA
2e040 72 67 5b 30 5d 2d 3e 66 6c 61 67 73 26 4d 45 4d  rg[0]->flags&MEM
2e050 5f 4e 75 6c 6c 29 20 29 3b 0a 20 20 20 20 20 20  _Null) );.      
2e060 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
2e070 72 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 20 20 20  rowid;.    }.   
2e080 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20   p->nChange++;. 
2e090 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65   }.  break;.}.#e
2e0a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2e0b0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2e0c0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 20 53 51   */..#ifndef  SQ
2e0d0 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
2e0e0 50 52 41 47 4d 41 53 0a 2f 2a 20 4f 70 63 6f 64  PRAGMAS./* Opcod
2e0f0 65 3a 20 50 61 67 65 63 6f 75 6e 74 20 50 31 20  e: Pagecount P1 
2e100 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57  P2 * * *.**.** W
2e110 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
2e120 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
2e130 20 69 6e 20 64 61 74 61 62 61 73 65 20 50 31 20   in database P1 
2e140 74 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 50  to memory cell P
2e150 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 61  2..*/.case OP_Pa
2e160 67 65 63 6f 75 6e 74 3a 20 7b 20 20 20 20 20 20  gecount: {      
2e170 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72        /* out2-pr
2e180 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 70 4f  erelease */.  pO
2e190 75 74 2d 3e 75 2e 69 20 3d 20 73 71 6c 69 74 65  ut->u.i = sqlite
2e1a0 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 64  3BtreeLastPage(d
2e1b0 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e  b->aDb[pOp->p1].
2e1c0 70 42 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  pBt);.  break;.}
2e1d0 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65  .#endif...#ifnde
2e1e0 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  f  SQLITE_OMIT_P
2e1f0 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f 2a 20  AGER_PRAGMAS./* 
2e200 4f 70 63 6f 64 65 3a 20 4d 61 78 50 67 63 6e 74  Opcode: MaxPgcnt
2e210 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
2e220 0a 2a 2a 20 54 72 79 20 74 6f 20 73 65 74 20 74  .** Try to set t
2e230 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
2e240 63 6f 75 6e 74 20 66 6f 72 20 64 61 74 61 62 61  count for databa
2e250 73 65 20 50 31 20 74 6f 20 74 68 65 20 76 61 6c  se P1 to the val
2e260 75 65 20 69 6e 20 50 33 2e 0a 2a 2a 20 44 6f 20  ue in P3..** Do 
2e270 6e 6f 74 20 6c 65 74 20 74 68 65 20 6d 61 78 69  not let the maxi
2e280 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
2e290 61 6c 6c 20 62 65 6c 6f 77 20 74 68 65 20 63 75  all below the cu
2e2a0 72 72 65 6e 74 20 70 61 67 65 20 63 6f 75 6e 74  rrent page count
2e2b0 20 61 6e 64 0a 2a 2a 20 64 6f 20 6e 6f 74 20 63   and.** do not c
2e2c0 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
2e2d0 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 76 61 6c  m page count val
2e2e0 75 65 20 69 66 20 50 33 3d 3d 30 2e 0a 2a 2a 0a  ue if P3==0..**.
2e2f0 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 6d 61 78  ** Store the max
2e300 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
2e310 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
2e320 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
2e330 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 61 78 50  .*/.case OP_MaxP
2e340 67 63 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20  gcnt: {         
2e350 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65     /* out2-prere
2e360 6c 65 61 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67  lease */.  unsig
2e370 6e 65 64 20 69 6e 74 20 6e 65 77 4d 61 78 3b 0a  ned int newMax;.
2e380 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 0a 20    Btree *pBt;.. 
2e390 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70   pBt = db->aDb[p
2e3a0 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 6e  Op->p1].pBt;.  n
2e3b0 65 77 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66 28  ewMax = 0;.  if(
2e3c0 20 70 4f 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20   pOp->p3 ){.    
2e3d0 6e 65 77 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  newMax = sqlite3
2e3e0 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 70 42  BtreeLastPage(pB
2e3f0 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4d  t);.    if( newM
2e400 61 78 20 3c 20 28 75 6e 73 69 67 6e 65 64 29 70  ax < (unsigned)p
2e410 4f 70 2d 3e 70 33 20 29 20 6e 65 77 4d 61 78 20  Op->p3 ) newMax 
2e420 3d 20 28 75 6e 73 69 67 6e 65 64 29 70 4f 70 2d  = (unsigned)pOp-
2e430 3e 70 33 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d  >p3;.  }.  pOut-
2e440 3e 75 2e 69 20 3d 20 73 71 6c 69 74 65 33 42 74  >u.i = sqlite3Bt
2e450 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
2e460 70 42 74 2c 20 6e 65 77 4d 61 78 29 3b 0a 20 20  pBt, newMax);.  
2e470 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  break;.}.#endif.
2e480 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2e490 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 20 4f  _OMIT_TRACE./* O
2e4a0 70 63 6f 64 65 3a 20 54 72 61 63 65 20 2a 20 2a  pcode: Trace * *
2e4b0 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 66   * P4 *.**.** If
2e4c0 20 74 72 61 63 69 6e 67 20 69 73 20 65 6e 61 62   tracing is enab
2e4d0 6c 65 64 20 28 62 79 20 74 68 65 20 73 71 6c 69  led (by the sqli
2e4e0 74 65 33 5f 74 72 61 63 65 28 29 29 20 69 6e 74  te3_trace()) int
2e4f0 65 72 66 61 63 65 2c 20 74 68 65 6e 0a 2a 2a 20  erface, then.** 
2e500 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67  the UTF-8 string
2e510 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 50 34   contained in P4
2e520 20 69 73 20 65 6d 69 74 74 65 64 20 6f 6e 20 74   is emitted on t
2e530 68 65 20 74 72 61 63 65 20 63 61 6c 6c 62 61 63  he trace callbac
2e540 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 72  k..*/.case OP_Tr
2e550 61 63 65 3a 20 7b 0a 20 20 63 68 61 72 20 2a 7a  ace: {.  char *z
2e560 54 72 61 63 65 3b 0a 0a 20 20 7a 54 72 61 63 65  Trace;..  zTrace
2e570 20 3d 20 28 70 4f 70 2d 3e 70 34 2e 7a 20 3f 20   = (pOp->p4.z ? 
2e580 70 4f 70 2d 3e 70 34 2e 7a 20 3a 20 70 2d 3e 7a  pOp->p4.z : p->z
2e590 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a 54 72 61  Sql);.  if( zTra
2e5a0 63 65 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  ce ){.    if( db
2e5b0 2d 3e 78 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->xTrace ){.    
2e5c0 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69    char *z = sqli
2e5d0 74 65 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c  te3VdbeExpandSql
2e5e0 28 70 2c 20 7a 54 72 61 63 65 29 3b 0a 20 20 20  (p, zTrace);.   
2e5f0 20 20 20 64 62 2d 3e 78 54 72 61 63 65 28 64 62     db->xTrace(db
2e600 2d 3e 70 54 72 61 63 65 41 72 67 2c 20 7a 29 3b  ->pTraceArg, z);
2e610 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
2e620 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
2e630 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2e640 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 28  _DEBUG.    if( (
2e650 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
2e660 54 45 5f 53 71 6c 54 72 61 63 65 29 21 3d 30 20  TE_SqlTrace)!=0 
2e670 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2e680 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 51 4c  DebugPrintf("SQL
2e690 2d 74 72 61 63 65 3a 20 25 73 5c 6e 22 2c 20 7a  -trace: %s\n", z
2e6a0 54 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65  Trace);.    }.#e
2e6b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
2e6c0 45 42 55 47 20 2a 2f 0a 20 20 7d 0a 20 20 62 72  EBUG */.  }.  br
2e6d0 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  eak;.}.#endif...
2e6e0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 6f 70 20  /* Opcode: Noop 
2e6f0 2a 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  * * * * *.**.** 
2e700 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 20 54 68 69  Do nothing.  Thi
2e710 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  s instruction is
2e720 20 6f 66 74 65 6e 20 75 73 65 66 75 6c 20 61 73   often useful as
2e730 20 61 20 6a 75 6d 70 0a 2a 2a 20 64 65 73 74 69   a jump.** desti
2e740 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a  nation..*/./*.**
2e750 20 54 68 65 20 6d 61 67 69 63 20 45 78 70 6c 61   The magic Expla
2e760 69 6e 20 6f 70 63 6f 64 65 20 61 72 65 20 6f 6e  in opcode are on
2e770 6c 79 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e  ly inserted when
2e780 20 65 78 70 6c 61 69 6e 3d 3d 32 20 28 77 68 69   explain==2 (whi
2e790 63 68 0a 2a 2a 20 69 73 20 74 6f 20 73 61 79 20  ch.** is to say 
2e7a0 77 68 65 6e 20 74 68 65 20 45 58 50 4c 41 49 4e  when the EXPLAIN
2e7b0 20 51 55 45 52 59 20 50 4c 41 4e 20 73 79 6e 74   QUERY PLAN synt
2e7c0 61 78 20 69 73 20 75 73 65 64 2e 29 0a 2a 2a 20  ax is used.).** 
2e7d0 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65 63 6f  This opcode reco
2e7e0 72 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rds information 
2e7f0 66 72 6f 6d 20 74 68 65 20 6f 70 74 69 6d 69 7a  from the optimiz
2e800 65 72 2e 20 20 49 74 20 69 73 20 74 68 65 0a 2a  er.  It is the.*
2e810 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20  * the same as a 
2e820 6e 6f 2d 6f 70 2e 20 20 54 68 69 73 20 6f 70 63  no-op.  This opc
2e830 6f 64 65 73 6e 65 76 65 72 20 61 70 70 65 61 72  odesnever appear
2e840 73 20 69 6e 20 61 20 72 65 61 6c 20 56 4d 20 70  s in a real VM p
2e850 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 64 65 66 61 75  rogram..*/.defau
2e860 6c 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 2f  lt: {          /
2e870 2a 20 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79  * This is really
2e880 20 4f 50 5f 4e 6f 6f 70 20 61 6e 64 20 4f 50 5f   OP_Noop and OP_
2e890 45 78 70 6c 61 69 6e 20 2a 2f 0a 20 20 61 73 73  Explain */.  ass
2e8a0 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
2e8b0 3d 3d 4f 50 5f 4e 6f 6f 70 20 7c 7c 20 70 4f 70  ==OP_Noop || pOp
2e8c0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 78 70  ->opcode==OP_Exp
2e8d0 6c 61 69 6e 20 29 3b 0a 20 20 62 72 65 61 6b 3b  lain );.  break;
2e8e0 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
2e8f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e930 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 73 65 73 20  **.** The cases 
2e940 6f 66 20 74 68 65 20 73 77 69 74 63 68 20 73 74  of the switch st
2e950 61 74 65 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  atement above th
2e960 69 73 20 6c 69 6e 65 20 73 68 6f 75 6c 64 20 61  is line should a
2e970 6c 6c 20 62 65 20 69 6e 64 65 6e 74 65 64 0a 2a  ll be indented.*
2e980 2a 20 62 79 20 36 20 73 70 61 63 65 73 2e 20 20  * by 6 spaces.  
2e990 42 75 74 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  But the left-mos
2e9a0 74 20 36 20 73 70 61 63 65 73 20 68 61 76 65 20  t 6 spaces have 
2e9b0 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 74 6f 20  been removed to 
2e9c0 69 6d 70 72 6f 76 65 20 74 68 65 0a 2a 2a 20 72  improve the.** r
2e9d0 65 61 64 61 62 69 6c 69 74 79 2e 20 20 46 72 6f  eadability.  Fro
2e9e0 6d 20 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e 20  m this point on 
2e9f0 64 6f 77 6e 2c 20 74 68 65 20 6e 6f 72 6d 61 6c  down, the normal
2ea00 20 69 6e 64 65 6e 74 61 74 69 6f 6e 20 72 75 6c   indentation rul
2ea10 65 73 20 61 72 65 0a 2a 2a 20 72 65 73 74 6f 72  es are.** restor
2ea20 65 64 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ed..************
2ea30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ea40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ea50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ea60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ea70 2a 2f 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  */.    }..#ifdef
2ea80 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
2ea90 20 20 7b 0a 20 20 20 20 20 20 75 36 34 20 65 6c    {.      u64 el
2eaa0 61 70 73 65 64 20 3d 20 73 71 6c 69 74 65 33 48  apsed = sqlite3H
2eab0 77 74 69 6d 65 28 29 20 2d 20 73 74 61 72 74 3b  wtime() - start;
2eac0 0a 20 20 20 20 20 20 70 4f 70 2d 3e 63 79 63 6c  .      pOp->cycl
2ead0 65 73 20 2b 3d 20 65 6c 61 70 73 65 64 3b 0a 20  es += elapsed;. 
2eae0 20 20 20 20 20 70 4f 70 2d 3e 63 6e 74 2b 2b 3b       pOp->cnt++;
2eaf0 0a 23 69 66 20 30 0a 20 20 20 20 20 20 20 20 66  .#if 0.        f
2eb00 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
2eb10 25 31 30 6c 6c 75 20 22 2c 20 65 6c 61 70 73 65  %10llu ", elapse
2eb20 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
2eb30 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 73  te3VdbePrintOp(s
2eb40 74 64 6f 75 74 2c 20 6f 72 69 67 50 63 2c 20 26  tdout, origPc, &
2eb50 61 4f 70 5b 6f 72 69 67 50 63 5d 29 3b 0a 23 65  aOp[origPc]);.#e
2eb60 6e 64 69 66 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ndif.    }.#endi
2eb70 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  f..    /* The fo
2eb80 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 61 64 64  llowing code add
2eb90 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 65  s nothing to the
2eba0 20 61 63 74 75 61 6c 20 66 75 6e 63 74 69 6f 6e   actual function
2ebb0 61 6c 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20  ality.    ** of 
2ebc0 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 49 74  the program.  It
2ebd0 20 69 73 20 6f 6e 6c 79 20 68 65 72 65 20 66 6f   is only here fo
2ebe0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
2ebf0 62 75 67 67 69 6e 67 2e 0a 20 20 20 20 2a 2a 20  bugging..    ** 
2ec00 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
2ec10 64 2c 20 69 74 20 64 6f 65 73 20 62 75 72 6e 20  d, it does burn 
2ec20 43 50 55 20 63 79 63 6c 65 73 20 65 76 65 72 79  CPU cycles every
2ec30 20 74 69 6d 65 20 74 68 72 6f 75 67 68 0a 20 20   time through.  
2ec40 20 20 2a 2a 20 74 68 65 20 65 76 61 6c 75 61 74    ** the evaluat
2ec50 6f 72 20 6c 6f 6f 70 2e 20 20 53 6f 20 77 65 20  or loop.  So we 
2ec60 63 61 6e 20 6c 65 61 76 65 20 69 74 20 6f 75 74  can leave it out
2ec70 20 77 68 65 6e 20 4e 44 45 42 55 47 20 69 73 20   when NDEBUG is 
2ec80 64 65 66 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a  defined..    */.
2ec90 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
2eca0 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 2d     assert( pc>=-
2ecb0 31 20 26 26 20 70 63 3c 70 2d 3e 6e 4f 70 20 29  1 && pc<p->nOp )
2ecc0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
2ecd0 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70  _DEBUG.    if( p
2ece0 2d 3e 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20  ->trace ){.     
2ecf0 20 69 66 28 20 72 63 21 3d 30 20 29 20 66 70 72   if( rc!=0 ) fpr
2ed00 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 2c 22 72  intf(p->trace,"r
2ed10 63 3d 25 64 5c 6e 22 2c 72 63 29 3b 0a 20 20 20  c=%d\n",rc);.   
2ed20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 66 6c     if( pOp->opfl
2ed30 61 67 73 20 26 20 28 4f 50 46 4c 47 5f 4f 55 54  ags & (OPFLG_OUT
2ed40 32 5f 50 52 45 52 45 4c 45 41 53 45 7c 4f 50 46  2_PRERELEASE|OPF
2ed50 4c 47 5f 4f 55 54 32 29 20 29 7b 0a 20 20 20 20  LG_OUT2) ){.    
2ed60 20 20 20 20 72 65 67 69 73 74 65 72 54 72 61 63      registerTrac
2ed70 65 28 70 2d 3e 74 72 61 63 65 2c 20 70 4f 70 2d  e(p->trace, pOp-
2ed80 3e 70 32 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  >p2, &aMem[pOp->
2ed90 70 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  p2]);.      }.  
2eda0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 66      if( pOp->opf
2edb0 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 4f 55 54  lags & OPFLG_OUT
2edc0 33 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 67  3 ){.        reg
2edd0 69 73 74 65 72 54 72 61 63 65 28 70 2d 3e 74 72  isterTrace(p->tr
2ede0 61 63 65 2c 20 70 4f 70 2d 3e 70 33 2c 20 26 61  ace, pOp->p3, &a
2edf0 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20  Mem[pOp->p3]);. 
2ee00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
2ee10 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 44  dif  /* SQLITE_D
2ee20 45 42 55 47 20 2a 2f 0a 23 65 6e 64 69 66 20 20  EBUG */.#endif  
2ee30 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 20 20 7d  /* NDEBUG */.  }
2ee40 20 20 2f 2a 20 54 68 65 20 65 6e 64 20 6f 66 20    /* The end of 
2ee50 74 68 65 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70  the for(;;) loop
2ee60 20 74 68 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75   the loops throu
2ee70 67 68 20 6f 70 63 6f 64 65 73 20 2a 2f 0a 0a 20  gh opcodes */.. 
2ee80 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
2ee90 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
2eea0 65 61 6e 73 20 74 68 61 74 20 65 78 65 63 75 74  eans that execut
2eeb0 69 6f 6e 20 69 73 20 66 69 6e 69 73 68 65 64 20  ion is finished 
2eec0 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 65 72 72  with.  ** an err
2eed0 6f 72 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  or of some kind.
2eee0 0a 20 20 2a 2f 0a 76 64 62 65 5f 65 72 72 6f 72  .  */.vdbe_error
2eef0 5f 68 61 6c 74 3a 0a 20 20 61 73 73 65 72 74 28  _halt:.  assert(
2ef00 20 72 63 20 29 3b 0a 20 20 70 2d 3e 72 63 20 3d   rc );.  p->rc =
2ef10 20 72 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28   rc;.  testcase(
2ef20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2ef30 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
2ef40 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 72 63    sqlite3_log(rc
2ef50 2c 20 22 73 74 61 74 65 6d 65 6e 74 20 61 62 6f  , "statement abo
2ef60 72 74 73 20 61 74 20 25 64 3a 20 5b 25 73 5d 20  rts at %d: [%s] 
2ef70 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  %s", .          
2ef80 20 20 20 20 20 20 20 20 20 70 63 2c 20 70 2d 3e           pc, p->
2ef90 7a 53 71 6c 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  zSql, p->zErrMsg
2efa0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2efb0 48 61 6c 74 28 70 29 3b 0a 20 20 69 66 28 20 72  Halt(p);.  if( r
2efc0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
2efd0 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c  NOMEM ) db->mall
2efe0 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
2eff0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
2f000 52 3b 0a 20 20 69 66 28 20 72 65 73 65 74 53 63  R;.  if( resetSc
2f010 68 65 6d 61 4f 6e 46 61 75 6c 74 3e 30 20 29 7b  hemaOnFault>0 ){
2f020 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
2f030 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
2f040 64 62 2c 20 72 65 73 65 74 53 63 68 65 6d 61 4f  db, resetSchemaO
2f050 6e 46 61 75 6c 74 2d 31 29 3b 0a 20 20 7d 0a 0a  nFault-1);.  }..
2f060 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
2f070 20 6f 6e 6c 79 20 77 61 79 20 6f 75 74 20 6f 66   only way out of
2f080 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e   this procedure.
2f090 20 20 57 65 20 68 61 76 65 20 74 6f 0a 20 20 2a    We have to.  *
2f0a0 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 6d 75  * release the mu
2f0b0 74 65 78 65 73 20 6f 6e 20 62 74 72 65 65 73 20  texes on btrees 
2f0c0 74 68 61 74 20 77 65 72 65 20 61 63 71 75 69 72  that were acquir
2f0d0 65 64 20 61 74 20 74 68 65 0a 20 20 2a 2a 20 74  ed at the.  ** t
2f0e0 6f 70 2e 20 2a 2f 0a 76 64 62 65 5f 72 65 74 75  op. */.vdbe_retu
2f0f0 72 6e 3a 0a 20 20 73 71 6c 69 74 65 33 56 64 62  rn:.  sqlite3Vdb
2f100 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
2f110 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75  urn rc;..  /* Ju
2f120 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 61 20  mp to here if a 
2f130 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6c  string or blob l
2f140 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49 54  arger than SQLIT
2f150 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 20 20 2a  E_MAX_LENGTH.  *
2f160 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
2f170 2e 0a 20 20 2a 2f 0a 74 6f 6f 5f 62 69 67 3a 0a  ..  */.too_big:.
2f180 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
2f190 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
2f1a0 64 62 2c 20 22 73 74 72 69 6e 67 20 6f 72 20 62  db, "string or b
2f1b0 6c 6f 62 20 74 6f 6f 20 62 69 67 22 29 3b 0a 20  lob too big");. 
2f1c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 54 4f 4f   rc = SQLITE_TOO
2f1d0 42 49 47 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65  BIG;.  goto vdbe
2f1e0 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 0a 20 20  _error_halt;..  
2f1f0 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
2f200 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
2f210 69 6c 73 2e 0a 20 20 2a 2f 0a 6e 6f 5f 6d 65 6d  ils..  */.no_mem
2f220 3a 0a 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  :.  db->mallocFa
2f230 69 6c 65 64 20 3d 20 31 3b 0a 20 20 73 71 6c 69  iled = 1;.  sqli
2f240 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
2f250 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 6f  >zErrMsg, db, "o
2f260 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a  ut of memory");.
2f270 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2f280 4d 45 4d 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65  MEM;.  goto vdbe
2f290 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 0a 20 20  _error_halt;..  
2f2a0 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
2f2b0 66 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 6b 69  for any other ki
2f2c0 6e 64 20 6f 66 20 66 61 74 61 6c 20 65 72 72 6f  nd of fatal erro
2f2d0 72 2e 20 20 54 68 65 20 22 72 63 22 20 76 61 72  r.  The "rc" var
2f2e0 69 61 62 6c 65 0a 20 20 2a 2a 20 73 68 6f 75 6c  iable.  ** shoul
2f2f0 64 20 68 6f 6c 64 20 74 68 65 20 65 72 72 6f 72  d hold the error
2f300 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 61 62   number..  */.ab
2f310 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
2f320 3a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a  :.  assert( p->z
2f330 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 20 20 69  ErrMsg==0 );.  i
2f340 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2f350 6c 65 64 20 29 20 72 63 20 3d 20 53 51 4c 49 54  led ) rc = SQLIT
2f360 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 72  E_NOMEM;.  if( r
2f370 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
2f380 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c  NOMEM ){.    sql
2f390 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
2f3a0 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
2f3b0 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
2f3c0 74 72 28 72 63 29 29 3b 0a 20 20 7d 0a 20 20 67  tr(rc));.  }.  g
2f3d0 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68  oto vdbe_error_h
2f3e0 61 6c 74 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  alt;..  /* Jump 
2f3f0 74 6f 20 68 65 72 65 20 69 66 20 74 68 65 20 73  to here if the s
2f400 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
2f410 28 29 20 41 50 49 20 73 65 74 73 20 74 68 65 20  () API sets the 
2f420 69 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a 20 66  interrupt.  ** f
2f430 6c 61 67 2e 0a 20 20 2a 2f 0a 61 62 6f 72 74 5f  lag..  */.abort_
2f440 64 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70 74  due_to_interrupt
2f450 3a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  :.  assert( db->
2f460 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
2f470 20 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54   );.  rc = SQLIT
2f480 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 70  E_INTERRUPT;.  p
2f490 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 73 71 6c  ->rc = rc;.  sql
2f4a0 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
2f4b0 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
2f4c0 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
2f4d0 74 72 28 72 63 29 29 3b 0a 20 20 67 6f 74 6f 20  tr(rc));.  goto 
2f4e0 76 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b  vdbe_error_halt;
2f4f0 0a 7d 0a                                         .}.